From 93e84270b3ac8bcbc62a55dc23a111ff66c774c4 Mon Sep 17 00:00:00 2001 From: yaksase Date: Mon, 24 Apr 2023 09:54:19 +0300 Subject: [PATCH 01/16] Renamed NormalizedElement and NormalizedConnection structures as they no longer represent just only Normalized entity. Also moved parser literals to dedicated const char. --- src/main.cpp | 99 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 71 insertions(+), 28 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 7c79ccb..03d5810 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -41,6 +41,8 @@ const char *const parserY = "y"; const char *const parserHeight = "height"; const char *const parserWidth = "width"; const char *const parserEndElement = "end_element"; +const char *const parserLogicScheme = "logic_scheme"; +const char *const parserElements = "elements"; const float zoomInScalingFactor = 1.1f; const float zoomOutScalingFactor = 0.9f; @@ -49,6 +51,39 @@ const float mouseWheelScalingFactor = 0.1f; const std::string printCompactMode = "--compact"; const std::string printDefaultMode = "--default"; +struct NormalizedPoint { + float nX; + float nY; + + NormalizedPoint(): nX(0), nY(0) {} +}; + +struct Connection { + unsigned int id; + unsigned int startElementId; + unsigned int endElementId; + std::vector nVertices; + std::vector scrVertices; + + Connection(): id(-1), startElementId(-1), endElementId(-1) {} + void normalizedToScreen(const int screenW, const int screenH); + void scale(const float scalingFactor, const int mouseX, const int mouseY); + void move(const int dx, const int dy); +}; + +struct Element { + unsigned int id; + NormalizedPoint nPoint; + float nW, nH; + SDL_FRect scrRect; + std::vector connections; + + Element(): id(-1), nW(0), nH(0) {} + void normalizedToScreen(const int screenW, const int screenH); + void scale(const float scalingFactor, const int mouseX, const int mouseY); + void move(const int dx, const int dy); +}; + float normalizedToScreenX(const float nX, const int screenW) { return nX * screenW; } @@ -57,23 +92,23 @@ float normalizedToScreenY(const float nY, const int screenH) { return nY * screenH; } -void NormalizedElement::move(const int dx, const int dy) { +void Element::move(const int dx, const int dy) { scrRect.x += dx; scrRect.y += dy; - for (NormalizedConnection &connectionToMove : connections) { + for (Connection &connectionToMove : connections) { connectionToMove.move(dx, dy); } } -void NormalizedConnection::move(const int dx, const int dy) { +void Connection::move(const int dx, const int dy) { for (SDL_FPoint &vertexToMove : scrVertices) { vertexToMove.x += dx; vertexToMove.y += dy; } } -void NormalizedElement::scale( +void Element::scale( const float scalingFactor, const int mouseX, const int mouseY) { @@ -82,12 +117,12 @@ void NormalizedElement::scale( scrRect.w *= scalingFactor; scrRect.h *= scalingFactor; - for (NormalizedConnection &connectionToScale : connections) { + for (Connection &connectionToScale : connections) { connectionToScale.scale(scalingFactor, mouseX, mouseY); } } -void NormalizedConnection::scale( +void Connection::scale( const float scalingFactor, const int mouseX, const int mouseY) { @@ -97,7 +132,7 @@ void NormalizedConnection::scale( } } -void NormalizedConnection::normalizedToScreen( +void Connection::normalizedToScreen( const int screenW, const int screenH) { for (const NormalizedPoint &nVertex : nVertices) { @@ -108,7 +143,7 @@ void NormalizedConnection::normalizedToScreen( } } -void NormalizedElement::normalizedToScreen( +void Element::normalizedToScreen( const int screenW, const int screenH) { scrRect.x = normalizedToScreenX(nPoint.nX, screenW); @@ -124,19 +159,19 @@ void drawBackground(SDL_Renderer *renderer) { int parseInput( const char *filename, - std::vector &elementsToParse) { + std::vector &elementsToParse) { pugi::xml_document file; if (!file.load_file(filename)) { return PARSER_FAILURE; } - pugi::xml_node elements = file.child("logic_scheme").child("elements"); + pugi::xml_node elements = file.child(parserLogicScheme).child(parserElements); // Parsing elements from given file for (pugi::xml_node element = elements.first_child(); element; element = element.next_sibling()) { - NormalizedElement parsedElement; + Element parsedElement; parsedElement.id = atoi(element.attribute(parserElementId).value()); parsedElement.nPoint.nX = std::stof(element.attribute(parserX).value()); parsedElement.nPoint.nY = std::stof(element.attribute(parserY).value()); @@ -147,7 +182,7 @@ int parseInput( for (pugi::xml_node connection = element.first_child(); connection; connection = connection.next_sibling()) { - NormalizedConnection parsedConnection; + Connection parsedConnection; parsedConnection.id = atoi(connection.attribute(parserConnetionId).value()); parsedConnection.startElementId = parsedElement.id; parsedConnection.endElementId = atoi(connection.attribute(parserEndElement).value()); @@ -170,12 +205,12 @@ int parseInput( std::ostream &operator<<( std::ostream &out, - const NormalizedElement &elementToPrint) { + const Element &elementToPrint) { out << "Element id: " << elementToPrint.id << " x: " << elementToPrint.nPoint.nX << " y: " << elementToPrint.nPoint.nY << std::endl; - for (const NormalizedConnection &connection : elementToPrint.connections) { + for (const Connection &connection : elementToPrint.connections) { out << " Connection id: " << connection.id; for (size_t i = 0; i < connection.nVertices.size(); i++) { out << " x" << i << ": " << connection.nVertices[i].nX @@ -188,10 +223,10 @@ std::ostream &operator<<( void print( const std::string &printMode, - const std::vector &elementsToPrint) { + const std::vector &elementsToPrint) { if (printMode == printCompactMode) { size_t connectionsCount = 0; - for (const NormalizedElement &element : elementsToPrint) { + for (const Element &element : elementsToPrint) { connectionsCount += element.connections.size(); } std::cout << "Number of elements: " @@ -200,21 +235,21 @@ void print( << connectionsCount << std::endl; } else if (printMode == printDefaultMode) { - for (const NormalizedElement &element : elementsToPrint) { + for (const Element &element : elementsToPrint) { std::cout << element; } } } void convertNormToScreen( - std::vector &elementsToConvert, + std::vector &elementsToConvert, const int screenW, const int screenH) { // Converting normalized coordinates to screen - for (NormalizedElement &nElem : elementsToConvert) { + for (Element &nElem : elementsToConvert) { nElem.normalizedToScreen(screenW, screenH); - for (NormalizedConnection &nConnection : nElem.connections) { + for (Connection &nConnection : nElem.connections) { nConnection.normalizedToScreen(screenW, screenH); } } @@ -222,14 +257,14 @@ void convertNormToScreen( void drawFrame( SDL_Renderer *renderer, - const std::vector &elementsToDraw) { + const std::vector &elementsToDraw) { drawBackground(renderer); SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE); - for (const NormalizedElement &elementToDraw : elementsToDraw) { + for (const Element &elementToDraw : elementsToDraw) { SDL_RenderDrawRectF(renderer, &elementToDraw.scrRect); - for (const NormalizedConnection &connectionToDraw : elementToDraw.connections) { + for (const Connection &connectionToDraw : elementToDraw.connections) { for (size_t i = 1; i < connectionToDraw.scrVertices.size(); i++) { SDL_RenderDrawLineF(renderer, connectionToDraw.scrVertices[i - 1].x, @@ -244,11 +279,11 @@ void drawFrame( void scaleViewport( const float scalingFactor, - std::vector &elementsToScale) { + std::vector &elementsToScale) { int mouseX, mouseY; SDL_GetMouseState(&mouseX, &mouseY); - for (NormalizedElement &elementToScale : elementsToScale) { + for (Element &elementToScale : elementsToScale) { elementToScale.scale(scalingFactor, mouseX, mouseY); } } @@ -256,8 +291,8 @@ void scaleViewport( void moveViewport( const int dx, const int dy, - std::vector &elementsToScale) { - for (NormalizedElement &elementToScale : elementsToScale) { + std::vector &elementsToScale) { + for (Element &elementToScale : elementsToScale) { elementToScale.move(dx, dy); } } @@ -272,7 +307,15 @@ int main(int argc, char *argv[]) { std::cerr << statusMessages[FILENAME_NOT_PROVIDED]; return FILENAME_NOT_PROVIDED; } - + + std::vector normalizedElements; + + int code = parseInput(argv[1], normalizedElements); + if (code) { + std::cerr << statusMessages[code]; + return code; + } + std::string printMode = printDefaultMode; if (argc >= 3) { printMode = argv[2]; From 6a8e5ebf6019be1aae6e6fe65b7c152886d65c58 Mon Sep 17 00:00:00 2001 From: yaksase Date: Mon, 24 Apr 2023 10:45:41 +0300 Subject: [PATCH 02/16] Added fill and outline colors for element rectangles and color for connecction polylines --- src/main.cpp | 69 ++++++++++++++++++++++++++++++++++++++++++++++++--- test/test.xml | 40 ++++++++++++++++++++--------- 2 files changed, 94 insertions(+), 15 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 03d5810..01374c8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -43,6 +43,12 @@ const char *const parserWidth = "width"; const char *const parserEndElement = "end_element"; const char *const parserLogicScheme = "logic_scheme"; const char *const parserElements = "elements"; +const char *const parserOutlineColor = "outline_color"; +const char *const parserFillColor = "fill_color"; +const char *const parserColor = "color"; +const char *const parserR = "r"; +const char *const parserG = "g"; +const char *const parserB = "b"; const float zoomInScalingFactor = 1.1f; const float zoomOutScalingFactor = 0.9f; @@ -62,6 +68,7 @@ struct Connection { unsigned int id; unsigned int startElementId; unsigned int endElementId; + SDL_Color color; std::vector nVertices; std::vector scrVertices; @@ -76,6 +83,8 @@ struct Element { NormalizedPoint nPoint; float nW, nH; SDL_FRect scrRect; + SDL_Color outlineColor; + SDL_Color fillColor; std::vector connections; Element(): id(-1), nW(0), nH(0) {} @@ -178,6 +187,31 @@ int parseInput( parsedElement.nH = std::stof(element.attribute(parserHeight).value()); parsedElement.nW = std::stof(element.attribute(parserWidth).value()); + // Reading outline color from the document and if there is not one detected + // Defaults to white RGB(255, 255, 255) + pugi::xml_node outlineColor = element.child(parserOutlineColor); + if (outlineColor) { + parsedElement.outlineColor.r = outlineColor.attribute(parserR).as_int(); + parsedElement.outlineColor.g = outlineColor.attribute(parserG).as_int(); + parsedElement.outlineColor.b = outlineColor.attribute(parserB).as_int(); + } + else { + parsedElement.outlineColor.r = 255; + parsedElement.outlineColor.g = 255; + parsedElement.outlineColor.b = 255; + } + // Reading fill color from the document and if there is not one detected + // Defaults to black RGB(0, 0, 0) + pugi::xml_node fillColor = element.child(parserFillColor); + if (fillColor) { + parsedElement.fillColor.r = fillColor.attribute(parserR).as_int(); + parsedElement.fillColor.g = fillColor.attribute(parserG).as_int(); + parsedElement.fillColor.b = fillColor.attribute(parserB).as_int(); + } else { + parsedElement.fillColor.r = 0; + parsedElement.fillColor.g = 0; + parsedElement.fillColor.b = 0; + } // Parsing connections for given element for (pugi::xml_node connection = element.first_child(); connection; @@ -187,8 +221,21 @@ int parseInput( parsedConnection.startElementId = parsedElement.id; parsedConnection.endElementId = atoi(connection.attribute(parserEndElement).value()); + // Reading color from the document and if there is not one detected + // Defaults to white RGB(255, 255, 255) + pugi::xml_node color = connection.child(parserColor); + if (color) { + parsedConnection.color.r = color.attribute(parserR).as_int(); + parsedConnection.color.g = color.attribute(parserG).as_int(); + parsedConnection.color.b = color.attribute(parserB).as_int(); + } else { + parsedConnection.color.r = 255; + parsedConnection.color.g = 255; + parsedConnection.color.b = 255; + } // Parsing nVertices for given connection - for (pugi::xml_node vertex = connection.first_child(); + pugi::xml_node vertices = connection.child("vertices"); + for (pugi::xml_node vertex = vertices.first_child(); vertex; vertex = vertex.next_sibling()) { NormalizedPoint parsedVertex; @@ -260,11 +307,27 @@ void drawFrame( const std::vector &elementsToDraw) { drawBackground(renderer); - SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE); - for (const Element &elementToDraw : elementsToDraw) { + SDL_SetRenderDrawColor(renderer, + elementToDraw.fillColor.r, + elementToDraw.fillColor.g, + elementToDraw.fillColor.b, + SDL_ALPHA_OPAQUE); + SDL_RenderFillRectF(renderer, &elementToDraw.scrRect); + + SDL_SetRenderDrawColor(renderer, + elementToDraw.outlineColor.r, + elementToDraw.outlineColor.g, + elementToDraw.outlineColor.b, + SDL_ALPHA_OPAQUE); SDL_RenderDrawRectF(renderer, &elementToDraw.scrRect); + for (const Connection &connectionToDraw : elementToDraw.connections) { + SDL_SetRenderDrawColor(renderer, + connectionToDraw.color.r, + connectionToDraw.color.g, + connectionToDraw.color.b, + SDL_ALPHA_OPAQUE); for (size_t i = 1; i < connectionToDraw.scrVertices.size(); i++) { SDL_RenderDrawLineF(renderer, connectionToDraw.scrVertices[i - 1].x, diff --git a/test/test.xml b/test/test.xml index 72d1827..f15e678 100644 --- a/test/test.xml +++ b/test/test.xml @@ -4,30 +4,46 @@ + + + + + - - - - + + + + + + + + + - - - - + + + + + + - - + + + + - - + + + + From 0c977a75b3f09288ec4ebeb34f8156c400184a26 Mon Sep 17 00:00:00 2001 From: yaksase Date: Mon, 24 Apr 2023 17:56:40 +0300 Subject: [PATCH 03/16] Implemented an option between raw xml file and bench file --- src/layout.cpp | 10 ++-- src/layout.h | 2 +- src/main.cpp | 138 ++++++++++++++++++++++++++----------------------- src/main.h | 20 ++++--- test/test.xml | 70 +++++++++++++------------ 5 files changed, 132 insertions(+), 108 deletions(-) diff --git a/src/layout.cpp b/src/layout.cpp index d217b49..f7cca08 100644 --- a/src/layout.cpp +++ b/src/layout.cpp @@ -363,10 +363,10 @@ enum { void initPositionAndSize( std::vector &nodes, - std::vector &normalizedElements, + std::vector &normalizedElements, float nCellSize) { for (TreeNode &node : nodes) { - NormalizedElement nElement = {}; + Element nElement = {}; nElement.id = node.id; if (node.isDummy) { @@ -395,11 +395,11 @@ void initPositionAndSize( void initConnections( std::vector &nodes, - std::vector &normalizedElements) { + std::vector &normalizedElements) { int countConnections = 0; for (size_t i = 0; i < nodes.size(); i++) { for (size_t &succId : nodes[i].succ) { - NormalizedConnection connection = {}; + Connection connection = {}; connection.id = countConnections; connection.startElementId = nodes[i].id; @@ -427,7 +427,7 @@ void initConnections( } void Net::netTreeNodesToNormalizedElements( - std::vector &normalizedElements) { + std::vector &normalizedElements) { float maxNumber = -1, maxLayer = -1; for (TreeNode &node : nodes) { if (node.layer > maxLayer) { diff --git a/src/layout.h b/src/layout.h index 0bb0e6b..50350d0 100644 --- a/src/layout.h +++ b/src/layout.h @@ -53,7 +53,7 @@ struct Net { void assignLayers(); void netTreeNodesToNormalizedElements( - std::vector &normalizedElements); + std::vector &normalizedElements); std::vector> getNodesByLayer(); }; diff --git a/src/main.cpp b/src/main.cpp index 01374c8..87fdaf1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,7 +22,7 @@ enum StatusCode { SUCCESS = 0, FILENAME_NOT_PROVIDED, - PARSER_FAILURE, + RAW_PARSER_FAILURE, SDL_INIT_FAILURE, BENCH_READER_ERROR }; @@ -30,12 +30,13 @@ enum StatusCode { const char *statusMessages[] = { "Success\n", "Filename was not provided\n", - "Parser failure\n", - "SDL could not be initialized\n" + "Raw parser failure\n", + "SDL could not be initialized\n", + "Becnh reader error\n" }; const char *const parserElementId = "e_id"; -const char *const parserConnetionId = "c_id"; +const char *const parserConnectionId = "c_id"; const char *const parserX = "x"; const char *const parserY = "y"; const char *const parserHeight = "height"; @@ -43,6 +44,7 @@ const char *const parserWidth = "width"; const char *const parserEndElement = "end_element"; const char *const parserLogicScheme = "logic_scheme"; const char *const parserElements = "elements"; +const char *const parserConnections = "connections"; const char *const parserOutlineColor = "outline_color"; const char *const parserFillColor = "fill_color"; const char *const parserColor = "color"; @@ -56,42 +58,43 @@ const float mouseWheelScalingFactor = 0.1f; const std::string printCompactMode = "--compact"; const std::string printDefaultMode = "--default"; - -struct NormalizedPoint { - float nX; - float nY; - - NormalizedPoint(): nX(0), nY(0) {} -}; - -struct Connection { - unsigned int id; - unsigned int startElementId; - unsigned int endElementId; - SDL_Color color; - std::vector nVertices; - std::vector scrVertices; - - Connection(): id(-1), startElementId(-1), endElementId(-1) {} - void normalizedToScreen(const int screenW, const int screenH); - void scale(const float scalingFactor, const int mouseX, const int mouseY); - void move(const int dx, const int dy); -}; - -struct Element { - unsigned int id; - NormalizedPoint nPoint; - float nW, nH; - SDL_FRect scrRect; - SDL_Color outlineColor; - SDL_Color fillColor; - std::vector connections; - - Element(): id(-1), nW(0), nH(0) {} - void normalizedToScreen(const int screenW, const int screenH); - void scale(const float scalingFactor, const int mouseX, const int mouseY); - void move(const int dx, const int dy); -}; +const std::string parseRawMode = "--raw"; + +// struct NormalizedPoint { +// float nX; +// float nY; + +// NormalizedPoint(): nX(0), nY(0) {} +// }; + +// struct Connection { +// unsigned int id; +// unsigned int startElementId; +// unsigned int endElementId; +// SDL_Color color; +// std::vector nVertices; +// std::vector scrVertices; + +// Connection(): id(-1), startElementId(-1), endElementId(-1) {} +// void normalizedToScreen(const int screenW, const int screenH); +// void scale(const float scalingFactor, const int mouseX, const int mouseY); +// void move(const int dx, const int dy); +// }; + +// struct Element { +// unsigned int id; +// NormalizedPoint nPoint; +// float nW, nH; +// SDL_FRect scrRect; +// SDL_Color outlineColor; +// SDL_Color fillColor; +// std::vector connections; + +// Element(): id(-1), nW(0), nH(0) {} +// void normalizedToScreen(const int screenW, const int screenH); +// void scale(const float scalingFactor, const int mouseX, const int mouseY); +// void move(const int dx, const int dy); +// }; float normalizedToScreenX(const float nX, const int screenW) { return nX * screenW; @@ -167,11 +170,11 @@ void drawBackground(SDL_Renderer *renderer) { } int parseInput( - const char *filename, + std::istream &stream, std::vector &elementsToParse) { pugi::xml_document file; - if (!file.load_file(filename)) { - return PARSER_FAILURE; + if (!file.load(stream)) { + return RAW_PARSER_FAILURE; } pugi::xml_node elements = file.child(parserLogicScheme).child(parserElements); @@ -213,11 +216,12 @@ int parseInput( parsedElement.fillColor.b = 0; } // Parsing connections for given element - for (pugi::xml_node connection = element.first_child(); + pugi::xml_node connections = element.child(parserConnections); + for (pugi::xml_node connection = connections.first_child(); connection; connection = connection.next_sibling()) { Connection parsedConnection; - parsedConnection.id = atoi(connection.attribute(parserConnetionId).value()); + parsedConnection.id = atoi(connection.attribute(parserConnectionId).value()); parsedConnection.startElementId = parsedElement.id; parsedConnection.endElementId = atoi(connection.attribute(parserEndElement).value()); @@ -370,37 +374,43 @@ int main(int argc, char *argv[]) { std::cerr << statusMessages[FILENAME_NOT_PROVIDED]; return FILENAME_NOT_PROVIDED; } - - std::vector normalizedElements; - - int code = parseInput(argv[1], normalizedElements); - if (code) { - std::cerr << statusMessages[code]; - return code; - } - + std::string printMode = printDefaultMode; if (argc >= 3) { printMode = argv[2]; } - - Net net = {}; - std::ifstream ifs(argv[1]); - if (!readNetFromBench(ifs, net)) { - return BENCH_READER_ERROR; + + bool parseRaw = false; + if (argc >= 4) { + if (argv[3] == parseRawMode) { + parseRaw = true; + } } - net.assignLayers(); - minimizeIntersections(net); - std::vector normalizedElements = {}; - net.netTreeNodesToNormalizedElements(normalizedElements); - + std::ifstream ifs(argv[1]); + std::vector normalizedElements = {}; + if (parseRaw) { + if (parseInput(ifs, normalizedElements)) { + std::cerr << statusMessages[RAW_PARSER_FAILURE]; + return RAW_PARSER_FAILURE; + } + } else { + Net net = {}; + if (!readNetFromBench(ifs, net)) { + std::cerr << statusMessages[BENCH_READER_ERROR]; + return BENCH_READER_ERROR; + } + net.assignLayers(); + net.netTreeNodesToNormalizedElements(normalizedElements); + } // Prepare draw data and draw if (SDL_Init(SDL_INIT_VIDEO) < 0) { std::cerr << statusMessages[SDL_INIT_FAILURE]; return SDL_INIT_FAILURE; } + print(printMode, normalizedElements); + std::cout << statusMessages[SUCCESS]; // Get screen dimensions diff --git a/src/main.h b/src/main.h index 8af0ddb..bb32d63 100644 --- a/src/main.h +++ b/src/main.h @@ -18,27 +18,35 @@ struct NormalizedPoint { NormalizedPoint(): nX(0), nY(0) {} }; -struct NormalizedConnection { +struct Connection { unsigned int id; unsigned int startElementId; unsigned int endElementId; + SDL_Color color; std::vector nVertices; std::vector scrVertices; - NormalizedConnection(): id(-1), startElementId(-1), endElementId(-1) {} + Connection(): id(-1), startElementId(-1), endElementId(-1) { + color = {255, 255, 255, 255}; + } void normalizedToScreen(const int screenW, const int screenH); void scale(const float scalingFactor, const int mouseX, const int mouseY); void move(const int dx, const int dy); }; -struct NormalizedElement { +struct Element { unsigned int id; NormalizedPoint nPoint; float nW, nH; SDL_FRect scrRect; - std::vector connections; - - NormalizedElement(): id(-1), nW(0), nH(0) {} + SDL_Color outlineColor; + SDL_Color fillColor; + std::vector connections; + + Element(): id(-1), nW(0), nH(0) { + outlineColor = {255, 255, 255, 255}; + fillColor = {0, 0, 0, 255}; + } void normalizedToScreen(const int screenW, const int screenH); void scale(const float scalingFactor, const int mouseX, const int mouseY); void move(const int dx, const int dy); diff --git a/test/test.xml b/test/test.xml index f15e678..bfe1aa9 100644 --- a/test/test.xml +++ b/test/test.xml @@ -9,42 +9,48 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + + + - - - - - - + + + + + + + + From e90e743c61946bd7478cbbcfc4f32df995cf4011 Mon Sep 17 00:00:00 2001 From: yaksase Date: Mon, 24 Apr 2023 18:15:08 +0300 Subject: [PATCH 04/16] Typo in statusMessages --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 87fdaf1..b4b8a3e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -32,7 +32,7 @@ const char *statusMessages[] = { "Filename was not provided\n", "Raw parser failure\n", "SDL could not be initialized\n", - "Becnh reader error\n" + "Bench reader error\n" }; const char *const parserElementId = "e_id"; From ea5c15521c90d1b95fcee7b6633ae0337c8c94a0 Mon Sep 17 00:00:00 2001 From: yaksase Date: Mon, 24 Apr 2023 18:18:00 +0300 Subject: [PATCH 05/16] Removed commented data structures --- src/main.cpp | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index b4b8a3e..03c6bc7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -60,42 +60,6 @@ const std::string printCompactMode = "--compact"; const std::string printDefaultMode = "--default"; const std::string parseRawMode = "--raw"; -// struct NormalizedPoint { -// float nX; -// float nY; - -// NormalizedPoint(): nX(0), nY(0) {} -// }; - -// struct Connection { -// unsigned int id; -// unsigned int startElementId; -// unsigned int endElementId; -// SDL_Color color; -// std::vector nVertices; -// std::vector scrVertices; - -// Connection(): id(-1), startElementId(-1), endElementId(-1) {} -// void normalizedToScreen(const int screenW, const int screenH); -// void scale(const float scalingFactor, const int mouseX, const int mouseY); -// void move(const int dx, const int dy); -// }; - -// struct Element { -// unsigned int id; -// NormalizedPoint nPoint; -// float nW, nH; -// SDL_FRect scrRect; -// SDL_Color outlineColor; -// SDL_Color fillColor; -// std::vector connections; - -// Element(): id(-1), nW(0), nH(0) {} -// void normalizedToScreen(const int screenW, const int screenH); -// void scale(const float scalingFactor, const int mouseX, const int mouseY); -// void move(const int dx, const int dy); -// }; - float normalizedToScreenX(const float nX, const int screenW) { return nX * screenW; } From 3939c18390a9f094c02843a524407455214f0539 Mon Sep 17 00:00:00 2001 From: yaksase Date: Mon, 24 Apr 2023 18:27:59 +0300 Subject: [PATCH 06/16] Implemented an option to draw with and without color --- src/main.cpp | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 03c6bc7..e9f0fd0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -59,6 +59,7 @@ const float mouseWheelScalingFactor = 0.1f; const std::string printCompactMode = "--compact"; const std::string printDefaultMode = "--default"; const std::string parseRawMode = "--raw"; +const std::string drawColorsMode = "--colors"; float normalizedToScreenX(const float nX, const int screenW) { return nX * screenW; @@ -272,30 +273,38 @@ void convertNormToScreen( void drawFrame( SDL_Renderer *renderer, - const std::vector &elementsToDraw) { + const std::vector &elementsToDraw, + bool drawColor) { drawBackground(renderer); + SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE); + for (const Element &elementToDraw : elementsToDraw) { - SDL_SetRenderDrawColor(renderer, + if (drawColor) { + SDL_SetRenderDrawColor(renderer, elementToDraw.fillColor.r, elementToDraw.fillColor.g, elementToDraw.fillColor.b, SDL_ALPHA_OPAQUE); - SDL_RenderFillRectF(renderer, &elementToDraw.scrRect); + SDL_RenderFillRectF(renderer, &elementToDraw.scrRect); - SDL_SetRenderDrawColor(renderer, + SDL_SetRenderDrawColor(renderer, elementToDraw.outlineColor.r, elementToDraw.outlineColor.g, elementToDraw.outlineColor.b, SDL_ALPHA_OPAQUE); + } + SDL_RenderDrawRectF(renderer, &elementToDraw.scrRect); for (const Connection &connectionToDraw : elementToDraw.connections) { - SDL_SetRenderDrawColor(renderer, - connectionToDraw.color.r, - connectionToDraw.color.g, - connectionToDraw.color.b, - SDL_ALPHA_OPAQUE); + if (drawColor) { + SDL_SetRenderDrawColor(renderer, + connectionToDraw.color.r, + connectionToDraw.color.g, + connectionToDraw.color.b, + SDL_ALPHA_OPAQUE); + } for (size_t i = 1; i < connectionToDraw.scrVertices.size(); i++) { SDL_RenderDrawLineF(renderer, connectionToDraw.scrVertices[i - 1].x, @@ -351,6 +360,13 @@ int main(int argc, char *argv[]) { } } + bool drawColors = false; + if (argc >= 5) { + if (argv[4] == drawColorsMode) { + drawColors = true; + } + } + std::ifstream ifs(argv[1]); std::vector normalizedElements = {}; if (parseRaw) { @@ -389,7 +405,7 @@ int main(int argc, char *argv[]) { SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); convertNormToScreen(normalizedElements, screenW, screenH); - drawFrame(renderer, normalizedElements); + drawFrame(renderer, normalizedElements, drawColors); // Event loop bool isRunning = true; @@ -415,7 +431,6 @@ int main(int argc, char *argv[]) { mouseY2 = 0; } else if (isDragging && SDL_GetMouseState(&mouseX2, &mouseY2)) { moveViewport(mouseX2 - mouseX1, mouseY2 - mouseY1, normalizedElements); - drawFrame(renderer, normalizedElements); SDL_GetMouseState(&mouseX1, &mouseY1); } else if (event.type == SDL_KEYDOWN) { // Keyboard input handler @@ -430,12 +445,11 @@ int main(int argc, char *argv[]) { isRunning = false; break; } - drawFrame(renderer, normalizedElements); } else if (event.type == SDL_MOUSEWHEEL) { scaleViewport(scaleMouseWheel(event.wheel.y), normalizedElements); - drawFrame(renderer, normalizedElements); } } + drawFrame(renderer, normalizedElements, drawColors); } // Shutdown SDL_DestroyWindow(window); From d317ce731eca72651b0740a489a6363a42d10781 Mon Sep 17 00:00:00 2001 From: yaksase Date: Sun, 7 May 2023 23:12:16 +0300 Subject: [PATCH 07/16] Added CLI11 support. --- src/CMakeLists.txt | 3 +- src/main.cpp | 114 +++++++++++++++++++++++++++++++-------------- 2 files changed, 82 insertions(+), 35 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cd9317d..6a8b9cd 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,4 +4,5 @@ target_link_libraries(main SDL2::SDL2 SDL2_ttf::SDL2_ttf pugixml::pugixml - Lorina) \ No newline at end of file + Lorina + cli11) \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index e9f0fd0..04b5556 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,12 +8,14 @@ #define SDL_MAIN_HANDLED #include "pugixml.hpp" +#include #include #include #include - #include +#include + #include "layout.h" #include "netfmt_bench.h" #include "main.h" @@ -56,10 +58,14 @@ const float zoomInScalingFactor = 1.1f; const float zoomOutScalingFactor = 0.9f; const float mouseWheelScalingFactor = 0.1f; -const std::string printCompactMode = "--compact"; -const std::string printDefaultMode = "--default"; -const std::string parseRawMode = "--raw"; -const std::string drawColorsMode = "--colors"; +const unsigned int framesNum = 100; + +const std::string optionFile = "file"; +const std::string flagFPS = "--fps"; +const std::string flagRaw = "--raw"; +const std::string flagCompact = "--compact"; +const std::string flagMinimize = "--minimize"; +const std::string flagColors = "--colors"; float normalizedToScreenX(const float nX, const int screenW) { return nX * screenW; @@ -238,9 +244,9 @@ std::ostream &operator<<( } void print( - const std::string &printMode, - const std::vector &elementsToPrint) { - if (printMode == printCompactMode) { + const std::vector &elementsToPrint, + bool printCompact) { + if (printCompact) { size_t connectionsCount = 0; for (const Element &element : elementsToPrint) { connectionsCount += element.connections.size(); @@ -250,7 +256,7 @@ void print( << "\nNumber of connections: " << connectionsCount << std::endl; - } else if (printMode == printDefaultMode) { + } else { for (const Element &element : elementsToPrint) { std::cout << element; } @@ -342,32 +348,41 @@ float scaleMouseWheel(const Sint32 mouseWheelY) { } int main(int argc, char *argv[]) { - // Parse text file - if (argc < 2) { - std::cerr << statusMessages[FILENAME_NOT_PROVIDED]; - return FILENAME_NOT_PROVIDED; - } - - std::string printMode = printDefaultMode; - if (argc >= 3) { - printMode = argv[2]; - } + CLI::App cliApp; + + std::string filename; + cliApp.add_option(optionFile, + filename, + "File to parse")->required(); bool parseRaw = false; - if (argc >= 4) { - if (argv[3] == parseRawMode) { - parseRaw = true; - } - } + auto cliRaw = cliApp.add_flag(flagRaw, + parseRaw, + "Parse graph represented as FLG file"); - bool drawColors = false; - if (argc >= 5) { - if (argv[4] == drawColorsMode) { - drawColors = true; - } - } + bool printCompact = false; + cliApp.add_flag(flagCompact, + printCompact, + "Print quantity of elements and connections"); + + bool drawColor = false; + cliApp.add_flag(flagColors, + drawColor, + "Draw color"); + + bool showFPS = false; + cliApp.add_flag(flagFPS, + showFPS, + "Show average frame time, FPS and BENCH file processing time"); + + bool processMinimize = false; + cliApp.add_flag(flagMinimize, + processMinimize, + "Minimize intersections")->excludes(cliRaw); + + CLI11_PARSE(cliApp, argc, argv); - std::ifstream ifs(argv[1]); + std::ifstream ifs(filename); std::vector normalizedElements = {}; if (parseRaw) { if (parseInput(ifs, normalizedElements)) { @@ -380,8 +395,20 @@ int main(int argc, char *argv[]) { std::cerr << statusMessages[BENCH_READER_ERROR]; return BENCH_READER_ERROR; } + auto start = std::chrono::high_resolution_clock::now(); net.assignLayers(); net.netTreeNodesToNormalizedElements(normalizedElements); + if (processMinimize) { + minimizeIntersections(net); + } + auto stop = std::chrono::high_resolution_clock::now(); + auto duration = std::chrono::duration_cast(stop - start).count(); + if (showFPS) { + std::cout << "BENCH processing time: " + << duration + << " ms." + << std::endl; + } } // Prepare draw data and draw if (SDL_Init(SDL_INIT_VIDEO) < 0) { @@ -389,7 +416,7 @@ int main(int argc, char *argv[]) { return SDL_INIT_FAILURE; } - print(printMode, normalizedElements); + print(normalizedElements, printCompact); std::cout << statusMessages[SUCCESS]; @@ -405,7 +432,7 @@ int main(int argc, char *argv[]) { SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); convertNormToScreen(normalizedElements, screenW, screenH); - drawFrame(renderer, normalizedElements, drawColors); + drawFrame(renderer, normalizedElements, drawColor); // Event loop bool isRunning = true; @@ -414,7 +441,26 @@ int main(int argc, char *argv[]) { int mouseY1 = 0; int mouseX2 = 0; int mouseY2 = 0; + + auto start = std::chrono::high_resolution_clock::now(); + unsigned int count = 0; while (isRunning) { + if (count == framesNum) { + auto stop = std::chrono::high_resolution_clock::now(); + auto duration = std::chrono::duration_cast(stop - start).count(); + auto avgFrameTime = duration / count; + auto avgFPS = 1000/avgFrameTime; + start = std::chrono::high_resolution_clock::now(); + count = 0; + if (showFPS) { + std::cout << "Avg frame time: " + << avgFrameTime + << " ms. FPS:" + << avgFPS + << std::endl; + } + } + count++; SDL_Event event; // User input handler while (SDL_PollEvent(&event)) { @@ -449,7 +495,7 @@ int main(int argc, char *argv[]) { scaleViewport(scaleMouseWheel(event.wheel.y), normalizedElements); } } - drawFrame(renderer, normalizedElements, drawColors); + drawFrame(renderer, normalizedElements, drawColor); } // Shutdown SDL_DestroyWindow(window); From 9ef1d05c3f9978e1391b7693476876251d8fb374 Mon Sep 17 00:00:00 2001 From: yaksase Date: Mon, 8 May 2023 17:59:33 +0300 Subject: [PATCH 08/16] Fix: placed net convertation to NormalizedElements after minimization module --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 04b5556..c8802af 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -397,10 +397,10 @@ int main(int argc, char *argv[]) { } auto start = std::chrono::high_resolution_clock::now(); net.assignLayers(); - net.netTreeNodesToNormalizedElements(normalizedElements); if (processMinimize) { minimizeIntersections(net); } + net.netTreeNodesToNormalizedElements(normalizedElements); auto stop = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast(stop - start).count(); if (showFPS) { From 9022017101d8e357f17f1f748a4ac71af2434567 Mon Sep 17 00:00:00 2001 From: yaksase Date: Mon, 8 May 2023 18:29:07 +0300 Subject: [PATCH 09/16] Feature: background color, default color for bench elements --- src/main.cpp | 47 +++++++++++++++++++++++++++++++++++++++-------- test/test.xml | 2 ++ 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index c8802af..b7eab44 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -50,6 +50,7 @@ const char *const parserConnections = "connections"; const char *const parserOutlineColor = "outline_color"; const char *const parserFillColor = "fill_color"; const char *const parserColor = "color"; +const char *const parserBackColor = "background_color"; const char *const parserR = "r"; const char *const parserG = "g"; const char *const parserB = "b"; @@ -135,19 +136,35 @@ void Element::normalizedToScreen( scrRect.h = normalizedToScreenY(nH, screenH); } -void drawBackground(SDL_Renderer *renderer) { - SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE); +void drawBackground(SDL_Renderer *renderer, + const SDL_Color &backgroundColor, + const bool drawColor) { + if (drawColor) { + SDL_SetRenderDrawColor(renderer, + backgroundColor.r, + backgroundColor.g, + backgroundColor.b, + SDL_ALPHA_OPAQUE); + } else { + SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE); + } SDL_RenderClear(renderer); } int parseInput( std::istream &stream, - std::vector &elementsToParse) { + std::vector &elementsToParse, + SDL_Color &backgroundColor) { pugi::xml_document file; if (!file.load(stream)) { return RAW_PARSER_FAILURE; } + pugi::xml_node parsedBackColor = file.child(parserLogicScheme).child(parserBackColor); + backgroundColor.r = parsedBackColor.attribute(parserR).as_int(255); + backgroundColor.g = parsedBackColor.attribute(parserG).as_int(255); + backgroundColor.b = parsedBackColor.attribute(parserB).as_int(255); + pugi::xml_node elements = file.child(parserLogicScheme).child(parserElements); // Parsing elements from given file @@ -280,8 +297,9 @@ void convertNormToScreen( void drawFrame( SDL_Renderer *renderer, const std::vector &elementsToDraw, - bool drawColor) { - drawBackground(renderer); + const SDL_Color &backgroundColor, + const bool drawColor) { + drawBackground(renderer, backgroundColor, drawColor); SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE); @@ -347,6 +365,17 @@ float scaleMouseWheel(const Sint32 mouseWheelY) { return 1 + mouseWheelY * mouseWheelScalingFactor; } +void defaultColor(std::vector &elementsToColor, SDL_Color &backgroundColor) { + for (Element &elementToColor : elementsToColor) { + elementToColor.fillColor = {3, 161, 252}; + elementToColor.outlineColor = {3, 161, 252}; + for (Connection &connectionToColor : elementToColor.connections) { + connectionToColor.color = {0, 0, 0}; + } + } + backgroundColor = {255, 255, 255}; +} + int main(int argc, char *argv[]) { CLI::App cliApp; @@ -384,8 +413,9 @@ int main(int argc, char *argv[]) { std::ifstream ifs(filename); std::vector normalizedElements = {}; + SDL_Color backgroundColor; if (parseRaw) { - if (parseInput(ifs, normalizedElements)) { + if (parseInput(ifs, normalizedElements, backgroundColor)) { std::cerr << statusMessages[RAW_PARSER_FAILURE]; return RAW_PARSER_FAILURE; } @@ -409,6 +439,7 @@ int main(int argc, char *argv[]) { << " ms." << std::endl; } + defaultColor(normalizedElements, backgroundColor); } // Prepare draw data and draw if (SDL_Init(SDL_INIT_VIDEO) < 0) { @@ -432,7 +463,7 @@ int main(int argc, char *argv[]) { SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); convertNormToScreen(normalizedElements, screenW, screenH); - drawFrame(renderer, normalizedElements, drawColor); + drawFrame(renderer, normalizedElements, backgroundColor, drawColor); // Event loop bool isRunning = true; @@ -495,7 +526,7 @@ int main(int argc, char *argv[]) { scaleViewport(scaleMouseWheel(event.wheel.y), normalizedElements); } } - drawFrame(renderer, normalizedElements, drawColor); + drawFrame(renderer, normalizedElements, backgroundColor, drawColor); } // Shutdown SDL_DestroyWindow(window); diff --git a/test/test.xml b/test/test.xml index bfe1aa9..91ea630 100644 --- a/test/test.xml +++ b/test/test.xml @@ -1,4 +1,6 @@ + + From c4108dace0bb9ad778de0f1de9604664a253184e Mon Sep 17 00:00:00 2001 From: yaksase Date: Mon, 8 May 2023 18:33:39 +0300 Subject: [PATCH 10/16] Change: parseInput function --- src/main.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index b7eab44..dbf4eeb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -172,11 +172,11 @@ int parseInput( element; element = element.next_sibling()) { Element parsedElement; - parsedElement.id = atoi(element.attribute(parserElementId).value()); - parsedElement.nPoint.nX = std::stof(element.attribute(parserX).value()); - parsedElement.nPoint.nY = std::stof(element.attribute(parserY).value()); - parsedElement.nH = std::stof(element.attribute(parserHeight).value()); - parsedElement.nW = std::stof(element.attribute(parserWidth).value()); + parsedElement.id = element.attribute(parserElementId).as_int(-1); + parsedElement.nPoint.nX = element.attribute(parserX).as_float(); + parsedElement.nPoint.nY = element.attribute(parserY).as_float(); + parsedElement.nH = element.attribute(parserHeight).as_float(); + parsedElement.nW = element.attribute(parserWidth).as_float(); // Reading outline color from the document and if there is not one detected // Defaults to white RGB(255, 255, 255) @@ -231,8 +231,8 @@ int parseInput( vertex; vertex = vertex.next_sibling()) { NormalizedPoint parsedVertex; - parsedVertex.nX = std::stof(vertex.attribute(parserX).value()); - parsedVertex.nY = std::stof(vertex.attribute(parserY).value()); + parsedVertex.nX = vertex.attribute(parserX).as_float(); + parsedVertex.nY = vertex.attribute(parserY).as_float(); parsedConnection.nVertices.push_back(parsedVertex); } parsedElement.connections.push_back(parsedConnection); From 9dd776c178934d0b89c1dd2f436c3013fbd24254 Mon Sep 17 00:00:00 2001 From: yaksase Date: Mon, 8 May 2023 18:41:34 +0300 Subject: [PATCH 11/16] Change: parseInput now defaults elements color to cyan and connection color to black --- src/main.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index dbf4eeb..8e024a4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -179,7 +179,7 @@ int parseInput( parsedElement.nW = element.attribute(parserWidth).as_float(); // Reading outline color from the document and if there is not one detected - // Defaults to white RGB(255, 255, 255) + // Defaults to cyan RGB(3, 161, 252) pugi::xml_node outlineColor = element.child(parserOutlineColor); if (outlineColor) { parsedElement.outlineColor.r = outlineColor.attribute(parserR).as_int(); @@ -187,21 +187,21 @@ int parseInput( parsedElement.outlineColor.b = outlineColor.attribute(parserB).as_int(); } else { - parsedElement.outlineColor.r = 255; - parsedElement.outlineColor.g = 255; - parsedElement.outlineColor.b = 255; + parsedElement.outlineColor.r = 3; + parsedElement.outlineColor.g = 161; + parsedElement.outlineColor.b = 252; } // Reading fill color from the document and if there is not one detected - // Defaults to black RGB(0, 0, 0) + // Defaults to cyan RGB(3, 161, 252) pugi::xml_node fillColor = element.child(parserFillColor); if (fillColor) { parsedElement.fillColor.r = fillColor.attribute(parserR).as_int(); parsedElement.fillColor.g = fillColor.attribute(parserG).as_int(); parsedElement.fillColor.b = fillColor.attribute(parserB).as_int(); } else { - parsedElement.fillColor.r = 0; - parsedElement.fillColor.g = 0; - parsedElement.fillColor.b = 0; + parsedElement.fillColor.r = 3; + parsedElement.fillColor.g = 161; + parsedElement.fillColor.b = 252; } // Parsing connections for given element pugi::xml_node connections = element.child(parserConnections); @@ -214,16 +214,16 @@ int parseInput( parsedConnection.endElementId = atoi(connection.attribute(parserEndElement).value()); // Reading color from the document and if there is not one detected - // Defaults to white RGB(255, 255, 255) + // Defaults to black RGB(0, 0, 0) pugi::xml_node color = connection.child(parserColor); if (color) { parsedConnection.color.r = color.attribute(parserR).as_int(); parsedConnection.color.g = color.attribute(parserG).as_int(); parsedConnection.color.b = color.attribute(parserB).as_int(); } else { - parsedConnection.color.r = 255; - parsedConnection.color.g = 255; - parsedConnection.color.b = 255; + parsedConnection.color.r = 0; + parsedConnection.color.g = 0; + parsedConnection.color.b = 0; } // Parsing nVertices for given connection pugi::xml_node vertices = connection.child("vertices"); From 0eeeef7d56a88998be492e87bc39d1a0959c7d1e Mon Sep 17 00:00:00 2001 From: yaksase Date: Fri, 12 May 2023 22:11:16 +0300 Subject: [PATCH 12/16] Added: option to show dummy nodes --- src/layout.cpp | 36 +++++++++++++++++++++++++++++------- src/layout.h | 3 ++- src/main.cpp | 8 +++++++- 3 files changed, 38 insertions(+), 9 deletions(-) mode change 100644 => 100755 src/layout.cpp diff --git a/src/layout.cpp b/src/layout.cpp old mode 100644 new mode 100755 index f7cca08..fcdbca6 --- a/src/layout.cpp +++ b/src/layout.cpp @@ -364,12 +364,17 @@ enum { void initPositionAndSize( std::vector &nodes, std::vector &normalizedElements, - float nCellSize) { + float nCellSize, + bool initDummy) { for (TreeNode &node : nodes) { Element nElement = {}; nElement.id = node.id; if (node.isDummy) { + if (!initDummy) { + continue; + } + NormalizedPoint nPoint = {}; nPoint.nX = nCellSize * node.number + (nCellSize / ReductionWidth) / ReductionRelationToGap; @@ -393,12 +398,25 @@ void initPositionAndSize( } } +static TreeNode::Id +traceVirtualNode(TreeNode::Id originId, const std::vector &nodes) { + const TreeNode *node = nodes.data() + originId; + while (node->isDummy) { + node = nodes.data() + node->succ[0]; + } + return node->id; +} + void initConnections( - std::vector &nodes, - std::vector &normalizedElements) { + const std::vector &nodes, + std::vector &normalizedElements, + bool initDummy) { int countConnections = 0; for (size_t i = 0; i < nodes.size(); i++) { - for (size_t &succId : nodes[i].succ) { + if (nodes[i].isDummy && !initDummy) { + continue; + } + for (size_t succId : nodes[i].succ) { Connection connection = {}; connection.id = countConnections; @@ -411,6 +429,9 @@ void initConnections( nPointStart.nY = normalizedElements[i].nPoint.nY + normalizedElements[i].nH; + if (!initDummy) { + succId = traceVirtualNode(succId, nodes); + } NormalizedPoint nPointEnd = {}; nPointEnd.nX = normalizedElements[succId].nPoint.nX + normalizedElements[succId].nW / GetMiddle; @@ -427,7 +448,8 @@ void initConnections( } void Net::netTreeNodesToNormalizedElements( - std::vector &normalizedElements) { + std::vector &normalizedElements, + bool showDummy) { float maxNumber = -1, maxLayer = -1; for (TreeNode &node : nodes) { if (node.layer > maxLayer) { @@ -445,7 +467,7 @@ void Net::netTreeNodesToNormalizedElements( nCellSize = 1 / (maxNumber + 1); } - initPositionAndSize(nodes, normalizedElements, nCellSize); + initPositionAndSize(nodes, normalizedElements, nCellSize, showDummy); - initConnections(nodes, normalizedElements); + initConnections(nodes, normalizedElements, showDummy); } diff --git a/src/layout.h b/src/layout.h index 50350d0..b0c2a09 100644 --- a/src/layout.h +++ b/src/layout.h @@ -53,7 +53,8 @@ struct Net { void assignLayers(); void netTreeNodesToNormalizedElements( - std::vector &normalizedElements); + std::vector &normalizedElements, + bool showDummy); std::vector> getNodesByLayer(); }; diff --git a/src/main.cpp b/src/main.cpp index 8e024a4..cec682a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -67,6 +67,7 @@ const std::string flagRaw = "--raw"; const std::string flagCompact = "--compact"; const std::string flagMinimize = "--minimize"; const std::string flagColors = "--colors"; +const std::string flagDummy = "--dummy"; float normalizedToScreenX(const float nX, const int screenW) { return nX * screenW; @@ -409,6 +410,11 @@ int main(int argc, char *argv[]) { processMinimize, "Minimize intersections")->excludes(cliRaw); + bool showDummy = false; + cliApp.add_flag(flagDummy, + showDummy, + "Show dummy nodes")->excludes(cliRaw); + CLI11_PARSE(cliApp, argc, argv); std::ifstream ifs(filename); @@ -430,7 +436,7 @@ int main(int argc, char *argv[]) { if (processMinimize) { minimizeIntersections(net); } - net.netTreeNodesToNormalizedElements(normalizedElements); + net.netTreeNodesToNormalizedElements(normalizedElements, showDummy); auto stop = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast(stop - start).count(); if (showFPS) { From f2a969517bb7c45879b18ae8eb5c340842f2c76c Mon Sep 17 00:00:00 2001 From: yaksase Date: Fri, 12 May 2023 22:35:33 +0300 Subject: [PATCH 13/16] Fix: warnings when initializing default colors --- src/main.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index cec682a..c74bb1f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -368,13 +368,13 @@ float scaleMouseWheel(const Sint32 mouseWheelY) { void defaultColor(std::vector &elementsToColor, SDL_Color &backgroundColor) { for (Element &elementToColor : elementsToColor) { - elementToColor.fillColor = {3, 161, 252}; - elementToColor.outlineColor = {3, 161, 252}; + elementToColor.fillColor = {3, 161, 252, 255}; + elementToColor.outlineColor = {3, 161, 252, 255}; for (Connection &connectionToColor : elementToColor.connections) { - connectionToColor.color = {0, 0, 0}; + connectionToColor.color = {0, 0, 0, 255}; } } - backgroundColor = {255, 255, 255}; + backgroundColor = {255, 255, 255, 255}; } int main(int argc, char *argv[]) { @@ -441,7 +441,7 @@ int main(int argc, char *argv[]) { auto duration = std::chrono::duration_cast(stop - start).count(); if (showFPS) { std::cout << "BENCH processing time: " - << duration + << duration << " ms." << std::endl; } From 3d8ef71f7a0d2d76624858d50e0301b7069376d6 Mon Sep 17 00:00:00 2001 From: yaksase Date: Mon, 15 May 2023 10:44:10 +0300 Subject: [PATCH 14/16] Added: Line clipping algorithm --- src/main.cpp | 111 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 104 insertions(+), 7 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index c74bb1f..f5bc82d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include "layout.h" #include "netfmt_bench.h" @@ -59,6 +60,8 @@ const float zoomInScalingFactor = 1.1f; const float zoomOutScalingFactor = 0.9f; const float mouseWheelScalingFactor = 0.1f; +const float inf = std::numeric_limits::infinity(); + const unsigned int framesNum = 100; const std::string optionFile = "file"; @@ -295,10 +298,95 @@ void convertNormToScreen( } } +float maxi(const float arr[], int n) { + float m = 0; + for (int i = 0; i < n; ++i) + if (m < arr[i]) + m = arr[i]; + return m; +} + +float mini(const float arr[], int n) { + float m = 1; + for (int i = 0; i < n; ++i) + if (m > arr[i]) + m = arr[i]; + return m; +} + +bool checkSegmentRectCollision( + SDL_FPoint &point1, + SDL_FPoint &point2, + const int screenW, + const int screenH) { + float x1 = point1.x; + float y1 = point1.y; + float x2 = point2.x; + float y2 = point2.y; + + float p1 = -(x2 - x1); + float p2 = -p1; + float p3 = -(y2 - y1); + float p4 = -p3; + + float q1 = x1; + float q2 = screenW - x1; + float q3 = y1; + float q4 = screenH - y1; + + float posarr[5], negarr[5]; + int posind = 1, negind = 1; + posarr[0] = 1; + negarr[0] = 0; + + if ((p1 == 0 && q1 < 0) || (p3 == 0 && q3 < 0)) { + return false; + } + if (p1 != 0) { + float r1 = q1 / p1; + float r2 = q2 / p2; + if (p1 < 0) { + negarr[negind++] = r1; + posarr[posind++] = r2; + } else { + negarr[negind++] = r2; + posarr[posind++] = r1; + } + } + if (p3 != 0) { + float r3 = q3 / p3; + float r4 = q4 / p4; + if (p3 < 0) { + negarr[negind++] = r3; + posarr[posind++] = r4; + } else { + negarr[negind++] = r4; + posarr[posind++] = r3; + } + } + float rn1, rn2; + + rn1 = maxi(negarr, negind); + rn2 = mini(posarr, posind); + + if (rn1 > rn2) { + return false; + } + point1.x = x1 + p2 * rn1; + point1.y = y1 + p4 * rn1; + + point2.x = x1 + p2 * rn2; + point2.y = y1 + p4 * rn2; + + return true; +} + void drawFrame( SDL_Renderer *renderer, const std::vector &elementsToDraw, const SDL_Color &backgroundColor, + const int screenW, + const int screenH, const bool drawColor) { drawBackground(renderer, backgroundColor, drawColor); @@ -331,11 +419,20 @@ void drawFrame( SDL_ALPHA_OPAQUE); } for (size_t i = 1; i < connectionToDraw.scrVertices.size(); i++) { - SDL_RenderDrawLineF(renderer, - connectionToDraw.scrVertices[i - 1].x, - connectionToDraw.scrVertices[i - 1].y, - connectionToDraw.scrVertices[i].x, - connectionToDraw.scrVertices[i].y); + SDL_FPoint point1 = connectionToDraw.scrVertices[i - 1]; + SDL_FPoint point2 = connectionToDraw.scrVertices[i]; + + bool collision = checkSegmentRectCollision(point1, + point2, + screenW, + screenH); + if (collision) { + SDL_RenderDrawLineF(renderer, + point1.x, + point1.y, + point2.x, + point2.y); + } } } } @@ -469,7 +566,7 @@ int main(int argc, char *argv[]) { SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); convertNormToScreen(normalizedElements, screenW, screenH); - drawFrame(renderer, normalizedElements, backgroundColor, drawColor); + drawFrame(renderer, normalizedElements, backgroundColor, screenW, screenH, drawColor); // Event loop bool isRunning = true; @@ -532,7 +629,7 @@ int main(int argc, char *argv[]) { scaleViewport(scaleMouseWheel(event.wheel.y), normalizedElements); } } - drawFrame(renderer, normalizedElements, backgroundColor, drawColor); + drawFrame(renderer, normalizedElements, backgroundColor, screenW, screenH, drawColor); } // Shutdown SDL_DestroyWindow(window); From 5ba6feffd1ec95ceed5e6af624095a58421be8d0 Mon Sep 17 00:00:00 2001 From: yaksase Date: Sun, 21 May 2023 17:13:03 +0300 Subject: [PATCH 15/16] Implemented: Texturizing according to gate type --- CMakeLists.txt | 2 ++ assets/img/gates.bmp | Bin 0 -> 15283338 bytes src/layout.cpp | 4 ++- src/layout.h | 3 +- src/main.cpp | 72 ++++++++++++++++++++++++++++++++++++++----- src/main.h | 24 +++++++++++++++ src/netfmt_bench.cpp | 26 +++++++++++----- test/bench.cpp | 1 + 8 files changed, 115 insertions(+), 17 deletions(-) create mode 100644 assets/img/gates.bmp diff --git a/CMakeLists.txt b/CMakeLists.txt index 8c64baf..fa1947a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,8 @@ set(CMAKE_CXX_STANDARD_REQUIRED TRUE) find_package(SDL2 CONFIG REQUIRED) find_package(SDL2_ttf CONFIG REQUIRED) +add_definitions(-DROOT_DIR="${CMAKE_SOURCE_DIR}") + add_subdirectory(extern/pugixml-1.13) add_subdirectory(extern/lorina/lib) diff --git a/assets/img/gates.bmp b/assets/img/gates.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ed01bef531fcbfec4142e8e6c36fa9d392b15c70 GIT binary patch literal 15283338 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 z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N 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 zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RqDmxI(&h*f6`MR|E(UAV7cs0RjXF5Ll?dRTkQs#t0A~K!5-N0t5&U*e`*5WW^^X z9<^T`uwDWL2oNAZfB*pk1PJVbz?HL($0t6SxcMHe&ngHIAV7cs0RjXF5Lk}D*QVLm zCH}ul;;j6JCnXm>fGdiCH^__w~6|H{N%(hCF*_rDDe%6dQYGb zAV7cs0RjZpO`tv>t>dJv$GjKku{*B-#+4@Iwl!COU-tE9(x=IV+1@{%_|L>YCSIO+ zR^m4kKa;qB;!cTMC!7xnf1^LhY!Ngk=^*yTku2g+Ts;&*Gb0AkuCcIlt<8`Hhc(`*aste<6_|9F4mwTWjW>bqZ~#Pt&j z0RjXF5FoJs0(F1>ze=uvk#{Fi)t;zfyHOFS@f zo5Z0Bg#ZBp1PBn=8-cpk^4}7z$7OXd|10cG7niaY=QrA4^VV%dea4%&fw~9ov55nT zy58f4355Uw0t5&UAh6d0cgPBNx*yf%BKUtCgu_M%zmH`-tC*6l-m#=C6;^sGT6ZcHi{WKH;1PBlyKwvQf$E2Co@%oG`bM?ine$QKRexv>MZrwiAXFSU` z@QLgV#@Bh&oPJl?^Sy%=5+Fc;009E4E^yr>Sof7_Jyv;Pr!dZMw7=G^+lKm#XWa%q znElH5I*%jsd);G0AwYlt0RjZt1#X^2&P}wA$xmxv)gYFrd68RlRiBw{VDGnqFXaE~ zI}*=M{7B;F355Uw0t5&UATY1MFQ6#x@ty`xz^|@(lzUnix4eb9m z@R9uAeR1Nb#7zE-``@K8M9J*bD1AhD=GvwN8 zqkjAL#EjWI+ra1Z|N0*iHD~!95()tV1PBmVcY!)i|IbA0_YA)| zz86~^@4qJT@PvC=1wkP|fB*pk1TG~|$6YnAM(g{ZpS@Hoef&}L7T5Q_TXTJXmbqoZ z`yU32-Uhxt+tv8JPyM`0V*K8xem*Es?|*(M@vy{W5>HJ0exk15er4j=#Bqt*wogfX zD$%-)uTuSwB>(3p>b>Jt5()tV1PBmVM}fMh<1FKQE!SH)JRPok+qCBUH@zjQziTgW z?Ff8r;yV)$Ogtj-#KdzFuS&cn@!>>W@7((Tp{M%)p8S3%@okBEkFO9QK!5-N0t8+f zg4W}i`V8?(9ny_v$hBvO=? zW0psC%Jp|MDC>NO0j;#+6PwLb4v2&|*PHIsCm|EO!k>)u$e zO1vjA%RZxZAG56b^_j-8iK7x&ur_v zFA9Nm6F4jh-y%`>%c^slbziJECQeVZ?lXo||Frb~*@=2z=Uhh+6aoYY5LiipKTB4v zen*y32oU&^Kz;YA=Cu2v#1j&Km8ko_&GLV%_5b1`>wi9d zu5&h($5j&w0RjXF5FoJn0#{3lb-tqYn4;$N?Xmn}I^CLU&BIZj^(q7id`aNC`BC@( z{h7ow691GqE7AIYYrpIN_a*(W&qbW;2!cX@009CkBT)CNJSWjQ);_pXfxnm`*Ee;V zt8Nq6OM$CrWp_zDGV$k$cP1`KwC-E>qkf(1sPi-dAjwk1tBxEz#q3YU#E@fB*pk1PJUPP{${AjY8}DpC|6n=8&Iy{0zB%ILjP9n>z@1d{ioi_jnm=t60P~(ySGI3mp}&sbv^XgB_5i1VPdG)b^mMn z_VbAzKi5dN6#@hZ5FkKclR#ag`R+vP`+=u!YNMxLA2~y=bxx$tjVJ^NELNcYU)A@$ z9-FA|dwn+1x-VLG{d3c&S0wJ0=<&WC>9#_E009DPC{W+2{$!$coP1cPR?nOv*ZMAl zdsBA$g6noy0vqY=PbFTK_;{jqzqHKy^?j?qO58J1pN%L42oNAZfIy!D4@|dPj~Qy- z!s~UIZry9@v>EcPd+aC#2rO6Nurz*-nM%AMw`+XQ+QsLxl9Ow|2+>wL#h z?q_xJCH?uq{Os{Q9_hA1fB*pkYamd^t{+Xb9^?Obr#8PkL$3eaX|B3WU{wU_nu%{o z97xnPRdt-*y3bm4{d&*wio{(L3IPHH2oNC9k3ijjw)ME6=HaOM3wtZ|d1TEa+?wyt z^_Hmq5?C>TBa+YeCti@K`^L5YA6`cNx~AjFiJK)90t5&UATTt6N2Eio?V+i-IeP8-f-?h4SLLoqa009C7hA;5ubg}jQ zK;1{C$5O{kt+{?E%hdPD6#@i?A@B|9M!ny7YvPNE*8kIstY7P|YfS2z4*Q89CDF;RUcum%EkZ|Qp`{xI>uMC{S25>BD0a^*vIB009C72<*2&jgLExTa%tUVZS>)LLoqa009C7h9~e(=~C-)!7mLj zjj4K6-?MJb^`tE0IA$tdl?d#cz?HJ*`z2nQ_)Mbp|M{Zo*Ljv_CB8bL5FkK+0D=7y zsOt((O|*`0-?d*Io^!pwHAAk)%(+gB6Ckj+0(Bktfy8?gt^2k`)vtS3Jt|Ri9Vr9| z5FkK+z;Fac=}PN(e_EEQYu|e-b)MqgiPn7Y-&>;kOJI!!>bmy(CSH=*uX7!B@2X=H z_edxN2oNAZU_S(YAuDY?=KaV0=;#90S@Q$7j`=lK-(~^p)&v0pdoM6P*D=fe8Cv&? zlj_$!Ee<5Ev-hc6BLM;g2oNB!jlf&;_@r@rr^g<;Oe|NB6RqRh9rvn(3trFDXUO%> z7u*NU5g@Sl0(B3oXC^+8Xx-nagXlRcIjq|@gmTJo*qft&W2tUePUa2bL6E>V51@v21YzMy5lF{$o_S?7xr zUz<<}5FkK+0D=7xsQWg(D=}%T-s!O)*q`psz1By}kZZ5k>(7m)0Rk&1P}h>zJVO7L z*l8cPjOXgRW%YT}S0xkz1PBlyuuOrPd;6?J%Xn6E>Gpcxrsp>1S}spZCW=SGdt}zB5FkK+009DfFYu#TW$Re}w!QD>Le_YtwDR#8^1b~+ z)~*o(1coF~-?KW9_)wyCA2?6_&t`q~naVX23IPHH2oPA7z;CDF*752Om(`gixBJy; zzrIJ^l5d^=x$2VprFjAb_D|r}S@rKEW_kbLvM=Om^%t{>MqJN2)z=#K1BdoO9swQ{a&yA=WiR$Jf-N$)|4y}qX7^;u`l2dEGr zK!5-N0(&Fyvsumfea*B#>$AWf%PiOHpPxjp-(#}+On^X>!1Yr5@re&6rrj6LTdzKQ zdPd@g355Uw0t5&wQs7x>taY6Fl|^=758L{>tgG%3(~|G|QoqM}1^1BEstBx$8wi+x;57~^q8nV6CkiKf!n5~KTDjKXx)Fb*1st0`18cg5()tV1PBly zuy}#1r^(MHTE^&4rT$eG-<3US@p+B8mdj7>Nzbf=0D&P2)OT4Qn0RZVWj{G<-A`sc zk4iYN8U%#^0RjYO7C16XwvI(_nR#vdzu>>kknipGzuS61fWSTrjPFzXvGk*LpV?Y} zeBJg9_Bm&(CqRGz0RpQi@a!bjIyOJNQ;6H7-*ug6OTPb^`j_uCU)?4^U~vNfCr!O1 zabcomA2Lhb)3T0-B@Rm{1PBlyKwuVuS@_q08tKF9tz9(yK zJ@$C@zVy^e2@n{vz}3>ZUrwBwXx*o@)_+UZQTG~A2oNAZfWWi@bq(N$6D?!T`Kf>1 zM31HBv1-Y+>OQu|MD>{ffjtqpeb(|9iPrCew(f`iBkS;e$~}2Wt%Lvp0t8lEV3hn? z$Kls>YEs|HXua;V<^(ezSf?+zZWCCtK+Vzd!-=|=UF&|drGCA)dQsv=355Uw0t5(5 zBT%2;w~RGa_gANBcz|{4yiDs{!5_#n_1-`sK!Ct@0=LK$f09`CJ!eu(Q6#@hZ>?UyMRQRVv z%RZ*H?nl#p%|Y&-y+Ke25FkKcTY=}~nbt98v~6p{e&TjB!0RjXFY!ztz%>RNkQ1e;zSZYqJ zX~)lTy~p&Js6G=QFbIL#SJu5_>s;x0pR&lGb$C}3sDyh~1wkP|fB=Cn3(WGF z|F3*`>ArrsV!HduM9cX3U#WljzS7iN0t5yoaP#!1=FVvSJZ0K_RUPL)EMZ?21cd+r z0t5)`BJlTle%dj%>eV$6H{PYqp+5b6=~zpyRriTQO-8>65a>qW9_i^j6RrE7Y3siw zZQr&V4IL#wfB=DI3#{8`{=XN{X~)cQy}K^^MbJJ00&5}g^~v&8iMsA$ynk8b&o`&t zZ%8Nv2oNAZfWY|sqZ*{IMI@?dBz9*lIk3RZUpMPS3j6|f1+g{ zG;Q5F_gr%yepNytK!5-N0(GDGX~&Rpy}NYEcFXj;^|Qs7b(*Vg6Cf~5fjg#K|CAW- zPZ#;~3u(8G^N&a<1PBlyK!Cty1!}(V|4y`wzg552dB&gEm}|Mzbsq`=0t6NzaD_Bd z*P4Gc(X!v2wr;h1R6-#@fB=E@7WkT^-};$<-SfTI()zjLc}et|y(X*Q1PBaPpyn$* zIWg_AdrQ3!q}@?MAwYlt0RjXrEAXT|)H1GC-FsfPnJyl=NqX5j&v?&sj&$*&=p=zP z6u5G7u501WPPFcSr>XzfY4`dGg#ZBp1lCvJxTHSKm@%$%PU`pi{oq;V9I5XcC-glKM-4Ko}iSf6T9tuTc7_}+N^txD+CA-AV7e?R|Hz;8SnY~ zUH3`at;Y{P{}n2~5ghT*6C)=K|bEkF7ju!d+k0L^pXGp0t5&wUEuy%L+d#E zkfrx(IV+fDp7DQKPFJ)_fB=C@3EVe-eIU`gKi;kWXVT`w5;f1cLVy4P0_!92jHJ5T z7_s^Jx~99XE$p$}CY|1#%QV0LR*#A5GXVl!3fv>T{?EiT`=*vUuI1=*bI@r51PBmV zf^L>BEx#~Ir0{scp=Pr*yd#>dO zfH9Qe;pRGb>^NUtCqST2fjZ8ANn-Q9Xc51ko;L5*Cy8DY zAV7csfrSWsLt1GaQ-5_KYu=wm-qx7!sj2Vt!2Nlxtd+nz3yhNd$%)qe^KSL)T8Er<&+~VEkMr4y zx+Yv9K!5-N0_!O7t|Z+umY&ox($6*KS}u3$IA2{SK%ifNE2Qg>Pn?%%*+=hIx8|L# z`Ii&|1PBmVU4c56UDsXjHYRL-{^=cayt*;hPo;j%#jX$_Kwv)vu9TG?NG$p|zdozE zLqZ`yfB*pk>n2dwV{CqJGtKX}>lEpl>G%1K`981HTy>iOfz=SGd+WV6G0ncYrA}QR zf5d7K$$|g@0t6-qyfKfpj0+!4{X-_S)5AkQ(3oqv+^>hk^pOC8l@|D#WY@Z{-fh2L z=S&`za36}5-gG2KfB*pkTLfnLepk)g(QEmebbPmCg3Zs@_q$x@+3TyV-vm}i;0KdR zefG3@|1|IK?@N2%x;jKMAwYltflUHGk>6X#iSOLBd{4jDccDMsnD5JaN>E=35Ljt} zqmo^H?$El=-l_gSq&@egUFpq6as&tvAh1QC#=f1##;wnNIQ4t|KEMMSbFJLJFQE`1 zKw!TGu9glwKT-GC-MU|%_3tmFt=~)>notN3AV6Ss1imV%oRer7AD-25`Y&kA^|Pt( zJ4_wF;JQv=#RP7Ud|JPYx!eBz%(Usgv@5ouNQVFc0tB`dcu1bvZEW27{I_h|+OVIf zd+oM@-*1CO}}d1+JU)UYVG*kDm3he@%P7%e30tjqC^z zAVA=9mwRatTE@y#I!3!wW3J`$-5uwv>jVg_uE3p>+J7Zl_TM|zt?zg}J>i^g5EKFg z2y`xRh4jDmy5-;NIOm!paHlbD>vLzNzV9@5{DSK`ffX01Ys~7px~==JS^xH3rWM~{ zq(^`N0RsPfU&hvP^7fs&)%UwjOSI%$*L)}h2oM;eK+UVV=xaGnNShl&Oje%=5FkLH zN#I~=w;c0+sHyc~RjzAKT5_$r_Z(IVdP9H!flCQoGk>*y7j>uoV11XV&SU#7)1{dG zL4W`O0xKd=pO1YmvC~+%^|{~fIQO~-<<@+5`umfqe`v?~>N)`et1nRVBE2`U)4r_b zx&KL9b#D`e009C7`W3iuy56$yue#sVX}a|trvGlt_xYXXs@ntzte3zKB;D5Q@pjtx zza#B!tQVnd2@oJaU`+&C@9|joMCrBMH67n+yr1-3Eu#=1Kw!uMS5D{Z{B3C1F}AwXc@0yj&BY%C2y`IuP3hx%60Q68?dsRPJnHixg#ZBp1PH8xz+WYa?Z&)GkN-!>2vc) z%lP)8%e3GD0t5&QU!dkteOls+iI#odc6IBsov%(P1PBlyK%jSlA58+=jd$BUezQ)K zJ}mt{qcPv#=`>f}CO}}l1->@vpP1NgKi>NIpQJ5wa;*0@C3^w{`Vx3my4$j^KfbT@ zF4fz+H|AO{Uw5e%{6T;Kfqn$;o31Wu?(v$F<8J+=uBQYD5FkKcqQF<>(fWRF%ln^) zO>C);2mh=w*LU`jmR=GdK;SY0SIi@SkhnO}vX9@c?r~|S?t!HcAV7e?@C6>6E^fC! zpY-^Jseg^(r!}#MvwVl?S0}dQK>`E_^dWHbbn{;mllJGWkJbLa=J-$u5FkK+K+giL z_iO*Vj+4Dt`rb0$*XM#a?l@mvCqRI}_lMxDM9aQ!ySg7vJ9YnGg#ZBp1cohewRG}Zp`;*JIz(M2@oJK7N~pcz9TVdpWgad&F%3cz4Sy0KK%i%VTcqoZvQ>$@dF)OJiam4(^KDdh#kM+x=w(=M1h)1sqQB` zX&>M6*ad0hsEKRvAOQjd2oM;iz@5^qma(qte$6mbnW|U+(U|WaOx3DN1PBo5N1(1t zdtst=-#@8-eSUVEep1&{0tDt1xK);~&yvOP4gNi^)1>|Oc8~qroZH5JE`Hm_T+85_ z_p`&+O@IJ_B?;Ui?S441-M)U>$Lo8cPf9o!90Y{`fwdO6U$Xb!XZQxcp4aK3#I)mF z)%)c{ujMJ}cuTJD>ormRCP09|E&`9t^A{#s_KB0~o|!i8yvw>gO@P2^2-IArllB81 z>))k5%erpIo9Txex6R+^I9FXKK!Ctb0@ult$0ZgqHoq+G)OVv40t5)GtH3Lh_#*bF z+8CbW>pR}4zhj2&vhL@i5FkKc6$S2=r2Z!{?^t_&+W65`1d<1@ zt45$x0p~Z`jv*)QD~J5pA9uQ4R=4kyXt6yn^{-S5Dg+1+SYd%5OK#^TTK12V>b@s! z++>BFq(*=Mf$apG-Y6J-MCE)zVV)m2U?LYVX@%Q$%IbN!_SIJ*>En$n{T`$#wKL`*Yu$ltj znzTNeXxTqbs{5g|aqHD2k`)001hy4$eq;XeW73#1l*fK^+gE=0Pdp@DY;pY9@Ke%5 z0t5)mEl~3ZJ}z-lqGcaBsqV|u#uX9@0RpQf;QYq?`^QQ9%ppB?!;UxEH>d9{mIpe{ zRo4j+AkZRkqf|aI(Xx-6RQD5U|8_mf-ezbm0p~a7-#2dER}Ss(9~t~sxP1qo zl&4xe>wJhpfB=DY5vb$xze}|2Cnwdd_X*#0V4VbRmt;>%wCpD*)qO|WxXwDk$(6v03pl?q|9)}OzH&&9y`bZ5 zc$B`kSYD9&&ck>7g6lc~0?h(7AL-K)E&Iwzb?bhBKhV5(3lJbcpg#fUH|8HRCXFLQ zdTi9+X8GkF|4DvpvHXiKFXDO2Sa|{GH|F0b zPTEfn>9G%VycHjwzPHY!dykIu)pY^{2+S(*uq=3CVxIA*?rHn8vv$C81PBo5M8Nrt z`NoQQ#+kiZwypv1wft~8-s1Gh)W3YM$?7)&0t99hI3mlvCegCLoK*M2Y2!8tg#dxR z1)SfQe}6b>A33zgZr1T;`j6>*i|121&Q;e55Fjv*!1rb0dGASkaoYIRc{*WP0t5&Q zT)_E_wqxs-eapbN!JWEygFIPdaf{_`cWTgc1PBmVQGvRS{W*!2{pF;(XQYig ztf-N+2&{{M^BeQ;3n%R#hxXV}9dFRTnZCDp{!7QX>N)`e1m+d^#x$^qd(u8}-i}zF z009C66>xr|?by2IID9B|d%tIG-7}@d@)rmCe@(Xt5FoG@0*}f{zL;p)Z*Hyo=`4T8 zz38lU5FoG=0p~a7+XrslCl2-RKU>Pyvp0?2DXVF5{X*(rWpBD>Ed&S<7^J|B)2nwU zTK1ij>OOgp+36Gk0tDt0aDHR{@nO=KF|^0-KHp}tuS>UnANf`L+FL6pK!Cvh3w(dN za9(1bvFI~d{@eCH6+Iw8Um6^j4{FTy zBOT|e>jVf8Sd_qB(omhF*lt{y=JC&Ed7mdO>J`xr0RjYe7TCzs)9jnab?REZYwXAh1}0kEXe; z`{AAb{_e%DeotHbt;SscdQW?2WdsNi7_LCgyZ6GxPUFKg&((EF{-o||Enh%8l0RjXrce$?)!uu2B@nDvp=VtkP!X!X|0D+|o{8iS_ zvY&p!(tEVL72KmS*N-o+D_SN%fIxQwb?wFPC0fReNp=4;Z8*o#-OI1T1PBmV34yC7 ziwhHz#;5HbyJg3j|9NAszu$4Lx=w%qfkg{kKMl6t*Kq4tazWa-|DrplJpu#>5V(}U zWAfM5{qIhH*FBzkEmup&FG}o`-`3|gdQDcp2@oK#B!OQ`yB8<6?k`*ZuFqSX<5mNDzccWiCgPyTFUu5TN5I(kQd0D(OhxO&$3=0wZ5v9)fUIKxH#X*aUg}@5Z53)0AV6T{1rAS!t@l3J zIkAK^Zk~c8uT0i0tD7n zpynfdX=3yE(E5AL$1zGM1PBlyuy}zJ(qzki`6n0Og*|KWry6s8`=0g8iU<%O(4WA4 z(&h6LEn~>mx=-paZ9OJHfB=Dx1#X?bZyk$v`n#@Ita&?nEpJT6cgk<;bC2vbQT--B zfWVRk>Kw<55?lA1Eq|YrkC0tALFP;*S|w*TGy{5yx8&W^pSvFNPE zeDAnpi=HGvfB=E-4MAORy?Lx?{r#6P5+Fc;0D(Occum&RGEV*K9`$P(tGQQWt{+%N zC$vd`0D%<}sLz$2muMMBw$`ol>|eh^CQ>0lfWUqWY@`EQ_q99yUH2ln!hUypj`hE; zG2e&Hu`Y`eAV6SU1n!zd&ra+#e(dzz#aZ^@>w+au0t5&U*jIty$l7-rleRwhl6~#% zd@H|J7OydOYfjt!U3ITE-zqIlfB=D&7pQX_HDBv?`_gG1|3sGWd4AiKe~~3ffIxQw zr>Do$?0?5~Zr5FgU+M4@8*_c`R~Gdf0RjXF>>zO0JU7odjxT2UAKjsSPZ1zMfB=C- z2;4o5jNjKx^Yh({Sm{2t@xI1<-5Y)%Uo5L8K%gsu-%oF+8ArCO^WiLi)2=esSpozI z3|HW_>DqSt+ewcfHQZEo?b-bsbA8*cEvi6(009DHf$zvKpG`~}JEnQ;3t9Gi#*O(& zfB*pk1ePFB*ECEsCXMUV9OFID$@dqH`TpV(%r!}X0D)B%_}wHn9xrD3d2*JoaY-RS zfB=E{1fG_~TlT|8&$qgLU3#N2*ZMB?H6bd2;Lib*I1IxKm>Te{PmJ#&0$7oOF)>0Rlr4_^x#5yu?mp$xhGxPnLB*+M&Iw z`a^&Kfz=T>HmU414sCtzp&h4w@5Wr;(Q&T2PJjS`{Sc_nnf^Gjb?j*QyT+x%_M`LG zNq_)>6%qKlTE>^nbw8A4Z?GR7w@v~C z2oP9#f!|4no5!5pet%ZSA~$Nx_1x6=8C%CMxULf*urC62j-#%B+ig7A>G_vr`D#ZY zK!5;&c7a2)NZk))r~T~K=Wg7-n!zmb?8aPwdoVrM5ds7V^d<1XbhqwXzI61 zyS46Q%TwgQLJamfy0RlY;JS3g`Vq&K; zWvA!flw}X^AyIuKK!5;&ZUk&MRM>XxaB}uKO2R z_K+bYq7MWJ5FoG;0yU|rW3Dw%43IspO%h9L0E>BOY*WZK7$ z9zqiOK!5-N0xKi%wq!Ex7*zG{*Ky`Q)|l(-I?h$s2@oJK1c5836UQf7#+l7^&&#sk zkx&Q_AV6Sxfjg(_=6&gIzyHVdO%Jl>yBqWUwn1j0Qv?VQ=u6;t)7{<1mz|#fxxUiX zTLJ_K5E!t)bJMq-#+?&}z)OcrN>v%Hl-)Cmo zTkX0Q6$lU@KwvCT``u~xu~o0;Bk%cMA+2*h{lpl`PXYu85SUq@?p^-EM9X-yxo%y1 zclVjsZb1SB2oNCf6@fZuzIlwYVXzW6XBXzbDIHeRyf<5di`O1}pIK^lZC*>ZHeSHrPyd@7NO>bFJ?jD+CA-ATYl` z&AIotiAm$iG>@H?Wp6WoH?%;2009DPE^xQxKh3x^uJg~Gd!5{vZ(Z}D5FkK+!2ANY zOcS3-jK`DKpZ}0$>pZnWfB*pky9*qbDlPlj@7}%1!PaC5J^Ww+nY7*OA5=}PN&3m!DfN-RTw009CM z1->PZo}Jijtl94QKb_dB2MG`$KwzuD^Yg%V`_f5||KipLI{Nz#jk%uGQEs|QfB=CW z1g@PO5}SmOVj$009C7b{2Sfo}M(eZ1>nt?A+X-pZ$);T;D$E zY;=wQ0RsIBJU(6DZk*Ze@y})1Z|pa9Jtshbz|sY3&ZFJ-rJJAs@1^%>xhtsiGn@0- z?e}{vw>w%VK!Cv73fw)Je<88ket6RJbuC_k0-` z|2mDietJNC*A)T;2&|gGbCb|^W6f@le;~_VbJalPLx2E*1qsysm(EMF}xlHr((Y+?B-vkH{=s=+Lz8RbM+jafNtvbk27YPs`Kwww`4^DSBk0-nR z{@26mesgcmY|Qui&1lo=58*{Dm>k0t^1PClo;2CLp(pWRiWB-|Due!XhX_){40t8l2;10=YnlWZv z=iQwfysa_c@9aEZ-6ueRz>o#5k_ZnKYwS)$>|#b0tEI^;BT_-mVN5|_OY+? zuKJ#hx&GgIS7>Ew+Ij*uxbKFC86=YxAo_LW!bB*8i;%d5Fjvz zK;3VuWnbF+y+A(Jm~Y)5Q6WHp0Dg4o$ybpBRrjtv`RH z)4X+?009C7_D10TSxw8>@`}Cb*3#C}I=@xV^QkWlQNsiX5LlwX*QD*wBwEI%aota3 zxf?98Z<;1RfIu$-?@33;`^IU0ZuFAagnmA* z!!C+SPyv;q(!}Rq>-#hLhGFi^S#zhHJ@fA8S(N>@7_#hXHB$vyw-o6brqf=K!5;&B?;Ukwlh5cRKCvZ5o!bo5FkKcoIu`Z zqU)TJ*XP}3+)5gG?pcLe)1>A5sW*xH#?WmiG(qTdeg5oADM@5idMoh4$ZXoYH1733#BzC_w?=>f0RjX@ z1-=zejGH^QdTzhb6*TmH^?vGk{IEuV009E45y*QWeLrHW`DoJfdA?y@=T{>@fWRgS z+$)NnG)9iT*7`BACl~6?W4km01PBmVoxs^*)1QnOor}7Be{3vw!PTX1%LE7zAkb5R zk3?Qw=8-|4yk=sn?e>xQppGt&uV}SUc@rQ&U`+(B7fkg@2I#xV99!~rE^@~bmN$bsh+S6(retq{P|4kIYJ{qfB*pk1A)B9Ue|df``vu7V1tj>E7tn%25Xcu0RjZpP2g@(P-UJP z?z`;k44yl3&GY8-Sm+N#91)S%b{x)W@bxM2{MRGi7V(6L8${&sY#IRq1hy-1jab28 ztm*QY<5kP;OObq+ItP6&+H$dSCqRI}nh50omd=P6jLntDybhyAfB*pk1O@{C6kk;4 zk-HBTZ1C~Y#achzV2x5HK!CtH3cNass?1e`zIn}(D=Zi!uY>iVh)+dqwJ&3k&$P$i z#5&#?k>?wpJwhWufWRyQ7mJ0ajW@%ue{q(L^k|t67VF)=N4ZOd009Df_h*Kj5+nVR&FJrw=jmUfFY6J)ns0iekSs9OxtgO6;ee?QSm3nX0 z!y2SSfB=C_6xbz-&SQisWB8zN-b>c?1~>6tqhweizYYt{Uz0^f`K5BG&cxh*{64AI)vr_j&)3oO|7~BM>wK z1Ud`k`C!w=m%-~fwzk}!8_5r9>GF8bmW!1;0RjZpOyI&%&v6l5#_!QSc|8)1009C7 z2;_CbN9Tx1-@mGHvZIRix;{wbKXB<2Ah1>f_ls&K%~4yume-BSdoXRM<$Un?h*|fs zY?WKr=YJa8zQcA3uq*)r8zu0=sJ83)lKooVhx*83t$)8!?*zpXAV8r10=J12{}54` zx3X_8bIS;g009C7He292QGR6(`M1Wo@;W7zdh=KUjQ{}x1o|WJmPn;Cjt~0&AeNi; z|96*)Wxq1xb_d&^*W(+vQAaGQ5g@Q30-uXIE91_^8+JLkSnIPIu2t#;2oP9Tfq#y| zD)ZK$Zyv+C_qw8}ivR%v1Ud=ibv6d`LYK$WCqRI}8Vc+g zHRZmF!8l!ce8mhNcaCLFoN;@V+$w#)9r;{-hFUB_fWYPmyf;d%j4Rh}m?n?=t)1PBn=T!H*Q(O^#K@|gcqYPlU6$#L z3FI}HDr3*x8YcSVVy&NSxK^nXAV6T<1@ic!%KSCxdt5Ac{&mMu9{~ac2y7`(x#xBs z$GX#&YwG_CkBJlq^Iw<82lc-s84@5sU?T-`F3SH=bs5V?`@C(6*u!UB@91`x@qHfS zmiN-q2oNAJEb#dFrZNUSV0huizRrEtm0I(DN*VzI1PJs~V8=-70}+*RebD!<{VYjV z1PBlyumpj;j`v_b=<;~3CFHcIP5e!<);vB~BS3%vfqn|)F}t(g8{-aJl$7V~{UM^u zeAt&hdA!UY z_8u|1QhcA+e5$NxTHjM+ecy`sOvFbbz8LYth-kpKY#n=bIN0O&ebWWT)UQ>*Px zk$9!n=eJs@ya^B>ut5UviCQaT`=D>$e|OOKh%c(=GY-}>{Fvu{d?Ml@5m$`ZIbvMP z(K}hAdmugiKvVv&ug6RSA}|WKek4I009F17xdZE&-$tlH;M&58Zo@iS-!qab;J4-Ah4DKw~DGN zW5_ETSNL(U-d!56SNa495ZDBPy`spUL{#Rp?3Z zy2V=EpQ_;>w$up_*eHQNi)t%#*`RM;hdt+p(`Q^h*OTXKTrOfB?RK$}>i_8mwdCUw z5xdVL5$hm8plN~YNA|;G!?ds8(sZ>u?2y;!n^xoS>-j%3jQ{}x1o|(K`zdmN#qb#3 z+<~>vE1V$c8Zv1%lm@Ndd;oOJ9E+q5ZG*it3>%-#<4-4_czY< z*~*nXt)FVRR;d#p zKw#4Z_Kbpm8c~_kX6<`QY$va8zo?e`OkNN%OMZDB`n1pp5ZGLSi%02|@#B+?Q+>Et z@8uh>SNa495ZEMvb4Rg9MO5as?3?Fj?;oKNAV7e?`U~W7o|Spx0S%MvTdehK4c97l z0t5(bqClQwSeesi>HGWG#vPV~`@$LPdCZdXvl#*e`YDk2C8~^XhxN0J&RM;)SnoAE zuUSU|1PBo5gFxP6t}?F;`hGc<+qn+~$bkR>0t6N+@X%QMVC?Vm`1cFVX0a+hsnRwa?!zkt5IJ$m_;bbIoJia#@W4fz1>+N0eO|H@@9C(;JHQ z-mvj{rB8qWflU<1dqq{|wn5*PkI~)4pR<|?5Fjv%!2M#O!MNY$vGwbEpH`^%=vhE5 zLx2DQ0xK2B|ZXKZ*dcU2x=x~hb2mjD3*1ePLj_t;8hUU=G4vRd3mPAJs->&2yE z%>)P#Ah2M855)Q_^V_t(tKPr=nPNS^i2lny*JQyzQmZFGpdgU<3Ys>q4PMV{+O^zX z6v+>2>GGKOYSIW0AV8o^fq##*yNvb2ea?tw+S_cC5FpT|z(peM6CQLAjXjg5E7b-2%!SDCPF6Ckis zfsX#@xmm?m(?=rC;_7=HbE(^lB?*MDB9_mrO3B0T~G2oRVo@Hg@D@EkVl*KeG> znWenCb8ID#v98pR|MT-VTssC!c_Z1##t2mY_mkHqZ@E1ulCO-7cWJp;xf38jfWQt9 z3xmqIuW!3v-}HVbK!898f!jr&%2@xx4(sf5m&*T!^1ObH009C7+7;L-QqN1F?hUw8rpx(M7RI#tH`mvmWakNX^1tk<>6d;G(c8UX?XItW}n z`c$q%KRPF#9?S39VLQv{lGltM&CmDiW3r6*kZo*^z%hmK;&+X+Jh@P7j+ystyk6-O zAV7e?4m30< zrB8qW0RsQOz#HOWk)O@1d-cBdZ}@E|K%k4jjiOU!%zj;$mG-#Lw~O_jqsO&KjQ{}x z1iA_A9o;I&G7ry-@94IPrS&>Kwltiduh++8X>TGM+6aN46vm1?{loDIaklrtGTfH?PO`Oi7dWCgR^+wJ zTWybs#4Ep}4{o(kc@rQ&fWTPt=? zw^Q2KOutsFcdxN)@gxBP1PHVyaJ5Kymivsqr)PzJFY>9(+xoWS)w8#nbQ%{psxVgM z*w}J=d?a5P>+aWbv2rIsfB=F275LlusxtoT+n$&G8~^)u_XPn069jG;uT{qQ*H2hi z3oqr^SgCi97K)N10RjXFOccoDl0O|$8UF`;-#T&4%YX5>8S5C-<8ik4!7|*I|8BCy zbr$$}VXQc%afl}sYR%u}do^CK^a&6kKwyU*&L0TwOV{7ewe$MyZ2yMeb^-*t2;4L} zRmPoHcUftV`&5s6-L1#9NR0pi0tC7V930&$bKP*?yslwi+CGuUaBjX{FOR;w&*ZTl z0(ot{u4BYWjhFniLak|Xx5n$0J^=y*2<))K8v>#0Jf~l~R`zfBZ6`pWi@>d-Q)R4w zd6$*;xX%xZ_2%^)H39?(5NKCm?@0Zah{{|y-1p>IwlDj-Z@i5<)#+g4YzqGuOsO_RH>CQVxE?-v$o&AM;by9y*kfB*pk zT?Gz_j>B_U*RSu_bp!elAV7dXa{_mXjJwVU+3z{cRe0uvk1f>u+cPifI|2j<5NJps zkL~(KL}iZKs&5|ewfl-|zs?M`Tzkbi+dKgRs}rbPx8ujFOLHz;erc>_tMPl>^S7SM zR;`2p0RjY;EpXY`;3*N~#`a0ieJPgNY1zrz9svRb2rNw?@2@v$9vFS?=}XIOF&jF* zP;d6t2oNAZpiO}%M%tru*ml1E>lHJ+r&v#3d;e@J&e`S(5Lk`CF0t9lcz48V(wy5? zUs!J6%imnfWWc@a{t7qBP#P-_B|uQF+YKz5gVar!;Qyn?k*L zysk!o009E+30xskp5@rCN%LV|zvbL3qPSjcw{k3Y*72?t%mHf7j0&uT}a42oTsrfjqYBvk`-NYo3pJukvNLv&RO%9#O61PRmZz_6QK@jlkZK zNoCB)F{b7AuaSJE-rQ%b5gJ910t7Z# z;L%b0VC?Vm_~3@E^132jY8>?WX2Z2god5v>n<#LxDEg#`!8pE%$6Wt4BbL$rCN?rl z4bNLfa<)N$KyL-|8hw?q<3qizq+4SDRjfCU1J(!-AV8oEfrBH>%A7XnoBQtFQ@o9z zu`CG?Ah2D5ykGcW{O|I3kL_-7h09;4SnKCjn5#__AV7dXT_FEQ*JUo-ZlAnA)1vor zJTSJA_d~4adU7nYUxY@0z~&0%eN-!B$J-mH`bx20*D7iJ2QGaA1U5$Cf>CLnmt2|C zvTuGKzD$HhfB*pkn<4PeQD$YXxI@D%mn+u#k%nuPIspO%HcjB(QE+8G+iu@HkK@h@ zK;9+R`J8RklGn4+2oTt8ftyA7l`-zMjdLAQtT*p#q!A!MfIz0t7ZkApf2j%mG~<^Y5irTOMoMrN%*@ceYxnya^B>uweput&tNV2IF_v$2_)c zyZ7sORjgy5hWTCX(-3?`bU; zDt7_|2yBo*UK_pZ*go9vYq8wfHpoe-1PBlyu)_{{KKk%nFzxF+-@Vm#lSq78eZ#N6 zzSTnIO@IJ_4HC%f>V6_(c>M1A^<)3X>1{JEKiJN(vHT+=_WYmqRUdNy%*!H9j~J|T zmdE>7H>^Ja0&6L7�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 z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs zfsP35lXe~{7_{^=@b0wh4MXwjJb&p>ydcjHPdqj8*u=vU_fFg;aht@A64y-ZpV&Jg z5g>IgT zqWmtnR${M&M1TMR0t5&UAkZ&?@;70>e;91bXW*=S-cLyUPvRYkS0tX3cy!|ai903A zF=1Cq?2?cO5FkK+009DB6R>~7w*9tj+t1U_v-5@iN}?R!RgRl_T%!CAI5<&`i`p?E z5g=J{Q)E$f_?ukz7}at=v34y^qCDd&fjeIS=iNCXHFAV7cs zfwl?QzhV1+Tej6#(a#^{3;o5!zbBrTDCdCOI`Q)fi2wlt1PBlyK%jjB_HX$8vx?sZ z+fruP|MAJh>l241%C&)Sm~ifU5F`Qw2oNAZU?T$dZ`i)ymTmEM_w#%CMt?N%io{%EB=CH^RJ+r;G(5&;4P z2oNAZV3h*)Z`i)yhVAV(_3@m1p+A>+Riga9zIkHLghYS<0RjXF5FoI60sA-n{%O;1 zgKcO_Ip^c3M7iEoxz_K23CDZ|K_Wna009C7mLg#PhVA=p*rslKAJ5IV`Ll`FBp#b6 z$2#qkkO&YUK!5-N0tA*TVE=~SKW+bQunq0|LB7^ypT~<64@ul0v2#KqK!5-N0t5)u z3fRA4`+gg?pS#+}a&Pl;o=3T_M>)=EhlE6c009C72oNAJzkvN4e*bj!w?W_AeP+Ja zgY!JfJuB6A}Re z1PBlyK!8AVf%_$EAGQni!T;kndov7C2Qe*2Wa-Iw1#XfyArT-zfB*pk1hzq-{LT05MD6z3pKSw}009C72=rFq@bs*9JM5IKvv+Sr zbd11cfqk>6Ts!NYiE<7|IscrV5FkLHV**c2duz8Lj>|gbxDAN_fjWUpCHrj>w|~lg$|M2=mM>6__qs>od5KRX z%5hb--_KR&FMt1dO5z#`i2wlt1PBmlpFsJ0>OA+_E5}?&1PH8FpzKHd^~94BA4s(A z{EidSrl%#Ynve((AV7cs0RmkRI5dr{{d?${S?6+H=$tkZ=(s>RSE^jo>P3mRo!@am z+Vr1^2PRy`7YilQO@l+Dp9tzn|zN~ zmFK+FU(V?$_fL0Ez92{h2oNAZfIzDRK9ttfZU;TSRXxxc0^2RHXS#oI;)ujN$7|Mp z|7Ybt?Wb*VpN>FC1PBlyKwtv`4 z-CgJFFQ)#7C-zQA1PBlyK!5;&HVE7%ji}uoD(B0Vzo|+D2((L}98Y!Q#9@h#CpLMk zSGjiYyArogIL<2w5&;4P2oPAKz=Kj(?KXb7cCAE!K)VIX@9=URtN)uQ_s6XLo-Zr^ z_fq$>6IV(|1PBlyK!5;&O$)p)4XEADDaUL`1PHWS;3{d}BNHD);Y{dUSVqh6IbJyH98Uq=2Pr`|UtZkmt? z5FkK+009D<61a6LuHClzde$lDzDooMbVHyVTlI*aRPhf z&3h-_nK&;|I|eM8{|l+J+%LrOkU@|L5FkK+0D-j$+$A;DZpR##b#`1^3sppbz$yf; zoI?L1acrV?3|KUOxn|Zo5;sps1PBlyK!CvV1^zrm*3Q>&S$;E=NPxhG1olt8k4k(x zQ9Bkan*YSq`KO7pzeOTIfB*pk1PH8Jpxpm=o^76TZ!?Jifqn@5YP#{F#Hoozf6vse z|AEx$n%_Z?2oNAZfWQ(3_DNZ%C2Hp7a{R%ym)HhH5g^bGfpYHj;fZ<9>#7+;M)RJM zIuA?in~(?)AV7cs0RpQOxK9cn-4>bk`oC7$AY~IEun~cB&D?_%D3d@t1TLLs{7K?7iQ2JYk^E&p$K4aI zffodc009C72rM9QnXG$eqGnz`Bl-OeashO!66lD)71GWpC%&Gj86y_SdwS}6Mxu;O z5&;4P2oNAZVA%o>O@X!BDz961Ba}ygKr01)Ev+i|1wT7cJ5J1-|Ffy)IDdOx_ara-UCZ^d>`UE_&zN2kAV7csfprP& zmWobF)cpSWaq?ejT@6$Z0RkHrDA&$?SmKyO%~-KW-p{8l*R2YIM1TMR0tDs|DBJ2~ zo4sZ({#x=ozF-b)s}Sh8z}3_KXC}Uts2MZn&0DTp^_YbFkOx5`K!5-N0tA*K@aU9M zyKVBUrPQnt0tC7wQ0|fO8;NqCj@rMO)Q&NO{2xzUw@XL_2oNAZfIywVYm$91pEiBG zM_m=C;EwF!D|J1}OiJGxv-n{QmJvU8A1PBlyK!89qfg2@T?Y#S+&5D+b0D+zh zl<}inr*<9JuKHT)Df>B`KNbXu009C72oRWC;E1eQ`}^nj=dR6)1PJs+pj_kb{)uwm zjM_0|p8Q9qo*N`20t5&UAV6TYz){IkJKx@TcCm60Ah0C@zmR^uIB{m8b}XsQ|G%l@ zP6>$s0RjXF5Fjv*zyVq5{6x(*$g#;^u2&-wAV8pu1?Bfh+5b>8j?9y{j8(5rTrD9H zAV7cs0Roc+ek+S==h}anT%08Y2yCgqe(Cq)6DKEX$CTRq?@1j8CL{s`2oNAZfIzLl zTe3p!w#OZ7E0Lc7f!+&TKRtX!;+#b7m{ODf?37>b1$2poM1TMR0t5(LTwv$Cb$p^` ze*IDMUp65TAV6SLpxmS5fr&39YQ~k?yyvF;mn4iuL68U#AV7csfyM&2PR`oxj<+=~ zT}A=~woTyj>F{$CXC!LJmYV$EO8E~>xMpt@5i zh6Q%ai$fBhNYsumHTlc$h{F=QCnN#{2oNAZfIt(0PbE{$_C~qi*j1VoEDr$!TPtws z^!%{IX^EQgr8aN5W}a*I20J4lmCR2U+(!Q5geu_+#k4RE-iU){nK?l5FkLHi9k8d=%_^PSW}b#11bLoO&TK) z0RjXF5FoI%0=uQ>_k~CAV7dXTLqq) zhSmJ`DS2<-*3M`b0Ro*BI4~`LccOMYYLdTP3+oROuDuZii2wlt1hzup1LtKAE_V}%odyi!|Sa}2p5FkK+K&J%CvD3Bp8Gm)B zdZ@7k2y{u{;52qs_a^*s$}Y#WN(2ZHAV8q+0>6_EPWzkSxMjcFcNG02KwzT+zna?r zD=}{TS@gX(q}VI3JW{hf*x7_RS&l6<~ln4+YK!8Bs1g@VBHJJ~G z^E|q52>L^SK&u6=n%2EFF+2_}<9RukZ+kV{2_^4i7Om9!1PBnQ6xbvA4@)fjnpNdoj&fg) z9TO4(0t5&U=!-x(PqB6z|9XAtynYZM&?$jE)7rxl%ihlaR>~~LNl63<5FkK+K>r0k zoi5h={`qYGN%W8aftCvVLfTdCgIY6YHOYHq%DiGr`>a_62oNAZpjM#VPotc7-DD0N zKwyai<=V7mn|v@PE#vWml=sp^*@q$#AV7cs0RsIMDCc9;ZaW;*Uk*JZ zK%fHx2z^VjxNWl+C zoRXNf-Cnz_T(i$PYC(_)5FkK+Ku-ncIlimhw?iU8fWRgNE}6>zHgSHU_BYP7{4Yy+ zdnY6U1PBly&}D%Kr18_{yK&2I(d7-rqXo*85V*yGa)@w3z?_0t5*BRNxYM zJTozFo}2XE3+WLcK%hke|0iuJ=ax+xv*vmKy(w@17WGk62oNAZfB=Ez2;48l)NUL6 z%5th!3IPHH78ckoB|IZ>ZlZQ9o0Pwl^~8j0bp$~oK!5;&P71sxt)4W`jeEab`_VB> zo&2xXXaclL8w3dSOJJ9D=gEn467&Av8C~z> zly$3wM1TMR0tC7wQ0Bz%CPwGAX|JEtr4DK<0RmekuxEOEcw(9N-*YU}R(*tYmH+_) z1bQxTxAbq?Z=G?=uHSPL-6KGty8^$IrhhCkZtR-py>g7#VF|~01wkS}fB=Ec2)sNk zt(o_}+L@kdC;pg#ip zq$}mV9J9u=rpq16)Su6Wo)92FfWUSOye{2uI{%k^$89&4-V-3u5rJ|p$EOoD?4Q?Vzr>_5t@iyBQr3+|>hO{P0RjXF5a@eyMq^V8k`$4{|bfvB(yKbx~1RwF=w009E4 z6u4IkubJD*oOY>IHb~h72oPAY!0)E~WgW{@?n`u?6}MOM1PBlyK!CvV1m2pWYJUHe z{1O2I1iC6vuG{g?iJEb5THaTttlhhcq1^-s5FpS?fql}ea}v|$uhC`q?xloI5g@Ql z0%f1XvW{gsJ!KuTO?diBfB*pk1UfA6khFdD_sz7|<(}lbb-2HpPJjS`B2cbZRmQVv z<6YBbA5S?~N=O6<5FkLHEduXPLz>QGC12TJFA*R>pz8wVxT7NyHRIo;yceXL!x9n! z0t5&UAkc1s%cpr|-kvn4k9+_2?e3D+5gobXQ<6P}~-$*$(Zd9vG1PBly zKw$L(k4_aebJ;1$@4mXL|9?>f0Rrn0xL>MS*7d5&{XKSBPqWoRfB*pk1PIJ2@X4%K z^ZTb9468SXni_kV*G2@oJaV2J`>PFdsTs!8uXb%}K=iU0uuZ4lTyjriBZq;aq2 z{c>-QtG1z2+CYE+0RjXFTuk6*d8cMxFL|$Zu~NK2fB=DR3mlZ@e>G7%9*)cZ4=HEo zZgXfo0RjZZ3S2ku9xggzaBTjc#?4Wa-aC5i|F|~^5FpTPfgRHPCnU~KOd9{1zVDi} z-To|SJplp)<`MXvtmOAk`wgC(|EJoy{!#OMAgn`x0D+bZTqfIN)0RpuGhh&9Gace&aRg!}{u5a@`&UDD3)Cl;NnT$8pV|KXZRfB=Cd z3A`@lEIM~sznzBfS<+`jF$4$@Xq!Me@8X4tWz0YSn{uwywhn3!0RjXT5U_t^IrGCZ z=9pEKajykF8&)MifI!;?uAK&cKC$TdS&k2VMB6*7eFO*)Ag~kx`!^P!Hy53ESG9gQ zW?|Q*d`c8TfB=DZ3OpdqIy> zI;NKU?(LM22oNAZpq~QvZ!A7nE;`q)a{VXu^JA-51PBngh`|1NbyQ-}@${^eao3BK z>;(Y=1iB|+|Hk6;!J_lYs@K0l_db?dOn?A^xdiT=wU%+d_P?c^-R5e6l?V_ZK%ngc z_HXq2_fNS8uS9?Vfo%{d*W-I-V$r`TotrWqn2-n%Akb9-`!^P!3l^PAR=xgxy87YN zZUO`d%pq{otn=-}qGRg^QpUb>)Nd661PBmlw}AZ{i_ejZ&atapzZ~bVN4r0QT1S8Y zfu#yOBBd>Q9(!5;aZ7EL!Uzx`us#9%H~PJOUw%8hY<(XmH4z{{pcMkwNGpy_Ec*A8 zPo#{?wW3EFL4W`O0?QJxe`E3aanbp8)$8ASSsxbV5FkLHBLeqKJIl4E79C%YNEz-& z*pdHq%_KnJX9D(bEI$4(I)AKs{jdD&f7=rR1PE-8z@^gFa*c{b$JjE4UUPfc^ppSr z0=*Zoe`E2vanZST)$2dC_n%@NBtU?`#RYDbw@yhcI>x>#W$beC;=MzF0D;yD*uSy( z*uUu9v5xhx+S*T`h7lk@V08lJnzXM-EIQ7foHDMPkO&YUK%n~q_HQgcFD^Q-u6q3s zcmHFm2LuQZm`mUnvep+9i;lBzP8sF5lth34fi4Kxzp?nZzv#TNj`bhVg%6`P5+Fce zMFQoTwC5)l8E?xyJq}t?`xHxn009E)6R>|{vH5V3xpZCYo|BK$UhDfvsfhpq0<99* zFRl4tV$m`8-&2PB83jQiK%n&k_HQgc<}W&DtYiIuYW*is0|^iyuv&rpruZKx78!HD zll5=7+GZ-9009C7RxDuu#$t2fBJ=1v*ZqwZe~uJSfB=Cu3+$H0En~iWZ_3%T%^lS? z0t5&|;0lRyA0p8$gXib}tmgMYxzDadfB=DQ7r0{p&P>#dpQCwC%lf~v?U4FUfB=CG z3*0nq_uHp?2LF@)x6wIy+UqBD_%o{M1PBmVhQN*~ytkK9Dl@UPgnIL4W`O z0tAKxuA1jf=Al8Ja$S~kuU&}%0Rr1DQ2wrUYGN=x&hz;FtY7ZmClMe(fB*pk>k;_N zR8uo&zkNN;QVRhB1X?ffq_nVR{2Z6J+}CKI*7sBc2@oJaplbprrorRpok{QAzH1%S zUIGLNtVp2TEBxz;N#kXc_se-8u6?nh{~*N@AV7csff0dQ<#m(!d61`EQ*wuqGQ1=} zfWWp2JTM(UH!&C^=XpFj>z8|bNCXHFAV6SQ0{@zVYUZS;EURMW5FkLH2Lk2#jGsx= zjH9D@f0*?T?tz6a5FkK+0D-m(lZSR!!5gKd#-fB=Dh3*0u{`$1yb*g0$2|7LyXarFChqIU!c5LlPMuce|{ z^Um<{?05LiP3px+Us)7d5Hi4 z0t7B9uxnnvDKTyQoVD!qtpBSQE!Han1PBlyKwyai<$R1;^YQTVPb{%+MG+uCpictV zNoP(@43C+$&p(p&_wEylz7QZlfWSrsKAKu<=AZ{{q?IZqK!8B|1$Idj-T zGVOJ_MxsQ3009D%19N@4PKw`bmHQ0Rl@EDDzOwymLF8Me^^|e7$yHcFfB*pk1PII_@RwO(2 zvzC?dcE@dl(_aDv2oP9`z&BFLta)a5`Sq7lt3n76Akc4tvXA2>iQ)0H_Ide@uz$aq z^o{@l0t5)GRp2(Mt!6$xX05GL836(Wx+`#nH2w35nlW}XZ@DIV`5h$@AV7csff|8# zCiCc=GVS#PY6_Q^009D9EKs)1k4Q`#Q)ewJ*9F{Xiw$+1009C72rN_JQYmcK+&jFy z++*CmZ0H?_JUoupK7V?jf%J_40RjY8BJiw~S~K4~ZzZizC;au5FkKc{Q~70kTt)5etG>(R3iZb1Uf5lxwQP)M9nxm zn)eZ%?Y)K*AV7e?CIs%CN=N6CX|Lb6iAJiE009CW7AX5T{vk1KY@N02%~`+PyIdkb zfB*pk1Qru`TUMVn?+!12@M6_jn*ad8#Sw!GZWLn1(c009C7787_{R-ZQCjxHpOxkb0RjXF5ST3R(JY!ar;IMU%jBXgAwYltfhhvJX4yLvqvLAR*B4}6*U6Xy zY!Lwh1PBnAA#lwsZ#wUmeBVoyYfVZ72oNApFL1rAQmzA1Gwu%OJvr-MEg=ygK!5;& zX#y|J!r}R2*7GM$E6g$i1PBnADzHbEejqVxtev#{ysZ11Q){r0009C72oRVgQ1(@n zV}d8mv*X^s`lQ0VPk;ac0y725IT)uU#*ME{-uqJ4E%z;#2oNAZfWRbyKg@zAbIKr3 zxxR`-fB*pk^9x)etJa=7HyDGDy5a^4*-=-r?=GsA?KkrM&^@9Kb0vi;#ZR#%f4IhlH zwU6akTh|NR;D4a12@oLAVu5lTak-{@)4AoWmA+;=(6PznJ81PJs@;Qi@O)A^+2yM534uR8Ern{2$g2@oJafI!CtE}!-e&!e-Rf2U*p(_8`s2((?`d1>IR zv3Jt)v$O8a+TKC!BS3%vfwc?#U22>(cZ_@g;cIW93JDM(&~Jf5(!FyNs_DKW?5FkK+z-)n!C(H0WI_tS( zg=d?}L4W{(8i8Gs`Q3?GJ4j0RjXF^jhGK>D{C`W8C{k_F6;d2oNB! zIf197>T%<4llQ)xb+5I#rmL9%0RjXFbVlISX=#(Wb&%(Qo#~l|5+FdJI|7$TQ$LXy zjJ36o?nT(0|7$HJK!Cui1+I|_YUYuzuew3XCqRI}77M&IeXkjlhw~nnbsfjF#UCDB zCqRGzfkpyPOs?VibJp``H7Zpm0t5&Us1?{hE1Zy+H4aZ&{+!whP%X&b70D)Eu9Fo?ZmzXpT zPkaB2toKW;?w!UFAV7e?It1RBN~X;hqs#8Ljz+12009D9EO71g{j|jB_}k?5`C0GI zTWqK61PBlyKwz4{9$8rC$|iGa$y5GzCJ`V&fWT@69+l#oj?1I@zL<3{x!UF_od5v> z1X?a|c-l8QKTLc5@Rs*S^9T?i&3uohdeWFY>-};qTZsSx0t5&UxKQBPc{*$U9A5q> z7q03V0RjXFtXSZhDgU&@@HpJ``S-KlwN~6d#SEh0dG zK(7VLaZJZ1YR2k8-gC3wulHI<=LirWK!8A2oNAZV1~e5vwV1-ob|k1&q^XdfB=E@3Oq5@%^II4E&sdqHdSo|2oNC9 z0)g7=8(zHyZPo+=1PE-Kz@h1IxvuP_?f7Z$mup<@ux()aOMn0Y0tChgl>3EGn=?n3 zmHUxP1PBlyuwH@k+vQ&qqhoT@*Y{a(bJa$G009CU7Wntn-*k>B`EIr0_Ntx$0Rr19 z@SJqKX1pHG`={HArr!hz5FkKcNMOG_AD$m)JwI`1T~7%RAV6S!0(+;b&n0G!)8m%^ zAnUmo$NK)S)I@*)flUjPbN9y02b12r|E3$PegXstY^gxG-}rkIlg8(1@Bb+4-DpeQ zbejMH0t5&Q3zWZmO`9`^mzC@D?lQcx=L854Ah0%pMXuBP@wC$Q)z|i4r6K|Z2y9f~ zFH`&QHvFvTf4-fSCP07yfprQzAeD{#JJ_W6{(7B_Qx^dO1PEMA;D&kUti+^o zdfNN1zgTJBAV7cs0Rr14Pa}^4`Nb-gnI>K!5-N z0*eUzOIB_&Uk>uzVUfzLOMn0Y0t*Z5m=bFDO%KNK?`GXAFWiE<0?K)R_e&g+cu(T^ z#5svUn+A{N8p7q={BmF1=Oyl)`1yoHfB*pkbppSV?1Qnj$zvIJB?1Hp5ZJsx+27n` z+#bzycGf#^^Uc=+0t5&UAg~dEa=nt#xpCU--`z+nRZ4&W0RqDUQ^)5MgYmiM@e^6kInitQPf`T|0t5)OPT=urQO%tBsMhsBg9s2Hu$=-2r`zWz zYR2$E-p8zfY=@M2XyU);Y}24^lOD^yjt?a6n2-n%AV6TUz#dsNX)GQ0{?{iLWeEWS z1PH8I;CiWV-g|Kzw&u2~jsO7y1PHW2;P=vqaldmWy?1yU8m$ck2oNCf6M<*s-$~>3 zwD-%kpvrHjWu?2Npkor#>RjfskEgENF01j%AwYmY4+YLhpPG)l<+>&k0RjXFv`66K zX-d;Ed^q2^S??z8>4ugNAV7csfwc&fzex?xhqIpl<62s!5&{GW5NIN>b25E6F>CA| zxBRnNZ}%pZOv!VlEc@5QxboNW-rH06y6-14g~K8O1PHW7pxn=>W*pw9H7(Z=0t5&U zC<1Rv)QsbUykE|GDO8PvDR$G4?z z<-WQS0RjZJUEpN_s2Oja2e<8?82u+epsfN=O2cZ#^FiK|v)+Df?UZ&AAV7csfh7x^ zmGTC2;H<|VEV*vQ5g{d%o@kXEidO|%u1I@hEFEOt>32i%Kb<#F{?9{ z6CgmK=K|&WgEeFGeS7Yqdjtp&=&C@u-(KxC2M6Q->$=)$?Iu8g009D(0w*T_VE&u+ zSk80Yv9f&G2@oJaU_Al{rJ5flW{u_JmfvMc6Zgupa(%*a>$UN{_ol78PU(+D1PBo5 zyTB9E!J6^;5Bd(Ge*_2+=&(S!N7B6ay}Mh7`>p8&2oNAZpsB#I$yoFI$8oVuW#uD4 zfWZ0%9-As_#`Hnnld|5vW13rz8GHAfWe&>T#N%tz<{ifL$6Evl5ZDHRN2HTAV{e%| zBmx8o5NNN!AEs$F;3pE2}}009CW7bxf0 zeJIgnJRi;TcVqhg%sI;%EqnO&*(vkOiKBlS4ALF)3S zf7=fBSCa`4AV7dXQ-QZ6V$Y1tRD-X4j466JjM zN%@+*|BbBw=%1FAhpMz+a+mAJ&+{8@xNXO!jNPhgmYDzn0^Jw5W4bUr7S4M9vhH_T z4+sz-uoVJ_rkAtE^l{6-nDxpwzC?fk0Rja2DDdiZYTW!c>Al54TV7_bec-QJ0tU!PO0Ro#4 zxNIu@R-(z+KAflQpC~c>Ueo6%X1(%vwPmL}rNHkbnzmy&U%5Wkm6qKg7oeU0$~DZ*<+q z^22TGfc6j|K!CthfxBmE%{V{E`^l`g^VE_pBtU=w0Rr6DP zrR=K@DqF+jL8+tcuc&Eb$y@g4O9TiI*am?;)5)4K^0;k4(MJLV2=q)~-fjHTHRJe~w*f^T2@oLALxFj>@n6+L3tb{WfB=E*6?kB}Ui16ssoP7X=L854=&ZmF zY59?fn(@9#-f~|2CQ|9o2NO-&IGpDun`o>$2@oK#W`QzB4v&4ao*%#F_Nk5l0RjY; zBT&Zs_ak-?U(KuABDynHz7h1`r@XfWSNg<$kkg zCZ>(?HOtOTS*6TPr5mQ=^4qMY&40D2#;TV90Rn3lI4|`z9Uo6xbK6u$fB*pk%M-X- ziaI0Fbj%;*J0|P6*LV;l0t5&U=)Ayhrw4=it;yqaI^Sa*AV7e?_6j^IU2ihhH_7wr z7BIfEvOh<)pv{^9=Eviz1U5H0uqXwud} zo*yUwy%T=Nb;ICBE%=OS0)egy{2&b5&;4P2y|QE#%ccfiKb(}eBHIOf1}&qRjnsL zVEF=fPLVb9+TSg|2}&eDfB=Ct3%oG()r|e4d0(~W_D-wr-xuu5Xy3eE?6a{eu_ zoM+ecyIIcZlL!zXK%n~qmq`~+O*9?<Xk-- z009CU61Z>btr`D^^WI@YZ5~(c?<~-d;XZjj|L0*y zhHDNs>zP~x2oNAJP2l&lu<7_OUpKAn-MPD>c>72j`X>rZ>)%hEp`!CjD0t5(*6{x)idCgoQZ{6Iw zDlhvt#(wm@Nr1o>3*0IfPk%kP~<*{ED z_HVT1Tc#ad6ga73Y&@@v9n@w51PBngn80p%=L-qj#Qip~f8$~weQyvTu;l``PXBA> zzE^I!m+liFK%g%I<-CV-&Gni&V37AVEkd}*oP8Md#p8URfpxgqztN&Enx=G4;M)~r z)1w9$7Y@F-x&Al_Z|TP+bmFf-STp*uS9?V0Rr6?*eT8b zWMbamCJ$>-_y1yne$3l{>&^e!sj;(vqeWjdP3fG#X%%DR8J+8$1`{AafWWB0mGj1# ziJEOKdAsRl|HkO2-)jN{wq4*(0jQbN{HQ)ofG&$#n@Q(g-8Sl5FpTPfj6c3wt=_9!2XSHe^<4h0DJ$8-lomN%3A8ySxSVsHd^E%qS$^PBTQy%{x2)_-x!=fh6Mn~a!{E^QJ{Hy@ zKp+C=CYp@pCC|yk2oNAZptAz|q~#|jnvVH{eBaDE`*yb18cu)!0RjXr6u4KO4(7Ke zkLB+|5&;4P2y|26&S`d&vA#*3zit7+KUenWGc9PdCJ-P%U>yQwe{PepyyQ7y9Su?k z0RjXFtVE!k@7i>{AI^8*m9$2o1PBlyKw$j>WlkHO<7Pd7=K7ncMgjx~5Lkl1UMb_N ziCN=()8(h9tV=DSUGo-krL1^PqG@|ez8B0}ne_+|AkZO!ozvEuvGL0t>YJt#AV7e? zg#x$A)0+L+gSp|uS+88@RU$xu009Dh5O_d3F_`0;JpNT5I;{@`2oTspfpY((CgXff zo=u+9_wqUVQ_f$J2oNC9cY)p0!J4uB3w;OCKLP{@^iW`r^r?*BHRFBBTdrStP(mU= zfB*pkeG&M*bfjiJd~#npt{(&l5ZEGto2RemCu+v~CV79HGH0^NE_Vz9#Q+DSPi(jacIH%ciW85;bisdHt4K;(vmo z2oPwsz*W<_nlbXfTHPCsBS3%vfl+~9&Ku=CjGD2& z_{V+fyuJ`1Kwt|5o}NC|jPvv4eOKyO$GH)Erk;34 zATUwjiCI!J#t-ru>nD<0K!5-N0v#84QQAM4@0vUw+VTEsJ^=y*wnd!ij4ye= zpSWT|B0zuu0Rnv#cttu@GdCXGM+AK$K!89G1?Igj)th7S)WS$A3IzVDE- z9+3Fn0`2*ytSb>9Kwz5$?vc(8kIS>3yFbx3eLD1&0D-Owl=GxNlbAK8k6Zqru6A0x z2@oJafItI*a?Or$^WUWRZqlGkSqKmyKwz^1<=Q0YB_@sKlin};5w4K9TH=R^N%@+* z|K6;B^TfRAc3JVLM3cHE~T-a@2-Oqk4t%CTM79MkVh<-IS?QQo*Z*7;sJXJn5t{qYt70tB`};2G&; z&6s=tZ9vgS0t5(jRN!CI?wT=ukoTimZ>Ns-S+fZcAV7dXjll8AJedEQJnmdmxV!`i z5FoHNfpVXTZzh_I<)e8XGo_VR&$5%}EO)e?b-XUu=KA?5{jrDu0Rnv&cu6`~Gu|HB zcM$y}K!89;1@4u0*No?byk}*->vXiwnoWQJ0RjYS1y0WjgE?^4W0@l*0t5&UXs5s% z)2vzJ__*aqWxZL)c3m%dPMNd(adochy%W>MYa}EB1PE-iK<#{R%WcNecLD?mv{ay6 z8~nS8dA6G$-qJp476AeT2oPAd!0suqX09xMH54WnTaOj_-LMoR(9oz$zSGz(Q-EZ z`a@~cr7Qa)I{^X&`YQ1GbgX7vHh%W?lb~M&2y|7T_C893G5>q%u;YEY`oFH-1PBly zFpt2EveIB4Z1VW-c`C6E0RjXFtW2QXL;ILSlQDcW&)es0)oxkuMRV3U+J;46pPzO- zJ>lL^L68U#An;Rxn(LXImvwd|M}PnU0<96aOF|6w z>-qCG(MWX?AV7e?Sb=-z-C5)Iq~(W>EwTR1J+sO)6K5qR)wS&RPfuNcnbp1U5FoH2fpRY0dlNNd_#p4eS?|&tYPV_$5FkK+z$OJAlgbD4 zVUx$lZL+cICP07yfu9LnGtbK3`J0U0qj_Hbvr?A#zMS&4buG}^{-uTM?+PfA=W zArT-zfWUZx>*wupW9X#!{$qSG-X%bQ0D(0Nl#cJC!0svko{4gAk8=}E+B7Xs zx%TjpiE_T-UI~c+0RjZ33*0V?r;V$l%U(OZI7q|8mvq$rM zJnOk;>*oIN)J%W?0Ro#BcxRe0IzLW({i~aAvK9~^Kwzr{%DEBc9Q0{p^`vD_Xn|b0 zj@1nlH&5I?QI0eIwM4m|ifaZ3K_Wnaz=8sg&ia$)fpPD*VQyHk%T^~qfIw#j%6ZxU znHV=d&wB6ltam_Xd#>RG2oNAZU^xPxNHMeK%;Du%Urx13AwYltfjI;Y%sOWzhR5Zm z&&xHQ$~_Au0t5&U=(j*QAEW8qQ1U&b-yC{JfB=D33zYMmYsT#1yuaP*o@pEb0t5&U zSdYMWQqA!EIP3YI>uHu+2oNAZU_@Zwy#7LB);K+G`M0uOIqzK}K!5;&{tLW0T^u(T zOnR@JOD7Q^K!Cvd1@4=O==t;|;w(WTOPk;b{ zEfc6cKYOn&^U+-b1PE+eV81lrD~UkVxhNPA#VyQ@FW|kUa z8VAdyvgBBv`Z5m@(owQf$}}~#Ofylu;oUr>p_ziD;3ZT|=2oTsRf!5=*YhQ>&fB*pk zixa5p;k`LA$y$C?o+m7>scIrXfB*pkofr7!v~bjXx!z;X?|hFmkN^P!{Sw$e-MKWe z-ncyO@k_GZ?fb={Hv|X}Ah3Zzooi~`+_3h!I+vA1fB*pkixW68RjnP1C%ymD#Whn+ z1PBlyKwv2Zo}E@sI*(Sqr!PgXG?D-T0{sx!E#0Vd>$Z&3D|zdh8xQXXgI*9IK!8Al zKppe9G8atpe_e}QB0zuufyD?sCe>V*m}Gojo9ExMooj9^=5P>%o~o+9^QLIj|mW1yuck&<(CsJ>5g*5 z*BgH~di>mMd$VQiv^EnUK!5;&1qnPN^=vesu73W_3u>2Y2oNAJM1lJI(kBzE$K96O ze>6lieI`JF0DK!5;&SqeNYg|&>ytMk^r>O0S}G0Gx9fB*pk zJrt;G39g<$H@f}29vbKp0RjZNAh1&!@y^6XE$#ku*3qES>-RQB}?xFpq(K7-B2oNAJGl9QMNgK_ptDk?$ z%xYE;0RjXFtO(TkbYGTOJ>It5J}=ukx5$d7{|OKvFl>Qi(*2e>!1PBly&=r9{Nki6~Ge$lB+g)k6b`T&ypeF+NNI$-o7&Ycj^4MSX#6dR* z5FkK+z#;@LN+pxbuPb@>Swy4ML4W{(0SVM`aVukN>;G40+rtNBrKJl9`#*U2oNB!l>+rQ zmX9VzjkS|J_K9q}$5wVg-2?~_AV6Tr1n!gePBO=?F(Vrp1Br;fY-%DJ~l1q28X7>2-s>E@-0abxbd=iZ!ccNhkhUJ@Wc zfIx%5LCHIA{#g6mCmYI^l>h+(1V#(gy8N|?wPWn0_pi#f4@^h|2oNAZfIyo->-B7Z zudR5w2@oJaV1&SadF)GxNx$!`&3AUTz1fIzJw$*20RjYCf4_7ZG6Dn$5SU7!&f#6x z17EvlpY;B9+4k{MwZO&%2oNAZV7LNrP1h%#b1UD^50^^M2@oJK6M?-`%BK=7WAEy` z7iQaiXVMad5FkK+KpzF_+=Z*>jg4;qQ6CZXi2wlt3lw;6>e^_m9rygR7T8u*5g1ddBvTgKb9dEcAuZ?Z)F z)l>om2oNC9MSiZN0tC7y@VjZy+IeK$edm4e+AF9% z1PF9p;0bBqcM{{q)^X2$KHKiw^-gLZ0RjXF5Lgm{bJEUn^X}T`9)6XZmcQG2K!5;&g$V4JTK+z<`uj}l?YCz8ofgts zl@K66fIwdaK9!EN%s2PzOULzt009DX7I;F+Z}}U_+OhbuY=6j{+o*T~1PBlyFeHKd zq_b=1+i~|lGb9{+B|w0{6auwR;cxi-y*e~55CT? zVy+q9`$Ufk5NH>u>upSPPO5Kb`v&KMkDFOrt z5cqF_y57b=CRUH1t+)R@+wb|`#rc;20RjXFOf2xQR1nn009C7#tZy%o}Omk z##Pz=i1Af;mH+_)1PBn=guvfso0jiC+cr^$O$ZPmFeHK6xABHV%h#jPE4ugUg5-A@|5B0zuu0Rmet zaDG~_cJ3W_|Hv(Gu?7$zK%lzx(sQzvz z5g;n&BKhmQiV^_=1PFYuz;kkU^?2EOyY_AT>h~7u9svRb z2oNAJV}TP=UdtT)iW%3hI06I+^g*Dm0sb$Emhp6L-mhf)d-MTA9|#a2KwwJ+o}Aj( z&N1Wee_%^nt8xMa2y{(Jua~FJN%iXsZ@CHy z5FkK+z%T{sx5Deq$)g^>Jo$GVCY4?jAVA;-0zaHb>YP%e#>+_`tL+cELCGEm3ha{ncN9x!(0c8S z3mV@SvJ)UcppOE#PpAGPv39-Qa=-R1KdFy6`b2;Lfq@9@m45pEvwQ}p<#lVBuTLDv z`&l;$5Fjv4;L&;V%0$cfxi;??vi)7hRpL1U1PE-gz>%qc?bzjh|4d%9#qTrK6Cglf zs|5~718QwP%^Y`awm)jCJEDF91PBnAO5oMmdYZYww#(u7Q&YW5Y)pUvf#nyd}S8`_Ghd=jEr+0|EqkE@1!0a;(qS&M~d`pVssDvF;HdKwzA}gY)F2iPo`mb^dFz z{V$BG#B&4)5FoG=0`_lAHy^H^8@qbD&Ldgpqm&2`ATUIM?b7KwhHct0`ZFox4he|> z0RmkYuzzFvF@M@QV-edQ*!4G}_7NaJU`_(Rlya|5Of%Nj_CGtP_9>PC0RjXTD`5Y| zbaUb~^Xa0t{n%pPQfebWfIw#ic1}y`{2kMdx96pdeLK@D4Iw~)z<2@sH>Mx=r=2(E zz5Q467O4IA5&;4Ph9pqq-nPWFW9;QA* zfB=Cefm3)hJvP_1PBlq zkbwOg)6bF9&av~{zOJQv^8vk|b(H`C0`+^Wixbn1t*51oI=_`ffB=DI6R>|{`Z-|Q zIb`13-*wsEl-f&x0D(;k)bEx)nV5E5{dCH>(GrCpVnc3gdV%GfC(5gEZcAV6Rf z0zaN@>U>huj;Zx`ky~w|ewz>=K!Ct<2-v?d{aiWiTszP0pSv7yL#-r0fWTA&J7nuW zPRwFFJt^h5X6sZhhm8pk*kS?uH)b;*%wkTNM;Uegd5Hi40(}=aCLO#cG3_||?v!z} zzGLYh0RjXDE@1!0^z-Gk^X)vhfB3-P-?~qLK>r2m`^p;<(~hOrrHteI&!vY12n;~L z{*CG9glXrLd2avY0lbHGkpO|=3ha`uzbY|{ar7Tj&W(plspkX;5EzVr{Ts8HH)k>T z&bo~Ht;0(S3uj=5=bB$If5=x2GNuAV6TGz=QJW z#fg?Naa7*=-O{lmYw#ce0t5*3Rp5kl%y*yVFsO5-sNZ4L z_|`fmjv6aJmvZizkO&YUK!Ctj2z)q|j+&p=d#rwsED<0;ply3SrK3>0D zdPLuF^oIZe0t5*3MBr}e$E0)mO1?vS(s$h;K!CuCK%H~%9}_F%+%*4xH09JW@Dc$6 z1PBn=3W2>-Y3siFhi*kf)k%N=fjJ56nsQ&Bm}X7Cvh4*a=b$;YQ?UdH5FkK+!1MyY znIcx^?MeRsO7holoFxJT2=qmujk|N+3Xhz?KQj@_ba^PA?v}Wj#?b0RjXF5FpSh@RDrM^8M$1 ztrf^mfB=Dx2|PaSnbk4t=cKItJJvtVAwYltfnf{$MY`XzzOQrCO9TiISXP1h&F0q= zE#uyLdB2cy4qjFW?Iu8g009C66xcC+zBsYo+&=2@;|J)Z%LEAYL!iz_RoBNDHMVW$ zu{Wix-TOhK7X%0pAkY(m?bDAhC0gdS6MNEk-5@|d275p zM* z*OK4)=DYlgY8wFpw+zAS5-nrfxV*Kt|J{VOeGnu91PBlyu*3p2mwz!aZr)$}+zXeu zznV^fz%T^vmu`MKv3C60?ENpKtREW&on8_kK!89G1X}07m-L{|x zF>c-e<&^i3{&MLV0RjXF5Ezue{nOiV^Zuyk4j+_|&JrN7OaeQnu_q?#_gJIGugyI6 zu9W4N^&m(D2oNB!6aqh-R<_P}M=V9pG?D;;p$XJA^!_2yI;M@we@4pNYiN-AOMn0Y z0t9+2@VxYG+}ywRxjKjajy?9!H39^dSKt9@dR_N>?YOns`?ZhcSqaCi2SFl0fB=D| z5qN%D+A{amdF*epG`-VM0tAL4@aS~(;zY}MHZJdVDXV@5buH!5^Kk-&E9v+dVk&@dP0BzfguUh?~pD^w9J36 z7!r`a5+Kldfql}#(-JM?*hYE3l=2Sie9twI009C72oPu$_=#+=(K=x5^ABsSM1BGU z2+UES&X@Pu#M-fHn)~lad37wjM1TMR0tA*#pw{ZGbKp-eTPL-b0D;~L)G-@%&WP4= zY+U}gq`ceoR!qkT5FkK+z_11WHr*e$4p{r#rOAJzVUy`S0RkNnxLMk9N@AABY+Rl4 zwk4d8DhLt*0t5&wrNFDw>a}b5arf)oRCVnti2wltTPd)ADt~)o+<4Xc+_zHRF!fB*pka~0SvrPqAlvPO8>TwA1Y0t5(5Ch(|a`+TBh{Msn**(vV_CaYd90t5&U zAkayH&8+WV+R2`16afN55vbo!9-p`(vC(?H<@pb#yt^bM0t5&UAV8qM0!O85E$f5I zTjzn12oNB!RRVWR#iu7)$F6bt>pFv{Ch8g<5&;4P2oP9ifuqy-adY0N=bVpznO|{j zC$QWC4@&dTO^h0wHv8DMDX*@}SNlyQ0t5&UAV8qs0%xRqEo+7^CVyRzTp~b#z@i0q zN`=QIT8}x~XpF1tuO6}J&Zv(70RjXF%t_##DR-l}Z}szENPg@4IlUN)B|u&z!Xjwy?)PEK|BtW2p0*9te=OkLjt4Z?y zW6Hc`2m7l@1PBlyKwvWhx64MY*QBc7I7-u~W z0RjXF5FjuNf!|IyTh@dq;CNF zLx4ah1#0a*k8@F7_uX>$>}0PsiU0uu1PBnAr@$d8eC2!1r2jvCo()nq0RjZRD{y%J zKRYq$*feRr+E;Q+V!MPyfB*pk1o|dWzl)x9PF%@X=ZKLA5Fjuwf!$K@w!{^Qm2qcQ z|9>`R*7pX9009C72oM;iz>CxEmUTs)$M?3wq|$2w1QsN4_tbNGqGfEFG;ft#=OmX1 z5FkK+Kwkw~&*xaz;oG~f82Uwkz?KSZpW2T~T$Gq}y*_EaI%eb4#7z?t0RjXF5Fjv2 zfm#Q&Ud!vP!=%z{0t6NyaEsJ&N}~SGGU@l4N%LKrGV7QPi2wlt1PJt5pytxn-$&Q^ z8YKb*2+UgGuoO6tYi!i||I>*&R!t&6fB*pk1coi}lyra6zYVVBd)% z5FkKcC<3k56~8zzHy#R(ei9%sSAjdE^g3Tuozr^K^?FOb_omzf5)uId1PBlyK%fNf zlW18>RNfcVh7th+1ZE&m*8u#tMC&*-N&ah6Zk^}Kxp;#h5gbjh($C6pzu5(fSYGQ|k zM1TMR0t5&U7$s2WtUNo>vIhBj^6xsTFpm)+Kwuq#AI#&gP0Z{1f;EQK@4D`rkO&YU zK!CuI1$Ij3FG#ek?=Mb%*A*Y~yGGv$OfGP%WZjmizYDaCGc9@R+8uQbkE%-|K!5-N z0t5(*6L?6TY*}Yi-ai{xpyvn>Ah1fHuG90H#JrBzs4?lnL|tRh@4A8@5g5B?0^>KNJs<-5FkK+0D(yb_D{yvbH&v6C5Zq50_zFXevSIgRqOYe*8H{a zWWV(q;c)^42oNAJP=WiU->q}%I|gc{+XM)V7dSXizdBLpifSEKTJqQV@t%^{F(DBk zK!5-N0t8wF{ydpm)*Y4i=#~oPB|u;h0(GA6Iu}M=|DttFY0dw^)ZrQ%L68U#AV7e? z2!X%PW36-Rkt53S5CHb1rsw_i4kij_ftz|slqnifAf zv50GH)L3+RqJDq6XF?)CfB*pk1SS)Bda_NjreB@s)B= z%=7k{sp~-ri2wlt1PBlyFiU~W{GIZLXW0N{5g^ccfxD)Kb^OF4j#aPkRQ21jQxp3n zBmx8o5FkKca)BEs>lYI(f1|uM`R|aB2oUJMz#Afr?evOwT?v#)S5FkK+0D*Ra z`aO2*Jp9`BYHUG(z!C}6u^PuFKALD9AEwFwp44}ELLxwb009C72+T|1y(zeLz4FL; zHAcAv2y{YV|Fq(yL|x0fb$r-t{wq`03ln!pNCXHFAV7e?<^<}xdY?+P&c{Etx$101 zfIx=@wolt?-$Gq4?^}u1abcSL|D5_BoRA0*AV7cs0RrmOex@P%owyEz;5&;7J z5~$yF9hEpEab2QyY}jo6+OJXPp}Ji{B0zuu0RjZ36ZnN}-a04$>vUDxngD^02^^UA zJU4M+qIEo&CVzd0I4yCXghYS<0RjXF5Lkr3>8Yf3{c_wQ8m0~c1QsH&V`_Os;x&my zo`1K-oo^=Uy5V~zBmx8o5FkKcdV%dy#K#h?>-$GdU$qhl5ZGdYT2ude;vzD3R1X0Ha}%h~|MLsT==|M{u=sfpbZ z5&;4P2oNAJdw~z6$We3fxW|s3eKV9ufWRCDYM;hYi8m&$N{st_&+EA_rQU4`zgG%^ zM1TMR0t5(biNKvw>$QoN^-f)n>=s+nT9pzYuvvlqvSFQ5uCDLb@_Ce?EwPdp$Y5gedY1WXj5smj+8RNS2oNAZfB=C`3A{3` zXCR#t!v(EqFwBeY9Yik5SB0zuu0RjsY*e-Q_Fwr`< zKXZX?R22aNqXp``Q;$y6n!c`S(fT=_NB-KkQtNvAKZ76HVRJXD9wS(RxkHNj~43$#ZGi^8Ccz6A}Re1PBlyK%mP4uS?@v z*E_H1a)-2yK#v7(nZDKUxn7t!FVXthomc)(q%BWN?2(WN5FkK+0D-L&sB=_)EYUjW zKWFQjtY!j(5~y=d-6!!s6K_vko@o8N&NF`<`}M@cE(wVM0RjXF5FpTXfgef(ThHNH z$9mK;9})oq^B1^jsyHI?Cy9Scv>t0U&+k5UtVUfg{Lq9%fB*pk1PF9P;1|-2*7?7V z-KcZoNCXJXUZD18+$&MP1^TB%9T(C18J&0j&!I4tppi4P>MNwj`O=bit|wCO1ce+LPIM1TMR0t7lFP=7}~H_^Hl z`27y`K~o4UyTHxTfjU>~wnUvn_L4;FXL1qwuSmPZ|ao9KPRqAEaLl2YaL(sZW|BE{}KTL1PBly&`p7( z)2!Ax{;S!h{vIn4AkZ#Q`xFmM)b;RQn)r`I>v!zd&+Ih$>sau2C5}$iapDpI0t5&U zAV6T51>TXyx2}z9%_b2busMNUv)Q4EI@j(S5?@ZVeg+qr|FX32ZxRnm)VaJR0t5&U zAV8qI0z0Q^|CwlAD;(e5E@>HoP6^an{znqWCQeP%bt=A{X#LD>MgBU^?K2a%Pe=p^ z5FkK+0D(RT{6sp@x~{6sz8M6KoP{LJSj>Rblv zeU`fT_(#&-8W--IkO&YUK!5-N0(}ywV`x8?XkCN7uulm3LSRM$JEfdDXIq_P>V(9b z6Bj00KVMs!zxHXImN+W0dqN^WfB*pk1eQzSR%vcsBfNDzaolosQ)>y#RNzJ_?SMqB z<7+?0sfjvY>^BpwpQWzkKPPS9mbhy|B0zuu0RjXF^i|-==~(Of>xyi1yS{?x7l8=` zZk{~%PSp3GZHc-T-&u+JY_xu!x{!b6I1T$W@&ZZ(2oNAZV95pQcSx=4i_d49n=E<1 zHJ`vZfgSVY_a}ZdQO73#PU1z0w=U&n{nd9rH%%$*Vv0RjXF5FkLH z?*hA}gI`LtuFIa+cNqN}yg+@wuj4T4IP}^F`0T{X68|^xwM6S@ri=N%m43WFQQz-e zM>Gf$0RjXF5a@xxJ<^A360K{G|IvfK>%wpa>X@Z^?>`{%vx#3#JSXw;#QPGTOKj$I z(fT>siu~V5-~J(SbYicBM1TMR0t5&U7?ME!&9-$7R(}({^^lPCwO0c5yRF+K4oV!J zcwC~+#qfU;uT6X?aZ#f6bFnP>Ka;+_Ao0*d?Zc4>5FkK+0D*o9oSyEqu1n6(Hg%3o ziNK-->RicnTy(|l6Lo&5LlU)4ul*EHNYuWHIv(M~M6F|AnRsWS&aqs-)w?#)`kr6* z{GUvp|0MC?gwJjeBmx8o5FkKckOH?$uP;xuuI)}3q?S&1MWBu|sP8{@ZTkZg_f0$` zQRj(zV&c~l&rHi6HD77XU_9{6m^yku2u=DIMOc~AFkoBEC6TNA&Y*gqi=AV7cs0RjXFeBbx| zO%OJ-?)yTv^Zkdxyxs#}$@^>dcc8u=N4}ZQ-lW@nF@|+4{?8|BUywwA009C72=rfI z`*iWciAmQB^0D$B=-sDdqN^W zfB*pk1PBmVU!eXLYVFIwdtf==1DEIXyRtvyM{|3p^*`#KAwYlt0RjXDAaJAf@xp|) z9Ru%y<#-R&dcMw~TgPYoRASGBM1TMR0t5&UATXK0!;;Oqmx1@d^1KHw%4hbU5_JuY z+MiK>!;lCNAV7cs0Rk%mx5y1^I|kkZ-F*+#{>L{a>Uir~&pY2#5F`Qw2oNAZfWRgN zj>~q|z6`tvy7?ZsHlNQrHodN&aZIAF3GRGTL68U#AV7csfprD!-{|JL&U$;8ugh2S zNv&h8PfGku;x-A1009C72oNAZV0HrbZwzyt?fX^tUia(rv99a1zc%qZi3cWjO-KX? z5FkK+0D%?(`!~9`&a?I&#%oe*`PU`>SK`RTz6pr{0RjXF5FkKcz5@1d3}dbBJ5{${ z=d1Fu{z&2_iKitVkk~yT5g+t@)9(BIhcPHxl-}Qa^(1f*o z5F`Qw2oNAZfWQ_A*uT-g^|tR&-FZ#x{8Hy9PEVYiI685!glm8YK_Wna009C7<|1JK zMt9bN*5%9lT3ne==h=xmw)%v`QHlE`_DDzs2oNAZfB*pk-4U>VV|mxyzAts>wYxMQ z=?^AemUw33QHi=%hHC`|K_Wna009C77Aj!>Mt9bT*6ZDUExw&k<++KsCH^W==ai~_ z7>6eIOYD%42oNAZfB*pk1iCL^|3-J$+`bQW=e4;cALWlGPD}i0;u%piy5sVVd?Z)C|J47VO|1S7^x@q9K%$N< zukSxEPSk#i|DCAsKgT8>pZMv-p^1AWZk5j~pu6vZ zcjq%&-+$hksP8@%FHO|grhp<~ zR5;8s$&q*zP!u?*fQfjO8HpSbkl`{2f*$Y?1Q9vRb3kUo5EBLiAt3{V%*nm~1$^X7 zr@OjWcXf9SPyK#xzP+nfty=H1diP$HcX#)r6Aw(>HE~$tx`}-gHUb0)5FkKcd;;bF zf&PDjfyclg9|Mcwf-x%h)&U)RvF7g<-C{JmhPn5rj zdUE2|6E{fgny?WdK!5-N0tALApuS<9yvRCPn_)gqzLO`l4<%ldD6au2fA@7j!bX4q z0RjXF^jAQAW0>nU>v8kC%46W$c}jbKqPzyYyx!v{6E*?_2oNAZfWQz0)Hke?S6L@J zcbJc#@|yRzB%Yf1)x?1b8vz0Y2oNC94*~U!VXn`tyUlCckAbuElvdsc_n5?85?4yt z2oNAZfB*pkeG^dMuug7!ovgoMKBi90liMp2M46Ea=N{275vdX&K!5;&o(ZULSSN3K zo$PwUe9V0^&wbBG9Ff?oXU~I%OMn0Y0tAL6puRE8wU#xsdEMq?;F3H^elSs9+i{~I zJz>g)009C72oUJKfcl1Y@;2AWu071h-*@uN_=dzo6Z`l6SyBQ72oNAZpkD&&8^c^* zSvQ;4EKoR{U0Np_%kUnL=jVy@xWq#e`wj6) zR89m45FkLHV*=_M!&^^TBb(DMKL$RW=fKA$4(Zr)q2Ul9K!5-N0^<-+->_Eh@><#0 zhV}R?pIP|&#QhTcj^im-mIMe8AV6T_0_q#XT0dD2o6o*H1}@FB-Fp*9CHC3)GoK3* zAV7cs0Rm$cP~Wg#?#p`FIEVFE{dS&o%jXr|WvoxW@+Lrl009DP5>Ve5)|$y0*nIZ! zF>q#{-(Hxw`I?^RbW4B$0RjXF5ZEE0zG1!G$Mv!?59@LJ**qaVAyNK+jEw*R0t5&U zSWTd|zVV4%?&^Yp$H2xO12>3uiJK;F^@BJf|CYb|`L)Eu6OT_kJ@JynKPTRkC~M~L zB>HwQR9@5Z(1h1?1i?mt009C72(&IxTivG=WWOR&rj#;a{qIi zM7j4Vao@!6CZ3#lZsL`RHzz)nI5}})qEGif=VrXGNZc-ABS3%v0RjY;6R53kd~CVP zIEw&*EeRZ$>)twXpG2vHJU>zH0lt{HB+=FN|2H$XqZ2=xun{0YfB*pk1lkg)t#3TG ztqbdi0D-j&?4BzelDK2yVTofBFHgKXaay9Q_daD@$0zQe*dt*hK!5-N0t6NpP~TYG zN=pJm6WA*W9h!JZ;%SNF5~n7*wC+DY<0*gBbd!XQ009C72oNB!s(|{&s)EiZ&|iV_ zI-J83<$0jIKkj=ISo30yY`-!Jjk ziH{~OPHcP4UtVkS`ou3JYy=1pAV7csfn^2MHFG+r0O=AlLt233ZMj*a#3HK!Cs$0rib3 zD0UGb&?rzo`@7UT%6nRUCb6ycetA9l?GrWv1PBlyK!Cua0_q!!N@+)czz%_f@Z(L^KD*^sBg>@a-0BxCV@S2u)LQ1FB2b6Z2I2koLsZ~omu&RIW__W z2oNAZ;QPN5YknVp3>pCf1R4a&=iogoQED9*CTgBvR%v@_u2nvt<0lg~0t5&UAV7e? zECKb6Su*w$Ah3+UjdRkI6Q543az9gh?%BECpC!tB3EKz|AV7e?m<7CkW6ZNJcLM7b zxO%#ONaDD}rfMDKI^}iS2PSL;2oNAZfB=C>0ribZ5#JLa(3ZfV>FAimXA`ycie=mX zSFUwbVz-2i009C72#ircePfKXE@uLp7dSYVe0<`B#IkGmn)6P}b$%zYd%{M5009C7 z2oTsIpuVv~!oLIvtW)4t>HPVLvl2D;G0V37P_A>EgpB|J0t5(*O+bBPY%?xj0^1iT zYyI*Xi}K#F%dX!SJ@0e5#xEyq1PBlyK!5;&BA~wEaX^5;CIzmPil+WsTRN_;KW!CRC=akRpxK6@GfB*pk z1PF{+Z4EIF8-Xv8Ht*EncBAH@5ufnv1h_YfB*pk1col4zA^L}mLGwB z2ppba9+z0>-!y$U{XZe$J*$FXBS3%v0RkfxP~RBo#7mn%hXl%Jf|t+C_MPi+wNB+L_Uq1WKMt}eT0t5(*Pe6TR zd~+^i0$mj-p9y|s;{A!5xoK-my=)XXDFR5oG zzLTg~zc1SM{PcTtVy}da009C72oM;LfcnOG=31r%`Xq3N4E9Zlb-kYbrG zK!5;&!3n5u3~ov#L|{+?KbmZwnJDiqwP@|4rroF0@6RS|1PBlyK!CtF1k^XiG0(Cj z&{u(5XW(y1)ZEk5w0&jzKA^8S#!Y|#0RjZ32&ivNL9vSffzAn(I>*xz=O${_?~Am( zD19E2@VOj8un{0YfB=Dk3#e}le1fG%U?2jwO&-T37P+6PZS(c?d)I+DNrM0Z0t5)C zZ+Hw4AkZg)YiF>>Cd&Iu)vn{`wf{i+{PBd1009C72oM;qfcnO8=T>F}hA41&lKQ`i zdG|84$IJU*mHR61*Bb;I0RjXF^jbiDqu0}C@B~IHaKmK&xA5FkKcGy>`yqnT=n5*Vbw z5y|QkiQ0Aiy!NGbvi~5(Bt?J#0RjZZEug+J?)jHJfj$fDnZcLmu(J~L?q_O_m-hfJ z{n`i+AV7dX9|hDm`Z#OGOn|`70(<0}M1k^YBG+V|>fIySL0Xg`*M4RjU z@20=sXu7Cl1PBlyK!8B61k^WrHC+ZvfIx%5VLA5xL`@B2UfWNnzZ*4N(;)%`2oNC9 zH39XFuFZ(?5FoIsz%A3kM-%hb?ls3>nErhB-l{X>d;$ar5FoI90ridT&w&vTAkdz` zuIcKiMEM-Sn){okw%<-)|1Du7K!5-N0(}rr-{`|E86yD#wF2e6X`hfdFVVDiuQ~SK z^mWaIjQ{}x1PBo5uYmeSf9KA~2@seqaIGBr--(+0o2Isxrmv?Zc2C#{5FkK+K$iv7 zH@ZAK#zug^sscZm4&IY!TD#XAJ0*P`zUrWyPk;ac0t5(bO+bBPYxFKmfWQU>?w@O% zny9(QX=?k{^i}@9k&OTW0t5(jRX}~Ct21L<1PHVxuvI4W7AV7e?5(4TQOQ1Q00D)c#+$Wdn zrJvjNQo*1J5FkKc=mP2+L!V*!5g@R$z#jSLn8YQCMb`22+Pp0Nl+XIG5g3iBW|8CNb?gspXIOe6K!5-N0<8(CZ?s0KBLW0^BygvU z^{a_R*75V&{CoP@zel+nDggon2oM;vfcnOmXJ76F#wk!fBm4=83lsD1ZRQ>KI`(ls zhGb2E0D&$GsBd(6c8rYxfprR$_oaP(V%{2lk>j6EKZmSyu=*xIfB*pk1X>YL-)MzV zCj7%^% z+eUx@0RjXFbWcEiqkD5=L<9(IN8ld0Y`J$?Kh&e z1PBngOknSPS>8*wY5l&)v2)VLoiFRwR|E(UAV7dXM+DS2Ix-Q4L4ZIf1a6p7d@`}f zJx)`bT=g?KzMDRNxev)2BLM;g2oM;N zfcnOWCR?fm2rMM9Z(1FfXsTZo68s%g<_aLC(MXuvlb6fB*pk1bQu?zR~OHGk5|7)+Dfd`h9+4)_u*Q`#+aH4qDR~ zbxVK%0RjZ338-&OQ?ZW#0RrC_xJCZ?T4K@l{IquG=KMQ-zdQdWK!5-N0tB`!puVx? z32=D=1UfBHo+DTN-0@GOj{`cLrNI#(K!CuI1k^W%G@EiEKwupL*Gs46wbs*W7mMyI z?^Shp!bX4q0RjXFY*#>iW4r#YPJlr71@4t0mcP+j^j>FLyAS64t9CzCBP2k80D%Dr zsBa8l5~V=r=XIi^=Ve*m#lsX5E!Ds zo=NJpiAC!f)7pJC=U;z_IC3IDfB*pkJrGde=)oizA^`%O5x8MSa<Yea)i#{we2| z&o8$TAV7csfprL|Z>&RAp9BaDS)i=VUy@jKJwL78=W@Q!+#B+vL~aBK5FpT10ricp z&Wv#pAkbBT>tgks}0Rl@39Gvq$k(hR0v*^CZEO~9G5gm5a_Xh`bLi@&(H}F=!8Id{Y7~{ z*?DXErsKceiA)TF009C72n=69ePj4@EJFeW)+=yOx-Xw6*mQr>bnLX8TRykkMt}eT z0tDI+P~T`nQ6B^dj9s97=J;z8P3!okV;AP!BgT#>e*y#u5FoGt0riayAiD$s0)rPQ zpE>^JMAJP^)3MLy+^Y>59wO~>AtbA1-!pdJ#EAwYn@Rs_^Hw!-eB z1PBaNVDIGhwnWo9zUkP9b8hLwMt}eT0t5)GM?igJJ+68sKwz8#Kb5pkPc+@*G#z{5 zIN4-PfB*pkEefb_w1}xI0t5&|;Hrs_Cz{srO~+nDkpKY#1PBmVn}GVp+Gur5fWSxv z4o}|aC7SMWW*xgE=iP0jZqg<|fB=DZ1k^X$anuU|0t9vzxK_UTN@CVJe%}7y+PO1d z6Cgl<009E638-(hMyVqL1PJ_4;J*2))GFrP=S(|Z-lz8lKkUgD1PBlyK%h=QeWT7x zYXSraEGkf5t9@2t+8Tb|zVmb5trxwJb_56zAV7e?!UF0W3sY%GfB=Cifj>#>dG|T9 zj+fWJU%BdP8WSKufB=E-3#e~+BoH7#V0{ARwbmCUX079!_J29&mFH+10RjXF5FpT= zfci#zmU<#UfWV}{i?gHY9;fNpOD8+?Jplp)2oP96Kz(BYBuxkqAh3c!d9SIab$rvY zH>_}7rxGAQfB*pkR}@g+xT1+Y1PBmlOJL7*^wvbvJx$!HfB=C`3#e~&dU_0w0D*xBl)qzoS7O#WzG?qCIqxS2;vfwI1PBlyux$bL zjcw0>>k}X_27z+_a(1HWK4;dk_vF0Y$ABb90t5&UXhlGMqZLM-5FkKcuE4=*@wLRP zb$rwQkLJ9+=3YSq0t5&UAV6TAfcnNfA;$?2AkdD$J=4vliKhFUS;wB(&JgrMfB*pk zBM?yE7{Me=Va=%~QYWLy^}X07FC?JsNm@;M$h0t5&UAV8pA zKz*a$%ozj-5NJc->FH$FJx6M-jXoK0)_ zS;sz^^Y-jXj)qBq009C7x+I{!(WTii76JsuBv9^OK9rbskJGgO=rKXbl>h+(1gZqo zH>$WaCP08ds{*^Fw|69(*7CECJ+al1=!^gX0t5(*LqL6F9P=zo0tC7#aKjAiJBeBM zIJ5R&kaG_0W=cjyfB*pkTNY5?*zyFpJOKiu7r1r=zLl7@mY=o%{G4->(dz*qK!5-N z0(AoF8+Be<6CgmKZGofG;jDX{ru`qxdFAiJYy=1p*p$H2av{-ugJUyKO}{@Tk9}-Y z45o{^~iJyu@#UfzeqMt}f;O$gLJ zM`>UGyuJ-H^^HyZ^tc8A0%H`oR+2t5QTyEfm7H_sF@njN009CW5>Vf$|NT|_`)*t9 z)i*lygJviM2n&+X40l!9ak5a_bNGS5-YS?;-glWyu8UH+*vHUb3tF7U`C zu*`G1&l>Oh%o{%e0(}=y-&pSV*D}BJHhqrzM&Exrjh_I4t_tj$fxSIZ`@DWp&hc5} zU7c0qA}}n0+UFz~uNVWz$@te;ca5FpSkf%18I?@81?zkfI9T&G*97!3ge1V$yG zzES_XtM+%@w%V(2jOs^OvIGchSl~vv-g$}I=lHj6c$_XrfWSBfYM-05uYW$@hMD@t zIDejHO@P4W1a6#5Ewjdd`R0b`N(2ZHATS}IzR{0+nPu*u)Hfy`?7k&HfI!OvPfCBw zJU`#9<#Fha009D%0?Rx%IcK@&^i8^{Z%jVYeNTV@f%XNCNtdCncRr@<`TkX|1HvjYF ziUbIZPvD58yv*}_`TRl~0RjZpC9ur%l5>`OKHsF9`o_9`V)RRZ0D;R3+%MlQ^Zfox zm+!`R1PBlyumJ(}jpcr4E%SSB)90vfY~TmTB?u585P>%&YMDOTb1PBmlS3rHE{&!XF@3w8VSKny&XGL!W2oPuzcv=qDKHr~~bFSLd zsbd5P5Li;6_W4Nr`seU%n5l0p`2*oJ0t5&wDe#hlGk$@0RjXF)C;I@ z)c>xk{oS^$_Uaq;KM&3zK!Cuq0;Nt--gBz?H8}`MTzJs`|!Gc)lb+fWQU>$~{bZJ$lV^b!mI_2FB(R z1PBly&^-b5jqc5f5fLCjU{av`EmHZLq}nyU*KkZq`knv*0tCh`puREoM}YhZ5a@$I zc}-;Pz0a9B$LDbLVRns?009E+3aD?i>!~*a1PH84;7`(V?Hd2X>l%!H2@oJafIv?L z)HixMafVHRz^DXvO}77$sJ;Jr%&3$kOMn0Y0!2W5!{dMe0RsIH*f+yGHBr09KfE95 z86^P%1PBn=h=BUWMwnfM009Ck3;cR|sJ-_&Ip^%L@|AT!fB*pkeG*XL=+kT&D**yy z7kGRCYS;L07(1H$2@oJafWS@y>Ki*@_>uqt0v#9lP{vn#|8xJ2=VW*U2oNC9u7LVR zyPkR@K!CtH1@=kj|COj&<6oNgH(BSP^i6;O0RjYiB%r?0qscN<0t7}caQ6t*-20Ta z$B$kO009C7#wDP>F|PTREdc`k7x=@ZP`k!|VgJ*X0RaL82oPvRKz*YXMx78KKwx76 zvCd_SdMpjMfAQ5FkKc zkOJx(gPc}L5g;&Nf%_%5ntPwp_P7CiNR0pi0t7BEpuTZ=58n|WK%fr-&&VKa*Z5EB zLt@5AfB*pk1lBB|zOiOt-4h@{pk;yG)8Bt4YVLo^d-VQ9%j3`;0RjXFbW=cmqnq<$ zR0IeRXcG9b9K0Y=v&KIu?RRVH)G-1C2oNAJ0s-}n5lpfa2@n{ZK<#sPxlelP;1nc8 zfB*pk(*)Evrm5IRfB=E+3%nvjtf_C5w!hf@w2Y7d0RjXFtW}`)|B*d*t)tO70RjXF zEF!RP8l9e~x&Qe_+V8nY=h_e;K!8B61=KfsJ$(jGfWU|aZkF83>#l3o_^%tWm(&Rm zAV7dX5m4XoI3PfPKtBb_>oIEXeM;MV_A^zZCP07yfeHcjjS4JH2@oLAF@d*cJT+_l z@}5=)bu0(NAwYlt0Ro#8P~X_3wrdd}K%hN=Yo@F76E*igZ*K4MdLlr80D+DQsBd(1 zVhoD_0RjsM{Ce8dtnW+P$1TvWCIko&AV6TK0_qz>omqJiATS1j*CxrD`=3kF{*W=i z$dLd60wWes-x%@aOPv6L-V5xJ4E`%ov&KIm?RV{c<`N)4fB*pk%L%A&Ea&Dd0t5(j zLEtVKM9sZVX?t`R25t-l2oNB!HUagGwbAOB009CU5%|korFM;f_(n$NA_NE!AV8pd z0_q#xn-e1$~;K!5;&P6=Eiqq#6qbN}<)PGw*) z1PBly(58U;Mw^=YB0zw^b_DL9%hs&#OWQkcXQ-}9fB*pk1hy)mzOhw)7bie~Kq~_O zC%x3%|D2Nc{=TafdYup;K%jF1>KmP#5(6SYfIzjt-Z|r2iJCS33#zZ;1OfyI5FpTh z0ridk&!G$m5Fl`52x{(qO4~bNBS3%vfk6tWZwzu;B}IV12nAl8oNLzjr=|TKBXp87 z0RjXFj9Wl`W8CvEdjbT8A+TrCsQvq{zZpjAvLHZ!0D%bs^^FM--x44|pr-=AlyTS8 zH%i-I>}jrsO@IIa0tA*7P~TWq&Upj~5a^b`OEa9B`=4*7y}$43)*KoQ0RjZt5K!M} zLs1_D2oTu5Kv}DoHG9n(zr5zdMt}eT0tCh+puRDt*_JB-0z($KYm%$E_bF}fJY*2L z5gOy1PBlyK%gH2>Kpx-C!-`lfWV>xuS&z3`=8?$?N~bk z1PBo5g@F1-FQ&;L2@oK#u)scPd2XU+jep;Td)JTv0RjXF^jkoEqu=vq^aKbHm=t(W zcGTSaoRjufn(V~)1PBly&|3lZjowb3ffFD=V5Y!ZbEIaC|I(Q~IY58_0RjYuC7`}B ztof7;0RjXL48bLdn){z$#72Ms0Rn>&P~RBLR7!*Z0Rlf1cuc;kS>Kn>B)1VDK!5;& zF$kz{jA54LNPxiD1U{UEYwmxZH8vpm5+Fcezyj(U1D;%|5g;&HfuBs~HS7D*_Qyx7 zC2;}-2oM;PfcnOmW?QZV2#iJGDM_^E{^x^ZfsrQx0t7}NpuRDJNtPl30;3c-Fkyf6*wFBu#(-0Rm$aP~RBajLVk*fiVc|o+Qsm)ZG8vX$&xOBtU?`2n5tO zMli`zBtT%40uM^oHS7D&j8aL`1PBlyFg5}8jj_$Rd1PII$_-YQ+tnq(kR!8;|AV7csfq@99ZwzE2r9prIfeC>- z}wyswpw009C7`YoWo(eL>)dIAIpGzq*e2W!^&Pi^YVF#-e#5FjuB0riam zOrjJB5Fju`V4v)}AW?JwbF(S^*hPQ<0RsIJP~Yg+d>JhP0t9LVelLw{*7xtM>0Da^ z1PBly&_es=O9RtxP0RjXF5a@`2`bI}4!Y~LBAg~63d!^5sd!Ki;Jcg^K zzXK9iZMk3F5g(S=8s)Rg@1Hm>aZX}dKa1`=E9bv9ab#l8gpB|J0t8kQP~TY1&)EbB5a_zVqcXrn z*V?7stGb?$@ev?EfB=CN1k^WHz;h}A0t9*>@V<<(=Kkj%4LOzf?mae9TQgbo`rl07 zPf3*jH)kV2fB=Ez1k^W{b8{8}0tEUZaQh5&(e-s{_ldqFW}E~F5FkKc2?6zuCD5Eg zfB=CW3H)uwT66#NM^kb;DEnTJxS+DHn(OY|_B*-GQxiV7BM3GE1PD|LsBct)X-^1B0oAx+YLnlCh z009C`0_q!0I*t(_K%oBu<+HzQ?tMP?gOsn4f8SntZq0RS+WtevvEL8IS;c|CIOWt!clhw&iopkGOnlz9T?@0D%bs^^FM--x44|V1NRTN=`Lv z@MjLtKuQD%5FkLH2&iv(91tKtVE6*>Pl`47KV5Enesa0z@TW|M1PBmVT0nhcX*wqo zAV8ou0>6@x)~wn8sW+J!C;oY4AV7e?mIV&Y^=sDbAKmhJU7i2|0t5)GOF(^NU9$QmK!8AZ1pYEZ zsk#5@L)-FRRk!F4v5^oUK%g@M>KmPz3IicPfWX=W_D#<(FunB=j zqZ7AFTs1LmyLxt(u{6mh=BHVIx3*0D;Q{)Hg1(@D%|91cof|p(Izcp8lyJ zW5|sF0RjX@E1omqJiAVA>q0+?; zIxFur)pXsaW6x@HF!~}ufIyE0)HixOd4^7a0D%gDKTq4H_3`Af@|k=#0t5&UATTrm z^^Kv;sC)j!%%`5g8NH+|FX6&tRDgd2oNC9Ap!M`4o!xk5FkKcjRLPs-!=C?JGcEn z&fRm3W1H4>`MmHG6FZM%k+1JPtuy-w5Fjuj0ria$O}11C5E!+<&nEjt*2g>Aym8c8 zk|#ib0D++jsBa8)X5~eI0D;R3JU8F&xVNeK_oAG4v&(n2vG4A>#F+niW218+0t5(j zQ$T&AoAY8+1PBmlTi^!iux4HV-nIvzKLP{@5FpS20riazOoAa0AV6RP0#D90YVLn_ zw0*$_#@2L+w^WY1e9rh@O&vN$fB=Dk3#e}le1fG%fB=CX2pp7ucdXeL`L}!?pN#+k z0t5&QO+bBPXfrAw0t5(57kEr|FLK|rbDN8EPWijAZElC>;yaINk*{yR%>lbM0RjZJ zETF!zuuKlBjf@j6Hwn6*@R1%0D;j8Tq&6^ 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 V-$x{Fp4dNOBS3%v0Rk%v{Qv63d1(Lu literal 0 HcmV?d00001 diff --git a/src/layout.cpp b/src/layout.cpp index fcdbca6..468fa7e 100755 --- a/src/layout.cpp +++ b/src/layout.cpp @@ -294,10 +294,11 @@ void addAllDummyNodes( } } -TreeNode::Id Net::addNode() { +TreeNode::Id Net::addNode(Type type) { Id id = static_cast(nodes.size()); nodes.emplace_back(); nodes.back().id = id; + nodes.back().type = type; return id; } @@ -369,6 +370,7 @@ void initPositionAndSize( for (TreeNode &node : nodes) { Element nElement = {}; nElement.id = node.id; + nElement.scrType.setType(node.type); if (node.isDummy) { if (!initDummy) { diff --git a/src/layout.h b/src/layout.h index b0c2a09..fc65406 100644 --- a/src/layout.h +++ b/src/layout.h @@ -19,6 +19,7 @@ struct TreeNode { std::vector succ = {}; std::vector pred = {}; Id id = 0; + Type type = NONE; int layer = 0; int number = 0; bool isDummy = false; @@ -42,7 +43,7 @@ struct Net { const std::vector &getSuccessors(Id id) const; const std::vector &getPredecessors(Id id) const; - Id addNode(); + Id addNode(Type type); TreeNode *getNode(Id id) { const Net &net = *this; diff --git a/src/main.cpp b/src/main.cpp index f5bc82d..ec17a77 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -71,6 +71,12 @@ const std::string flagCompact = "--compact"; const std::string flagMinimize = "--minimize"; const std::string flagColors = "--colors"; const std::string flagDummy = "--dummy"; +const std::string flagTexture = "--texturize"; + +const std::string texturePath = + std::string(ROOT_DIR) + + std::string("/assets/img/gates.bmp"); +SDL_Texture *gatesTexture = NULL; float normalizedToScreenX(const float nX, const int screenW) { return nX * screenW; @@ -80,6 +86,41 @@ float normalizedToScreenY(const float nY, const int screenH) { return nY * screenH; } +void ScreenType::setType(Type type) { + switch (type) { + case INPUT: + textureRect = {0, 1838, 604, 186}; + break; + case OUTPUT: + textureRect = {988, 1838, 604, 186}; + break; + case AND: + textureRect = {0, 0, 607, 321}; + break; + case NAND: + textureRect = {832, 0, 653, 321}; + break; + case OR: + textureRect = {30, 701, 623, 321}; + break; + case NOR: + textureRect = {861, 701, 672, 321}; + break; + case NOT: + textureRect = {0, 2122, 505, 278}; + break; + case DFF: + textureRect = {0, 0, 607, 321}; + break; + default: + break; + } +} + +Type ScreenType::getType() const { + return type; +} + void Element::move(const int dx, const int dy) { scrRect.x += dx; scrRect.y += dy; @@ -387,13 +428,14 @@ void drawFrame( const SDL_Color &backgroundColor, const int screenW, const int screenH, - const bool drawColor) { + const bool drawColor, + const bool texturize) { drawBackground(renderer, backgroundColor, drawColor); SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE); for (const Element &elementToDraw : elementsToDraw) { - if (drawColor) { + if (drawColor && !texturize) { SDL_SetRenderDrawColor(renderer, elementToDraw.fillColor.r, elementToDraw.fillColor.g, @@ -407,9 +449,14 @@ void drawFrame( elementToDraw.outlineColor.b, SDL_ALPHA_OPAQUE); } - - SDL_RenderDrawRectF(renderer, &elementToDraw.scrRect); - + if (texturize) { + SDL_RenderCopyF(renderer, + gatesTexture, + &elementToDraw.scrType.textureRect, + &elementToDraw.scrRect); + } else { + SDL_RenderDrawRectF(renderer, &elementToDraw.scrRect); + } for (const Connection &connectionToDraw : elementToDraw.connections) { if (drawColor) { SDL_SetRenderDrawColor(renderer, @@ -475,6 +522,7 @@ void defaultColor(std::vector &elementsToColor, SDL_Color &backgroundCo } int main(int argc, char *argv[]) { + std::cout << ROOT_DIR; CLI::App cliApp; std::string filename; @@ -512,6 +560,11 @@ int main(int argc, char *argv[]) { showDummy, "Show dummy nodes")->excludes(cliRaw); + bool texturize = false; + cliApp.add_flag(flagTexture, + texturize, + "Texturize nodes"); + CLI11_PARSE(cliApp, argc, argv); std::ifstream ifs(filename); @@ -564,9 +617,12 @@ int main(int argc, char *argv[]) { SDL_CreateWindow("test-viz", 0, 0, screenW, screenH, SDL_WINDOW_SHOWN); SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + SDL_Surface *gatesSurface = SDL_LoadBMP(texturePath.c_str()); + gatesTexture = SDL_CreateTextureFromSurface(renderer, gatesSurface); + SDL_FreeSurface(gatesSurface); convertNormToScreen(normalizedElements, screenW, screenH); - drawFrame(renderer, normalizedElements, backgroundColor, screenW, screenH, drawColor); + drawFrame(renderer, normalizedElements, backgroundColor, screenW, screenH, drawColor, texturize); // Event loop bool isRunning = true; @@ -629,10 +685,12 @@ int main(int argc, char *argv[]) { scaleViewport(scaleMouseWheel(event.wheel.y), normalizedElements); } } - drawFrame(renderer, normalizedElements, backgroundColor, screenW, screenH, drawColor); + drawFrame(renderer, normalizedElements, backgroundColor, screenW, screenH, drawColor, texturize); } // Shutdown SDL_DestroyWindow(window); + SDL_DestroyRenderer(renderer); + SDL_DestroyTexture(gatesTexture); SDL_Quit(); return 0; } diff --git a/src/main.h b/src/main.h index bb32d63..f8bc53f 100644 --- a/src/main.h +++ b/src/main.h @@ -11,6 +11,29 @@ #include +enum Type { + NONE = 0, + INPUT, + OUTPUT, + NOT, + AND, + OR, + NAND, + NOR, + DFF +}; + +struct ScreenType { + SDL_Rect textureRect; + + ScreenType(): type(NONE) {} + void setType(Type type); + Type getType() const; + +private: + Type type; +}; + struct NormalizedPoint { float nX; float nY; @@ -42,6 +65,7 @@ struct Element { SDL_Color outlineColor; SDL_Color fillColor; std::vector connections; + ScreenType scrType; Element(): id(-1), nW(0), nH(0) { outlineColor = {255, 255, 255, 255}; diff --git a/src/netfmt_bench.cpp b/src/netfmt_bench.cpp index f44316b..7963cf0 100644 --- a/src/netfmt_bench.cpp +++ b/src/netfmt_bench.cpp @@ -30,15 +30,15 @@ class BenchNetReader: public lorina::bench_reader { } virtual void on_input(const std::string &name) const override { - UNUSED(getNode(name)); + UNUSED(getNode(name, INPUT)); } virtual void on_output(const std::string &name) const override { - UNUSED(getNode(name)); + UNUSED(getNode(name, OUTPUT)); } virtual void on_dff_input(const std::string &input) const override { - UNUSED(getNode(input)); + UNUSED(getNode(input, DFF)); } virtual void on_dff( @@ -50,9 +50,19 @@ class BenchNetReader: public lorina::bench_reader { const std::vector &inputs, const std::string &output, const std::string &type) const override { - UNUSED(type); - - TreeNode *dst = getNode(output); + Type numType = NONE; + if (type == "NOT") { + numType = NOT; + } else if (type == "AND") { + numType = AND; + } else if (type == "OR") { + numType = OR; + } else if (type == "NAND") { + numType = NAND; + } else if (type == "NOR") { + numType = NOR; + } + TreeNode *dst = getNode(output, numType); for (const std::string &input: inputs) { linkNodes(getNode(input), dst); } @@ -69,14 +79,14 @@ class BenchNetReader: public lorina::bench_reader { dst->pred.push_back(src->id); } - TreeNode *getNode(const std::string &name) const { + TreeNode *getNode(const std::string &name, Type type = NONE) const { Net::Id id; auto it = nodeMap.find(name); if (it != nodeMap.end()) { id = it->second; } else { - id = net.addNode(); + id = net.addNode(type); nodeMap.emplace(name, id); } return net.getNode(id); diff --git a/test/bench.cpp b/test/bench.cpp index 5555aac..cd21a33 100644 --- a/test/bench.cpp +++ b/test/bench.cpp @@ -52,6 +52,7 @@ class bench_statistics_reader : public bench_reader { gate_lines.emplace_back( inputs, output, type ); ++_stats.number_of_lines; + std::cout << type << std::endl; } virtual void on_assign( const std::string& input, const std::string& output ) const override From a1ed4c950ac5662ca28cabcb78f80a0edc3c1872 Mon Sep 17 00:00:00 2001 From: yaksase Date: Sun, 21 May 2023 17:28:57 +0300 Subject: [PATCH 16/16] Fixed: DFF texturizing --- assets/img/gates.bmp | Bin 15283338 -> 15283338 bytes src/main.cpp | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/img/gates.bmp b/assets/img/gates.bmp index ed01bef531fcbfec4142e8e6c36fa9d392b15c70..e0d0169589e5e0ddc1e8b373e162ae09f150ce8c 100644 GIT binary patch delta 19330 zcmeI)dr(wW90zcZxWJk$Jv2iTH5C_Kgaji(e1M54$g*nrKx)P*B#msM5gkjK`56yi zB+w629ww%ng_@65Q_y^pY33_QG4V~4noT&M;`F^sYSWBk-NPSFbN=`+JimMQ%)RIQ ze&@2ARa4@Y1!*LxIk`{^GLS2|kvkcwB|So|$b(GeNsrQF^f*01t*H$?Np0yV@}hRs zo}Q)-Zsc3SLd$%&LubX{l;-% zj8A~0YL`#3+h3pF8zc2IH7<>(hdL*;IYV6!>UvPugPIG}T%c+ORWE5}qnZoUT%hIx zH5aJ4;Lg5+>Je0rpn3#V7pS^G)di|9co^z}f&ib9&AEPebO2ZR8oK&5G;7xEI$VVs zI0Hvv8`vQSWKo*_Y6p|5g1_DI$s!L{=zI>pL=D ze@v=DXit&Lf?a~S;B5A2{ZVP66Av$P4HWhKe%bJs^#_sg;A9t5pg5?VtRwUXWe8X9 z*JE%XM;(o@>W`TtJh`lWD}V6|_gfkst3N1P_;I11r#}~*85gZTCYOzG$63TFZFGi7 z#9(wvugChcF(!71{+N88_Q4nn*AKJFgoqZLkZ9^DYS|QFh}3^Hi@CCs)xu*s+6Kvl z*jqjU8_0ByXEk2rg(d*KCfH z3aMF?jxouU3#rcxHHMfbifagnbe=X+my)jq$7C;xln5#2kmd6% z>=hIt6_RvbyOchZJCY7XW6eD9*h^B&*{)-i7?T96M95+esTpPAnpxpeA!9~jb#6F3 zULqu)?Z>PZQHR!3qT0x3uR%5x3Z3F5YM)$QHZLK7>rYsvLMm~IS2=loghaiZAq;%wTB|^=pB^JozmsUi-qyi^qEc(bCHjdp z;mrpQ3=P!kv6WF09ZqA{mBeL!?!g>ZZ*%8{un`i^(Af;GF@L=?49>;!Zm|L?;O(7JjTv`wpD^_b= zn!c{zxtQe|ZXqm{y?eP&y1N3Wa%I)ndn;6`17Bu5uzqpoWsAey%kZLe%f$H&iL4C6 zH5}U%?J9R};>hNu87?7jhIXAgx0Yn{QjE8ew-Y8{A1=KqhHs+r2I6+W6!zX5p3@YW zja!Brk*V!L4$!)*BI#V`zNdET)WQ|G2&dr)Xgi84U;${484q{&J^%ZttJ{C-_Mf`_ zr*8kL+kfiz-@|bGPpwC4JyPqDT94Fvq}C&~9;ts*RWIXHFZaFkN={W5sJcMa1*$Gk zb-}->3mj-9)mv%Y@2x}B+pnk*P$Tev9f7HB(rYiyf)61bG9VMOU^dKwxiAmrLpFQ_ z3m^w_ArC$VhJ08EpTHtm3NKfwt&2~}_keumRf4QJpioP+al0WLafFJ8)v{u2Vi!%+YL delta 34834 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 TIt!hH&O;aUj~6cHb^ZSUeW#XR diff --git a/src/main.cpp b/src/main.cpp index ec17a77..83b1ee1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -110,7 +110,7 @@ void ScreenType::setType(Type type) { textureRect = {0, 2122, 505, 278}; break; case DFF: - textureRect = {0, 0, 607, 321}; + textureRect = {0, 1176, 512, 506}; break; default: break;