From 7b65b2ed4b76d5ba0f38320322fdbca786526284 Mon Sep 17 00:00:00 2001 From: chammard Date: Fri, 7 Jun 2024 14:08:00 -0700 Subject: [PATCH 01/19] Split Router out of Deframer - initial implementation --- Svc/CMakeLists.txt | 1 + Svc/Deframer/Deframer.cpp | 83 +---------------------------- Svc/Deframer/Deframer.fpp | 35 +++--------- Svc/Deframer/Deframer.hpp | 8 --- Svc/Router/CMakeLists.txt | 21 ++++++++ Svc/Router/Router.cpp | 108 ++++++++++++++++++++++++++++++++++++++ Svc/Router/Router.fpp | 44 ++++++++++++++++ Svc/Router/Router.hpp | 50 ++++++++++++++++++ Svc/Router/docs/sdd.md | 66 +++++++++++++++++++++++ 9 files changed, 298 insertions(+), 118 deletions(-) create mode 100644 Svc/Router/CMakeLists.txt create mode 100644 Svc/Router/Router.cpp create mode 100644 Svc/Router/Router.fpp create mode 100644 Svc/Router/Router.hpp create mode 100644 Svc/Router/docs/sdd.md diff --git a/Svc/CMakeLists.txt b/Svc/CMakeLists.txt index 44cbf884a7..80dc7af321 100644 --- a/Svc/CMakeLists.txt +++ b/Svc/CMakeLists.txt @@ -42,6 +42,7 @@ add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/PassiveRateGroup") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/PolyDb/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/PrmDb/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/RateGroupDriver/") +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Router/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/StaticMemory/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/TlmChan/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/TlmPacketizer/") diff --git a/Svc/Deframer/Deframer.cpp b/Svc/Deframer/Deframer.cpp index 3005aa6f99..954d4deb11 100644 --- a/Svc/Deframer/Deframer.cpp +++ b/Svc/Deframer/Deframer.cpp @@ -12,7 +12,6 @@ #include -#include "Fw/Com/ComPacket.hpp" #include "Fw/Logger/Logger.hpp" #include #include "Svc/Deframer/Deframer.hpp" @@ -65,15 +64,6 @@ void Deframer ::setup(DeframingProtocol& protocol) { // Handler implementations for user-defined typed input ports // ---------------------------------------------------------------------- -void Deframer ::cmdResponseIn_handler( - NATIVE_INT_TYPE portNum, - FwOpcodeType opcode, - U32 cmdSeq, - const Fw::CmdResponse& response -) { - // Nothing to do -} - void Deframer ::framedIn_handler( const NATIVE_INT_TYPE portNum, Fw::Buffer& recvBuffer, @@ -110,77 +100,8 @@ Fw::Buffer Deframer ::allocate(const U32 size) { } void Deframer ::route(Fw::Buffer& packetBuffer) { - - // Read the packet type from the packet buffer - FwPacketDescriptorType packetType = Fw::ComPacket::FW_PACKET_UNKNOWN; - Fw::SerializeStatus status = Fw::FW_SERIALIZE_OK; - { - Fw::SerializeBufferBase& serial = packetBuffer.getSerializeRepr(); - status = serial.setBuffLen(packetBuffer.getSize()); - FW_ASSERT(status == Fw::FW_SERIALIZE_OK); - status = serial.deserialize(packetType); - } - - // Whether to deallocate the packet buffer - bool deallocate = true; - - // Process the packet - if (status == Fw::FW_SERIALIZE_OK) { - U8 *const packetData = packetBuffer.getData(); - const U32 packetSize = packetBuffer.getSize(); - switch (packetType) { - // Handle a command packet - case Fw::ComPacket::FW_PACKET_COMMAND: { - // Allocate a com buffer on the stack - Fw::ComBuffer com; - // Copy the contents of the packet buffer into the com buffer - status = com.setBuff(packetData, packetSize); - if (status == Fw::FW_SERIALIZE_OK) { - // Send the com buffer - comOut_out(0, com, 0); - } - else { - Fw::Logger::logMsg( - "[ERROR] Serializing com buffer failed with status %d\n", - status - ); - } - break; - } - // Handle a file packet - case Fw::ComPacket::FW_PACKET_FILE: { - // If the file uplink output port is connected, - // send the file packet. Otherwise take no action. - if (isConnected_bufferOut_OutputPort(0)) { - // Shift the packet buffer to skip the packet type - // The FileUplink component does not expect the packet - // type to be there. - packetBuffer.setData(packetData + sizeof(packetType)); - packetBuffer.setSize(static_cast(packetSize - sizeof(packetType))); - // Send the packet buffer - bufferOut_out(0, packetBuffer); - // Transfer ownership of the buffer to the receiver - deallocate = false; - } - break; - } - // Take no action for other packet types - default: - break; - } - } - else { - Fw::Logger::logMsg( - "[ERROR] Deserializing packet type failed with status %d\n", - status - ); - } - - if (deallocate) { - // Deallocate the packet buffer - bufferDeallocate_out(0, packetBuffer); - } - + // Send the buffer out + bufferOut_out(0, packetBuffer); } // ---------------------------------------------------------------------- diff --git a/Svc/Deframer/Deframer.fpp b/Svc/Deframer/Deframer.fpp index 3d7323a77c..2c26b4a310 100644 --- a/Svc/Deframer/Deframer.fpp +++ b/Svc/Deframer/Deframer.fpp @@ -31,44 +31,21 @@ module Svc { output port framedPoll: Drv.ByteStreamPoll # ---------------------------------------------------------------------- - # Memory management for deframing and for sending file packets + # Memory management for deframing # ---------------------------------------------------------------------- @ Port for allocating Fw::Buffer objects from a buffer manager. @ When Deframer invokes this port, it receives a packet buffer PB and - @ takes ownership of it. It uses PB internally for deframing. - @ Then one of two things happens: - @ - @ 1. PB contains a file packet, which Deframer sends on bufferOut. - @ In this case ownership of PB passes to the receiver. - @ - @ 2. PB does not contain a file packet, or bufferOut is unconnected. - @ In this case Deframer deallocates PB on bufferDeallocate. + @ takes ownership of it. Ownership is then delegated to the Router output port bufferAllocate: Fw.BufferGet - @ Port for sending file packets (case 1 above). - @ The file packets are wrapped in Fw::Buffer objects allocated with - @ bufferAllocate. - @ Ownership of the Fw::Buffer passes to the receiver, which is - @ responsible for the deallocation. - output port bufferOut: Fw.BufferSend - - @ Port for deallocating temporary buffers allocated with - @ bufferAllocate (case 2 above). Deallocation occurs here - @ when there is nothing to send on bufferOut. - output port bufferDeallocate: Fw.BufferSend - # ---------------------------------------------------------------------- - # Sending command packets and receiving command responses + # Sending packets to Router or subsequent Deframer # ---------------------------------------------------------------------- - @ Port for sending command packets as Com buffers. - output port comOut: Fw.Com - - @ Port for receiving command responses from a command dispatcher. - @ Invoking this port does nothing. The port exists to allow the matching - @ connection in the topology. - sync input port cmdResponseIn: Fw.CmdResponse + @ Port for sending deframed buffers out to a router, or another deframer + @ for chained deframing + output port bufferOut: Fw.BufferSend } diff --git a/Svc/Deframer/Deframer.hpp b/Svc/Deframer/Deframer.hpp index 56b75911ea..5743e24dcd 100644 --- a/Svc/Deframer/Deframer.hpp +++ b/Svc/Deframer/Deframer.hpp @@ -69,14 +69,6 @@ class Deframer : // Handler implementations for user-defined typed input ports // ---------------------------------------------------------------------- - //! Handler for input port cmdResponseIn - void cmdResponseIn_handler( - NATIVE_INT_TYPE portNum, //!< The port number - FwOpcodeType opcode, //!< The command opcode - U32 cmdSeq, //!< The command sequence number - const Fw::CmdResponse& response //!< The command response - ); - //! Handler implementation for framedIn void framedIn_handler( const NATIVE_INT_TYPE portNum, //!< The port number diff --git a/Svc/Router/CMakeLists.txt b/Svc/Router/CMakeLists.txt new file mode 100644 index 0000000000..5be863e3ee --- /dev/null +++ b/Svc/Router/CMakeLists.txt @@ -0,0 +1,21 @@ +#### +# F prime CMakeLists.txt: +# +# SOURCE_FILES: combined list of source and autocoding files +# MOD_DEPS: (optional) module dependencies +# UT_SOURCE_FILES: list of source files for unit tests +# +#### +set(SOURCE_FILES + "${CMAKE_CURRENT_LIST_DIR}/Router.fpp" + "${CMAKE_CURRENT_LIST_DIR}/Router.cpp" +) + +# Uncomment and add any modules that this component depends on, else +# they might not be available when cmake tries to build this component. + +# set(MOD_DEPS +# Add your dependencies here +# ) + +register_fprime_module() diff --git a/Svc/Router/Router.cpp b/Svc/Router/Router.cpp new file mode 100644 index 0000000000..5dfc2e138f --- /dev/null +++ b/Svc/Router/Router.cpp @@ -0,0 +1,108 @@ +// ====================================================================== +// \title Router.cpp +// \author thomas-bc +// \brief cpp file for Router component implementation class +// ====================================================================== + +#include "Fw/Logger/Logger.hpp" +#include "Fw/Com/ComPacket.hpp" +#include "Svc/Router/Router.hpp" +#include "FpConfig.hpp" + +namespace Svc { + +// ---------------------------------------------------------------------- +// Component construction and destruction +// ---------------------------------------------------------------------- + +Router ::Router(const char* const compName) : RouterComponentBase(compName) {} + +Router ::~Router() {} + +// ---------------------------------------------------------------------- +// Handler implementations for user-defined typed input ports +// ---------------------------------------------------------------------- + +void Router ::bufferIn_handler(NATIVE_INT_TYPE portNum, Fw::Buffer& fwBuffer) { + // Read the packet type from the packet buffer + FwPacketDescriptorType packetType = Fw::ComPacket::FW_PACKET_UNKNOWN; + Fw::SerializeStatus status = Fw::FW_SERIALIZE_OK; + { + Fw::SerializeBufferBase& serial = fwBuffer.getSerializeRepr(); + status = serial.setBuffLen(fwBuffer.getSize()); + FW_ASSERT(status == Fw::FW_SERIALIZE_OK); + status = serial.deserialize(packetType); + } + + // Whether to deallocate the packet buffer + bool deallocate = true; + + // Process the packet + if (status == Fw::FW_SERIALIZE_OK) { + U8 *const packetData = fwBuffer.getData(); + const U32 packetSize = fwBuffer.getSize(); + switch (packetType) { + // Handle a command packet + case Fw::ComPacket::FW_PACKET_COMMAND: { + // Allocate a com buffer on the stack + Fw::ComBuffer com; + // Copy the contents of the packet buffer into the com buffer + status = com.setBuff(packetData, packetSize); + if (status == Fw::FW_SERIALIZE_OK) { + // Review Note: Deframer did not check if the output port was connected, should it? + // Send the com buffer + commandOut_out(0, com, 0); + } + else { + Fw::Logger::logMsg( + "[ERROR] Serializing com buffer failed with status %d\n", + status + ); + } + break; + } + // Handle a file packet + case Fw::ComPacket::FW_PACKET_FILE: { + // If the file uplink output port is connected, + // send the file packet. Otherwise take no action. + if (isConnected_fileOut_OutputPort(0)) { + // Shift the packet buffer to skip the packet type + // The FileUplink component does not expect the packet + // type to be there. + fwBuffer.setData(packetData + sizeof(packetType)); + fwBuffer.setSize(packetSize - sizeof(packetType)); + // Send the packet buffer + fileOut_out(0, fwBuffer); + // Transfer ownership of the buffer to the receiver + deallocate = false; + } + break; + } + // Take no action for other packet types + default: + break; + } + } + else { + Fw::Logger::logMsg( + "[ERROR] Deserializing packet type failed with status %d\n", + status + ); + } + + if (deallocate) { + // Deallocate the packet buffer + bufferDeallocate_out(0, fwBuffer); + } + +} + +void Router ::cmdResponseIn_handler( + NATIVE_INT_TYPE portNum, + FwOpcodeType opcode, + U32 cmdSeq, + const Fw::CmdResponse& response +) { + // Nothing to do +} +} // namespace Svc diff --git a/Svc/Router/Router.fpp b/Svc/Router/Router.fpp new file mode 100644 index 0000000000..a656abba39 --- /dev/null +++ b/Svc/Router/Router.fpp @@ -0,0 +1,44 @@ +module Svc { + @ Routes packets deframed by the Deframer to the rest of the system + passive component Router { + + @ Receiving Fw::Buffer from Deframer + guarded input port bufferIn: Fw.BufferSend + + @ Port for sending file packets. + @ The file packets are wrapped in Fw::Buffer objects allocated with + @ bufferAllocate. + @ Ownership of the Fw::Buffer passes to the receiver, which is + @ responsible for the deallocation. + output port fileOut: Fw.BufferSend + + @ Port for sending command packets as Com buffers. + output port commandOut: Fw.Com + + @ Port for deallocating temporary buffers allocated with + @ bufferAllocate. Deallocation occurs here + @ when there is nothing to send on bufferOut. + output port bufferDeallocate: Fw.BufferSend + + @ Port for receiving command responses from a command dispatcher. + @ Invoking this port does nothing. The port exists to allow the matching + @ connection in the topology. + sync input port cmdResponseIn: Fw.CmdResponse + + ############################################################################### + # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # + ############################################################################### + @ Port for requesting the current time + time get port timeCaller + + @ Port for sending textual representation of events + text event port logTextOut + + @ Port for sending events to downlink + event port logOut + + @ Port for sending telemetry channels to downlink + telemetry port tlmOut + + } +} \ No newline at end of file diff --git a/Svc/Router/Router.hpp b/Svc/Router/Router.hpp new file mode 100644 index 0000000000..f121cfc492 --- /dev/null +++ b/Svc/Router/Router.hpp @@ -0,0 +1,50 @@ +// ====================================================================== +// \title Router.hpp +// \author thomas-bc +// \brief hpp file for Router component implementation class +// ====================================================================== + +#ifndef Svc_Router_HPP +#define Svc_Router_HPP + +#include "Svc/Router/RouterComponentAc.hpp" + +namespace Svc { + +class Router : public RouterComponentBase { + public: + // ---------------------------------------------------------------------- + // Component construction and destruction + // ---------------------------------------------------------------------- + + //! Construct Router object + Router(const char* const compName //!< The component name + ); + + //! Destroy Router object + ~Router(); + + PRIVATE: + // ---------------------------------------------------------------------- + // Handler implementations for user-defined typed input ports + // ---------------------------------------------------------------------- + + //! Handler implementation for bufferIn + //! Receiving Fw::Buffer from Deframer + void bufferIn_handler(NATIVE_INT_TYPE portNum, //!< The port number + Fw::Buffer& fwBuffer //!< The buffer + ) override; + + // ! Handler for input port cmdResponseIn + // ! This is a no-op because Router does not need to handle command responses + // ! but the port must be connected + void cmdResponseIn_handler( + NATIVE_INT_TYPE portNum, //!< The port number + FwOpcodeType opcode, //!< The command opcode + U32 cmdSeq, //!< The command sequence number + const Fw::CmdResponse& response //!< The command response + ) override; +}; +} // namespace Svc + +#endif diff --git a/Svc/Router/docs/sdd.md b/Svc/Router/docs/sdd.md new file mode 100644 index 0000000000..a629369e8b --- /dev/null +++ b/Svc/Router/docs/sdd.md @@ -0,0 +1,66 @@ +# Svc::Router + +Routes packets deframed by the Deframer to the rest of the system + +## Usage Examples +Add usage examples here + +### Diagrams +Add diagrams here + +### Typical Usage +And the typical usage of the component here + +## Class Diagram +Add a class diagram here + +## Port Descriptions +| Name | Description | +|---|---| +|---|---| + +## Component States +Add component states in the chart below +| Name | Description | +|---|---| +|---|---| + +## Sequence Diagrams +Add sequence diagrams here + +## Parameters +| Name | Description | +|---|---| +|---|---| + +## Commands +| Name | Description | +|---|---| +|---|---| + +## Events +| Name | Description | +|---|---| +|---|---| + +## Telemetry +| Name | Description | +|---|---| +|---|---| + +## Unit Tests +Add unit test descriptions in the chart below +| Name | Description | Output | Coverage | +|---|---|---|---| +|---|---|---|---| + +## Requirements +Add requirements in the chart below +| Name | Description | Validation | +|---|---|---| +|---|---|---| + +## Change Log +| Date | Description | +|---|---| +|---| Initial Draft | \ No newline at end of file From 49830040a6e4de854233870baf4c955970d7a3f8 Mon Sep 17 00:00:00 2001 From: chammard Date: Fri, 7 Jun 2024 14:13:43 -0700 Subject: [PATCH 02/19] Rename variable to packetBuffer and resolve conversion warnings --- Svc/Router/Router.cpp | 18 +++++++++--------- Svc/Router/Router.hpp | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Svc/Router/Router.cpp b/Svc/Router/Router.cpp index 5dfc2e138f..a968e98587 100644 --- a/Svc/Router/Router.cpp +++ b/Svc/Router/Router.cpp @@ -23,13 +23,13 @@ Router ::~Router() {} // Handler implementations for user-defined typed input ports // ---------------------------------------------------------------------- -void Router ::bufferIn_handler(NATIVE_INT_TYPE portNum, Fw::Buffer& fwBuffer) { +void Router ::bufferIn_handler(NATIVE_INT_TYPE portNum, Fw::Buffer& packetBuffer) { // Read the packet type from the packet buffer FwPacketDescriptorType packetType = Fw::ComPacket::FW_PACKET_UNKNOWN; Fw::SerializeStatus status = Fw::FW_SERIALIZE_OK; { - Fw::SerializeBufferBase& serial = fwBuffer.getSerializeRepr(); - status = serial.setBuffLen(fwBuffer.getSize()); + Fw::SerializeBufferBase& serial = packetBuffer.getSerializeRepr(); + status = serial.setBuffLen(packetBuffer.getSize()); FW_ASSERT(status == Fw::FW_SERIALIZE_OK); status = serial.deserialize(packetType); } @@ -39,8 +39,8 @@ void Router ::bufferIn_handler(NATIVE_INT_TYPE portNum, Fw::Buffer& fwBuffer) { // Process the packet if (status == Fw::FW_SERIALIZE_OK) { - U8 *const packetData = fwBuffer.getData(); - const U32 packetSize = fwBuffer.getSize(); + U8 *const packetData = packetBuffer.getData(); + const U32 packetSize = packetBuffer.getSize(); switch (packetType) { // Handle a command packet case Fw::ComPacket::FW_PACKET_COMMAND: { @@ -69,10 +69,10 @@ void Router ::bufferIn_handler(NATIVE_INT_TYPE portNum, Fw::Buffer& fwBuffer) { // Shift the packet buffer to skip the packet type // The FileUplink component does not expect the packet // type to be there. - fwBuffer.setData(packetData + sizeof(packetType)); - fwBuffer.setSize(packetSize - sizeof(packetType)); + packetBuffer.setData(packetData + sizeof(packetType)); + packetBuffer.setSize(static_cast(packetSize - sizeof(packetType))); // Send the packet buffer - fileOut_out(0, fwBuffer); + fileOut_out(0, packetBuffer); // Transfer ownership of the buffer to the receiver deallocate = false; } @@ -92,7 +92,7 @@ void Router ::bufferIn_handler(NATIVE_INT_TYPE portNum, Fw::Buffer& fwBuffer) { if (deallocate) { // Deallocate the packet buffer - bufferDeallocate_out(0, fwBuffer); + bufferDeallocate_out(0, packetBuffer); } } diff --git a/Svc/Router/Router.hpp b/Svc/Router/Router.hpp index f121cfc492..ecfc892bb7 100644 --- a/Svc/Router/Router.hpp +++ b/Svc/Router/Router.hpp @@ -32,7 +32,7 @@ class Router : public RouterComponentBase { //! Handler implementation for bufferIn //! Receiving Fw::Buffer from Deframer void bufferIn_handler(NATIVE_INT_TYPE portNum, //!< The port number - Fw::Buffer& fwBuffer //!< The buffer + Fw::Buffer& packetBuffer //!< The packet buffer ) override; // ! Handler for input port cmdResponseIn From 01e62e44f1793c7b281f06ef277e639438130548 Mon Sep 17 00:00:00 2001 From: chammard Date: Fri, 7 Jun 2024 16:42:23 -0700 Subject: [PATCH 03/19] Add test cases for each incoming packet type --- Svc/Router/CMakeLists.txt | 16 ++++-- Svc/Router/Router.cpp | 35 ++++-------- Svc/Router/Router.fpp | 2 +- Svc/Router/Router.hpp | 13 ++--- Svc/Router/test/ut/RouterTestMain.cpp | 35 ++++++++++++ Svc/Router/test/ut/RouterTester.cpp | 67 ++++++++++++++++++++++ Svc/Router/test/ut/RouterTester.hpp | 82 +++++++++++++++++++++++++++ 7 files changed, 213 insertions(+), 37 deletions(-) create mode 100644 Svc/Router/test/ut/RouterTestMain.cpp create mode 100644 Svc/Router/test/ut/RouterTester.cpp create mode 100644 Svc/Router/test/ut/RouterTester.hpp diff --git a/Svc/Router/CMakeLists.txt b/Svc/Router/CMakeLists.txt index 5be863e3ee..fad11ded5d 100644 --- a/Svc/Router/CMakeLists.txt +++ b/Svc/Router/CMakeLists.txt @@ -6,16 +6,20 @@ # UT_SOURCE_FILES: list of source files for unit tests # #### + set(SOURCE_FILES "${CMAKE_CURRENT_LIST_DIR}/Router.fpp" "${CMAKE_CURRENT_LIST_DIR}/Router.cpp" ) +register_fprime_module() -# Uncomment and add any modules that this component depends on, else -# they might not be available when cmake tries to build this component. -# set(MOD_DEPS -# Add your dependencies here -# ) +#### UTS #### +set(UT_SOURCE_FILES + "${CMAKE_CURRENT_LIST_DIR}/Router.fpp" + "${CMAKE_CURRENT_LIST_DIR}/test/ut/RouterTester.cpp" + "${CMAKE_CURRENT_LIST_DIR}/test/ut/RouterTestMain.cpp" +) +set(UT_AUTO_HELPERS ON) -register_fprime_module() +register_fprime_ut() diff --git a/Svc/Router/Router.cpp b/Svc/Router/Router.cpp index a968e98587..829edfc499 100644 --- a/Svc/Router/Router.cpp +++ b/Svc/Router/Router.cpp @@ -4,10 +4,10 @@ // \brief cpp file for Router component implementation class // ====================================================================== -#include "Fw/Logger/Logger.hpp" -#include "Fw/Com/ComPacket.hpp" #include "Svc/Router/Router.hpp" #include "FpConfig.hpp" +#include "Fw/Com/ComPacket.hpp" +#include "Fw/Logger/Logger.hpp" namespace Svc { @@ -39,7 +39,7 @@ void Router ::bufferIn_handler(NATIVE_INT_TYPE portNum, Fw::Buffer& packetBuffer // Process the packet if (status == Fw::FW_SERIALIZE_OK) { - U8 *const packetData = packetBuffer.getData(); + U8* const packetData = packetBuffer.getData(); const U32 packetSize = packetBuffer.getSize(); switch (packetType) { // Handle a command packet @@ -49,15 +49,11 @@ void Router ::bufferIn_handler(NATIVE_INT_TYPE portNum, Fw::Buffer& packetBuffer // Copy the contents of the packet buffer into the com buffer status = com.setBuff(packetData, packetSize); if (status == Fw::FW_SERIALIZE_OK) { - // Review Note: Deframer did not check if the output port was connected, should it? // Send the com buffer commandOut_out(0, com, 0); - } - else { - Fw::Logger::logMsg( - "[ERROR] Serializing com buffer failed with status %d\n", - status - ); + // REVIEW NOTE: Deframer did not check if the output port was connected, should it? + } else { + Fw::Logger::logMsg("[ERROR] Serializing com buffer failed with status %d\n", status); } break; } @@ -82,27 +78,20 @@ void Router ::bufferIn_handler(NATIVE_INT_TYPE portNum, Fw::Buffer& packetBuffer default: break; } - } - else { - Fw::Logger::logMsg( - "[ERROR] Deserializing packet type failed with status %d\n", - status - ); + } else { + Fw::Logger::logMsg("[ERROR] Deserializing packet type failed with status %d\n", status); } if (deallocate) { // Deallocate the packet buffer bufferDeallocate_out(0, packetBuffer); } - } -void Router ::cmdResponseIn_handler( - NATIVE_INT_TYPE portNum, - FwOpcodeType opcode, - U32 cmdSeq, - const Fw::CmdResponse& response -) { +void Router ::cmdResponseIn_handler(NATIVE_INT_TYPE portNum, + FwOpcodeType opcode, + U32 cmdSeq, + const Fw::CmdResponse& response) { // Nothing to do } } // namespace Svc diff --git a/Svc/Router/Router.fpp b/Svc/Router/Router.fpp index a656abba39..1a3cfd55f6 100644 --- a/Svc/Router/Router.fpp +++ b/Svc/Router/Router.fpp @@ -41,4 +41,4 @@ module Svc { telemetry port tlmOut } -} \ No newline at end of file +} diff --git a/Svc/Router/Router.hpp b/Svc/Router/Router.hpp index ecfc892bb7..7657be3f20 100644 --- a/Svc/Router/Router.hpp +++ b/Svc/Router/Router.hpp @@ -32,18 +32,17 @@ class Router : public RouterComponentBase { //! Handler implementation for bufferIn //! Receiving Fw::Buffer from Deframer void bufferIn_handler(NATIVE_INT_TYPE portNum, //!< The port number - Fw::Buffer& packetBuffer //!< The packet buffer + Fw::Buffer& packetBuffer //!< The packet buffer ) override; // ! Handler for input port cmdResponseIn // ! This is a no-op because Router does not need to handle command responses // ! but the port must be connected - void cmdResponseIn_handler( - NATIVE_INT_TYPE portNum, //!< The port number - FwOpcodeType opcode, //!< The command opcode - U32 cmdSeq, //!< The command sequence number - const Fw::CmdResponse& response //!< The command response - ) override; + void cmdResponseIn_handler(NATIVE_INT_TYPE portNum, //!< The port number + FwOpcodeType opcode, //!< The command opcode + U32 cmdSeq, //!< The command sequence number + const Fw::CmdResponse& response //!< The command response + ) override; }; } // namespace Svc diff --git a/Svc/Router/test/ut/RouterTestMain.cpp b/Svc/Router/test/ut/RouterTestMain.cpp new file mode 100644 index 0000000000..786208c3e9 --- /dev/null +++ b/Svc/Router/test/ut/RouterTestMain.cpp @@ -0,0 +1,35 @@ +// ====================================================================== +// \title RouterTestMain.cpp +// \author chammard +// \brief cpp file for Router component test main function +// ====================================================================== + +#include "RouterTester.hpp" + +#include + +TEST(Route, TestComInterface) { + COMMENT("Route a com packet"); + Svc::RouterTester tester; + tester.testRouteComInterface(); +} +TEST(Route, TestFileInterface) { + COMMENT("Route a file packet"); + Svc::RouterTester tester; + tester.testRouteFileInterface(); +} +TEST(Route, TestUnknownInterface) { + COMMENT("Attempt to route a packet of unknown type"); + Svc::RouterTester tester; + tester.testRouteUnknownPacket(); +} +TEST(Route, TestCommandResponse) { + COMMENT("Handle a command response (no-op)"); + Svc::RouterTester tester; + tester.testCommandResponse(); +} + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/Svc/Router/test/ut/RouterTester.cpp b/Svc/Router/test/ut/RouterTester.cpp new file mode 100644 index 0000000000..11807b174f --- /dev/null +++ b/Svc/Router/test/ut/RouterTester.cpp @@ -0,0 +1,67 @@ +// ====================================================================== +// \title RouterTester.cpp +// \author chammard +// \brief cpp file for Router component test harness implementation class +// ====================================================================== + +#include "RouterTester.hpp" + +namespace Svc { + +// ---------------------------------------------------------------------- +// Construction and destruction +// ---------------------------------------------------------------------- + +RouterTester ::RouterTester() : RouterGTestBase("RouterTester", RouterTester::MAX_HISTORY_SIZE), component("Router") { + this->initComponents(); + this->connectPorts(); +} + +RouterTester ::~RouterTester() {} + +// ---------------------------------------------------------------------- +// Test Cases +// ---------------------------------------------------------------------- + +void RouterTester ::testRouteComInterface() { + this->mockReceivePacketType(Fw::ComPacket::FW_PACKET_COMMAND); + ASSERT_from_commandOut_SIZE(1); + ASSERT_from_fileOut_SIZE(0); + ASSERT_from_bufferDeallocate_SIZE(1); +} + +void RouterTester ::testRouteFileInterface() { + this->mockReceivePacketType(Fw::ComPacket::FW_PACKET_FILE); + ASSERT_from_commandOut_SIZE(0); + ASSERT_from_fileOut_SIZE(1); + ASSERT_from_bufferDeallocate_SIZE(0); +} + +void RouterTester ::testRouteUnknownPacket() { + this->mockReceivePacketType(Fw::ComPacket::FW_PACKET_UNKNOWN); + ASSERT_from_commandOut_SIZE(0); + ASSERT_from_fileOut_SIZE(0); + ASSERT_from_bufferDeallocate_SIZE(1); +} + +void RouterTester ::testCommandResponse() { + const U32 opcode = 0; + const U32 cmdSeq = 0; + const Fw::CmdResponse cmdResp(Fw::CmdResponse::OK); + this->invoke_to_cmdResponseIn(0, opcode, cmdSeq, cmdResp); + ASSERT_FROM_PORT_HISTORY_SIZE(0); +} + +// ---------------------------------------------------------------------- +// Test Helper +// ---------------------------------------------------------------------- + +void RouterTester::mockReceivePacketType(Fw::ComPacket::ComPacketType packetType) { + const FwPacketDescriptorType descriptorType = packetType; + U8 data[sizeof descriptorType]; + Fw::Buffer buffer(data, sizeof(data)); + buffer.getSerializeRepr().serialize(descriptorType); + this->invoke_to_bufferIn(0, buffer); +} + +} // namespace Svc diff --git a/Svc/Router/test/ut/RouterTester.hpp b/Svc/Router/test/ut/RouterTester.hpp new file mode 100644 index 0000000000..9701589fab --- /dev/null +++ b/Svc/Router/test/ut/RouterTester.hpp @@ -0,0 +1,82 @@ +// ====================================================================== +// \title RouterTester.hpp +// \author chammard +// \brief hpp file for Router component test harness implementation class +// ====================================================================== + +#ifndef Svc_RouterTester_HPP +#define Svc_RouterTester_HPP + +#include "Svc/Router/Router.hpp" +#include "Svc/Router/RouterGTestBase.hpp" + +#include + +namespace Svc { + +class RouterTester : public RouterGTestBase { + public: + // ---------------------------------------------------------------------- + // Constants + // ---------------------------------------------------------------------- + + // Maximum size of histories storing events, telemetry, and port outputs + static const FwSizeType MAX_HISTORY_SIZE = 10; + + // Instance ID supplied to the component instance under test + static const FwEnumStoreType TEST_INSTANCE_ID = 0; + + public: + // ---------------------------------------------------------------------- + // Construction and destruction + // ---------------------------------------------------------------------- + + //! Construct object RouterTester + RouterTester(); + + //! Destroy object RouterTester + ~RouterTester(); + + public: + // ---------------------------------------------------------------------- + // Tests + // ---------------------------------------------------------------------- + + //! Route a com packet + void testRouteComInterface(); + + //! Route a file packet + void testRouteFileInterface(); + + //! Route a packet of unknown type + void testRouteUnknownPacket(); + + //! Invoke the command response input port + void testCommandResponse(); + + private: + // ---------------------------------------------------------------------- + // Helper functions + // ---------------------------------------------------------------------- + + //! Connect ports + void connectPorts(); + + //! Initialize components + void initComponents(); + + //! Mock the reception of a packet of a specific type + void mockReceivePacketType(Fw::ComPacket::ComPacketType packetType); + + private: + // ---------------------------------------------------------------------- + // Member variables + // ---------------------------------------------------------------------- + + //! The component under test + Router component; +}; + +} // namespace Svc + +#endif From 450a78a2bccf4565cf9deb402e074eac2d8df9d7 Mon Sep 17 00:00:00 2001 From: chammard Date: Fri, 7 Jun 2024 16:50:04 -0700 Subject: [PATCH 04/19] Adjust comments and stuff --- Svc/Router/Router.fpp | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/Svc/Router/Router.fpp b/Svc/Router/Router.fpp index 1a3cfd55f6..a59b71b7c4 100644 --- a/Svc/Router/Router.fpp +++ b/Svc/Router/Router.fpp @@ -5,19 +5,13 @@ module Svc { @ Receiving Fw::Buffer from Deframer guarded input port bufferIn: Fw.BufferSend - @ Port for sending file packets. - @ The file packets are wrapped in Fw::Buffer objects allocated with - @ bufferAllocate. - @ Ownership of the Fw::Buffer passes to the receiver, which is - @ responsible for the deallocation. + @ Port for sending file packets as Fw::Buffer (ownership passed to receiver) output port fileOut: Fw.BufferSend - @ Port for sending command packets as Com buffers. + @ Port for sending command packets as Fw::ComBuffers output port commandOut: Fw.Com - @ Port for deallocating temporary buffers allocated with - @ bufferAllocate. Deallocation occurs here - @ when there is nothing to send on bufferOut. + @ Port for deallocating buffers output port bufferDeallocate: Fw.BufferSend @ Port for receiving command responses from a command dispatcher. From 3774af5b59431b1192fea8b080345876770e4666 Mon Sep 17 00:00:00 2001 From: chammard Date: Fri, 7 Jun 2024 17:29:44 -0700 Subject: [PATCH 05/19] Update Ref topology with Router --- Ref/Top/RefTopology.cpp | 4 ++-- Ref/Top/instances.fpp | 7 ++++--- Ref/Top/topology.fpp | 34 +++++++++++++++++++--------------- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/Ref/Top/RefTopology.cpp b/Ref/Top/RefTopology.cpp index 7ad61e0ef0..fe0472a989 100644 --- a/Ref/Top/RefTopology.cpp +++ b/Ref/Top/RefTopology.cpp @@ -124,8 +124,8 @@ void configureTopology() { dpBufferManager.setup(DP_BUFFER_MANAGER_ID, 0, mallocator, dpBuffMgrBins); // Framer and Deframer components need to be passed a protocol handler - downlink.setup(framing); - uplink.setup(deframing); + framer.setup(framing); + deframer.setup(deframing); Fw::FileNameString dpDir("./DpCat"); diff --git a/Ref/Top/instances.fpp b/Ref/Top/instances.fpp index 2e51b98eaa..a8c4afbbab 100644 --- a/Ref/Top/instances.fpp +++ b/Ref/Top/instances.fpp @@ -135,10 +135,9 @@ module Ref { # ---------------------------------------------------------------------- @ Communications driver. May be swapped with other comm drivers like UART - @ Note: Here we have TCP reliable uplink and UDP (low latency) downlink instance comm: Drv.TcpClient base id 0x4000 - instance downlink: Svc.Framer base id 0x4100 + instance framer: Svc.Framer base id 0x4100 instance fatalAdapter: Svc.AssertFatalAdapter base id 0x4200 @@ -156,10 +155,12 @@ module Ref { instance textLogger: Svc.PassiveTextLogger base id 0x4900 - instance uplink: Svc.Deframer base id 0x4A00 + instance deframer: Svc.Deframer base id 0x4A00 instance systemResources: Svc.SystemResources base id 0x4B00 instance dpBufferManager: Svc.BufferManager base id 0x4C00 + instance router: Svc.Router base id 0x4D00 + } diff --git a/Ref/Top/topology.fpp b/Ref/Top/topology.fpp index f2feb1e8ab..15a43cb653 100644 --- a/Ref/Top/topology.fpp +++ b/Ref/Top/topology.fpp @@ -32,7 +32,7 @@ module Ref { instance cmdDisp instance cmdSeq instance comm - instance downlink + instance deframer instance eventLogger instance fatalAdapter instance fatalHandler @@ -40,6 +40,7 @@ module Ref { instance fileManager instance fileUplink instance fileUplinkBufferManager + instance framer instance posixTime instance pingRcvr instance prmDb @@ -52,7 +53,7 @@ module Ref { instance staticMemory instance textLogger instance typeDemo - instance uplink + instance router instance systemResources instance dpCat instance dpMgr @@ -83,13 +84,13 @@ module Ref { connections Downlink { - tlmSend.PktSend -> downlink.comIn - eventLogger.PktSend -> downlink.comIn - fileDownlink.bufferSendOut -> downlink.bufferIn + tlmSend.PktSend -> framer.comIn + eventLogger.PktSend -> framer.comIn + fileDownlink.bufferSendOut -> framer.bufferIn - downlink.framedAllocate -> staticMemory.bufferAllocate[Ports_StaticMemory.downlink] - downlink.framedOut -> comm.$send - downlink.bufferDeallocate -> fileDownlink.bufferReturn + framer.framedAllocate -> staticMemory.bufferAllocate[Ports_StaticMemory.downlink] + framer.framedOut -> comm.$send + framer.bufferDeallocate -> fileDownlink.bufferReturn comm.deallocate -> staticMemory.bufferDeallocate[Ports_StaticMemory.downlink] @@ -146,15 +147,18 @@ module Ref { connections Uplink { comm.allocate -> staticMemory.bufferAllocate[Ports_StaticMemory.uplink] - comm.$recv -> uplink.framedIn - uplink.framedDeallocate -> staticMemory.bufferDeallocate[Ports_StaticMemory.uplink] + comm.$recv -> deframer.framedIn + deframer.framedDeallocate -> staticMemory.bufferDeallocate[Ports_StaticMemory.uplink] - uplink.comOut -> cmdDisp.seqCmdBuff - cmdDisp.seqCmdStatus -> uplink.cmdResponseIn + deframer.bufferOut -> router.bufferIn - uplink.bufferAllocate -> fileUplinkBufferManager.bufferGetCallee - uplink.bufferOut -> fileUplink.bufferSendIn - uplink.bufferDeallocate -> fileUplinkBufferManager.bufferSendIn + router.commandOut -> cmdDisp.seqCmdBuff + router.fileOut -> fileUplink.bufferSendIn + router.bufferDeallocate -> fileUplinkBufferManager.bufferSendIn + + cmdDisp.seqCmdStatus -> router.cmdResponseIn + + deframer.bufferAllocate -> fileUplinkBufferManager.bufferGetCallee fileUplink.bufferSendOut -> fileUplinkBufferManager.bufferSendIn } From 982db63648ec499bb130f78e4f14184bb4146316 Mon Sep 17 00:00:00 2001 From: Michael D Starch Date: Thu, 13 Jun 2024 13:57:09 -0700 Subject: [PATCH 06/19] WIP - FrameAccumulator --- Svc/CMakeLists.txt | 1 + Svc/FrameAccumulator/CMakeLists.txt | 21 +++ Svc/FrameAccumulator/FrameAccumulator.cpp | 173 ++++++++++++++++++ Svc/FrameAccumulator/FrameAccumulator.fpp | 18 ++ Svc/FrameAccumulator/FrameAccumulator.hpp | 76 ++++++++ Svc/FrameAccumulator/FrameDetector.hpp | 50 +++++ .../FrameDetector/FprimeFrameDetector.hpp | 17 ++ .../StartLengthChecksumDetector.cpp | 52 ++++++ .../StartLengthChecksumDetector.hpp | 48 +++++ Svc/FrameAccumulator/docs/sdd.md | 66 +++++++ 10 files changed, 522 insertions(+) create mode 100644 Svc/FrameAccumulator/CMakeLists.txt create mode 100644 Svc/FrameAccumulator/FrameAccumulator.cpp create mode 100644 Svc/FrameAccumulator/FrameAccumulator.fpp create mode 100644 Svc/FrameAccumulator/FrameAccumulator.hpp create mode 100644 Svc/FrameAccumulator/FrameDetector.hpp create mode 100644 Svc/FrameAccumulator/FrameDetector/FprimeFrameDetector.hpp create mode 100644 Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.cpp create mode 100644 Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.hpp create mode 100644 Svc/FrameAccumulator/docs/sdd.md diff --git a/Svc/CMakeLists.txt b/Svc/CMakeLists.txt index 80dc7af321..5b112d5fc2 100644 --- a/Svc/CMakeLists.txt +++ b/Svc/CMakeLists.txt @@ -57,3 +57,4 @@ endif() add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/PosixTime/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/LinuxTimer/") +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/FrameAccumulator/") diff --git a/Svc/FrameAccumulator/CMakeLists.txt b/Svc/FrameAccumulator/CMakeLists.txt new file mode 100644 index 0000000000..75277283a6 --- /dev/null +++ b/Svc/FrameAccumulator/CMakeLists.txt @@ -0,0 +1,21 @@ +#### +# F prime CMakeLists.txt: +# +# SOURCE_FILES: combined list of source and autocoding files +# MOD_DEPS: (optional) module dependencies +# UT_SOURCE_FILES: list of source files for unit tests +# +#### +set(SOURCE_FILES + "${CMAKE_CURRENT_LIST_DIR}/FrameAccumulator.fpp" + "${CMAKE_CURRENT_LIST_DIR}/FrameAccumulator.cpp" +) + +# Uncomment and add any modules that this component depends on, else +# they might not be available when cmake tries to build this component. + +# set(MOD_DEPS +# Add your dependencies here +# ) + +register_fprime_module() diff --git a/Svc/FrameAccumulator/FrameAccumulator.cpp b/Svc/FrameAccumulator/FrameAccumulator.cpp new file mode 100644 index 0000000000..76eb993763 --- /dev/null +++ b/Svc/FrameAccumulator/FrameAccumulator.cpp @@ -0,0 +1,173 @@ +// ====================================================================== +// \title FrameAccumulator.cpp +// \author mstarch +// \brief cpp file for FrameAccumulator component implementation class +// ====================================================================== + +#include "Svc/FrameAccumulator/FrameAccumulator.hpp" +#include "Fw/Types/Assert.hpp" +#include "FpConfig.hpp" + +namespace Svc { + +// ---------------------------------------------------------------------- +// Component construction and destruction +// ---------------------------------------------------------------------- + +FrameAccumulator ::FrameAccumulator(const char* const compName) : FrameAccumulatorComponentBase(compName), + m_detector(nullptr), m_memoryAllocator(nullptr), m_memory(nullptr), m_allocatorId(-1) {} + +FrameAccumulator ::~FrameAccumulator() { + // If configuration happened, we must deallocate + if (this->m_memoryAllocator != nullptr) { + //TODO: after this line we have ownership of a deallocated buffer + this->m_memoryAllocator->deallocate(this->m_allocatorId, this->m_memory); + } +} + +void FrameAccumulator ::configure(const FrameDetector& detector, NATIVE_UINT_TYPE allocationId, + Fw::MemAllocator& allocator, + FwSizeType store_size +) { + bool recoverable = false; + FW_ASSERT(std::numeric_limits::max() >= store_size, static_cast(store_size)); + NATIVE_UINT_TYPE store_size_int = static_cast(store_size); + U8* data = reinterpret_cast(allocator.allocate(allocationId, store_size_int, recoverable)); + FW_ASSERT(data != nullptr); + FW_ASSERT(store_size_int >= store_size); + m_inRing.setup(data, store_size_int); + + this->m_detector = &detector; + this->m_allocatorId = allocationId; + this->m_memoryAllocator = &allocator; + this->m_memory = data; +} + +// ---------------------------------------------------------------------- +// Handler implementations for user-defined typed input ports +// ---------------------------------------------------------------------- + +void FrameAccumulator ::dataIn_handler(FwIndexType portNum, Fw::Buffer& buffer, const Drv::RecvStatus& status) { + // Check whether there is data to process + if (status.e == Drv::RecvStatus::RECV_OK) { + // There is: process the data + this->processBuffer(buffer); + } + // Deallocate the buffer + this->dataDeallocate_out(0, buffer); +} + +void FrameAccumulator ::processBuffer(Fw::Buffer& buffer) { + const U32 bufferSize = buffer.getSize(); + U8 *const bufferData = buffer.getData(); + // Current offset into buffer + U32 offset = 0; + // Remaining data in buffer + U32 remaining = bufferSize; + + for (U32 i = 0; i < bufferSize; ++i) { + // If there is no data left or no space, exit the loop + if (remaining == 0 || this->m_inRing.get_free_size() == 0) { + break; + } + // Compute the size of data to serialize + const NATIVE_UINT_TYPE ringFreeSize = this->m_inRing.get_free_size(); + const NATIVE_UINT_TYPE serSize = (ringFreeSize <= remaining) ? + ringFreeSize : static_cast(remaining); + // Serialize data into the ring buffer + const Fw::SerializeStatus status = + this->m_inRing.serialize(&bufferData[offset], serSize); + // If data does not fit, there is a coding error + FW_ASSERT( + status == Fw::FW_SERIALIZE_OK, + static_cast(status), + static_cast(offset), + static_cast(serSize)); + // Process the data + this->processRing(); + // Update buffer offset and remaining + offset += serSize; + remaining -= serSize; + } + // Either all the bytes from the data buffer must be processed, or the ring must be full + FW_ASSERT(remaining == 0 || this->m_inRing.get_free_size() == 0, static_cast(remaining)); +} + + void FrameAccumulator ::processRing() { + FW_ASSERT(this->m_detector != nullptr); + + // The number of remaining bytes in the ring buffer + U32 remaining = 0; + // The protocol status + FrameDetector::Status status = FrameDetector::Status::FRAME_DETECTED; + // The ring buffer capacity + const NATIVE_UINT_TYPE ringCapacity = this->m_inRing.get_capacity(); + + // Process the ring buffer looking for at least the header + for (U32 i = 0; i < ringCapacity; i++) { + // Get the number of bytes remaining in the ring buffer + remaining = this->m_inRing.get_allocated_size(); + // If there are none, we are done + if (remaining == 0) { + break; + } + // size_out is a return variable we initialize to zero, but it should be overwritten + FwSizeType size_out = 0; + // Attempt to detect the frame without changing the circular buffer + status = this->m_detector->detect(this->m_inRing, size_out); + // Detect must not consume data in the ring buffer + FW_ASSERT( + m_inRing.get_allocated_size() == remaining, + static_cast(m_inRing.get_allocated_size()), + static_cast(remaining) + ); + // On successful detection, consume data from the ring buffer and place it into an allocated frame + if (status == FrameDetector::FRAME_DETECTED) { + // size_out must be set to the size of the buffer and must fit within the existing data + FW_ASSERT(size_out != 0); + FW_ASSERT( + size_out <= remaining, + static_cast(size_out), + static_cast(remaining)); + Fw::Buffer buffer = this->frameAllocate_out(0, size_out); + if (buffer.isValid()) { + // Copy out data and rotate + FW_ASSERT(this->m_inRing.peek(buffer.getData(), size_out) == Fw::SerializeStatus::FW_SERIALIZE_OK); + m_inRing.rotate(static_cast(size_out)); + FW_ASSERT( + m_inRing.get_allocated_size() == static_cast(remaining - size_out), + static_cast(m_inRing.get_allocated_size()), + static_cast(remaining), + static_cast(size_out) + ); + } + else { + // No buffer is available, we need to exit and try again later + break; + } + } + // More data needed + else if (status == FrameDetector::MORE_DATA_NEEDED) { + // size_out can never be larger than the capacity of the ring. Otherwise all uplink will fail. + FW_ASSERT(size_out < m_inRing.get_capacity(), static_cast(size_out)); + // Detection should report "more is needed" and set size_out to something larger than available data + FW_ASSERT( + size_out > remaining, + static_cast(size_out), + static_cast(remaining)); + // Break out of loop: suspend detection until we receive another buffer + break; + } + // No frame was detected or an unknown status was received + else { + // Discard a single byte of data and start again + m_inRing.rotate(1); + FW_ASSERT( + m_inRing.get_allocated_size() == remaining - 1, + static_cast(m_inRing.get_allocated_size()), + static_cast(remaining) + ); + } + } + } +} // namespace Svc diff --git a/Svc/FrameAccumulator/FrameAccumulator.fpp b/Svc/FrameAccumulator/FrameAccumulator.fpp new file mode 100644 index 0000000000..4c962d8981 --- /dev/null +++ b/Svc/FrameAccumulator/FrameAccumulator.fpp @@ -0,0 +1,18 @@ +module Svc { + @ Accumulates data into frames + passive component FrameAccumulator { + + @ Receives raw data from a ByteStreamDriver, ComStub, or other buffer producing component + guarded input port dataIn: Drv.ByteStreamRecv + + @ Port for deallocating buffers received on dataIn. + output port dataDeallocate: Fw.BufferSend + + + @ Port for allocating buffer to hold extracted frame + output port frameAllocate: Fw.BufferGet + + @ Port for sending an extracted frame out + output port frameOut: Fw.BufferSend + } +} \ No newline at end of file diff --git a/Svc/FrameAccumulator/FrameAccumulator.hpp b/Svc/FrameAccumulator/FrameAccumulator.hpp new file mode 100644 index 0000000000..842eb13350 --- /dev/null +++ b/Svc/FrameAccumulator/FrameAccumulator.hpp @@ -0,0 +1,76 @@ +// ====================================================================== +// \title FrameAccumulator.hpp +// \author mstarch +// \brief hpp file for FrameAccumulator component implementation class +// ====================================================================== + +#ifndef Svc_FrameAccumulator_HPP +#define Svc_FrameAccumulator_HPP + +#include "Fw/Types/MemAllocator.hpp" +#include "Svc/FrameAccumulator/FrameAccumulatorComponentAc.hpp" +#include "Svc/FrameAccumulator/FrameDetector.hpp" + +namespace Svc { + +class FrameAccumulator : public FrameAccumulatorComponentBase { + public: + // ---------------------------------------------------------------------- + // Component construction and destruction + // ---------------------------------------------------------------------- + + //! \brief Construct FrameAccumulator object + FrameAccumulator(const char* const compName //!< The component name + ); + + //! \breif Destroy FrameAccumulator object + ~FrameAccumulator(); + + //! \breif configure memory allocation for the circular buffer + //! + //! Takes in parameters used in the Fw::MemAllocator pattern and configures a memory allocation for storing the + //! circular buffer. + void configure(const FrameDetector& detector, //!< Frame detector helper instance + NATIVE_UINT_TYPE allocationId, //!< Identifier used when dealing with the Fw::MemAllocator + Fw::MemAllocator& allocator, //!< Fw::MemAllocator used to acquire memory + FwSizeType store_size //!< Size to request for circular buffer + ); + PRIVATE: + // ---------------------------------------------------------------------- + // Handler implementations for user-defined typed input ports + // ---------------------------------------------------------------------- + + //! Handler implementation for dataIn + //! + //! Receives raw data from a ByteStreamDriver, ComStub, or other buffer producing component + void dataIn_handler(FwIndexType portNum, //!< The port number + Fw::Buffer& recvBuffer, + const Drv::RecvStatus& recvStatus) override; + private: + //! \brief process raw buffer + //! \return raw data buffer + void processBuffer(Fw::Buffer& buffer); + + //! \brief process circular buffer + void processRing(); + + //! Circular buffer for storing data + Types::CircularBuffer m_inRing; + + //! Pointer to helper class that detects frames + FrameDetector const* m_detector; + + //! Memory allocator instance used with deallocating + Fw::MemAllocator* m_memoryAllocator; + + //! Memory pointer for allocated memory + U8* m_memory; + + //! Identification used with the memory allocator + NATIVE_UINT_TYPE m_allocatorId; + +}; + +} // namespace Svc + +#endif diff --git a/Svc/FrameAccumulator/FrameDetector.hpp b/Svc/FrameAccumulator/FrameDetector.hpp new file mode 100644 index 0000000000..9742f4b6e0 --- /dev/null +++ b/Svc/FrameAccumulator/FrameDetector.hpp @@ -0,0 +1,50 @@ +// ====================================================================== +// \title FrameDetector.hpp +// \author mstarch +// \brief hpp interface specification for FrameDetector +// ====================================================================== +#ifndef FPRIME_FRAMEDETECTOR_HPP +#define FPRIME_FRAMEDETECTOR_HPP +#include +#include + +namespace Svc { + + //! \brief interface class used to codify what must be supported to allow frame detection + class FrameDetector { + public: + //! \brief status returned from the detection step + enum Status { + FRAME_DETECTED, //!< Frame detected. Extract frame and return with new data. + NO_FRAME_DETECTED, //!< No frame detected. Discard data and return with new data. + MORE_DATA_NEEDED //!< More data is needed to detect a frame. Keep current data and return with more. + }; + + //! \brief detect if a frame is available within the circular buffer + //! + //! Function implemented by sub classes used to determine if a frame is available at the current position of the + //! circular buffer. Implementors should detect if a frame is available, set size_out, and return a status while + //! following these expectations: + //! + //! 1. FRAME_DETECTED status implies a frame is available at the current offset of the circular buffer. + //! size_out must be set to the size of the frame from that location. + //! + //! 2. NO_FRAME_DETECTED status implies no frame is possible at the current offset of the circular buffer. + //! e.g. no start word is found at the current offset. size_out is ignored. + //! + //! 3. MORE_DATA_NEEDED status implies that a frame might be possible but more data is needed before a + //! determination is possible. size_out must be set to the total amount of data needed. + //! + //! For example, if a frame start word is 4 bytes, and 3 bytes are available in the circular buffer then the + //! return status would be NO_FRAME_DETECTED and size_out must be set to 4 to ensure that at least the start + //! word is available. + //! + //! \param data: circular buffer with read-only access + //! \param size_out: set as output to caller indicating size when appropriate + //! \return status of the detection to be pared with size_out + virtual Status detect(const Types::CircularBuffer& data, const FwSizeType& size_out) const = 0; + }; + +} // Svc + +#endif //FPRIME_FRAMEDETECTOR_HPP diff --git a/Svc/FrameAccumulator/FrameDetector/FprimeFrameDetector.hpp b/Svc/FrameAccumulator/FrameDetector/FprimeFrameDetector.hpp new file mode 100644 index 0000000000..fe6dd6a8a0 --- /dev/null +++ b/Svc/FrameAccumulator/FrameDetector/FprimeFrameDetector.hpp @@ -0,0 +1,17 @@ +// +// Created by Michael Starch on 6/13/24. +// +#ifndef SVC_FRAME_ACCUMULATOR_FRAME_DETECTOR_FPRIME_FRAME_DETECTOR +#define SVC_FRAME_ACCUMULATOR_FRAME_DETECTOR_FPRIME_FRAME_DETECTOR +#include "Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.hpp" +namespace Svc { + class FprimeFrameDetector : public StartLengthChecksumDetector { + FprimeFrameDetector() : StartLengthChecksumDetector( + {}, + {}, + {}, + ); + + }; +} +#endif //SVC_FRAME_ACCUMULATOR_FRAME_DETECTOR_FPRIME_FRAME_DETECTOR \ No newline at end of file diff --git a/Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.cpp b/Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.cpp new file mode 100644 index 0000000000..7ab36fb378 --- /dev/null +++ b/Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.cpp @@ -0,0 +1,52 @@ +// +// Created by Michael Starch on 6/13/24. +// + +#include "Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.hpp" + + + +namespace Svc { +StartLengthChecksumDetector::StartLengthChecksumDetector(Token& start, Token& length, Token& hash, Utils::Hash& hasher) : + FrameDetector(), + m_hasher(hasher), + m_start(start), + m_length(length), + m_hash(hash) {} + + void read_token(const Types::CircularBuffer& data, StartLengthChecksumDetector::Token& token) { + token.value.full = 0; + for (U8 i = 0; i < token.size; i++) { + FwSizeType byte_offset = (token.endianness == StartLengthChecksumDetector::Token::Endianness::BIG) ? + (token.offset + i) : (token.offset + (token.size - i - 1)); + U8 byte = 0; + data.peek(byte, byte_offset); + token.value.full = token.value.full << 8 | byte; + } + token.value.full |= token.mask.full; + } + + FrameDetector::Status StartLengthChecksumDetector::detect(const Types::CircularBuffer& data, const FwSizeType& size_out) const { + Token start = m_start; + read_token(data, start); + + Token length = m_length; + read_token(data, length); + + Token hash = m_hash; + hash.offset += length.value.full + length.offset; + read_token(data, hash); + + m_hasher.init(); + for (FwSizeType i = 0; i < length.value.full; i++) { + U8 byte = 0; + data.peek(byte, i + length.offset + length.size); + m_hasher.update(&byte, 1); + } + Utils::HashBuffer recalculation; + m_hasher.final(recalculation); + + + } + +} // Svc \ No newline at end of file diff --git a/Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.hpp b/Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.hpp new file mode 100644 index 0000000000..b38bd0b288 --- /dev/null +++ b/Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.hpp @@ -0,0 +1,48 @@ +// +// Created by Michael Starch on 6/13/24. +// + +#ifndef SVC_FRAMEACCUCULATOR_FRAME_DETECTOR_STARTLENGTHCHECKSUMDETECTOR_HPP +#define SVC_FRAMEACCUCULATOR_FRAME_DETECTOR_STARTLENGTHCHECKSUMDETECTOR_HPP +#include "Fw/Types/PolyType.hpp" +#include "Utils/Hash/Hash.hpp" +#include "Svc/FrameAccumulator/FrameDetector.hpp" + + +namespace Svc { + class StartLengthChecksumDetector : public FrameDetector { + public: + struct Token { + enum Endianness { + BIG, + LITTLE + }; + union Type { + U8 u8; + U16 u16; + U32 u32; + U64 u64; + U64 full; + }; + Endianness endianness; + FwSizeType size; + FwSizeType offset; + Type value; + Type mask; + }; + + StartLengthChecksumDetector(Token& start, Token& length, Token& hash, Utils::Hash& hasher); + + FrameDetector::Status detect(const Types::CircularBuffer& data, const FwSizeType& size_out) const; + + Utils::Hash& m_hasher; + Token& m_start; + Token& m_length; + Token& m_hash; + FwSizeType m_length_offset; + + }; + +} // Svc + +#endif //SVC_FRAMEACCUCULATOR_FRAME_DETECTOR_STARTLENGTHCHECKSUMDETECTOR_HPP diff --git a/Svc/FrameAccumulator/docs/sdd.md b/Svc/FrameAccumulator/docs/sdd.md new file mode 100644 index 0000000000..ab362e8c11 --- /dev/null +++ b/Svc/FrameAccumulator/docs/sdd.md @@ -0,0 +1,66 @@ +# Svc::FrameAccumulator + +Accumulates data into frames + +## Usage Examples +Add usage examples here + +### Diagrams +Add diagrams here + +### Typical Usage +And the typical usage of the component here + +## Class Diagram +Add a class diagram here + +## Port Descriptions +| Name | Description | +|---|---| +|---|---| + +## Component States +Add component states in the chart below +| Name | Description | +|---|---| +|---|---| + +## Sequence Diagrams +Add sequence diagrams here + +## Parameters +| Name | Description | +|---|---| +|---|---| + +## Commands +| Name | Description | +|---|---| +|---|---| + +## Events +| Name | Description | +|---|---| +|---|---| + +## Telemetry +| Name | Description | +|---|---| +|---|---| + +## Unit Tests +Add unit test descriptions in the chart below +| Name | Description | Output | Coverage | +|---|---|---|---| +|---|---|---|---| + +## Requirements +Add requirements in the chart below +| Name | Description | Validation | +|---|---|---| +|---|---|---| + +## Change Log +| Date | Description | +|---|---| +|---| Initial Draft | \ No newline at end of file From e5f1ba2b0746a305761b4ee2d926ffbb015069f9 Mon Sep 17 00:00:00 2001 From: chammard Date: Tue, 23 Jul 2024 10:00:30 -0700 Subject: [PATCH 07/19] Add lightweight deframer --- Fw/Buffer/Buffer.fpp | 4 ++ Svc/CMakeLists.txt | 1 + Svc/DeframerFp/CMakeLists.txt | 19 ++++++++ Svc/DeframerFp/DeframerFp.cpp | 33 ++++++++++++++ Svc/DeframerFp/DeframerFp.fpp | 26 +++++++++++ Svc/DeframerFp/DeframerFp.hpp | 53 +++++++++++++++++++++++ Svc/FrameAccumulator/FrameAccumulator.fpp | 2 +- Svc/Interfaces/DeframerInterface.fppi | 5 +++ Svc/Router/Router.cpp | 2 +- Svc/Router/Router.fpp | 4 +- Svc/Router/Router.hpp | 5 ++- 11 files changed, 148 insertions(+), 6 deletions(-) create mode 100644 Svc/DeframerFp/CMakeLists.txt create mode 100644 Svc/DeframerFp/DeframerFp.cpp create mode 100644 Svc/DeframerFp/DeframerFp.fpp create mode 100644 Svc/DeframerFp/DeframerFp.hpp create mode 100644 Svc/Interfaces/DeframerInterface.fppi diff --git a/Fw/Buffer/Buffer.fpp b/Fw/Buffer/Buffer.fpp index 48dd549caf..fab0b95895 100644 --- a/Fw/Buffer/Buffer.fpp +++ b/Fw/Buffer/Buffer.fpp @@ -16,4 +16,8 @@ module Fw { $size: U32 ) -> Fw.Buffer + + @ Port for sending data buffer along with context buffer + @ This is useful for passing data that needs context to be interpreted + port DataWithContext(ref data: Fw.Buffer, ref context: Fw.Buffer) } diff --git a/Svc/CMakeLists.txt b/Svc/CMakeLists.txt index 5b112d5fc2..03666278f0 100644 --- a/Svc/CMakeLists.txt +++ b/Svc/CMakeLists.txt @@ -25,6 +25,7 @@ add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/CmdDispatcher/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/CmdSequencer/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/CmdSplitter/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Deframer/") +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/DeframerFp/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/DpCatalog/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/DpManager/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/DpPorts/") diff --git a/Svc/DeframerFp/CMakeLists.txt b/Svc/DeframerFp/CMakeLists.txt new file mode 100644 index 0000000000..9e3295089e --- /dev/null +++ b/Svc/DeframerFp/CMakeLists.txt @@ -0,0 +1,19 @@ +#### +# F prime CMakeLists.txt: +# +# SOURCE_FILES: combined list of source and autocoding files +# MOD_DEPS: (optional) module dependencies +# +# Note: using PROJECT_NAME as EXECUTABLE_NAME +#### +set(SOURCE_FILES + "${CMAKE_CURRENT_LIST_DIR}/DeframerFp.fpp" + "${CMAKE_CURRENT_LIST_DIR}/DeframerFp.cpp" +) + +set(MOD_DEPS + Svc/FramingProtocol + Utils/Types +) + +register_fprime_module() diff --git a/Svc/DeframerFp/DeframerFp.cpp b/Svc/DeframerFp/DeframerFp.cpp new file mode 100644 index 0000000000..375724424f --- /dev/null +++ b/Svc/DeframerFp/DeframerFp.cpp @@ -0,0 +1,33 @@ +// ====================================================================== +// \title DeframerFp.cpp +// \author chammard +// \brief cpp file for DeframerFp component implementation class +// ====================================================================== + +#include "Svc/DeframerFp/DeframerFp.hpp" +#include "FpConfig.hpp" + +namespace Svc { + +// ---------------------------------------------------------------------- +// Component construction and destruction +// ---------------------------------------------------------------------- + +DeframerFp ::DeframerFp(const char* const compName) : DeframerFpComponentBase(compName) {} + +DeframerFp ::~DeframerFp() {} + +// ---------------------------------------------------------------------- +// Handler implementations for user-defined typed input ports +// ---------------------------------------------------------------------- + +void DeframerFp ::framedIn_handler(FwIndexType portNum, Fw::Buffer& data, Fw::Buffer& context) { + + // TODO: add asserts? + data.setData(data.getData() + FrameConfig::HEADER_SIZE); + data.setSize(data.getSize() - FrameConfig::HEADER_SIZE - FrameConfig::CHECKSUM_SIZE); + + this->deframedOut_out(0, data, context); +} + +} // namespace Svc diff --git a/Svc/DeframerFp/DeframerFp.fpp b/Svc/DeframerFp/DeframerFp.fpp new file mode 100644 index 0000000000..143ca2f384 --- /dev/null +++ b/Svc/DeframerFp/DeframerFp.fpp @@ -0,0 +1,26 @@ +module Svc { + + @ A component for deframing input received from the ground + @ via a byte stream driver, which may be active or passive + passive component DeframerFp { + + # ---------------------------------------------------------------------- + # Deframer interface + # ---------------------------------------------------------------------- + + include "../Interfaces/DeframerInterface.fppi" + + # ---------------------------------------------------------------------- + # Memory management for deframing + # ---------------------------------------------------------------------- + + @ Port for allocating Fw::Buffer objects from a buffer manager. + @ When Deframer invokes this port, it receives a packet buffer PB and + @ takes ownership of it. Ownership is then delegated to the Router + output port bufferAllocate: Fw.BufferGet + + @ Port for deallocating buffers received on dataIn. + output port bufferDeallocate: Fw.BufferSend + } + +} diff --git a/Svc/DeframerFp/DeframerFp.hpp b/Svc/DeframerFp/DeframerFp.hpp new file mode 100644 index 0000000000..507b05cee9 --- /dev/null +++ b/Svc/DeframerFp/DeframerFp.hpp @@ -0,0 +1,53 @@ +// ====================================================================== +// \title DeframerFp.hpp +// \author chammard +// \brief hpp file for DeframerFp component implementation class +// ====================================================================== + +#ifndef Svc_DeframerFp_HPP +#define Svc_DeframerFp_HPP + +#include "Svc/DeframerFp/DeframerFpComponentAc.hpp" +#include "Utils/Hash/Hash.hpp" + +namespace Svc { + + +namespace FrameConfig { + //! Token type for F Prime frame header + typedef U32 TokenType; + static const U8 HEADER_SIZE = sizeof(TokenType) * 2; + static const U32 CHECKSUM_SIZE = HASH_DIGEST_LENGTH; +} + +class DeframerFp : public DeframerFpComponentBase { + + + public: + // ---------------------------------------------------------------------- + // Component construction and destruction + // ---------------------------------------------------------------------- + + //! Construct DeframerFp object + DeframerFp(const char* const compName //!< The component name + ); + + //! Destroy DeframerFp object + ~DeframerFp(); + + PRIVATE: + // ---------------------------------------------------------------------- + // Handler implementations for user-defined typed input ports + // ---------------------------------------------------------------------- + + //! Handler implementation for frame + //! + //! Port to receive framed data + void framedIn_handler(FwIndexType portNum, //!< The port number + Fw::Buffer& data, + Fw::Buffer& context) override; +}; + +} // namespace Svc + +#endif diff --git a/Svc/FrameAccumulator/FrameAccumulator.fpp b/Svc/FrameAccumulator/FrameAccumulator.fpp index 4c962d8981..72ee366404 100644 --- a/Svc/FrameAccumulator/FrameAccumulator.fpp +++ b/Svc/FrameAccumulator/FrameAccumulator.fpp @@ -13,6 +13,6 @@ module Svc { output port frameAllocate: Fw.BufferGet @ Port for sending an extracted frame out - output port frameOut: Fw.BufferSend + output port frameOut: Fw.DataWithContext } } \ No newline at end of file diff --git a/Svc/Interfaces/DeframerInterface.fppi b/Svc/Interfaces/DeframerInterface.fppi new file mode 100644 index 0000000000..1dce7923c5 --- /dev/null +++ b/Svc/Interfaces/DeframerInterface.fppi @@ -0,0 +1,5 @@ +@ Port to receive framed data +guarded input port framedIn: Fw.DataWithContext + +@ Port to output deframed data +output port deframedOut: Fw.DataWithContext \ No newline at end of file diff --git a/Svc/Router/Router.cpp b/Svc/Router/Router.cpp index 829edfc499..21e0371364 100644 --- a/Svc/Router/Router.cpp +++ b/Svc/Router/Router.cpp @@ -23,7 +23,7 @@ Router ::~Router() {} // Handler implementations for user-defined typed input ports // ---------------------------------------------------------------------- -void Router ::bufferIn_handler(NATIVE_INT_TYPE portNum, Fw::Buffer& packetBuffer) { +void Router ::dataIn_handler(NATIVE_INT_TYPE portNum, Fw::Buffer& packetBuffer, Fw::Buffer& contextBuffer) { // Read the packet type from the packet buffer FwPacketDescriptorType packetType = Fw::ComPacket::FW_PACKET_UNKNOWN; Fw::SerializeStatus status = Fw::FW_SERIALIZE_OK; diff --git a/Svc/Router/Router.fpp b/Svc/Router/Router.fpp index a59b71b7c4..0a2ba55b4a 100644 --- a/Svc/Router/Router.fpp +++ b/Svc/Router/Router.fpp @@ -2,8 +2,8 @@ module Svc { @ Routes packets deframed by the Deframer to the rest of the system passive component Router { - @ Receiving Fw::Buffer from Deframer - guarded input port bufferIn: Fw.BufferSend + @ Receiving Fw::Buffer with context buffer from Deframer + guarded input port dataIn: Fw.DataWithContext @ Port for sending file packets as Fw::Buffer (ownership passed to receiver) output port fileOut: Fw.BufferSend diff --git a/Svc/Router/Router.hpp b/Svc/Router/Router.hpp index 7657be3f20..1b2aaa2342 100644 --- a/Svc/Router/Router.hpp +++ b/Svc/Router/Router.hpp @@ -31,8 +31,9 @@ class Router : public RouterComponentBase { //! Handler implementation for bufferIn //! Receiving Fw::Buffer from Deframer - void bufferIn_handler(NATIVE_INT_TYPE portNum, //!< The port number - Fw::Buffer& packetBuffer //!< The packet buffer + void dataIn_handler(NATIVE_INT_TYPE portNum, //!< The port number + Fw::Buffer& packetBuffer, //!< The packet buffer + Fw::Buffer& contextBuffer //!< The context buffer ) override; // ! Handler for input port cmdResponseIn From 219284732d98f28e5d4d5fc0aa51423cdd512407 Mon Sep 17 00:00:00 2001 From: Michael D Starch Date: Fri, 19 Jul 2024 10:44:19 -0700 Subject: [PATCH 08/19] Working frame detector, accumulator, and fprime packet --- Svc/CMakeLists.txt | 2 +- Svc/FrameAccumulator/CMakeLists.txt | 2 + Svc/FrameAccumulator/FrameAccumulator.cpp | 2 + Svc/FrameAccumulator/FrameDetector.hpp | 2 +- .../FrameDetector/CMakeLists.txt | 21 ++ .../FrameDetector/FprimeFrameDetector.hpp | 33 +- .../StartLengthChecksumDetector.cpp | 52 --- .../StartLengthChecksumDetector.hpp | 48 --- .../FrameDetector/StartLengthCrcDetector.hpp | 302 ++++++++++++++++++ Utils/Hash/libcrc/CRC32.cpp | 3 + config/FpConfig.h | 5 + 11 files changed, 357 insertions(+), 115 deletions(-) create mode 100644 Svc/FrameAccumulator/FrameDetector/CMakeLists.txt delete mode 100644 Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.cpp delete mode 100644 Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.hpp create mode 100644 Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp diff --git a/Svc/CMakeLists.txt b/Svc/CMakeLists.txt index 03666278f0..93f81149f5 100644 --- a/Svc/CMakeLists.txt +++ b/Svc/CMakeLists.txt @@ -36,6 +36,7 @@ add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/FileDownlink/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/FileManager/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/FileUplink/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/GenericHub/") +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/FrameAccumulator/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Framer/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/FramingProtocol/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Health/") @@ -58,4 +59,3 @@ endif() add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/PosixTime/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/LinuxTimer/") -add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/FrameAccumulator/") diff --git a/Svc/FrameAccumulator/CMakeLists.txt b/Svc/FrameAccumulator/CMakeLists.txt index 75277283a6..8eee1ec3fa 100644 --- a/Svc/FrameAccumulator/CMakeLists.txt +++ b/Svc/FrameAccumulator/CMakeLists.txt @@ -6,6 +6,8 @@ # UT_SOURCE_FILES: list of source files for unit tests # #### +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/FrameDetector") + set(SOURCE_FILES "${CMAKE_CURRENT_LIST_DIR}/FrameAccumulator.fpp" "${CMAKE_CURRENT_LIST_DIR}/FrameAccumulator.cpp" diff --git a/Svc/FrameAccumulator/FrameAccumulator.cpp b/Svc/FrameAccumulator/FrameAccumulator.cpp index 76eb993763..dd343660bb 100644 --- a/Svc/FrameAccumulator/FrameAccumulator.cpp +++ b/Svc/FrameAccumulator/FrameAccumulator.cpp @@ -133,6 +133,7 @@ void FrameAccumulator ::processBuffer(Fw::Buffer& buffer) { if (buffer.isValid()) { // Copy out data and rotate FW_ASSERT(this->m_inRing.peek(buffer.getData(), size_out) == Fw::SerializeStatus::FW_SERIALIZE_OK); + buffer.setSize(size_out); m_inRing.rotate(static_cast(size_out)); FW_ASSERT( m_inRing.get_allocated_size() == static_cast(remaining - size_out), @@ -140,6 +141,7 @@ void FrameAccumulator ::processBuffer(Fw::Buffer& buffer) { static_cast(remaining), static_cast(size_out) ); + this->frameOut_out(0, buffer); } else { // No buffer is available, we need to exit and try again later diff --git a/Svc/FrameAccumulator/FrameDetector.hpp b/Svc/FrameAccumulator/FrameDetector.hpp index 9742f4b6e0..040996db37 100644 --- a/Svc/FrameAccumulator/FrameDetector.hpp +++ b/Svc/FrameAccumulator/FrameDetector.hpp @@ -42,7 +42,7 @@ namespace Svc { //! \param data: circular buffer with read-only access //! \param size_out: set as output to caller indicating size when appropriate //! \return status of the detection to be pared with size_out - virtual Status detect(const Types::CircularBuffer& data, const FwSizeType& size_out) const = 0; + virtual Status detect(const Types::CircularBuffer& data, FwSizeType& size_out) const = 0; }; } // Svc diff --git a/Svc/FrameAccumulator/FrameDetector/CMakeLists.txt b/Svc/FrameAccumulator/FrameDetector/CMakeLists.txt new file mode 100644 index 0000000000..bf144292f4 --- /dev/null +++ b/Svc/FrameAccumulator/FrameDetector/CMakeLists.txt @@ -0,0 +1,21 @@ +#### +# F prime CMakeLists.txt: +# +# SOURCE_FILES: combined list of source and autocoding files +# MOD_DEPS: (optional) module dependencies +# UT_SOURCE_FILES: list of source files for unit tests +# +#### + +set(SOURCE_FILES + "${CMAKE_CURRENT_LIST_DIR}/StartLengthChecksumDetector.cpp" +) + +# Uncomment and add any modules that this component depends on, else +# they might not be available when cmake tries to build this component. + +# set(MOD_DEPS +# Add your dependencies here +# ) + +register_fprime_module() diff --git a/Svc/FrameAccumulator/FrameDetector/FprimeFrameDetector.hpp b/Svc/FrameAccumulator/FrameDetector/FprimeFrameDetector.hpp index fe6dd6a8a0..a515212c07 100644 --- a/Svc/FrameAccumulator/FrameDetector/FprimeFrameDetector.hpp +++ b/Svc/FrameAccumulator/FrameDetector/FprimeFrameDetector.hpp @@ -1,17 +1,24 @@ -// -// Created by Michael Starch on 6/13/24. -// +// ====================================================================== +// \title FprimeFrameDetector.hpp +// \author mstarch +// \brief hpp file for fprime frame detector definitions +// ====================================================================== #ifndef SVC_FRAME_ACCUMULATOR_FRAME_DETECTOR_FPRIME_FRAME_DETECTOR #define SVC_FRAME_ACCUMULATOR_FRAME_DETECTOR_FPRIME_FRAME_DETECTOR -#include "Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.hpp" +#include "FpConfig.h" +#include "Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp" namespace Svc { - class FprimeFrameDetector : public StartLengthChecksumDetector { - FprimeFrameDetector() : StartLengthChecksumDetector( - {}, - {}, - {}, - ); +namespace FrameDetectors { - }; -} -#endif //SVC_FRAME_ACCUMULATOR_FRAME_DETECTOR_FPRIME_FRAME_DETECTOR \ No newline at end of file +//! fprime framing start word is a configurable type and matched against 0xdeadbeef as cast into the appropriate type +using FprimeStartWord = StartToken(0xdeadbeef)>; +//! fprime framing length is a configurable type +using FprimeLength = LengthToken; +//! fprime uses a CRC32 checksum anchored at the end of the data +using FprimeChecksum = CRC; + +//! fprime frame detector is a start/length/crc detector using the configured fprime tokens +using FprimeFrameDetector = StartLengthCrcDetector; +} // namespace FrameDetectors +} // namespace Svc +#endif // SVC_FRAME_ACCUMULATOR_FRAME_DETECTOR_FPRIME_FRAME_DETECTOR diff --git a/Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.cpp b/Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.cpp deleted file mode 100644 index 7ab36fb378..0000000000 --- a/Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// -// Created by Michael Starch on 6/13/24. -// - -#include "Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.hpp" - - - -namespace Svc { -StartLengthChecksumDetector::StartLengthChecksumDetector(Token& start, Token& length, Token& hash, Utils::Hash& hasher) : - FrameDetector(), - m_hasher(hasher), - m_start(start), - m_length(length), - m_hash(hash) {} - - void read_token(const Types::CircularBuffer& data, StartLengthChecksumDetector::Token& token) { - token.value.full = 0; - for (U8 i = 0; i < token.size; i++) { - FwSizeType byte_offset = (token.endianness == StartLengthChecksumDetector::Token::Endianness::BIG) ? - (token.offset + i) : (token.offset + (token.size - i - 1)); - U8 byte = 0; - data.peek(byte, byte_offset); - token.value.full = token.value.full << 8 | byte; - } - token.value.full |= token.mask.full; - } - - FrameDetector::Status StartLengthChecksumDetector::detect(const Types::CircularBuffer& data, const FwSizeType& size_out) const { - Token start = m_start; - read_token(data, start); - - Token length = m_length; - read_token(data, length); - - Token hash = m_hash; - hash.offset += length.value.full + length.offset; - read_token(data, hash); - - m_hasher.init(); - for (FwSizeType i = 0; i < length.value.full; i++) { - U8 byte = 0; - data.peek(byte, i + length.offset + length.size); - m_hasher.update(&byte, 1); - } - Utils::HashBuffer recalculation; - m_hasher.final(recalculation); - - - } - -} // Svc \ No newline at end of file diff --git a/Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.hpp b/Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.hpp deleted file mode 100644 index b38bd0b288..0000000000 --- a/Svc/FrameAccumulator/FrameDetector/StartLengthChecksumDetector.hpp +++ /dev/null @@ -1,48 +0,0 @@ -// -// Created by Michael Starch on 6/13/24. -// - -#ifndef SVC_FRAMEACCUCULATOR_FRAME_DETECTOR_STARTLENGTHCHECKSUMDETECTOR_HPP -#define SVC_FRAMEACCUCULATOR_FRAME_DETECTOR_STARTLENGTHCHECKSUMDETECTOR_HPP -#include "Fw/Types/PolyType.hpp" -#include "Utils/Hash/Hash.hpp" -#include "Svc/FrameAccumulator/FrameDetector.hpp" - - -namespace Svc { - class StartLengthChecksumDetector : public FrameDetector { - public: - struct Token { - enum Endianness { - BIG, - LITTLE - }; - union Type { - U8 u8; - U16 u16; - U32 u32; - U64 u64; - U64 full; - }; - Endianness endianness; - FwSizeType size; - FwSizeType offset; - Type value; - Type mask; - }; - - StartLengthChecksumDetector(Token& start, Token& length, Token& hash, Utils::Hash& hasher); - - FrameDetector::Status detect(const Types::CircularBuffer& data, const FwSizeType& size_out) const; - - Utils::Hash& m_hasher; - Token& m_start; - Token& m_length; - Token& m_hash; - FwSizeType m_length_offset; - - }; - -} // Svc - -#endif //SVC_FRAMEACCUCULATOR_FRAME_DETECTOR_STARTLENGTHCHECKSUMDETECTOR_HPP diff --git a/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp b/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp new file mode 100644 index 0000000000..c61c2bc597 --- /dev/null +++ b/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp @@ -0,0 +1,302 @@ +// ====================================================================== +// \title StartLengthCrcDetector.hpp +// \author mstarch +// \brief hpp file for start/length/crc frame detector definitions +// ====================================================================== +#ifndef SVC_FRAMEACCUCULATOR_FRAME_DETECTOR_STARTLENGTHCHECKSUMDETECTOR_HPP +#define SVC_FRAMEACCUCULATOR_FRAME_DETECTOR_STARTLENGTHCHECKSUMDETECTOR_HPP +#include "Fw/Types/PolyType.hpp" +#include "Svc/FrameAccumulator/FrameDetector.hpp" +#include "Utils/Hash/libcrc/lib_crc.h" + +namespace Svc { +namespace FrameDetectors { + +//! \brief endianness of the token word +enum Endianness { + BIG, //!< Token word is big-endian + LITTLE //!< Token word is little-endian +}; + +// CRC uses library defined with non fixed size types. Check for compliance with correct fixed size types. +static_assert(sizeof(unsigned long) >= sizeof(U32), "CRC32 cannot fit in CRC32 library chosen types"); +static_assert(sizeof(unsigned short) >= sizeof(U16), "CRC16 cannot fit in CRC16 library chosen types"); + +//! \breif base template definition of a "token" +//! +//! A token is a field that can be read from the circular buffer in order to detect a frame. These tokens could be start +//! words, lengths, crcs, etc. Tokens are static with respect to a given framing protocol, but are parameterized across +//! several concepts: +//! 1. Token type: type of the token's containing word (e.g. U32, U16, U8) +//! 2. Token mask: mask used to pull the token from the containing word. Used for bit fields. +//! 3. Token endianness: endianness of the stored token word +//! \tparam TokenType: template parameter setting token word's type. Must be unsigned. +//! \tparam TokenMask: template parameter storing mask for token word. Expressed in type "TokenType" +//! \tparam TokenEndianness: template parameter setting endianness of token word. Endianness::BIG or Endianness::LITTLE. +template ::max(), + Endianness TokenEndianness = Endianness::BIG> +class Token { + // Checks to ensure token parameters are well-formed + static_assert(!std::numeric_limits::is_signed, "Tokens must be unsigned"); + static_assert(sizeof(TokenType) < std::numeric_limits::max(), "Token sizes must fit in a unsigned byte"); + static_assert(TokenEndianness == Endianness::BIG || TokenEndianness == Endianness::LITTLE, "Invalid endianness"); + + public: + // \brief zero out m_value + Token(): m_value(0) {} + + //! \brief read token from circular buffer without consuming data + //! + //! Reads the token from the circular buffer by reading the token's containing word, correcting for endianness, and + //! applying the token mask. The read data is set in the member variable: m_value. `size_out` parameter is updated + //! to add in the size of the token read regardless of any errors. Will return "MORE_DATA_NEEDED" on error or + //! "FRAME_DETECTED" on success. + //! \param data: circular buffer to peek into + //! \param offset: offset into the circular buffer to read + //! \param size_out: updated to add in token size + //! \return: status of the success/failure of the read + FrameDetector::Status read(const Types::CircularBuffer& data, FwSizeType offset, FwSizeType& size_out) { + // Update size_out + constexpr FwSizeType token_size = sizeof(TokenType); + size_out += token_size; + + // Read token byte by byte correcting for endianness + TokenType token = 0; + for (U8 i = 0; i < static_cast(token_size); i++) { + // Read most significant remaining byte regardless of endianness + FwSizeType byte_offset = + (TokenEndianness == Endianness::BIG) ? (offset + i) : (offset + (token_size - i - 1)); + U8 byte = 0; + Fw::SerializeStatus status = data.peek(byte, byte_offset); + if (status != Fw::SerializeStatus::FW_SERIALIZE_OK) { + this->m_value = 0; + return FrameDetector::Status::MORE_DATA_NEEDED; + } + // Shift in most significant remaining byte + token = token << 8 | byte; + } + // Mask and set token value + token &= TokenMask; + this->m_value = token; + return FrameDetector::FRAME_DETECTED; + } + + //! \brief get value of token after read, or 0 before + const TokenType& getValue() { return m_value; } + + protected: + TokenType m_value; +}; + +//! \brief subclass of Token representing the start token/start word of the frame +//! +//! Most frames have a start word or start token indicating the beginning of a frame. This token subclass represents +//! this concept in a parameterizable way. Start tokens are parameterized across the following: +//! 1. TokenType: same as token type from parent "Token" class. +//! 2. StartExpected: value of token indicating start of frame as TokenType. e.g. 0xdeadbeef(U32) for fprime +//! 3. TokenMask: same as token mask from parent class. Also applied to StartExpected +//! 4. TokenEndianness: same as token endianness from parent class. +//! +//! Start words read the token from the circular buffer, and then compare against the expected value after each is +//! masked. If the comparison passes, frame detection continues with "FRAME_DETECTED" otherwise "NO_FRAME_DETECTED" is +//! returned to indicate the current position in the buffer is *not* a frame. +//! \tparam TokenType: template parameter setting token word's type. Must be unsigned. +//! \tparam StartExpected: template parameter setting the expected start word pre-mask. +//! \tparam TokenMask: template parameter storing mask for token word. Expressed in type "TokenType" +//! \tparam TokenEndianness: template parameter setting endianness of token word. Endianness::BIG or Endianness::LITTLE. +template ::max(), + Endianness TokenEndianness = Endianness::BIG> +class StartToken : public Token { + public: + //! \breif read start token and determine if match with expected start token + //! + //! This will read the start token from the circular buffer. It then compares to expected to determine if there is + //! a frame start or no. This will return FRAME_DETECTED if the start word is detected. It will return + //! NO_FRAME_DETECTED if there was no match, and MORE_DATA_NEEDED if there is not enough data in underlying read. + //! \param data: circular buffer to read + //! \param size_out: size returned updated to include size of start token. + //! \return: FRAME_DETECTED, NO_FRAME_DETECTED, or MORE_DATA_NEEDED. + FrameDetector::Status read(const Types::CircularBuffer& data, FwSizeType& size_out) { + constexpr TokenType EXPECTED_VALUE = (StartExpected & TokenMask); + + FrameDetector::Status status = this->Token::read(data, 0, size_out); + if ((status == FrameDetector::FRAME_DETECTED) && (this->m_value != EXPECTED_VALUE)) { + status = FrameDetector::NO_FRAME_DETECTED; + } + return status; + } +}; + +//! \breif token representing data length +//! +//! Length of the data field is found somewhere in the data payload at a specified offset. This template has the +//! standard Token functions and an additional template parameter "Offset" used to show the offset of the length token. +//! \tparam TokenType: template parameter setting token word's type. Must be unsigned. +//! \tparam Offset: template parameter setting offset of length word +//! \tparam StartExpected: template parameter setting the expected start word pre-mask. +//! \tparam TokenMask: template parameter storing mask for token word. Expressed in type "TokenType" +//! \tparam TokenEndianness: template parameter setting endianness of token word. Endianness::BIG or Endianness::LITTLE. +template ::max(), + Endianness TokenEndianness = Endianness::BIG> +class LengthToken : public Token { + public: + //! \breif read length token and return total size of packet through length token + //! \param data: buffer to read + //! \param size_out: total packet length up through end of length token + //! + //! This reads the length token from the buffer and returns the total needed size up through the length token. It + //! does not include the length of the data as that is up to the caller. + //! \return: FRAME_DETECTED, or MORE_DATA_NEEDED. + FrameDetector::Status read(const Types::CircularBuffer& data, FwSizeType& size_out) { + size_out = Offset; + return this->Token::read(data, size_out, size_out); + } +}; +//! \breif type-compliant wrapper of CRC32 library update function +//! \param checksum: checksum word (U32) +//! \param byte: byte to update +//! \return: updated checksum (U32) +U32 CRC32(U32 checksum, U8 byte) { + return static_cast(update_crc_32(static_cast(checksum), byte)); +} +//! \breif type-compliant wrapper of CRC16 library update function +//! \param checksum: checksum word (U16) +//! \param byte: byte to update +//! \return: updated checksum (U16) +U16 CRC16(U16 checksum, U8 byte) { + return static_cast(update_crc_16(static_cast(checksum), byte)); +} +//! \brief token representing the CRC +//! +//! CRC checksum template used to calculate the CRC of the *entire* packet except the stored CRC value itself. This is +//! parameterized on the following: +//! 1. TokenType (same as Token class) +//! 2. DataOffset: offset of data block. Used to calculate the full packet length including the data. +//! 3. RelativeTokenOffset: offset from end of data (length token) to where the CRC stored value +//! 4 CRCFn: function used to update CRC for each byte. Must match the TokenType. +//! This token will update size_out to include the whole packet (data block and CRC). It allows calculating the CRC on +//! the packet data and reading the sent CRC from the buffer. +//! \tparam TokenType: template parameter setting token word's type. Must be unsigned. +//! \tparam DataOffset: offset of variable data block in packet +//! \tparam RelativeTokenOffset: offset relative to end of data to where CRC is stored +//! \tparam CRCFn: function for updating CRC with new byte +template +class CRC : public Token::max(), BIG> { + public: + CRC() : m_stored_offset(0), m_expected(0) {} + //! \brief calculate CRC across whole packet + //! + //! This will read in the whole packet (start word through but not including stored CRC) and calculate the CRC using + //! the parameterized function. It then negates (1's complements) the result per the CRC guidance. The initial + //! value is 0xffffffff converted to the appropriate size for the CRC. This will return FRAME_DETECTED + //! if there is data or MORE_DATA_NEEDED if the whole packet is not available. This will set m_stored_offset and + //! m_expected in preparation for a read call. m_stored_offset will be 0 if not called, or error occurred. + //! \param data: buffer to read + //! \param length: variable data length read from LengthToken + //! \param size_out: updated to include full length of packet (less stored CRC) + //! \return: FRAME_DETECTED, or MORE_DATA_NEEDED. + FrameDetector::Status calculate(const Types::CircularBuffer& data, FwSizeType length, FwSizeType& size_out) { + const FwSizeType checksum_length = DataOffset + length + RelativeTokenOffset; + size_out = checksum_length; + TokenType checksum = std::numeric_limits::max(); // Start with 0xffffffff + // Loop byte by byte + for (FwSizeType i = 0; i < checksum_length; i++) { + U8 byte = 0; + Fw::SerializeStatus status = data.peek(byte, i); + if (status != Fw::SerializeStatus::FW_SERIALIZE_OK) { + this->m_stored_offset = 0; + return FrameDetector::Status::MORE_DATA_NEEDED; + } + checksum = CRCFn(checksum, byte); + } + // CRC finalization ends in bit-wise negation + this->m_stored_offset = checksum_length; + this->m_expected = ~(checksum); + return FrameDetector::FRAME_DETECTED; + } + //! \brief read stored CRC and check against recalculation + //! + //! `calculate` must be called first. This will read the stored CRC and check against the value calculated during + //! the `calculate` step. size_out will be updated to the full packet size (including CRC at the end). This will + //! return FRAME_DETECTED if the CRC is valid (as is the whole frame) or MORE_DATA_NEEDED if the whole packet + //! is not including the trailing CRC, and NO_FRAME_DETECTED if the CRC fails. + //! \param data: buffer to read for data + //! \param size_out: size of the whole packet + //! \return: FRAME_DETECTED, NO_FRAME_DETECTED, or MORE_DATA_NEEDED. + FrameDetector::Status read(const Types::CircularBuffer& data, FwSizeType& size_out) { + FW_ASSERT(this->m_stored_offset != 0); // Must have called calculate before calling read + size_out = this->m_stored_offset; + FrameDetector::Status status = + this->Token::max(), BIG>::read(data, size_out, size_out); + if ((status == FrameDetector::FRAME_DETECTED) && (this->m_value != this->m_expected)) { + status = FrameDetector::NO_FRAME_DETECTED; + } + return status; + } + + protected: + FwSizeType m_stored_offset; + TokenType m_expected; +}; +//! \breif start/length/crc detector template +//! +//! Most packets are of the form start token, length token, data, and a trailing CRC. This template is used to quickly +//! implement detectors that follow the above pattern by supplying configured tokens for each concept. In shor, a dev +//! should create a protocol specific StartToken, LengthToken, and Checksum and then template this class using those +//! specified tokens. That fully specified class can be supplied to FrameAccumulator for detection. +//! +//! For example see: FprimeFrameDetector.hpp +//! \tparam StartToken: start token specification +//! \tparam LengthToken: length token specification +//! \tparam Checksum: checksum token specification +template +class StartLengthCrcDetector : public FrameDetector { + public: + //! \brief detect if a frame is available in circular buffer + //! + //! Detects if the frame is available by checking start word, length, and checksum in order. Returns FRAME_DETECTED + //! when the whole frame is available, NO_FRAME_DETECTED when there is no frame at the head of the buffer, and + //! MORE_DATA_NEEDED if the frame is valid (so far) but incomplete. size_out specifies the size needed to perform + //! the next read of the next token. + //! \param data: circular buffer + //! \param size_out: set to needed size. Note: may not be full frame size, just to read the next token. + //! \return: FRAME_DETECTED, NO_FRAME_DETECTED, or MORE_DATA_NEEDED. + Status detect(const Types::CircularBuffer& data, FwSizeType& size_out) const { + // Read start word + StartToken startWord; + Status status = startWord.read(data, size_out); + if (status != Status::FRAME_DETECTED) { + return status; + } + + // Read length + LengthToken lengthWord; + status = lengthWord.read(data, size_out); + if (status != Status::FRAME_DETECTED) { + return status; + } + FwSizeType length = lengthWord.getValue(); + + // Recalculate CRC + Checksum crc; + status = crc.calculate(data, length, size_out); + if (status != Status::FRAME_DETECTED) { + return status; + } + // Read CRC + status = crc.read(data, size_out); + return status; + }; +}; +} // namespace FrameDetectors +} // namespace Svc + +#endif // SVC_FRAMEACCUCULATOR_FRAME_DETECTOR_STARTLENGTHCHECKSUMDETECTOR_HPP diff --git a/Utils/Hash/libcrc/CRC32.cpp b/Utils/Hash/libcrc/CRC32.cpp index 81e94ada5d..0c49f9b390 100644 --- a/Utils/Hash/libcrc/CRC32.cpp +++ b/Utils/Hash/libcrc/CRC32.cpp @@ -12,6 +12,9 @@ #include +static_assert(sizeof(unsigned long) >= sizeof(U32), "CRC32 cannot fit in CRC32 library chosen types"); + + namespace Utils { Hash :: diff --git a/config/FpConfig.h b/config/FpConfig.h index a280264cd3..e7352a5f76 100644 --- a/config/FpConfig.h +++ b/config/FpConfig.h @@ -106,6 +106,11 @@ typedef U32 FwDpIdType; typedef U32 FwDpPriorityType; #define PRI_FwDpPriorityType PRIu32 +// Type for start word and length word used in fprime framing +typedef U32 FwFramingTokenType; +#define PRI_FwFramingTokenType PRIu32 + + // ---------------------------------------------------------------------- // Derived type aliases // By default, these types are aliases of types defined above From 728a2a32ba178d9bdfa2b984a1cea550a73fe405 Mon Sep 17 00:00:00 2001 From: Michael D Starch Date: Fri, 19 Jul 2024 15:06:21 -0700 Subject: [PATCH 09/19] CCSDS implementation and better checksums --- .../FrameDetector/CCSDSFrameDetector.hpp | 50 ++++++++++++++ .../FrameDetector/StartLengthCrcDetector.hpp | 68 +++++++++++++------ 2 files changed, 99 insertions(+), 19 deletions(-) create mode 100644 Svc/FrameAccumulator/FrameDetector/CCSDSFrameDetector.hpp diff --git a/Svc/FrameAccumulator/FrameDetector/CCSDSFrameDetector.hpp b/Svc/FrameAccumulator/FrameDetector/CCSDSFrameDetector.hpp new file mode 100644 index 0000000000..6b0684155f --- /dev/null +++ b/Svc/FrameAccumulator/FrameDetector/CCSDSFrameDetector.hpp @@ -0,0 +1,50 @@ +// ====================================================================== +// \title CCSDSFrameDetector.hpp +// \author mstarch +// \brief hpp file for CCSDS frame detector definitions +// ====================================================================== +#ifndef SVC_FRAME_ACCUMULATOR_FRAME_DETECTOR_CCSDS_FRAME_DETECTOR +#define SVC_FRAME_ACCUMULATOR_FRAME_DETECTOR_CCSDS_FRAME_DETECTOR +#include "FpConfig.h" +#include "Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp" +namespace Svc { +namespace FrameDetectors { + +//! \brief CRC16 CCITT implementation +//! +//! CCSDS uses a CRC16 (CCITT) implementation with polynomial 0x11021, initial value of 0xFFFF, and XOR of 0x0000. +//! +class CRC16_CCITT : public CRCWrapper { + public: + // Initial value is 0xFFFF + CRC16_CCITT() : CRCWrapper(std::numeric_limits::max()) {} + + //! \brief update CRC with one new byte + //! + //! Update function for CRC taking previous value from member variable and updating it. + //! + //! \param new_byte: new byte to add to calculation + void update(U8 new_byte) override { + this->m_crc = static_cast(update_crc_ccitt(m_crc, new_byte)); + }; + + //! \brief finalize and return CRC value + U16 finalize() override { + // Specified XOR value is 0x0000 + return this->m_crc ^ static_cast(0); + }; +}; + + +//! CCSDS framing start word is 2 bits of version number "00" at the head of the first 2 octets +using CCSDSStartWord = StartToken(0), static_cast(0xC000)>; +//! CCSDS length is the last 10 bits of the 3rd and 4th octet +using CCSDSLength = LengthToken(0x03FF)>; +//! CCSDS checksum is a 16bit CRC with data starting at the 6th octet and the crc following directly +using CCSDSChecksum = CRC; + +//! CCSDS frame detector is a start/length/crc detector using the configured fprime tokens +using CCSDSFrameDetector = StartLengthCrcDetector; +} // namespace FrameDetectors +} // namespace Svc +#endif // SVC_FRAME_ACCUMULATOR_FRAME_DETECTOR_CCSDS_FRAME_DETECTOR diff --git a/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp b/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp index c61c2bc597..735b7aad51 100644 --- a/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp +++ b/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp @@ -8,6 +8,7 @@ #include "Fw/Types/PolyType.hpp" #include "Svc/FrameAccumulator/FrameDetector.hpp" #include "Utils/Hash/libcrc/lib_crc.h" +#include namespace Svc { namespace FrameDetectors { @@ -157,20 +158,46 @@ class LengthToken : public Token { return this->Token::read(data, size_out, size_out); } }; -//! \breif type-compliant wrapper of CRC32 library update function -//! \param checksum: checksum word (U32) -//! \param byte: byte to update -//! \return: updated checksum (U32) -U32 CRC32(U32 checksum, U8 byte) { - return static_cast(update_crc_32(static_cast(checksum), byte)); -} -//! \breif type-compliant wrapper of CRC16 library update function -//! \param checksum: checksum word (U16) -//! \param byte: byte to update -//! \return: updated checksum (U16) -U16 CRC16(U16 checksum, U8 byte) { - return static_cast(update_crc_16(static_cast(checksum), byte)); -} +template +class CRCWrapper { + protected: + //! \brief constructor setting initial value + CRCWrapper(TokenType initial) : m_crc(initial) {} + public: + //! \brief update CRC with one new byte + //! + //! Update function for CRC taking previous value from member variable and updating it. + //! + //! \param new_byte: new byte to add to calculation + virtual void update(U8 new_byte) = 0; + + //! \brief finalize and return CRC value + virtual TokenType finalize() = 0; + + protected: + TokenType m_crc; +}; +//! \breif standard CRC32 implementation +class CRC32 : public CRCWrapper { + public: + CRC32() : CRCWrapper(std::numeric_limits::max()) {} + + //! \brief update CRC with one new byte + //! + //! Update function for CRC taking previous value from member variable and updating it. + //! + //! \param new_byte: new byte to add to calculation + void update(U8 new_byte) override { + this->m_crc = static_cast(update_crc_32(static_cast(m_crc), new_byte)); + }; + + //! \brief finalize and return CRC value + U32 finalize() override { + // Bitwise not also works, but the CRC standard requests XOR calculation instead + return this->m_crc ^ std::numeric_limits::max(); + }; +}; + //! \brief token representing the CRC //! //! CRC checksum template used to calculate the CRC of the *entire* packet except the stored CRC value itself. This is @@ -188,9 +215,12 @@ U16 CRC16(U16 checksum, U8 byte) { template + class CRCHandler = CRC32> class CRC : public Token::max(), BIG> { public: + // Check CRC token and CRC handler match + static_assert(std::is_base_of, CRCHandler>::value, "Invalid CRC wrapper supplied"); + CRC() : m_stored_offset(0), m_expected(0) {} //! \brief calculate CRC across whole packet //! @@ -206,7 +236,7 @@ class CRC : public Token::max(), BIG> FrameDetector::Status calculate(const Types::CircularBuffer& data, FwSizeType length, FwSizeType& size_out) { const FwSizeType checksum_length = DataOffset + length + RelativeTokenOffset; size_out = checksum_length; - TokenType checksum = std::numeric_limits::max(); // Start with 0xffffffff + CRCHandler crc; // Loop byte by byte for (FwSizeType i = 0; i < checksum_length; i++) { U8 byte = 0; @@ -215,11 +245,11 @@ class CRC : public Token::max(), BIG> this->m_stored_offset = 0; return FrameDetector::Status::MORE_DATA_NEEDED; } - checksum = CRCFn(checksum, byte); + crc.update(byte); } // CRC finalization ends in bit-wise negation this->m_stored_offset = checksum_length; - this->m_expected = ~(checksum); + this->m_expected = crc.finalize(); return FrameDetector::FRAME_DETECTED; } //! \brief read stored CRC and check against recalculation @@ -269,7 +299,7 @@ class StartLengthCrcDetector : public FrameDetector { //! \param data: circular buffer //! \param size_out: set to needed size. Note: may not be full frame size, just to read the next token. //! \return: FRAME_DETECTED, NO_FRAME_DETECTED, or MORE_DATA_NEEDED. - Status detect(const Types::CircularBuffer& data, FwSizeType& size_out) const { + Status detect(const Types::CircularBuffer& data, FwSizeType& size_out) const override { // Read start word StartToken startWord; Status status = startWord.read(data, size_out); From cce1aebddbac0ba6656f703b41fcf454191e856d Mon Sep 17 00:00:00 2001 From: Michael D Starch Date: Mon, 22 Jul 2024 14:43:28 -0700 Subject: [PATCH 10/19] Fixing overly small start word to use SCID as well --- .../FrameDetector/CCSDSFrameDetector.hpp | 14 ++++++++++---- .../FrameDetector/StartLengthCrcDetector.hpp | 18 ++++++++++++++---- config/FpConfig.h | 5 +++++ 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/Svc/FrameAccumulator/FrameDetector/CCSDSFrameDetector.hpp b/Svc/FrameAccumulator/FrameDetector/CCSDSFrameDetector.hpp index 6b0684155f..238c66d345 100644 --- a/Svc/FrameAccumulator/FrameDetector/CCSDSFrameDetector.hpp +++ b/Svc/FrameAccumulator/FrameDetector/CCSDSFrameDetector.hpp @@ -34,12 +34,18 @@ class CRC16_CCITT : public CRCWrapper { return this->m_crc ^ static_cast(0); }; }; +constexpr U16 TEN_BIT_MASK = 0x03FF; +static_assert(CCSDS_SCID <= (std::numeric_limits::max() & TEN_BIT_MASK), "SCID must fit in 10bits"); - -//! CCSDS framing start word is 2 bits of version number "00" at the head of the first 2 octets -using CCSDSStartWord = StartToken(0), static_cast(0xC000)>; +//! CCSDS framing start word is: +//! - 2 bits of version number "00" +//! - 1 bit of bypass flag "0" +//! - 1 bit of control command flag "0" +//! - 2 bits of reserved "00" +//! - 10 bits of configurable SCID +using CCSDSStartWord = StartToken(0 | (CCSDS_SCID & TEN_BIT_MASK))>; //! CCSDS length is the last 10 bits of the 3rd and 4th octet -using CCSDSLength = LengthToken(0x03FF)>; +using CCSDSLength = LengthToken; //! CCSDS checksum is a 16bit CRC with data starting at the 6th octet and the crc following directly using CCSDSChecksum = CRC; diff --git a/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp b/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp index 735b7aad51..9b94a48029 100644 --- a/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp +++ b/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp @@ -142,20 +142,27 @@ class StartToken : public Token { //! \tparam TokenEndianness: template parameter setting endianness of token word. Endianness::BIG or Endianness::LITTLE. template ::max(), Endianness TokenEndianness = Endianness::BIG> class LengthToken : public Token { public: //! \breif read length token and return total size of packet through length token + //! + //! This reads the length token from the buffer and returns the total needed size up through the length token. If + //! the length exceeds the maximum, then NO_FRAME_DETECTED is returned. size_out does not include the length of the + //! data as that is up to the caller. MORE_DATA_NEEDED is returned when insufficient data is available to read the + //! length token. FRAME_DETECTED is return when a valid size token was read //! \param data: buffer to read //! \param size_out: total packet length up through end of length token - //! - //! This reads the length token from the buffer and returns the total needed size up through the length token. It - //! does not include the length of the data as that is up to the caller. //! \return: FRAME_DETECTED, or MORE_DATA_NEEDED. FrameDetector::Status read(const Types::CircularBuffer& data, FwSizeType& size_out) { size_out = Offset; - return this->Token::read(data, size_out, size_out); + FrameDetector::Status status = this->Token::read(data, size_out, size_out); + if (this->m_value > MaximumLength) { + return FrameDetector::Status::NO_FRAME_DETECTED; + } + return status; } }; template @@ -323,6 +330,9 @@ class StartLengthCrcDetector : public FrameDetector { } // Read CRC status = crc.read(data, size_out); + if (status == Status::FRAME_DETECTED) { + printf("FRAME!!!!!\n"); + } return status; }; }; diff --git a/config/FpConfig.h b/config/FpConfig.h index e7352a5f76..f8270db9fc 100644 --- a/config/FpConfig.h +++ b/config/FpConfig.h @@ -12,6 +12,11 @@ #ifndef FPCONFIG_H_ #define FPCONFIG_H_ +// ---------------------------------------------------------------------- +// Basic configuration +// ---------------------------------------------------------------------- +constexpr U16 CCSDS_SCID = 0x0355; + // ---------------------------------------------------------------------- // Type aliases // ---------------------------------------------------------------------- From 7c9486a56f7961adbb647c569565b1a0790aa68c Mon Sep 17 00:00:00 2001 From: Michael D Starch Date: Wed, 24 Jul 2024 12:48:54 -0700 Subject: [PATCH 11/19] Fixing frame accumulator for new structure --- Svc/FrameAccumulator/CMakeLists.txt | 1 - Svc/FrameAccumulator/FrameAccumulator.cpp | 3 ++- .../FrameDetector/CMakeLists.txt | 21 ------------------- 3 files changed, 2 insertions(+), 23 deletions(-) delete mode 100644 Svc/FrameAccumulator/FrameDetector/CMakeLists.txt diff --git a/Svc/FrameAccumulator/CMakeLists.txt b/Svc/FrameAccumulator/CMakeLists.txt index 8eee1ec3fa..1fad436a2a 100644 --- a/Svc/FrameAccumulator/CMakeLists.txt +++ b/Svc/FrameAccumulator/CMakeLists.txt @@ -6,7 +6,6 @@ # UT_SOURCE_FILES: list of source files for unit tests # #### -add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/FrameDetector") set(SOURCE_FILES "${CMAKE_CURRENT_LIST_DIR}/FrameAccumulator.fpp" diff --git a/Svc/FrameAccumulator/FrameAccumulator.cpp b/Svc/FrameAccumulator/FrameAccumulator.cpp index dd343660bb..52a879a92d 100644 --- a/Svc/FrameAccumulator/FrameAccumulator.cpp +++ b/Svc/FrameAccumulator/FrameAccumulator.cpp @@ -141,7 +141,8 @@ void FrameAccumulator ::processBuffer(Fw::Buffer& buffer) { static_cast(remaining), static_cast(size_out) ); - this->frameOut_out(0, buffer); + Fw::Buffer nullContext; + this->frameOut_out(0, buffer, nullContext); } else { // No buffer is available, we need to exit and try again later diff --git a/Svc/FrameAccumulator/FrameDetector/CMakeLists.txt b/Svc/FrameAccumulator/FrameDetector/CMakeLists.txt deleted file mode 100644 index bf144292f4..0000000000 --- a/Svc/FrameAccumulator/FrameDetector/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -#### -# F prime CMakeLists.txt: -# -# SOURCE_FILES: combined list of source and autocoding files -# MOD_DEPS: (optional) module dependencies -# UT_SOURCE_FILES: list of source files for unit tests -# -#### - -set(SOURCE_FILES - "${CMAKE_CURRENT_LIST_DIR}/StartLengthChecksumDetector.cpp" -) - -# Uncomment and add any modules that this component depends on, else -# they might not be available when cmake tries to build this component. - -# set(MOD_DEPS -# Add your dependencies here -# ) - -register_fprime_module() From 88eba2b00b040a3ded31b430d1b6a8e6434e7743 Mon Sep 17 00:00:00 2001 From: Michael D Starch Date: Thu, 22 Aug 2024 09:44:56 -0700 Subject: [PATCH 12/19] Minor cleanup to frame detectors --- Svc/FrameAccumulator/FrameDetector/CCSDSFrameDetector.hpp | 3 ++- .../FrameDetector/StartLengthCrcDetector.hpp | 5 +---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Svc/FrameAccumulator/FrameDetector/CCSDSFrameDetector.hpp b/Svc/FrameAccumulator/FrameDetector/CCSDSFrameDetector.hpp index 238c66d345..1c9470290c 100644 --- a/Svc/FrameAccumulator/FrameDetector/CCSDSFrameDetector.hpp +++ b/Svc/FrameAccumulator/FrameDetector/CCSDSFrameDetector.hpp @@ -35,6 +35,7 @@ class CRC16_CCITT : public CRCWrapper { }; }; constexpr U16 TEN_BIT_MASK = 0x03FF; +constexpr U16 CCSDS_SDLTP_TC_MAX_FRAME_LENGTH = 1017; static_assert(CCSDS_SCID <= (std::numeric_limits::max() & TEN_BIT_MASK), "SCID must fit in 10bits"); //! CCSDS framing start word is: @@ -45,7 +46,7 @@ static_assert(CCSDS_SCID <= (std::numeric_limits::max() & TEN_BIT_MASK), "S //! - 10 bits of configurable SCID using CCSDSStartWord = StartToken(0 | (CCSDS_SCID & TEN_BIT_MASK))>; //! CCSDS length is the last 10 bits of the 3rd and 4th octet -using CCSDSLength = LengthToken; +using CCSDSLength = LengthToken; //! CCSDS checksum is a 16bit CRC with data starting at the 6th octet and the crc following directly using CCSDSChecksum = CRC; diff --git a/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp b/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp index 9b94a48029..861513b295 100644 --- a/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp +++ b/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp @@ -184,7 +184,7 @@ class CRCWrapper { protected: TokenType m_crc; }; -//! \breif standard CRC32 implementation +//! \brief standard CRC32 implementation class CRC32 : public CRCWrapper { public: CRC32() : CRCWrapper(std::numeric_limits::max()) {} @@ -330,9 +330,6 @@ class StartLengthCrcDetector : public FrameDetector { } // Read CRC status = crc.read(data, size_out); - if (status == Status::FRAME_DETECTED) { - printf("FRAME!!!!!\n"); - } return status; }; }; From 3d6852e570fd0d3e1f01b1dd2b1b76e24225d7b1 Mon Sep 17 00:00:00 2001 From: chammard Date: Tue, 24 Sep 2024 17:11:44 -0700 Subject: [PATCH 13/19] =?UTF-8?q?Add=20CCSDS=20Deframers=20and=20F=C2=B4?= =?UTF-8?q?=20minimal=20deframer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Svc/CCSDSDeframers/CMakeLists.txt | 2 + .../SpaceDataLinkDeframer/CMakeLists.txt | 14 + .../SpaceDataLinkDeframer.cpp | 76 +++ .../SpaceDataLinkDeframer.fpp | 29 + .../SpaceDataLinkDeframer.hpp | 45 ++ .../SpaceDataLinkDeframer/docs/sdd.md | 66 +++ .../SpacePacketDeframer/CMakeLists.txt | 21 + .../SpacePacketDeframer.cpp | 81 +++ .../SpacePacketDeframer.fpp | 29 + .../SpacePacketDeframer.hpp} | 40 +- .../SpacePacketDeframer/docs/sdd.md | 66 +++ Svc/CMakeLists.txt | 2 +- Svc/Deframer/CMakeLists.txt | 26 - Svc/Deframer/Deframer.cpp | 224 +------- Svc/Deframer/Deframer.fpp | 34 +- Svc/Deframer/Deframer.hpp | 130 +---- Svc/Deframer/docs/img/.fpv-env | 1 - Svc/Deframer/docs/img/Deframer.png | Bin 130395 -> 0 bytes Svc/Deframer/docs/img/deframer_example_1.png | Bin 69828 -> 0 bytes Svc/Deframer/docs/img/deframer_example_2.png | Bin 62679 -> 0 bytes Svc/Deframer/docs/img/top/cmd.json | 76 --- Svc/Deframer/docs/img/top/cmd.png | Bin 68425 -> 0 bytes Svc/Deframer/docs/img/top/cmd.txt | 13 - Svc/Deframer/docs/img/top/deframer-file.json | 129 ----- Svc/Deframer/docs/img/top/deframer-file.png | Bin 114776 -> 0 bytes Svc/Deframer/docs/img/top/deframer-file.txt | 28 - Svc/Deframer/docs/img/top/framed-active.json | 109 ---- Svc/Deframer/docs/img/top/framed-active.png | Bin 86197 -> 0 bytes Svc/Deframer/docs/img/top/framed-active.txt | 20 - Svc/Deframer/docs/img/top/framed-passive.json | 83 --- Svc/Deframer/docs/img/top/framed-passive.png | Bin 71933 -> 0 bytes Svc/Deframer/docs/img/top/framed-passive.txt | 13 - Svc/Deframer/docs/img/top/hub-cmd.json | 48 -- Svc/Deframer/docs/img/top/hub-cmd.png | Bin 30668 -> 0 bytes Svc/Deframer/docs/img/top/hub-cmd.txt | 6 - Svc/Deframer/docs/img/top/hub-file.json | 129 ----- Svc/Deframer/docs/img/top/hub-file.png | Bin 109894 -> 0 bytes Svc/Deframer/docs/img/top/hub-file.txt | 28 - Svc/Deframer/docs/sdd.md | 534 ------------------ .../ut-fprime-protocol/DeframerTestMain.cpp | 132 ----- .../ut-fprime-protocol/DeframerTester.cpp | 261 --------- .../ut-fprime-protocol/DeframerTester.hpp | 325 ----------- .../ut-fprime-protocol/GenerateFrames.cpp | 40 -- .../ut-fprime-protocol/GenerateFrames.hpp | 46 -- .../test/ut-fprime-protocol/Printing.hpp | 18 - .../test/ut-fprime-protocol/SendBuffer.cpp | 158 ------ .../test/ut-fprime-protocol/SendBuffer.hpp | 80 --- .../test/ut-fprime-protocol/UplinkFrame.cpp | 259 --------- Svc/Deframer/test/ut/DeframerTestMain.cpp | 107 ---- Svc/Deframer/test/ut/DeframerTester.cpp | 238 -------- Svc/Deframer/test/ut/DeframerTester.hpp | 155 ----- Svc/DeframerFp/CMakeLists.txt | 19 - Svc/DeframerFp/DeframerFp.cpp | 33 -- Svc/DeframerFp/DeframerFp.fpp | 26 - 54 files changed, 484 insertions(+), 3515 deletions(-) create mode 100644 Svc/CCSDSDeframers/CMakeLists.txt create mode 100644 Svc/CCSDSDeframers/SpaceDataLinkDeframer/CMakeLists.txt create mode 100644 Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.cpp create mode 100644 Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.fpp create mode 100644 Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.hpp create mode 100644 Svc/CCSDSDeframers/SpaceDataLinkDeframer/docs/sdd.md create mode 100644 Svc/CCSDSDeframers/SpacePacketDeframer/CMakeLists.txt create mode 100644 Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.cpp create mode 100644 Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.fpp rename Svc/{DeframerFp/DeframerFp.hpp => CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.hpp} (50%) create mode 100644 Svc/CCSDSDeframers/SpacePacketDeframer/docs/sdd.md delete mode 100644 Svc/Deframer/docs/img/.fpv-env delete mode 100644 Svc/Deframer/docs/img/Deframer.png delete mode 100644 Svc/Deframer/docs/img/deframer_example_1.png delete mode 100644 Svc/Deframer/docs/img/deframer_example_2.png delete mode 100644 Svc/Deframer/docs/img/top/cmd.json delete mode 100644 Svc/Deframer/docs/img/top/cmd.png delete mode 100644 Svc/Deframer/docs/img/top/cmd.txt delete mode 100644 Svc/Deframer/docs/img/top/deframer-file.json delete mode 100644 Svc/Deframer/docs/img/top/deframer-file.png delete mode 100644 Svc/Deframer/docs/img/top/deframer-file.txt delete mode 100644 Svc/Deframer/docs/img/top/framed-active.json delete mode 100644 Svc/Deframer/docs/img/top/framed-active.png delete mode 100644 Svc/Deframer/docs/img/top/framed-active.txt delete mode 100644 Svc/Deframer/docs/img/top/framed-passive.json delete mode 100644 Svc/Deframer/docs/img/top/framed-passive.png delete mode 100644 Svc/Deframer/docs/img/top/framed-passive.txt delete mode 100644 Svc/Deframer/docs/img/top/hub-cmd.json delete mode 100644 Svc/Deframer/docs/img/top/hub-cmd.png delete mode 100644 Svc/Deframer/docs/img/top/hub-cmd.txt delete mode 100644 Svc/Deframer/docs/img/top/hub-file.json delete mode 100644 Svc/Deframer/docs/img/top/hub-file.png delete mode 100644 Svc/Deframer/docs/img/top/hub-file.txt delete mode 100644 Svc/Deframer/docs/sdd.md delete mode 100644 Svc/Deframer/test/ut-fprime-protocol/DeframerTestMain.cpp delete mode 100644 Svc/Deframer/test/ut-fprime-protocol/DeframerTester.cpp delete mode 100644 Svc/Deframer/test/ut-fprime-protocol/DeframerTester.hpp delete mode 100644 Svc/Deframer/test/ut-fprime-protocol/GenerateFrames.cpp delete mode 100644 Svc/Deframer/test/ut-fprime-protocol/GenerateFrames.hpp delete mode 100644 Svc/Deframer/test/ut-fprime-protocol/Printing.hpp delete mode 100644 Svc/Deframer/test/ut-fprime-protocol/SendBuffer.cpp delete mode 100644 Svc/Deframer/test/ut-fprime-protocol/SendBuffer.hpp delete mode 100644 Svc/Deframer/test/ut-fprime-protocol/UplinkFrame.cpp delete mode 100644 Svc/Deframer/test/ut/DeframerTestMain.cpp delete mode 100644 Svc/Deframer/test/ut/DeframerTester.cpp delete mode 100644 Svc/Deframer/test/ut/DeframerTester.hpp delete mode 100644 Svc/DeframerFp/CMakeLists.txt delete mode 100644 Svc/DeframerFp/DeframerFp.cpp delete mode 100644 Svc/DeframerFp/DeframerFp.fpp diff --git a/Svc/CCSDSDeframers/CMakeLists.txt b/Svc/CCSDSDeframers/CMakeLists.txt new file mode 100644 index 0000000000..61b0cfc85d --- /dev/null +++ b/Svc/CCSDSDeframers/CMakeLists.txt @@ -0,0 +1,2 @@ +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/SpaceDataLinkDeframer") +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/SpacePacketDeframer") diff --git a/Svc/CCSDSDeframers/SpaceDataLinkDeframer/CMakeLists.txt b/Svc/CCSDSDeframers/SpaceDataLinkDeframer/CMakeLists.txt new file mode 100644 index 0000000000..65b447154c --- /dev/null +++ b/Svc/CCSDSDeframers/SpaceDataLinkDeframer/CMakeLists.txt @@ -0,0 +1,14 @@ +#### +# F prime CMakeLists.txt: +# +# SOURCE_FILES: combined list of source and autocoding files +# MOD_DEPS: (optional) module dependencies +# UT_SOURCE_FILES: list of source files for unit tests +# +#### +set(SOURCE_FILES + "${CMAKE_CURRENT_LIST_DIR}/SpaceDataLinkDeframer.fpp" + "${CMAKE_CURRENT_LIST_DIR}/SpaceDataLinkDeframer.cpp" +) + +register_fprime_module() diff --git a/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.cpp b/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.cpp new file mode 100644 index 0000000000..f9e85e8181 --- /dev/null +++ b/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.cpp @@ -0,0 +1,76 @@ +// ====================================================================== +// \title SpaceDataLinkDeframer.cpp +// \author chammard +// \brief cpp file for SpaceDataLinkDeframer component implementation class +// ====================================================================== + +#include "SpaceDataLinkDeframer.hpp" +#include "FpConfig.hpp" + +namespace Svc { + +// ---------------------------------------------------------------------- +// Component construction and destruction +// ---------------------------------------------------------------------- + +SpaceDataLinkDeframer ::SpaceDataLinkDeframer(const char* const compName) + : SpaceDataLinkDeframerComponentBase(compName) {} + +SpaceDataLinkDeframer ::~SpaceDataLinkDeframer() {} + +// ---------------------------------------------------------------------- +// Handler implementations for user-defined typed input ports +// ---------------------------------------------------------------------- + +void SpaceDataLinkDeframer ::framedIn_handler(FwIndexType portNum, Fw::Buffer& data, Fw::Buffer& context) { + + // CCSDS TC Format: + // 5 octets - TC Primary Header + // Up to 1019 octets - Data Field (including optional 2 octets frame error control field) + + // CCSDS TC Primary Header: + // 2b - 00 - TF Version Number + // 1b - 0/1 - Bypass Flag (0 = FARM checks enabled, 1 = FARM checks bypassed) + // 1b - 0/1 - Control Command Flag (0 = Type-D data, 1 = Type-C data) + // 2b - 00 - Reserved Spare (set to 00) + // 10b- XX - Spacecraft ID + // 6b - XX - Virtual Channel ID + // 10b- XX - Frame Length + // 8b - XX - Frame Sequence Number + + FW_ASSERT(data.getSize() >= SPACE_PACKET_HEADER_SIZE + SPACE_PACKET_TRAILER_SIZE, data.getSize()); + + U8 byte = data.getData()[0]; + + U8 version_number = (byte & 0xC0) >> 6; + U8 bypass = (byte & 0x20) >> 5; + U8 ctrl_cmd = (byte & 0x10) >> 4; + U16 sc_id = ((byte & 0x03) << 8); + + byte = data.getData()[1]; + sc_id |= byte; + + byte = data.getData()[2]; + U8 vch_id = (byte & 0xFC) >> 2; + + + U16 frame_length = (byte & 0x03) << 8; + byte = data.getData()[3]; + frame_length |= byte; + + + byte = data.getData()[4]; + U8 frame_seq_nbr = byte; + + // Set data buffer to be of the encapsulated data: HEADER (5 bytes) | DATA | CHECKSUM (2 bytes) + data.setData(data.getData() + SPACE_PACKET_HEADER_SIZE); + data.setSize(frame_length); // 5 bytes for Header, 2 bytes for Frame Error Control Field + + // Set context buffer to be frame_length so the next layer knows how much data + // context.setData(); + + this->deframedOut_out(0, data, context); + +} + +} // namespace Svc diff --git a/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.fpp b/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.fpp new file mode 100644 index 0000000000..de755b3d56 --- /dev/null +++ b/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.fpp @@ -0,0 +1,29 @@ +module Svc { + @ Deframer for the TC Space Data Link Protocl (CCSDS Standard) + passive component SpaceDataLinkDeframer { + + include "../../Interfaces/DeframerInterface.fppi" + + ############################################################################### + # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # + ############################################################################### + @ Port for requesting the current time + time get port timeCaller + + @ Port for sending textual representation of events + text event port logTextOut + + @ Port for sending events to downlink + event port logOut + + @ Port for sending telemetry channels to downlink + telemetry port tlmOut + + @ Port to return the value of a parameter + param get port prmGetOut + + @Port to set the value of a parameter + param set port prmSetOut + + } +} \ No newline at end of file diff --git a/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.hpp b/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.hpp new file mode 100644 index 0000000000..2676988090 --- /dev/null +++ b/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.hpp @@ -0,0 +1,45 @@ +// ====================================================================== +// \title SpaceDataLinkDeframer.hpp +// \author chammard +// \brief hpp file for SpaceDataLinkDeframer component implementation class +// ====================================================================== + +#ifndef Svc_SpaceDataLinkDeframer_HPP +#define Svc_SpaceDataLinkDeframer_HPP + +#include "Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframerComponentAc.hpp" + +namespace Svc { + +class SpaceDataLinkDeframer : public SpaceDataLinkDeframerComponentBase { + + static const U8 SPACE_PACKET_HEADER_SIZE = 5; + static const U8 SPACE_PACKET_TRAILER_SIZE = 2; + public: + // ---------------------------------------------------------------------- + // Component construction and destruction + // ---------------------------------------------------------------------- + + //! Construct SpaceDataLinkDeframer object + SpaceDataLinkDeframer(const char* const compName //!< The component name + ); + + //! Destroy SpaceDataLinkDeframer object + ~SpaceDataLinkDeframer(); + + PRIVATE: + // ---------------------------------------------------------------------- + // Handler implementations for user-defined typed input ports + // ---------------------------------------------------------------------- + + //! Handler implementation for framedIn + //! + //! Port to receive framed data + void framedIn_handler(FwIndexType portNum, //!< The port number + Fw::Buffer& data, + Fw::Buffer& context) override; +}; + +} // namespace Svc + +#endif diff --git a/Svc/CCSDSDeframers/SpaceDataLinkDeframer/docs/sdd.md b/Svc/CCSDSDeframers/SpaceDataLinkDeframer/docs/sdd.md new file mode 100644 index 0000000000..fe31a32c8c --- /dev/null +++ b/Svc/CCSDSDeframers/SpaceDataLinkDeframer/docs/sdd.md @@ -0,0 +1,66 @@ +# Svc::SpaceDataLinkDeframer + +Deframer for the TC Space Data Link Protocl (CCSDS Standard) + +## Usage Examples +Add usage examples here + +### Diagrams +Add diagrams here + +### Typical Usage +And the typical usage of the component here + +## Class Diagram +Add a class diagram here + +## Port Descriptions +| Name | Description | +|---|---| +|---|---| + +## Component States +Add component states in the chart below +| Name | Description | +|---|---| +|---|---| + +## Sequence Diagrams +Add sequence diagrams here + +## Parameters +| Name | Description | +|---|---| +|---|---| + +## Commands +| Name | Description | +|---|---| +|---|---| + +## Events +| Name | Description | +|---|---| +|---|---| + +## Telemetry +| Name | Description | +|---|---| +|---|---| + +## Unit Tests +Add unit test descriptions in the chart below +| Name | Description | Output | Coverage | +|---|---|---|---| +|---|---|---|---| + +## Requirements +Add requirements in the chart below +| Name | Description | Validation | +|---|---|---| +|---|---|---| + +## Change Log +| Date | Description | +|---|---| +|---| Initial Draft | \ No newline at end of file diff --git a/Svc/CCSDSDeframers/SpacePacketDeframer/CMakeLists.txt b/Svc/CCSDSDeframers/SpacePacketDeframer/CMakeLists.txt new file mode 100644 index 0000000000..d22939ecc6 --- /dev/null +++ b/Svc/CCSDSDeframers/SpacePacketDeframer/CMakeLists.txt @@ -0,0 +1,21 @@ +#### +# F prime CMakeLists.txt: +# +# SOURCE_FILES: combined list of source and autocoding files +# MOD_DEPS: (optional) module dependencies +# UT_SOURCE_FILES: list of source files for unit tests +# +#### +set(SOURCE_FILES + "${CMAKE_CURRENT_LIST_DIR}/SpacePacketDeframer.fpp" + "${CMAKE_CURRENT_LIST_DIR}/SpacePacketDeframer.cpp" +) + +# Uncomment and add any modules that this component depends on, else +# they might not be available when cmake tries to build this component. + +# set(MOD_DEPS +# Add your dependencies here +# ) + +register_fprime_module() diff --git a/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.cpp b/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.cpp new file mode 100644 index 0000000000..97b5b2d047 --- /dev/null +++ b/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.cpp @@ -0,0 +1,81 @@ +// ====================================================================== +// \title SpacePacketDeframer.cpp +// \author chammard +// \brief cpp file for SpacePacketDeframer component implementation class +// ====================================================================== + +#include "SpacePacketDeframer.hpp" +#include "FpConfig.hpp" + +namespace Svc { + +// ---------------------------------------------------------------------- +// Component construction and destruction +// ---------------------------------------------------------------------- + +SpacePacketDeframer ::SpacePacketDeframer(const char* const compName) + : SpacePacketDeframerComponentBase(compName) {} + +SpacePacketDeframer ::~SpacePacketDeframer() {} + +// ---------------------------------------------------------------------- +// Handler implementations for user-defined typed input ports +// ---------------------------------------------------------------------- + +void SpacePacketDeframer ::framedIn_handler(FwIndexType portNum, Fw::Buffer& data, Fw::Buffer& context) { + // ################################ + // CCSDS SpacePacket Format: + // 6 octets - Primary Header + // 0-65536 octets - Data Field (with optional secondary header) + + // CCSDS SpacePacket Primary Header: + // 3b - 000 - (PVN) Packet Version Number + // 1b - 0/1 - (PT) Packet Type + // 1b - 0/1 - (SHF) Secondary Header Flag + // 11b - n/a - (APID) Application Process ID + // 2b - 00 - Sequence Flag + // 14b - n/a - Sequence Count + // 16b - n/a - Packet Data Length + // ################################ + + FW_ASSERT(data.getSize() >= 6, data.getSize()); + + // Read first byte from ring + U8 byte = data.getData()[0]; + // Unpack Packet Version Number (PVN) + U8 pvn = (byte & 0xE0) >> 5; + // Unpack Packet Type (PT) + U8 pt = (byte & 0x10) >> 4; + // Unpack Secondary Header Flag (SHF) + U8 shf = (byte & 0x08) >> 3; + + // Unpack APID + U16 apid = ((byte & 0x07) << 8); + byte = data.getData()[1]; + apid |= byte; + + // Sequence flag + byte = data.getData()[2]; + U8 seq_flag = (byte & 0xC0) >> 6; + + // Sequence count + U16 seq_count = (byte & 0x3F) << 8; + byte = data.getData()[3]; + seq_count |= byte; + + // Packet length + byte = data.getData()[4]; + U16 pkt_length = byte << 8; + byte = data.getData()[5]; + pkt_length |= byte; + + + // Set data buffer to be of the encapsulated data: HEADER (6 bytes) | PACKET DATA + data.setData(data.getData() + SPACE_PACKET_HEADER_SIZE); + data.setSize(pkt_length); // TODO: look into whether a spacePacket can span multiple frames + + this->deframedOut_out(0, data, context); + +} + +} // namespace Svc diff --git a/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.fpp b/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.fpp new file mode 100644 index 0000000000..d86e76ddf5 --- /dev/null +++ b/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.fpp @@ -0,0 +1,29 @@ +module Svc { + @ Deframer for the TC Space Data Link Protocl (CCSDS Standard) + passive component SpacePacketDeframer { + + include "../../Interfaces/DeframerInterface.fppi" + + ############################################################################### + # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # + ############################################################################### + @ Port for requesting the current time + time get port timeCaller + + @ Port for sending textual representation of events + text event port logTextOut + + @ Port for sending events to downlink + event port logOut + + @ Port for sending telemetry channels to downlink + telemetry port tlmOut + + @ Port to return the value of a parameter + param get port prmGetOut + + @Port to set the value of a parameter + param set port prmSetOut + + } +} \ No newline at end of file diff --git a/Svc/DeframerFp/DeframerFp.hpp b/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.hpp similarity index 50% rename from Svc/DeframerFp/DeframerFp.hpp rename to Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.hpp index 507b05cee9..d0af143bfb 100644 --- a/Svc/DeframerFp/DeframerFp.hpp +++ b/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.hpp @@ -1,51 +1,43 @@ // ====================================================================== -// \title DeframerFp.hpp +// \title SpacePacketDeframer.hpp // \author chammard -// \brief hpp file for DeframerFp component implementation class +// \brief hpp file for SpacePacketDeframer component implementation class // ====================================================================== -#ifndef Svc_DeframerFp_HPP -#define Svc_DeframerFp_HPP +#ifndef Svc_SpacePacketDeframer_HPP +#define Svc_SpacePacketDeframer_HPP -#include "Svc/DeframerFp/DeframerFpComponentAc.hpp" -#include "Utils/Hash/Hash.hpp" +#include "Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframerComponentAc.hpp" namespace Svc { - -namespace FrameConfig { - //! Token type for F Prime frame header - typedef U32 TokenType; - static const U8 HEADER_SIZE = sizeof(TokenType) * 2; - static const U32 CHECKSUM_SIZE = HASH_DIGEST_LENGTH; -} - -class DeframerFp : public DeframerFpComponentBase { - - +class SpacePacketDeframer : public SpacePacketDeframerComponentBase { + + static const U8 SPACE_PACKET_HEADER_SIZE = 6; + public: // ---------------------------------------------------------------------- // Component construction and destruction // ---------------------------------------------------------------------- - //! Construct DeframerFp object - DeframerFp(const char* const compName //!< The component name + //! Construct SpacePacketDeframer object + SpacePacketDeframer(const char* const compName //!< The component name ); - //! Destroy DeframerFp object - ~DeframerFp(); + //! Destroy SpacePacketDeframer object + ~SpacePacketDeframer(); PRIVATE: // ---------------------------------------------------------------------- // Handler implementations for user-defined typed input ports // ---------------------------------------------------------------------- - //! Handler implementation for frame + //! Handler implementation for framedIn //! //! Port to receive framed data void framedIn_handler(FwIndexType portNum, //!< The port number - Fw::Buffer& data, - Fw::Buffer& context) override; + Fw::Buffer& data, + Fw::Buffer& context) override; }; } // namespace Svc diff --git a/Svc/CCSDSDeframers/SpacePacketDeframer/docs/sdd.md b/Svc/CCSDSDeframers/SpacePacketDeframer/docs/sdd.md new file mode 100644 index 0000000000..222ddf1e20 --- /dev/null +++ b/Svc/CCSDSDeframers/SpacePacketDeframer/docs/sdd.md @@ -0,0 +1,66 @@ +# Svc::SpacePacketDeframer + +Deframer for the Space Packet Protocl (CCSDS Standard). This unpacks Space Packets and extracts F Prime packets to hand to the F Prime Packet Router. + +## Usage Examples +Add usage examples here + +### Diagrams +Add diagrams here + +### Typical Usage +And the typical usage of the component here + +## Class Diagram +Add a class diagram here + +## Port Descriptions +| Name | Description | +|---|---| +|---|---| + +## Component States +Add component states in the chart below +| Name | Description | +|---|---| +|---|---| + +## Sequence Diagrams +Add sequence diagrams here + +## Parameters +| Name | Description | +|---|---| +|---|---| + +## Commands +| Name | Description | +|---|---| +|---|---| + +## Events +| Name | Description | +|---|---| +|---|---| + +## Telemetry +| Name | Description | +|---|---| +|---|---| + +## Unit Tests +Add unit test descriptions in the chart below +| Name | Description | Output | Coverage | +|---|---|---|---| +|---|---|---|---| + +## Requirements +Add requirements in the chart below +| Name | Description | Validation | +|---|---|---| +|---|---|---| + +## Change Log +| Date | Description | +|---|---| +|---| Initial Draft | \ No newline at end of file diff --git a/Svc/CMakeLists.txt b/Svc/CMakeLists.txt index 93f81149f5..7c4cb1a8be 100644 --- a/Svc/CMakeLists.txt +++ b/Svc/CMakeLists.txt @@ -17,6 +17,7 @@ add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/BufferAccumulator/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/BufferManager/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/BufferLogger/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/BufferRepeater/") +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/CCSDSDeframers/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/ComLogger/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/ComQueue/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/ComSplitter/") @@ -25,7 +26,6 @@ add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/CmdDispatcher/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/CmdSequencer/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/CmdSplitter/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Deframer/") -add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/DeframerFp/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/DpCatalog/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/DpManager/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/DpPorts/") diff --git a/Svc/Deframer/CMakeLists.txt b/Svc/Deframer/CMakeLists.txt index 6df9e8c344..771be8b995 100644 --- a/Svc/Deframer/CMakeLists.txt +++ b/Svc/Deframer/CMakeLists.txt @@ -17,29 +17,3 @@ set(MOD_DEPS ) register_fprime_module() - -#### UTS ### - -# These tests verify the Deframer component against a mock -# deframing protocol -set(UT_SOURCE_FILES - "${CMAKE_CURRENT_LIST_DIR}/Deframer.fpp" - "${CMAKE_CURRENT_LIST_DIR}/test/ut/DeframerTester.cpp" - "${CMAKE_CURRENT_LIST_DIR}/test/ut/DeframerTestMain.cpp" -) -register_fprime_ut() - -# These tests verify the Deframer component against the -# F Prime deframing protocol located at Svc/FramingProtocol. -# They also verify the deframing part of the F Prime protocol -# implementation. -set(UT_SOURCE_FILES - "${CMAKE_CURRENT_LIST_DIR}/Deframer.fpp" - "${CMAKE_CURRENT_LIST_DIR}/test/ut-fprime-protocol/GenerateFrames.cpp" - "${CMAKE_CURRENT_LIST_DIR}/test/ut-fprime-protocol/SendBuffer.cpp" - "${CMAKE_CURRENT_LIST_DIR}/test/ut-fprime-protocol/DeframerTester.cpp" - "${CMAKE_CURRENT_LIST_DIR}/test/ut-fprime-protocol/DeframerTestMain.cpp" - "${CMAKE_CURRENT_LIST_DIR}/test/ut-fprime-protocol/UplinkFrame.cpp" -) -set(UT_MOD_DEPS STest) -register_fprime_ut(Svc_Deframer_fprime_protocol) diff --git a/Svc/Deframer/Deframer.cpp b/Svc/Deframer/Deframer.cpp index 954d4deb11..bce452194a 100644 --- a/Svc/Deframer/Deframer.cpp +++ b/Svc/Deframer/Deframer.cpp @@ -1,237 +1,33 @@ // ====================================================================== // \title Deframer.cpp -// \author mstarch, bocchino +// \author chammard // \brief cpp file for Deframer component implementation class -// -// \copyright -// Copyright 2009-2022, by the California Institute of Technology. -// ALL RIGHTS RESERVED. United States Government Sponsorship -// acknowledged. -// // ====================================================================== -#include - -#include "Fw/Logger/Logger.hpp" -#include #include "Svc/Deframer/Deframer.hpp" +#include "FpConfig.hpp" namespace Svc { // ---------------------------------------------------------------------- -// Static assertions +// Component construction and destruction // ---------------------------------------------------------------------- -static_assert( - DeframerCfg::POLL_BUFFER_SIZE > 0, - "poll buffer size must be greater than zero" -); -static_assert( - DeframerCfg::RING_BUFFER_SIZE > 0, - "ring buffer size must be greater than zero" -); - -// ---------------------------------------------------------------------- -// Construction, initialization, and destruction -// ---------------------------------------------------------------------- - -Deframer ::Deframer(const char* const compName) : - DeframerComponentBase(compName), - DeframingProtocolInterface(), - m_protocol(nullptr), - m_inRing(m_ringBuffer, sizeof m_ringBuffer) -{ - (void) memset(m_pollBuffer, 0, sizeof m_pollBuffer); -} - -void Deframer ::init(const NATIVE_INT_TYPE instance) { - DeframerComponentBase::init(instance); -} +Deframer ::Deframer(const char* const compName) : DeframerComponentBase(compName) {} Deframer ::~Deframer() {} -void Deframer ::setup(DeframingProtocol& protocol) { - // Check that this is the first time we are calling setup - FW_ASSERT(m_protocol == nullptr); - // Assign the protocol passed in to m_protocol - m_protocol = &protocol; - // Pass *this as the DeframingProtocolInstance to protocol setup - // Deframer is derived from and implements DeframingProtocolInterface - protocol.setup(*this); -} - // ---------------------------------------------------------------------- // Handler implementations for user-defined typed input ports // ---------------------------------------------------------------------- -void Deframer ::framedIn_handler( - const NATIVE_INT_TYPE portNum, - Fw::Buffer& recvBuffer, - const Drv::RecvStatus& recvStatus -) { - // Check whether there is data to process - if (recvStatus.e == Drv::RecvStatus::RECV_OK) { - // There is: process the data - processBuffer(recvBuffer); - } - // Deallocate the buffer - framedDeallocate_out(0, recvBuffer); -} - -void Deframer ::schedIn_handler( - const NATIVE_INT_TYPE portNum, - U32 context -) { - // Check for data - Fw::Buffer buffer(m_pollBuffer, sizeof(m_pollBuffer)); - const Drv::PollStatus status = framedPoll_out(0, buffer); - if (status.e == Drv::PollStatus::POLL_OK) { - // Data exists: process it - processBuffer(buffer); - } -} - -// ---------------------------------------------------------------------- -// Implementation of DeframingProtocolInterface -// ---------------------------------------------------------------------- - -Fw::Buffer Deframer ::allocate(const U32 size) { - return bufferAllocate_out(0, size); -} - -void Deframer ::route(Fw::Buffer& packetBuffer) { - // Send the buffer out - bufferOut_out(0, packetBuffer); -} - -// ---------------------------------------------------------------------- -// Helper methods -// ---------------------------------------------------------------------- - -void Deframer ::processBuffer(Fw::Buffer& buffer) { - - const U32 bufferSize = buffer.getSize(); - U8 *const bufferData = buffer.getData(); - // Current offset into buffer - U32 offset = 0; - // Remaining data in buffer - U32 remaining = bufferSize; - - for (U32 i = 0; i < bufferSize; ++i) { - // If there is no data left, exit the loop - if (remaining == 0) { - break; - } - // Compute the size of data to serialize - const NATIVE_UINT_TYPE ringFreeSize = m_inRing.get_free_size(); - const NATIVE_UINT_TYPE serSize = (ringFreeSize <= remaining) ? - ringFreeSize : static_cast(remaining); - // Serialize data into the ring buffer - const Fw::SerializeStatus status = - m_inRing.serialize(&bufferData[offset], serSize); - // If data does not fit, there is a coding error - FW_ASSERT( - status == Fw::FW_SERIALIZE_OK, - static_cast(status), - static_cast(offset), - static_cast(serSize)); - // Process the data - processRing(); - // Update buffer offset and remaining - offset += serSize; - remaining -= serSize; - } - - // In every iteration, either remaining == 0 and we break out - // of the loop, or we consume at least one byte from the buffer. - // So there should be no data left in the buffer. - FW_ASSERT(remaining == 0, static_cast(remaining)); - -} - -void Deframer ::processRing() { - - FW_ASSERT(m_protocol != nullptr); - - // The number of remaining bytes in the ring buffer - U32 remaining = 0; - // The protocol status - DeframingProtocol::DeframingStatus status = - DeframingProtocol::DEFRAMING_STATUS_SUCCESS; - // The ring buffer capacity - const NATIVE_UINT_TYPE ringCapacity = m_inRing.get_capacity(); - - // Process the ring buffer looking for at least the header - for (U32 i = 0; i < ringCapacity; i++) { - // Get the number of bytes remaining in the ring buffer - remaining = m_inRing.get_allocated_size(); - // If there are none, we are done - if (remaining == 0) { - break; - } - // Needed is an out-only variable - // Initialize it to zero - U32 needed = 0; - // Call the deframe method of the protocol, getting - // needed and status - status = m_protocol->deframe(m_inRing, needed); - // Deframing protocol must not consume data in the ring buffer - FW_ASSERT( - m_inRing.get_allocated_size() == remaining, - static_cast(m_inRing.get_allocated_size()), - static_cast(remaining) - ); - // On successful deframing, consume data from the ring buffer now - if (status == DeframingProtocol::DEFRAMING_STATUS_SUCCESS) { - // If deframing succeeded, protocol should set needed - // to a non-zero value - FW_ASSERT(needed != 0); - FW_ASSERT( - needed <= remaining, - static_cast(needed), - static_cast(remaining)); - m_inRing.rotate(needed); - FW_ASSERT( - m_inRing.get_allocated_size() == remaining - needed, - static_cast(m_inRing.get_allocated_size()), - static_cast(remaining), - static_cast(needed) - ); - } - // More data needed - else if (status == DeframingProtocol::DEFRAMING_MORE_NEEDED) { - // Deframing protocol should not report "more is needed" - // unless more is needed - FW_ASSERT( - needed > remaining, - static_cast(needed), - static_cast(remaining)); - // Break out of loop: suspend deframing until we receive - // another buffer - break; - } - // Error occurred - else { - // Skip one byte of bad data - m_inRing.rotate(1); - FW_ASSERT( - m_inRing.get_allocated_size() == remaining - 1, - static_cast(m_inRing.get_allocated_size()), - static_cast(remaining) - ); - // Log checksum errors - // This is likely a real error, not an artifact of other data corruption - if (status == DeframingProtocol::DEFRAMING_INVALID_CHECKSUM) { - Fw::Logger::logMsg("[ERROR] Deframing checksum validation failed\n"); - } - } - } +void Deframer ::framedIn_handler(FwIndexType portNum, Fw::Buffer& data, Fw::Buffer& context) { - // If more not needed, circular buffer should be empty - if (status != DeframingProtocol::DEFRAMING_MORE_NEEDED) { - FW_ASSERT(remaining == 0, static_cast(remaining)); - } + // TODO: add asserts? + data.setData(data.getData() + FrameConfig::HEADER_SIZE); + data.setSize(data.getSize() - FrameConfig::HEADER_SIZE - FrameConfig::CHECKSUM_SIZE); + this->deframedOut_out(0, data, context); } -} // end namespace Svc +} // namespace Svc diff --git a/Svc/Deframer/Deframer.fpp b/Svc/Deframer/Deframer.fpp index 2c26b4a310..d82b7bd04b 100644 --- a/Svc/Deframer/Deframer.fpp +++ b/Svc/Deframer/Deframer.fpp @@ -5,30 +5,10 @@ module Svc { passive component Deframer { # ---------------------------------------------------------------------- - # Receiving framed data via push + # Deframer interface # ---------------------------------------------------------------------- - @ Port for receiving frame buffers FB pushed from the byte stream driver. - @ After using a buffer FB received on this port, Deframer deallocates it - @ by invoking framedDeallocate. - guarded input port framedIn: Drv.ByteStreamRecv - - @ Port for deallocating buffers received on framedIn. - output port framedDeallocate: Fw.BufferSend - - # ---------------------------------------------------------------------- - # Receiving framed data via poll - # ---------------------------------------------------------------------- - - @ Schedule in port, driven by a rate group. - guarded input port schedIn: Svc.Sched - - @ Port that polls for data from the byte stream driver. - @ Deframer invokes this port on its schedIn cycle, if it is connected. - @ No allocation or occurs when invoking this port. - @ The data transfer uses a pre-allocated frame buffer - @ owned by Deframer. - output port framedPoll: Drv.ByteStreamPoll + include "../Interfaces/DeframerInterface.fppi" # ---------------------------------------------------------------------- # Memory management for deframing @@ -39,14 +19,8 @@ module Svc { @ takes ownership of it. Ownership is then delegated to the Router output port bufferAllocate: Fw.BufferGet - # ---------------------------------------------------------------------- - # Sending packets to Router or subsequent Deframer - # ---------------------------------------------------------------------- - - @ Port for sending deframed buffers out to a router, or another deframer - @ for chained deframing - output port bufferOut: Fw.BufferSend - + @ Port for deallocating buffers received on dataIn. + output port bufferDeallocate: Fw.BufferSend } } diff --git a/Svc/Deframer/Deframer.hpp b/Svc/Deframer/Deframer.hpp index 5743e24dcd..93d0ffc7b9 100644 --- a/Svc/Deframer/Deframer.hpp +++ b/Svc/Deframer/Deframer.hpp @@ -1,135 +1,53 @@ // ====================================================================== // \title Deframer.hpp -// \author mstarch, bocchino +// \author chammard // \brief hpp file for Deframer component implementation class -// -// \copyright -// Copyright 2009-2022, by the California Institute of Technology. -// ALL RIGHTS RESERVED. United States Government Sponsorship -// acknowledged. -// // ====================================================================== #ifndef Svc_Deframer_HPP #define Svc_Deframer_HPP -#include - #include "Svc/Deframer/DeframerComponentAc.hpp" -#include "Svc/FramingProtocol/DeframingProtocol.hpp" -#include "Svc/FramingProtocol/DeframingProtocolInterface.hpp" -#include "Utils/Types/CircularBuffer.hpp" +#include "Utils/Hash/Hash.hpp" namespace Svc { -/** - * \brief Generic deframing component using DeframingProtocol implementation for actual deframing - * - * Deframing component used to take byte streams and expand them into Com/File buffers. This is - * done using a deframing protocol specified in a DeframingProtocol instance. The instance must be - * supplied using the `setup` method. - * - * Using this component, projects can implement and supply a fresh DeframingProtocol implementation - * without changing the reference topology. - * - * Implementation uses a circular buffer to store incoming data, which is drained one framed packet - * at a time into buffers dispatched to the rest of the system. - */ -class Deframer : - public DeframerComponentBase, - public DeframingProtocolInterface -{ - public: - - // ---------------------------------------------------------------------- - // Construction, initialization, and destruction - // ---------------------------------------------------------------------- - - //! Construct Deframer instance - Deframer( - const char* const compName //!< The component name - ); - - //! Initialize Deframer instance - void init( - const NATIVE_INT_TYPE instance = 0 //!< The instance number - ); - - //! Destroy Deframer instance - ~Deframer(); - //! Set up the instance - void setup( - DeframingProtocol& protocol //!< Deframing protocol instance - ); +namespace FrameConfig { + //! Token type for F Prime frame header + typedef U32 TokenType; + static const U8 HEADER_SIZE = sizeof(TokenType) * 2; + static const U32 CHECKSUM_SIZE = HASH_DIGEST_LENGTH; +} - PRIVATE: +class Deframer : public DeframerComponentBase { - // ---------------------------------------------------------------------- - // Handler implementations for user-defined typed input ports - // ---------------------------------------------------------------------- - - //! Handler implementation for framedIn - void framedIn_handler( - const NATIVE_INT_TYPE portNum, //!< The port number - Fw::Buffer& recvBuffer, //!< Buffer containing framed data - const Drv::RecvStatus& recvStatus //!< Status of the bytes - ); - - //! Handler implementation for schedIn - void schedIn_handler( - const NATIVE_INT_TYPE portNum, //!< The port number - U32 context //!< The call order - ); - - // ---------------------------------------------------------------------- - // Implementation of DeframingProtocolInterface - // ---------------------------------------------------------------------- - - //! The implementation of DeframingProtocolInterface::route - //! Send a data packet - void route( - Fw::Buffer& packetBuffer //!< The packet buffer - ); - - //! The implementation of DeframingProtocolInterface::allocate - //! Allocate a packet buffer - //! \return The packet buffer - Fw::Buffer allocate( - const U32 size //!< The number of bytes to request - ); + public: // ---------------------------------------------------------------------- - // Helper methods + // Component construction and destruction // ---------------------------------------------------------------------- - //! Copy data from an incoming frame buffer into the internal - //! circular buffer - void processBuffer( - Fw::Buffer& buffer //!< The frame buffer + //! Construct Deframer object + Deframer(const char* const compName //!< The component name ); - //! Process data in the circular buffer - void processRing(); + //! Destroy Deframer object + ~Deframer(); + PRIVATE: // ---------------------------------------------------------------------- - // Member variables + // Handler implementations for user-defined typed input ports // ---------------------------------------------------------------------- - //! The DeframingProtocol implementation - DeframingProtocol* m_protocol; - - //! The circular buffer - Types::CircularBuffer m_inRing; - - //! Memory for the circular buffer - U8 m_ringBuffer[DeframerCfg::RING_BUFFER_SIZE]; - - //! Memory for the polling buffer - U8 m_pollBuffer[DeframerCfg::POLL_BUFFER_SIZE]; - + //! Handler implementation for frame + //! + //! Port to receive framed data + void framedIn_handler(FwIndexType portNum, //!< The port number + Fw::Buffer& data, + Fw::Buffer& context) override; }; -} // end namespace Svc +} // namespace Svc #endif diff --git a/Svc/Deframer/docs/img/.fpv-env b/Svc/Deframer/docs/img/.fpv-env deleted file mode 100644 index ff60caacf4..0000000000 --- a/Svc/Deframer/docs/img/.fpv-env +++ /dev/null @@ -1 +0,0 @@ -DATA_FOLDER=top/ diff --git a/Svc/Deframer/docs/img/Deframer.png b/Svc/Deframer/docs/img/Deframer.png deleted file mode 100644 index b6d54cdc326326ffa735d1d8b68f600bb1d160c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130395 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�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 O=G$#%ZOYu?8u1?-p?VJh diff --git a/Svc/Deframer/docs/img/deframer_example_1.png b/Svc/Deframer/docs/img/deframer_example_1.png deleted file mode 100644 index 30a83a48632e087e3681312da50289198699c2b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69828 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 II;Vst05o9uW&i*H diff --git a/Svc/Deframer/docs/img/top/deframer-file.txt b/Svc/Deframer/docs/img/top/deframer-file.txt deleted file mode 100644 index 40f6369e00..0000000000 --- a/Svc/Deframer/docs/img/top/deframer-file.txt +++ /dev/null @@ -1,28 +0,0 @@ -deframer -bufferOut -0 -fileUplink -bufferSendIn -0 - -fileUplink -bufferSendOut -0 -buffMgr -bufferSendIn -0 - -deframer -bufferAllocate -0 -buffMgr -bufferGetCallee -0 - -deframer -bufferDeallocate -0 -buffMgr -bufferSendIn -0 - diff --git a/Svc/Deframer/docs/img/top/framed-active.json b/Svc/Deframer/docs/img/top/framed-active.json deleted file mode 100644 index 965f9cc8d5..0000000000 --- a/Svc/Deframer/docs/img/top/framed-active.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "columns" : [ - [ - { - "instanceName" : "activeComm", - "inputPorts" : [], - "outputPorts" : [ - { - "name" : "recv", - "portNumbers" : [ - 0 - ] - }, - { - "name" : "allocate", - "portNumbers" : [ - 0 - ] - } - ] - } - ], - [ - { - "instanceName" : "deframer", - "inputPorts" : [ - { - "name" : "framedIn", - "portNumbers" : [ - 0 - ] - } - ], - "outputPorts" : [ - { - "name" : "framedDeallocate", - "portNumbers" : [ - 0 - ] - } - ] - } - ], - [ - { - "instanceName" : "buffMgr", - "inputPorts" : [ - { - "name" : "bufferSendIn", - "portNumbers" : [ - 0 - ] - }, - { - "name" : "bufferGetCallee", - "portNumbers" : [ - 0 - ] - } - ], - "outputPorts" : [] - } - ] - ], - "connections" : [ - [ - [ - 0, - 0, - 1, - 0 - ], - [ - 2, - 0, - 1, - 0 - ] - ], - [ - [ - 0, - 0, - 0, - 0 - ], - [ - 1, - 0, - 0, - 0 - ] - ], - [ - [ - 1, - 0, - 0, - 0 - ], - [ - 2, - 0, - 0, - 0 - ] - ] - ] -} diff --git a/Svc/Deframer/docs/img/top/framed-active.png b/Svc/Deframer/docs/img/top/framed-active.png deleted file mode 100644 index d941a7717476a9944255c78604b5c3093bd55aaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86197 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 z zy|yy~!b>Xn@km;Q@(5^u%2G|sMN3|e*TmkI$;i~+*o?`;)&brQ0>1|@aBFMkVnpg; zYh&lk>mfk?P=Xh@hd*W}Cw(a5Vl6cFzAy3z#4?{0%cJ6ASZy zw+&R~hdk!Xk4Jk8D2YT{P$*aF}6Gr`*Hk@e8Zr$UmlcHkJF9&==Ktv_|f1ga>e_ECdUgmlGZnzQQ=@DR6A4Dv<~wB_x#`_K;pW5_HU2^UgY%) z(z>r?9++SLy-5Oue)sQ<0rfwG{$GUp5262cNB(C=|1a_LAJOr@#Ls_3$A3h}|Jo4$ zzlo0brVbRXKSn*H;g`PS<`3$kCrIJq!`h6m?y;du15^>u9#<*#wyVEAII5p4IXCJ}~_ zBEeUOUnr&4muzJeD|jH|ShCeoD$BK|R##C`QH8rs0VqT2hIoaH ztf8hec`qoH?kJ@!U9f&7X!F;CFqQd{*ErXMXDc{q!S5SI;hHWcw0q=5q(8rlIvAU{ z989gy-xFT>J2r3j$PuS_oJQ&CmoMHGRg_@Hw|DDP{_Ubzc5CK4r~Qu4AB?o4WyvU4 zS63}_-9}fps;eo^-JPSu=76kTRaXmwp_H20zSYSs!|!tIVgbNHnT7~E&af2W3;mY7 zs>=e8<1?Ho)gcmi_Yf8wa`g5EKdhxNHF85^1Gp)}QPQe-Wi|42saDrnKO%}pLF;zA z5PR>)Pl{SG!Gr?7_3MP|rdUBX_|D))9i|>UXQ60{)K?6Ae?pQ`;&B_cELX>oR&rDxOo=4phBf z{QCW(A5HDBu8iz~&9F5e$rp28QCg*Eho-lIvEzne8>sfJ)H^bY@!74cv-SSmo zr!Qx}1$}8&eHY_msdo>FKb3^r&vn_twF$4St!>J18f)izy&G?(>tf03LA|M0WDgro z2MHIKgwG^iKB<)!sr!pSXWKsuz=Y;fRjo4^W};E;o~KSCxQtU&UGL(l_Y|lWeU7LT z?ASStwqnp@+B(HrZ2V2Rjd?dY0!RFzQ}jpbvlg~CReb_{phH)WPkO7-l(syC^R%>Y zE5623&lMBeRrEf6S>%(rPE}x5uko;{#nJNT6RDN4Y!|W9f_HcJ-jAOk_nq0FhT>5jCUvyobyvDjx!5;xoamSSVWg#HMrLPoeh zHNPSKz*SD)MF7fMQRvG3`k||~mm|%Qu`uZL3L~MM`h7zaxs*!H{4={to9$m{u{Ikg z6PzY9ec4r1Q(+Iw_DM0*u3T&}qd-V|+q#W4tWOFNpzZs-Pm}SJo!d>-wO$q`HoRC} zUJv_`G@1jE5#ziDdY-U19qEpv-NJ26;EyAM;Ae_@nP}2EeGHHdAc0&rhjZLtj;#B6 zoT_^(GEv(eP$*qL^)2D5bFW6C>AFQsJ5WEbj&6+8 zj2;cJAS`Q$o}M~}pumMozo@yR@>Q^Ow?CN>3g+K!Crpi0rDtL-mfC!NYp?4(sJ(k| z(AR0{AP1Ke&k-f4aySPWZWx=^61-a1({3uSUg`j=GJ_Z0uft?_NM854QDeRau&-wS5EVDUP1vg zUMR0qwtW4whn2HHY?xB^z0M}OSYL^;J?vdvm&Z~da19tpg21jGcqd_Hx& zzEGlthN}wL(bI?N`JsJN4?iipWaM<7p-%%5;*&u{;T-krxnI^?&Ga1xM0@r7&YOC2 zrpNH7#C}TJ;PoVIg5k8vKXQMaWqcjK;CFeq20c&sn#?*zh`Aq2^%pEl8cBySwwyjn zZu;=Gz=f6Y?--=Dc9pFASyBKlZj<_o8!9v zL*swwMpO*V=hA#f6##+IpXbtjO3rN!U;3xW=wD>_8s-ja=)RQJ{u!-!%P*#Y2B!*w zU&iw-8~a+-kc$}&$i>v}NnUo8!4YLA`Z`vtlX2{M{CBRPVDA5Nv1cfhR6Xb2nl7D- zcpTq)DSUn>0u0KSNl8U;KKHGjvFw2l%Z6tA_Fqn8;YMsU@NSE=_3hCi+(FsI@O%aD z@)04AgeBm!=@dJ5 zCd|L%rA3sl=Ewj~`$a&cW>UQ$W=@W(CYNaHY^P^F_LA{S8CT<9BO@Ay80Y1d*!>2n z+qt!*UKF4nuitkDjRy($+@uF(?>1saLgM_m0lP$S{KXip*V^B*~l zfcWuzBF|>nnptOJQQzTVSkGd9#&|8_(BH;AV<5?PU$cFf0(L0mQ+$Asw?(V%b#H4A zl$<=pQvsQ4(&y|Q=f^&mv4*jK%mYdwB39IIRirR|ZSTvtjjJaFbk1Ud7`wq-v5qBZ zEI~yTaFN#Z{O`ORUv630pHdN|*JSB(^<1%WyTkWG5t7}_&mPhN$;iGUw z+!egmCVXd`8^!m+eOr&^?~q@iT}F54>{#ywLGC6bTKjWI)-)Ve$6BR(|L9%2I59pn zIQ4c!$$Qq|I`7_d@UVmMVfbh0v~}et89mGYU{ijAh;wOPY{fhan^NEhP{aWP=<;}M7GWkd?D=0glWRIaIYKyc zBgWu>`7nYRYGDV8Ii0{$Ky%bR#hwrKdg^rd@Fsv!*ukVsV(iAJR@sqau)RqDJ~82W zpn7LX7q=lG8r%SQX=YJ0`iPY*f7^5xX z*&k;MIQRG!;{q^G++e#j*(c#}WT4HuV{X@nH&wu3-xD(0ha(`O;Q@t4f;TH3R0R`* zu)}Hv`^?o-pxYUyl)u*O2E5y$GzyAO!glCDw}Wo$g%919%70q!uD&|90$N=b1%~?S z^AUXC0H!T`qBArA>^49UKK4Mr_l*c`5mh+O2!P5>1a1R4xDy_TjV%onqoj6&i%4>K zJ-M#P2l}8rC#`#48B7hFo~*h&3~-bQAm)DO8=&Y5I9-h}hSnbdGI0RYdL9;*3h(?E z0EUsPmQy@XQxs0k;tVw4)W)sb|x-**zPP z91P2JgV_Tfs_>dCK%QT`4Gk{lhYxk zb@l7F25)9Np8)cto}o44IpC75C-pZG3c;}jCsjZ#+0`&;1|cAR$9Zq%kd;-!fy9tx zWxcm|OtAvnmW`j=>K!XBU8k+3J_Z+e_h3&@Pz}curF-9#rd^vqdsmkBddM`hNrc|~&f`0Z z=~b09k%3CxTVblU?I~BBqlaD=>D@_Ie9n7i6RCw&8x1{Wdy-cee<>C1ymZDmXckL8JKEu?c`=w=9kdBFqR41}y~fx@LXOgAq9ef+)# zQ0j@*LTwRkmSt+omGcQAZ=uuOW)1Wa964sL2>XK>2{nm#=cy@zR5HX^8iCJ-O~RgS4z+h$J^ieM{+mOe#zj)wfjAfT&O~d0JGd;8h=?& z@KyHK4M*)vh1Vk2NbRQUUxLyC1Vt_9!378^O3D>LC@|@;QPq6cY_EO3@_2G)kwEk* z1F=WvMyXE1q}zl*&}8=$zKV0(xs$V~y$0Pww6^2EX1;c@jHmW3{qc+EKT!CRY)*%L zwUt?H@_Ua!oW#)}YyHIv2-b`x`&`M2jpucUM!mac{zq2aHjD*T z?j55u_jKRU;3#5~TERQQmOW6i?d5Un%<;mUXwJcFSd!p@6IJw zOH6au?Xd<_Sz|p6{T*T@pr6(5{gqSzvV!id7M|?Tg|$&22D9zy9}W&t@@9R>@Rq5( z%YEMd)V`^!k6tp!i&Z&6ul|qUB^6+6Mt1;G&Ums8iL11v?W|MRc|rS7nBV+eLdi4f z-{X9_eW4s4XyxRF_MpqH@{9(F9jMs3dfYp==4=1`xl5h*4UtLw9CBOqbs6i*xFbr5 z;zX4LDYw$P*QM9WH>eH0Qb?>#?GNLr28DT-oX*r=D!KD1+$HmTF5kcTkdn2v;FwofYJ z_14@eFF=<>VF%?N%ST8)6pTv=5mRC%1*uVXzC8vv-AiY83-`%}TKMtqDVuTc&dPRkYOZ%;Tb|u2 z?gcXUXL>OVx^igjVf8E?_b#2~sJ!$zkN6|o9R4s_R6QWgVihsk=H6PxpHN4vWTGE^ z*V@NNB%eJ4yJKC((sEQaHr;mcE@@JOfsTY&C1uCOLe(Oxx}Xiy&S%W6=`6)voVNos zq54XngqQjXIcRf9m*{(ZFfYS}xP>2NWdm}-W<<2&-I1IMi&|_f%Vu|R8ZX~I8SN{m zp2JmSWFmUW%Te&mYKzp>J!n^Duf}7V#kWLrm^%UcH%I=rlg8oO@r3uDRC=(1^&;D2 zTj;E~Va2+PuI&Wc9MR_1ub%E zUESF(ezbZ_^ll>FJE|WF@ZBds9v$((v5F^}q|$8|5jed3s0)9rMT+c8eSmS^57b=D*33OmIK@lo7M=2MAT6Y1Ynh4hoV2??MUXuo7_GolVw z6Uj*`EuLX_%L*=zs5(hd2~HlPO^?SrZJjvNUhMWVk8o3+&)pfS!gj9Dh$RT1moP)C zrwRl#b(P)DJFwbX_8{r`c4Hw(|C?2n!>(bt2#|w|a+jwLU;yyo@Jqq6^QgvP?9f_1 z-9@(>XfcX#1^Lzu!aC5ozD4AtIv*AYmTwGo+#<_I!g8-*nK6ILAU>r_Az`OS{Y{HJ zAYaEQ=t`sajpNDBMeLV6-fN!*>y2zZ9Ml`F_A=_P?0j$UF%vM_{$vc?Qb2m zG8f!YO~}r-IW_>4JdUQt*d%wT%F37de4A!S+hS_zmKc)ecuNI4@>&8-T-fW8TreIT zORq1cHn&A6-fGmif(EW+aWkSiJPamIalH5SKH*Kwc~e_4i_$4p#vvMoxhG? zVMdHx&6*|v2AWn-)1a!Jkuq&zm@7_%LnW!6BesHNyVDsCVE=|(J$+JQKVrG&IR`JC?zz<@n~7gk*n`9r1`{);XF~^AKn;G{ln{OhL!X$Xo08}n+mX1g{pyZ zT^nrD%ivzZq7m8p5H%-s!kn0I5Z0pl@seje(5IsN9R-ctNz292$f4a4J^0$^#J_80 zvt%&=GTSd{xhRiiC zHI-f3%}KzQjYuA0U?#pAc(L(OXt5KUv_KI2Gs&Aj+gg)bU$*NZ9_I)L-4f#e@IMzO zWkQrjw|m=kr9dcPnY2W~P0;<^=Wz$@w@JG<+MxHVE3t^3sPv1witFDEnm;@*XBh0z z4bL0i^cjZ98sKidv>BP8g2)@Kduk z+)}0QWxys1#*9|Uovn4bJR0FqQBjLc?s2!rg4iBQ&(8@RBV*YYpACs=qU!H?uA1>x znTer(%s(x=ynu=38v_x>#be8wK5xF;-X@w`0)^?lIO`iIG(=jXIbrBNkwiD+g{$be zrxmwz-{WUvHj6vD{G^WFsI)2btu*{!^P+NiNt0+b5Gea5b(K2;p8J%{oA^o%zVj*X?#`5Vpg(xzPB@geDwpG#8V zj9`VW^A^xd8gV*F%bVF|Smn-OmD|Z$I>UbM8~FnZ&K>D%KW`Y;BKa zf{Dy^(b_B+uFO6q2p-UCJUsQqC6+6hukFXQUocho!4h4K8ePG=NL#v!Wr09O>bnup z-DnX?QH))qK2-Tnv_vEe(hMww@PH3nt@VC<##=QXJU^DQmx$`B^_s9Z92HOYC$zsk zLeo8M>*+|8mW6Ej4Q$J526_?4ZZbWC<=kaC&z+59*`$PwsaGqRyipgN68Of)lwX&D zqJ+1x*tk;d(4zW^2@`6F%dNaD1}Qjlj6Tr(cJ=rN!Bb0{ID(~T(Bt54JM^kuvRON< z^0!*fjrzXBUY=X;CP={&2!2}d0D<=DI>4W@DHZ~japNj^E7y%n*0D{MKk{bWt|`}j z?t8%9=S6$nQi3mJJPN`gqE8xc(KzLwEFLYR@V_0IvmBXq^a5{VtCuFWUU2GOrC|kE zXkX9Nyz(XPyDB}83_&DJa#71$|C!6RpDl!!N3+V#>baTc%ZJ4Ejaz+GO|hWl9%>)B zw!@M>uMb@r4i1x)Z?aO|QO&@SA6UHl&Kx`xG$b2a3|sQ);KK#d_Sps6auvGfgkW~4 zG8Up9ze}LAlvrYKe9W_&k8kaRpoF`MKhK|#mOk}uO}fudOyU(zPP_JbpBYRVMv_$w zAUDDh55B7rL^zYp3f(;4ISX^`>wdDgziW{?NJ?=^PtZzkORcaXw2!lYV}y^;KPqic z)eJ{~F`vDZI^vv9{Xz-0u${_gn}n??C6Cjrzi2sbTFq-XmhcwpVkeO}QZn1h(3Hn( zlC!?P*p^JxPK4g}=4?5PHznzpfzN$M8*3BmJv@Rt1jI|0v*0N-&q{?$QMlOA8tgkj zBvMWI^b+%XE6>z3#_E=%p*`*`*Wmolj2~SMJ%X>V8y7h+$sFQ%Cn>kuUEPE43frgc zy_R%v!gQ_=yP>}0ADQ&GaU#ufrF&%zSFeH~x2_gHU@b>d8N9*NQh3Y`5F{M6>kB%MUt@uPnS`PI zhBU61Dv5|2?P|81Mv+(S9)hCe&w6#_iw{m&XD<@cFpcby1=xdCwFFzW6g)Y}AyNLcCsU;W8ctUH{e0Uov}Ejbp1g|a|O z(3g{9ryeJuTki@6cE5buyi_7A8iB%B({g0GRSCtg+ZxNfa%W6vSvd4Q!?4Saf5o$R zdei{T5WLsJ;l2iB#}i-4kl?N@O6jV`_rMM2CDQ}dBoZyHzctg5wg-_UkR0l)5JHf)M zb6cAhDFnZ1AXEqhcHx|=Sk`<~0trMX7)$T~oz{4DnC4S+K<&W`HT=s8UmuP?YxC3AonX+(AQVE>t!P%fflh zb?D6s63kVX1K?R^TL6ZT1$nXr&#RbXitYy#YS2WjTDrPoW{J-w1?PT4&gO5m--@f4 z>b38YxvHLp#*-=wY02Ie_!iTwR$1!(a5(M1Kbc?&9%+~$=&|rWmT8L^e^hi^P`And zEu-%ZI``7W@vzqqFFzDMtM=o0!CF*fc&aX2~xVYh?j@yMM+ikE}9-? zBK^tf=TxYM*BeVgW=IoUlL2{!pu7+>y3?@_(I5{-KphV^UybT4ulR=cO& zhDAL^Z|61*);t)S&KMGV+rT7{Uz9_v*?cIrVj!|pd2=&$CzVg12}3)zZ z;2R^WPC|T_C4@oc;a=j)Dwj`hRN$LmT_t0s%2sv#OT;iHoAd2LhOn@gtSqWz;Bq$$ zmL0#Fh(iaBKF4uBnsyL3(=)q#icGYLJc02a?8TGGlVcx2GIBZX;{{4uYko`D6+(1e zOmAmSB16R8V4hYlRAH9izm03`_s5KT;bFOYjEgAO{RvIrn>#+KG0VrX}g}8W@qoAW64<%ap&mx-rV19 zV$W->wmm~O>}xvBpDI8M=2fEiDwbZv!xG%twN#u;v8SysuHId|Ua9SH^*QprZ58_| zNyIFVu-jl&6zN545?A8AhtqQB+H%$3J{C-$lPkl(*1T^*ymQ1kk!xaib%oX8xnur? zpNFp}LH5Dgx(3A7R#6)qc==iVbPetYe9<)o)1UpO8A!8t_dS4u>017rS`>=b&cM<^ zee&wdlipjg&9X_CDn5k#MUcSj^Bkg1W)h|Nr07L=d$oHo>F4Xc*)yb+LJ!*T z%&_$dEMM+$Z``sed?5Lfut{_=l%>A#wz?_2eF6Q8#Zz^Od0}f62JXyHHSsFH*LE-j z-Ht?r6F*EKh{l#~ViFqk`@-EKn^!=Z$UbA|6_86Z57%F`M_!2ihhD9N+SQzIleffB zu|Cz#cBlIc7s!viW{;{>m(n-{&=h3&6MA1iKbswNHpPuW`$C3V83 z^J`|CJQR-csVM=>2tj0R6>>WDN<4@6Fze45$_mo~-j7Te6h*ze85am;!#t~?I zXG7-0FO#2Lo|ZJ0OLL>qd{_?X ztsM^KmO}BwcoF5FqEr#;uT8(AaG|54UpMPn4>sSfLHQTFI;+0*0oXTYP7IKDGzl8oVUCcKo&g9Hn6fje_@;KbJ5IF&e!#ruU6>p>IlhT2dZo6(Ra~w<>Y~`^ypiC z(PWNK*8^Gq`-?lk^kYKdsye8oej4Rz*0B90VQxSDQZ$iP4vl{LM_6YGG4~dR9k@@8 zQFI*)fKBSGRTrlYSc=)4=bLlhH$NPz3g6R~3G~U5N}<{1``+xddM^xlY=PSb-GkSq z>A`Gl)mOT~jzRHM%B?!<5qNGwo)-3r-0DlsKZ|TE0L(cUQI;*L!gV@SBSL?kvfH|f!FfQa@ zc`tN$-jUqXtKDn49m3iJszHetfL>jIwC>??HPNRpy;8>ONG86$ykhC6Zq>|yahZTE zFX9fbggwf*&UrNI^d|bHuAI(vUYd1};uRPk!*g$c(LLybAwU;oCuR1@J}Lr9I0tC< z<8yGz`OtTkTi-IbBQ0kco=|avMb7{nrT@Yf%qUm4Lvq;?n^yqcfmPc(h~;=sU4tex zapp(7ER9vvDGaVRTe0GVH@q4EXe+{?-3BH*44OTw!M0H9Q#FgPzMB&aZPiT$IxY3F5goUkGkq=k;-MmM z3l$9jXl&?Ffe>fL3~8d3;t_W40Rzw0iymT}VL2u+G?1oA?Us8D$3vzgGcF6VE6O&EXk1afj+3u&m!AmboE9>827FWkc}?a zF!=bmfhHqF|L|`9FnBpc^pB3t-LJ_(K?U6vJbpokJ0q3v&Bp;Wq7Ei!^~+EC3-Sb| z;eNN?16=)b5P++x&lIkOrgso5_ATO8b{M;K?XFR7Wk6*~s?d`uG0 z_*W)G>|mFWAf+&BwmJSf;4_Z0?FhgO*i{z^j(Y9h>pTv!Da6kF(D}|6y40~|-Jsj4Lw<(KJ4~4Pa-?P& zMjJ*@@Zt5|p&qWo0pUELj7I>*iQB2FS_&=45q16Yni$+Np4(DKlhEN+=xbQ-9@2bN z-HO>5Y$gsK$owE?RdkEjhM|6{L<*j=W}aPf=bF`mjOMY9A{ipC5B%;hDv)GUb>e7? z5U_7C<}>sb1Uamhp>VZazgqcrc)Z-5T|X5>rL8g*eO>6RUcUw=sib39aG;>-0EF}} zJU}MYkH+Ys0C_K8gku5-clfwGtM|;C(@WNS)l(IW%p+(j80#{;*f{Q3isF9=oefE1 z6(o2_w9>5zzVG<1n$eyf|55GdswUuP2@2J$>d(O@i;Sct)!&iu0qUkr>(C@`pA1RJ z{hX20we5xP2*=@#RNQj6CwdEz-}(kH6M$@$p^4>SUV7U>c_6`|)w0LCK6?9$W*|+) z8D(-jiSp~>mNpDz(!~>wTc6yZkEGZY2{~OW7EhMD7i$gBVw-os`c~hu zTt{%Hm69|Rr))2KTW6Kil_td@^hWs|xxK%~VYx#q?T{o&TYGD?M;Pjip1{{zHW3Cp z9&Nliu7{P%EpKF(whTeh$&#c_kSZhy9 zesKUndrmY;V341`O)VY#*Z%?_oRGqr1>)giS_gV~)GrsE5;R9jcQNcP6LY|4_>K2m z_X$Tw`Lpugwv1BwRHL%q1IKW@aD-WL0f(o_w$k?0j0`U~aaR_<@P+%5d_NOCZUvB9 z5rQH|a`Pvl`yb4^ zhI)c|r4V61zx3OQdrKl)z;HQ$2K%0=|ITbnAe-4-2>~20%PmU&6Dr0w)wsnu$)t>L=S(w)yi7eIyj1)ot91eGSu9hLsu+N!ckD&qT84t>(d3vx}GL8)U|U% zwcFCUj%UZjDbP{q8Y`yPZ8|GO5%XC4+=gMF#dwfMPhQzH8d~TXp29+>=iI1BPqLVs zqtZf*$R6c$HQe-=TQKGH_x@pE%s71xr}foN*%JeF8Hj3EgaCjKQl8mH-Gfk9vwa{O zzo0F>Ds*&ME##kmb^+vP;#{G5aF9>|2Px~qG$&!>)-yj%`5?ngJ$DQ=imuE+TjB%z zXlM=!0b-WD%q0u_Zr5^H35R7E#BU&c`s@9SOqK9(kJ`;xVCMB|>VAn^Ujpt-?aBmp zL)t1%4!RC4?a3dZTX~B}FQNMoPRk+xvT&I~?`w^Dt*yg?58@K(IVwBj_jgxV`^)jQ z#qF?#TA#fsQ5JH!{A;$LLZnP|H=Tt@&=NTg3wjQpOtz}bNRnv`- zCF~oV)V25U>dY#Mcrosu96S}Ow7b70$BJP-7J`3zA)ErwwXZ*ie?jp}(vK2_OVkYG zFxKAtxB$CdYsK4!kt?&MHXdVXLul$nIJzbfh3)F0zsi7=E?M%3BIg_e=^U8-`2Qb! zUmXb$%ULs!Lwsusjs0NBo8tq@zY1##BAK1XB9k$+Y zgT(F-xOiKSeR^Oih#yz~5HCNow$Ip!f$8$Oc-;+bi}l=Y78|;2j)AVKnr6XsKEqf2 zlRRcJ1s%;~JyW;KPlL=iL}shEtg!*RNp0`)m&ByYWiAmdokvAy@TU+1s0e-t>btqG6ImMOoC?jbAXQ{BV`p>`GI zFRA}%;e5E!_l~cb;A0}k>{q0d{L&y5f_|Ob-`s{a#MQ;Ku(hwtm>Ik0q;sRF=x3Od za-k$_GF>zEvyaZ1StokqCj0Q``R2ALKDM*Un5W2H-HT+adR(W^2 zI=1^4Ak}pTIZ0?|3^(r*RDM1)_}pe;q&f5alg<*;6VakBg>@q6QiU0xG&`}B|Ev6C z%rm3R#?r-3e|NQV*xxyzY@KEOJb}lvG6xUYne0OYra(>O(~}$Ce@hAlk55>Qfy`^y1fRY;lgyjwi*RQYuKl+k zl3;x<=k-yIan8fUAFY<68q%{dlqs~KBLpg+yYBb%TaLXmWHSXu+25A1byV`7PL0vK z`fNo|7VGHD-Cv~MZE~pgi>_$>2%TEiKQcT~VbNk%8r!hO9PV&*#d@^Jl0Mx%rO09Y1+cA zPtGkf?bovUa`rLrfikrAWgBMj^@Kz6yq+6Fq>z)BZgbc9T)M?*(7wuMkG9a&KABtE zs}bjz&`OSyGQV%xJO{+U$%m7N~FLH z;iaO%WOJFd7FkgzC$-5q<6;Tvfio`i>p7VC^iKL47jdwLZTk4PPL(3Yup7LjhmI|-?i%{0 zoLoCM5k*NPtmR z4smpQp{npY=$0A66*PYF*j&J4$AtFE$^6{zY@a>pH-CJ6wV8*WL~e6#frCOv-;-Mv zF#TQaPAMVylI+dwmb?px$1SsJ+nAb;+7WKJ^%61zMnX!2P3wG!CyOX0B0P!S)AVvE z#z0Ra>S)r(Bjo3m(Z*HU2^@N@Qd#-Al6NPW#2(!^C32$N9gWZQL}w$8LgyHxe@_b1 zr2=%pZ`t!kVzUJ&F3pwk(X-@hUAx%r%ba$;&mY$#3zmR}-^`0D5mi+RlCy#5vgXaw6?AMq6 zVd?K}5!O%e)6sQMv|Jl`{#2vV$S9A1U{V&E$dy6BLqupHKcip}4jMkf;xAKx!OHZGrID~9E0oL~A9q_fuLVi;h%Wg0M@`)}$KKUaA4e7^2 z`w59GOnwMn99^~};Zx!@jm?TCgzcS|8f7ITm|rsxpx7~f%Zm+Rkf#r-UMzhwm&B4K zvk+D6w7AsNCVnmYF>(siduM?y)LpQGhm=;AgB2vZ9`Tn9ZRT_`K>62Do=_4BvlN0z1Pg>w&-DF{u!QjQeW+_ z(d94vD+QJ>w~v^iKj@vk7u%kId3e zoo?m&4vD;Kj^48L2`ziAF~KuCuCL|IGk-o3$_GnsAd{Ii?oa5~ zd2vm-kELLeBR>IT%YV_LAnjfh`|u9D;MMabt!eS|r6$Z=L~+83*6vSonG5$&1?n+l zUX389($R8vduxvy75uj<_$|MVP0`Npp_-U;PbHg~IVzV+V+1CG^0to=h~S ztjisgch-S z6rItWY3oZ+!m^7qcE8M-FmBhjA!PB&@FJ?BD4Mg;7^sTMT4Oyt)bBaT>bkWySY~AL zcocKFt#21tQ15xY^~xwW2{rE=7)kw^4hCY zl68GKBmR)G83nl06i6mv5$X8rVA{~1=pHBCUbVIg%Gg+xV9S05ipxQMfwZDizN%P8 zbMc#oe-t{+Fa4*sRd?1W^IDhmuLY~skCfdE=hnXb+=xc(3M%cQK#{lf%3G-g8JkVq zeEmJS`^3Jeg{d8bid%F4NKzMF&l#mTNjU8>IVa(d9Q+m!N|B=3;n_wgwBp1uNpbo{ zY~RSzNM+IJvCM07*3Ra+}?CkT0Tmy95%-l$$3_q4vCl`TYcQ*Z<6(d~WF_f2`c z3xz2m+3$Pcz4aJ-*!SLSGdWNy9604g<<*II4|@@oHL3}}rCZnr+4VV7j9dQ+% z{oa2+yT@EgUhZylSzTY|mKNHpe2s9ytGYhMw(aSyi90+2xMp?O)-U|6v6^q|57~an z*6Jsss{P#yEir^zUcQTjV`2&Uv@+FUj)XV%HdjOb%?G*5)MElr!DY@Ept(HvJNW%0 zq-$u5dktafR5NquU~ar{g;?)4L^<|Pibz zY|)5k*THSxP?PA@e{(>f07QyHBQeFQfC$vF-+oizFXMkOUQ}`9OhjQkmy6;>`}pO@ z6Q;8dc(rn-I5H&wMM^h>W85oet)_-04)k@pr{J1M)K54e`c9-IWlgC{EDO3-BE?n9 z!{Zw5xSRpgqa8Ixc-Om>?082dBzg=X3F=q zKPRt~C=>Dn@b*sVx$|SgqU8oby+p6=y)_IAId!`7r zeO(AZ89G4zY0%oUf&?1w&kLWcq(r_{@aNrj$ym)@sz;Z!x89|tYQ5a1HwOU{v_+1* zOq6=MrRV+CUMy%Wi&lH89pmxNas73aJRX636mtt5Ngo=`(&$uBISi@waMbpF6EAac z-KA#~A$ywwmqtP%$Stqh&!@7@Vb|`lt!K2BCX$(d`mq06(7{lI+f{bw>MBpwW>#OB z_gzb6A1sRQ#o@6fmBvg(Y%p!g{pGyCP2Oqvh(sQCRD;R%#!Th)Sb~QKie0LHGXpBf zmx)@}bJ?e*LKe53ZIAEM#OOa1L7))wOj~m`e$O;6l1r1sNC%36BU}jA9!kI zSSi6Qw-33y0Fh;*SQpI6I^KC8DSPjERI*o``Uj9TA?BV2`%Lqxy+wE2OrNo}wYhq7 z-M#4(5ipsvy1KtL7?Wr^Xqbz3n{(x5vm6!IV4iOpXi> zM3AxuFJMBNGjB4nfP%da1#)MU3T{bE#h|=3{6`do?NCXvFOAHE6>?GPcyemCO>p%^{ zsuK{!Ucmr0LU5HmyHMqcf7d9AoJ1pCp1s8JBL;ax7*7BCZ2z-8ZKrTY!B- z31$Twy|94%gexFi_e+AUJD??_7(O0vfyhETIuxQIfTa&yaB9sr0{BjiGC=f?I43H@|gfj z9U>V3hP3f{qd^+`|1Wy_d8+f1MM?xcW&viZ4G_DQogSF)A05=S1ax675%F1v$ZA&g zFxvk<74H9*3I56i5eWio0h6oFn7sOkY-0k3=H>?`+)sEKVoOc5t3iM*Z9(FzCBIC; zmrt~So{fUwBrag{gae-VXPb3bpm$YUx|U;RO6%`86vp@DHh{9%ApGhOq{Qe5x%f)) zC3*gTu5_@u5G^3kR6w?WYJ2A8j#tZH9^VC#e|n<_acIGpz|SD_A9aE`;DHrnrNRQE z?*hj7rmVA32gn#e`F{pZqhhVbg;=5{aGeQ*%Zm!s=Wme7=3s}s5EZ=$HpKp8+FMY7 z(XjyYf^2EW^p7Y)JaF!3nFENrjyM5uH)-LdFR~3d5DM#8bXmwt-|mYXLIETUnhWEB zj8g{qXV>e@UoScl-+-Q5Y8+fXNJ~^4#JmcPBwj`s1X*`A#c+X_z<gva~L4$YK`Yt0D|lzr4A<<#BS=l;>_=suWnv zT0LIfp0V?pu`_DHgY0e)Z;GsPRCuvyOT4kv?|hMbUcXn@(JoJ$yWG|nmLIQY*p9fH ztZP-td0AF!4|aD2iYCEg>*!H2BhQPz$8_8)*W1C6?7IOf9v+^Cy<}KYa&m|e&7GE- z#cHXqzKV*OyZbGy;K4)2an-7EANtMZ;!}HC)>HdAX_oG)Wzn;(#f|3;=$7t@%ee#m zPuD92HQ*R*U4kcpI15Bz(#jX#C*p-3=CUxVkq+FB#(17ECnY_c9$zxgIy_u8B|Rj4 za(%3zmMOzn{Cg=BFTbqiT9hLuk>Ol_{j~eoR)2l`bZ+ywFxuW+8aO!lI$Qo8-(5!|S1;%zd~CB=SZ&`w^Twkeot!=tIX#jiSI#7MbP7I| zI8I%E&=5DqT$b>6c;WTo0#a%2YJy(iC=!l8pQ6aD^ZO&K$BiFjd`WTJ$oGB8t&RJl z>kYeyWLKkQtWhl38=P-)t_1ZjTc6FX8wj44pVgkdGe#wy-BV-!rO)>-l9N;CE%pK! zDyaQsoifQ1cKb7&<7Q@QU4NI(Tgs=e)rQIB`5Hmx=bB0GmSc`uQF4t)NW7E9Pl;OJw!^lid zR*Aan_>&`Q*kxzq6`upB&w^OHtUHiwM#;ToRQvorWEX;hF^BBF1k)F-0PpeQ@7c)9 zn}O70bAK#2ibgf8FEuS~E%&`AQbRbEs6az`xt~le6F4%tH*i68Vt&+@ov-$X2>8K3tRKj7!Tb5qWi;@5KDFBT;oX{!;rh@wErv}K*;ea0-`{fCaRsk+{gf$xM{J~s1X!xFW!!GfPyL>6?^h8! zW>EAD#9LDEG^#C<1kP45=gyKC%X4#A;_o-+FvTb;S|>P<_>Asj)H4D|AlU)HtV|++ zxv(-1`?f7&M@@y-{33UT7Uq{N1FRIa`S%!F(#noTvIP|! zqKY&?!2r;lgX3~&kAkSpLF#F`dP`5g2Q5k~_|wj%3v@u%yjrizj|OZk%XtosD=MT9 zyIy)_OL2%46%EOse-|Aj^Bq?y=6}+ivRrR-Y#9AA4F?nH?`wgKHiaFH|CHqnz$I>hN3E#SmU})L zUJSK5KAo8U(-+9ivpA+h0-S|K4e@7-cUcVo!IB$Qe#y|*mgd#@_n2uz1ax1*5>Yei z08s%g%hJPx?BTK~4@wMQfYP7==_dG6YySr_q!E&imZ|@Ew z4g9x9GU34YzV_MbgX!p*{^sSQb64AOwZ7G&X((t!LxS#?0!`WJ3o@r*1Te74ms*{t z0*J&$$crir5?Z;iwsff~-~&^1au|pHwI^l}Gh2~w=g7XGF>d0mJwfB4fml`(V5U22 z2QLb!u|EDHuYrl0}&?Z!H% z%|noXo9sx7O@Ex!yidW91#!CLRyr8##s6mh0PO*!5J-SA+L2?&tZ%d{vY%8wAi9^eF zC&wpaZXmjPI!VHcigAzAzBk_5p8La`UN_%LJ*=6IbTpMsGpCKI8~TZR@!=5bAJj^52e5W)`hh(sZ5A`T`Y+|EZ?<;n00H>j|9iz zlx8LPKKzAZfx2^t<`YNY?3HjBnjb%|xb&Y9^=ZFkZf|jvEU*JyLD0QCxBiEe8XGlat?2|>n9mf!TspclTVv{gn+&2{<0GV z{JI_(ONCnG66p;T1Gf3}0LOLbdBO!efJ)%MH$O>D zAp_g^4*9GcAk4QT0z0gKDG=V-R}*$dMabT~=)MYnh3vO|-W?J&U{(WOy%(WA7KrrU z9ROi>jysouxr8vm*XCU^c_4Qh0r{)}SbUzyAXv0Q4iGQw)%!0p3m|_4K})Z$p~(S0 zo8PY6i?VVD1rWaPVE)%QUX0#$-hK;Wa!in3fo0IYZvYHQT@iW$;Bhu6=bugD6ENjp z7ZANv0*GM?*CD7K3MLR(Hu8n&|2>X1pk;@;&ALDBWfcLme)4@w|9t~1d%#WV9DKA} zH^TLSz#59!SHO3q*^{3rBHN&)MiahZR5XZK;ZyFv$MOHpM8=M)dQ)wa|wa=yGsy?q|-`D90pyGMcxI`Mve@>>tA{-9_`pEk+1dXWTvE0~{g&c&yy@1ly3caHCC_ zHh|dOhrG59JjO62)dkM~-99=xT1$W#F~eD}>22A}(coeNm$UNe(<~1?3=g$}j*ivy zuF#`I2CHp$QVfatN3xB9U%%wAQ!NmttQ-vVMB%LzV@j8HplUX8n;%ElnU17 zhJ9hngcgPthL{K%m?Z-{*(p9+m>!8DiO?@q`Klq!^Op#|4o@P;F=3u=#wMmg-<#XC zK6y5e9czS*jwH}P5mPUcvMo$iK=mXj=9)AKEYMKKDX!UlqCcqCJo%)q`$HxgO;X${ zfcsP|$iymF9bqoLC;Dgamks*Ja}#pTd)tpGDZc)~Cr`e$8JFcF$Ch@1D89&Xd1o$i z0ZScspcdJ?zQXZP#P}ooLFf(=xNs@0yC2oALD$n>T4>DhG^7>>?5YlQL<4k~ z1WKk9@jklG8sa@-6mieN+RJQQeAJsXt{Yvu6KhDwaY7G&b0j}&fVbe)N3xUtWN^LV zz;By`2Gp82 z9JES@9TvRz1$EV8{!!F_2XV-EO;BhX_T~x-@^lNK?8;nE#e8w|bBe zHRY=t-}S6+$>Tx;hyV7c4nN{i^wDY02|r?OTN#-M892z{VgcucZewS3o0aJ%=@L3f zpU4U5WsT1X6{7w~d@mP;obtVnXc614(puP}ImFpDv$C(>kGL(ojwdF}FRbH}1n_5x zNez{s<-T>SJ!G<{EX9wcJJ8F$lZ@@A{423c;OfB85hW4vr_$q{MWudXc8JAk!EszB zmt5C`kKP=k^pE_#Y?e=@s3%Ap&XJ0rgS3&F#e3+CuB|)vVr)(r@d?`%I^Oumx4qfG z+ZirfD&#e9^HkQ!h8uK0Cq+j2X=}$gt@pV0&=Ps&Y&nno8w`~NHy1FYH%`FYRkVU& zqtx3Zx^Y>?jf{>FdzY>F*7~r2M8EQVIAafO<7r$C-3ZOP!qYvDLO&cC`HjNiC@?uY zzs%E(sH)JZt8f+!&P(j@@kq*sh~w-}aj=N$j#@!bb@rPJnrUh2@zl0$H2rd!J@sVC zMBK`z(u_;@Qt1}^Ch|UQUT1;icMEJ^0E1Am7?8XeKn!(&ws|+OtWTdjKDg_w-kkgA z(^s#=7FQ@Nh85%hHq}FcKY#e>Su0rH!g;NP9>cGO?bp9onwy07th#l6)T=_@wO4d# zp}-ASgSJRGds8LG5dlwc!+woEm^4IdHI}Y5!`Wi>Mdi()d{heVeGT5i&AelSQ%f<5 z!#gh7t0Ee+0|ux}ol+Z*zZ0qJFOS{~4h>vAjIiWKJa5$@<0$)L5PGXfH+TyjFcxqG zlFL06T&|z1CNI&X-S2ZFJN30tml_P$F64aT#l@WSz0E}5E8l(c;wt&D(#QDlg-iDX z_N*Z`%Ss;xvE9TXdRRx#nBUS$(OL*D*C?*Tb=U-MCD#~o{!yZm_hzQkjJlN7*NOx0 zbAgW6=YQ1nsH~G{K!w=YId865ib4Xp5DC71HTmkG^T~r(m1Jo~Cm|W$IpVTC z?xMw>p6|L5&F}%o@mhLq=@Fb#CGA0M`J?&<1YX0TIX=Xscz^7sho5n_v~ZE=G^GX; z{T5&TYxK|MXx-uY#v7c4D)?Jzgm+5O1)e6@%YzY9S$_ohOKJ`yDQ)e3h=;-+e4C0@ za?Wovh2yg}4BN;z>Od!lpUdnMU%`*+NLWE=mds%DUHI%86k6&X4$H~lWi2o?xe=rz z;3{XM(?mZ`7UOk%{R}ltFZoM#baZ&I{(O6bcgeMhYGYBk=#8cA(%F5RTg{ISbb1~y zH@nK;T{cI)Iqj{KE1y!SHBdg_Y<^ZlIcO)yD;}r3)O}p5f|r8!3yPej*T5Ye7@kuz zhh=AlX2jYu-`6zK$vd-GY!eR-9UxhW+`H1-B_UCS3ZOv5=XQuUniTwkQ4Q8wd{?hf zrC}~zlYOWutt)cVpcIRP2xNNj6`!sSWYeI{fab=_)?Ejvl|Gy`)$zIa>ZO2jB+sUg zrUTo9aHFG_4AVoy^PN9foWIki#;xfzuKa8wl{@uM$PG30*HWGR#BT2Nez z3|Et`vdw6&WmT)c&@Sk9S0HG-&Q%3(uF58>$_j)$wp#kqw@PjG2?i=!}#wqvjyO+ zKdjsgMYhz08QSG_oyTzVVwMTLG=2@z(#(^E!dBol`(}IoQTx5m{(_akveJ^q%@;9p z9fI3!W1=*8YE0&24Vivah)LWGb4@>pe!hn_#w~3c89nEfyex$$d8Ud*p6|GVL%7-H z@WS?X(>v7*b>z&De|wa@;}?k3nZvL_6I=5U%#|1hz(hl zBFSK24o%K}gAnky{rhve)$4 zucQC&cjM$^FMJYXc3;$JO3uDzwtuY39P5<$7dEn+|PqN_h)xV!FDFi?rvPcz1Y4gAYVT3fz z6;w9rZJ8G0bDtD^k*2o^u)E&V@WrHv7Ov(Ig=Tn1QAskE84tosWYiaz`)pwN)ktT{ z4mUgE+`ki}di4{EA>vlt0|_eryVUlPwQ~{5yjWh>fsFx*vnl(H)aKU4A0Lz+0<8wD zLpegfWFW->H(E*>HjI6y!R;>i)7-*JWj+SM%;)!LEoQUpeLi^%Mq>=TRTs=})os%j zD8_v!@B)bU&%DaHN-z3W-EOE}%I9Jme$B1CmT`<;q`5Mzt#1Grn}n5!wG^t6Nt4J- zZU4Y!O5(D<<&Vy4z(k4`97bo$UY&JbJMpc%xX;DV<|9V_8x5076Lzxm5ic6am%f46e(Op1FyXvRIJF;sg z>C&N~WWzgtKiIxx-Zf%E4=u>b<$mV*$mV;0dl*knI#1o{|MV+#nSm*8!gPe`**g0l zL|jG#1FS7|WIA4E@B{>}-mZd==0!=saZfw#B9=UaLY~)K&W-N7@n~1q(k^=04=XV~ zHK6dOAr#d`Gh6exphUdeLH&n^Ra3P$B&E?>?Swz6z^pM3+g_RioXqf2-`)?P+N`{m zi_JH6lMz8hT^W!K;dpHj>0d3mOG2cG)e(+C8O1JNAc}JM*zG5DBuyrmgM&-SI>M4B zDyKLx5UuBJ|TQw^XtM3oaS>Iot zUD8(x{^OGH(rz}0b1j71l$m2;ya9nQZ`jbJzJS%Db8Wilj}Mmfhxzr@5PQ)##2F7X zQu}%G!1t{)SLV<2V^{Oe<=mrSGBL&!mQeJ^Z%1XT4)Li5D2u%z+l)RL!h$ z5Qt3dyp$-Bxe^6Q2JT@VT-Q@SzRF5Zo?fCP`B2)(6+^AkN!0tvsGK0@OGa@J8|rKwrUEDHVq%c0B!r>NY0i zsK~x97mPRc>tqqS@?udJ?9)3`zB-BrZ z3HQRjtNL(^3SX9y=__p8$Ca}5C*ux|(hW9?LP9uK7Q^TF;t$N&^C>FkgX#6{q9W+L zC0``DAm|lm%L+48baBPbU=-1inN9ohq}{Mx=yD z^p&rV7X@31a3n^5YGc(4OEyEh;9`G$#rVD8Y*a;lm@&35Ma(vbKk^QVy}B()RAM?dqvaXr!TAQ~4~69ptb4!yM%A%|^JrS*a)k#+GlL0I2vm^v@@3E2RUdPDHw| zn@;AxK)O{-!ld`{-&K+Vmn)YOp%P!^h`eL{wyy(#rV(h4sWiY!R}g&s9v()08KP~W zE|KnoahAS0tv6vkDbN@nQuHR(>JODOss|<0yCb4(PGb7jS>S2C-rKwjMpaVQqdiI` zx~*-07)7x>3iuPiJfsH4b!1Gagt-E%6{hePW*2{m3I4s-eaNPsW0C0V-~DaRebAEd z9SX3FaT)dRQS3DAr6Zhwod&!^hK;oUF;_};>9b0PtOec8L^ZR*@w+s{(7zB<#eGlB zx-_xD=`CIy9w{YH7@1@Un*_^>`W8F?Ga8gu*DDSv;kmm|ybg-llRz#^hN^KGihx*{ zRUA>W%dAH>jFr_^Sf07x&9bBxfow=CMi^M|_aiud#|Coohz6fxVeqYYxD3&JdjeNJ zGA+#~U{O=L9L@`Q1X8Kcd7_Jl5?ay!vICp$#%!U^__=;*);w_JW%HkS=; z$u#^$=?H{!&gxVI8I4%vFe}v08~rE0D&j`wP;?FC{Y}`vM5WC-8m5`4THoO*$GZV; z*5&o#yRmQdgSR7m>85J>Jf%bUDncvOEk~miu9>f2P2V{zaZ`@JO&d@Sw4d-Ly4@Ej zR$lO=H^tC^>OVmcm|`w|${oTS5HW?ugA=>$92F9_eNr9{lW1u+2oth%l(ZxrZ?3Zicoh6JgC5801KqN1a z1vQBYi4QBt2AW;09vifDyB-4TA67Ds9sIs4-zk9Pn{g-N3! z5DGm}9%;bND;Y{t9Cn(PU&JkNtk=LZVg#GO9yh{*Jkt|vEHy24>?fARpwMYG$Up(U zDtP(rZ$@s~vK-^j!a-OF+a#x+XLUXd_H`ZKLs`)Ag^O=QRE2%67sB4&kjWygPor{w zLt%pRaDj&U9>0RtlK2Q4_=d@|a{96$p2E0B6NpF84(Zxde^2 z-G|NQemkM+jowfEz^g?WO|e0yf~hUdbA4<3<7N+E_jpcS+_Ol`&r*@#X-l(Sf5WsBp(JoN7pCJyUEF(M>Hd+#djWP9&W+Nns(#*cb zZ{f^!`CU*Fb4Qe10CD-BXN9ByXOkX@!TDQFkA)dkSy1+=7KX5nFk+c4hGotp6zP^B z=2t|WRi|0#w>Kp)h*R&8jM=X-q^!ib4^-o6c!uCr(f!(>sEP$eZaUCu&_%Jb#56)n zZ4*K&e8OCU2V<6a>3@d$4Uo+7z?4w1#%q<>&CKc;sI|(ek~~V0a^^8Hd~C}D3#c;&uL zYfmd81+lk`D`Axn$OX^$Nxms{Xa?5-#p!zCE8+}bbmkY!eChD+J;JYggD!0>g=nKo z>Dbb$B;S5^k%psHlzlXIARHpeSB`zZu?OuaOFA-kmYO6{^C}MDnpNz*)Jr(vaw}H;}twzj( zKqoQ9l0=KCa18p5S}KDqoL&?F@z$q^Bqkz;qdFASo9n1%s7d0$uI+EOjwURRKf4yG z=-)~mvYO>!qthTPO>Uz*!E{F{r0xVWz&Z96v;-;$f17zQ!tsOiN7>4%9^gWzIYDTH zx2aQ2wmABn8_0EvjCNhm{#jiY-{uIjI2dI#q2oH2NrdQoK1jwe^vy>0Z+&DKh4MT? zzd+a(s8Q@NFIPg7s(yp#KMs`|s^rBoDc4tsb6Y>do1wU%6evbdgj)l7*z({5V2Ay_ zmk5iD1z78qt|3TNm25OA;Kvxi&VR1w-J1Pj>hpt>+`dXdQrN1*M?xd$1WuJVRp{7# zy#R(prF-42E@@GbSR6Eu4MX|R@w56ds6i9Q;aVC+m>`)DnhR+WD{)7ZxTLCc_WVW{ z$`r}}oUcRUgOD+wGEhh04yx(T^ASyonS2aYt&hQy6zYq#8-yuSyCUJMIHWTX>BzWr zB*VhI6nKEXG1UVSvXg?i2y}kk$GDV9E?(qrHeD+uxQKqQ`-+H{5u;h5(M1{HCe4M! zJO?mHCL(xHwnZ{?PMRB3!F(Ex~XZn_)r&_HK%!qt=g6&=dCd7w}tpy$a5`-a~N*cpBb4(uf9OA84l7(CQ;p zVzk3+;(OOok~}&H;lwnG?d*+we{RtBQ8441!@1eFB3M}B&c-5qUMqi)kqoUtTn)r2 zHr0Wp=yKFpL6{jr@|_eh541zXXDnM+GW^@Mj)YQ+wMOKB*V8cz=NFG$9Ntm!+CCQ^ zWu_X*^uT|we;$4y$54O`E_Y4Gyj+w}1uc&T<$e>!?@#FZ^X`7LpU_rHXB5pw*@5HR zIZ3}B45;8J2ICz9bXun!|L()E-7>jZf1w&w|zbXjUrvYBw)hP4{HeCMb~H zn^x|fk5*gm0_lvF-uI>Lrj7`BRR%}9>SW>13%(*MH*f0(C2t?-uUo@c8+PPSY<14Kd-l%g*yLEXiT_ zKlB3iE(23Y*@MqZz30nO(l@a9 zX=pG!YNrtlRGneo7rnmKWBM`!e`1vdJE#HryCX~v(~UK*BnmBP{FATz(Ei@XSpi8> zRnuGo7(Dx>+xT#jFdAKVX4m%H4ebiW?B_cf1EG$1sVmTMn4b)H9k$P(f3+82HI@&P zQT@(IYyU(kM3X9FiBXF7vjN5e`~&37jA~OysbBaVF)z5Fb6@vf&~p4PpfGxK2{j^7l4mdMky4; zGVtU*er`Y!R2%)~C9qG(+dF$Te5(q-v0^C-ALXh4h;Tb^^Y&py+1@a-WV*lW)QYh^ zkhK(EJiAB%ag}hcKp~i#^Mkr7`$hM_6w+-~JAbwT>Nd+L3>TiB$YM}v=8Yhp&rOM% z@#FVPv~^kOG`Gz8@W9KbuYz}gFjoQ=r3AE1l@s&=_~e}(EQ4>InaS<U+nhBk(Qs&+CCC>7<3O&F(C&R)0s`jV&hr8p+F&hWKW50U#`hh1!i3@W16=?QK>@v>>O#}KZr-g#7G2sZI zhzAxXmHpiMUpGAkGQ#N@G3#!V+v~V&$YX&Zvci`l_eyqEVC-P4x+rqj!_S`)-mUwaka|ly%9UEXNhVPh z3va8|x*^_L#yW{02Vfy3krs~`PK`b(tma{aV|n|b>JcoM1xq1Nq90wzB5dG5<2QqT z>5C5Li&^U-NsndsGN?2f95lzO&qLQJ@C4W!9?4Rquk=v~ib>=5ITIv@!ciB~cR7~f zFQmSH6~Hinu1aKxM%0kRY9RNiDo~1WRY5WD3}s!_cfDo=`>Op~_w%TP<3OF=0U;}= z%0kr^5~vX23s#oUih%9Bx$cL&>MR7aRn-MIL2&0W^pwa=R=AW@cdDEBX89~OJtd2r za45xXo2yXu(%glFegN@qwH#08mVaF{d6`n7VbULz`j-A}+zPCW4OoKFkU8@H8~t$X zhC$6ou9l@vkJn)PYrV$I_KQo8oT15=fJKZ7%g;GT=r&&nj}MP!S}7G5&baj*Ee$-6 z=!Wr3^Y)bE?XM3G_d_!%nF7BUe$Y#3|blTu^XmCw7@0D-((P1nA@m_x!s`0`^l+bPyIpgb=BwBiGp2| zLj{g@aF&iSR$<6OCY?$_3Lg=dn&DSWU>IHzfJMMTD5Q17nwqH};0@kK4&fi!c{Su- zV54(jKYH#H?^q1gl9SKmY(8A|}RB7N?Fp`usz%HM$dTOG0bajwD)0Z|`XE6VlDGvg0XYi=Z zy8=hoY}KLBoarp5x^xN?k>|an;D{cbo-0(O$;E_3gF7UH*j$f8Asrg$M2mzOC@;^El^iBSK@R|H0Z@M@9L4Z^OjU((M2OLnsZ> z4bt7xDOfbp-QAsnfV4CYDc#*t(nvFeNc!9(pKtvBc-On0Sj#_HGtRls*?XV8uYK)( z?xPUG#$<3|y`8Vxfz4v|4QqKc3#U4-~l~=EUOq&ZF-OT<3q)qViD@J5x*O@@O+e6YKf|BRj6# z`X=!9^8TPR|Az&&Y!wovadB4&m>JWp{TuhZ2hMz89|6B!07b#vtfl&sD?V3Oyo0o? ztfYwv2XabqVzq;C%({cM;g4E|UNF9iW)Ylz-IfLbLMExF)Amb7I6yc+jY>zv5-#P? z4W83p(JHFxwRa8G_a7hZ3cx8oYX62|CJew7Y)``NaNtfN6DQPJf#;lTBM5xg8GAD^ zK;8MWLK6`uN0UCxM>i6WA(u-UcdxkFU0#gv5jb@jSDU&#kjk_VVusj>qNnC>VLZ8L zSd>Dobx7^jQd1?Sb@5ZeSGeECq?al9oT>Y1_zKfL_#)eM z@jLtdi2D%VGusd1$-!roqs&B@5?`P-Z@hmSbFi_g22kAou1&VH+j9aOz`%r=BL|Ou z*8GexHz%Y>vHJaQ4EpFWwS&j1;VE^+97|CBq_Jb(7rl2A*yR_GW~bVt4SMJuuZO>1 z2uGI;!O#a9=YB_w7`Tz6vlR!liI0STe}J zDt_S~@4l_RQXri_!o$oYi?{mo@#Ex01c*$LRZ0goQ=nGe2ju;4q}nC4;;t10Uth6$4W6VWSh8s ziQCQ&X3@vY^#VFW-jA&IX7}Pe>xo6FuBw397I|ULBvIck3L6>H*CX&j8D2-gEq*l0 z4-WsKV4#A6o%Z$%{IiA#KNQ;_8JS&MfkAwO!dr^==wDWDE@+BRNn~t(sqI(vQQgJ0 zIORPjOPCAdg^FKu+iz3{Qr&kf`;N?4&uPD;F;k~98r});>a|<1W!g9c41lKKk1+QO@@HC zD{5LOz_LDO*7;s!blpySPu!%hc)CMYoKkB~w>@Z)2+pk>{^eVaVb3dmJjVac0F*69 zr_3@X<~y0{6yCD6(%+3>Lutf9y(UZAk!DtJZ;_|X0|y@i@Fgz;i3TqKVN+O7Cjjgf zix;S!gKcX#Ye*}|gPihYtS#@wdm{aJYVrYllo)CeipwUiv@2s<2Gp?Z^PBS&SVd?FcF!#6XPtJ^-r+uG2lN5~G7wquV3T@>Myx*No%DpJ42e)qPASqdMta zu14T%JL8AKHmh%&u{arqyWFNi=(%YX7OBV%)cTuoPac{40T%8enDriSJoh>jvh@B8 zwkhCB^RaHDSvL1|84<9PtMPHZf25#?eZfl)+FGy7{oIi$#q6F@Y~M^&*b~;b8z)-q zXjpy}w~Jl#ntQcZ=ZYl5B@Mkr5MLJy+EE{bSA;dE%=ZPn23?ttd+nCoY0OQVTu84r z1%0|qNtuwH$}V=h@v&U6uHlo?mmD#6%S3mnc+?U=~5R>_cRa9cW`>S`)%Avif zGoi=gyz{ul^L zhM}mCGUcgOd_55#`U^GZz!Ma#86E&y6DN@cVD{NO{V?2VY->r=jgNsvq8~Am4uxffe+nlT*eZyab${@WMtzmrH!Uu^eT{0`dzXHj$e?@vp|bP55ZpU zUl>5gAr)|L-W_qw>f`=^!QZ#{wsUT=mP#0gj525A9kJ)`mha7#%5vF z8B$>5V5iA9tMR#5o=WjtJH>KBq|tNAuh@Fk(~5R?yza-;-DifJH|(>_>OQr6ut$tmdQY7 zv0CG?{A?FkkWfn51|6)^?vI{Tb(d2!Q2>R1913nHHm)Rv@er}-<-H9e1rC}&&h2Wv zJ(>hA(+4FBE}`gq71gnRBC3nmjtUI9lX+rQ#_2)CLo5tCs+m%Dsr>0K8R!Rf@I<93 z8oGNdBV}5#ib{i~uf24$$EUWOrr}4;MWg35hHwzq5)1AVQRY#5-3(K*?+RRU7*hm* zW~lK?@lU6dZuv)0L-Zg`kxch3=+)@#q`YJXw}OBDz4$q3=LQ^2Y+s)e2)qSq0pf6O6Z(!{ee zjcEmsW3d|Pn-Q*uwlEg1#%*u;cevDhl0P|kIqzX!>^riGIwO>EyfRr0X^|XC2Y~i) zX=P4euz5v8YAJ=a=T!E-pzQqRN=aY2#vAtMs8}*gFnkhMen=sHgje7pD*{vmvz^}* z@kQE_*f?rgri|UU@jg2wK6Kxz3N5`LK^EzM1_z8uR= zu30yiS5ZuSa=$4S2HAv-sL}I%83KxzyZZCh8;qMj7yC@Mwb;FffdXamJBNGY>;Mc9 zo^CO4b1(rTJBzmqgqEGIg&Dm00(R1`iP z{X)DT=;Az1Pnhg`lX4+?1`Tbl>)clpNH+ z{|E?^cEBD_9A}~*AuP%57c*o^sV$vL zG)_feR|A5T`O8tpbuV;R>tuu*q9yU7z}4q>Rw@DAvO(<@jtU)7Uuf8ARI9pBpY>c~ zL6O@T>O~-Gn`E8cgNkQ2v{p%$2aQe=Dci5T9RxpSbv+^6FkNE7?4eag-|TuJNp)|! z!%i&tn~GHr-R&g)1Z{@DxZSM8KI%oV1rkE2B&DV?G_VRSS>Vy|TA~>@BPYJD6TDw^ zJ1!kr38W(p-?hneKtK29O6oWKmEsYg7zRz$;Q2w<%^@KCRGEIx5@D7>ec)|bxkfP* z29#dQ^X(AHe#TEe{}vLw5WwWxU10gnc4!pFgM>32?tqy30Ra=&v_t~W&n7}ish5+H zSY~y{J-P^65op)zqyl|3k#Y#^oOSBVM0}+dFE)}z6J4~B09h7ksX>pFZa^ZsE8ZTZ;y`Y zz<(OhjW{d^>TZ0R$_y@ijDS9d?D+)7;XD#G&=FG&}J#WDA58@=9 zXRdxK6uum`MBg85!B)y<%9$ZLqcxjb=d=RD?I9;DimXyh!>fCl{HblR=}jw`Ac-d4 z7DdcjZPD$j}RYdP$Jc;6W#WOYULkQGmTb(&PNd&r27x zlVS}@OO?LIFXw(U1%S&ucfEss3baQ;%1 zpHL@%OcmdeM?>BVF^hS-M3(!w@8E!iq-)2y^S<0EV-DWIPgT9pGx0;~l9uDYWH^qz-Ecak$Lu={F#<2j z*GJ`z@}fM-LA9MX)$IJUQYA{lwp4rUH+DxtAzR>WwcOpkR5Py@YKu$+doHe2ArETaCjwyPwO(H>18d#;$kmwY= z4E-+tw4f*t)l{0bJxV+q(ru<9K9q=A9AY0MUKQXJWO^R$1Zv2~o@KUH1k_B2Q2Mw| zpJuwNfqv@=k$!vCv2YtUY$u=6RL0!apUJVxB)fjAbX2mK9>WH=&(H$#O2^fk9wCJb zLy9WZ=>Wv?vXdAmBXkh;W_Hf7azg=yME}$}8K6`Hy>VPY@;(U$T;^HtQXT8RU`6<} zq@Rn^N?Hp(k?-?dh9o*xm%c!ZN!DQkQ}O|^=|hn69RpIO3n&N0b{sek5sFu&Nh@3p zrJ8rx^(^>xX7g!scKYepwl)@4Y;1Tx@)Peru0V?b16#%9)c2Bi;6r6)4K*#gV=qSq zo5i+~t67f&Ai&R~>Cdg8CXGKA{_@^vKy9X9K4=-7^t36YchjUY713BXE)ngQ9GfXl zZ*8NiT&a);J;FXOxr4gjqud7nY9lG1lbTf->e*`j_{b;ZZc6|| z*(LuQNZ2Dpc7`n^g3?TFlQJNqcVvNt9IZg2KKfkut0WkQLRB&K#|q2K)%89`+%j!= zm*F(EPx+2=U2JCmwJhU|v8AJxiln_tFZc4s>>0VeMa7?m;T`y%XnO|ln)!@wQ+3US?r+G~g{2hwyRR&BmI_QWxeno(vd$ zSjz70(ZBX~s%{|0DqW%^Lv7p;XR)6W%fxChjEn9zXKJmuyG3>m=<)m2)z`db%t`V_ z$T^4MDtsT@MrPSPJsyat4WaE0@3a5s7hl{4u&m4MDhJKGYaJ-B8gPd zt2aCDBbhz*u$9z55yB4W0v2K0F(71g(qW}2h{>b&*9_AMu~!TgY;G^Mz#Z62QL#V= zW~*K6SBf{1NZM*4`AjnAN21z8)I^+<%WTeSVbtCDn0VdXk#YF7{ z2yvmFxl!sysP#~i5nl)bx0-)UspD`u29{cNj1JRK1h~H>{pD0f;1$Q270E(Y6*fP@ zF9x5-5TM}IiM@d1gIdzz{nUG!I^;$6VFvSw2oib92)dKKKE4KGP$>n7yts72>oR0} zN2?dYJ@RYfDEML-O}G_(JYbLr=Esh1nq~3A#k$6{^9D8LtEq;?u=eF_P~d+o_QN3N z+_N=I@QI@7>)2!V&mQPN>}D6g83FUK;U?{l+rGALVfv$OA`qD-8dp_JMrpy9BvPF5 zsnqwyouH33^B5oEjZF5(RRP5KNAr_-j~AGF=2kYIL>kND`` z-mkSG*Jb$XovnmI#!Ug56TXQgn1T>+3CVV!--d>_|B8YiUU9-0oq0O~#@~iKmYEHFc>htz}u`^sB z9~=P{>Qg2rH$(q=1JeoGy0lz8$d)KVf%wFY~vWDemkYTE7mPDLI9 zVFR4_Rk-p2^q2?D2pYo@(#{^X#uN?I^_(fT%BN8JgKIqM z>SZgG%Q3smdTvmy)h6v#I>FYLw2n3O#d_+jLHjZXm$dgeo$ly1b?4@1BwFmWl9WH4 zvJPH+b3Z`(G8QEErbx0lc;5-xkM-yiYjTB=he7~Yi-pEs<56=0O?O=IPDICkQLg^F zR3=->To>kN_>UvCwy1zw#PrPo5jA24EC;<+G zcHE==4$SSt`D*Q^Ds(78y~O!U+OTMwWJa{m*;L8uWNEI)53Cx??|L}?j-HoSW}Vt| zuum748hk6X=9=-t`+j(hLFT1vWnDwPB9;#-+B5k>?X}h4d*8B)K6bXegZG2{J>w&Y zHm&s)0^xX6hQq{&ceI7=8GryHl<{aT+};xiCYZ#bP+ufu79R$OBC2pNwPDtWV2XtH5>S)BvD1;p()X&Wibk%wc@G>YL?mbk54M-)u)ZZgh^%5CszUiPq4oK_ z?21ArHnZ6FjaD(lzVotVrTy&rN88GlqCL_`1QsghH~db42${%!0R|Q7hSea6fG0O( zQ*S%ThnF$9hgBTbvK4=Rq7EA(thC3lu&7U@#$3a0NYr6rX|`tzzzgCc!`)tSdajA- zeBgWBtWjt$$9x?H)09J9McqcKD>rL){NY6^&}!sF1km;o!3ew-KSdC21=ZdnUuZf6 z@rLQ-J>vI2X*g}h8~}2&dZTXLvu26aOo7RH@k*u;p!vHj0u3$gj@B!|=V#il_XyQH zuiy41_?)Eav(6ee=PFPJX=q$N>AkE%7{@IqN1U6rPJgCFe zhRQeZ+B;>26-V0+rYbVBhVJ&vq1$~xp3P;oc#;>b{1j-d4a&{b%s_9E#Mi~JJ^A)t zYu3KU4FRDSX%B0uDo4Ytp*jBr+s7-(1^tW}M|1qj@Alba%f8~6u}E*CqnE4B#46V- zkZeyFd`PA#MERkzh#?Hcuj!;4>G;u2k?;GQ8B4{ADKX21$~!l3IwcFK>8VQ9S6adw zQD{OlMnwnwqA}N^-}8)UU_PaJ^id!!9(^974zw*J>P!#xch}KLt_4)~bs`nu%+iw{ z&FB@4_krpP@zju#g^Tf`Dq}zUVA>#*nl2l?$iLRtax3=wb?sxQh`c4-9_>*Vm>a77 zd)eX}aDcM-0)vc6M@35dLOuO@d_ZfnlMpAnDAgOTFcWOjp z{oW+R@!VDn3DT4wp8M40sa?dMbD8?l#feE80#mq(Vm99&uxWG4={XezkbGb(4%gbuNHN`oi;>Qq1|+!5iCJbc<`uhj(_;;8_RJd2`vy)k%zKA z!r~L}pwAS%^~j>fC(Rtbxt>FSlS($cNAS*PWUGw#@Xsn}#RV)>=o-U@ zmL0te_0sl#go2*Co~g5CV6|tdfnK}~JnaVYx|FG&cj=+xG{mfZk)i5Bd3O|*Z;452 z(bzSja9`o%P@Vb?`Er7)rKEXnoJ@3C!?Ly=yEm%}6~kBM-GP4`ULVpPw<)#?Nh-9q zU5NecZObDl?7;p^=qMDnK0s{0Jn;N%&OT$%tfgT>FlY~D80(3!u7;d=WpqC> zYn7kb&3~=2^%$u`{J<3%yrWqT9J3Q~~-xS?1=EN06cF6G0DSE5dal8=qG8xgddsO>vD zFWv7h`>yoFoD8>@qDC~am|jzjp6SNzBz~M~%Zm{Z2TyH4)V^j;P#By!c1K?Ey5boe zPTwPq=9*(@v(CrFg`o$Rlw5aoLdQBk2Xml0dG=n5x_Z-!rd)$82IgEvqUw|TJS`Az z_$X9^iF#wHrR<9}I}#b4e4>$iqb-J^tfoF4yi>NpetaKmVM>4W_>vX*sp{g*3?*r4 zwWDKg7}Gl3F?P6kWuNZ(#fq3Kl3Dt=JU%q)evgAu2b00^e;q|S`o1T?dsDZ%RqNi= zq{3&-k5!!)dC9cz>TWG7P>co&>*k7d(|DZYgmd(HIm)~}dL*n#pa|$#B?P)t(Xp{n zKx7bnKi&XX)|~Ni^6UKT!K-`k^gf<2ObSSqI{nl2c9~eycJMv)7pKX5RE>5!_OI;s zj9QMSYa^atJn?&TjWEm*S59{7!>SGS(CzSo&@mdqkz=*G$$DPz*pDnk^Kct4mMC>N zKNr0;{&CAaMxE4e817DL!YJP1bauv!wU5!sAKb~-jZ*CYjx^{6YG2VSf-yx%=SORAUec}NeEtHocUSp&pc_?D^|mun zp!EVsVC_n`7}R;4|~Aa`4>aG*n(V;ps+uP2nc`v!0LCt{p$*_gH~62 zLp_hJEBqDDV{8dLgw_%!lClVGqnYKc1s!nxf_z4f&ilGD?86Wjb4CvfMi+D1U+jm& z?_~4dMl;k^Bv0!{TPxZOk?OH{pb;Qo9Jh`s6(Ile;)`eTLy%A7W`90*IO=g_+~zuR z%n*OP;(B!TizrE_LN2M`^|y=61S2g1`Ua(*B=YA%fO^78(gxyaN$ZfZ7BiS_jj z%ds30T${K*kC*q}Iymr)u^r{@$abRDYCfNwn;@Poz1HmwUu&jV`FKOD7au=l7dcl? zq{9%e2E8|smy?StD3EGNpraSitKoWHSXZYzIHXWmULd8Rkz_=}Bq1TSw6->E zYVs^Bs#MKVN!>k@d&9ghhZHZDYyAgN;MX-cUe|dx9rP){Z)MI628PzuSRau;X&IXy zJO8S6O#j6BPa~M@-t%Sa4)M~)8_M&XOS7%3qn;E?_j+5{?`&C=5$|K$Js9+TYN|TJ z9<=6w$NB6>s+|jERmNFM+2sigBOJQDA^7Euu^V}Vhut?lhFJd3kCdncRm4SM7@}4P zFf|;X(WaT31rahxw+)xf$;YqdhuweH2?-r)+Ro^^5Zr&(zwaZ{$MuTm^?GUl(}HB% zsbYWIQtZT_^6tFlW*hD8}*lT>g? z4|DKfuSUBhh00F<_!UYgBI{eZZr^sV6Q_1+=bE$zDusye%;EMrtZvrkXOrR(OBrK#V2pG3DiRvZ1(f7O&8P8kO-&| z3EcerynR$w?mK+lR^NO$Jj%0&GzlhE&>+IUtU^U(M&~P+=zNKV$>*{Hw#to06W)DW zl8}?bM((z?vm^gjzS`Z=(lP=KH(+~v+mfX6-XC%I5FA&s`_`dxNr*k|WdZ_*wSr$~ zv~u+cHAWl)Mx1yWdXNzm|Fer&xh^Ijl}t#VydS7RlA1h{?!Hp&T2(_=pUHtN)RzT$ zX>ex3JtjFAJRzS|LHl<`Ze)n?-}HX!+l87<#F*9pwQf`lHE4C))UzesF^jLByKmnn zBqp-DHwwsft7{n2(MwAwWM{KZJ%7%{$@$Cz=o8}-3^{}jkFX27(D&Nzckjzn>!7Pa z@tH+NT!87uiNC_jwYTsVQ-@aPpj`q_Xpp6*rSq2)X3}v@_CzF` zipIul)|;(doC5SOAP_E0#L%{n85uHR#IEzK<;dTCwxyBsfB|HR!)t}%dZ6}~#Rq02 zLW#*Yd$vl25!e0;m~VAFX)qX^euDlWRyX((sE&l#k~^a*^EZOwQxiu*gipjHm&mq! z2R}+AdMX2zG3I*VamklbZloB18k`7c3|*#ay+fW{o?=eKvl|{A8Az}Qua*s*z#o3T z2M8Ab!e|)vuUMqulkj%^FR=i6jc$3mG~XX23s;06sPhHz(TV*JhY}*&12Rf>y1!aO z=K!=ei~Ls_rpG;fee&`S)!fr_^2*N17)1#QS#&TMY!VGo)}YUboQxvHJxEQ@QLtzK z0<~FT_#^032tqJeeJa`d?@Fam;DfnBg2DUl_OT#2Q%^wr^Zk*)RFvF;;FFM}76v{- z$GxOXRaondnSeTC7nUv<|5gX{jNhl{jB1klYPTr3cFOg>(&HT;Js zod5;|5nggNWC{ig$@F0X77ok{NeK|ng*eB->;FUwrnVkB*GJAnm{ehX9vTz95p$6IxfRmN_s?b>bU)qgwZ|j&MYk*&K4WK2 zZgsBLFg9i~j(z$0b5Y?}U-1Q@qk-SQgP=>ciqq-I)QDw(sJoa%Iy~UM1p(u!|51Zy z4TlhWl}4mHH8b;24gVx_ZL1CESO5Z`0v8!-0eb2CRaGDAU}@>zM#tBUQe)awL0Tf7 z%?3x<(Xy)f^8^n%45J5jV30FqFc^Q(d(#5u? ziLPuBbIMc(`6L;&+))ZL9!*4~q>}CG4D~bG8tTRjG4!EPQBm@$CLhnwe+_kS7Pvi= z#8fV-A{qh=vg_2S8}sk>Qo<+uxtH8nLJnzSqFa_lJLA$Ax*->gV3&MJRm6s=~<`;U51nAFzM@U9w2FL#uyKqSR@9|=#=nnem00)Qf z+po-^vIm4OV)J@q;mpk)TT%6 zYi$YKvP|^=+tzJ(&s#|r49;{~Q-4s$IN^BsR0-@E`4b8p?==$UiG7Cwii3#5L`Y4| zLA~ywZZ;Z5fvL9oix;g2iw1U`#RWx$gTn_|OKnqZ*?9I!Dk|X%gm!%&w%D0ETIO|!d8IU>*!SVpUm-su#Dc@YmJ89+AxTdeC-3_-0ozu`XdCvbDw_RDB4)==g{`lL?PpE{E2agh5y|Ow;B)#fu>p z9!ge%cKYR3<)b%(Ie ztH^-MUqEnq0BF@sqc5a~Cets`z$SpPR3n={sX` zw#F;HxE7oJ9G&@DcKh+W?gmkHX(JDjrb-ZyO!>+S-09fPXf!|j)Q5Ob4r-w)zm^OO z_aDtkGrHTZ85^=5qjVTm4z6d{{XL5DGa^4JiKyf$bMo^sQC8wD%k`eY%%c_2M*H2; z^IsQ{eH-815nB>Kv{67L`nNmiMnFVkIp_+-F~9V#b>_;@YDC-huZgmw^}KeM>JtF=H>yLuU-%NZ!-wEY{t>i zGY+r>$$wpIaVWcpQ5qYT;sZ6rfOLRR-cgD4*B1R|(2J25hP#uL9>sPzBd=jtu#_zJ z8k&USM^=_|B$-4xi)AVzNzlY)WwDrCZO?68skS{uK?#<4)>WF$wsHLP_ra%@SdM3B zzvw3#SsDIrPyj6=!DT;=wOEV{cpbkU%?Ga|DQQaX@R>(zP|fZeG{w}20WbTnw$zA9c{qZMALWPWhD;P{|`e(f(E zlnTgyZEI}uVQ5~)Do{u7`FxNP?W;k|Uh3)ut>QdMhnvkRH=}AW6NAom<{_QG8o~S` zR24XTR@t98Cd`Tf!^mS1w6?4;og7^IFw`it%*D?M$ssfFBjP<_N&9Osriy_1&l520 zXGyJvI9~_wJmBFI{PAFnA^S|SClvAN1J4{R5Gb$)EHgv39X`(YhW>2852nm{^fmgl zhU=~MJhSKidwLNO}fWt{Y!(&5U`={Nmy10bzy? zv1UUE9WPc8NZxWtDJXpq1k1zS5WW-uHqiH2DgX%bAB)99M5B788WS~iJ6!I@ffuvA zXU9UfPmLv<%e>A%o<8kQ4Y?MCtUi6lMv%E|8w6%rCHt6$_cFu#amQbDVOGE@aEm#6cT`ISrTr0<8yH5D* zmb|36G=V6}{ZcC4ud6IZ8U0X5ScLsDq}P(j;NLrh7QRE~nPZCygTb+WU9oVm>IY(x zXy5uUxOAR1tU4Cv^j2P&stCU~q$}MTSf9vO)%4FjA3@(yj$5X9*h{qB>G@hjEO^x8fDy;LUnQWu`% zmHSLZ9vs<8i9O8`}f7-R4mDwG{VUer9H$<{NNJmFUw$|%Zq$=-YoWoC})%4xNfX$?p z?Rjl2o}Eg`9mh!LtxcE5$d&)0&CX^g7;J9`x5D?Nf@km&* z++l>1^K~X%T+c0WNw~Uu4m+4tejVuD7@%QnV$JhOLkO{i?H$-bO9vfU zCB+%bFtJXzu69%ujclU3`}!13Oul6a`KmX0-mqvW>I8yZQ~>M9uH8s}&`ln_X#w_i z?Kd*tHby<54zLuibEAz5H?@lxPe=Wc(V8EL9I!De4>U#Tj zV(q;3=h+IruW|Tg!Qk)#HH|bh0@=3 zQ;>0F9`1q4Flj&7Iu;Fx3bCgCxvzBbXlxwi6DYk9m*yzGoWVF&UjEP=iFs6N)iPfS z`arALRY(z(e2|x7WdRWaxBx!eLL+gi9oGmak1<;rt|vR%T-Kq8H#JDSBfi2 zQUY0(HH`FVoX)T&zt6CevKhsHZ**584a%7xv{wwreN2-qp+JuQKPVRfC?x~` z)qvhI{tN(~aJ;%gz6O|+kx6VlS2N(ZCZue?dwzPq6V2$?1ikAe%A%<~J} z!A~P3Q(p7G`)Pq0zq%lOulRt(9|JZN6!KgVSWy@y@OQV0N$p=9i6a?60Agg8UvHZQ zNR_6D%O6-2KWX@mjE^zpk=pq4xu|FW1_>?1SdYGKF(jv;iZ`fmEhua53sRwBAo!Po zR>%Caeg4DP_`iWmuI`d!QTFdVs*HeVTc_%#jRA3Un6iESL7gnJex2Au&ho=A-vC^! zH#8!!XXk3)ZR#D zO$ORuYxsZy%YfN*m5OwEl$^-`?+h1qKTV?$ou}Qa<>cU?6T2T6gL4Zhsi_#@AQpLG z`HC)B%+e3avVtqC5m{FlSkyGYsX+FclCU50j(K|cqA)n7Q#FBx=yeu=_5mVi`yPBz z9=JU&ck3G)^o&A^INW>#;Ty8_04?3i$gnlyx{{ceXXenjT#X%8@fA*?uzY7NCwef( zG`J;iUjrqlcPluxYM}xZh!m`@^oW?9W}d8I18+ax(2@3?{|F*@HmEm0m=cs^MCz# zn&R0KI+L-L%ELtbfn|rat3<9bG1Ak^8`;!Th`NctdtcgZTdUaD%GNlwLIZ*1ufsen z(r_|uiQ!8sWYoodP(3rCvo3|!jwWDyDP%y_pYlk*qdpj{INV6%xL?EpXn@9VnD)WE zXd{4G;LjM9A29isMmTP?sJ}FTI5>C~6n!Hwf=hTVXKh< z$x?{4P{<5m9bvk_ETpXGs@EUBlYqN`xOP-#15CaE>69xtwF1ls4o7I~cXW>dUP-{= zpz6TRTAVET135S|E|$$GrR^TEdXe%`c4wvBJlse9XXA9jZOneB>K!mVK47uYVF$cA z8Gr4MIt=&@op#CemGYVlM=_V`!&>Fwj)3lxYCi`^e?xKV`eFH@h16oI6fyJymlM)& zTbCJln~fg!fFwKw$3b5EKTIAUj@QtC(&@wlD*FVVi28ER;KLGv`~YFm_)+xJ0uQBA z1~_8)Z}70;Dhn}=I^>0icxCOvERVecfLjfpYi4m>SlDW^DHc4)uTMM|XajEnt4>nl^)RDqiJX_aY z8oRd~Bhd`Jk9$485*mC3wKDM{y1lqSbUdL%`Q%)FtR*1v`93{G1Qnw$kK zF?|1M=XOi|U5GeRJlu)N?Xk`#146|EeNc*zt_~)5Esx>D#5|?19OnZrtd>XWWe`$+ zmaa$eF%CL4)KhUL@xB*)*+;oOp8ypZdL+?g(bN+6pmhqk*3mAElH}KV*;Zj14_c4I zSE~*|3wQ)%>MWxpLj;{-<O)rA!_UQo+2TM7XciF#IWRV@H&;3ec30Ruig?V zRt(+s{E<#BY+M+cgnHINc;gtA!kE?D3ekG(F%byB!Rk0PC=!Uq;kf_+_8p^fkDA*X_QgT)xh_zxzu-2 z1n;#Q?9$ledL{q3dS+l|z&-Pk^5`H@1GCvJ_PmXOyU2rr58zJ6&>VRA$KZ|5!<%L zA{J1hc*ZZ=@OI>&ivd$Mc2$l}n40BtIOv{$f3YRzx$;=oq&UV2kd zr`&YwcMW)yIz}3uZ#&Ab%O*1rBDvWx;Arw#=cg!Q_PIh&>1X{gJ{(Hxl+p-Hht9m* z=1SFtg=2YDyN_96+B2W=SKYILEua@B>rsvY`qWt z-AkX&qm?67O7{ww|2;=I1kpJppN;%$C>olYg{2KLId0cU(|p`=D4p)xo7<1o-KbA- zWvLW()wu0UxXc|Ot7##A$h40C!mU;RABhijRS+T!$hzGH4se2~!`WOhE78`BNvyg# zd6#jAN;XTbH!k>MySGVRjZ};Y%4)Cg;SC5$2vhZ2Xv6z)e z{_*f1;MVJ;GcCm0*O*&2x0o;%(#JgSTU*1?+*T*qE}`GFH=7EDc{`nHPZWw6RLfU zZpwHp5WqnW#N%G?4Htt@!*Ac2^7Ad$b@dZ0L(e^qT4l`T%E{7weg8qu2`cDZ-@ z`nvmsrJc<(oZ$;Xv>UZpzndeTkpA0t@Zbn#n!FqnfI#Bt-Hdeo@f&@c7wld*IKGU? z2}Lu{t0h_-usWj~+SFm~;er3w4B+ChnJ;=t_9WMONvL5&|M(<=@zD2*=#i7Il?GWc z^u_#=`d;&xn$;14w!;@+Bl{#WN2;8qqKL|IPq9wVHh)iaIg*v-YG`P_va*s9ZE}-7 za&{TI?F?`e*d^lmff~)ej8wM%?y1i0 z13aWYhkHp8rxZCLMj0aY(9@r8*?B4F`0monD=9s)H6t1DMoHA+jpFffuQ2+&b7%-M zi}x|(c>o4p@Ss*@2UIWqLtP;tva=kbH39Vy7nPLOAU0IPw320@QM#mEQ|5w-PJcXbbIKq6!^CF?&Nl zTWtl-vSIcHo-dm>JcMu|cwR9I4L)STu{LalO`HrgPI5wixmx zxG5S+^4hXthquA$zH2E#d>p;_OcLq9+Nq{?b0D#=u*BgB1$n|Nb4LYkufh6#z8K)P9-Py$sPpP{?ibA;;Dg27*42Do_`LQp{N28dP=Ist#lF=~M|W*<_{; z{2E$!Zf>XPwU!OIX0_Okg~a9LFj$5uw%GkJ{vJuJ3A7V%3Gy;5x89-WP10yiJzs~d z{$SLU!jqF%PJYhbM*ZWK^czjOo*usXj;Yq<#s%;m$2u>!B7>~!8-Rj)unH1t0I{M7 z`fI~8G#*4}hvC7|ls~&Se)N;2-_E(qyhFuFHCVAbOrn9>7U#44D=GzL!ewye zZ>7Ch%G`l{-2eGNYwU}d%AwHEcMa6)|{CZbfq{le*E@|@_O#-}!G zvza`iU#Urju3x>1Fe`3QiGKY6LqUnabUF%#S^$+uN&~$_Dls|yY=2I_-Pk;1WyaF3 zPGQ|qc>QgOk|I?)bgBk8t@W^_%|n6T;m^(iU|lz~y6G==?ExL|Hb>#c^e;^-5q))h zuWazk1CPy8ZTki|4BOXQAL&Md0ZJ2BP>9exyt@~Ise8sUinFQaEpF7i>sTRHf| z#_*UBx2gIMRD`dBypD$Ks7KEy#I3;b?jw+MRd8qF(g9UO|8?!(+Pyf^1U%9Exv$v} z1~QKqmo)!$yI1M0Y3y-j36PuN(xCl?B_UB(z9uwFFDtWUhogs>5GT$L2je(<%}*0M zqm9}({vi<%>8m*S*t?EO?e;8@+>+%Q(EOO5`gz$FTVi1Ht@j zi{HIYPY}v!Ue5S+j`_8ntK!bMTY0|e%|9Fo+y`NO=yWLse2~i<*aOYrZ%U9R9hTG< z^Tm_|U){aT&0_O(5wI++${rcZGe@UQam7S<>Ix8`KzEWf1^NqzyKUA+myHx4UDj+d zi?8gQYr9jvO1AT!qOHg9<@vl#x@9-EjP5I~i~M(gArioA=)ZY@{Thaf^w|6i%@_7! zVALv&$k(^+$HFs8WQ%(v+lM*IQCq|13%<@KR)YI}7}LWRZ3psk3lYt~O&U4Q=-mKm zK(J1>v-wKV+lUoJ!Kx92$7K7}z#83odQOZQp3mEvs->j-BqJQn$p?Pv{jc^80GEin z!4r7ndzNg#nQ;J*o9~bRFGlbGzvE>!=K>v`Ap(UEpjfCV?Vb*#z;Tla<{RzRQ0P-a zLV#kJV_z0&?G5hoU=6!}47B;Q#lm}40zDsm*c!Y<>2_5MI3WLaz{^@dWdFB%UIIO5 z>8oCkQOT<+Cf?o(LzaqxVjoZ|lMl8$0zifm@G61+`LuJ~M+5!+#r&(Cd28Bf0jj`u zy@>jMJB@e=aY}wnEX*js|Hau`MnxHRf1`>ZB_$3ubP7l}(kYE}w;(AsbVxT!H`3h_ zLw6(H-Q5jCyf@GDe^0D+&WCfpvRE*4-}~Cv-oMyebcyRS?oR@}e7=lCZ|^rN50Rc8 zfUqgwOVY&Fqhi&KBu}mXhvW%3P#rHg*y*|13oq>h069GpkpQ@7(n0Y*Pw55Q zae?eT1 zU}ff}?6h4;OiX2kg@ti8*urOq0bd^jP<37LLH~;C(!AVfRncuB2dLW6GlAH|IR0;u^nYb! z;a(Tc2XB`vD=PSFx5OecqXx23}G(Obz zMkvw|Q><$McqsZSG8=@Kr>XqE^?CpQ-^x!af3W*BJKfMo2=I_6a6P~f`1jb@xzGYd z0M`EI-KppQwI2l8!JMOzPf+gZp$QMpuB%&t+Cz01&z@s)f{hRK5&zh3fQxZU9^cem z@i{r?JyBgy>F=!-boMf2*lrl(c>K>x^Llw{tr#x}#%Bqexg$dGIn#tfB`DC?<~p=s}>&{%ryU79!$&0r;O6L63kKq21Zp`jyLS!DW8v5o==n} zWtiAG1q)7=FGL?_1w^7{W+6ke0~(hB$Kzx~5177(p2 z@PzbU00R$l4}koKk({N(WL%Tr>>_}4&nYFxFb)pVuM2$-Y`Xk#w(j{n+2j~G+@IA6 zI+q7N)n=cjK_XH?uqY9?lClyd2Zwmo-@oBtNlmE`K;i9%|460XG<>X^2{lllKH|@(A2{t-n0lS9XOIW^08J!OgiNWf5(0MHnh&*9Qf_Lsn+B{LY+M+T)D0+%r}U$f2;Cvblg?iE*n1W~ z5(XN0=Vm59g=hrilSihgGlHXrW&YfisHn_*dB3P8l2k&y7#y}hG1Yyir23ma$((k* z?L=Xx4+?-pLGNWW2FH;HMIl?!DN)p(8_MH6e1;v=TV{EKKKrc3qxOy79~gms-ZlQ- z(Htce8r=Uk0>dYf^0)ul!pYO{4=GcLz?__X8B;GG6WkA9P_7~JRCxVw#=J(F8_&nw zPX<1TJ>=`T=%Iv$b_cSo9v#elb2AdLxH*cUN%xeuzqs)G8X&oC4q6LD>6EemyD20` zyZEX3{HuF877Bc4Gb_lrC2!z8?NER0W|zwg2A4i2MIm3##1Q*1#QwGNzIn}Vk2vYQ z878itiGlDJT`8Xrre&hBoUHovGEj1Hkx zV6U+Me7_&3(BEYX=%zee8nv&5Mzdm)nMf=-$s_gkEZKa~X$UJ5U-B+#@=J3f*W6$G zTj=opDJs{v`qE>xivOP&)U&rZB8Fg+69*h5%1obhoBGps*to+@8N1NOr-6j!pV|5- zVz5C8Xr?bZtRsui{odSle+WOg*YD(2RjsEQmJOu=VQp)bhJa^De=yF|L)xH3HRf(* z1q#Igs{LkeXGE4UA&71fA1~_KhvhJTAf#C}8kr?v*dZ;*Wm9YCC)S6OZ#cm>5(Uu- zR1sUBJ~Im7`d%o-7G{Nn)QjW$ zlbTpd`%pww&8h2Ass_|Y`cs7B5S&LUS`SaMm0rQDJv1|Lanec?9UiF+T&hN^nIBkb(Y3s*l9&GggMa*W`$P zSJsz_tDi9BOP)joj*q-J3B`4SOa=Xt>3;Hi&BTR?FOPu{Jgt9(736N?V5Z&pTU_K2%zMrP^(d=f^q1TFi5=u6P`CRI{{?3ZOhypL z^MNlJ9ciPBOSR(uvbh>iio!e2{Ix)yh;Dtfv`0&CdWyc{Us|u_Yi#HJj!NivHguxM zTqWdSHf1w$zVm!1IJh}m zkm_|t#ShiO)RkN6k9s|AeO`uJ!!tlra;Wz5g~JPziDNefMv=4^ItKI))4HEZaoE&pRp;# zAl$%^4LH+A{y^2jGCpQSjV#9FgBSpwUvvqdQzC zSq4yi@9SxC3KS&A?-HPQge43yJ6Z&o#NXzilGVmK8*O;DKQyD*v(aT3F>u7>z_`I) z!C;-&INyrDi|Rhe*G=O0hEP^}F4t1BX)I=b>lGzT59INcom3U4vzXX$}1b9|(* zZJaf?_({5fCx(@rk0Lz0blmVKZo06nS}3y3u%c+R?z=1kXabe8s1)1X)NaE-{<t*@su6{^aLCTJ!}m z-#^FX;-?2!u6c0m@HOY%f#9QZ=bp^UeQgMRntzigkR`~{@BRwji{cXz#>Qt$ZtW>F zecV!=YNU12p3#zn+U2x}$g`_Ry``@Dar3LK0V;{Z++M308icJvn0M{yYiF&bo(z9U zlj{ACa!;-GPXmhlQr_e@izANYKVEsQJ{I{8(3~Ahfn-NG7i&F?MzvON?y*!7q_w~@ z%1MG%)efsVL|z(E>sBr%y16Ccv?kmOsq*qld^+9_e0N29=AH za1`c@woqUw!miS56VqVDH>SZLc|aGD(#=#}BLl2_i6yh@?GLml^o4cr4mCYoo?9pR z46d3Q2f`p7ZKlO*GLAZ#Gv;3VR(1uoI_dn1KYHHod)eU{YPw;0iFIc0Ceo6uNr#dp ztK&u!LhTABdR)WX%ND`2lMrKiVBke@~{>SD6HUb zU?i;iiC{RlzUTuZ*?vc&$^JbC$x`eYzJI9LbBP?U{6s<|GM6#bcrDP2Qu`C6+q(f&`wG@k^LF7I zM^i`{xK+BVXknp?!wjt5ltyTKMCIN|*a$=IYRulHRRg0mngzAADQWgYPs|G5{8@SS z6O6sP3xM_B1_JJe19*16p!uuqtu1L`uXHSjP2*y8qW)X=QaE&e8olSh0~{u_tIAiB zkpZef=qpaIZHQWoIgviAG-Z10dtwuS>sq8xAJ9wX_52;+HViw^1iLq@9s6k+<8?~> zWwah2PrYlGj`-ASn|~os%9xEv!+Du`T{W)60ZXqTbDww)&nH^%z~;?Ps^gV#3c6g$ z7$iMBEi0Q48brfh>5hm`+?|9SMb+{9N)J68$n_ITcwQP}|*yIh*Zlt#V!A?>){Y73CO) zO39nx6`1-{*71)Y`mNME%O1)-5`nokD*|`-KfEyh1egwG##Ln5c7`CJct5stIQ%F# z_M!C09D|vHFu9qXG(LNcp8Z^QXk2Wu>(+Yhvpkb;IFx~LfAyrjGbW8mxA{?Q4@NI- z^4{pt*=CW$kdz*aU{g_!hwv?%$tyaZ-266G(N>{B01IueC*zsEj4eR z?MCyD!%|sDN!FE8d&sml5&Ps8IT_h-xTfRK#XUA6C3xf0=Q3|pxX`jFDZ4U!Tyufs zNKrmu!deZ_jp+$9A)}jkZ|GCbw_JnNT!^&rV|980D-S@MLE2lP}-Y-nY~7ZL^DKfW*O4?SAr_lRiaKZ3fy|CMB1K8h*6 zxtB|t$B;_woMMTM&xDNICD+OvWL}-$j5q~==?KTpROoP^l*YxfH6v)=o5c?#sUKCJ zc&R7uO>zv037;og##yqlAG222UPw*L7fF!T6GoGH)7L9GBks9i^;d;r}7|8O3Jb z`tJlQ$1FWtwy04`k_i9VE2>sZjA`jg=}eJvmf5M-HalAw-z+j_Qp*)&l-T}KH9}=A zex=67zFU!g^Y}G=_ejjkv#J{U>I{+i;ll?RVMys_f@-D?C|M)lPn2%4O=v?os3@16 zW~pGA3Gz#-cl7ct9%3dQ@ALFR9Cfh@8iorhZ$l;;f$UP#gr6 z*v`X>k0h+@KE(WVmqBGgPNwZo?3-YUmp9nI;}6#KK)!D9I_si|WH-9f4hS(XsZ6EE zGUgGa?~E-L35#sE!%s?z$vTwf36_#f!<*a;$eyV=Caa(3FfgJ>@w@#cKfS+snDoXy z7w<~xbue{W4p@k&yxj(B<~ShRvv2pvWkPLT30Fp}*3LVYzt%R1;$myBMyE)U=IEJf zOM#1>PLNVxmh+0G(5$`PoSF-Au5{Am*irSvV_pOG#^?2aNVosds*p{;xJ&8biD?#3 zccOy3Wdc-Hsjad#Z>u|5+Jb(xB1lHu0Kzz_!Km!>yK?VN{jNuAb;(AL+u;TKx*AoK zV=w37|2+#JRA$q;<@s^SPWO8ck=h5F-R7#m^HFzmkazj8&cJ1suFdtk!MI^Bit}mr z8!ma0sQGmdb1-4RY{rcL!f9tIZGVCS;WAAUCRS?m1OsOWciz47Y<#fOk;hKBq?^ti!lJ)TGyW(VWl8r)x zF~eMK|9%Y04no1@B^$NnUOFf2p-C=tyh=G6C0rEel%W%NewYXv;?D8*=;5|;{B_?E z^c@BXhcwg=hZ{N`X7wLkC7#WLf{#A0ZN5%DPs&H{pw0fil_um zPiGOGmjsP=QB5I=OerDXh^^RefTl#`h4CA$ME@cMC|}?y*Z_>Y0_nA9+g2d3_!Gm+ z+#iF!!Oih%&9A|vU_u+h62Z~X!JkkQt4 z)hAhnzS24`IJ=;umaw1^&ra)9PWI<*Gkw; z0DArzrh&y-q_@}tJLvoh2gMkBMOu;4JpR;$#pD=|pB8B+J0eDi%VRv=aa-Xn>iWb; z?DX|8e}vJWZyJ2_*%T6AW?`jBXu!;#sJ|w&S}g!X!QAmfA@IbKLeCN~JqzT0Zw$oO zvN+$`k;&=lm02MvNoxzeoY=kNq)ik3D399r&;)svLKz=;tQ3k@WbTGdCS2 z94XpDOs;q-JzDsHZQ+M&YL2O@+hQSrX^&8id9YHqi z(sIweLHqSfwp;!uZrRBORJbN%suIx@9Yp1^hquhh0EKRA|_KI2w+>!w&kxH*Mk%E_yS5 zl5=-l9$!pVY+dd(bLo;*+4u-Ofs9{$T4%4jjxeA~nc()EGZx?9m#(xod0p{mH@u6wlZWZRcIzx81Hc3&|t3-IroRn z%|!RMBem6|KM#NLm3LhZM?{Y5c(_eb(HMTOgc)8?O`ZcoitizK+hv zXb{kZ+YqtsKmM({SZXzH^10dX$Tt)aXwwj#P*49%%^{9yBgCC~bG7l8vR}H{sZmy6fM&fmv3#O^?*i7dtkdD8bBMM_FR(%n-Y zMZ4b1(dEn2q2S{Rs~{K6)YaAb09cv3MLXg=}L7Zf2u-preh9qYAPEl zQJjz(8RJO_A7&ijRueGaji$MYm%$%S3fd4`IHgq6CX?szni;5IEh%hjLlOwg+upL0 z6jZCK-*Tj|a<&sr#|T@$&X z5t4f}iTuw9s>cz(EkkGJ1QMYifWie~qxwvbI5F;dmTD2d}hzj{4ch!a0} z|Dyw)EH_>-BF<4$<4j#WmO>oUSvK>DgiQXbZ>ZO)H_!J0<3&BG5ia!L@~3O$PVH8! z#G>RsRtBr2pUaJL@gGtu$JH3e5!866`xrk(>-bwwBB(7$3Bnp%;|6zz$tR7g2wm5a z?T?7mme4IK+WFe`f>YSntsyJl z%jh`P-mAVkt0U1%s230N*qh51SnDa;=;7|*xS!DD23jXu5`Q$>^A?mQGQRRQJfSog z!9Zwu-v(b7@n5KZhU1x|l^pDE|YQl{7|NYq>G(5uHSS zbF2JsAb5u`ceF3Qy z$dUS!VMbprH5n0dO5bowy@AI?uGj}3wOB@$3)$%cFe-9$R&lkbHLsHR(|JdraOvjYtH&-3r3A`7|^l zW8Ep>dKac2TQxxU+-q9g5pjUa)Tb?Yjm#x*H#gGXZ2;D;Std5F!v zEut~@)BbvGtK+c`cJ!F1NB4@>|BDG=-2CVLAtubU1FQHDT@@rl1y4foSxX#m2G%nq zmO<=J08y?4){YBPaE>_@GUsYBM6KyLq3xg>QKf|nIkH|0iDw=nDuey&w94JH!J-+~ zg~l%LUy_S|uu!C@7OO5vxe@x;%1;3F2FP*b+o0X;XH0K4&_F+Oj2<#?Jhg$Gve3%X z5n%!)BX(Vv8e{49Ggk}%pR`Z_i)N!2A3W}Ao}av#wHdfR^oMq!fvguhJD*XHkUZhW z{2C++4m!r}rFj%}O}kJD;wvppL|RTS*MPc#5ppSw-Vwk1=8*!jg{d?|uF^+@y)G8; zdcWu^TwQo0=Gy`!p_ugYH8mCPEMF|pt3@r)>+g6yZ=o7|HLYqW%<^ApemfxbXWhWO z)&fHjCXYnLL7c%OGNgpueu^=4yomv@m0!z^Rl}a;C>zBz*Hc2IEtNMAU`P{Zv2A7* zvw}d-DUH-enQol@XcoB2fU0p`lApF~ANF&P-wTRsvztgWi1emf6>w%DmmYlP;*}+v zzh<+Q`ZU}x0+x^k=aE^=%DcVI)VCo0Ib+M|OgcYW@w-7$bV*Lnd;RBRhVH&gmWPd~ zNfl_VC&<~2*~@VNSAi(raVW$hoi1{(Gf}yff}lf5oOz^8Q?xhnWUHL=>L7pa`N>iX-_Z!Hc`?Fv{%6TbEl8k<8}bu1N@7sMc5x4UIN&V-l}c` zg91F=+Y9sO;L7L=e!F-!w<7>ruHYq{bg+MXN@2W)pF# zh-J<=dEBC(%SOfgxvN4B%OZa#r*(X|TcPvZy%L71b{nMUA@`o;)lsuuKY)kZW}Qu5 z+;rCNa$I2B+Tf9}kf~LLNmKDKED=upX2i!-+Wo28nX~)!u$dU{yn+oDsV*?cIong< zQvnu;O6wdH4wKR*&GpoaE(ttHU8uD8VTwR=wl)dS5#l(WeswmW0WdO={6nVFrO%8i z&?H;0L&r3ZQRAXh(my!|=E)U&z$Lappy2 z>hDqDJ{|O-%D$hTmZeoeyI)8&_hHKW&KRGB$TMf7Ck|tz|Fhs@;U^x#^ZA6e&OH^Ac?@DZ_ zu0{Gg(TA-UtxK&1O9xTL-X;n0=*Ti z^4{6Jise|rypu&5F}xG8LVV-l+#?nzu(2gCw!M0c^$(CMXh6siJ*Hv7tL{G*70E}1 zJr>-qIVlagZ5+J98evj>xEMzqH=-wPRrRRFGxlRG6sxL1iVPEpzaJYfN+sHSiV}19 zes!XWIcuvAo+otv#~iK^)n)~QRH8X*S6Y<(2grFTJpKy6E@`E-Aa)D;0d7pi!{F{I zjio=o;+~<1i_&heKhIK(>5pyP9)tpbeE9wX7^;8Y*mxWyP5YC1lM9QE3je}Yo57g= z%4L!Vz-^$U9%{nkxLxD-ddjR_6AYNvP4H$&&H3teNN9~`n!&iT1+fg=Hiu%+%uL)r z0Uw2zKK5WKiHQ?gc2*X+cb_$@VkVk>Vd@aKZ~-B9&3Ua!2zI^wA*#q+yAPj5Ca!{% zMMkBHbgoXfD0GYKZQ+Z#wq^Y9fRO9bz1X4LiDnzV@oo4<5DE^vM=&)cbF^yeOc6*p zWg!YDm%19ZzR^I8r&Yyh_kpJJS1jqH|1E+zGNq+ze zAy4h|wX0J+^9$v{vC|1ay~Cull7vR7Yti~ybIAo`K}Hk}1IylOq*M=SpFB*)Rw{@S zxO~rAldDDt{R_%{npL(`xY3;3$PA>uSVf3ar$L7-YNRG{UR`A@YdNFUWXa>(DKZGk zL)WIKh6G{m!6Fh=Jp7$db4rTHe8Ey7DjP{Jf@LaNj(`3T+Omb6XYP^(MN}>U*9z$Y zd$u9EjY0kj1j6*W(I*_Jb+u4aRHX12LkVZgI7eX1f~}SiI^V}dMe*m8=XR2T2R`*R z1bAjPG9Nt3(~cyw&48WsIkmwnE(#(>MNI?*B((VEZwKpzA$E7YB#*h5i_P@8Akg`} zy0kLtmnp{(2q zgr()t8<^jB2g(PLj_g1&Ms#i58p@0#!d7eD7{h|PR^6NX{`EgbwFLfU+APi-#BA|Le}vND?|o5sX?sNGQ<}pN{xX zxg|r2e3Q`%``k*kXStnD>>M?mlxs9hN5Q3D#d7>5@TYNcB$%Y-B3{Sk+0#x0smwTJ zrsW|Ht@~=Rk)EXGv3Ak2kpeU|b)L5JNTNQ1{14g*)BZD+n>azqK#>BlqDdPft@mh8U!l9%t7&W1Zh2-9)+>C-Y0qK!Jmm? z?>BR*NPiP9!`F8q6&P)*KBB{Mg+nJxR(WM4x#Vaw{AV&ml!%>uk7HjYQ~pB=GS@k? zlPiLuI-O!9it@1NE(=OsTTre_c(w{&mJtD(W|pC6N$g zXDz87a*?g2{wTk@!-hHcyh>yCIA;f#I5GdnwO^~v2Mm3p>bU?A*AiJFb#Hm}%f8jL z6jsF7{&`{__c`>oiDlQ_ml!GbN15psux!2u$2@7Pf4e=lrY%`U?G4+hq$4#ZLIK$< zdOhQ^Vzi5O#*D20<+t7YE}3LgXvIT5h4`!V^K&~<{t_d$XBw;RP9XQT85J4wRiJUO zW8x}K@GMDDmY z-~`MVErzhEX&3!LAIJ{81I@TUxS{Cq57SbhHG|h5HDyjULH;EjvqMV=`9B{iPBiQF z4jCG9NQbPtFwkM(3F+)%kcN-;D|nxya;YHMA=4kSt5xRx^9MUch)0CT>MrF9CMu&k zVT0W}f6)j`g|uqho{mDNYc#&*)7JsCUfeHCZ&&Mq9{5d58jQ9%50D8-JQ(O3jymiRp;!#= z?A$oYvBVXK{o1Y^?D!J8M-agbjN2DNDi>{)grSzb)uFtvTlLD(Q5x+y>s zy|@T)FJ#WQ=mS9(bzN<eTgYQ}B@g-})H zg9D*w26>okV`s$_&(*)^!0@kFkIPlS0~-D7cv$Eg^)K2>03+((iXqkuwedI3RLb(BY z0Hx!1!TD^$<+fU9x(=ZC5<2^l@WxC4?TTf+uWp6aH*8>ARLT94HrwRJ*iqCVlT7E* zK*WfZP=q??@ladBHgn6IJ7K6vgxlRD4AB=GZ7K_$_!r2g&2D2~;Yk9Ax|gc1ih!^8Rix#Dt@W+z3M%q6 zw-T;Le(Lge>|FP>pRlF#A)i)>qG2eA5!}nTQh2&mFtM{6^A7$GuRn|9Q;Nhjv`Opl zwKu1Ud9EsLA@SBLxt0Vr_co}Ien&92?s@Oe>2Co&udUB3QO*A5VKdzMz3mv}5|87HO^z?6BE1XM!KH~JFV9O|-C(`qp9-3}}jn_ZS z&rKd#bA*krXu>R!tZ(O(1$xoYaP2d*&C-TLKS(Lza!drpd08705YeOIha@ zh*j0)*{bb`RJegi^juIJ80pOZuCEiA^=31}%fGaVYHVLtI_S@G7W54LbG8qLoV#3^ zgkdFG;z@2meRvBp!~#~6hed4#;M9@pc8s0hqp@W9g5-Gfl+@87D2qS|x>MjFMd8n) z6&NUUx2m?oYlg)y8Ph;R?2p=ifq0YjJLU+}rJ!wHJXnVA+(Gts@OAJB#Djz52bX*> zqUGQaR92jD0kYWV&%L>~t+fHoEc@k&r@e%M8o{Fbul9Na~-Y zg}RXdb-VphzPA}MHM<}z`oqkz-va!4>qg%AR)y5bKN;3hw>Q3lq1MP;D0G(J0Caq@ z@w5d{Tn=FC->R0N^l=qgb!V0l#JmBd`U%eli{QxS`@qae_l@YG@ORRCEvDvP+fS$=HSyw*9hE!LkI?lroK=e>my(=RGU zNiM*C47lhgV3kf1dyXS%TpET_Ge|B8QzN=l;YWh$Fuz8Hfs{T5fQuT&PHC8kx`bHR zRF5Nvf%#~MSqh~;Tvk(OBB!P8oEk0_82W(DB>dm3NT9UpBSpdrPC1IlfAqr!h%X$s z;#lC*@@7Ju6uOaMIY`s0jvL_lCN!?Dd!Khs!a7a;zMUmRK~J-2I+Df!>{tjxry?mEemcKt(i$k6H4YC`7iR~ zzZJ@Al|h1OKmCHrt_P$PvTZvt0)PbKllbDd8gk?SOT&GYTdnLsTg)$lY1!C?Y$j~@ z2yQoDE<^IAbRU+VyP0HfyN$w)UvB4IX!W6&6K{e&v7yrP^A-~&QPw3c+5C3_`^%@D zOc!JEwLruRA6(1^MUu&dwZ#mnUfdv-7H$MYG_>6F?HY7{EaHTbKOJ!F(CsTB%Ca?d z)lX%#=#SU+%0an#+#^jZg|?!-3UE2ZuVn$_=n^X2gG|2PIyq?;E?2LJxF z*M4@O>j&h3moq1YiBL$ta)9(^4`b>qtl0XdSNevn2mHub)F+BSFz@v(vm?S1Q~EII zO;G3nN1Ava9)$EPNarh-6iY{zhqNFfBAW1ASVLifP5>BC2O|20)s;IZ9$X13uumI3 zs4>>t4&eoMuJJU#HKd zhi5=Nr|@6Wr0<&%;D047PrR*xNVBu4TkQi_%G(G4?RABOpjAE2v$wnRJz=lsj`M@e z;*GEl{0R()Hmc#H_VhsfxBeef6dDo;O4rHON+5v7V!5z9i0 zm4?>_${0##^!n*#sws)rX_pa^)+vQj{djyl1krrS#gf-w{o`3_7B@B>op?M@A3?c* zUFEk5`hss{yF-yke{aCiDn!y#+FjPQR_~c~)Ozn}YS$XdV8)N0s9xmcWc$E$GS-FrWr zR=Yh6s$E;7DVd}9bU~*`tlCPfbJ(>=s3~9iKHpNCX%L(z>H09m$W~IoVIcm>Vd?aOp<+gLrm{{Mp;KmF7>r^+dLQ^%gN9?O7v+3O?mA zNI0_fF;9VN;smy2L0@-rJwRN_W9P(1uy{(LCb=~hF=!s12Fr1;Wh+{# zaWUIas4cH@JBcNP78I%kGPqKh|3PN<1t%$*k|2GkZCmmMZ>g#ZxXfcMo~eC3ny|Qg z74e*4hegVUbM?Ni^&OUD3(DDl7!?^MI%P@{h+k z4C~J6(z+$0x?mtPYon4uGsnANwZqF&*VCCXPI>O6ACrnhLGFC7GCyxSf+smJGz-WB zj#=HEMmRAPT&|c~V=P!eT$fJ~gA0C*6OOp?$E>gj3|aJhB6Wv1k-u#84lcO4w1!&$ zK46dxO;l6qFE`Jfe6Xxt3+Z1SuJaSP&2Jx2`_p;n`bVL0$=l*IDir(&hGmKXkNJ`L zwJ#XKNrZ-3E&y z4cvZnJ`0o;GI?z)hkw71+98=cjw9#wW$x|8Epv0(P_m8k&Q}jm?91-?;Xe+;C0Hyt zGZ$#tZuf~uvu=N4mkaSlMkZ-h#d|;{#vHv2hfIO;9$VelQxPeOp1<3Q?$q|bK`(-y zwapJ39I8HMb`pQ#-Vu&PE+;GySN-hxuCZB5Jnbe3B$k9~^RPDAoq@7?pm2;F3B28> zv73b{!NY}=%5VQ7S{@<7in`87PmB3*duq?S65SCv7@t!w%xRvl{fygNE(IY|s@L6V zV5|I_vCDe(tx!?Du}z&5tCXVV^Il$z)PngQI*dwLn3r2n@1eK5puBR-_t2qSNR5EC z!!OU(wRp>H>^uvyMt0o@M1@N)Ihk`9HZGruJqNb{!sFENS8v@%;pQDwV&5@#W)!oJ zd|7{1JoneY%2x98UV_(b>M*~e5E-z=k(9pvj>L2M{oos#!^0^bQj?3>cn;!SbF>bs zA4CsbjQ3~Me3&`3KZuvB=dC|85Gc%74)O~_qEayVgkJfSpkOZc(Rts0rh!Ja;GY0L zS^S{be_Y@^jQ;TNxq5dKst~kJyRud6c|1fH7LE>JhRrzm_}6_l)Kmm+O0we3mOYYX)@oAh}KEEyySL&95T~CcM+MX!y zRhJYIPy<9%&_snpB7O;&4{}+f`huIy6f|c-MB6WEt{9G{8;s;exrnZRhFll#6InVP z)yV66-&)kAx$H1J9}5!s^RQEeq-B|j)tj4FZkhF<~ncyt?SGv`WV(&mM#L3)tNZuu5V;(xPQm`o( zh~o>!_ci50`cTo9<_m6UTb`ZAQJDpTw{^gy!i-Egdoe`LyY9oVqKl|12YYbCO$d|5 z#CWdLzhb+li|z8muC>l)ZaD}X$g{{L0du}j_mAo0K2Hl(2-0GdWGnmtHCY9(H~{8^ikSw)*qPd&j!?5}cvu z^0+`usE@0H$#)y{cs+KqQiDQr<9428W;OVx(f79;v^btKx|B4HTU~v@2G1W_4 zK9oNie4V-P6;qiw<>o%mhm^4=de2YlwJMw7xgPgvK6(EH_+55tB003{X!Wd77IQ1d zae5WmyGrw-_g8}K&0+VH$@45*z2%`XU!R-lY?^lBULSa%M0pZF&29;!FeIah`{4Y0 zH>aV!MTT;vD}7iUv;&Ehe7F&=c~>4@S=LN7JFQw?l8O1H6;Y5qH;3+hkzk$$!9ES` z$1Ki%&BxQC(5ei6l%4|@P{$}c#gX39#$EGgKIU=E67MC^Q+uV|+%eHlHBZW(BG&o6 zH;_L1Ku4G(-5=aVmz&!=gLzSN6Z}q(*+aJg$>QF~(|j z)&HjXZwnB4-a8%tMC5vSY)p4;|4@N<^*hKHoa|)suPlgvvyu(TL-rlU{WZqI>K3Zn zy1oI(Yt-KhMJzT>efFH;^TW!p0m}O&Rm?Eiw+Gj$Jcb)HZ%Y9;s*&-K04Sw@o2 zhZE4$OU|y6%F>Biud~7S>%it@$(urB;(aKARsP~a5z_@S6RoDEwi$gBZ!ar`>ux2l zY<-0Z1vE3#Ok1?ZT4&ni2#sTTEwTAc=A;|}-`olttNG5o#KZ7b;i`?VEHBn#Uk)cs zB!d~j2F>QXV!?QRw#GhHsAWpB?_I8pAL_Q@6I$ZgfEZAzT$d2dx2{M?mT5;krxjib zFBGVIjH}RsJ&5-aNq_}#T3Y;V+}@1)Fi#wN254qg7eUv=ieX&F<1FGk(C}JRRclN1Te8mQ-2IXNR+8z~t*9uoaq&_&uN%=Av^d)^j(F_Z zrfi75MS8_`Ta|!2-Ig&x=Dq1x)sP~;pn2l#(!84+S)+@edUjW%?a>_6{O;^+E4|za zOwcP~p>z;^rPmm+F6FM|I`^HF!P*dIH8FvkMh6E7%t5oDTC$&Q%_tt6(99ISeg2Hn z3Kxi{C+0lT=aSO4+rH7?X}n&Gk*+_phnVoV?$Ko2JSTf+2p$4Uts9*e@{Sft=krbb zFQe(((GYU#O7(DL-B~tP+T9=FT7BOah321ZXsJ{RXCC}wazqq{Z_cZ@UXCdC^YRrz zZ?ALq_PZxsTF&3Sq?Mh-aGB{uM{L5#q?IJT3PpEs8u*ikaR(F4_bo!VM~ zCq9NNmFQKW%KvKbyP}$EyKVtNDN;m=f)wEukg8IphOTs!-jNm{^j<<0L=do{^j<@6 zp%YMwD1u54B~+z^s`nGpg*l2{N4oKt z8xL3muTT{x>Y~)w^$V!=`*lbaa$=L8JPLsxyw2F)Ql8>VFAi;JEx5f*QNB;}1S9kF z?N#Reg@-{RBe5{1RjA|}nGh;Hc_n&*;q&#%(03k{-T^(OR$v$%3D+>2bg+Zp(^TjX|OM9Xdw2T|%kA|E(YFrM1;`tChlBwuEZ4 z9w~EkL(nD&K)EPdp4`_ve>5YjJ6J8{_$Au*t`;w$Cwlp~!$ZKx7L@&H* zij3GV)_i3lnh&dxO|~fLZxA+pktYPMg_i=FT>7g(=BnPRPJKd2^(E@yu1KnT%9`

ER}-SL`Mt)JuRN@dY0}CyeQO4`4zx%p_gOkY5awZ zHyV@6!V^KWY^^)$B10|qp``3O>_p_Q!G|T>kssA|WuF_P<|7T`HBZEK^u=5cZRmHl zolIVrzHNb2AqKg6j(M=@OZReQRMFHv5XCyEwaoRmBe6 zrG(Xsjvj61c7jTYSiIuSAEiR8+}>HP?YHFBWi;89Q}c@*p;V?P3LbQ34Q!gxLfi^A zxr=w^B43Sq}gb}9q}VSTm7IfB)TiXGDp74O($*0rVJ%%tEh@7{E4X89$3#vfkv{-sFO77MIgMm}8WIWNLP5`5jS%rx7HOuo*5lh24>boWD zCaS$9t8B<8nAcu$15E=Hyql%)gKeJT-2D%}8!{Maa2Ag1QaG;vFq?X)4siYQWxnfS zpiHv-V~RWl+7cy>Mu`He?(&T8WYlh{&~&qVK`g_HU^4;z{zv-0WVOh_^Wu6?#mUwo z+WcIs49xcuvH0^!Wm19NF zqh{G$3Y!K&^2c38t>vtDzWVY?59hdlWOH0Ccl&&>03i`~Wi8H<^)VaK)hm(nktP~W z6&TqYb(bBI7ZkH4h_)JioSkF_OrvnLOytWA`HXVEz5;Pfa74$yKKuq4nxm z8U2T4Te5F4eopVpt;tzX5dU|*8H`^VQjesIvkFUWhWGl4_lJTlLm^*1mWA~epz?#B z#6Q$VwC82TK1UD`HF1O7Irj(p%uSWt7b>KWX$gsGK3s4Js_zG~({~z0wU~)s!e7SejLlQ2k&4*aK$DVY4dj=_SnT|1`dE;C}Xb0l;y4hunj4?hC%E5zGx~TjWHf>|r2Zpe?iQg?0wr zXsou9oQVPK*=cHU2h9HWfd7BR5JWR2;nfMT=UNo_f%;B|tXgqgllhfUF#q*fiooO< z0ny#-TkD&lgY7>f#mn;ZMYxf#KC3JvO2<^V(TtmHpY4Um#c_L1KqL-8YAS!0kcf1# z8f2%RgngTJ;^%CEe5C${zi)w)tY~FOws3c2`=@VVi(EQo4Lyz&gv1Qj0X$#wpYZ4F zjE5B0YU8OQMfS{`t)B0Ppvj#VtwWV@tMykmmy2k1nI$lp7sMYa`=GD!1Hj|n+R19S z2YyF2%g7uG^=JM(BygkX;i#0fy&Kf~j&@=gfP4UZbg2OJ6r}R5Q4@9F)G;=8JUx*+ zRW)r2OalHGx!(z>%Ft_%pJ)pr4>LPWEtamIEokBrKp&QUlFg*qo`@BHPCT?f5M8#p zJQ{QutK7q_IOBQZ;))cy)zcFVIY3`Z)9U)UNdUeLMBs79kR`Oo0z0q<4_rs4gSEw& za|nkipo)7ZPk&B8&L64Zs0W%Y1UyTl!wtEl8H$UGtJtt3iR(G4tngGMQd;(B}Z{z*hU3anHx7(yJ?*UU%x6D%`Uu2wC~Y+hknD$Jjk zSh#irh|cp#TuwbYo*I<|#Nfpi5k6vXh+p>Q$5SRAc;9?mGaNBB;lj&W?_5M>^2oE_ z-oDVQ$hwXg&^op3g8J^vplxR0(ZZ-trM{@dp1q5S$RG#A&^WLocaMLfdgx= z>+?ScL^&ID|Nhf*bHu>O4hn0UC1~eE1;16R8MwI^(DFsfR=4t?7Z7orBEbQ0+8$lZ zZwifIc8sW&#J$-8y_}qqQhgJ_*}OKT9H*)L*?wcP!ZYyw(9r!XF1zt)Ew-8zJ>H^8 zwFN-*8%VtOC)>FZR&K|&at(GF8BNpUN8^%|shMkS_H3E$wk34djYs!B7veYL8*ZL) zo}m=zAham-4D=@um~BgBCI{f7t>?#(P3!G;>*>c2^CL~}V(%At;9T4$1E!p{URv&) zgIZTUD+4=9ZpJ>xI2MgL56LbXv@eXSeU7_+kOhw|v*Ekv9rcfU4N!2_&&0-${dhL&7uiTAJ6cnfLAzAH<|jM(r;=SbPDL`6mSo}&);v`?4h8sK|-xtE`E z(c-Qjkh*Gg&nx>KU%Q3hnGM`}vz?j6A!8W1e#h}%FNFaWn5^fOu@Y?oEMaP&+GaM&Y+vg5 z@on|CQ5k=kQWxtV_%)LT8-&gFI4Juk5D*;-ZY{peqJm*vX5b@gYQvj6(RMxaeXlc? zS8Hu7JUAKlJ@^^Uq|H+ah2SA(;!<`NF!o49I&kGt0qg^V^_V+ zU!pX{G1lx-c9gDp#4-<*r(qx?qNSxJc;K|j(O1Ob82r%^IknsCsQQ)knS_l%DbG1r zMw_G+8JmWkJYGrI-vT*z@!LeU0FY{v!--R%WR|eQq(D~XTw!N z@&MNF`ab~E5|Q$ofC#rWP2uAdm8}rVosx%d_-{_h_HG^6(lE#c`8@y9lPh-@f)D#_ z2oSwSHrT#L8c;lO3Z~(8-KY-qQGHUCi(97SHU!r3;u+&89Y^2zYvuDTZAcZwjY2Mn zed>dgxRWncz^NNcf$eHrAKwj=`FT7BIXXveWNtofJ~minsTH)FTisX8f|zoi9#esQ zD^g3z6hy~r9(sp>`S4K)2HgHB;}2|F6sL}^uJtDa{svXnQ2t~w<(%ys>T2ZQ3G!sc ze7fC49$48}*}f~X(_rYY_F%`yHR=W+^MeE2o$=CA)*_66FFXq2dQM2%>SRq#704sV z6qib`zy{;Oj*qT{;`R9D526pF;%#lG9z0EcB3Afw_c<6y{);IfO_y?kHFTY(srckM zY8mjPFS=?J4wsgS)lOqp|3}lWENVf#WqTf{e!}uTeUA1dY5-#8@gBDhylgAos|R!lJ}jnUIzum{@+w$8~p{E}FbE2*gFv77-4!8vj;>*~jkYC|HtKD$2R zz?#hr-9+m}4Gb*WXER3Y>r9R?pD98RCoPqy-<`jRRD=&PpU$(+#0B^(=1>(X8Q&86 z?bl1dFaFM2Q^3VkP}Ba+;RYQ<-e?iz7;>rzrQOwJXy!-3hhVEr3>aVaLy4B6hPm(tF6@wpSoCc%VBBW%oQV1SCT ze2tLE&<-n@eqd5NoYy%U(2GQw*;RVIWxw?<{F2Mrx>49_#EGT}V}}mJ+7n zA)5=MU)uTqPYbbQ#C}KY5hE44LH&tr|3couaUr9gdtQ6NXJ6T$yH*KNEhj9 z)V#%ZA_+h$5c{?8<^lmYcI8Lebdfr6?F#p1_Be^kQPBDaQ$$sDXLv**Pw}jZqj8E0 z_M0#~cfx}R`~Xuv+sO^8xl7Q7M3x$Qth3?1$N>x&$cs5TGqkkhfDD= zWHVayu?)WRVSjEHZk77l3%HTQEo5m-lGfPuGj`~QteS%9_pV}UuFgkT^h$% z#6Y*le{0ICTQIl|g&7EW`Mx~g5hti2(e?* z-8vh=oRleRe)>Vyw0=Rpw776pr86|*E(jkc;5I%B7sa0%S*Kevahh6FdqEcXgBzuX zZGxzw}V`W0E(f2t2Za#3Ea*?bUsj|89%GdXFlV9?7W=@;En>Y#M6ivZ*sA@W2R*pT4A>~TxG>=M!L?>E4xZ;22N*tCd!^%|(L?f)mp7sXCGs5BA(140Cxm<) z-%Ntu5Yr*=^(N9a)QTW?`{_Mmn=Zg|^>Sz%O5$ z1n7=jid#MjvS6yfym5@S?s;Xo-wa$)OG)CHRjECN+Jmj$awGZ;@UAf90<0Mz7zND18xK`^+ zvHcQR%`-5uu8sx=DR3Ud} zP0yZ|=>ror1m~**GzE?x?0H11Ui}(HkVoJTT8MpW`6xLB=BqL!Xkcy@tCw9^Jz=mh z?y|-<<50l5IBTN%B7_Dn;@S6z?JIr$iCDX4u1bwOs1N73>scE?>AHMzRKR8T?ksDy zD7EaoYV%_u5#^uN-$6Jp<}d3s&40?2ZbOp|Z|8K*pPP-ry$vDrm$Nw>WdW2%))~FE z6)orRI|ei)t)J$g@!?j1uQwLh(lG32fJnJiyzRv7jFs$dZcFqk=M-K>stL$VAT8rO?IX!7fHJ~E^WG{*KS-^h2-zU zZY*egN+$I64F^ClMP~&3So|+x6T`~=tsa|B&C&upJMqxLb2yv<!+K3{;olju!XLN-i#V@EpcsYpKX!JO})uI&Am zl6yo?jrxleSEws|F8Wy3^sT*T$cm*~s!xcZcAYxzKX{wUTiLEVSvTy&losI)Yya~4 zNG?jkRkor6UK6Xvx7~5!cUGF9)oB*FnrQkCk=>PdGPvpf@Rp*b(fq@Q3~A|AG2B|* zmDB-A@g7-_)H~f1l7?tpncS!kf<9f1R-sO4F!F)EZw*mVPTH4gMcf{{pgSIk-+KT? zOfbgEpf08eMsi&&kG4xt6c~TM7zkA!h((7P1 zA$wDIK^|CFfA#idJSC)vnnz#kY&BGPbYYoP-9K|SZrl!PQyh~l>``&3^zqkeO)j$K z&z$WM$WqpP`@q1$+D>0zUX)6Ik!QcxE=e|KRZcX_q~!4Jmqc`+f3x)6A%9|@LXSKQkn9mABhC)0|WL;U6g zdm2%R9&rELszdRhN8V;muQ-N%h!xHAJ$wj~$-Ebj!(JRPqbW(k499z6pAGKGs9_~Z z#Y<-5{#nB->68#5a8+t5dCiMht_|_x*U1xBXC@V3>8p%(?h7H%t#QG#+Tl!i&r}{i zocO<9o+kiBrFWeXZg4j7mXw74iA>@B&eoqxJmozDh16K5BAO7poV;-Qd zQqmBM`aAP{+_a5FU=%m=`3vV2=-3-Cad4$6{GItX+!!-~VeM>u_Fo_Ww2bS(Jcjhr zE6uYC=zld|0s7y2s&PJNrQrV-`EVLw4)-{wukbIH37CX?1MN|MUU&1~1RY4fF+e-{ z-$B*?`W=uYVE*mvBlEurI*^!@fJXEBqnew4Y0d(euYjxn62COL0Dft1Ptg4pz}WwV z`=6lpFWmnC{D0y8C%ybv-T#yf{#Exsh&}ti>i&n?CZBWbl+Z0~rA>o}C6WO6yRWRJ JRH0xM@jumeEKRDW%Sy-FGz`P5I(?HZz>BURaQI;|HMSAz5<;57}8-_OgvqHb{ zD0nQ{uorK;^zm?Yn}UrbH6(HLP{>2S&csPpK)d|DRxUIRC7q~3zSN46KIQCW!SdCF{XE4M40lDD z24iHp*Ku+}OYiWi({)52nLP~g(!{GL@to&A?5z(es}%<1WC!1|K$B(gkNk~@+-VyP zs|Nc@$8+wacX+SL2FRw4)Q56j)8xHfpzjS1QJW(CO>=s>Zy5XwM&M7;RHER1VRu}8HP4##jIhDDKiC`-r7`2a?|VYqm=Z1 zbC|Kb<4Y@EE*qPMlT^Uc8GMkUUN5?09~4tELhe)zEWyi1*+hZD*309sDdyV5@ z^xWFytGnr~Iz|r)4JHMHPcgX)9%)%E>rgEEdZ-O%NCUg27rDVVg2Ezn*RR97kz^Zw zdU&!kGH`-oSKqgMb>Z7b*whYYoHD8D-wuvb4Wfr=40aWcE%4R|*-{LIf7oFrzlg%8 zF4+9tdu8uXbb0*V!bdlYL7|x~nTJCG7rm8O0`4Ue0#n9kX1MpTv!V-QTJtXsRjF1# zBbtz-Ao<2>bFxw8f+b+fUSwe0zKF*7g}51T7K!}!*#!92L{X^%c@?-i11$B@9od02 z7`EX^e^f+{V~hEfpfBOENb~8(wGMYDLzRdJ(B0>YW*wPPLHsI*smzqE9IU?IZ|d6@Bc@ zY)|xSJ0xi3SriG!+WQ40-c`~ObRu-WG@;D+>K#jQFNvn}C+QqAqANeugi}Y+oN*|A zY1JLUaJ;hPIo8(rytxb76AS0j`Eb;ua-*uQe4zYiZ1qHoE1oqascgYLMP|%`!y*24 zdRL$UB1I_UssOriLqmPTvy9uR0(}F!#Jgn-e~;B-Y z<0S1<`+wlD!3`itX23HcTK(`We`O8V^h4hsX2S2eJ#5M|{GX=wBnttMe3E8(y%nJ? zNeqAg5zOaC!QUySf~kH7UXuI1Bftvpq$+&J9~1Bn1AzlBG4dNZWAyni^&G4#Tt2@P z(IKjmUpDI$W4_IAg)<3c#m_%rPdq1yxX!SCgDfx6ldZL7QjMYanMJaH1lbu~`%9WA zYu5BA_ZiJx__OzL#zq_8u{XXrlxs4f^>>=gFclLpb}^J&7Ly8ZLNtk{LcBXec;P;+ zD%c}P|CZq;OAi}vPgvPK)^kVmL2mmh(%E!W2G9TV`^vi`D*G44NLv2%{*+?$hKQ?d zt8W(M_Whv}l+iNPG@czT-(?4A73f$fY^e{ZxUqCXB10Cbv3jG{-yxHC#kl8qDPvlY zSfFq7ZX*|_PKZyDCr2;-T3vrr=`R?mE4w5wEY&LJBXy8#u2M|z^G);XXO8g7u*y_r z#RdtB{4-^jg4zifOG>U}{se8QlDxFMrR>(pk&*I|qe+4iimC6}N_iCqYbo90;gN6j zlHkI{iKJCV;>TRa2rcR??6#d7(S*LINe$<-=4y;7j**Rk-n>d0O4610-LM{X93&iM zOe(8>tv#h}UGhRZKs#3(v4+LM#Zsl(rkZa~a9?Zg&zy9%ou%6@o3pNqk;{p5{MOzS zU)iZ{LXK57Q6A%nUPhBVH0Qwhd3U*qJ%LxZSGQ}og;W!%(y)3YB%wqjt4^a#vP{lE zV_9583tZ&WaIbX7P1{{<=$P0rU^)OdKs2Bz{ywlg2q}n(R9R@fFADv+IGP`t|MRZr zH>jmVUK}Q`0$*(ql(H3bHQV_U@ezb`CmB`uZdEI7erU>=QCWsBfR zvuz%%pRJ$ooS<%(u&f+f&ymTeAAd9RX5P7Gn|=HxXP{O_;*538tV0z(lQ&*+Tt9d6Su9HMC;5V%Z!#`^@FY z8H4YefUctiNegjT1QCf&5N6=j%UDzhf$Mn4MyD%-eUYQ*)_`+_Yucvn?yY70`Myh&GLlf!}1|V~gj`==;MbH z%e^8!;JSxX%vvgcs@h0*;*Xd=P-X~6@O~k`M_<62!80N4L@7e@#Ib(GgtUZt8)h>+ zWOiuShV1YnI)M1))sN$~f%P|mMwytIU75^=jfOIYyB(zdI{u#mGy>ct-KE|~nuk$K zNJ*9kH}`U_o;1WQltwR6eTopol?;^))+RfDJx8I9rze6;!sR$oqy#l8Hl}8;sUVLh zYGSzXNwHa2uV0qJmhK5>A-j9C#N{J(I}0z>-s!*i;t*RLD}iQ7zEVz^nv2GYCQ`2S z{e2WxQYA;O&A<^mXOHfCE?M0CsodzXm~qz}mq;|CCNt|B-eCvHHQTT{5)qf%s~1w( zj&#JS1zgcQ#~=AAglN3ou0QEBmHADl{v4c%8tvLVnm#c=_CtUmkhH_B%C1%od>)8P z9Ik?`R5x`A_LIoXQec;E*1zQ!-~c&Y1f|TRr1E(;&^O$i{PNiLkfv^oA?_`d$&1ZX zu#DrE4b8EMy`wElT%ZY!*^i<+IX-Fh61r4bE-qKO&2iVn(EOl3!b#)N_p^{+g+?Vg zpYOd6z>9|NtE}V4+qc{DoCBW*QjhIvK^s$Azly`Ou%^h2%gW_=$IXhi zl+R#CsnLVkrNqcaN6T4jksspHKkcp0sts-t%<)=&zJ?ac<2Cbo#@$rqC~s$wHd&4v zJV&|YXl2zom4ux9bDj+U+%u%vHHkAoOk;cz{w+ezf>oy6s}%nTeEjS zQ|2tmgQ%;{t0!nrdz!3A=XpL{ceL?6)K>j$&b%$SA2sbM=)oi270`EYZc>_?@u1x8 zT+0iQcTjl7y1c9}cc= zR`JT>ljN2Xc35uoOYKNTJ@;fs;;=Qu%hDRUTU?Jl2hOL6WO!^BiQTI9<5#9m=Nsw_ zmg(!qL2g4r?Jd7==Ad$91R@2O9ruymHu^TwWP!rgKHrYE4vg>D5){`Jh3i<|Wx?9l z1AAJ3oa#2wNLEP_48pue@0G7B>#DXCQ$={1D?u(>Wh-q-P2J8lZSgG!psMwf)%nyz z!6h!29v2b!bZ9G7+#%9%xHM9jY}iNk>a5tU@6*_3CF_O3PMef>%XGr@G~J(G_q#S& z0&8&KD>Yoh2H%}5artY)^?mC1#{71#);_I zk#`%Qi2A&s>E@$KsNndbe3#@GItnpGgJm6Tn0MzeUeV|0=eB#hHan82EqMC;;cjPZV%G_W65;iwT551n#ha z!#xA`KUyRCXTbf(^)r3o9n4!5aTyultYYkFYHI6bZs%-pGn)lGcwzre%LxVskLK}s zCZkM!1dKmzp{nVuDgU0|*v^K<(8SKjl*Qe~{&5@_L3e)O(#F);klfwI+SZBRU5N6j z1wU~8_?VTF{Hckvl@O(-{0DMzJ4aJ;ZWcBcHcDY+a&mG(M-wxCWeKT&x&wDYl;+OP z_WZ1@Zf~U|Y^?t|Hqce@@hSfY z3wKj%EeQ)70B67)!kk=ef=})Le{cS4#{bq+^S^p>u=D;eUH{vw|JhZ|$<$HY&IXv% zS@^&9>z{f5`^$ei3bH;f{lB5&FP@*C0*Dqy7G(X;O%q0bAV}E*_L0~^LQxes1620( zDFeP=1IObTI3TIUL6rbqh{DK7yj697wzr7rPCD(qc>|Y)Mg4OLbl4I?saD7`?-*_@ z5RuBO;J~d=Iosma@0|vMHb4)&D`}c)W3Bhwo)y01D6q7+T=pq5s>? z{fm(QLB;kKh;RIxm(HLU}ui;s2r@V-IlJr`G_ zgpLj`U5C;WIJSD^%!8&TW{rE8+}$JY#`Skq72Qq7QMw6fi7vZ`{fvKs-jepcm{Ok} zoB3!Q#xF8uUV9wWO_aJ8!9P7U_M4xd|N1z%8TZkO5d|Zo$|<@f@^v&VZ@!CoYfT)J zn7TH$_i5(uKm<&_5fbg)xPzq)O9xK6Bv#aiPFtW7*Rt$X5J}ynAiP-VN$#xwUa$l9 z!c5`#V!?~p+fHjK^?14AzS@vErUXL@jEB)yh2dY-qVMKxex4fr)!VkxqOqk(DUd5bx5mGS@Uq#y;K2+|be?VGbFPz+5vPV4ZD=_!h4=u-N@J;py%sq3RAh zT?;#VPh>SSlYN>le0ZxJTW9?jji`B|SuKm*M28Wab2i1%#76G(U3V{NZYhYg8W36V(Jx zN7YNZc1+ACyA;?*T98rMhGPhNmO+F2PjKm1%D+opMR`3F&B-tvo^A`}&l_xZEfdEb zp8X4RaFJ-T5CMeTvj$<5krj8YB?6^1Gw&<%cHKw@Jqgk%wtF`1d)HWeCf9L1)~cZ~ zbDpp_d(5}jN7+wU6xSm+w3yv!)YkAiDPRfq-0uW3K7m4Y?OwqGfNP-Ghb zXw}1*7#A_ftIEOeY0f(G3|UHf*Rr*-LgQ2@KhyV82c-FM1Z8fFEK>t1#l)SB;>Gnm z7VVAxg2nHl>3@xO@+8fl@;NKGkuVb)f-m-Dk;E1rlig2Bj?m8cHq<~b)o8! zuXd2`WcfTU`D9~c8zW<^|&m`zLqUR23v$B|2XOjE1KusnR2oT1Z*2nM6H(8ec zjnnMj+p-5PXIe4%l#e7M@m3VdFMF!ka2j;Mr$%pGhfHaG$Q+gAi;)~aB4qJ3xy9^D za*g962&Dr5$*J%qc!5L8w~kz#t*YnQyJ41?60S7vNRLF$29Hqf3O&n(Ecgi=RI>fL zq;L;R!TL)vcdR3tI%^7tv)f-ITEt&%-f#XP0jRY@Xlgp22!Y*swn!X}U`qZmM0YEg0|Gm;aB)QHo zlt{pa7RsNsoTB^e5wky-kpNbg*D4GUyJ$cOLSJZSR5_GZVZn$I@GMSl^GJ@f)nDb{ zD0~^?*>VY>l=NmOe2AjBo3U3H5KYEfL-ax0&AFpf5P?YO)Ao9F8lbV{3;TY!JWA9%7B(iK#RMz;yIwG8m@z1p~Ll+r=Rq)N|^cSh7up?L|m7gigBK~Vb_PpW}6`)uA?P_Vo5iJ^l8Ij zkgIE|>-!NtEv(}EbhSjlY<@%b4@=}vA|c%^u1m7e zX;haU=+E{8c9u%2(IPaV=?_$dlq7H4IpY9F*C+6# zQOGeceXomT4W#z>?u9VV`j1vX;&t1eV9#eqeCzB( z^e7zfvA;hGk1E$#A}$}JhZg!n|G(&#Ku}HmAlIGZVXPrh_VJ^lKrSo=g!KM%a^=U0 ze!?_?@}g#eM`XdkVq%zESUTrkrnU`v<>YgPZClpY=Zd~NW2GXhvGD!p$w*|mQ%+ox8!P5quIOMHdrPpoba zj}_t%sUg3%TE5y@N%?^xVhNDv!SxwgQ**D1-W-MX=|8qn@Jbo2uVPk=u$rs7#ad#3oS&G3~RsGyyLmm@_B-8Wdpv} z>$b{vA#9fWpuQn}Gyfk_sQQe?r)w;q3))U^GfF5FAhXs(P-et9xdDr9ZSQF-7^wp~`Y=KarD0Y9Sg(_Ij1^LU;}Li7P?;i?Jz z(Kkx#?$oRq`9`HtdWHX`4CEIWNHUq-8_JlX=@{Nm6E@W46{h(f)h{SE&_`eJzG7+9zZkc7?naGOT2j-Mo15D( zu$K}w^tIzrvlKomL$0|*2%sg8;FX0i#+Ifww37(+Kvt0cAriwo=-zzy;ntRY$wk^= zIGWEwR9f0WTOF(`9kVnBl zdXYzofo0v1_6%nv$5zLwN*<4=9xr*url8cZ2G_JSw_()u52_nq_KDXgdOEipD;rzK zb2W_x`&~i#?|jqzig4~m&0K&Qk1_((ta9~}mQJO5uBmCb<+d}=)K7*d3y+(cE&6lL)2hIt@smF#<$DC$O@`_&V@@aMD!_1}~ z&mpK|E3OY`O~RtW9!s!pxm$jWe4svBX6dGYbDt;o_QbTi<|%31{svKPZiR1}{@ zEdh(@Rnq=~E$#>-GRlI}!%?G1=9n@-`?H*AHaP(IL+JeYMu_81}I(TRTb z%Jq}=&qSTsMP!Ni|us`?ia@);>QJSL4XB((rKZz-t`0J8)!BtDRx+FP^(6@Qo7QKBWXK)eJXanwF*` zy~pb^*g`_2Q4{0#>mx)1_c;>pD-Rx@Km;-2TY4UcsfAYM>!Thb#k(JRf*zeV4;`$H z^tBT2gYMd{`xsl1dxP1H7lYZ?u5a&~|2oiuz|gB&PSo%i@6dot@v2lV7E3#ubBa)P zh+i6yVN6+l=FXO(ZHPoW*Mw?=kjPanBP&BWh@oSF7$t9D**$+TG;xQ+`UTNq=%^4; zs-2!`LqFIm5*_+!#ye>ey?J<0uZn#@Wkd5(u-H5b7Fy~@!9t2X@^GwMo~x&DIR7VJ zDaCvP=`;$q$i{_Lz z2Um&6RLS-@?$INX$bA4g^Lsi^7ZY&!N=1vFi^c39rh)rNe2!lkP^?FwKcpppj1#+V zREx)HB3ZtSK@eqF5C@;|T)dfwZA&o;lDDI={UHIrs1b1ElS012Y#z*s_}jb1Y3IVe)Z!fMjl6{T~gW@b%cDa6xe^b_&j zo(WuD{>;#reF3s0QMI6q-gv9+chyY;d&CKx9K*_)i(g2Aut(|Er9ds-CFFj)xhB$U zq%XO|DN&2hC%mEbCn}B1y!M_Z8rnUt=WuD^G`C!$J`m+?xsSDLm^akw+KtIqft1K7*XQVd47rf?qw(<;xr@5U)q#;xQ<|W+92agGos?hwZkU)j&F?ZtWuW$^cZkGd zHSxVb9p2&M(v;Cqb_tG-!pR@6M^=5V2e4-b&oeqe46tLr%M}g2?kbTF=e{pEe;ZD` z`_Njo_6o(f&5c~5U#V!g#K$r3Jbcnl@uJroJa@tPUSG-iXUpaJgN0&oO+DiM7Hi4e zFF|n18&D&QP)n6%rU)X4wI%-=x>L2AvWKQO6s&Z;!sBg#i^TPEEIuxFw^G{qV)~B9 z^HzE-K|%+TI&Y7XmU9K2bWFI`UEbB^V&Bei8aYSpcX#s|S+lv*6x+<-9S3a*;#hCn zjNe$KWJ9O20fBF1}-@UhXhgJxEPG@FXS9Ca*4Z@JWnDk z%?E8j@!?Llygc7_0cTou9hagNP8Tj0-;fc?6&$7*dq0$}MU;vx+ur%KdJ#tc>9*? zxomZvi%_#jne(D?InU8_!ExBq5AMa}5uq>>Qx|VVD4DhkYj>&A^u+kvwdac}vv=!t zdft<`;6rJs>&8q+t0U^1v+d@~mTlyvr9-j}z2-k@yFRMw93vh(tqOsQj60r-dIlMC zBX@M+7G9EAPGh^yBKaNd9F1TOrn|+857Q26@hxuCH*$K*8pd3y(&{3SlZ~Wbh5{6IWZifXdh}xa8wn!8%+V z@}8uwx%@{EdD8B#H@V6B%(3mlnN}-xk{C8}LdwkD*AfkAn8;F?DTLYdIyl*A(<57c zQlf~(;3T!qB2@kIWgu-7?rlNUZb8N85L%^AWxAUzslo>gaxB*o;Sua+CvTQLls&4E z1*BV~%G7$qQ_12INsX<3|B+AGql+_j?49a^urObwGNj&g&Ys?m2k(5uoxhpZxvH*> zR~OiSX~+Gu&k*A5BJL8Wr8?8b0Z!Qt)wq0V5Z98xufLO1kWwLZ^ z{m3xt0K@#aJ~;sFDo@x#3?!v=t-DemSh! z6vr6$j}BZ|>06~_JIK3i)3m|o!jfKVKXdjLc3D+6c-hd~O-XY_R}yKvX$eOzFTBH> zBr)YKVf@U7kZP+j#u!yz)Dl(I#u&2%QgYu)YjJAb(EoyS^V;PH7v88aiAEWjFvGBX zW&VNGJTLVt!ef;NZX#`mIl0}qO2OV>axMznMuaV$yL?;>co)f+s&BQ z$nsl00qBW3B7zMTg4s7T{Q61v>5HF6_+EczcN?TlFuntMmx6FKiv0rbw|PD7!b6>P z!v&nl#Focff}S@aW;#vROKkF49Kb#(t%aPlJ6(`U-V^W#t-9(pCafJQ&fLMONizw1 z4}euM^!v?<9?F8=!2XS`OauhSmQ28<8j zbNXQvN0abu;C}j!%+tlJx;BN@LwX*5t9{UIo@_6q6OsZ z_S=COliv15$?|VHxyk6+)2c(Qk89u4z4Tm%#ceC(cXnE?EA?s>=DOB`^o|RSef(U3 zsJiXw28hY|B<7IUJPR5T>D4#YHUBX+Se7nXEcv_orjdVu8jv~_qum*h*D9YF)N2`a z!BGc^&Vaw+Uzo=G1bii5WDw2#at;ed|1!$nNq6)Rki>S7;2Wdn(jekc&I z)Mdqh0%>0%t``LkQa>}j71VCK6%toFR+Ea=c=fO|lKkgSq7`ps1nDgXvOY*fBS^iO zE%K?SmE$_jf3XmdTzl2pl!m2}e!cgz#b-<{)7A#Nm_OJ@p={hALMw?YOfT#*q1ZQ6 z>(f?rN?%a=xf@8VF9Kf6srLz|UCV(&^F>U+o4o569|IcXN{01S)OW;B0iVMxwl0y| zP;+NlaSc^|f`P5_atP$TybRs8`CU2c$CP9~xqei?&1vIhYhq0$ex%U8z(Y$#E>f*up8vvvK5Bzd#P&gpNVv~O%R zp<6+Vw`e+hb##M~XlEluVkdFVhREL>$zun2Pjv zwjpfVdzg$}QtHvX8$nzU18Hjhj3%-nOn*I+DUXh6rBW`oCZd;c5b~PZxR8MC>-3CW zeE6r0nLFI8BFCogQ2ya8<3r7vjpDZ2klNe)ZV|!JWBLA^Qwz=9mY?=n&%7YjVV{{%a zr5CdV4o(UOV{TOra_xM&L~<{-+OC&V8T1PVD*8N9m!OTH(?YUKk$a*gC_9hw6(LAI z58dlETPEEF1M{oK-%CM@@8|PF`o!C=0$7>zu&j2>U*Bd#%thGUx8#bk-oWoS_Dsk$ zavl|O)7VZHj*o+cc;d{3ADwu+-2St(3|h%aLzP@~A+7=(2tUitR#=t7_$(Z#r0Sya zaBG{sD|(IYT1KlR-EGc~%ri+*Wyk$75Quppt9QYK zTmrjp(^~A-FExSRO!fujOYT|O5MT%mYiWA3K*+TUn7}L#6 z4--7;J7t+J(l+0>6za{-pMNQM;zeH9Nh}o&35i#lJQQ%AHCk)gb-I>ZzMHO z(|(T+zt?FVNSh%tjO}eIW?1DDdE0n<5X8jmlWt&{_j3qZL*_lMm{eMA%1Jk@vq#6o zCB+BC5s1)Ht6+K;eJVAuGXkWSYmbL?e8#k&VGE%p=2xWJ%&|5}x-IPYu-zyBRrj9( z{2{%;$_Lba^pm>h8!k1KQ>9RRh8ZxTmZ^C6QEjl^`Q-b!cquYVLDsTk6Hn%qx7wlm zW|zSYxt|{avZZ;VM*v?$%QX>Mt!BAHvd-zqjkgY?X!&l?@{zYIf}Gjx9a?}aj+guS z&BGq)?XAI8M$^FyVvlV;k&BV$)&qR=djlx##r;_m9@4TUdiT<52UY^JR~ESOFoR(Y zh1;eD4{7u*uIp>w>g9d#h76e1G!B6h&!)9sLFRZuiL1wCjroE|99hgrcZHig;x5nv3oP`O{!)& z-GZf-I^7b}_!U{Cbj)K%Km33vJe7aEuB@mEN9SgTG>lZC^+pA3JvqM#!WQDS?>FWW zC@WrViJY|U@=KR|%>O>>f4V2WpUXb#oUOZP{4y-EFMzxAnyG2`ZMwgztcqfWg-xv< z9+FaT%^=xz4wz73dkPtHa6E_JdQh}4(^x|GAg)7Z8?HEkEb5ElVp+-bp>jJ!@p2>x zD}Vpu+x%!kI`n5`;f1uzoiSO%hD(Hmy>`+>D@51%aiA9oO?TY^ta=MMxV&O>;tx;s_iJxL}5%uiX8`5*^ z>>3RgovUqHk=f#*Nz7!ENj^sMELrki`BWJfjLGORZ7*$cMHXc96rsyJ*21ZeB-N$9 z7`cJxovRUcUbBiwbZ`_&pQkE$ceaS#4>o<2J@0OWcQ(rAjW*f45kE}G#O20Uk4jv$ zq+j_dveL=P&<%%1J_Z5418z|J#A8$>3K`bnrN8-@3U<}b7pvQfpRkjh)|4C#g_KKg zQG(KE&ST29GDUyYzpA>G_ybvfND{(y?P6}RYAP$uoZi~zU`EUCRX-n8`}4sVF@Sf8 z5hF%WKR~D^zdWdYy@=FtnojtT?iDVTsildY7VNCcS;;=bOTovTKY$+5~)^OR?nAhe3neUqLc&xRq8+S`Zdv z6^FLze~5Ey717PdFP@e!PpfKdo}lkJ*xg;{A4H&o`z*BN!bz&*G(X+~RBWbrj(fcm zarm(NFpl`)4Jp9yJg%f|Z<_EPOjZD?(suPVjL^!0QsXCKH)dM&1Arlk$K-HMCa*kT z*@ubh!ckbl4F24uP&_ZeCDg3`Lz|{+Pn2a3G&KXdotvHCKtc%>`c}w&~`f zN9mSe{C1lI;|Na^ygP)z1OSRW(x?Nbjap$7uC!@!&EOW@r#SQLmmvMiTs2g$o*?z= zTRBISnlPR{U;S|Gya9vXkZ^Oali$<#LFge{n+JDyLm!)q+!p%sTt~i}4lA~;Y1{18 z9z>&GeGV<^up0ka#6w%u^TAuHUeyskK{g@mm=zgZrEJ`1+*?1telvlaVaX zk}`KwL8~kDP+NMvGJrPi2rPkXG&04EaqlD8$oE%BBUSoA#D zNJ^$ZrhSfvTa8wUb=pm9n8AFWV{bsqoi$F%n(LRP_}=88dr!y*b6f=6$`KW3#B|V{ zqIGG-N_`s61a)=<=;$hc??wCaH4QheiN@s5^}Mg7bkMyst5C>TNE-Ef_1p1S`y&3V zsL-^5`J?;DEB0_&h)XHMS_-GpL{0kixNp*r$<91(1B5PA6VIJ+4d&+iF!W+`J`#jc zwRn~;qY9~yB zPS3oRi!l#V`qUp~o_@cbIjjsR&CJEew`u6n*i?5BJs-xcpR&S9a^F(Cudy>zJ6*bq zwbPLdrR4Frrv!_b0y!Zc`uH)waUYBK2*bFt9z6%R=6oJ%2jkueUFxf>Hkz9pEXZD) z8(JR)I6K3MJ0Ws^pP ztMjOx5^H3yz1kajNjxtyV`IwjNmU1SKGacn1?Xp-F%3<#%5c+otxMC|aFEGStxy;Q z(fs@l4bStHh<7|$e*to6`&rW-g{e*CeS=y_-ElVT^_(ig$&V^Ut@4dZaK^_gp-9cR z=#&FvuBPRxKgKQLllnETGN)?vWke7y`;E#wTk0OmYi}cQ7+?3ttdFhYKbp5(Ix&uN zeBADusyKi6&D+G3l!>k_^lGseJ6zk5rBiF_xDm3+^%HY8MdX!Z_XUt~HlqPe@ZBOD zMS8X9FH15cK0B*!k}8F7{JO{>b0eMx3wc|$tq+b|{ruwC*89BjUI&*`8pXt#i6ZC- z>eZ!bvdqw07uP-QJCj{Q6ql`LH3W%NIG1)+{)Wc0m~?A(Y3r{-qtK)D+wcdUle-BI zWyiV^ethjuH$L*32K%biV5!*J9_xlwPW2@%n!GyilSnT4# z_@M?2%kIGx;5yOkwITOV_7Kky&s0w1QmxMWSl7g+3Fyz~a%pQo6_GB&Z(<}R$%u}r zwke6CZUlzqdCqV4KhnxoMEGAJjW$ke!|5o77m}5^v`R)jw;!qX`kqwe8Kj7&@i~GR?W{6;5oy+`j4d4#YBrcq#pSu!f#Si5B5dn@EcjS) zl({DVIoC!Z6TKtr?Hc&}t(O|wtAqYGZVH)2#Fg#zggh3>bq6m+Xh(C(Xccg6HD>e` z$%}3|9v6#Y3S)KLC#Mc;EMX!26>^#W+ z1rKHA9ViBO0+0>;Kg*wbYj5wX=1P*?z1;eQ0)G~N zG#+$qwMO`@5!%V8a7{a|cUbo(f*sE_7;aq{3Pk1^O6eHCU)n8of>m+XufUf&4<8T0 zXduOuJ>tR((O!jQcC$5mw+9+}$J^N#8T;l$b(#TP%+O2nVF3Z3{e;O00>w!hT%=K2 zXedx!n^5xgYi&>4C0WVXU9lA|2CJ4DmYUpzH$?J6A34i>HnG&0i+Q)9CZS@kcd_h} z-R#h~#%^A7zdqnSsXfu2+t;t5Y3UE-7>oe+e-6q3m0YySpox%rFX3g@yDZV*KF(cq zyWx_COdukp5d&^l^eK{kCk<-%!!NtcpMLYI=)|%GL99BZZy*=qExnZ!_hG8DlvWeh z@_UP=_pta?*(ByztSgY6wk@M!tLaYG&(0~J)vKX}f^3qI)MBbLi^klLNpCbB4z#zj z`}iG$+yp;a%uRbA{azKh<5^si-32pVK}1fF{RKbb3VcI4Xxs)9Pb7}3gi#ecC-zkp zzFD|(dwB*Tmmrzcmg^S2t9uw#ytecf72203&#?+U;)6xpnXYj(=Z$LBD)og1;&3KosnF_4p@Qgt*WX$2wP3|S=sdBt5GS{ zL~Xk+8@7^ws{?+;-rW)*h*<~!CM)n>+a{Y)jz`psP-8N%GDciv9Cc(*g3Mnufz2nE zoo*}6MInAKx49L@S_lG8LG!mQ1dyD}wYK9kbnhCRyA;y*dgf&+lhHb}IBz_5+HT2& zt2wOx@VCK7!g31nkU)Mgl=kcN*B3V*Mnh5k&BL-8VpzRT8ShIxpNq*B_l3ezXg`;p z+^n%47=#zIeWMOq?6xejF00V~M4nScDKosgY6TeBrGPKJQcDFSX0Z!}9+^8flNu8L zk-l7_aLRamjFBNa56ct;zSm>qa~%>P!6!z#`i3B;ekCJYQs}(^OOeE;SAWG)*GH=a zns?SujV*Uk4>1lBvVam9jM)G|JfGh#eeJo^vSH^Jo^c8)G1Ws;L>jZ@(yd2!WiG|G zI7mwQVl=6t``HY^3pd*$=W>0{LJ?DE>MtzfbXB%@2GzApuYco~{$TJva|^&AL#jZg zSJWbx$ow8&YrC{ilgy+f*tko73{W&VMiH=<4-I?-ut+(dMN{A?HqmwBeoR|8NTPgv zUnP8cmwwk?Q|?-60YdW^yx}y^*TQ|k5luH;i(2AVn-~wvmxb2WRL@8puqRXBf*!Jc z_;5iePXc6RdvdEHr7%xt=`YU|LnYRGHBL%BCRGuR$=fChUE5&O)n-kkE_ zBC$j8OZ+Qq_kj?=rJV0oT5`8l5gx}t(U-037yf5BzaR152*6rUN4^;e6o<$IWedqS z=Lt+0Mz{@X$GW&;992O#f235=bf29fB-dUe%G7j*k=hE`EKi@%=)qACelfSW2GTt` zG@Tv7{u!1;$cpAEQM#@AP(BX+ur-?5AlJQC z&9tPAw`tgxU%fK8Uj&~#i!DTnZ^VU)?BvbfrKHW@8$3*;)|9t&J2t*lb1JObp?(Vp z1SBBnJg|S+op7gfu0bwg%%xXF>`4T{MB1Kp^a>ZfeXRSfqX&vilHcu*k~Kh!FtQ@T zr-tSqcIiq?97_%d26Vtd{k8s90W{3e+cN>4m;PSmPQ3&|HR>O&Y$0Kee{w^o=(YE` zTOZags`d1Fs)lHkk-aMy5Ag9gn(Si}DDQdEdh73$6OBv>WU0#Ro3!|b<_hz-%T&S6qbhZ z<$bj8#TgyZ01N9IyfQzAk;TsQHDF0-{w7a9U5C^3N0I4_+`%v`duCTdKz^E zFt5#|AcW zp?iS;m{?_&tpoiPR0=v$gBtarpfDkgZ*|M3T1;Y|E~ce>Pg^7= zS`!%*vuE>JaWC4>5(xd8Gc(2y;Ku1*J|1Mff%etx>{yX{whz{<(J^LHKO7oPN4EYE z=P2SYV;}ZIbHhTC`F(^5lzapEe5?WazZSq8Ge(xkN!i`Xu8&@eKqNqLA~9Gc2D3yBJLqjsC(&uDJBH3r_y{6(CR z4?U3HzOq8gAX(1cZLyZpI{6-OPkfkCQ4JKCV)!~AEnidY954}*ZBwJAP+EyAxP}z9 zJh>TprWq0!_P>zGV3U+}ig6^ROeMK6xVb)jYF&}5pr6UiwX`fzDd74uC4B2|U@P^L zs71;`xx}Er(F&+&+oUT6Jr}Ee7&Xu~a-FSl8oMgs?TmO`m{beGkxb+jsKud+*WdxPfBsnZ$E2Xx$m?slAK_$PW6 z`j>ZfHLiUDPvQS#@2#TZ>biD8G&od{1ec(}-JK-3ySuv+9D*iTAh-nxR=B$pEV#S7 zJHdMw?{~&|zwUF>cRfb`cZ_1}s^84#&UBwYoG?4_nU*VU(Td^kQ=@E1!feWnbe-*ub^46%d*?FW6YDp>n4HK< zM88rQ^dG7Jj_mWKk zL|sxPzZ(Gbf(@rc3Cec(eb+0rf8S-PCMln~z00H#ALY~bP=Uc<5#_sGsrp1VvgDR2 zCh{t{!@NZ2;Dqmo=9J)79mkH)o>eetsQ+L&_}FkzqjH?dy6~o?)^xuHwI!i)#^=Y8 z-`|fyzM}#^6gQ~uMngLZwd6h;=S--@i{6M%3*3?S z-|||h{_)r^z~@s=Vct!nuc-4U85rhmyWa2w{XGIk(0WwG7d47Jfih_5!q_n!nR|pNg*k){}5;C4J+J+;T}<@xE%CODb+B5u1``pH>bAE$Q=A$s0HS zb`#onPow3uQeOQqb3R_jTO=ZQ{q}h|nq=bW>3glTn$OmeUP8nkuUaa%dBDOQU#6?E zO<~5So6`wU%XV9s9b>|Cb}i1!4FcwnN%dZOQQ{!ID8H_0pus|B;L9u(@Kd{0HV2O( z*tH7hL%qZ0Pknv+t?QfH;crg{2a?TSI2FO{#nV5Pdxce5*~!3iu~ha~lPOeQSL~Tm z!G*?-^G`{cl|q$wS_cd7WmtXZ>Ge4qOTnFOYLfGFZ{8)_Pf2+1*JO1Z-QM05|C&dd zu_KCqkMice<}cN7#!2+f^R9NUoHZ1*IorZvy(bzVBDzO0<7v4I57P_1I}Nv(F_D#!lr?5i35RSP`9i4$#Mv1=aAqCyxS z*T?{a{qi=|!e$1{ktgp-&B=4svufi^-~#ygds_44rm?By_mwit5#;X$;LIM%ep%>* zIvY$C%JhjNOFjUE^h?SvXH?M!Qrqk$x}a1Iw(-7FqS1p!W1ucn>cY>lx$Qe?a8##e zylU;gYT}4eTGf$WwZK$MjjG!*U#X~Rl)t6M=5Q>z;j^4^+sxg0_)rnmX0XAT>X5Oc zpIURt$QMakR?2!X%b)lE0MrNIM2n?vSW#3U^$=}Ofsqws zh4{9|HqUY5MSja0qT0Vtm9%K!*q&DXr@jOO8Fz40={;|trl(*0c|MQ!ZO#UhX?cFa5%yeA+49a@@_R4fHQz&W;jJ2H zlKXvgm z$Su3egO`+ayuI%LkXCL=&v87OR}p!9W)W3B3eHfOZ^2%g8Rh;p(4*Cq`4FX=EObKR zJM|b>SZfmjL)V(pC}7gOp{;)w@R~t7XP*@OD|>&xu`OHbu(1?UFRGh4V<)ELf2ze8 zJ~%)Sd{(dhG4ifSXtJT&?A$k=7)s%OU+?R(GREfqlhlreZARpjpwBnsnv;2rqs^KM ztx>T7UTR<-J}eI~)m66_bdxMVyOAptl20$`X*2Upkbmt9@^$z8Y$4krhF8c*AEe9! zFO+ei2OslJNMg)_~>HI13JRM86Ku*7TQ55y9jqOqXA%@>~rgYAc zC#Xd2cdF?WkFOcIt4DZM5Pb4Q$WTg3@-Hmy3aX%f)6_}G4{1_oSy!uHPZlnJlM7jPj$Y2GTj;ZYb;xbv|4hll1VJ2;*op0yYLj<<|}79 zrxL4~{+iN1PL<2sziYZoIsUb)LiP5_ow(2;YsqCwCoLE~8)?0e^L@*hD0?H7ZA#MA zoewQWKGGq}^zB4V;Y2|h4zr@TN@)m22$GFp8euHAk^(#Uf@;Os`U*BZO#(`FwxZANR}1A0;qgp{kgA?2##4sM`H z8}}Th5ED@m-hSwjPNn2b*sF;6-IDFvapHqg+yTjbxw5Iy5?j5;dN~Hu?sDMWu$G{p zp(>LWz5l3+y6p|2)q_t!p<08^4dZ1i{sJ&9@%0Oq*-(uaUCnWG8P#95y6Z8F`R3>J zHxK1tva*Ms<(wV_WtV6X9JHxtq03Gt+b6$@VEIG6h)9x4gAy2ACf`TDyL2+=sHOk!A z^Y%v_t1}M*=mHN-_)b9|W~C#|r!WS6)AFi(5X$w|Qj+ljs;&1Z9j zW~Z(x=8rRd7pTm?74LtldL}OwT12L?P*S#3wDtUI|I8+T*FQU*_o_|buONTEl1j@@ z&d=nCsT5vB?at|slpT0J3~aa?oy+;SrtA8=@f4j$C3hA2xOtrJ`yM+Udm=6XIl16V zmBk-{)z303V*izP!$Tu`&BrdXxX3>Ou(!xcop~K3dKjf=gZYb%ve7eEm1#Fy7&9ZO{ zK^45jymNEY&>HoYsj_f8x~V!-2gtVLcY~>Ax0FUMty-}1@|0luOGwe$oi=}7iDQDE zo6T`sXC-+LfNZ?}vaYUAcdi0j#O6oj^0Tf!i`c0MbCnZokVO5xY@4ts`#4F-|*g~O=Gek`xjx9#RMm4H|RLb-<={IVC3IQ zDn1ULdl6rExCDR1CRA5NlhxbbW3f%H?f#VkRu=XFnsZy{!#asm4yW>3YdYUwFwBG@ECD_-B z@-Nx%}U2% z5N7}CTH%npXds{R_@HEjJIXVq>w)am9@Wk*b1|kLaqFGXexl#-lzc!4#KJC&f4i-ZZT{Ovzvi znxO2P@vfQ{_;!w3Kn*?m3&G?F-t_{XnLbHZ(u`(X4^@7p(LMQX@sM{f%FCqsdaTB( zIr~CtIdfD)_C}gLV`5fZBzg0kfmeO$W(-%>m?ttTWWfg;URo3f6&R~0wkDDm+0-Z&+smIr1I}JTvbzSA_u-9^1JCkRM z;vdWY4ECSJHKdfwz7lm|1e>t}P47a6hnX>#Wpz=xL~MN&pKSyobQXq?nxAya25`}U z5xWII*={PPXjdBqB`2kVwVYRuK-@Je>|-yml#AKy%WtspN_G_N6h`Y*;8!xEl|Os; zXM^{C^ZG+-rc3p(@3-KYD?$7fm%qzxMvKS_CU-1>fmr)R)-Z}bkDHu>qGXz!A)_Xx zwAfaORD2w2V}C`k^6+~tP=7go8CJ%MoDW$z<7g;y8U%kTxS3+X(U@_yuo<@y0kwR> z%A23epXshH)!ivR^Y4+Lxz_yoVS^<-x)bOo)U6|lp7XM3{#72)LyoWQg1@)-8(-*Y z*Ui?Am{(i~om}HM@)nr<{~!${LaXP$RRLW_Sxhms0ia<1>dmiUbBn_)!OAuv!$;?< zE{+lVC8xGqFT9za_iqp@9`Q*wXVY4HnD?WtWwL#1u5a(L)O2%(U@-1x<1NH(eQrts25)Sq>!R5 z^PymdT}AztrGo}V70wpyomC;)@>twSA71OGUntf)!(rJUzkJNsH@FhYLZJIi^a>vV zAlY))niXsC)p2rd9^*ib<$tTHd1j2~mENP?*t+TX=!4}v{rGOFOwmBhIKT9!=rV(K z)Q2Gb3yHdAyPNAoz2fn?sz0USM*e1=<4;i&*mPs%pshYW1r9>@LFv-C$X;OSo?{$cw=U~7(JCz9*47H_`?XP#K>E4Rl$LB zFZo{X$rZm)yx9Rh;^)%~zoW!Z#T^ z^Oa-7(JZo#&Sda&l0Y~=IDn7y zS{Mk)Re0ec8&TXp-MwCUuDb^zf2U}>&Ybm|ls`droW;%U75K85)X~;+j71@a)|GH+U1i0%mo2Y+L~-3VaRAFdR{s`A@y6a23Kw_0E=V` z)542p&kClo0aEjCUj;I*c!cgzUjfP^90?%%sY@ev2+6|GDxJSfw zccqheSGFI-fQW_+@;r317~s9607oWSxV>%kLXu&p1kAI@ik=xmL?MgZ%>v5)d>zDa zrR3Aloxb?^mCnPw&AQff{;kdY_8Xh}iAX}Oj!0a#sL$7_4@7IdkPWC{0lC@5^?w*Y z+GUX}j+(*aMn&l7jdVjods-zHSNLMS5X=v&|)K8hQV?tI~LVR~4y1VqcyGFR%GV;2Z-({_kwq6Ec5 zSAub#jI&mT&-K97U=_l%Rykx0MZywzxMN8EALft6YJc8*U|`y}Fv*Td%Gu6i*&;EO zYdZGN()B4k25+W=ARaY-!$kPCDQ#Kp5`%uF*{)ZerM+$M;m4yu4T zotDA;zh^~(OyY>jwimw8ccHRCq=P2$3gw3+dT5x0x}!9p@`!@$4bLqZ?NW zyN$=s5H2zhWCDH6ifI@^XDR$sS=jjN2d72DN6)K`1+NGmJM%?Fm(3VDy1o;(x~QXG zLfsw$B)^RGjTrPu9y?>5$sMc>2$g`azp$rgd2f7t z97fM)!=9=6f|$!`F^J&Vpk1Eg(2s55&~Hck$WMA<9`m}vN5{o?c`rX#UbmES&0Y&X3Lp3I@=k|A zepbwkCK6hHimW+_bZ=-NPZK5oQu7{a+~7HNWpr{KKjp}{O0f05 zY^-(0!WBBkdzZS%}nmJhIFYc@yS5#Q+Hll}%bTl%|)gvia-cky+_!K%y4kS%hciK%IWV$Q{4 z%GJT*(#_J&8+y&dPZ7AUhfpf3fL>Jx_*|Uh&Mhf*)tOzo@I|@Yf<94)^_QRg4)I5e zD*w`+@GgvOq-<$rai?m$z9Yl6Nr-&l2X@rhZe^U;@%DDsV0YKw@TC=%lL%t5_qV`6 z24c4)a9yNn#aTmO^ZNUrlr#s{2fCJu71qV}r>dga_`>qFF(l5jZ;^^*W_5JeteDcB z8ERDfm;M(Ub0E20if*!G%WJxfK;;@_LYTOrG<0{hbjs{BZpQ}%SN)vJr=iJHTo^%P|q zo3@fa(sjDZ{RlAR@~Y^gLn5{y2rmn&X;c8jc1P8r8DMjuJU{oFwyDUNUjZ-iS{U_8 zZwn|ibx6V2Ne>pqA7GkO;-V*GyVUy1CJI2;s_j9?1rp!UrIttEd;^J)V3D+McA#J8 ze<*D1z*A4|S5B%Wd~U7Xv>`fsx8(mJUTcp5LFA75Z@F8*T-CT9pZ~_Bo6@n)3ipuL zu(CY~IX6NH)^R97bIrnYCIvQ3iV7H?A&oOCWb*;7h%~6#l<)t1wbhKz+iq?CXrh<% zQ(D`&rHGM#E2U_l1X)VkWH=oQfLFVS1^9iB7y_HMLgz6AT)t`P9^QeZ0@@;3G2;XH z?xbyfg3~?6WO*4gfBqrU9D9kj%>K2+c7GHLj-=~pPWL_U??t7>=b0FPMMB%5tG#6& zw?w_HPWa=h#C{5J!$atHfn`3L_wzxb5yZ<(|Ag?u5^$}lk(7?HuFrGJ8OWDf6~(f& zbsaoHQb+1pqKYhux>mI{3GC1crpq~0+cYM0iJZhEGnL0$ZBnjHerI8PdYkcwYC}u! zNCOoLo?CZurER8y2fzUV9P^kLJI4OME!L>E^6;yETT@N$?~HQXQ!(^#SPQ4xT!0|v z%}!GfU1DfAk0U1VxbVN5zJ-6b!Q=1a>jX1kDQoH(c7$Q$x!`8g22Z}ptl19=_Qgwn za@%?Y*69jAZKH9L@fR2k+`l@|xhuc?;eRU9l)zc{ER)6OTrpUqB^>n6>mdTNAlamP zN}&4%2-qP08!7-AXEY9bNDbU@I>-=7G>QD`rjD;~Z%62K4ku4J>jN zl7|6c%?mv)u0jB(Hf>(z!&ip4%1KU!F%&jCn}?D!8j7(GZ(g991dwbEce!vphlr6L ze&70FaqAmp>9&+Aec6c_Be?We`&7KnsdVq+;K&6VL{(l$Huc6;7(w(J)w?ae^wamt z+?uO$+VL?x*r@nDjfM>n-apb#z%vFCME`p&%+NTNc6Jsn!ME_GBGw-Ha#P!OdEwV; zGb*abrD?o<^HobGe_?=tmloItn4$MGB;Y;6R!|iU7NM0YsrEx&sa6KHB5gJdpmE zi6K?jEoe=vP8~n=KS1++QdzDq$sLO)@#!ktD?ze`@G}E6m2jfji=JtGz?Xo80^Xnm zV86v~-2Xc8S9g&?=ldtTnzt9ax@Vd*!%p#aq`lEVx=}r#x|*Hq^8oe@$xC zUbkG=rF5fA_j+~oOh_J1hl>R2ebh$5%{PbE`=af_w$~q zx}FZNL2uXqL0w%tcG>n%_G*&aNN7N;}*_9Av;{gv(7kIY!gUZHs&(5*GE4tQpVh1dV0d4#3<>DnyKsN>=~^oo&nJB`#e)sD4NwCt`aD;^sXLh#ky3)`o(LFtggwfjxj%q;JI zqU|ob$#@~%ZnIC(=kqs>mTe`|NIr+WQJh5e-}{aAxPVZANwyb3as9WTtZW*RvL7zq zw?w&P*5#0|C4PI)S2;7l#YNpVBo0wwEFhwHb2e%05EW_%pqLLg?9-{fY0gV)qs5{H zDJgsK)*cN7llix|Bb%6;H$CsPJ-_90@9<7cPUa{__}1Pu!^P1gK#jcEAiedPTU!q3 zGXlQ$7-HhuN&ju)vI7}H@h7~PT0^`wb?D~LBjBJPgtL3|+9^r|Uy6XfEl71E+#AaY z8lt>nxM5UG60mI|}~ur$&#!oMs9{IZm&|6WSTmd}&PlYfif^v+7c>cHqm=S71&CaMs{dKu|Cglq1s_q; znbBvKIWax?m~|qwp%&n;;;3u5jzZr#e8%YcL~6o3$wLK9VMC}n0~EFdUh+|Qw9ExS zN4mR-`LBD&(BZa*lBJqzDxJ_CqA%625%DNI(7y@Gz*SaNEhRqfku3hQRMz$U6rvmd zh@l&{@I12oS+LI4%<@SB6-p9B(UHbRsiZPoNxw5|T-ST7F(JUgG0~*Gq|Cw5l4(}! z_8c?^PRF<~6tp?An+i!mcWYW$s*QL4iTP1#kVl-^T_`jgG0%;AM%QBh;AM40WW?^>k)a`GGt$CZ%b!<>XKG#iT*$ca5ip+uhE&?2$eyOS zgv0!72eEVf729bHu$hrVDE>*DI6wbI(YC2I;Xu(78*9ldm$=mPVeQbPQB^M@r3(oZ5O(U@hOHKQa=O- zOKDh?+pM(8_CRN0M92<|{{0alD`Wrl^cCV9_S}$EB+N)8OjcIbx&G6Ikc6jR#)l6d zB@v;%+b-1F|9u)79vb+&TTt)iWoqJ~;a9IjT}wvAh#oyA%5B0H0xilZ=2|89pIw~h z`a_F)7p{LE0(Mx#q8tHZt!Ch6rnRjA-9?bz+RHf?@~iLqNaU_-N85F+#MlI zOm9_&kJjulsg01|D)%Wrsv6y1#YF0Qw7~tFZn%W!$JF%X?+tT!B`!wibTr%_YDMCP z__O&Bw##)F-wLP|;A&Wsz&IWj92sXwPyXReJe}vX_+y)6CNha1J#s&bN*d&6tdvdu zi-tjMJ>8I%n==V-#Jtfu=9Q9~y6Uv^bfuf>sFU=2s9~sDC5n^IWXsYR`w+DdWI^cwzuyRcG&6;K8 zMx;hg>u1;GcE6VY!Da{V;m3qB_^`5Jd4QIn$mlW{&9VVIIfa84J-c~K^t*8m{~DDr zyNMnCHTtc#2X`w9Cu8*Qlk_a;Iu(8oQc88k19$yTZnZA1E`2{27~b#gRX)!;_AfLj zJ6p-m2D@fHWJ8m=ETUDBoqV(Y7G7wX{OO4saYRhaK{v3Oz%R4=!0g3Xp>u>+ahL&1 z9YO=G>l3j3rYSdrZ%o}c`I#e&<<|P9Cv~+JG4w;@`tP-`Vo+=Czkijvmp*Y&AqfbO zl#`A;7iG?k@ZotxpkGS68>gdQx%7uMz3s1kj}#sC+T13Pdjsn?ULwWX&#})e54I!| z%5mdM3UpmQODUVqJ=EcJl(L=gavqMg{Jg%MntK}Qh#nfoCMlCfCC$oCZLrww-ndsw zU<`MK?P`R}{`ujM|Lk+xAA{o_PZ;01 zdW3Ro$^E{4lV#k>%sfpC1KPUO(1)}H#@ccRyj`mq+^F)1ve!Wb9uYffj$yj5+e#^? zlaf{+vMZq*3Gl94%(%6xO}D+;#M z!oP6UjB`PY*lXRP{7m|~$IN}dDYtf_#4b1hy9bIaKxLu$56$Vrdjn{)*Z#tPb=Skf zzt>N)Z@O_YB5?DtkYODE=xbnVjX@Ou^{}<_BudzKQZc)KzBl1?(&H*AA(z1QbO_r{ zh6nxj@guBgtd890d*Savp&@<2mH3vshw&QbL5F`n>M`&tSW^&iKE zxV|aEb5r(=rUX|zd$sVh1zNNfO}yV`qfRZLabYI61T2$B{kWoWrSd*27}jpq{7{fI zeC~FnxlJYt?cM9?m1+9#5>5>c#sb*=6*Uoi{gQiD1qrnSPI&N$tOx_QXU6g)`hTVZ zu=xWLCW(H>>L^s_ZO&`ey0&bm6B5Lyq$cL(H^|X76GFLF-Vh}O74v5n85q@;Zql;T zD$k%$;a@~IN5I)8@aq3fdk@7lJ{7z$dAVBqfjU?6uC%2`vgD|&ga*zbQIsP!$`M){%l3K8kY zxS0UNy?=rjS)|%5{R+*g5pBD*m*|~)>))Eeb>2i4&Hdq}`ks}1(z|cj1MGHRYxtX) zWVhTY(e5*~>Ip`@s+oHV8eBgjrrr}1yAOl3lX@&8W_FK7nAa>3Hc}AGpGe7}7B8aH z$GN{B*p|@54bLNoj||3l#@X{98F3vxLc@#xG-qACNJLhmV5R>6=6kiNXIvK{>nWU$ z8>;(N$=K9fDxx;>c3&h8HOB|_8y*Y?DhQJ%cgQmWW+WeGSs3vqhEX@mVoEeWW_D5q z38|vwJ}Pmkfgy1uZ90KPT)yQU^|FUp?FLGOACEQx0d%l8gKNBMrSpy5?P{nHvd2Nv zTQo$;Z{NO0>(A#iB#kVW#SSFMNk%vhtOd$QhDUau=$=odiy!zBC&A-G?p8oxaWC#F z67_$(tE3pK&nmPXyG;H2xu+64*`}^) zO>QX2nuMYK5f^p*rbU_-w$HuBLpJBTPe}=7-tiB=^%tu5G5!MU;IaE#_6EJBW8_Gl zX`cE$eDFx)00YZP_imVqZX1n2BnK;s^!DniLO+j(4(r#OLduKrNW%T2ggd^OwVz7g z3=UbMoU0GHpJ*`ycv8`WP9LnB{iKZ)coH?6^|LW!6YYG3eMv}&$GaKU-obDMnIX=O z;!t#(CH9{w;)O){l*krT6JYY?^_p)=EUzU_BHtxr)@Vfg5<8$%Z{b)~db1HJB_IA^@7ps_$`jVcZ}Tz@#HNS+TLy-qe}WqOE|BT*GBC*MKdlPqTK`c z4FOe&W;t+tK?d-EMh!ZK_9I}J!eHR8_P#2*9Y^CQzJ5jK(SER3GMQnLgMqNIyE*jqvG=p8HnQk_8z=}t-MxJ`a>t1Zn>`~?h=l;sIr@>q$1f}a?;pctFN7L)ZAJ;$ zAS9wI*8svY`suEFF4!QCBEt*<_-RdO6hy;7TIZ82O0JE$dyh8^pQzX?X0*m!U>FdFN_3HN{ENaPXn9P+|UtNl7RnfOr{#<^^iQCX}&6 z5re1e(_K}OL+h2;Oir}@LJVla8tU!0G?0USCdeqQ`o=cwkkXTGBphMIMKg^0AR1tV zLW?FyQplRRR~y-3hR^P9s!-^=7wS5PEtNjX&PjzR^a-02fcI&y(vZcSnpSt;hs%z5 z=jj#mM-BPs;GZN~Tu}&NSVR9xIGLK)L!tn6>Ubz>r5*N%VTB5OIA(XD163B7b1gd~ z*ABaYl9Q6-E4TFuEsnGotDx*V`-&yJ=_SpHH3>D#qGHXy|M*l1+g47Z*N5 z6Ob8ym5bRY$n^>jp9eZ{UFB`qzk_#eCFhpC5sGYTEeV)GzCW-ZkMoZq#Wp_lw+>|! z{7gKI;D+iRk5|o4>A$RZrJxI!gQ;wCV|^m1+(ZN$^p}tKoui_mQbavDNr@p7=dzZ}sL6z0^P=PEN&oFp6_}s!tV)EPiV%Ha(L` z=oUjLQ6aSsrQf(ZqM>4yv~uUv@bk&WiDoKxOm7K#(Cp|uCH4v|TVGd|Evt6UJwb;* z|Di<@AzWW5^9DCz>2^%nIk6=GArk% zc=ytH@HyrW28LZ`k^Jxvm!x@3ANn4C3)ugV|Jl;>chvuy#%xQ`LL+GQ9ifCC&+n+- zpQ|8O-CbL|nBzRHHF7K+mx8chHl(5++#jQ69>`ov2u)2U$f~l=&Q*=XYVsAb2t>lg z9oK9eb&Qhgx-~)TuC*ttvflbr=FMkvKZ8po>myq1eP~`oDO#lV(H67V@M+ID2pE5{ ztKmg=?=c{VD{od1`s@Q>rmUQp;wSIZ*Y!P7@@atij9hPhi8mbn@_C927VD5(~@J%yU-3gKjJf#So(}C<>llS1%>wiUea{e;;PK4wK;S z>@E^iyMiJkb5~E*5}BC$()$&k^|s%b=rz&C*xLiA97^OR?OCoL2a&=YP}+;9+-DwM zd_fdH17j|tFCIsunLpuPr-qwQ$+cYcd6pWqd>K8K+(G6bINa-Y8=dPa+}XiBEN&nc zD06rKmu4jTUh-SpDT>urVz@h}%z#e|5O+J&W!C@#o_z@Z;kkH+Z zFvglk%Jb=qe(jG2-IW@{>!JH9tWD6gIohku=gX1jcVc2))6&~xFSyg24!AM<>dwoP zBRP?6Ea4GJFYD@duWZGK$RoeUp1XZTseswQ=~2iyFp>A>o?OVai%J`w&Zr(Ti1?ip z==i#9frp#Pm=TCA8gQdeQz8xsIw2_Ome)9RtizYVY?U8B`sdc(WH;{oSI^RWytfqs zkOti6A0g#FpRW|6B}7ie9<&j};K6LRvZj~P96KoZdr zR`2LRaQEg78uf9QDLVOSYPMf#%KFMgdg!i+3-oPnvrk-TdN#ljv=O7|p4kJA=-t)p zeO$Y)Xeq+UbY4IO84+b|MdO8Wp_@=j=={>v?)27DqML9*IQz=Cp3}KSY7|gCE0LU$ z95-S&GeD}P<=JL_8=H9)Ps$zp@V6TsscT5UdXc_?T;Kci{M{7)OSln`uVg?;`r&QR zi4tEc9l5b_O{9#*halb+!6~WcW$&9Fj`}Y;G0VqxbBa3jLJtR-pJlK3OK6$CNcU+1 z;|Gb=#q_sxE66#Ld5)927s>y)-?5S&`(vINE}1ySxVcI5pMZ|uZbqbEG^57?9YDBdKFbic8W zxd`F0Z`DReK9tw>U6T%GM+_|9ENx#zx9@SER?9-RPA!dAfQj=Q+C3Rmqm^Ml=jbGq zfuqXKmEAsu{kdg}>~P6Gwa0EZW9&~0M|U{eJ6kPNBWm_8itDUFS9OMw6p1U_Cz%`? zSA**Y37$p=mLWN8(eZ(Uf~V`}5yPHkDZ;}lwEm(*9;@NN4OVHmNF_5FpF9~p6>dvF z%SJ2YJ2nGj)63c88i}amqxd^Or1_Q86d~n z!Vn4O6QLwFxAS{<7(4eAY-?RlSi96uBlvTNYUhGuR#Z|OC(Cmrg!Jyz-7f+eg?idi zd8VV=?bZAWGoCFPF#?ravc>l8fKMSq16a!`GZ~j^_6IaBdJaLX5f!7!~cO9mpfhtveE}9@2hh`c8fb48Z zq&xyCDk6Axz3wY^A|#~b3*HP;H!0t&ofFeJ>c*o6(Ee+8Q?djJ6)JIlUTC)-QI{Fga@(%R5{YhC zM;bv=VUbXwK!S)bh;9y=cwrZ~>a4Y72BHODDn#|I$*1MHiQu8aj_U0q#a=gQoDr*< z6Lwv>PN`d`@dWs6lL~hxnVDHh8Jp-WFxlc&VS+k6f`$`RXNC`k8gfXUg9D#!H0Nff zf1TlPSRFIfrSdxat-q%31zuE06+U^i>Ll|AH{NJYsKMbCPi!h26uE?FDD`Ia4gQN1b<2?@QT} zE}VNBPhrcMX{9d8Mqn&;1RvuUo4qwJI-0IYVlezJH%yCc3knmgcSa;XS{8OwQVpy; zZTN|z5WH!De}z0pD~z}#;P#7ppa}sP+L=FLTCc8KTwDq+O$*WE6xrCsNNJz%e$&^d z$mJ3ZoS^vHFg7!V^y8jnEG`z(6cq64S5ml(QPp3Cy$oBjN8^)IOvX?jP(hW4*z8RI zWFr}JfRx<>2{PayW_n~;kc%|~;{8EXNr>pobKTtL0f3evcZsQx@V7~p6<;iY5Lxg2e{ynUA`Y2uiBSsJ#FPOyg zU8F;|TeWM}J^ac@5TX4q^JBq+c1d~VmgnTdSSTnuMad5$Dk`wdYn)q$LSJ18;eMT6 z#wvWN1v>@v&sv4t4^q4f0F_1`o&8=KojG-7`K{bQq`h}d7mOju^&Sy~@BEr0qksJ33 z!f{y^?!&$Q?k~oLnZkbz=a5ved5!5{ctseEb!AXPw8S|u{G?cPTAv;yyt~~oNaJew zI|T*}Q3i2obSvmfxD1RKoYz-9UuCSMH=xc<23@hF4_g>BlKGf{BygO_QLXfj5-|3? zpW7*RC(`J2xH!z6;{Q-4o#Uz+$S7eU8jdGV)Q|8ddhn~`%ba4mtT}G%thT!gDw=bZF61qD?nRad!j>%=IfD-rA;idkq}6L-(F*0MZj;g0X$&k9XXw4>j8LzA^VUEZ+r zBGW`XuT`zzb`-XqE_y~rKS-RCoXiyO=v~ljC725iv-RFWS&yNGs*-qbdJaP3dmtOE z3Z%ZRRYwQyfqRKw)gL`9A{o&aR7$!l6Drn8?1D()u^gxoJ=5&cSZ>U_gyD>lF^U^< z{B9l@nk&g*^kw>@)sk?)a$9f*0kYoRag#AW)p-xHppZ-@>{E2RJVLT zAwVB@uu~1>i*TIQ&hgAysEiH=t-X3soOLj?JWF38u5qj!4p#S!My%}G;i03UH{T$! ze;d`P$jw$UM(Qz!Q>`a*F{1Duxygf-$X|{q1kTwd>f^S150?1Fs&IIHxwC^xtM4d% zl?&n-{up{HHu*Mc1To;$Yw5L_ zI5hTog+IU5g4gC{i&XHNo1Hu)Kcjb@-`T_})=raTvX3-_1XR}7xQ)ITOQ8IWiM8VP zcE1M40l+w00d0oH{8(M`qjdhL=H_mcOuE|GIHmrwZ+$u1cKCnNfpBt=U}R?ge+MJ& zFru9~*_2qNh{Hj@f=yZ9{|>^V%R~$sHT;63+a%YLBgwkFYhOY$VS>Y?HG%BDVRlU{ z(uPn{0B&_e`Y93Fng~L$Z&D1Q1A2_&hcm(}RWJu3JGsU|8#3X1qG&O=|jb9}NY6mQP8x@UDe zN;F*jtB(Q_<%;oc$FSk)3^H=Q^|37TEf`UTM%g6hEo~3x0*TTD;Mg`74j&o3i}}(U z41x(D;%x$TlKovp3o_V%R$q*p7RR`(ADd6^{ic9Cqwjv-D2l%57l^v}N{inMmdvv0 znpRk>q@g5;pFd%6E!Jn1hIZNs`;J;=5*=j|(VvY^-&2?DD?BM&zuwzuQ;#ac#xs}InGG@5B3tSa(~b<7FL4{4OZ#eIoMw316>X; zMdpSp2~u$}djVbC{7u_adWPTcveu#no#3tFH;7qSNa=b7KICA620yxn#o}rK0uF{z z;XaHg9MZpN@d0C!4GXi8q;5Q**l0HvFV>B29K*!MW03|F2NMIh>mdT>1Q;?M_-KLW zQV(CC(>r71RTm*LeErPdm!=oHUi^O)c8z^Af=ySc`q*I}B!yM5{w8-u z23t1g#UR#huz)3Jsi!?ne!sKV@E~SETj)6A=z4)S^bnULjl2P6Y_wIAC&`Ypt;Nr*Pc~Sz%Bqm$s|x%T z1hgZMeGXvZyBSD>P6f3+oP6MR@peXeej(UOeP-C~yb>(C$6JvFGNHzbJz_SJ4fjJQ zgS~HX?s!F_{ub*9)An9nS$3mE=xda>Thj*;MerecGGBYbai`5_WlZOOoK3`Kz+Jua z5sx<~))z(;!RV{U8kl<%R=-%9@y9Q&GtT+A3tX?m8?-73X(nOQrmxyCQwggV=m z&>(KXDjEzSYX~C-pz3eqXK06K z_-Pi_Y;;@CBg|{D*bi3eq87F7l6KV6@iI%Ri`CR7lQ{^t`^%9%0nRVmlD4IUvtAMD zeL>KjGv%L>t5M>_e(uiq@A=$1;5SSQTYPXFL>e0TK`NvUMrc&qQu5Dw9q?)ipD{YI zYyz@v?V-|upI!rXlDf>6zamngWy~C_r6`2bLypQ&dW&Sui{+kc?i-C<^J(e1xr!gMw-(~DHj(6Xs47TL{ZXm0?M?_(6PKkiD-kla0oWL?E^!8-ybLS4B zOpw}2Jt`C&vqBKoX)jXAleOn*kTd*&!TBt&dObhzwVPf0f>hEx9;J(q6Zx$E&M~Bj zbnr-9{Fcm`_p66*i5bosBt!|)tW=QjNjD`2ZZqVP_TqAGF+Y-;*bE4PVqr+(Y>g3v zRA6x%bZ6e@IAG6(t)U>EsbF|MQF%_^4(SiyPPoOVihhxgus6Hm%e?x$+Q1u}N@!fJ zKtdp9P5HEXGF0$%{Mpt8JGvgvSeE)jwn12p3w_tTC*uezkd<5g4XLX$Z98&#*<#OH zz-OQaEvgCooTQTcjFcG{ZSK9Dr43PNa(rmr$3#^H-{8KJBHB} zam~#}+*+3Rn@31*a@;5r0@>>xwfp5;i47ax{L!&k7E%IMoU;ejD@ScHCv@{HDrQ|-EIF3u`ufv=aP=49G3%*d&Qp!dr z^Siid!!~zew?fVwjx?DIRKM*6jQ@M7?TZD)md=(GK+7M+LM7ZBhP^*6(KjHPf1J8p51p?F4W~UAGOdJ4JZ=$UOCH}v>LRfFPYAAQu6raQ<*n3Gq%60jy3c8 zNe_hw=Rh9{3O0mFs8o)xv-xa@r80>B0v-Ia!6U&odp z_XPqJOQZ*b*oZ1`XfZo8%5@d-&g_n7#_{JzK4iSJBwSJx%B=_ajh)9wAI*Y5#Kekl zyoROSCQ}(Q+N-aMQ*Vjv;?Ae_8Z;*gJ1U+jh3uy|BJG(3ahGX+oe;wrCTHg z>F$u0?(UZE20>c7ySuwv>FyNi5)hWao(sSC``>?G*FM-M>tL~%bBytHjQjC>Jb(UR z7)hp;K-t?zHQt97f9K7QfW!1KV(Cso^kuPf@plUg+9qkmc zfm=@u^1&%g33{6(du;c2IPRF}GdjNNz1RJuPl`?3X~Pk>?z;Uc@s5PKa8b05k9{1e z&iW_z_JP+D-2*-M_H^idEnk5+oAy#A;3}XBwe@bl*di12ZM(jozAgfHRIRw5Hk-l4 z=38gS9eBS%1EJhAl7X}@kgSjg*AF&^TW#5uTAt~I80Li*-lDXF@srQlZI3uv-lE1P zw#nRrScYHHv>^sDvN5JE5Q7bfBg^whtr_GIvMy!bX3!CUFi=ZdoV5bJ{v5!L^3pBc z9QdF^E$lMno)4k)b4faU1A-h`(qTDaZO?)`K7r~smaO3mf#`S&4c9$mD6oN+0 z5BwUUhwoES0d7?=7N72d&u=G$Rp=1FVl{rvn`VBriN^nO^rz0)$n|~-T#5~nmdJ>0c(m+zi-0SQYAE6}g)>({Ln=q!6QHYmnNN81> zf3rw3Urt}ySl&BA?(@74eMB}h7uEERU9OD}I#>fK^>0a~rV$(HGkM-M1kC$N3Y|m% zJ3Y{?aKfDts`h5$evHPtS2hjfC}&lYRLdlol1@Bb4+^p4-RRS#4eji@M)A2Z#reB< zI`4w|K?V{_#6MJI1t{{Q4Q-hsA?h{Xt8lb8gnNw{!g>&!!w~C4{cfQfaf*mp61`GV}d$W2|Ba3U=_O{AZl2esR)I|~S>H$wRt z+3tum7Lr2kP3mHNvWP8$L|CX{R?pE8a=oPRAi~D14{|;P1~NLU8io**&tPt|DupL; ztudWXe~DmL^U<``2I{+bkmR!O>k83yRa&~ar6Pt3O}F_E*gd4$4QVKreZv?X0M)@0 zG-pH_x>bTg{pBHYslB?1JY@8XLOSIX1s9XwpFg`~(= z`UW5`YU9g-JzJt=6=x7bs#tN+MF`E+>ZiMwU(0qyks->4VcPY}b2*aHzjaagRONjE zy{(@WPv1q6@#DJS3G-BO8L$!`m%8^QaqpQ4rruT>DPZQy(QH1jJBJP&B zCh`hfZsWJW{lPl7>Qh*Kp%K5w13#sbz--8;({1y?Yws>s3H>|SS@j>A#pl}xR-@-_ zueyrHxA*SvzCBNL*FOYZXXS)*l3^C*gu~;KvltC;lJH`}07wsp!c-M}`%yTyhS2oN z3iN~<4wrn{1Dl6&aY_XEL|+2}gb9dVU-6-$A{Jj>8-{{Yn?OGdklH*?N#kclvVn!o zf(b@(_Ncku+7uK03T<}FFH++mG-w4<2>kg8QE`E(b z2*_27MYPzIMWe!E!LT5iP9EVOBz)wC(Nfm9K2+~NLKlm;Nh0seuUmY-PlFV}rEB<| z{0*j<=$kx*fn9Rfw&VSdUeFNf#<`RDimAR@;NE~_Z=IjklS8v!=x}kzW}V%n4Il5xpUb-D1y$9z=rfACjLY};SF_pAQ0JQKSILYg1bRymLL)F_ zv6EHFGS=t*KddU&$7CWBoA2?5|m_z}Z6Ly}t@c$hPNSWAVG~H?(ed+NEu;J}X-*+zE`aVWXtEbB1 z|Cymn9;6ir2Sbj)y%d*ImunTl`FQw8IDA`LNQyo_2u8#`pP%QQW-nG}YMTjK^EL(7 zx9vF@dNmQ%e0IdlHwbtaVVnn#C~oHM@B0q(x;vL?(T!BSYca=P!>C#)bYP`2vA6q+8(!O?7>-ZeV+`C;2}mfP{abcjbk5%4n+>+ z58X|?GO3mb%+CdBnx8N1f%dQ9f~{k%R*5@QAQ;R|QX&$)t-Xa~t+>&S3HCy;lg)i@ zf(<5mn7DJBgI2ndkGnM18XQ8c%KeWxqJix-Dmoz?Jp>|lnWMHna(^@u z(sM^HX6dVhJPZawHL`-d#!0WMHi0|X;6GRa=v>w|3kDSaOx(Rkih+c1*Yec8zuWUs zDI@jJaMKx8`eMHsnku@xr_cod9$BQgzz-Z-ZXGTefOX(Rcc)@tA!W6~4@xUKdgw+DFLKonwX>yg<{eqKZLCKGb9NvBnXEkCy9a)|cr9L5NX* zES9}Eu0j|QgCUF_PadExPaT<|MCuZD_D-QgFb&ZX!{knn$kH?M%f&?&>5mEv$}Hnl za=AiDv&F_+TJSB;LPVt+9T7CCV($n4O60p2iS+-MMDigb)T&KEy8(5A1PjE3#&ZNr zZO|NSFlUR`7OIG%|EVAax>zs-93o<4zgn~2>p5NHRjhzmR0tdxoD{wf6RV}Tts9(s z%SXX1u*4io3aOu4F1I0ng+9qF9f@VqLjCpD>Y6TTMtPbia_ zAbjqRC^t84DMnT`Z|8e#?$m-mbiKQ=a^irRUMI^dxnZDvaACayc@LKs4QWKz0218FMgqiqy3Wc^XM=FNB@s_4=eEv@~F_*7!L11c7`r**K?y!J0f!(vqxpM=-@)-90WcUX&M|XijqTTW)`fdb5$6^vazq;xHH$3JA9dDu9A=#j z`=p4`!F6NURpd6@`IY9sxP9Rn>L4P-g6SDB1IjeiFhY7QO>hq$mVU!%?R~LK&rsq! zLL(9nl{DC%AZ^Gq{E&vIl8w(9$LPnCg7O}T0bD?YrTc~jcGQV++<`MV!wbGRe1)H$ z^f@UZ#9=%97nkJDLt!oU1;>g!&n}h^G`Yp9G@ej&F|5c>o6(e(=0f4!*fr7N>9#?v zcFmbDC@qcbZ<{~AqZIy=p8ZG)+liQeVQ&%#>uT8~vug-S6&=^HE*Rq3 z+ly8~L_;odsfR3IId$DnI*CmZAfxprwO%v3hiW zR=*sy_<2z;*|@svwxL{e7Sv3EzEf`cY8C!mR^e;&?fKker`obVu6geY>k#B{Z2XZK zId4=@Fb}w{gaX#O+IVRB~$`({JDY=JWc&PPL!qznZtzkb|eR zk~#OoK%Ncr;tN^*tf*VLM=P)dLhLwRM0iB}AzS1c^bd#*bDQnCs1zr)C*$N)@7%&@ z%H4N6t1C4D>SWrc!7xY^swz6XVKPuE2}-XC;?GP|q>Sw|Aw9@UPZvLqwVqMZhLqva zh`-Q6Dl0-@bVm~*4Du&NP;tKMTpF5(B467CyyV&#TcnPf!dIDO6#zcmSUKSTrZ!nu zs};*ZkkG+X^?A&vLa&MsV=IVju|4o^sw^VwGa6@HBKpHdONqF4o$)UAGb8kI!Pxw? zQ*!vW8(#|uDq*&r5Obr&qKJE_t*HfJMyPRulDDE^ro5~^Qm`ykorn7+{jXWOc(ID) zq;VTRV-%)HM(d#|Ct4C5A889~(HhfUa+6FT4eqc&(hvvvwJ(Vq#_*@Ss84%3A27Un z+A5@qTo&m%WuW$Evi$rvm%0_i<(D0u(V^D5kBz_JgB=7@=k^`V&My?#UMckPNkb%* z(8>3P^uk;#Rv+k47?_C8lS7iwRB5iO!w#pRQki5zBsgtNi71AG-tn>(a!h1|9h5PX z1%tlBoX=dl8SbZFnB+_{%Bi|QYS*LqbSU5yNtcb2XF}&6LCh?0?q~|4!US!(-I~ZS zFl3bTtSN8I&<5ovK(2NTzaczn@sT%k)DvJ1nxF_4q=@_D2m$BF^}|mw>evxe82Pmd z!X>|rl4yAF8M*VTS{>2Qt=Fu4d`KEFg83vC!RUyYVy~#KIx^_Y1hY5+)qd4MtW+;3 z5m1@iQx8S%Y-;nS6ZQi1ZYLlJNlC*?%%J^=X-7tA@!e?YF={Xjx7s!E4y9=xQ?=Y%23TL1S5A!5Dzv7Gw&*BC9#!_GX}CT9XQG-2p= z@aq_><)melw2%pNne8sR84~`<${2X#QA#FWG>v+vY?|J17sFspzw32)e0}6#p8sl2P$xSiwGdpD zWX^!1ha~?~g(QNZ0izW*i$ldq0|!wQC1;(jS!}td`=Lq)3foD-W`wZgW;;x|!R@*4 zswj@~$NRSM0b1%&uWWCH8P$F@42~RT2zgFmp?57)&2ciU1eecw2I&3J&q= zk%?%lj+F^WA=1tg@03I`l?hW?vD{6!JQ`!o!o?~6mXdh;{2Nb_0Cc~!%RiC+)>2<* z>87WZFj0<|e!k%wj>$AYcv1`5vB!ptLvJ`r>pke_XCd=>v^zXKPVnWM;Wv5JL$EGN zLqij5lFjNLF4+71SRw!de60Wi*-p(I+g%tNu*n6)ETWVd)C9~JW@J+nNttZ32}cs6 z8nFflxyQuA`twPwj}V*X5Yg7-DePRq!P}wu#{Oyz2UH_t*6z5ZFqCix40D?cd5g!h z;gSeJdj`5}*N$YuI71;Fp>Dms@z?G~0z9T0Gx_pcK8%dUE$A+a0Rq8S1j9}~&S86v zhg?PqLx*455gXZPOm!^$V-p3Pl`uG#GXt7hKTop;slh;^_g7s?F%>no zOYZ&Y$AuLobL#;vp+V6!YQ`yTwW{=x0v&Yq41rE!l99-<`6#v~_de|;`K48Ac6x1Z zP}teQJ-O$8=OE1JJ}e^|;>yY+)EOOhW-nCIcpwvA)zqOIb5rF?ppAjBy*S2@6HDmu z>!&l?p_`%^g_DuxXUu4w4|iKNe;&qs5MfJx!x4$rVd@}#o@=_3Qq^wm+6-M=9;HBI zV0{&~c$^reyy2fW)M5cN&N$B zlF9PND6X^*LTuZT=myR?3gy|M5bWro;nLEJE-aVgJ;9?Kx8_V-KO8A)n-VzZ5D{1q zCHw=Wg`uFxb2;QjFs8P?dpFgSw+J_5@$j7R+(cIu7wsXfiH^AtUZZtaoYyCPA0~mo zU_|?{-85asd1S0SbAewp%E{wk1I^ImBUPx%vXaGuxP;mgB2QNTF=54s8irHxkcbr) z!vFISLB|Bi5@_Rz2?7$Hh^I@fMa*HA7n=oQ8@FlOFp`KfgN1}r$iV3<1Pc8^OGP0n zx$GZ|3^J~dKBs|I!*IX1fQFv(UHE_yaiNjV>hrcCl^zK0=v(A9nAk=i8C!INEmL4j zVUp|eHD+pJqEomkW3_=+;55Y#fkeUf&h4IUI0z9U>1luRnaht6V-S0()W#~^tES{k zHyT5)EB4U)4*4VzsB7Eo5Du6psRIdM(tb-Bgj8{Tawm;JGeo1&K?G?89dP8Lw^cfj zkQno%ed%EgRT+D=MU$27yfpe|gLZc5U?WMQRLGiC3!8Tr6Y}vy6+I+7;5$h=Wbl$m zPyrXeyc49K?8G-|{v5Qnkfm)Br#G}px*{ZvHy?Bt{l9!sfK|!ELqxcwwLyQ<6B`!$ zpi}W-XV>TwpT4#V-vtj*cpiyZQskmvY?ei9-1+X8l(~7bv$HGx8`fwT*z&NVi~b0; zU9ueo%j-5J17mPDeCWtJ$qw6H2}c75JrFk)W}y>a+rO@oM!N#07h@tZt+bYkJQk5l zj1||&8gB>*<_uAcWvIN(Rd}7Sei0&=MZ%;*x+L8IDH0VQi>-=~lwc0u!Ol$0&{5>~ zmk;ibtSG|`@IZOfz2M_I5&<%sgu%C-B@aTo4Oz-0CDyu+8+`h^@u$1^3}r6`MK8Qm6TnPWvYW1R}K~AM88mG(9}hklWpM z+vZf&WSl(PG6s%6)0G}K@2E0a9z&5c_(Q=&W{@F|1tR?1nwomICvRK-b%B!h%Q>jC z)v}J3UKKMBaoMK-ZvNGe)C88E65*B~2HN#kMW`MS_yzEr#g>=vu0}tAwt{gOiqBQ0 zO|8SI@(RDj5o^X{5>h8JW?t=|N|vikc6@({p7CK9K7w0g)c@6|n}a(6V~b;o^lFcU zuZqmSIs_HE$sqpA7L3;#xEG;=Q*JeUDlTx8S55JsqkXQ1`iO%jr~Cz{;tVYQQ1n`iFDSOWTB#v5;2M`yv zci++8f3}1qM^$Ga3ly9G;tvHcj87v_8aL0JhS+7*5?eDUtu;*otDMrXX8_8Sw18v_ z3D(CX`sf7tuyo+%rcBCHrbyX`Y11ka#f1>kAmEu}$H2zLq_z-g0KHm_{`0d~-mItn z{eAVX-=yx(#<1*5OyNPt=8bE=FJiI#4ntP1f3U!puex{1=4Fcg$bvrN=vNc4f!vj@ znxM1kdo-T0tolDkUIRt zHN2<%2Z6ec)*zS9>HGN78AWP50Q@ zs!s_P9aut*Y}}vAHxC;`Dk7u55`7^@Slt9&ee9IrzP(hyuG(tAaO;M`v-M~CiD@|~ z(i^_L16f;ex|aWrX>+`HJgJtvjX+P$BG`c!-k6prwMCiL*$-cI+AywGi|{u4++0V) z`N%d(u=2Nrx!yMEkR;5aHoXjF8AL`(x7`lA+WT8(EP3GmZohj-P^{E)s-OiZ4e(%u z`BJML5e^QVb};mD$w@ZeQceLE!_rr{Psp9PfVARh-yjK5K{W=FC4B4?`YB!eMGHYc z1bKRHn`SYfRFrxM5wJvZ zgKozIjEAYoxjpjLx_6v_Xr49l{ECSyNQ}3S`s=3f67-MEHOgIZ-wXBpNYtd?=C!Ax zxo7;zq+H@&${QbMw-in6wl8a?wo3RW1}0yap&!DN&Pi4)PtCfz)ajgYK1Vu@#6j&1 z>&ior>pI=~CU!0UF@99Q_|ugZ_AE5P9q~CD=T41t&C@^^<`@vmaHYG1kW35 z>#FpqO>y47ZR%QXvimGasVArlTI*6n(b-fd1#Lm<@ESGgx?4^kTl3*6iOW@vRqA%t zIjuggxV8$=eB*eH=yA+jJQMLYae0t{dgt9Wy^do8M~2rSDZA%k#>(x<;?r=p>YD5$ z+iaGkxLjtdYWb3^`mnjnv)u_&rF}EWX5;+*%8+Y?k-d)k_q9(|x@XMuMug{3*5hSG z<`%0V&>xT(ztJ1*epFT~Ix51gju~_%S~P2RKVIQ#_4TL@(Z1V_1^}0B8C-{Mc{GVx z&wt3thLLl4w6=n`@`OC?(~_W5vk#SRPcO z>7ZGUxG zWX0!HM*ARiV*m!#Vri8p!LMKm2Z^V`R0knb}Ja zxLCL(vr%j38`|bbbf>q@*rn_>X?xDSz9Voxbjl|E9$#@v0J)W;WwPO{-nO(;&@CHF z{chKG%eMZ+#|&ZFd~#|haB(7H#WPV=P5Zg>`@1{M?*cK)gN?I|>po|W<6{ShcY>Sl zXdByt<)ITJyjebaZ<#Jrm4bZq%5;`D8M8;%9;&jd^z~LxxtrH4iOw8;+xi`?w0_Xi z(pbCQ^}c{OyUqZ8+h$TVrLP{ZiPGk>GB(ZTjz9Y(`8sLv()YW*U~(wsCn*^85!e7s z(8O`~v;A{oS$VnY=89D^2k2?$$+pfolq1+(n{Ub)ABs_LZB|gs{D*&ii9^dFyxBYPzN&V<($8 zitmf=3v-f0FwQ~M+MKSNtzXm4ZN*cq=*Rc#{Z{b;$-gf@*tMtl*#CHXbc-ZBR?eCDAG-XGh>AK57<-eA;_d6Tsaf50bfkpdf*9p-d`ntO}kBT?=xhT>hoh8+kS&%+o#65iL(X1j+N-U;nl8hjqldN zLsl2ODm7NuQrZ{C)`uo5&znBXYg8Ye@VL$3B52yiJoY;IwXKDz+Vjo)3OTX*gb-XI zv-Y^sxe<9fY5&>NKr%j8z~o!7Hg`|Zi4@3$ZI zle?=o_OqVfKW%2WkZ!e}JFVBMKlAI`Kc4#Xu|bo+d)&gaxArs~^*%Y40L6efM?%;a zKmr4x=FLa{qoKP2L=e-Z{IPvAJxCIaxwg~+?C<6~a8UOB0MK15B~&w<2x_}fcxSD- zFxfhkC0cL+;TH5TE&3H?tlXN5zE+FBl&N^@TY7p`)8wKdxW>jtt(#c2`8k!SMk;jlStKkFqrIB1J#&D&MNIu8R?o0{<^W zCJrEEErija*L9&x0;poq0EYKyT)?+lJ9Gq1-W=d>o@?iwGU=!lRaI&zH!fDr+p!C{ zjg1W@3q?t(nd!50a}6{!#qT);3>Oo$YUs??zRCj<J!NY^nMK5(G6?r@MWPGSbX z`@GT!36*uVi(QHMl5UkFxcg){&prY;*IGhQpme!2jw8gZMwR z2fPA#?;(}F>rr*BB+AY_!eu5QGLusTOa#s2TH-q-Tc$Ona-zESVr|`a*Rs~qQQvtL z#=8);H~7lWTd`GlH`Xg6~*aLEElFypRaCz zAOsX4cnR-l7erpTFbe#viU0fbuo3PZj@@Bi*en~sQmYVL0e;fFO#p_DgM?`UCgF}~ zX@Lo->``4;*H@13^lM7^^z1ZgvWyN#t8~7!)H1W(VYH7txwDL%3A?VNBV(+{kpZR- zz>}9!LnVv?%Yc&_@R*fcYV^8=ATI>68g77nNN*|7uMDwBz^Jt7QZZoRT>pP;zTiqv zSU3O=g07ZKN>{fsnwY;r6#llft!xb0pFtxr)_M`-{P0aP>PvKCoh1=+Km{p4683N=cDWshG@R{kw+WN~>a5njL-T;SEy z{i3^I9_V=Cfsy~uSJ$xcRtL~8HfBiKt-h->9cFq}ml1CLCsY3o28#KI`cG|{c4H}J zWisq@i{*`!qS}PnNr1*%7)au%)&`+7K zb-`?AbZvx!IQjp9CCfcIP$7s?Wi#5IHwO`dV>keFLcWb^qT|Skg{ivyw+j{Sj$?K=2 z&WO*-&!6v3k-Kj?7JqOWNj1qUPewJV58(_pI3p~O-LO-%l0(=R%%&RS%9|NEAyasg z)%0y#*$+XV#DHHQ2IS>Y@LztLeVDL+4Aoj$amrJ;oBiwtl5lpk5P1^%>Fe6x^dC<7 z4CWMq|IH~vGewIUbyi5w$}D97mPz)QwfDZzsl$BBlH2;7g@ySIG5G+ zpo&Mz!d2vx`lN{sq2*F0td>@q%g&M#zr#uRn2lDd#rr({uB)^O{gwg`FIz06)_T&( zA6dZJtPy_n3`_*VVuF z>L*LOy2zom60&H%th|3$t^0HKi(qUPoP)|=r43xCCfkE1YhI&9cS45ae32k@sY0PX zU*YX+{i&(>u8zk>z4t#Cy*E9?am|#aCu^G&dmcr`V1-?s8;(gnewC9?79}Dm;Feoj+26~ z%t!Q18=420w5?6+a4}-&a}MgR3<^WDUze}9QRwFKQhmf?ix9i-$Tk&~{PbTf{WJxb z-_20-7qyJOqz1{!E5m?$4MiR>NX>Y#JooOihL|16dB{^FZg_6T&!(=WCXWLq?44_z z@~S2^NmSywAT*+nmX@D?FkCoKybbAayX`PL_|epgb3zjE4Zy99C)gFDe|h=_p45uU zyH6iy(_UxRyd~$5GtOeH;u-1dp=J*5>iG6G)Pv)XGhTo##v4Y)`NghlMt;!em{n}n z@2gHA7BdcR!e4fG)$3;Z40Ue9(Nw>=iNAv{w-XPpS3N@Nn zR}1it`{*HGd=4yF9d!OJ{kgB5wAvZh=0;e}9db;;By|zNPut}YVHFgV-A0>E#;)N) z0?1zhQ%{@aE0gWqNmj*cJQN z4#-TQ$a#eY_&MmFGamc;1Pl(YFp=T0GlFu{UM)S-BHSvG8yedgC6bL z*RNHWxyV6ccn65N)$oJ6fU~U+CHMWi=T2(z&F4wJVqg}cjXvyMW4G+aQiyP9(SdW3 zy-NMl+7l;L!f-&-3-oRUGuSU7{I_31hl9Ytw7j-azk$ssl(zRNeU|zb*%V{4Lg-Z|RMKCdHu=kON927g9eVR|| zKwm-xywg-6ZOL{LpDRTE`)TtA<3*;#W%G?dBBW5NllD@7IY&O8W58*Uj#_00!b`AQ zmHGy(NtMX|rAcF*An{-{Q!W=-5Zp-aCqxS3gvnnI;U_K9bAO%l{5WrTv&ISGH z1$<|O0+F1$G8y<7qBfwU8eOa zw0U3S1RH#g5CN5ds;TRu0JOkMbOipY0ilIX!+5&nZoD%jRkQWbqyq`*Huw(bG>Tix zUQJc%`mRZ@TRM)8*g6EL-pB8Ux~r$lg*gvH=I<>GV+Rce_&==*T$BBWB>>=klgGG!8`oHlfW&id zMn%K!nNOw}`M3Kv-^#+oPGKI#ZlXZ9?yOl-`n;#ekm`?=7`0Bbaj|!i9e35IwH8ZR zG0S*Ju6cfiA1$rv;U``}-kE9uVWz;tFRY`}Lp3F(I5;@Cn=5PkpPrjSX7A(G$Q($) zAux1|+>6RkW~%YrVYcjD(_pxLGLNzt5b#-UL z0@mD&`j;&cl0c~NE>8W`wdSnfSLJKj?sQ7heP;%DV1Dys^Ur5be;fa>2(tk7<3LR86QVKD($85zn?Z27D()U0yef-tLm} z#j4|*kM@?nz2`mziJFx~>n}Q=%p~WSQ;H6z$>nnY_Be|FP@Nr<=@J0C0 zM|1*G5_PgjTB@3#y1Pf#BxdR|@JdQbrlKcYiFs=D;qT5HkI1BTyFBHJCo|@kmRcy( z@-kopYyia^FPAT_{g*MR0gJCXLj*vcUx{!1{xn%`I|+F|Hg;7w{tN4`%5i~R!%nX6 zhxXhJ^J_cfx&I@k2P<;R|D<%vcjZ53ZFTMO?GQZT0N7KOki~TM_NQW(Lv=w(n1BW( zAPxaST91z-L@V72ru(Kqo?XFwQg^Cnt0oC5prI)yh_Z$Nh}hGojewELfHLz240t>< zrJNvm;5<}2sfTiVv_Q#N+k*;mJTMpY<&0{f;(FpkC$pzRlAq{|S5qcJ_f^RXTroW$+PO_e_5|%o%?YjIj7S!FFtsm-DfCDiKAAP(P;A3S| zvUu?`WrNpi139dP&O`%!1P)lzGK);ZU$p*tK$4XiCoX|-X%RNf>(=7jSfM=E*u2Uu z@#)2!k~ydc6fP5hwvUltw|j3_9sk%x0?0;JSur!M;H}2U@1?4t@-=2xF8k%o(Jx@) zKL-~*R3CQwJ;e2Wh%6zCeFp^#3(Mp9r^LO9ZH9 zAmVr8#UTOvQ0OCWzzXl5kaC`Zh+!V8Ffozm*R(>Z&nEeViw!#y=Z>aWZ|<0uOljqH+LqzV!SkUbFnzQBd19&SaZ||mlTr7Z zL_pRV6aUjl|Iy(_p%hgaax&8~9&>lu;2^aK`7&3I$DA1yxySn@XB;q}81w_D#34Hv z0i1hJD6A)mr>yRq~UdZl14xVdhSZ;VX zSzA;Fv=H~lfDeZYgDTeUv6Kf&=rUPd7`&px#0lEIbF!*Q~9m;p0o=IU%b6; zarfWXtYN2+oLu*jT^mz!lI{*^1pw>8#>FWI4fG#*ZW*dBC{df7jt2mVC4lwr$F`Bu-k@xtqXbTEKhLF!_x)CPQ&jG)9@)#E0guS3F`EkmDyT zdfu6DU96|ZI?)<^6UuWAMUI+RR;$TRE0C8dsld{`;aUBPZbxiwozW z8#()tds&hvQ5z~GB&4jebYX+P6Bo%tF)9k>HEH%#x_$P-e)(cU1NKNI>TG%iIJk3?m#lbsqq#_Q1TgZNulZm2J*EcYwse1+xlRQ}kpW<9E8NEpB?NK9zp< zKD_0>VPl3Suac4aMizNxAP8WSmHm#%=f3y{?SMF(Pyy)H9iVDrP$VWb{Mc@ z7H$g7@>yI}6Va%0nuW2~cua?Vh2v>isqIy-t6HolT4w~eWR#t$m+t(8+Cv>&Eq11{YS zdCK4Uy%@2tYOJ(*Ob!S%{-a4X0XbO{wNfo zn)2v$qfm&fs>{6p8?L z3=L@8dU8}!b#Y;|HCl&2uGhIdh-45654QfwWp;LP)eYY^7~)=eJn#21f;SjogXf@%wG$Wq=N8U#?+*d8mhq9XSpeXOiZRY!Tu+iUfq&iLSk^s9`qvNVhcn71>vc26C>Z1&cM zMzWtZoZHd9KVe9H783R8B=NjxK|R^Do*h-OGBT2>&h-2U9VChbCn`&x5U;dF_W#s- zu}A@Zc}C2yb|zfrnp~DzqhBM3I#f~O+!DQ*TmukH$0y?HaEcEfHqi9LHoUa2jq@W` zjTs2BMnFO%ZxhO2&D7*;pMucJaz7=j^B3ggD8k;B&o(YHsUDMPug6>eWhZ6kt+71m zaRBLP_^M7f-W8N|EX9(u948#5%Tv9a>nk5!>>JKygak7-CgXB4VwlP2s3RAJf)vu{ zdEdzCe7gn<8z|h0h72$Z;A=>g4RQlHd%*wU0GC=qmGYtht4|MgrX$&zxoffNrWnQB z)027Mb@XQO;`vZF&+>R@YGvBGP0&$y-j+SybqfrcXnJCx*9UO=A(Kff!IpY|C z3Lh_5dOJT3Amdb$?0X+!W_ExOvUk*D?$8ae)y3A-`xj1a06a`-LVkD&z^>!8cvSTt zJpOjMSqtUetaWOa$8lZdT~yM^sFwK!O#20R5*lW$6&3HnVYa&>Yg2>!yw*w3CQ-P< ziY()}`>E9vyABIs1ALA{PM3|rSY+99zL#QffhF}{1`)F+cYzxN9CymsYu+c&Bm zxH5j=I{lW#bRf@@LH6V1U@xt0b=+UE<8;4ES5a3luB)r_vU7@)6Vz1GbeUYGJvl#< zVyF^&lP5$~Cgi@4`Ko#iP11P7`cD>GPv~FWR{+*oucx@F0HSY!IkJi(Jae(;nz;Oc zXG8G3w-r_I&C4$jaW(iCFQ2$k)$f-xK^GHl?y58Q)5nirFau&i)5h9=xe=@YzM#Kp zO8CRx$bNKsHe(#aS7F7wE!bUSFfYP%n4$VAH7#p2+;t}W7eb5jNad+5kM{}KtFTx9 z49h7a^WkKLY2#+hCwub1M>;Jl$ul89v&UZ35ma;BCx_S`y?S%>XaJ0i2=SLFI$+;L zQ-po13q9!g;<#`C&Z5ajor*7DH|)h11Ao}00$PtT{~yZ@{=*@*1MTB@Wu0hDhzL+p zDbVG0eS`VAq}osDfLZslYWLEeCw-)LmTYQmC2to^poDTbrmVbp7&%mBLlQRTy|dwW za$S}IRpeA{BugtpX=to^Erj5Xt&udG*1uUVAvkdPE~ht#?q3Tbi&Y1#?3Go^A;UlG ziv>Z2aO~^fRb}$j_*LJYoHZT_%CPfrR3YOrA79N|YiZ?`iJWyK>6q?8oo=+N$M8QE zkTjGA^DvUBXnCH0>@`W#oGD6joE`r1?c4Fg(ifT^e>POuQWxY`{w~BHFi?HRV3!PR z82^5}RGfabeELt$6ihN(Tnj6!Ibq}wqNQf_C=?VVxFFBF&QEPlr)_fNY?T^ctjJgS zU@TXC;^fHZW){kreIBhne~k{?^5kk+N2U||d08D; zr>LQkM!om||5-x-1GrQ)7$iCS*WUzxea5g=7WB*2?KoHtZw4sp)XgXZ#Wm^kEbj8! zOT>^qLuy+j)TA}Q$r3&~I=)Fg5Uif`J6u%NQ;OrwY!_9iic&bv2oa$igFXFSDfnIe;thR7im+4j=LVexuj}3j_FW&Q}AD#Dbn;`}?M8nVGZJ#Tzq; z<%|3JIw};xsv$ZamS2;Tk1sBbA4s2)pO@1qhNAog7!Z*;Iu`|xLPP?$Ed-oX1zvnR zlQ@9s7+y1^fkVOn@*+1lnkf!VnE3BE2oo&v@%zD{d-&a8$1OV}nwz%jx#s-yom zv4sqaUgVA=mHW0`*ItvEIw9*{bgh~e{A212oVBuwhGw5&!;6Q-lgS#xXzxccUx z2AxJ17jWY47hyNZC-LjoADL24+@;pWvz`Y>HMmf@9mj&iFNOXQ9q>W(ax}d9hsnS+ zbpm@Ib}`JIFYf*e@qhb+b69vthlgh~wUlA=8w+`gZz^)*lsdhBR8-yE&|A*h*O+AY zkf&q*EZ=-6BJuvcePaCww{b}okz0_f>KfWuyFt?RKe^>cAR*uCCwlu|S${d#HE=tJ zmy$8zf6pPH0_M-nqEY}fQJkI~0;ysCmDc=^aZ)Ni(9n7;CJq)FpRSQ*mZV*izTqy_ zS{Dmk|H1pU%q)<-j3Os|OoNAeGgJr}^_`($%Yq0PAPAP#cJQX#F|7alhL?A(0>eU0 zcvY5Z|I2PdYKUJG6D=jp+fhmRwsbk?7OfZF2DcmbXbh z`BbjIP>V&&+LBmmnYLLZ)W-6@ifvIs`IAsII3)-*pLpI+1W%(a~BoO8XebKd9rkUtMhND2bx&q05)o;(M@WU)Us@{tiR~v<^vO5+R4_hISaddf^p$ATz zEev5b)jSMCi7!C~J&OPZ?(q9;^lLeZ{Ts#sglKi~9QLuWTm4PWva z701m@dw|mdC*5QA*Q-t6yfg=wr%NuT2u|3(c_jIw%6sL`Dzgk^+fmY-0~SmVVyBRqy#pW))h#!z&U{| z02Ro^8~aaztdeLk5Z^Yl1z;E)m{jXza|`JzLVbWJN4|BnIsTHc9~C8CcjS5C2T^DY z9;C!ryQ(xN{~wN*fTVD95ZTPFdFD|+@{^aG=$qod2ne<=e_ ze#jE3hU|FJ!sKLxDFegI8l#}7XnJ1IAu8$+b1N%7b~MvaT8vS*HxQI%$WLYgK&tLw z_$i%<$vbFq#}`O#f+OtP!MyYxoWE@%OYEPx?+FMCy1k-dq_&TKbI)D=i|b zqpN11AUf8{YzP;cecUgjJw4qep1 zcXXig^JQkV`XGUT;%07gN5xM{@zwR~pY7y= zPnB(0kB%-}LkBf9bkbHiX7d&M!a`1fECXXSU2wgXa!e^BwYI+gz#EM()7hXWR^9(x zj#8BSJtY!#bYq>yKY6ouVHK!CsJL^7%O9SMP?S6NM7`YRbNJ?_bk0LX0VX_>BfzfV z&B5`w!L`uJnSNW*?hxC;FP3~Bw@O<5?-a{|DSx^9j(S_?r-{iiuTOcz_m=u3^(qW-Deuj^C=ZsDntXtU}jMF?-Z7F z7hd26p_CbacCfu1Mbpt1hre2{@lQ)P6BHCro{0GaY;)c77xJ1|FCFRFT&_=ONtal$ zMA?|%yybCUnTK1gb@DRA@45G|699nkG>6pv0(}@pM{mLrnBgOmF9$Z(ZmOxpJ}&Na z2bZ{%AnkSzMg2sFB2KnL*Za9M%)-IOUl}U4@q03gSYOEfn~~9I6si^5-fT+FQKP}l(6wFvyP@=g;ed2LWVS5d`tjJtPoc{7y zr^FWd)cEu@H!cnXGIq{NV{z|XP0q@bh!ZibUGM!*o;j>i7Op985p?46N6bmczW52| zmXY3*?PtJH$ zBJKsDM?`#OCd~5N=hp*tQjQl3+^6aiCyS!>+mnWmjK`>or+0h^wT7hkW#3w%rO4#s zX|eSjIv=I8XZXupr<0AL%2kFJ%J`wQyU2{}kHQI;Gil=(2;WrW+wc)eWzMV<(;t)9 zu=JsC=3hsvz6()08KVMkyF?8p9)1I;zy;(b^B)Yd9lIJK0$?#FtMcCf7$gtsoc+sC z`7%z~L-O&6uRY}Q+}0wIvkx8kS%%0?rfMWr$D8Zx=sotaPzs*zLESssZOuq|sJs1Q zw*P}T|Jw`B+2ryzQ~_C``4Inhp%N{wlp9~bmd15o0%{Run!37~ zo|t>?N`$xDboqzHum(021hf`TZjps)FOgWyRi0{|9ITv4;5(w)P&DcKjauCMg#x<= z)p{NOV8=)wNP0F^JkVwYxK|md#Wkwa@jLW^9jov=OH6FY-<4M<*?YN)j|~8*;i+bVlk z$Y-;GU!?1qTB8am^`h5>Gmm}pN4P9@wZHR?0wVBxL`z zpD8+HayHT~C)mgPTGeuWBB4FUn=>&-Zg72bsR&#zD2RpJ_g{T`#3!TRTLnfru5z@k zYLgQZB9?nQeyZY$g&z&$b1vSQOjJcXwiLiQjGJa9;>`Yr6xv3v_HT82|)f;6*)I&VbYgwD`ntWy~FQ_vv1AwMwmKh$%#$C=O}ttBeXnW9(~RdmIb;w?>qSUxC@8*d7eH%mshA5 zcn|qe!70uZLLc=GxRpAWn?JUc#gLcxZTK$m(u58yE~Bl-n23n-3P3j9mym_qq?(@| z+<_Pt;(K(`>(@>M-kK}~lHzLWh~YpvJ*nD2c?~|Hz=!d*`j|Vp`I%^UyWyw(cJSkU z^A~Iy|ImbS*bVpeQ}-xMM%8~^45{xgKQ9`zxjDqm>$>H$mE>ewcJ6Jts`q$MFS)A3 z;(PVg@itXY^L|}6E^clOQ$)ND77Mpw5AndzUAQQiS+&9MlUB*2*>1k~3BUJbFM-hS zHJL;g6tFN0;UC8*ZmAqCaN9KSyn33=<9$b26@kN&+Tp%v3EF`4a(dxIkx|Hp_c@0G z=2btSx@4dsf^bxBc%X+;S$N&|`RCrN9pt?GWrSs~(wlOEEuuA9DD~Bb(D^mFgZV0dH2m)-HRn zC>^K$B~>Cv?LI`p6)u}axaUEo#~j!3ZY;;LRfeX?2`|!ul~pM3!EvA98J_bt=DOXh z|3`es)o+O6&Num$TN9^m8h<{mDP0@LO_@bmzh=Y+Qu+BG!0SWt!CtWjl&JETDhlPI z^SObrMk{wt#zngv15Mm(UK^&kSDBY_PNq^`!xsnU6g;dpyb!1o4^KI>dO=?p%K~csQ!P=U6b)QBz2eLVrhzGg> zvx#G^KKuj;IPjHnCLUHk*eByjFlk@3FXT$;lP-DTv?nt*y7+yVnCeEg1`Y?V`(TVc^UA74$i!5Or1SpkZAQ8c3cQ-R7FHXig675DotqK%GChU(U1 zzuA_mq^a{H4dYt=^3r;_eO`D9k|0T6cvhQXl*Z(HI0huSbP~`MZjE?5P7+^ zZtG*P8A$FlHGom|S>e$?H`2i>mwXgAw>r7n9kzLGZ`{+d;l#BHiP?5_R924`vu%GT zuJ1#Nl;U0Zr{(oO74SL+7#l5y=zMPEB_eHNLb=GD7PtJq6o zNsI$!DYOQ8!kj9Wh$z^X#~(S-PzP(PMu^>fu`r<&e!)H|I%L1hqI0pUHNiY%!JjQ# zxj|He%H%_6Ra>Zs@e(y&M{Ba?W2rv2JzWVcQA3Q5jQ9f!)H^P}`Wx^Oml{yMIG7be zgnl2{pt((Cd;)n))b{F_(&`70hjiN4M@FZZ!?4$bAmPgoy}0w95T=K0uu}-dl#KC> zMvm#tgKUm%rmkVV?%6su1d#!E^pa%m5!*Q34wosX=%%ys8mupC(%Lg^t#81+aPV(j zy&p%1lV7i@f+Dw~af9p4177aaR}IwaKOiiNo&3VvY%8)EH*Gj+W`p>}a_%R3D$_Ga z0E;{0M)v%sk`Z|lUsjzpeCS$Z0FZD_FgII}~!^K0josKZ>7rE6|{=8De^CHa!?D0acBVex$hj(aE z1w7B)D4W_MXr|*VZt0~S5nc$6^L_)Pnky%l>6X?%lw3h=J)1CaubR9nLP6qo%u$_ z!t*LTO8L(~zS__JOnmL1VVVWBJ$93rY@azd(LcVywY6}Sd6L2*3a^^15n3Y~UVW>5 z2?P3|N@Sq$A*56QQ09{`uvB_xh-K-STbt{HTY11Ee$!$f!D#AtH2cgR3zTK|`jGa> z?R#E*Q+>&V(7?L`ps>f@+7^YG$Dw?CBL3 zznSCHPl%Z>Jza<{&dGo;yP6O3vF4&UHm_@qVQA|c<||4n*HmKyW2mRC)NL)3I}=>8 zse0)yrn)!C@Ytih=TyJxwVR5D#ubluEJ!+gCKhFyzxE4fh-0XSL+#fbjl%I?%I;IU zStlS4kGDrjBUo4rydDyhl~6P>sk`vK#r0R5iHJXp0shbya}{9y6=VY-L}Nekz$d;o z|0HgR3zKo()Ea|iimRA3Hh6olI58%+eQ@(rRmQhj)1q%(NzGmx%st)x1-E<6IkGej zJa1IFe@?_*e?L~aD99?l5{@Y-<345STplDELq{>AO&)Xl$hW8H&>NO*rKRVtUt(yh zAeXrv?H`->{dEBR-SL7K4SaDzUyL9Dg`J(|4QW0rbI}9k=e<6Le89d4M?5!fMFrf{ z8XsOu^p@dtKCEdpGQV)Nse7|;$o~{>3byJG(;O~dMn|i9_?^`BOX&?AM%{a_!`!z( zFvc#XS!L!qmlwygF{yjO1BEdmkb?Esx?^}riGuQS_`5TO-0VfGJ?f`#B0s+j(V(yZ zhcN&G+&|B!#;rLBClndJHHy1X9|#{PlzM;;{SV!bZ#9!&$N`y(Mh=a)N$=BaGA)p5 z2*+U0R37#~LD7oW@hjbb;Jzgw;nG>vWq(((&h|ft8%;MRiZLHl!mj%OH|Ih ze+wf=MToHM*>mDJ@kLuQpybvm%}0(uzAS(ABOC50xWtnt|4pDM08|?QQ04m^p4ht! zP!S7!zOo4Gg#0?c19x6RVZ}i+1hY_AL*k{7?S;3}8_}qW33Hq7rh7IAo-!L#y+y!Hpbyu1N`@H^dIql5o|W7{;kr>ef3FVYxY1tTGe*Vi735u z$+djIGzImJzii_6Exn2kJk#eD?Ak?lW* z>Rr(*{L-L80a|-^L=s4BjtD`$A51`ZNh||M>@e%`SYi>tFW1V?^t^i1^Of{RAdJiXK@cDUVhYOh4~x|xQh~$}>0fPE0v3OX2nee> zjeHt-rKqUP0U785FNXU}PA=+1VBEk~57krp;xppj>#wWYSK88xKxj+VXXpu`8{4eQ zdm_xj(?rh4*zc%;Qc&eA&L^|~Ahi}eIEwoZ%cUamr3+_h96Xn(#gR!t4_j$*_HI(P z2CQo5Sn`nU^7_leJgO3(U?sEJ@TJlV7gFP!oK_nu`2u;R94uVb_@7s%1i(kS@M<{< zR+0!_s#txB@r8FA1h&NPo8S#6Hqu9WE7|f9ylSNjRkD)AcbN%5*+-6Qoc9gjcv|MZ!Pk$07 zp53$R4j|K?N-abP)Hya<&h54M`A=jfrd5sOW#$T}txk0QV`IVYTOsf$o#L&H^?pzc zCYBxgMnoJLCDlVfR$PC89x+lyzs!=uYeXb}e6#S7{DQuiV;$t7=T@6)Ms1o+cSGcP zK$RyTt-qrJ?r48G!YC3`jNV&nl(J(fQd%eSdq zJBSoikn}N8oXMqxrqa_R&8^kJ0o%o6676`F=R_EKtC1eJK|t#~OH`LPjZ(%iDP1!0 z^OLV~{wDe2SeV$$)wHxojf3_%ci$fhXh82D;?Coth{fLmcO1Q0+NR z-&hw2Hfv&na_;VMY)LPlR(r>FOZLZzj_dDI4 z+$}e>HY5h|{wf>-m~O;sn2_WvaU>BvDZ>z7NPs7ZRA*5>fJfwVv*M{jP$-OgL^GVc zyRwnR#{F4@pEL~ih{upUycGW2uC2CRi^en>#yQM=52PC~7M9%8CTh^yg_5-VK8TAz zr-nxxy41qsu@IGtKtedW^t?%1!F#>~XHA}bchxHjb%q!fYB?Ph#y>(+(q84j<<>7h zHvrMH_N-vu>kcXC*KyOPwf=uh&vb=&mELN<8EKIdcuvoAxUnHcbLDm5`bSBoZR{<(^`4g;fQ4-7X~B^WCu;|KX-}d4CS>nv>;BPlWKM_; zB@^RGd$@co64l;)6J1)gHuN!|rsWy3DG8VKMsy%D(BO*MC~h-*Grf)MoDDW3Fyz!I zgZLBtSSit%^FeY$Q7G($_3s=muxu+LIix9Bp_f#u)yI}=>l5*gi7Sz)NoEiP&zMCK zA{$G?r8#Jer4&^-QyI>2oqlj+0wT+$9u%?D1aTX`3KHPJIvL_m(zT8STVL zDJH>f8KA$cgkM0pRtYra7VE7s2E@s5yxx>3!Qw z5=G+R=2so>kjR;)!GI`9(ZzX|-{SXsPMoYW*ME`jq!@VwIw_J>f|_6s60bGbyT6r~ zgT-yK>{_Z>qVzUH#l=Z<7;3h^ax>m`Vsdb!_#tJmLz?PRPlPEixUoaYXRa~Eqo2HY zhnJt53Z_;Z`6PblzdyqV%)kQjjkq=Bel9)e-cN;oc}TM=E601yAOnRGQIC6;?_Bpp zDWr*Sob6h?YWMleG&>9E0@TpqG;6|d(hYI&#j0Qd7Q6G!NM)uNQC*O@Ea)}CY|xfH zJx#}Y-tow>hi~q9d0xqRj(u7dl4828Pi{osQqH}&58K?P9~$=895*{#G6nFqL4MDb ztL`H+_1~-yUM|FYLNhLIB$o?Zijc*<eC8g*1O$@2Vl87d~>$i1sVU~xPIeC(y=3wDTB-X-_T{LoOgAe#-^1LpwahF1Bb#z z3u}_TOu4i2%*5imy&M{(X(zDqBz*Z_3Z)oEtYEDC9>qUd*6gJrFCWu&XL%}b&j719G`9;y%AyTf94hNT7D zsc^^CL=CV6Sz(`^?JV?P$rFqmq>&qnXY+saQh;eI7D;Kll}XHYC9g(T%^74?=1B*V zXR9er^Uav30eIo`HZ6GOpiEis4fk#SPN;M`z)JOY#1p(XJg>v z*z%Xy`eLAY)iM|pj#aOJ&c@PK=4ao;PcC`*)t@^fHt_`w96r83_NUQqf9*yj zvGd=Lzeb|ffa3|rG5T>!mxeQ@;;`7gwEyXgDC$1x}dtE3YFs=j#q-7ZX2>Eku`WwzI2x$C{lpGRzyDk zsaZRNNKtz6;)N7m5RaT3zph{g-dGU()jMQK%c%%kY2Ta8gXaD+7nPEks@Cey3eE-* z<|;-Ice$4{QI=TN;(Gsx3eZFsJ0X=Svws(}hp6bfylH&}{*V;(kA(yw`z^gI7~L_<(0({yPwB+I?m>8W*3 zbSXGmALk&Du?zFHJPVXFKF@!)ru|$=>ag^-$2d%c8L#fjw*7Dx+ol0cCsLv2zqei{ z9T2!cpnmhU`=N zVQ*GKEw*5fcllbqT~YvkqGIUnc{AF;OX*1`-!RDufT-o+#7Ntj17mi(R0>Omhcywr zzaMpC6^+5hrh)k?;2dHs(C+(tRW+2h+`rr*E<8maxVGyI1(0!v&6aEnmsn<={Yl7$Qm&nzT_8Qn%OX ztGdB;r(404l-Gagj1M`3S^Bo%Z)X_1duy^O^KqAhkb=TMgRT3UjY$0~RG1vpe-uqF z%l52|t20orAAKB`tg=H=7CLD+)y~6oX(P=a;>fHW??kE+K&Zu9z(g4C=8NuHOsr`~8-L5tj_JV_({ij@a>(ysH9n^6mr`V2; zUnDwjDG7?wOk)PKQ#cFbd(8j3F+4WAm$BOW#S}cjtT&W{M!@s)E5T zWftahcVbnxwnaLt0;N5SL~Wsf?V(rlj@Bhdh#h+Y?$sgj>r%Ig34-_bNpRAy!)3|j zB@!D^$eV4gX=#XlBv1iUge>(!c=q;>N0Oxsjjmn1yWu?1R#W?|CfK{~R*PrKi)PYB ze5I}s+ioyQxe5ux1p4%f?R`h{m{swYtKXT43j z)X5W?XIaz)=nAhYo_Fz@^Zp3&-9KtZuk%dvEbTQj^~*w}J0FNRSp$F4cOdZoE;aYF zrsv`UU?b1d)O0rLX=WE6x}?7d`z^ujhuy`K1h+dXr_r*u~1(U+Z7Tdog;~Wfp;=V2D)IyBG|LLc!P8qNOx+AJ|e1NwR5HX zsZ6__?+t?{vFGw`&L_V+$wV*_3bJZoaLjfA`ey8QUEM z4%DUk^BGdj|K0n)eu6R+t#3G^<@W#V`A^hfIMcqb)&E}JB!dUA`!5n;q!0YdgsNGI z3bglr`rpfsbOwJNC;7d<{p%+`QE<*I+efXs`&9I|bNQ=8>u*v2|DRj{Om;ZPlCXU_ z9O*#+T9xu|04O9B%4AI%fBfr5x8?DFivPDO1-Oy_>x#eSgLO9Fw`b4mb6>Y|)}&oI zhabO9J{qt;G-%IWvi%e^P$}QP{qUU&3hr5mjXU&jpW1GK9ZGSC<=8*ADD~-v6wU0i zpzyJO*YD1dWTa?lFP-|QF-rMXC;LK2W-M(^{hOKm_)~x{l*3NtA7%}n^;6g@-7wtQ zr}Fo*`Pmu8UTH;eZ2M;kg^~G(*XNYQ{H?Tqwg{yGPgb8l`p*(NLB5|o%)s&DKZ_l@ ze?Pn5t&_jH_}dR+loT>2szz`Bv)H95C}ha$<^EYhu5>g3V%|+n{{ykp(EOib{#$|m d?UcdzcM>GM~!s(SH7K~5YMi2w-#0s>W1LPQY)0+t-OUPFKbj+!@hA0Qx5 z%*};`6(og)$rK!HP0X!~As{5a#HzuoEA`^0YAH&Z`5{OkHX)7`{J_wJfz0!dh=#$E z3P%*|)WyZoZU{9HRTF)sgG?6obtYD{?7GwcYdHh%E746^34v+Qrswwk){xI|@~wOw z>-7?(KtTv)?AEV2hz-dz<5SExh0J;8bYn`sP)KCZS}TL={aFXKwPp~;>CX*~Esz+- zK9iEYm&2#eH1$v!$>vL8y|oMfT`=|&@3{G7Fe0n1Mv%6Ez>6#AAt6~e&y zp#ALZJ+=Mo4wn&KB<67V8zZmogiDU6a6xYpMoWx>vpqbATy=)QP1$>X>GPI%jB3m) z?Qrag61cBR21ut)REILD-en6eQ1^y@QJErGBPkP5afMLGm%vQOEEkWsbwDd5{Va4q zz7ixRXoX^5`G(+3(g{&Y>$uoH91g$GX*{O98k&AkN*w0uz za;6q8myAtAi^^eX4L*y#-N?UX9u)dyfYhNJT7=Zm%ZyW*JIpsU-i2gJxFjXjj6>hiH^Qtjztk~Xc#-M-z|YG^clkQJA4R(5uY)T! zBMHqTbo+D1PaCFfgh}OS#xdh9wcy}5#UT0@wZYE3v4xLSyf$wJA{6%M$*!XD-sWzv z_1@aq=ii*ln0ssgqLFK4O5$LV!$EH*5`jiTfTc_KrH7V*niW_W)0js*R;F0>g*PHY zM)3Qt$;w2L#N$eWl1}&qv>@q+nFGQHuzJRtjm$)^GS?DDT9u+P_@Y zVv>a3uaBM(pd=9<1>B=;oDQa*{1}mP6RDLmqgY6#N~OGi)AuPI^(>^oGUgOSZ%5d( z`z2%rGMboWU1kB{<0{DrIw87$DsM*I??^2ToGJ7LpZ=AGoQ&$OOBbd*vC<&bq4Ff zzX_vV z)>ll>1F)j$Fm&*itsbSXt)LrPb?qP~{Ne1Nk|FW_7~2sq1Qp~EH^S(w@a~9W1O|>^ z!Wo4Ad@~hFu@-zo<|l!V712SFC&BeCNCE?v1v(+>2N`Y5Wshnm)-4XFf3m<3MNyCS z#+xy}MnS#|d@12e1?&kp;>f#ns}D%BBHh0=c8n@9bbJ{^`$v$R&@}^61sH!#kFsC9 zn~Q*yfi^VQ`iZ?2U|*_EhuYs^G(%U2PuodTYEekSw_Tu4IQ0e8@#Q15>8hL^toWMb zN7A(L;kNjd{Zkz`RBxn~ulyYiCnYdke}1k=oKV;y8X{-}QU{U?QR~C6GOd1CkUk8& z79o$3tbFIu-t<#y;Jq9r!yB8oM-=Q>T3@2REWX9+joy$zBJ2F-mg%L4X-;g8zWZ?( zDKBM0c#143X0c~=<3o8MPn5RQk}RKCvyivgQI?rfA+`4p^{>7x5#{0KDT?xSBIY?4 ziq5&!6A%{UY)M@4nqo!Sso6`vnVr-qbc8UW zxY9`6n9CS}d5yX4u2VfK@6S}R;T*;+wK4fI(h<)OuM>w7wPpRbtOgwh2?l8sODd@} zr!=jK5H*7|voztW7|fk5lq#(&Ip=r|HRd+w#4BwrT=$urw4Du{&z$0R4yHIu&b8w+ zEq@bc(~jt*H^^RR9vQ-Ql^WUMdv$qrxpbL}HIRH7R*fo%FH-weqgEnXBCV&kEX=Rr zlkZ*k^y!iPeOINvLqgqv@c{Gy;efobOmJxkLI@p+BJW0DG&-Cxsy}KVTqoQ;N-?1q zi_z=g*IW3-OoeQXwt=#m7lg1nlhe*Z-v7`Nbo(n@!4FMA~{lR8V74< zYv(&A-nNNYln-rWO6E|Hf0+3&?^LzRJdVa1tdX8DV^uY4Ux7yl!cB_pr!h=1a84jh z5>KQZs7b8(d9694`Br0~V#d^d`J2VAVS;(xTzPMKf8T(`k4cmQngZ^rSC*ufF_)VA z6;q^ER@RDExN{S8JT+{kn{&8xsi`Vtah{aglMyF zq@wpcEWRdwpkS_`eZG%-(KFy$mXtT`W7<2uZ7;;;H_a6wLNES1_uI{T;*7bRUR^AwGh zSk97VJ#fOz+N~|aCWVtTl@&AgZQLc(ISQ4q!NltR1VDtyzfA+cc!{@CH~VXe+FlwM?1GqrqA?{{9y}ViQ6DnrB*8jdOOFBvv@jQg(S};r*MMmsO#>}dfa#2#oyL{BkIkQ%>JG&XA#RK z6_#oJ{qcQC!os_-Z->zoXQyZNUc5I-%Y~&%51DT280reTBdqV-`~Ku{DZNul%HfpJ z0&-E`ZIyBSboXIbmUX~%Am!BVz30}HMo(e5hHM4BDdW#YK1ze3;<|}CPDh`#Z5G?j zM%Qztt!YLk4JOk+>uKcP`7~p6-*6VScUtVu$-QFSKJ^=1ckbi*(Br<+qq3)_roU|r zY}sfVF6NJaT&VfrXx`6KVw@C*9WNcXtd3b}FfEl58$?T5LQs`&!e;4wy60;7zL-;Q z?^C@yy>pR)wU&mH#v)gNbN@6*mr>KFi6_%*8EzdljKgb&YR1i2=_Gq^@O_dryU!f? zl7ppX$5bLx($_KT4r|!?R2%sv?<>4CJsMa1L#o+R;~XQ?`QjU$9GWItT35njUDY5} z>U^%N@Oejf+nuF)i=4fp`=9qxR{@V-9~r%6pD(-oa-n76L1?O^<$RT^OzU>`sEVvb z*#)Y~^Q!Th(;h|}G1(r^ckL~l&(#%w8Z#bppGJ+lbGvbg_PKT48XG>%&A5~AcdTcB zk#&`iZ|4z6~|RmVC|av*AA+G#93eXPL;Gg#LVVd%ucX z5|=2w6u-xCuUl+OJnC^EH4=-hCR~zQ*VW{5>M?LRMJUN(vqq?NA#FckK<1}ngJ@T284Sq$Q;-Gmk1p*{N{ zNFD_)x8eS?QW($pqHL#V0OcDYdA(&VYzT=<2(OsS%S)Ss{rhraI8Q>~uHJmsT*c6n zfzo%%Uu;SU_~9P_^1H5_PczWQFeEG8PkMWb(X1;l?w-Kh{B>NW%ZR7K5aMfPT3T1pyIa4gvE|8#&+%{)+}a;68uP(BFa~;DK*gz{f2e z>R+v4$O^|X0}dJbC6TO4MaN$4MzwF+;`v)q@?28 z6M+7-xw5*Gx~vSBp{+H8zLBkgF@u}69heRTj~f?oX>IJJPv&NAW#h=@#!LRvf(y6? z-)1Byduifi$xE&-t3W1f>tIaA&cMXLM9zmqMn=ZtU}VCjC?fVxci9ux3wVy z)73Yyb#~$KWYIAGJ>BlGBYqS{ugbaD-ZZCmx8&Qv6Y61 zxiw%jfCnE73p>wC`~UIe-yHv=r~1EpGP5#&_|LBY@#w#IRdFDoTfiC3J6bSl-wfx!#dC zP`iabZ8bDuM1wuup(1H=AeDdcab1$G*WPM24o@;J2$vl(5Q9wMz!G}#U}R+Eo_+Y( znjiyL{m0$X{Px0As>8U`_;vEN*HG0RZ_9b(aT2qWh)R6f8(#=01hW5mkbKoc7Ao_L zp+O7+5(Y!yzaRX_1TcCDA^%U0AYr~S2w)^Q8KC`7sxO>iVjAK9Cq*zRvRx>c7)i=4 zi2svB2w;|;|6P!OB=}#JfU*DAu>bergV9UI!b;okaCSytlRo0`Kv9!U_MoG;Pr=PG z%)-L@J+dA0Z_L&v3aFXpRMk|gTPm#^lgduHobFf0nd~3z)Xw$a@_~~{zz5mLNZrL{ zsPjGoec3V4Gx`Clzpr=qSk=J`oJ)R?3?rjUCf0+4@r#ZhbnCZAnk2-vlAN8LJH@EE z1T$S>kiw*`B|7a0l~rxrMFWKJ6At|{g?f`8y!LM!xL^`sV#?gVk1BvOh8UKMH*|vW z(FL6dhb!MPeVA9T=7V-=a6PN4&)HA5)~lPqW4x59vsZ1kfOdMyac0PWTZ<=x7ltpxRw2Gb9;+TA;0OiJV_0* zsa#Mg%bw}-v0x?*Ar2QVI;p-fMYsCwP8oY{W1G+Iw&-Hy)n8z-Q}JUjiEFgG`;n5z zY35uNaV8Ht=wEa@JU^3W4DacLy zTo)8%Z^mvd@&Yp}iLjbUNe2U~0jdp-mQ=wCm?E!gyphRSSu5J?LhT*#W_Dgz40@Tl zh`kCj!~V+-5o4s0zG}Wk{W9CN=&6HwD@w+fx&e%z#i9b^ToH+U{ar(;$KwJjd({D` zf7PpeHDaYeT_Y+9`BG5JyLjY!V+=Hlo6 z_FP9$je08j_s_yFT7FJPsQkb__jGA_FtUZJ-?r=Lu#`**XcKMWhr$RNpe3;4;CaX# z7U%yKWU2^){73@URG#VDkDS`{Z>P0*R zlvj|bqkQXO)5^Bmc&Q3#KhC#!Fo7gcMmDog+{azq8W$KWOZJD#_LI7VU2%Kq^!R>- zq7tO;QZQ*XZ{@k9i-S9OP}6n6W!D$b^YBMl=-q}{T8?OJ%)eNC@B>n?V6klSs_8tA z4XAZTD0#(TdL`!;{uL2ny4&va;@WZ~QaBh)4>+VrZ6{^pD{+VXUPC zNiFuvof@57TrS0YeS6U;i$Y8k%2({~@Hj#WWg10X22D8SL3ZoyLzHSr4q&c1y~0W- z`uanvp}!9k6m1bB8)XRCStra;lYIP5N8FX6vahOtz{SjR*0CR6d0KV+cpaCdhY@t1 zgZkG#7hwXHj^Byro7$^O)Cm%DzCS|!5d<3u2HD8OMB@t{??C-CCM^xUsf3F^XqNcJ z`i(FILsPTW9JL!>}r zNc)*c@he-0OYSKLG|E+j#@`p*2#p}>bTqa6Ty|&U2G&l{@ZJ`p=yzjrN z6`Aa3Hy=_#mdKf7)ZK*nSai0FmpbS`F%Z3^F-B;MfSOu-3cqukD)0H@O&W?RxXuv~ z`Mfdlntl5ZB{;;$>3_Zc$Gauq;lf(yiko|f*6jK^Zj9_~ivNL?_6pW==ASAkU2Ekb z?|b#x?(rW#utB29{9=?$=TOmk6VjW?2>+@*Cj5DSpHT~dmHS5{1oHbwtPu$C6F)yX z0SwOQ629$72&i5RplA!Gxqrd0&;|%WqlFT(!@qGr1__Lghyq4m`fn}K7(1Rq>5^%hFAOm9Ju3G+8H8*sF7a;jU7bsJE=fMI?6atzV@Xo$~r+^27 z0%iiqbWFv6WduwNXl=a{=+i0=gFwzN)W-2wn$MAcg#ptO5Pf?Ljw7;BK*=w-#y&4B zc7gjwT-u^Te@kUQJ|qRqS#befz*h(tSY)9Gux;@#4H0S~1mD_1{}mGBUxfcx%m4M| z|Nn?RO&tDJ&|g^bdvQ)ni;kANo28~53M8(c3VGG29qs?gVCh> zPG_jWDK6jufW-HG!i1(Ye$ZGxM~mhCvS)YV-f+-f=j=6~0rnO{W!u^qUsZ+2xd->k z{m?*9rJ%8}^>BTS(BvjiN?L7MUu*4#ege(${~h}zngP+yA~>M{(dfXUT^H*a-ao7# zoKmd*igWjC=hb`kXk)aChfk$!oYC(G5PNYnktyHuWCW?nd0 zkp4XzgyL%mht@?;7blg(ixrDgk9U+ATnf}_%s zPu9zX!GHwR-@q`i{1HohgwcL*-ED{)iP8JMM5uG^L7Zz^BoDm-JL+FyPD&#n457iWe_psO`!e>MMO}dy269P9U#{lW2*atN@u8W=eg2`d$%uHJ~M;qA%Y+D8Sg=R5xTtSDSBEgoL|#~6nMVJk>3jEib6XHLy$uU1}>m)hy0@^0Rn zRU{T1C=0*jH^Lzy?CewbE$)PgAn(`CX2CzyZWPY)!&dccs=35Gih@BOk_#%{FYD#_ zD78<)-w#`2rY1l5kC>0uRo0r12YHM~c*+SjeusB);|mg~T@-BYTtB16RJK ze<)*BL*1^_ulHP#N$(pY(tdyKdGjXF>a6vs=g7Kx|1kE+@u_lb`-gI99#Z=!rIMO` z8%->K!60wjr;XbjciSNUmY4_ONjvLXFM_$X3hx0i8^}xhl>vxD( zNOkk}*MONzE7+8&fOM`^z%g)T|`OsHw=VaCWWLq zlNX>tVMn)llLCJCfi2KpuYzD+TG2IxN^G2ml_r~Ev5wDlz*0uu)uYvAHPMx!XYI~p z*t=K?>rreylyfzUn_3!DEdqizAwGEaBINtY`CnCe)G!IZvj<9hITp9{_l=GxjDlJ# zT)OWwh$%rh{LU;mQ>n$AJKgig?c?zCKa!3Sx^u99m^{O;J7Gu|0*L>ixi*;qDF4D* zeG$ny8V~)}5R#fVNal}y)a(Vr@Hosqe9Ol*U2sVQhBIuEsbkHGg{$U4p zbML2QPf|otxcOzT#mIv>0@bxCiJaMM9;iawIcUWOJF$ zwsM|&(#&w-uvN&KAHzsB1|#X&^_R%CPEJf2f)cy0jw*SdxQfP#ki>!#>Ylh%j9lC| zv!Dj@6V9#XzBPc%u07_PT(aOnN>-<)Eo&(ef0h!=D&n7>N`#|5+5_YRaq1=^XOFE5 zPXTaAV^@*I^(_5pb&zQnNr`q)J*P9@rZmwfsnlMEV-Tkti58m*zr2huq~NTJ>+>Yv zhJjWkzPi73X<68j);9!NIc1v8x~g~zN}IbKr?kGP)W~qmGNcYvhL^&2+OMjEg zYINDmWMDS&Bf+Jc6ht2`HU{hEb9>x)+(N^1a*RlR3Bp0yX*O82^(GLb)}aqo-pMtO znXsMC&B7&}%=CnoEy}cB{jF<-nVq&ra*5O2OZrk_#bA6N*s9H&C;6g9YB{7l@mUb+7omev`(4}rgM zl|*ddF{9^fK1WH-+E=M0_Yk4J&WtiOWO9|*JT(6;Y3=)mC?VL)J~VOpG~;vL!U?-g z>?LMuQeJi^{OZQj`4d(Z*6q2XwCBA}{TUP6hx6qS3#pX$%1+nd$l%~eS_ti@3s>Qv zT;4~r?3Y{fMFVPwQ%2t@8-?r#hf~pn%O*MNR{u~I87y?1bg0OiPJUAC7H{t$y_NTQ zosTz(E9+JCW_5b`HeKar1nXEfh{*})hDc0~ikaZO&&xiaHj}TYJQ*wfe0uCP(>wb) zD{`!s6S-}CIk>{PIm$kcKUcjo0lYLMKnK94p?!kcTVU~1;&VDojOTQdc~EDTOaFHB z8bwl<+wwoT%R zYzt#(vh%g@VwepYHL72>n0}GZsp;yIaC?*O?LfRR+xzjiojcD=A8;UH;KG48A<(fH zM0UTr!Sr0$dwMgVpSwD0=*6~wu&`hkml!YVNcOa6`{e1ihVL)oqnVpA*}$7VUu7ct zb6SD+^R-p}$@s|Lct}Az2E59h`6mKvz(t^ zrAiNO?r7wo59gM-Hhn$KRWpiA;Oh>t;kP#@kqQdFXD_TmWqe$SN->pxsId(aP=q`< za$Q1c=M>ZB;C)D%OF!%xD&iw*WOuT7)w;Bz5{bmD<>fsv?Q@b+s+sOTq~Qwc3kj9E zymAiy+E2%kLr^{+&5tQSMgr7Or?qmGSdcJl6if>KJ)nKH`<>sPu3CL=&QE;#=vH=M zF_Lsaf2xbL39@xGPkKzPIx@{y*NA5-myn6Q36I_ZLl?oHs)LYaREmURToDVitB9y) z!5vS_C-(@1@d+iuCVXMPOx*T^I`lD~^S>*Fqrfm0K6SaHWLfDZ6Y+ee^Egf#yxJz+ zd}GSTW3U&Je^!YhJ)A$w!FL5qxGk88t3G==wf_|6X{r8@)rRML`*|Np{0Z&HrhgAAK-!Outzm;@=ia@_hc?Y&KYG zCo!m^)O5SZl&oFg%KsG6g67Cwe1+5(pnIypp5G@X+py$w6~H2vKodTRagbq18OTX{ z-sG>mtoL-lKPPFsZ)Uq3K7WKLX#Nqy2fUiX{0gwas_5@tVD;PF&+nCph0~a@-ZN=@ zamd|GlAb4Xc;Oh-w?qp`Sgg4_0uhT(Qm`@Yjri%N<7*!iEzHB@g|ocxH#?Dd`P)rj zig`1jm={~;dYg%(DXHm5zZc*9-mLi&S+7b;Z}9F+_RrG!@?Eez$)XLfU}iq?Wu@Ze zk9>xS=p$O|*Ubvj#f%S({2^sL96G!*PB#y_!uP40uEaQ;TjwfzAL?F zH3T&^{_A$8eusDsk8nv#?0J)9)k)W_zK>;_PAKVjQLjBt1OKFGo= z0;q&L#DGeeJ^pJjxvzi>44eZ-o^<7`IC0Z+SHFHo?3Ua#`46yZ;v$Hwkx8HZhcTZ8 zF=qEfv1ts{Z+{<$U@B{>c>Y=*M>*S*1kV^C{LBym6YYCkRMhn%iM=!UAL44*;|FfSJn(sQ#+7 z>1?s(^gh-_uXM|CHT733-loyZmO*G7(5kXnJWX?)_pN>qzx#tVFf80S`W#GpI0{ed z4M&!|5}|=uXx?M<`C7}0Vz1zvx7X4SEdv`&AOso;;S1^1^SZPwssv@JRCq>a4U^)D zOx>5-sTh(hRa2uNr#+7->3Kh({zg~5qw^1A`{iVPTm1&n*?9z+28JHRV-??Vf@t(EYWjUA6YKWKB(t2)v< zistK$?Bdv^jG^fiAAIc)ObP%jWx1($D29tm{g095kxRUYp6Q$=q^kx3pK zBNDmV&xG)I3&izM-mu-C`^oON^-X!y=PEc3GNx9|5g*UP=yjO*m4q(d=NZalXzU1A zn9|jCN7bANuW>)ta!=D;cRCNvcfi)n@aS!7roi*|YG1BDTZ+5b9v6pROk4bP$4@-e z-$8!f?sF7zK_B!U4KZoKj%2%j>Sh?kq)xNY!xzVi<`u4B(-ubFJJ5QrR`W2Kubn-& z9s)((B!3TJNHCA=5!PC+P~r=0^1Ap)THj1HU|!c2;%#Pjg-@DT2*Ka zKTX&tIh+&gKS{_&WO_d(BnDLPEqh}?Nz%h{F5b`F2Ec{*BM@8em#ZB}2^#&zlR411 z&t{B1Cp^AKzgDSlaj>5}=xLEPBLkL9m{tH8#&^E$$GZmbYiQp+wwwnU?X@u;YPj-l zv=`Z;sKl&Fu0AbRAM73nOD0!gr36#Z@=PRuJ@z1*K58epxD-OC2$4_5+6tUl_^vst zsh^w=SLIMyeK$^dkh1M#Rn<@(oPnNiGNB#Kn-t7yd0F4IKYe4s_Kw~9bn#8c{;ex$ z$}7%ustG3_Ri(*&{JS1f!C}gE9eF(eIWPAy?RG?>M^npHF@^+<4DWu}WaGtQ%bsrG z*0^4IS;bZoZuDrjJHzsQ3ZrU;v*FJWlT`F7hT>e5=cy+3L64F(FLs!isHbh);5}*j z&lT%~)1c5h?{ONh?_0}jVZ#e}!JjRk`oMK={#xf!UIOU2UEhx|D6zj0L|Jg1kXk)d z`^cA;Vn0ybSePkJnaj1l2`p1YAuFB-Ck`rT56Y{g<-7T(ILY`8~R(w zJ^~Bxv&Zpd_NXI_4_DQ=^ZS2NQw6GT>~e)p*sKDIr{SQ3rj`rP;sj_y%gXWdDwpDIz6V>O|^{Jf$7 znpqkHxA)G@*N?#^tTqtv>ke6Fz>aK( zDA{6w#3HhpM^55lQah*}7`DU0#<`6(Ev3I(Yu*XnxL%Iu+_rsBJlC0bXEag2@As*o z&>cvB@~LCI$<3F%TxX+^3R9`BsSft{V`ep(7a?`e@^-(@pJCL=5yBFVIO!w$Zu5<@lJ7^Whqt7`I!4aomTin~sFp`3a=y4(qtQ07 z-!xx)JS+rd)GPc+PW2{PtQh1*5-%Kt7KV-Rz|!P&{~D20)ym*zoQ<2#xkanbabLPG zbByrHO(hd|IAKG$G$bPJASHAFW9RTJwt3Qhgl1tc+zhr6SojM;>p7}X^Vr-xEj>P( zHqwYd$1LG?_^4g?=P6JbGA|#C8}!ajMU7;+g|<;u|2J++Lix^>0%RVndE}jfEwT7^ z)|D&eEBmnG-5h180I0BPJWu#0;j5?on?u_N4kY}JY%qZclv}jag zUfQH6J8P53CrE3S4AaUl;psW1tfa~g)})mvTq<9>YHH|e@7`0;PG9>{9;1>WfSIP0oqZpHzQ-73sY%*=@ZZq~sYZ za?i!GC4-kz{oht83R|NJrp-RqZ58qCpYzcO44ztu@Xji;{ciii%6BbO0H5YADyqtq z`_W52tc!|@ZMlf+b>eh+ZtXzSIPagT$i)h389EZx*O5gkoht7L=GJk(?ZM=Y|28zf zU*pEx8*<~eXlJrlF|hbUQYCsgsia;d+dfY?l#JHSKfzZenAE0=%CBZN&nnY+uXlqD zUi1wCMs}WJ>>|J;Hwb`7@-jy5nnuTuRa^Ml?>A{=6rQyoJtOk>&YGLqK_%Q)MA%Qo zqoVc43eK5FcpuUl@6PvXrVkd@R*h|bo>4C!(}| z5$Z%CXw%ubKe7G$lAVY;P*k?zQDVxD6NRK460hPl=ik3-t77K}sv|A=pq;_Zs;pux zd}EyUJ;_!BSQ}w{?>Md`8}uzfBjF9%0cTwEb_7}q3T#5}l2aoZy3wT($NVraB|m@Q z&kNIU^ute>0_iP)gYWN=?0_9`2@de~1h##V)AH!(5~u|0ZUGNlWU+Fm_yQX4nH`hcK{gg|GV|F&rq4$)cTrZ<*MR zFWb+MFu%Y>*Q2Efu=PNu3!c{1>sI1|!;Op$_?BnCMfI|Jfgqv@=sy-8(giFpqX2Rm zx{aE#yzJ79fp=--2L5@$DiplMa#4aw4>-sTsGGa?Jw`QOs_1|38i2*XFbBkt&?6xL z-naOVISnAWB(S0-!^I5$cmI~`4iICsMXVA7m}|ZRWG&ejwfyhfBw(b?1jL{KxtkFI zNDJO#2*!(e58jMMc&h_^+wC9%ZxsW@{0^`iBKAx$3T$PB#sji87ULCx-!=JP1O7j5 zzzfNA>5`+pvuB-$or7CX;9ZdmXVSjIjKD{k);hQ{8!ai)X{6_seb% z4bhA31*h^FrE31d(^456{5M%FoZ=O*&E`Ah?^sZz>-y zesR^>c7J~oLR))WQ2PZd52R-``;A!3rIGtI^<(7s_k-p+j@i$B$>Za4+&L+driqf{ zE@LuS4fa^v4hJ1m%}U6fpk+aSva6u;W>Q$q(zi)J1R(I-iqTPh8*8r{TEZw+_}p5K z`*ZVcbw!fn#GB8zsfzN##+PadkraHPUZuA-A<{80kgr@Ddb^NBzUJm(K*!zW?>Qb! z%3j#}wNJmOQ7_r?Y+Eft@Y^%~Ie~reaBSU<38BRj?Wp(D4beD4i2oO}_t%n;NSSp4 zCMNF*v=UEO+R;~6ghNI~W)L2A#7w#d=VgpcdZKuSMwa`1zG%fg6;1oBT`s$y>uoeI zcx*iC5Aa2$mYIhS4hRRrxW?3^S6M ztzLhvx>&2G21`T634<^4zT5pX?Tc`}Q2kI0b*V1^kR&ea1)#Hx07>1t>1ySBY~{%lnfg=?CyDV1zqp z>O+i^`b-uF{G&Wf7*OgDK2;JTSgL4zzvN`1N}GjHjwNs8dDkNWL4CguZ(|mVrl$mH z$+>|J5^WN;Ut2;7i{94A0s8quS-xu}b0{*Z)A=VdXkeUBO6@)d_O3Dy$PM<)MCTC; ziJ3hxz-wa%*h#7#igJ3th-mOGIw3Y_FVVtl{m^#3$1tkRq(5vj`@07>1*_xE4r%+z zMRH?Frm84NvAx3nMX6G9NVphUgEgstRII{52*Hz8JBWD_ylHAq`rcT0$oE};p9?Zz zni+Om0nclw&d3aF9`HkEsDPw7H3`oH)6)UtGpmCUT~CJ`4>teAhyi}enCSi2z!=9d zoh0PHAw-q{cG~#tXRQ~fk zB|=hIVfUlU3tp&nMs9w_dqzyEwrV~+&U*@Tf4#Ndw^A$fnKcrlfL!U(>HG#vR$ajCoWT-z4F-wu!Jrt|T!iL6zfnrw!Z8)2=vt-7*9uyyyu~uR^N?jGb{v zp7*}H-OIO-?#pVKcs^pYew^kFOmL4ko*M{O1ShA!9x_v?%%kG~Mdpj^-{PIPH{l-< zf6%EgJ{zyp782y=xk4Op(Ua<5-xdUZreB6LQ{h9pbhniDGrwoXW|m9K(W9}JkH-&r zv3<(?gO=2bgw%|!WGtKV%;?bo4+z+A8e~LBhWbli{0MnR?sx0yq@V~dYMDTnKL&7* zVwqXSKg7sR<3U6v0c8Od9bE_ZFi()JG+XANN!V&!QB_`PI1cAWwlIE|i?;Q1t%6f4 zaIyiODuf8=`N3Po!}JnQrT)Il+W{a4IBenHs%A%t)t?H;i65s2++vaiJ!SLi?2$4n zTZ5}3+@3Z|)_YA;C3n}gd;iD|Gp<-&lfhA%sFia~XMn8$iBwnzP-dgtLVIzlFO(~u z9b+vM!<$UUDf{c#u?@ym1&q|!37aZyJ$6jd@5Kk(0rMHq+wJt|H(qpE&eVfE3puRo z4(Z)MCUA$2IstK(+=McJoktCrhHaQO>g$VX=*U-+le+DeAs$H5L^T^-2DN|K1VYv* z)tjaT4`mJp0gYOl5P0sZ@J{Dyn!n`l?RmO;Nbz=)q8ONYpmh(qW>46ketr?NwH^wE zyvXxt#^J>r5|EG~AT(&5CUu$h(>D}3pSr(j|H$t-Jtw8eTo-WwYifrMRpPTR+jx4V z)iXHQ6k?h)rPRi#Rzk(fd&5AqD#{{j^b%$A7>^T_OXq!6s{ zh9gW42LsG-G0dYIVpP$oP`2LJ)?Vk_wmI8>mREC4jgouPKn|y9KC31FSo0L`GsbHl z$D^1R3s9BP0jQABwxEyk`tXl9pzj_mzKB>7b7=V03dLVlz>e;?b3A@Y=IAXz&)<3w zz=8KB6zY|F6Y$iG6)t9!#7pGG#$Rv%JX7~MN_k;0rtJ%qr^vve5}x#vFH`}Ty>%BE z%UnRzi$r8)072~i;U*xyfs{xDQX z0|dWZZZG{c_8{0AEfD|WU+Mv7XYw!Qf$YMf1!$E$EpY!$iaLQ`0X^XZC`SGA*$;tu zexI4bJ4Nfhrw0id`LEPzA!SCl652L>v2A?BEq8E;e)HVviO3j?i3Edz77`Pi5@B^K z2sMYvX#*F7iMaF^Bv=pt1%fMD*GlrEXy$wM3ODh@-oZ-w2yZo`o3y){*Yk75W~YH# z!5mybkBYs$@r%3F4FUUGq6`ea1WW57RK{lvn{K+T_uVV0NwN1XN}>j|R3hH?)JXj_ z3W_>mzs~yR(~=EZBtC4>Zfu;y+*IypjU}X-;UdhPKV7rf=%)Rr>$vo*%Xh6(c|>B2gR_s^WaXNGpDg zI5+s1Ibr+dV9mF~xh95Ab^GN2j~3oyPxQZS;)Wtc9!!PC#E zwFmN_kj+)Z?+1=L5_#0m_5Ns|X@~PO1#MkFB*eGYu!^@Sd45I*xGlpW=*#yw49Q$y z?z+Tyye<%}qFX;*A0{WY&#rf$u9iGON9=2zUPv?c9(tU6<2B%VoyGy#biW~mcl&rq zPsPX}uzZ8!(UrXtp9(pPrOYw?V?E(LiJn(WbeIi27(HG|@B#sl z=PKte@-nokwr;yfLbyX4E>6pQ{At)Pt^tBRLk^3HO+rScu2OXHwh*Fu`$&~nD0tX4 zXtq$U#IR#zRpd!!bn3o#kIIfRBa4A47PL&MgaK|U5AX6S=(A9XtbeF zvB{e)(Pc?jlpmLWU;Y#H1_ue2nU(F!^SP@}2xkLv6#q5P6$w`$3nHI0A{_Kj{MUb; zZ;yT8qq+kqb=@!<(1|`6ii^!vPt^c06NG&3aJrVEW0p(RS(mDxymt`Nzt1XYWU2Em zm6t3H`)%mM<0gal5n&7oG|(LO7J%gR)<;C9&_;fKzN8ljR(-=X<%}9Yyj{k`ZCI}} zU0I#+E9130fk>aglOQU2mXw2u8-x-xuifD6Cp!I&xOQ<_HS0t6s=3a6&DNFJbKtk_ znnFD(>Mh$4NYedk4GC;o{7ZsHo;sXY(lu77M8nteYu{jEyz|1fb>D`2Y5Vt>>{cKC zu&1b+cbVQfI7>4G3fU*67&mUtttKzi;=2SxIccRSC&gH z1<-6X&~Ao~y4t7rf*Tle+Q$LohdRy}c})oAS@nuFyYVhN_jq_O z0CeL3#Gjr`2OBtL-&Xm0A6?ert$c5lrA5MP*Ei~cztDaiKvR<2v9RO;0lABG_`R&~ zfdo%TF)t%5*q7_4PjUEY?&5EXu*l7wZ%Cb`g*of&a9PMz%lqs#31dOjYF$fX7@rt7 z7S1cqIDn~|f9r#6bu8ul#Nn>^x$ktCrH>owxbR~(d6|8IHjISxuc5bhx19|u9TKJ? zi1c__{Vt$;_DX&`k*@o`pl)iNAY*>cu}QfaA4@!L>k@JQ0lSZH7mvTna1&u0D*CxE zD(kCq*hX7hi)tKljk{Qz{)%^li_!dacd`X%l}jxurwS)`DYNnwCL*oHg^Oxk#A4d| zusK_Bqi*TT{M47&q(~Kaf%>oFxJ?j`B|eWeKhs>rygRkPrYgXy)xvl^8`{i|tET#^ zuwHZN{_955J1hdRDfQbT!zqTvVxJ&KO8K6dDEFH!bZ@f7@){BAR@&IxmdDOv`_l{a zjm_=#IyJrat0qrl;#+Y}G-(#tn7bf@CS~%uwTo$l=CPnl`-Jk1b9HX6&j>?#p4m-{qQMhk|7jZeO}unbAd(TGl>ozzsx7FH+4AQd0;k)j5Uo+`N%OAb8 zB5%Xj&u%h_bt{PBzQt6uzNqX943_Sucu#Ra+WEeNX~W{OfXG`+$qC7_jM2sj^7lr( zwqn6GV6(`gb%=;8qtZ_cRv=Iwiinb^(r4UyFZM26JD;nfH#}8kuqfAN)~w59pjo4L zHPtnJ`yglJbE*Bl+%7w>Y3jE9kZ?m?>@-{A_O56$TnHE1?;{Fv6WAj4>A?DGdaAs! zXlmhnqWjU?-4HBwu8~@6JWZEFaX%Ru#~RW3X`j>Z*YYg#bJwlX%irwEFredy|M0Q+ zme<3Xj~C~rtISXO?0$e6dn~e9$3;{{9`U?_Nxq_9&x~SAww|k=Co0elfA8_d5`!Ag zUH(|t)}(ui=G!<3yO!C(vuYjfHHCwg;XA1;i?h8R6gihD>Fc(WL5^I0})^4&e-^~vMhBg`-S=AWdx5~ zs6d;b0(!22aAIuz$;)^Sv!KJX&a1@(^w5P!Q2TuJ*^eU6Be`wQ^M$LzwxG#QTwcj+ zG8SEao?1624wG(h$vfmbpFD^%d(++QT5$<1#&Q3&bWD@yPxznOobgo8ifCogTQlFL{(h$~QOfLmEetL`zZ3M%AZdx43Ew z%{@?7y)+}|*~%C8X}pxy&pC;9G8{YQ>indlo2^rGw>Rhuc8vM0yT9cCDFziGgoxjd z0-f)7I>pEtLed}c$DKsTEys11Y|#OcAkca2-359a0VzjhKkwZop|ROV(sIkBp4A>| z&p&&fH>MD6S2(D&*m6_LR|D0Z+Mg$*n?iu=(8xN!q;RGDrbUqV(O2Roo$htzBpZ(e zKgIe^W7Lctge2@^UU%R#unoj;I}$^2j^cXqN@%vF%+(<|XeExJ5=AlGDciLFdOfy` zNy>O!RoC1{Ibm+zptXV*8q~bNfPH5Qf&+N8?Nu;Qvu1JA{pwIyJY2H!{=j7q`%gt6rUP6-`0T=Lc z_~GZgt+ieRDY1>0xiiH(Ziic!b)^HO3Q11vzC0Z&8<;2-*{JN9qJZDlQjGSMEMj&@ z6Pw)$yf{x$>hE-dsro||*1jb+WNhk73rXBP>9SoeV_M8T8{^fnYHecb!)8m*&$Ma| zB<>{9!M*Few*vvbk_ENHh0`sV^(K@n+#8ECwYClTgtAjrc1;&z1?pD~t*qaAq5?WN z(99!t!BvA_dcKyjh=cdecYs{N9p9l`IV1fodR-(MmUPKSe}IYVsa*L5;exncz@d9z8Rin z`1vL>P384#UPcgy&Ni`-hyi}`Yy%EE@*AT>#_Q8*`y4yqO%zsFmo7xcrs8RKNy(9n zlXsT~T%1|(ho&q@;Md=@!oC}qb(PpU4e~1F;psZ*ecd4UD7M6-Hn=-FB)XBcsw|vH zK_@Sga@;Ld#NV*08kl`gp}NS%|10 zwcAFFNr%)%Oo4VT2ZJH;DGp~F!VmAFWSjo=3J~GXe^#VtOm%H8jTzQRt`k4~CO~QtKUXvO_@k{Fs zUq^$Wt}w_i@hQ8dWl~ilQ4`=Mxd}gLlGkB91;+h$g5Ci&ru#GfIa{Bl_a7B`+bL3R85G|Lc#{o}kG{ z+atvfRo^BLF}E#Eo6$D7cMmTQTINV}cgaaYkGkDq75uOGN4}DINz4^6)wog4n+xK% z(zWMlP8Io?#|jTs(}CWRZPY}Vm}iig%fcm2g{`nXI@Hs5qlrJN$TUXqgHNOVfKaM~ z?=GKXv)z_OxJl>gjw?`<%b~j?o|r3!lP$g5WMO6b#)wQl!vg8`cSq0A-$L6Mtr%u= zQ>4YWcaunwp%p#lB{QG;9=O*4qUEF`)RayASnoq-<06^+DwAAs2o^9vv|Kz2`L*N` zLd(6l-MtCVk;!$(=|J8w%OIg@jg*}PQ7ADjdF4A*y&rbHjFC+@MbDufnd}FI6pFev z0-kGXR^6N?|0MZ^#8ba)uPRgoRN8q8&D5#&!F*;cWu4M7IS0(wQv$abOB56=?8`{J zXOml%YNFC(+e3qFR}>rZ1xsS}`)wS*_WIL)b}p!v6uD|sfAsAj%!uT42MPMrLEC6Y zO2C z+G2;_D)~w#d5Igf)sqQ?i&4irf2_7BG92BO#K@WA9GD2T)fVZFT#AyUTq_(!BATsk z@=Fr9E(nrin5jFt33^bVrvW+X&;je#AJ|L5L6mhP&8u+?M(OA@Rn}dXL$QsD=}$;g zq3?7A9x=H;)!F2BU!A!#rOF-nu3?uRcMX-p&S=V(r^+Y=n^x|ix{?MxBX{JxfTv9u zW%?TI0Ju>1%TPtg=l0PS7PKs7F>$IYNJOKpAT2o`3v;l4d^Ob6^Eyd3cj$BV=PkTo zm68G`4LhXm&RfO}m)qnZW=QZ2w85l0!u0I0CiulhB7_AbZSpkl3Q*t}@}r3qw#|e^ zoWqr4{H(>P^YCxB;op`xfJ@@xAtTC0y`#mi$8w8~*XYQ(OdXc#_kpDLx0-jftm@H) zIW9JCx2r5pKsPOTd&vg}n#l*$w~lu^x&yX1+?(LUPFw@>`0SH{4+$KRBSev%Cg5fQ z;>RCax`?k%JGm#n>g~jWQOTK((Gti88D|PCwe8&6Rq-P~)Nq+jb!ToCOH~^wbh`-f zJ6u*+KobZ|_nVuDn;~#Bs|Tj;*>sgifZMi7j+p=D`N_~3_Y6yPbFJu%Ns9w($ygAb)d_59hKeo#Brg12 zV{8mxgJp!4sacfHo>%Z+swfrUP2BAWEt4E;bAC^w!|iF+-kN=qX?pH3RIoW(G3%n+ z?m$#EtDpPM7VNMkQdDbTSUcKj3b@71@i=b(%s!+(vP0G0tSg&ff03ON<2*W%7+y|F z?ZP7I)}=L(Hg`hP;;KR|#&kWO4mwQn!ja~`J)O*=MrmKk8yhN3s-JJ@8APNEvVusp zEJ!4%bTq%Giqr>P?bqopOn=9s37@Fcz1mIDbJuhoR;pvs>MFi-!d(j?l`xP)O?Epl zHJ+=!4CwtCT(~Gy0@Q*zPSUjG#4M2~1>Ixdwk^~XmAFwd#b${ekGjJ2VT8!L>xGS< z-}UV1JA38Iopu`?j#M2gTrsGN&XynvIN{vv%gD~W+(#2m9cP51_0%&BHCe8|6{vm; zWC0jEF$1RPE*Qgk%X!%ywmXhkKn2Btf13i$pgFSGD56GsbV)8oTLq>(4^iwyN+$w zL8UR?OnvtY&O;^tf#ljxiM8nTa#ik2rUN>ZE&{)D?-zZSSroUo{M;9%Y*%NX7~Xc? z+**Y{*lgbe$r|;>STj$7N4KvRp-5MxTlMwRb%{dD#Cj{`sjrrAM>Vk5R_3o8u^G|j zyJb^kSW_jE57sNh^NVQ1z3<$qfUEUZqPN&bQzvX$Bg4KhEHsVe{(zxOP~)0ybKRZgK5b zR4Y;=r||urvFp`| zBs=WEu?v+4N;rPgS`k19*0To=k=j~oIZPve9qa`%AsXYqeRRYcX&l9jSKjrOB3rF}q-k82rM#1dg}>QB*cu+?I9jlP9d5K@Jn6sU;RI z**^;>&TvG#oFd`yaksj@Hn4+aUaBak0fp~yzNLh`j*jwL*)P8^owZuod|P~9V%*nS z<@y=2P8qB|TRk&l0vG+Vxfvr6LIWS7B;Ix+-=5n7kd{emE^egbGx9O>S$)H8MtTN? z_#-^%$I_G3Bl8K)>N@=LEX4JcWDcR_sHIX9Y+}nT2;bHRB}F~Mp3%Yy)}sT$q7O*e zjpGo|(~CMO+mLaLXYU&|;B~P@H=j>je$mjEdedcMDn|(x7hmNg)l;8!H8e8ZZvd~F zeVqvbBt1A+5?;T-lB_d))SlHf!-JNFOFGWwQ#u8{;5rt5FhrISw}=u5Y6}}56QgrG z7$LpfulH^~+E@_eb{_=wglRL*EHRx1OOBcF#4kI#Y7olBZaXU2>*+PuPxEO~2TV|7 zwQg(7=}~r z{0Ve!u=$F4>4B2#1aX?>c2TdL>w=4ErmL&?B%Ip7Esp^Cge4Qx2HsbVsbl$FolROf zT20Djyr1J(?XM^81kvwZP3 z(2tgJgzQt!3T2Y~a`-x{tZNZ+xA}{h7?a(EGTp&CkB;t7crWU&6>$7S36H^ZDdI|I z9TeXVCn;M2Y)NhJ8sL6}@FY0fBniJp*03$)nEbaca)aBzX^rDtDtd&68P(6(SLbttx*@i^g`6O++QxOR2jTUaxhO2`)itJfpcF|!!>G&<)v(EnOl z?5xx55oNpdIBw75`%T5FQz^x<)9z@_viI?EWa;_3O)N56>2hGHdG875_^erSUa8ex zw*HHI;o(2M=PnOsU~s%uQ69Eg0UY28o#}a&aB-{^doCg$l4k3G0-pS+*I$ zl1#~Ga0SikVS;Y=3_(H2Gtq#o0DfDku526k(G z0~z3Mj|m-|bcs?P6K>&0rPpTZi!S&jSVOQ|BpCu;IbC zb(jWnBA_@$TwXI=8el;E8S$~aD0sX#ROFTf3bfXE%d424WoE;)S(f%-jKI9;bVF>$^JfnTC5h z*j;}(izm;d`}6=GI_YqONl&x4aI4pm80>~j!REJ3lE4z#V{8wq>q)&?4`I(Q%6X@& zUJZU}lk)scI?naQARCWby>e1)ny9?pY3KHMi(wMeGxC$8UQ>zFPwwVl77`*&I`Vv% z49%nfLc&?h`aUT+qXyE*+v{^PSPVqQ>faSg(|cr#MX}Cxl!J^}&TKgS`T|t{ync>s zB=|BiI>S4`4n5M#=6sS8nZmW#Y>J>~V|`aBXPhQ{Gi;UkO7=XKF0y64MES)Q%13d_qQ+SdvXPiHu{NKc-o7Xc zYmFB0>+;6#jVW z0jQt{TG3kB^Y;cZiq(%^rH?$5$U3yo$T=U0%zy02-CY)PqW)ghzt$&xGHS@2muyfXYwzvtFyLn= zLYek=b<7u{o7S6Lj6L1rA9MjSTCpQ1+e>5r?Ca1u zI#Gi18Y9>!c3YAslI>e9_d9<^$T6iRzgpDG)vdF1U}f~I4QI=VjsdOpJeYt$H3mB^ zlMLM%^KjEOW@zb)>bpq;2lGnVPgoyKx&q`HH%>2@=}K)Rgj+i10u2a(q6$#^@lzCQ z`~fN3Ea_T2C2vV3H(@A4x8sXJoz}1vUhb=(@`X#`J0@&D7^@5W{uG!G*?;}9mTq_& zvK?7@Pfh%K-AEQugaA9O5<>2NrUaHQKdyFg4M7N~BuPhJZ5F~J+q{H)oXFNJ zQzf4Le508{xOJt0iXRoG9@7TY>tT2qD4Av!-M7ahr5 z3OU5={JRUUqrkHY2TwU=j4C(L#Y9Tu$yT{Ma$g(yo{{;(X9smHWGwZw(}akMALet4 z_`TP3-Q=m#b0X3Nr1c}2x)!U}8$blY{$=qB^)y3F-I!IcO#y*LT%d0nFUn#RZv6G5 zVX=0{VcL!w6)Y37oLArqzpk_}Sqp0DNZ||zYm*A|*4m>2t6>hlg4gF{!Tv5)@DheYq}cXSWZjSZ8ldO!-4*{IpyAEYaK&DKkyNR6_Xpb@ zfCv7jI9~8C0WjtB09L!<18HIc3>3s4`VY(T0J4;VpOGJdW!rw7nX@gu(b**xlDLb* zw`8tv{Y$sx0K5!KG?Xzk7?=zISHXCb<2RrFlb)djt`RcObwNc!f@HR1CVoRg+I`nuulCsQ+5>sP!N6M^gFO6eYJd+UH1eI(DPieoR+5MnmJ}~*-J`G_sk!^ zInHlw6_e$9xgWR`tGNEtiRS(}^$dXCsw%&$*#k?XuA}EM>b)@Qf#3$$P1=1!(zy5u zPblSy5^+1_x8s?;)pIu>ag{^Vaa%E{y&X-UVW5*y@`j@EU_8^eYxAB(IoB0j(P1r`GphZLrO<_F z%lZ&h^PRH_Z)}&CsWpkS@ptk%TQX@Gi)r`9=mpzLjf?H#orec-hAV0hgdDt)4V6>B zRo^{(B#g<=E#dO(E&sRH_xm0k?Q4MPeWv|oaK&z{vK-!CACV28LR{hA^d+#4Vx0tX zxgA?8@o+#SQ-SOpVbON%eq=%KFuMfXzFtsjDfJGsj|X~oQL=FVl23?f+h0g6Dk^4i z12?&)vf-}o9#S&`8={dq+JTyS7Z?>c{~X?9YU=6$%lJisB;kRE8pZ8z1iZu7>Z^I{ zD*LvWGOgycN3|jN<2+EAr}*+Rk4fGk(qIsJ_w>l}?)Sf{z46`4D6ZmSCoG>=Ez<;= z``Gf1X#3s7D9Hls0QQ(FmI`_0d z1?0nzt`#Ywj<+SE9+CnR8G)B(7@z;tF1rJGSQK{4ser`9M0IoSoXQMV1KmwRvAOZ* zJ}j>Y9`J-zK^6f0kj*Y_s(A30lPL5(JXy3hM2uCaUlm;kW8U|pLyz%ZwmreH;u*S~ z#)A3cICmcBaI{nHc=s9%JPK6q1A+$458#GCoJ<24%!37Y+jD>dxO2MFv8Al?o= z5HEn!ckhsc5Q!X~WVch#J1`2?nEjZPoty;fzg)X%R*+RNdUHeLckEBsn2W2xqi7-k zjI`BpPSN5QH639QTP&L_78VK$;2os-9*!^cfq#nB(U7M`>9^HPiekoLZ^RQOw z!2T#5|2h11Pf7u-W#FK~6kX(4Pgh*H?a*l!Gevx_uMZD0-+n{Hqil`fi+e z_p4$`69$2NKV?WbxR%jvpY?t6UQw~c-!*VATjcP|NMg4yp!DKJGnHH?CQ{W?d%0%Z z2No4zA+>ODAHo;hvp*7K^eYT$?=kpuOsu(ytj5=RZqB#)PF<0|`ab==n)S?vsJ;r{ z@0w)8g%KpYIUjc~eg6?6(9cuc$c0{)WpeFGIV)Kz)RjPpo9Pad1^^XFz8&Rk?Qk z2I}F1Osr&+Q)7<-pw9XYo*SyWTT5ZQXbGA{)3GUDDR5wVU7G2ah%~=wy{~=Xqtv1@ zN^+$w=-#X9FbWvZuvN;ObuaG`XiVCe=S@1$tD$u_+<8EL%eK28pZn~0G-MI5SFadt z)RS6RK4QG6QJBU3eZTRK5cA0z$p)VpeK&u=m&AkubD5i+r>&|3% z(XFwY+gjANT5S74If($KR#@B_TUb_+Mm5Yp8?Mf# z-}3*(TCGUoKjVv%cx*lCM@PC`@cjoEpFunpcJQzv@;o1y`@w@4ngaXW9)wK}%l70o z9dT7v)t-t@)ceQ`JRf~(D;9D4Y|DIWDY8INQ10cbE7Ov?!4Z1>H5F}wW;g@us`X!J zIkU#gVXp!meSWy%j&tUX(>2U+KT*A}vBq-Xz2H3zR5JRM7`I?0@?g+0@UveKwXV+H zgS6_R_Lo9UF{)0AfAs${cybsJfaNi72D3q6?}682>Wsmfvh$n8y42NgrUhUwA?n3X zW8=0}3W*OB!x1d)e;)sx#B?aooO`O>F3_f|dv;?+MFkB8NQGbKxa|B^c$6w^%%6EV zgdZ&GSBaOc;WNG;{7w7O05qo3H(4woKFoQUS4#2p_1~ zgO~j#9Sb2S>wHIVu1OSX9icb(@S?MKPd+_%mwLEsvO98X^hkgEe~UJgxYmu~C)7f+tsCo1GF ze)U5LpEyiQ^*CZTPFwOlo44l*mjw+{zy3BHS;%T!G*yDN zmBljXCIUe#LLi~IpHXIk7aGb=B;&+mTzSy)ronIG#5X+Vy3cv7fWZpkqvaT~X-nL+ zu}W-g!(WWm*&02Vj`un8I-3LyM&tD#JPV?`j^jq@Yz#$8OrVd_ha%l=kl(>)JZt}m zi#-8fQlp`2`LESW;=m=vSy(d%c|ilyWY*r=UGQqzo+@+kl01RUM&{{og}HclvM-J9 z*tcynWC~X2Uj6S_?c(<&c4Giy8Bc|O7&i&{?m`J~tG0S^tb zswFgC5-Fmut1D#fz*hI~T-ku@FT(1-6f$J$!xKriMH;uXhi)4l$ut9Pp7&vpq{o^<-Utx| zKTYR+ST3>$V|2sZG|V0t`S*HX;5|YKOFouc!8SBsTZP!*h0XL>gXQ~viWP7#+jnko%WleT@2XU zMacbgTt%NDWYv`G1`xy)ax71RE~-Te`FhyC4r$q*Pcsg&@r0Xech*PJehYfXNx_PB z3HM49DYCDx{FMyfkv1;7NKtbegz9{VLk8=8|`AZB>h4zvsLTmOW#)XPPfx>cGw}=c$GR5>|zf5 z)cRC#`n{@-72!7g{~R)Mb!}K-~;cYJIr0^glo4UsqrLb9%5ztBV6whk-l};lur;|2dEUTLfU4 j{%;Zfmn=f#-IEPl#Yw5*Mjzlx?;|NOdC@{)J)i#qtc<{c diff --git a/Svc/Deframer/docs/img/top/hub-cmd.txt b/Svc/Deframer/docs/img/top/hub-cmd.txt deleted file mode 100644 index 55302ba996..0000000000 --- a/Svc/Deframer/docs/img/top/hub-cmd.txt +++ /dev/null @@ -1,6 +0,0 @@ -deframer -comOut -0 -hub -portIn -0 diff --git a/Svc/Deframer/docs/img/top/hub-file.json b/Svc/Deframer/docs/img/top/hub-file.json deleted file mode 100644 index e3a14136c5..0000000000 --- a/Svc/Deframer/docs/img/top/hub-file.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "columns" : [ - [ - { - "instanceName" : "deframer", - "inputPorts" : [], - "outputPorts" : [ - { - "name" : "bufferOut", - "portNumbers" : [ - 0 - ] - }, - { - "name" : "bufferDeallocate", - "portNumbers" : [ - 0 - ] - }, - { - "name" : "bufferAllocate", - "portNumbers" : [ - 0 - ] - } - ] - } - ], - [ - { - "instanceName" : "hub", - "inputPorts" : [ - { - "name" : "buffersIn", - "portNumbers" : [ - 0 - ] - } - ], - "outputPorts" : [ - { - "name" : "bufferDeallocate", - "portNumbers" : [ - 0 - ] - } - ] - } - ], - [ - { - "instanceName" : "buffMgr", - "inputPorts" : [ - { - "name" : "bufferSendIn", - "portNumbers" : [ - 0 - ] - }, - { - "name" : "bufferGetCallee", - "portNumbers" : [ - 0 - ] - } - ], - "outputPorts" : [] - } - ] - ], - "connections" : [ - [ - [ - 0, - 0, - 0, - 0 - ], - [ - 1, - 0, - 0, - 0 - ] - ], - [ - [ - 1, - 0, - 0, - 0 - ], - [ - 2, - 0, - 0, - 0 - ] - ], - [ - [ - 0, - 0, - 2, - 0 - ], - [ - 2, - 0, - 1, - 0 - ] - ], - [ - [ - 0, - 0, - 1, - 0 - ], - [ - 2, - 0, - 0, - 0 - ] - ] - ] -} diff --git a/Svc/Deframer/docs/img/top/hub-file.png b/Svc/Deframer/docs/img/top/hub-file.png deleted file mode 100644 index c73171779bf6c977eb95d7406f79482faaf81079..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109894 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 diff --git a/Svc/Deframer/docs/img/top/hub-file.txt b/Svc/Deframer/docs/img/top/hub-file.txt deleted file mode 100644 index d2d83484b9..0000000000 --- a/Svc/Deframer/docs/img/top/hub-file.txt +++ /dev/null @@ -1,28 +0,0 @@ -deframer -bufferOut -0 -hub -buffersIn -0 - -hub -bufferDeallocate -0 -buffMgr -bufferSendIn -0 - -deframer -bufferAllocate -0 -buffMgr -bufferGetCallee -0 - -deframer -bufferDeallocate -0 -buffMgr -bufferSendIn -0 - diff --git a/Svc/Deframer/docs/sdd.md b/Svc/Deframer/docs/sdd.md deleted file mode 100644 index a7612e5d68..0000000000 --- a/Svc/Deframer/docs/sdd.md +++ /dev/null @@ -1,534 +0,0 @@ -\page SvcDeframerComponent Svc::Deframer Component -# Svc::Deframer (Passive Component) - -## 1. Introduction - -`Svc::Deframer` is a passive component. -It accepts as input a sequence of byte buffers, which -typically come from a ground data system via a -[byte stream driver](../../../Drv/ByteStreamDriverModel/docs/sdd.md). -It interprets the concatenated data of the buffers -as a sequence of uplink frames. -The uplink frames need not be aligned on the -buffer boundaries, and each frame may span one or more buffers. -`Deframer` extracts the frames from the sequence of buffers. -For each complete frame _F_ received, `Deframer` -validates _F_ and extracts a data packet from _F_. -It sends the data packet to another component in the service layer, e.g., -an instance of [`Svc::CommandDispatcher`](../../CmdDispatcher/docs/sdd.md), -[`Svc::FileUplink`](../../FileUplink/docs/sdd.md), -or [`Svc::GenericHub`](../../GenericHub/docs/sdd.md). - -When instantiating Deframer, you must provide an implementation -of [`Svc::DeframingProtocol`](../../FramingProtocol/docs/sdd.md). -This implementation specifies exactly what is -in each frame; typically it is a frame header, a data packet, and a hash value. - -On receiving a buffer _FB_ containing framed data, `Deframer` -(1) copies the data from _FB_ into a circular buffer _CB_ owned by `Deframer` and (2) -calls the `deframe` method of the `Svc::DeframingProtocol` implementation, -passing a reference to _CB_ as input. -If _FB_ holds more data than will fit in _CB_, -then `Deframer` repeats this process until _FB_ is empty. -If the protocol implementation reports that the data in _CB_ -represents an incomplete frame, then `Deframer` postpones deframing -until the next buffer _FB_ becomes available. - -Deframer supports two configurations for streaming data: - -1. **Poll:** This configuration works with a passive byte stream driver. - In this configuration, `Deframer` polls the driver for buffers - on its `schedIn` cycle. - No buffer allocation occurs when polling. - _FB_ is a buffer owned by `Deframer`. - -2. **Push:** This configuration works with an active byte stream driver. - In this configuration the driver invokes a guarded port of `Deframer` to - send a buffer _FB_ to `Deframer`. - The invocation transfers ownership of _FB_ from the driver to `Deframer`. - Deframing occurs on the thread of the byte stream driver. - `Deframer` deallocates _FB_ before it returns from - the guarded port call. - -## 2. Assumptions - -1. For any deployment _D_ that uses an instance _I_ of `Deframer`, the - deframing protocol used with _I_ matches the uplink protocol of - any ground system that sends frames to _I_. - -1. In any topology _T_, for any instance _I_ of `Deframer` in _T_, - at any one time, framed data arrives on the poll interface of _I_ or on - the push interface of _I_, but not on both concurrently. - The push and poll interfaces are guarded by a mutual exclusion lock, - so there is no concurrency safety issue. - However, ordinarily it does not make sense to interleave framed data - concurrently on two different interfaces. - -1. Each frame received by `Deframer` contains an F Prime command packet - or file packet _P_. - The first _n_ bytes of the packet hold the packet descriptor value - `Fw::ComPacket::FW_PACKET_COMMAND` (for a command packet) or - `Fw::ComPacket::FW_PACKET_FILE` (for a file packet), - serialized as an unsigned integer in big-endian byte order. - The number of bytes _n_ matches the size of the type defined by the - C preprocessor symbol `FwPacketDescriptorType` in the F Prime FSW. - -## 3. Requirements - -Requirement | Description | Rationale | Verification Method ------------ | ----------- | ----------| ------------------- -SVC-DEFRAMER-001 | `Svc::Deframer` shall accept a sequence of byte buffers and interpret their concatenated data as a sequence of uplink frames. | The purpose of the component is to do uplink deframing. | Unit test -SVC-DEFRAMER-002 | `Svc::Deframer` shall accept byte buffers containing uplink frames that are not aligned on a buffer boundary. | For flexibility, we do not require that the frames be aligned on a buffer boundary. | Unit test -SVC-DEFRAMER-003 | `Svc::Deframer` shall accept byte buffers containing uplink frames that span one or more buffers. | For flexibility, we do not require each frame to fit in a single buffer. | Unit test -SVC-DEFRAMER-004 | `Svc::Deframer` shall provide a port interface that a threaded driver can use to push byte buffers to be deframed. | This interface supports applications in which the byte stream driver has its own thread. | Unit test -SVC-DEFRAMER-005 | `Svc::Deframer` shall provide a port interface that Deframer can use to poll for byte buffers to be deframed. | This interface supports applications in which byte stream driver does not have its own thread. | Unit test -SVC-DEFRAMER-006 | If the polling interface is connected, then `Svc::Deframer` shall poll for byte buffers on its `schedIn` port. | This requirement allows the system scheduler to drive the periodic polling. | Unit test -SVC-DEFRAMER-007 | `Svc::Deframer` shall use an instance of `Svc::DeframingProtocol`, supplied when the component is instantiated, to validate the frames and extract their packet data. | Using the `Svc::DeframingProtocol` interface allows the same Deframer component to operate with different protocols. | Unit test -SVC-DEFRAMER-008 | `Svc::Deframer` shall interpret the initial bytes of the packet data as a value of type `FwPacketDescriptorType`. | `FwPacketDescriptorType` is the type of an F Prime packet descriptor. The size of the type is configurable in the F Prime framework. | Test -SVC-DEFRAMER-009 | `Svc::Deframer` shall extract and send packets with the following types: `Fw::ComPacket::FW_PACKET_COMMAND`, `Fw::ComPacket::FW_PACKET_FILE`. | These are the packet types used for uplink. | Unit test -SVC-DEFRAMER-010 | `Svc::Deframer` shall send command packets and file packets on separate ports. | Command packets and file packets are typically handled by different components. | Unit test -SVC-DEFRAMER-011 | `Svc::Deframer` shall operate nominally when its port for sending file packets is unconnected, even if it receives a frame containing a file packet. | Some applications do not use file uplink. Sending a file uplink packet to `Deframer` should not crash the application because of an unconnected port. | Unit test - -## 4. Design - -### 4.1. Component Diagram - -The diagram below shows the `Deframer` component. - -

- -### 4.2. Ports - -`Deframer` has the following ports: - -| Kind | Name | Port Type | Usage | -|------|------|-----------|-------| -| `guarded input` | `framedIn` | `Drv.ByteStreamRecv` | Port for receiving frame buffers FB pushed from the byte stream driver. After using a buffer FB received on this port, Deframer deallocates it by invoking framedDeallocate.| -| `output` | `framedDeallocate` | `Fw.BufferSend` | Port for deallocating buffers received on framedIn. | -| `guarded input` | `schedIn` | `Svc.Sched` | Schedule in port, driven by a rate group.| -| `output` | `framedPoll` | `Drv.ByteStreamPoll` | Port that polls for data from the byte stream driver. Deframer invokes this port on its schedIn cycle, if it is connected. No allocation or occurs when invoking this port. The data transfer uses a pre-allocated frame buffer owned by Deframer. | -| `output` | `bufferAllocate` | `Fw.BufferGet` | Port for allocating Fw::Buffer objects from a buffer manager. When Deframer invokes this port, it receives a packet buffer PB and takes ownership of it. It uses PB internally for deframing. Then one of two things happens: 1. PB contains a file packet, which Deframer sends on bufferOut. In this case ownership of PB passes to the receiver. 2. PB does not contain a file packet, or bufferOut is unconnected. In this case Deframer deallocates PB on bufferDeallocate. | -| `output` | `bufferOut` | `Fw.BufferSend` | Port for sending file packets (case 1 above). The file packets are wrapped in Fw::Buffer objects allocated with bufferAllocate. Ownership of the Fw::Buffer passes to the receiver, which is responsible for the deallocation. | -| `output` | `bufferDeallocate` | `Fw.BufferSend` | Port for deallocating temporary buffers allocated with bufferAllocate (case 2 above). Deallocation occurs here when there is nothing to send on bufferOut. | -| `output` | `comOut` | `Fw.Com` | Port for sending command packets as Com buffers. | -| `sync input` | `cmdResponseIn` | `Fw.CmdResponse` | Port for receiving command responses from a command dispatcher. Invoking this port does nothing. The port exists to allow the matching connection in the topology. | - - -### 4.3. Derived Classes - -`Deframer` is derived from `DeframerComponentBase` as usual. -It is also derived (via C++ multiple inheritance) from -[`Svc::DeframingProtocolInterface`](../../FramingProtocol/docs/sdd.md). -The multiple inheritance makes the `Deframer` instance into the -instance of `Svc::DeframingProtocolInterface` that is required -to use `Svc::DeframingProtocol`. -See below for a description of how `Deframer` implements -`DeframingProtocolInterface`. - -Here is a class diagram for `Deframer`: - -```mermaid -classDiagram - ObjBase <|-- PassiveComponentBase - PassiveComponentBase <|-- DeframerComponentBase - DeframerComponentBase <|-- Deframer - DeframingProtocolInterface <|-- Deframer -``` - -### 4.4. State - -`Deframer` maintains the following state: - -1. `m_protocol`: A pointer to the implementation of `DeframingProtocol` - used for deframing. - -1. `m_inRing`: An instance of `Types::CircularBuffer` for storing data to be deframed. - -1. `m_ringBuffer`: The storage backing the circular buffer: an array of `RING_BUFFER_SIZE` -`U8` values. - -1. `m_pollBuffer`: The buffer used for polling input: an array of 1024 `POLL_BUFFER_SIZE` -values. - -### 4.5. Header File Configuration - -The `Deframer` header file provides the following configurable constants: - -1. `Svc::Deframer::RING_BUFFER_SIZE`: The size of the circular buffer. -The capacity of the circular buffer must be large enough to hold a -complete frame. - -1. `Svc::Deframer::POLL_BUFFER_SIZE`: The size of the buffer used for polling data. - -### 4.6. Runtime Setup - -To set up an instance of `Deframer`, you do the following: - -1. Call the constructor and the `init` method in the usual way -for an F Prime passive component. - -1. Call the `setup` method, passing in an instance _P_ of `Svc::DeframingProtocol`. -The `setup` method does the following: - - 1. Store a pointer to _P_ in `m_protocol`. - - 1. Pass `*this` into the setup method for _P_. - As noted above, `*this` - is the instance of `Svc::DeframingProtocolInterface` - used by _P_. - -For an example of setting up a `Deframer` instance, see the -`uplink` instance in [`Ref/Top/instances.fpp`](../../../Ref/Top/instances.fpp). - -### 4.7. Port Handlers - -#### 4.7.1. framedIn - -The `framedIn` port handler receives an `Fw::Buffer` _FB_ and a receive status _S_. -It does the following: - -1. If _S_ = `RECV_OK`, then call - `processBuffer`, passing in _FB_. - -2. Deallocate _FB_ by invoking `framedDeallocate`. - -#### 4.7.2. schedIn - -The `schedIn` port handler does the following: - -1. Construct an `Fw::Buffer` _FB_ that wraps `m_pollBuffer`. - -1. If `framedPoll` is connected, then - - 1. Invoke `framedPollOut`, passing in _FB_, to poll for new data. - - 1. If new data is available, then call - `processBuffer`, passing in _FB_. - -#### 4.7.3. cmdResponseIn - -The `cmdResponseIn` handler does nothing. -It exists to provide the necessary symmetry in the topology -(every component that sends a command to the dispatcher should -accept a matching response). - - -### 4.8. Implementation of Svc::DeframingProtocolInterface - - -#### 4.8.1. allocate - -The implementation of `allocate` invokes `bufferAllocate`. - - -#### 4.8.2. route - -The implementation of `route` takes a reference to an -`Fw::Buffer` _PB_ (a packet buffer) and does the following: - -1. Set `deallocate = true`. - -1. Let _N_ = `sizeof(FwPacketDescriptorType)`. -Deserialize the first _N_ bytes of _PB_ as a value of type -`FwPacketDescriptorType`. - -1. If the deserialization succeeds, then switch on the packet type _T_. - - 1. If _T_ = `FW_PACKET_COMMAND`, then send the contents - of _PB_ as a Com buffer on `comOut`. - - 1. Otherwise if _T_ = `FW_PACKET_FILE` and `bufferOut` is connected, - then - - 1. Shift the pointer of _PB_ _N_ bytes forward and - reduce the size of _PB_ by _N_ to skip the packet type. - This step is necessary to accommodate the `FileUplink` component. - - 1. Send _B_ on `bufferOut`. - - 1. Set `deallocate = false`. This step causes ownership - of the buffer to pass to the receiver. - -1. If `deallocate = true`, then invoke `bufferDeallocate` - to deallocate _PB_. - -### 4.9. Helper Functions - - -#### 4.9.1. processBuffer - -`processBuffer` accepts a reference to an `Fw::Buffer` _FB_ -(a frame buffer). -It does the following: - -1. Set `buffer_offset` = 0. - -1. Set _S_ = `buffer.getSize()`. - -1. In a bounded loop, while `buffer_offset` < _S_, do: - - 1. Compute the amount of remaining data in _FB_. - This is _R_ = _S_ - `buffer_offset`. - - 1. Compute _C_, the number of bytes to copy from _FB_ into the - circular buffer `m_inRing`. - - 1. Let _F_ be the number of free bytes in `m_inRing`. - - 1. If _R_ < _F_, then _C_ = _R_. - - 1. Otherwise _C_ = _F_. - - 1. Copy _C_ bytes from _FB_ starting at `buffer_offset` - into `m_inRing`. - - 1. Advance `buffer_offset` by _C_. - - 1. Call `processRing` - to process the data stored in `m_inRing`. - - -#### 4.9.2. processRing - -In a bounded loop, while there is data remaining in `m_inRing`, do: - -1. Call the `deframe` method of `m_protocol` on `m_inRing`. - The `deframe` method calls `allocate` and - `route` as necessary. - It returns a status value _S_ and the number _N_ of bytes - needed for successful deframing. - -1. If _S_ = `SUCCESS`, then _N_ represents the number of bytes - used in a successful deframing. Rotate `m_inRing` by _N_ bytes (i.e., - deallocate _N_ bytes from the head of `m_inRing`). - -1. Otherwise if _S_ = `MORE_NEEDED`, then do nothing. - Further processing will occur on the next call, after more - data goes into `m_inRing`. - -1. Otherwise something is wrong. - Rotate `m_inRing` by one byte, to skip byte by byte over - bad data until we find a valid frame. - -## 5. Ground Interface - -None. - -## 6. Example Uses - - -### 6.1. Topology Diagrams - -The following topology diagrams show how to connect `Svc::Deframer` -to a byte stream driver, a command dispatcher, and a file uplink component. -The diagrams use the following instances: - -* `activeComm`: An active instance of -[`Drv::ByteStreamDriverModel`](../../../Drv/ByteStreamDriverModel/docs/sdd.md), for example, -[`Drv::TcpClient`](../../../Drv/TcpClient/docs/sdd.md). - -* `buffMgr`: An instance of [`Svc::BufferManager`](../../BufferManager/docs/sdd.md) - -* `cmdDisp`: An instance of [`Svc::CommandDispatcher`](../../CmdDispatcher/docs/sdd.md) - -* `deframer`: An instance of `Svc::Deframer`. - -* `fileUplink`: An instance of [`Svc::FileUplink`](../../FileUplink/docs/sdd.md). - -* `passiveComm`: A passive instance of -[`Drv::ByteStreamDriverModel`](../../../Drv/ByteStreamDriverModel/docs/sdd.md). - -* `rateGroup`: An instance of [`Svc::ActiveRateGroup`](../../ActiveRateGroup/docs/sdd.md). - -Topologies 1a and 1b are alternate topologies. -You should use one or the other. -In topology 3, the `fileUplink` instance and its connections are -optional. - -**Topology 1a: Buffers containing framed data (active byte stream driver):** - -
- -
- -**Topology 1b: Buffers containing framed data (passive byte stream driver):** - -
- -
- -Revise the port number of `rateGroup.RateGroupMemberOut` as -appropriate for your application. - -**Topology 2: Command packets and command responses:** - -
- -
- -Revise the port numbers of `cmdDisp.seqCmdBuff` and -`cmdDisp.compCmdStat` as appropriate for your application. -If you model your topology in FPP, then FPP can automatically -assign these numbers. - -**Topology 3: Buffers containing packet data:** - -
- -
- -### 6.2. Sequence Diagrams - -#### 6.2.1. Active Byte Stream Driver - -**Sending a command packet:** -The following sequence diagram shows what happens when `activeComm` -sends data to `deframer`, and `deframer` -decodes the data into a command packet. -Open vertical rectangles represent threads. -Vertical dashed lines represent component code. -Solid horizontal arrows represent synchronous port invocations, and open -horizontal arrows represent asynchronous port invocations. - -```mermaid -sequenceDiagram - activate activeComm - activeComm->>buffMgr: Allocate frame buffer FB - buffMgr-->>activeComm: Return FB - activeComm->>activeComm: Fill FB with framed data - activeComm->>deframer: Send FB[framedIn] - deframer->>buffMgr: Allocate packet buffer PB [bufferAllocate] - buffMgr-->>deframer: Return PB - deframer->>deframer: Deframe FB into PB - deframer->>deframer: Copy PB into a command packet C - deframer-)cmdDisp: Send C [comOut] - deframer->>buffMgr: Deallocate PB [bufferDeallocate] - buffMgr-->>deframer: - deframer->>buffMgr: Deallocate FB [framedDeallocate] - buffMgr-->>deframer: - deframer-->>activeComm: - deactivate activeComm - activate cmdDisp - cmdDisp->>deframer: Send cmd response [cmdResponseIn] - deframer-->>cmdDisp: - deactivate cmdDisp -``` - -**Sending a file packet:** -The following sequence diagram shows what happens when `activeComm` -sends data to `deframer`, and `deframer` decodes the data into a file packet. - -```mermaid -sequenceDiagram - activate activeComm - activeComm->>buffMgr: Allocate frame buffer FB - buffMgr-->>activeComm: Return FB - activeComm->>activeComm: Fill FB with framed data - activeComm->>deframer: Send FB [framedIn] - deframer->>buffMgr: Allocate packet buffer PB [bufferAllocate] - buffMgr-->>deframer: Return PB - deframer->>deframer: Deframe FB into PB - deframer-)fileUplink: Send PB [bufferOut] - deframer->>buffMgr: Deallocate FB [framedDeallocate] - buffMgr-->>deframer: - deframer-->>activeComm: - deactivate activeComm - activate fileUplink - fileUplink->>buffMgr: Deallocate PB - buffMgr-->>fileUplink: - deactivate fileUplink -``` - -#### 6.2.2. Passive Byte Stream Driver - -**Sending a command packet:** The following sequence diagram shows what -happens when `passiveComm` sends data to `deframer`, and -`deframer` decodes the data into a command packet. - -```mermaid -sequenceDiagram - activate rateGroup - rateGroup->>deframer: Send schedule tick [schedIn] - deframer->>passiveComm: Poll for data [framedPoll] - passiveComm-->>deframer: Return status - deframer->>buffMgr: Allocate packet buffer PB [bufferAllocate] - buffMgr-->>deframer: Return PB - deframer->>deframer: Deframe data into PB - deframer->>deframer: Copy PB into a command packet C - deframer-)cmdDisp: Send C [comOut] - deframer->>buffMgr: Deallocate PB [bufferDeallocate] - buffMgr-->>deframer: - deframer-->>rateGroup: - deactivate rateGroup - activate cmdDisp - cmdDisp->>deframer: Send cmd response [cmdResponseIn] - deframer-->>cmdDisp: - deactivate cmdDisp -``` - -**Sending a file packet:** The following sequence diagram shows what -happens when `passiveComm` sends data to `deframer`, and -`Deframer` decodes the data into a file packet. - -```mermaid -sequenceDiagram - activate rateGroup - rateGroup->>deframer: Send schedule tick [schedIn] - deframer->>passiveComm: Poll for data [framedPoll] - passiveComm-->>deframer: Return status - deframer->>buffMgr: Allocate packet buffer PB [bufferAllocate] - buffMgr-->>deframer: Return PB - deframer->>deframer: Deframe data into PB - deframer-)fileUplink: Send PB [bufferOut] - deframer-->>rateGroup: - deactivate rateGroup - activate fileUplink - fileUplink->>buffMgr: Deallocate PB - buffMgr-->>fileUplink: - deactivate fileUplink -``` - - -### 6.3. Using Svc::GenericHub - -You can use `Deframer` with an instance of -[`Svc::GenericHub`](../../GenericHub/docs/sdd.md) to send deframed -command packets and file packets across a network connection, instead of -directly to a command dispatcher or file uplink component. -To send deframed packets this way, do the following: - -1. In the topology described above, -instead of the `cmdDisp` and `fileUplink` instances, use an -instance `hub` of type `Svc::GenericHub`. - -1. Revise topologies 2 and 3 as shown below. - -**Topology 2: Command packets** - -
- -
- -Revise the port number of `hub.portIn` as appropriate for your application. - -**Topology 3: Buffers containing packet data** - -
- -
- -Revise the port number of `hub.buffersIn` as appropriate for your application. -When `hub` receives a buffer on `buffersIn`, it copies the data across -the connection to the other hub and deallocates the buffer. - -If you don't need to transmit file packets across the hub, then you can -omit the `hub` connections shown in this topology. - -## 7. Change Log - -| Date | Description | -|---|---| -| 2021-01-30 | Initial Draft | -| 2022-04-04 | Revised | diff --git a/Svc/Deframer/test/ut-fprime-protocol/DeframerTestMain.cpp b/Svc/Deframer/test/ut-fprime-protocol/DeframerTestMain.cpp deleted file mode 100644 index 94c731f866..0000000000 --- a/Svc/Deframer/test/ut-fprime-protocol/DeframerTestMain.cpp +++ /dev/null @@ -1,132 +0,0 @@ -// ---------------------------------------------------------------------- -// TestMain.cpp -// ---------------------------------------------------------------------- - -#include - -#include "Fw/Test/UnitTest.hpp" -#include "GenerateFrames.hpp" -#include "Os/Log.hpp" -#include "STest/Scenario/BoundedScenario.hpp" -#include "STest/Scenario/RandomScenario.hpp" -#include "STest/Scenario/Scenario.hpp" -#include "SendBuffer.hpp" -#include "DeframerTester.hpp" - -#define STEP_COUNT 10000 - -// Uncomment the following line to turn on OS logging -//Os::Log logger; - -// ---------------------------------------------------------------------- -// Static helper functions -// ---------------------------------------------------------------------- - -//! Run a random scenario -static void runRandomScenario(Svc::DeframerTester::InputMode::t inputMode) { - Svc::DeframerTester tester(Svc::DeframerTester::InputMode::PUSH); - - // Create rules, and assign them into the array - Svc::GenerateFrames generateFrames; - Svc::SendBuffer sendBuffer; - - // Setup a list of rules to choose from - STest::Rule* rules[] = { - &generateFrames, - &sendBuffer - }; - // Construct the random scenario and run it with the defined bounds - STest::RandomScenario random( - "Random Rules", - rules, - FW_NUM_ARRAY_ELEMENTS(rules) - ); - - // Setup a bounded scenario to run rules a set number of times - STest::BoundedScenario bounded( - "Bounded Random Rules Scenario", - random, - STEP_COUNT - ); - // Run! - const U32 numSteps = bounded.run(tester); - printf("Ran %u steps.\n", numSteps); -} - -// ---------------------------------------------------------------------- -// Tests -// ---------------------------------------------------------------------- - -TEST(Nominal, BasicPush) { - COMMENT("Send one buffer to the deframer, simulating an active driver (push)"); - REQUIREMENT("SVC-DEFRAMER-001"); - REQUIREMENT("SVC-DEFRAMER-002"); - REQUIREMENT("SVC-DEFRAMER-003"); - REQUIREMENT("SVC-DEFRAMER-004"); - REQUIREMENT("SVC-DEFRAMER-007"); - REQUIREMENT("SVC-DEFRAMER-008"); - REQUIREMENT("SVC-DEFRAMER-009"); - REQUIREMENT("SVC-DEFRAMER-010"); - Svc::DeframerTester tester(Svc::DeframerTester::InputMode::PUSH); - Svc::GenerateFrames().apply(tester); - Svc::SendBuffer().apply(tester); -} - -TEST(Nominal, BasicPoll) { - COMMENT("Send one buffer to the deframer, simulating a passive driver (poll)"); - REQUIREMENT("SVC-DEFRAMER-001"); - REQUIREMENT("SVC-DEFRAMER-002"); - REQUIREMENT("SVC-DEFRAMER-003"); - REQUIREMENT("SVC-DEFRAMER-005"); - REQUIREMENT("SVC-DEFRAMER-006"); - REQUIREMENT("SVC-DEFRAMER-007"); - REQUIREMENT("SVC-DEFRAMER-008"); - REQUIREMENT("SVC-DEFRAMER-009"); - REQUIREMENT("SVC-DEFRAMER-010"); - Svc::DeframerTester tester(Svc::DeframerTester::InputMode::POLL); - Svc::GenerateFrames().apply(tester); - Svc::SendBuffer().apply(tester); -} - -TEST(Nominal, RandomPush) { - COMMENT("Send random buffers to the deframer, simulating an active driver (push)"); - REQUIREMENT("SVC-DEFRAMER-001"); - REQUIREMENT("SVC-DEFRAMER-002"); - REQUIREMENT("SVC-DEFRAMER-003"); - REQUIREMENT("SVC-DEFRAMER-004"); - REQUIREMENT("SVC-DEFRAMER-007"); - REQUIREMENT("SVC-DEFRAMER-008"); - REQUIREMENT("SVC-DEFRAMER-009"); - REQUIREMENT("SVC-DEFRAMER-010"); - runRandomScenario(Svc::DeframerTester::InputMode::PUSH); -} - -TEST(Nominal, RandomPoll) { - COMMENT("Send random buffers to the deframer, simulating a passive driver (poll)"); - REQUIREMENT("SVC-DEFRAMER-001"); - REQUIREMENT("SVC-DEFRAMER-002"); - REQUIREMENT("SVC-DEFRAMER-003"); - REQUIREMENT("SVC-DEFRAMER-005"); - REQUIREMENT("SVC-DEFRAMER-006"); - REQUIREMENT("SVC-DEFRAMER-007"); - REQUIREMENT("SVC-DEFRAMER-008"); - REQUIREMENT("SVC-DEFRAMER-009"); - REQUIREMENT("SVC-DEFRAMER-010"); - runRandomScenario(Svc::DeframerTester::InputMode::POLL); -} - -TEST(Error, SizeOverflow) { - COMMENT("Test handling of size overflow in F Prime deframing protocol"); - Svc::DeframerTester tester(Svc::DeframerTester::InputMode::PUSH); - tester.sizeOverflow(); -} - -// ---------------------------------------------------------------------- -// Main function -// ---------------------------------------------------------------------- - -int main(int argc, char **argv) { - ::testing::InitGoogleTest(&argc, argv); - STest::Random::seed(); - return RUN_ALL_TESTS(); -} diff --git a/Svc/Deframer/test/ut-fprime-protocol/DeframerTester.cpp b/Svc/Deframer/test/ut-fprime-protocol/DeframerTester.cpp deleted file mode 100644 index 1cf494ccd3..0000000000 --- a/Svc/Deframer/test/ut-fprime-protocol/DeframerTester.cpp +++ /dev/null @@ -1,261 +0,0 @@ -// ====================================================================== -// \title DeframerTester.cpp -// \brief Implementation file for Deframer test with F Prime protocol -// \author mstarch, bocchino -// -// \copyright -// Copyright 2009-2022, by the California Institute of Technology. -// ALL RIGHTS RESERVED. United States Government Sponsorship -// acknowledged. -// ====================================================================== - -#include -#include - -#include "Fw/Types/Assert.hpp" -#include "DeframerTester.hpp" -#include "Utils/Hash/Hash.hpp" -#include "Utils/Hash/HashBuffer.hpp" - -#define INSTANCE 0 -#define MAX_HISTORY_SIZE 10000 - -namespace Svc { - - // ---------------------------------------------------------------------- - // Constructor - // ---------------------------------------------------------------------- - - DeframerTester ::DeframerTester(InputMode::t inputMode) - : DeframerGTestBase("Tester", MAX_HISTORY_SIZE), - component("Deframer"), - m_inputMode(inputMode) - { - this->initComponents(); - this->connectPorts(); - component.setup(protocol); - memset(m_incomingBufferBytes, 0, sizeof m_incomingBufferBytes); - } - - // ---------------------------------------------------------------------- - // Tests - // ---------------------------------------------------------------------- - - void DeframerTester ::sizeOverflow() { - U8 data[FpFrameHeader::SIZE]; - Fw::Buffer buffer(data, sizeof data); - Fw::SerializeBufferBase& serialRepr = buffer.getSerializeRepr(); - Fw::SerializeStatus status = serialRepr.serialize(FpFrameHeader::START_WORD); - ASSERT_EQ(status, Fw::FW_SERIALIZE_OK); - FpFrameHeader::TokenType size = std::numeric_limits::max(); - status = serialRepr.serialize(size); - ASSERT_EQ(status, Fw::FW_SERIALIZE_OK); - this->component.processBuffer(buffer); - // Assert no output - ASSERT_FROM_PORT_HISTORY_SIZE(0); - } - - // ---------------------------------------------------------------------- - // Public instance methods - // ---------------------------------------------------------------------- - - void DeframerTester ::setUpIncomingBuffer() { - const U32 bufferSize = STest::Pick::lowerUpper( - 1, - sizeof m_incomingBufferBytes - ); - ASSERT_LE(bufferSize, sizeof m_incomingBufferBytes); - m_incomingBuffer = Fw::Buffer( - m_incomingBufferBytes, - bufferSize - ); - } - - void DeframerTester ::sendIncomingBuffer() { - switch (m_inputMode) { - case InputMode::PUSH: - // Push buffer to framedIn - invoke_to_framedIn( - 0, - m_incomingBuffer, - Drv::RecvStatus::RECV_OK - ); - break; - case InputMode::POLL: - // Call schedIn handler, which polls for buffer - invoke_to_schedIn(0, 0); - break; - default: - FW_ASSERT(0); - break; - } - } - - // ---------------------------------------------------------------------- - // Handlers for typed from ports - // ---------------------------------------------------------------------- - - void DeframerTester ::from_comOut_handler( - const NATIVE_INT_TYPE portNum, - Fw::ComBuffer& data, - U32 context - ) { - // Check that a received frame is expected - ASSERT_GT(m_framesToReceive.size(), 0) << - "Queue of frames to receive is empty" << std::endl; - // Get the frame at the front - UplinkFrame frame = m_framesToReceive.front(); - m_framesToReceive.pop_front(); - // Check the packet type - ASSERT_EQ(frame.packetType, Fw::ComPacket::FW_PACKET_COMMAND); - // Check the packet data - for (U32 i = 0; i < data.getBuffLength(); i++) { - EXPECT_EQ( - (data.getBuffAddr())[i], - (frame.getData())[FpFrameHeader::SIZE + i] - ); - } - // Push the history entry - this->pushFromPortEntry_comOut(data, context); - } - - void DeframerTester ::from_bufferOut_handler( - const NATIVE_INT_TYPE portNum, - Fw::Buffer& fwBuffer - ) { - // Check that a received frame is expected - ASSERT_GT(m_framesToReceive.size(), 0) << - "Queue of frames to receive is empty" << std::endl; - // Get the frame at the front - UplinkFrame frame = m_framesToReceive.front(); - m_framesToReceive.pop_front(); - // Check the packet type - ASSERT_EQ(frame.packetType, Fw::ComPacket::FW_PACKET_FILE); - // Check the packet data - for (U32 i = 0; i < fwBuffer.getSize(); i++) { - // Deframer strips type before sending to FileUplink - const U32 frameOffset = - FpFrameHeader::SIZE + sizeof(FwPacketDescriptorType) + i; - ASSERT_EQ( - (fwBuffer.getData())[i], - (frame.getData())[frameOffset] - ); - } - // Buffers received on this port are owned by the receiver - // So delete the allocation now - // Before deallocating, undo the deframer's adjustment of the pointer - // by the size of the packet type - delete[](fwBuffer.getData() - sizeof(FwPacketDescriptorType)); - // Push the history entry - this->pushFromPortEntry_bufferOut(fwBuffer); - } - - Fw::Buffer DeframerTester ::from_bufferAllocate_handler( - const NATIVE_INT_TYPE portNum, - U32 size - ) { - this->pushFromPortEntry_bufferAllocate(size); - U8 *const data = new U8[size]; - memset(data, 0, size); - Fw::Buffer buffer(data, size); - return buffer; - } - - void DeframerTester ::from_bufferDeallocate_handler( - const NATIVE_INT_TYPE portNum, - Fw::Buffer& fwBuffer - ) { - delete[] fwBuffer.getData(); - this->pushFromPortEntry_bufferDeallocate(fwBuffer); - } - - void DeframerTester ::from_framedDeallocate_handler( - const NATIVE_INT_TYPE portNum, - Fw::Buffer& fwBuffer - ) { - this->pushFromPortEntry_framedDeallocate(fwBuffer); - } - - Drv::PollStatus DeframerTester ::from_framedPoll_handler( - const NATIVE_INT_TYPE portNum, - Fw::Buffer& pollBuffer - ) { - this->pushFromPortEntry_framedPoll(pollBuffer); - U8* incoming = m_incomingBuffer.getData(); - const U32 size = m_incomingBuffer.getSize(); - U8* outgoing = pollBuffer.getData(); - const U32 maxSize = pollBuffer.getSize(); - FW_ASSERT(size <= maxSize, size, maxSize); - memcpy(outgoing, incoming, size); - pollBuffer.setSize(size); - return Drv::PollStatus::POLL_OK; - } - - // ---------------------------------------------------------------------- - // Helper methods - // ---------------------------------------------------------------------- - - void DeframerTester ::connectPorts() { - - // bufferAllocate - this->component.set_bufferAllocate_OutputPort( - 0, - this->get_from_bufferAllocate(0) - ); - - // bufferDeallocate - this->component.set_bufferDeallocate_OutputPort( - 0, - this->get_from_bufferDeallocate(0) - ); - - // bufferOut - this->component.set_bufferOut_OutputPort( - 0, - this->get_from_bufferOut(0) - ); - - // cmdResponseIn - this->connect_to_cmdResponseIn( - 0, - this->component.get_cmdResponseIn_InputPort(0) - ); - - // comOut - this->component.set_comOut_OutputPort( - 0, - this->get_from_comOut(0) - ); - - // framedDeallocate - this->component.set_framedDeallocate_OutputPort( - 0, - this->get_from_framedDeallocate(0) - ); - - // framedIn - this->connect_to_framedIn( - 0, - this->component.get_framedIn_InputPort(0) - ); - - // framedPoll - this->component.set_framedPoll_OutputPort( - 0, - this->get_from_framedPoll(0) - ); - - // schedIn - this->connect_to_schedIn( - 0, - this->component.get_schedIn_InputPort(0) - ); - - } - - void DeframerTester ::initComponents() { - this->init(); - this->component.init(INSTANCE); - } - -} diff --git a/Svc/Deframer/test/ut-fprime-protocol/DeframerTester.hpp b/Svc/Deframer/test/ut-fprime-protocol/DeframerTester.hpp deleted file mode 100644 index 1ea922556d..0000000000 --- a/Svc/Deframer/test/ut-fprime-protocol/DeframerTester.hpp +++ /dev/null @@ -1,325 +0,0 @@ -// ====================================================================== -// \title DeframerTester.hpp -// \brief Header file for Deframer test with F Prime protocol -// \author mstarch, bocchino -// -// \copyright -// Copyright 2009-2022, by the California Institute of Technology. -// ALL RIGHTS RESERVED. United States Government Sponsorship -// acknowledged. -// ====================================================================== - -#ifndef SVC_TESTER_HPP -#define SVC_TESTER_HPP - -#include -#include - -#include "DeframerGTestBase.hpp" -#include "Fw/Com/ComPacket.hpp" -#include "Fw/Types/SerialBuffer.hpp" -#include "STest/STest/Pick/Pick.hpp" -#include "Svc/Deframer/Deframer.hpp" -#include "Svc/FramingProtocol/FprimeProtocol.hpp" -#include "Utils/Hash/Hash.hpp" - -namespace Svc { - - class DeframerTester : public DeframerGTestBase { - - // ---------------------------------------------------------------------- - // Friend classes - // ---------------------------------------------------------------------- - - friend struct GenerateFrames; - friend class SendBuffer; - - // ---------------------------------------------------------------------- - // Types - // ---------------------------------------------------------------------- - - public: - - //! Enumerated constants - enum Constants { - //! The maximum valid frame size - //! Every valid frame must fit in the ring buffer - MAX_VALID_FRAME_SIZE = DeframerCfg::RING_BUFFER_SIZE, - //! The max frame size that will fit in the test buffer - //! Larger than max valid size, to test bad sizes - MAX_FRAME_SIZE = MAX_VALID_FRAME_SIZE + 1, - //! The size of the part of the frame that is outside the packet - NON_PACKET_SIZE = FpFrameHeader::SIZE + HASH_DIGEST_LENGTH, - //! The offset of the start word in an F Prime protocol frame - START_WORD_OFFSET = 0, - //! The offset of the packet size in an F Prime protocol frame - PACKET_SIZE_OFFSET = START_WORD_OFFSET + - sizeof FpFrameHeader::START_WORD, - //! The offset of the packet type in an F Prime protocol frame - PACKET_TYPE_OFFSET = FpFrameHeader::SIZE, - }; - - //! The type of the input mode - struct InputMode { - typedef enum { - //! Push data from another thread - PUSH, - //! Poll for data on the schedIn thread - POLL - } t; - }; - - //! An uplink frame for testing - class UplinkFrame { - - // ---------------------------------------------------------------------- - // Types - // ---------------------------------------------------------------------- - - //! The type of frame data - typedef U8 FrameData[MAX_FRAME_SIZE]; - - public: - - // ---------------------------------------------------------------------- - // Constructor - // ---------------------------------------------------------------------- - - //! Construct an uplink frame - UplinkFrame( - Fw::ComPacket::ComPacketType packetType, //!< The packet type - U32 packetSize //!< The packet size - ); - - public: - - // ---------------------------------------------------------------------- - // Public instance methods - // ---------------------------------------------------------------------- - - //! Copy data from the frame, advancing the copy offset - void copyDataOut( - Fw::SerialBuffer& serialBuffer, //!< The serial buffer to copy to - U32 size //!< The number of bytes to copy - ); - - //! Get a constant reference to the frame data - const FrameData& getData() const; - - //! Get the frame size - U32 getSize() const; - - //! Get the size of data that remains for copying - U32 getRemainingCopySize() const; - - //! Report whether the frame is valid - bool isValid() const; - - public: - - // ---------------------------------------------------------------------- - // Public static methods - // ---------------------------------------------------------------------- - - //! Construct a random frame - static UplinkFrame random(); - - //! Get the max packet size that will fit in the test buffer - //! This is an invalid size for the deframer - static U32 getInvalidPacketSize(); - - //! Get the max valid command packet size - static U32 getMaxValidCommandPacketSize(); - - //! Get the max valid file packet size - static U32 getMaxValidFilePacketSize(); - - //! Get the min packet size - static U32 getMinPacketSize(); - - private: - - // ---------------------------------------------------------------------- - // Private instance methods - // ---------------------------------------------------------------------- - - //! Randomly invalidate a valid frame, or leave it alone - //! If the frame is already invalid, leave it alone - void randomlyInvalidate(); - - //! Update the frame header - void updateHeader(); - - //! Update the hash value - void updateHash(); - - //! Write an arbitrary packet size - void writePacketSize( - FpFrameHeader::TokenType ps //!< The packet size - ); - - //! Write an arbitrary packet type - void writePacketType( - FwPacketDescriptorType pt //!< The packet type - ); - - //! Write an arbitrary start word - void writeStartWord( - FpFrameHeader::TokenType sw //!< The start word - ); - - public: - - // ---------------------------------------------------------------------- - // Public member variables - // ---------------------------------------------------------------------- - - //! The packet type - const Fw::ComPacket::ComPacketType packetType; - - //! The packet size - const U32 packetSize; - - private: - - // ---------------------------------------------------------------------- - // Private member variables - // ---------------------------------------------------------------------- - - //! The frame data, including header, packet data, and hash. - //! The array is big enough to hold a frame larger than the - //! max valid frame size for the deframer. - U8 data[MAX_FRAME_SIZE]; - - //! The amount of frame data already copied out into a buffer - U32 copyOffset; - - //! Whether the frame is valid - bool valid; - - }; - - public: - - // ---------------------------------------------------------------------- - // Constructor - // ---------------------------------------------------------------------- - - //! Construct a DeframerTester - DeframerTester(InputMode::t inputMode); - - public: - - // ---------------------------------------------------------------------- - // Tests - // ---------------------------------------------------------------------- - - //! Size would cause integer overflow - void sizeOverflow(); - - public: - - // ---------------------------------------------------------------------- - // Public instance methods - // ---------------------------------------------------------------------- - - //! Set up the incoming buffer - void setUpIncomingBuffer(); - - //! Send the incoming buffer - void sendIncomingBuffer(); - - private: - - // ---------------------------------------------------------------------- - // Handlers for typed from ports - // ---------------------------------------------------------------------- - - //! Handler for from_comOut - void from_comOut_handler( - const NATIVE_INT_TYPE portNum, //!< The port number - Fw::ComBuffer& data, //!< Buffer containing packet data - U32 context //!< Call context value; meaning chosen by user - ); - - //! Handler for from_bufferOut - void from_bufferOut_handler( - const NATIVE_INT_TYPE portNum, //!< The port number - Fw::Buffer& fwBuffer //!< The buffer - ); - - //! Handler for from_bufferAllocate - Fw::Buffer from_bufferAllocate_handler( - const NATIVE_INT_TYPE portNum, //!< The port number - U32 size //!< The size - ); - - //! Handler for from_bufferDeallocate - void from_bufferDeallocate_handler( - const NATIVE_INT_TYPE portNum, //!< The port number - Fw::Buffer& fwBuffer //!< The buffer - ); - - //! Handler for from_framedDeallocate - //! - void from_framedDeallocate_handler( - const NATIVE_INT_TYPE portNum, //!< The port number - Fw::Buffer& fwBuffer //!< The buffer - ); - - //! Handler for from_framedPoll - Drv::PollStatus from_framedPoll_handler( - const NATIVE_INT_TYPE portNum, //!< The port number - Fw::Buffer& pollBuffer //!< The poll buffer - ); - - private: - - // ---------------------------------------------------------------------- - // Private helper methods - // ---------------------------------------------------------------------- - - //! Connect ports - void connectPorts(); - - //! Initialize components - void initComponents(); - - //! Allocate a packet buffer - Fw::Buffer allocatePacketBuffer( - U32 size //!< The buffer size - ); - - private: - - // ---------------------------------------------------------------------- - // Private member variables - // ---------------------------------------------------------------------- - - //! The component under test - Deframer component; - - //! The deframing protocol - Svc::FprimeDeframing protocol; - - //! Frames that the DeframerTester should send to the Deframer - std::deque m_framesToSend; - - //! Frames that the DeframerTester should receive from the Deframer - std::deque m_framesToReceive; - - //! Byte store for the incoming buffer - //! In polling mode, the incoming buffer must fit in the poll buffer - U8 m_incomingBufferBytes[DeframerCfg::POLL_BUFFER_SIZE]; - - //! Serialized frame data to send to the Deframer - Fw::Buffer m_incomingBuffer; - - //! The input mode - InputMode::t m_inputMode; - - }; - -} - -#endif diff --git a/Svc/Deframer/test/ut-fprime-protocol/GenerateFrames.cpp b/Svc/Deframer/test/ut-fprime-protocol/GenerateFrames.cpp deleted file mode 100644 index 76d9710ed8..0000000000 --- a/Svc/Deframer/test/ut-fprime-protocol/GenerateFrames.cpp +++ /dev/null @@ -1,40 +0,0 @@ -//! ====================================================================== -//! \title GenerateFrames.cpp -//! \brief Implementation file for GenerateFrames rule -//! \author mstarch, bocchino -//! ====================================================================== - -#include "GenerateFrames.hpp" -#include "Printing.hpp" -#include "STest/Pick/Pick.hpp" -#include "Utils/Hash/Hash.hpp" - -namespace Svc { - - GenerateFrames :: GenerateFrames() : - STest::Rule("GenerateFrames") - { - - } - - bool GenerateFrames :: precondition(const Svc::DeframerTester &state) { - return state.m_framesToSend.size() == 0; - } - - void GenerateFrames :: action(Svc::DeframerTester &state) { - PRINT("----------------------------------------------------------------------"); - PRINT("GenerateFrames action"); - PRINT("----------------------------------------------------------------------"); - // Generate 1-100 frames - const U32 numFrames = STest::Pick::lowerUpper(1, 100); - PRINT_ARGS("Generating %d frames", numFrames) - for (U32 i = 0; i < numFrames; i++) { - // Generate a random frame - DeframerTester::UplinkFrame frame = DeframerTester::UplinkFrame::random(); - // Push it on the sending list - state.m_framesToSend.push_back(frame); - } - PRINT_ARGS("frameToSend.size()=%lu", state.m_framesToSend.size()) - } - -} diff --git a/Svc/Deframer/test/ut-fprime-protocol/GenerateFrames.hpp b/Svc/Deframer/test/ut-fprime-protocol/GenerateFrames.hpp deleted file mode 100644 index 170a11a883..0000000000 --- a/Svc/Deframer/test/ut-fprime-protocol/GenerateFrames.hpp +++ /dev/null @@ -1,46 +0,0 @@ -//! ====================================================================== -//! \title DeframerRules.hpp -//! \brief Header file for GenerateFrames rule -//! \author lestarch, bocchino -//! ====================================================================== - -#ifndef SVC_GENERATE_FRAMES_HPP -#define SVC_GENERATE_FRAMES_HPP - -#include -#include "Fw/Types/StringType.hpp" -#include "STest/STest/Pick/Pick.hpp" -#include "STest/STest/Rule/Rule.hpp" -#include "DeframerTester.hpp" - -namespace Svc { - - //! Generate frames to send - struct GenerateFrames : public STest::Rule { - - // ---------------------------------------------------------------------- - // Construction - // ---------------------------------------------------------------------- - - //! Constructor - GenerateFrames(); - - // ---------------------------------------------------------------------- - // Public member functions - // ---------------------------------------------------------------------- - - //! Precondition - bool precondition( - const DeframerTester& state //!< The test state - ); - - //! Action - void action( - DeframerTester& state //!< The test state - ); - - }; - -} - -#endif diff --git a/Svc/Deframer/test/ut-fprime-protocol/Printing.hpp b/Svc/Deframer/test/ut-fprime-protocol/Printing.hpp deleted file mode 100644 index 7dd24e5039..0000000000 --- a/Svc/Deframer/test/ut-fprime-protocol/Printing.hpp +++ /dev/null @@ -1,18 +0,0 @@ -//! ====================================================================== -//! \title Printing.hpp -//! \brief Print macros for deframer unit tests -//! \author bocchino -//! ====================================================================== - -// Uncomment the following line to turn on printing -//#define PRINTING - -#ifdef PRINTING -#include - -#define PRINT(S) printf("[Deframer Tests] " S "\n"); -#define PRINT_ARGS(S, ...) printf("[Deframer Tests] " S "\n", __VA_ARGS__); -#else -#define PRINT(S) -#define PRINT_ARGS(S, ...) -#endif diff --git a/Svc/Deframer/test/ut-fprime-protocol/SendBuffer.cpp b/Svc/Deframer/test/ut-fprime-protocol/SendBuffer.cpp deleted file mode 100644 index 4fc2b6ee50..0000000000 --- a/Svc/Deframer/test/ut-fprime-protocol/SendBuffer.cpp +++ /dev/null @@ -1,158 +0,0 @@ -//! ====================================================================== -//! \title SendBuffer.cpp -//! \brief Implementation file for SendBuffer rule -//! \author mstarch, bocchino -//! ====================================================================== - -#include "Printing.hpp" -#include "STest/Pick/Pick.hpp" -#include "SendBuffer.hpp" -#include "Utils/Hash/Hash.hpp" - -namespace Svc { - - SendBuffer :: SendBuffer() : - STest::Rule("SendBuffer"), - expectedComCount(0), - expectedBuffCount(0) - { - - } - - bool SendBuffer :: precondition(const Svc::DeframerTester &state) { - return state.m_framesToSend.size() > 0; - } - - void SendBuffer :: action(Svc::DeframerTester &state) { - - PRINT("----------------------------------------------------------------------"); - PRINT("SendBuffer action"); - PRINT("----------------------------------------------------------------------"); - - // Clear the test history - state.clearHistory(); - - // Set up the incoming buffer - state.setUpIncomingBuffer(); - - // Fill the incoming buffer with frame data - fillIncomingBuffer(state); - - // Send the buffer - state.sendIncomingBuffer(); - - // Check the counts - state.assert_from_comOut_size(__FILE__, __LINE__, expectedComCount); - PRINT_ARGS("expectedComCount=%d", expectedComCount) - state.assert_from_bufferOut_size(__FILE__, __LINE__, expectedBuffCount); - PRINT_ARGS("expectedBuffCount=%d", expectedBuffCount) - - } - - void SendBuffer :: fillIncomingBuffer(Svc::DeframerTester &state) { - - // Get the size of the incoming buffer - const U32 incomingBufferSize = state.m_incomingBuffer.getSize(); - - // Set up a serial buffer for data transfer - Fw::SerialBuffer serialBuffer( - state.m_incomingBufferBytes, - incomingBufferSize - ); - - // Reset the expected com count - expectedComCount = 0; - // Reset the expected buff count - expectedBuffCount = 0; - - // The number of bytes copied into the buffer - U32 copiedSize = 0; - // The size of available data in the buffer - U32 buffAvailable = incomingBufferSize; - - // Fill the incoming buffer as much as possible with available frames - for (U32 i = 0; i < incomingBufferSize; ++i) { - - // Check if there is any room left in the buffer - if (buffAvailable == 0) { - break; - } - - // Check if there are any frames to send - if (state.m_framesToSend.size() == 0) { - break; - } - - // Get the frame from the head of the sending queue - DeframerTester::UplinkFrame& frame = state.m_framesToSend.front(); - - // Compute the amount to copy - const U32 frameAvailable = frame.getRemainingCopySize(); - const U32 copyAmt = std::min(frameAvailable, buffAvailable); - - // Copy the frame data into the serial buffer - frame.copyDataOut(serialBuffer, copyAmt); - - // Update buffAvailable - ASSERT_GE(buffAvailable, copyAmt); - buffAvailable -= copyAmt; - - // Update copiedSize - copiedSize += copyAmt; - ASSERT_LE(copiedSize, incomingBufferSize); - - // If we have copied a complete frame F, then (1) remove F from - // the send queue; and (2) if F is valid, then record F as - // received - if (frame.getRemainingCopySize() == 0) { - // If F is valid, then record it as received - recordReceivedFrame(state, frame); - // Remove F from the send queue - state.m_framesToSend.pop_front(); - PRINT_ARGS( - "frameToSend.size()=%lu", - state.m_framesToSend.size() - ) - } - - } - - // Update the buffer - ASSERT_LE(copiedSize, incomingBufferSize); - state.m_incomingBuffer.setSize(copiedSize); - - } - - void SendBuffer :: recordReceivedFrame( - Svc::DeframerTester& state, - Svc::DeframerTester::UplinkFrame& frame - ) { - if (frame.isValid()) { - // Push frame F on the received queue - state.m_framesToReceive.push_back(frame); - // Update the count of expected frames - switch (frame.packetType) { - case Fw::ComPacket::FW_PACKET_COMMAND: - PRINT("popped valid command frame") - // If F contains a command packet, then increment - // the expected com count - ++expectedComCount; - break; - case Fw::ComPacket::FW_PACKET_FILE: - PRINT("popped valid file frame") - // If F contains a file packet, then increment - // the expected buffer count - ++expectedBuffCount; - break; - default: - // This should not happen for a valid frame - FW_ASSERT(0, frame.packetType); - break; - } - } - else { - PRINT("popped invalid frame") - } - } - -}; diff --git a/Svc/Deframer/test/ut-fprime-protocol/SendBuffer.hpp b/Svc/Deframer/test/ut-fprime-protocol/SendBuffer.hpp deleted file mode 100644 index fc91d89364..0000000000 --- a/Svc/Deframer/test/ut-fprime-protocol/SendBuffer.hpp +++ /dev/null @@ -1,80 +0,0 @@ -//! ====================================================================== -//! \title SendBuffer.hpp -//! \brief Header file for SendBuffer rule -//! \author lestarch, bocchino -//! ====================================================================== - -#ifndef SVC_SEND_BUFFER_HPP -#define SVC_SEND_BUFFER_HPP - -#include -#include "Fw/Types/StringType.hpp" -#include "STest/STest/Pick/Pick.hpp" -#include "STest/STest/Rule/Rule.hpp" -#include "DeframerTester.hpp" - -namespace Svc { - - //! Pack generated frames into a buffer - //! Send the buffer - class SendBuffer : public STest::Rule { - - public: - - // ---------------------------------------------------------------------- - // Construction - // ---------------------------------------------------------------------- - - //! Constructor - SendBuffer(); - - public: - - // ---------------------------------------------------------------------- - // Public functions - // ---------------------------------------------------------------------- - - //! Precondition - bool precondition( - const DeframerTester& state //!< The test state - ); - - //! Action - void action( - Svc::DeframerTester &state //!< The test state - ); - - private: - - // ---------------------------------------------------------------------- - // Private helper functions - // ---------------------------------------------------------------------- - - //! Fill the incoming buffer with frame data - void fillIncomingBuffer( - Svc::DeframerTester &state //!< The test state - ); - - //! Record a received frame - void recordReceivedFrame( - Svc::DeframerTester& state, //!< The test state - Svc::DeframerTester::UplinkFrame& frame //!< The frame - ); - - private: - - // ---------------------------------------------------------------------- - // Private member variables - // ---------------------------------------------------------------------- - - //! The expected number of com buffers emitted - U32 expectedComCount; - - //! The expected number of file packet buffers emitted - U32 expectedBuffCount; - - }; - -}; - -#endif diff --git a/Svc/Deframer/test/ut-fprime-protocol/UplinkFrame.cpp b/Svc/Deframer/test/ut-fprime-protocol/UplinkFrame.cpp deleted file mode 100644 index 8110ea42a5..0000000000 --- a/Svc/Deframer/test/ut-fprime-protocol/UplinkFrame.cpp +++ /dev/null @@ -1,259 +0,0 @@ -// ====================================================================== -// \title UplinkFrame.cpp -// \author mstarch, bocchino -// \brief Implementation file for DeframerTester::UplinkFrame -// -// \copyright -// Copyright 2009-2022, by the California Institute of Technology. -// ALL RIGHTS RESERVED. United States Government Sponsorship -// acknowledged. -// ====================================================================== - -#include "DeframerTester.hpp" - -namespace Svc { - - // ---------------------------------------------------------------------- - // Constructor - // ---------------------------------------------------------------------- - - DeframerTester::UplinkFrame::UplinkFrame( - Fw::ComPacket::ComPacketType packetType, - U32 packetSize - ) : - packetType(packetType), - packetSize(packetSize), - copyOffset(0), - valid(false) - { - // Fill in random data - for (U32 i = 0; i < sizeof data; ++i) { - data[i] = STest::Pick::lowerUpper(0, 0xFF); - } - // Update the frame header - this->updateHeader(); - // Update the hash value - this->updateHash(); - // Check validity of packet type and size - if ( - (packetType == Fw::ComPacket::FW_PACKET_COMMAND) && - (packetSize <= getMaxValidCommandPacketSize()) - ) { - valid = true; - } - if ( - (packetType == Fw::ComPacket::FW_PACKET_FILE) && - (packetSize <= getMaxValidFilePacketSize()) - ) { - valid = true; - } - } - - // ---------------------------------------------------------------------- - // Public instance methods - // ---------------------------------------------------------------------- - - U32 DeframerTester::UplinkFrame::getRemainingCopySize() const { - const U32 frameSize = getSize(); - FW_ASSERT(frameSize >= copyOffset, frameSize, copyOffset); - return frameSize - copyOffset; - } - - U32 DeframerTester::UplinkFrame::getSize() const { - return NON_PACKET_SIZE + packetSize; - } - - bool DeframerTester::UplinkFrame::isValid() const { - return valid; - } - - const DeframerTester::UplinkFrame::FrameData& - DeframerTester::UplinkFrame::getData() const - { - return data; - } - - void DeframerTester::UplinkFrame::copyDataOut( - Fw::SerialBuffer& serialBuffer, - U32 size - ) { - ASSERT_LE(copyOffset + size, getSize()); - const Fw::SerializeStatus status = serialBuffer.pushBytes( - &data[copyOffset], - size - ); - ASSERT_EQ(status, Fw::FW_SERIALIZE_OK); - copyOffset += size; - } - - // ---------------------------------------------------------------------- - // Public static methods - // ---------------------------------------------------------------------- - - DeframerTester::UplinkFrame DeframerTester::UplinkFrame::random() { - // Randomly set the packet type - Fw::ComPacket::ComPacketType packetType = - Fw::ComPacket::FW_PACKET_UNKNOWN; - const U32 packetSelector = STest::Pick::lowerUpper(0,1); - U32 maxValidPacketSize = 0; - switch (packetSelector) { - case 0: - packetType = Fw::ComPacket::FW_PACKET_COMMAND; - maxValidPacketSize = getMaxValidCommandPacketSize(); - break; - case 1: - packetType = Fw::ComPacket::FW_PACKET_FILE; - maxValidPacketSize = getMaxValidFilePacketSize(); - break; - default: - FW_ASSERT(0); - break; - } - // Randomly set the packet size - U32 packetSize = 0; - // Invalidate 1 in 100 packet sizes - const U32 invalidSizeIndex = STest::Pick::startLength(0, 100); - if (invalidSizeIndex == 0) { - // This packet size fits in the test buffer, - // but is invalid for the deframer - packetSize = getInvalidPacketSize(); - } - else { - // Choose a valid packet size - // This packet size fits in the test buffer and is - // valid for the deframer - packetSize = STest::Pick::lowerUpper( - getMinPacketSize(), - maxValidPacketSize - ); - } - // Construct the frame - UplinkFrame frame = UplinkFrame(packetType, packetSize); - // Randomly invalidate the frame, or leave it alone - frame.randomlyInvalidate(); - // Return the frame - return frame; - } - - U32 DeframerTester::UplinkFrame::getInvalidPacketSize() { - FW_ASSERT( - MAX_FRAME_SIZE >= NON_PACKET_SIZE, - MAX_FRAME_SIZE, - NON_PACKET_SIZE - ); - const U32 result = MAX_FRAME_SIZE - NON_PACKET_SIZE; - // Make sure the size is invalid - FW_ASSERT( - result > getMaxValidCommandPacketSize(), - result, - getMaxValidCommandPacketSize() - ); - FW_ASSERT( - result > getMaxValidFilePacketSize(), - result, - getMaxValidFilePacketSize() - ); - return result; - } - - U32 DeframerTester::UplinkFrame::getMaxValidCommandPacketSize() { - return std::min( - // Packet must fit into a com buffer - static_cast(FW_COM_BUFFER_MAX_SIZE), - // Frame must fit into the ring buffer - getMaxValidFilePacketSize() - ); - } - - U32 DeframerTester::UplinkFrame::getMaxValidFilePacketSize() { - FW_ASSERT( - MAX_VALID_FRAME_SIZE >= NON_PACKET_SIZE, - MAX_VALID_FRAME_SIZE, - NON_PACKET_SIZE - ); - return MAX_VALID_FRAME_SIZE - NON_PACKET_SIZE; - } - - U32 DeframerTester::UplinkFrame::getMinPacketSize() { - // Packet must hold the packet type - return sizeof(FwPacketDescriptorType); - } - - // ---------------------------------------------------------------------- - // Private instance methods - // ---------------------------------------------------------------------- - - void DeframerTester::UplinkFrame::randomlyInvalidate() { - if (valid) { - // Invalidation cases occur out of 100 samples - const U32 invalidateIndex = STest::Pick::startLength(0, 100); - switch (invalidateIndex) { - case 0: { - // Invalidate the start word - const FpFrameHeader::TokenType badStartWord = - FpFrameHeader::START_WORD + 1; - writeStartWord(badStartWord); - valid = false; - break; - } - case 1: - // Invalidate the packet type - writePacketType(Fw::ComPacket::FW_PACKET_UNKNOWN); - valid = false; - break; - case 2: - // Invalidate the hash value - ++data[getSize() - 1]; - valid = false; - break; - default: - // Stay valid - break; - } - } - } - - void DeframerTester::UplinkFrame::updateHash() { - Utils::Hash hash; - Utils::HashBuffer hashBuffer; - const U32 dataSize = FpFrameHeader::SIZE + packetSize; - hash.update(data, dataSize); - hash.final(hashBuffer); - const U8 *const hashAddr = hashBuffer.getBuffAddr(); - memcpy(&data[dataSize], hashAddr, HASH_DIGEST_LENGTH); - } - - void DeframerTester::UplinkFrame::updateHeader() { - // Write the correct start word - writeStartWord(FpFrameHeader::START_WORD); - // Write the correct packet size - writePacketSize(packetSize); - // Write the correct packet type - writePacketType(packetType); - } - - void DeframerTester::UplinkFrame::writePacketSize( - FpFrameHeader::TokenType ps - ) { - Fw::SerialBuffer sb(&data[PACKET_SIZE_OFFSET], sizeof ps); - const Fw::SerializeStatus status = sb.serialize(packetSize); - ASSERT_EQ(status, Fw::FW_SERIALIZE_OK); - } - - void DeframerTester::UplinkFrame::writePacketType( - FwPacketDescriptorType pt - ) { - Fw::SerialBuffer sb(&data[PACKET_TYPE_OFFSET], sizeof pt); - const Fw::SerializeStatus status = sb.serialize(pt); - ASSERT_EQ(status, Fw::FW_SERIALIZE_OK); - } - - void DeframerTester::UplinkFrame::writeStartWord( - FpFrameHeader::TokenType sw - ) { - Fw::SerialBuffer sb(data, sizeof sw); - const Fw::SerializeStatus status = sb.serialize(sw); - ASSERT_EQ(status, Fw::FW_SERIALIZE_OK); - } - -} diff --git a/Svc/Deframer/test/ut/DeframerTestMain.cpp b/Svc/Deframer/test/ut/DeframerTestMain.cpp deleted file mode 100644 index 26ebf1a619..0000000000 --- a/Svc/Deframer/test/ut/DeframerTestMain.cpp +++ /dev/null @@ -1,107 +0,0 @@ -// ---------------------------------------------------------------------- -// TestMain.cpp -// ---------------------------------------------------------------------- - -#include "DeframerTester.hpp" -#include -#include - -TEST(Deframer, TestMoreNeeded) { - COMMENT("Send a frame buffer to the mock protocol, expecting more needed"); - REQUIREMENT("SVC-DEFRAMER-001"); - REQUIREMENT("SVC-DEFRAMER-002"); - REQUIREMENT("SVC-DEFRAMER-003"); - REQUIREMENT("SVC-DEFRAMER-007"); - Svc::DeframerTester tester; - tester.test_incoming_frame(Svc::DeframingProtocol::DEFRAMING_MORE_NEEDED); -} -TEST(Deframer, TestSuccess) { - COMMENT("Send a frame buffer to the mock protocol, expecting success"); - REQUIREMENT("SVC-DEFRAMER-001"); - REQUIREMENT("SVC-DEFRAMER-002"); - REQUIREMENT("SVC-DEFRAMER-003"); - REQUIREMENT("SVC-DEFRAMER-007"); - Svc::DeframerTester tester; - tester.test_incoming_frame(Svc::DeframingProtocol::DEFRAMING_STATUS_SUCCESS); -} -TEST(Deframer, TestBadChecksum) { - COMMENT("Send a frame buffer to the mock protocol, expecting bad checksum"); - REQUIREMENT("SVC-DEFRAMER-001"); - REQUIREMENT("SVC-DEFRAMER-002"); - REQUIREMENT("SVC-DEFRAMER-003"); - REQUIREMENT("SVC-DEFRAMER-007"); - Svc::DeframerTester tester; - tester.test_incoming_frame(Svc::DeframingProtocol::DEFRAMING_INVALID_CHECKSUM); -} -TEST(Deframer, TestBadSize) { - COMMENT("Send a frame buffer to the mock protocol, expecting bad size"); - REQUIREMENT("SVC-DEFRAMER-001"); - REQUIREMENT("SVC-DEFRAMER-002"); - REQUIREMENT("SVC-DEFRAMER-003"); - REQUIREMENT("SVC-DEFRAMER-007"); - Svc::DeframerTester tester; - tester.test_incoming_frame(Svc::DeframingProtocol::DEFRAMING_INVALID_SIZE); -} -TEST(Deframer, TestBadFormat) { - COMMENT("Send a frame buffer to the mock protocol, expecting bad format"); - REQUIREMENT("SVC-DEFRAMER-001"); - REQUIREMENT("SVC-DEFRAMER-002"); - REQUIREMENT("SVC-DEFRAMER-003"); - REQUIREMENT("SVC-DEFRAMER-007"); - Svc::DeframerTester tester; - tester.test_incoming_frame(Svc::DeframingProtocol::DEFRAMING_INVALID_FORMAT); -} -TEST(Deframer, TestComInterface) { - COMMENT("Route a com packet"); - REQUIREMENT("SVC-DEFRAMER-008"); - REQUIREMENT("SVC-DEFRAMER-009"); - REQUIREMENT("SVC-DEFRAMER-010"); - Svc::DeframerTester tester; - tester.test_com_interface(); -} -TEST(Deframer, TestFileInterface) { - COMMENT("Route a file packet"); - REQUIREMENT("SVC-DEFRAMER-008"); - REQUIREMENT("SVC-DEFRAMER-009"); - REQUIREMENT("SVC-DEFRAMER-010"); - Svc::DeframerTester tester; - tester.test_file_interface(); -} -TEST(Deframer, TestUnknownInterface) { - COMMENT("Attempt to route a packet of unknown type"); - REQUIREMENT("SVC-DEFRAMER-008"); - REQUIREMENT("SVC-DEFRAMER-009"); - Svc::DeframerTester tester; - tester.test_unknown_interface(); -} -TEST(Deframer, TestCommandResponse) { - COMMENT("Handle a command response (no-op)"); - Svc::DeframerTester tester; - tester.testCommandResponse(); -} -TEST(Deframer, TestCommandPacketTooLarge) { - COMMENT("Attempt to route a command packet that is too large"); - REQUIREMENT("SVC-DEFRAMER-008"); - REQUIREMENT("SVC-DEFRAMER-009"); - Svc::DeframerTester tester; - tester.testCommandPacketTooLarge(); -} -TEST(Deframer, TestPacketBufferTooSmall) { - COMMENT("Attempt to route a packet that is too small"); - REQUIREMENT("SVC-DEFRAMER-008"); - REQUIREMENT("SVC-DEFRAMER-009"); - Svc::DeframerTester tester; - tester.testPacketBufferTooSmall(); -} - -TEST(Deframer, TestBufferOutUnconnected) { - COMMENT("Test routing a file packet when bufferOut is unconnected"); - REQUIREMENT("SVC-DEFRAMER-011"); - Svc::DeframerTester tester(Svc::DeframerTester::ConnectStatus::UNCONNECTED); - tester.testBufferOutUnconnected(); -} - -int main(int argc, char **argv) { - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/Svc/Deframer/test/ut/DeframerTester.cpp b/Svc/Deframer/test/ut/DeframerTester.cpp deleted file mode 100644 index bfcf575381..0000000000 --- a/Svc/Deframer/test/ut/DeframerTester.cpp +++ /dev/null @@ -1,238 +0,0 @@ -// ====================================================================== -// \title Deframer.hpp -// \author janamian, bocchino -// \brief cpp file for Deframer test harness implementation class -// -// \copyright -// Copyright 2009-2021, by the California Institute of Technology. -// ALL RIGHTS RESERVED. United States Government Sponsorship -// acknowledged. -// -// ====================================================================== - -#include - -#include "DeframerTester.hpp" - -#define INSTANCE 0 -#define MAX_HISTORY_SIZE 1000 - -namespace Svc { - -// ---------------------------------------------------------------------- -// Construction and destruction -// ---------------------------------------------------------------------- -DeframerTester::MockDeframer::MockDeframer(DeframerTester& parent) : m_status(DeframingProtocol::DEFRAMING_STATUS_SUCCESS) {} - -DeframerTester::MockDeframer::DeframingStatus DeframerTester::MockDeframer::deframe(Types::CircularBuffer& ring_buffer, U32& needed) { - needed = ring_buffer.get_allocated_size(); - if (m_status == DeframingProtocol::DEFRAMING_MORE_NEEDED) { - needed = ring_buffer.get_allocated_size() + 1; // Obey the rules - } - return m_status; -} - -void DeframerTester::MockDeframer::test_interface(Fw::ComPacket::ComPacketType com_packet_type) { - const FwPacketDescriptorType descriptorType = com_packet_type; - U8 chars[sizeof descriptorType]; - m_interface->allocate(3042); - Fw::Buffer buffer(chars, sizeof(chars)); - buffer.getSerializeRepr().serialize(descriptorType); - m_interface->route(buffer); -} - - -DeframerTester ::DeframerTester(ConnectStatus::t bufferOutStatus) - : DeframerGTestBase("Tester", MAX_HISTORY_SIZE), - component("Deframer"), - m_mock(*this), - bufferOutStatus(bufferOutStatus) { - this->initComponents(); - this->connectPorts(); - component.setup(this->m_mock); -} - -DeframerTester ::~DeframerTester() {} - -// ---------------------------------------------------------------------- -// Tests -// ---------------------------------------------------------------------- -void DeframerTester ::test_incoming_frame(DeframerTester::MockDeframer::DeframingStatus status) { - U32 buffer_size = 512; - U8 data[buffer_size]; - ::memset(data, 0, buffer_size); - Fw::Buffer recvBuffer(data, buffer_size); - m_mock.m_status = status; - Drv::RecvStatus recvStatus = Drv::RecvStatus::RECV_OK; - invoke_to_framedIn(0, recvBuffer, recvStatus); - // Check remaining size - if (status == DeframingProtocol::DEFRAMING_MORE_NEEDED) { - ASSERT_EQ(component.m_inRing.get_allocated_size(), buffer_size); - } else if (status == DeframingProtocol::DEFRAMING_STATUS_SUCCESS) { - ASSERT_EQ(component.m_inRing.get_allocated_size(), 0); - } else { - ASSERT_EQ(component.m_inRing.get_allocated_size(), 0); - } - ASSERT_from_framedDeallocate(0, recvBuffer); -} - -void DeframerTester ::test_com_interface() { - m_mock.test_interface(Fw::ComPacket::FW_PACKET_COMMAND); - ASSERT_from_comOut_SIZE(1); - ASSERT_from_bufferAllocate(0, 3042); - ASSERT_from_bufferOut_SIZE(0); - ASSERT_from_bufferDeallocate_SIZE(1); -} - -void DeframerTester ::test_file_interface() { - m_mock.test_interface(Fw::ComPacket::FW_PACKET_FILE); - ASSERT_from_comOut_SIZE(0); - ASSERT_from_bufferAllocate(0, 3042); - ASSERT_from_bufferOut_SIZE(1); - ASSERT_from_bufferDeallocate_SIZE(0); -} - -void DeframerTester ::test_unknown_interface() { - m_mock.test_interface(Fw::ComPacket::FW_PACKET_UNKNOWN); - ASSERT_from_comOut_SIZE(0); - ASSERT_from_bufferAllocate(0, 3042); - ASSERT_from_bufferOut_SIZE(0); - ASSERT_from_bufferDeallocate_SIZE(1); -} - -void DeframerTester ::testCommandResponse() { - const U32 portNum = 0; - const U32 opcode = 0; - const U32 cmdSeq = 0; - const Fw::CmdResponse cmdResp(Fw::CmdResponse::OK); - this->invoke_to_cmdResponseIn(portNum, opcode, cmdSeq, cmdResp); - ASSERT_FROM_PORT_HISTORY_SIZE(0); -} - -void DeframerTester ::testCommandPacketTooLarge() { - // Allocate a large packet buffer - enum { - BUFFER_SIZE = 2 * FW_COM_BUFFER_MAX_SIZE - }; - U8 bytes[BUFFER_SIZE]; - ::memset(bytes, 0, sizeof bytes); - Fw::Buffer buffer(bytes, sizeof bytes); - // Serialize the packet type - Fw::SerializeBufferBase& serialRepr = buffer.getSerializeRepr(); - const FwPacketDescriptorType descriptorType = - Fw::ComPacket::FW_PACKET_COMMAND; - const Fw::SerializeStatus status = - serialRepr.serialize(descriptorType); - ASSERT_EQ(status, Fw::FW_SERIALIZE_OK); - // Call the route method - this->component.route(buffer); - // Assert buffer deallocated, no packet output - ASSERT_FROM_PORT_HISTORY_SIZE(1); - ASSERT_from_bufferDeallocate_SIZE(1); -} - -void DeframerTester ::testPacketBufferTooSmall() { - // Allocate a small packet buffer - U8 byte = 0; - Fw::Buffer buffer(&byte, sizeof byte); - // Call the route method - this->component.route(buffer); - // Assert buffer deallocated, no packet output - ASSERT_FROM_PORT_HISTORY_SIZE(1); - ASSERT_from_bufferDeallocate_SIZE(1); -} - -void DeframerTester ::testBufferOutUnconnected() { - ASSERT_EQ(this->bufferOutStatus, ConnectStatus::UNCONNECTED); - enum { - BUFFER_SIZE = 256 - }; - U8 bytes[BUFFER_SIZE]; - ::memset(bytes, 0, sizeof bytes); - Fw::Buffer buffer(bytes, sizeof bytes); - // Serialize the packet type - Fw::SerializeBufferBase& serialRepr = buffer.getSerializeRepr(); - const FwPacketDescriptorType descriptorType = - Fw::ComPacket::FW_PACKET_FILE; - const Fw::SerializeStatus status = - serialRepr.serialize(descriptorType); - ASSERT_EQ(status, Fw::FW_SERIALIZE_OK); - // Call the route method - this->component.route(buffer); - // Assert buffer deallocated, no packet output - ASSERT_FROM_PORT_HISTORY_SIZE(1); - ASSERT_from_bufferDeallocate_SIZE(1); -} - -// ---------------------------------------------------------------------- -// Handlers for typed from ports -// ---------------------------------------------------------------------- - -void DeframerTester ::from_comOut_handler(const NATIVE_INT_TYPE portNum, Fw::ComBuffer& data, U32 context) { - this->pushFromPortEntry_comOut(data, context); -} - -void DeframerTester ::from_bufferOut_handler(const NATIVE_INT_TYPE portNum, Fw::Buffer& fwBuffer) { - this->pushFromPortEntry_bufferOut(fwBuffer); -} - -Fw::Buffer DeframerTester ::from_bufferAllocate_handler(const NATIVE_INT_TYPE portNum, U32 size) { - this->pushFromPortEntry_bufferAllocate(size); - Fw::Buffer buffer(nullptr, size); - return buffer; -} - -void DeframerTester ::from_bufferDeallocate_handler(const NATIVE_INT_TYPE portNum, Fw::Buffer& fwBuffer) { - this->pushFromPortEntry_bufferDeallocate(fwBuffer); -} - -void DeframerTester ::from_framedDeallocate_handler(const NATIVE_INT_TYPE portNum, Fw::Buffer& fwBuffer) { - this->pushFromPortEntry_framedDeallocate(fwBuffer); -} - -Drv::PollStatus DeframerTester ::from_framedPoll_handler(const NATIVE_INT_TYPE portNum, Fw::Buffer& pollBuffer) { - this->pushFromPortEntry_framedPoll(pollBuffer); - return Drv::PollStatus::POLL_OK; -} - -// ---------------------------------------------------------------------- -// Helper methods -// ---------------------------------------------------------------------- - -void DeframerTester ::connectPorts() { - // bufferAllocate - this->component.set_bufferAllocate_OutputPort(0, this->get_from_bufferAllocate(0)); - - // bufferDeallocate - this->component.set_bufferDeallocate_OutputPort(0, this->get_from_bufferDeallocate(0)); - - // bufferOut - if (this->bufferOutStatus == ConnectStatus::CONNECTED) { - this->component.set_bufferOut_OutputPort(0, this->get_from_bufferOut(0)); - } - - // cmdResponseIn - this->connect_to_cmdResponseIn(0, this->component.get_cmdResponseIn_InputPort(0)); - - // comOut - this->component.set_comOut_OutputPort(0, this->get_from_comOut(0)); - - // framedDeallocate - this->component.set_framedDeallocate_OutputPort(0, this->get_from_framedDeallocate(0)); - - // framedIn - this->connect_to_framedIn(0, this->component.get_framedIn_InputPort(0)); - - // framedPoll - this->component.set_framedPoll_OutputPort(0, this->get_from_framedPoll(0)); - - // schedIn - this->connect_to_schedIn(0, this->component.get_schedIn_InputPort(0)); -} - -void DeframerTester ::initComponents() { - this->init(); - this->component.init(INSTANCE); -} - -} // end namespace Svc diff --git a/Svc/Deframer/test/ut/DeframerTester.hpp b/Svc/Deframer/test/ut/DeframerTester.hpp deleted file mode 100644 index 1031ea2672..0000000000 --- a/Svc/Deframer/test/ut/DeframerTester.hpp +++ /dev/null @@ -1,155 +0,0 @@ -// ====================================================================== -// \title Deframer/test/ut/Tester.hpp -// \author janamian, bocchino -// \brief hpp file for Deframer test harness implementation class -// -// \copyright -// Copyright 2009-2021, by the California Institute of Technology. -// ALL RIGHTS RESERVED. United States Government Sponsorship -// acknowledged. -// -// ====================================================================== - -#ifndef TESTER_HPP -#define TESTER_HPP - -#include "DeframerGTestBase.hpp" -#include "Svc/Deframer/Deframer.hpp" - -namespace Svc { - -class DeframerTester : public DeframerGTestBase { - public: - // ---------------------------------------------------------------------- - // Types - // ---------------------------------------------------------------------- - - struct ConnectStatus { - //! Whether a port is connected - typedef enum { - CONNECTED, - UNCONNECTED - } t; - }; - - // ---------------------------------------------------------------------- - // Construction and destruction - // ---------------------------------------------------------------------- - class MockDeframer : public DeframingProtocol { - public: - MockDeframer(DeframerTester& parent); - DeframingStatus deframe(Types::CircularBuffer& ring_buffer, U32& needed); - //! Test the implementation of DeframingProtocolInterface provided - //! by the Deframer component - void test_interface(Fw::ComPacket::ComPacketType com_type); - DeframingStatus m_status; - }; - - public: - //! Construct object DeframerTester - //! - DeframerTester(ConnectStatus::t bufferOutStatus = ConnectStatus::CONNECTED); - - //! Destroy object DeframerTester - //! - ~DeframerTester(); - - public: - // ---------------------------------------------------------------------- - // Tests - // ---------------------------------------------------------------------- - - //! Send a frame to framedIn - void test_incoming_frame( - DeframingProtocol::DeframingStatus status //!< The status that the mock deframer will return - ); - - //! Route a com packet - void test_com_interface(); - - //! Route a file packet - void test_file_interface(); - - //! Route a packet of unknown type - void test_unknown_interface(); - - //! Invoke the command response input port - void testCommandResponse(); - - //! Attempt to route a command packet that is too large - void testCommandPacketTooLarge(); - - //! Attempt to route a packet buffer that is too small - void testPacketBufferTooSmall(); - - //! Route a file packet with bufferOutUnconnected - void testBufferOutUnconnected(); - - private: - // ---------------------------------------------------------------------- - // Handlers for typed from ports - // ---------------------------------------------------------------------- - - //! Handler for from_comOut - //! - void from_comOut_handler(const NATIVE_INT_TYPE portNum, /*!< The port number*/ - Fw::ComBuffer& data, /*!< Buffer containing packet data*/ - U32 context /*!< Call context value; meaning chosen by user*/ - ); - - //! Handler for from_bufferOut - //! - void from_bufferOut_handler(const NATIVE_INT_TYPE portNum, /*!< The port number*/ - Fw::Buffer& fwBuffer); - - //! Handler for from_bufferAllocate - //! - Fw::Buffer from_bufferAllocate_handler(const NATIVE_INT_TYPE portNum, /*!< The port number*/ - U32 size); - - //! Handler for from_bufferDeallocate - //! - void from_bufferDeallocate_handler(const NATIVE_INT_TYPE portNum, /*!< The port number*/ - Fw::Buffer& fwBuffer); - - //! Handler for from_framedDeallocate - //! - void from_framedDeallocate_handler(const NATIVE_INT_TYPE portNum, /*!< The port number*/ - Fw::Buffer& fwBuffer); - - //! Handler for from_framedPoll - //! - Drv::PollStatus from_framedPoll_handler(const NATIVE_INT_TYPE portNum, /*!< The port number*/ - Fw::Buffer& pollBuffer); - - private: - // ---------------------------------------------------------------------- - // Helper methods - // ---------------------------------------------------------------------- - - //! Connect ports - //! - void connectPorts(); - - //! Initialize components - //! - void initComponents(); - - private: - // ---------------------------------------------------------------------- - // Variables - // ---------------------------------------------------------------------- - - //! The component under test - //! - Deframer component; - - Fw::Buffer m_buffer; - MockDeframer m_mock; - // Whether the bufferOut port is connected - ConnectStatus::t bufferOutStatus; -}; - -} // end namespace Svc - -#endif diff --git a/Svc/DeframerFp/CMakeLists.txt b/Svc/DeframerFp/CMakeLists.txt deleted file mode 100644 index 9e3295089e..0000000000 --- a/Svc/DeframerFp/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -#### -# F prime CMakeLists.txt: -# -# SOURCE_FILES: combined list of source and autocoding files -# MOD_DEPS: (optional) module dependencies -# -# Note: using PROJECT_NAME as EXECUTABLE_NAME -#### -set(SOURCE_FILES - "${CMAKE_CURRENT_LIST_DIR}/DeframerFp.fpp" - "${CMAKE_CURRENT_LIST_DIR}/DeframerFp.cpp" -) - -set(MOD_DEPS - Svc/FramingProtocol - Utils/Types -) - -register_fprime_module() diff --git a/Svc/DeframerFp/DeframerFp.cpp b/Svc/DeframerFp/DeframerFp.cpp deleted file mode 100644 index 375724424f..0000000000 --- a/Svc/DeframerFp/DeframerFp.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// ====================================================================== -// \title DeframerFp.cpp -// \author chammard -// \brief cpp file for DeframerFp component implementation class -// ====================================================================== - -#include "Svc/DeframerFp/DeframerFp.hpp" -#include "FpConfig.hpp" - -namespace Svc { - -// ---------------------------------------------------------------------- -// Component construction and destruction -// ---------------------------------------------------------------------- - -DeframerFp ::DeframerFp(const char* const compName) : DeframerFpComponentBase(compName) {} - -DeframerFp ::~DeframerFp() {} - -// ---------------------------------------------------------------------- -// Handler implementations for user-defined typed input ports -// ---------------------------------------------------------------------- - -void DeframerFp ::framedIn_handler(FwIndexType portNum, Fw::Buffer& data, Fw::Buffer& context) { - - // TODO: add asserts? - data.setData(data.getData() + FrameConfig::HEADER_SIZE); - data.setSize(data.getSize() - FrameConfig::HEADER_SIZE - FrameConfig::CHECKSUM_SIZE); - - this->deframedOut_out(0, data, context); -} - -} // namespace Svc diff --git a/Svc/DeframerFp/DeframerFp.fpp b/Svc/DeframerFp/DeframerFp.fpp deleted file mode 100644 index 143ca2f384..0000000000 --- a/Svc/DeframerFp/DeframerFp.fpp +++ /dev/null @@ -1,26 +0,0 @@ -module Svc { - - @ A component for deframing input received from the ground - @ via a byte stream driver, which may be active or passive - passive component DeframerFp { - - # ---------------------------------------------------------------------- - # Deframer interface - # ---------------------------------------------------------------------- - - include "../Interfaces/DeframerInterface.fppi" - - # ---------------------------------------------------------------------- - # Memory management for deframing - # ---------------------------------------------------------------------- - - @ Port for allocating Fw::Buffer objects from a buffer manager. - @ When Deframer invokes this port, it receives a packet buffer PB and - @ takes ownership of it. Ownership is then delegated to the Router - output port bufferAllocate: Fw.BufferGet - - @ Port for deallocating buffers received on dataIn. - output port bufferDeallocate: Fw.BufferSend - } - -} From 77061222dec484ead5896a0ff13bc0ff889f2dc9 Mon Sep 17 00:00:00 2001 From: chammard Date: Wed, 25 Sep 2024 10:16:08 -0700 Subject: [PATCH 14/19] Clean up comments --- .../SpaceDataLinkDeframer/SpaceDataLinkDeframer.cpp | 4 ---- .../SpacePacketDeframer/CMakeLists.txt | 7 ------- .../SpacePacketDeframer/SpacePacketDeframer.cpp | 1 - Svc/Deframer/Deframer.fpp | 13 +------------ Svc/Interfaces/DeframerInterface.fppi | 4 ++-- 5 files changed, 3 insertions(+), 26 deletions(-) diff --git a/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.cpp b/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.cpp index f9e85e8181..da347c7a2f 100644 --- a/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.cpp +++ b/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.cpp @@ -66,11 +66,7 @@ void SpaceDataLinkDeframer ::framedIn_handler(FwIndexType portNum, Fw::Buffer& d data.setData(data.getData() + SPACE_PACKET_HEADER_SIZE); data.setSize(frame_length); // 5 bytes for Header, 2 bytes for Frame Error Control Field - // Set context buffer to be frame_length so the next layer knows how much data - // context.setData(); - this->deframedOut_out(0, data, context); - } } // namespace Svc diff --git a/Svc/CCSDSDeframers/SpacePacketDeframer/CMakeLists.txt b/Svc/CCSDSDeframers/SpacePacketDeframer/CMakeLists.txt index d22939ecc6..bb5f5c4771 100644 --- a/Svc/CCSDSDeframers/SpacePacketDeframer/CMakeLists.txt +++ b/Svc/CCSDSDeframers/SpacePacketDeframer/CMakeLists.txt @@ -11,11 +11,4 @@ set(SOURCE_FILES "${CMAKE_CURRENT_LIST_DIR}/SpacePacketDeframer.cpp" ) -# Uncomment and add any modules that this component depends on, else -# they might not be available when cmake tries to build this component. - -# set(MOD_DEPS -# Add your dependencies here -# ) - register_fprime_module() diff --git a/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.cpp b/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.cpp index 97b5b2d047..9dcc21c87a 100644 --- a/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.cpp +++ b/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.cpp @@ -75,7 +75,6 @@ void SpacePacketDeframer ::framedIn_handler(FwIndexType portNum, Fw::Buffer& dat data.setSize(pkt_length); // TODO: look into whether a spacePacket can span multiple frames this->deframedOut_out(0, data, context); - } } // namespace Svc diff --git a/Svc/Deframer/Deframer.fpp b/Svc/Deframer/Deframer.fpp index d82b7bd04b..7a9653f473 100644 --- a/Svc/Deframer/Deframer.fpp +++ b/Svc/Deframer/Deframer.fpp @@ -1,7 +1,7 @@ module Svc { @ A component for deframing input received from the ground - @ via a byte stream driver, which may be active or passive + @ via a FrameAccumulator passive component Deframer { # ---------------------------------------------------------------------- @@ -10,17 +10,6 @@ module Svc { include "../Interfaces/DeframerInterface.fppi" - # ---------------------------------------------------------------------- - # Memory management for deframing - # ---------------------------------------------------------------------- - - @ Port for allocating Fw::Buffer objects from a buffer manager. - @ When Deframer invokes this port, it receives a packet buffer PB and - @ takes ownership of it. Ownership is then delegated to the Router - output port bufferAllocate: Fw.BufferGet - - @ Port for deallocating buffers received on dataIn. - output port bufferDeallocate: Fw.BufferSend } } diff --git a/Svc/Interfaces/DeframerInterface.fppi b/Svc/Interfaces/DeframerInterface.fppi index 1dce7923c5..9ab8561750 100644 --- a/Svc/Interfaces/DeframerInterface.fppi +++ b/Svc/Interfaces/DeframerInterface.fppi @@ -1,5 +1,5 @@ -@ Port to receive framed data +@ Port to receive framed data, with optional context guarded input port framedIn: Fw.DataWithContext -@ Port to output deframed data +@ Port to output deframed data, with optional context output port deframedOut: Fw.DataWithContext \ No newline at end of file From c7db8e4b6a8278cde06bdf2290888a6fc86942e6 Mon Sep 17 00:00:00 2001 From: chammard Date: Wed, 25 Sep 2024 10:54:50 -0700 Subject: [PATCH 15/19] Update Ref topology with Accumulator/Deframer/Router --- Ref/Top/RefPackets.xml | 10 +++++----- Ref/Top/RefTopology.cpp | 32 ++++++++++++++++++++------------ Ref/Top/instances.fpp | 15 ++++++++------- Ref/Top/topology.fpp | 34 ++++++++++++++++++---------------- 4 files changed, 51 insertions(+), 40 deletions(-) diff --git a/Ref/Top/RefPackets.xml b/Ref/Top/RefPackets.xml index c29f3ac906..d8d1c4d7d8 100644 --- a/Ref/Top/RefPackets.xml +++ b/Ref/Top/RefPackets.xml @@ -13,9 +13,9 @@ - - - + + + @@ -32,8 +32,8 @@ - - + + diff --git a/Ref/Top/RefTopology.cpp b/Ref/Top/RefTopology.cpp index fe0472a989..da637d744f 100644 --- a/Ref/Top/RefTopology.cpp +++ b/Ref/Top/RefTopology.cpp @@ -16,6 +16,7 @@ #include #include #include +#include // Used for 1Hz synthetic cycling #include @@ -33,7 +34,8 @@ Fw::MallocAllocator mallocator; // The reference topology uses the F´ packet protocol when communicating with the ground and therefore uses the F´ // framing and deframing implementations. Svc::FprimeFraming framing; -Svc::FprimeDeframing deframing; +Svc::FrameDetectors::FprimeFrameDetector frameDetector; + // The reference topology divides the incoming clock signal (1Hz) into sub-signals: 1Hz, 1/2Hz, and 1/4Hz and // zero offset for all the dividers @@ -54,12 +56,16 @@ enum TopologyConstants { FILE_DOWNLINK_FILE_QUEUE_DEPTH = 10, HEALTH_WATCHDOG_CODE = 0x123, COMM_PRIORITY = 100, - UPLINK_BUFFER_MANAGER_STORE_SIZE = 3000, - UPLINK_BUFFER_MANAGER_QUEUE_SIZE = 30, - UPLINK_BUFFER_MANAGER_ID = 200, + // Buffer manager for Uplink/Downlink + COMMS_BUFFER_MANAGER_STORE_SIZE = 2048, + COMMS_BUFFER_MANAGER_QUEUE_SIZE = 20, + COMMS_BUFFER_MANAGER_FILE_STORE_SIZE = 3000, + COMMS_BUFFER_MANAGER_FILE_QUEUE_SIZE = 30, + COMMS_BUFFER_MANAGER_ID = 200, + // Buffer manager for Data Products DP_BUFFER_MANAGER_STORE_SIZE = 10000, DP_BUFFER_MANAGER_QUEUE_SIZE = 10, - DP_BUFFER_MANAGER_ID = 300 + DP_BUFFER_MANAGER_ID = 300, }; // Ping entries are autocoded, however; this code is not properly exported. Thus, it is copied here. @@ -111,11 +117,13 @@ void configureTopology() { health.setPingEntries(pingEntries, FW_NUM_ARRAY_ELEMENTS(pingEntries), HEALTH_WATCHDOG_CODE); // Buffer managers need a configured set of buckets and an allocator used to allocate memory for those buckets. - Svc::BufferManager::BufferBins upBuffMgrBins; - memset(&upBuffMgrBins, 0, sizeof(upBuffMgrBins)); - upBuffMgrBins.bins[0].bufferSize = UPLINK_BUFFER_MANAGER_STORE_SIZE; - upBuffMgrBins.bins[0].numBuffers = UPLINK_BUFFER_MANAGER_QUEUE_SIZE; - fileUplinkBufferManager.setup(UPLINK_BUFFER_MANAGER_ID, 0, mallocator, upBuffMgrBins); + Svc::BufferManager::BufferBins commsBuffMgrBins; + memset(&commsBuffMgrBins, 0, sizeof(commsBuffMgrBins)); + commsBuffMgrBins.bins[0].bufferSize = COMMS_BUFFER_MANAGER_STORE_SIZE; + commsBuffMgrBins.bins[0].numBuffers = COMMS_BUFFER_MANAGER_QUEUE_SIZE; + commsBuffMgrBins.bins[1].bufferSize = COMMS_BUFFER_MANAGER_FILE_STORE_SIZE; + commsBuffMgrBins.bins[1].numBuffers = COMMS_BUFFER_MANAGER_FILE_QUEUE_SIZE; + commsBufferManager.setup(COMMS_BUFFER_MANAGER_ID, 0, mallocator, commsBuffMgrBins); Svc::BufferManager::BufferBins dpBuffMgrBins; memset(&dpBuffMgrBins, 0, sizeof(dpBuffMgrBins)); @@ -125,7 +133,7 @@ void configureTopology() { // Framer and Deframer components need to be passed a protocol handler framer.setup(framing); - deframer.setup(deframing); + frameAccumulator.configure(frameDetector, 1, mallocator, 2048); Fw::FileNameString dpDir("./DpCat"); @@ -202,6 +210,6 @@ void teardownTopology(const TopologyState& state) { // Resource deallocation cmdSeq.deallocateBuffer(mallocator); - fileUplinkBufferManager.cleanup(); + commsBufferManager.cleanup(); } }; // namespace Ref diff --git a/Ref/Top/instances.fpp b/Ref/Top/instances.fpp index a8c4afbbab..3053ec7c7b 100644 --- a/Ref/Top/instances.fpp +++ b/Ref/Top/instances.fpp @@ -143,7 +143,7 @@ module Ref { instance fatalHandler: Svc.FatalHandler base id 0x4300 - instance fileUplinkBufferManager: Svc.BufferManager base id 0x4400 + instance commsBufferManager: Svc.BufferManager base id 0x4400 instance posixTime: Svc.PosixTime base id 0x4500 @@ -151,16 +151,17 @@ module Ref { instance recvBuffComp: Ref.RecvBuff base id 0x4700 - instance staticMemory: Svc.StaticMemory base id 0x4800 - instance textLogger: Svc.PassiveTextLogger base id 0x4900 - instance deframer: Svc.Deframer base id 0x4A00 + instance systemResources: Svc.SystemResources base id 0x4A00 + + instance dpBufferManager: Svc.BufferManager base id 0x4B00 - instance systemResources: Svc.SystemResources base id 0x4B00 + instance frameAccumulator: Svc.FrameAccumulator base id 0x4C00 - instance dpBufferManager: Svc.BufferManager base id 0x4C00 + instance deframer: Svc.Deframer base id 0x4D00 - instance router: Svc.Router base id 0x4D00 + instance uplinkRouter: Svc.Router base id 0x4E00 } + diff --git a/Ref/Top/topology.fpp b/Ref/Top/topology.fpp index 15a43cb653..2d21961bd6 100644 --- a/Ref/Top/topology.fpp +++ b/Ref/Top/topology.fpp @@ -13,6 +13,7 @@ module Ref { enum Ports_StaticMemory { downlink uplink + accumulator } topology Ref { @@ -39,7 +40,8 @@ module Ref { instance fileDownlink instance fileManager instance fileUplink - instance fileUplinkBufferManager + instance commsBufferManager + instance frameAccumulator instance framer instance posixTime instance pingRcvr @@ -49,11 +51,10 @@ module Ref { instance rateGroup3Comp instance rateGroupDriverComp instance recvBuffComp + instance uplinkRouter instance sendBuffComp - instance staticMemory instance textLogger instance typeDemo - instance router instance systemResources instance dpCat instance dpMgr @@ -88,11 +89,11 @@ module Ref { eventLogger.PktSend -> framer.comIn fileDownlink.bufferSendOut -> framer.bufferIn - framer.framedAllocate -> staticMemory.bufferAllocate[Ports_StaticMemory.downlink] + framer.framedAllocate -> commsBufferManager.bufferGetCallee framer.framedOut -> comm.$send framer.bufferDeallocate -> fileDownlink.bufferReturn - comm.deallocate -> staticMemory.bufferDeallocate[Ports_StaticMemory.downlink] + comm.deallocate -> commsBufferManager.bufferSendIn dpCat.fileOut -> fileDownlink.SendFile fileDownlink.FileComplete -> dpCat.fileDone @@ -128,7 +129,7 @@ module Ref { rateGroup3Comp.RateGroupMemberOut[0] -> $health.Run rateGroup3Comp.RateGroupMemberOut[1] -> SG5.schedIn rateGroup3Comp.RateGroupMemberOut[2] -> blockDrv.Sched - rateGroup3Comp.RateGroupMemberOut[3] -> fileUplinkBufferManager.schedIn + rateGroup3Comp.RateGroupMemberOut[3] -> commsBufferManager.schedIn rateGroup3Comp.RateGroupMemberOut[4] -> dpBufferManager.schedIn rateGroup3Comp.RateGroupMemberOut[5] -> dpWriter.schedIn rateGroup3Comp.RateGroupMemberOut[6] -> dpMgr.schedIn @@ -146,20 +147,21 @@ module Ref { connections Uplink { - comm.allocate -> staticMemory.bufferAllocate[Ports_StaticMemory.uplink] - comm.$recv -> deframer.framedIn - deframer.framedDeallocate -> staticMemory.bufferDeallocate[Ports_StaticMemory.uplink] + comm.allocate -> commsBufferManager.bufferGetCallee + comm.$recv -> frameAccumulator.dataIn - deframer.bufferOut -> router.bufferIn + frameAccumulator.frameOut -> deframer.framedIn + frameAccumulator.frameAllocate -> commsBufferManager.bufferGetCallee + frameAccumulator.dataDeallocate -> commsBufferManager.bufferSendIn + deframer.deframedOut -> uplinkRouter.dataIn - router.commandOut -> cmdDisp.seqCmdBuff - router.fileOut -> fileUplink.bufferSendIn - router.bufferDeallocate -> fileUplinkBufferManager.bufferSendIn + uplinkRouter.commandOut -> cmdDisp.seqCmdBuff + uplinkRouter.fileOut -> fileUplink.bufferSendIn + uplinkRouter.bufferDeallocate -> commsBufferManager.bufferSendIn - cmdDisp.seqCmdStatus -> router.cmdResponseIn + cmdDisp.seqCmdStatus -> uplinkRouter.cmdResponseIn - deframer.bufferAllocate -> fileUplinkBufferManager.bufferGetCallee - fileUplink.bufferSendOut -> fileUplinkBufferManager.bufferSendIn + fileUplink.bufferSendOut -> commsBufferManager.bufferSendIn } From 251caa93bb4899424207590ddd1ceb6c677879be Mon Sep 17 00:00:00 2001 From: chammard Date: Wed, 25 Sep 2024 11:06:46 -0700 Subject: [PATCH 16/19] Update buffer manager --- RPI/Top/instances.fpp | 19 +++++++++++-------- RPI/Top/topology.fpp | 17 ++++++++--------- Ref/Top/RefTopology.cpp | 8 ++++---- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/RPI/Top/instances.fpp b/RPI/Top/instances.fpp index b162f33687..686f91cc8b 100644 --- a/RPI/Top/instances.fpp +++ b/RPI/Top/instances.fpp @@ -178,13 +178,13 @@ module RPI { instance fatalHandler: Svc.FatalHandler base id 100 - instance fileUplinkBufferManager: Svc.BufferManager base id 900 \ + instance commsBufferManager: Svc.BufferManager base id 900 \ { phase Fpp.ToCpp.Phases.configConstants """ enum { STORE_SIZE = 3000, - QUEUE_SIZE = 30, + STORE_COUNT = 30, MGR_ID = 200 }; """ @@ -193,10 +193,10 @@ module RPI { { Svc::BufferManager::BufferBins bufferBins; memset(&bufferBins, 0, sizeof(bufferBins)); - using namespace ConfigConstants::fileUplinkBufferManager; + using namespace ConfigConstants::commsBufferManager; bufferBins.bins[0].bufferSize = STORE_SIZE; - bufferBins.bins[0].numBuffers = QUEUE_SIZE; - fileUplinkBufferManager.setup( + bufferBins.bins[0].numBuffers = STORE_COUNT; + commsBufferManager.setup( MGR_ID, 0, Allocation::mallocator, @@ -207,15 +207,13 @@ module RPI { """ phase Fpp.ToCpp.Phases.tearDownComponents """ - fileUplinkBufferManager.cleanup(); + commsBufferManager.cleanup(); """ } instance fatalAdapter: Svc.AssertFatalAdapter base id 1000 - instance staticMemory: Svc.StaticMemory base id 1200 - instance downlink: Svc.Framer base id 1220 \ { @@ -459,5 +457,10 @@ module RPI { """ } + instance frameAccumulator: Svc.FrameAccumulator base id 2900 \ + { + + } + } diff --git a/RPI/Top/topology.fpp b/RPI/Top/topology.fpp index 3d842a1828..25facc5292 100644 --- a/RPI/Top/topology.fpp +++ b/RPI/Top/topology.fpp @@ -17,7 +17,7 @@ module RPI { instance fatalHandler instance fileDownlink instance fileUplink - instance fileUplinkBufferManager + instance commsBufferManager instance gpio17Drv instance gpio23Drv instance gpio24Drv @@ -31,7 +31,6 @@ module RPI { instance rateGroupDriverComp instance rpiDemo instance spiDrv - instance staticMemory instance textLogger instance uartDrv instance uplink @@ -72,9 +71,9 @@ module RPI { } connections FileUplinkBuffers { - fileUplink.bufferSendOut -> fileUplinkBufferManager.bufferSendIn - uplink.bufferAllocate -> fileUplinkBufferManager.bufferGetCallee - uplink.bufferDeallocate -> fileUplinkBufferManager.bufferSendIn + fileUplink.bufferSendOut -> commsBufferManager.bufferSendIn + uplink.bufferAllocate -> commsBufferManager.bufferGetCallee + uplink.bufferDeallocate -> commsBufferManager.bufferSendIn uplink.bufferOut -> fileUplink.bufferSendIn } @@ -115,10 +114,10 @@ module RPI { } connections StaticMemory { - comm.allocate -> staticMemory.bufferAllocate[0] - comm.deallocate -> staticMemory.bufferDeallocate[1] - downlink.framedAllocate -> staticMemory.bufferAllocate[1] - uplink.framedDeallocate -> staticMemory.bufferDeallocate[0] + comm.allocate -> commsBufferManager.bufferGetCallee + comm.deallocate -> commsBufferManager.bufferSendIn + downlink.framedAllocate -> commsBufferManager.bufferGetCallee + uplink.framedDeallocate -> commsBufferManager.bufferSendIn } connections UART { diff --git a/Ref/Top/RefTopology.cpp b/Ref/Top/RefTopology.cpp index da637d744f..9aa3703c1c 100644 --- a/Ref/Top/RefTopology.cpp +++ b/Ref/Top/RefTopology.cpp @@ -58,13 +58,13 @@ enum TopologyConstants { COMM_PRIORITY = 100, // Buffer manager for Uplink/Downlink COMMS_BUFFER_MANAGER_STORE_SIZE = 2048, - COMMS_BUFFER_MANAGER_QUEUE_SIZE = 20, + COMMS_BUFFER_MANAGER_STORE_COUNT = 20, COMMS_BUFFER_MANAGER_FILE_STORE_SIZE = 3000, COMMS_BUFFER_MANAGER_FILE_QUEUE_SIZE = 30, COMMS_BUFFER_MANAGER_ID = 200, // Buffer manager for Data Products DP_BUFFER_MANAGER_STORE_SIZE = 10000, - DP_BUFFER_MANAGER_QUEUE_SIZE = 10, + DP_BUFFER_MANAGER_STORE_COUNT = 10, DP_BUFFER_MANAGER_ID = 300, }; @@ -120,7 +120,7 @@ void configureTopology() { Svc::BufferManager::BufferBins commsBuffMgrBins; memset(&commsBuffMgrBins, 0, sizeof(commsBuffMgrBins)); commsBuffMgrBins.bins[0].bufferSize = COMMS_BUFFER_MANAGER_STORE_SIZE; - commsBuffMgrBins.bins[0].numBuffers = COMMS_BUFFER_MANAGER_QUEUE_SIZE; + commsBuffMgrBins.bins[0].numBuffers = COMMS_BUFFER_MANAGER_STORE_COUNT; commsBuffMgrBins.bins[1].bufferSize = COMMS_BUFFER_MANAGER_FILE_STORE_SIZE; commsBuffMgrBins.bins[1].numBuffers = COMMS_BUFFER_MANAGER_FILE_QUEUE_SIZE; commsBufferManager.setup(COMMS_BUFFER_MANAGER_ID, 0, mallocator, commsBuffMgrBins); @@ -128,7 +128,7 @@ void configureTopology() { Svc::BufferManager::BufferBins dpBuffMgrBins; memset(&dpBuffMgrBins, 0, sizeof(dpBuffMgrBins)); dpBuffMgrBins.bins[0].bufferSize = DP_BUFFER_MANAGER_STORE_SIZE; - dpBuffMgrBins.bins[0].numBuffers = DP_BUFFER_MANAGER_QUEUE_SIZE; + dpBuffMgrBins.bins[0].numBuffers = DP_BUFFER_MANAGER_STORE_COUNT; dpBufferManager.setup(DP_BUFFER_MANAGER_ID, 0, mallocator, dpBuffMgrBins); // Framer and Deframer components need to be passed a protocol handler From 44ad2ae2029e502332def5fde9a81c76ba25f70d Mon Sep 17 00:00:00 2001 From: chammard Date: Wed, 25 Sep 2024 11:27:12 -0700 Subject: [PATCH 17/19] Upgrade Router.cpp to latest Fw::Logger --- Ref/Top/instances.fpp | 3 --- Svc/Router/Router.cpp | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Ref/Top/instances.fpp b/Ref/Top/instances.fpp index 5cb63f998a..59c57c60b9 100644 --- a/Ref/Top/instances.fpp +++ b/Ref/Top/instances.fpp @@ -167,8 +167,5 @@ module Ref { instance uplinkRouter: Svc.Router base id 0x4E00 - instance dpBufferManager: Svc.BufferManager base id 0x4F00 - - } diff --git a/Svc/Router/Router.cpp b/Svc/Router/Router.cpp index 21e0371364..cc83945f69 100644 --- a/Svc/Router/Router.cpp +++ b/Svc/Router/Router.cpp @@ -53,7 +53,7 @@ void Router ::dataIn_handler(NATIVE_INT_TYPE portNum, Fw::Buffer& packetBuffer, commandOut_out(0, com, 0); // REVIEW NOTE: Deframer did not check if the output port was connected, should it? } else { - Fw::Logger::logMsg("[ERROR] Serializing com buffer failed with status %d\n", status); + Fw::Logger::log("[ERROR] Serializing com buffer failed with status %d\n", status); } break; } @@ -79,7 +79,7 @@ void Router ::dataIn_handler(NATIVE_INT_TYPE portNum, Fw::Buffer& packetBuffer, break; } } else { - Fw::Logger::logMsg("[ERROR] Deserializing packet type failed with status %d\n", status); + Fw::Logger::log("[ERROR] Deserializing packet type failed with status %d\n", status); } if (deallocate) { From 4b177364b36ad5a71eba8d80fed2931f8e7b0802 Mon Sep 17 00:00:00 2001 From: chammard Date: Wed, 25 Sep 2024 14:10:35 -0700 Subject: [PATCH 18/19] Update RPI deployment to use FrameAccumulator/Router --- RPI/Top/RPITopologyDefs.hpp | 1 + RPI/Top/instances.fpp | 25 ++++++++-------- RPI/Top/topology.fpp | 30 +++++++++++-------- .../FrameDetector/StartLengthCrcDetector.hpp | 6 +++- 4 files changed, 35 insertions(+), 27 deletions(-) diff --git a/RPI/Top/RPITopologyDefs.hpp b/RPI/Top/RPITopologyDefs.hpp index 50ec1d1c84..5040f33ff6 100644 --- a/RPI/Top/RPITopologyDefs.hpp +++ b/RPI/Top/RPITopologyDefs.hpp @@ -6,6 +6,7 @@ #include "RPI/Top/FppConstantsAc.hpp" #include "Svc/FramingProtocol/FprimeProtocol.hpp" #include "Svc/LinuxTimer/LinuxTimer.hpp" +#include namespace RPI { diff --git a/RPI/Top/instances.fpp b/RPI/Top/instances.fpp index 6b69ee9464..c174b28bf3 100644 --- a/RPI/Top/instances.fpp +++ b/RPI/Top/instances.fpp @@ -227,18 +227,7 @@ module RPI { } - instance uplink: Svc.Deframer base id 1240 \ - { - - phase Fpp.ToCpp.Phases.configObjects """ - Svc::FprimeDeframing deframing; - """ - - phase Fpp.ToCpp.Phases.configComponents """ - RPI::uplink.setup(ConfigObjects::RPI_uplink::deframing); - """ - - } + instance deframer: Svc.Deframer base id 1240 instance comm: Drv.TcpClient base id 1260 \ { @@ -459,8 +448,18 @@ module RPI { instance frameAccumulator: Svc.FrameAccumulator base id 2900 \ { - + phase Fpp.ToCpp.Phases.configObjects """ + Svc::FrameDetectors::FprimeFrameDetector fprimeFrameDetector; + """ + + phase Fpp.ToCpp.Phases.configComponents """ + { + frameAccumulator.configure(ConfigObjects::RPI_frameAccumulator::fprimeFrameDetector, 1, Allocation::mallocator, 2048); + } + + """ } + instance uplinkRouter: Svc.Router base id 3000 } diff --git a/RPI/Top/topology.fpp b/RPI/Top/topology.fpp index 25facc5292..5e0e6e0732 100644 --- a/RPI/Top/topology.fpp +++ b/RPI/Top/topology.fpp @@ -11,12 +11,14 @@ module RPI { instance cmdDisp instance cmdSeq instance comm + instance deframer instance downlink instance eventLogger instance fatalAdapter instance fatalHandler instance fileDownlink instance fileUplink + instance frameAccumulator instance commsBufferManager instance gpio17Drv instance gpio23Drv @@ -33,8 +35,8 @@ module RPI { instance spiDrv instance textLogger instance uartDrv - instance uplink instance uartBufferManager + instance uplinkRouter # ---------------------------------------------------------------------- # Pattern graph specifiers @@ -70,13 +72,6 @@ module RPI { eventLogger.FatalAnnounce -> fatalHandler.FatalReceive } - connections FileUplinkBuffers { - fileUplink.bufferSendOut -> commsBufferManager.bufferSendIn - uplink.bufferAllocate -> commsBufferManager.bufferGetCallee - uplink.bufferDeallocate -> commsBufferManager.bufferSendIn - uplink.bufferOut -> fileUplink.bufferSendIn - } - connections GPIO { rpiDemo.GpioRead -> gpio25Drv.gpioRead rpiDemo.GpioRead -> gpio17Drv.gpioRead @@ -113,11 +108,14 @@ module RPI { rpiDemo.SpiReadWrite -> spiDrv.SpiReadWrite } - connections StaticMemory { + connections MemoryMgmt { comm.allocate -> commsBufferManager.bufferGetCallee comm.deallocate -> commsBufferManager.bufferSendIn downlink.framedAllocate -> commsBufferManager.bufferGetCallee - uplink.framedDeallocate -> commsBufferManager.bufferSendIn + fileUplink.bufferSendOut -> commsBufferManager.bufferSendIn + frameAccumulator.frameAllocate -> commsBufferManager.bufferGetCallee + frameAccumulator.dataDeallocate -> commsBufferManager.bufferSendIn + uplinkRouter.bufferDeallocate -> commsBufferManager.bufferSendIn } connections UART { @@ -128,9 +126,15 @@ module RPI { } connections Uplink { - cmdDisp.seqCmdStatus -> uplink.cmdResponseIn - comm.$recv -> uplink.framedIn - uplink.comOut -> cmdDisp.seqCmdBuff + comm.$recv -> frameAccumulator.dataIn + + frameAccumulator.frameOut -> deframer.framedIn + deframer.deframedOut -> uplinkRouter.dataIn + + uplinkRouter.commandOut -> cmdDisp.seqCmdBuff + uplinkRouter.fileOut -> fileUplink.bufferSendIn + + cmdDisp.seqCmdStatus -> uplinkRouter.cmdResponseIn } } diff --git a/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp b/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp index 861513b295..45cbbf9466 100644 --- a/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp +++ b/Svc/FrameAccumulator/FrameDetector/StartLengthCrcDetector.hpp @@ -7,9 +7,13 @@ #define SVC_FRAMEACCUCULATOR_FRAME_DETECTOR_STARTLENGTHCHECKSUMDETECTOR_HPP #include "Fw/Types/PolyType.hpp" #include "Svc/FrameAccumulator/FrameDetector.hpp" -#include "Utils/Hash/libcrc/lib_crc.h" #include +// Include the lic crc c library: +extern "C" { + #include +} + namespace Svc { namespace FrameDetectors { From e6458d37f1c4ef388c4f34c4da108289f4c3a8f0 Mon Sep 17 00:00:00 2001 From: chammard Date: Mon, 30 Sep 2024 08:53:08 -0700 Subject: [PATCH 19/19] Remove CCSDS Deframers --- Svc/CCSDSDeframers/CMakeLists.txt | 2 - .../SpaceDataLinkDeframer/CMakeLists.txt | 14 ---- .../SpaceDataLinkDeframer.cpp | 72 ----------------- .../SpaceDataLinkDeframer.fpp | 29 ------- .../SpaceDataLinkDeframer.hpp | 45 ----------- .../SpaceDataLinkDeframer/docs/sdd.md | 66 --------------- .../SpacePacketDeframer/CMakeLists.txt | 14 ---- .../SpacePacketDeframer.cpp | 80 ------------------- .../SpacePacketDeframer.fpp | 29 ------- .../SpacePacketDeframer.hpp | 45 ----------- .../SpacePacketDeframer/docs/sdd.md | 66 --------------- Svc/CMakeLists.txt | 1 - config/FpConfig.h | 4 - 13 files changed, 467 deletions(-) delete mode 100644 Svc/CCSDSDeframers/CMakeLists.txt delete mode 100644 Svc/CCSDSDeframers/SpaceDataLinkDeframer/CMakeLists.txt delete mode 100644 Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.cpp delete mode 100644 Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.fpp delete mode 100644 Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.hpp delete mode 100644 Svc/CCSDSDeframers/SpaceDataLinkDeframer/docs/sdd.md delete mode 100644 Svc/CCSDSDeframers/SpacePacketDeframer/CMakeLists.txt delete mode 100644 Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.cpp delete mode 100644 Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.fpp delete mode 100644 Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.hpp delete mode 100644 Svc/CCSDSDeframers/SpacePacketDeframer/docs/sdd.md diff --git a/Svc/CCSDSDeframers/CMakeLists.txt b/Svc/CCSDSDeframers/CMakeLists.txt deleted file mode 100644 index 61b0cfc85d..0000000000 --- a/Svc/CCSDSDeframers/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/SpaceDataLinkDeframer") -add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/SpacePacketDeframer") diff --git a/Svc/CCSDSDeframers/SpaceDataLinkDeframer/CMakeLists.txt b/Svc/CCSDSDeframers/SpaceDataLinkDeframer/CMakeLists.txt deleted file mode 100644 index 65b447154c..0000000000 --- a/Svc/CCSDSDeframers/SpaceDataLinkDeframer/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ -#### -# F prime CMakeLists.txt: -# -# SOURCE_FILES: combined list of source and autocoding files -# MOD_DEPS: (optional) module dependencies -# UT_SOURCE_FILES: list of source files for unit tests -# -#### -set(SOURCE_FILES - "${CMAKE_CURRENT_LIST_DIR}/SpaceDataLinkDeframer.fpp" - "${CMAKE_CURRENT_LIST_DIR}/SpaceDataLinkDeframer.cpp" -) - -register_fprime_module() diff --git a/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.cpp b/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.cpp deleted file mode 100644 index da347c7a2f..0000000000 --- a/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.cpp +++ /dev/null @@ -1,72 +0,0 @@ -// ====================================================================== -// \title SpaceDataLinkDeframer.cpp -// \author chammard -// \brief cpp file for SpaceDataLinkDeframer component implementation class -// ====================================================================== - -#include "SpaceDataLinkDeframer.hpp" -#include "FpConfig.hpp" - -namespace Svc { - -// ---------------------------------------------------------------------- -// Component construction and destruction -// ---------------------------------------------------------------------- - -SpaceDataLinkDeframer ::SpaceDataLinkDeframer(const char* const compName) - : SpaceDataLinkDeframerComponentBase(compName) {} - -SpaceDataLinkDeframer ::~SpaceDataLinkDeframer() {} - -// ---------------------------------------------------------------------- -// Handler implementations for user-defined typed input ports -// ---------------------------------------------------------------------- - -void SpaceDataLinkDeframer ::framedIn_handler(FwIndexType portNum, Fw::Buffer& data, Fw::Buffer& context) { - - // CCSDS TC Format: - // 5 octets - TC Primary Header - // Up to 1019 octets - Data Field (including optional 2 octets frame error control field) - - // CCSDS TC Primary Header: - // 2b - 00 - TF Version Number - // 1b - 0/1 - Bypass Flag (0 = FARM checks enabled, 1 = FARM checks bypassed) - // 1b - 0/1 - Control Command Flag (0 = Type-D data, 1 = Type-C data) - // 2b - 00 - Reserved Spare (set to 00) - // 10b- XX - Spacecraft ID - // 6b - XX - Virtual Channel ID - // 10b- XX - Frame Length - // 8b - XX - Frame Sequence Number - - FW_ASSERT(data.getSize() >= SPACE_PACKET_HEADER_SIZE + SPACE_PACKET_TRAILER_SIZE, data.getSize()); - - U8 byte = data.getData()[0]; - - U8 version_number = (byte & 0xC0) >> 6; - U8 bypass = (byte & 0x20) >> 5; - U8 ctrl_cmd = (byte & 0x10) >> 4; - U16 sc_id = ((byte & 0x03) << 8); - - byte = data.getData()[1]; - sc_id |= byte; - - byte = data.getData()[2]; - U8 vch_id = (byte & 0xFC) >> 2; - - - U16 frame_length = (byte & 0x03) << 8; - byte = data.getData()[3]; - frame_length |= byte; - - - byte = data.getData()[4]; - U8 frame_seq_nbr = byte; - - // Set data buffer to be of the encapsulated data: HEADER (5 bytes) | DATA | CHECKSUM (2 bytes) - data.setData(data.getData() + SPACE_PACKET_HEADER_SIZE); - data.setSize(frame_length); // 5 bytes for Header, 2 bytes for Frame Error Control Field - - this->deframedOut_out(0, data, context); -} - -} // namespace Svc diff --git a/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.fpp b/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.fpp deleted file mode 100644 index de755b3d56..0000000000 --- a/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.fpp +++ /dev/null @@ -1,29 +0,0 @@ -module Svc { - @ Deframer for the TC Space Data Link Protocl (CCSDS Standard) - passive component SpaceDataLinkDeframer { - - include "../../Interfaces/DeframerInterface.fppi" - - ############################################################################### - # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # - ############################################################################### - @ Port for requesting the current time - time get port timeCaller - - @ Port for sending textual representation of events - text event port logTextOut - - @ Port for sending events to downlink - event port logOut - - @ Port for sending telemetry channels to downlink - telemetry port tlmOut - - @ Port to return the value of a parameter - param get port prmGetOut - - @Port to set the value of a parameter - param set port prmSetOut - - } -} \ No newline at end of file diff --git a/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.hpp b/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.hpp deleted file mode 100644 index 2676988090..0000000000 --- a/Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframer.hpp +++ /dev/null @@ -1,45 +0,0 @@ -// ====================================================================== -// \title SpaceDataLinkDeframer.hpp -// \author chammard -// \brief hpp file for SpaceDataLinkDeframer component implementation class -// ====================================================================== - -#ifndef Svc_SpaceDataLinkDeframer_HPP -#define Svc_SpaceDataLinkDeframer_HPP - -#include "Svc/CCSDSDeframers/SpaceDataLinkDeframer/SpaceDataLinkDeframerComponentAc.hpp" - -namespace Svc { - -class SpaceDataLinkDeframer : public SpaceDataLinkDeframerComponentBase { - - static const U8 SPACE_PACKET_HEADER_SIZE = 5; - static const U8 SPACE_PACKET_TRAILER_SIZE = 2; - public: - // ---------------------------------------------------------------------- - // Component construction and destruction - // ---------------------------------------------------------------------- - - //! Construct SpaceDataLinkDeframer object - SpaceDataLinkDeframer(const char* const compName //!< The component name - ); - - //! Destroy SpaceDataLinkDeframer object - ~SpaceDataLinkDeframer(); - - PRIVATE: - // ---------------------------------------------------------------------- - // Handler implementations for user-defined typed input ports - // ---------------------------------------------------------------------- - - //! Handler implementation for framedIn - //! - //! Port to receive framed data - void framedIn_handler(FwIndexType portNum, //!< The port number - Fw::Buffer& data, - Fw::Buffer& context) override; -}; - -} // namespace Svc - -#endif diff --git a/Svc/CCSDSDeframers/SpaceDataLinkDeframer/docs/sdd.md b/Svc/CCSDSDeframers/SpaceDataLinkDeframer/docs/sdd.md deleted file mode 100644 index fe31a32c8c..0000000000 --- a/Svc/CCSDSDeframers/SpaceDataLinkDeframer/docs/sdd.md +++ /dev/null @@ -1,66 +0,0 @@ -# Svc::SpaceDataLinkDeframer - -Deframer for the TC Space Data Link Protocl (CCSDS Standard) - -## Usage Examples -Add usage examples here - -### Diagrams -Add diagrams here - -### Typical Usage -And the typical usage of the component here - -## Class Diagram -Add a class diagram here - -## Port Descriptions -| Name | Description | -|---|---| -|---|---| - -## Component States -Add component states in the chart below -| Name | Description | -|---|---| -|---|---| - -## Sequence Diagrams -Add sequence diagrams here - -## Parameters -| Name | Description | -|---|---| -|---|---| - -## Commands -| Name | Description | -|---|---| -|---|---| - -## Events -| Name | Description | -|---|---| -|---|---| - -## Telemetry -| Name | Description | -|---|---| -|---|---| - -## Unit Tests -Add unit test descriptions in the chart below -| Name | Description | Output | Coverage | -|---|---|---|---| -|---|---|---|---| - -## Requirements -Add requirements in the chart below -| Name | Description | Validation | -|---|---|---| -|---|---|---| - -## Change Log -| Date | Description | -|---|---| -|---| Initial Draft | \ No newline at end of file diff --git a/Svc/CCSDSDeframers/SpacePacketDeframer/CMakeLists.txt b/Svc/CCSDSDeframers/SpacePacketDeframer/CMakeLists.txt deleted file mode 100644 index bb5f5c4771..0000000000 --- a/Svc/CCSDSDeframers/SpacePacketDeframer/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ -#### -# F prime CMakeLists.txt: -# -# SOURCE_FILES: combined list of source and autocoding files -# MOD_DEPS: (optional) module dependencies -# UT_SOURCE_FILES: list of source files for unit tests -# -#### -set(SOURCE_FILES - "${CMAKE_CURRENT_LIST_DIR}/SpacePacketDeframer.fpp" - "${CMAKE_CURRENT_LIST_DIR}/SpacePacketDeframer.cpp" -) - -register_fprime_module() diff --git a/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.cpp b/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.cpp deleted file mode 100644 index 9dcc21c87a..0000000000 --- a/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.cpp +++ /dev/null @@ -1,80 +0,0 @@ -// ====================================================================== -// \title SpacePacketDeframer.cpp -// \author chammard -// \brief cpp file for SpacePacketDeframer component implementation class -// ====================================================================== - -#include "SpacePacketDeframer.hpp" -#include "FpConfig.hpp" - -namespace Svc { - -// ---------------------------------------------------------------------- -// Component construction and destruction -// ---------------------------------------------------------------------- - -SpacePacketDeframer ::SpacePacketDeframer(const char* const compName) - : SpacePacketDeframerComponentBase(compName) {} - -SpacePacketDeframer ::~SpacePacketDeframer() {} - -// ---------------------------------------------------------------------- -// Handler implementations for user-defined typed input ports -// ---------------------------------------------------------------------- - -void SpacePacketDeframer ::framedIn_handler(FwIndexType portNum, Fw::Buffer& data, Fw::Buffer& context) { - // ################################ - // CCSDS SpacePacket Format: - // 6 octets - Primary Header - // 0-65536 octets - Data Field (with optional secondary header) - - // CCSDS SpacePacket Primary Header: - // 3b - 000 - (PVN) Packet Version Number - // 1b - 0/1 - (PT) Packet Type - // 1b - 0/1 - (SHF) Secondary Header Flag - // 11b - n/a - (APID) Application Process ID - // 2b - 00 - Sequence Flag - // 14b - n/a - Sequence Count - // 16b - n/a - Packet Data Length - // ################################ - - FW_ASSERT(data.getSize() >= 6, data.getSize()); - - // Read first byte from ring - U8 byte = data.getData()[0]; - // Unpack Packet Version Number (PVN) - U8 pvn = (byte & 0xE0) >> 5; - // Unpack Packet Type (PT) - U8 pt = (byte & 0x10) >> 4; - // Unpack Secondary Header Flag (SHF) - U8 shf = (byte & 0x08) >> 3; - - // Unpack APID - U16 apid = ((byte & 0x07) << 8); - byte = data.getData()[1]; - apid |= byte; - - // Sequence flag - byte = data.getData()[2]; - U8 seq_flag = (byte & 0xC0) >> 6; - - // Sequence count - U16 seq_count = (byte & 0x3F) << 8; - byte = data.getData()[3]; - seq_count |= byte; - - // Packet length - byte = data.getData()[4]; - U16 pkt_length = byte << 8; - byte = data.getData()[5]; - pkt_length |= byte; - - - // Set data buffer to be of the encapsulated data: HEADER (6 bytes) | PACKET DATA - data.setData(data.getData() + SPACE_PACKET_HEADER_SIZE); - data.setSize(pkt_length); // TODO: look into whether a spacePacket can span multiple frames - - this->deframedOut_out(0, data, context); -} - -} // namespace Svc diff --git a/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.fpp b/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.fpp deleted file mode 100644 index d86e76ddf5..0000000000 --- a/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.fpp +++ /dev/null @@ -1,29 +0,0 @@ -module Svc { - @ Deframer for the TC Space Data Link Protocl (CCSDS Standard) - passive component SpacePacketDeframer { - - include "../../Interfaces/DeframerInterface.fppi" - - ############################################################################### - # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # - ############################################################################### - @ Port for requesting the current time - time get port timeCaller - - @ Port for sending textual representation of events - text event port logTextOut - - @ Port for sending events to downlink - event port logOut - - @ Port for sending telemetry channels to downlink - telemetry port tlmOut - - @ Port to return the value of a parameter - param get port prmGetOut - - @Port to set the value of a parameter - param set port prmSetOut - - } -} \ No newline at end of file diff --git a/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.hpp b/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.hpp deleted file mode 100644 index d0af143bfb..0000000000 --- a/Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframer.hpp +++ /dev/null @@ -1,45 +0,0 @@ -// ====================================================================== -// \title SpacePacketDeframer.hpp -// \author chammard -// \brief hpp file for SpacePacketDeframer component implementation class -// ====================================================================== - -#ifndef Svc_SpacePacketDeframer_HPP -#define Svc_SpacePacketDeframer_HPP - -#include "Svc/CCSDSDeframers/SpacePacketDeframer/SpacePacketDeframerComponentAc.hpp" - -namespace Svc { - -class SpacePacketDeframer : public SpacePacketDeframerComponentBase { - - static const U8 SPACE_PACKET_HEADER_SIZE = 6; - - public: - // ---------------------------------------------------------------------- - // Component construction and destruction - // ---------------------------------------------------------------------- - - //! Construct SpacePacketDeframer object - SpacePacketDeframer(const char* const compName //!< The component name - ); - - //! Destroy SpacePacketDeframer object - ~SpacePacketDeframer(); - - PRIVATE: - // ---------------------------------------------------------------------- - // Handler implementations for user-defined typed input ports - // ---------------------------------------------------------------------- - - //! Handler implementation for framedIn - //! - //! Port to receive framed data - void framedIn_handler(FwIndexType portNum, //!< The port number - Fw::Buffer& data, - Fw::Buffer& context) override; -}; - -} // namespace Svc - -#endif diff --git a/Svc/CCSDSDeframers/SpacePacketDeframer/docs/sdd.md b/Svc/CCSDSDeframers/SpacePacketDeframer/docs/sdd.md deleted file mode 100644 index 222ddf1e20..0000000000 --- a/Svc/CCSDSDeframers/SpacePacketDeframer/docs/sdd.md +++ /dev/null @@ -1,66 +0,0 @@ -# Svc::SpacePacketDeframer - -Deframer for the Space Packet Protocl (CCSDS Standard). This unpacks Space Packets and extracts F Prime packets to hand to the F Prime Packet Router. - -## Usage Examples -Add usage examples here - -### Diagrams -Add diagrams here - -### Typical Usage -And the typical usage of the component here - -## Class Diagram -Add a class diagram here - -## Port Descriptions -| Name | Description | -|---|---| -|---|---| - -## Component States -Add component states in the chart below -| Name | Description | -|---|---| -|---|---| - -## Sequence Diagrams -Add sequence diagrams here - -## Parameters -| Name | Description | -|---|---| -|---|---| - -## Commands -| Name | Description | -|---|---| -|---|---| - -## Events -| Name | Description | -|---|---| -|---|---| - -## Telemetry -| Name | Description | -|---|---| -|---|---| - -## Unit Tests -Add unit test descriptions in the chart below -| Name | Description | Output | Coverage | -|---|---|---|---| -|---|---|---|---| - -## Requirements -Add requirements in the chart below -| Name | Description | Validation | -|---|---|---| -|---|---|---| - -## Change Log -| Date | Description | -|---|---| -|---| Initial Draft | \ No newline at end of file diff --git a/Svc/CMakeLists.txt b/Svc/CMakeLists.txt index f2e9986757..96cb25c607 100644 --- a/Svc/CMakeLists.txt +++ b/Svc/CMakeLists.txt @@ -17,7 +17,6 @@ add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/BufferAccumulator/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/BufferManager/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/BufferLogger/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/BufferRepeater/") -add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/CCSDSDeframers/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/ComLogger/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/ComQueue/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/ComSplitter/") diff --git a/config/FpConfig.h b/config/FpConfig.h index 6e07ab8d4b..a60123d31d 100644 --- a/config/FpConfig.h +++ b/config/FpConfig.h @@ -12,10 +12,6 @@ #ifndef FPCONFIG_H_ #define FPCONFIG_H_ -// ---------------------------------------------------------------------- -// Basic configuration -// ---------------------------------------------------------------------- -constexpr U16 CCSDS_SCID = 0x0355; // ---------------------------------------------------------------------- // Type aliases

PX{OQn*}O*zZpb@Ba_ycwJ2>+mn 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 X(NxONSm4tl1OGHtbyadNSp@tCNNLz3 diff --git a/Svc/Deframer/docs/img/top/cmd.json b/Svc/Deframer/docs/img/top/cmd.json deleted file mode 100644 index e079481d12..0000000000 --- a/Svc/Deframer/docs/img/top/cmd.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "columns" : [ - [ - { - "instanceName" : "deframer", - "inputPorts" : [ - { - "name" : "cmdResponseIn", - "portNumbers" : [ - 0 - ] - } - ], - "outputPorts" : [ - { - "name" : "comOut", - "portNumbers" : [ - 0 - ] - } - ] - } - ], - [ - { - "instanceName" : "cmdDisp", - "inputPorts" : [ - { - "name" : "seqCmdBuff", - "portNumbers" : [ - 0 - ] - } - ], - "outputPorts" : [ - { - "name" : "compCmdStat", - "portNumbers" : [ - 0 - ] - } - ] - } - ] - ], - "connections" : [ - [ - [ - 0, - 0, - 0, - 0 - ], - [ - 1, - 0, - 0, - 0 - ] - ], - [ - [ - 1, - 0, - 0, - 0 - ], - [ - 0, - 0, - 0, - 0 - ] - ] - ] -} diff --git a/Svc/Deframer/docs/img/top/cmd.png b/Svc/Deframer/docs/img/top/cmd.png deleted file mode 100644 index 39b36b97101b4edaaef67b0573954b131c35f400..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68425 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 diff --git a/Svc/Deframer/docs/img/top/cmd.txt b/Svc/Deframer/docs/img/top/cmd.txt deleted file mode 100644 index ea505a43cc..0000000000 --- a/Svc/Deframer/docs/img/top/cmd.txt +++ /dev/null @@ -1,13 +0,0 @@ -deframer -comOut -0 -cmdDisp -seqCmdBuff -0 - -cmdDisp -compCmdStat -0 -deframer -cmdResponseIn -0 diff --git a/Svc/Deframer/docs/img/top/deframer-file.json b/Svc/Deframer/docs/img/top/deframer-file.json deleted file mode 100644 index 2b1ef18172..0000000000 --- a/Svc/Deframer/docs/img/top/deframer-file.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "columns" : [ - [ - { - "instanceName" : "deframer", - "inputPorts" : [], - "outputPorts" : [ - { - "name" : "bufferOut", - "portNumbers" : [ - 0 - ] - }, - { - "name" : "bufferDeallocate", - "portNumbers" : [ - 0 - ] - }, - { - "name" : "bufferAllocate", - "portNumbers" : [ - 0 - ] - } - ] - } - ], - [ - { - "instanceName" : "fileUplink", - "inputPorts" : [ - { - "name" : "bufferSendIn", - "portNumbers" : [ - 0 - ] - } - ], - "outputPorts" : [ - { - "name" : "bufferSendOut", - "portNumbers" : [ - 0 - ] - } - ] - } - ], - [ - { - "instanceName" : "buffMgr", - "inputPorts" : [ - { - "name" : "bufferSendIn", - "portNumbers" : [ - 0 - ] - }, - { - "name" : "bufferGetCallee", - "portNumbers" : [ - 0 - ] - } - ], - "outputPorts" : [] - } - ] - ], - "connections" : [ - [ - [ - 0, - 0, - 0, - 0 - ], - [ - 1, - 0, - 0, - 0 - ] - ], - [ - [ - 1, - 0, - 0, - 0 - ], - [ - 2, - 0, - 0, - 0 - ] - ], - [ - [ - 0, - 0, - 2, - 0 - ], - [ - 2, - 0, - 1, - 0 - ] - ], - [ - [ - 0, - 0, - 1, - 0 - ], - [ - 2, - 0, - 0, - 0 - ] - ] - ] -} diff --git a/Svc/Deframer/docs/img/top/deframer-file.png b/Svc/Deframer/docs/img/top/deframer-file.png deleted file mode 100644 index 1c4713605fb52d04902552a81ee65285af8ebfe8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114776 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�}$~%!|Pdjn&*wMYQs5GS>Et} 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