From 30453971dcc6becf1453278a326b20fa4baf46dc Mon Sep 17 00:00:00 2001 From: Simon Benoit Date: Sun, 12 Sep 2021 20:35:31 -0400 Subject: [PATCH 1/7] Use ws2812 with 12 leds segments --- .gitignore | 14 + chromance-firmware/chromance-firmware.ino | 502 ++++++++++------------ chromance-firmware/mapping.h | 284 +++++++----- chromance-firmware/ripple.h | 116 ++--- 4 files changed, 471 insertions(+), 445 deletions(-) diff --git a/.gitignore b/.gitignore index 4ef2717..fc3163d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,16 @@ *.log +*.o +*.d +*.bin +*.elf +*.map +*.ld +*.cache +*.a +**/.vscode/ +**/output + + + + diff --git a/chromance-firmware/chromance-firmware.ino b/chromance-firmware/chromance-firmware.ino index 91ff8a5..33dd8b7 100644 --- a/chromance-firmware/chromance-firmware.ino +++ b/chromance-firmware/chromance-firmware.ino @@ -6,41 +6,45 @@ (C) Voidstar Lab 2021 */ -#include +//#include +#include #include -#include -#include -#include +#include +#include #include #include #include "mapping.h" #include "ripple.h" -const char* ssid = "YourMom"; -const char* password = "is a nice lady"; - +#define HOSTNAME "ESP8266-OTA-" ///< Hostname. The setup function adds the Chip ID at the end. +#define NUMBER_OF_RIPPLES 30 // WiFi stuff - CHANGE FOR YOUR OWN NETWORK! -const IPAddress ip(4, 20, 6, 9); // IP address that THIS DEVICE should request -const IPAddress gateway(192, 168, 1, 1); // Your router -const IPAddress subnet(255, 255, 254, 0); // Your subnet mask (find it from your router's admin panel) -const int recv_port = 42069; // Port that OSC data should be sent to (pick one, put same one in EmotiBit's OSC Config XML file) +const IPAddress ip(192, 168, 5, 50); // IP address that THIS DEVICE should request +const IPAddress gateway(192, 168, 5, 1); // Your router +const IPAddress subnet(255, 255, 255, 0); // Your subnet mask (find it from your router's admin panel) +const int port = 23; + +//how many clients should be able to telnet to this ESP8266 +#define MAX_SRV_CLIENTS 2 + +/* int lengths[] = {154, 168, 84, 154}; // Strips are different lengths because I am a dumb Adafruit_DotStar strip0(lengths[0], 15, 2, DOTSTAR_BRG); Adafruit_DotStar strip1(lengths[1], 0, 4, DOTSTAR_BRG); Adafruit_DotStar strip2(lengths[2], 16, 17, DOTSTAR_BRG); Adafruit_DotStar strip3(lengths[3], 5, 18, DOTSTAR_BRG); - Adafruit_DotStar strips[4] = {strip0, strip1, strip2, strip3}; +*/ -byte ledColors[40][14][3]; // LED buffer - each ripple writes to this, then we write this to the strips -float decay = 0.97; // Multiply all LED's by this amount each tick to create fancy fading tails +Adafruit_NeoPixel strip(NUM_OF_PIXELS, D4, NEO_GRB + NEO_KHZ800); +uint8_t ledColors[NUMBER_OF_SEGMENTS][LEDS_PER_SEGMENTS][3]; // LED buffer - each ripple writes to this, then we write this to the strips +float decay = 0.97; // Multiply all LED's by this amount each tick to create fancy fading tails // These ripples are endlessly reused so we don't need to do any memory management -#define numberOfRipples 30 -Ripple ripples[numberOfRipples] = { +Ripple ripples[NUMBER_OF_RIPPLES] = { Ripple(0), Ripple(1), Ripple(2), @@ -70,44 +74,24 @@ Ripple ripples[numberOfRipples] = { Ripple(26), Ripple(27), Ripple(28), - Ripple(29), + Ripple(29) }; -// Biometric detection and interpretation -// IR (heartbeat) is used to fire outward ripples -float lastIrReading; // When our heart pumps, reflected IR drops sharply -float highestIrReading; // These vars let us detect this drop -unsigned long lastHeartbeat; // Track last heartbeat so we can detect noise/disconnections -#define heartbeatLockout 500 // Heartbeats that happen within this many milliseconds are ignored -#define heartbeatDelta 300 // Drop in reflected IR that constitutes a heartbeat - -// Heartbeat color ripples are proportional to skin temperature -#define lowTemperature 33.0 // Resting temperature -#define highTemperature 37.0 // Really fired up -float lastKnownTemperature = (lowTemperature + highTemperature) / 2.0; // Carries skin temperature from temperature callback to IR callback - -// EDA code was too unreliable and was cut. -// TODO: Rebuild EDA code - -// Gyroscope is used to reject data if you're moving too much -#define gyroAlpha 0.9 // Exponential smoothing constant -#define gyroThreshold 300 // Minimum angular velocity total (X+Y+Z) that disqualifies readings -float gyroX, gyroY, gyroZ; // If you don't have an EmotiBit or don't feel like wearing it, that's OK // We'll fire automatic pulses -#define randomPulsesEnabled true // Fire random rainbow pulses from random nodes +#define randomPulsesEnabled false // Fire random rainbow pulses from random nodes #define cubePulsesEnabled true // Draw cubes at random nodes -#define starburstPulsesEnabled true // Draw starbursts +#define starburstPulsesEnabled false // Draw starbursts #define simulatedBiometricsEnabled false // Simulate heartbeat and EDA ripples #define autoPulseTimeout 5000 // If no heartbeat is received in this many ms, begin firing random/simulated pulses -#define randomPulseTime 2000 // Fire a random pulse every (this many) ms +#define randomPulseTime 5000 // Fire a random pulse every (this many) ms unsigned long lastRandomPulse; byte lastAutoPulseNode = 255; byte numberOfAutoPulseTypes = randomPulsesEnabled + cubePulsesEnabled + starburstPulsesEnabled; -byte currentAutoPulseType = 255; +byte currentAutoPulseType = 0; #define autoPulseChangeTime 30000 unsigned long lastAutoPulseChange; @@ -118,20 +102,32 @@ unsigned long lastAutoPulseChange; unsigned long nextSimulatedHeartbeat; unsigned long nextSimulatedEda; + +void renderCube(int node); +void renderUnstoppableSnake(int startingNode); +void renderContour(int node); + void setup() { Serial.begin(115200); - Serial.println("*** LET'S GOOOOO ***"); - for (int i = 0; i < 4; i++) { - strips[i].begin(); - // strips[i].setBrightness(125); // If your PSU sucks, use this to limit the current - strips[i].show(); - } + strip.begin(); + strip.show(); - WiFi.mode(WIFI_STA); - WiFi.begin(ssid, password); +// WiFi.mode(WIFI_STA); + WiFi.begin("Nismon-IOT", "Ni$monIOT!!!!!"); WiFi.config(ip, gateway, subnet); + + // Set Hostname. + String hostname(HOSTNAME); + hostname += String(ESP.getChipId(), HEX); + WiFi.hostname(hostname); + + // Print hostname. + Serial.println("Hostname: " + hostname); + //Serial.println(WiFi.hostname()); + + while (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("Connection Failed! Rebooting..."); delay(5000); @@ -141,73 +137,8 @@ void setup() { Serial.print("WiFi connected, IP = "); Serial.println(WiFi.localIP()); - // Subscribe to OSC transmissions for important data - OscWiFi.subscribe(recv_port, "/EmotiBit/0/EDA", [](const OscMessage & m) { // This weird syntax is a lambda expression (anonymous nameless function) - lastKnownTemperature = m.arg(0); - }); - - OscWiFi.subscribe(recv_port, "/EmotiBit/0/GYRO:X", [](const OscMessage & m) { - gyroX = m.arg(0) * gyroAlpha + gyroX * (1 - gyroAlpha); - }); - - OscWiFi.subscribe(recv_port, "/EmotiBit/0/GYRO:Y", [](const OscMessage & m) { - gyroY = m.arg(0) * gyroAlpha + gyroY * (1 - gyroAlpha); - }); - - OscWiFi.subscribe(recv_port, "/EmotiBit/0/GYRO:Z", [](const OscMessage & m) { - gyroZ = m.arg(0) * gyroAlpha + gyroZ * (1 - gyroAlpha); - }); - - // Heartbeat detection and visualization happens here - OscWiFi.subscribe(recv_port, "/EmotiBit/0/PPG:IR", [](const OscMessage & m) { - float reading = m.arg(0); - Serial.println(reading); - - int hue = 0; - - // Ignore heartbeat when finger is wiggling around - it's not accurate - float gyroTotal = abs(gyroX) + abs(gyroY) + abs(gyroZ); - - if (gyroTotal < gyroThreshold && lastIrReading >= reading) { - // Our hand is sitting still and the reading dropped - let's pulse! - Serial.print("> "); - Serial.println(highestIrReading - reading); - if (highestIrReading - reading >= heartbeatDelta) { - if (millis() - lastHeartbeat >= heartbeatLockout) { - hue = fmap(lastKnownTemperature, lowTemperature, highTemperature, 0xFFFF, 0); - for (int i = 0; i < 6; i++) { - if (nodeConnections[15][i] > 0) { - bool firedRipple = false; - // Find a dead ripple to reuse it - for (int j = 0; j < 30; j++) { - if (!firedRipple && ripples[j].state == dead) { - ripples[j].start( - 15, - i, - strip0.ColorHSV(hue, 255, 255), - float(random(100)) / 100.0 * .2 + .8, - 500, - 2); - - firedRipple = true; - } - } - } - } - } - - lastHeartbeat = millis(); - } - } - else { - highestIrReading = 0; - } - - lastIrReading = reading; - if (reading > highestIrReading) - highestIrReading = reading; - }); - + // Start OTA server. + ArduinoOTA.setHostname((const char *)hostname.c_str()); // Wireless OTA updating? On an ARDUINO?! It's more likely than you think! ArduinoOTA .onStart([]() { @@ -219,14 +150,14 @@ void setup() { // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() Serial.println("Start updating " + type); - }) - .onEnd([]() { + }); + ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); - }) - .onProgress([](unsigned int progress, unsigned int total) { + }); + ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); - }) - .onError([](ota_error_t error) { + }); + ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); @@ -244,194 +175,109 @@ void setup() { void loop() { unsigned long benchmark = millis(); - - OscWiFi.parse(); - + static int currentLed = 0; + static unsigned long lastStep = 0; + + ArduinoOTA.handle(); // Fade all dots to create trails - for (int strip = 0; strip < 40; strip++) { - for (int led = 0; led < 14; led++) { + for (int seg = 0; seg < NUMBER_OF_SEGMENTS; seg++) { + for (int led = 0; led < LEDS_PER_SEGMENTS; led++) { for (int i = 0; i < 3; i++) { - ledColors[strip][led][i] *= decay; + ledColors[seg][led][i] *= decay; + // ledColors[seg][led][i] *= 5; } } } - for (int i = 0; i < numberOfRipples; i++) { + for (int i = 0; i < NUMBER_OF_RIPPLES; i++) { ripples[i].advance(ledColors); } - for (int segment = 0; segment < 40; segment++) { - for (int fromBottom = 0; fromBottom < 14; fromBottom++) { - int strip = ledAssignments[segment][0]; - int led = round(fmap( - fromBottom, - 0, 13, - ledAssignments[segment][2], ledAssignments[segment][1])); - strips[strip].setPixelColor( - led, - ledColors[segment][fromBottom][0], - ledColors[segment][fromBottom][1], - ledColors[segment][fromBottom][2]); + for (uint8_t segment = 0; segment < NUMBER_OF_SEGMENTS; segment++) { + for (uint8_t fromBottom = 0; fromBottom < LEDS_PER_SEGMENTS; fromBottom++) { + //int strip = ledAssignments[segment][0]; // Select the proper strip number ( if you have multiple strips ) + uint16_t led = round(fmap(fromBottom,0, (LEDS_PER_SEGMENTS-1),ledAssignments[segment][2], ledAssignments[segment][1])); + strip.setPixelColor(led, ledColors[segment][fromBottom][0], ledColors[segment][fromBottom][1],ledColors[segment][fromBottom][2]); + } } + // // strip.setPixelColor(currentLed, 0,0,0); + // for (int i = 0; i < NUMBER_OF_SEGMENTS; i++) { + + // strip.setPixelColor(LEDS_PER_SEGMENTS*(i-1), 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+1, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+2, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+3, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+4, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+5, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+6, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+7, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+8, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+9, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+10, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+11, 0,0,0); + + // strip.setPixelColor(LEDS_PER_SEGMENTS*i, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+1, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+2, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+3, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+4, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+5, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+6, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+7, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+8, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+9, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+10, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+11, 20,50,50); + // // currentLed %= (NUMBER_OF_SEGMENTS*LEDS_PER_SEGMENTS); + // // lastStep = millis(); + strip.show(); + + // delay(500); + // } + + + // When biometric data is unavailable, visualize at random + if (numberOfAutoPulseTypes && millis() - lastRandomPulse >= randomPulseTime) { + unsigned int baseColor = random(0xFFFF); + + currentAutoPulseType = random(3); + switch (currentAutoPulseType) { + case 0: { + renderContour(1); + } - for (int i = 0; i < 4; i++) - strips[i].show(); - - if (millis() - lastHeartbeat >= autoPulseTimeout) { - // When biometric data is unavailable, visualize at random - if (numberOfAutoPulseTypes && millis() - lastRandomPulse >= randomPulseTime) { - unsigned int baseColor = random(0xFFFF); - - if (currentAutoPulseType == 255 || (numberOfAutoPulseTypes > 1 && millis() - lastAutoPulseChange >= autoPulseChangeTime)) { - byte possiblePulse = 255; - while (true) { - possiblePulse = random(3); - - if (possiblePulse == currentAutoPulseType) - continue; - - switch (possiblePulse) { - case 0: - if (!randomPulsesEnabled) - continue; - break; - - case 1: - if (!cubePulsesEnabled) - continue; - break; - - case 2: - if (!starburstPulsesEnabled) - continue; - break; - - default: - continue; - } - - currentAutoPulseType = possiblePulse; - lastAutoPulseChange = millis(); + case 1: { + //renderCube(11); + //renderContour(1); + renderUnstoppableSnake(15); break; } - } - - switch (currentAutoPulseType) { - case 0: { - int node = 0; - bool foundStartingNode = false; - while (!foundStartingNode) { - node = random(25); - foundStartingNode = true; - for (int i = 0; i < numberOfBorderNodes; i++) { - // Don't fire a pulse on one of the outer nodes - it looks boring - if (node == borderNodes[i]) - foundStartingNode = false; - } - - if (node == lastAutoPulseNode) - foundStartingNode = false; - } - - lastAutoPulseNode = node; - - for (int i = 0; i < 6; i++) { - if (nodeConnections[node][i] >= 0) { - for (int j = 0; j < numberOfRipples; j++) { - if (ripples[j].state == dead) { - ripples[j].start( - node, - i, -// strip0.ColorHSV(baseColor + (0xFFFF / 6) * i, 255, 255), - strip0.ColorHSV(baseColor, 255, 255), - float(random(100)) / 100.0 * .2 + .5, - 3000, - 1); - - break; - } - } - } - } - break; - } - - case 1: { - int node = cubeNodes[random(numberOfCubeNodes)]; - - while (node == lastAutoPulseNode) - node = cubeNodes[random(numberOfCubeNodes)]; - - lastAutoPulseNode = node; - byte behavior = random(2) ? alwaysTurnsLeft : alwaysTurnsRight; - - for (int i = 0; i < 6; i++) { - if (nodeConnections[node][i] >= 0) { - for (int j = 0; j < numberOfRipples; j++) { - if (ripples[j].state == dead) { - ripples[j].start( - node, - i, -// strip0.ColorHSV(baseColor + (0xFFFF / 6) * i, 255, 255), - strip0.ColorHSV(baseColor, 255, 255), - .5, - 2000, - behavior); - - break; - } - } - } - } - break; - } - - case 2: { - byte behavior = random(2) ? alwaysTurnsLeft : alwaysTurnsRight; - - lastAutoPulseNode = starburstNode; - - for (int i = 0; i < 6; i++) { - for (int j = 0; j < numberOfRipples; j++) { - if (ripples[j].state == dead) { - ripples[j].start( - starburstNode, - i, - strip0.ColorHSV(baseColor + (0xFFFF / 6) * i, 255, 255), - .65, - 1500, - behavior); - - break; - } - } - } - break; - } + case 2: { + renderCube(random(numberOfCubeNodes)); + } - default: - break; - } - lastRandomPulse = millis(); + default: + break; } + lastRandomPulse = millis(); if (simulatedBiometricsEnabled) { // Simulated heartbeat if (millis() >= nextSimulatedHeartbeat) { - for (int i = 0; i < 6; i++) { - for (int j = 0; j < numberOfRipples; j++) { - if (ripples[j].state == dead) { + for (int i = 0; i < SIDES_PER_NODES; i++) { + for (int j = 0; j < NUMBER_OF_RIPPLES; j++) { + if (ripples[j].state == STATE_DEAD) { ripples[j].start( 15, i, 0xEE1111, float(random(100)) / 100.0 * .1 + .4, 1000, - 0); + BEHAVIOR_WEAK); break; } @@ -444,8 +290,8 @@ void loop() { // Simulated EDA ripples if (millis() >= nextSimulatedEda) { for (int i = 0; i < 10; i++) { - for (int j = 0; j < numberOfRipples; j++) { - if (ripples[j].state == dead) { + for (int j = 0; j < NUMBER_OF_RIPPLES; j++) { + if (ripples[j].state == STATE_DEAD) { byte targetNode = borderNodes[random(numberOfBorderNodes)]; byte direction = 255; @@ -461,7 +307,7 @@ void loop() { 0x1111EE, float(random(100)) / 100.0 * .5 + 2, 300, - 2 + BEHAVIOR_ANGRY ); break; @@ -472,8 +318,92 @@ void loop() { nextSimulatedEda = millis() + simulatedEdaBaseTime + random(simulatedEdaVariance); } } + + } +} + +void renderCube(int node){ + +// int node = cubeNodes[random(numberOfCubeNodes)]; + unsigned int baseColor = random(0xFFFF); + + while (node == lastAutoPulseNode) + node = cubeNodes[random(numberOfCubeNodes)]; + + lastAutoPulseNode = node; + + rippleBehavior behavior = random(2) ? BEHAVIOR_ALWAYS_LEFT : BEHAVIOR_ALWAYS_RIGHT; + + for (int i = 0; i < SIDES_PER_NODES; i++) { + if (nodeConnections[node][i] >= 0) { + for (int j = 0; j < NUMBER_OF_RIPPLES; j++) { + if (ripples[j].state == STATE_DEAD) { + ripples[j].start( + node, + i, + strip.ColorHSV(baseColor + (0xFFFF / 6) * i, 255, 255), + .8, + 8000, + behavior); + break; + } + } + } + } +} + +void renderContour(int node){ + +// int node = cubeNodes[random(numberOfCubeNodes)]; + unsigned int baseColor = random(0xFFFF); + + rippleBehavior behavior; + + for (int i = 0; i < SIDES_PER_NODES; i++) { + if (nodeConnections[node][i] >= 0) { + if ( i < 3){ + behavior = BEHAVIOR_ALWAYS_RIGHT; + } + else{ + behavior = BEHAVIOR_ALWAYS_LEFT; + } + for (int j = 0; j < NUMBER_OF_RIPPLES; j++) { + if (ripples[j].state == STATE_DEAD) { + ripples[j].start( + node, + i, + strip.ColorHSV(baseColor + (0xFFFF / 6) * i, 255, 255), + .8, + 8000, + behavior); + break; + } + } + } } +} - // Serial.print("Benchmark: "); - // Serial.println(millis() - benchmark); +void renderUnstoppableSnake(int startingNode){ +// int node = cubeNodes[random(numberOfCubeNodes)]; + unsigned int baseColor = random(0xFFFF); + unsigned int randStartingNode = random(5); + + rippleBehavior behavior = BEHAVIOR_ANGRY; + + for (int i = 0; i < SIDES_PER_NODES; i++) { + if (nodeConnections[startingNode][(randStartingNode+i)%5] >= 0) { + for (int j = 0; j < NUMBER_OF_RIPPLES; j++) { + if (ripples[j].state == STATE_DEAD) { + ripples[j].start( + startingNode, + (randStartingNode+i)%5, + strip.ColorHSV(baseColor + (0xFFFF / 6) * i, 255, 255), + .8, + 15000, + behavior); + return; + } + } + } + } } diff --git a/chromance-firmware/mapping.h b/chromance-firmware/mapping.h index c518149..cfbce3b 100644 --- a/chromance-firmware/mapping.h +++ b/chromance-firmware/mapping.h @@ -7,149 +7,219 @@ #define MAPPING_H_ // I accidentally noted these down 1-indexed and I'm too tired to adjust them -#define headof(S) ((S - 1) * 14) -#define tailof(S) (headof(S) + 13) +#define headof(S) ((S * LEDS_PER_SEGMENTS)) +#define tailof(S) (headof(S) + (LEDS_PER_SEGMENTS -1)) + +#define NUMBER_OF_NODES 24 +#define SIDES_PER_NODES 6 + +#define NUMBER_OF_SEGMENTS 38 +#define SIDES_PER_SEGMENT 2 +#define NUM_OF_PIXELS (NUMBER_OF_SEGMENTS*LEDS_PER_SEGMENTS) + +#define LEDS_PER_SEGMENTS 12 + // Beam 0 is at 12:00 and advance clockwise // -1 means nothing connected on that side -int nodeConnections[25][6] = { - {-1, -1, 1, -1, 0, -1}, - {-1, -1, 3, -1, 2, -1}, - {-1, -1, 5, -1, 4, -1}, - {-1, 0, 6, 12, -1, -1}, - {-1, 2, 8, 14, 7, 1}, +// First node is the upper left one, they are numbered from left to right 1 row at the time +// The value is the connected segment number +int nodeConnections[NUMBER_OF_NODES][SIDES_PER_NODES] = { + {-1, -1, 2, -1, 3, -1}, + {-1, -1, 20, -1, 19, -1}, + {-1, -1, 22, -1, 21, -1}, - {-1, 4, 10, 16, 9, 3}, - {-1, -1, -1, 18, 11, 5}, - {-1, 7, -1, 13, -1, 6}, - {-1, 9, -1, 15, -1, 8}, - {-1, 11, -1, 17, -1, 10}, + {-1, 3, 7, 4, -1, -1}, + {-1, 19, 18, 1, 8, 2}, + {-1, 21, 24, 26, 25, 20}, + {-1, -1, -1, 29, 23, 22}, + + {-1, 8, -1, 6, -1, 7}, + {-1, 25, -1, 17, -1, 18}, + {-1, 23, -1, 30, -1, 24}, + + {4, -1, 5, -1, -1, -1}, + {1, -1, 0, -1, 9, -1}, + {26, -1, 27, -1, 36, -1}, + {29, -1, -1, -1, 28, -1}, - {12, -1, 19, -1, -1, -1}, - {14, -1, 21, -1, 20, -1}, - {16, -1, 23, -1, 22, -1}, - {18, -1, -1, -1, 24, -1}, - {13, 20, 25, 29, -1, -1}, + {6, 9, 15, 10, -1, 5}, + {17, 36, 35, 13, 14, 0}, + {30, 28, -1, 31, 37, 27}, + + {-1, 14, -1, 16, -1, 15}, + {-1, 37, -1, 34, -1, 35}, - {15, 22, 27, 31, 26, 21}, - {17, 24, -1, 33, 28, 23}, - {-1, 26, -1, 30, -1, 25}, - {-1, 28, -1, 32, -1, 27}, - {29, -1, 34, -1, -1, -1}, + {10, -1, 11, -1, -1, -1}, + {13, -1, 33, -1, 12, -1}, + {31, -1, -1, -1, 32, -1}, - {31, -1, 36, -1, 35, -1}, - {33, -1, -1, -1, 37, -1}, - {30, 35, 38, -1, -1, 34}, - {32, 37, -1, -1, 39, 36}, - {-1, 39, -1, -1, -1, 38} + {16, 12, -1, -1, -1, 11}, + {34, 32, -1, -1, -1, 33} }; +// int nodeConnections[NUMBER_OF_NODES][SIDES_PER_NODES] = { +// {-1, -1, 3, -1, 4, -1}, +// {-1, -1, 21, -1, 22, -1}, +// {-1, -1, 23, -1, 22, -1}, + +// {-1, 4, 8, 5, -1, -1}, +// {-1, 20, 19, 2, 9, 3}, +// {-1, 22, 25, 27, 26, 21}, +// {-1, -1, -1, 30, 24, 23}, + +// {-1, 9, -1, 7, -1, 8}, +// {-1, 26, -1, 18, -1, 19}, +// {-1, 24, -1, 31, -1, 25}, + +// {5, -1, 6, -1, -1, -1}, +// {2, -1, 1, -1, 10, -1}, +// {27, -1, 28, -1, 37, -1}, +// {30, -1, -1, -1, 29, -1}, + +// {7, 10, 16, 11, -1, 6}, +// {18, 37, 36, 14, 15, 1}, +// {31, 29, -1, 32, 38, 28}, + +// {-1, 15, -1, 17, -1, 16}, +// {-1, 38, -1, 35, -1, 36}, + +// {11, -1, 12, -1, -1, -1}, +// {14, -1, 34, -1, 13, -1}, +// {32, -1, -1, -1, 33, -1}, + +// {17, 13, -1, -1, -1, 12}, +// {35, 33, -1, -1, -1, 34} +// }; + +// int nodeConnections[NUMBER_OF_NODES][SIDES_PER_NODES] = { +// {-1, -1, 4, -1, 3, -1}, +// {-1, -1, 5, -1, 4, -1}, +// {-1, -1, 6, -1, 5, -1}, + +// {-1, 0, 7, 10, -1, -1}, +// {-1, 1, 8, 11, 7, 0}, +// {-1, 2, 9, 12, 8, 1}, +// {-1, -1, -1, 13, 9, 2}, + +// {-1, 4, -1, 14, -1, 3}, +// {-1, 5, -1, 15, -1, 4}, +// {-1, 6, -1, 16, -1, 5}, + +// {3, -1, 14, -1, -1, -1}, +// {4, -1, 15, -1, 14, -1}, +// {5, -1, 16, -1, 15, -1}, +// {6, -1, -1, -1, 16, -1}, + +// {7, 11, 17, 19, -1, -1}, +// {8, 12, 18, 20, 17, 11}, +// {9, 13, -1, 21, 18, 12}, + +// {-1, 15, -1, 22, -1, 14}, +// {-1, 16, -1, 23, -1, 15}, + +// {14, -1, 22, -1, -1, -1}, +// {15, -1, 23, -1, 22, -1}, +// {16, -1, -1, -1, 23, -1}, + +// {17, 20, -1, -1, -1, 19}, +// {18, 21, -1, -1, -1, 20} +// }; // First member: Node closer to ceiling // Second: Node closer to floor -int segmentConnections[40][2] = { - {0, 3}, +int segmentConnections[NUMBER_OF_SEGMENTS][SIDES_PER_SEGMENT] = { + {11, 15}, + {4, 11}, {0, 4}, + {0, 3}, + {3, 10}, + {10, 14}, + {7, 14}, + {3, 7}, + {4, 7}, + {11, 14}, + {14, 19}, + {19, 22}, + {20, 22}, + {15, 20}, + {15, 17}, + {14, 17}, + {17, 22}, + {8, 15}, + {4, 8}, {1, 4}, {1, 5}, {2, 5}, {2, 6}, - {3, 7}, - {4, 7}, - {4, 8}, - {5, 8}, - {5, 9}, {6, 9}, // ayy - {3, 10}, - {7, 14}, - {4, 11}, - {8, 15}, + {5, 9}, + {5, 8}, {5, 12}, - {9, 16}, - {6, 13}, - {10, 14}, - {11, 14}, - {11, 15}, - {12, 15}, {12, 16}, {13, 16}, - {14, 17}, - {15, 17}, - {15, 18}, - {16, 18}, - {14, 19}, - {17, 22}, - {15, 20}, - {18, 23}, + {6, 13}, + {9, 16}, {16, 21}, - {19, 22}, - {20, 22}, - {20, 23}, {21, 23}, - {22, 24}, - {23, 24} + {20, 23}, + {18, 23}, + {15, 18}, + {12, 15}, + {16, 18} }; // First member: Strip number // Second: LED index closer to ceiling // Third: LED index closer to floor -int ledAssignments[40][3] = { - {2, headof(3), tailof(3)}, - {2, tailof(2), headof(2)}, - {1, headof(10), tailof(10)}, - {1, tailof(9), headof(9)}, - {1, headof(4), tailof(4)}, - {1, tailof(3), headof(3)}, - - {2, tailof(6), headof(6)}, - {3, tailof(11), headof(11)}, - {1, headof(11), tailof(11)}, - {1, tailof(8), headof(8)}, - {1, headof(12), tailof(12)}, - {0, tailof(11), headof(11)}, - - {2, headof(4), tailof(4)}, - {3, tailof(10), headof(10)}, - {2, tailof(1), headof(1)}, - {1, tailof(7), headof(7)}, - {1, headof(5), tailof(5)}, - {0, tailof(10), headof(10)}, - {1, tailof(2), headof(2)}, - - {2, headof(5), tailof(5)}, - {3, tailof(4), headof(4)}, - {3, headof(5), tailof(5)}, +int ledAssignments[NUMBER_OF_SEGMENTS][3] = { + {0, tailof(0), headof(0)}, + {0, tailof(1), headof(1)}, + {0, tailof(2), headof(2)}, + {0, headof(3), tailof(3)}, + {0, headof(4), tailof(4)}, {0, headof(5), tailof(5)}, - {0, tailof(4), headof(4)}, - {1, tailof(1), headof(1)}, - - {3, tailof(9), headof(9)}, - {0, headof(6), tailof(6)}, - {1, tailof(6), headof(6)}, - {0, tailof(9), headof(9)}, - - {3, tailof(3), headof(3)}, - {3, tailof(8), headof(8)}, - {3, headof(6), tailof(6)}, + {0, tailof(6), headof(6)}, + {0, tailof(7), headof(7)}, {0, tailof(8), headof(8)}, - {0, tailof(3), headof(3)}, - - {3, tailof(2), headof(2)}, - {3, headof(7), tailof(7)}, - {0, headof(7), tailof(7)}, - {0, tailof(2), headof(2)}, - - {3, tailof(1), headof(1)}, - {0, tailof(1), headof(1)} + {0, headof(9), tailof(9)}, + {0, headof(10), tailof(10)}, + {0, headof(11), tailof(11)}, + {0, tailof(12), headof(12)}, + {0, tailof(13), headof(13)}, + {0, headof(14), tailof(14)}, + {0, tailof(15), headof(15)}, + {0, headof(16), tailof(16)}, + {0, tailof(17), headof(17)}, + {0, tailof(18), headof(18)}, + {0, tailof(19), headof(19)}, + {0, headof(20), tailof(20)}, + {0, tailof(21), headof(21)}, + {0, headof(22), tailof(22)}, + {0, headof(23), tailof(23)}, + {0, tailof(24), headof(24)}, + {0, headof(25), tailof(25)}, + {0, headof(26), tailof(26)}, + {0, headof(27), tailof(27)}, + {0, tailof(28), headof(28)}, + {0, tailof(29), headof(29)}, + {0, headof(30), tailof(30)}, + {0, headof(31), tailof(31)}, + {0, headof(32), tailof(32)}, + {0, tailof(33), headof(33)}, + {0, tailof(34), headof(34)}, + {0, tailof(35), headof(35)}, + {0, tailof(36), headof(36)}, + {0, headof(37), tailof(37)} }; // Border nodes are on the very edge of the network. // Ripples fired here don't look very impressive. -int numberOfBorderNodes = 10; -int borderNodes[] = {0, 1, 2, 3, 6, 10, 13, 19, 21, 24}; +int numberOfBorderNodes = 13; +int borderNodes[] = {0, 1, 2, 3, 6, 10, 13, 14, 16, 19, 21 , 22 , 23}; // Cube nodes link three equiangular segments // Firing ripples that always turn in one direction will draw a cube -int numberOfCubeNodes = 8; +int numberOfCubeNodes = 7; int cubeNodes[] = {7, 8, 9, 11, 12, 17, 18}; // Firing ripples that always turn in one direction will draw a starburst diff --git a/chromance-firmware/ripple.h b/chromance-firmware/ripple.h index fd76184..4bf6823 100644 --- a/chromance-firmware/ripple.h +++ b/chromance-firmware/ripple.h @@ -7,25 +7,26 @@ #define RIPPLE_H_ // WARNING: These slow things down enough to affect performance. Don't turn on unless you need them! -//#define DEBUG_ADVANCEMENT // Print debug messages about ripples' movement -//#define DEBUG_RENDERING // Print debug messages about translating logical to actual position +// #define DEBUG_ADVANCEMENT // Print debug messages about ripples' movement +// #define DEBUG_RENDERING // Print debug messages about translating logical to actual position -#include +// #include #include "mapping.h" enum rippleState { - dead, - withinNode, // Ripple isn't drawn as it passes through a node to keep the speed consistent - travelingUpwards, - travelingDownwards + STATE_DEAD, + STATE_WITHIN_NODE, // Ripple isn't drawn as it passes through a node to keep the speed consistent + STATE_TRAVEL_UP, + STATE_TRAVEL_DOWN }; enum rippleBehavior { - weaksauce = 0, - feisty = 1, - angry = 2, - alwaysTurnsRight = 3, - alwaysTurnsLeft = 4 + BEHAVIOR_WEAK = 0, + BEHAVIOR_FEISTY = 1, + BEHAVIOR_ANGRY = 2, + BEHAVIOR_ALWAYS_RIGHT = 3, + BEHAVIOR_ALWAYS_LEFT = 4, + BEHAVIOR_EXPLODING = 5 }; float fmap(float x, float in_min, float in_max, float out_min, float out_max) { @@ -39,7 +40,7 @@ class Ripple { Serial.println(rippleId); } - rippleState state = dead; + rippleState state = STATE_DEAD; unsigned long color; /* @@ -49,7 +50,7 @@ class Ripple { int position[2]; // Place the Ripple in a node - void start(byte n, byte d, unsigned long c, float s, unsigned long l, byte b) { + void start(byte n, byte d, unsigned long c, float s, unsigned long l, rippleBehavior b) { color = c; speed = s; lifespan = l; @@ -57,7 +58,7 @@ class Ripple { birthday = millis(); pressure = 0; - state = withinNode; + state = STATE_WITHIN_NODE; position[0] = n; position[1] = d; @@ -72,16 +73,16 @@ class Ripple { Serial.println(position[1]); } - void advance(byte ledColors[40][14][3]) { + void advance(byte ledColors[NUMBER_OF_SEGMENTS][LEDS_PER_SEGMENTS][3]) { unsigned long age = millis() - birthday; - if (state == dead) + if (state == STATE_DEAD) return; pressure += fmap(float(age), 0.0, float(lifespan), speed, 0.0); // Ripple slows down as it ages // TODO: Motion of ripple is severely affected by loop speed. Make it time invariant - if (pressure < 1 && (state == travelingUpwards || state == travelingDownwards)) { + if (pressure < 1 && (state == STATE_TRAVEL_UP || state == STATE_TRAVEL_DOWN)) { // Ripple is visible but hasn't moved - render it to avoid flickering renderLed(ledColors, age); } @@ -94,7 +95,7 @@ class Ripple { #endif switch (state) { - case withinNode: { + case STATE_WITHIN_NODE: { if (justStarted) { justStarted = false; } @@ -108,13 +109,13 @@ class Ripple { int newDirection = -1; - int sharpLeft = (position[1] + 1) % 6; - int wideLeft = (position[1] + 2) % 6; - int forward = (position[1] + 3) % 6; - int wideRight = (position[1] + 4) % 6; - int sharpRight = (position[1] + 5) % 6; + int sharpLeft = (position[1] + 1) % SIDES_PER_NODES; + int wideLeft = (position[1] + 2) % SIDES_PER_NODES; + int forward = (position[1] + 3) % SIDES_PER_NODES; + int wideRight = (position[1] + 4) % SIDES_PER_NODES; + int sharpRight = (position[1] + 5) % SIDES_PER_NODES; - if (behavior <= 2) { // Semi-random aggressive turn mode + if (behavior <= BEHAVIOR_ANGRY) { // Semi-random aggressive turn mode // The more aggressive a ripple, the tighter turns it wants to make. // If there aren't any segments it can turn to, we need to adjust its behavior. byte anger = behavior; @@ -203,9 +204,9 @@ class Ripple { // Good thing we don't have any of those! } } - else if (behavior == alwaysTurnsRight) { - for (int i = 1; i < 6; i++) { - int possibleDirection = (position[1] + i) % 6; + else if (behavior == BEHAVIOR_ALWAYS_RIGHT) { + for (int i = 1; i < SIDES_PER_NODES; i++) { + int possibleDirection = (position[1] + i) % SIDES_PER_NODES; if (nodeConnections[position[0]][possibleDirection] >= 0) { newDirection = possibleDirection; @@ -217,9 +218,9 @@ class Ripple { Serial.println(" Turning as rightward as possible"); #endif } - else if (behavior == alwaysTurnsLeft) { + else if (behavior == BEHAVIOR_ALWAYS_LEFT) { for (int i = 5; i >= 1; i--) { - int possibleDirection = (position[1] + i) % 6; + int possibleDirection = (position[1] + i) % SIDES_PER_NODES; if (nodeConnections[position[0]][possibleDirection] >= 0) { newDirection = possibleDirection; @@ -227,6 +228,20 @@ class Ripple { } } +#ifdef DEBUG_ADVANCEMENT + Serial.println(" Turning as leftward as possible"); +#endif + } + else if (behavior == BEHAVIOR_EXPLODING) { + for (int i = 5; i >= 1; i--) { + int possibleDirection = (position[1] + i) % SIDES_PER_NODES; + + if (nodeConnections[position[0]][possibleDirection] >= 0 && (possibleDirection != position[0])) { + newDirection = possibleDirection; + // start + } + } + #ifdef DEBUG_ADVANCEMENT Serial.println(" Turning as leftward as possible"); #endif @@ -253,23 +268,23 @@ class Ripple { #ifdef DEBUG_ADVANCEMENT Serial.println(" (starting at bottom)"); #endif - state = travelingUpwards; + state = STATE_TRAVEL_UP; position[1] = 0; // Starting at bottom of segment } else { #ifdef DEBUG_ADVANCEMENT Serial.println(" (starting at top)"); #endif - state = travelingDownwards; - position[1] = 13; // Starting at top of 14-LED-long strip + state = STATE_TRAVEL_DOWN; + position[1] = LEDS_PER_SEGMENTS - 1; // Starting at top of LED-strip } break; } - case travelingUpwards: { + case STATE_TRAVEL_UP: { position[1]++; - if (position[1] >= 14) { + if (position[1] >= LEDS_PER_SEGMENTS) { // We've reached the top! #ifdef DEBUG_ADVANCEMENT Serial.print(" Reached top of seg. "); @@ -278,7 +293,7 @@ class Ripple { // Enter the new node. int segment = position[0]; position[0] = segmentConnections[position[0]][0]; - for (int i = 0; i < 6; i++) { + for (int i = 0; i < SIDES_PER_NODES; i++) { // Figure out from which direction the ripple is entering the node. // Allows us to exit in an appropriately aggressive direction. int incomingConnection = nodeConnections[position[0]][i]; @@ -291,7 +306,7 @@ class Ripple { Serial.print(" from direction "); Serial.println(position[1]); #endif - state = withinNode; + state = STATE_WITHIN_NODE; } else { #ifdef DEBUG_ADVANCEMENT @@ -304,7 +319,7 @@ class Ripple { break; } - case travelingDownwards: { + case STATE_TRAVEL_DOWN: { position[1]--; if (position[1] < 0) { // We've reached the bottom! @@ -328,7 +343,7 @@ class Ripple { Serial.print(" from direction "); Serial.println(position[1]); #endif - state = withinNode; + state = STATE_WITHIN_NODE; } else { #ifdef DEBUG_ADVANCEMENT @@ -347,13 +362,13 @@ class Ripple { pressure -= 1; - if (state == travelingUpwards || state == travelingDownwards) { + if (state == STATE_TRAVEL_UP || state == STATE_TRAVEL_DOWN) { // Ripple is visible - render it renderLed(ledColors, age); } } -#ifdef DEBUG_ADVANCEMENT +#ifdef DEBUG_AGE Serial.print(" Age is now "); Serial.print(age); Serial.print('/'); @@ -361,11 +376,11 @@ class Ripple { #endif if (lifespan && age >= lifespan) { - // We dead -#ifdef DEBUG_ADVANCEMENT - Serial.println(" Lifespan is up! Ripple is dead."); + // We STATE_DEAD +#ifdef DEBUG_AGE + Serial.println(" Lifespan is up! Ripple is STATE_DEAD."); #endif - state = dead; + state = STATE_DEAD; position[0] = position[1] = pressure = age = 0; } } @@ -379,20 +394,16 @@ class Ripple { 1: Can take 60-degree turns 2: Can take 120-degree turns */ - byte behavior; - + rippleBehavior behavior; bool justStarted = false; - float pressure; // When Pressure reaches 1, ripple will move unsigned long birthday; // Used to track age of ripple - static byte rippleCount; // Used to give them unique ID's byte rippleId; // Used to identify this ripple in debug output - void renderLed(byte ledColors[40][14][3], unsigned long age) { + void renderLed(byte ledColors[NUMBER_OF_SEGMENTS][LEDS_PER_SEGMENTS][3], unsigned long age) { int strip = ledAssignments[position[0]][0]; int led = ledAssignments[position[0]][2] + position[1]; - int red = ledColors[position[0]][position[1]][0]; int green = ledColors[position[0]][position[1]][1]; int blue = ledColors[position[0]][position[1]][2]; @@ -412,8 +423,9 @@ class Ripple { Serial.print(led); Serial.print(", color 0x"); for (int i = 0; i < 3; i++) { - if (ledColors[position[0]][position[1]][i] <= 0x0F) + if (ledColors[position[0]][position[1]][i] <= 0x0F){ Serial.print('0'); + } Serial.print(ledColors[position[0]][position[1]][i], HEX); } Serial.println(); From 96826d9af44d0d57d4f8cced648e3f7881f69094 Mon Sep 17 00:00:00 2001 From: Simon Benoit Date: Mon, 27 Sep 2021 18:31:19 -0400 Subject: [PATCH 2/7] Mass cleanup --- chromance-firmware/chromance-firmware.ino | 697 ++++++++++++++-------- chromance-firmware/mapping.h | 3 + chromance-firmware/ripple.h | 58 +- 3 files changed, 484 insertions(+), 274 deletions(-) diff --git a/chromance-firmware/chromance-firmware.ino b/chromance-firmware/chromance-firmware.ino index 33dd8b7..0a2e8c5 100644 --- a/chromance-firmware/chromance-firmware.ino +++ b/chromance-firmware/chromance-firmware.ino @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include "mapping.h" @@ -27,16 +28,10 @@ const int port = 23; //how many clients should be able to telnet to this ESP8266 #define MAX_SRV_CLIENTS 2 +unsigned int localPort = 8888; // local port to listen on -/* -int lengths[] = {154, 168, 84, 154}; // Strips are different lengths because I am a dumb -Adafruit_DotStar strip0(lengths[0], 15, 2, DOTSTAR_BRG); -Adafruit_DotStar strip1(lengths[1], 0, 4, DOTSTAR_BRG); -Adafruit_DotStar strip2(lengths[2], 16, 17, DOTSTAR_BRG); -Adafruit_DotStar strip3(lengths[3], 5, 18, DOTSTAR_BRG); -Adafruit_DotStar strips[4] = {strip0, strip1, strip2, strip3}; -*/ +WiFiUDP Udp; Adafruit_NeoPixel strip(NUM_OF_PIXELS, D4, NEO_GRB + NEO_KHZ800); @@ -87,10 +82,9 @@ Ripple ripples[NUMBER_OF_RIPPLES] = { #define autoPulseTimeout 5000 // If no heartbeat is received in this many ms, begin firing random/simulated pulses #define randomPulseTime 5000 // Fire a random pulse every (this many) ms -unsigned long lastRandomPulse; + byte lastAutoPulseNode = 255; -byte numberOfAutoPulseTypes = randomPulsesEnabled + cubePulsesEnabled + starburstPulsesEnabled; byte currentAutoPulseType = 0; #define autoPulseChangeTime 30000 unsigned long lastAutoPulseChange; @@ -106,304 +100,481 @@ unsigned long nextSimulatedEda; void renderCube(int node); void renderUnstoppableSnake(int startingNode); void renderContour(int node); +void renderStarburst(void); + +// Process the original chromance animation +void chromanceProcess(void); +void processUDP(void); + +ESP8266WebServer server(80); + +void handleRoot() { + String header; + header += " "; + header += " "; + header += " "; + header += "This is a Bootstrap CDN example "; + header += ""; + header += " "; + header += ""; + header += ""; + header += "
"; + header += "

Leds Controller

"; + header += "

Write your text here..

"; + header += "
"; + header += " "; + header += " "; + header += ""; + header += " "; + server.send(200, "text/html", header); -void setup() { - Serial.begin(115200); - Serial.println("*** LET'S GOOOOO ***"); - - strip.begin(); - strip.show(); - -// WiFi.mode(WIFI_STA); - WiFi.begin("Nismon-IOT", "Ni$monIOT!!!!!"); - WiFi.config(ip, gateway, subnet); - - // Set Hostname. - String hostname(HOSTNAME); - hostname += String(ESP.getChipId(), HEX); - WiFi.hostname(hostname); - - // Print hostname. - Serial.println("Hostname: " + hostname); - //Serial.println(WiFi.hostname()); - - - while (WiFi.waitForConnectResult() != WL_CONNECTED) { - Serial.println("Connection Failed! Rebooting..."); - delay(5000); - ESP.restart(); - } - - Serial.print("WiFi connected, IP = "); - Serial.println(WiFi.localIP()); - - // Start OTA server. - ArduinoOTA.setHostname((const char *)hostname.c_str()); - // Wireless OTA updating? On an ARDUINO?! It's more likely than you think! - ArduinoOTA - .onStart([]() { - String type; - if (ArduinoOTA.getCommand() == U_FLASH) - type = "sketch"; - else // U_SPIFFS - type = "filesystem"; - - // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() - Serial.println("Start updating " + type); - }); - ArduinoOTA.onEnd([]() { - Serial.println("\nEnd"); - }); - ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { - Serial.printf("Progress: %u%%\r", (progress / (total / 100))); - }); - ArduinoOTA.onError([](ota_error_t error) { - Serial.printf("Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); - else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); - else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); - else if (error == OTA_END_ERROR) Serial.println("End Failed"); - }); - - ArduinoOTA.begin(); - - Serial.println("Ready for WiFi OTA updates"); - Serial.print("IP address: "); - Serial.println(WiFi.localIP()); } -void loop() { - unsigned long benchmark = millis(); - static int currentLed = 0; - static unsigned long lastStep = 0; - - - ArduinoOTA.handle(); - - // Fade all dots to create trails - for (int seg = 0; seg < NUMBER_OF_SEGMENTS; seg++) { - for (int led = 0; led < LEDS_PER_SEGMENTS; led++) { - for (int i = 0; i < 3; i++) { - ledColors[seg][led][i] *= decay; - // ledColors[seg][led][i] *= 5; - } +void handleNotFound() { + // digitalWrite(led, 1); + String message = "File Not Found\n\n"; + message += "URI: "; + message += server.uri(); + message += "\nMethod: "; + message += (server.method() == HTTP_GET) ? "GET" : "POST"; + message += "\nArguments: "; + message += server.args(); + message += "\n"; + for (uint8_t i = 0; i < server.args(); i++) { + message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; + } + server.send(404, "text/plain", message); + // digitalWrite(led, 0); } - } - for (int i = 0; i < NUMBER_OF_RIPPLES; i++) { - ripples[i].advance(ledColors); - } +void setupOTA(){ + String hostname(HOSTNAME); + // Start OTA server. + ArduinoOTA.setHostname((const char *)hostname.c_str()); + // Wireless OTA updating? On an ARDUINO?! It's more likely than you think! + ArduinoOTA + .onStart([]() { + String type; + if (ArduinoOTA.getCommand() == U_FLASH) + type = "sketch"; + else // U_SPIFFS + type = "filesystem"; + + // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() + Serial.println("Start updating " + type); + }); + ArduinoOTA.onEnd([]() { + Serial.println("\nEnd"); + }); + ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { + Serial.printf("Progress: %u%%\r", (progress / (total / 100))); + }); + ArduinoOTA.onError([](ota_error_t error) { + Serial.printf("Error[%u]: ", error); + if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); + else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); + else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); + else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); + else if (error == OTA_END_ERROR) Serial.println("End Failed"); + }); + + ArduinoOTA.begin(); +} - for (uint8_t segment = 0; segment < NUMBER_OF_SEGMENTS; segment++) { - for (uint8_t fromBottom = 0; fromBottom < LEDS_PER_SEGMENTS; fromBottom++) { - //int strip = ledAssignments[segment][0]; // Select the proper strip number ( if you have multiple strips ) - uint16_t led = round(fmap(fromBottom,0, (LEDS_PER_SEGMENTS-1),ledAssignments[segment][2], ledAssignments[segment][1])); - strip.setPixelColor(led, ledColors[segment][fromBottom][0], ledColors[segment][fromBottom][1],ledColors[segment][fromBottom][2]); +void setupHTTPServer(){ + server.on("/", handleRoot); + + server.on("/inline", []() { + server.send(200, "text/plain", "this works as well"); + }); + + server.on("/gif", []() { + static const uint8_t gif[] PROGMEM = { + 0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x10, 0x00, 0x10, 0x00, 0x80, 0x01, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x10, 0x00, 0x00, 0x02, 0x19, 0x8c, 0x8f, 0xa9, 0xcb, 0x9d, + 0x00, 0x5f, 0x74, 0xb4, 0x56, 0xb0, 0xb0, 0xd2, 0xf2, 0x35, 0x1e, 0x4c, + 0x0c, 0x24, 0x5a, 0xe6, 0x89, 0xa6, 0x4d, 0x01, 0x00, 0x3b + }; + char gif_colored[sizeof(gif)]; + memcpy_P(gif_colored, gif, sizeof(gif)); + // Set the background to a random set of colors + gif_colored[16] = millis() % 256; + gif_colored[17] = millis() % 256; + gif_colored[18] = millis() % 256; + server.send(200, "image/gif", gif_colored, sizeof(gif_colored)); + }); + + server.onNotFound(handleNotFound); + server.begin(); +} +// Main setup function +void setup() { + Serial.begin(115200); + Serial.println("*** LET'S GOOOOO ***"); + + strip.begin(); + strip.show(); + + // WiFi.mode(WIFI_STA); + WiFi.begin("Nismon-IOT", "Ni$monIOT!!!!!"); + WiFi.config(ip, gateway, subnet); + + // Set Hostname. + String hostname(HOSTNAME); + hostname += String(ESP.getChipId(), HEX); + WiFi.hostname(hostname); + + // Print hostname. + Serial.println("Hostname: " + hostname); + //Serial.println(WiFi.hostname()); + + + while (WiFi.waitForConnectResult() != WL_CONNECTED) { + Serial.println("Connection Failed! Rebooting..."); + delay(5000); + ESP.restart(); } - } - // // strip.setPixelColor(currentLed, 0,0,0); - // for (int i = 0; i < NUMBER_OF_SEGMENTS; i++) { - // strip.setPixelColor(LEDS_PER_SEGMENTS*(i-1), 0,0,0); - // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+1, 0,0,0); - // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+2, 0,0,0); - // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+3, 0,0,0); - // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+4, 0,0,0); - // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+5, 0,0,0); - // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+6, 0,0,0); - // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+7, 0,0,0); - // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+8, 0,0,0); - // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+9, 0,0,0); - // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+10, 0,0,0); - // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+11, 0,0,0); - - // strip.setPixelColor(LEDS_PER_SEGMENTS*i, 20,50,50); - // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+1, 20,50,50); - // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+2, 20,50,50); - // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+3, 20,50,50); - // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+4, 20,50,50); - // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+5, 20,50,50); - // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+6, 20,50,50); - // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+7, 20,50,50); - // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+8, 20,50,50); - // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+9, 20,50,50); - // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+10, 20,50,50); - // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+11, 20,50,50); - // // currentLed %= (NUMBER_OF_SEGMENTS*LEDS_PER_SEGMENTS); - // // lastStep = millis(); - strip.show(); - - // delay(500); - // } + Serial.print("WiFi connected, IP = "); + Serial.println(WiFi.localIP()); + + setupOTA(); + + Serial.println("Ready for WiFi OTA updates"); + Serial.print("IP address: "); + Serial.println(WiFi.localIP()); + + Udp.begin(localPort); + + setupHTTPServer(); +} + +void loop() { + unsigned long benchmark = millis(); + static int currentLed = 0; + static unsigned long lastStep = 0; + + + ArduinoOTA.handle(); + server.handleClient(); + + processUDP(); + chromanceProcess(); - // When biometric data is unavailable, visualize at random - if (numberOfAutoPulseTypes && millis() - lastRandomPulse >= randomPulseTime) { - unsigned int baseColor = random(0xFFFF); + // + for (uint8_t segment = 0; segment < NUMBER_OF_SEGMENTS; segment++) { + for (uint8_t fromBottom = 0; fromBottom < LEDS_PER_SEGMENTS; fromBottom++) { + + uint16_t led = round(fmap(fromBottom,0, (LEDS_PER_SEGMENTS-1),ledAssignments[segment][2], ledAssignments[segment][1])); + strip.setPixelColor(led, ledColors[segment][fromBottom][0], ledColors[segment][fromBottom][1],ledColors[segment][fromBottom][2]); - currentAutoPulseType = random(3); - switch (currentAutoPulseType) { - case 0: { - renderContour(1); } + } + + // Update LEDS ! + strip.show(); + +} - case 1: { - //renderCube(11); - //renderContour(1); - renderUnstoppableSnake(15); - break; +void processUDP(){ + // buffers for receiving and sending data + static char ReplyBuffer[] = "acknowledged\r\n"; // a string to send back + static char packetBuffer[UDP_TX_PACKET_MAX_SIZE + 1]; //buffer to hold incoming packet, + + // if there's data available, read a packet + int packetSize = Udp.parsePacket(); + if (packetSize) { + Serial.printf("Received packet of size %d from %s:%d\n (to %s:%d, free heap = %d B)\n", + packetSize, + Udp.remoteIP().toString().c_str(), Udp.remotePort(), + Udp.destinationIP().toString().c_str(), Udp.localPort(), + ESP.getFreeHeap()); + + // read the packet into packetBufffer + int n = Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE); + packetBuffer[n] = 0; + switch (packetBuffer[0]){ + + case 's': + renderStarburst(); + break; + case 'c': + renderCube(random(numberOfCubeNodes)); + break; + case 'o': + renderContour(1); + break; + case 't': + test(); + break; } + Serial.println("Contents:"); + Serial.println(packetBuffer); - case 2: { - renderCube(random(numberOfCubeNodes)); + // send a reply, to the IP address and port that sent us the packet we received + Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); + Udp.write(ReplyBuffer); + Udp.endPacket(); + } +} + +void chromanceProcess(){ + static unsigned long lastRandomPulse; + + // Fade all dots to create trails + for (int seg = 0; seg < NUMBER_OF_SEGMENTS; seg++) { + for (int led = 0; led < LEDS_PER_SEGMENTS; led++) { + for (int i = 0; i < 3; i++) { + ledColors[seg][led][i] *= decay; + } } + } - default: - break; + // Advance each started ripple + for (int i = 0; i < NUMBER_OF_RIPPLES; i++) { + ripples[i].advance(ledColors); } - lastRandomPulse = millis(); - if (simulatedBiometricsEnabled) { - // Simulated heartbeat - if (millis() >= nextSimulatedHeartbeat) { - for (int i = 0; i < SIDES_PER_NODES; i++) { - for (int j = 0; j < NUMBER_OF_RIPPLES; j++) { - if (ripples[j].state == STATE_DEAD) { - ripples[j].start( - 15, - i, - 0xEE1111, - float(random(100)) / 100.0 * .1 + .4, - 1000, - BEHAVIOR_WEAK); + // When biometric data is unavailable, visualize at random + if (millis() - lastRandomPulse >= random(2000,6000)) { - break; + // renderTriburst(); + + currentAutoPulseType = random(5); + switch (currentAutoPulseType) { + case 0: { + renderContour(1); + break; } - } - } - nextSimulatedHeartbeat = millis() + simulatedHeartbeatBaseTime + random(simulatedHeartbeatVariance); - } + case 1: { + renderUnstoppableSnake(random(0,NUMBER_OF_NODES)); + break; + } - // Simulated EDA ripples - if (millis() >= nextSimulatedEda) { - for (int i = 0; i < 10; i++) { - for (int j = 0; j < NUMBER_OF_RIPPLES; j++) { - if (ripples[j].state == STATE_DEAD) { - byte targetNode = borderNodes[random(numberOfBorderNodes)]; - byte direction = 255; - - while (direction == 255) { - direction = random(6); - if (nodeConnections[targetNode][direction] < 0) - direction = 255; - } - - ripples[j].start( - targetNode, - direction, - 0x1111EE, - float(random(100)) / 100.0 * .5 + 2, - 300, - BEHAVIOR_ANGRY - ); - - break; + case 2: { + renderCube(random(numberOfCubeNodes)); + break; } - } - } - nextSimulatedEda = millis() + simulatedEdaBaseTime + random(simulatedEdaVariance); - } + case 3: { + renderStarburst(); + break; + } + case 4: { + renderTriburst(); + break; + } + + default: + break; + } + + lastRandomPulse = millis(); } - - } } void renderCube(int node){ -// int node = cubeNodes[random(numberOfCubeNodes)]; - unsigned int baseColor = random(0xFFFF); - - while (node == lastAutoPulseNode) - node = cubeNodes[random(numberOfCubeNodes)]; - - lastAutoPulseNode = node; - - rippleBehavior behavior = random(2) ? BEHAVIOR_ALWAYS_LEFT : BEHAVIOR_ALWAYS_RIGHT; - - for (int i = 0; i < SIDES_PER_NODES; i++) { - if (nodeConnections[node][i] >= 0) { - for (int j = 0; j < NUMBER_OF_RIPPLES; j++) { - if (ripples[j].state == STATE_DEAD) { - ripples[j].start( - node, - i, - strip.ColorHSV(baseColor + (0xFFFF / 6) * i, 255, 255), - .8, - 8000, - behavior); - break; + while (node == lastAutoPulseNode) + node = cubeNodes[random(numberOfCubeNodes)]; + + lastAutoPulseNode = node; + + rippleBehavior behavior = random(2) ? BEHAVIOR_ALWAYS_LEFT : BEHAVIOR_ALWAYS_RIGHT; + + for (int i = 0; i < SIDES_PER_NODES; i++) { + if (nodeConnections[node][i] >= 0) { + for (int j = 0; j < NUMBER_OF_RIPPLES; j++) { + if (ripples[j].state == STATE_DEAD) { + ripples[j].start( + node, + i, + getRandomColor(), + getSpeed(), + 8000, + behavior); + break; + } + } } - } } - } } void renderContour(int node){ -// int node = cubeNodes[random(numberOfCubeNodes)]; - unsigned int baseColor = random(0xFFFF); - - rippleBehavior behavior; + rippleBehavior behavior; - for (int i = 0; i < SIDES_PER_NODES; i++) { - if (nodeConnections[node][i] >= 0) { - if ( i < 3){ - behavior = BEHAVIOR_ALWAYS_RIGHT; - } - else{ - behavior = BEHAVIOR_ALWAYS_LEFT; - } - for (int j = 0; j < NUMBER_OF_RIPPLES; j++) { - if (ripples[j].state == STATE_DEAD) { - ripples[j].start( - node, - i, - strip.ColorHSV(baseColor + (0xFFFF / 6) * i, 255, 255), - .8, - 8000, - behavior); - break; + for (int i = 0; i < SIDES_PER_NODES; i++) { + if (nodeConnections[node][i] >= 0) { + if ( i < 3){ + behavior = BEHAVIOR_ALWAYS_RIGHT; + } + else{ + behavior = BEHAVIOR_ALWAYS_LEFT; + } + for (int j = 0; j < NUMBER_OF_RIPPLES; j++) { + if (ripples[j].state == STATE_DEAD) { + ripples[j].start( + node, + i, + getRandomColor(), + getSpeed(), + 8000, + behavior); + break; + } + } } - } } - } } void renderUnstoppableSnake(int startingNode){ -// int node = cubeNodes[random(numberOfCubeNodes)]; - unsigned int baseColor = random(0xFFFF); - unsigned int randStartingNode = random(5); - - rippleBehavior behavior = BEHAVIOR_ANGRY; - - for (int i = 0; i < SIDES_PER_NODES; i++) { - if (nodeConnections[startingNode][(randStartingNode+i)%5] >= 0) { - for (int j = 0; j < NUMBER_OF_RIPPLES; j++) { - if (ripples[j].state == STATE_DEAD) { - ripples[j].start( - startingNode, - (randStartingNode+i)%5, - strip.ColorHSV(baseColor + (0xFFFF / 6) * i, 255, 255), - .8, - 15000, - behavior); - return; + // int node = cubeNodes[random(numberOfCubeNodes)]; + unsigned int randStartingNode = random(5); + + rippleBehavior behavior = BEHAVIOR_ANGRY; + + for (int i = 0; i < SIDES_PER_NODES; i++) { + if (nodeConnections[startingNode][(randStartingNode+i)%5] >= 0) { + for (int j = 0; j < NUMBER_OF_RIPPLES; j++) { + if (ripples[j].state == STATE_DEAD) { + ripples[j].start( + startingNode, + (randStartingNode+i)%5, + getRandomColor(), + getSpeed(), + 8000, + behavior); + return; + } + } + } + } +} + +void renderStarburst(){ + // int node = cubeNodes[random(numberOfCubeNodes)]; + unsigned int startingNode = starburstNode; + + rippleBehavior behavior = BEHAVIOR_WEAK; + uint32_t color = getRandomColor(); + for (int i = 0; i < SIDES_PER_NODES; i++) { + if (nodeConnections[startingNode][i] >= 0) { + for (int j = 0; j < NUMBER_OF_RIPPLES; j++) { + if (ripples[j].state == STATE_DEAD) { + ripples[j].start( + startingNode, + i, + getRandomColor(), + getSpeed(), + 5000, + behavior); + break; + } + } + } + } +} + +void renderTriburst(){ + // int node = cubeNodes[random(numberOfCubeNodes)]; + unsigned int startingNode = triNodes[random(numberOfTriNodes)];; + + rippleBehavior behavior = BEHAVIOR_COUCH_POTATO; + uint8_t rippleCnt = 0; + int i=0; + + while (rippleCnt < 3) { + if (nodeConnections[startingNode][i] >= 0) { + i+=2; // Skip 1 side + i%=6; + rippleCnt ++; + for (int j = 0; j < NUMBER_OF_RIPPLES; j++) { + if (ripples[j].state == STATE_DEAD) { + ripples[j].start( + startingNode, + i, + getRandomColor(), + getSpeed(), + random(500,2500), + behavior); + break; + } + } + }else{ + i++; } + } +} + + +void test(){ +// int node = cubeNodes[random(numberOfCubeNodes)]; + unsigned int startingNode = starburstNode; + static int node = 0; + + rippleBehavior behavior = BEHAVIOR_LAZY; + if (nodeConnections[startingNode][node] >= 0) { + for (int j = 0; j < NUMBER_OF_RIPPLES; j++) { + if (ripples[j].state == STATE_DEAD) { + ripples[j].start( + startingNode, + node, + getRandomColor(), + getSpeed(), + 5000, + behavior); + break; } } } + node++; + node %= 6; +} + +uint32_t getRandomColor() +{ + uint16_t color = random(0x7FFF,0xFFFF); + return strip.ColorHSV(color, random(180,255), random(100,255)); +} + +float getSpeed(){ + return random(500,800)/1000.0; + // return 0.5; } + +void testStrip(){ + // // strip.setPixelColor(currentLed, 0,0,0); + // for (int i = 0; i < NUMBER_OF_SEGMENTS; i++) { + + // strip.setPixelColor(LEDS_PER_SEGMENTS*(i-1), 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+1, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+2, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+3, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+4, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+5, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+6, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+7, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+8, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+9, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+10, 0,0,0); + // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+11, 0,0,0); + + // strip.setPixelColor(LEDS_PER_SEGMENTS*i, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+1, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+2, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+3, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+4, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+5, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+6, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+7, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+8, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+9, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+10, 20,50,50); + // strip.setPixelColor((LEDS_PER_SEGMENTS*i)+11, 20,50,50); + // // currentLed %= (NUMBER_OF_SEGMENTS*LEDS_PER_SEGMENTS); +} \ No newline at end of file diff --git a/chromance-firmware/mapping.h b/chromance-firmware/mapping.h index cfbce3b..fb46bf0 100644 --- a/chromance-firmware/mapping.h +++ b/chromance-firmware/mapping.h @@ -222,6 +222,9 @@ int borderNodes[] = {0, 1, 2, 3, 6, 10, 13, 14, 16, 19, 21 , 22 , 23}; int numberOfCubeNodes = 7; int cubeNodes[] = {7, 8, 9, 11, 12, 17, 18}; +int numberOfTriNodes = 13; +int triNodes[] = {4,5, 7, 8, 9, 11, 12, 14,15,16, 17, 18, 20}; + // Firing ripples that always turn in one direction will draw a starburst int starburstNode = 15; diff --git a/chromance-firmware/ripple.h b/chromance-firmware/ripple.h index 4bf6823..43d7f5a 100644 --- a/chromance-firmware/ripple.h +++ b/chromance-firmware/ripple.h @@ -21,12 +21,14 @@ enum rippleState { }; enum rippleBehavior { - BEHAVIOR_WEAK = 0, - BEHAVIOR_FEISTY = 1, - BEHAVIOR_ANGRY = 2, - BEHAVIOR_ALWAYS_RIGHT = 3, - BEHAVIOR_ALWAYS_LEFT = 4, - BEHAVIOR_EXPLODING = 5 + BEHAVIOR_COUCH_POTATO, // Stop at next node + BEHAVIOR_LAZY, // Only go straight + BEHAVIOR_WEAK, // Go straight if possible + BEHAVIOR_FEISTY, + BEHAVIOR_ANGRY, + BEHAVIOR_ALWAYS_RIGHT, + BEHAVIOR_ALWAYS_LEFT, + BEHAVIOR_EXPLODING // Coming soon }; float fmap(float x, float in_min, float in_max, float out_min, float out_max) { @@ -121,7 +123,41 @@ class Ripple { byte anger = behavior; while (newDirection < 0) { - if (anger == 0) { + if (anger == BEHAVIOR_COUCH_POTATO) { + int forwardConnection = nodeConnections[position[0]][forward]; + + // We can't go straight ahead - we need to take a rest +#ifdef DEBUG_ADVANCEMENT + Serial.println(" Never continue ... too lazy - stopping"); +#endif + // Die now + age = lifespan; + break; + //break; + } + + if (anger == BEHAVIOR_LAZY) { + int forwardConnection = nodeConnections[position[0]][forward]; + + if (forwardConnection < 0) { + // We can't go straight ahead - we need to take a rest +#ifdef DEBUG_ADVANCEMENT + Serial.println(" Can't go straight - stopping"); +#endif + // Die now + age = lifespan; + break; + //break; + } + else { +#ifdef DEBUG_ADVANCEMENT + Serial.println(" Going forward"); +#endif + newDirection = forward; + } + } + + if (anger == BEHAVIOR_WEAK) { int forwardConnection = nodeConnections[position[0]][forward]; if (forwardConnection < 0) { @@ -129,7 +165,7 @@ class Ripple { #ifdef DEBUG_ADVANCEMENT Serial.println(" Can't go straight - picking more agr. path"); #endif - anger++; + anger += 1; } else { #ifdef DEBUG_ADVANCEMENT @@ -139,7 +175,7 @@ class Ripple { } } - if (anger == 1) { + if (anger == BEHAVIOR_FEISTY) { int leftConnection = nodeConnections[position[0]][wideLeft]; int rightConnection = nodeConnections[position[0]][wideRight]; @@ -165,11 +201,11 @@ class Ripple { #ifdef DEBUG_ADVANCEMENT Serial.println(" Can't make wide turn - picking more agr. path"); #endif - anger++; // Can't take shallow turn - must become more aggressive + anger+=1; // Can't take shallow turn - must become more aggressive } } - if (anger == 2) { + if (anger == BEHAVIOR_ANGRY) { int leftConnection = nodeConnections[position[0]][sharpLeft]; int rightConnection = nodeConnections[position[0]][sharpRight]; From bc0cbff29ea6503fe854cde0f3e4506d5b10717f Mon Sep 17 00:00:00 2001 From: Simon Benoit Date: Sat, 2 Oct 2021 14:09:35 -0400 Subject: [PATCH 3/7] USe web server to change mode, add udp test script --- chromance-firmware/chromance-firmware.ino | 165 ++++++++++++---------- chromance-firmware/index.h | 22 +++ chromance-firmware/sendUdpTest.py | 31 ++++ 3 files changed, 144 insertions(+), 74 deletions(-) create mode 100644 chromance-firmware/index.h create mode 100644 chromance-firmware/sendUdpTest.py diff --git a/chromance-firmware/chromance-firmware.ino b/chromance-firmware/chromance-firmware.ino index 0a2e8c5..a487964 100644 --- a/chromance-firmware/chromance-firmware.ino +++ b/chromance-firmware/chromance-firmware.ino @@ -16,6 +16,7 @@ #include #include "mapping.h" #include "ripple.h" +#include "index.h" #define HOSTNAME "ESP8266-OTA-" ///< Hostname. The setup function adds the Chip ID at the end. #define NUMBER_OF_RIPPLES 30 @@ -40,36 +41,36 @@ float decay = 0.97; // Multiply all LED's by this amount each tick to create fa // These ripples are endlessly reused so we don't need to do any memory management Ripple ripples[NUMBER_OF_RIPPLES] = { - Ripple(0), - Ripple(1), - Ripple(2), - Ripple(3), - Ripple(4), - Ripple(5), - Ripple(6), - Ripple(7), - Ripple(8), - Ripple(9), - Ripple(10), - Ripple(11), - Ripple(12), - Ripple(13), - Ripple(14), - Ripple(15), - Ripple(16), - Ripple(17), - Ripple(18), - Ripple(19), - Ripple(20), - Ripple(21), - Ripple(22), - Ripple(23), - Ripple(24), - Ripple(25), - Ripple(26), - Ripple(27), - Ripple(28), - Ripple(29) + Ripple(0), + Ripple(1), + Ripple(2), + Ripple(3), + Ripple(4), + Ripple(5), + Ripple(6), + Ripple(7), + Ripple(8), + Ripple(9), + Ripple(10), + Ripple(11), + Ripple(12), + Ripple(13), + Ripple(14), + Ripple(15), + Ripple(16), + Ripple(17), + Ripple(18), + Ripple(19), + Ripple(20), + Ripple(21), + Ripple(22), + Ripple(23), + Ripple(24), + Ripple(25), + Ripple(26), + Ripple(27), + Ripple(28), + Ripple(29) }; @@ -95,7 +96,7 @@ unsigned long lastAutoPulseChange; #define simulatedEdaVariance 10000 unsigned long nextSimulatedHeartbeat; unsigned long nextSimulatedEda; - +int currentMode = 0; void renderCube(int node); void renderUnstoppableSnake(int startingNode); @@ -107,27 +108,32 @@ void chromanceProcess(void); void processUDP(void); ESP8266WebServer server(80); +String page = MAIN_page; void handleRoot() { - String header; - header += " "; - header += " "; - header += " "; - header += "This is a Bootstrap CDN example "; - header += ""; - header += " "; - header += ""; - header += ""; - header += "
"; - header += "

Leds Controller

"; - header += "

Write your text here..

"; - header += "
"; - header += " "; - header += " "; - header += ""; - header += " "; - server.send(200, "text/html", header); + server.send(200, "text/html", page); +} + +void setCurrentMode(int mode){ + currentMode = mode; +} + +void setUDPMode(){ + setCurrentMode(1); + clearLeds(); + server.send(200, "text/html", page); +} + +void setChromanceMode(){ + setCurrentMode(0); + clearLeds(); + server.send(200, "text/html", page); +} + +void clearLeds(){ + memset(ledColors,0, NUMBER_OF_SEGMENTS*LEDS_PER_SEGMENTS*3); + strip.clear(); } void handleNotFound() { @@ -184,6 +190,8 @@ void setupOTA(){ void setupHTTPServer(){ server.on("/", handleRoot); + server.on("/mode/chromance", setChromanceMode); + server.on("/mode/udp", setUDPMode); server.on("/inline", []() { server.send(200, "text/plain", "this works as well"); }); @@ -260,9 +268,12 @@ void loop() { ArduinoOTA.handle(); server.handleClient(); - processUDP(); - chromanceProcess(); + if ( currentMode == 0 ){ + chromanceProcess(); + }else{ + processUDP(); + } // for (uint8_t segment = 0; segment < NUMBER_OF_SEGMENTS; segment++) { @@ -295,29 +306,36 @@ void processUDP(){ // read the packet into packetBufffer int n = Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE); - packetBuffer[n] = 0; - switch (packetBuffer[0]){ - - case 's': - renderStarburst(); - break; - case 'c': - renderCube(random(numberOfCubeNodes)); - break; - case 'o': - renderContour(1); - break; - case 't': - test(); - break; + + + if (n >= LEDS_PER_SEGMENTS*NUMBER_OF_SEGMENTS*3){ + memcpy(ledColors, packetBuffer, LEDS_PER_SEGMENTS*NUMBER_OF_SEGMENTS*3); + } + else{ + packetBuffer[n] = 0; + switch (packetBuffer[0]){ + + case 's': + renderStarburst(); + break; + case 'c': + renderCube(random(numberOfCubeNodes)); + break; + case 'o': + renderContour(1); + break; + case 't': + test(); + break; + } } - Serial.println("Contents:"); - Serial.println(packetBuffer); + // Serial.println("Contents:"); + // Serial.println(packetBuffer); // send a reply, to the IP address and port that sent us the packet we received - Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); - Udp.write(ReplyBuffer); - Udp.endPacket(); + // Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); + // Udp.write(ReplyBuffer); + // Udp.endPacket(); } } @@ -338,7 +356,6 @@ void chromanceProcess(){ ripples[i].advance(ledColors); } - // When biometric data is unavailable, visualize at random if (millis() - lastRandomPulse >= random(2000,6000)) { // renderTriburst(); @@ -460,7 +477,7 @@ void renderStarburst(){ // int node = cubeNodes[random(numberOfCubeNodes)]; unsigned int startingNode = starburstNode; - rippleBehavior behavior = BEHAVIOR_WEAK; + rippleBehavior behavior = BEHAVIOR_FEISTY; uint32_t color = getRandomColor(); for (int i = 0; i < SIDES_PER_NODES; i++) { if (nodeConnections[startingNode][i] >= 0) { @@ -539,7 +556,7 @@ void test(){ uint32_t getRandomColor() { uint16_t color = random(0x7FFF,0xFFFF); - return strip.ColorHSV(color, random(180,255), random(100,255)); + return strip.ColorHSV(color, random(200,255), random(100,255)); } float getSpeed(){ diff --git a/chromance-firmware/index.h b/chromance-firmware/index.h new file mode 100644 index 0000000..631cee5 --- /dev/null +++ b/chromance-firmware/index.h @@ -0,0 +1,22 @@ +const char MAIN_page[] PROGMEM = R"=====( + + + + + This is a Bootstrap CDN example + + + + + +
+

Leds Controller

+ Click to set Chromance mode Chromance
+ Click to turn UDP packets
+
+ + + + + +)====="; \ No newline at end of file diff --git a/chromance-firmware/sendUdpTest.py b/chromance-firmware/sendUdpTest.py new file mode 100644 index 0000000..442bf37 --- /dev/null +++ b/chromance-firmware/sendUdpTest.py @@ -0,0 +1,31 @@ +import socket +import time + +UDP_IP = "192.168.5.50" +UDP_PORT = 8888 + +fd = open("out.bin", "wb") + +b = bytearray() + +sock = socket.socket(socket.AF_INET, # Internet + socket.SOCK_DGRAM) # UDP + +# for j in range(0, 457): +b = bytearray() +j=0 +for i in range(0, j): + b.append(10) # R + b.append(j%50) # G + b.append(00) # B + +for i in range(j, 457): + b.append(10) # R + b.append(0) # G + b.append(25) # B + +sock.sendto(b, (UDP_IP, UDP_PORT)) +time.sleep(0.01) +# fd.write(b) +# fd.flush() +# fd.close() \ No newline at end of file From 66079c274b4d68a03da48bd42ebf56c92a7ffb93 Mon Sep 17 00:00:00 2001 From: Simon Benoit Date: Tue, 28 Dec 2021 15:31:57 -0500 Subject: [PATCH 4/7] Add python test scripts --- testScripts/requirements.txt | 4 + testScripts/sendUdpTest.py | 48 ++++++++++ testScripts/spectrumTest.py | 107 ++++++++++++++++++++++ testScripts/spectrumTestUDP.py | 157 +++++++++++++++++++++++++++++++++ testScripts/tets.py | 25 ++++++ 5 files changed, 341 insertions(+) create mode 100644 testScripts/requirements.txt create mode 100644 testScripts/sendUdpTest.py create mode 100644 testScripts/spectrumTest.py create mode 100644 testScripts/spectrumTestUDP.py create mode 100644 testScripts/tets.py diff --git a/testScripts/requirements.txt b/testScripts/requirements.txt new file mode 100644 index 0000000..9fbcd6d --- /dev/null +++ b/testScripts/requirements.txt @@ -0,0 +1,4 @@ +matplotlib==3.3.4 +numpy==1.19.5 +pyaudio==0.2.11 +scipy==1.6.0 diff --git a/testScripts/sendUdpTest.py b/testScripts/sendUdpTest.py new file mode 100644 index 0000000..631b3d4 --- /dev/null +++ b/testScripts/sendUdpTest.py @@ -0,0 +1,48 @@ +import socket +import time +import random + +UDP_IP = "192.168.5.50" +UDP_PORT = 8888 + +fd = open("out.bin", "wb") + +b = bytearray() + +sock = socket.socket(socket.AF_INET, # Internet + socket.SOCK_DGRAM) # UDP + +# for j in range(0, 457): +buff = bytearray(457*3) + +def clear(): + buff.clear() + for i in range(0, 457): + buff.append(0) # R + buff.append(0) # G + buff.append(0) # B + +def setSegment(idx, r , g , b): + global buff + segmentIdx = idx*36 + for i in range(0, random.randint(0,12)): + buff[segmentIdx + (i*3)] = r # R + buff[segmentIdx + (i*3) + 1] = g # G + buff[segmentIdx + (i*3) + 2] = b # B + +for i in range(0, 2000): + clear() + setSegment(4, 10, 40, 0) + setSegment(6, 10, 40, 0) + setSegment(1, 10, 40, 0) + setSegment(17, 10, 40, 0) + setSegment(26, 10, 40, 0) + setSegment(30, 10, 40, 0) + setSegment(29, 10, 40, 0) + sock.sendto(buff, (UDP_IP, UDP_PORT)) + time.sleep(0.02) + print(i) + # print(buff.__len__()) +# fd.write(b) +# fd.flush() +# fd.close() \ No newline at end of file diff --git a/testScripts/spectrumTest.py b/testScripts/spectrumTest.py new file mode 100644 index 0000000..d87113e --- /dev/null +++ b/testScripts/spectrumTest.py @@ -0,0 +1,107 @@ + +""" +Notebook for streaming data from a microphone in realtime + +audio is captured using pyaudio +then converted from binary data to ints using struct +then displayed using matplotlib + +if you don't have pyaudio, then run + +>>> pip install pyaudio + +note: with 2048 samples per chunk, I'm getting 20FPS +""" + +import pyaudio +import os +import struct +import numpy as np +import matplotlib.pyplot as plt +import time +from tkinter import TclError +from scipy.fftpack import fft +# use this backend to display in separate Tk window +# matplotlib tk + +# constants +CHUNK = 8196 # samples per frame +FORMAT = pyaudio.paInt16 # audio format (bytes per sample?) +CHANNELS = 1 # single channel for microphone +RATE = 44100 # samples per second + +# create matplotlib figure and axes +fig, (ax1, ax2) = plt.subplots(2, figsize=(15, 7)) + +# pyaudio class instance +p = pyaudio.PyAudio() + +SPEAKERS = p.get_default_output_device_info() + +stream = p.open(format=FORMAT, + channels=CHANNELS, + rate=RATE, + input=True, + frames_per_buffer=CHUNK + ) #The part I have modified + +# variable for plotting +x = np.arange(0, 2 * CHUNK, 2) # samples (waveform) +xf = np.linspace(0, RATE, CHUNK) # frequencies (spectrum) + + +# create semilogx line for spectrum +line_fft, = ax2.semilogx(xf, np.random.rand(CHUNK), '-', lw=2) + +# format spectrum axespi +ax2.set_xlim(20, RATE / 2) + +print('stream started') + +# for measuring frame rate +frame_count = 0 +start_time = time.time() +plt.show() +while True: + + # binary data + data = stream.read(CHUNK) + + # convert data to integers, make np array, then offset it by 127 + data_int = struct.unpack(str(2 * CHUNK) + 'B', data) + + # create np array and offset by 128 + data_np = np.array(data_int, dtype='b')[::2] + 128 + + + # line.set_ydata(data_np) + + # compute FFT and update line + # data = np.fft.fft(data_int) + # data_fft = np.fft.fftfreq(8, 128/CHUNK) + yf = fft(data_int) + line_fft.set_ydata(np.abs(yf[0:CHUNK]) / (128 * CHUNK)) + + + # max = 0; + # maxIdx = 0; + # tmpArr = np.abs(yf[0:CHUNK]) / (128 * CHUNK) + # for i in range(0,tmpArr.size): + # tmp = tmpArr[i] + # if ( tmp > max): + # max = tmp; + # maxIdx = i; + # print(data[30]) + # update figure canvas + try: + fig.canvas.draw() + fig.canvas.flush_events() + frame_count += 1 + + except TclError: + # calculate average frame rate + frame_rate = frame_count / (time.time() - start_time) + + print('stream stopped') + print('average frame rate = {:.0f} FPS'.format(frame_rate)) + break \ No newline at end of file diff --git a/testScripts/spectrumTestUDP.py b/testScripts/spectrumTestUDP.py new file mode 100644 index 0000000..3cbe77d --- /dev/null +++ b/testScripts/spectrumTestUDP.py @@ -0,0 +1,157 @@ + +""" +Notebook for streaming data from a microphone in realtime + +audio is captured using pyaudio +then converted from binary data to ints using struct +then displayed using matplotlib + +if you don't have pyaudio, then run + +>>> pip install pyaudio + +note: with 2048 samples per chunk, I'm getting 20FPS +""" + +import pyaudio +import os +import struct +import numpy as np +import matplotlib.pyplot as plt +import time +from tkinter import TclError +from scipy.fftpack import fft +import socket +import time +import random + +UDP_IP = "192.168.5.50" +UDP_PORT = 8888 + +fd = open("out.bin", "wb") + +b = bytearray() + +sock = socket.socket(socket.AF_INET, # Internet + socket.SOCK_DGRAM) # UDP + +# for j in range(0, 457): +buff = bytearray(457*3) + +# use this backend to display in separate Tk window +# matplotlib tk + +def clear(): + buff.clear() + for i in range(0, 457): + buff.append(0) # R + buff.append(0) # G + buff.append(0) # B + +def setSegment(idx, r , g , b): + global buff + segmentIdx = idx*36 + for i in range(0, 12): + buff[segmentIdx + (i*3)] = r # R + buff[segmentIdx + (i*3) + 1] = g # G + buff[segmentIdx + (i*3) + 2] = b # B + +# constants +CHUNK = 4096 *2 # samples per frame +FORMAT = pyaudio.paInt16 # audio format (bytes per sample?) +CHANNELS = 1 # single channel for microphone +RATE = 48000 # samples per second + +# create matplotlib figure and axes +fig, (ax1, ax2) = plt.subplots(2, figsize=(15, 7)) + +# pyaudio class instance +p = pyaudio.PyAudio() + +# stream object to get data from microphone +stream = p.open( + format=FORMAT, + channels=CHANNELS, + rate=RATE, + input=True, + frames_per_buffer=CHUNK +) + +# variable for plotting +x = np.arange(0, 2 * CHUNK, 2) # samples (waveform) +xf = np.linspace(0, RATE, CHUNK) # frequencies (spectrum) + +# create a line object with random data +line, = ax1.plot(x, np.random.rand(CHUNK), '-', lw=2) + +# create semilogx line for spectrum +line_fft, = ax2.semilogx(xf, np.random.rand(CHUNK), '-', lw=2) + +# format waveform axes +ax1.set_title('AUDIO WAVEFORM') +ax1.set_xlabel('samples') +ax1.set_ylabel('volume') +ax1.set_ylim(0, 255) +ax1.set_xlim(0, 2 * CHUNK) +plt.setp(ax1, xticks=[0, CHUNK, 2 * CHUNK], yticks=[0, 128, 255]) + +# format spectrum axes +ax2.set_xlim(20, RATE / 2) + +print('stream started') + +# for measuring frame rate +frame_count = 0 +start_time = time.time() +# plt.show() +while True: + + # binary data + data = stream.read(CHUNK) + + # convert data to integers, make np array, then offset it by 127 + data_int = struct.unpack(str(2 * CHUNK) + 'B', data) + + # create np array and offset by 128 + data_np = np.array(data_int, dtype='b')[::2] + 128 + + line.set_ydata(data_np) + + # compute FFT and update line + yf = fft(data_int) + line_fft.set_ydata(np.abs(yf[0:CHUNK]) / (128 * CHUNK)) + outData = np.abs(yf[0:CHUNK]) / (128 * CHUNK) + clear() + setSegment(4, int(outData[80]*255%255), 0, 0) + setSegment(6, int(outData[150]*255%255), 0, 0) + setSegment(1, int(outData[400]*255%255), 0, 0) + setSegment(17, int(outData[800]*255%255), 0, 0) + setSegment(26, int(outData[1000]*255%255), 0, 0) + setSegment(30, int(outData[2000]*255%255), 0, 0) + sock.sendto(buff, (UDP_IP, UDP_PORT)) + # update figure canvas + try: + fig.canvas.draw() + fig.canvas.flush_events() + frame_count += 1 + + except TclError: + + # calculate average frame rate + frame_rate = frame_count / (time.time() - start_time) + + print('stream stopped') + print('average frame rate = {:.0f} FPS'.format(frame_rate)) + break + + + # max = 0; + # maxIdx = 0; + # tmpArr = np.abs(yf[0:CHUNK]) / (128 * CHUNK) + # for i in range(0,tmpArr.size): + # tmp = tmpArr[i] + # if ( tmp > max): + # max = tmp; + # maxIdx = i; + # print(data[30]) + # update figure canvas diff --git a/testScripts/tets.py b/testScripts/tets.py new file mode 100644 index 0000000..1e99d35 --- /dev/null +++ b/testScripts/tets.py @@ -0,0 +1,25 @@ +import pyaudio +import struct +import matplotlib.pyplot as plt +import numpy as np +from scipy import signal + +p = pyaudio.PyAudio() +FORMAT = pyaudio.paInt16 +CHANNELS = 1 +RATE = 20000 +CHUNK = int(RATE/20) +stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) + + + +plt.ylabel('Frequency [Hz]') +plt.xlabel('Time [sec]') + +while True: + data = stream.read(CHUNK) + data = np.array(struct.unpack(str(2 * CHUNK) + 'B', data), dtype='b') + f, t, Sxx = signal.spectrogram(data, fs=CHUNK) + dBS = 10 * np.log10(Sxx) + plt.pcolormesh(t, f, dBS) + plt.pause(0.005) \ No newline at end of file From b168a224edb6983a610bca50e7a189f08e619057 Mon Sep 17 00:00:00 2001 From: Simon Benoit Date: Tue, 9 Aug 2022 19:14:41 -0400 Subject: [PATCH 5/7] WIP - Working chromance with web page --- chromance-firmware/chromance-firmware.ino | 160 +++-- chromance-firmware/debugUdp.cpp | 73 +++ chromance-firmware/debugUdp.h | 36 ++ chromance-firmware/index.h | 19 + chromance-firmware/mapping.h | 102 ++-- chromance-firmware/ripple.h | 677 +++++++++++----------- chromance-firmware/sendUdpTest.py | 31 - 7 files changed, 625 insertions(+), 473 deletions(-) create mode 100644 chromance-firmware/debugUdp.cpp create mode 100644 chromance-firmware/debugUdp.h delete mode 100644 chromance-firmware/sendUdpTest.py diff --git a/chromance-firmware/chromance-firmware.ino b/chromance-firmware/chromance-firmware.ino index a487964..36a4eb5 100644 --- a/chromance-firmware/chromance-firmware.ino +++ b/chromance-firmware/chromance-firmware.ino @@ -17,6 +17,8 @@ #include "mapping.h" #include "ripple.h" #include "index.h" +#include +#include "debugUdp.h" #define HOSTNAME "ESP8266-OTA-" ///< Hostname. The setup function adds the Chip ID at the end. #define NUMBER_OF_RIPPLES 30 @@ -30,7 +32,7 @@ const int port = 23; #define MAX_SRV_CLIENTS 2 unsigned int localPort = 8888; // local port to listen on - +unsigned int debugPort = 8000; // local port to listen on WiFiUDP Udp; @@ -39,6 +41,8 @@ Adafruit_NeoPixel strip(NUM_OF_PIXELS, D4, NEO_GRB + NEO_KHZ800); uint8_t ledColors[NUMBER_OF_SEGMENTS][LEDS_PER_SEGMENTS][3]; // LED buffer - each ripple writes to this, then we write this to the strips float decay = 0.97; // Multiply all LED's by this amount each tick to create fancy fading tails +uint16_t g_hue = 40000; +uint32_t g_color; // These ripples are endlessly reused so we don't need to do any memory management Ripple ripples[NUMBER_OF_RIPPLES] = { Ripple(0), @@ -106,12 +110,17 @@ void renderStarburst(void); // Process the original chromance animation void chromanceProcess(void); void processUDP(void); +void setFixedColor(uint32_t color); ESP8266WebServer server(80); +debugUdp dbg(8000); + String page = MAIN_page; -void handleRoot() { +// Handle Web Requests +void handleRoot() { + dbg.print("Page opened"); server.send(200, "text/html", page); } @@ -121,20 +130,18 @@ void setCurrentMode(int mode){ void setUDPMode(){ setCurrentMode(1); + dbg.println("Setting to UDP listener "); clearLeds(); server.send(200, "text/html", page); } void setChromanceMode(){ setCurrentMode(0); + dbg.println("Setting to chromance mode "); clearLeds(); server.send(200, "text/html", page); } -void clearLeds(){ - memset(ledColors,0, NUMBER_OF_SEGMENTS*LEDS_PER_SEGMENTS*3); - strip.clear(); -} void handleNotFound() { // digitalWrite(led, 1); @@ -167,21 +174,21 @@ void setupOTA(){ type = "filesystem"; // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() - Serial.println("Start updating " + type); + dbg.println("Start updating " + type); }); ArduinoOTA.onEnd([]() { - Serial.println("\nEnd"); + dbg.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { - Serial.printf("Progress: %u%%\r", (progress / (total / 100))); + dbg.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { - Serial.printf("Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); - else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); - else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); - else if (error == OTA_END_ERROR) Serial.println("End Failed"); + dbg.printf("Error[%u]: ", error); + if (error == OTA_AUTH_ERROR) dbg.println("Auth Failed"); + else if (error == OTA_BEGIN_ERROR) dbg.println("Begin Failed"); + else if (error == OTA_CONNECT_ERROR) dbg.println("Connect Failed"); + else if (error == OTA_RECEIVE_ERROR) dbg.println("Receive Failed"); + else if (error == OTA_END_ERROR) dbg.println("End Failed"); }); ArduinoOTA.begin(); @@ -190,33 +197,22 @@ void setupOTA(){ void setupHTTPServer(){ server.on("/", handleRoot); + server.on("/mode/set_hue", set_hue); server.on("/mode/chromance", setChromanceMode); server.on("/mode/udp", setUDPMode); server.on("/inline", []() { server.send(200, "text/plain", "this works as well"); }); - server.on("/gif", []() { - static const uint8_t gif[] PROGMEM = { - 0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x10, 0x00, 0x10, 0x00, 0x80, 0x01, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x10, 0x00, 0x00, 0x02, 0x19, 0x8c, 0x8f, 0xa9, 0xcb, 0x9d, - 0x00, 0x5f, 0x74, 0xb4, 0x56, 0xb0, 0xb0, 0xd2, 0xf2, 0x35, 0x1e, 0x4c, - 0x0c, 0x24, 0x5a, 0xe6, 0x89, 0xa6, 0x4d, 0x01, 0x00, 0x3b - }; - char gif_colored[sizeof(gif)]; - memcpy_P(gif_colored, gif, sizeof(gif)); - // Set the background to a random set of colors - gif_colored[16] = millis() % 256; - gif_colored[17] = millis() % 256; - gif_colored[18] = millis() % 256; - server.send(200, "image/gif", gif_colored, sizeof(gif_colored)); - }); - server.onNotFound(handleNotFound); server.begin(); } +void clearLeds(){ + memset(ledColors,0, NUMBER_OF_SEGMENTS*LEDS_PER_SEGMENTS*3); + strip.clear(); +} + // Main setup function void setup() { Serial.begin(115200); @@ -234,9 +230,8 @@ void setup() { hostname += String(ESP.getChipId(), HEX); WiFi.hostname(hostname); - // Print hostname. - Serial.println("Hostname: " + hostname); - //Serial.println(WiFi.hostname()); + + //dbg.println(WiFi.hostname()); while (WiFi.waitForConnectResult() != WL_CONNECTED) { @@ -244,19 +239,23 @@ void setup() { delay(5000); ESP.restart(); } + Udp.begin(localPort); - Serial.print("WiFi connected, IP = "); - Serial.println(WiFi.localIP()); + dbg.write("Online"); + // Print hostname. + dbg.println("Hostname: " + hostname); + dbg.print("WiFi connected, IP = "); + dbg.println(WiFi.localIP()); setupOTA(); - Serial.println("Ready for WiFi OTA updates"); - Serial.print("IP address: "); - Serial.println(WiFi.localIP()); + dbg.println("Ready for WiFi OTA updates"); + dbg.print("IP address: "); + dbg.println(WiFi.localIP()); - Udp.begin(localPort); setupHTTPServer(); + setFixedColor(14230237); } void loop() { @@ -269,25 +268,39 @@ void loop() { server.handleClient(); - if ( currentMode == 0 ){ - chromanceProcess(); - }else{ - processUDP(); - } + // if ( currentMode == 0 ){ + // chromanceProcess(); + // }else{ + // processUDP(); + // } - // - for (uint8_t segment = 0; segment < NUMBER_OF_SEGMENTS; segment++) { - for (uint8_t fromBottom = 0; fromBottom < LEDS_PER_SEGMENTS; fromBottom++) { + // // + // for (uint8_t segment = 0; segment < NUMBER_OF_SEGMENTS; segment++) { + // for (uint8_t fromBottom = 0; fromBottom < LEDS_PER_SEGMENTS; fromBottom++) { - uint16_t led = round(fmap(fromBottom,0, (LEDS_PER_SEGMENTS-1),ledAssignments[segment][2], ledAssignments[segment][1])); - strip.setPixelColor(led, ledColors[segment][fromBottom][0], ledColors[segment][fromBottom][1],ledColors[segment][fromBottom][2]); + // uint16_t led = round(fmap(fromBottom,0, (LEDS_PER_SEGMENTS-1),ledAssignments[segment][2], ledAssignments[segment][1])); + // strip.setPixelColor(led, ledColors[segment][fromBottom][0], ledColors[segment][fromBottom][1],ledColors[segment][fromBottom][2]); + // } + // } + // // Update LEDS ! + // strip.show(); - } - } +} + + + +void setFixedColor(uint32_t color){ + g_color = color; + uint8_t r = (g_color & 0xff0000 ) >> 16; + uint8_t g = (g_color & 0x00ff00 ) >> 8; + uint8_t b = (g_color & 0x0000ff ) >> 0; + + for (int i = 0; i < NUM_OF_PIXELS; i++) { + strip.setPixelColor(i, r,g,b); + } // Update LEDS ! strip.show(); - } void processUDP(){ @@ -298,7 +311,7 @@ void processUDP(){ // if there's data available, read a packet int packetSize = Udp.parsePacket(); if (packetSize) { - Serial.printf("Received packet of size %d from %s:%d\n (to %s:%d, free heap = %d B)\n", + dbg.printf("Received packet of size %d from %s:%d\n (to %s:%d, free heap = %d B)\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort(), Udp.destinationIP().toString().c_str(), Udp.localPort(), @@ -329,8 +342,8 @@ void processUDP(){ break; } } - // Serial.println("Contents:"); - // Serial.println(packetBuffer); + // dbg.println("Contents:"); + // dbg.println(packetBuffer); // send a reply, to the IP address and port that sent us the packet we received // Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); @@ -359,8 +372,8 @@ void chromanceProcess(){ if (millis() - lastRandomPulse >= random(2000,6000)) { // renderTriburst(); - currentAutoPulseType = random(5); + dbg.write("Alive"); switch (currentAutoPulseType) { case 0: { renderContour(1); @@ -501,7 +514,7 @@ void renderTriburst(){ // int node = cubeNodes[random(numberOfCubeNodes)]; unsigned int startingNode = triNodes[random(numberOfTriNodes)];; - rippleBehavior behavior = BEHAVIOR_COUCH_POTATO; + rippleBehavior behavior = BEHAVIOR_ANGRY; uint8_t rippleCnt = 0; int i=0; @@ -555,22 +568,43 @@ void test(){ uint32_t getRandomColor() { - uint16_t color = random(0x7FFF,0xFFFF); - return strip.ColorHSV(color, random(200,255), random(100,255)); +// uint16_t color = secureRandom(765,1530); + return strip.ColorHSV(g_hue, random(200,255), random(100,255)); } float getSpeed(){ - return random(500,800)/1000.0; + return random(500,800)/1000.0; // return 0.5; } +void set_hue(){ + + if (server.args() > 0){ + for (uint8_t i = 0; i < server.args(); i++) { + if (server.argName(i) == "hue"){ + String hue_arg = server.arg(i); + + if (hue_arg.charAt(0) == '#'){ + hue_arg.setCharAt(0,'0'); + } + setFixedColor(strtol(hue_arg.c_str(), 0, 16)); + Serial.println("Setting hue to : "); + Serial.print(strtol(hue_arg.c_str(), 0, 16)); + } + Serial.println("Arg : "); + Serial.print(server.arg(i)); + server.send(200, "text/plain", "Setting hue to " + server.arg(i)); + } + } +} + void testStrip(){ // // strip.setPixelColor(currentLed, 0,0,0); // for (int i = 0; i < NUMBER_OF_SEGMENTS; i++) { // strip.setPixelColor(LEDS_PER_SEGMENTS*(i-1), 0,0,0); // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+1, 0,0,0); - // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+2, 0,0,0); + // stfgnvb nrip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+2, 0,0,0); // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+3, 0,0,0); // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+4, 0,0,0); // strip.setPixelColor((LEDS_PER_SEGMENTS*(i-1))+5, 0,0,0); diff --git a/chromance-firmware/debugUdp.cpp b/chromance-firmware/debugUdp.cpp new file mode 100644 index 0000000..7bf8812 --- /dev/null +++ b/chromance-firmware/debugUdp.cpp @@ -0,0 +1,73 @@ +#include "debugUdp.h" + +size_t debugUdp::readBytes(uint8_t *buffer, size_t length) { + return read((char *) buffer, length); +} + +size_t debugUdp::write(const char *buffer, size_t size) +{ + size_t ret = 0; + if ( conn_.remotePort() != 0 ){ + conn_.beginPacket(conn_.remoteIP(), conn_.remotePort()); + ret = conn_.write(buffer, size); + conn_.write('\n'); + conn_.endPacket(); + } + return ret; +} +size_t debugUdp::write(const char *str) { + size_t ret = 0; + if ( conn_.remotePort() != 0 ){ + conn_.beginPacket(conn_.remoteIP(), conn_.remotePort()); + ret = conn_.write(str, strlen(str)); + conn_.write('\n'); + conn_.endPacket(); + } + return ret; +} +size_t debugUdp::write(uint8_t c) +{ + size_t ret = 0; + if ( conn_.remotePort() != 0 ){ + conn_.beginPacket(conn_.remoteIP(), conn_.remotePort()); + ret = conn_.write(&c, 1); + conn_.write('\n'); + conn_.endPacket(); + } + return ret; +} +size_t debugUdp::write(const uint8_t *buffer, size_t size) +{ + size_t ret = 0; + if ( conn_.remotePort() != 0 ){ + conn_.beginPacket(conn_.remoteIP(), conn_.remotePort()); + ret = conn_.write(buffer, size); + conn_.write('\n'); + conn_.endPacket(); + } + return ret; +} + +int debugUdp::read(void) +{ + // return -1 when data is unavailable (arduino api) + return conn_.read(); +} +// ::read(buffer, size): same as readBytes without timeout +int debugUdp::read(char* buffer, size_t size) +{ + return conn_.read(buffer, size); +} + +int debugUdp::read(uint8_t* buffer, size_t size) +{ + return conn_.read((unsigned char*)buffer, size); +} + +int debugUdp::available(void){ + return 0; +}; + +int debugUdp::peek(void) { + return 0; +}; \ No newline at end of file diff --git a/chromance-firmware/debugUdp.h b/chromance-firmware/debugUdp.h new file mode 100644 index 0000000..872393b --- /dev/null +++ b/chromance-firmware/debugUdp.h @@ -0,0 +1,36 @@ +#ifndef DEBUG_UDP_H_ +#define DEBUG_UDP_H_ + +#include +#include +#include + +class debugUdp: public Stream { +public: + using Stream::Stream; + using Print::write; // Import other write() methods to support things like write(0) properly + + debugUdp(int port){ + conn_.begin(port); + }; + + size_t write(uint8_t c) override; + size_t write(const uint8_t *buffer, size_t size) override; + size_t write(const char *buffer, size_t size); + size_t write(const char *str); + int read(void) override; + int read(char* buffer, size_t size); + int read(uint8_t* buffer, size_t size) override; + size_t readBytes(uint8_t *buffer, size_t length) override; + int available(void) override; + int peek(void) override; + size_t readBytesUntil(char terminator, char *buffer, size_t length); // as readBytes with terminator character + String readStringUntil(char terminator); + virtual void flush() { conn_.flush(); } + virtual bool outputCanTimeout () { return true; } + +private: + WiFiUDP conn_; + // int available(void) override; +}; +#endif \ No newline at end of file diff --git a/chromance-firmware/index.h b/chromance-firmware/index.h index 631cee5..98d7703 100644 --- a/chromance-firmware/index.h +++ b/chromance-firmware/index.h @@ -14,9 +14,28 @@ const char MAIN_page[] PROGMEM = R"=====( Click to set Chromance mode Chromance
Click to turn UDP packets
+
+ + +
+
+ )====="; \ No newline at end of file diff --git a/chromance-firmware/mapping.h b/chromance-firmware/mapping.h index fb46bf0..592a601 100644 --- a/chromance-firmware/mapping.h +++ b/chromance-firmware/mapping.h @@ -7,8 +7,8 @@ #define MAPPING_H_ // I accidentally noted these down 1-indexed and I'm too tired to adjust them -#define headof(S) ((S * LEDS_PER_SEGMENTS)) -#define tailof(S) (headof(S) + (LEDS_PER_SEGMENTS -1)) +#define tailof(S) ((S * LEDS_PER_SEGMENTS)) +#define headof(S) (tailof(S) + (LEDS_PER_SEGMENTS -1)) #define NUMBER_OF_NODES 24 #define SIDES_PER_NODES 6 @@ -28,32 +28,25 @@ int nodeConnections[NUMBER_OF_NODES][SIDES_PER_NODES] = { {-1, -1, 2, -1, 3, -1}, {-1, -1, 20, -1, 19, -1}, {-1, -1, 22, -1, 21, -1}, - {-1, 3, 7, 4, -1, -1}, {-1, 19, 18, 1, 8, 2}, {-1, 21, 24, 26, 25, 20}, {-1, -1, -1, 29, 23, 22}, - {-1, 8, -1, 6, -1, 7}, {-1, 25, -1, 17, -1, 18}, {-1, 23, -1, 30, -1, 24}, - {4, -1, 5, -1, -1, -1}, {1, -1, 0, -1, 9, -1}, {26, -1, 27, -1, 36, -1}, {29, -1, -1, -1, 28, -1}, - {6, 9, 15, 10, -1, 5}, {17, 36, 35, 13, 14, 0}, {30, 28, -1, 31, 37, 27}, - {-1, 14, -1, 16, -1, 15}, {-1, 37, -1, 34, -1, 35}, - {10, -1, 11, -1, -1, -1}, {13, -1, 33, -1, 12, -1}, {31, -1, -1, -1, 32, -1}, - {16, 12, -1, -1, -1, 11}, {34, 32, -1, -1, -1, 33} }; @@ -124,7 +117,20 @@ int nodeConnections[NUMBER_OF_NODES][SIDES_PER_NODES] = { // {17, 20, -1, -1, -1, 19}, // {18, 21, -1, -1, -1, 20} // }; - +/* + x x x + ╱ ╲ ╱ ╲ ╱ ╲ + x x x x + │╲ ╱ ╲ ╱ ╲ ╱│ + │ x x x │ + x │ x │ x │ x + ╲│╱ ╲│╱ ╲│╱ + x x x + │╲ ╱│╲ ╱│ + │ x │ x │ + x │ x │ x + ╲x╱ ╲x╱ +*/ // First member: Node closer to ceiling // Second: Node closer to floor int segmentConnections[NUMBER_OF_SEGMENTS][SIDES_PER_SEGMENT] = { @@ -172,44 +178,44 @@ int segmentConnections[NUMBER_OF_SEGMENTS][SIDES_PER_SEGMENT] = { // Second: LED index closer to ceiling // Third: LED index closer to floor int ledAssignments[NUMBER_OF_SEGMENTS][3] = { - {0, tailof(0), headof(0)}, - {0, tailof(1), headof(1)}, - {0, tailof(2), headof(2)}, - {0, headof(3), tailof(3)}, - {0, headof(4), tailof(4)}, - {0, headof(5), tailof(5)}, - {0, tailof(6), headof(6)}, - {0, tailof(7), headof(7)}, - {0, tailof(8), headof(8)}, - {0, headof(9), tailof(9)}, - {0, headof(10), tailof(10)}, - {0, headof(11), tailof(11)}, - {0, tailof(12), headof(12)}, - {0, tailof(13), headof(13)}, - {0, headof(14), tailof(14)}, - {0, tailof(15), headof(15)}, - {0, headof(16), tailof(16)}, - {0, tailof(17), headof(17)}, - {0, tailof(18), headof(18)}, - {0, tailof(19), headof(19)}, - {0, headof(20), tailof(20)}, - {0, tailof(21), headof(21)}, - {0, headof(22), tailof(22)}, - {0, headof(23), tailof(23)}, - {0, tailof(24), headof(24)}, - {0, headof(25), tailof(25)}, - {0, headof(26), tailof(26)}, - {0, headof(27), tailof(27)}, - {0, tailof(28), headof(28)}, - {0, tailof(29), headof(29)}, - {0, headof(30), tailof(30)}, - {0, headof(31), tailof(31)}, - {0, headof(32), tailof(32)}, - {0, tailof(33), headof(33)}, - {0, tailof(34), headof(34)}, - {0, tailof(35), headof(35)}, - {0, tailof(36), headof(36)}, - {0, headof(37), tailof(37)} + {0, headof(0), tailof(0)}, + {0, headof(1), tailof(1)}, + {0, headof(2), tailof(2)}, + {0, tailof(3), headof(3)}, + {0, tailof(4), headof(4)}, + {0, tailof(5), headof(5)}, + {0, headof(6), tailof(6)}, + {0, headof(7), tailof(7)}, + {0, headof(8), tailof(8)}, + {0, tailof(9), headof(9)}, + {0, tailof(10), headof(10)}, + {0, tailof(11), headof(11)}, + {0, headof(12), tailof(12)}, + {0, headof(13), tailof(13)}, + {0, tailof(14), headof(14)}, + {0, headof(15), tailof(15)}, + {0, tailof(16), headof(16)}, + {0, headof(17), tailof(17)}, + {0, headof(18), tailof(18)}, + {0, headof(19), tailof(19)}, + {0, tailof(20), headof(20)}, + {0, headof(21), tailof(21)}, + {0, tailof(22), headof(22)}, + {0, tailof(23), headof(23)}, + {0, headof(24), tailof(24)}, + {0, tailof(25), headof(25)}, + {0, tailof(26), headof(26)}, + {0, tailof(27), headof(27)}, + {0, headof(28), tailof(28)}, + {0, headof(29), tailof(29)}, + {0, tailof(30), headof(30)}, + {0, tailof(31), headof(31)}, + {0, tailof(32), headof(32)}, + {0, headof(33), tailof(33)}, + {0, headof(34), tailof(34)}, + {0, headof(35), tailof(35)}, + {0, headof(36), tailof(36)}, + {0, tailof(37), headof(37)} }; // Border nodes are on the very edge of the network. diff --git a/chromance-firmware/ripple.h b/chromance-firmware/ripple.h index 43d7f5a..e0a0b84 100644 --- a/chromance-firmware/ripple.h +++ b/chromance-firmware/ripple.h @@ -7,28 +7,28 @@ #define RIPPLE_H_ // WARNING: These slow things down enough to affect performance. Don't turn on unless you need them! -// #define DEBUG_ADVANCEMENT // Print debug messages about ripples' movement +#define DEBUG_ADVANCEMENT // Print debug messages about ripples' movement // #define DEBUG_RENDERING // Print debug messages about translating logical to actual position // #include #include "mapping.h" enum rippleState { - STATE_DEAD, - STATE_WITHIN_NODE, // Ripple isn't drawn as it passes through a node to keep the speed consistent - STATE_TRAVEL_UP, - STATE_TRAVEL_DOWN + STATE_DEAD, // Ripple is to be deleted and should not lit up + STATE_WITHIN_NODE, // Ripple isn't drawn as it passes through a node to keep the speed consistent + STATE_TRAVEL_UP, // Ripple is moving upward + STATE_TRAVEL_DOWN // Ripple is moving downward }; enum rippleBehavior { - BEHAVIOR_COUCH_POTATO, // Stop at next node - BEHAVIOR_LAZY, // Only go straight - BEHAVIOR_WEAK, // Go straight if possible - BEHAVIOR_FEISTY, - BEHAVIOR_ANGRY, - BEHAVIOR_ALWAYS_RIGHT, - BEHAVIOR_ALWAYS_LEFT, - BEHAVIOR_EXPLODING // Coming soon + BEHAVIOR_COUCH_POTATO, // Stop at next node + BEHAVIOR_LAZY, // Only go straight + BEHAVIOR_WEAK, // Go straight if possible + BEHAVIOR_FEISTY, + BEHAVIOR_ANGRY, + BEHAVIOR_ALWAYS_RIGHT, + BEHAVIOR_ALWAYS_LEFT, + BEHAVIOR_EXPLODING // Coming soon }; float fmap(float x, float in_min, float in_max, float out_min, float out_max) { @@ -36,361 +36,376 @@ float fmap(float x, float in_min, float in_max, float out_min, float out_max) { } class Ripple { - public: +public: Ripple(int id) : rippleId(id) { - Serial.print("Instanced ripple #"); - Serial.println(rippleId); + Serial.print("Instanced ripple #"); + Serial.println(rippleId); } rippleState state = STATE_DEAD; unsigned long color; /* - If within a node: 0 is node, 1 is direction - If traveling, 0 is segment, 1 is LED position from bottom + If within a node: 0 is node, 1 is direction + If traveling, 0 is segment, 1 is LED position from bottom */ int position[2]; // Place the Ripple in a node void start(byte n, byte d, unsigned long c, float s, unsigned long l, rippleBehavior b) { - color = c; - speed = s; - lifespan = l; - behavior = b; + color = c; + speed = s; + lifespan = l; + behavior = b; - birthday = millis(); - pressure = 0; - state = STATE_WITHIN_NODE; + birthday = millis(); + pressure = 0; + state = STATE_WITHIN_NODE; - position[0] = n; - position[1] = d; + position[0] = n; + position[1] = d; - justStarted = true; + justStarted = true; - Serial.print("Ripple "); - Serial.print(rippleId); - Serial.print(" starting at node "); - Serial.print(position[0]); - Serial.print(" direction "); - Serial.println(position[1]); - } - - void advance(byte ledColors[NUMBER_OF_SEGMENTS][LEDS_PER_SEGMENTS][3]) { - unsigned long age = millis() - birthday; - - if (state == STATE_DEAD) - return; - - pressure += fmap(float(age), 0.0, float(lifespan), speed, 0.0); // Ripple slows down as it ages - // TODO: Motion of ripple is severely affected by loop speed. Make it time invariant - - if (pressure < 1 && (state == STATE_TRAVEL_UP || state == STATE_TRAVEL_DOWN)) { - // Ripple is visible but hasn't moved - render it to avoid flickering - renderLed(ledColors, age); - } - - while (pressure >= 1) { -#ifdef DEBUG_ADVANCEMENT Serial.print("Ripple "); Serial.print(rippleId); - Serial.println(" advancing:"); -#endif - - switch (state) { - case STATE_WITHIN_NODE: { - if (justStarted) { - justStarted = false; - } - else { -#ifdef DEBUG_ADVANCEMENT - Serial.print(" Picking direction out of node "); - Serial.print(position[0]); - Serial.print(" with agr. "); - Serial.println(behavior); -#endif + Serial.print(" starting at node "); + Serial.print(position[0]); + Serial.print(" direction "); + Serial.println(position[1]); + } - int newDirection = -1; + void advance(byte ledColors[NUMBER_OF_SEGMENTS][LEDS_PER_SEGMENTS][3]) { + unsigned long age = millis() - birthday; - int sharpLeft = (position[1] + 1) % SIDES_PER_NODES; - int wideLeft = (position[1] + 2) % SIDES_PER_NODES; - int forward = (position[1] + 3) % SIDES_PER_NODES; - int wideRight = (position[1] + 4) % SIDES_PER_NODES; - int sharpRight = (position[1] + 5) % SIDES_PER_NODES; + if (state == STATE_DEAD) + return; - if (behavior <= BEHAVIOR_ANGRY) { // Semi-random aggressive turn mode - // The more aggressive a ripple, the tighter turns it wants to make. - // If there aren't any segments it can turn to, we need to adjust its behavior. - byte anger = behavior; + pressure += fmap(float(age), 0.0, float(lifespan), speed, 0.0); // Ripple slows down as it ages + // TODO: Motion of ripple is severely affected by loop speed. Make it time invariant - while (newDirection < 0) { - if (anger == BEHAVIOR_COUCH_POTATO) { - int forwardConnection = nodeConnections[position[0]][forward]; + if (pressure < 1 && (state == STATE_TRAVEL_UP || state == STATE_TRAVEL_DOWN)) { + // Ripple is visible but hasn't moved - render it to avoid flickering + renderLed(ledColors, age); + } - // We can't go straight ahead - we need to take a rest + while (pressure >= 1) { #ifdef DEBUG_ADVANCEMENT - Serial.println(" Never continue ... too lazy - stopping"); + Serial.print("---- Ripple "); + Serial.print(rippleId); + Serial.println(" advancing:"); #endif - // Die now - age = lifespan; - break; - //break; - } - if (anger == BEHAVIOR_LAZY) { - int forwardConnection = nodeConnections[position[0]][forward]; - - if (forwardConnection < 0) { - // We can't go straight ahead - we need to take a rest -#ifdef DEBUG_ADVANCEMENT - Serial.println(" Can't go straight - stopping"); -#endif - // Die now - age = lifespan; - break; - //break; - } - else { -#ifdef DEBUG_ADVANCEMENT - Serial.println(" Going forward"); -#endif - newDirection = forward; - } + switch (state) { + case STATE_WITHIN_NODE: { + if (justStarted) { + justStarted = false; } - - if (anger == BEHAVIOR_WEAK) { - int forwardConnection = nodeConnections[position[0]][forward]; - - if (forwardConnection < 0) { - // We can't go straight ahead - we need to take a more aggressive angle -#ifdef DEBUG_ADVANCEMENT - Serial.println(" Can't go straight - picking more agr. path"); -#endif - anger += 1; - } - else { -#ifdef DEBUG_ADVANCEMENT - Serial.println(" Going forward"); -#endif - newDirection = forward; - } + else { + #ifdef DEBUG_ADVANCEMENT + Serial.print(" Picking direction out of node "); + Serial.print(position[0]); + Serial.print(" with agr. "); + Serial.println(behavior); + #endif + + int newDirection = -1; + + int sharpLeft = (position[1] + 1) % SIDES_PER_NODES; + int wideLeft = (position[1] + 2) % SIDES_PER_NODES; + int forward = (position[1] + 3) % SIDES_PER_NODES; + int wideRight = (position[1] + 4) % SIDES_PER_NODES; + int sharpRight = (position[1] + 5) % SIDES_PER_NODES; + + if (behavior <= BEHAVIOR_ANGRY) { // Semi-random aggressive turn mode + // The more aggressive a ripple, the tighter turns it wants to make. + // If there aren't any segments it can turn to, we need to adjust its behavior. + byte anger = behavior; + + while (newDirection < 0) { + if (anger == BEHAVIOR_COUCH_POTATO) { + int forwardConnection = nodeConnections[position[0]][forward]; + + // We can't go straight ahead - we need to take a rest + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Never continue ... too lazy - stopping"); + #endif + // Die now + age = lifespan; + break; + //break; + } + + if (anger == BEHAVIOR_LAZY) { + int forwardConnection = nodeConnections[position[0]][forward]; + + if (forwardConnection < 0) { + // We can't go straight ahead - we need to take a rest + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Can't go straight - stopping"); + #endif + // Die now + age = lifespan; + break; + //break; + } + else { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Going forward"); + #endif + newDirection = forward; + } + } + + if (anger == BEHAVIOR_WEAK) { + int forwardConnection = nodeConnections[position[0]][forward]; + + if (forwardConnection < 0) { + // We can't go straight ahead - we need to take a more aggressive angle + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Can't go straight - picking more agr. path"); + #endif + anger += 1; + } + else { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Going forward"); + #endif + newDirection = forward; + } + } + + if (anger == BEHAVIOR_FEISTY) { + int leftConnection = nodeConnections[position[0]][wideLeft]; + int rightConnection = nodeConnections[position[0]][wideRight]; + + if (leftConnection >= 0 && rightConnection >= 0) { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Turning left or right at random"); + #endif + newDirection = random(2) ? wideLeft : wideRight; + } + else if (leftConnection >= 0) { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Can only turn left"); + #endif + newDirection = wideLeft; + } + else if (rightConnection >= 0) { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Can only turn right"); + #endif + newDirection = wideRight; + } + else { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Can't make wide turn - picking more agr. path"); + #endif + anger+=1; // Can't take shallow turn - must become more aggressive + } + } + + if (anger == BEHAVIOR_ANGRY) { + int leftConnection = nodeConnections[position[0]][sharpLeft]; + int rightConnection = nodeConnections[position[0]][sharpRight]; + + if (leftConnection >= 0 && rightConnection >= 0) { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Turning left or right at random"); + #endif + newDirection = random(2) ? sharpLeft : sharpRight; + } + else if (leftConnection >= 0) { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Can only turn left"); + #endif + newDirection = sharpLeft; + } + else if (rightConnection >= 0) { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Can only turn right"); + #endif + newDirection = sharpRight; + } + else { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Can't make tight turn - picking less agr. path"); + #endif + anger--; // Can't take tight turn - must become less aggressive + } + } + + // Note that this can't handle some circumstances, + // like a node with segments in nothing but the 0 and 3 positions. + // Good thing we don't have any of those! + + } // End while loop + } + else if (behavior == BEHAVIOR_ALWAYS_RIGHT) { + for (int i = 1; i < SIDES_PER_NODES; i++) { + int possibleDirection = (position[1] + i) % SIDES_PER_NODES; + + if (nodeConnections[position[0]][possibleDirection] >= 0) { + newDirection = possibleDirection; + break; + } + } + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Turning as rightward as possible"); + #endif + } + else if (behavior == BEHAVIOR_ALWAYS_LEFT) { + for (int i = 5; i >= 1; i--) { + int possibleDirection = (position[1] + i) % SIDES_PER_NODES; + + if (nodeConnections[position[0]][possibleDirection] >= 0) { + newDirection = possibleDirection; + break; + } + } + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Turning as leftward as possible"); + #endif + } + else if (behavior == BEHAVIOR_EXPLODING) { + for (int i = 5; i >= 1; i--) { + int possibleDirection = (position[1] + i) % SIDES_PER_NODES; + + if (nodeConnections[position[0]][possibleDirection] >= 0 && (possibleDirection != position[0])) { + newDirection = possibleDirection; + // start + } + } + + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Exploding !"); + #endif + } + + #ifdef DEBUG_ADVANCEMENT + Serial.print(" Leaving node "); + Serial.print(position[0]); + Serial.print(" in direction "); + Serial.println(newDirection); + #endif + if (newDirection >= 0){ + position[1] = newDirection; + } + }// End else from 'if (justStarted) {' + + position[0] = nodeConnections[position[0]][position[1]]; // Look up which segment we're on + if ( position[0] > 37 ) + { + Serial.print("Uhoh, position[0] out of bound at line 296 :"); + Serial.println(position[0]); } - - if (anger == BEHAVIOR_FEISTY) { - int leftConnection = nodeConnections[position[0]][wideLeft]; - int rightConnection = nodeConnections[position[0]][wideRight]; - - if (leftConnection >= 0 && rightConnection >= 0) { -#ifdef DEBUG_ADVANCEMENT - Serial.println(" Turning left or right at random"); -#endif - newDirection = random(2) ? wideLeft : wideRight; - } - else if (leftConnection >= 0) { -#ifdef DEBUG_ADVANCEMENT - Serial.println(" Can only turn left"); -#endif - newDirection = wideLeft; - } - else if (rightConnection >= 0) { -#ifdef DEBUG_ADVANCEMENT - Serial.println(" Can only turn right"); -#endif - newDirection = wideRight; - } - else { -#ifdef DEBUG_ADVANCEMENT - Serial.println(" Can't make wide turn - picking more agr. path"); -#endif - anger+=1; // Can't take shallow turn - must become more aggressive - } + #ifdef DEBUG_ADVANCEMENT + Serial.print(" and entering segment "); + Serial.println(position[0]); + #endif + + if (position[1] == 5 || position[1] == 0 || position[1] == 1) { // Top half of the node + #ifdef DEBUG_ADVANCEMENT + Serial.println(" (starting at bottom)"); + #endif + state = STATE_TRAVEL_UP; + position[1] = 0; // Starting at bottom of segment } - - if (anger == BEHAVIOR_ANGRY) { - int leftConnection = nodeConnections[position[0]][sharpLeft]; - int rightConnection = nodeConnections[position[0]][sharpRight]; - - if (leftConnection >= 0 && rightConnection >= 0) { -#ifdef DEBUG_ADVANCEMENT - Serial.println(" Turning left or right at random"); -#endif - newDirection = random(2) ? sharpLeft : sharpRight; - } - else if (leftConnection >= 0) { -#ifdef DEBUG_ADVANCEMENT - Serial.println(" Can only turn left"); -#endif - newDirection = sharpLeft; - } - else if (rightConnection >= 0) { -#ifdef DEBUG_ADVANCEMENT - Serial.println(" Can only turn right"); -#endif - newDirection = sharpRight; - } - else { -#ifdef DEBUG_ADVANCEMENT - Serial.println(" Can't make tight turn - picking less agr. path"); -#endif - anger--; // Can't take tight turn - must become less aggressive - } + else { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" (starting at top)"); + #endif + state = STATE_TRAVEL_DOWN; + position[1] = LEDS_PER_SEGMENTS - 1; // Starting at top of LED-strip } - - // Note that this can't handle some circumstances, - // like a node with segments in nothing but the 0 and 3 positions. - // Good thing we don't have any of those! - } + break; } - else if (behavior == BEHAVIOR_ALWAYS_RIGHT) { - for (int i = 1; i < SIDES_PER_NODES; i++) { - int possibleDirection = (position[1] + i) % SIDES_PER_NODES; - - if (nodeConnections[position[0]][possibleDirection] >= 0) { - newDirection = possibleDirection; - break; + + case STATE_TRAVEL_UP: { + position[1]++; + + if (position[1] >= LEDS_PER_SEGMENTS) { + // We've reached the top! + #ifdef DEBUG_ADVANCEMENT + Serial.print(" Reached top of seg. "); + Serial.println(position[0]); + #endif + // Enter the new node. + int segment = position[0]; + position[0] = segmentConnections[position[0]][0]; + if ( position[0] > NUMBER_OF_SEGMENTS ) + { + Serial.print("Segment out of bound :"); + Serial.print(position[0]); + Serial.println(""); + } + for (int i = 0; i < SIDES_PER_NODES; i++) { + // Figure out from which direction the ripple is entering the node. + // Allows us to exit in an appropriately aggressive direction. + int incomingConnection = nodeConnections[position[0]][i]; + if (incomingConnection == segment) + position[1] = i; + } + #ifdef DEBUG_ADVANCEMENT + Serial.print(" Entering node "); + Serial.print(position[0]); + Serial.print(" from direction "); + Serial.println(position[1]); + #endif + state = STATE_WITHIN_NODE; } - } - -#ifdef DEBUG_ADVANCEMENT - Serial.println(" Turning as rightward as possible"); -#endif - } - else if (behavior == BEHAVIOR_ALWAYS_LEFT) { - for (int i = 5; i >= 1; i--) { - int possibleDirection = (position[1] + i) % SIDES_PER_NODES; - - if (nodeConnections[position[0]][possibleDirection] >= 0) { - newDirection = possibleDirection; - break; + else { + #ifdef DEBUG_ADVANCEMENT + Serial.print(" Moved up to seg. "); + Serial.print(position[0]); + Serial.print(" LED "); + Serial.println(position[1]); + #endif } - } - -#ifdef DEBUG_ADVANCEMENT - Serial.println(" Turning as leftward as possible"); -#endif + break; } - else if (behavior == BEHAVIOR_EXPLODING) { - for (int i = 5; i >= 1; i--) { - int possibleDirection = (position[1] + i) % SIDES_PER_NODES; - if (nodeConnections[position[0]][possibleDirection] >= 0 && (possibleDirection != position[0])) { - newDirection = possibleDirection; - // start + case STATE_TRAVEL_DOWN: { + position[1]--; + if (position[1] < 0) { + // We've reached the bottom! + #ifdef DEBUG_ADVANCEMENT + Serial.print(" Reached bottom of seg. "); + Serial.println(position[0]); + #endif + // Enter the new node. + int segment = position[0]; + position[0] = segmentConnections[position[0]][1]; + { + Serial.print("Segment out of bound :"); + Serial.print(position[0]); + Serial.println(""); + } + for (int i = 0; i < 6; i++) { + // Figure out from which direction the ripple is entering the node. + // Allows us to exit in an appropriately aggressive direction. + int incomingConnection = nodeConnections[position[0]][i]; + if (incomingConnection == segment) + position[1] = i; + } + #ifdef DEBUG_ADVANCEMENT + Serial.print(" Entering node "); + Serial.print(position[0]); + Serial.print(" from direction "); + Serial.println(position[1]); + #endif + state = STATE_WITHIN_NODE; } - } - -#ifdef DEBUG_ADVANCEMENT - Serial.println(" Turning as leftward as possible"); -#endif - } - -#ifdef DEBUG_ADVANCEMENT - Serial.print(" Leaving node "); - Serial.print(position[0]); - Serial.print(" in direction "); - Serial.println(newDirection); -#endif - - position[1] = newDirection; - } - - position[0] = nodeConnections[position[0]][position[1]]; // Look up which segment we're on - -#ifdef DEBUG_ADVANCEMENT - Serial.print(" and entering segment "); - Serial.println(position[0]); -#endif - - if (position[1] == 5 || position[1] == 0 || position[1] == 1) { // Top half of the node -#ifdef DEBUG_ADVANCEMENT - Serial.println(" (starting at bottom)"); -#endif - state = STATE_TRAVEL_UP; - position[1] = 0; // Starting at bottom of segment - } - else { -#ifdef DEBUG_ADVANCEMENT - Serial.println(" (starting at top)"); -#endif - state = STATE_TRAVEL_DOWN; - position[1] = LEDS_PER_SEGMENTS - 1; // Starting at top of LED-strip - } - break; - } - - case STATE_TRAVEL_UP: { - position[1]++; - - if (position[1] >= LEDS_PER_SEGMENTS) { - // We've reached the top! -#ifdef DEBUG_ADVANCEMENT - Serial.print(" Reached top of seg. "); - Serial.println(position[0]); -#endif - // Enter the new node. - int segment = position[0]; - position[0] = segmentConnections[position[0]][0]; - for (int i = 0; i < SIDES_PER_NODES; i++) { - // Figure out from which direction the ripple is entering the node. - // Allows us to exit in an appropriately aggressive direction. - int incomingConnection = nodeConnections[position[0]][i]; - if (incomingConnection == segment) - position[1] = i; - } -#ifdef DEBUG_ADVANCEMENT - Serial.print(" Entering node "); - Serial.print(position[0]); - Serial.print(" from direction "); - Serial.println(position[1]); -#endif - state = STATE_WITHIN_NODE; - } - else { -#ifdef DEBUG_ADVANCEMENT - Serial.print(" Moved up to seg. "); - Serial.print(position[0]); - Serial.print(" LED "); - Serial.println(position[1]); -#endif - } - break; - } - - case STATE_TRAVEL_DOWN: { - position[1]--; - if (position[1] < 0) { - // We've reached the bottom! -#ifdef DEBUG_ADVANCEMENT - Serial.print(" Reached bottom of seg. "); - Serial.println(position[0]); -#endif - // Enter the new node. - int segment = position[0]; - position[0] = segmentConnections[position[0]][1]; - for (int i = 0; i < 6; i++) { - // Figure out from which direction the ripple is entering the node. - // Allows us to exit in an appropriately aggressive direction. - int incomingConnection = nodeConnections[position[0]][i]; - if (incomingConnection == segment) - position[1] = i; + else { + #ifdef DEBUG_ADVANCEMENT + Serial.print(" Moved down to seg. "); + Serial.print(position[0]); + Serial.print(" LED "); + Serial.println(position[1]); + #endif + } + break; } -#ifdef DEBUG_ADVANCEMENT - Serial.print(" Entering node "); - Serial.print(position[0]); - Serial.print(" from direction "); - Serial.println(position[1]); -#endif - state = STATE_WITHIN_NODE; - } - else { -#ifdef DEBUG_ADVANCEMENT - Serial.print(" Moved down to seg. "); - Serial.print(position[0]); - Serial.print(" LED "); - Serial.println(position[1]); -#endif - } - break; - } default: break; diff --git a/chromance-firmware/sendUdpTest.py b/chromance-firmware/sendUdpTest.py deleted file mode 100644 index 442bf37..0000000 --- a/chromance-firmware/sendUdpTest.py +++ /dev/null @@ -1,31 +0,0 @@ -import socket -import time - -UDP_IP = "192.168.5.50" -UDP_PORT = 8888 - -fd = open("out.bin", "wb") - -b = bytearray() - -sock = socket.socket(socket.AF_INET, # Internet - socket.SOCK_DGRAM) # UDP - -# for j in range(0, 457): -b = bytearray() -j=0 -for i in range(0, j): - b.append(10) # R - b.append(j%50) # G - b.append(00) # B - -for i in range(j, 457): - b.append(10) # R - b.append(0) # G - b.append(25) # B - -sock.sendto(b, (UDP_IP, UDP_PORT)) -time.sleep(0.01) -# fd.write(b) -# fd.flush() -# fd.close() \ No newline at end of file From d23ea8a476c3bb97310ea81abf4fa0a20bcff4ca Mon Sep 17 00:00:00 2001 From: Simon Benoit Date: Mon, 5 Sep 2022 08:00:52 -0400 Subject: [PATCH 6/7] Add png documentation --- ColorWheel.png | Bin 0 -> 196291 bytes Segment_data_diagram-pdn.png | Bin 0 -> 142952 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 ColorWheel.png create mode 100644 Segment_data_diagram-pdn.png diff --git a/ColorWheel.png b/ColorWheel.png new file mode 100644 index 0000000000000000000000000000000000000000..d142d6864275e8a2c270ea687ea1121b0fb07de8 GIT binary patch literal 196291 zcmZ_$byQW`_dgDALOKp1APpj^fYL~(grw4viik*er-TwB3W%fvA`Mc~-Gb8HB_$v! z@teHw_w&y)#7JYxf}l6UA6guA_%9z{ z@^8aGaP9BuJ0S>a{qhf*M%=15f-oXVa?%gnjW=rDoau(jj_Uh*Cckn$+UM@Je*d`B zvEp_|+Z7s&HmO-@9HurY(t90V#C3KzqRVzkce@Ysbq9{ceYrl1k;YP)s|t;_l~1x5 zmJi+3-~9S$zhGj$=lHBRv)O7{S-9=i5AR`nk;M=#i0;-0>=fBN+b6s#Zo0|NHg} zUCl2QXV)0c|Ab00qKHC^BYoa~ZF{)9mYs@)M7NU>g}R6)GvXW-N^uOG-{LR88K1no z&)h)oxF?LLKmX1eO*P2nX$5Z^>MmF}8khC0>>YcjYut-vdC?Hj_D=r!G0xCx0|7{TD%AN5h zsU7nxU10qKMf%*~nnWoRLcezo)YQ7v|ErhE;joM_KGL7#=`oRw500+w*5Ot?`pn0^ zxXb&)$W%0;%F;-Hzu@M7UuiRj<=N2JhvDJjcpi3kc8?wvT&HFLVTs1otEw0v_U7m2-t|4LWRJ+zEfh@Z4Uj_OJILj4 zGclPhb-kOjKN`%@E-NeZ@bFN1e^dI35&A2w?>1v4larGtCns;&)XiBnH8m@LuonFI zT!R50*)9Ly17*o;mnO{QzkU0S7Bvp0{h3Y6lH-_-U}_&F4kpDd19D2rmBWA7*w{W2 zCMG7Sj5rn3p1CYazV(tQoK@%Vv9Y943n%~n`AEz(G(dfJbab$@v;Xm|Z8YU2$6H!i zv0!a(Zk9;xv#r1nEV7*vRf_eNU~pnx{@$0AQa^@0QmJfJOG8afJ%aw1H}>sYE-tRS zqN1n1lC~IV$YrU$R)eF+g zTf`|Hvney!{=UwQ*jG=Tot?pcCnF=HZO08v8(7oQ($e6gBESlghR?2HLG*4?4Bn<9 zV23ZCt`R131Br=^{WUsDMM>FyXXn_P^{rA$c%vz7@Ib~{2}anX(0CO8+szaj%6xb3 zjOMhObKJb?{ihLoB;PQUCKxZ!R50nbPAtp*`G~?N&BBq=0V&3YHr)&sR@Szay<$~4 z&6aZP_n64&?0t{%`sB9o`ee4D%J=^@sfXBvRO<;b+6D#&Mn<$am@?@xosVUhXh=9J zyeVFVc;F(85gF!#pNFgov4SXGT~X)A{LM}9s+ANkq(3sITY#URne|_+~~<;+J-5(nf$aw zpFW8CU6$_u>#rof^(L{OcXk{qCVWnhc3!`JO?TH-FJGtD*iJC1y}kVrx9)=nBv08XeV(`?8n#;e!l=%;w|E$4_st{SvC-A$I(`$Je>;vuZzh zFu1z9nj-FH@A~qm6+9K;XJq?7abu!GK7RP%C``NYKwQ<)+8Pg86t#w}&c7`!yU>;4 z@!xa)%K~K!``*aNNJb`*5vQ_$e|41|As{CH#HxlT?-S=kbybS2#2$q3~4R6EJXZwd($!ehk!ecyq(;Jp0B_-uACa@5q&`()eSn+TA*PO@3 z#p)XOKS}Nh9Ry;!!WPKmDYG-FBwD-isL<rA6+^lT7$t!%@(K|Ni|O92}gN zcQbn+@!dOl4snP1;J%fCHD}oIg(IINsx`=F=wB!a@^CSx?g7-_sf(Q2U*SMG#9XC@A&yi@!g%s^@#R`wT+FIO{|PhpLS@p zz3*kP-x;_|sW(X`!=9-}_RzY6G1zphizQC0V&X-`1gtrH+Fd1OwrlEiB@>A5jxv^;+)1#u9YYQ2rU+SbsV{KmY9;f8ofhI(a+0!oHOS;UCsz zcN9ZK$VNyeHERnC`_}gzX+yojZt9m{P8d)H1qD5N^k~noHZ7UY6I-A8vg`$+yQ7VeaR50e`Kot`?^!Mp{~1Zy8nE@65MyaB%#t zU{U&YbmR_gt=H12$|w$+_2|aN25gJP#m6BfAAbM-J!0ZFwXma?KkRqf?q^hFiuTH} z$_S?R=H{lb`>=WO<0ntvy?d9Lm1WJ{8W}#!>VPqK_%9l|+Qw)xJQ`XZOJ1t^g@yQA zhUGs04xqjcZcl6;xXt*u+1uOeoQ&l?sy>+Z+8$bShRFbc0Go(b!@46ZGScU0E_82q z7xCBnz3&NcsH3khA||%6U&vQnv`aqsld+a&rd!+KDHHxu`EH2 z{!4=gn-is_rAuAb28M=*+cS0*6KJOGQFN*j{QQ4A*-~K*%$%JESN2F`R9UrQkm>7> zE%zo}e{UFYCatxZmMPtK!gt8Cl!#(G~@sO{Wh{VE0Yy@eTKIi1DVM`vN3F4YgAm{U|-LMH^ zQhff*^0w1?t|??7TO9*Ap@5E~713pN485F)UW^K67Ov$7Kuijs-mG|RbPIbO-0a!d zN*`Eb&kSTtP-U$(_M6H*zr+T_w8Hj(W*g7XeM6fATrfWUOh`!3)6=VbKEgd2K_KF` zHF*5}} zi|q`4lM@qnMMO9vm@m=J(a{l*NaX@j1a$ zq!F?ux5OH?o)osaU=hMwSXd~mKR@Yw%LXr7+}+yRdjJ0Y_wV2B{QgaBc+p(Dmh<&1 z^|fnno^##o3l#oL0OgQcnfpdr;HRzz5c!3>7Y~tju^vk~Nyz+t}nmeZrNUjs5%=K;vqb zz{a%iw<4m^wW+BF8se~)ub8T0Y2TqDYfL~y@$J$71a46JT%mU-5+0Mr`GYBp9*m&P zA{{-Anh2g;>{$dts^NS`&Y!oRSA)cg$_nQ*FD7fFI9`gG`+^AKzcDm;7k66eH+B5v z7V11#DV9YkmOUaE1w3G2t-l#I+{6(z-~mWVz6+J+?Q^QFey| zt)Kx6?x+R!OxpGkOV{5rL7a!C9R#JuO9CvkL>Iqx>qWhfcx@kc0ltHs2#qQ^Ia%^_ zj@Ti5$6k1HYHDg|=<3fWkBbQVXo(cv+z$KuQU9che7E;KF#?dfV<_)aLp-dYt5>gH zt`xcUW7+inKY#wLu3EXdRrIYunb3Tv%U~ZK8ai8Kle|Vv9eW}0vU%>!n>WS9#n5e~ z8138X+o5M*U#u!h&I_x>eul~VQNWD@6CF*E zXG`m7f#Kq)5u1VC8=ZxU0BF+oSSg#J;Cm5lufr{$&9V_@!S7h;0WcHlPJZV?tpnNW zvO*9lYHDjcyLQq)Kkja~;I+doCfU`&22v^;`W)vema@0f_bTIPYTH+cn|n)?I*2P| zWPNjEBM-U}R1y5-(A$>8xfsX$85kB=2~Lb(kvx@#j~JR`rpnljybEMK-`MRjg^7gG z8J+M4(c}{X4jvn*`6DRf9NODL=u+(Vr1zL&&<9dl4k)EbIe0Xh!V5^AeT{#882gjx zSw?)+L0Ae02XF`ZYlx?pS5i`vgA`V~1B|_@sw&`Wt*xy9B}UN$e1jNqb`OKLuJBC6 ztDu7a^n8t9jY>lo+%}o1{}?TCvf7_6TZx6$w+BA~Gz4HY$O<49khcOzNj?9YeX+xE z(dh88eL>UfU~ks33a0S8Um{dgR7bsbzCq$&c}s67vy)p}!I~+>!gxQ}7%Mex3@j$k5Pm=Qa=+U>AxwIfaGWYinr!fRa)#PFH}l-n(}%=1G>r*-x?X^=K9)HuV%S z*A1%gB%;Y%iBD6;paPi|KSfK7mp<(~Iug$OR#31tT5ORd_yX!S?>CB$uGVJk&hpQ0 z4o=Rd5Bj`Rk8KsDrO_rT_0?2W3AWNk2L|^3&0NrjSe91R)ObThTb3T59`D)J9kU+1 z9JeWth=@2n_0Am{pPoMN;wnt@b$0$6MR%7T2+@}>U&z?hPES`P-KwYJex;-sR-GZnl$^B+u2biRoKxpnRekBBcqZYw!E=JGWa!Wx>B*GFUxVi}k z^*B{^V(Kv-SFIDGPU8?1kuZIS>R$N|%wY8Fc-3Na$2v?Y4PYRzryPIj2#ur@{*c&SExgULa^F|uS%oYtvBM#t3 z&m^ZKIZnkECBq>zriA)~S>1Yr~uq`(d{{deElnIEb7w^hCBijonu z8U0gM=yU7Vtw_|biHUzf45x@>UqCWQX>^zbj*#N{o1*ifZBFfj1qeET9Q zJRHp*#*(hF#}&heQ?`dNJL=E(3;Vh>7d-by9$?Po0n6Mj77pJKgL8<0)?3ut`Dk>-u;i&5Ex_?{1 z)%PoUM=R_Yu$)DwhVuG27lWI*f@Rc)|8!e?+_1 zqzMm<1!BcbXWD2eW3@ZGfYF5cFSqVuO5u%daSI!6GW(zu$^`{biy63l7uj!-k&kFDU-jdu6N0n2}Q`?lFpd*Se(ezcN~j*hM_ zCBky!2AY(kqa#!q(f1Z1#t8E#Pi}BNefo69@8ZnnQyGA`r|@v^&Kwh!Yrw$ps-2#j zo4c+UmDZFY|7xrD&{&X*O+>_Fq~K9u?E!Vl_bJ=@8J-zu!YcP2b9Hs%%(#_f*wGn9 zxw-3;RZfkjC?I)$s02Oy`=4Ztji+~)x_?F@$fuuxG7~<07@wLVM1Yd&1y$X~4UvJry@kbWZieLr zS^*nUE!#=-1GWTFuw4I*KyEtKV^i+HFE>oPupWt_h&ogUWLj7Q!UU6^DZGBzK)yV} zQhHVI2YD7{`P+711szO(ji_u|bzF7mMjEsJD8^v(AGE}`JNX5#McCbt;t1oN#+DUa zeI5{?L$wx|Ln11GzNKU@Obavyu0Y1m+1V@0%M=t8mQSBva>KT^l2#V>OvjNqQBf2y z{h#CG5ex!|*ukj9QGE33{s~)(dtlk!d3t7|PzTPM z6~`Ua^?OMa+PttcEB0o7-u&1%pSJx5E2}}i&R-Q4rHnY=-A*>D+<`R;9^=C!)RJVE&|4El3y_F zv_52knU^vs2j{g&LsCHV98RfIQafA2moVR#=q?+X_fYcZPB{Ub5mQMY*GQ6S?P-zp zn}pIrvcuAR`F*mEf}bBZ@80!~m`(JbQ~Nc5iLu!~f~VcgJC6Nhr)bKyVqz1(C&jBL zKQrV(23mDsWn)`l*5y0)>2moi4T7@%lLqtRn}+2*Yt9FM|Gtin#zsdg9s3v;_sz5s zeV~Vaea_z9+#Fq;SQ-VwFsQ;XzkW`Hg@-Gts2En-r~kBS>1$lyFDW1tRIRS7lb|AK zYiarX`Saq^Qs(E+MI*bjLB!^1MMWCtRZ6k^qM}^}KR}kjl>U;F(>MT#2d0Szd$8CW*1+X}Oj9A~w$_g<7!GnhnU7Vd^ zJ)LOd;f9lvs$Dk?JZ>re7#w^cD~mzF@O(JW%!eN!^k_Cd!umG6lOvNmJ~ur*fNLG3NY3kTa)HsO+V~TQH z3Ox&2QlIrgf|Gr-mX~(ML^Ke*IP}b5-ka{UG#Z9sxt5v$A` zH6!`Q>%714F<$VFqMZq@Zu>W?*}txOZhd(XV99!Vdb+wEK!H0tIZ@u!i+S_LA!szc zvr`FJcDXCGX8@kt(Byr5&Vc(A6vm{a)OjE8_9h7}5Ll=72}wwBM=&$72nrq??JPX) zOL+lUpRf-)JiO&_p1#w_BR4b3mwhW>J~W*s;#d1!_$qU_3W47-zvoLhT}TY;>K+RZ5#kr)h@j^)Y#f_w->pVkf?le{%>1XM`wKVAUqtm);PL# z78?C8Ko|KoWh?1>>aMN*wuX*}iD?dCu5cCYioV&+b_WK( zQwI|hhIOec{=kj_OxsR<-v=i3Iy}75VUTKQW~Sb4dm1)~$1*HKeqrIoulTxek2^_i z2uwAR{*jT;?jO!>Zo0a<|GXuTd+O>Y^}ap;l{-3c1m8Q-DsuSj59z{V86`zWP*<-$ zG&J;rbuTa|Q`S^WkBfT!dT@9cT?(4rvu7N+0c-o7$NZj%6`-Bpzjximpz(mdrT6V! zT%1h}8f!c@dH^u~^73*J6#yMJHcE#!-`Y zw1n$7IAvLUswA1BGn^)0&g)1L#|5&WUlrlFNy13$e-Fu4pKY}DR~mJ}MX(urS7)C& zi?y`KHfo_TW~oDq(Wur#rzuuzkj;JGUo^khE-!!{;M@UEv08-MDlI7~*iMZE9k$A- zC;vG0;yCrg2kO%}9HvVy@9YY@Qb0ibc=2sWNC;7=g}Xb|K1M(TaNGV+sqmR?V3F&a zn{?FFo?BHbPztac2M5WSf>BK$P$;EXU}5SXg?|nWf$CWRddB-4>$a6& zF^w16OdrigOGFdd2HX>{JL9}q+;bSZwsv-spu?5F5vC>jIEs!K(Nc9Y{wCt(#`Y1! z31@6Ue~QRh>TiY3sm$>Vg?1}Da&)|qygnb|TVy$|X5=NOxv_qE<>usgT$~-g`#C~W z&XkC*Ne)b|em~!iW6{Pr1RcDj*#@+Ibmu&_Z{NN-!vtb8*HDJV1p{7^oPr`NGqYD2 z=^r0A(9~?Kdr~@9G0o~Z+)xz@jPX{o{rA4V-*ptu*SoOSMfrM^v0lTQP%yr za@@ZJumQLpzmO2P@WUe`^*e1eqZhv&t1juk!$KSEKON=-)vW5R@6Y#^dqK~?Y^ybU zL_{g1^2K1kfBnkI$ESU}UlfG{G_&Y8`i~}1a{K!F+6yS+w3V^3u<~@c3SO{9Tz0`p6p0`jXj_)$2pqW~KK{xbg8wbb7a zU;ClF{1tAy*Z5Fql=xXLC>P=cLH`)^nk&K>_F@e-3lW6`H*UUW)!&+z|JJ_O9NYKq z{WV_#@2q3&gwp)LbaxcNf*v+r94gk0X2e0ciao4NfK^h`4`6mIi;Ju4)XU<);X=ZLdf5~ojugYl-t~noGl8VC_1^|c=^T2d`PZt9DYr6I>A0HVFX%X9z;UX6i3s_*6y>^P^LB zHSV&@O%ckpIX7b@7H9EJ43}ufb=>-PLT*XpTNOCTW@=6HMsY534$bND7lk(%_(k62 znv7n0$Whyb=tZRjZzi!QCPxb{`VHD897IEvxt`0ToTPd0qd77=aP3B^Imhe2G8O{- zI?byaF5}=V09H~`3jglv`%V~S^~NCV#7(0b_uENFgotg$zdpZnz8|)X!7#$@roO+6 z>{q>aPviAd8(Uim&{Egup)b{2@l)?SA6nmsWdjF1mc^#08b-2$q9V8Nw)-@mQP z*mjn9{Eh>#>8ThPBtc3{mkos&2I%r$2YHM*5&JiQ`ZIX{krqV#E~wtJe(}NwUpWAZiYq{dTQ}dHH8Tzt}v)n~dQOp9!Uss;c+-@ruK$5Mnc3Q&nH@*OwxmP+n5< zYtFuhZ~xK4`2Tix%F5Ugg6LJ)CQnYn=$HW_0>UN=0Ye1Z6}3Q?69B@xvUR^sAc+A7TB{OQx|^D!(5$wgEBk>J)i;ngj3MKX4}01 zr+_M^R9<5W2H%w1Om756)Iy5)Zf8UU-c9c8tSrz57o%VH76r!uLaw4{vH)WU-a0={ zEANdri1@-Or;$R_dVp*7^%L(jzVrXFQ7j@T=n4uYkZ)BU!WOh}baS*RbKWWZWx6yT zB%#0of$UxUaQ>ud>JT_CEV38Z;l5sWp>+8bOft^4K1eJyQyY zDQ-ZsktIB!h@3e#H3R)@aC*UH;+xTx#tZTaYLYAp{Q#*h^m~txq^+QHHLC(N!|TGV zjI-GFGbWE7`9Nm_>lR$Mj~{7E$MQzj9XP{Lv8gF|AG+f%F{AQQ%jBi08igf0av z9EdzfNPo|^{TL>AzkdB{-+v=xU=0Ap)rB0;u7XoA5y0T3Pd~@0sj0zaBSHWoUDDB4 z=1hT%9Ti-L)voz94;DS@!1>|e2#@T7=`;Y11F!dO<&RZo(POp;dU{_HUIX$qD>Kl4 zx&qRV7>&99O^Rb~?>(M)6`V^H)6pTN-n6n;R#9Ow*Xm&8?Oo%|#1YhJKjU*~CV2(H z43bXjZTl{W%T!6mKY)!)wvulHX_}|H4Iz~jkjO5*)K?J^dP^9V6b%iruU3x1K|S!r zVS+aY+p%b3vyx9+m{!8`@9Nb<7CB8oNuVu2g9l$9#N-ANrWOJtJe(_OJlF%S{qbnG z5us3Z-gsPd!K2+ax1P6rfyJpgFY)jsWs~LRZu1U)uok9A*l&knasBc9`IvCv&)*|u zZ&#u$o`$~HjE(FRtj-5(8?w^}4MYi@(#a9YmRB3T-)$7Yz2%~ziXhIA{pO_TFX2InuJ>pr0JBvV*dlkU;gSHL$r9IO$>@s)o5 zjOnJ0;SUC%>$A6=pQrbOXsSot;)*E^mHa?3HOwE9$_>jPD=-G zPmG6$8q~SS{eO^)`t?i8BN1XZ2U}CGUTs~AY_s!OH@v(fE-bKi5CpjQ;lxdm>PPRt!O^66D{G@zfn3i3H&wP~+=IIwA;gb)-!B{SIqp49J|BkN1M={X-Cv*ENN&3OfP<`;=0c6Aa_Jp@eV4Sw! zz8wPN^w??>?5UC~`S8%nomSL5uBSK8nequBpmUsVJe6#=myu}#G+zRIoPtZ~S4#`# zKr~e4t5?{E2nH*DY@(xd8r6Mjsnd_xWO81a|kd^--I|@+u!@FWYy}L zPdJ)Np-4l9kc)F!%$nc0Xl7CQ{%of|JO5+ z0u>>xhjCJtW{BS;!+7#+fkknPtVk~;Ci&~zzE-gUDY<3MB(~pp8I_nRj$#^Vv^)WF zQs`t4LOx1iHE>Ex@Kjr7YfccbHC(Yqf zJ!KPyg@EFi)NA>d1!i`yB@G?jy9(Kll71;65dIp|mE`61FMV+5&Yi_(UXq~3%idb7 zSG2SXn1)#Ll-ICNfxH#e6rBV)dHK%gCe%Xc1AfNTBlyxNiko^3C)A)8*wZrK5fRbX z)^3(ynj|8L-z%NiRE(zI+}g7I;ROzxjm=||JAHc)$`C5>eo`@!^x*@HhsA%CcawjB z>CY`Uq9qj7Q z1fK`1s;OCG6avGycliS;ll=n=vAzZL@AtqA1ZCArfwpFBe7uW%u`9kEgdTbM)^48q z)7@^Ki|vbZJK$Y$77?EV&&|S4h{H~<$(>1>dea`sBPDN=tr%8qq65-VUFu6p%vq5g zna{hbY93f;-Jc|gPr1c}1e2zarZ@(+tYr}!v+al~^(zJ5yh+^g$z7k+wPXKk*G8QD zqb?FMu3IK-;s=Clspk(*w$wjAJ=fDE=)UIV#j%91c+}7M{aw|ZbfCFmSZ<^L&5FcYIrc9|Bo?yQ`}X2~9UL6M z@=+y`-cai5?5qL^1YmpT8`zGsjX@xE2BT!c0HirCcI0Sh>yfoWz#wX3`BL5$<_LF* zgY^SHr`qO?5kMuYpBaFx)1Inx)IzZWkaP%p$)dErVD44g1maDE;%nH5 zxS7Hk95H%KEKjuY;8rwMR6?hKL=mBs?|zuuov8;>{-{~uriI~^uNJ;lV((K8Mdllw z23|RtDC_kH2oRO*rMX|rGs4g0^0()`ji>$g90nLLJ6IRcxL&n_ZUn}66o~OYv85tRms$JLiPnMT03eApjX@kvAMB}9k5nF@hCgLFJW7jGj(uQaasf=hG>HjmX=|I8vj#Zw z8yhm^=Rjfm94700{#`nc<`%5&4iFInk1v)bzPoku0CH25Cf+2s&R+4asi2K8j~t8!Y`Eu5s|9$@`FnmEpgJk7~*r6yYh)49&TU}lr}6l7$2}VYX3Ch z>oJnb+@!$Qp@bnhe?_!SxDXK*+Pz}k{nYPu9PrB_Nm_@2xGfR(XP>y0r593jDGdX@SD|7NXqFJ z7;!KtFk)k)?!}T92g$~M1`qsF70cU}LSfb#1JKZyH3cl7!cz-B!CW}<59Hb!P-gP9 z0`{@NYARl%fEeQ?*O2UWsh?(wk{6r zF4|mgwfAsj+T0UB;^N}G_j65JndV>%O8y(`vrn>1sM@=9JFc;30^+!QZ}_4+OCQBN zcD-i)(PuhCZS&Opkufu4>V7ZHK?mC!V5i5%=P1n-9eVv^ipvOWO z7ncdKU+zf+W(rg&cjyF~RnFlxYy?cRJ9p$Xzm3`ae%cam$xrPDp1nmo5yTxuOqjXj zpMzW{dGa$_Em;(j>x+BGU!r!GOpl0p&rMKW0V){g=gv|$_&7JH@hmw5(YzSE>gokv7bs_t7=-+X^tmih9P_@&?v)3XH0}4sDI1 z)nZvb{j3DW1#U(4)Q`VAGDytFk2R3b0_*ziv0h=_$=4~{6%XIz-KAY=dPf{4Naj>l zx;r|S6c!RodV4E80Qc^AS*X4WIzjgr5i6q?-vq7n_9ColrRGRT3XYv4$# z$b_|;kHOQQIh&f%&(}HCKm))JZb==a8^O@rpkWQBifqeNiI>>zxDLU`yaII&Iw~r6 z5YvkaN$>?^aM~TfzcD##qTH%nAUalkpcHE(IPtu&_T~EcJRPYFru02k)fxzSKp-V+ zH8ugXu1lt+uOEJb_@68-Etwp5>5e|YS6++uJ6(XuY%g46-WqXv5bHM3 z!e(P5BW!*O(kP(*^?x&YI^Aee8I*I_BY**h5;IK0u>V_0hQ>&J;vVV=^=b4zR&B zF);yY(;^BjBcqRR-|~%&x@eLsDk?%=4#I^TneZSpGc#=zEkL!HKjK03svI-D-z8On zwE?vNpmH>el#&umjkuJQf{}F*q6)tc#Fy9$;(=ca3eNvD6MK1iab%jJ$D&PQq3SSC z^QBY=6woaV$xk0r#fA;b+y46VfGLi_>6*xEt?XD8<~D@~4gRN;#35!nxg3t#E0QBQ zVkph9fUqB-%xRUF_Qc7 zriiOtkUOdZya{JcQdVHvqx)IZoS&@2x?YVv{bCs0+)~%@`GYq82j2YpLmxPe`rmGhO zECIEGG{T}}idKTt;fbP0v%O-^SE{i3`b|ve^{1jVSv{UjN-XJO%D%S*cE3gVqnByi zk|tLV)gfaRzZ29$N3(M#SM$x_%X{AC@W8}>Z%l;dw~exII<-Dr%#J8xe#cBphY{_4 zWor`cD)!tgwuTediD&cB&=62|Xd-nBQFnLu_B1bu{f=ZAQKsTo_{Jt}#9&e({&Xd9 zcngK;ZLFL#X7j#pzRnqkDPrG_-&T)bef|U@_lB<5xs%%36r$Td4XnX=8{@K3hU-)W zkmGX#xm?64tE}uHxqK0#k2h&K>xxvMhatQc3|pjZ~%z=p4Da6c@jLpTUzky(^RS($o` zv(*-s74}#P1dfJ^?Y8YccR9*8ct($`x87iPhx3v2>*5LzJ#=1CuhylO)0A5A|oiY~-gH+SZl^Zz&W0J4Ly z1)B1go-vQpp=Qyi&2zl%4zVnAUsz9hmr}FadLx#VjIh}=d)_v@v$fme>|RmaX~SU> z>$AAa$(3y%)(O1;qTLQ*ckPiUQuNri_%Y~=no^zL#1q;jVg%SgtCf?h>)2%%sOt{X?~o78D(jj z`n7F_=mVPrU5uZXjZV{jqbJ9w9pbofc-59F_XH(VW4sMY!zBt&Nuf{eQ{)Jt^4CcB}(|oJ_2vOy> z8iIgt3=pX12f()nMn*jjv`I5Nx`c^|%U!J2q%yXFE59lUpz1|sEnRm7E)UY4v*wl< zk-%Bo%&SDpv6OnyHN64lLidwRM`e@NCal0l73*?FImRuR+6d#nx zWv)0qA~(}?9IW{Kp4aNLN>Ap^Q1K`ukAmPYd3A*Hj&U80EPLx6RdV-RE#_~GhAg6q zIQmrC`}%}va5G`f&zo)L4`g@i{>s7!+yJg9A%R3pBdk;X>`Q&y28O z!F^0q8JL0>gpCNtO?lH2Yg#z*eJkQKjz{ow4}+gloHt7_djAHs2gZBt@p94tPa}@K zP{S*vTjEi=qpyadEzyu!m6^_BC;1=U0^X7O2r=9gW|BQN&hYtzWtlh1XqI>CqtK6C z-h_1yi8^)~^|2F|Y7_Kb%|-cUQ8(F2y-{Y;Mcwu*Th1m$x5=B6^rQUoppnK8)36$% zoRBqN`0(KaPv#}ZoCOi zyz=DPbxz*0zQ^46Tj{zAnWJN|5vkbxkhDra*Q@(>H4n3zhV z!_vIzuPC&5FMk(zu~q%j|Cs8&{Xfg^1s~}riS5pDH(W*GB+Vy=v(=6_*NMgdYJjcS zaxFG~SJQ+ex%=gl0ueH5SpPF=b#!SV^k!x8Yb3eXBUngW$S05LaE85j{YfEyJTL$b z+1Ti4*mHLbi8+hAqQ@hw|H}gC zm7}M4f5b!w9rbH&E{IxyxKlvio18Riwa&+z$UB!AYV-1?^T;#U+f5rEB#68QRj&{r zf(pBH!n2}vr;0pz9e+CgG?^C8!MNcO%2FvK$SisTd&6yi(j}9>H^wc>=H$4im`u&& z5zSRbJZ;ntmQ-e2*pbz5l_Hhg)F%a8#>@#AmQB9bm#=C5V4=zteuDQqIE}P~mK^u0 zNXO7%yaxMqC;3jkH;Npwet01oD2a1apmbOiD}ITYH?6|UN8r}Nd6w^o(_XrHdT$aF z!;`P{V8q-#*;T*lvRE7@_S)imBGLFinhURyBQ7{HZOb_7_9KF{Dy9*Sq>B1W7qvb? z1MP9qAETw8E}`%I2a=v35Wou0!0AMmFzK14gxysGmHZ_!Ce_SxZszAbZZDcF;mqJo zLzaHC{2u5FKgAl<)jZ{Nj!~%+-^chN-||iM3sHwA{?%toc-BiEQcvV{_Es8VzYHx_ zao8&PggPxBaIEKH_F-U=yCqR^!iss^Q4)zlw96w`z1 z9YbhBO?lnHW4z?M?wokcdCY%qV)NMB-^EVC@eV<*e8E2AYxrCKdtmlD2mNc@rCkqt z<7A^Z8YxV7&$aYo!#bBpLr4-#^nLdBKK@{y_dyyq3?uKcXj6+YD%xfb;aP{%s&+fZ zgf8`vb!Uv`h}~55`FbzcUu*vG$z*Z*Rx4%w;oH>H87F~iR$7`~O$+snlj*eq?0D`- z!q7{k;&(ETiid{>W%?sk5=0v%O>*5r;}?QS7y(keR4vis|9{TYe^giFcm%Q}oMrOy z5$|T<_Fc)_4m_oDwW644Qflp5&q1167tK+Uw$awYV<$h z#KX;GXF+zCrJ2KHKK|JY4ju$z82@kayUTYee>JtUVVm)fDRqA-d1elGyY0M>q*o_q z&RrcGb|8ESjIk8bdT`Kaad8oHQTsu}5)G~Ez!+4Nm4&0$x3>?Ez2R3!pm4za5T=cS zBVtsM3d+xb_X0zh*=C@pr;z_?TfxT0R%lqU)l4ke;-X_Og~g>+Krdv|E4N?`o|_O} z+%M2VLhvaeoP*W?(&)_giZBrZY?{+FE)YZuNH)S@@&6_Ez&{d%j46~Z@SzF2`Y9`Z zaBZU&gr!ma9Qt+M9!5r!I}7dbfpFZV0x~~<=W=p5q)~rl+<&gC0Ud-^a(NI3pq>W% z-)D`72sRc%$8~`F7^6mN_8Q)OWE;7OmN4B$D`oj)=t{N>`$(MOk_XGK_7znVbn^+fiOx)oU24HDVx`i(A=R?&}6!m zZ+d8Zmh6`0xArp|t--Q%bE2ZKwpJWmf5<^X3Yv>6x2g)rVEp^{^8{I-gH}x3$8iu% zhQ|fe9JXBsJ0!m?pFBbHhfLjnzl{M6fgc2W6^?cwI82r3^e=bl`S~T-V9sqOv@5~s zIXHJS?~!thH)lTzq7D{r$_hs&v?kDhlDPH8Az2mO4q_4fk^?TTX3ke|NZVaZ$no71 zUocOM{m%B)C5~GzkEGsX4q#ZFrC~-IdRR^qFGx5wM%7HYLV^%K^id*vN;IM(n|Mhq z1CFX|I-|EJLh6s+UuQKlJLXW12`f}jzp0pf6>lXFt8s#G+R}d5zZ$nj@Q<_qs?OI( z*VvKdx@Hx#yhj{p$a89zB^hgpn|gTo@zM%REv!MjUSq_k6&f|c$Lb_s$I(7A^}P*Q zk<^nBiBRQ5?L3HLiIv4ZQl$Tw^1)%HJT+OoLZ!b-qy&By&uV`^hZ3ovou?Ga8BUm< zz-iC>_j|W}534T^vLGNufTt&?sj9Btt|~?!4MpuCL5_z8BBV)?sWhCBfMZfR80Z21 zBkM~ZDfeyRpoS>q=5p1%&xvVOm}J6ggqslMMZ8ii>q&R-ACg$$Y0{u6uQfD)l>3df;}QkE&DCY8bqWZ9SO0{(e>~%5;!xvPzi^7be`axeb&SgOh6$_`OB7w{ zTasDKCfr~$VPi$%fQ2hfxGkt#dZdIum0o_q^!fj2I_s#ay6@{>E+7q;OLsQ{64G@6 z3F*d%mhO~JNm07HTTno{1wlX>LFtlGy7S$9-|_pKae#65Is5E2*JsY9-7djy?5xO} zZthWP(_@2=tr6NYLZRF~+P!m{oxkoKawxWXc&8{O#~#5*Ubq@eimO1EM|v88>@;zJ zdu3#Hpgs7E+~ot>B7yX*ez!2OM=WY+pdy^JROel$1cQLscY@HuJ`;c{ApGorq&V@9FX`(1Y3KsZsFW z$p`xde<0l8Ac-6#GWv8Fp8|&C^zPwrfLA+}&X)%-HQ}@K%&d*ltH7hq&xnN0Bn3zKIw8m_1O+$GeTPQw?><}A z{^E0Y!j?mq9J^M2^Ygyu;FaGppZmFSz4howH>9KN9d87vs6jn8-$*q;Cy}FnI4)%X z4F+_%GV^QFZ*AT~$IN}M*~noYK0stO`laD{=~*E&~;|M8HLtV zF`Lun*`cT@k_(bc#dMrgkds7p*fDZ|?>GZ?N&TQ{`Bw%0WRI0|`dOqhxq&?Mpb7|k;5IQ)ED zYyHPzjkY=?LJT#NOBtQu%?Nf&Jr=EuY2f&daRlT*clUzYs)uq z>#3nFEUnaQc;S2S57q0DuG5=W{X(Bi{4d%b&bN#32G*G%c9n6p6@fKve*a>)sRV`Q zc3MkqX^ANmZ|gMuZ}Z-#nIzu5z5kd1vJAdkBvzfCn-14qdURD+JD8dV)3|L4sRDzN zcoBVy62OE8%%2^X90+}26#1vHaX5?}*+jg_nk?u=x~)0F7)y+gIE;ou*h=b;CmS-kl*-Y+apyCY}m|uLQ%)WFDOye zv9cXkPl*4JMv)!1k|mlhlLupAi*1>69KKw^?xx5NU`r?dw5bjN^e}4yYM~vnIA;O`yXAs#Jp-&w40~_QB2zW_jmeouj?Ev>fAgk?HpRG z=?q@c#FcSMqzKZMV>pF->}SPp-(jB#U$da}OUf#ICeS@Yud%-La83?&-Vg;xt1gEAsf)dmaJhLapuRUXG?ygXV^8`Aive6=|sGXHV_6jNBGrjp3A zDKr?g0`G1vrZS>qyEFoy;h{~dSd{FFK7UWRsS*WSQ`t)9>{nhZhvhb&1ylsd zApzDc-aOL^G!KCjqS~MyWH!k*X&ur+Y14)`XDFI5d?M8hmdgJEa1$uOL8lY)7k_^t zBd43KxKYs5kCSG5i{tkQ8~uom=o1UU!@PZAE_^7u@?S{XU(C@xb#ISrydx~#7TLa+ zf(hFn;|D3-J`Q%pF1)d5GIK%Zt);7{(iCr<`XpzkUtLUR@SN8`Gq0R9hn*s$nlg!< zBA1gYRXO?E2YC^P3~qUhu3?x~E=oxHp1@@m10w4ZS>eY|r>vn%#a$a4m-Fh47%fDQ z+i$+!@#EW%qSv^8sfC)$f*$to&+jsj{hs{3z&n4l`Ml%33OBNpBGU`Cp228RaWV$x zd^7A9vGTU4F#QyEPShL9lz2~8E5Z$2mzk-Vf$=x!C6<@nk;OcXUmBMr%`d+kc@t$s z;E0}Ft{)gSo@yeY9VQ0OhOb9izz;-!Ie&1nU9+>XpqwrJSaV$>gj+iqg(- z7UPb`b^FO^+r#}${V&cg9Q55}IU4(=?^>yXj4g&v08ow-Kc55MUEp_#hj7)oe)-VC ztO>Dj;j$t#H?4$9FdqV$WrcVJ8Cu`FFSfUr&N5V=5X z;YHhqQzL>VU|v}KOhe#vv7Nc?X0ykyatm9TI)4jxBZ`=`x!&Nz8VPh8EfO{*$%VlH zQe3o&BB~cCJleZbx+-GiEc~TR?7Q$3&*C*xR8oKaX1am$K0TOi!0eWPIu0d(*|#lRWJNKG3{GX1b4904 zQb1J!-9EVRVB5rCSpyxobiNy}MxDFcME9pB=>&fkObyr|XP)knf`-0_D+jz8;-BYO zA)1&2NEWpI&)d8n0-YP5tVl8%D_UEZtqXx|4$$La3T!eahrl{XPP~nE&&-SAb_G%s zTCIMNBUt5DLiSiBuP`93vo|04wUfPGl&WOC`HCYrPR~Cb=@bYa|Fp)U zDz+P}Y*Z=YH{X>8;-h+J*UIj6$)7AoL3Zj~#t!-urb`>902B zP3=A(!;<66sUtAnYmt5UYC4$a$#!(Dt41S0Zk?TwF247CzVhF;;oN*%O_%d}{n$T= z^;17(J|xq=LA?E6Cy^od9VI2kq;z4)b+dL#|{J?=F|ZstXf6}$P1M58KPEH zL0S-G;e7Yv;HOx)Y%fR95ar{Hf`u97760Yjwn zExuPB8b24-Q3)?H$P%<@U_ z9)8KFO3I963o}sDVC0us%SbqrKH<$s^V+{&Z~mP31Qs`YdO`8;U)AoeBxZMm`D6+N z`)eC<2ANp0>VEEXo%2&l&Zi$y$Cs8KopMQ_K1zJaMK=oU^D0vgwzk5+gNvk}DpwB` zr+Xp=(*6L>N1p(*qiS1GcPA}C3W*H&+i$UUafw%bRh*o6v#C>LH+UbsKVdMyqWiO_3~jpkGUKOs z{Y~CPw*;)sW3&Bdtx4Y4RsvLlY(NlB>WGp?e{W@tNxctc2&pA){w9Za$Pn!g#j8Xx zKBYx@RfU=o8V$`-K=@meTpxVvmKk)67=a4M+4adSRu6rqA$`8PV3tClWX?9#fc=#) zBA<5R4K&G#5Zg(^Ygy1&<85uZ++uP}*A8u((k+os2hp2iNr~S`ZrFb)?^)PU;EEg> z{8e^qA6~z-%GN%aupc&{kt-?AvXjD5I>SHG<3jv-D>qG_91@ z{-jKsl$zmK>;;nVR1(1JB+{$1fBN%j^B%5Ro;U@DXT60)nmd(QCU4HDH6KTa8uIqG z_Ycp$+{Fjc&pXS?d{p&XrEKBxrJEl$9G1_~hDUUCo6*kiIvY;yA(|ByettKA_;}R! zkO!^mfvfBbC#b!zs_RD!wUm`egp%|-e80eY>p15dalYnPty_q=O{huoW{d#&L%Vj@ z5^9r2w8@$}9!Q87k3-q{*(%s{1Kv45sW4bW{Z0#hqvMo#3Wx*}19CbZm52rD3t%U> zqeKoaA@(uwK~pt|Rd;Jy0FB|!i;e^EzV$+wNiW^tdGCtCBGwB2xEh^GXGH`c2u;xa zv752HG3Rg>P;P0uPbs}KFNkn1Qbe{^dvPpA3L5d3X(aj$-3zP1sO!L)&s8UOIA{pi6R=5(j z`suYfedAgCK5YR>-DD=fHOZQ*_Y1LAVp;BRKA@40ZEbAuXs}eAk`jAP8N6rp=HF$2 z*q^?2r-2^P1q>73_m>Mv6eix%xY*dqDJe+$!14P$t7K+JCF{9Lo&Ny{KB+2LXB`GgQe3A?c}bc?ToO!)+_&9=Z{4` zt15r%%$Z$JG5=}*E;{mV2P_4^)BrxkgAGanbRm}&$VVl|-wn3F`3iwYqkLdUW^I36 z#u-U6>nSQK3d|u#z*^)507XU9+z)%2LO&v?a*Dzw@Z>7PWUJo2Mv~-=v$OB3) zM4ya3vjxT~s%=Om)-U7>ShfJEKO_S%#1L9#e2)4=&!ZtW%c4<=pO^Qobt)#SxJU`$FY8- z?f8!c^7psraDfcgx+^2xX*l;lPdnF8Q^axZ)9WYKv&nk77|pegmzhcPX{s@@3!g_) z#cLm4t~dWD;dW&3pWvO-RxTR|;{g_#o9o#wiPzuWgYF|UJQ}PcHjPAf;Ik!w70%7E zmiPm^4gdzXV`yUfZT8E!FSG75r(Dbobm zO5Xgq0TT5OI#jJj<0S3{PpNyBA-@gI7|?_7x)JPG}ke?DE^~EHTKlbsHxEX zVlUvMA6lcc$Nkn#^NF?4750dqq*ZQ|#=5!@@)^!aZ}>g^KAoP7Zij`X30CKgBZTy4 zaE>UXn};?`%zImnL$B+(TVGmSmZuiiEOAUm%R=m8Tc@k(!#nLsUTg!+#JB;GCTHQ= z(*5~*wM*OQQ+D%A^CmZg1<2gYYY~oZ6~$VKqt-X~pDY9H?*{ie?{XxYoqoK1@Y_3^ zT^?Ud0yfetKI>7CCGvFG7w}YN${B7;K3fw^hu~!LZ>b|Im5(4AMVv3K^WND!bc;vJ-fyze*n9eOOmsqqobH5?@)RV)}22~urmA2$d>y;v5KR#532mKG5Ll0658ai#lLd1^sfced}NhxB{1O;G`l8;4&N+nm+@ZZH6+4 zNa+H8-_QE*JC_dT*kZTB-_XKX!fXPgCJrdHpuL)K4w*SP>EmOxF=`!ZF6==qf{8Cj1L^88br& zIycKUej!_ETzsv(c5f9vW(qosezo67BJWM#)b5{bO?R8+mFpC$+Ro`lC(A8+idNhP zD`H8mya4EW*-D?*v#o%135ud`^!T^7anu?39sMxrffJwGKeKbq_(wvj!aADFbS3;a zbYXiNdi!&(Gu^?qM;o30`7XYpN>14fkB@F9 ziff5(PEr!7u%L$D-KiZcGAJ$_NO=AtxmjT7S<6n&@DgJpqs{ zB>zlqzOf`Z)$(ZSVmb9dV3R(=?9diZ$M$1yT{YOS2{D-nvTr+#+Dbv$NW=?Hx8Q9B z$*6&eMm|1QGkPYAzkj!aM3`C6M}Qtg@_{4Sf2k?Mo4^3!^>=P!auUISYV;AHa)81! zYIa$DPsS&4oDf&6SpmY4Q#kZmYrwfW@w)|Y#;spoooor9<$-M*lrZujQgStuYl-Ho zo|20y_A`iPme}d9YmUrs*AQoP!>30ghcF%rQUVVs%!4CpTbv+REco_h zP!ic%AX}gtLJO!yjN;_C^S{gJCAeyl|VM-;Vaag5eo_b zoTh@(c^78sA$1A@53)*jh}7=gM4yQ_tsw-;n=a>**Yp!9PAUP(#y^0GfzS}MoBzET zgC-6`Vp+CMm$m%zw=YKadLDp??)me@=)bH*$E?F?hIBVhtFiu_Ez>`g-2Kzne-x#S zxIGPyF!$TgAmkD2T6*hvU1*TuFpgr&mYu|Q%OQ(iB-xQSI5L>4-^`s9F&u_f%8nbE zsL-OD3F;U9jrCK*!r0s*;=dPDH05|N5CuDa_a31lbupCJP8qhBh)(!gk0;68bTA?b zkV>H6W&-DLv0{>23+3IX(9VAFa;XwI%$L@l|M&35of6lwd{dbY1xKYo86mkxRf#M= zN;ahA#+V(%pRkK-a38;1GgkJv@{@oNo|<}Xkh(4e${v7qo*rgc@ET}nBq)HF%?|`5 zfgdM*x1by-_)A9|gF(l7Bsl$p093+i;%C~=vxpFV=FcFfmV0!gqGw3Ke$b+*xPI60mN$Ck`#gg2)hqMn$THaak9 zc0B7PyeIe_yhc{M8CQTkPJbp-Nx^t!@03~Expvt&Nb&9s-K8*4|8ju+y(z3J3S7pW=~VeZ2tM;OQi0{6CK+L&oqO>a)?$c zAS1J!T5ZpEXTVvZ{JDz`W}eFH>I&S}aqUqu8T1XOuxo;kZYVlLP#w4)h5oKNw~L?) zoJZp|+iFd`i;c4gbVGV0DDIXaK8p?y3HN<^xmc(F$N+g{j_!XV>?!536wiOWx$VJt zn!G%}(noX2;T`&3`8%O7<%cSVO_%HGDi{~)-D^a{bQPT#qc7zPk0gm-cvM=;6H*0Y zGCIf=Z&L$zI4I${`~RfO@++UanmhXc%&v5ooc?5~H8vG@@ZafNXGhzOUVGS=TJwpb zbP?nA@OH+Om8 z`?>Q0_Y5o(wFATn+Utd8xwwCA4;P|M4!gh3 zM9%kn>qy4=QE9p`XV=vz&+(FagH~{)ly+LVaMT%FqpOM!^$FLub>T*3bTPubyaH}0 zIWj@s8ux+VJhT*mznfVI9F>luu>^4gKCxR&Xf=t^lTf$fmb@;#2($E3MH5CiGeKk` z-b=qmo`Gjev9$|BDI6dN@-eXy+AV}7S=q;=h~6ccc_=3R&bW?;j@`oCjTN01r7|QY z*qZSt!BL4Q{n^k($YOK5x4q4P;oqlm8eP z#Ki|dZ*AxB`h^3CW-md>!=lQ9MP#sFWM|4IlNF7V83 zrs#oi5ajW)`6dm++08U8FeTya^c2`0l$mATVhFH@k&63zsHot4EOP?!1;CJ5&QagT z_Vg*0pi_1-FL4Yo+PVNOdt=a*Rl(Eq3$-lGFU%(e{GsH9!Ny%NZu$ikjPG%uf^)15 z{&gj3gqcBVF3LDbw5JlA&@eOi(q=V9L=T(Kpe$yKmS&;f4wo~c?$=)|?)JwJTHuQ9 zMv0ACEoILhxfr+!N`sT5SIB8buordEhXp9k8WBqTx55DZkMRvu5c$DqMOw!&?G9G^ zwS{8;AVe3!lk}pRS7J@(Yo>%`jhkgc@k zT+vtejaf%A|M_Q*ZzB(7-@3RQI_`cta+vIF?+-ctrj@+FSUBeM-^>y^Q`SyqsOk8T zeS<8eF;Gw{4jD)U3E$VkkWCp@F%d1%dNvaigsK+1`g#2vhAecAg zUWrIL^#0pkS6IZW+wHWu`Am}r8x7zM`Z8-QYB$Y#Z@l+)I3Y&6SLcz?1kv=lyq1_D zpY^L-TYdYY@IiGtY{3iJwmJj`F#z97Tr9W)B^Gc=$JxT}#{NhBKuUk*PK21AnE`Ud z9q?4XOyl}kUM}>nVG17I2S9ckv0}bFgL*3+a5XTNfl~_MMoF4+p+zV_jX;uh2IZyK$wuxtbjY`}?bwoCID5~{L3#Jf;hZn;YNXk9{d8h|P;QL+ zG-J*+8@Pgj=apK>rP~@AtT?b+12dCs?sLai!1%keVhZxP_gWuG$EvCxrB*x^zg2ViCNI?y4SO4c4Rt+{QxO`ez;@fdbnrkTKpBop(kx<%(5b%#G z{Q{yh@VXsXlYe2BNd4BtF=2{OqJH9uSF+7a#mLP@y8_k3tiTJUhfjH7tT95Tf@4sB zDpI1)wN8c`A;Lr_s1ZXytXojASaRl1!@*CBs8hj zdWLAmND}&h^eRxQz(2l_t)GQwRA*5xB&6fz9-7FY*_lwayJF#9tBo-ZLsFm!85b6Cr!+xm094{UJUaAr{E)n0M0?k+iH=@A18Wg}9-;z1Z=@Ui_s=a+U7N z#>HyymCzaXd#Xt95&KcsPrEt`UU*N?T>fJF-)bh8B6lz)z*VVLmj<_Rx>LArxm&cw zJ!cZC(#Cn8uzSkY?$VlOT&@_Dvk#~=z5dPtMBB3;z}NeoDUA|{akru;3?$Sr!`Tv= zSfu(^q=^*^?4baJDw+{}=%7SNq{+#>|8I%M70C^0<1!M)AC1@=}<{K#}fPA}< zKDJe+lJ!FG6%cW!=jS=XfCaYZgUFD;xV!A7u`b@=We=0@g3BCv3d2VeUIIZH z_=Vem#Rd3ppZ)$;HstDwv8&vy`C;)e!q>#hM_-SLAu}y39#(T0p)I8#gZW^k*{iJ& z1lC|Sm(L+(lwwGnPxjFykkM(e98jnu{899gn?EU4R}xf_kJi$h-(S}$mgx2tXG=jc z*LEs}rLvA^rZ*GtT{eW@Um?l0#P5neF@iR$V#%3G5WJm<$6`a0mqWKeCLcA{#@WIF zeDZX7<=;XEyP^Pj`hqhKx*8hz%DTGyY5ei=TnmkZkdN_?;}ShhGs>nEXLx*UDdlbNQ#bW5oF}-H>+8?k` zPKo}YN$2cjX~Vk6=~09W>{t;tQ&}emZs?8>6qJT`I-4~WS@#%PBy~!0sJntjNt&km zlzNntCYsFj?E3ZuBQ5O^hq-m0;NQNa%CQI2uWMy^V%J+8|23U+`9t?+%_ovB2mQ0X zBvL!WB5A_*%=ZnmACQuhz41|tVdnc{>m?*IYzGfxydbh0+gZ=$CMqq9k2+v9a zt_v$(G9Zl${{Ruh9(gF-N#Kr7t|7&RJu11gwYAmN8?>jn2yyhq@=CQ1Aq5U@R7tA_k10P15d5h9PEgUWIQTn*I&Y6Fq+s+Cs}H-M#mq<#VOo6Z29;aK z{+cxYz+N?W^6RkA+tr)$bqfa#n}(C?EKWWV$M?_$R=V}o}$`#n9#HufM6 zlJ{5G%Uh%+NK`vzMl+G~gO|oRkM?{*!56oLuT_fCssrAbYlxMpCnP z%%Mg#fMJR8*nL>+kphy`@l|`tqMNa*Qyw66<+ejrmeAI2*m93$n)I%`sQHiX^HHYXl`w@#CxL6BW0R@r*y$2fim9R6Awbggj}-J z`}xVPI|gC#)EUu38|#^Fu*(8jZb)}X1}}xg0?*ZdNyB9+SX$-3Cb0UQM+z0gT^(`H zUHY+L&6VQ9l{|Sa5QHT~kL}Ww0O~YZfyfTpq;hz>SShv1;(IboxF^QmM$Di9`fC5_ z$&)WWqRFSGlEVMu4@F02shTm)>9tIU^nwUog<`$LK4G=PD~FUwt?`4+3adHa?CzYo zZ~eU8JPLTY|94jFxJ$S9PVaCIYUs;0Xc!y z(1AO-rRC{%%~mIP^enS}$Vca&99qL6aL#+&U$nOmnfd`4&iO*^W1utDxaJVp`hkRN z1p?$?Fwf_m+Tov*Uu-X%IZMq-{bVv#kj%)Jlsvp+sS9O9DP}Y4RcXE|UN1GAT_bw| zxp&?b@bZqrI)$n!EUcI!Lr5`-Zs(4pO)`XTd+~LD(^o>KWjFuf<^C(ruUxzK-wnz9 zu76Y+9KW=&i$?a&WW3lfp{Ck+YG}CVlaBSSzgtKndVya!V_1ES()IGqhCr!0fjh*E zs&gN!N#|3)Ldx4qVKg$L$f{ffGuK;8cc?MD0MZxBfe|cjYM?!oh40l2Ojn$`Y1pQJD&c@nHsY`xG<&4s(cDZVKL06W+E8gt>RWCTI9d|J z!HrnxRdbg2vpxs-2Osu2@H79hd|MF4VwG7BXe&tTn(6!-k(|=98?{XS3Q!0EXF4cb zQY{TqQxq6M{;I8WqUHe}V&LdCa$^B}&gVj0a zaWSN~o0~W}Qk1~;s%2;3eZ5|-*&;i*o(0PXB#Ni{pG-j&%o9?9ajS>(Egf=)aXm*| z8KLCc9y_Xi33?p1iY)uhinA)slTWa{OA0(g%5( zdbN_isF3$Q=OO!g6)SSte?7HJ!hL0>XC#k0o?9%=**G#Tknrq`2WOmbL;0&G&T6aw z?UR%OB_oU-nT$e81iu(4QAoPsmsdt}^~)_MqoR*tDE&lwAf}Kb659J3_s1!}{)7&O zmUw+vXJ;T7WCe~elHP~3i!%xrQsdAk5bD0u2{67V$rD9|QFeQG7jw0B{A)!sIgXq6 zMPd8XM-9lf06B*S!_t7*a>#5+gYC*caQ)i{5ZL4b(x4nd2(&K8UMYW$B%Sjx`fm=W zc8++%U8=@6pTC&D#Qsl-oGl8@rK~Axa4^Sbl{G~YFCqP>X78rcwHGry*Sq)&+;mei zUq=_zt zKawm7L3{aw_z-E)@Boa}6$cSz9g;8K@)?lS`F8eT(>QAi z{fVV!Be_OCC)`#~U(H?LECU3w8f;B}y8?+~NY;1N){6-=OjuNqHM{e}6@Ih6klw@z zF??!+v-3NxwhlY59lbO2ql*J__;jmT|256*|#u7EC@(wb`^%AI);6^`1MJ&Oo z7X&2G0N5)ytlOaEQdhjR-|RRlJReTJb!vgI+xx^=aKx=`NySslUrY#PZohy*#5!-3 zYWtG7_P?*Qkpz6=_?M}*OD-ut68jDx# zS1%31)8i;qq1+k*`uz}g!d@2)>@=eYvMJCn;L)~b7;w{{s6v(gdFGIP4O+DIr0@Pfp_{gbK1k-wPVE%6 zjsqt5$6z~u%-zCgc!9FmOW)uHJ8p@0oCnFN#%*t&8d>J=QGw|?Wo>Mrd-n{4#ShnQ zfBuC)@BHBoq<=!|yX!NSY!_&-EWI?P5+RVlet)rlIt&JAN$geEZD2pHB#9iPzB6ZH5Og<4;4|9es}!yv1AiPpgjwq*!0`@miHJ+t|nV zkmMGBbSunNLa)7flAAPobW|DmF`B(`a|calum&4eej~5m2NJ@RAt<4W$nNOYytLj( zGM>Ts%i)!nY_txTY!IqciO3#xN+tP0cK;d_)65rIT00;fx37goZ`tpl=H_5|>UZYN znWKIOd74QCnAUgp1;ThqN~1(4{%((U-SCAmxrUB#5YdMq*vVt>vcN#%A9kg?0 zx@aG#P=T+mW2V)k5NbER+Y9oWPOiij!#>+im4YcQAe|($)Ry!Kn!y*l6x+-rZ+|c> z3HXueQGd00)xttUK@2nKExh!r;Jv74buRi}triB84`P1&1;7R82~_SVjBKrlAm?rm zB?iW68*0jL=w2x)N)p26Mi=xsE;V)DA6cXJKd6fkTn9&H7=rm_y=9 zyXmO!f|OjLxq{v(kOJFWWp&$-7l$6bUj(qFQKVS8WBh)8+gxcFZUygU@t=u#~FO z_$6f`@}5xJwvb+2A7LfCcusf!fjoN%w?EBOw7N0L2hfHAXy+BEqWuT*!(On{^?`h5 zk!i~W;3l6y28FVrfu5ec^EnvzMf1!&EZGfYjRStVc{A?O@ z;6d*kMDJ*`&w!+Q@GO8;nJ*pCJVK2v3K|S>j@EDYb|vK)5@pRkp!or!Cy&AGGH(z< z$P>ahd|3ZNIksxnR!Kl9oN(#B6hq#HL@taObM-%?Ti&;k$8#L3g%*gN;=Qux{x-7h z%v{O=N~w^B?-b*1SV&S?{V8j7?}`WtON?>oa(e}(!m4Ffd%GrjWFX^eQXe2crfdrk zf)#eb=fr|%wh9HWw3*55a6?99^4iJDax}+>(6@*ssG&%{(l5=De#WbgyV9WKFEOq$ z&~Z~SI!SCfE&sfk7d3hK=j_$cWKDpfY}ZR75mO}*O`6kuWHwyVxr1WE;Q=~jJCRqo zJFPK>)Gu|{j`uzvz$SN2K}O;uqvvB$+|Lkf=s*YpH_T&)M7a7ku|V zYAUr>7^1s^uJd!?X+Jw-O8O2+D2MsRAFhqoyyXr!Fto+sN;@qF<;|_4w4A6wTW!DD= zly7=QHV%u;{0>|qo=e*59PGh4$)>l?piB)dd7f0$T1Z@9P>~l&dS8-2r5kLhkusfo z_(Pxn!^IAuIQ}_|$iO79slk!QvczjugrL)Fm!vx&x)Y>Lox(;EGnO$)ltxLba>|CUlEg4DO(d_HwqdyrqZuwL1n zIT}?H*(u^HumSJ)j88_G$j zKJdI5*y4tok0_FDX0&W!b@lr{mxf$|U<_&tYOup|j*{a4XrjQRXVy^l3r%cnY={CF zNg~_JuQK2YR%l1CJOW%w_v(mv;Qv^Fk`b$Vk71S;i~3(cco2k5MPxQw${#RhJ45c(Jfp5n=NpQw3lDUpRX zg%-{aE^l$>ylhrRMGwG}zm@HdySNm^0Q<^g^C!07JX=vel?cqvjz;M(h{3Aao6NyX z#)K*C;gs6`Zp`^%<%#?B6+k|QD6qfgqaCVqK(?>Z`;nvw3hwjSAs&$^sC2aqw{7p- zHo)omouEij|mP4&`|JMBOE{%wxZ(5A}tiBfS#a3h+S?aUb|5VcSFiKe(@6{66q1R{6jI{CZ zz%Ni4Sw)xT##Q)vh|HxJ&1ovj5ZMh;#i>vi*%tVSe*YrM$y|eyTLN-9C5F#h-Nn(- zqN_u+{MCSkiTuO)mlx-SvX^}p1Hs$Iz9}yy3i-!HJ>-Pa0~Pj|AQ)s2miOFu{U7R8 zeN2A*=$iZ8{@HJs*k_fgdEfqWqolkdbcd>-a(&^>CM6*rAu?=Mtzn|cNNYwRv?aT6 zD0jQ%I5(4dHB%dCIe)%WmRD1&Oh{O;H04P8OBu`qk?RyGSHse-77?szhQg^Ab)X@jf$P)#VS;(T7K+uw%QL(c8C!@XtaO<%0L zE@Y~ggU15N>q{9jAjQA)Ju|9W*&2w7<$B5$n=0*iW8<}`kDe8n>~hrys?O6axAPM z{l%>jIIj{iasE%+h@=SwnXLW7ERpLk4{3^A4B3JaZ!1qDRckR-W>wzHo)uKyr^Bl; z|GK!$(mGM}Nz6u(>9EYif*R&B{KFeENsiu=iIlIYVhorF6k6KQsm3yz&SG!7=V$cx z1-NW-k^DMChKK}f?DWvLr=(_tkx}$Qp+K=6PzDVNsyd! zg=FZ>h3)H@P}t&*h9HZsbxDzvInACFC2X;s6tCMr)=8P>#=Ah|@U-oId&u<}u5Dbp z=-&T0?|X1#@^>LT=$>;lNK(`P_knPwN?Jj8JX`Unnk-D?dkC#YYVW|<3qKO4I}^(7 z?Y756+oMY|>ul*+P8hxtD(61~d@;2o#P=}VUDv4E|H5GrW-ykpJ(O<0-^_H%rk$g7 zIZ8RY$xV9iGGsM+6UVl|oTS6c^*B7MC(r6pX5)I>dHZbsNgrR9Z}*rHA{I$1f^5(1 z6j)Z%2_x~J2rzMc=8ZJDSTDeCEzz+P4D|myXP?O)S4EsEsEw_YsELk$_>zWDLW4*1 z6Qh?3o8gP#G8(w zA+3@8=`rok2iPIO2ooN*=-Sx6UnvUdJ+2B5s?r6JyRX zGgwK|&_Iyuan#l8q_0UM%$8BSE;SW9rbY~W^r7zlA&K;a{5z6=wHsWbp(MOwzT+Gl zrK6s59l@TjY=mssZfbMk37>i` zKe0E=!~~Z|V7^<%ktPPvz}WAUGi1Gdi&5y zy*>cZoM&a<8~+J!W@OqZOq&p*3!L69EFd?zXT835xq&u(`Eqv@7sScIkp;rk+|aQ; zinu7Qs878i#4AA;>4mS!VrXEv#`cx4I?FviPtfCyB(-}GAiM`=%0~%xior={3i~9h zAQ1F_TrY_$o@mj-peXwZ7CDScrIiJ1^5`A#uD=7$*Po`4WbaxSm;>B>XB5Ba4*6xU z)a$Sb7;U#gR#NCl;!4@5O{B`%ez>zpg!ub~{o#;>aH}7mVPOth#uMu_lk-djn!}dZ z!&PH_QJ>Ec>|^WP#U&7mt40+uR7xU-;pvJ;Oa>TcTA$=Xq!L#RbYNDyy1n8?99U6y z{j)_(Y)WMjx0w0ndr!A*!>kD)=BdIbb3@KSe9r<6zjNPP@5Sca;fcNfkad((yIP31 zz5j~eXtt_Y*0wdJ>ixEH0sB*CD1-f>vz|H6ThZKjaQ1HlvC)q65`WTPYv+GDR19+M zy^l-*j}V~=NL6kDV^TjB6(MgDONdhH@#iP&GI;YB;%B^sla0U;%!}b+XX=zT-m*`E zgATqq-%N1)NEY6G7p-EFWz1WXOe5Sc@jJRy%CxXB(TaOnE`^TZNEjC-jF?fKsW!9( zQ>_QGJoL6^Eb?3oL&sN%E?b2fsvc8(iSiR;wpt^$Ye%|)GW_FGWVO;haxF1B#O^4V zhnsF(mk@;t(jFK3Za|ygDYklPwfNOVT!ZNoGS;H}<25_!B$@?Da~UrMg`9l<9lWy) zh$*?bx6HBo?0aW&lk1NU`m^m7ew*a}oBs(-N2moV--NJ2Dja=NJpP0!M}Ed7`jCN1 zWBisT5Z7_h+akIi)Xm^VZ2h*cr4sjTphw;KxB){w=tlpZ;DXETERN8?^}>bkLT$HN+Q))N@CACo$PBG-*FTKf%;g`UcH z<^xI?xshks3x-~@)kG;cb%yXi^k*7UG%laH-d4?zXTPOW${J!Z60ASU`tzc!_O;;3_@?6)$r3Wp=E3B#SR7BZfMi3< zr$bPHzEs*~(*UJJLO&=vcfCaFp!z7#b0f#zsqP-6kA!mDBH105hQy-~#qvs@8%ia7 zuUs1vY_Y6fA%s-0BC`Kw&k|1w!*Ccl^kSq#YhQc3{(jdbx+59%X*IUZ%j06h`3Bj| z$AA5VRDhD%^7pjcDH=)mpL^&}7)#%K-M81DFc(fO4ewr8`%yijCSX8-IB9~cU9V&^ zYwjJ*CPMA^iUorDR{%?p*5f_}CUN-!NUZwRmmwmqCB0}9nzuvgbayw>-6bWR-+A7(zQ3^7IXmzBy55#zssD8?Ndu)iPnDI|;s=ON z2E$PoJnS^NZhk&zp;`G7ukaESeL20L+#zhXbr<&zP#8U5uPvW-t>GEmN@lQNul4+K zc4d~KE1DKZf?(&R+nPFtq7!sRR^Po8U;HpO8(A9#av1W=3s;S5(-{)X%RA-%NRqru z5b(Vx~dp2+^WP*n!SOP|aa{M;`tKFmK$ zA2#af!I{eU7BnR>%R_fn+?Hk*lmUQj-29>IPEk6!d zf_^pMS`lh)%|)nI%n-shPL0l92{A-`IPG}#>8@(pBZ^i{xUHE?ENRG6NYOU@rU_i| z2uJ?+;A+r#4(PJ~9vyZ6#(K)887&LE?Jt|G*0gd))7Fg*5;4rfFE0?eWpq!4MSEZ1O^GL40Nved;qh1gZiV&sk>Q^Jk*wS2Ffj}NygEg zgDL3`Zu) zK}2v+b?M6)P&TfZaR#&tqTPIawsOVd+{)g9etY%99|UhkZ8K{bK{*vzW$)ZAIi<+Q95JsEj+1t7y$Tl2^atC4Rl44M{?=TysbZfPGh%> zG9kEP;PeQjv&6NdYon`_ecF~2$~Lb3GzQQuoew6-Bjq<4x9z1kTbI#ug5&)W<288b zJrX5uP0N_3HW;E%Y=$?4m(MkXn^)qBE*-MdxgN0Nw>XhFACOno=`u%T{_G!Xfk9%K ztw#!eonbYkUHU(AkWz3cps#X)+&vDwIF+eljX9cM$BtU8a^V_}!p0%UtchXrE>~Rb z3z$@%ZPOwT37xUl4Qy~C6&NwyJbr5-quE@u?Ky-BeHVki8{0n|NXV1vLVXXSz!{jh zy_$Rh;67}}OM|*)SV3uU3Ms*X01Rfa!nL2NqHgp_TeJV=>O6~c?EcucGY#!-4qrtT zS?24ul>r_H?n>Sh9dCCD<3RCvtmo2srxQi|#6%kBam@&meDMsBa=7{zOp}$@+Cow2 zOg!K~Ode>Vdu3BSY1Yf}u%5J))+=0jvex!kzihkQ?#<6&rzq<$UQz4mmjg8(P;OK4lbP(wFO$`c$f|M0Qk3#kXA?$1SuqD5+Xi>;ZfXUNJg!e{stK{QzpS0j6W+NusTtZ@q* zVF4(JPSI2$Q|FoQh7>E)&=A0nmz0DVmE~p+;_V8OC){6rh9FS~nWOPPeV_-vt^hfj z_@=|6bRbuc$$ehE+4vdf^ESrk1v(g(A8P_md-4{GG$}uY*tV6N%Z|MyiV>l2K=}4? zk>2sO5&TyVg(|oCZqr*LjG%EpAu|4%5Ps_Lyk)k;dS+{o|^M zYVlf}OplkG*xIur6&WtZu{dMuRW{fP{faLezdsKlPYPLe)A-vDrOy=CG^^DYz;@mT z0mbLLtV9no*VsO}oTnM+y7m^<&UA0+gtMZ~KU`wIU=SV^9AemZMpGfy@#1i5miJ*E zblw-)gWuCibMk7sc1Q>*jZ{hUivtbX22EzrE=L1`?qgyLk_GxE*q@46OZEohr%ep@( zG*}ZiL==>2WZG_4-wJcK%n>A~ATkO{stRUh#6<01e@(gZSt5Hl^ke9(V#rEkZaoFy zceZI5VHT9Ji#tfxlz{fNbsZ%ja-FE3F(u?PoISG_%}G&X&%(Av_!T(GAYc?X;S6I`sd7M@XD9#8*c7m^{H$h+s7>LXXADh zL&3XQJCjpq2^=-9-eKt6P_Orf7{!pNIi?DjulV~J&9}RRmvL+lAOjjL^k4<#y8yfs zb6g1Wr7)d_Lg2xdgl<|U=J&jSmruLn;SWHKI_5Zk$9|6Jq{`4S5|>R&?Hq>a;YEkp zVi?>VDrNi@{c4jvb3q6zv8ZT;!|7hTsw_?1B2Z1GKExlHD765Kead`@7yR0+R&YDeq|#2vbkW%Eu)(MR$XKvvqT(M4AO7 zixg-a&xY&HFy5Y$@l2&IwxSI1S6jV3qJ6L?^$8-Yf=|In86-lzPw+Q{NQ3+6-)Ds< zN0q{pG*L=NCnhHY38)qzv+SrQI?f9gd46rcVF*K!X>I{@+>fVd@3k;czhS+gkhhz;Kl-C=WsE4`y!_Kgo@f=ymveg*MaD#8 zuBo?E*l{XyVwEIk(ns|58E(i(Pk4AQr$>0)P*E)N9cpA=XX!Ld zDZ{p><*{VY73zPfh-eb((U^>YiT@G-wo)Ju4!oo|G2nXj`G}5#H%+(jW5uW)a%E`Z z-7kk|&w#N39%bHFb!lsT)S?DelgkOde59V1nP;Vn;ekWlKi?+xYKL!OJ1pHgJTq?G zn9$NzC{vT`Duf(~3I??QQP)uO_SI4BEYT?P8meAgJ?N%>F;qJt4Rj>N9R4RL4<^q` zCA9Ebr;b9D%NYofOJ$>29B$w!iR5V+uS&bUq^AoEbx+(j_e;sbM3OTWuW9%1Q4p^e z&+qBKvX?7V5mB4k&_snR29>8Lye~gFOK*0?;XZl=1g zr17sO@8<};-qQY{8-}*(EMw2g#TJI6&+715z0 z9##|g#6;yaa-zb+MkXrJ;HWF{I*lAoUV4mjeM`m@{4C8{hA?x~L!7;Gi5atR7!AtJ zop`U5Z-M3U=GQX|pYpZyw{M0nixzR^{6DJ@&t!LM)1e|K`6}Y9O7~Ox2xT zzu8tn7uG#Cbx5Sb8sk~=3nG&tVtPULZ5thZ`#`6;)a|IMe(W(`{wrbEkjT9tPJ&pk zmc;~VL6~T)r$P~GFe`qlX@K)PU5sw3Z5jN0`!I|$(nxyb5$N7NJJ5URWnvYu*BD-f zoDsnb82>5E=^eXm9i*}^d52BU(vX08IMTHXFEZ-eNfTC^+$EctWUKn zQGO8#_yUda)$Uv*LM5!0b4SwqGUWsJ$af8}H~?QSK-9M>L1^+VP?61eonBvm1t8Ho zn;~T5yN-=tiG*0mt_#;*2pPh7jw2y)GLuMmMWQS9h{d%fHCMll^%rjDwUfBDOJq(j zk@FgUz@?IprY%sV79rfLu{}GA9)YpA31iqRv#+RP6Ba;B}h+G(c3h+(*GXO9?fPu;x zxI6)x0q-+>I}H3S;!j=_x`%b0iT0dwO){88^XN}Vy1uqdu@+6MZvUuFdj6L#cRZ4q zR~}R4cip?5f%Xy*7Y927}W z=m6)^R3!m3mV}4~b-g?Tses*79D$XRP;`2uMW&1;*3=_hyv@c}t+TB9fk%Rj?Xdca z5*mMRYV-Mhja4XR-rzX~_>H)1Quc6xW`LtW#Q;QGF;iK`*@ao#^ENYC*8u^O zZs_IRyftE&uo06CW4g@clxYs!r@8G>n9)MWsLm-+m(VtHw*b=8Xc{pnV#tZT?o2@E zI{Wo$pP!G9rHPv5 zH!kd*k-+L7_GSxooL}a6!-tQj?#Q+n1L#=jMEbI_&avY15x#{p=l|f{ny`UN3b4Zf zCI^&u$rjlDe+%h9U4R+&pYID;NOJ^&^ozI6zNQ$M{%FmlIWnz9!=0*sVq z-BL#ckUhX&`HMbt^L7y?`i;QZ_t!MR};DrtodOxDEq?@HCrrJ{zMNo{tGl~yqHjF+Iyq{bunh=VDo8-{;ZEP zJSEKl&i|OY%aNGQV|(1lhxij;(9j!Ph0Yxr1osS)Mzs7?YfMVh!EbMDrY*_{*(mJ8 zN5i{zRYQ=P_=P!*nQu_Bhv!a z|3(@G=Ud)iDe85KL3*mn_t|Y`bl2GXi{uxyVnh&y=44E)4A@4k$Qe{9=qJBwF5yDE zy7zG(>%1fkm1Gv<&5*IU%9e7c*3^yV1oLaO*D=3+hHIrf@Zwm{|U=3n{m)WioJF z_N2y-uw6Gtd=Eq^fJ0$9k!7f_AK`C6p!Sn$T;JNx?iJ9(J3d@lE6@*+edyEIi^&sA zpsL5EIdCKx*p`90hzlfi?Z4exvyIGuX(o(#*;_(FIqtG@L~8U`JH@4a+tw?U+%C%D@zKj4pP?uvBt)a1H?5A1ok>V4476A`Ng9L-xwwsy}i@SCwxz9L{EBFRH5J#}|YNss;Zm#E4qe3#tc(6S{A`kNZ3 zCLWMcA3we&I6!475%w>Aaxp>?@j7*_9dIuK0e?W7j|47x z=mpZ`nt^Eg%ZY-IA=dq`TZqcdi(3_Jv-@b}tKHp=SH``~7Cj8(6Ok*52Ly90^p{@e zbpjiG8r(*Qr6>(3uhsXPNiRJ`(NHg!-T}p1Dgu*g-PQs+&iul>M!Kc?mWJcey9rmb zPuO^4zrangBa9UHQPlp!;tbu?BqpCe)RT6-#4iHkPo*pY_x?!2Aan%-=zpJwvO6F! zB?UY(fdA`#W+bywIL!kiYv`)liCh*_$o;vOI7#r>&be~PMP2^Eh?34+;|6nOX-5$! zgHqo#(xH)*ti~3xg)js8_rjzwbt=26J|FeyneO*YAqL|1W0+;Is{SIX6PLiP>W``;M&%xS}8cyE=7i;E6zMz{ z&2}ms&Y+ni)+&TaAB#@p!!Swl3_{l-%RjzS-v~?PFHVFq_}HhHms@~%Hh}BVZ}87( z_-`=87lE$=-RC?2n^q}D;0J$ISB+lv_u*$&GBG(DTEOMjhj2G+;&lposM%$w8Go%U zD{B4fQ_Ar{4SEgB>=H@-NKC$}oSKoPiSzgmE%wfk29Nh$?BF7?1o)Dpd#j(DKB%RM zY8+ejbiy)D5*~F>fg54vE(SvqZJ+pGiw!!*!d(+w?c1tZx!>#kJ$u0Tl*Dll-Z6EA+mpIrCfevh$K{=RU#Xr9N?9BOPEwtfz2q<_! zlS}W_KO_6UvEU{oCT<1ZRI|Uo+ym4pVI6<;hM|h-uTn}T?vn91ge>D4zTN-4-RAKk z54U73oP54tk1jLIEwhPzLg^5l0}HW7rAw7)?C9k~SNs@q<)DUEgF*iOa(?5g1~rzh z`X-IO3EM#t|H5-93VK`nhl#_^9}sle#+;FnO-rzpKM(PY);ZA?L&Qr$JTPhY2^Rygx~()eQTge+FBwsO|e=t8f#8p;2#3JzT;)DO4&W z4nkq8roy$#ro=H^CuKrI?-PzzTT@QDVE))??xFNgO#5mV!<5M`obD`He6X%s+fn(J zeAsFIE()`|ac3YArsNggXc__)5t$--LJ*ON(UM_a#I_n*aU!0RjieZoZA8>F04Lz+ zR!f!e$M@1lFS+e`Bg%7yX)UUO#*^D5*y_#s&D$yE%f!QHN{*Soc)7^WSC4N7kQ|)$ z^f{?$zS)%&`VtR`YozBH`e^9OX+bBq85D3pO0eGX{S{Z+K-Fm6?ib#UKmstYzJ$&_ zbo#*y-*uq_X4~j~N3TuC_hpj3E!1JFs>a~o?*IUPIL?;-%(#!2Ill{<1a(Q0>j$H& zCT?8i_t@3}@z?~p5){+2aHo`Phia;EDZ#Sf!wWY5ha6bUDMgnj&E7yy9E#zmohS;K zSQFetoUZrPi)~FfI48SUuO6Hq$at~5Gx{6haQLJy z3Ii6F5Pu9MH;li|a#DZ0LepR)3nUaXM<`}z!WeF3b5ci%sYNH0EokymZvFsEU_%fU z^WRs4{ltCZ3ASS%JBK&MoFg`bG{_u*2nuqQq2()`#EVq4B5nuUDyC9uTWxF#_+xf^ z4p>H**S>L83A_9m!N{?05{pE-*q*7{y^aPP@!NIO=?TmVVT$@uA-~=R@WfPdTv{XN zC@6%(Jk@)GYr>24dV>oOed`IaU#__KCag*bhBqFSO~+6O2obKn&{O_22yO79a#L>k7zR8V*#P1Q26H`YS z;F_OFa*MA6_kgsggQU|nD#z8UJFdv$)lq$Hng*eBf+;pyX182C9?46+0OSWDCRG!~ zp#OPS0-xTv7~X{zgmSwH@SJoP;lySsf(dEu3BesMn`Hrw3Lt;@-Bs2-T0O%+iFo2H z!(vXIRg}DwV@3rmhkrGs?v0fCB<9y7i&T{S08JAzqe?u)Ar;zNm5G+7P~LO7DF+s# zOO*4kt`Y01`v6z|Ck0|#uE9DfaxiX~fJ0OwQ^%1|sQ!7sy*Mag9m`U{8JicwNZ}S)z0%u*?X+S!?pXqwKP!0dh z;x4n$Z3H!8+D;yWKW!x!4m)BPKFh)?R^ctW^G5dV=7Nm-aWD0&z4-IDT3iq_*gjYV zWNr%!ijU8s#=$_ABj18@Tw(vhqBq_%j2@!)H-<8haRs(idK?^OOV599zbHg6 z0%PzuW56cmSX7<5-tDaX(hMYYC^e08ze{QzskeVL?$xGtpe=;aOR zm=%c>b4y=ltK6IF_#aLG;riDm@o~CM27Hi?w!qDc8_;ZNTQNCg0MP32(w9Awc zKj}V;X<{iBhvsH(<^kEzH&@q*O#X&kzZaf5*nZ-F2S8B(N#A}R#0-?Y->`o<4~wWS z9V!r}ec20VYjOfU?xkzu zBz>!9j@^P(?e^$6_O(@Ch$9CQ!u9oiL+K-xrU>vI7J`b+Xf}chS)YYN-x~@rZ(4!X$#>G zUXIRhCD0yK_E3kH{pgi~ZcY_#Er2cf=aCMee@AXEUXgicL$LeTG)DW2Jvj z9{mtUqbf+(!DfFuv)1pXFc6ly1BNiQTAk3FTJaf! zCF>WJco$@`4wT*phWV>-RN-v~epWQ| zjyC`^U^swe*BRi7HZuT(m*8_ct6`*$qV#$S&8TeCwv$gaJ z3KnR#xk?>tJf&=Tyf~hq44J0?Q_)aW+GZ21hWx36ixbT1P8Kp&p7e%4(p>F#Q#fRW=x5+$Vu|o9i2i*-TU~FyN$vVQlyNn*V@8g-`E4vNY zDAmx@A~AY5VR*&bhSLI>n5Smp?ly2`{%SXRTjG~nVS&uj;vcud7Un593bO3p3kt`k ztgbqVxGUEreUBjo$KH#ps1vhfU1GRQ#fIT+tl_v^1e+;FzEd}^t&%iH6ZL|Vb(7)1 zMs~rI2PJ5cc@CU37)~XG&%P)<{fVAjgx`7USl-D^ouWWZBMgerzzS(UY+iKRHn3Q(iT zS9elZsmB{i_oly1C-nZJf+17(p3UH=4tUdxI@OsFyf>ZGTQ`YYo4hMi<|+=yOam=z zA_tSNee6YH6z|*Ok*4WQ<8Falz-f$;m5LgO&7~rx#FiG?kM$qB3bxDUP{b8Kuf>oi z*cX~JxZXf-GL_lTi4Xqp_GdKl!38f|H~Fshwq(?M2^A2-NO=2si@X+73QtzwgW=sc z-__fPrfdnS7Zr3lv>Q3+u*c5{Qg?qfttv#ne}4rYrl;1{vPO1KdJ%Z{sgeEsGx!|= z#4}JQG<9<$_(Og7EU#j0;!4(({m>HkWg4N(5e(g4O7XAd;&h;j)`GS+JN2f7x6| zKvU2hKH=lG8Cet_?|nDNC(wj#w*7JlH;*hj^%2iZaYdfm3ah~b^1gJS>b;~j5x`ts z0xE(V8!%+Yb{QNv1YT)#XJ==CcLl(&r}ehIQ5+N*K@Cp3Uq@rj*95npYU{H}yU@|$ z=)RPs-VV%bPJDrKd4Rf#COo_dHWK=*HQ7RI=*ei3otBa;0%dnrmV3_zxf0B!Fx5D& zP!RALw3G{WVknnODb%Xv>-i+SobppTU8PWCe?FQAICc8ww8BQ6nW%S`n6oC zoo~y;M~gU8LDw00lYC)~EUNL!-yjRO%x*HF$tjc~Z-Yo1S-=$j^Vn#lw#2*d829vY z7W>{7R-wRAnm~5dcn*2P;jIknexGiir5PH=t}Xk0H;#DD^m#xJ_w|xf5gf##VvQou z!r%V;uR0G2cer??&DAt(m!N*m5W!W40k1F0^Xh|aORPNb!@P(_Ie zyHF&%nVbzl7;jAc>uKWad11t0WD!+{=D($T`js|sX5(AVd-f;)kjdYNeK2C|ZEGA4 zO@^h-Ma!7In6Gf4|DopbdAghMxv2%Lj!xeYcnAL5+{Lr;@Z62EPn;|_po4@wSoi*< z3Cf>pAt~CFRMjuG{XsQJI8}W*CT*Pz%E-DYW3*gp=ff&Q{dMbTHgxBz;^RR)2*XR1MaAp&REXdj& z`X&E;ej{~Wmu>R5a>0|B?RLOHc4OKv)-8fp3vaWZSBDp&$>21MHfsSWA?w8nW--nBTfCDrBF{ifW;T;$ok-!L1WiaxBqoe|4JD3G?&w0}RX3zkm5>98+YS z`DakFv9SDd*zONNM9-t^me$TK8J>79$SzF&VOW4$ts>;^iSF}@tXN7dky`%sKGR|h z8RyB!jfxOHM-2oBlj0zTo9EoF!O5AwmDhizKSDW15~3rSPPR z^yWvzU&CNZxSRwxY=}Rl!Kh$EY|mZ6a-Y5Z-mmdmx11Ei@nhR4uMbc2L58Cg)FJu0 z0zy{`@rRtT+t0mn8eBfbK1axHY_5d;x1 zw#dgEY};uhZ&kLYVgXmg)FL-zz-j0@9Ia|MtT^5$BSBP%a*eeRsmS@;_Xc`wJJ>97VnC!}q)^Fl zKdJxeeYQF_z1Ov@z;6;>U5sB$xNNK`IwFuFSPrOIYqQ=xMGXmL{Q5A@o{G8}>Yvf_ z-}aZ4kdzd_I(!ANdo+ogs}ZbqQYY%jA_`&YTjC5Pa8yPKbdlg_vc85}m|C6oc-D>I zpTl9bg>|^T{;wFHTZ`kd=B)|t%_CY0Ds#-ol}d3Vv&`jypj77oKE9Xq%nD9-^D(&tsd{nXC}jejhyCxD!7)g}#LeMJj^5MN1v!uny;!W8PZ` z`Cj z$(x@tV2sChHm~Gb;9kln7M>!-oR~g8op5np*wJ2APz#%9b>g{l*HxD1TMqf=C8V3H zRwJ8?>$RR>m5c%=^LAT-lDa7Uk&NttkCKMyR*jb*Y79&S|-}4 z>nM~FAkygB{Esd5&-d5vg0K8nDZ?)q4u>!z-ni~20qAZ`yKuhj(`Z5D2=s6(6SE!f z2aA93H`=J0`*hsx^r*aBBlhclO+{+SscQDSC&~k|8fzmhRICemzh4N2@XVCwbwxwe zZm(jqN#IWJ+tvA*nE?Nc5v(8)QKNN7Ala5Jf-yKvZlvEEOK`tr-S~+CL@eNT z-f^U3YGri*6r%2L8amp1o*!akVh->q__1S*6PB0R+eUy6l zS6)^B?O>UT%U}!o_H2Rd+eHS&^5xC^kc;FA6Dof9Kch|G&-Y3JKPeg7ZJy5R4v0vt zuax+0p?Q{%=8v_PP%>T?EKvmOtb_$i`i!`<9AG6jI_&gnmf}f+--b9i;ee2Bhm45p zm&lJ5D47xap$@knk>6lnK&an#OSmCq1dAn$%bKm~QX69h;<|ih#~FpJezFLI2F>vP zyccW2NJ#v!Mc=*Sub<&;HxlawV#_(B(2t8WuhCy>ng4paaC3Qhxiwo*ise)|-uGsf zqETu!Fm8DIN}Sml^~X^q*gydH8rMF`Qdc~W9+Otk7A~BUBVl{MlSP0}h>fiVFtivy zWnUlt{rfzf-2NLFGH1Rv)4p&3C=sI?V;of=o&&2gYdWrMc?0a^RKnivnLS9f>`tN6 zfzTvO>4HSo#P0_lPQ(-tcI^2AgummhQc|P+QD6789-FofrAVpJ2JBkK-`^D({gF&e_s8nMm5W!~;}+#cNzY?RBh(Xs@nj;kmJS|8-icFAOJd-xI-#UxS)+DW z`Xx{aaLBTBR?tJJm83S0aV&3eZh7u`65Ky_=Sp%YQbBz^12Ym8U*3!U#<+5zqY~Up zyIaD;lO+a)`evvKia~Z<0>DfEp9K)ZXOGNra8=yGSfj@nHxJ| zGXIkGz0GsKd5qTMLAp-rxpz9cpPm@KI zcWWqjBgd*ryj>N&Sric1F>uk_^o!KBx=5bLVcBM-PM!=fA1zvDxBabOR*7*^XPT7T zG7yMa0C*k%FTN@d`t^s~BSpc?%LLPF%B9gTG@#1ukK9vv{96%t%ohjjdgqcnjla16 z^wz$~0*A~7lPoocyi^Tx-q<t$wV2kMiPz8i8CZ+6M| zKxcprn&XbTWqdT64%_xXD8+p**6gl_u!w_aFTYhbo0q~OLrQ!?9f8y&a%@UrPX=CU zg+6V4;J7^u7#x`WmPdz;jzWPey_xpuKB0XZ9r{S+r)q=>$|->f$s(2w-nTUBGH=W z`nEA{I7wGhk@fgEpFFGa)1k&1L4~q(C5*EZDUPCsPDDC3Jm=tDz2S)KkuOxW6V+hD z!rM_buK!~@QFpT&bo;l>)H^ByIk61%7OL#d+)F)cumZN%J8gyiZNH&dLUZ-Vy+fHx z|K~qOYhX~qQpJ#l`GWHAlkB6%`i(AS3iN-~2Pj*f0Gx(<)fpSv@$E2zwyer^%*gJ~I3Dd6q*TDDezsUEO&>HT+gO5T zc9A_&KsFOdeu!m`jqYs@3z!gynCS_f{e5e|X5EJxx$9>4iR*0G1)r)fv#>_R3YQ)S zp%237=aWRPO`7pLlD^s?G*V14n4--2!lON~AU9RpzY31^b)Q@^>B3Adl-3_?8$|0U z=oi_Gn*_oX_ZW+J;O8I?fA7y@tncDBRiKmb8R5Lu6wSsoR=MzR$=gjf|18sa_^VbT zd^8mbT1ihkHG5W*ze-c}E);#e5<2<>AM7vm$J@tp!Dtn+ge1%Nj<>F4OW%$;YsuV> z?15vPo9N#U+DgYff>)WGkIj#4pc~@Twr#(gj;GG)JPin%6OTz?DP7uBhC-|NZo;uP zvG-2j_@hzxyHA_m@~SvfC#JF&b(j=L)#`}F5HG*=wcyu<2==x%0B~m1jZla>2XMPnITiV#5c1})ChGEkJ)-9+u5FO;M)fRmj+3hZ+`WboGODk0U?Raj| zrE)MS-|E>0`r-XBzIaygAPL7I1b}IxloUhed{!zVLBj<@t ztVxW#De@OnSW#_j$tI3bl0StZsv?b<9t%~jO2Himdw#)?NnRdk!50#Km|=@FJ)F}+ zP3H~IT&BWxZpy|qS2ARUBrtm-pCeqS&DtAa|CFL5l!&k+!&n&0F3Wn6+06vPNG0-j z9*h&i!OmK^Vy;@It4{&hP!#+9B-mgUX>@i*d)apNdD$iVs@?fw_N=!Zz&(0@Vpn04 zq4Bmtd$i)&`1O2Lg=Se;;AQgPK&8==+h2f-nv(vJNE5d*(pO4R^5Sfb$Me{4Eh;Pa z%&x!m(`ZGIDSmIl$4o4RUie<;@(HUQe__H^}sR3+pprFz@dhq@~7zd(=< z`~nacg#hn{K>5#~Zs%QyL2am6b6MgWn^X8%li zTGetU2gaZssCR9Tg=tvwBXbtQjYv1;p!i#~PW$&YH5C`D^JDidcCTK}0zf&cWXn0+ zGEC!YpG@cCE@A*ZgJ3Xnmvq_rsd-ni!H`vu1Y!P5Pjh;}Qfb_>7N>Aq?Q!3;WqUQI zwz9ZB2}QGh*TXIgW~4r~Vj9S*z>hlqydUrBBQuxniW@*_o12|&9X1Q=@9+OF!1&as zMM+5sK%LLd&a(Nw9RVe5c{w?#Wg)DCs>zoD33RER1fcKD&8d<{3TF=K!i^fP0lYA6 z6frNGkWiF0w!>cm6vkQv5q(MjUp#)i4eo^0uwFwB(8*aJyYv*d-ZYEJ@ECq!`07k| znBNUAg4MfJye>b~Qm{y>XSBg<$}k)!(KZo%ny#v%DK>2#>{y*6Ign>0j(&n4UqwaL zinHxKrT17 z2yfh(l5zyhlaJoz`Lf9|)Hsxf=n#3BLNAul;rH$W;>4uFn`==mcY^5+Tx=K{X0In+ zmh8s(@p~p0ccR7jMoXTbkF&<(SK(C)Xta}!e&?8s&!(-nT1-73-`d%p!Py^;4x+Ru z8CIKzm+aN0t?67Np6NXeRedEOnMdSD{N8%HA?ftll2c0zeo2B0*@{|2jND&O$ZTsY znd9u3U}cW==12DSKRYqPXPfC}nOtgiI?N%|RxHIlJGvhIqOA)`p2gKR;O>RjX%8r9 zfvd#yfVUHUefNbwf9e3@+sn%f0CZdRdHf4F?4tByjEfBH6CvMw9lg8+l1JzZ)k-u} zRi}se0H zX0p+;==-Jr{_GJMO5{*r>WpTtXfK#HCMg%a8#9B6!;ui4@TLQDVPN&{I~Uw9>y+TI zVw`SC*#sP;Fq2;lG#Duh1Gp}? zo_{4d;o(bLA<oc;VT?CSj)&6oW-U)hH5rhde7^lKI<6Q0Ad@p^bJgp1gy_9A7@&1NQy z+t|7FzFD_Wl3tqt!6Hz%xROC}y~c5PiG+5(-TA0R|6&}W@iWnfQLb90vU3$IDq16# z-c_&_4r6&~PpOB1Jpu4Db(}UImzI?ohrDwXy&MYCl$BAH1O6Tj22CR)BLjmBxk955 zptm6&vb4MmfRU&8kj`|%mmERv--$DOk!*e(hl&5_DZc0xLPb?>b^G)@hL6jwtft!d zg|Q`vu16zf-kJW4!u7#%^?TfQ;T1MYN80&6b zOblly^&&;C9Tw>k1`6e*<@6wLI5b#R>zLXwBQX|qg*h)DuVJHHRTS1KXw%+6EWJVQ zr>-mtaOaV&o?jN`tv$TvX9=0U`9p#V)GroK*PV;RKKbA+-kcg%g1*~N~wQz zN)EIpcdd9bS2%EH{r8UawYkoCR$NP&|22JcyV3?zW%8Y?_&e;Lh^v*a>4kkM-Y9vS zA>e)q;1bh#oj$2zJ~Iv=@FMQ`mr>oVq7`c30BsP-zP>(ybbsia7BfGQtN@_dfPd`o zV(ou>q%%Fg5^Pnmj&+eIoVdvei;rE`ozvG1Az zvTp_k*6wS@n$B}mw86^)inIr!wDPUxscyqrX`kZA{@fIG0YzPN#mlO8ozHgeO_6Nj zS(}HH_cwYG3kel*9YMrqTuIfdae4hy@6EfVWTlrAPZk*j8iPwrw>=Mlndz$K@UpHg*<}B%>I*myLof#VsSY1eZ(R9buLATL}7a@PiyeCJyd-mA_$Mbu!u?yQ#^dmSdgy@SF8)y?#ni~nZ z=Ty|wvlVqx@FpEfd-G;V-i{wjIEkjr`AydbIP~1NE06F=U5jm>KHqkNnSK5Rf8^E9 z)^3pan7=<>dGGw&u79iF_7EtkwXqzAm?lo2S62C<6{KD0R9#!V7q~oaT}kVGtj2~T zn-w>H79VfLnL$7_PR!5I@~$}j7|73ul9k3+^uoN=_@}r77XPTpY*SU`kzl#OhR5yb zzUSoA2cB!HZvfpLuIWZ`4-EG>4$=#R53k7$R&oBP6`@2S2LOC8s+zYfh;*xxl9IGN zPKz9mr-16sU%Qg~-74_OL1=X3k|^%(LGsLdUhd^+%?Ss0#-oQ0p(rF2+s_69twktJ^F&K&_L&xL%&T)L(ZKr(=j|MCaDU7 z6#!ks1x2YjtX)s%Oji3)}2 z>h-dpZ+OVDWGZUoVP;Ctef~{?lW^tF9fjYOK-=-!;bdwfhxk#-$@p5j`b7DMBg}eC zC(;2y2w}^r;-C?UsZberv8kP%oukQ&_O>=fjbJXuzJakI?Kll5tH8r7zhG{cSG)Y{ zJ-Cf}88M67WQ4P7^T@wBR$&togMn1OD?$vF1Qii+uPHhjJE5F&>W5c(iE=(Tzgg|{X+jS}i8i#PL57S%sAV#o*zgy05}M*eGq1A6N60qU|N z2Knw2Cisr`J+1W3P^oU{JnFlN-*6QWUv|gR=k+x1%HM9kj%LOokWD}^J*O<6MeH!!5TKsQWTDGlz==f*VkSCKm)2=) zIFzF=p$%3obRp(tX7Ez zFLtz@<8Xnv?VtrW18W)LARJPpqC*Q6W8WGyX3OVV%Ahc0Ks!K2PEk!4)5y6Vd@`gT z%lmxy7+OLQDr3fEUF3jcE8%B5@tm{>)e*&1@}x<#^}5SW514Ao4iW;3bzQT&yIfcF zPG=FSp|pt6&k6f?;cpERMFrtF(-tj0tmc z4WNWOJVdChRI{UG$OQElN1m^M{xqYgZf zX`O(+P&0@bxTYmd><&opu1sOTI%F}0iJ_EVZ`{S^LiwKu! z9NBc}^CRQj<3)T-I)Z*|!j)#T*@dei3jtnn(U|hCM2?P83PQ3(l_``qv0}^hqGNmw zU(oISP4G22l3FeKD^F_wtV-Z;8#FDxjJ5OVg>9ze-B_9N+XIVJr>gI7JSDB9m#2*5 z1$FFyCf73pfBCHw`Eiiy@Faxw<;j>r{nhqgs2EB^z<~(sI@c@R=KEzbKrIqXcK}>d zS2iFPEFm?u#f37JWMu$CQAjJ0_F2!Pn909;@{_@WRnDD1Fc@m|IM)1Yrn?7eAS5|=PdH$5~LzZs1 z3e$p0O(xMWaHlXlmRTokCBLB=nh$$^@uA3bD)#NRwvM8hCQoBr%%#6-_P;VQGw48O zP*4X!Iphvgxf261DZ;S&$s_*IzbJ3*rY$!6vx6|f=02)cAccU*P#MwRel}xg=}g4l zNGgRN12VB77(T5K;laVWH<;AlDoF!I$`<>~ zOb${1QS}-+RJTg#H^^o=9vO+{puuQuURGsQR%Mo{NetGI`hXHs<-R+kkiGVAAtol# zG{jxZc(ClJhTLoPxrst~A(wEe2TM*PyCr98S*l!>`}SFxo{!b`Bh$AAlKKjz3D>Zf zdYW&Ds8W&S_%o%KY8k8|JUkO#M&5!{ZL~aW z7{t&Z1L+2@bW8@B3;wSF8n)ow*Pxw+UUuGVZc8C|EE9JpEO%Mxpq4_?Ix8}8aya@_ z(o@WgkZ*>$nq7{y{YEMR6x%GYSmcS2R1jJNsQR)KH+v9&`h{3KjS~z)s0uL1oJ%12 zDLvPzcL?di_i629_i^7gXwB4=RqyF-^%~8#FpF{E^ublseuU(H;=BmkOPy)q*X>MNI}4)`#62T^1&y$#r%zxts&!~vno zC6N60a$2GXG`-Hw&i+Tu2WZb+*_c(uk^l(Ee4>0wP3NQ5OYuM8UxDv%QgSkIAr#G< zzYNil&1c~JU0+_-P*zq}S8oD1YA0T#+=>cIeSIO?Md0@u8eD++CYpfDq<%F$Jss#G z1wT1IC&0x8*#X{Q5CA_gGBPrE-lKy&1jT4M0MV7ty9emET5QFUs2E62TJY|kZMZGs z!CpI^Mn2(mcXP#qkcU6ddM)XvIz1LzvWKsrdSxUw47o8j1XLTmN^8QXIsuw2n6NO- zyBjOmiYrq&8~a?++iR=cfp?#X_O0e=8^!}mSHvi|CA#DTao zV(6m1)bB~HUP)gw=8+l~ z?@TyTu#2Q4=Y8*P2z;A%WkAp&;>+JUk0(7RPz>1ur_)>YdrLAuW#-TtKH5>V=d?6x z{}c_mnYFy;UThXb1gRqa0Z0F9O4z1@v9`cNa zeX9ELwCs(Gi@Va{euu=hah?7FR}Bc{rlzK3sqW@;KAeEFd~$NKAr$8zmDIeFw7=I;;Y(HtP~S4CU< z8&KGgmzUSp#+&xTO5=Z8fR_<5s>ClffHl}5P0;rPVChCiMpjmEy@T#o_LKkp$9FK1Gq+8H6xaz5Kj9donfTEi(hY=RzE7%L`o?pN=knYuXWgfPe^=zhWE|c1EiI8N+c~dJCQP)d`JoU zTCi`qbmesxoa)GfRHe?CZU1VWIy2YQHyLrR8>{~>;t#S6VR>X&a*rYyfMH$Azfy*^!713 zGxG+0$X3yqA7f~Ew48-m#TUI}DYI`lII95B9OumjL! zJ%t0Q5Lw)SGZN_h@z*(P)Uk#7RMu^iOkh->5-#N?8N3ZiGB<66$F7{Hp@!lk5zI;= zoJk^pd%%mK!k$C_Q=rvk6;1yg_}lq+9+kGAc!D-&E@gsbL7wwXh&}jup;mMy;Xsf2 zFD;SG9tt%4A74G)y#+QNkMI)1zz4MPZQLtENv$B;a>N@iQ~G6*Xl7s_XnR%%QUAgq zzMDZ)qbDO1uD1S3ZAh@`49mAKZ@2w7KD@-=?6{xe-A`U1bF84#roZ-eeW>LA8Y;dYjf)_WlF#9_a`~Q^%Q1+#NeyOgR@X6C z;*GbrnEpTF;0^`yEz%!VcWe)3iR(01RpuJ`rWzuX?>g31;i-iwC_ zC0@5phx8^(BJ-_bKd?Zq?d-fBA)oJ~ov*yFIE}JT{RC@-p|)c3Kmr2BSj1La>CF~S zEYV+Lk89A@OjyWQDr#C_eWiGQs#|X9#8Pn0tFLziaN|fE=3>Wf4a}+sU}6Al?&fZQ z*bV6JIsEh`S!WojNY!{)%N!Pg3R0FP_Pvq7c4*b6OP>30rilBXWON@%nKW^1&8%bu zx<@|EX}$oZJiv%~czDlj`z2#CCOZ0tno)9Wd>mLXbbtdyKwxWY%Lj-WO^$F{S7oqt z_FP*14nfznd#hkAkSUgDi;HqG&^upF!*OnCE2EM0RckwRoL1`)eh2nou= zQdH?Id3B0Ro?0S&z^+Ieuh(q{915x%oHSS*91+ePRZJ3*3l@oT_|bG1ca!eu3|yl3 z-pf#(`X-q>GL~K#*6zj)QujUz4{i*W?3IveL_&4XFA5enCT-jIj~sR(8ASGItEOPj z0%ZC=?BQqazfF5}RnyOHw&sgY&t?tm6`fzdPIXY@io=FNI+sgn)2qvD(GAhJxmX8r zqr=0g@HvDBLx@o0WBeMRur=2nx7Muz-}|@YOdhs>mtz?QTiYDD9ht|O`^vlfagTgBt_2l+Q>{V}z9 zoJ4g3&{})Ht+#e(W4`<7z}qVmq3t?m=8}f?tDS!|vm~FZ)#W@vY_~=*pG-U(B=i7X zwh)ZB{@DXAFo%-C<`Tr zdQ2rRi%1DiIqNeBkpTe#cHG)PJ#V!5;wUso)#8MYW)ZtQ3KW-;f{h#+*h}hs8WbuI zLPdlokB8NfU2U;9WXBI)jxI7K+kyDqLB~4N2xr^}a_bwkSIX zaW5gLrC5kvXEyaa?DO0v3V0HiSOT{WO-!GZ5)Ly3(@}v=D{9Nq(0(BK=%2wZ$?1~Van7mi9`_|iJ9qN|B{m3-O>5lHN5O~HHy+qTzdDqaV$&w zwi{hf(&{;T=qT=vC@Q;7(KRtcNEeXKmYX5D+=(j-8bNrOqMam4xU{_--bN(GFVZu*V(E z&CNhQ9e~E>@|Fqh-95u2AOOAQlA~KnkczB%ZD&Ry;{I*h;P`sS zc2lP!Qig{6z!hasiyLCR|0Z>dnxcr?V_bo1rlYer3J=*PqUnelN|3g$=CWf3mdQ~-Q&8M_mAwCS z>n28+??dcbJd+kICjQz+&yzJI%?9L9ZsBpm|z@g6D$Kwmc6HqB+ zYiny)?w14)uulU2kMU;{A+J+uK>;~-Wb5YT{rx?w;m|}TPknCgj?twCzm62Fy%mF+ z6d()u1;k$hc&>-AkcgP5M5vp*j|dPt6gy}D^jV&so(3su!h}i#_3gI+!U57`A%4cY z1(gILN9NGno|rclo~Vzc?7Go65liS%a5u4-?i%%9P$d}2q&rbyJP@_rCj7CfQ~E7A z{jz-s-SC~jwE#l@l&-F=EC6*=EN)Z=iB1ho1;r93OP#M&3r)NKhgWKVnR-_LedAJ< z^fD2aK%7YDlVW)VYB-;UaIV(*$(r0!HKqNU)WVE5QeHe(=}*S4Kw5M3LLKzDML!pv zehaWt2VtIacp+C+9kc~(|2FKLK6E73#86Q*-vra?E(~8!n=?!6B+n0QmiRy0$_dsUiOb(N zl1+8K*>1GO#%?(5-pk-bDcpL1iT9_m>iXnApEe8nc;4lSCNswWPWyYe(O}faaW^cB zmzEL#*YHIL&4Rv6tO~i4HwYrrUo?f(B7+8lBpZ#})9CS~f0B`ZS0m=vp3!M(bIc{_ z&S)dFB6?4us+CnV5%55ZiVi90;fBd+PG)^!kO^s+n3itl!AbF>FV~xGfo%eClKee6 zQRJCoi2{-vfOB9!g1-7UyZIdTR^ct&k&5<)jjPLlpQd>bZpcj!1PT!9FJ0q{p$-QU zs9oF1%qVUJ`mKRxQc%k;Vu9ybtC)Q%BQ9O17@d47f$9N?VGt%m77@)FqYlQL;>I%5+U`sv+lH$}%&D4W`4nqE=;z@}pkk~mn`P=!KcWhYvyyI%K z*6_YF>=~OzMZ#xsLV28ZYLB6lcD;5F7A4ysxY^rab2b@# ze!M$7I|FvI*MaU>K<+_6KyWJK2<(rb|72}|3Z%HOkh`p;V9xetlhL@GCzmxL^5>g@uJSlZLhRMWIw8 zY)LyGKQRg#kWawN%L_Ei0b$|i=jR2pG~zh=AKZSUJ(8!!pt>R;}6!ARtMd44bEW^lj!Zo zasNh#I_Xq_nDvb=c2Uh3>C(kOWpXh*9d97|$rWBbgOP-$m6t2e7}hCULaQfdA2t4^ zfEFVjtaQWbNB3i(ApgJHwt$YPTFQRQv!8tJuOKJqe|Qr+gfOv7KL7H%Yqm5~@b5$W z;uX2^!-ssH)|Z)nbFuP~Kim$^FWCxqRCM4AnJNhSbxiDF9m{63Ta-pNVRH3?O*LKA zd@LE-TCeI6AxrQmCZ#^UXB_Kw>RU-CNGzc?T#^cK8@;5G=plnT-)CV`uKX~k(4x~o zG3+ja*Jn1t($xI%wKI#CpJWwwK==R3i04v4X+L|PVNNfuD&fRlqLaxXcLS#T*J$&H;oS->f z^M8Tg)~O^9RO__k8ZxDx12YMLP=V|Qe<)IOR{bQGVr`)8Iv3K0U^(nV$}}51dk5Vz zbF*n`!4Bc#_TWn95nw^-wVNwRpfkxfS|DS_Ev3hdB#7tr=;Px5h%^-1Fs7x-jTK>f zoQ2UFSUUy6>#BH509<1}tIW-Ny?bZ-|FQ z`{40c!SYSTc|RNZdxsWW5Z6css==)p=0>Hdyer1uC7vVH(^WMYku|6wGTZ8+HPD@+ z!LGmOYC$5O4H=lYy83bx{%mgjdx|3vCT_Uc$av-bhmA1i;J9$pev`*i_o>$0V6wRG z&i3W1dFgLDf8#-sM7P6iA8kl4NOh^{+gqyZB<_(Medl@kvlvv`sE@6@`0a6ZX8U>Y z)t1kwRr9U^3pZ-a@8R<`+t*W>`m2}C(DoP!vf2sNPn?wO*2nniE&JX32BYq`A37Wg zW5bWmN_hDCxq`ovK(b!QYO!Ez#n3(aA~qN;`r4f4X1Wn5Js6>=(O`ruhxKHH2x+DK z&tgE&Fn7fJ?`&ug5Ef80-)xW!joQ4Pm6nDF3mJllC(_)ep{mL)RRRUF16}|?JwH!1 zIWh4z<=S=kANO=W^Iw|f&o(F8BD$$(fV#J|uz=paEt!^rRVuN$*YgS=G%z+c&Qk=& zkb;^TX6(plV*a+$QdrQj*I)z|@QV5i@3(2aY;IK~-SzwhYOn!Wc zO-~9{C7q*9Ql!|95M|E;lm&HQcFGKTeaNRxaJvov2@}&DyPI6C-)W z<^uI^fu6p%vfSvMMmP5)UZ)XdhLODOFPs;ZrM4Ea-wmg$Rvdaer0S_--})LOnbNsx z^IAJwNcp(P@rtEzXhq`9tPNksEnPleY%R~z+d)P}&?eCYkI5BB4C%^$i>?CFQN`9Xhz=tmKx7(8@f)a`HsD31G}03lMlP3L7bRn-}iQ2-eO z9ybP+EO2NI12-2q2od|CEdrTKjc;&&5~b|_MtInbP*?>=)01QB?OG_zry+kOm1f;L zsS?AkDV+aaYFWXyAcndE4@Jf;OBR7UegKrPrWZfYMLeLq-9ER4G~M@v! zpW{ikIr3Rz=jzSVry2Adr+wdPhn}DBs0H8Ne@2EL`DG*yVHZ(QFLHqi$r-*ff4*JT zbU9z(L9L1bKhJ5Pl3~FC*#%CQ%1xh>Y5FFsEk_2-aH#h!+JX>W&&$H|>8zyW1jwmg zx!-lr=y$0V!oBeEw-GA&5Wid!GV2)YL zUr%Pax!;KYEvkfcYHXoK418$&N8axH5V3bT(~K1+JuPh^eU+8z{X;=`6$y~+VxNZv zy_D3{5?P5mx27oykxalCOiIbd=D5*fUskr~ISvB%7cw_5r6Ze3FmH*Z1Q0Q#7CMoGGcN_YYuJ0$P_%&lbx5 z3o#}|T>;|qhDm&_(u;vN==I&Fd;7wr24LNQ=^97dPT1DAX8QOi;EqvKOI|+bKr8^z z`n5;h=3nM+HMHAG=xe0jA;ZpXM->98;B_W?-;d{R*!Lt{C9fUft;1-+V zirF0JT`BVS>o_uD_d&;xQGbfmU!YQMUDuAb zFQdnu$4!yqn8@)zGPyWi-(D2x`(`zzXMB6#$_7Op!KQfloGQDTnK2Qc+B`+2beos= zZLCgt4JBhTIYC>C7+UogJL6YZUas>W#Z5NNTulHK_t99A!C+wbkq>**7oC0GQO* zv+?kxMT8d?0tSXfAOYXuP})O_^Wq%1#Xt#(iQz)aUjfG>w4Z^;H{vOG3iSW}{NKL^ zX~Gj3J)2CgwLM>)WTRl>VVA{RjX=XW%e@Dq~@=j2tadkt+O;Xn_-;CxT#8!z2 z{T##1%i>vC+!+Z`byzOop)h0(Sg5Mq=;>*j)MIG0lvN@9R0ucARg(=aTCg~$ER281 z)y5msf4i?Pj*R{Wi?^gXW}%YAAulzPytl)>4klC)G9%j%sHAWb!R%a(=0r(cf>VKT z!r?z)?b*q0FDVvDtK60CK`ES8Ny_cf@t9^zzpc|*RaeZ4&5^3h;(7CCKHYr_#xFjV zW0Vv_2>k_-FqvaAnlTHMKdY%`?Z}PJCg=Fx1kvqjW2|Di>?+_oy0nRflgV#Cx)EL^ z<{srA!pZY#c6HO;+4;~p`HG^!=@1hyTF*pV!+OocC;vMpH7V=r~ZTH z1j}zlTbde5zP8mY208fduiw>+d9dd;lO>9wJ67?qpyr;Dma>z#qDnjpMxf?;2!Ljd zjg0~MuhMt=d;eY?9UOo~mz%J5hNE4>Qoa(GyepZ922}IUs_5L2xLjrEFmovp z3`dtiKC>L^TrBLHcysE8eQjjZG}1kUOn-AvW{ACUSR|!E|9WY~!60;-R#N5$X zR@6z49)3x~=Tcbrt9PQ-b=&U48E1;8fRujp99siJpRmft>*xW=)~m&HJATcMJp~(> z2p@w8rgH==wUxwYhI@WF@Teh!GDib?lyrqAGO22u#2|Jd$Hbg2l0)G|bd(RK?fmM` zi;;a#0t1P>?FqKxa(bJr;a@R%tHnYMVti=66KHFDb|@CX{SMI1OMM*10AQHY8HmqAS9Y z#c7yK4EWUnG>Jtc+!o;KgyAc8=);vx^VH#t$e^_1g(OnfZwBz2F%_NZmQ=;5XfEj@ z>}a0NQ&Ib{yMDU7l8|*HJ7g*4aIiT7=JyR!lmtzeY;s+O)4Lj58`q2NOnPOiBmU zFp3~i=4h4-12a4mwWCn;dv-U37nTVItWTsxx^cgHjagms*p_biT_LQG5YmczAdKrvLy8`E92(MRZ+i3rkB+ zpnRCic1u=+OIbxFmEp%%qmj7zj0;(dn~|GQw&v<%A67z}PHzF%kRoB^-7^g|B`{wN>s)q*&7djSycN32ffQl|KJ}T7Uy@ z?=OL@zUchgaO^5mXvh+XEV09+!%6x(t|;EtNA7xv!3CTA@3z$+CmZhbm#r5Gu1i*Y zUX`5qY#LSTjUNT?2qrNl+{CfRyCfS*>bgH%TF`~K(PbWAZ91(!xNN$OCc?mnK=Y8O zY?HB%#P6e5dOFPo9nH)W{s7Pl5%9anDy^zwWM(E|Gl^Z4FX@K$a4<+e0v1!>&)4nwi%(!O z>{-+R@R(lk>7IXD37P20kjD1ZbYg1IHqAdvl#qm%ghwL!|0W0BDx)PagFJF@4bNnx zy}Z8Mvi+LT;5>*|3Y%M$kh@CA4{Srf>bsd@YIwlaRTxU!R~AR2hQNT)5tl#%$ugB! z_|tVe6rJbKn<2|0P~DM;2AJZ~FbmI%&=Sr-t5H!=*RXMFl7Nc!Vtg2c3GI4B- zRGJb-UWD6NIFtql#K}=>_noYkI>+ZC?RdNG-}thg_i8I-LdVlt`f!fN!wf4bam@FMv-F&|*LF7Q*xT0*P>;Kh z{85Sq$xAS-vo4z*oFO*u$CS4M-BE6rUy|ZB z{PbEiB|AI&7)VBWSk}8bKPRVPWV{F=u+eODD*HfKff%J#l0sxk+LR(}DFU@3HHDUd7Xq?}1_BIb;@Ih`^WO(HO;Rb0$d=OqsQ z9Q7oJ|L_10_Aje8viOlGf?jQm6J2oesy#bG$CIg{zNqK>`j5+c6+wUXcCp?>7FRcJ zeSTd}W7%oiyIZT#h0lm#^A-MeL9)0p26XItBM>&@JCyXpR_ z#=GT8(U={7{b|-8N29X)G{RB4!I?+lk$Tf}SUIhpR^jgV=sKUrl8@?RfrK7iMX7<% z%vA=r#gnUm=j^j-^gnlPmPJaL_$p%y(>0eFxH<-w3j&oEN!K+d?T)eEkAp!giWE)= zFekOD4*QYA=8?jkA?Gin!Jle+E~Nx~Yb-plCIn*N>uB3Xg%x#lG?>u8@nNMAH+--4 zcsToM+qr1pB2VKl1g!AKPdEF!b}hg>-qNx%%6<6%z$CE2y=^#7Tdy}U;zxsDdvpTk zyXI}5*Zb4?2Pe)juiFfJI#?{QwwW|&YK6ogQwCHVX@5ALVspT{3^cWWVZ_6j7Lxwj zvxhxE8`4>U-B;%9gf*hL7*T}<0`GUMKb9{RazT?diJi8J^dQSaa(x>5vh*hbIlG+`AtD zi&4)VhO!6ZC?=L>b&jc`q$Kutl81!{%nawA-|_~D{1 z&Q5pvORL#@dA!E=kKuAJU_f0x*3Ch*FS)JsM$Zc4Mj0<-BY9{W{#T>(TCqShCzScwU}oIjdSWw4q4^X}l_hxUF$he@xrS8F#dKj3QXIA)V- z;ERgCj1q#rO>p}<>53nQ1nsW7E4mr_K@27m!;7_U!( zB`Pf)-B-kZb~)$I9do5V9^lKm4kV%h01zONGod2~XvP#Kofn`v$_VJWh?(FB1BN)O zy;9J}=G^jfGazdM;c_67hxCYTe|{Skqer&l-NPJY1%))b<`=*SZJC;Q*3V(}W@9nv zD6p;N#~L6N-Wj{pZeab45y|dT@}IbMXknA+{bIY=Kn5T-b~m|NG+p>pzY-kl(+Zg; zn`(nnIZ>bC>jKlvzH~9hbe&LP<-`T)!aGfjvEo6YR|`#w#TMu?CPE|`jmxB$Dntl5 zbq#*v=CM*}#5h+HSgEKdAkD z5k<3BPkPfdb^UC!e*HX-t=YPt-0rHgpobC1L2A8=aQwIq6-tZJNsPs!w zsM7#9tRN&M0_ArOJQsu?pg7$-C~Rr@Z4)Z!^VTx&GA2WT{-fDuljP$XrmgSNp%p0q zw43Jt=e3KVH!?BdR0oqhp9~4Ilgn&UsLPH*JRpV-9uOTE!v5t}eX(!E_;Q?y$$M4K z%!@v~obrLY^jAz_iywlUG5?+`WRG83jBU)p-S6CRr5vrjMReO7zCRc325EsL<_aQddV;d-ag z?R7B$N6ydGtPSNYX4ZG3BYj{&l*W5lIVCA)`WQAu?UYki`hv(m>WrPMV9Qzue zU4+CEIpQ=fnAn`vy0ZhU`75;ju6?0 zRmw_4xG7zuZ9kH4OBsG{&kzUVNP!xKrCt>|B6+o1>?&`w$SB>E@V5x9ePobZcHycW zpV0v))ZZ~mCKR@t(ckxjm|%ZyizZoK;Gk_9H}<-z*Vypb45sbv(YS0g*fV`iMda%Um7q?H1brX8bGpy2Ytv<>vpBr> zO8s)W={-gZLlRUGbLJ=o=K<5YnU+3=FsT^*!EPTWMp# z0pqf2ReNrkC#?}`q>!+Ffs)tx6%tlZ8#-8FfkS9ijhVQy4)N7v2&O2`m zMioW|2>FeHG&zzGJ*-=?WF(Id|50wOt?t))B@}o9UM<7>r@$6cQGpOFLhX3BQ%3$G zO1{8P3AAUqV1qC*F@gFQWQXzpwpvBJU+E_7_;POB{oQInmM>J#$aLRGo<200st>(X zDfJsHoe^n;>Jo{NAs=GF^~)VnYNSNvaUL?on!P-Y#g|Y_g;M;f$)~l7{O*Q zmfo^(D-hUlC2xzu`yne=Ktexb}-RYuoG65KhS}aNr^h%O!T-?LKY` z+zkPbF++wfE$BKnvI~5(KsFU9H0M8Qb4Euk&nf3R29n#gI)6hW75~kxN^Fz3+k?tUQiC79k)K zx54uMPJvh|JV?=~&MeAi)lq2@b!uV9bO=U{sw?M=@UZ502~ecF9Gl=ZbUK5hnVo*c zVM?I3NA?>LNP;+PL-g&NxB(ndCe+;<69KHn1icM<4R!aDhP<*GlOKsby((DN2i)BJ zl-r|njoom6DC%j#-O=(qqq^1WCMN6fob%!!^Yi^sty$Z1x39hg>g{7(pnfMy?Pt^9 z6`aU41%ZF+rz3ssww(+n=_ILYZ*R5T$0o*@@?)#5S0hhKVuGDlO;HV)T!um*ZA_R$ ziE`hUmF;a{jjXC)XLon;7_-*M^aLIjHp=9U`!~dmu`yLqKPq!MwRA}?5Jp2*skS2b zvRxwwcTnU^Q7S6*)E7GUEWhsvP|I+2g*$QeV)8v)j%G)8JUKZ+U2Wie`Yy0s)&raln6oB?^sP91vOuiR1xP_k40t0ziR=ihNm&7B2v_ zQR$mhKzZGb#<4TcAsyV%N)Q|d06}Jk%-@nL{!^oHaHQojdab-Me_insGm@ghQkjG**)KLV@@K7qPTwKht}QY zIfQMFfkrwCQ3s9wD5q8bwBKv%+oZDhi}P1T1NE>^28PD+zn#>N>**{mZ9$RJlV7x! z5WnpaX&9Rp3qCI|yIk-utS-)z!29mMcCS8uurY7dFE(8PKo+z%clxzGa2qqzzMeh zOG!%{ct&R zCvoxQ65zSgedc_@hk%ek{v;<(r8)t0y%UJy;_UqJ_}@poK*#`9_w^fA>jqFY_` z?Ry&Ca7xY~SqxU25c2EUPL(MCQEbEzCnc#YI|D6vfBZ@GO_^O}v?CsJ^s+qaoBgB zvDUGy0#)Y`_VTZv|J2rZw$1ZR6!>AifTH5;VJ3mH^`R5t8%K|8-vt4cv?VvBzKc!u zW_QoZsL={qBBW)kY^4Kjv%k1WtW$Y=BX%_ymnSBQ&8rfW>TPFo(|Xo^xLb}E;7s)0 zfWzNqVFMKgt^SHTeT+a!#ck(_NQLD=x`@A~}PW;E3E8Q$3C7on)tRu(Rf*%0K zD(BnWflS&wqfw@|qCurZc!NzYnQJ~=Y{<1>BHMoF&PM2=>rlgVh=ETrOOFPHX4 z$2x;C<+4fosOdemEkw+>=Kev<*J|;?JI#MpgAR?Ccb1gQu=@RB>9n4f$I=TBjmQN( z*OqL6cckxWO97JVyI(N3ccqgYPveg>I1vMA7tU?>yv^4Wh98d6qUa#0{;N1L2m+>V zt4_M6>lTRLvo&pX&!7QOFBda@^|i}$iz`Q$zKW5AMjux7O*>8+AIJF=wjk1pl?NyY zI*Cy_+{4<*pDb|o>l%lq!-h%w|L9n~lZlL1C>9)qwbvYq;?l?xCRu5oxIDK6rD-X8>_8C$jC5h! z!uk5KkGGs>KZ3H!!x-TS`iG)SLw=H}FNB|-UZrw(k1(8$^EFmUr3ZeWA;KuWVsA%; za3N0db{?aZimC25!NU>np)31)DJ+n*Add%tpnda1*)^_b+%w?!2Hv58LC{IisNnCSli-170 zXNwn~K=V6YorPa>x`m$|YaARMoQ{Ar@!$|ta9B}vS582Tkhc8~Nh@`BMw6G9Hxhpv zgG|&B*e?dqqHOl8tgXuSc5Etb%i4?%ukbLW{V38psB*%ggM|vn6Z$lot+>VS-VK>C zXgJ}+3c-Ce^jip8c^O9I?8(bNHg$*QcQ|*r|4DD4s$08BID2ZWXyGP}t2Ov$J&*2?r`yb%>FuCG+@HceXGQ-QHwWI9g{!UR& z>+La#iGavRVHDl;1zpBj&Eow}YZr>z8ea6*e4Ku(Ia_C)_n|(#Km1lWvW;puqw>Gn z@yXOh2NQo{g?lR>&5YcXQSMaY+FWd>u8pL(q%;F*Y^^oE|OH4l-#VSmfd5&CAPs`}Qr^z+7Hl z7R1k9sEx6_Qk+V;cxu>X_iiF}-L+Th}La2vk+`pc@z>_W9{7H}$`WX#Ml0A0f z{vaH=q>`0shaAh|MG$VEMn4rh*-PDS)EKVdlfo+0Z~Tc=4g<%9wzrR7CeL+KfH*h)Vxci>lag%8o5Yd=jLt7fLs!}sDW2WRb6{`tM22Klq9#x zw;r*%HLCY64)wAL&ZzLP2m_J$1Q=|uUa^qyTUd>d(8=OsaFP=uPpQgWPOo8>r%85{ z!?`t`Zwq3ot#@xu@N;%Pa#&__wQL7b-Wu2|aQ6~%<`)!ZYHBSZf9h`7`O?$<+Rbq! zdASCNUp+5dy5tgd;cl1M*s9-?u{j)ewEG6$JatgrjVu@#ynPg1OU_4c9Yb(+b%>rO$lspE%jHO ziEa}kXBdsFeZ~oysqEht7Wn*cFlv8f=tvNfLQrt!Os_Nqaei1=5|$&ezV*{>-atCE zYNIqyb{77eM{c6|@BHj-@uyhA1MQ?BKfPg0;WnH7GRA(p- zj|IEheZxHU8{tJ?!xbe(3V#gQc5{Z8dVO|uWw@KMQS~fG z+#rk)ruewsfHdyY5rz#KnlFa@;iuJyhzXq8o|pq>@laVV8)ol|`S!4P1gXv_vx@M4 zU_+0QF}Z@5F6;KW%yHpZ(n?s(l1P{v3LI4)k#k7Bf%1|2Ntq;dAxZP2N)$4Qq4JQZg+w8A3ard7Qs6>*;2=S79# zP~~!MYVoc$YIV9ZbXah_|6W_V#PwTW>xZ%TNXd{#MIr~~;cF}379Bj?6yt_aKAZp` zbjPzVoG*Bdc9Iml%oBrbL8mV6tIdcqW5pa@#T7nnVlss-$rOsNx)DLJE=c#v=beqK zhu2sOhY3YL*OOmpZ2s3g?77-=Y9!)RVjBeY#gNR*Oi-Mw)zCu#DGKO=$}1}?ySrEI z-@bZ5{jV;68XpY$dz$z3@Gq|dr3i`lN8i@RvN3Ak&Ju4t10l#Exatc zt%B$qo_)5nDI|T|!hEy!cOrK1Ht6ae#KC?0MZR#^h-F?1SLJO1sU~Sbb;kYuAhY*MsXb^Jr2L&P1j17gKpsW-IZSt|1uZe z&GQMop2fQsp;QCi6qsxSgn*#MU^K8-f$uOkH@CfQ)w8C?AHH-_;g>A5*PzEvnh-g# zq0T(FwzdX(4j_m7^-J5((C=!08t~qMpzR;{UkIX-bjU^T`*OY7eA<9YJcrBe7=b9? zZ#6Zd&rDo3>4SWLgU3XfS-FR}wcG|;9dZf3iixptYtQ3XbK*3n_z@`7m3w}56^2@j z^PyA5L(ui=;{;w%;Q1ZV>hT#?(DkK&@WtR7WKQ5UAh+f&@-ilHQn>x2Sa4i!ceuRa zfkgHx$`P)7IFZRR<`PRzr)Pu>r)xOrz!GjguKg$ASYPK7J2Xxslwua#og{DSzbH&Zh+n!q&w;aJa} zQe9C|5i%u&QhCz!$hMtcP479aS{+m+DWCumSA?X=_7McxOD%XwpA~L1rNW6@B7LBO zNfxq{)C_#>(b0s5WyCsl!I#ypiHnczSrHPVWF4G_9V3n?i-nzDTJ7DhILVsCN|8(3 z(Wt@s!8ndx@*uXta21nn@DsV)PF%_0xr7zPw2p)eUi(t-M|x+vXlG-ul~DpVQ@`_T zx~RmamL}PL97vy;D`3^_fyiEv1{fO`mzI_Wq)2OL-W@Ap$1m~R16;zCNo)1c92m%+ zFloZg^|gk%8xWy^32mKGTVqX4O+|Z4Mf-=npMI->9=|?M)46n>SH*F>agmqcP|1gR zZ<>L(3)zuRh2IHnnZeyaU#B`-{x@tn>G)))tER?D9J#x_O#dx^oREo1((dkZ53|3($n)-QwV91BF&`R0eSTb` zdb%EJWo0|EQ6=++F7w7k?J+$B#3Lddk{VL_-R}_T)YR2EU`7lmh@Pory}G}s%}U~+ z%*2(4jnbC-{N+t!x1N_ihu$wp+NtvWq1!gPv;=h=%J80oIH!7ghEaMJJKf;-d*x`l zsC8*VRmnMY1XEvow&7kVd1?yY-{z|b-KNcNi;2i^%+L_Nf_C@!s`+re@$}zA=I7_Z zqav+MJG2}5572o{O<^aS zzas%g?x}n){xYpyEVfE(4mtV7FD?WFL`3cq$uh|lylnhaWSJ^dw)+o_T@-dhPV$nl z!Ml;W)@q!7r)rbGv=<@<%%N@O#HF$c?Yp@Sb>BB*K?}^tz%Xr%c5se`YB|1j{!zGa zZtflQ?z2WI;VT2rv#x)XZ#?bpE_MKA;t%-OhliwxM`U7u+P4<&vT&;YUklLV`*>;k z{iGtVZWLPal)v~b{1BE}*+3?B7O$)q;Mb^b59riHo-A~AliDrYE84rOD!Q$tr^EgQ zt(>^ubr!DpjrH6%Bek5dlW7P)wqgZ%_brnsn4Agp_%AK72|)G_51uYB*`T?i_BZh{ z<#cgpJ!c%eq#hkc&aH9NDIu5H_M$zH1rI^jRw`1w#ss-SKF3%+zDJL|ObBoap*8`p zPs+o-RvGk#NbOqcImqRh)I+3or@`bc6UG&@iWb{B$Ly6w7@h=l3Y9s2J=M}{B+HNw zLT>p@(*v&iBC{^zWIw5|9Ztzj-rJL+JyBhNGRwCZNrsX3AI&+HoB$ufc-n=y?B<4Lrbv5!~Qxv)qPR%iyEiJ<; zL!l!YZv8MdJJc%AHGfl&VoXLZnx(d-uArBq9L}rF{zH>j=jETbNl%*%bVy0!f&BJB z4E+ymI5&slz=PoGb^)#6*X5nRXpze<$ceOtK5k$IeFv-3wWm{WfR{QwI}`i(b(75W zYtE>!us8y~Hl7nyWov`*ZLT@q4V@`lC@Tr@s=i<;0yj=MC1z(PH z5G~1GpJfXMUbXhPEgb7_%C#FBECt>ii8-xwGx5@${9JpO@j=`Bjt;l(BjkBO0lCSb z^0`tQi;X0}-?qLJHu)}uF(`x;(f{@z<>Tp#@bgAy0Z?j}ex*LU6fp8#xX#+PDjUhk zqxFDWcRiePKz@~i2HPdh=nf~$C=kJp9IlEs6!q~%#$Q|ebHi1L9okZ*!~j}iDVuN0 z(ET+#BMLdNE-d{d5uCibW8AB7sdYMu%Q0;K$|WO9r;&2)ED6jce>2*th>ODMaKN_l zwSYj71;d7W8?dw*8W_BJ`xbN!YPz^D?m}K{F)yF;1>I<3CAUj`k34F} zMHmfhe8o7m7yTz*ntOip@>K-(6>}-enLBrZnBqfqzxg zTkh;dp8s)KB2npA3-T0VY!Sq3tHf)S$P`R;_4zoz&LQARp}S-`{ZtzTC%ZPupGb?s59x60K2*G=8tFY;CXL z;H7)@ik|^Dh6@T-7Sop6^>um}pIr5xzlI9G!JA!L`gfRj*0EC8lx{{(`ijzo%V|ch zXaOx6e!LGP++k7GJ{~E#h&*i?I-L~6H<(Mg?@i|WpY7EZ@w9}87}~F<#MnbEy8n!~ zbra_9p9Z&#Y7!+XFEPGHMpQMHPuxD@#o0lgkbp|pD+!ua;jrMttDnejfwr|8&ER@ie(`Aq)kEgr;O*E7OjqckjH>MkD?^M_eqpT#r>zb?c#OJRyk(0duEk3`VdZg-TP_Jv_z)FQW{vgYLQRY zny={V-1F3azNI9CiUf?Iketd_ z;o)K53Oa6TpInuKf|yxG{{42L6fCvNw$I&grN>Y7ZwgRza+30svz7HdoKvtgTzW%0 z%^W;>c&|crqNt>jAWchEvvz;ECamo)yCLFjv@pNwc7TBPGb_=P46zr6GGT}{QM>D3 zUquhQpQXzk&Me=hMp9#y>5M~DyNqgjmNlJKlNH5@Wi9Xzls_#trQw!60QU8gtdR#HSI z+~2RYg-B#vy!;_kNa?=oh(J+qU|=A6t^+!>*w|PI7zGv9(LYnTx2N7Vl>_PZhk$tY zAIbUO=_)kS_jMSy`M+}o5AeB_VKz^kno;X%ZY!vj8&YK>kHHMjF~jn3Ayz!UGl$(s zC$iUo6X!yZfneMN zDga7SZI$#_gC!BcUkXHo&9O8tm*9PO8Zg3?bW~Hy^>v!F}*x9|7ZSuiK#Hi_BwL4 zu$!Xe1|ckDslMmfqt#?56YHRC{Lk;@8|VX>iLd1~5?SlNo9jw=I9rth*PV#Cy0+Wp z__CL!g+I{I5eI=UFevrQAsh`*Fzob33S zoWEq!wvXx>jAUJI&TVhbiF@g;ZD1ev6Q3ral|;GkqeLkoD-I&yx2GIQIt2v<1OzbS zyDt+RV-Iiv-wc%a=-|NK-d-qRcBjWk)n!7>5OB)6h8i%%^*E>sIRlhl|XD9xYqqC$@UITvTZM1bs;G z!T=t_d=F^bK}8-Rr-_le`d_NH{PUR9!oqIPgPDWbN=}2OXs8-U+9+*o^nJK7_Fi?H z9gMLQq0Fic{-m?>TJd8(96Qhu@iXYfMY;-J^r{7=Wn@gx&#y9~Au}v_XLenIP%0Cj zjWo3$VpO^J@5#U~$hMXBvfpH__o{ow!bu9ZkDAL%hr{dc`}v3J1s5l~_g)>wvy7Q0 z0q2`agp+I(8vC!wP1A$53H5l>sh`?7?aHR!(u!#venSw!yxt*G-3cvs4Yo&JVBBIR zdIwV+(;HKB6kW}P9NtWbudq?U7eYIn8VW~lGT=3zT!X>?s*ADZpM@X;A;+5LOa`+t zlC}Vi-5C${N-qiJ+z)jvEl}t3eq`t)9vdH5R#I{RV+7E19vs{a8nUVCe*um=Y1;S( z&~~Qv6mNSnoZBlI8y9?RSu7j?@68SR0mY$6F z=USSy%84T|Q@F3RJ~e7t$pO7WuA{%+b+~&9`*ia?T#o#-9crt!aRGJ4pckYI(`u%p zilWTZl^R8YKTV#w(d{I1?d8yW>9rG>q)$Mh-5^1#uH&>F#6mn%y|BRi_zhC;T-pyR zShOnG!4mPHvZ$`MHt4i1E0L=He!jJv&l{RU*-B<+usdyt1Gm2QGqLcswWQ3@xgGob z^y07SMTB0i_+kW~Qbp)rpRTtbPMsXz!>9vzrmkp^2R*sZ^@O&{gwtKyqKBV2U`=6Ph3)2`E%?1zbf!xrd;(0bO|6dUp! zMWTpMWad5dU?*5RS~jk9k)ROz&oVW3q$=yI-{I&F&W?ia?sn8fFMdkxL|IJ#27xlNeq7d> z_uQ2aA;RAdx;ve`xw`7^I2=%C77jfAY_G-0VZvAGc{Ln=#h2Che4AyRBytY4Zr$?q z2FXParDy&-yAGU3r>ClFDkP~zZ$0JfKH@Tb46wZP;Ox5VKRP>M6PsCB!&>h|unjo4 zaj;dT%*x9!=gJMcQSjW>6%XXnF0qDKt^RVmU`W%nf}~vYbK;mfqwbeOcDxj3JNgk= z>*G-3?BAloHghEU9Ks(~+5IUg(MRodvk9zNFneNLTZ{sL?_5S1^;B%~vb-rGd2aP% z#4EbPPk^EliAiB#Vxqc+AaYmKCtPj?R5wd4PC&Q;Os%KvLJC603jS3<&jz4=3u|jh zSNQSTt%mMj1j9uI+U>C``mfcv2D<6&&OTHkhB3$#&ZU3!wx#-HnQGu^G+Pk(=kNF` zL46th;hQRqU(K$+2+-e}ng*=kQ@zGa$8sXV?!Sy@{fd;QWbFE7Uuy|%VxiS-Sz(0 ze$CAoYtOq`+Yf@`V{KzxHp)ehb5w!9mS;wZl~52<{kyk=*S6evU0n;a(qz0>5#XLn z`pxb8wjY-rp|yNyP^pc-xn72pzQ>bG-X})~CtLYM7@W7$U8djnm%s69YAtiXRYhXk z7c$n-DC+v)w>xV<5JA~2sg2NtY{AbTF&o{e{wX)OrmA`rq1uib;dP>GNOomzr=A=r zSdt7r1>n3>)|3r~m5@SLxJepOUYT9iAnJ?3RwS<+si7vl=$XlIg&;$0zi-%r+EFMc zk0U_TR6+sH>s4=#wbsJQt@aq%uXqosSfnDh67t!+ld{KgK2IN+VTwI8lwwp*av5bZVKal6{ z@YM%ux2v%G<~Qvm*rg9M?IA0#J>G^Kn9&a9JT%vNgsEqRq>MmqZ|X2QUskCeHx`oM zr3(c&h5{YvsuxTf$9B6b?dbog68q~5x9=FhyH*wp@v+Cp zbUH}d*Ut|)Hy%Oym5z?ivt?8|@NHDG0s@AUlM{ri4nFuXopHIiEwWlIbq23}U(z3L z=^xzR9h-6$=4K?%NHcc@W^{FeFib#2E5zhk#4c%uT7*ig_PWzlKo?YQ>ZT}+RbB@F zSh$8xyceM9#x#T79@X$U@LwdTP1IWYHGOwU^*EW9^qj)218Rw#m!GSCKNmFe{kGN? zMU3UT#xgss$1s+Nmx%K$nC7ryixF|7@c_~q1M|7K)}{P)M$rl&_R{d}b^$(xCPDB6JXeScVg)5i4_`7jF=@ zb-}&!;_WTf6B&jg{`|V+(@0~DC!=-332&Tin+!SuY9j3Q^>vIitsniy`A6`L-90?$ zQiefAP%>@DjNh0BTpQD6&?Jv~Z`(tdH9lU&oi_8Qgx&?p-a@Gx zEuDFX&UF(ha-7^4S2j@_!TCG}uT_n9Ge)vV&*GKyZ2g;HCW!4@>C+%*(CuYq;0t{4 zf833yBh#0;N>KuI#21u)WJy8t=UssweQ?zPc?y_Ayga8c5y*g&!nF1?Ge4#hrn)W@ zLmwGw-r4hJ7t&!OGQ>W3}4?uXj?TVcxJuy5~Jf6WJ4oZL_J z_*~^oEPZ%SIyp9x!|U;<()oV>T9=b;u9UEpx8?f2B;eqM1VU$&T&t5aKuRv?Ye7+B zD)0#}`_$+=e;A?^=b_pB@-SOJ+9-0}>~N3%=g#s}1@Ua@nK`A62-jf}!6Ge#ee)Wz z39P}CP1!Trhm^F}A|cC)esgn6y&4st{)A1S0Nwnwz+odDIVM0uNYkbO*-eT(tT<0j zO?CBBPf*W_>mhLry{MoobVA4j!pBMLRLt@?hk`gzn@H*{V9etEicDe`+vYOr&hDO31w8V0IHuws8u!;{4h?OP}6 z{u{Bpyo^No@l$vA^Ep%DwXg6$|7*0;DptrB0R)u$cAJYqmw+dwo}lBTganmy>Hf2S zNtD{$9)HsFL_bWFD-qsznz$x-cz(Ec{N1#(DAslVhs=Q%F085wnrHlwf@OLULspl= z7swulBjuV6{h|W7iSDE1_&$UhTJsX^{>jYFY(nPEVq49|xJjLff>d&vO+jnzK8wKY-^HG^u_md-_OyA zNAV$c4i03{m4H}!00f&`T@?jrg-1E^7yUkBP-TFHq9k5|Y!qIakejL;F4bQJA<86x zeFE@U8UZBB>i8B3pgV4Je%=4I`stJs@}3L3P%x1jk>g%fsaSadd01u5M8M(CHnND1 zrJ3hzY+r}I{O&CVMT_;RZ&PitBy~dLWhe1U@E*az`qe)NQE^B58_>;?e_W`g?#K`A zDrS@W>f58(ZO4Z)h9}|X5#GLJyu#d_J76T6?h=b$K>^ajwG2mfwx zZq|E4;F84d9I4k|E_(bcN=lU9022-H0kXxq@0|z~2zdNi4L~ZLw&NnM$q{sZKQY(| zG@rqj(mc)QD<_=YkN4GVYwrdB^a~a71&%lCvUhCcV!aX$%9PW9!QqRBQz0M!LBrT? z-USQEN|LC;(jWoYld6Fk5wa-WHe4NJDTKbi>_k>qi$;1eoQhVdh0CMUVZ|_4uV%J! zK}h(*aD}dkLA2u+thfWRYDCx7xTmv~WUq>o);UU{R@2dX7TnWnR z>*o}hBgo)F?3DYRMgIXNqS!@Bl9A`MjN~`}y9+QcD3G1Jo%C_Oe;DlT6*o1d+9NMz zGYg8B%rx#RKgbMae_7q^q#HRqgv?$wKjzbON+l}l#o6=K z$(@hSJ@*&y>Lx@%e3=}-)%dn=Hjw3gp6l!B-T5_<=VJ%9h2yub%!Ts!LGD#CXVfe`HXncGuL?5k=t($o9xz}qiR{>D z?j)3WA*VI_Rvd`XBN>X%BLzF3PW zEFKXmj8JfJ1?GW(h39Cihl3e4HZ}$`RoN-aXng(QOz%ee z_6Qw-KR^jSNj&gd>w7rs>8Y(f z(d`Me`ZLEuW%8jx?m9al`q}U3t&ZkFuDsRy!Jet_)t5c2If@u`^!v_LYa-Lzhz@7N z&h^K}O}lf~>`SCCAo9u*nbkDb4F@XKMr`BEP^78qVg`nD8A1}(R#;UGaz#w8bY^C= zefUJ+e&+A!J-Q|&AlTX7M#sdQ*`j=jp44~=*d$M&-|rk3dZAXE0%$=nJc{R@i;vor zh%KDUoD_wH8jMUNLfIF;xk^WVZKaIAi$jyrCXheC`*gsL%q8_H=pBZZdo9d$;-}n4hm*dmKOtx;~vR z=n8m(R8_O~Jnu}dUQJg6DZDV{Qv@D_qH!BOQeYo5f?7Du5sOIL1cInZ{A5L5R9rPWl7^I9@E<2w5ja35FYTaK^La?mr z>A=$x*9{}^P7d#D8?Gy13ImF`6oFJj=zu*RKmTGaCfARP%geafSP)|l)*NXg+w$~o zEv_80xSl5Sds`#ug1I9#b|A^hWQ2xzDR~9ou6s|4nOnCv26dtpcoKCz>U zKg;U`H*uGl3-VP@^y2@(mzhp)DybqjQ>L1vR!4|0bLP3o<&)==`;fLim0ee(Fh&iZ zcJXF`7LCDj`ZwIar@fT+0Y0zwn>3kzW0tH;Les{;vy+;evI_;;{(Z26Tf&&s6PS(?2?aP3jm-|R(d)J zYM5PMINrs{=YY1!hpLX6KKxnuaJp>Y8en#NlXQMUwUlv2mMD5TGi__q=Qfd004F zH5wo`{A$(*rq0@$n(n8A*sxb3DL@1QmPUa?rn*m8eWn3VYu$F8-3FdEO#>fIUDn3f zR&R@n9*f!st|9)SYak>p@S^Bn!2YHTEc5(Uy^jCGoJEe+ANOV zWQJUh0nN|*o?eUZ3HWhjg2_^%aA>ok-jIQ2BLBD8RlHpMCMlZFc3d74`Z9ff5~*IHh{9Y_xm>D2#7Xb=H$&N$CRBY z+t8oD5j4g;J1sq~)(71L5nF=jWYhbZEE{OP4`w7zIGBtD9w?cDN!nZY?P09It96Dr zB4gKQM~JNM1Y~t(rNd#e8z`#<>bn{YW}EWWU5~R5-?}{95}kI6h;b4brQLhkTnW&HwtvdtFYI4*66|HuW-GF@Nv0YV1iM|U{*QX7KWDOOe2F=<7nx^6({h*je9)~?g@0_3 z0c-_fE*wyUUH#n~-XgOl+S8$zsI+kl4FrJ_VAao>VG;jhXiW|s1EbcU`S7H5O;(2G z^nr&liI*L!vx&--z}JEo8(t(D+WPuS;95;lpn$L&dHgJvgt8gFZ{B!3$2|5`2Rctq zoxuH!$-Dp80^k=|Ht-m`@L&`X;=!fmXOlSTOQ-e*`|SoHiwpA%&*qNe*Ds8Tm_P-! z#>q%SIa6C2;LTG+;$Gg7kU7FD(4kdm6Xv6C6n8bBh;_S}meu!s{rWf4(E09fl$bvh zoCmC++X1k;^WQIy^7VUoetM=7J|C`U9UGD=Chw&x^gR`$y44S|>fO6m%@*9K!ZN)X zF%%R1_96CXX|6FRMBXhdnt&O_VL{cQ*zGikw|--(Y}ki_@vuc`gplm}=j;?d2M%#) zjs{zU%-8pWI$X1rndKh~Hl+thQ=>hr&BriPy9yleS!%*BME-Z!;`@PW>_n?yp4K-Mkr^uJh+ULGD z-zij~Pg8jED!Xg@`*4MbMI7qn)<1$1P(2G@He+`NzmPq7#L3od$ZO*{;~4@o{=S5M zHbOaB=)$XQN~{0MaTd8zj~Hno-qh8VnOiWOIJP2{#qE#@s|4BMLt`p6EHc_`i_rW; z6W(y%FM35B;fA}WOcgV;n2(zcYr>6|W3RQfIoq~V)%-W{0I>>l&Vw+p=LLjG@QECB zyIuMvft)$vLda((M8PqPsHl>L*o(#`m+p-qG1r%%)qfL0yp?{!Rn7IOAHE@=V+Z7I zXo+ucMrI78BFN%OxA^d~9c+?s>j-9zmW0V=n=v5oLq||8i=rhFRBjxR8y(-5xqFp2 zd6f~x;pv2Cu~_!gU|Ft^zL}99(}|U|(w*=8Aekv6$sz@TxE}xJj_bpSZ`j=2?CcbV zfX4pAC9*2f-h4JZghQo4xm+{1V*2yhIQBUYVoP75)~kWalHH#U~a1gjXq=+*@Ob(!^}mA0urxUlxEZ z=}I43D8mkcTOi)!3Y4fjf5%f^K4V}o%U5TY&k}D)h01?1it6zy?~0aOzh=>Vth`#e z&!UNYgmnSZd*j{uDrkdq#L68=>r5Xvi9iW?_dqiDTnaRP7uBXuhkj>W3$wGAn@aUY z{?idkgs&hFuHdx~v)4#Rn3EzdyVgpC+B)gHP#CxKi82RINctS_Avr~kAZGP&iFe%v zK@S%xpYxc7-cEH;4*MIA_<=(xrDF_t$%~P%}qW+o#H1=iD(#qy(AY100KiNC(pp5 z+|KUnlB{dH;2tdsNj!Jb&(f;*%=i~~{#8}oL4DG4a&q8s)24{~psKzI1Y_3sp2k_dmmdle0HnkVMA zjlVrXmusjOm+`IAklize5n5;L0=6=72`l`9>fd)z$}FW-=Bz0#&8zwkX%pZ0SdCU77T!`@pzh-*5PaVNx6gW(Zu? zTlbOoIMVVoa=5fQ*ybTLdb_f}?W*X<(CoigNNnYvOIMfp5+ewcuji-CL-5#mS**|& zTuWO8&Z|2Fw5Fus|&Wg|db`zPaI87Fa63B?#;(eLZ9B9)U(!C@k z*(``0l?Pcw{Cw#)_>v0y)(0Tekj6&ZqPDCKKZBbm*C7nDL0BQhYP|oAy)OAmBIyk) z{_^xMZzC!C1b6#5W3yQ;9B0D{2l5JBL@~%Zc<&QRAx6uW0G)H0DKmL>89bHpM89t`QijJ+nTS**pd?}&2H zd3hb7vK-IDrwEo@YazbKnbT32O1xD4pXYdNS@m{K?=`fq*Iu61fSo|DADIk*gu0)v z>w}&zi(KB@8+TjmSQBw_aK3_xhZ0OWGbPx?a7Y-Z&!>!osbRYxFtVDNZJ*1Nr^CuKCYlzq;Vsr){aL;UpERW#m}IH?~>kc^Gs{= zg3+!;Mud1e5YN=qmp7)TlF-Jnnd-Q2!`-2y?;jtRO|~i65OMtgIVT{TB0$TJJ~bH! z8NPo5#HIo0Vqm;zN^wqVR6U!HS}$;kpZ3?9p~5ZjRk&{5 zAY0kaJAPnt|6}8ULF(A3ZpDyYw_nt03>!MTGTj#VD|dc3(^b%aufW^4YZdF*tNKN6 z7<8qBOri~5N8s<~wH@Y-JNNq=Q!Prdczxv#F=_ZI8Z}*PQ4uBnu87F{&+IoA6OqHT ziM=jR()sqSH5FmFmRV_1vaSqcdH`8Z8JqD7`$|$%rnzsL6{hPsI>Ia(E_p*XrF^nC z8m#gwtXmjQH*|MbUmwxdGcF=*x#2q3eeF;25(t{&-roO!s`MBg3Ha_Li`Buq!q|9) zf5FI7plIM0tlq74F|fdeh&lbQ$aA>w!>|2qK~A>W15bKfnBY#MaQCuAbv_D1!Va~V zb-un;E9uqAfR;Qh>IV zFy~gdJ%}#oD-$W##w+85y|N!xp6|esZ<*qes+Nau>_4(E zhe=={+S+^LIp4q~xL_Lebb^t0h)Kc0!cjt0LX3}iI1--9-tW9tkGNK`khZ(ie1Pp5 zhc!scN=@K&-)fz%*op(M#4+Z{FL>h-9+9@3td9e~9)i7o58*#EM z&SR`5>E8!}`TFxhK0d4~2@MTHn4gr*9bO1HWt~Ill+*}7V2aM0`l&b$1afsa!Bk z61&HVq9gfmJ}S1x>1V~`sZ5fM=rHIIx8yfIlIM+oFcV$MBakTl<&F1fs6PwD7zT@UOvcvYb#l;{p*>R({+vbe)w)N}PE##eD7Dh9?5lUT- zrnidj%t>CMKa)wM-Iuw#xk1$-1Q~chBhXw{R#sBd?@ZQbZ%&^&C9x9Z?Ck92#c$~d z_B`?2xsfcAv0$=CNJKQd^amh%!ETVmvZ@MI)!F$J_^t)_M2qS{bmmmCR62K#GEm0D zhzC--@1x5nPvXB;_n;9(fGHXAjVwei;fC~8DN0#CVW~?s-3+?N1RI)b64StwP2?y< zdB}_ZVa-!W6jRk?fTW5c28Xz9!IAefK95m4u97o$AR+b9q9%M!NNK`@czSz2U+?T3 zc=`e@?l;@X8{aOv6lp?$j|CVPkktC0`j4~c=3ZsNG)s#DHojEviZy+ESuc)$TvW5N zFI7XAlw1N&`EH>B9_clc4ygW(>GTWWDRdG~)vG!&D%ccBaq8Qkok-F+7IEXa)*#xo zO#N{2#5t_WVEwWH98rFHKKN~^HN=fLeXbtu)1=?5v&y1H3I$uJwPx1b3-zw^J^ zJ;uowlBGof9d=e$RuZrZeEo{u3yviSaS<7msQf6S0eySc+27v}9@}7>WAbq$0#I%H zA~DFoK?e0r*RLwT=muXBSl&VAGb=Om_w7_AKvJ8pH6*bFuGelRDB5LhO1K@ie(s;Y z=7I-t)PzXbHC4mM`U^@nXtO?TMKHdG-qLXNTn?HwC(wdc6!b>6SsiUM_AR7cF#%#m zqS&}m?qL{j(!L1vV3;pfRn9LV#!D@JU8@mjL}1M5OCK-DBAZ0n<+{-iXirW{4Gu3M zVZXGst0d)Mk<8AfjU|45AvfO_DdJbB&c>9%u}Vg>2&Qw!mYp7Y<4=}+2nklwx7yDr z<0t5&Z)AQKi?}Y|{-!wI9l=VXW{B2obcRvs=u_1$V4bz|(eK3beD^YKm*iMD4?|Ap z?qVXdp)Y101+MdxKREd?&Ef3+H}jJwfPKu+*11NhENG2RR=e`} z;<>jY+lnalX}J_KB@)=tq|@A`bg>YlAn-qR428&jIUPoZYtZZ+&4LXpIbLj2f6TR4 zvLm$RDwnSuo8ZZMZRfvnwb>#@@ndjOsAe&wpk^s3#mtGNw(+#HJ0WwCi7K)D5ud~F zpu>z$n&aT33CITe-)yvXbYAoGcQyE)fHFtpK;u1TFv(L6KO+}sb58kXLq2-A!s!r3 zRH%Yvg@ZRwO!((igqB{(sw$(;Q`v18T_#a!brc)&nRWy08g+$UmkP-gql$eg^EBG8 zZtfsW4)U(81ro^~G;k{Ozi$yy6FSHM(fjo*vM90O-e!T}dVXtjvlDTUrPqD@J4zgb=_TEa0(54bC$0c_mS_;flnYo1GF~i&x^{t4|kVxPn^Y%G{Vu z8BgokxUpuXnNc%xOxpV!TO+)|_##)_i;$nFO}ee(heoWH0!hS3N!DEpg|)Mnx(1rR zD8!gt!H{DiBL8hqhxxfnMtON~hzUC{uEJxjD=1tbf_w4YDzlN1k@6r~6l}(XDb*O$ zaw{@2GiOx(eG~>;L2x`a&jq=Gxmr;}Qd^tA9t?;Ns?B1gVS^|4$N&g+YD%3pMIApP zB6Mc2!%>Y1x!gmDrEfGIot6>_o0-irQURIEk3VH-_+zR}MF zBjZNY1D-@(Utb7>R*F+k{hn(I*mDl{C7MQh`_|w-AzZxi_8L850>$1_|Du#Fp$tX; zg9<5WTXdR38FjB_6M=hyy$Wfbp^p@V#Wm%k-LaH}{5O#~?n+M%TA=pCwJ+oE7r{!ttk=G>b&aJ>de?StLn*6+F`_6~?slkIP%d%})2=WWQkg@wfqVx>e?ya`pQwDDG^OkE*@ z`wZ(5i*Bfvt6)nojKlLiVlc2ZgVpGaN9~6hwvlIv8x0?Y_R@=2i6F95|5;9+^yrA4knr{GteJBa7(D)mL0a8Uj1= zCJ+9oL5}hYH(`RW;H`BG9bdA`raYg}+u8&H{W}7N1#th2rQrJNT5(&4e8z%MW2r+R z_y02G{)Sl6rv`uIlal`LA_HTZjO35@25$;f%QfB8A=KE&AIo)3XEAW@j!?iO4GhN$ zRN1Ox#UYfO<6NQh^ESn7#wtc{wDiw2zIF;g(%<6?upe3}Xd>AL@ zizmJcp9GkKvQrz%XjUxVHbxG(3;g^)n!YkD%e8Czrb9{^q@+u_r6i<7LPVsbC8WCz zxf*C>;y>Pq zW4A(~f*gA3hJX<(B_7$5C1|NMCTwf|VoNK7#6-dYi@pn`PFZfE)?Gs5=r(i_@1K2+ zrS4AcXSoaH%T_DSk&huew!SbUPGdpeq-{9UyX0DqO5YeJfp7)X$e&!CiK_19yW5zn)T7WO{5=x8+DIpmi=>|dek6z30nMn>Cqg{-M*}w z{Jy6%IFO;EV@o(yAamC7#e3@#6vSUy9t0fC3I$`CG*kObu}cA8m6;Rp8MBF0s7v3+ z2U`koST@~ebfdJmV8+QIG~q=PqdZm|b-<4~E?j+BQK2Kp7}9aOP*^x~<%6Wl_D`0( zX@>G_^ACNDhxry5mTD!0$(5~*g{*Ih;q6gdYfzWtsmPOCO&?ENioT-K#4*1zsu0$= z5!R_&tWM<<^R?{D&WUEaz$+7v&wE)h^^3&$$Mw@R%3SB zR09XzpK;Y}CFK&(g%LJ+C0I(Hk<3CGcaxMEp}0Ig4!3iLVtU#6hw6FBt75wsFJ8cn z=I#kyW>R&$R%C+mmzVxt^1*J%^B4D(LLvh;kf5&P;*aJb16mn8ss~rhrTOO*`)g9z z|6+4_Ib&-Ubwsn-CcYFEP35QqzqFLTj|838t~3qfkT@?aCz5o^f3jux<#5oytQBgr?6 z8o6yS`SMMqHjXACs-b!(rpH+(XbYbS;?tv{p&{dimOH~xK(e$`)$BBuujn~0Lz~#Q z3V$f-@B^lA<-jZ{Pg_y33u)~*l1+=MD#7*r z-*1kf2HbkR^2fM&R|H{pzrcC6o~B7fWF~y>5h98{Y61VtD$QetM>R&``A?y4c>1ej z{sTr0my{hg^8lTC%oF;Z_vko>jAln1H~k}j8YE-$F}y2@RBxR7!xJOtJPZ}$kdQxf zQXhyec7J?83!d6(+02jn6&)l2tPhk(2SuqSU;#j+#f$p;+#kIDu1CY9-PckKB1P|5 zb*KQ#I{`ZDI&j2>DtWBSD=_dMNV8M#7>SsFK~JZO>N4>^P&8cm3dadB2*io?4%4n@ zzs-HN^YP2eO?{w^NJxcby zeZ2>&zvl&d$q-o1HM2C%UKVn7xYI8G-oK!_(dRkaw#!yqGQJ5zwR6%nB;uioF=;^OR`iW8e^eKgGqKU_nptu+a=Rxl3FN0!lqIZC zO0<0XBy!hvNps2(7aOuDsm6X8L}YIm7;#*lKSgI#CFgqc@Q$5~WV(o)eRJXNlX#jL>2ai0*cIS|Yxy$DNJU;oOlxj8|Z86=-7 zvG)ty=N@we`IVNdCh-7IDzB^iphJCvl|a;qTaNtUEw)=}!_Il)jA#a%q@7x<_+edn zhFTn?3>mGX9cr2{xtQ!4_{}9=Zt0F##)zmVFaydxr*Ev2m_ zO01Ge4E-=YXs}~r2~^*trjEdX7!fu&POQQAgt)l8OyxC|27@b~qjf`9iFp3RrA!Ek zxnPqy$2pmc%pXH5kF

z@}!)FfQ;9f$%$!M7Ui z`Zx?~(I7T*X8OF`Gx*DqpMeXK_B=p+&JT|IcK=e^_7?Flh-QS?#O<6<2H)pPfb z;#5D=if=4-s{#SkiZ^=IZ}VXesk+H|rQI7%igiYR@6ak3_0Ij(yVM-Ugm)(0lDKF@ zMaqmx6@pk;h^F)r@e9p@tS$cAT`bnj z>Zjb0r`lYj8#Lh|aV1SnzF>5mQA`UCpN);_PP^}(G`d0t{L~XS{Eg2bSJeu-Ao=ez z>*_q0zr2FsZ}{hs*EV##O{}l)=4SVg7YdK9S47|ma-6vUhm8N}ycfiJ2V5L)HGA#1 z!p0TWxcqn8wm3CaV)vLc1vC-Orwe{adP9pS7uEIuv;gotK!OP)ART7!o0~7QycWP= z;OiJEnMuxA$Mi*pZm2y^K@qF2axsEE1ko-Kf5+^*gyF|tw&0{D2@aI^@tS30*j0@W z{#q(F8P2-sh1$E8;sz zcVK>yOi`ueQ&XoBcL3eVqwhTUi1y=`QGFST?JT%1!JWqr&zOH;=Q9w0eJY4k(^`kY z^Ib>bzTwJC^(3`gGEUjGL^Gr4DJ?^PV&)j72cIKRZ>nUHJ@TrYXg3m{TIhAR6 zaqkR2!oIPvU|OSvK3%l+0Do#pb`Vv{_qg=OCGzuor2p_ISq3A=6NsX^plX3-D%+27 zgB&aaq+nlX9)Z6Bgn9d}^{1?EcTt#rhNS?$bP$M8?>Kw^@A=V2(8{evc23TpnY_kL z$8kY_R{*GT40{YeIV@ywCTh^tH8ea2aVXRy1+A?n`rqIN$G;`=_W(Y5&#UbcbO*JN zp48NIQ5|$;52ub*s&Sop=W7x+%|e~B9y&jD{cq0$kKT&TIm@$?&Oi|LpIt!43fQi6 z%94vY=QdU%`)^{wVP@plk_6vay4!Kew$(Q}k9SvsUpo@u|I;VNn zVlWF>@Lq|r4qSpW$mGLQ4C8pMG`?jxssw~=Pbt0bAufF^sZXHJ zqi-)!Eg0K`nnbx+%ly(`T9q?W=fMMhtNvuT)KP4oJ=+HF5C{V2P$C8o&bb<^8+{PK z*Ko02(e-QS@87>#frm*ytzd=t^jQj|s0xdUCKc!AGE9&vhy3~D=^|ngU!ARgw6oby2&TeBDZFwf%&nbk<&qTU211YmhjKRkk=7r>$A(dfFmy6P8v zE5hx-xFMCtm^$V@%oQ*AY|uVXfVam?42P2Y{z@NP&RkoN%*N;P^6jIXYe^rtd%c5# zuCFgluPaJRH+6F^NQb5eM@DjFf&!U|ePEYvJu+-`T?1MRx^*gxE!jE2iOFdKVt--D0QJ#Wad zIo)3*G=oDOR44|ZRf1{@Ab5j!kC5SpO+8o)lz5ss(pUXl)t})#jeJiso%|}cVLU(Y zIm^*;exuoS^WW7a z^1vk6=nED^38>3h1uh~#pK+QR8~uI^wPFH*zqyTxhL{xdOc8MO#DhxO-rn93;up6j zK%S#QfQ~Aivk$GA5TC4QFh_Lm>3z6nH(H7;dSanQ24ool;v#``%V?h#lg1`kJ}IgX zj`^JC#Eb?LQd8MRIMy=h?|Me>*@FxG^988pte(U1^?4=s?$3h;8Wjk>FD$crtfi#| z->oE_f&QoBVpa$soDc$IYm{Yx@4rn>j<(!Vd;pqw36Je^{ff=sMOaoG6al?2P)Ri{ zh@)Mqr@ZgzvpS1bXlyYnj|vqEBL;V@)OonnC5ljd@MZaTdYsDW4a?F`ST8yTc$(Gms^DaD{PF%aR3IB0msiMU z^)f+;&d%O`B{LP~)>~2lHe2b5gGaLhMLvkc>SmpiUfg;{3IlZDaD%#Z;@dUJB4=;U zl@2=s-UnxjFKm+>@1GIiRc)J5%&z+2!2=;`S{fSU2_R+Rxl>th-PTRX`em8VBHFF8 zM9UZRE!8QLGEv_zKD%MGZzz``{^N}Aq(3@0dbn&W66>-1yy0XJbhIxqqB@>YrM>^k zqg5~HE&cLPzD+P)YiV?u8A2yiea*SELL1j0-E5`7Dz6~YEwGL;!d;>TDrvy5q4V_B zI)K)4lUkTA?)i`R=1>J4Tg~XoNo1L{1zy2c2>_)T<>?|97Z+gQAU5~&yPNV>vt;Yb zw`}^QOkldy>$kG7(NU}RrxL5#;b(O`wE`EN%{3ID8VV=2xMQZ^)GgBaxhKmC+q@<&ZooaacFH8oZ*!6%T3<6HmiuIv+SoGP*B9#D(C;q>vvJF)oq&QU(@(4TA@9e zxaxR;MJRo~ngopqJRIKEv!8eB=blC}V>5EZy5-%hDYm;j-G`a}4fg0X0jqvC>4OM( z!hpR%=UW92xuRkRTHcDXvc{#*8wynuuU&XC6M7L09%`UN!CFcqW)}**ADV6%tnmIG zkDO-WuhksVlH{(35;(&Zfj(}(45J?@EZ`i@7}CG(UVr#HPmfZU5>1gfQTlBr&hU8G zjBOU(3%5E(9El}l7YupXe3W>s#1U`>YA0AI=LG(2!akB1uA(cZdU}f;@JOmaoyd20S8g}XpR^x3shA_I1 z_TX7ae%r6b#3(tpyu9HE5nLRh?0NSIV}vp@;~owMDi|Ng6H3*>Dg(w#fibUq8^~A_ zzuix8vLAvKSf0}f^0W&su$#%2@_YF1(HN}K0)prdP}J`ai7tMI|GD&W9wA30jF>A4 z@*zkmD6Uu8WTxAKf|!Z(A}{<~krEwH5d$Csc`W^XeX!y<6L4Ve@;_42alYvUGy=u# z{VNA^uu=h`$u>rT;{q+D9huYuQF~CMM0JrW;$Xh02J0IzsCp$Dd7D%*&yNV{)3d+7 zkvRh2+n1L(Ce>3b2i#8@;-$HV#UW)gW%0aAd=X-trFgLzNO6IC99MYIk+=I3s#VRu zYx=(yxYYM=P*aZu(jauV=E1|jFG(vC!++Fq=U|M{P6oSd2chQ7?%wc6MJ~Rw=CxXsg9q_T9cIDw)h;_?6=KVZ zp|7`hQS1kq(YtfSQJJO+@!lqJJ2Qo2je4QA6*Ln%)e62^cKeto#)Tq*=>7q^IWX|M z&ri};SZE1`j_&j_)G?8lUY%Gc6i}5Fs`5Op-Gn2Cg4Pr225>{w)zy9eoL9KizN)eN z{44s#XNVXu$q}XjlDKtHBnUE!@!i}t^ z7WJe{fpKhpz6BZp=o9F#&w5-RDg1zQ47vpi1Y9ub>aN3`%fF$$*3cz~q`q)+Y;+`6 z1=m#6ZQTE;Oz?DqZ^mXhM)vXpxV{2Wo}kRv&C~Yx(2P&{UN=}?Y++JvWHJ&aqBy|a zzS12-DtLbN4+0WKD81HJ$z>T6Mn!+yk^~+QJ?b{nu)%s#U?ZCLC3>CPvwHW@O%=oa z{=U@?oUKAkX}nevs*jYIZ(dn+@!8p6t8q+66mz{NWN#<9e>Uaz7wIYSF5G4rZ}h=#Ej;Ehz|rQ zli$g?AMt?;$TP_`zY&H_ zO3?J?iZr{iIj9;8FB1E1)ZW`(UzE{~Tl4kLrqk2U5_c>1e@9MA3Q%eSV+61-RbgRq zAOn2;8uLKng?)9)!@VW=G+5#vN2Jv{kH9q)_JYLq-y@9WeJY-WmknPqfi!ntYDWRp zf<}gr&*3V(GB`oven!Kw^R2>QYI5?4|3Md=^F{nP5KjIax*uU-;RuCLx@LxdFp_No zq9Q6mYtZpT+J;w|@icAbLu*i12h>#EnC7I=E>s;zkRhw{Zke8HU|C6dxf)=}@6AxM zGP;hVl$qsZz{$4{*a1L|hqLbXHI|m+b^m}nuek|y%g}_v;aSv26wObJ{Zskdf0!3c z6VPvZQv6r;L%>_SANDil+V3e5x-th@IFwfr3o)E;T0XjASS1L~Jn2)(OFr-96`GiS z=()oknv7@GT{y6u$}X#zBiF5)OI)}TMi4Fdvb;R?iEAG~q`0|NReJ!wLaXzr-iem> zIkX~>o1;VeD*G*{3FlzU2Fe0(o`$1>kXC}(G}SiaYR6q9rr5473jH?31WyFt3D$Tk z60ohCL(GbRhd#LpwI>w0P^(()*vXRa`sV(9vAmjeXP9m?<>6c!nqA-z-Axt(29_>H zH$=lc^Uvsi*mebPuX|7}-W3)qI2A_o&t4L~l2jiR%whBa_)qozUE&CI4<3=yatWJZ znggDhB*qCed^p!U^{rRII#$NCQGrhJhgP{M}9M3B%vV!&5XQ}gBDTexl{`!FarxXcz z&0d|41O=}4-W>J;q#5eLs+K>GXUU=$_j!4EVA9OV4eBW}u7~f8>i6JugejcZK|Rtn zXkE|7Q(H+1!o)Y=HuX7M4%<4{hYF6ILKF~CIL&CNsR4yBsvE4(GMHRJ03zn$>DhYF zeG6_);#aKEAD}7#?R{!@hl3%dMU%C!-b^vqI6gM!Bo4HX|iUD>mO^GYr zMfPr4yb#$blS^Ln@O!TDP>k@>p(l~d@K8cSzya&kN${jsjo^)t<1eZh{1&$jS#Pxd zde~cIwt{`{VgE3WfD*IS=5V9So*}ybVA{>|f9CkVDSnK!*kJp3UxVpMOe9J~5@U*L zVL!))W`t9}ELg_4jvg zp$-CIhn58vIUrs#*XJWqH<8;tlD>WabkU`U7I0D?snY3*30+guAef(w5RY>wNwq|P zvZ)RDjKI_8#j$jD;s_dX*VWHQ!zAbkxAnnuSU1vqe9oJrc~E@pO@Cygiz6f;`1i|3 zruq8c<=RI#E2|>xU`h*k*l^Yl+@hxbDq0Va`<6b55V{=i6yR;(rib=KPIK5th+4|~ z_YxFqzoFt8!{H~z{r3I)zk#;D1MspO*-R7E2wD3FTvqTKoI_&F+P^Cp->xT_P5(l) zFdI6wpI4S%qBAO#5wL|hK}G@eT-l5Fu6&dwQUvi>EAAZ%Am$2^N4yw{8P7@=k6)+B zbkkUQS|GN;vq3P99l-j1T3aE`{2zh}Vl>%;Hk$JCXu)v!A^X9} zFf%^y4h#zR$QtNFk)tHX>k(jR(U-&qz;h8yzX4{36k=YTO!dV%_J$-L9yl3qF7TJIEAaE2KKaNr^|@gDV(IO)PLlE~3j?Tp_JyQlj$ufvDOj zgPX#d6@G_GQlDHW0#ozu!-qPJH9A`0)RNPMF4{tXpIax1b%y(hfoai0&3s;+?bm`% zyJ`D@wEMLU>TDj5C5? zXMB;t9GPpdwaixzZF0QnPew`#%rU^}xC8*eL)$!wd`57tonXUiKcAzwh^)&^2_k8r{|!QeUYKSJnMe-3)UvG7o9?dG8+m{D64SnT)TYznl1a8_fL-IKRGx43fbHW7fjyOQ_T2?bN+P@ z@k}G5_~i6-U?W)&#R9A%ec_~s!mOaaYHY9v{`YWVf;tn9?6IHVuKbmm`rg@$Pu=|A;~V34Dg%TCJ%eYgdeapp-=xBeUO)z2SDtv zxkkZsbwEEC0#4^kPLd2|2_Nw*a&X7*oe;=86~h_x_!(OIk#D-mxuTEY;>xP^-A!i? z7Pn~Tt(S^HxO(p}lBjOju@j<2mk~ED@EIm6uv(Vhx6Ywf%5X!NsBP7{9XmFDQ&Yc>@0yDUq-Moe3Lg@dcAssJV$%$9n~ z((Xp77rBMI2#7m-`Rl-Y!T(5uUsl3v@5u#o zG2VfQc4AjNTJZCr%h|e;Cy$Mcx(r8F4!%D905wTeA~F$%&s^?JysrK?xPqfr;Xhjm zz9{_oNyD#e?9i{BDRqtBsxp5LL1-x6F7kJ+$*yxC`WwC5x!sT7?GxR(+$Gs%sQu(I zE<={)>7PH@T}D_>EPI5?r`4qYS z7pHY<2b33;<>mSHWKgO(0i<@cF;b#=CqWsxr?jNcEp2SrEF6FjjUvB8?6XJ+28<3@ z7bpM0{YdZ&Zm*wFynoL9fd=&f_-6A@QF%Gk>vwo~>TK%1up}a!;r9D{^=B3V$_9Y% zsBhg`s~3-`qHPC+RagURxzp0i=l1qSkkKp|JvKMTZK9T)l%xxqlOI3WTV?8=eJckn z$s~Sa>v-mqy<+BrM~}RLH2^tyvZix|L3QzdICh}DeT6@738d$NCJqK0+>4ON1^{7S zzQ}D`+b)Q;#CC!~1v&YG*J1$3j))^1W@;lA2wFi&9>vqt`zItAK>P1T&v&OkhOOs- z5ls|tt2dAr9m@eWELocHvIF6#rj(-g@<$aMcK>;yGCCevlHHLlb?&yIelf-C7wzT4 zZ+}Umf*CHVuIpCvDaFjxGGnm*PL2Er&v8q(PzHb8d%a7U_8D(fS)TIG$gYIFC&`K* z3FqN6y5e~1O*O#9g#tD6@bIwUzBY!dt1D>8Gjnoyv#W>u`oJRk_Qn(aZ%}>#YB(YJ zTZulv9aJCX<@XE5K#1V;0I50JJk(nodu&o|CiEIti} zwqNsSo00k3GP0+4<2LkHKGY7qTjwz z5gdc5v;b{Qvr*n3bG#ooo<%NvZbqrR15R|A@&s>w)qaqxctdI?*Nv#nVfz98K5#x7mX zVf7zBOWT9K7)BRRS`HdPC4~KVzMeFP7L4aCc=NDAExUhxdwMoJ5c*lP$>7BNZ z=?En`Ddh#a#BxpVxZzSL%%-5XxbzRre5xF{v!Id`Fr%KHtchAl-t~W4fEF@O;jEWp z?UcHDiVvh(W!rDzorm83wqp^A+f7Lc`RQLhv#~vtN^VT&O*HCSbQYFo&$rw2@!cWriD=*w_1(o`@%70K_)wB401ktPF<}S=o`-mSPO}S%BJmasEQ%k|;& zP#4Z(f@~M>?=Fb1h+Rjqdm0#~FU9#2=-<3VTRP2DK_JOs*fW{|EE`}a-BM7{$%luO z1e-uEGg5-(f%Ws?3>ZicxTK&vovxc78*_o*13c|I{Bio-_#BLXDd@7}bv^>BGE@9` zsEvipj7Ff-ioNObw?YVles*j?fZ zcF_K8eKnLgZEbCzKIvbT=c>#ASPEb@ZsphbKFe$v@1Ae=8c7!nD|Q$ixrzAj$N^-8 z6%Q-nPSCBs3IDzPLea_xT_Wsv;E%6jAm@T*-*52}CUHd^e#mwb*EzNwkE;QW(FDJI zoOW>Tft(s=1~{=XyF>wFpSlN?se}ie0>GObYsPCy;jvGpN6Jyh|4cc5t`T6;yDj zsZqRn-$vnb;SGHG@rXS|z}{Zog@5gpiA;G07`4&NVD{h$$$CQKgvoOvzx5HbS0_B9lPah>%oD?Tx<&R zffUI$R=wZ4(Y*K&2$t=8VYr-_IkA!P(q9c|^qJ2TBm~*@n+qae*Zq8PNaS9c)_*6& zj-=YyQf$PTfB}=-yE@zTr^SV>sUkXABUbG{hNNoEzb$!nb$>#z=*|vP+uj{o_hYJ0 zAZb`ggm3cNH<3y*i%v;RmATj~KoZVC{NcCPIet?^W#{Jp3j$BEz9&-sZ&>>XiwQdU z0BAe}_aKm-EK0g>#%n#+)djiBzYQoHvitE1=F-uFk@y&(eL}ZsWS>8;4y5nkixziV zp96#=nM&$-R33EQz-`w#q5){4=Ou&a_J{x*dW z#RF&Y!!afLA{#Tn#by8yskp2GGYNQms#L*NhERnEoq7c+xjFJc)Po41o700$vps8FC>q8owE#U*%jbi$Qgr|$Wqyi^(y zZRSNlIk!8^Hb_WGl0g&`)-gZXVHV7tAwDELh9QGK!G|}2mtIVTn_j#ntH$IiEKW1? zkzMF%9_>=D^t}U*SDESX%WJuRF((Bs@K9R74SHc=;m*$qiMewiS(ONL z%g)K!H>y?~dGYP+USOc~{M%7QXc;e}?OK}PL7xQ*8YkyrhpvbT?JznR;(MITBoGv$ zcD!S0MKrd%v)wF*bZl&GDn$ zv(NS1mq@RWw{msknDC8@_Y9nyZkEJ_A~$%oxHGQ&S_5vIgx5 zQauYbBXVDAL1^XTq86bj_v6}95OAI)ckUCsHb-I|YG6l{2U2btF0ck}7Tpzd)dD`LR_<&qgJjQtj{1s9tlMOUHAV>HF1hFwO4?4{$ z?}HJzmDL*Xub0`UpTmY-#AsRpiYo`{HmGo+^p1&+F2$OF(76AB>foq|;*kxL0h^wE zu)RUUHt8n(+I)3wjf{cc>nGZnf%3a!Dwq(tYN;G-pYQRXKszI69{re9RXaaLAJ*`t&cgTZXk{jVP^fa(W` z{bKe{F~6d_m)8XL=3MvmTKQ1c+2<}!uc#@ZU(@|#L zp#z0BmdDyNhx-;;s%w)f6_N6 zu!9F2?$3~V#Qg$fHU*TS(8LEpOxW1igYHML4Xylv#d&S6Eg`_iC!3@~apy4={kA>`PaDj)V&3hyBz=yVY%DBx2EC#$v^ z)1j6u%XrtUGI7$E!TnomL`wB?(9ILf5gaVFP~ zb04zOs!2ix42(Kd;LVvvt8CsajZcceN$c&RxE=EXt<8~@KgKKCta?4f$`Br$$!BjD zk+(yZ0`A$5azC+@iYL}NPH3G&#P6@SWT5(VYCX3e7KfN4xi?P=B(Mi+{?|JR42xS4 zzp>Id+~l)R$Nvx;7bn>5iun<`%(ko9HVmQ&g+tdncOY%A#cF_@UNBtcg6}@p0g7@- z!Y6Z0%A;4eIS-zE2xQC-vn7?ab|;PIpFpQ1kx`-C8dEBHL2oO{LD^p0e5)gFB&9== z>a}KR{_vQGf2}LsDiO-F7*w|5DFqjGPbPU@&B?kg>}_;$)R6ry{hjaEm#1y1%FKYT zrW}dy+o{I_rZRSC>YKs1YKHsL79Ki5J^i+lBpMM2D$-X~FS`hBwX7Kp6glz6@i^N( zZnQk(z;$I%;uRy?Vp7}_d6YH$z`O#xC@LlXIr%4>zO} ze#&bGbW?6T2`WCOl`p#4@h_U8b*_xG7UMO>CaSgj$wh9JR8|3*)hC?<6j}D@&ytj{ zr9`ab;^gsY`4O4jM^sNFuosKUr^xxzOHqEC{z|fa_FMSYvkgT|1}h#cvtx7aw4dss zDxu4nJ8WYluYW$nK72tF`m=hrA%W^XV*>bp0eGz2_O2L(;qB14q*EuK$U74>TT>Cj zzft|^C?U}c-q71Q$2yJ`CwlF=HkNmN;iW{)nPaxl5>NE-S!xmMsz3IF zgg`e1M;!M>orZ}s35_m>-V{y2w@3VU-+E^9#S_YZ(snYdYMtRc<78pin4iPY@Djpf zvay$mSrqeLT_GJ-K9*CnhsIZ#K1W8e^gA%< zv%8y>&3RBaIy*Z%J#9Dphvf$O_wSogdlO?NFDi2|Lr>?h6Nlp^JDjw%)N|x9(SsWN zZWp%lg__q2QVQt!pDfF$zOWY}K}4fz)=Yc-XUHb1TJf zJKF=5I!v}-J&-iay}`Y-?ui(ITkCuAJ8QU|Mz5&y z5WQEEU!3hYP-%?}UC*h-hy>*At6PiL&X5WPAWk&3QoN1Cd=8l_wLYF_#1yB+7iyTf z$BAcQ`N&DGpjaH{%{K|5?{C34;dc}6LpYzT@6cU;zrM@IH##%Z1bxO<-Sf!zj?JGwd6=0Y z+TRRKp_QLLzZJ5TwAk#}Sz_ zV!Gu#g?p@KoNY2yvW^w6nM~hDq3GSpnwiPfDBYWvCV+?16v2S@(1@&3ryynwJU> zS>M^2w?KL=H*v`t@+;LlR|EI*oOz_tWl+CV1tTYrrHuyk{O zXU7lRB4MMt>{`#A+Qip)zgn3CRcIWx=SgMhCJtdZ3Y9vMqVOBUPx(ik2rV>*u!dqy5C!C=JTz)6N1 z*0~(siRY{LXfVy}aYb1cDna~>+iN^M`oD=0Ah2BY7^qx4UzdR?lqSF@AY$<>EB!Sg z68!S?m07M7T>vRS2MXWmXe5tdn$afu7Rj;6!x_|U7mSuT15cjhh~d1NKsmHe-id_9 z_sF(nCOqTQ3fI@%ezJ#3j~)`{7iH|k{8P(u@{;37CBBIltmbye@ehIUb?P9glS)%T zV}D`J5nwK_Xoda!j)d#sw^(-S7p{RR`vLK7TBD(McRhb0v1EW7HWl?CQUazOV34k= zy4oPF#B~^^BmO{ruaT$@DvB^V-|&a!yCDAn4829vhH)_KE>dX60@Lt0Qht9x);;~n z-at+5#zrPT49x-gTkAC61kNSfS{#2)PoFQgwp3PXG~zx5wIG17FP_h1(H9FwcoAgW zy5|lvVXR59E862518nLOq({NTE6PQZ6c03?Xq&r|lHVrAh~M7M9!xPP^ovz3UaCk8khVRnuTSx!&GF zznY4qGpf#T&OZuRME!JfuJ@WazcBrB+r!V-mdx&^>()bmyW5rFWwXzmzmevBVcitw zWOYf_Ba0|_%f-%$^`jwcSFH#!7<{uYz>BH(K`y7O+_#_n^zjzN*M{jYSHu9&4fq+s zc6=&}B8D7RnkYdME#L%ih7`L2M_-2YDT4H%PgPs;+~mmV$Z*I%oCFzUew!*|xMkv- z8x;1k*RyR`Mt}$P>xpe_jN~i=3r-wD91TnFwvJGlTcDTS$jg2|QCP3WpY>$1Dy zi`+qO&W@2*B5yrt!uYK-SYxcV(iMcLhhXN*@m7JwlB}fkatiU+NntY8elx>fYm%#g z@E-jed8mhOtE7rQDe-bcQ1+M52ZZ0`rhQRx?Ty^K-g(W;*gAad!z8?Bs8U9`dS*LQ z&X*io#qq>tuh%MD5ZTNdivQm1{Z@6XTPB*{f%$DB12YmgFaFc-MBtF+8xD+~Mn(aL5as==^xY>49Sl&OJViyz+U3dye{jR9RZ7q9WTCiJYMPh~PTi z$KFdSvsC?3ta(CgA>`j)YJWqK74;^k32ybjWbU;TfQ}F-AL!aCtTa-gnGHCpFfD3q z&(ki25u5k#K?(T2zJ981cVS@xhJCnc2u$6Egrh$IYx?QkkscVc|!5sxA>;@EfW# z2|GphoBS^VBwzIMZQgcy9MWIFkXke@zKucikI{|dlO7dbfU+S*G1fb!oy*ai*cq#} zs2i~>&gm*?c|;Ar+auD>f-9^Yh(niFChBTG|Gap+5b%4b1t>`gpF>M%!;ilZCjqZG z!R4bd;eU#6#2IQ3FQL1~VG+DwFTlZqFF_{9F6LBCqb{6W)9v1(((v$iA+65(^)u`M zDPrS$4@+vO#(H*|iz5rQX!4UYT=P{ha_kv@su92T55*Obn-{z{RwKcO*xtJ@9{oN% zerX#$mvfi{|BL=kLN!CdED8mL2DBqnCIL7Eq5RdKbOlq>#Uw3h6*~oHVnZ0T00Q=Z zhTy-f`jiFTUWeK~(u*?_!Hm-6!zdAqx} zSA2^f3=-f_g|M0?BRSB&VHj+sIeiY~Ds8@n46^1PfE(m^8~kSicOv4w z^6c*IbxESI8eqR78j)ueblsyNRKnxJ3$IAO_hY>N0e_d0=eC5dBoW7Xlb#FdgwmNp z6V~EGw&aL^{PA374IyRuGwVWQCygu4JuVIh#nQ#Y6e%qJF-4l{p?w}tKX^~*SKQhd zbhMKW1VIM)7HS3FI@F>81p`d7D6=NrSRaO*PW^+lXH&;F19w+f#bStQbaJqjjR@Lz zKfXe>Bx@2lQ0()|E~;cNi`N^g$nDVzock+35o%q*)xbFPBHsB<&wR_mi zoAK+R0~96g%anbVVFFZW>{uVaz7oSJHNoXz(=%%v`$~&8r=`&N=s$glWA!+PEIz4%3pofA-nf{U9W47zHup$FM+224*I=-wz`*SpY1~U zj>++Z%P1T-{Rz+zZs|!u?15-AF_gkFdPbIvVbX};y96{!et7~PQ1$}#ZoT=)e?v9k z8I9TC3Km{wCjhiZ6z?9_w-%kBK}H#fzC2-YYSn?M*nIX6D61BIckUo|3@Q!zys|s+ zTtYY1el??)_M-I4^J24(5Za;ptp#VubjCXeeYFUcw8+nQ)zlt7DJ_f_n%7e~NXKqx z%3wCmt&Hwi)6VLzmR`Rt&derU_0&y%EcxEwT8q;{5|thvOs)_+Z&Fs&tx{|@xluB# zM>&Jc#b@M0fR;~Og`OX^4D5amfD#Y579DFd!|zaWO~GI$g@AjEJzFR16U`2bvo31HxUlT{G8 z5jWG-?+?Z2isER|4KhR7&qK|gq<#J}Z>YJJ8^+(l-D2}@N5{ON%I|SwZDJ5^s6_j! zEJu`GhlkJ>M|<p30_>1>RUoKE{tDF_60MQ%cG7-E%W2F ze2DAs1t4;9hz2LJ!bNns67v}SYvWd!6vk3xwJ~U{)>7<69saJ31bv?#JAlbEsErJQ zV(qDMEi5cx5P*iBzPc>C(PjQyiq(w#N1B-g^0tUI@yTxDIbHQ<{kRzsPHOQIRb*qo z%M(b9C#231DxU)-tK7>9U&S65NO(U@Y|0fLamrMkxE1%-XSMvX%1QptB9VE54Mm{l zxMx$M3c`x-aIUDP1e?|3H-7*PMO_*jin>oW*x*r|thEKOx*V?dAzut1bUU|19JFN^ zP|}K#V|e4Axw;`>H(kBBq9Te_`SBY?wYl*Z1;-PnqFAGgi`4=VV5Ne{JaU)F0(5?? z^k0*}@cG$UgKyX$uqi$cL5D+ZH-$7g!SbV_u*y@=Mjzuj3Z#RnHOym$t`JE;i5G>J zB3mki8f=#VXB?1T{{A!pEy^}T5#e--_jrsE4F)kA#Fjce_M6*$tUS*UYbo!!ouwBR zV)gA)A}g{hSX`to3%9So8VH>#ay_OszpXI-gwB@N-m-Ih|zOG+(w+JUw?Qu|GHS;KIm{?MhsMQZf-~5(ebx? z0s&)9nrOuK22~61eJdTFZO!!x@)^>XWl`l7-_$m)F0Qs=u9Dx<8NI+cJuP1PsYPye zy6?KF)m1&c{oAmSL7vezZt~%7jZW~~y@35m9?IaAd0LL2L^`4b4Z zNjjqfX?a8MmW57BO zlx>&u`wuz3j3PgX#*o@>7(&YNKkNg!5(0{hRIoaMu}VKUI>3@IV;wF^7+U&)8y|9`Q1^SZWLf*eY35UVQ6Blw!rcYOj!&zsOwZQnKo1pDnE{!nzk0 z*V;v^*}_s%cW>=8DcdK!P?k+ILR{XQ0j{_9LLq&OH_Nf@_6`G9==F{lvKdxrs)XD& zA2xkKSG?y;VC_8i5$%~$gQOtMC<(2dT86?-&+U@lHC^guGX018&jY94v^0BW?}#;n z9u;QWx6E4TFnmL7_+7fNQB`wZlPf0T|Izf8QB`i=`}ZcKq!H;xKvcR#8VNx_ z8bPE(I;2CoTXGW;(y0Bv15qKuw-}Ap;oH5S8!x`?q?zQHc^SVBl13t%v zuZXk^VHlIA)~3)(cu+F8L-_?6eO!*p|I-4{6edfv5wwTX&u;1yIAn%Jy?ds-A?b+T z$RPQn;tsv^k6OD5db}}1CIe>znBQ1CW+ zdg?&5S>yz`L2k@pLPA2KN|jR5BAI{w4|oF&;nivTmL_nlTC{xR%2fC_`~jmGuD}!~ z>suY}#CxbhF*}0}fD-LSa1FN!JFnNF7EP`pgfw{CghH3%ScE#mf{nPqV2oc)PEKVj z-1bQz5&pftBREE8_gt%7CQjTa;Y018th50NTq(2~qr&V}9s^a{&I-c6K3zmE*1Q}QgumUPA?Y}PZ0-MEKQnex{=|?jgmw)W^TRCIgR@~HE zT>PPumkK$5D-kF7_E?AS#`SR2y(wNnxK4YTzIZd?cO1@pE1sVRfb zo+1yt=vQai*TQK^c7GZh0Qz+F6C`@j69lc-M=Pj2VW=@(+c%QZd|1HgyB7&A2p9^n zb9#VU(aMIZ_17=*C*PqqfV!9hC-~3BpOdjNEE>9tUp*7fbO^@yUU1fJL!EV#PXM(& zqpv{56Q6SzK>nGTEG;eZeFroC)spxX6LI*B5iYTkP9#%7-`fEj0aqe;U|)y1XY7+> zaueKHgZRB_m7sq6&x1svRIP<_>Rw~IbZ|e9;iBuSZO0RTpJ!piv{q^2n3wuoUi;iE} z{r@bP&3Mg&lJRz?^+l|S59N0;o)HB>&^^K>g%HXKp& z#vzf2ow+P@yPF_QH|(6R+@|MJCla5*8U6mbg6^3Qo%`^3@;|r;^Lp--|FJF zo6hV*_s2;+6YgeCbt&L2L?sRR;4yD7kL`d^Z*lHZZvPE1Yto>HgEI_{rHCs-SGYtDOK6=1j0U93% zp)xyL@(^y=I)Kj&#V2J5+=KQuODk!`eUYoCqTsFq=Zj8_X&15qM)8H4Jm~xq5{NsvaxZ;GerT0P2Ww@~i6Z5nJkC2kTl_V&cK)`&mX&y6p{gV5 zBxtDccG+5D+T)R<%9_Cx>jAP>55q~-Zd~DbtWeT-2j1~te)6P?gvLa%W|wnZd072h zjkz*V=)u-~E)>SKAkFN@%$eRu6$w7?z=Bq4@OrYu zJdf5R41Tm* zChVeBrtj0CT=#EF@Y)I_u+Rm&30`MWxxSX+5*7Ui+E5r&?y&Yxi9mOwiK9EAQ6fuv=TaAI}y!V}4I<^gxy)fHvvn4_jw{ z9^3*63`KTq#^9twikubdWkrd>O=7x@kgx{J=&xVvDNR1>nWaYLa9{FTj+e8v1|SlIiC>;iwq!jo6kY@2 zBdiiOPENxHr+Y(f`t=SU(uv!I?X9iPkLy}4K{ErQ3+TeY!En=Df5a?x9f7yRE$MnNF9D+g6qzqyP6J&D69WSrQ4P@F5&O5>0qUn0 z!vJGR=YIoQ5FVUvMtud*gx7qQZmeERyIxog-t!C=_F&`;$~# zUrk?Ml#lN-Fxt|mU{(+I3L|pA>)pUNw+|kFI=1&be>nYzmRoS>;hdI%=f>XgwoP}R z43+U{&uvDd`L)2jpS`_eJsYJQ4UfcsiX@-z7zDn3m1QE^tVe11h9Xn&s8TmJVLaRwduM>smz3KZa*F_t+IwP$?CK&5zUSJz;v z60fIM5>B3!=^%u3CVu0(a#)N>A@e=C#2B&cxFo?$eA(JT_xot`0p{_}6Znw90(ujZ zS3Kx+&KU*YiNy%*`Ot*R?+DE8O9?(=(kEZ1?+pwS$I0#(-91l7mE2(p4msRVpyYdC zwx~x`ez*`FI>E18cem^NWt>c1=xK7j4UURkTbr4p-4M3~mIO%Pj^{I;LP>GE-ujfU3dQV9`iq73_1}|zp@j1G!8{c8;2k!9AP3z2T zlFy6G%Jw!kHiwaOVn8wJSm2uVuX?xzt0Xu*VX&n_}uijZo{(OmfL>MSVpQ1O81 zUnKGL$vbCY+-g<6qKWK+7AcfimeFIXY%+z`ARQx^^%3;{sUb2phuLElE$6?FI_}P8 zcWH9+T7dG}U7^vR8)0#d*@1S6tWNB6(e?eWttPjUKbx}Ov;+r-w*LXf_jLJS%yWvh zau(H>y00k-x}>j1e$$$#csDX@5k{g4`K-F^cUJ$S_>tMCVdVSoJfYps{z(SDT&htk z7cTx?oVNHBHh%v7uXiU)-==Lbp|n30U^(v^V%SI1E)ne|@Hl$eHmNAzd>7%QXC+(I zs*#-cgCl`qdlgTS-9;nJ;Us0Cv$rF^N%cVL^XtPRC*CGO7waubvCH7f#_Oz?a&jRc zkTBHKJD(n5zs`FKw%hllbU1WSc5u- z2%MPj?rLCK4!@_nH^%R3FZHlsEU>2FRMSREX2J0hZGpu7TW%M=!=26RwZ^xveH%!N zCnT-EhUBBEMV98|Q&Us)SW!`-sN#IO!%&=OL;9#BEtMpwf~iqhf{Z%d5hPMd_cIBh z41toS)|Tw<-BtaOy}!Bn`OsWYWid)$1(;9nGuT5wMtnc9%GS%q<{@#o(q|TQ6C3CX z?ztm*0HF=?q!!aY;+8Cs>Qq7{+hxpG_yJ^^O#@8g;w|9$CJz6;exvsRzY9yEm7U$k zTdZ&|gcDJ$uU&uCQlmwiM@XpX6<$2a|5`!Onvgg+8kGuMhcV}FzS}I6(GUO$$bk3z z&8F<6l#~HhQH7m0=>)??r=9~FN+Ld9ubw#aFm-$wRqLtgUcYQ)ILK;m+&Lte)p}*h zjgbF1{&Sa*KzB(Yp53?V>tcr7OY&cTBfGq)d5S082e6x+lo>N_#gXw$uE_e13YrEn zVd;jYIZ%^_SOV*nt3j&5QnYc7&OUNcfS{yllnPgKSy* z-Z5(Dh_dtFVFGMZn@&}f((AACbDoE3he{zlvklfm=a}M$qm@2K&%lj(Q}u)5_|97H z^`talNNal#>yR!t`lkXm^ z+9j6G5+hb|PRP0tOc-teI3yT-@+cRQmIRA=7}D3;D=$US3M8-jC5` zx_61^y8hd(idS-~%GYl#DdxKFtNrw#Ly93&G5D$6fBypV2k%;RGvdAd={Q!AsKhe< z1AF@UGuGR;_g`5)-s(Jvw!~$K>_G6&zhVEpgB!m|)?nQk#P_S$0Wp6*i>JJ3Mb2Ds zddQI8W|H-Zc9xe-9_xboh3-THvSdO?21{(i(&!?9C@4bx$AD9DJc;mK#+m*$>~Y-7 zIlrUzt0u3vjsFI~vJQhhn_pG$KI&X67{SI3@Cw*Hkq2(JU$4gfj_x~z?W8pqEESHs zD3NMZ7B}bR&S_HW#g_has9#fb|IUj$E2A5qY(BvMlHs0OYo82Zxj>??26IBOwRZYf z4H>NRyDJgMtq_cP|5Ezk1l&{wscVG~bZn>_yHQJ@WAM<5{B=>rFFxP;Q8eDX>8&c# zuR4j@dLB;`fc6?XONoP+8swCexk|Ye70(TeH)sIG1|N8K4fOP3gz3FyQ=$tV^ekW! z{4WR2%S!hr*#5V?HZQ=jwrOS%RSj?J)wuX23F!^4Bi8pY?>sMS!{saN1Lfw`AXEDA zfgxQ0nq>+{WyMk~iE6R$5T|VfzPn#4eWKTaC$S1n%A)29ZJx9VLqf1Q5i2FQ=%0R9 zF=5Y1QZ7#gv9*2E(N8&Ak7cNFtgNkhl*b*BIuD=j=%V=B{8TE`6&SERIk(}`$$Z;D z8ScoGX&$o__J-DV&(hK~|0nSo-N2MNV;hgI+{*`_I7}zrq%foL_%uCdFW~9#*O{Q8 zTMI{5`G_nVqQRej$K;2*L5FFqOo@pMEX~cOAy7t7snz!+^fr_F%y;K}DpaWCDaX-! z4Tr`fsZEC=)|5X1vaw;UZNk){n66Gv`chrRj!s-n&%K9*<@oMibQX$>m(~u~{_Ow> zxiDB3<-Z@6iW9*r0?ImSG4Efse?z{8RC*r|Y-2AXEUwDupWROiLqV*~JEYNzk-mR9 zL~xX@_}k1{%z$Kwl%Bjv+K=RI6jE6^RfOilne2}Xo zTT)q>4UX8$0F^@cDmPTrYpPwT*T78$$RXAt=$qVNp@v*xY6oqz0rOA!gTlbvnrd(^ z^sLDP;U;vhtZiPy(gx9_OXNG}=gLq3uxfPtx#5HSl6L_D8<@X^d3bV>ti=PoWT zaREl;fPiHkz3CNRL0_f2)|T`P8g$@OF^o^*u7xOT1r~+Zo=S_1jGUY*D=vVUm;z7& zP_QbX#Q?J+SfSaM|5;S)C@FUv{eJk&LWix4Gu40!TRP?*f{Ta3e7dTb6V-pJv0hm0 z6-i>CQ;e;tf+WQUvAbWC1tmcq^;jTl^RF7R#67BTT)xmlWQdm{h^Z!;aNhrPzodro z3yRbh!tnPy)ck7xr-ZUbxz=jTt~kxV8b_TFo*H8f2?_Gl&+jM5 zX$LGW%=Uwiqfm(( zCb8@g(EYZlZD{bAtS~6nDEatx)z5Fk?@?BZDmCqMOa&>@TMR1fp`u9U0HO1CMceni zr4O5NH1dq4*dFjplF%WJ^3u!c=l7T*BC;g<&B&Q^v1A8%UaK+R>r$&&x0I(GW9X&I zC)E$#Zo>6{BRA;EsI1}Mj988ljKz)l{adOELx(7}6G<6_iA}mJGmm(T`HcX7d4P)* zb4|ag+ZZk-WM)c?;Bf;~G%Sn5^a|M4ME5#Lz+Geuo_V+J8Mo#G8od`#V}jX&3g|Lt zYuWZzRv$cKZgQwWZ4b`-M+2KXJJ--UtMxjuBZey+%m~3U0nb`(c{mQ|N*ZquR}@^30YcGOULKtUs(K$#X*~C>zhc%annR=R z8STl07#rI$s6pw2M+RAp;hZk`&GsW7lb@%s0}PftpfjOifcjfe| z=T7BxM6X=}588{}JN)8`hN-=eLW^|Muvo=jDm=jFBav1AZLy_TO#gw#cZj+5aEG5L zp;(SKs)y5zN3>y}1P4P$%Y8OPna+Kk>3To<`uE)A1z~KDAT2)q1{mlT z5VoN`27Aq>uMFEAJy;abXt$k)yHBFt>kHU=vQIl%f&FMRy}iD!TE`B)FFLUN!Hxj~ z>KpYm3_{_`ou(vq{LAEq5D26uh&s8UK2u02E8{(S?g}2#8`?y{1rz+gFTpgTudZ&A z{!#B^0CEnrA5bDC3QFEot%1Hh4{k6*O5^`+ZsuBXLahrgGI(;IF6jIeu#A58mw1bu zw))F6`G*e0_mMQTM!)}Sh_BYYb%tmartZ0*^+bph@{olljA}S`(6a8kS~LIu@HZYh73F0}FHeuwbq#PeZl zGVljCebYSYzQhIs>fw zBnoV1UoL3Z?_)JCR5x83AQX)RTKC!6Xr`p<#`ubbgk^r{=G;E!qVC}OxR15IzRp%o z!VjTB?xJEIlR~bL4{<}W-EcVvQd&-M3HZJzq$U7qQDWC}c??Jh-tHU0G_=od;85Vk zidhnh0SSZ05#=KUtd_0G$`-J1ZP>K~W92DiltN|4vkfCYsYVsRbC^WB*Zk?Rg^)shnpyhiF zl__o>ocWnvHq{kPhf!|P^dBJ~$W5LLBnr(Hcb|Qe>uF^WLm;wB2ky*UGgWvMd>k(+ zvcHx6F5YidvCm%$ORvG3C*Gj)Gg=WFwa2`ovn-a!PM|tXL?xS5jxnJPe($NPEMvg? z1O?ScJ;@$4PFzs&c?Uo^oRLI6g-TK?lJ8@Z^N- z?wvng7hdA~txWv9<`EtJ4Cwbc_WFkwxM*4R@(yZJ2OnEO@G^~cB+8$9lCB(nQ?IUQQ52e2HA)}@! z@gGB}U+BJnJssn0T13E@7>3ASa?ah!*~!_EopbCp;>TH|M&40CV50LRMcRSUqnv=pEPKkpa91kS}0}^9p)yuH7(O1Kk(2(_yC&fy{1j zq7^NH<10CtL%+VNxY!C#5^Fa$h`+L#fn5m-6hLzQz#)XU9J+ch!O#PqxAmWaM&xj! z_<$iFG60XD_lpDsLA3LoJ9nVD4YR;|(0S7X2G!*@NWH#+*?ny&;{-lPh;Yvqc78e= zSzKEB5?Z*>m;>LL$a{~u|7{>*+5(i(lp#jx<^s>`zjeW$Es#+V{sqy#&mKJ>jMvmR zkrvNwm;R(rLzWM<6(_j0X1+J^vZt-$m0ig3$zh8{8#Q7f4!Z-9`eOYV^GH#8 zMqS!S)T;g4^|pncUpsOOB%D>~a0A7nDD2dE_$_V2>*D9cAMf-eAMwZQyh5N0i_b*iQcJ>oU*nD{m+?lBqwj>^y@rlc;#?Q&X*ct~#W{R9L}1!F0DhNs8UxT8-HimU2>4YX%Wi9l zF4^oxzXaWRxV1xN!oNozA6j9;3ixQYF`+ELKe)u6wAJde&`G&wI31?751dbkkd=iBT>`FIF6nr5nDg?rA)S<|c zRPK%w%k}@0UBJj6NC|i~UB=w~%oAilh>CRf-JNd(c?#f4d+=b&6G++{v*6XEVum}; zUCuf^e0kLV6tQQS6k8x{a>jtxsv~f*GgKZ!dZqTJhqdynD5q(6htV+Zw!>uKXd*?& zVERvW)+zB?7Zm@~LERb08m10z2Si`l5st;Ti7`TC>Zn9S*_^;~QFeJX< zOicJk=x41ONy?Fg6s&lr4CVo1N-<9s#KHIJSV0mc{jOajabmK|W2h*?y<&ZcI zfD3LeNy1L1E-n)|x;x*te6p`Q*VqRh(2s=OrjtAB;mAg*$^MA1;##1ea(ss1Sbc6glUD%#!>0b5b(}Uzq9i zF+eYII{@+y@g5KT&r1}0aNGDSo-!d`)E<})SUsk$&a2+Z+Il98?>{w0Y!`wMctDA< z8<=PjVq+&~9Qa|kC36E+)lg?Xm4SS9PzPP2-!V(%k9Fw7$CQ3$<&VuCBg`M^4GOCe z5WJV`K=^u`&(sg4k%o}IBQ-bgwWTqgyHB4MF~T2HT1M(K7Jk~V8df9_o#(aM`?piJ zHI~@g#!u~Jew-+1TiwoeL@YjZXI9e9kePvRB?gPNp{&3ELCdLl^Nj-+1%^0{P=5=~ zc{_hiW;OeNS^#fvBxRVmbyQ5uHh2o>ntk{dwm508A}cRvuge}*x_If!Fun1galIA1NzcLS$7cE}~?5{G3 zJ}zyK6N$@9Ks?bd_VJdzlwRd|-FGIdP313@dYf>3FfiyGT{!W8<#d_5 zbGdblxDp*P$dSC&>}aBIcu&Pj>YRnAobcOXcz^NZh}|Ff!ZsQjUG_UVkc?{;Z57amgbZD~ZWCUZSChULpH z7g;@Lsg($J)PBkhug<(X;A`?jz+|#sIt-?yr^}vZ>jvj3=enQ^1M7IYW$3k zx)6vE+XG6ERp5>;T|4yr#($Z zkLhj^OnOqcv+S3lxj%8zVyN|E|CfsI*IBk+at4{Dhj#^Y9fR5jao%zMkmyeKAa=yEMu91h zW+We3?Th@9yi{zlk702hLRq%01b-h3U2Rs18yGw}n7-au`TMsV+Cac_0e+E(tLqp0 z=tgnx|KrL)?+-v*86O*7ZwIt^ELYC?om|{_FHFDt83zQ8YneFpX=o|-Gsu3WyXB#D z>5VYOQp?-Y;tpSRDplgsJ6n$XmKQLYOH8WvPDVyi`75zJTW!8{wG~4{kEDmzpL}e3 zH+^R*!XNREtQ7gRrMvUqWZ&$92bppFNqycWKCL#}=$L}Ib|E@K3E^u8aqq*)rsCOzeAAS+f4N3oF0CQ! z@JTsdiR`qs^j6xw9<3*eW}xOT!{SvM#;prwk*fVAMyPI2iy9rBO)pY^q@y;%?q$}( zFfiKEK3Qb>{qn+6RZX+gpn1#)v8LzNjbi^RVrkPWZ|p&E^Bbj9`pH4{Sg|0MTO9~4 znY=x(9WTqDW#^UGJAOjm?uIaLfbkmu$M|5Z3^MuK0(pK|4%8Oz?xzq63D;Z*tn}Dx ze8Bl_f3(Hhr6V0rs~2_hIR<8q>vAXAOAJdxRXWKKjomeh5>94ik5t+293I4vE^DR9 zIAkxm_pC7M1B$5c+GZ5tA|35PiZwV-3=sMRv|?o6Hn25skF`wVQUi~w#gy$>_Fzeh z6t9(tuaHrgwK>dVPC`5VF?ZDfAwkDUu!f!4GKc!8<#4QOmAJ5j5IS45w299lfb}k8?^(GUPM(_+Shb+jLycJpu zVnQr23{*3|*W&#orAA^t;wKdq@#Z7RD#;g* zLYr64)oK4^Y5uadtsiEUUeLCgQ6yFFy1grV>qVet*TVb^FOC#(whGbv?#aN=+BfsQ z{034GC z1wt)wSHjF=FBB2;{-oeX-LGurN3>vF=0t-PdhwdE_(_DPie3jMN zH=22s91Rz!V}V8(!1cHjGoB@DuI;BO-<6X^_*Te6`5Pbj96Jp&z0~kqlG_n9kzPQ z@=OM*@t>6KDnM5k6{Wa&L9+{dhHm}7%t;kTQ7@mNFMPh0AxH#`nAzvGZ0_|uoUxmu>2hwUa zZWR}a!uKUKf`^!FtielS`6_~)esPrHGM~mv+Yr-VD2lW<#d?b4%`0Ycta595)yy|t z?-+Kq@=*ri9?G5udS-24{r^w*<~MJ3LdSH|yTC|yvFZ&K_u=)lwB~qX4-q(1V`J^p z&y7Xj?XzR}M?StY!zYZ(#bwTAz8}|RgXx08jWO<$+J}cWIFCFaOr>y=GFo-`U_w5_ z)j&ZUxcITn#KY#8@lMLrWm8@z&F?ar`(X@sj6<+Ha{egkf7>MfNhxhiIP(nol<&R# zt9j}yI~D#aW(x-|WwTPtYO|~?&6G`+WnQf8UW?pFtYt0EegnsXuh^J51w3N$HKco9 zC$j5Y%4u)<`vojztrG}xD(sG%PQ+X`5(cu)+Lpx6V(Fq|@C5}0-CSLVkiwrJ$tR1d zoelvV!kry)P&Pm{5E2?n({q22v+>}G+aJG^OYMgSpuO!9b4HY02MUo(F%v|+(m1E3 zX~HD!dGQu0=3FVJAj``B#9^_7HpNr7fO8~weqA>Ap5$o6bA!_KR)zoR&|iVWLubkcDc}>hLLLF8HB%|&wcnzpY+xc%I}}| zW1h*&QE&5Mt;{Ti)+(9uer4g$!p&_UVHq1->m)m7_Qv;@TB-4r52c=;?_8rz3}-CN zRn74it{20|LpoH}Y$H(!F;%&V<`X@biEZ^7YMYIQSBGBG`u%4J@b6oCnjiD>@}Ri~ z*XYJZ>g(e5zki{p{TKW!R8)CKziai~#?elE9adJfHMKRzs|(Opq(<#VFvrk8i)n@} zJE|#Z%jw>dHQnAS`SC&XTya@3|4w_L!|e|rd!&Cj_PL<_EYZrTtbf2r(l@xEc+OB~ zx^kX^vc(@!lQO@n=_c@d@&gJ@S2UV88yJpEk=!BIBwN^ z;#&3_SDGIkSE*?%@*R3b(yt_o@1$1#+`~fD>0%NhQSh^yYG4CFqg18L<=F*&`z!bSZQ#S_k?GLUxX*Ij7Gdh6t2{vSU%4Q zeuS#(ja8IelzIE(bk%^Ku%<$g-QqoY8MBniLexLohU;7o9B#TxUYjqxh-PS3H?_62 z?3<5Q&7M_yZ#P_D8(tsz0ig~TA0MB90089B7a7TXELi{Q&kiMYxW9e-2Ks=yI>ASC z0(B05+FSk|#6mLL(E9>Xhz0o%dzmBr5!$lHQ5avd{bPmr9JjA7Gp@nZ-nuDSY;j@E zkBGtJ>ALJ@Flu_+zcfbwK*FhujMU2LJ7%12fYZJ53E%kiqGx9s-e#rx3dIr0Ho=0A z^o&@xURZnbd@usgQTs6BSD0~e8U4wW%9dRklC%I$apV4-SSNh^FaE;XUCDqnCVBq_q@V0i+LL*bvN9*)M{pS?v+lD={Y@) zPYDr9uz?6BVEA?!$(Nc zox1~qTtW0$5;B{lmgsIVE6Vh({_bzzA!OJQrE#`3bPuY()Dt3T9zEr)xUcnxIt7i| z_<~2CIq}h>a<`eiFTk=oy1Hobfs6)R+`|>820$f(;1o$$+X8kjctzd*{WnlCiskjzZi$Z^PiDU+n5{-ErWiPFNC zw0A9J!U&*lIj5QI`ee^(sA_8q8Y*~`^T0n|ODP7>f7cc?hW6YGb#-1ozM#Mh?uk%O zvA+GVeEf~|XJWG-@+ATuW8UxF_1kR4#ZA}yULB9$EPVX)&%fT+UG4XrRB@^&RIq9l z{3Rv4pGQQ^@f>&H9Xo7%!gr;7O=f33Q=yE7^BlL>x?`!0lnZ}BHlXKj^f##>T($X& ze@zrsDB&~CxuS$9cJqQr4AycP#54b_y);=NbLvOf!yX-rNa_2-L*3o0;#W&8^?z$Q z#jZ{XU><_`?OUv}QWR8NH%LdoO5)++!Cw;k7to&k=P%mq*mKL%t=(@ylJHJsS8;JM z+{&SVgjf2anSee`UQ2uOGv~{_u953P6~E2Zf}wKyl*WrUc%0T;i)B$liPh$6#z+S~ zvw&SvV{Am!6P^F)A8B>Z>M>TO;C6q=4Roe9cOn~}T(l#Y#=1w*eijmmLxtFtXfAN{ zrcq8m=1ix~J^#XjQeZ{F!TkuG%W$EFq%2Ysg_@jheL$Jmfs~Rx4!vGo_fu7c@|1{N zHTGf7_i%5<_#1YhzVDa^fRoeG(jW{EVlrduESfF))()VX3SH&L4)d*mFzl;!$U7ZN1;%s*N9E*I=v?6X(8h|Eq*@TEKvxLF^Jh1z1-#PQ9oAG*jt z0k;(raFtXRT3;crtG{a<_l~_Trj=gyCq9aQ&w7{|y(Z?N*C6hxRC!I9IM~s4=yW5O+*93uDom(5+p-5ua%gIlHuyY|{b_puw zGG2+~p%8Lok>^7rOs;)+J=d}?cfBCk@^6qgR(!8Bc22CmvU2CJw^!Bg=4s*n2oEd? zIA&p>mYW-poj)+rvoa-hJ-XSiBmRLWWk6X;31ngLs3<8pbRp%LGbl6C@ABK~eB0}O zWB+x#WUI9F4Q>P8{3XUTvrGi`7lCAJWjoBE`svri!D%t}J;T5c{${C~i!vNpmzleF zFQCThp`=g}GYJn$!eZ;Tjs*{v`k2|fwE}P@n765Ym z2Bq4)jCz2(XJljyWF^kEK+yFQkkN~SzTnJl_+hO0l{?&53dN3!VTUsUxYf*;or@c- z!VRx+T3Z%qi$sH3CRG>rPx6kT_N{`Vz1`K&Cp|9jAtw!$TL2l#H~r_{7)j@9lKQ#%e#8 z=lT4oJ>aOHZ@eu~Hp`}x&Y1MA@C9MP?kd8eBY)A76E){JiRI15@9mN)|AppB#xO0h z?Ywp}vh@y{WtfUw`Q}K5FhwRSfB(Q-zqAX@>%`Hor#R{Y$h!8U2VaM%het=LH-%6Y zwbZJgIJp$zedbvqJB~Suy=%_HmHqjB&}LV+g~8YHOzU>);8(5a{$RlXxMXMaiVS-= zxUG9^>4IRD&VdP8MRX6{FM5K9n|m)13|^oHxB+Diy>I&kV*T}XivF-vSPII|pLdTs zNy)%wG6&wBEYHnieGalu&y|!!AyN#6K5js36kbEBALEyR(Zk+n>!n2&=lus}#zO-$ zum?a;73?3~cnAC98D%<63|QXG3Ekvq(p>o%RzCaVtg^|!(uhTg+5?-Y%8iK@S+!Z@ zE{Kt`gqG=@ZuLJP56gO~dkD;dS^s8Et4-wa>3lDC7wTeNY5s1CcrGsQ0pM}PX}m$- z&eXK?Etf@~mMIX#YCbo7$!p5<@#vY-youSGZqCgssp%hHbkJ=TvH!B(C~Q|2H9_I< z_#QQjQC$Y&&j$w9r*AtvbkM85<;HhTXnkq19n_JKW2z^R#``l!gc@r6psus)7VY#C@N^vla*(PjVS2Y#$KNwT^@qdwQ(X)Qxosr1u#lKe&b-tF zhul5G1QbF?0#^kV^D*=vvgpC$X-XhFI z?ZK%GANmcWIW#0Bfc_VJj5n&mO7E2i8!qYDHf_y7O)=XcUpbRPH18Y`|DUoIXOKQO0H}t^CdXil#Zs6 zdr0~49v2VQu%aKQ?>QlUv+g(R%aZHUFB)H(>Mh&V!^SpGjFz(P{ps&hU-cK#=d^OJ9&Bh}cuTSP&$Qyky>w3e zOB^S}9l_Q}^*2?In87AOHzSH^@P&>%+t$5$lwSk)LE~U8U^~-jwPZfWiH~=jE#l+k zP}S0M?P6~~QVgfLXDk6Ol9qyof{rc&nU3sR*$);q%y?Ef2EA>d#_<360;%wkR4JeN z>K>^L~;0%88_eYtSI5V;>cpW!#(*Zx&Tb>-+|uj z@AYmD{46b9wmYYxRCF)yRl|g+Fv~OI2y{7|-V3*Z6yd0>JoM|Aj+fU3*k=Apec*cX z<9vly# zBNfh4D=H~D|F7m);(bv$xQPa^shjxzsL@v8jIe*qRk zIXu6+#&WdEQkeFV9eF>##P4AxU-Iaa;dx(NRHnc@j?HQ1To}jsia3IFxAFz{d?~qU z`IOozMumEHiC){+R4hv(xnxzsk4u3nSNImefjr{z@&f$)g8ckcttXco8-0C!;d^`4 z#eLy3N*vkQ_m>Zv4G%BV$>(l@20C8g}8|0%z;+iqJ` zi3k;UK5dH(i(>3C=B|=DLOhioMjC>h_=3?th#z4_ebdP!LCtQ82TVw>O&RKFAhcsIGssG zA#pex(&m8EiU^lkoc&31@V?WFtQm<^Vmb3Yg%0jmQzd6e*Jc#R3Lvb5#GH_+!}1jo zWk0P9YKUBox^a&|R38os{b&2mm^H5N;!|#4?Y0VraRYTf(y@&t{YJ%DtLe13qbNb( zUoG!V+`eF@Pu;FgX^d)PWQrK!bub(6=sc zB3}xLRj$NNToRyVdJ_84nxfo3M?q6jYwl0eUZGf`0^Z z2xoQSVbPQ76Z)ULld5;aZ^y<`CLs)%VXhx?Aqp~g-A3gg2@QQ5$|MxLG##Tsxo}rF z5g#9$!+4;tQrwF)J zL&BtDD=%R4GAPA>>ak7ulLSXP<<*_H+*9BSgXDyc>cGcK6*KKem5F-!CjF3O%H4~`S4$83`6#ztPsTY+@ZWmpcPb`U6#basAMz;O zG;j50vckin=gSI^gVp}C7o(h+2LU`XzQpB5&!8E4+jz(R+&9BTWe$Lvwu;EHR2(j=`B(q}L4 zW_gQoIwHypfS?EvNY*TOWBARIgk|~-`vZno`!|7gk*+b&HfS_lFm68(WyG0D#9n2D zss;34pdqYtsKG?L)M@Ug6>>UVUs}hVPix|9KBs>8xAn>((EdLpEp3sFp5o@Wj|+jC z?{70wcf`z%Ru(>7Y>yO6aZq>?O3h7BV$7Jat zgf|#aG};>V_J$UBvJycmbIQdY-qt4Rdx+`}Nf<|mhcj^df@^-l*@lh41;o8weax^c zsi+X>2DL~(CzBS?=AnAK1jKn976Pil!}m~5jy>a4E_fjW+Puz`=LjVwCGU-AhGT9r z5UY0ss|PHYC4^nbsdlbDI^!V+Qd804hPZa^6y$8)rR4o08-Jsy4wb!)lN_5WA4ZQ;=ZSNzwjY3+Nb+v zj|nP8Nu%(yPP<5G>MrTxcOt#>QRkggL~5efP30)R)z?VNq_^Lv*)e17>eZK)NsanO z`_8?Xi1mO!tmyIM)A$N3=W@eG!h7C~=&Z{r5u1-4Z724F)L0R^POy z1yKt)Qr9Z#pa~_0Vc51i2$#N+`d~RcsxdJ3aQpmA7?WjT>eNx!DZj zaAkM)5R)s0FPAQr+~kk#y=t?8WFWE&k&8xGNVA>G%NSz&gmft4KW#Ffl#Co!S_Nl! z`)L$aM&r+=oK1N`yiI=Nz9fJD;CzLu$1{w`K$C7sBPac)yAQ}nhytn^?v&%c8=vUl z&A_@_XYz?sG1%UbrcF46BS1cuL+qlTwWsMNnNzqff$GFSw^1B2aus2U5Gq9#{uqrW zG4{4T#-z&w#edDW^}d!Qx%o^tb8c4gXbMIw%CDGP&*E-H&5G2cFN#pVlT|9HU!Oq_ zO%J$6eTo8NY1pP843|MJG(=iLrX^@-Vl(FI)`f3qRTz?0-~@xvcnx-bQPG*%Sp%r^ z6FM(X=B~j8W@}@kWS7vp;sm2oAiIUj7+YJHz=jU{KWi94n!?!PQSgc_U zQeF`6V+BAaEu707#t=Sxm>w}09jA!qg|7fQ(;O9_{~nA_>A^OygVLSS`2X-uGt=|g|z zg&~O;sSh<_NA~{dzvULP^o4<5OR0XF5B0sZ#M_ELLUIezvab!qbZB%Rl<`Um@aoH9 zZje7>`DrR;h_Qf?#1)3k^emCoq42rUXmHr@H@!V+Lcy>DRxpLN$xM0?(7M!*lM0cW=*p3wlpul40tG;ARWIpF-#; z{Y|-#Ab^Isk{H%2I^o~E{Ca`Q0uOZ% zzLkQ%=abpJ$}}v9(&xXn=#X4+&xTXn*udfYn&QgIgHVvE#fcrOJU+%P=E=EccE+3r1ogZ>KEsSrD&k8F5v-@t<`M!Y{FipuEMv$=S z-XM48Hih7d_sb;KXW_PCDiUexB#_YrF`yOSw!eb0WbP!ET6mxHdY_ZC`IJ#SeewUJ z>Ad5qe*d_CaB%EnZ;pe5Y_erV_6*s3g=`twD?1~Z5kf{*k-ayO?6UXD&iE4d<#*q= zf72r!pU-u@$LsZc-Dh52|M@2J;uqO>82I;7Q&UMvNli3B(7`PTDW?Xx-5?Y6Hy9;@ z_zs}&nmBDCpcOU&T5iwzB3s-4jpPzb)Xc?KjqHZ?UcJ-K5H02BNwa4 zc^g(!Xizm_nDa{P<-hpiKF!;GHiEq|p{$)zsK@A}G5Jovsp4`fZNV1N^V;p(#^%|& z7`M*{dC`WCBf4-q5J6*5pZs(x^bU*gadFht?cQ$Zwr$XvxZex&%;EDk zD3gF;%A7#&iMO3NJOuUbydx~>dXp@P_;HV%sX|b(ktG`RTsqZg-cDMnA#AAr$xd7P zJu+>|WUAN1{)EheFh~xt@Og6KfjT)1aU|&q0$$vIV>8{*;I(lgGu7^Kqd+~!9lW;m z^*Lxrrhste(mtoVyZid$@IH%mBmEQ5N`m*kLPS{D%zH`?RB-nbS}>dmLx5mp{IF$^ z#oPb}K4_pOKlz>kA&Kb$0YfgWfA!nyNJ9>AOnlH3>Hdx?o913|j%CnIKc}W=lDjl=ZJfRx7u2Zh@N;q-LFSO>c zJ$3^_kGdm)n4jh&H8*obOyJi-oXn(R=5!9`w=v{|y|f7R9c`J;$8v*4*$_PC)DN)` z`?@kRQuMyJf)BZ^AVLRG;-vHEimON4?CK>0zPvo*N(R_U9qi@~KW#X_c)RW4mH#$7 z`z1P0aAcV(HtwJUH85}WuGKW5tKaE~)_rp#PDBKQq-aiwN2z0rvLbeKY5XjgKcS5( zbURK$`cQDg{)kR0o)5!M2O@610plpR&;Q_Su4PoQNTII?gmG?wy9Yd@HOItsi*YZW z6_im#Gk(i=dm8>6I> z>l9=nKAUA3M#H4979E$SZnIh!If)z4B?#MMa#pjJh)p9bB7e-Germ|;v|84=n+t|0 z&is}pW&YK?+6KOpl#;dYw3V4j4C&MxQIN=x3JFd+Ef|+&UA|7_-naNqTE`>rh2ocy zk2$9Mpy|pEwk%PC<~!qcXf|GxCY+P!k{QUfpI&d!S9pV!Zn zZ3L(pQWE%Up5?sCEy*i0cjFs~j};fL4uL3awE$O1X7MLKkzfZelaekYy{ ze&_dW*S;q~!w=*6L7N1!EscN;20TCz@WP&I8W{wGxt+nA!O2Ooc04O*=Y2rNOUO^E3AH){0 zSER3Q4bL{Z>CcP4|4!o*?d@h!;lB)%3(2{8uQU!hc=YS5;aoy>vB9X@^Vf1OS=G=U zn@|=f5;aKZMpQTw)(cEU+4fgwxLx;-7g%^*GwZiLR();5;G+knZ6})vu-^!&n1$kZ z$Tm1dPzz8|*ViHOPUjSKtav|Z(It>$d!z_sQ;MB!3_KtkNF#L1wz%}kg)9j(jc2?G zSibWd+k;lf{q-|gR)`HI>>4+K@=oP%qFL)Fz%9&rwh_3HN|3-NCS~CW?m_1fserIN zwtu0+ATH?39GA3YY&4i$TVHq&{Y!%+g1k!LQ#*Q*0yb4|ZnxjaF+eOVEMyiLa)&qW zc|d^95}AE(g#`7m)RhclI9OHzuWoz`PF;zELYsy5%|?~lp&y{OjQn4Exut{ z$4I_XS!ISJW7CPjZX=v-{%&`6)&iBvinLJ^$UKX;kDuo!5z9s|(^~f4XQ3v?IGQud zm>v)L7_uxRX!=kc!^BXA!Y1ITX5vV}H@Ugb3?kY%?4ip#wyDdjt8mpg5~TVf zMO?!lmI#ahn1Izhtn4%4S8<i7-0tVcg>(_)Ydc z`{uXyH0GoeMu%cGt+h2fdc%5(D%~mlI+zzr{s2DB_PlJ!D1!4@WyR;u8(WsA*0h(A zd0gOB0!Hi#Ac^5Is9ydqvb2A2V7LAy?_UK913ZZ$m(xmMKUfbkx$aLfJ2(_Hj6V*k zK?}3<=TBPpKLE0UF=S?a$jHH`Z(FWN15AS4M=fOntuQg0_c-X zn!I*0%fEpSe&)eV>9GBMFz$D-=KvEY(2#DQojnZPMvgNxRd?;ZB7g zvgrLQh!lKc^tG@!N*S4sR=%#*>cI%!Ei$Ls(rZYOgwqyLwfxtZg+Eo2Uz_)hq4IZb z&e$P#HqxQ2)GTP|>#h;>^2DuV#4$puk>bg}<69j^H)h= zTm<~0fXBFbdL@^CUkrj^!5SCFpM?l!D{AL!6zo{Z*y3{ozC**T%Sg6y`}1rofuIl%Pm^dQ*RciZhN#%)(^O z`Snvid!eB5Cl449_MjYnW@$8ry}RqvMuR~~h|wx}Aj5l92r0g!Leug_?KoXh`q%K^1uP(%`>rr!Qpy8Y8HeR~X+ z2LNnvzbi1o236sgQSm*{Z>+qQJ?`lS?4|<{Vf-d=-x^$Ez{_$4iq5&Er7?aWF}Syc z$Rle2_z&b!l8%Ed<lM@)s2*|W(@#l4gRkD1sn{dBv>{%8wPk>Cbs`BVS6^(;Vid53295v+^Of4d$6w>m}KeGW1J1B1FI43UwU>30I?!2u`A>Xl%k z2{^yE;D}hHngEcA#<9SI`?W*^a_8Wn4Y<;UsAT~7AJEnA>2p-KQunF3Y) zJvJ(pG`wVIRyL<~L25tc4N7d&tF0@k=}8( z9LZf-I0I zpYo>c@;c@gYnnBZJ$~UIeMZQhdbS~>N=k@E0v-2YQei$a`_}MI$qn~8BqTqx6uUVX z^8>?Tx4T2lLgPiABE2e$wY85~uYpiPg>Q(dRd)dqS5CjZpy_UuV z(>IY|Z-+??NOe!a`)RkY(FeMa`vY4r?+X8!AQ%zkUC(cUS1AwV$bxu+?@%p0J)i`$ zHw7~R6F$(V07`{_?gcoQ!MNh}Ap`kJ-tCK}wtx35q;@V4k_oiR8@XGLPDcd6CL{Kd zkwm7Nz+KZ`<#h++g%}WyL6J{4`l!ZEf9{+C3;BIA3c&6(2ZxT`5ZXTI4tEkR^7^jA zQTgVnEKKwom&?FNbV{r`_+oX~rP8qe7X+&w-NLeGm+;#|#l#WTx5miAHun9ZErz$q zFL*kdzL23%isapo^Ck+CTieBHVfijHvNE#p%Y%K376bw!4{7uiuqbGrgYY4Qf`)16 z-eqftU6ObXBsZ=jX;WpBiegr8E0Aqktr6o^b2Q}!RSu)mAH9C-mkDXluA9kmvh9dE zM`!drBer=_D8}+}uqj~T5B;J$MLO|Jpl`e}X-*pXvG=uZ#{LL1PYxdEPn-T~ymSmj z7)F-w#BNHNZzCd~xnH-ndTy8J(aV+j28tRMc^}ME`UEFpLOICMX~bu28b%h&i|Qoy*c7E}s$ZsnCt z_bG^AlJqFx@~HG_36OGtn8cHf;rn1s%WkZHds?|-v*2R~YeInbxVoSLSSmo+0m+D< zS_3T1wCl%T=Jvq~_$v^y7HWX9Af6wDqkw?~II}@?y{VpF+7ZauzVBYZI=K~0j=^tP z98i3L!kL8xXe_~@VN&O)r>KbCuBvvzkp@ooWOKS-fbSaI>yLHic5&F!Qb=VT&kvep zb5P`gpCs&GyWAmvg%q3Q+o1=Z&68owurdsl3SrL3*R8d3i6gjZqx^j}`Df9bgpv(%+4Gm*k?s{pV+^4W z0#gJv`Bk_s{nm;}4%0miv51JHp~!1vVnS(0bT<***s4X`X;w@9*`BsOzrg}gc^B&y z28|;40cLKtAkg}~4aqSNSidZ9{E!rSp-|y|Vbm3PNyk=CG5)<4+Q~e?5?f_iK|3*M za}tKflkrOZ2be66Szl`LzKEu>27Cq(#4Ic&B_$-JARi-N0GfLsMLu)S0re1&*v$b9 zCeVuTq%$MOPQd^Y=m1G$X)m+J102!Sx38Ix{vp9FqSu7%D2N=JrYvzRD@sW%u+gW53x7@kz$ zSbCqC8UC9iUGGTDxa=TX$R&n|YUDt4Czo5Cj?V%o9+zO7y?Q=Amu^FwZiGaOB4>C_ zFz-uuE%-26Q^_H9T9uwz+=sG|8j;oD%+nlE;8uzC6}^Fl0P@VOT6u=Lvdbb1Z9nsu zpjp>}`XZyeBU=3L!Y2vabh5$vUvN(Ub}+_u(=}+LHoF=SBQf%xZQ`08Bqs3!PSak5 zMRZ|V8cB7POmFq9A|o=8Hg;uoD1+*Vwdoehd3G0fmlG5Ry77yL_EU69>?sj&!pKaw)K}0>-2S(sJ$YCVDrGn$= zDqb0t3S`UR%iUN^xk$$|cqnqq57=G6mwPu?*VyMQYZQOx+TO3ap5aWtE2W6TanlAj zCgK%)>5#+37tK_-_{mHH2q}L83-7+aBqSN#zHf1;5TV5{a{{TOHQLUq))rpJKm=eQ z4c*rJSWneK=hzzMZX-X<@8MiyVX<7_I!RW&D)4o>18(><1B;H^4VLYTG1ZpxhgIMv z$~_6kJV+k#;M*qA1GlB)(GCu5bVM!Qp7RDu&`a=RnrD2dZMHb}i=R4Jx@IdhGWc)R ztn@qSsVp5OpO8L!vaI=I)rhjZ&otG$xt_5}p+`ZKsWXzKDv7t1JzdN4eF>ee!OCOQ z0~P}Lt|$(%q}HxtRjzm0Ty(-L)y(}q69LJhFU>UJ$kW0_5si&L$b9HuawUwIBs+3L z7A}#@Qdu+A2pvkIBUmx*L^B`${fP-C*M|nmz`7v?!luEl^8~~c1i$wrxr-aV$?0jQ zGz3mw5MQUM`DW=K#iB2Ch+sBMBAn4S9y*B;8NeSZ; z3P+JET#_NJF7vLthFF-AmgYMV@#fLbw;ki&Mr;)-HXN%Wm4#vrhxg|fqoA%=I#0+?+s3eRDH_OXKVF$hJSI$%({LkkLc>@0s42$lDW5CW^Qf}fPSBS zj|U|8Szx#m27dwuoJk_QjGuhnEzG2l$C9q#x&il2AJyU9>z2&tRY@X|VU(9B*zz?D z-AoNmCC%678taT3FCjvWyd2%V?jyo~MUH{-3PFp!Y{NlcyT;0Wz7(H$ik1^_tC(8S z)QK6vs5Pz#PdZFJB;}NsU+&E%g+ZeCDcxJE>vZ$HIbyV$ps@Diyg`K(S!GoID>2q5 zc;u`R?AY#A09A#%oq~U?6XC7@k@B^%!UZyieYAiXBjjN(>vXfVLVz{T5KR_*ocW)4 z)ei+3dy=IeWivx%M{XTo#EC}gOR-H83P)zSPn)Uq~G8HKhM z>LyG7Z-a&x*0PCvvp2Xpb1_CXm~=d#nsi9LW{dxC?!jp(>!NR{3&4tc$%A$5Dc+$9&k-FnVkl z_5eH?!SmZd4ONrY9Ti~riFc2yFVaGQGhS7N1ey}R)_D=UVYZ~`d4TFZT$ywTqYya zewUxb%zqR~J&nbD$~8Yvb@N+cFf;6KXAA4rqW|cwj_34;-=JC$l3#FR<23iszVvdW zcQJS_>2jC1zbe=farBRkw`zXzt#U=%fN?EJ=+eLS@GZNNwjg~0^Rqkutsg#%bhm1+ zHl6mK+S$e0*?mg-CP<1#oW}~wcwzOyMpk!59qCipWc3TRCO}S%NMbN_|1R@N%!8`^ zF8U#ZE*w~2JwKg3>wb^6jjAwt zjTyr6Ue4_lSD;zz*W?Wq`we^qLvwkZ9XAeWWdPlZ&Q*BCMxaI{a(Z$S1iPB&45uag z`HijihWcH(MQ}!m;)0#1LL3G0{aj;xeH}i$J$qcULrKV>ss4u5uK3pOh2wQt&*1am zyTMLC{M2mjFHhZMV>GXhC{AgN=^2?E(mifA1}~oGOU;kP{XQ4?1e-TwTw}KzQC^Pz zT$y<)>z+&V4)wez8X8yE8u)A_{duC|M(+ir8_O(@V}(i+Pf5tr@Zt)C-CnBy>^>k} z>s+4=CGEBryj9?y8>>{qo>;p*v(XwzJq-7qf4LSbUbi#RN=9v!Vpr;t27&EUjikvA zOxlJ%kZ2Gq*QtG5?C35pT2E+!8``C*YQnBXp7wVY^Eku`^dGgmA_vFX%XSgjeVR_7WiL z?7pl>U;}`A6v!ERFw_!oBoOSq#!OMk2TI!e))WwwfI{jXWcX)qPmn;}YbqH3U8S;( zlaZ5C+t*qWnXOqh|F26_6JiEvTxH6B=0?f?Rk7X2t{+U;f*YzG)p& z!|jM^lMQyBWtm{>w{xWBtTHsb?tb=$vIU>|%`zsAZwyef@h2T)KrH5!-`ojS2-rY` zUb$}le6Ji9ZRI-eiNbvx9s)UnC1n$!!3Pis-|>O?F9Y7#_BFWpN}FS79<9b%_z}(| z5i0hv?z2G{f`V_e)A0`p* zom@^;#?fjVUXj*yJ&)x>N1MmR9g?yO z{S_M4j5+!snYlq{ zRg5Z$a<`sRfsna6;}Usnt)9Ty<-l~YUfSAUj8&G@ghn5i#GMJU2F&trCcB!=oxcY6 z5HkX}*S#2g?D$HF3p9QveqdI+beXX9V=O%Q5$X#v?Lr_XlKgz*xOb4BH?Q#R zAo(90S7Xn=|Ed_;Es|N+PX!0(8}dpA$8sCfY{3_ z%U$%8{PgKu#}MF-Bzaekd8Id6hO8hBiy8k&X(8T~frE`O48) zEL!WyrQ0)9DjuV51j}QM*Q$+j6t7n`&Ze_59oT(`AWR9*t+YrIi={qc6-6V-VSc*} z@2$*Sp@^e}yGH33*ifvRns>2%+i6lZd9oei7BO29USkTs^vM4c{kh4B-eeC+kxuzS zsl6t0zk~_;5)~qi8>0-t*LHLEIJ)llxg-m~2QI`En@bbbm+okPjKXjWGK&%+VIJ;B zs3$?86MY%e)B3j_LO#hVt7`!F3G|nO(oDxrN%yNu3gpjrLm&=aY;a$j(3B1YE7BY3 zyT9$2{pZ*Te_o{3!$J;UT~VvN>RB>FgK$0|NU@yA&OC{|LL{%uJcbzPKT94-_@?)J z?AK)wQktISiyWl7LR@xlG-b1==G!N$m}X*-XzKXD!S2C;I`$5AYQ+)QSW(@MT5950 ziq1qMRMxq=n#iASo?*;R*g{sqEW=mXBJuM=y=txIx3W%-b0(x1nm~y16qtTW; z9Vvwe&j;Gz5ehHT7Ssau!Z_Bw4k9fI(p}fHV4Ukb8wODmI7hSZ>8CK*DnuhD*g0!4 zzZ~*W=Gkn>>nVBsVV=jmH5YB7`O#JzJS!hE(aBHG&}5ugllA!o<|e^Yf%CDHJY>Mn zJ(W_#IZm0vz2@OxC6$!_I>e$j!f=NouIxitm&YoTs9Ku;@fY*?}z^u)~p-$S` zgiKANA=WYO#uwk4KE=>e3dE(SH?UY16TDjxG{)q5!}s*kdDX7qYX;(nk6SgYtg;Lc zQcs&(4Qs(b1}L+E&Kj_ZO{*_9#>IamKzxy&b+$ zwF8V1_M8wD-e@nBUD5~!@m41cxR^b~YJhVy_Mg0^=WU2uP6?9^CM2AB+hiQxG94XF z2=p2;JB)?c9iT$vY1&5i=A<6|uD)M23OP-Wq!YI@WC9h86;lBSCwzXm*b3Ix#l?1j zS_#JA&j0-a(B=32E(`~YjLKlyR7V>sEwc_AWqs%Q zT#b6>F}owHUbI8)C}|}xJE~M5tThAva%+B#0}Z02M-}#Z+Tp2HU*=C49afI;aZkJMmE)@L_CP(fyTO7iMV+qGPy)aG~(xz^F-zxp5fZP62jCr3(?E^ku=F>r?g9G~!;U%-Fvq(1s>0U#cr6H?D}lch z_i6p|M*~hQTNIlyZ5dj~yn2j^KXxB3>c;xR>WIVE;;wf(%){SCPWnUuaT2!u0nxh*^%tt}2LS_f})y3-NDwPqq zn%6wd10M*{(qbY-n4VBbku`p8iC%{2CK*uYH?MKyWOms{=IGSgJtHu3XZ`>W8E8?+ ztWL>(x{u;h<_I$`sz?j3R{k6V`J(`tZ2O^}g5s3?Q5!>!;U>={@l>AI_=za*E7mT| zEzuQZt3(eFSteA6{L_rnUwBZ?$7fhs(%Vm0SC1o!>0G)wXgs}=1YmJIO1AVEb>!8B0*tc6 zgv=-_5~&`0YX!fuPOW?9thlJ>fINWN!+=Ujg%-u&k9b?$yP zb-BW3szED*`e-jk%cm~?ht5hr0=`ccN6!d~)-ZNMoqv7ZSy*%u<7G^{@5Il#(m)O# zP;UWvMBCxk>D9dr2biJ&FpmFUcQX;))&ATt_VXqWtOZ!Jjgc|3niI+I7EH`r*zR@`=86p2t{db@jcfNt5a}$z< zHt8B9z4^KDI@RjUQ#i4lp${~YW*a0cWK+4{43LH4vIa)tiG>ZRuU7Y%tb10U5A>ru zpwOzbpWm%=pPwvu=H<>4SYXn)bViX~YH$s9|Di7L@gi^}uF~ld*FfBfHofM3n|G8!BlKY=PiqeL)M4dkB# z6#^Uz$izT1+qu3iEqya!vxu#gsZ1=1oc!pFbGclVNWq@0xO@9dlTRn}GvXv#&HEPy zUncLZ#WVXPrQo|dGfEcqqv%hl7l#u8M`_G->!I|f!UI32LJ!|~{~7)OK|DJOKKG|= z`KbJ{RX%GVe2dx_CUYK-k8GBC`?C>EDs=Y>l4-ZB9NFPc*Qp^bFDqe9tYB44<U+l_|sam}uVU247k-DUAI{xg-PcQXlKT>-XSXjUtULl+xlJXqK z#Afi=*jiD(6P3;U@Jd_!_*^_)32x{`xsP5a9FobkdG|X%?|iHOr&0i6w!XEt*NMy+ zXS9ypOK?4~_M1p{?DqlZ>_DfhlM|SmXRCUdZ9V{$gnKjiy&?nH2m`NwFO6>fNqsHl ze1DOuFac*l{e4m&fRF$QhhJdeBgoh(0Ez;VbS|)fg3`3zfX?sl7SaALv^v02JxM9~ z*vL@;Vi()_ues@;e4nQ6-SPL%Oe@HT&o!YfEEYyi6A*@=I(x6E8=IFsns*a>B`@Hq z5z0zQ*k%W3>O-3Pix=fmgg^bKd*6<%vqe!(*+3+lFM4c})sP7`STSFZQ+f^=Swmi9 z|D}&}2SM8YVud4a45l)bAK{exRO1IVT17mpaek{;1R`b(j zDP^-iK8#JSJ()L+t9)0xlNBwGj#YFr* z5|hYSxB>LyZJZ}G$lv244#V||>}&o3p|d(-WuPWZhO_2B1lBtq+o5R5ZDlVXYq}0_ zNlN!qz8Hyn2V`{z2L~X(1AHwmnl+B!cE9^yt$&rQV`{np{2cYbsslJKW`M#D0v8)i zDhms{sn&>cFNa?-&Q6HT>6+Hmc=KnjlXLE(cLfKn{z)Zm%d31)T&}sE5`46O9I`z` z@FFzbsJ-E(yPl)w(wVumC!dmCT>UIn^FG=@|Mx&wyH7lEg4L zTiFK}3?!AhFT@}HC5gaPiALZnnNYvwR=3jZuvwZTd)`!_=s#%~1HYSSb8JQ)@cf?b z@(oCxD#q!oMyE8yhAP>eynhx?J&2q1wGK~=($MOwFP(>}SaD*XuTq?!80)(pTw#Yyp- zELUS6N1Oc;J8THc^&gJn`}^U5U_>pb`oGm3$(#Db%yubb>s zLef@&w1vEDlPs}dhjDmiHVhVYHn&os%nw6|`k!qBy+yVAS|1R92S}M~Yx9eVUEQ3H z0TI*xbot}Ie)%tVgpLPacTN$RzS`>74>&FM)Knjtv`NkLJKI)$jn!hKuv~PbYs+u? zZ@KfPbo_Df%kfq0cDK%gvXMv4|K0s}MH(4qpE4)cG_5(auI2vs!vFRrY}a+s|Dg0( zPF-R5-D|=}!4B+c13Fz~I(0#{C!PO#N!Ju_$KG%UEVtkNk#jw{m&;zidc)nidLH{L z5@otk^dMQOn?;u4D&#+Eh5cO#c$Nw)q(#(@_2JHv1Iz`2K9BP*JG4b)-asJxQVkDH z?6E-`A`3pi>en#w&0QfX#CgSiG{HVJXqxo(Lk;2;EDo9y`IQ9XdPR-y+3y#kWX5O> zj~;8-|L{ladlBu$6i`Uq5W-3_m*hj{O^Su*Ln%Ck66Bq3zFB3)FFHtoW%DHJsi@Nx z$zxM@1CT;<+FOz@Psn=Iq2Aiz#QONK14X(P2TF{vLIp82nOxN<%G%c1|7{Umsm5KjpV1 zoLJ{o715SI!aFZ=G_tbF<5EQraUyH1r7gyNH$}*t$K;(3h8q zNrprT28Ur?&%Jv==c-g&ZEF};H}{KsFy+afLw4ZiqVd*0_cD#VgEql;>S5M?qa~B# ze;+M*mNi{3mU)(^GvS7XR7DNHfNywYMqd)*{Ly)k28pm_A5kd+YAsWq^v`vD8GQJj zjV3(l*LsVs{7K3!xmNK^1@{t<-}MP&P5h|5u`Q2AXJJ}sCrC8|R`51JpEzKCHR^J^ zvE@lHN6t&D#bJzXEnwM+b){0QH8}ZJPzWLE_tmpk)0}X4A%w%;QN~i(SW%{w?_;zlrUzHirH|H0X9a z^6=r6KQ5kZh6svB#tlANG-0YV87uv6&;FwD zIvS*b%>1VMlcrR_p*56Z=5hN21asO`u8t2&DpYb_Yb>h%_6f%}9(t9j5i%d$9&WOP z#T|(5Tj~b4q_4dycag2n)mDJjILkE4>w&smz0RF;rY;w8lqf@%$jnpWTg~{ii=GeB zzLg^GfFArY8tF8$PQ1ER67cYe{I~cXJYPrq#H55RRXQe8C6_NBKF0mV^SYF27lJP2oNTw|w?{O|jr(lo#>U3- za!&m2mG0M?z>okEt^n7r>htHo7gs$psAF+eIJA#y6nl6>AS6D;s%Ca_@+%;V0Gsbb z8Kd?@g0A4mtUxAQhJ%s>J)2uUtmXSU+GCVcctFvl?Lf+4$dBwXtt9YRIM*w|)E#gv zGj{klQkcT{$sm>lkyjoD*5PyzTn~BKq|*ML^6KFCkJ{FjcWuK<%!O?(SyDfT4#Gtf z_#_QT=a1+UD1tUmh1mS(W0NkEX{nhOOyX? zk>yJR=eoO#DzRwsnQXILGZ#N^(02D8Pw`3Gt;CX}LUzZit)oPbi`wq7&l0WKGVPJY zy&2nM40$$tMRW%n%hR&Ghk`>k8bPBeULHG>;cZ8Ce7+y zQvBlo*8=Dm8(;T*X8~J8VEMiRMxgzu|Azb>gvZ>64cgb%>s zVQLP7eonPyHW0X6oSK72pMD3kUY}M{Dbx?QHlhQrEnF=t#n+l>jV{1cg0K-)dRLo| zqhfcaU^n#Jeb-`dJn%a2znvD2xbP&`6c}8Sd474NA6_ONRo#P4$BUf zQSt^r^r?(EneL%UE|WQ3p%d1~Rn4C`XVS~rN601-|Mi$|^n3Si$d-UliADS=h9!HlJQo{oRHj2VKCQPO-bYxyD z!=EEp`!tdpL^<6BEMtVVt|^NwR|E#H?vpZ_E; zU!nb1w27hj)_U97!NK6G!+4{44An!2AHbpkvSU)B8USU7*Lo4p(0Gz_Eu3L>LU=$9=rnSZ*V!*cmt?WJR z%S-$x(CLCQe`-oW9!UEB8`KQ?2|R)zma+MLl}mfl5EsKh=rPrrG*+{Z&>C(hW%HG=Z_Xz&R3H0To}G=FUUXyBn?ut zUUzh3pq;E~#?WpXzRtpzOqsly#|mZ)*)-@e(=+UaLaI-4o!bdPW)f$?)gHZeNhH=1 zfzMkyIS4U0`W+RQP&1cYzNTy2%+L5L$q5`K|JXvD6$ z#gAQJz*}<-A*G?ssUbP~AilYd3UU=k$P?xU>lj?D$Ii-I@UU}b$b7T>bBBsto|3~L zKr@F&PycJob;pP0lxPQD3@yyBp~64Xp0;KZ3+X-fl06{kZ`MGEa6su)=bQ6f+GfLgFM1c4P$T*!{ zT@Mcq{wL7}TcAPKbQb@USdU6JXPMi$h}0N9e8Eh7PV`!<_)HPkMGz;L=eJ4y%Gcg@ zA$;@K8(>mpvW~_d=z!XwQ3>=#(8WS! z+HecUR0( ztJp2-L>b6sx2&1Hf*MrLxmHu-sBN1TRZs`T07)lw2_>v>^x(+%aaJldY7=OBHkS+T z`M$$#>x9Br@23JN5$aBmj2|DL7CMFI4neFxx77~xGH=G3p4ZE$BUA-3*M{MW-K#SaMV zYAEZ^@1=u-sG>mj8G_i`%Ztmr?MBFk#C1UJk0hxErLTJ!C5yodcZgiR8+bf`*RhuT z<^+54WePh2%nR8e=!j)DDp{=fSDc-s4Z2m!=70ms0^ zyzz4{(y);^4Bmae%fr8gDHU!j$+BxM4a*sNc~ffSlzbZX@qDwIbW^dPu~J$>jhTP3 z@VK)IA1K>!5WZ~Y<#9$5HCY#ksic>=6sQ=>P4JVmH!YL!?aGwJcukG7$e4fiO^-n6 zF)8VJbz0lJiCzt3%P`r{^3UEjm^T%zDf@lm#YyTG!1LxE#o4=wXsEdw&JWEk!Y!n@ zPdCIQplWvAh&UCEMNX3J%~mCiJ&G)G%~;ZS_vUpg5#z2Sby(K#YBzx=R3a`)>GOOA zGUKG8%mo*iPk5T${*&5AE_dPa=7@Qs?y`VeT^wky!F}2&4sr^Li&3{2dwm&JH4PvM z9)Ol=|DNqk08kAT62WOSv+a$mnmp5Hn`EfXdcWTfx=;R+ohtJ=vg2cAB2c8L|eL-D<`JhB|3DaY*Q)i zLx5zbAp!2=n)R`x?(Fd(ue+0AdH|%ZetvLxlhTybxmI@^q@kTmZSQVI)}PSMK>Qf3 zBdlMEEx@$3as#bn-mbHagM{I&dYDu8fBq92>$xwAyk z!es(zixo|bczY-4c+5yLCorF5B1H4IGfD}2!hIjW#tU_OWFnza!-_-F82(EX1u4 z-7!5`J>wN;?!W8B`gf1s+?f8u6s%RKD^LoFCpe~#7DC6r$w=Jpipz&luG|hi*VF{_}{5n`so} z_bD_QHzRp)JoS#y%{Ac-hZ_1@JTJ!C-Eu?{+P1^Yj`Z(aYjl+LrG)zmJHDkRMCOAR z_Y+oX6LQvsQ{mlIN{k<7IaeI@Xc<5kS|ytK-X1ispqk;B0*|}Pe1rB}Y8Rz!nF_F@ zy13W{0=L&4`9&U~4N27(cyise5vMEJiVboUJp}m9xWQElN)ypqjBJK3)B+*PTl6r#I>r}GPr@+RcP$6z)L-2#Q<-Pvw#Ao^r$#2k^6L%qdiNB>Q;kRUd zg3DW0>3Y6=ziLVPO@pEFh6&bii1cF#7WbztR!wR*|Dj?s(h*u_lEIuT#M~^l*grhUiP%NiaIE`J3PeQaiXk8$f^{h3dT$v^KZ!e4!;^2&5+d>DWoPdDFu^h)Dvdo?2gC_B^cc&O4 zf>&*aB3oBaW`Nj&_q*;_nDT%Bh4-T59{Qak-wHvH@(zP>#Jb#9TKu1h4RwNuCY}p6tSlss|=m9&A^?@V+=ZY%_~jZG17f`VeQU+qW$>b2Z_ba z3S54#i*o#HL=S~nZvS|5&37t6_tlbt}z8rjR9dMZctBE*-_q$vInwo zdY^XSNboq#j@~!{+Y;-?0@*X{JPjwch?Mo>sbC zrxYrS#fNz87W^`zB;=!RDAL_81g)hilxAH|D4%ahJ#Xa9jQ{`8be2(3z3nyvCWxly(-1ZL(n3z1I;u zuu0xAHY@$;v#r`>cLbgBMb{bY*PqD6Q0af%$?R)dcl~nCR$(LOP^0$L zR?X3{f;dhIg$#VCqkA0-RtTg%408FRbZMTQ(`*c9DxSdLEqyK4%xWfPJUwh({3MF>>tJ=T5va+)7 z=_l#2=e02@FM;#UL>^EhOX|w89NxiEj%4pkH*}0#W9r_zWp14l2f}}Jdp_hk-W1)f zB&@T0Idq3a1$Fp^H0)2##;w=BdHv2Dvlj~KYgk=ceVCH|j~}BfiYQvx=8omH7HOfr zdaAeyq}GCU)7gPB2`vx;4Yz!elMj*dy`~9uq%ZxAyu*=O%925dWxvqrnzv?Je!<4w z*Z?u3+_4v~`xDMs0Ph+_S35Y7l*q=3CL+Wh!SGtf`QC-^QjH6YLr(icblg!81YKq3fRMIkld z1dmC86GEJCao)I;Ix160T6KDynAAR(~kjciT6n_>17=yA`GN{g_GvtcXQ}W zn9jRz4&zOx8w>Fvr`Ns!MmtF-r=*%mF7h8Xxw#T_G+Bi8wo$NH!+^AlRmghTb~40k zy0&%7Z}!6dS4>tG+f3(U_$FJ6xmJi|jkTVZNTob4qLx40wQ42hJG#nU+?^GZd2O^m zvbmB8ce<@uF102z?%;cyZcf6qcw>Uk_90BCEMKPT@iIf=)uJzmHGIqe)|huGifHXE zYidnu!fN`ymzRi1M#=71f<{AKUuy$db&FI@xayg~l&ZB= z+qR~Mf@~BO>)$_fFCwy#ROH{1NVcrGB7L#_+fMDd)_hB4y(=nAA>9^?7t^g4@Hu}v zKRHA}e_B51b5+Ll&I4A3Ufc()8$jL@03T>CIg}|>Y85;WgxwFm&APk0Q-L-;HD-Y9 z)MiNm1DWU@K(2uy9%SSJlTG&}$@2Z72Wa&MhyDjpvVCxHfIKlhZC(jN*azTj`0Uv; z0OcEYXb^Hg(6zB)jy5ZHjEA?-hB_cbFj=opTZS9W$DUWqNAh+ zRw4_Kj&;wEyttoDK+~AWH`rt<;2s$I{H+HU)$`$c8v(>6H&;4?fqEth1;<2CeiimA z47@y^INoo>>iK=aBegJ zN)7lEU~!T>P58UhCGBg%($n1W3U_*;+jL$ZWyr#2|0^5!y`X#bVZ?JE5LQ=$@yzC| zNB#?3b%9!#2cxhCSsBuOTL0T!VuVUnk&Z;h|D%y# zUNMCjiA+J5z>`)`4SA5B0OiD0(zTyoEF*2hkHG9-@y-jpBF;d=@By+AQ^t{vn8ByF z2wlc6`fQ#KRb;N`a0K<9)bDVoZCtel_23aEYGs$KyZ};Fd>KbR45rs#(s*AN)5j=> zQ&*MZ<#gZ6)2T~DNG#E78~#%WGxyHIa^j}Zo^lZ&Vk{93_r;6VA`1l-w7g(L;_{I4-rI@ck zBw~o^RjfzL`j0>M!`o*-Bz^W;ARRCPs-5UZ?-iw`ySqZM<|_3)b|z>l9(0uSgCt3> zPUZtfubW4foz_pzf95cBep<5$a&_rJRBA+F6K1tz`nhn%lx#iTX3^)EVw>amDjT$N{Q6evAF>UqK8r#wH zx#-*xGOjU+kPi4c*QL_Feln?i1Nzcj$0&E-I3vYO!?~nB!dz*fLsyj0l1e_K@9jrZ z&fg*Oi02AOP~)HR1%+4khLRG!PLlE{$tsE$5(gWCR7@(c?_;5s?-iBLc5j&l?GLzR zM9jZ!#4rdEVPWDZ5XQTYrdJH^dI;-A4Fr_WtXQMe$olJFeG-G{A`L(%W~ z{ht|4H>g*)uxt04N9B^U8#Ab~L+F(L_6qNgMRN=GcCmL~l$Na}z7d<5Se;6-`YXwau@+^yA)hdk*am=|7^5Teke_AA+a zS0qp?Ao{s@=-+I|e@6yaIqgGR)|~}ksLyd0{*%_!3US3Z;1IWxD@es5U`XK-=)b}Y zVI0Vp9oZ|-qNZ00G+hKJ3HEZh)0aQBq|kqXZjAK*k_qa|iJsFJ%YWygs@A4qEp}Ic ztCh>#j9{{bsbOB`vVPhb59XF_h=bPuLIdS%$<}T`Fd{p;9&Z%2S3fHV2b3uJX#&rX zIhuY%e$Dtr0MR{75B#ZDME94O!;NX#?tO|{RZ^@*-cXaqp9hn(*5@rxR?O#t#MFM8Qf=US(hD)_Cc9!JviS=%4zP=0 zNg4Vg861X3Z3Hrv|7Zo^z^edmnbY7WA3{xyx_HIp?5z9M@ha#BwB-{91@wSk=mpXi z2)C($ykL;VejM{ldE%5`Z>BncWHLYxdEV%!`Mjbip;y@Gw~hH`WngvF%)v;G`5mf8 z8HyzytI_Oa`!}#8V1o0*LkO!FS(sp{m(&Mt)B=3tQOl+`sGN)$CL#w&h$~|m*3EsM zEoFX189Cn5jQn|wju!~wCU?0dB=issx_E@$Z(}0CiL#C~=6FQDxg&&%{Ti*Ce6~GD&T3+ORlef&O6Cn7~v}%>J9`d#c>S^}x zI%J2Q{B=qfE5e<=_&*b-o2INlc~!B6yfkMsSJterki&-8d22i*7_4q{Trx0x{8;zw zo253ixg75r)a$tQ=MLSWf)-lR-q$ovTfYk>ugZxt81oE_*L_{TT;d<-1|#*QJy~yV z&UYcGQ{gVjF!a|?9pM`Tg?Sl7n4$hl7Q9vyFtMwTc~|9(W9m;bg|ZU0L$8=zI#>jO zn+6ZGYI-?~Yx`mG-w}5ioR9u}Gr4SEX(g3mKuleOUU%4&E}BwBC`@&)cc1pVo6)#0 z9WqWLawTIPm-Av($$+WKO5b3fd0m451)|%CUEYR*oJ-;u!GuQCp0#R)%IG&9;)H>~ z@uq=PH6h9YV&i+-GkTq15Q1+%LjxiB;v|PrYsnH@;DyW2cDNwAwWpm`ZP}HXH71rNUAiETGKS~k9=8z1kA~oXZ!HFrpzo+5kF*I5l9vI3zezJy6a{P zk@}?)A~X|!Lf)+XCBhI(?&>|Vv-o8M_74&*<(Ls=jW59yPdW7YtepGz z4c;;bz4MSDYx3Z%DxNfGu@*5>Jc@hXCXKCd)Zt{oYmRrdAk@MDpZmch40|N*`q)#h z%=o{Jh|%BQQ@{aG1t=xpX>zpCm^6D2sdMPtu*qV(PdPv{4Ml^JhZX)uI#&Gk=jzUx z=Si-RYFo>hc$>E8(cFHRs=@)mwP`j|xK`XVR5-QxZR$Lvk3v?`%YTloaX?Hxe84C{ zaz5c5Kg?NBGN_~396_4XkrG$l*RBf=Eh19jg2-Lm4#y;_zzQjJDBoR-2kUu=9?*UH zzH=9yQ5gDCJCsSOinyV*bdTU)%wP_Nzz>(?*aW&dW&MJkDSbwHrPrbZLOt2WV?B(B z*F921+hl+jyhLRxvCAaji534~ef4`W)Ql6Kb1b4F`i(mBA>=wo!qI*X-r$AgNr41Y zVVuqKJ#lbe$tA)24Mwd@6nq$ZrrZHMnp7&0|Ix*ABNj{sf4X`Br z(6fx8ON=CB`B^ zBV?qFx8`w<_}Qh!_0i+^Yf2i=5SdBe$=^fz*LTNE24dT5?QlEHYZT~&O-W1QAx?X7mrp0fzt1ae(KmcMoi4&+&Dk81&V&AYAl{zbpa zn>KjB)YSL+2^O$|M18feE%s?_TKBd(?anS_| zF--P0O_P~2r||&A$^=+tQO)V_wGgXM@u&`sniIee1SSVtBvPVU< zL_F8(GF@>-M1o7SOm#?3QJb99i{aAT)UEgAdLf-^k;NtT_YU>{toGr&)zSRr#<4n9 z>X3~AO=|cyhK4G0H3kmAcK-QFDK8pUq8j|L!)OSQbOWel6v9!{b0P06OzBK9A$k#_ z;=QO?836MIP>pBTB9Qb_|GRbS%k%T(;rB*{I&Da&HUtkYi2yFM=`5HzdYX&P+c(j; z2p0q&c~~mgeHb|P5<~LdGtJ&1DK6S8LE>Jv9YZp%Q2I6v(lFHY@y+gV(m=;a_ENk1 z<*9>f)_irq9zF!|D~nS~K*jCs^Bv-nx&#Qs-)<#KF=#}qH9!8#SBA(CpTu0ftZ!w8 zmWi+vbRi=26+=SVSS3o!!uEnf0o+S`f)HKa_wOg$6bNM(C+=wwX(9mOgv90hFJkI+ zXgzaYp*-bZbZ2UMZOT`b-?Ub1s=SwV9c?7~>@Z;3*e^NMIrEQ0%(0bVih&4g0tCLs zA&i4EA@Zdif&RBUlfMG$_CNjI97A+A?yw^@wT4f;^6G?_FU_qsU8(e;2hpQzDcSAZ z(}_$(yfrs3xT|5mPx=Xv?Vwx~G>*Rg+7g!f51dDtojb0TwTs>=JS27t4uR#+H7xhx zyaZ6wmZqkH7FA773Dew>q61n(o;l6%#n^<3i+q$aMmc!f5gHJ3A?J`~ zan6@f#}GgF8NU-*+w8`9e`w1~|YIV2_VWxp>_B(3ubQ^a0`-Pf52$z!gN z@fp&(zDM{et-oLj!U;=g3D@C*7fx_Wq(hJ)_R3)GSSKbwf(#Z$l{qpZVvc0Uiklo^ zb|5lMY;)-zOx`9UzNUjE<0zGhUhgttQCq*YDwT(zTsvBk$&hmE>N{OtVY&QjbVqQs z#HY$yxaorF8V@27jadxU%?eup1!#d}yhVK10pB+un!fE*qWlffTUDc?fmlQs2{i9l zyFU!CR;|+nJw{wEMKCxLc%q4A1wL-|k2xAlQKN}YbH45UiGAy#`+$fGiVmXyC>wNO zd@xuxd-vpv^Q|`K%Y3eze#ILlhA#$`Gszu~K(S&Ug2C+`9 z%J%g{q{I!h=u+4eEAD1(U}^i(BC8p}C|4`7QC!z;TLiHq^0L!WDDxLOB>4%EuBJ3H zQq>4}a)g#xWkNNj%Xsn_{gpbQ*`}BaYKM^$Bb-*G3{eIi(_*lXtahG2l4O&hjGzC( zqtSU)g6qT@83C{W1xaJSY9MUy_!+X6seeph$p30xc)aRp@y7Mr+5Gb1!(>L1KK97l zmv@v){&-?`l&Tj1lfK@+#rZz6hv{En7u{%Z zxbVn#3cri&VwFx*IM#SpZK`YqOA=7s0Ji@pND*ivI+=2gz7@SN`#tY8^1|x zryXR4I?W0WN-#R*$OARPXXy+e$1i|th^_zdynu8i2nF8Mhfq!LYB&};9ruEHC1~Ht zo!|Xl+GjY2G~l6E>TfuWc}D(MDI(l;ORVr;b6&n>LhvFd{9#t8_ZK<{dpa!rLm`^F zjv4Hg;R8ba(6fbJ(q&A9KA9J?w!;X1`_b_`1Tw6B4w{Y+M#BrLOL|4hqbK>dU6dtW z8L_ZLRM|PqkdFRYAHgg$9;9{-gMZYhv(M!`x`HW1g#4m4UKTk%hrzpRY10Gc%#inq z@|-NbDNryJI-^$&y*xB9`wHcth*vIr^z){7eYu@bdp`aBouC zTS4`P4_xQMw*Xw_`5o*4>ik8=)H7W&rc_FWk&w}TO-<=|IcjGNNghdsrj1()GTxKLTG~vq zaQ=bvw_|k(2AqlM-Dgg8Ps{tDkbTb1(l^hP+#^uFw)F<@v%k@T#<*ZdY^*V7Y{~QH z3Dh2Blrsr2J66b&CwzBE?CXy#H$uxF4}({oEi{enFJP)3Q;trDw^YxicgX4&?NzXR zz`oQj(S>*yGeI@A@%w)d`zd388LaSZd&N*eWP>$@d{ib^=uiQdD4zTLnL6N5-{-+E z!14@*?1H@I(oQ$tDZl{9Z+q4EDnXG$Ci*eQhF&?!f)Musc|2Q64!BveJ(dJ*)BHcs zzsTbMCeN5x8M$A$N0erwy-B}e;GE#H+OirFKIXK#P0S#Vh;$m3Vpih`prE5^Tu3QY zEuMH8xxtkUT!E0xj0f4HlEP_pgvJh?(08wJr^O;}1mS{hKG$Q!0gKa41jw`lBoV^f zl^PAV}R09vKVXFy6o>p8KNAMb_L>pcY=ng*)>1ejEQ5Q(DF zQZ6|~Klv_1c^;#0+DlHTjB0^X$tgP5`HVU zdz^E>I~)7qC%fU$ThG6GN$R>B*5sYW>@!~@|b_9e7W7_)g3{ZZY-Kkrkf-XK#v{-BpLR1wHrX5E>Y!Q-)-+1 zh*E#mg{L60(BnozKIBf zUJ|r7Q-ZT^TpDuiG=>!W5#e(5GcIH$1>0VsM@K;^ql4cBQHFC!#xV-*?%C+EgE0~m z-Ci&d9d#^9vQH3k8P)V|lyI!@hVX@0kq3JllW$3Ab2eg4_gd2sS2AvU0Bw~uWGS?P zn380WP@Om2rDTAj``xN^9!Ac16Uk4N4&qa>4LU2Z*<@YHP~_+HKBls$wG=@+qY@SdyqMZ1}^yC%k3-r=xh) z$vk`?n{$zz6WmZRdW&wjgLg8%8cyBGFn{&V&?IELXjBe9=_={o1$kAaV>#XFg*=@N znXED(i@+aUoOn7fnYu*DF$@#ls~V={Por^tWosTlQ%LHZ6iD{vzGq@_KKZhuqM&If z^M)kKDzqaIqqp>)_eFVMYsxDm?u0I$*zPmG5P5A=h--3_Skr1$yTF5OD2vYe8po2mD9&*?UUyRY89Y3;rZ=IgYB^6y$C-Itv|E|yqbpJ zt5ARfU3nn>ffTBuY??1t9y6ufRbdcB-qEuhV^?5SPnit*8AyL;$^bsP{BQwIvTgTZ zXzgkIx?AO#>%mP$*TW?4%dk&X1Mvglu8X+hT#1WjT(DDe=P8$EA40NUppYM;v!zw`^(nM z^6~H}rE?d78f#6KY!NSKP#*)1er@%IIP#Jzy8# zA#neD&UAU;y=T*JtY^x~aJpXmEPGvxR>I%-Z6VyGQtstSK#8-Kf35I>4&g8czW5>8 zA|y|Tg2(t%u2&AgYC$XP@ju|lD^5@Kadx~#kE zL${_hS&4uhj+KkLwd2}JH@1f*EW`?_4lcK1b-TOIq4u?0UW723j-;N{Ff{Z`8kqGd zdZS3KYbn1aV02fgQcad*tvNe7(d8Hd)$(m8ea}8&lLxsF(q;%at$}UbECAoz@`0!K zE3m5v4(chrKhsY?-NSg&pHBZ}q-BA9)O?LOn2lRoTfr3oMnLA&;c}hoCx!>ORNG_O zPygc2pW*5b+WhOYZPg5(kHE{VDt_-;^!8nYqp6)8Tf1e_oFH%sgBiyRxAx;SBQEe# zd7cF8FcM&qIeY+Cl`&PXe&Ho9K;ni0b|7KSBcu19>Gcnq=dkk1`-bzlHyEdBckiMf z?T|yKN5_vm_iRdVs|pm!xu=hlVdng#d|%V08Q%WP#k9B7*g6Uw@E> z0T@)Uq%C?I@hSo&F8w=y41mT0;H>~$4GD-rKKhKt*Sbn#${ftk`0U& zzyJKvXGsAb>;LoE`yI^JfV~G28ZJmKgQjkM8^LtorD;i?T3A^4^~>$**c6xh{ZKN% zFFz2{Z2NJal)2lj?Dbv0kPgH40&aZ|VD{eH`e57stec~2M&G3N8{}?a6SY870qV(F zIiy6o`eqQfJ4E%%88lXWrq*L~tmMJ@;?HA+=}agLn$PQqq!Wq|04GQ2^bC<4=GoMe zT`LU@C@6A>7SOyACEU0|<*XeU^PQ6={dC7bAi2Pc^_azE97Xew8)Maxa*h=V5pmsP zTFxaq!oiTIowTNSHI`}s#nlP2ewo_B3ZT=kBGAQY=~a^Wiv;m$@f-0RpTBZMTX^n% zHLa|o3f(wBkMU$RT7bT2TeD(hRnuWz@V~|)Cm50?WWb<+24YKumnk~k3B>YrPV1U+ zAp{9$A;S&KIx!0@Al4inqMlcS4hIi&TUF-4YG*H6j_w;ebJ5nthmnyTjUW8!Cl(PQ z@gA4i$eOxrs9&g(A28ZIG5-KR5|E*uz@Jii&=M_D6%MeSe`-m*yE*~ODNbw$u!;vV z9}*eZout3AyxL3y;mz6qK!~>f$B$FYkowOY3LDOiFm!NDha4)cK7QQY+2QQ_{^JKO zwV3Zv@(bYVt<+=zmx!F-o)Qk)buKR4X~Atw1P2=~_k(#5t^?_;(eziJg2C|BQd!BC zG$wC*mWF^)YLRXF@96yLb4ouk!G1cUN<9Mhx5_K` z#KB!MO4sJt`cmkzhu*HYr_Dkt?IYT!ek%#tD*-v&YXONt5YPC0>gw2nve=GLWs+p0 zz+>4D`4a!Z0(G<|hG1RA$!LtkcuE15HAA4tQZ4EjK12zWm z+ioU)|84|GYpxS-Y2cOsts!=Hqu?fDf&CN%K6U?PJ^)hzaJcJ8R1ODl-GC1U)LVc{ zm38F&RNkW%d3b2=p3Y_d8bC)ZEtwu;xNxU_{{|uu!vJ{jULV&bnGs>m zSlA-3U&C%3X*!k_$*;;*!mA}@4F63Q{K7{Xpa^cKPWn;-=RMK!vhH;#sIpEHpNSTr z6BH&il>Hl6&aCjGqGIqDR@IG*<%$X=tM|T)#3uS7p9}L=qJgG~fzpcwSq%YQ^`@wm z!Gx4)tV0ZPT5e8Qhcl9I+0}ePHKGMvCdJ%&F2*_tqhc7XSMGwB6bi;V?Vq++dlwG2 zV$E!E2S@Aoxjnc0YTerKJN_&kI_yNV8EE_usnr&3giYEm9DE6V#}(C+>FFIS%KsWb z{*3(9ho1Cm7>J+)ngA;irYRY)mm08pTpYaP%LX=?+_6$kmhMk@xtw6DFBvlkMG|2IFG+7M@v`OWGs;v!1HNMvL_dsUKEmC7%aO!^!x>Nsa_TVt`hQ^SZ z&B{SZ@)4r2%64}}g3BXv-(#rchZB>}7)O5$h_!2%tK5%0@D<=pFMif;$c)P*PH{r= z^_^VQ2&F>S;6|9x<)^k4q>qz-5mp+({#jWbH~?xmn#p>m(ABRZqW2mUDHiC+MiNqA z?;Ivz^-2)MYv62^=$W!)E+8a}-Ih}=R9#&^w*2IKVc;R{3aX?wc1l@(9-B7m1iA2N z8%+C0A*cIJM__jgH>pt}@W*RcFcCr?2WfJpd(3OuDYxVz#8S7h5}imA2>j33&Wew7IhCVDqTq48LqrRb+&wJWk5Jago~(A zgslRF?{y3Xa9NyRt;Yd{8fdCbO+pcU9&#V*-o4`kwx^@Ly+m;u?XQ~NK0YpuSw=db zfF^+l5yJ7&stcF|2>2ap|M?Cv8Ffp&;qk{E@Ol9djd#bN#0~WIqpH?DPkaP!C@ZL2 zTodl#DKc8FhO#X3O+8oSGltRW%aW$FzfV`Q@$7EmR4-l2=8U~-tAw&4@7ARI&}^1ob)vg4c>F^)OgE#8)PbO|TF^maBO^Rv1(` z__1!&-wo$XqZ<)}69f3<5hp-B9C!?>aDcICIzSP;j@-dvCW~a}4>wCnWc}x(C<}5C zPe%ubYKv!@e^Cg6QE^yEu2r)U#KN~`=H|}UpS=ufAAE13ye5(gL;owZvvr@=cV&aVCYLd#;_Z3E(V#<|Tj@A$RyoO0bsq1s zR%RC!!%8C9856CL%_YPTgHhX(9FaSotNv&*9~OWtkqQJYclgi~lj!_{3iqkvtO%$# zAG3KE-}-T27WnVG4`(jONy#0Tqfdp{BtZJE=~=iTwXy3eT(WGD5r&kXFbJ0StKQHj z;Dqb1?dB>x91t|thwNbB+Hh$F~;r0BD0-}4NBUM60kt|;ftsGBM+3%@o8Rr|Q9ddThqvr#+!1HSPebv)DvxY1KBQab9y;fptt=&iDwRkB1sVL4N4L^?MZ%zt7cHl+5Ax-xfN|gE1L_vqLy^`3 zQX6#_Z$T1<1A&~QOOWS;^M$#m10;6K5@VZSJ1Pfi8d=pDBIg=^pSLarIjLl^-N4X) zF-!f+%J;L^b1@w#D}tDgyhFW0kU*A!>ikAxoF|2(lYx~wJ7T=@k6s>CP8bwFYpk+s z6GsItYml&k1vcL^89M%p-Y9PE{5#O(+&AA{npsOx?KHu&U{|V>h&HwBvgcfIdjkF`!3> zfGXV4OY>Sy9H|o>%gEi)m%#0pDb*KE?gFr+RA7ki2t@jRVpEzMS;H^WjqWhGjr^8a zH0Dx^r-Xw8E4l?K#lFQ?r}6UmVRRX<>tH4{mj#!?912I%M_ehk<_{V^E|L@Oytd>| zPJtjv)wg$c7K%X=efWsY$X3%fEX|xXc=3Ze*f5X{v|JFz?-#-=q#d>KBbM)!- zBzqP2e%6I5&p-*s=O(0EdyB5O%=tcR2zg9I5;kzx{@|)V`AEl1T$uUzVl8V7ZA5Z+ zvyE5d5j>=ow4Onpf^CQe#TYAz$8SBQ;#v|JQ$EaBcS~;LS3Gi$9Xiud zAk30Vx=wl;Q?iFo7wV<(ts#+JG7YFQU;a2;yjnCIzqiw|dG(GqM;u*dZ%-IukGoOB zR+FKTR}zzOK211Ut0DOjXAb^-QqOciLyw*z+OXMChC%}Pr>K9ncA#%O7XuQ z;ZldRV}Y_jt*CmqPEYFH*O@kh_qDMjzRFOUb(Mt5xZRAiKLZrinBuda?Gp;PB*nz3 zWN=P z@#y7tAp4nnyC#S14{v4l)OZZOZDfi{GF9Jyxu#meO^hm8S0`}+9h%qG|KAH>uxxsq z0nR!jS%PQ3EpzSc?Sb?LK!<9~2Hv|xcNNIuy6PagW^BAXF~RA&qt-@US5(A+9t1=r zaHMjg^rs2Y&dAK{<`nV0`nJ-7Nz4Dq-PJWq)aM6CXA~6Bbtb?--_xuO)2`WO zK=$3WQJZAY??hHDLs=-v(;ufD(w#BwzOyTqf-Kqxd;LFh*F5truewY1_ zipsyvk@?=B^D-Q7-!Zlr{}&oU5@if4eb?X-z9a$GT7~X|H_?Ll68gr2B`NBHcE!%u z^M})(I*-fX$gE;fhY0%+26#_os z%1vi4Q11%5S!Vxx3T4dK1iy*{F61BIzaM~f=&N8rYIzz^Ov!Mc@g0E6+(+iGyAI?b zAmB9`#MZ?CS2@sUj~BC*z~lo$jo96sx#LG*=meN+%EHFR-(=mY1-5^FR2s0KP02GR zP0mR!Z9Jtnwi3Y`{4diwB-`>Nc^`hJk?Yq)T#n2)am6Kejn{7jJ6p0CV*rmyc zA@kVRj#)(aO@{7`-7PLJKKeQIsTGB?`h?^+(QeBI#MdQTGjyS#nX=u_d z(MJV#v^kc{)6=kr9biKF$!S?sa5!V7i^YS+2Kvz5@rgm`ofwQzCQd1b8buwM)HuNn z3Jt(AAdrwzh^H;rv9MVnqC$FJC-r^pisNw(E8yZ_*A4Df-FQ7dx}7;<}DTfGo?NQfOH2-*IyjYo;Xr6|7(f`AsHq+2pmiiuI}!q z4x2!+QOg74fRAssa+NlO#0y8GmfJcBS60>FK25&B)&T`irNcQy92yYieqWi?@I(3&6?- zU);R>raL;>0Prs+t72XKc8;MOEZaLqL0_< zSTVAcoAl}>WaU4Z$p|pU-4V^O%k)$1iB36vaIhJU3YHsTorzv^D7lSI)QFyh)|&3|+kcb%>nrk_fB|WcP9e&nR#zF4v(^!o2jdL}78;{e1XgA=6MdR}n0ZJ# z#m2yi{i|1)DMD#_`8hrui}BM%f2a_SzN}!#xU3MxGB)=WBeUyc5aTB!7WFtrBBO3osv=p&-DZS7ZKfW)th7y}|5xwU|FY54?}-3c0^d=ohQsjq|8K!cDl2Z@kCa z(nuQ7j}GLWr8q@Vv^1#5D1L*es_E7tLp(e0kb(9vyYMGwNg;`G5vT_;8Q5vutH$WzfN(nAjo$NESeI1=t(FA=<3}1SC;fA;7x$%%(rISnVhUeo{p;X=z9mntX z;v^*&q&NY|2zb#!keJK74;)U+0nG+*4E1ZwWWQ=+2ElU2!4rG)?An&khiZXMQbwkS zX$?Se&^pl4No_snjGWNW!1HyN9=luLzOksW@fw)py33<9x`YOIo@@g#;D#Mwv@Mvxz6b0{6UD<@chq32!bcX#ffY- zQ}Pnk{zNwlDVgqsB3nwg!j0u5WFvqJ@molT0KGFm43;cErQ>h;<1!^JRtg??a#Xd# za?NORXHSv3K*ohH&+h1`4`(2gX(Z}CjEqR#h?ODfKYEjI{x!emxYMI~m?@~&Mk?M& zFcfmwzNN8&D0YNlP=t6G+{yT?QJ#6MsDVu`$x0|Wtq; z{xwQIRPjhu5qeLbKpzB2!X{84AnBa%BN;?Ln0q+Qn47OA?Cbm8mp-@KONPWJ_>2&z zi#|{uF%O+-mq?{#*lSv8?kFx}cQ@NG!i4IS@{pk5BvhtO6&Q7 zc-q}ZDDY1HRaPt<>{E{*x=bE6jrp(szecP(EJzM9psyPxlE>#ZBqo%M6(Er_)V5~M zy4H@!b&3-RNEBFM4Lmh87JA6490Mvsv~ z`CG;8Z;gp7O5<_1jzinIq?YLp{u|9C4LNFxP7136v2P=fKE%J>8ZTQCeW z`mn-E3c0$G-H3YGD2Ll+{MEDv zebLFC{my-I$7}8@)U?l*n3@m9qbpXXJ8BN!XjW2*{7n&{C0?Uk7fn~tm+{7-A-yt% z96^`^#fhQcYFC}UVZf@e5nEMhB<7%P4Em`g6#xF?UNe3Y5x!~;orypk+S69> zF4fr}63Fe-qi#r$R>n?QB=Ok1WM{+F+xnn>=I;gAWys_esykP{*WI-*4H4#lRJQ+1 zG~_{p=+G;f;F7W`#XnwF+Z@OyvqS_KD`g2d0lf(L$=q~wNcH^VYHO@+IAstw#-rQR z8q$kJC%{LR(tk*4uEBLtV)e-KI%n_5p#GwfwQe^jVp@D?xfCa7$J7EHvJisrg=eyz zKOY=XBaCS2-CbDM?9W~R4Z5pUPWuIiq_|v;kLue7H@%yo*u7AOCOEsE1N3d)*{26zoXrf6b zNt3a>6c3q~qcV|cX=VMF^lm5X>3Fg<1YZ;m_`H=CMw|SCmm>03_^sV#{k@x4KVkRM z0JA1_ME7`qKZ{zSN8N?bMpvI5wgj<&qjDAJINd&EBS%VFj_-}aFa=?68F|b(|4cW)mw49G+c$d z_8T#Zzm4V0(|j$XR!0BeXZq&?L<+%f_FVX|q2T8wPQ@d+Sxl)o)wk0RnFC>8C?=9r zX-Xz~U45}QBCho9|>_E zbO_6lWkP-~N=wSe8@c;02Dfh_&?Ft9GZgzyNJX5BQ>d2py`X z@PKPZfrAz&O!oJfeJXv1&t*H2aNmC(u%f8V^+1Zf;0?a=t;01b$~*BJg?-?`ec$ly z3!RM(4bDJ06%Ui*z@@C3YCJ7RDSg;S`pp>6V>6;U6AbiatmEYjA$f?7mjmw4h1T`9 z6j6@imKhnI>@eB>)l%fEk{6?-pMn@~Z3y?3ZDcq<>b>^=F0TP0>lmQZy{6YLO0cuF zHTZ6YuS4)vQ}IP_d+uQFN-+8nS(Ek(P=%(1v|KC0J_foXynRN%CbTV^W=Ps?-N{LRRuw5i0M8VBX;wo z77bq8?*plB-U{B8oD@Zy&6hdC}kCKBVmSY<%G1RSZ}0I*-_&l9a@Kme?9I^r~f%%x4)35jOga*L;17{ zd)6{yf4+(}Fn(F_Qjgr~_jyc%Or*Cm3~u0QbG*goSx9VmBJ=wxSSPdtyZ@Taft=>$ z=a9!~DHjRPcSiOJ|7Q7~CXIyV@fGf!C@OWAxIe5&F&`NKIkQ3MGT3DTow96Qz2b&) z>yAVlM~xFp7P$^Xf|z;vp)XuO52sWwY@X89_p|f9(2skzSG6{MSsZ-If{TgoM>ZdS z`wK}fiQ&DztxWeV**8}lvhX+q?}JE=N3oNP>~ z_8V6iBK{@n8*r?WWaTk;mp-)fGNpFmjhIS#rp_9BeYbZ!tPOt-&A4PqOFXPVQgwRH zK#52qU!9N^y~4NvH`{(H58l*6iTg8CUwf3lqZeLFYO z9+{MjrkI2yl^ymd(a^$=qw7)daBzDSqb;AWro?Xsv@HNp7U)4q5$Me@IR}yq@?7cJHo~$`(1Low7_LD z0-8CMi(xb*I-B|pj{i5So+T7TwxWX%7zTM1tM%JqEa516Hv*^VBcJe~(BOncL{S|l zE>NX_awC~}2K*@@nXTmI4V;%K@5d%BC8DA5sDH2q-+wO?<|f% zwu2#1Z3bybo-9zmZ6ei7WOH;(A;S&!(~coNKqd$c|y$+ss4#Xn!%cHzQ-EAd4`k&$%r z9tGOKkA`u=mFSn=?B)Wvt*2>8fg|1%H(IQa!2)9qNh4O+Mu-mkc`Oi-mGyxSGxT`S zN=2MVcSM}HGki+m5$27d0KN+2F5Nd=8c=_AfcCp`7gyr8HOKF)2l=s1XD+qNd;LZ} zkOQ>a5F!qN_|}%tGKFqgMwbcB`Yl|y1zZnK>4odEYR_^U$?2b|I=xq+1L@P9s!?py zBWi^#;|B()FXv7D#6f)I;K)OlQ8bPxc=U|YgwMCXGzv0WiI*-(1=;{_cRst6D(6vT zU&LRmNP_Fv{2w}=?+;WZQBP0+NNo=`48Mcv(-flyF5TApoSL%Y*IB+*&rKLi)ApXE zN^b5oRt&0?MfENr2Z0@@HX|#~cxgIGA+E*?rVk-1R<~B-FxP5%_BEXjG#FnA+C@S}|vM zD$x4t^x**ZP#${Mp8g(BE^%?{nfR*pZ`KN`HB=?AuMot^!uwT`Wo)b=4{5 zhaN#|ODMCb(S3+;&^}Jh(>I>Hp;q(}UcIpHmvp?BBZ~H1_#WBwDQQSg03X~pbOX^| z%9?={iAbQ|@&$k>xonTabyI4uT@B3_-X42&3G(yvbN>6;XniBvR8O>-amp($CCBt! zGFx_J2V1#KJ$-Rt)oCdH`gI3@h{|GD50vJKrJ7#CNAl-e)UDY1K-tj*+H9=-`$K6* zl|pR$ryUZ#jPpGvDhM*J-MV7a>R8gPe>J&ZM;eihZG0MDzk5L$h zuVWwU4g~0^ZdqX|ZWio|fm}I)pz$Wm>S%`R;F`c&pvoJQauixNp}G|N#*;cxMPkW) zDRA>J#};%wN|Zk|B13Q#P2}!jVnJl}%yU#;u_x7~?h@YV7%^7s6dxZEP6~Q^fcXIo#swvTf>NQu@URTx zVo*6c7H%<&15f`wuIw$#2O(s5e6R@_L>x`z4O~8ga93~j!bT0NbCGo1GXRDFppQZ# zp&dwXq_tseiH-(*&RSBaCmgp;b#{VT3cq`>OS_)5iq&OPAz_>RU%$BjK0Q69Nf1ij z3qZ~B2kS)b(?H1rm^u0I!C|C1Xc?5$@vQ7oL>^>x`v_eD7ei{FmrIqB9PI^xV zBC}`_ip1?ljz(yJw8FA{SyU(wnK+DQ!(99A7K%mo_3PM8%8YFr2)H;k`6ARMI?kN- zXlpKR);d5nCdcWA+b!qS$gHI-oyHF*W#5qo!a>VKXi}%|uwGVLBCl*r@fH?#%K2!q zdT9NOA2jVwGtZGqR#)m#9XufGTdw~mb~c|{Hmla7d}o%hnARjI6)|wPF0O*H_N68!t+9<9bo^|RJ9BlEIu z72)woq@gjvF|Ud%;U<{Kki~);cByuPqW2I=*s^(N`@Oj&rrX#M<4v+rAnjHD+VC(2 zPtggK_~70*g~HjsH1U)|i#hi~!Q~tRuMokB`TJ%XBPl7zbv9aygjIe!$382RwK)gl zBsV)w5nd64>fz2hE54mt|f-i=nj5#OjS1FVAm6%&Vdf^4?b}6HgN(5!v2KE5(|{WM%`Y zrsAWs$&(XtEfFXWlh#SnslVRjm0Z^&Pp;sP>B#ADm|;`72ns*?EdPwJ`NY`*J7*xtq_q`(7>Tzsk_O*7s?awZz?9*rv^3sOfosZo+}g z&&c%Pnbd{6g;PV5x19BPNUpzsTJkAmvd(*i^p~)R(|Zl;3&%CS-(ww8`U5FizebBT zR+YYcC??qK^oJOjZfnK2I-Jix8P>NZy5a#m^1lJLVhR`{%fc{>pD_qLE3>#3bESOP z*oO5y#{yQvD06tCeOEbFdhM*8K#hZ^ER-buzR!<&z9cryzyvK*3!0rI+JkmTJ*&^q5$TIw)PeU#6| zP~sHMsY~@So$ErflYQSzf8F-a*mfnxV}ma#UdRqZ`oxTruC*wv81u=FXNX zti-e#o%G!YC#{(Yx-RY4fU%?#__yjs#D|-U@tO#JjqUS2`AXKTRog;%h&14bZ7KGm zu98$1$w(1~<;FV8DlQoGq*2puKZca0f?B`3T@Buw=6{5ShJ*pnpSZzhM{tBvn)oUH~W%L8al7xR7^LjHt2h0w0OPzvAuB;i`daX# zIDxC3GrSR3zST@;v2w5#8h|SKPYWy z8@m?!J4xwg`xd&KJ(?2!Gsgy1Rz$r;?ipVG0LO3uL1=nBp-_8cf;Hc1t_J5#e1~9K z5`aZB?$N-+M%-Ng*Ged0cC@eqA9*Ckc={4Hf}TJvF_wY=FL-ak8i4MT@L5(eoY1wg zJ5?G+q;3-&_*)JM(Ld)McY)6-{Us8pyIRlT?kv1=9=j%kmZ1#Q$f@gE(YMmXA0d$Z z=1BWutV!U9z~11_T?Tf;(qUxU=*Z^`cO5)Rt@JNj+t+7Rx-Zf-D9b_L##?(!zO5+^ zwD0>{OurrPN~21d!1^sIuvhU7Etqy$Hua0RW_4e-xCf(|nNR^EYs_eCAgi?&>RGdOWy>w{qH>IH+4)2-I#@m&MM$4jKw@6p zFTaDZaCcjzXGi78gQQD_G((L;KhnhtM-$28tb4*EHW`em}aCs;GeR zTk<-Tm``}Uq)I^|EvYLO8RT3DfH-hKR#}t7Rq$4mr=hl8JnEX7yZ}T7*wE_>3#pw& zU-ULsR;Wxij&3x1yXfW8q);8u0g>p-j>t{RKeHZ?{;=CY**kb!n{Uf|yMs2889ebi zSb{}43dgTsl}~3n6g=yo*{y@@1ae;JYg=&fu(i6AbhwF0DgDgnzFhdps}a9hhb&Z9 zCJ_Ho$aqsqas!Hx<>N65MNX%AZoU?TIv#W4{x?>Zjn6tz{WLk8>4H2&pqq6tt zi}K&1Dgh?pE+SCPrBH#4*aBl5-r(DKF5nynq^z{m)F^SuGp-*2Gpy88cc)>hh<`LS zAY*Uk{_5bT3$~2O<6p*{zeIS9jOYqW%iPqT3+3!MZ*U6OOL?$A5-xi=I?!LK8=Z{V zXnl8g6A?7o7<%<8!Q+tm%Qt?zh><95^!1#eU^7%v2BcG$MSE`X*hJ&e(I1_}0$4^R zrgv7uf#q}3J)Dofz#DId+30&~CVsXPpkXJjGaLq+UN$9U@@@WFM2iJg*PA8D7GrmOG;!aA_UgWB?C+wE56yap$3Cc_z|DFX|F|d! zCB7$fdDDJjOXLBs@ctof-V$Bx*IdQ6OZJ~yD~2h`MBGt43RKQ9ktyo53x^yK3{4Bw zjFnp){K-s7^ju8BON466Guhdmn3f?GH&wiuw4>-JSWHd;ut)*5eRDxU5M@4$cK$!yB{qj%CsXsq1 zbI9SWwiow%0|fQ9h2M}lXyw1dg8*nct($7DOB#&pbIMUjso<202C^W z&l&W{++%reyeL03r|5p^_FgUGoHS6{+U{lFM%Vvhu}0cG*4ATvK8Ay6Q?xV00lw^= zUH8=rEp3zPm|4zEn<+1-t#@S9)_O<=vjR>mP%N~aC#rzFub1(4XxAd71|Q>y7_ndF zk4lL0^qd$d+#Q48-qVeSp?#t5m_x{|j6a^I=HT2REJLNY?fu>o@M0nXq$c7h9(IkL zHWBV}{54Z<8!bfe5O*1fFw70rSVB+;6JNk(E$_&h@)>tK@&)rqgog94o>N%Ieqc465_k)6@p6l-?Pa9JevT{@L%lZ%ku+zL83RNLvDD%*C5BY*Jetn zrK?rA+_SX1^s%vpJf&$!DJts7AoPzITMQGJi&%1CvKB5)Jv{Lq^MR*|)gNWen%H zJ%mm_z`XA`E*k zJv6WREpJNuUR>4MQ`nD`Dd5o?h8Y=#kYe>Ep@vQ=C+DBjBv0z=^@Ie55~!V>E41uu zF&8zjw69RNJvF;KEF!>Y$;*qOCK~q#{W;IyMn-j%=Iz@|1Z_r>&610uOf0OR3{BLWO=jP@0zZ)~k$&9NQ=?p$qLv~*pz1<0R1QCFpSwQ#F7k9)cy-{P`N~Rd6m!;EYMQdhje2}) z;-2e!9!^?4hYk|A$ZB^#Lv)yswB7FsLgXlZ!atW8!kG__=$(3n(;RZw`N6d@k+#p4 z=pp#l(d0yw@glFo=IgQ?Fck;ACX0|5qO+bwrloJ6Z7RZy)rvU{xBuo6vFUmpGvvMW z5B6Na2cO6=~`c=OE>}25o(d0Gon-#6PEFxYP~We zx^}55w&sIUUQpVEMsvgK#WN=}vQHOr4*a<(m$-s8e>TjWL9eo3kqzAer0~VXMX)iT zM0}K-iQn8c3S=z^^@#pJr`p>#1n5F*+s{XVV4sBs)=%@MLpwh`i00Uh6)L>n#t)mT zv1oM4()6;raw8pmD9#GH7n#QH59|vJ39N8!J-XsC^4Z^0Yqo9i_bmQ(G1DpSuRsk6 z0y)N`f~yun&a6tuj+>$QZFpf>suDXUO(X#`I*1i#|&U>;@iGGICyORQw@c) z$wDf9ciA~8^m%v~eM1U9Ts-k)vX(sPvU1P|@w1q5@X}lXetFL_%%-E(cjszM^nSeD z!>)^`lGCkB6qoXIL?2vx;Lc05kMl4x#}7S;WneIU7WHXm^Vh0VjgWZkvzyz3neY=I z23^NF+IP-9dcm4QGJn4xwhBv`OQx)53uH!^VVD`!H}2kl4ZXtjOup;>)6l#65!6MYV93V)(1REj%`mwxj=a|i4vi^17 zZrMW~?{5@D1d@Gc$!b|be;c1&TAf`x5(K%{=w^x?JRyO@_=`M$)AhVnGjzP{egLcm zM2&=S1oj(l-z`c03p$|}tIxAR216USCy|s>xDVdFcBi9oLaJ@OP0kZ90w&8km}YpJ zEh2nPB58h13m#Yb``6CYd><2Ja5e1H-f^m>kvuhJpPMps9_>k)6>g#&3FcajjZ_tV zF3u>M)IcaERO!nYZ0)mef0OHNUVP-EC+JKrS5~3_u0%^`d!QXn~mkWu(JELAi|e9Ag6UpcojkC6A_!CFK}A!|5#s9QDM;L-T|;0_gsHpv}?2STF;e9 zQRBo6u#WvUpzBF+V=NJx65K0J0RiL7E|7|mk&%W*iC@r6T2g>uYVHc-I^{b68%>v? z|3Ou?-uLcY-CFou1cAD|_cvr~HCpM3>E%0GAo2wKjI z<#g*lGMl%g7abOBy^-bjQ##SQ|IS|xDH~2h&mVsiQ|XySr0hLXoCC7la-gXm)0@$J z5Bh80f>}9JPWyqUWgo3}S=GHpbm1Y*K(M+RB#X!%tlMO3t&q~3Es^^n=omp5b1SeY$OS=?j9=Xt*^&AbvTnFw zx3u&uraU#;{3U`nR={3=lSw1(LB=Yl1c9H6#4L0&_?dg0geia(<4dJ0qZ%c3EYhwo z$Uqmier`LHhw)%fmjTqY!6y1;xe2-HZ1`psmNuL5z+ zG8O;X_*+KvE7REmSLwc%AT4hr-}a}TuY&2dM@C1_&ir~WAZs}O#Zx8{S4Sb<_1 z#7&5l{%}(rp*tu2ucbE^5!e|bS!h{FHJ4-1acf*(%S4dHRAmym45#OQOC`{9LS1JZ zq5^&iY9t9kf)?_)s2YSf8%_jx5G(;F0%b26ImQUvz^W>b;G_quP6) zhm)X0$8Uf8vK;FcXkvNwrO+$hPe+Kj?iNJAI~u%v6(;tLkYXidS+N0{fd6z8CTwD0 zRV}TXb?g97K;`o<#cJ}4;LjVut>%Jbl)9X!sGML$nnDgM9IA!{Z5kW}s#HF)71Trc zl{0HV=C z3M%~dJ`lY(L)Ss?mCFn%Jmo(=1feR4I@jkNxl_tA^96b=NXLNaC% zT&FV~bqZslvUUDA8daHDZJT2o!x~`=w+@cTsd0>ALyHboX>E1OgGgUDkznO2rj7WiBzi=2>V3f6M4t6V#CKr%X>&2s=medh_dltOwh+V$Uj zP2F%9{Kh)gz&hl_I>s!Fr2GFj;sm%68X9ghvJ3;8XQcK&3OYK-Lp*xzq*oFkqWGUa zF{e+&r7`~4oN@ihSdq~G^OaFncq_Iip-Q&^Bw_~%5w=tC6MjgBOzf6@-8@XMVJW`m z*y8@)=ug8@=^18BsZwWtsWor$z%e|ugB322tK?LWfLf+(un-BJ1=ZAwT#Q}2R23H1 z9RdnarHah&xa?Q%A;3#te@F%iorC4Xf>OaBm;~kGtyV7~`YSN-JNukrHkxll=(y_z zVe`Y7c;XPmvx(@Ssbb1Tv1_Zafgl{J1d>}$YH@8xjpMt?ul6<_{u)#0D_J$MatMpk zhaOlWPjJ3YAAYeP`oy>!wWHUiowXp^^443KUdmChQX^}#qR8*`o z{!PV!&;p@7FbarG9t@5thTRZDp|rB{+K5QqMn2TZiOG7wh&?nX-#1$GHZl;1>+BvD zixPwZF$Mrm`4J0(h8kzZpc)v~MF{}Aw^D(qPpV4qYLML@X)>pNK!hFg-~3>>BYtu! z|AkK_1PYIYZR9u@18&tBX8Ikwi(U=Qr*suPg@*!Hh`u+FomY|uX%rF5@pOzh_xmYH ze!NUE*U@V||CimAi#*@wO~K!kljhzse^aTCV;Frgl4Ch;weTYy`p_-!3#6agOVVTZ zde#n%_a{`s#PPcgbD7g{d~hoF(mJ)L0)-QsKj;83L0OY8p=zRmMRZ$oLODb9aJb2= zvdty7@;boZbR_viT6iepZN@Pj3!Q8X@Cj623=J1P8A&$%FPqgae={xm7Rp}X>eR-? zTE4@LS^#I3e#0jq8C9RtX+z53J+zEA6yj?jNkmw}33N>m2Sh)osq~6QI&BX6y*#YF z{7mrwW&-Fkw^sX?W^#{X%LnR)Id6c1m8Wpb~u?&IzaFA#t69wm21dHcbR%|rA?Vu9;R zmOH#`1G5Sb#l#S-Uw~gIsu(NH0}9V@GmgN%g~7aj=7){7L{WfTBpO^&yYY9z5>;qX z9xQ`8LKhsmB~S49sK~ENK`&0Yixi3dK@1)-IcP9|g1vO#<}<3@9c;0|@u`_knb_=syl!PdzAtkLGkqK4+P=~^i`egrX`oM+!i&{U&8mO2GyY{-v4-&NP zcZu*@1SI3AW#Q;&ANd16zjFTtPO^x~#7_@}AtJ}a*fJ1$R3A*PV3>7LNLy|exBEE6 z-WM{y!eN_ihl~jhsh03!j@Pay{*WUHDxIJY$0`=Beh;VVzl7Opjso1E3n=**Q5?j4 zaB5in?N3gYB%|MA;@3TxWsr(U>cin0hM6yLop8Q`LGgoUl>Ml7iz2}|0D;>y63G-N zm=BlT`Ug8d6l7qSxg$>bipF!~QXEgrkJyuJtSh0?aF7KA2&??Bmn?ul;iP!HXUB}F z4=XCYhSESOu$~tg9Ua{``L?p5;T-TZ{i!#Nc=gQHuB2`ly~q)Wz`4^WHqWluYK7LS zQ+Bp4E{xtvR2R4zXd3vVXDp|o#Y$l*EI8G&`7|%IQAlWi9S7S6e;yO7tNwbz$o99p zizJW?x}Q*4ouy_VP{eA;78a-~33^Xrq7Hh?1bNgzq43ZBtjyJOM!-g~J0mqKt9oja zTruXnbURJ`rnK8owd52VdWq?5I?P9dUPLl1^4fDh zH0OR*Hd2fbBBo^KGea);UY8HECZNf}Yz!9uc@!-YO+7*Sg8R^iJ$@MlMZ2z7DWrn} zHwY?|CyUF>;9TP>yw1cZCPPKuFB*T5+iyx*Pti@f$o}W07nhGQT4TjH`{1IB-KeOR-fapgR*|CPA6JB5XX9|0w%>0m5y zg!BRYhDW6*5#P!Gz6A9TK`TIk!4s)&DJINKBA->!xjU!fTG5C>^avK96nK}_D)Ouz zx5nM^H=v+;!bv1TruO3vCTte{_RPsc>lLSk`0I#D7K^!GWcs4shEHW7*31_DpXIu{ z3aLQ5W~g15#3hpJ?;v^9y-2as8G$gd5KVq_Kat+dL|hK}MGl>#$WZ)d#I@Qf6axEU zhiqVOs9{tAi0t7da+|u*@8ph%y^+33v~d*gKx(%=O8gh4{jQ{B3~SNcBa_ABw^QBog!f|0%g$8-AN4q!q(Gm*zYz%-`2S_Mj>>he~RSoclL2>1pf`#1JIw|F}RvuqAx}`9m9DJHw8iA zlG7vqP@BX!>+ws-$jfY5oYkoeXEZ_VsoA`Umf(Z8p+@C=rzq~T9F9q+S~SGL8Pwy> zQXW*$Ky~}wxS%FBH{qrl2aN+5De%0it+EGl(r&}bT5h}jGx<=t_NOgL4 zIn=*VWC=agG4g_|+Oi<18(lqNZCB*Zm1Mzv2NQ<)iE5RV7+1gy@&B{{r|54$b~mus zLn&Q@wUk5W{ulrShE4y6w*g2J(&hsps3-tVvh*>&`m29iuTk#iB}cKAv$(qX64?&hVjT=6;hD z{{Aq1oO0Z8LDX2cm}$B)F71&|?6X1wh;XPf;^}ncaDRda)+|(hz(E{zWV@B`e10Pa z2G0a_L~Bq*R&iTOCv|a}g#U#H#vSB~r}{&t05z`B^pm`W_l}BvVm@sZy@D`W3|8MG zYUYQCL0aZ<3M3+y)*)lidajs?glDjZn9BGqcuIi%t!K_v!HtfP7ifFl1cQr58a-@O zLM!QWS55g98T`0KzMh}+^0pZ-0go=6kSf6U4lMzsO z*__?Gc$yoLK~&CRT~%#xdJ}%2pHY)zPIs?=xPcJT&B!@UB7ty82Y{&8*4EV!io1&N zUx#0fHf01*N;>b)m1`M#{RPIO>(zs>o%I^=^D&62_$ePUx;LejHU9pdKa2__hS$F% z{!>=dBB?Mtl1GB;Dx2xCiz7-mNEfA%L!SmURy_h=U5gWx=cBWkH?@>fuO(ZmMT7q$tvYWFfeZ1hW3_#oc=1 z!`oN`wE~pVb#9RU-0Y;*OzB7(xMbDbfwpPC>da-(ZvLy2%j-T@u znMx8yOC84`6eotyPxD;I)jx+fgsSN1ECDIjfFoMdz~GBC&^f*#`&S*^zya7$0D|+Y zX~FPew;k<|vG77wAnC9`(ZniPVt>5O?z|V*wov!7F2O<(LeVp+UJG_HBEWv2!Yi=23cD7Qx$FS2#C${MEx<^l3S}c0pYskKf#1?Wx}M z{Y2E#Uk(2Ap9-9>N)TEaEnM#Abt*@*S8}mX3LQQqqS~i zOTqQ74bNah5fNZWfq@`2{wl;fvK|!pWXLj74)HQhkQS3nI1VC?7juTjUM$~CinYR6)48>zWRp~xuH>f*HOq)6LFtbzEm#FV@k^dJvxOtoA+_=7p?UQ!f!H6LvslN zC+!zX0)JDX+Q4eg`)@UimX($L*e#6tS2f+Nczkbe-gd_B(M#ypT4#lS^)zMb-MhMy zYce`4VSwF^1##r=pYgS!;OCOUMU`a0MOHqe=kA$noVg?j6cdW?8*{w1EauWq8a&6y zb*Z0~{QA|q6-CnnyUPFXL|(=asZHgLLxo@~5HGU-$%R@|Z96tvFfF}~>T#~p^qf*+ z6~%jPvT5LWG8q(m9^BOtErUu8ha2pW0|QAF-{zF#*B+v;-<2R|2s{#?%Q3=3c44TC z;!L1Kc{yoemcm#HSu*_b(XO9$E*{f!>WVxru_QbI{;G#P_&acw&#H-WIv9C_B z+sTx%Qd|;qf5`Mci2vSroHBxm_pld=k*gL0NfOW3* z-#X_5);U1`iKP^MUiCRKXmS2~dP;~9fK^WrX#i%?{v5~=CY^8L)PWLYh_Zru3Fih` z!w3Pf(;xSan^;qy=jH%AG`n~{YtZJX6B$)XUn_>;Ff5HsSKoHZ<0<&GJXLh;ib+_LKD@uQ+Cdg2eREqzJkz}b| zo8fA=fv)^Y`rT;?n@E3N_>S4JlyS6GFQ?68StdD4tUwlF)#!AKF>WWt^>SJ&LhAJu z2?UKbU1*pmIwzrToF2^=itjuQ;;`f=L~ky16VyHFv2$@c_2ee-%h{!}%3;DbhM5Rm z`aGVfc``>V10$vcz?jN4$zRmm%$pCK;~x_K^*kP;v{~I@K`21DGmv_E2OO~g7b`=< zLZ2S`j_)F6F!9a>HCJnH7Y&}!Rfs*pJP7m#o;=&(TJ_Ug6d1!p89g<=9VhkiI{}O+ zPcj$WOoXj}H^CH(w83)3*px8GxuPlHlgrES_QVmkE_FI9salq01yi274sT6sdrO0@ ztwv#aLsdPsA!XxOh#u{QQdm~>`M1H`$W)b!NnE_^43K`>NEsX|3q8w5yvzB*hN;EK zpRUD)7CM*xzdT=kg}q+Bw+ZrkHb)9lmqHmP8{<3Ymd@mk9Yhby*M@W-S6a{O_sjFH zspmuK^` zHg-%Q%ys?iAmc~@>)CNh>n*Ye#;1GzG#YAZxk7KUQXb=Teg(<|l1+|kl165Z>=UA2 zL+V?J2>7B@$Y`kM3Qz8{#&PAb+@_J_fh{hMr_Mt6j1;9UH%>YI(~C}#o-t*6#_81VJYgz!5dt;TP?AF=d`CG05LQvbTJM%-h@uO5dgXt zYkQiC-g*ay1<98Fi@&U}hBW<^ie&zd_zi+&w?1q`#vS&a)&yUplRVD;SgH1J;du8} zKf6Hu2s{H0vc9cHJy%4vPJ7m1Hut=l)tIsMgR!-b-joacOg#&3z3SgHj;O`5PgON< zm;T)<=AY_nBK4dirPPKe+NfYS2pp~oE8MhBG$YF)=OK5|t>8Qx*(vNTTe@hC!y;|;6DnWU# z_?G(TpLFlLDL>k=pj$Zkl%~c{6+?eo$}?d0UKDXCyku@(S5s5Z2k{1f?$uW6b#HcF z?li1oNKZPq)6);a7qERR9xgWt$*)G(d>^A(YGicNt}=x*CoBj3BB89ueBMB6q#TV&E=J zA_}2K;L2&I?49oT@qm5%6yr%1=L!T{Jl0}Vrf{UjKV=PxaTO801!|4-$`7W9eJ z>vlbYkB3L`%iF8twiAk1zoV8XR7j1Dzz32L9+8Bv(;E*4`CT9f5C@E_+Y`TA0X6Be zuFV$5Y5ny_W()!jtBGT8IOBrRLEE6Ez{=^90^sct^M&MFaoyWEz8O!hgKM*upywn_ zP@rSgr{$VhK@Bq{xA8a1{5-%Omv$C@-q5NV6-98?dVX8>L(S@1qCH72{sSeyAn)|L z2A?*_+1hjQD0(b9`@X-Ep&#zD`D;YSo5X$V7zDTa&}ECxi;XXSxiXXYDl@WR&=)&D znhI&L%cF5#O*->D{f>=m#jK=tDa_K(b(DeRe|}TiKdsaO0G12I2&2a)?U{JWCHEKQ z0O8Lhx05ezoI1In)89F4C6`4Oj?!t--hIQjPDh@E3fet>8W>lP(A2O-jcJ zBS!~xT@bgj?enm-2qyps0ifPpCu?v6?-a^YnW+Bj?slQEj#=B=|Mv~xT>i(t&F*Ud z*J*C}Z%_-_q!!d-tKN$loq?O^8?GxuB9ao468qYpwj4hl2VKRu`IumE=?K2NbW9+^ z@v608SzLjpacQ8m3=;;3WOE=d#GDqYHCU^=}>MztwQ-L3heyCw_fv0 z7F7>@#%T+QD!({rg-WW7NrH_|d)2-M@$F-koNol>kkNmBu*H* z(^ZDuJc}`v+|Z@w|Fa6*E=YKJ-Qh@+{ajx5omJ!$KI_NZyL{sr5Uh)}qnBv$(Dh)} zn>XwsZh-O)p(qGl9g81DU9OB6KO zwlkIOTb!=ad2)A}ZYEI7;WIm5LXT|^I$fUf{AEfagp&uYm!p1}dnfL`@QRRsl43Y^ zrR2EqUWF-N49&WRe@mMqpmKRxx?^pC&tHB4>3TT#cm2ip+dMrd7dCHHYxRk;68VhD zJkd3vGzvYq@47z|kpLH@QUe?dl^*QWjMI~-e=q(n!ca)MnPMjU`iwl=7e0s8IKI^% zZU>rEHt(*5hJ8%@&_BL~Z3S4Apg%snn4XMn7V%Gh%iA|K=cb7}e(0ogbwq^_Bf$Fx z_8^bj#gda+Y&MbC^0h5FbkXJ*HJq9A<@BHJc$zYZ%o7a~o4UOI-UB@*r4>Vwk=X5& z9@1YiSfdP!F14UF6JJo zQ#$r=&mjjDqLe9~cu;Zir%L?nWKYxJ!Y}>!F$u^vvPIu~{WVoTL}jh&?!Yp5_X zlH1bq|J)!%5h_%}S*|co0&A4hFE6%VmNw1*ai+KM7(_=V-a1U=DXg6tyOMbNd#iIF zY-r-XBen7q(>L~t(zHYMEh3OIU?a_7awe4Oz6p z92TXw0UtIUZfR}72?XZ|5POn#NMPcpnBrA#(d>LnsS>_)5BR|8evrm#S)nwJaK-+w z$h+-xd=N5a-hL;F<~FV$ffg))1moU2O57f_U}Dy1ho4wav`bR+NEBOD#j2t4&gntgm;94GBT-<+}9-!F@AoexY)qm(~8|R2d4Oy4;@<=FeRCebdfQu`mpP>El6LW!WZ)$Q~9U7dz zULcUE9Hhye*IU1`sG49CnwX!Tzq}0WGV}uj1AY?|Tw{x;-W`UuTIpu8$?t{m0{;H@ z7`67<@+#->z7`bp8B2dHoj?JQJ~e(#s7!^h2G)U71D~;=VpMhbt@Ui*(Y!B=*$Mn# zM^JP&FHKh&A+53Ohjk($geUiXb$YX9yq#FNS9$&wdB7rT?f%(~S|-&qOz)7-jJK_$ zhdinOoPZI@%tqh&8_(s3tI|l^I2{dp9l@F#YpFfkLu_T^Gjus8$%vw&|7-0nysGNH z@8Jv5c|l4#6_AuvIu)b^1mvN+l@w`^2Bk}+q`Rb~1Vp4%q@<-Akq?zy#ue~sF(Ajh+lKc{l zQ1e1ED+f1sc~upkl+>J6?Rv$Y5N3Znf0{}SSBA=MO)>>dGK|1wm1qmK3v#m%rRe#L zz_qnCol@NxIx&yytIPcS{F#~h>}$+JBqKVVG)@)r!*~A_|5E+Y>&t05qSla;BK`;& zYjy&i!=^(2itjGO4YC=ccPtJF&ar3mqJ=uX?Z)`eM+7;?{GNV3(=$QE)L2bgP|9BWr6GZXM!v zhauOJ2eAOKQWH_?3q_ z4Rnswb#P06{`~p$=~HTIYUTA;qhV4#7|{iD^uKTu;IW)+cH$&Zb&6n7L|MY1%f7z8 zyoYaQKRQ0s*H6oRM^zS$ZgskIipx;i)p34o8q#)$)L)i>DMYHN4O1>HxL;q!cx>|o zPYOGP$Vo_uwP?Ora^z)iJUb#@$)YdGYLoEaij8N(=rO*wTV2z3oE74>J~|oV_7q`e zsr3{l=jgi~E~B@S6X6JC#rLU&jk4Vo?Z?h7ciBIqOUGMw5F%gh$&L@XAvuwp0eEMs zqK8x)N(X{Lln7*|Jh2)hv_I0$`9y}j9d|HrNRzlZSvk{mq7=2)t}+VDk9sY9iM_qQ z-{`Qa9c*;{0=7p2_wK0_&?LCG>obNtito;)d8ZORUx{Qe3BT{z0c@np z^JC}Vb;ac|j^8whFOVlRCc-WwQUlyO8hq?jc+*&G&-NTuoec=;%P{Aj_#7TmQh$5T ze=Kx0dmMhj>$zF(6QYE!VtAk1}E_}nVP=3_bz zIeY#}ry^1ND@>y}_Wd888#~@S8A7sa2!!ifM8`QIo?09)qQXvvfBu;=dhugEL z00K!Y-l~0#J&D)X%k|!tSiXzR&OgIDM{x5&gOT`1JGXm4ScXknDXi&-Nr}OX!UEbJ~?c&8Mc`?AoBQ zGf{`5=aS8k_oa3hU)IwYNpg4YZ0Hb`IX0h1grqJp%Ce#Ja}5!6Y>pkZ`l@OS=2}Uf zDE3OI-|4qvdca>7NrZg+7UO0>7sD^HS4Bmb>@x*7?VlA$l2E46$_qwF6GRBy(3t+c z;At1m`MBh8DWjatKZ7If_1BQM)W7A}ah3VdM9=;5dS%!KSxc-m1tPSW6X$g~13Fi8 z8zeuJ~;~Oa%Y%&dVt7<@3w3KHQ7JU<&ygQJCd-2FZS4Xb4L%8{dnv z5&J|Wh-a)iuJcXX0CCe>hK-!3D`DOzW3z4dt~V*q#t5uWU$=cb?xuOD9dH}hARzlU zhLDDaqe#kfHu?{hAS>n)+pb~i&2MM2xm>m{`9qXn3IrF2HnczeG4dg@L{%I8oF?Dh z-!s$BZJDo4_K*5jOxKJH(l$s{CxV`3@xb5oujOBl1*QYaC=tw(4I1V)m{??pVP z5)I*P475)7cEOr|)?<>5gC*q0+@uqBY57kS)^DA_L3e`NVeLUg?LlJH156oq4vy0v zUO#^5+#puNl(pPHB6J-%F(>xelMT*Un!-UOJ|ld5d{r=}U0w3@Lv{6!ZI2s>djY$+ zjl|)se4Ez9)CA>M8obtA&x|d!j_7 zpa`L3lfPLkPga`Uhk?-acNLa+Fo8Otbs=nTF}$)7E1NsW=+r@WtGpItN+;X>!CMo^ZwfOZ;qO7Ru?(ARG%@*s8s(o za3h)lvtZ74*YU_8XzB9$hoNuw$XziUHeK})rFv4v=LKH9*SMa<>@o{zobaF z;yUph9fN(0Pd#LihV_a5hg@k~1X@S{QT8q;=lGu()st*|x)5aPX!`s2R}WRt*Y9LpBJIjC zew~weD62*^VQfrybgSgs(;a(xXYO-TQv9yi8`{4H;zi^&xU)l$%HdBF=t}bSZ(_@H zK32}&iX}@#$b1)kE}hhjiT;CzH9*4_k)3N7r(OC%4_7)LO@}r+H!9$3WK00(3*MYx zON9KTfw{NsyGy@Hq_3efYRG&b4KKh`i~EN5o-e@;EjxlIrT8%meJzD_k#vMC4qM_^ zyMV!)6xmox>0Fw)!D3$PS>wm{w~Th42@Uw;IVE#2X+-3bI(ITAAWU@1a^8n`$lR7; zXUg_nD^@u4@VOwFb(EH1VudLw_wT<16EGM^a~3sC=o6wCjcBW0B8i@-!IMG8CnPYu z+Ny@}!6-EaoSZB!F4i0!A@f()B;X?D%VfM+W%6Ar=enO?rM*am&u`(W6}_xFd`dWFwVwG784!Gd{cJeZ+Nawc5acL0-J`$pnSf35~k{Hd6FV7#IL)goR16w ziqhEzRip(uqtf-CWHM5Zkcj6>v*}lVGYF7YK&oallg}i2;pRBJ|3FasA#K1eyDSZ1 zldhDVd)o^mAm$2Fnbj^{yB1cNDzkPr*%`N>K5gI{o-vs?YbUiS_u8{XSu9_hV7mR% zS~r<#h=!!4eV3W}pP`}n%l#!#dtx^M7Vl+@r)yCeMnC zLrs%3?~Tob!#LlP?v^wgciF=5upJ5)k-sT#`Z`r`L|FZZ^*c3|pAHenPoW4iMl$*5-E3zwC~40wwOjLfy75Yo>kMZ@6KQjM3t z$;O%Epyy0p#9C|>_bmi3L?aL{-Kro6Tb@ls{ARAaYK_(HbZJD~BU08RFKIGl41zRC zUNu>$HoGq*G8-L@Kh*r)oZh3rVNSx}Bsvqokd@cCCC@^JA&-y` zmp8{l&q>t4k%tH$LK>hEj>O=^gY<-yM&y?;lHSt5MMJ}3BPDmIY?fgOJ>xt`o?Y3Q z<@^7%08a;b73TNuTI@NFX*`ypTe}~08CJbY7W*sv_l*WtB?a?HAiCaXWic=?@b>#r zh~9#iz0dcVwT+5B-`CeSh!Fz=;q@xkh6yZV*Y)x!LIa!N`D zDLM}Biclgk5aVAD;XCvW_sUq^ImF8a_IOuIzHi&nTyw;s=m!3hMoNQnN{2bGlExN!r4!(>(aa>;-7 zO)San=PgAQ6|*pZe|@Cz{QMl32`-pLo+@Oo`{G5->|0^xU*KMr16AlGEi4-5MDwh`y7O&U|OW%EZ7o)=^)s2jgO7h2!nA%p?a3&^FQ6$*^K|) zxRSxCo^*hp&%wdL#>NK4%Q}>XVq#((L#0K(sx*7FZ@r01Mc2bF--;o=yZKxUD>}=b z-L;R8N_p<-(EL-J0HOjU5lkz3kHgL+kAay(#)uw{2uxE&M}bq-7=Cxkk`WyyEYa2k zoJb8>=kG*_AZZMZ7-_0cY_if5W*Ld=H*e>lWB8GKgn8er@TZj!*elHrdyheoKd=<~ zc&{DHCv+RTx)#k{V$GwIE&Ov)nI=9Z4;L2~0U=@12i}ol&PXjC9UUX19T!oR+fS^l ztYl;YN9}})z_7NnSV<06=e@_pB_;jKT4X&%Il=6afq^2PUf9{}%7FC4=^}l{>EBp) zg%ZN)dp~1i21*!wt*fi+H2dka?@rb`A$y93#KXfw;I4=ER6bkWTV7gv6u;#5paIMy ztcU4g8Nq+n)YSA&2_|m;1zgXi$3@A&CjoCY}o;B z1u&dFQ>}2);XR)zIzo9J#^U)Mx6A>n`}$|bf1u$QM~!ZWZDXC~E6l>O=yAaxf{f~k zPfb1f%JK%K{e(mElU1g2&d$6&?&O==K3paxxc+w*j7;}p=07T5k86DQC-{y}SRY#J zGko~EGWN=C&VZ=3=MWn`Ktq->C=T6Q&g%vl#=vC zGU6+_j=@7!@^9f^%lX9d5BaYz?wIjie+k9Pc`8u1_4H?`mB$Ii6$7SDwnm_pr6sq~ zC$IgbK8h&JjuZhYSTpTchn2j>ZDo{L*w~dut==F~J2O7{U2iYqFfs4;z&%p&Vn3xF zW$O_DKB1^t3D!dd4LvV4HGlYDt@_v06xdSo7q# zO8g17lC6hh&%%i4U_}@@)lQ;3x?U_R&)WMcyaP=UOuKLM*iNsO4Z~*e*#k=gVP$Oa zz0>_jxkxGBYgxPvy}g9E9pfEWO0pBExkmp)!VyiF`(nC<4Z;|EHM< zOJwD4Jg)LOxBy*U&Ru7o5)*2WErWvs?4^=hj@_5k7)&hU!Qi znA5bu*dPc`Di7mXHOa^oOhx=bxR!OXbVus6PyOf5pH5*aE)&~FaC&t(OUfTC2eFB0 zZ5$lj9%QC}9Dm)4{v~ZsgwzT*oYaI3iLJUg*k0z+g|T7soj+ic*ge@f*n2HzZ7;o1 z$J9$z0?Tu0?^SSs)cH4)Y-%h_i906sXV;vwx6u~x+EV8C*lu>QyRMCfS`!m^H=#T8 zdZ%l)&@njmVym!+2lbdm#KdF@*^j|ZmFq%}hPlycGz9=|Tx*Z_!NI|&gP)J#=FWTl zFCMN4Yv|OswHZl8QqhCkLBky7OY!#rGF)FBx9@_M+=u_QQDmzol@v?RwkUUra#Y-(&y#1c^W2qb_>$9>=_vmX^9YGHEa_0CR)X zLTeL~`ApAQ{RXE@O&S<tmZxEA=KJ@KkRLyO zbar;Og$ncV#1eXb>+d)AzjVJ{XHc%MufM*&j)3`WoOka^&=c2A!oo4Cvx#Gm1PLOz z6*K3N=$6)3Rk=VKtl=_lbXkDVb9s5Ga=o|E6^*rCaoY2JdivrsJ})0NQ>2-Ng@wF4 z2Ga+yAB3l;v$?a@WY ze=z^+9~`Wo+BWX_X_KyNU~slkT6vG!wB7*ll``GZ{$)EGo3-6tY!`6&A(lLu|M8H4 zT%o$Kuy?_Q?|PbV$mjjL4#GFJRGNGrh;7=JbSwq z5GW1kF^F!!FDfP?0`2?v?|Z-PEBUESg)_{}&9^;T3T$Dt4tP=z65`!I{BOl*e%qOt+^``@cBrU&@<#949 zX}P#m71+YTLZ&>-8ZNNRUa#(@k9zawPDoutLp$t92o{KW7g3)7nt#pAI5tcHH}~}n zQ$P8R`uhtQLfrf13wkP4Sy8-gUu8MLI}RX+RuC(;D~C0Ly*9-!#*hymK9m_Y)igHh z#eaY!swm4PsH+g4jGSRjLcTjBQO2qqe|5TVc_i@xAmqYA`*huB&-zM9Tb{S>g`utYb0pQFQ;gV`}0JUpoK3v7of44ZyVOspO1HvPRz zJoYV>+q@t|mZTV?bBoNE;mfyBqrvR?snt_u(bTqG{WjUl{ICa6rtFJ@Nw*$1(oIYH z{s_*>7x~wfg`T;;YPZ4AoxSzU^811@QKinpw&Ik#AxBrl<%Ap2!`3|{VA&}E6s)#+fxngu#h2^ zCjMOPeFIM1EP{f+D!1EJMKjfg!r)tXnpWxC)7bCdzpqGw=z#SJ?Fqs{U+wW@bN(?n zriRZgJp|u#c#@N%CSaD7%icT#)3v>KEL-8M z!k1XO{%_FU0gbdeoMo*NWcez;pnypD$P!6S?G4=p&`0HEWn19h3l(fhMTLhbwYXP* zR1C9Xf1}(Nd0cY^R%BHZfk+2l+subb3`y(iptgG6uqlydf@wP<%=T>pIZ+?pZTqUr zkG36r*3~V`o|1{_3ob>QXMW~nE;-lKB|HmDn6wg6U57=w^O#5)nhaP^P(TI+1;NmN z(hi2#iW`5dL|1DypmFVCovU zL+aJp{4g>10~8U`!;p6&JZyLb=PS-H4vvo*9=L@k-6SQ2lNy;>S;Ib54m_JQ&YyB@ z(+g}Ng=ai)xAXPAyuKK|=DVz`t3$2A=8u6#b+4DdhRRFKK-G zU-U?Fu)36eqA8>-bhb1q&Dqa?iyQax?UfE}<)eYAVb31bH$L+T&i3z9FK#@Zw=}LY zxN0SK{bBl>|2qz$9ezd9qTa1oo%sRs#N+JXpmddji!z^3cr^et9~oU#cYMLRh-rj@ zGPhz(V2_=RHMI2@`qpq2e)xcZ-T3DWDjCB`UN9^InQ0V?luqnt}>j1Be<>cSc4WxR5L0nTs%B&kgPx$6AQ@G-#-d(R@1S^KTT}P z=7!J;?C|Bue_@}e7{0TqdP&W9L-OfE=WT))R}1l`*_DT->vs=c{U>q3x%PT%MZdGb zgPpqb`66ZBlaVfs{{Av$f4oXdywF!J*^A7vncamcE;YD9jyAgUXh;eQVd#}16TyR@ zn9vhWw62_GASt6Ubq*V~%M`RFje7WNZ0zXxxVO7Inp#L%>K*h5O-*U)43CwSUx?Cz z$qCmED*UCT-J+uU%H8~4sVZ$_yy8D|S2{=GXRy5b2~6;GOWl{hC6$R=4N$e7en@OK zO z8Kl}f(Q4hy(1{&go$m^m!d*bIsi3*FvtzX#o=ZhRaRk*jy@WT^i{p!bk+SIM=wPS$ z0QzY;JPY9VM!@7p{rW(iC*`ruXu=)!m8B&vy{h@eH&RyXL4w(WyMVuvU2mM{`UxMY8mFha9P=J69=sPjb z*gnWQVgoA2yoAZmDd_3nLk5JB5Gpa~85zXAs`B#WdKAdX>3x2`NwHjd=HiUlNsb#D zKHT;rAoW-)#R^!H-1^=yhG-{kFFfzrUUTuOsF@ARBj@PCes zkSm;aFF=4veQ^GE>0dz{P#<(t_|RDrDzRwR2Qpt(|)>*|$;O@G`T zaOB6cPHrE;3HKTQ>r1~{eznX8J!dZZ$uD;-pkTkYf_eJX)YP-yo8^&_cq#n~96}j` z{QUgTo@LLK)sqms28|Nyw3Eo14^b)HDe4K^Up{`YH8l5Pwx(85bXKTTf>#*v#<2@={Tww z%%cf;dvS5`kp5-Jpb#Au)kKYDRPW*>$p1Z$tIIHVSRoyH!_k0~b?;Rfa9XPLJG?8I z-ZwB1{pQVTJ%UW32|j>=0%iaJ(o0Jgb8P`RkpE)Rv~>=>TgyZ~o$s`u=DSG!CrOrP z2r)=gQxiZ*l(-!P)5lwru18z?4K2?U8X^rSJ&ro;I_c27zDKsOcJl}K&x+TFNsb(S=^()L&)PH2dQfOgRb!qy!@~JWo1eF8Zb!P zIytqySpEhG08BPu&@0#7*~R!iI(i7hJpOsU`#=1&q_x!-*st^gKvVxd+I+R!+KYqt zbO&m10Cw-*J?~TZgJsXC6wh?j4DB<#c<6HltcP6Wt~zcIFD)&(!Bo2f93}umc(}Po zv3USIML~+E`^(P$=TqW%ayYnzgisSWS)wjB6rk7uYYa{ipU>?2_0ksAaKTB=s_g85 zb1HFq;^S$g?A2!b6*S1wbCobM4^Dc5mnDqEcg0dK&t(U&-$W)2=DU8R3hiBlTwqFf zJ0LtfoZ)IOY`}3q9hwzRUS8uGi@t`o!}5hZS(bUwiOI?8=p@?(bpCn-nH1z7>FK{` zXZ_%HQQSN55=V_Hg8_077QHBl^99-2ZT@se05I;Td0cZmWIhs1UTz4ksCRbFiirK!O9ns39ylnTJ_ z|Km~m9{`r2QUK{(GfxqadPrO!8yafGq#&`5l|O?~Q3EY%GDwKHE`VD>Fh;krvpd_p zzS`}Kf){TB@9Ip91fz4Wrh3ZB!QtX`*ng;42V%66Qbeaeyj^#=t0P?~%lmd&^@!wR z6%-Y}Byv1y)7TkJ!D8wLM`o1*fcS^sOSHf!dhmV+{snRtJch`h%iX$nK6#>pU@{1D z#lKs>>o;N9mp-i&UNSe}N`CoorQD#NQ&g0yBkAtbt3|1+U?HHKpmlHHyJ<`Y5EDRY&+2S66%=~FCwchY z{Slz;#>ZFPJjB+m?g-=K2$+8&bmgMrWzm$c3YSKo?8Tv8c&2)R%U|c?MWuH7BF4p~ zwj4Xva+8c zBoHV)_E&_KuXNNK#v2bp+r!Gbw7=Ys;y0its67UZP26+mT|c~8L#`2aXelRaEIsFZ z8)lq#H#UB^zB&dU=aY%c%i}q9B_&&DXX|gd>`?Sn=+}n23TZII)<|_kuy#@$aBVnh$jZi65AYwPByhC18dw2{ z2j$spVZmz6$@S$qgkOk8H8dtS?Qxl)K89LGpphH3$B@9{IsQg9{Jp)suf*S@=m}^R zr>D*UgXPw%3Scup0|iZ4S+u(hloX*uVO^VtpIv8o*BpNe{a+#(d=E79954_8ko*CNca@qzp(?z_L#b%Bu|#2uKl2|){{yy|*XWZd zH@D-L=v#neG{Q{)W%#o3hs8bE*P~-&_xxG%1vxm18&Q`Rd>1f$=?~mFvq}(*Sp|n* z5ePa{C3zWbc6N4AQ9zKpQ2W0?Ez@pqhK-d~1+pKYTyQxxWYj~O53oBe35n*DCtY%P z0K|f7SI}9Ci)+BFdhZRu z2~3l)AE^Srl$1YUyHL5B&Y*?$F5dUrW6b!3!gwJiQ`2h@E5(CM4m#fWtSskx11O8q zqH;@0zFFJ@LHCf?=PdeMc0~n+7--s#wkDwyhk}qRUt5#x&G6t1tNc|{zC==qJuP|>l5-bWv5dlGB?nMa=jhxE1_2qLOwxZR9R4z`UD(|<;+C_eGzbrY z%n9Hx;81`U0w#F^$0Y}bhoPltkedFGXqSEjC%w>7U;F1s@DQ7>M+P*WR%e3{Ip zPfAYCh7-i91js+cAn0AoO8gS00Pb2$eVx=+0w0PoFk`w@ePjTciR%2vI=J^Aa=lRe-xz5aYzQ2M}0f|GS{0 zPD&DjMF<>a=rRRRjd1;?S4Dv*@Op$q}UScMsOlvQm+ z?pJz%IQV&a)svUsNL{5?zeC9{^s3ELoA&+f^th5Cti557YOAcQ1QsAS_Ya_GAddm~ zVtad=$9v$lIR*vpUy7xSI7^xL(V_xBE##xB_@DK))9Ld0>B|vxHg!9fqh*zLbb5Ol z`_7e85gp>S6%yZAdDT&6eXBxE=GBkMh)@bcM+L_loEy)J(NbD|e37NPoxmY^8<++j z*#8h!BqTCbO~2RwU4=YX)nm4>I}Sr>3q=~>hHl-u<#0*fFy#v~Y$02Bd+LZ_{U2)r zgmjHd#P}xYQL;pw-)lM};jKg80`c173d^@HD0umfmU2sTGs?Exvx60|JML$f(VyN#-jf zj;x}hqMx5+h8$7$r%yhRTFZQvzmZcI)K5B`xpV3>1~ULE1Y3097?a5YVjGQ!lSMJp z*~B-T&|c8G!d80bUY1h~rqX9V$E7Bk1DvLf9lF z-&;2SEdjW%{qGl=G6)Xcu;MQXu`w}$9f7A>jZwF=vjb?q6idQ94gmodgmrfIwe4+3 zm|F+jgTVOa#s)PFjl}!AMuzK{@*&FM0xUX;xtM7b76xxk72^W}a=17W&MI&0S(di3 z`(*4dQxJ50N1uDLmMsv>a3(<#fK|`%-*%C`yaJ6KwdRjNST);sXx{g%dEeH9xY&M8>aSJ`Ndsa_$1r+G4{Uz zz=u83q3-6bTYWc}2|#Ic?_N!FbGlXu(T;*-&~OiGDNsbQ0T1(v1Tg$Y-q;*KVcMCO zc4k^$1}%UP^yHl)mV`TE{za3K*8-+)Y)nk+Zri!mlP52^^Xn=r-we~@5)(Vy+L}Js zsGX!`V37JH+e9#M_!P+R7fphy0Q>wDRK1SepbX?oQ{f_y0zC~Jt^iuICM9MOP^V{r zOo6Xepk{H&8RQa&*-vSQ#!$?h9jrqMvY2ss(gW=%fCx;i+}wlTV}PiEe_ulsu4SOD zEvPcTXpghP191~%BVfCBrkhA-AZIQh3xy?MGoMvFolK07m&3Etb6QSw1wLfN;5Z3=^ zvmq--Y>?S#%B!Fm{U!n`Ge}V&{{a4pkeK*QcsSL{>aq1hJw2+7xK5%p&2hQwBX>{F zU0{b>rdJ2j%&Ce1?yIP@HE;(jqZpb=Q)T5yrZz;!@{8wk^kigp_TxNbo;|(241A!XtB44zM%I$ zKu@V6AAw?O_gheNE5%O`+wab{0t&NgJ_kD$_@fn!8y)faP?!%8u_=A)>sv5P)iN+P z9)2o=;De2sV&ol>6dW9!kdSa#@l-(*mi{*m4@Je$K`V3nId4eVN4b6#AG;R5J1fzW zlEx<{y8Y?KMPWtdrKNz9?*rW4h^`)wK+@AYh5N$T^%`6Aj+oY$pyvabWiC6c59pk& zUQxJ0xw{BDDbs(AsSPL&A5uvd0Wau!K;BP-+?m(-0qmb|GwaER zhiC}Imw&Bcl0xXCJtA>wp{KM8l^Qp>*4%57w`L#4$iw&k>0+4YWEICg$X}hw!CoRdppVq;bftCnr}hZsIJb zws&zs20Nk8qTb+mcW(H$Iy&I?LQ9WoW<2!t<5`v0Vf^195y&4iQ&Wr7Y1~9Oj8oM)8voFR=(BJUUvi zQETEorB5;aSf^dO2NWbwdDkXl>gL=220{+n-aaBoRnS5e96txK$bJ$x0!k7@cA~JL zV3mXn5MFRBh9Kk~6h&NI(fkoZLqkBwO8D9W%oZ!1wc2{Rk^!k-^s&qt42wE~8|_7d9)=Rb6gsx8J?Kf`t@fwz6650LBG&8)13FNNLi?v@$m8W?`*n=0`w$>fsMVox_ZOqK_(z!v$fX5 z3?jfa5DKg>+M{cd!Ipvx5a1fn&Z%eZ9HLe#@Pr@|fD4iwSx?Sqv|l&Yf~Rp45CVZp zvMz{w7Is{!&l?XsThWcT&t(P(W6}3j_rC=*XkZ5-R{s8Ny=C zD=f5zCj;msV*an!gp(gUSGB@~>uEHIK!C1ZmP8&z2cb`H8()dSqu;lFL5*rkBtAU=89u#5~|j%4%wU zg6_da0sa?n@8swl$ zjnu)$beyO%9ZVP6a=Zp|=hOrTh1{Sf0Po4&cn?BnaKSQ0h5($4_7-)Vlv_w>G@F8! zRvbgUjYFDpbPY2`I1dr!&S>G4pUBnIR@ebadv(V zD_LLCAK+beb>i1g<)je2>6u0I3+(8V(V};MI)1G-k0!L${ea1+7IKQO@4G`4pq56E z+|(!HMU+Z(_uQTHWEs!f>-$_pI+3Ac&$6PSjf^Et36{%0?A<6p007gUo;Li*);-R* zzVKL@tOpLX(7|>b%qc1^K27mIO#vNXcW*C)gtr?69`SJ|Vd0}dZ2Aeml0YtOXZQ*gt95Xaf5dMV!u3%ODls&~HzP#dPq(s&{#7*#t=d&PhS(zC{Ok zznQHD0i11MW8;@al93(2@U;iDv3H+VRFTwnEr`BY!g*?yw+#p)B{{iLyr9!`V=sfh z&rGvBz=nySLq8mw_XF|JF7W#mf>$UmZe`dS@ z{ec&ZbJsgZKpZ>_!IB2bvc|H1LXQEFUk9Bc97`|{0~&Z`euWYQ6|Vq@o%K6+R4xYP zCX|i+{TbpfYuF>t-VQqER#e2!D0z9EfauWYVM54Th|93pQIM8TAf52;J2_+sNF{ec z!3{ys`&5JsVjKXU4v3|{ULb&grCSOrayvUETBYvO#_!*Y$^viQG{RSbC;9<6A@bkM|nq&a2 zC;$Ma6i)_q6&hzteZ9)%_2CJOt_- zFbdG+L+LcJY5eTjd6eZ^e?X2LP5vAy3qo)h z`b&aRft#RI;LOa-6Dwq(GPiSfUUl+G=pzHfDJiKQl;&TuF=f6E4PAj6xg7{a*lKQ` zp2x?>|8Ow>ISd0f3XuQwOoK%quv>58kAMe>(Gso1ben8R0mk^FsM%80<589zGNF9e~==h ze(K;Lw3bc{Qz%%P=S}aTM@#E$o1gZ<;tJPG1V)JTy@fB=YWMwkK65fZk_S00Mg~C! zA_}7vqZTItekld8N|QNaS^07az{c7TBY zH!}dF69AFvRv7j;VKm9QT=?o1BB$<_{VEl0`y>2aox%9x{-4q4-@&Bd@?8uOSUXT`=oD{$D(6 z+TaSn+`!gB$`le5+@p^VM4B~B{rmS11$Za3J%EF}P!=I_*(oR}Hmu{;nELmDe&klr zBw~;(%gXrz9~dMCS>78QzC6EiLa|L3Do6;3E61O~X$QETJ}qR&Gyedp@JUhIen{BNVuKx0zHtX5#gva&~Ka<@wJ9WF08FQIQyI&X4%mp!?C{Lf# zZ-}{UYBiTMYZz){<}2Xvj}{bgGzq4>e1AXc`uW$iIth2R;e}KmsVHQEZFqtO%&1vy zdh})3;vVQX*vas^y51#f0b;$mxe2o5dIMDsOZ_n@g!cDe6EVx^4H_@PW8BPDUOehk98m2PAJyq1QcZ)667Bvvmqdw!eGX$?e)>T1n$ z-DSO{<{c>L0C)ES>dr?}imF>IbLjkd7tX6G=WBsb?f5*NX^HYF7X?cgZ~m{9l@%zD zp-r=R)n5Y&Txd9)QD^S5y=0d-wh zo^j>)Ij|+rky&!QHLA2uFL1-+CBy46dk$j2BcFV&m+-WAcAR)pUhU0yg3jg5i98@Q zkQxEKD;+I)cgU8|2R92CCDau_zOOONyRb$WvtXO`*BFjV{1M}<8;c)HkXntDGN>GX zqO24nayE@Tbj8rVmv%AbX+{;Q_3ikQ5obE*x&AeqEl&Mdfvxv@&x@h>8KKX+(a#9 z+w%IcxDZnix28kFNw$QvGZnk|6?;K6cC)!+Q`rospWywfC6M2@6O{9phL)B-O!ryb zYkzuceNK%ucYM?L^32`Z`XR@1^A4~TaGAbNgXUs;O61mnrM@mtO8@G=FhYYL2C&eS z^O=2F#D^0!Yrp)0CMKGUPKB0i z`I_A7R-@ST72U*%f*t9NVT3f961p_mI$FnHI-hlX1Y%yaNC{!?xF?H+=$2MRr+WCa z>E0PT5h+1=3cd+a2-n2$YdFEJJf=6a!ga*Kp98t~hZ%9!9-ZxmV~e(u|#dO=;D$Sl`wo?hTM^FHY}0>= zXbj~Lc2#jb<{+PprcZfD6N~fFvHv%-sjamajY-*C)&Nbb^n$Wt_H72rlk28Vp#dsI zd@5F4C`R<*k?S`+@m7-;`OF*7j4{I!fK)=KvNTP7Tg)OFCP}hDPH2W<0zV?|jw!Rl zg^SiiRsf?CB2WFd_=BhK$?jqBg=^j6fk1@6VMRkA z{;((^5CJETNZ}~7Bv{1!|McZyf*{5-7`5KUqkMIfZXhSk(tlGVC++z`G7 N=4@*66|yEl{}0Q<)6@U} literal 0 HcmV?d00001 diff --git a/Segment_data_diagram-pdn.png b/Segment_data_diagram-pdn.png new file mode 100644 index 0000000000000000000000000000000000000000..016691db7eaaa3e5ed8b1261156653333e474555 GIT binary patch literal 142952 zcmeEuWmgwk)F&nih$1B*Aky8PqBPQtlpx*Rpwit)cXyY7fFMYxG}0;EIh*IsnlCW( za_(ApU9St}f6m!w?_VAKWu!!&AmJh*ARs&u6MZL#fN*~a0pZ@=M|a_OgmFUD;6Hb4 zj$!SLu^B#O>_-7zCCntxhC7f79u2OrfP}L}JqQb!B zszBV|?Z2<^ltgNw`tNJMy}V!W->rLtHQsEym#Q*<=|Lw&8yX_$; z-1tAcO0n~AszzU5-x;xBs>b3^z1sgdjj+u>B{$izW>eK}=Z9jOTxkFQaQ-`p|ND~6 z{9IdGyV{?!GuJ%V)s^RQb8R+RSyon-r(B}xi;C}qieK-z_fc8-&)>g)D`($(N>Y)K zEKS$hNW{|N^SL_aNF{CjDbZ?lK2j=DJKFqXu`!ZIM@QG6%$uQ+eQnN{}ib!OC3~JR=#94 z9x1y2=);|$jrKt7rluzNeCd8H27QTLZ2g6*6_Zm_w+kH}KDfF#F>1U(Naer%c0?p3 znQy*6RHM%w8yo9QVBZoj^PkW1^O|recty-=(XzJj!zXUsKG@Si@XSR`& zrAVGRzOEL!^J=29l2o9uTGoCQmfv_I6C&)jb2e5?1FcO+f?oZHDvz1?O6ZaxME z#?r<{y>`o&jnRU@l3H8RWDcv3hK7b4&B&f8>utVIo3GDJ+I*h0KPj?a{%y0`$7{DS z(%`Vef_-+l9_j1*%jXFmm&3NHzJ5n+x+YWAAzY}O>js3*u-3LVkPV&z`Ti*cPgs)=Rls&DV7{t4j_BT1~E;(B;27 z9Ryei$+DP?xIOG7q4uzb#*#=Z1s*{8VZ!iJGU2)vAzceD9#Vp*4h^)^a~`3jsMj7 z%^RIuN<~HGQ2`XEyo^lPmj-IIk>nlY?@Uc;Jes)NFCBGF@4k9_ zez=a_?^JC(N=0n8oZ@kfMpmGlD|4rf5J8d<{%X=BJ~uTAMCBYQ{I;BlwZHT8MAHOx ziuo8wJa;?MaBxY;aI$dhVnk11?_wq@hJhztPcWH1bj>6B7FcE!ZQQ= z%iZ2j>~?1HCy?$)-hS@(`-q6xlydK0XdND|%j;U0FLngCE?2A9n0L%#2|Q#l9C(%1 zMWbHbGd{I{azd|=`^=2mojV<~F9n<(V5`%d*o;Ry$B$Ad1hO`>OY7bzu;JLL zBWS;Z9uuHiX&7#~H&tN}TKM2Df0=CPx5#82S`G7y!*ycQ!LZ6}gt*ToB_#~UCAz;t z@(yU0$IEmD4-(nT)Tm5RUul>Orh8l3h`3W)zjZy`P5V%1UD*z6z%yz^MWDC~b;`u& zcCJvaCzkg5!@h=&-Ana_U;7P=qed}p(P!?GD@U_vrUw#i(}5GUzixI3>vNIYO?^;s zKJIcObas+SetYE=@|2KIvMRXRbRwc!rBu7c&(BX`ib9~?=3wQ0nv+xtAMYsJZxQl; zbItstY)A-{-cVCGF2`GFbS~WXTcRsjbQa%^mQNWJ?arf(`|U>a$1&Z9{>ZRwUVo-_ z>EoKyY41a(zrG~&E_@9gGcy>jutv*WP6Qm3_5eY~AdBWJHr5)KwE?2}%2M~M^O0#f zfpaG99|*=|6Xl;IdKnMG!^2y9@VU7g;A0_VV!)Ywdh{j(+EZ~C8$nvncJ?!yCfPa` zMMdSSRhy7&JR;Mf$kRVdmhUlA18yp;uuJw^y^*cI>Us7AAO?$sykvAWgI*VX_8VIJ zP?p57J)jPYQ~NtiBvon}sRDP5$zZH8>G7ter9msF#O2!CENMpiWPSJEy(bea2rr(( zCwL&^8BedpSHJS)1%to^_1*NiwtH4R6BO!4Ayre4mizGW@ok_oZVt||C-03+8^m3i zu?_nsx%am|?=ANC_fLB?vD?if@bGw8nqL;LthCfGD2PRmSGo8D+R$Z_>lxFTGWiQu z<0yvXmfZE0J3}Q0tNq9)5%xQ?MJM9fQb|;jPFXkXrsKQN#jIoMosaTM*I}$~G#Vi= zP(j%tS=!j3(>cNgjlQO3V&m(~G>jBU=KPQn;_q<F1Vh!- z%&FGKNVA8BT4MUADmAkp2gI=A_V)J2cK!{v>mNIvy`KMuL6dQFadFZ8VPmN)GFRtb z>Q|Yvj_GNhiToTLn%0n`iSn5`8(-29x$4r=7o66aiSK`PbYRh{ zDdg&8oLt}Yl!eAF^W*aDVBI*DR3auUEbN_!rF(lJ9SIU2K0&GH8nH;oz-GI&+M08n z;b8h{idUh;!p*sJ2miPClYL3t-m|5E@MUKS1e{k^SIJqzSWU*(9OFXVOaIo)xd;0B zJ=>P-J-l&yWP_sDC5;gp5b!&hmz$R9({GHcxqAW~qm@ST#;>ZYtGk-^IkZr zS8N>j=sdpY{>mHny%1_-KPT;Y^G|5C`KM3O3s(<46+T1l-vOYIQ=kz|rPy@2@sXjx zgI2c3$bs2i-1rL|hWw4J!l0cmK#yYWXt*c( z2Vf3-XlS_`j&VKirOygij!J~-EA;HxnPc@FQUR7!ivF9ddg6?SfD_)_>;dp8?{g3# zKi>p4ce&8_@PM0)nDM}1)wb%3@>Aqba5f(2>*R6VyT1rM9<3ts^9M`%B52kPZVoJN8Ys^U($j%b**hw4K!~3gds9afZCX z#mxN-z4(5?!I%UyqGOK{NT57hfB5F+QsC1^PCUKlS($6b@c2x-x!rE7D6u_VS78~z z;d)xyy7S~!Qh`!Y`~X+A#a!}MVBQmReL7TAYsN7d6O*hPwWJMk6K=P2mPU7+sqxt0 zr`i^Fg^}cxh4MKeA9s)tqP}Wl{*Zw&`;5+x|K!@A)0td+DPfMbDcM-BP!CP#MQQEf z$CfV-ZcdtS+HaPw=MTyii+|o69J*+(l3nv3Fz>B@Y0K2b@P1zMGj|8$74JDru3RGw z=<+AsONU?c7OC$SBwRVfe(F8l>5Z#GSI6zDL~Mipiy6O~uUHVYdyOzu2ERZmdh0&K z^cmZwKEmwZkB8*OnHJ*eN;FJP`+ClI+H=oTX?0S63RZLFt>6$4&}|8LBVl4V@*||O z*qYrzvAaCAvWcFsRP>eh{(vqN-PWj*dd$QYO30rru?Vop%j5j~e29N$2Hki_Mz6bV zM*C=Wj)ON?i%839B5=zxo#%qtpf8j4TU;E@QPSN^5kW-U6x=p5g4qp{5js5U~Y>{x~nHT!l3wAaqdv%_;rJ9f?I5Ecy-rAwlep8 zN%y$$UP@uyjLu5F9WN9`y4xDi>uZa92tf~Fo}?AibIj+dr5JuMzA`IXv}?y@F&u!s z0ImQ)hMR+fB)MQab|2CNy}cBV zwk8hXDi38LFlC+W%!Ly0su|*{R_I69MIE~{P{&^Aj*|09fB5jh&PJo zL#FY*d%)S*n=R!W$LSZjlMT7kh5>l;mAFVW_wL=xYRY|*%G zD*lhm6}iRicjz*~A!CaF9=_6*zs1)jE9_SH3HjYe8lwiD_VwmVT(msqS3jyzBDLRJ z5Na}gg>0=I+1_I2Hn#q-LBylHre-w|kaJH8KR*-GQ0)%kkIK4+2ADT8)A1CR@9inE z?In4X6R+`FU)~#6=f2sddLlTXc!#xrzDJD5u=#}vMdtp>r=bTL^|s+SZ1)5<0P2Pb zVuaA`UFhwRDg`OvYnUQpv*|Ef1k> zUQjCja0Za*_tsN^`h|@RwTzC~DfXj{QFQlOn0g^usHKr(JyI2fru{FyJm_@sB4;Y` zY)V?y0#oLLbZv~;O5Ur}t5s6WWdTXso@rpGqx*DHjlkrIO|N7J)1blFU=?u4}=^M#!FoPAn52fm9bi{{7Jbx>K<6=}WnaU#~rzdKdfPU1Mu zN+$zvw!QS5bWL3dZOmK5^^KL&-31f}lfxM$zhz%8|I$rx1 zEiY+b<7DSL%c_m`egsAnORrU|)yy}?%gxQb*GA|W^l$N3C{RF5aWS;>&(~tj7)a6V z#v`JeaxFA^FB6EJC^mXfcd=#Umz!fN@EXR6sK+=4U)}V27j48kT^#=_)oD8|UHaG_ z0GyqZO)0*I5J3(Hs?do?aJ1S#JIDE32{((5iKOIZWhKQ{SvG^MkXLIn2v?Z&njbhuD)hRTY}aJOPRXNwb%qoB*48o}eQhUIBsEgL?|k^R z-M;K?onVu#U!Dz(t>4?XZvj4f4~9kz;J*60x4R4Q=fTq(=);ykQ1_6hfqn6Fa&sSO zY3i|WR7gdDMN!s3k;y&BO-(2_mX8e;pyThnR`snr-`(T=HA0aT0U4 z8+C8)H@am2$u*^=f4|18_QXY+MzH-4Gxa3lXqLm4VBtMV`HuXdhHN7Gay7-nOJcGk zxXVCCcHm^rqeNVk5%+n-?z_&bdlgpF80Dx=me#+}Og8ELC0!2J=2vr;uUQ1R_MwQc zuPzQU>LuftKA8%4sch~V!okJ#OiCao_$Jfu z{KyO&v)dCDBI9BKS!eV{88hRL_L9fTw_6`ArKYBq>HgYxT8W8?ffcm#*ocY{@VQbH zQ+=q=@2xQCCu@ibv7PRC8+-JeRD3`Rv{6MKCRGzByh$AA;EIZhQa{THd?vk4kl}*s zBN2YU+;GJz)DM|0n`rW~Z^^&6`TNRw)flNbR!2wYRtQU0pKWmHcjTs4sWy$X9DT{4 zEf7J^bseIrb^W{~K1C;kV2017Q7n?|JO5y%(J;^nTo((X##)z?;uU%~SJ$D-S7~fV zz3g+li`ANq&areF;`WplD}O#eky6NR%~<-|OB~c#GdnxmD&X^4C_vOYvE1u#9gPVY zfz8^_7^HqjLLSFg$p)GQO0?|k?7BO&o}azcX;)TOTCLP`Wzv9i<&GN9NEpRr$v%jx zj#nHVmw!vSZ~CV=sk8tzfqane z+WUT)xm4M#N>Ni&yGJ?>q`m<~#%RG#mt-hE)9q?iLJ-g$)evg$=ddf_$b>{=e&PI2OKnBI*tHW@(>p z)u&Ap3YM%HbcbO|SIqLxfw)x=phqg5I?vml^7FVH_c(H+q_PKyQqo~Q{Yc1ep2(r@ zF2^!##ojn18_nMo2eA2tU1$H+M1^-FK98fNT*)AfMP$mTTI;o3#S7yg(0dnqBjY#H z-ue!?20cHz4?UicFN)0b@^F3lmQ~I_o)Z%jLPDgR_w!`VG`T!xFC;7ksk-58&;D-^4zu-AXN$#idd=_S zq8BKzSNFLdda;l%e6E6qp2A`jv3t8*(0ENs0qgV5&@i78Bid;2IGJ&1MU_tB(>Mui9GCC<)&?k_fsd1m z>l~VFe*$|+X}+HP2tsBPT$Qn0*{{B4powZ~YIe~r_nDi-WTjOaEJXq;v z9^!)ujhv7gnNS-Ot<=<`#bn-$WI{Ww0Fw5HBDJbh7mKOte_s)w237WVrAL0HN+Y;) z)vVLz|))8i#e0Hwq>B=+=2?z2L{_{UG5HiJ+eNiIF4f1o)Z@wZo^%1Dg* z7tEX&wF|Yi9BDzpR62qh<%_9uRIgqMbS}NK-;vVc4Av-#8})vd@ddvzh2L>3L*%J@ zdzRr(4D;u2sV@H2%;nC(l^{b^%G(jT`EIr7v)d1tdx)Q2t0|GI!4|+8cmsRH6(H-X zt>~N7wrq>F@^g<(Me?rDb679=?S@tBbwvc^w1)uKzUvN%6g!St>QBW?Okwfqoj&nu z#ZJ$2@JdqL&&57m>P}Ugb@3@aWMCsCOexlA*k4i2lgr8w2_E&TwjIp9xl76hI3iqD5gZ9_PI6~H45Q0_J)R4F(b>`Ow zGv=B-N>0tmsnx4Z1z(BZz&yQGZ+0(04o5QB0u~6$Y#PAKyk-l8hhSeA=`Q^AZ*_Zr z?g1h*%c?Do>|b)W4cWwrSO!*^s*{s)-4cza{1L45j12fIDL*u-RT>fzC>W(e4Pa3# zNva$yvTKQIj=DC#~_wm{ghCM#CVu?{6^$ zY+lCs(XYQk_t_Gomwu!llBL)-_MepoqU#C-FO$k(i7F1rv$0pfcZ7B_#i zJeCjG4wkz?YPh1Ga7qADN2E^M=kuO_*a9xNJPKu$25BVOdyudrUpL_6;Wg-WJ=aN= z>PzI5pZqdHBP=&dhFGxBiRE492Ugl+bh6#E`Ul8ZmvGN8o26;Bz#96uwZ-DW4{nhH z0q(ujNB0ZD*o1>|k1o$_V#0c}1U}ydUqd3eD1UMMd2_9+LHn@$pQYqdmw)!{DGCFl z1u)!NvjU5C#Cp{w!l6X`Pn0Mp+1KWC3|>?;h8rqaB8Gm;nfJIl!rmbTF(DX-S-5Y6 z_#P>%`(wEj5|t;99;IsHw+D>y1_uRAH@RIXYq@MskUmy=#98*=NA@BxvLb>3yuf*Or{ucyo0! zmn9Lq(lAq^#os3KWsNBBAs#w9@$^S1qPtffSLa7iN7@RuY15$f?k%)?6Enbo05L1l zCYMmZcuX=rL|sHR9)|5>c@0r0b2-~N5$b>}0JPMFVSPrvs77_Zq`qVOY<*h@SL;Bg zTrZoc()={ydv?i3sPbx3&o1aR>RsWI<~8&GSFk$?7EK^KgbuPV?voX_l3F<)_bc06 zvwutuU-6XfxBgSC(YnP!v^!O46gjI%LGdw>=@U{jl2VDLM%=IDzLIatb@VA>sLE_7 zs+K=o_TDcDdLtESHcsZU`$yt7-_MhNUijQ9n{eYE&Q2HA(bv3S3{XACv4q-*g@YcU zph()k=|yt}RG}3k$(ukfojg*al~O~=wQ-0{uPUfJS7$>Ws$jF!S!T5;+_*z3`|?OT`0B4_U{{IU4(7!l>b%SbpWe1f`wa#EOx&%f{FeeEe$SLIcRX$)Uy6p! zYSdYK&wW-TMZw+Q-4(T`q(2@><`nfo`Jl&cOTWCjDx!lqrvxs~lQ=ian`<{K-JPkL zlF#c;Syypcfc;uM`xQ!9BA10Urvwhs@>4dYp8!z}8{$uXLCs1u1N(9@-bV3!4UH9d zs!Z2+uf93O$&0BWVS!=vZI!+7!C*&sv6%7$J`@!izyg5y2i0)jQ6r%}#pimb%tydw z9l(2xqEs=j=`Z|1T}%Jh9Ix}C=(KXKY=%#wwUdv8@#XVO)Lw1HU65EhJ3E2!4rv85 zB1Ai@Nl{boe-9tX`X*Qu03QVuZ^YD}$gaZ0v&OQ#wbgT@0KfpoUgkC3C++$i ziO%NoObmPr$RD5)T7aDX{@4*2(6;NJn8I!6YV~hHNl{>!Ksg;$dVF*`SV;mt1Sm{z z``Gs>VGO;NX08ko-*Q4lWhL0WNuPy+NL8oTnu&TCJsY#oADJn?a85m^r~SYrc7Z8K zCu1@zB6FF@T9V43K>O_AJ?cVt(hUP=;kDUL6faesny2Fn4ldo(0B1yjB zjUGUm#k)Mm$9IDox&>X@9S-Wz3^=Pm7x}Cf?$ej#i+9GpG2nU2m%@M*uHcmLU(R#J_i?EfaXU_fN{d|>3M|m8d6_!>& zpm2T&T`%j$;eaC~FZ)Tuv2jaV+a-2+h&ioMr4RXFe;Y5sS){(}4Nvy~T}5jdX&(vnW+|FO@xF0QY4 z-9QRKsrMIsz87QTa(Ar7WF=*l79Jj+rlg!;qLjb;H&zp@9ZftHw1D%IjB&}m#XPD) zRze}l9-<|&KWnro_*@D*dp(q-=B3a{a#Gr*8!22jK#kbg64MVGSu?5M9w6s;J~WI@ zkE{3Q9QyP-Y96t!hjVCq%bs{l@$!2a>*i*A1P+n}T6R$p?VJ*fS@YTNl-C6-yRQ{n z^*#e|fCNaa;K0KtxH72)N1sMsIK9D7^DC>WV!fdja=5v^C?QITWgHGPpg5cFyJqGa5B=J9;uR_goS|NtBpC7EVCxmwH4l1@*LApHfc6_`OgIZ zmGNH|O#Ivivf{Emm}e$Q*$dD-u`l4Z4+d5p2enhsR8~~j*xQ49Sv96``YQw({@NydWCt#S*U8agsL}LkKW{=n~t30hy`nX85sl)+J)u_66`teQ?J~qbATI^ z<+Q!-3}zZqL#EQl-?*C8ast+0;rvvAhJOzc)sXLd7I7HvBurllx>2rj<#f3$@mrff z`29aA8#9c5pa4WRkN*geIV2#pqio-+3rmXrf}^7jlDT@ltx@@e>Jt*9QgW%p)c1je z#5HD9O5r_);@5pNDX)6frm%KY_2^ zwX~Q0O8i4&9w1ime+Nt{KY#vAL_`E3mUL<~e#&(j@Q@*_u?Gk6ZjC(glmrL3SfG3Mv4Lw7HLX%AuL z)x0|672x`Edo%;xj65@1-ve6;uUW0WIm=d=3P!eoY%iz1JSih1o<`aHNEX9+V}z0u zdC2YrvPu9F5*Ty@;miSZzH#G5L`2-Mh1R$SyvUlYZ_tD!lox0zL}8w|DaY4+QJ?z= zoZuV>kfNOBh^pLT?5kec7hQyvxFP2)wv~YwE!Jc$#(dgKVjOmu~lnQux zd77Q?J_ z+M-wZH|)8QuN0px(!xCBzkH^dWUmXW`1$(XmzoDBt=c%Aw)b18G9eBm3Cy|Ez-6)H z$<%$H;t}pINA=_(C9aBnixQW)+Gs-l5JrKR$Zie}lZokzubD34BT4HRHty{KNjLl9 zAWVeJTD?gjIbzo1Lm#HSog3lb0c@`gq`5wiy>#Ejtxmej+k29cHr8#UVaZ_@1c9 zE!aurD@aO8q9R%awh0pN!UQEHR$=xlD)%qT9y*Gp8$SwPqEchgv&*ef#E}ap?LeYM zRVw&NM!nlbHOFG$=PptHjDGv+MHsWR{bj7zgl~ygdg9uA#eaKfXDQy6U0bSq=@ME% zPh3Ct#FMUFWtWw|y_dH1q;ceAHqSC-A0Q$E$xoKf%^0_XYwO&flCvwoWTN~*L8(Zo zM76?4x+E(&1dm;+o}DApM1s5-_g{NjTyPfVa}9OzfYI9{@mw&K`V=tW?I1I zZrf99K@nsBh{VyV35TwjEMOyI(8$iJO-)TdXlNXbn>`q0bpz)4-JM2b7_g1`UsjEZ z?@zAezg1ZNn`E_eG&M0Xk->iSD&sAX!WH13&_W*CrHxo&aQLTO=P8o2>Ba3z+*oyV zlL|CyrcGvgrkgKfqKHy%*lf)-7Og_N)B&@|R zPESc1qM#JIJ0w<`A9G6BhUxvybTooX-qH7iG9@-Pwy}}-hJvD!+kr05AqoTOJ*5C9 ze`DIN;^o;uUi3!=s}?;WCf`lNQZzKQ%b7v;kOrxauo2tGjbBG$Jpt%Tza{@*cf4ll z9xBwCvddYFQ3wVz^2en#=JD?s+6Id`KJ=GAGEA9<=o7WtW3@4T z3um^OcKpCk0sSS^g9cQM=j5v1J(3aCYAeJTNNp?S(RHeJvuznE?WF3J>3qx3T8WCy zD5QRw$%TMr3DKwPGTWWmnSS~>gLbjKkJ6;l7WHLl3uxaWcE1Ut>0(P}dy>5OQ8#$V zl`XM`R`~G217Lt1U{`RkEyWUKAxO%_=wl@0HPE~V{}M!o_O@{0ke7L?b-froZs(Oi z^}ly16e#unxPPS9J@v@08v13s&?n3Wm3w+LkCce;_mM(N?otKBe^*pT#9Y_=KETMt zWPN>k#>4vMQq9IlbOKIRsH5DwiKaOr^ZR?#&YWO8b}UM{pNHJ9!?^fdPZ_Kh-d(Gd zK+F+TlbC}?%M3QrJsz9g9f+lR55*I??8K$G%!i5M2t^weH!3!gaLt%)(E8U$X*j7L zhkoLlei)gqTYujz0n$2$z4f)Von79-w0odqVLZhEy7WCUQHOn;S4OEQ^9mFFjQ5tGy#+~@m`G3h?2aG-!l)e(e~QFR>Qh3!HWccYYIXKm1hLYhUO z2N~9%p>OoE7ugi&GU*YPf!ZGD~FtJh{+%X$ur1OT=q#p5)33fGK2AMD|@MZl2UBE#qLWx8bQPZXgMHp z_dhL#elR$v_2+f=4z&3NvSA>6;4a{m3*s-Ed2wPaFp2{+lMJnyM~DIxC7B>XQPDsd z;?1LA;z4oPd;D)I7=vqwR0nhb;E5Q;=(a7V%duL5g0^-^!{H*K1XYmW(Xx6XCVVcW zN0V?7w9J=a_A*}Te79JEr|T}>yI$PoR=P18Pt#-%&Ap0EkvYE#)>C~ zaBIMsQu6S)LYZGi_CUxQ_KN@?zvx#!MPgV`UbaVoE=m9e={x;rHmM=VCkkxu1t!2{<4M%Gp?ha6I<;eN2ysjm|Gy z`sm`-<}UKCYB^xt5LjEQp*k0B|HN!vN@X)4zV~+n#&ll-JN<2Ns(Q^AQa{c-WrQ(Fhj=C27T~OXl!N>GJm34s#%& z<@bw1HswAn2>o_J{& zHr|<>_^S2l?PZUmn9$hp4(K;iptoJ`$=y6|LmlSslI$jXA3t4dMLdyJ+2@h*h-%`@ zBEok1P?~sIff)_tp8~}KtQ$uNO45@fhh)RW4e3P-Wh-n|)6(;A$^-e_Z|80lrThw< zZJ(pV9VSc<4-YFe(=!KqmU}r63VDKt^fNh%1alnNbB zcXi&z2aVy~r=C#a(h=Y1`BXZniC_(hbM(c_09B1=B9Q)+pHeo<`(ZdrBD&$Z3Um}G zO&p1D(U&e!^fY=|rtr~g`{_oR4O-b0f33d|uZ^4~XZj>%JB~uY^No-VCN<=Bd=uM* zo6juPx$tXsfZcb! zPkx}sfJ8=oCHSqAs<_kG-RH?kz&>&~&+E3*Hd_)dF6XWYQUGXZO?+pgZ&*!Ge#hNF zGPKd6>CA^PZk+|c=JS^?Upj*Ee#vLtPMK!;^!WBdJ@xkfO7E!dg+HQF{_sHIY&|Ch zUT0)XH{2l(2n@VUC_Bo1y1Bku*6aQgzePS#&H}R#aNOz?M9?D=r(1D?!kYgK4Gryb zizlwUZ!|acvXqy$7B5t<*@h2}=}e7~jod=@4Poce*k&?^Y|HQz`>kp+b4eg`e)pa{iQC5W<>P3ddb-4 zcjA*uZQ4GbcS)1q10wgcE5_w$<5q=#Fo)`y2hYKbs8o7iHZDf~y2kGD%0uPMJGV8u zY25R94%&|~PzApz7RqlyENJ}<`X1bax!MKD5WVgyZG+Tnr`YwKywKNK_WvgLEX3WP z8}Y6*!wVTOr?4nw1jez*46RzP?gE0o7CPLTkZ+dSu(I!qpYU(S7O56}o&r2_%a_po z?-Y}(62S|9JvI^l=cI{ANz2m{oV|3UNB8L|Z4m%PHz?%ET~=rJBpSzkUJ8)|M+U`p z3+Klys!qrPy&wM`*6;C^z9jW=C9o%;`Qf0Ur46XxVW0&V7Yy?q_vX~A?B)T3@u>e% z{^RPgC(ypkGtG>X=O9q=l`;1@6y^J+Q*Ql5x~@iy&2w{5s20kRK(6ohA})KcBqK8b zQ7tDQX$gsLaFx28KK^YXSYy1Qjm%tRd#9i<0*cL__ zdWDSJmsp9_@Mj*>-Xv~^m0#*U(!b17Jv}{d;|0D(|MA2cf+Ph{+Cz?Fc+?LJ{0X8S zJ0+hM@-Q=3fS~d4!MZaKY6sbUp#_~YxLUE1v|6=dL^v_cL1rVoG&ld{U@-Z=&osGl ze@V}LCnQ9xR_Ql~1$nU8`I`2147DKE5iarN^P^1w(JLZfm~I#L7#5}h(gj-DY<>}b z1RW1ZPW5C#9Yn-T$i_!A007}0P$~^#UF+ZeD zM~JP8le9-ai{)<@{ZpH1bb*2A3QY@~%l1#d!~gMSMTrYjEnkEm9Z4Sgu{Pr+tlJ!q zK-ad&k%b9_0QQJOivz9+d+7S7O z_Lu>$V{dOycCAPc3#4=O9BU8=nM>O;GQJ0sY`#n8ae|hBftdxjU!dMo8#726|5wbZ zf5Eq0MRKKl;ZZ7iH&~J|u6U*rFe1%fL`HbfWH*#4COVwX-aCSJPD&hIkJh?nPKKl! zm=rqkw^@IA7sx=)Ue zw@32OZvxLpMC-D)BY zPz8in_I*^futbP`6>T<`3cp*<3vzz?ePjcnWk}5LM%sa-wQJjF30)?d>t$#Dhwvp$ zq?sLZCm(ni;!LbK-Mf@a4<^lr^mqPId`W?Nvdk0KU8R+P|7Q;7!a}A*UESOo>^3|2 zRRYLE@wsD$q6Zvm!iumwa?~Wu#f5$KyJLC>2N_vd6ri{G%cN4^SiB}zZ*p(jUzfNw z`3PgQQUyLkQ~vn9W`6B!7F+sX#Dc2tPm;pCD`&CkKIF>hpz`a3z`wk{o(FSNRPm8g ziy@C7>C;{w#ZC2s4K5B28H-V<$m1Z%cE9pD}m5!7tB z#x?8Zrt#Vg(76BdS(ti%Y@Du`0cXCcV3A) zy0}0Z?c@@f^)kE)@;F?y$PTd|KYj$HDU&IRcI_SVlJmJ1MWzU>=FxvoSw_%OCz;=k z&Q{9~-?9m#gormmofIYt;!t@=N)>T@L(>v(2@=O6a$k6Ul(uDN7rTCX{v5<-;#G-5 zy-;<)|J$;}W1~syNLE$Zi^nH_6bI1`vy}=+;}VbXM0Z+4{15h)v=u?#h!5=rKS$TV z;8*hmv^B`XsixILIEf`&uJosPK%cNKHf-u?#=}edRqARrYSNaY^aT~Tv79|qDJ+J2 zEJ14Iklgqb+=1WmtOcb-cOM`Xs+8T;AQshnR`@0TweI5A;AsP=QnWm-dKuPQeHI9=ReTf z??K&xYo47dOrE(Yg$|EO37PeSI2xznp`{#G7+;W(Xp>cdD;<-O-FvRbJ2MTpq1Rd* zom$BK0jb5LRg2<(78wV&zs?zCC0DgR#4&wZEBIOJs+(bH1&du^>4uaDD?@KNc-pOr z2Ve)s; zCR0V7?YbO*pwp94pcQe_91dk~BXrK*e#_X_IRniRV$KPt*_cfw3S=mm%B7w~ur`x% z`+1)S4{|ZG_cH=pm61M1yRaj407Z?mWc)VTOcp{ttw?RE$OdA}?!hptSjRJXa(DjZ z)+@1Qp_MaY+B{FRtK9k$eC8p2dT$aOy z6;47g#I?=x&Y<1n`b>l;OmhVviLuv|_dgf+Ao^CLwOH(!R&7O}0pl2hLdG*C z4vsB|nfV*X{Q~V5|H0vyUFCmU1;&a{xe!x@8wL9Ug7c8>GvXJ~ue(I6WPX+P(r4Ah zs?Bk6dDJ*=orDp+)ogYz`mw_Fx=5O1Iq1<7ZHtTYy#=XI)(Y+)5jgxS8yi$ongO=c z*#etJ%vqs>YmQ-2l;xjhs%ERhqR3jmVdJkYz?h~v7xwD^-P$UsUwx^K^_o&bK8RJa znx+@b(w}ynhc4r&zyBiu(h#sX#Wef-<1_5FPoX^MyR4c-?pAa!w5~#gaTSM6@O?~$j`4sNv-~?j# z^xI_2r{pz#4C5+isOAOoM5dh#FpIrS?aY;u9BkKC>rAs`u!$%|f0-?is8)%`(t+LP zk#ktKYGmI9U>MO0UOvSm`sj<1Ov^^3O1qzI&+xn>Vyaj!Q0>93*0@YnKgF_r+Wiz2 zm4MrxX5(`l&3v^GG&e7L3djgO)Eu;pg-~hLn{qb>Re-$9m5MkMh4CMLfA7o`i#+V) zq>Nm0XOJo+lgQJ{RJ;G~Hkn{ezij!0z|Q8!3IG1R3`oa=RNPVe)*A9YU>6@q3tyvT zwe={z41QFzbQM=TbqTW)dz*knl#^_rDf+%>QdT;N^l-6`=Dc*9IpyrK+Gf4VD$di)p1dA4_(*_*k;Y}qzcAQ)}i_VD9#n64P|I*7RI70k7RBxprghehYZ2o zfd0`lyb(pCDhJEbTA|1BG3(umpp~!zbr{&&!P7ZNo_2Rjz%=dU7x-Ek9TjMe})CWzJD>b@Tf(-swyGB?$W)KfTEgljG0Rm zGk}D6w2xLaVk}Ux$<=j!9Z*LQG;f`CMz&avPbm+eH4pP%lvpLTA?0`k|{ssF% z<^i?RaXN>d;*_SwkikQZKi+1L*c&?HW9IP<4Gx}xrVIMhX$4c9+F@Lyyq~4Kyn<;a>9*Dp`G)_kBrJ% z@9uzJM=Un^Zl3W$*9*5K0x{tj96n*O6E`ujGuw03l{H(0Mc~6+dAE|Vl@cCE!s4U3 zueFv589#c#V@3iJ-3}_neA~k{Sz>%?1sLqDVKCTuxw4=K!3Fp&uUU% zS4UY&D}NjH1rvYw#KgdWyn-h~|M7c1HX3LINkm2~mQw3Is1Ek(Jh5_@1H!L4I2>U| zFGJ*RUjSYnNCVLrP-oA?NYi(3vA-;Jm5ruq`$r7~@9I@N7#db%N}z$bwS zERP)Nl)j32O4TxSNzdE$3_D);Ti5cP?Ku`9X`Ro(H9a^wQq)$@UV_?y1j+JF8H|3g zh$0WdjrC_rKL&dj;)xB$hu|&aFr)Nt)KV6;x`NtZe6 ziDQOCktfQ-CFP&L```>?L*n<4A+0I3JxFmt9d<)2AyDH;6Qg68><(7D2&ipu$D9(A zB&cFF-@W?@fBvlP4B+F<@sx$EY<+plz1#H-bPz{P%wYKDCFdU%DcXU4?D6-<9pd1_ zjL~g)0tiA#YaE&#DicFnWH?zD_ZPb+Vm{l&fMos&H~E(DDJH1~{mC<3U6i_+A*Ud) zg8vO!TGH>V@Y;xSRi|pq`61AG(BR?N#6%YgAcAWSkr6gFrE6T*I1fZN75(~2F!Pl2 zt%`!bv9-eTU*s#*;;M* z0SV8Uqo(_J_P-y_BuF;9Uuk}KBr=#7-ipYSb7f}}%*9BFN=7}3!uyhe)H^L6}vi`R=pY=b1xqsD$uJvXB9K(%JIN!jo_FI zTo0IK{X8*uwgcnKhBUvsHGEDAhprO>IKPat1H7(El9*oRQc6kJ74CIyN z1m=xhE`;}wl;-(wpYuHJc8fXLAyyQ@&VRV7yiCAhnYx!vegFP_6kHZR5i}_E2K#^F z&9e71{h)v&Gs9gdGrQ`p?V2U^qP4~cGN*w|_w|J|2f|H+pEDrT_hq)Hgc*-)JLG>d zb|FGxA>7Ov2fLt+{l2vxs-sZ3QFPH3$6xNLC~+-Ke`^@ShGV;iXzS%fDuJ}^`_DBs z4uE$~$;tTDoA{9jXe4aD)q(d83LOA|#e_|GG8`Hj`h4f!&}U$jx5~H21?&?GgU<+! z#c=!)rrZk|iCbN|O5ELJBG+F6;U|o^yBlNb8qXXyH57)66iMS*jI0-Zik}Di_(Al) zT+g4w{{}8Vcs40I6AzA2#B1G&X#<$!aVdLeE21;cwaCh|Ge*!xnEw|~Zvhlk`uz{1 zNSBnfbfb&hyDJ4@668Z%g;>@sxH(BwN(+h{OjhPuWIkFF?$gwF7 z-D6V}exU^0dS>_2y{9{_N5yr}@*p!LDe!>;ru*_x30&G?kKrhG|GxwM#N;9~zF#@I zB#k?)21f--?t-D2Eoa&#nrMu)mwtiPB@yV~RMOoZEbVFWT zPEIa!l@40)m8p#5ANMyhv@572gdG#OoE8eXaI{1@U;C@FJiTA*0SZp2yQ|q+jSH!` z#D|mH2qMfQPBZCoMBGbsGEHgRGJ_<7>D+WN*ipAy59y*?hE}(hdo5w|>GyDs@e3?U zgh`y>Ipwkc^dZ<J`Ej_oUYwl$M%~R?4MF_c_C>q~h>DYik22 zR6gcOpEd{c?9xhc z?IP&HidG;S;Q{Bf9J#?mduHiyMv`F1=g(Jnvc|X$Ep#*7yvfQQ-FpuXw0O$hDsSWh z;5#!l-((5-G?CY>Y*#{$>srwWe&HD}HNlXOkRd?U?RVh@t}}XvZEGmew{KC>-ip+) zs5eM$pK+3z&*JYLy#V65TmH0(J>;?XVWAb!#)2s7AlrN!avz`-=UaV-K)km?Ui;B7OxTf`)h9$tX<=MEzBKErJ$44{YE zfLOoBFV#FsQC@Gha0kBt6iyTP$RV#{BO8)K2BFBN_zEOQ$~!s&rg{SMtMD3iId8IN z!}n0SVNl-x_fg&s;X|M)U$Vv!NKtAQyq&FIHQBj5(vd8FP*f0^vZ5KS8pcC9SPhlC zd|^&LI|Q=_eqV(m-8bi@C4{2&-W9gJi+wFjs%18r=2n*c5b zd0gm;rf8Q(kfJy`t^TvBgKZot!~kwb(t0H|ZBbe)T&{lSViT?qEAtPAR7?_%a)a-( zqO}+BU@i#pkrU8*?W|lb9zy_#=OkxU+MJ#ai)P6%%;~Y7Rzd;Se$e@zht2=jfPR$! z8XP-t`xb3Vx~(>>>t+|VM>`|mu=kf=ZABQ;G|Sngt_&Mk^U=DB|cYgD2A+n^*e)>@xXr2y|Z-A^V_osGTjC&#+evL40KNlmplFPi-wO@WUk>@_ z$Mz8ZEv?~E|*DA4ba6m6B zOi>No=+@ItuZA4CthYbGF90AaAE-e=PONqGYq5D3EVD54bbJ1JW@2I@G!CNo{}cj$ zwEbKB?DCRE+E-}O45zNih24f17qed00cKj3V~MUj16O%ApFM+^4HkLotp>npA`E-+ z76I^^1j6j;r?JM2j0~9QghfOqpc@7K9EFI-iyvKAkiU_WlQUm$60keZzNRv~cE2Wz z*DfDQwg|i-_#21}YNnaNtDsY*oyqS&noA0^`qlX~*;!Pa58Yl2N;S4%m5+u=PCG%g zrO}+k)9)laR*@Y9@UBEu1quWP?F$%JNIn?;!22iz84y90E9e~DXE?6l2_OK#LFMRN#r!(m{;z6P;@byr%>o+=xTYXs zZ~p$An}=sLb1XEdHR%p2cliy4Rh@!mnL@M`X&+QQjG3DrrzAO4w=3>_++YB~MAe8- zE|};Z;7EN3!l%2t$?x2yFrebgamDEZ96_LP)7g#EHcK}{WiC$t#LFgDQt9)_K$#)o zwun4a<$7xJ?_~EKly))!$0xF~iq9yCiRF7YfeN^FS#@^7c>K<;y7lWTA=q;v?+CoVMEkx}sdkIs|x@$ge3*^jTob1$Kc@%$vB>=wUpvJIKsfD&!XyF zqu4sG*gf>NQTc9f)kq-*`^z|>#+kJ%CZQaxsj;4jY@Jt}VLR)6Rcao2HWyg80xFM` z%rY6AS+oKKBR?XQ4JKxU$HYMUl9)X@XiI<6oV(JP`{k*fqrZ-$j=7NQ22`aj;8fQB z@bg*Q&1QL~Y_ot+++B!us(26S1fe1(5Uxext+8%s_~BAM=m(Wx7Z@}X+FCh}{)~l> zOyK_oAqbNmKjrO_@3g|W8iM)~1PXwFC=2t3Ng*V9)YYZNK+jISDwM=ATsi9% z2u)#1KFK*?*c{J`-$VkNzjxS1s}LIQ`n!dL($k?c7u zg7AOm;=hbCiwY^6n3n_!s#f;)A4SmNhMu`H2T-GFFN|@}?KAb9TiwgyCbDz;t?ac4`H&`9Leg58E zVB%J91kX{_;1!f3ZpLavreK;6(2eioRYHCJ(&}7%>AjH!wN7Eh-rnk+_}&`)na>qW zVa5voa}KV8Gg@6=U*B`jUaH4ZZ|qo9a|Ee#I2)}ex}eB#es-zfpLoA^>3D#@!z~ z6!Y%ecjeDLZ4o9U?wjXeU8FmIq3cI(Pi(gVJT<kba|MzDb*)QPjo4`fC2H|NUW*pqNpzc{smEg!^<-Pf z_iGz{k+Sn|n0%<4R{+AR_zV#-;}Ghfb}(S3mLwzOq7MXsNqoGW2-wbVmbP@;tyuM% z2&RH|Q9$q&>N1mO&Z^4A5>t!6fda5;-Rvb@kPou}+p;WSw}UYFYX(Jb!_3ChIrCY} z!ecD><0eH1eN$f?5$M_g>xLKtr7-Ig!ss54gyK}#D#UAoJZ)3X3VO4(37*f2+$>^B z%5Au~BeBtHm2kjXfD&3*2E80>s}&bBs_x8pm~+BJYTORQe2y!QCps@zeWnchZ)d`E zCS`VyJO}^GS%xiMUI_Ioe0;0c`17e6We;4&RFJKjgQ+J>2b83o z99#I=$4`t~1^v&imaGq?53rnmEj%(al>vsr>+}i&+YCzVa)*`6vVv+GZUjp!{VBh2+mG!y#=_eAbKs9OEs)%mr);`JNw#XtCT8 zCMIS{GFo@GZl~7)sQH(j?`PbW9#BK>dv8EOM3%tIJZjn(6HB81<}{U3+iL{7-#KM7 zGuu6I4a_AU+E9O<-V~LPaR1tG?#ma0KTnag!cF<&G>E@II#gli6-Y6r#kFuU%IQw7 zh;On@`CN}5Y%<5)c$cYhx25AvQyo0KgaUoCprg><2eY3T=q2J$5Qwv(sTqVOmA$4A zL{lc=Q$BJ7@ox8jus62f7pMAx04^|G{@KF*n=c~xty$9ouT9XY89v|@@lvx4hN_3w zSbj{Re-c}RFD1(`YVw!;D{7nr+qjL5GLV@~5$d7Z^8dd73vhgS@uP`<}lgHaz9mbY++B@H(K1`>vnR}_9j(C|@v2qc6a@|*uF<|7RfNXW|y8i6V3%|vi!X69)0g2pT|i>?y>n`|;(8!D!n zk2zUcELJg@6Vb7z)ked-#sh3EU2%>de_sSF_aSxuy}Qbh|9fU;2CfIiX~N*;E>Nds z)g@?#t22;nLj=UVFthy438j{h(*Ox%JvvLl8z;mns%bGC)~z1!j6iWvYGTl z`MMMLtsKl2y85Twj29Cz6s8Db32Gdhc{Xvz)ehY!V9aW;vkwx}t8qtP|C*ei58Wq> zP||*g_BJ+SIYLK3bozDu``L?lSqpe|;vKyg-eg`8gd4x(_*c{lV-Ca@q0+2AAas3L zQo*BLlg0qu+=r*T(5MTvaRXlVmg^W&12NlzYdN0nA>f%FF{l5 zlfo1v0(n_Qef!Y>xMNPH*8h{9`kLL2Pl&~pEtJCi-OSQl|PXdvrkUT3XwTLL8u zh*j6VkcSoNLfAAIgW^cW+F-EU?#-#Jtkhr0s@)k=Ub)-y2l;Jw$Lw~L?lRU=Vti)= z(d)g2_VVR_b-40|1eoLxD;)8%Fe2J*XBgUlN;AjMF*0)MzX>GJy%j@3du{n4v!k`O z=R;Oj))E4F!@5I89H^j=Z{I9AfuoHLlUS;w8?sSZ zFyAktS__tR@VqZGeu6qi@8J69`(scrnWGpP7y!|rlqm~GD1uLcjfZ3#W}^KxcoXY$ z62|;4F$5#;wg1o@2C#Om5QO~RLU3J}kG1D;n&;=^OMUxFQxi{RNQF7TX=bg_b(IIf zmE`3EQqru@q;Co7$C0h3ZdrZReS;Fm2Nt^zY}~TJ>HR^iPlo z2)qluhx96*nSgH@=0|L7>=IvKlb(VWbNYi*|7s?wwY9avSEr9(kEJ;h<+rHwqZ)^I zs*g)7*?MXQBg!qdDWcmY2kk2FJf`%l0)9I3hq*7CQH`)To@@gPqpn#bpcjwx{8s$Y z<1+wwOyFe)t(%zBPlVj!q7<^E?n%0<38oNu7S zmiPw$wh#K1>DbPbD4;NTmvi`ErF=`eKgXz1h)3h-w8ZIByDym-SA%!U%Wv(LmXdz6CeH8a5^Wi;RUH{1tvC%PzEjmY0a%W)N!wzbm?AILM)#Q9g_f z_j1bTiO^#(Q#1&Qp3{5|@3WPs+vg*!w3ZgDO06fxmwJ zf-7+~*hK=U+1t@tEGbQjc@?yQSODzDwlXj<05N0f2$v_yWnz5%l4^+5Cx0uH%&*^M zaPeplE+_d>)=0z5f5K0xcbqVT|R{DyFBWH=DSt zYbjI1m5J+Yib5&HxL;mY!RgOKfJU*QrKxF7Qc_M7U;ZXYzRzsd4>c>gV-w812Nrej z-U&2qLxRe$(@5LJx7)CIVM~;=^fECy8L@>%VH>5TC_SBswUiQj&hgfc&w(&aaF1mK zA-2O|=(sodpUOS6xN!fZ`bC=9*x)|Vg14usj8NtI_6M9m>p$Qpi)sAE@v12CH$|c$ z-_2Dinp9o9$i>PahS>P4i%^bdvJ0CBfES%HH-SColG(FGxz4SZK+#|g02Sy38QwkS zQQ8Fc%YODDN36sUvtn+(5mimxnDUQWZ&kse0mSKQoZ;9ybSRw_&pUs+wveC9P~Zfjs* zAc%GY%*gp4F1+__b*RmCbrRK16LEYjb5jYsJ(pKk2h>xf{Of2?F(Q_hjM>@Qw^VQQ z{*E3sIHFa0OR4o`PRNgzdfzq6qr-n(*ms-4bo@eLzc7xFn_rG+DYSk$D45pnLp

q%fBg11q51v^|R*mRYrFb5C%jS*HW7xAd~bY!y2c2~Z-H)z>k2Sij8#GNsZ*B;`s z=v;oDLw7io`-?4Q)Cn-y7$&3(Ie<4TP6`TUaw3E(5I@5t7gVpiQqJO4P*cO{8s<>P z%??BUCU?SFDF19-4a~^V@u4Llc#}|Tq80u9uVJFfIN@;`5il|$$&``|Xk5Zj_+Xk) zK&1-?g^+hk@xcZ`uE~kzC5^n`R_7GM>l}!NH0V~h?WE|594QT7baZquvV@|DiAK#p zEYPLli??kAE9!TT2V}2~k$CKQL~1A(89pBb^0EGD=a3mMG;emJ(%~H-LP_V)6#^}} zE99PQ@;gzev*{j~yu&_NZ2ry1N4C;%8z?MlZ>_VRX$n~3Ww$@{4`-twZ$=6u zQIruwjElYsa`)bzgX`rHPBEM{UJ8NI;Qp$7YNlh%m7_tqEurdt%*(K1Un*U=y8Vw8 z-dIjcY{<>qgdV5noSk`Do!02pe+SX5?CsaYZEI@_h-oi&NCu!Qhv(*airBK{)--=s zn4D`BgAq@V8dQ)xvr)TtRwJF;u#x|nYeV=a6fN{zEScX0@SF8i(iU(=d2*-7)jR}U zsRx*o#F)SOU4({zZ8~AOY_{?5(sO-FwsXu7pk$8L2C ze;71RE!Fnk1+J~5&mTmprL&ppOzW>5zD7q6$sZ!O$365Z(wVop$Agf1B0#PpS7JBo z`hL`d&t70=S!)^@QHlt=0FWsb5mxk4We3A@VEwCgaB_OY9e@-dP~6{bdJK zqu(NuhH$^i7~XD=*kD^Qa|-&W#F2n9)cfa3@17XsF>xyElSs2c9|jkjp#P;{XBTAP zH0TpnYoBk=0qu;Aj-OX~`HLxqd;B$p$QybVTZI{nT6|V@ca0%xn;qo0WV37r)xA2! zcU6(m*Ays)9hU?bx*(^aN{Al4v{Pb$MZdfz9&ai=bC_&%g@LZn0>k3ZYd?wRvZ7-k zZTmeX9g?u%Xny#X>h>vLTy4-!C?tAr`c8RUJ)~J5I`(XJ2PIp-RyXdqlBlPvv&dbM zqGv5FN`}(j@##*PK7BytB2)hz%YVg}Oo{bw;C6?$7n)#`MvD=s?1en4S-i|ngRjj? zM_mxpO7)f-0+sIC*xFiJSop=vl&O!RLR&kKRsp#Y3s_Q9GBoOO3AGqml!4fCG|t=9 z*NC6{62E-zS;Ur>IwI2B2vj8{B&5G$B~T1o0mi%4x5Z{ExHB`ValRl|c$j>1{k1fj z=3j)6%I^pcVirT`D-gC z1n|+yN$qB3VV#`BJD=E@7_|>5R_aT<+?grIA+d2L$p)V%!9Zcom6UB(5i^Z$(;(+g z0o0;?qW&F6^N$)<P&V@c6K|Q-ItmG z^4$pm9UMz%KRoCh?zcczPzl~@O2b(3%VaIH7R7Krqd%FNo5RAy9GjTX+hb!+;Z~59 z4X>}~{6uDGqyM0kQsjg$mO$V`K$^`Yp_|dgci0m#Tdl|0iSqpU^EYYhkMkg7jQQNJ zpn~l7nuJNSRXnCXzUo!saDob6s`>p z@DDq)CU(1+FP?iPvl=kIE=)?*ygmm}Fl^i5<>lSq(g!*WPQ%Ia}L^q0x$iIwR!?>v2LdCNS#=3>v1UFLpr30k6z!eH`Z|+RudctBCxr z=%Xw-v=;)71hVZA>$)mfXW{Ny?vtu1HZndQc7REAe@IIl2CDwlFVJn> z`|}nz!+$4JSExQ40g`V~b#qV}08sSUD*$M#vs}1{t6F4m-by9Op2%ElFd?_}eiZxg z;X}owzPQIP;>t2azyM_Z+;GA)yAb|0L8jH(r-(WqNM)i+5f$)lqnZgkrl7FEeuZLv zdW8&VQF-V?>=aEX6Po=)Lnx;eurK6|_$s5W<^9yxEki}iI0>p53w|X*!ROE!ujd5f z3eeFFRD|iwSjn~d%zcv8{~NBTtLVJ~KMKBNi-P8N?*jh*B01;1P#r_={mU7=WFAx% zGhG|~%sQ53k7DHx^{C4p;qF(HR+5fM@{!eidy9yi&jq=OTlB1k^)RVTn%PpZmUbTQ zeG`F6)1`lRcNYZ-DUnQ!g9E#}8>HxSEgcjTrtZ>2yyB#UF%xh~%p(|ZaBvPGQ)C0O z?40K53*hu~bc7B6-o0bJ%yXEGl#Hrb*ceU&)^&9^!u$Bvkr!(cVV!0isRE`Rnaf!L|LqgT8T(wnWsDx3^45@s#y*mwhLheqGsAO`>EPF89 zp%PY?BFCC7cnuXdmY0{UHjl^bI4(FShK zW!V#!(wd~4oKEo55}P;^O-@Y#H9;HOWf8J;KgEh}<)A~(iRm!KX^?P$Wuzg6vR1JH z-Gj@hhGBb`?ehfF@S0;zdip!Sjsdk_)`BdWTZ?YJJ_5ST`{fVakd3Y6Qh9Q8)c+Nx z1?wUsm0kEpYI{+yO6_Qk|Fp^3*i@T|(8*MU;_?>tD_*i*^UN`UUH zZG1^X)2Om|=XcCk?#UCKX`sNLO&(RD8@(}uDJGiv9*>3PU;+_aj5# z#{h~b+bHucj+>N}FAw~jXQP9s$Y9dxwvBf^3VPjjyTnrM^W8ZJmRq7BFQh3~)Oh|M z*3H%b{^QI{)7jJ1$hi@<7>wr$G$g@IZNXY1EN$ZGtJ#d~w6v?~Ci8Q(0<&XVBzldi z*-|GgGOxVh#R0B{*-2B2v(b5x-pAuSFGaGF9d8iyKBOamC^Q6uBmk46Pt7!#N@YDf{=&s0e+fTe z&Q#)F9OF@p@kBrJd0G$?D(5y+JfX`#2mK&_pSssk28Z#Gsd~$_CsOXz)KsFInn$Q; zSW(^D`a06Rdk}w_68TJ8`Z)}w2l@B~#SH@`JX!t9QsF_)5B`lIg0fPS>~;j$nu8AL zr^G2l6_k`VD5YzS3d85d&1IN;mWI!G?Ru^irH>WOxfr#sl9CehKz7|GhovRMy>Bv$ zIOU_jDI)O|t*okjK}Tn;0=iPY$4(%>V@XnK(X*2BatLC73#Fvhb*{!>W@3Vqr%4c< zS0IuiFKas%UGTtpLGOpU>66(Pl7;NGh7DO!jc;9ItSY}^JK)5J(WL;`_^7QC z6F)IyU)ymSLrrZWC57NSid>WAR-GPEjI{%_i-(=&Tx4>BCx zSx{7H?2Iwnp+WUlgB5SDUt_nF$Dm7BKB)#&pyqznV6EI2d9@n;04J9}$BQgnhM|JaDSJ({Kd%Q! zeCp?J78Z0Fzu1OM#gh17l?rgl=GDSlOgsI+!b0mWe|iZCny)FvuisLQ-f25juIyQZ z7_fozpU~}VwpcLhoN?O5{KGwp5fTyt?RIZ%jd7dim!t9udhMDjB#^L8PfqsyrMJBKvLy)UT5_R1{kpiA#A<45>;0Rw;~sXHCX0mL1yGEcQN6dD_tF{rJq3u?&x_wD zk*{iLX~m=k^7661x+!&eUoy{enuaW{GOj&JpHV|~&WN;fZxGZ9kjv0Lj7(*~K1JnC z&$_S+86AE7?+du9og^dz$5TW+2!iN+bzT6rdZvTMvyt`L1k&OkvT5{F^|; zj3o`&suhaGg$1tM?2O3N;u0AJvI40XH*hR_-9QFLL2}bNA&c%@7(j`u*YlukiVe5c zq1AnFvV3(9b)zp2t~@5~J_*M=iw|RVp0e>5@J*m8H8C9Irl=|?KybTvF@yg`t+*@w z?vl55y=E7mv$HdoO(HKlZ2A-O+Aomzs^V0fvl`ZRSQe4LoE$+Geyy(dU(x-)5B`*0)K%lgZTiUdU1$?>^S6rVTcEI{qP--xtc{5ifx>D%-$|m*yx+@o?fS>fbp&e(BADaBb2Kun?sy#|m6#8o z7NE?DM(<6!{UMx*yPNR!o?}8Aue^&Ft9)!ush`j(foHWDZo4u6F1{OQxD27B_KG4_&P zELe~nv9(uO7`3&vt!W^zL%x5q4l(&LqY|d;Aj|h(wvw|4t3$ooAACV_NS;rylERHe zSZ#-LY)zvZ*L*xaHU@yr&<|X3At7(*&`QY9J$fhpA?1AveimmhkfOWx`G*dt_B)Gs%XW>8m?L=Bf$i5L+s9b15D%K}@jc_B8!rC70-&%#*S* z64Z2kLRv8~f5>gIP`8er1534JdGh<18=nVm))*KVctlSEafw3dZ=_cqSbUacFeQoM z+jly`Fj}V>@pvu$kJOu| z_Ea{JB5R;&`MJ7^XjQjBMY&ZCL8l=1VOp3O*i}>Ca-4$DN(f>x$1qY%6evYBSY9Yo zIkGFG9GI*2;CG8kE#ejnxE6KYP>xbiY+bGtb_p$S>?x%hDZqYJ1xp+t9%AkL1A+}y zcX#(NY}9Y+zj~N|wcNO~ZrDIN$v-TRn3Hm}e zWxLr5Npz#2QOgJ3WL%~_AiEwAz`7+tc@hZMSR?hn2i1J86aQn?QIfi>Q)fZJlcT5` zt+@uPRw`r}bgQ*1SC*H1*=`b=Ofr7H^ODrj%DC41zOQ|^nt;yLJ&aj5Q^Gow1C0W| zo$&?EQ=Nw`lO zbr)oFW$r#@xr2$lmksjMR{twu_Me5A%*@Qo%gb;cfX{wRpBAKCTfy@4^RLN5#I{U; znjYffQXd&n{l-kdIzn!dDSlZTG2M-Xm{VL#Ym3po17!OVJ#AC>pIk-Z5%ZWpeb$2ctqHj zVXoSenD{pYPK_&@9FGfvVInFDt?etMn4@Y&_+=4su%)x$<=L^aRaOzhRam2$0FuQq ztl=xnjWa-=7UjvMOZ#OjLtcCL*1q9#XP3YaWg{Wj!dmIRkQ%PcY z2?Kzd(6a}l-Y%f9{H_h66ut@b*k4kU-rGMERa8J&q_y zFHcoIcF5Fs)F*yd==EUyjCCyDGzick*bw7hd;#Yo+y?t?Z0Pd3UhS}tCR9|jYdsdP zv@^I`7T2=`Myo4uq7EHRB-Qv^B+36u=uNI*ve>0!(Nf7ryBmIT*c|W=)(hM*9Fn`6 zR#k#Vo2Gwt{qGMvfjEupK_QP{?=@#cV)96N;93b|<9z&!NM3 zR;>V!g7vlz8SC4Te8qWgec^Md(@<6Pr-Z`4poYscW{G+?7ECte zf93s~Psis136_|69FHC)f4#XmP3$+DWb_f4*spVWu)K;%>PY2bUY7YlDdK}$?Z3Tj2z@7e`B6d))LlySXZ zp7cXVZnTcJAR4GIexh!rvInObe-nPa)YQoTES6mfQ1+~ zUv|UcgPt1bWM>bLJuv=a9!SZp-@N_}Di~8li66iV@L$h=X)6YGN)d$Ol)jA{AVRZbd;kjsZKN%yBp-wN&;60$$D`v`Zt*pqC3=K;8`sFyc07 zbFuXC5uQg-Za_Ephs*8k1d7t~Osn7^#RO9ifH@8h4hQ!4t4)8Wy2a>sZ}0B%oRBT# zLe)Lpv{)P2ytcTLR0$t>NiAH_GEbh2;k29lj=)jQtTH?P;2vnW{T9e!t399ryA~^L2`Ykp* zN4b6pLQvFUJO|vd0=UlkY$g$Yl7`VU>OO+_7IMhP70QEI zI;3bdK)8ZyP<$e_8n{8Qi6;%N0a67|BUMLFLZQ{%9a_J|#YG6gkBpCpj2;1f4VD*m z=64Ovfpj|Ki_`(N5470B&D@+saCtU0G*G`|dds2k6W3{u-oc{J_#9=K#bZ4m4b>F* zhv^5XC13^5e?IYcTt;zLdtQZ{!b^xxkLhy0?kVe%_SOaKWyRc@k)Nt!nf@Tt#!>8@ zr=zJg$iuRli#qdkS>fRyAgY+n7Efhe-mrZr;jTD@{hjjauhdlJ~_ zmD6#|n3nLcR`Bu9z>}f*?x}i4?+O4PF3t46xdhD#Z zH=vY=q86n`blrYPxWO4n+vWqB5v7es%%!S^hNQ$UW08AvyLu>VjlMsec%NETIWYG$ z`Ry-g<7V0suL7~@$8EdUm8w7JcX^g*>peW|L7WsBTNfoizl?KR zNY)#?4lW*qmjht^8nHs}O*;=@z<$X+SXxpl5S;K~WF%@KfGQrS_$arrcv+HSSh`G& z-ZH3YaW_PmxK$KC(~qnn8eOZ{;Y(v!CW1F4rW`UzfnKQXi|!!9G%6OB<%4}Z7!*A#K{#t4cH-2|2(^#pmDF|gCP$=9QmwW^+hORGW72-)ne#>V5 zz;`CeV+96rxI)^56~FD-`{1N&vvsbfCm|Mp#h5LuiUzw3blx^acNBVL_4ti?l_Ix0f$JKCVO1Ely~3+ECw(59NduR#(GFqXoU2B^ZJj3fXM-|yL&Vttt-pRI0}D4~mZl~BIR$f-lXt2y<7S#QIsXgd%GV50 z0PCd=A^qzZeZfIP6P)>q$YT0~IEMh)rMv~b9P7uW-CxOc2j6s=bUQeQjCQa(7%Qn= zw9mQ^qjfNkUjqf2D0pRHOhEJIT<`A9dY~{ac8^-5Z%OTciqoOB&|U z&l3~%(8#o+KyUci|5CsCcjL}6G~PE?XLPK1PjK8fX8x5p2{QfhMVvyKbC#T&H>^R^ zXVhCmC9EcBD}bWi@IK_Xp;6Ge0Dg7FBycfns6SprL2m9>2N;l@3p%fW^>!G! zZ(sZA)V{WWc7YAsLrkyMBy^HlLMFEBxIvZ;Sm*`skw)$|s`J@d00=y|A&$a$h zht()u=l(QE6$YA27cNbj_}loobWy9j@6fesR&IjFRrtC1_+Yhai@8YsPuNB?J36X3 zioBqa9RD(pPJf-`oNY^{Sl^mA!j>t7_(=LIoh2R(tnR)!o>7BNh&~(VZRUOIvBkcG zN_Ky-fX92aDOae2cH@S@b#=(kUrt~oQR_xY)@0}pb^_D!F+H~*?gc>?K+U2nBp-d~Fj;V??jgKFenKW+8z5vwu5@QB?1)gncO z8uM0n)DlY(0eu_Jo}yU_d3TaWPKJu&ptZ*+$%2-7jmcWnRJ8J23m9V!rvG-NGic# zfW?WVekwznf&xgwc)B?b*;if7d4Ut=WTH6 z&>+P*9SsQ@cI(|Shaj~M<|1w#o_A3n*YQO|JvGLvB&g_yiugJWUI9oAI93d+2^yvbwmw7}lm z%0rKj!Zl1LeQ*=Dd;Y1ryl!f2ggsc5peuSA2#w&)&gy#_Yu0KXl6-P2&A^Cb{dcp9 zS>A)+)CDBpSha-d5rut@sMIeVMgn9^p)y)0*6#~;$jXeMb%H9tBwFs$p7!*pdEMG9rN^p-_PvSKOHtYi{RZnr_Be$I*G3$?Ce+ph6$mKqC(4+*U=H>5HOp=SFw8X*plgKL$sN9z%7gmUHc*F z{fJ4lv{%pLWJ76NzFJsWF+5XEH2NKoVpZIaQ%vH4<|q6;puZVl3;$%|&5GAp2|jF}|0hv?~zB zT3xj+$gHD8d(y^AWk3t;?`vC4fTp>zsfo7R9WK$kG=Cd{`{^xTZQ_u(<|#Br{`m7# zE2~=grrm*LguamL|9a3T4g)Mn0$-~PQg;#BO zyVMWD7v8$jfrH~dS5|8H?^94Zq~+?HK&x%iU8^<45yy zqIYbE#@>Dgiib$n$#5G0DfkkYt>Nu#V>ShK~C%DxWPO{rQL5Sd*`M?;%`e464KWI6ew9o!cQd?U( ztWX2WsaMq z`JG}vr}Dqn=<}mC>wbckw)4oj`)+w&N-Lh)9J+~ujMfl45~g*)Q!54M zUkg?EdU*l1tYgWj6=@iyqiko#vLI3NptJLYhl@&Fw(v_0U7bDb@+MVqloZ#~)6-FD z*Xnw7etr)5{>rESA5&i$R%N>VZ2&3~(xHHKN{7-Y-MLBW29Yia0clX_5Ky`{wP_?o zKxqN#20=o)1(A1g=A8MzU*^kP*UaX5?&n@>{c3?5N?;8Wt%`tkhROfQr2sODP%<^- z`kyMSIUb9mkhMs;)|L1!gNT#x5#Vr7%0dYI^6A=HLf(n4!+O;i0e=qvE^iR~z{nHV zI@#a9HApK(@Lg?5(lXHDSY{bq`*2yH7i|OL1^ZMWNqxRjAW^@$qGGq`-8;6oBK!HZk6&vKJexR+ z#hTuDfRy}0j#jfkUTnWowy(*6ok>{m-y$CF9jQh4C0xO_rmfC?X-^Wcoo(*PZvw|p zOif!;-D-QMUI90~N3x^knJ536T)t z)g0{5r7S4X>3G>U10fa8d?$3B3;0pWmFhoVYPCOY3l9$`d*n=Kb6a^6KrY_5TIb=> z(G)zESicv*uKf4(7YDPL0ekmtNeSfPy^J+!FlK>oM$#v$_<}Rb`&W|UkGfcg$G8^* z;|2+j;^BS+;#BlDM-@(s#*iryBp(EP=Q9Hut3ccZ1fsnB3Mgm)*Go(0xVUd1w{gB^ zeYE7GMGrA)tCk0UylIZ)Z`gA5zVUm#ixug;-0g_FFP0C_hOVN=C5zR9ezu>wTgu>` zv*T|z8Vzhy^ow`XD`NqB2+25@-v0Z|9+?u+8r8H-b#_g z+^d)b;PYpgBS0gD4S{APwt|fA7qI@F`CeARubXKW3UMA=8F$DkDV@V=n&hoAZnMpJ znZ6Ddd~Go^ASj(jzKI8)wo`3dti@4Vvy9Dc0Ga_b5^akoR1PBcRvBg+M+Qnuu1zqx z$$o2hA%1F6vXY$DoVl9STcg8#%EDJ(JP1&U6Ebev>3laS1w~@H{FuE0lVe9{P8yl@ zSmqQE9$#PIA&a#1^tq-NjN5(yFRW&=b)A9;?#7K9Ly6(xT~N0*J@^R?b8>S0Re#Hklk%Aam_eBfe zNJhN(oiptD!=jK^^ZRgVhR))bYMCHsKi?%-^Tk47d@>edj%v5q@k zImBdFDo2@3LY-Z!Vw)!GUApM+^Siv=Bh+4eE3hyW@s9RfvuKLsT^=+Oxs zb5>||7i{e(tK?*4Zq#Z)AODYVEFt5L6kc6zYvYcQZUE`|+aB5+P2!MFS@S`K;q9?K z35&U_-w}PMiM3b%*FiAb{qu#5vn`~uxP*_)M>x(TP=$x1_h=hD8xxFW)y=O{?b5?E zX!c22L!Sh<(c)5EJ<}9b?m8#2X0>W!K9s{tWw3xl+FngMcl-lDpRD2mtOqN9r`x5n z!6{gO_T@rPcT-NNAc6k-Pi{gvKc$%Wc7Mn~Rg4|Whe;0vN=c|!H0}@5SG<+Mj_~G< z%Al=DHF1K{#hpANiyYEt!iO71PV|Pq!rth(iI<*i$ZCzN;}w%y$2>X%?6wwI8}y^= zBJo-(H~)rYuPKh5zj}oRB{nwWskZhpq(NWsE7%gUgIfXc1S|G(m8s3y2mX+~`xitD zimY;S)(5>D3B3CeLfH<1^V+!Yq?%gJuL=G8l-|MZM@1!O(M{Mqfz#H4NvoX_J91jX z*^oe0vCSUXk}FK6VU~Y{-^Fj0IY#x!Ij8fhj)wMt`)!51(R4>k z{b8bnjQ5gooVYh1JItsP7KagxU1?iY5j#hFQgrR(qC7&$d@1lJ5B)Egd4VF3I|h#S zNnx6s6h=cY;IuZz#^Qd#)LXRozDxN%T#dTATK*Y5G=|gvs$PqTMsbF%2!Y1)iEd z(A7y$sH(2kF42=>Nm`Q0it>XeM-0ZU%Q+S72RZ--b}8`zDLFo_qm>@n7_SCHQc307 z+S(;Bw8yR#w2Q_-s4(*IzII}fNj(LkP~8H;9dq3Aa+h9G9e`Y~x7xK%8|=2ZKEdxU zCID^jmk2}8_|4DHAH2DGQ&9l3$b$PRwjECW;_+&ut#TBVPdiH*g{YGH?`+pgXq>AQ zw38qWjH@-~md-O@j-c<@6ILUH+5bjwSKyJzgRf0zDQo>#%9;iQMXMuo9ogB+VhZ8$ z{9P$}u!V9TJ5`VB|G!(v=s&lR<%ga?!u4=lm=1mYVdMg>S`xojbJNXCw_Vp_G?*~xjSinU|A~3F+F(_ZVAwx> z9FPrutw1)wh7$FPr(N-vd@`GW=E?IyPo(CZc`v5LkdpjgK4#t`!x_KtKFWUNV@sky zEl945t8yo%@Cyg)0}8&`uhql*vughXZ=I~jV9Uxq z%MuBp-{xxF{rwn9I?4Is3dX!fJ2Q-V76u(hM^WYe35BJZSU&AVlpa7-;E(3yK_NTNQYhtI#u z-|Bl;HQV&w@gHMZ5gPz+j!sV0Ewo|x-U>nsPR-OO%PZ_g*!>1k{(yA&zs)*#0gP^{ zzSA;2p*kHPWCm9^fyWk@KT8aoQtMpySNfY?2LUS2wnK~NjOBJG$( zdZK8MPe9`CaEU&Nk&cp5ADAV5&si!G-SFkzWkh?KF(6AJ0I}mF)c(5xGUcvr-aN3p zx$bA)t%ji#I%Gr%nf00N7wpzBCRV)MK-A*%o967@;>{-uY+aaQ zg3}n1s0huw_%}hqNG0s~p`o&HpxpH2+02=1H|b|*tDDmK3HHmi=VaBXIbpBzUyEse zYunrQe_i}-`1-&1x5qzK?$fdCv3iB!h;S%_*fLosX2gNxz*lyPc2D#-FeDe#0J?Je z`?rmq-H*9a5FY@Ej~){w*606fXj2l@$@JYCrhOY=nS@X?>e_Dj^hX|Wsd(WRld48t z%AQj1l953Q;^V77ezG+Ha;RIM^f)FAmxXBo&@%4ljH*3L?paJ%be@BsX=$bM($A!5 zYLcuNUyZS8PW-&xA+&cxNd4p++~5PBv<6oBH1ZJK5f!+YrbP1(h`OV7I?6E_g4{ty z_3<-T=n%af7(c+UQCeIaIaOp(k9zk`-_$fqUZubk_}|->?gzvoddFU3iOc=-Z;n{j z9{B%o&rs7=YndypEn=(LKfHKv%Jq%@#=lP~-;}5ea0EVFuO`A<<|DVB_znKKu6tf9 z`e*P!L>twgA$Q1P2v-G;(!|#;8 z6TqPM=^2({sW_pe58Lj03TMmF7m~rZ4?((0_lysqqZl#J4#uQ>yj0VV$_W{O0c@EUsXBjl75x7(pOS zA#WM_2Ngd%*p;=vLZqTk{}h#%ljG^_4OkRWZEkk-15({S;c~WdXNwL>D^tgC!tdR zH~(_KB{olHrWV#RRl_3tZa19<}E;A(}YM{XQk6(f6;?4&}@%K#g z?#baOpBOQh->->iL+jmsAt0ZJ}+23Ft*mTMRu{txGAZ04Tk@LF8~mNM=7#HP*8D0S z7;>L(u2n255Tze1{w+wLPp&RKY%GQ8Kx3r7;NJhHGxgaH7K|_20N`+Ac6Yja(%;gZ zz7z8wIlJNKn}lm(7kP&pM}e%mGPs$Bt&4I{gTU0Cb5K$*0TYL!6%aQRWaFEVb@1WV zG%>HB*_SAl_4DF*=y-pF-3aK;WQR~NBWW0KUCAlDyJw0n?VTOnn}C*Pkeae$v)CSv zx#U&!P&_H%Z|4U0fPU^nTj{JMoX!LyR$uV?{h2w;cBJmpz70(eDvHF{t?g%G&VH#PsWvn{-v2vFb@?2APTcBUO@B*xVT z1+~FadKlK0-$Ex0r1zVpi0bo>BCo_Sp&%k>ESc_zF0;%Ox9C{OhNXcYbA7d^KMEQ? z7W_*|MnF{q#o|1CWwlq(8_jN@8l8fBvMNq&OKOTqdTb;*7rb_F@Slubo}3XlKc2 zB~pOQgq>m2pI)Yko4I#%+#Lar&B^(+z+n4RnOHW{+N8u*C}2>GhQGo+wYAJYgl-1D zjY85CQ$DO<0*=*1fgYG8>FDSb(*>*Ru0@n?UEVW_C|BlKqWoSxvCYMw zFE>g7u@kpdxMFObF_4rX6%OeT%#zYHmCa5xPlx_geBlTZ9{a1#V2ks=>W-hpI9}?8 zcffr7&yB-O;w4>iU3aYgW-c49czplgN8O*H=- zBve|s%NyE_CD09CTDNPku(5#=AMp`QR+VUH`3dd5MFR!IDqI>_0?uCwmrDleI22IJ z(yg*HFodM6++rsbzS7hERBfnyV;;iAsD#`VhdNs69jjx)T?OprK>xvJP*)y-unRCL z4^u)WXw8Xu8l^Ri-HT;LEPQE8%B6Cqex3-kPQCv{b4kgAdR9p5bcA?L3wI_dlpo~x z!&=)MPW2!RZ0H*4b2-(6X+%VPA-)A9s$WU+LrhAjsE#c933fR!>4S6Vc-;+s==&NM z*>yp*G&}t_qs>@WYotD&_kWmNPGI&3T~5NmhCRs#p-BAzY=ZSW|9HAy}T-M>ePT)Hrt1q7{%W*7ops%*8l1O=+H>DsT|^7 zx-9qIkrI6m$m=&x6|cTjTTzL4YeJgSpLUS3cwYQ%>Q?@#uQu4ug7J|8T;#Vd++p4G zWbO0!*BnAqn0j!Z{YX>}m+lZi7#dRYh{&acnX}*e&;zt+0qh~n>8Y!$^MTE@Lr2uB zjm-E?LRI2Npq0(&1Nl+kbYt244S$Id#h-z;ZYu*?YMJthqbG@Q|9n{KfszjI2l)R+ z(EduXzTmS3wH?zB!iewQcd7LguU}wP31#0WU?Z?hJb{-1>NEu4&F*y`+ZoZ(N`qPh zguE9x=1;|J(ja$x|NnOt+dyfij**8M4s0 z#;72D3*g~zy?9N~DMo0B{Q%Amo(_Fd1NcrrdL3Kkgy#LZNHQx_Flc;!f|x1Vq|E@m z?~e|5_4+*Ln-{I}r|f<&%p==X0LYdOZORa$)v>V z<=+1HDee5{Ub>T0`1N+Cq6G%(v<2G5)MOn_)A1Xnh7{xZ!W^Qb9$#>d^b!FA@|Csb zF=epnC1P>AjM8@d%@H@rE(FV5Zm%3loJ7oNQG;U%20$8jNBAcWr7)A6vt+go3Ge&m zinY+1UCrbV?8F>L-|bP4Kb$An5ZJl5ER*}m%FT5QWqk&a9fl1-w{^*esOaeE*kHvR z+0oTHQW6r9Aq4ofV8fMq^N-$EQQcaHr+|A#Zp5)qo|cs)Yk#>iu_4ncUlW@Wp6BV0 zL?-n0wme8a5}Wcm>Lz4Wzwz&o-$77Zac}3$p!NyK^0J3wp1cCx*e*;P3U+}sA};Jx zrTX_kTtlusOK0cm$}7ues!vKrMgcbR&YDiiiDo9PcQI0O`X{eHFBBr>LZR|LFl^MR z(2=Rm3XIfJ{3n@$=g1S#lZXyVBZ=CQx3sKQmUm8*>idA5k;scZBVMwrN4}3qNB|_I z2yU{4@2^&VgKJ`FXsF!*OMZx;Wa#l1|x$MqFJGC(J4T2aYQAZy`X*%9{vx&$2CHgZ_G^2eP0KtLlO{8eZ!NH*# zbs`@q0csIjbqczbw~pvqbYN_$>n`F%vZ3G#*I4%&Cd@ANyU;jf}xnFKqHaD zK3bZy7%y;VywQuN((enfOma_iQ8)&?o|A1&66`<0CS+#XF7q+K{z~wth%<`UdHZi( zfArdSa8WRlc!rmv*R?43ZC*TsENFx*#WVpa#Uqm269*GxULHt|lZE%8CBfDPBuhWV zHxNJQ#hZlI+umClf!Qx`BRYRT1|Jjin-R>IG;+a&U+6W+)VbJ4Dod|@;*TZk$YRWl z&m|=D-0QWTAzGALo*_OAReS#nWwRvfNPV{7=rE?eE{*;Z1CRhs!MARIPB;vjCdX>9 zI4XWZ{|X3JE$as!K0+>b5zmrD`kd73??+_0O>)f}$T+rjTzyzBG?zFO$_F&%E=*#6-;PamYY|p-*m72U*k-cygq(dXj$j zjAZyl2j;6^gr4HR6*+AK6)V^A(zR4Ry*SLE{vd8}keF0uZ^Wk$1JeaU(o4Wbwnp3zB~6$Dnwgl)#lssFAe zbj`hc6)Q4;ndrf4Hxj5Nc71pTI4>Y?=5RR2lB-!4u9Dulb6@Vo{%%s@V+3N(HHm}_Is`3hxYk;Mcx zLa$xvo>kjVfCnp%|3`2f|4>sq@di#*gO_6&eJZpsTeh)do8?zAK|BFeV4Cdi*6G; zv~;~#dGFtCm%;LH?-S5r3!$yR%XL~Q{6fN6aZ4_jgl5Eq2}0X>h|W8!_(!dH6~ zmmV~IdE*L0jaJ+0>o7iK9P;c}YnvRtNOX@NcSq4xR4YlG?o91;q*hdzhF#`G55V{d z$NtP|7t@`43j)lmzuaxvc>|^br88|FUP(xk?ZP7<&`1jzD3I^t2|;?%Aig+vcoHXA znO-1r%uXz0-r@y*DI)mPzY zDDTF3f=di&(PC+d$uiun*Aey{vNJKAfVCOYo0T`_FNX`~O%NKgx_jFCy;|&pFU%5@ zvN;f&K)alsIZVZZ_^YxE$kF`7=uZJmC$R}Q9 z{h-qU+g+kkbU%Uj6hzV8+x)laUFeH-4O;>}riTf`))LB2qQfX2*q(k#oY!QdHIQq$ z^A)9CTzARnyj`Lp8i`+U7?bf_^0US-U*ft4r1jR1z2xQSArbPw&9hp^I`GBdkXk-Z z1kG6jwt3(7h?ZjMJek9KmbSzWtc?sBr-FTwp!sW~T9zq(D9k4!GBY*x(OPw7iI{y3 zZk0Gd1cBuGwYob0E(c06h+H9N!I!;z>NQTe0X9fOdK(!)JF+%e%?g=}u4~thqSyPS zb^qxMjUfKr$J0@Felbi-qfR=Ea=lkr7s8OQ?YilB9dr>oChv0`!KGv%q13GMh*a!u15YC z0t0j1it=iWL;8C7ROry>UcRzzkn4TTOxpC-T)HgmCVgIX58=Nj=yAkIP7a*~jy_yA zZ`5OEp5m1mN8V+M(w@c%8yd0W_OI%Ms6F;{`3csC|H&aJ0lnJ^CNG2vb8_Ap%XuIx zrE8eBGtBomQip5)Go_%bEF?hIYC#@3l&+4BLSsS>R@Dj?5}@v(95D*ymzJ{EKUzkQ zGUljKmbXwF?Ys5g=^~erP5=lW&{Nrh092H&j?htJ9u+oo@*k`*1<}mBemCMI^>6@B z=%Fx?^%8fjFMQXQ}y_tB?&mF!6Y|!I!@go;y z(-mW1bdmff;0j4P2lVCj)X?ZC?2WLnd2nV_@0<$(OiS$xG@o+se55CBhY*DQMpw13 zU<6pvW9l51C>=~FvfwH)>62KoltO3OuG6V`%YKQT)i?GYvx38-JWnVgMa{HTX$#xG zZ_cfd>jS&P?Wjc9H4=|V^D;1)1`a8b=H{tZ+1~g|uQW)`xDbvZ%rbKk5^N!kDHM~m zQ%ouM?86Ty!tUny|IUvV@c+TbE!@se|K}WX)y#fF>fmXE!JV?+6mqD&jMNo>eftR*wLoPfoif-+k6AL`ZV{&zK zdq7|ka0yyQT=h_JbmZjupr_YruKTj85{UO6bzCCNo0o-I+3cl>h31A?ib@Y|ClcG zm#*}+g_s#HGsF^!7UjVu+}fta_(~h`&rPzbPx?*(g>4t zzIv)CVN_w@ViZ2+I7*Y)6qGAGFnZ;>+Kqt5UOT%5g}Soh^6oDK&(gB3eE#fyg>bxn+_Eexdii(=-wY})W*yF$c-qPw6?rv`<4z`7ceX*+&)C-Me?DoRMKF_VEm(4uJWg^6Qf_(|)?TE9?3WWf*Gb^KvaG->qUo$uT5%c)tjav zQ$ArLQmX5>!x>_(#5FEIB1=cK{VJ87u=i>;vERP^=B_x zr`S#A2BLxT^sxI$Izems5RHx&L?Vnf;z+)9B8y9E&esGMv9wvy8KOF>lQZ z0v`Em79*NF42l?LuTaM0rRrV3uAn~0@Gc=lzTOe5S-%W}hKvAyQjYjSc;JD(FSB;^ zY>d-^CH8{_bFdHc(yK?e2gC%hH?VpeaBX*B7+4X=&SK&xeUvQis_E*{tFMud2~<}? ze>S9sW2Q&RyxOqe^KV_Vu%oln44xra|GScZ+e;h!qc`Rg1H{7Oce~ki>nITk-R0I7 z*_xmv1&wWr?dlD}-re^1Q->6O$YX7b)CA+dfP0lWFa9f~Bs4JT9PXufNGKGBVqR zS_F?76-(7~G0#yFWMl#k({YR#{0`#Sq-a{^J65oa5G=#4M63{Y$T{>_|Luonz_8Z< zajc}chv|s2MD4S-s_dZ^nOb!baV)l#&<9nAycA#inm8apBswsxSvy7K|JUi8UFKQm z$A~&4Mx5%;&7A7#Wv1f5Pul5IITJ8gUnaWPuFQuv4o()mFYngWEg3EkWjAX615+3z zEVMlsD3~j;|Z`loVkmA)I&EqPl?lQ1{h|ON};(`Tv^c8_`_W1 zd_GHzvQu+Y|5o0X$`44ISaID1dZyx^5_(l_Ic(fN$^Gx!?OgZ8LF*Rua(-P?=5Bo` z=yS|EdFOso}YhoZtgwbGii#v;Phlhfs7p7fqNP2%BW-cM&5g$WTD;dc|97` za3V106PIQ$d4|M?SNI5$h5Dj5l z6OE@C@fnp%-@cwkY<&!>LzdFNQ$^5U#q9usy;$tVJXjyGgHMJ= z0L^_~P{5Oe?hMr1aKZHm%x2`KM3Sq;Ps^=vqUPxG%a`Y@mdQnjnKGUpX;F+&G;1D#2FuSc3yvj!=Yc2{qiYRfV( zH%fT#2(b;iNT&qhJ=!u<;azW4X0E9uc~IBzCE1*n)JYfnKC3nRCyvWgwg`yS>DgJO zNgG&kDNW7XZPC&BTiIMb7hF7aR{y+n;07*eb9w8vI@76SvhN_5(WPyUjwm zK`2`UIS5zWGLLk`fi@h2S9WqVQCcvu<7+Kpm49C3d~ zhKz8G|c)gELIC_(JlJG~F=x zlZS_gAs(u7h6AXXvmTC?WOoMYWoU^Uz&kRA)YX6$X{Xgym6h*6s07MA?5Vq?Kd#~D zm_$ufC(lRB{r!_}L+eud2D@v{Umd&7E%Ys?At61-;uHEBRdJ1}!;xXl0)jW^=W)-n zGji9E3)F;8x`*^U*6uHtE*qisZ}2gJ=;sTI9dx9nhI~qn9AaW(Bb4tF3LL9MYd6O6 z1v(!}SXi9>ap5^&_S)r3`SvV7cus75BEkvLVG5;#3$^hLw_f}6vXsPbRiEYQ-`$0A z5QQ;AUP(FN8LqqALw93@$2X)?B&ZWHk#8+Txioi zys#TC7=*XL5u4m>eosYrEbiH~61ObFRI6wV9bRja#`7slu)JLo4!8^3+s}1qJfxZm zR=s3?NX4#%N3@A`Y{_~Dq9SCkS!gA~uYWX@MUkOIz1eTeRJ=llpKH7C1z9~5H?5vM zYXa_R*8PH#hVq$a$amQu?G!p_c-yDE;5p>>9@ z_|4OPEyPxN3JT$tj|{KsX zP5{=hR({ziykGh}!!k(iyIF9sTqOD_?9PJ)f(~YT5LROG8Bb>W8dI?pmXFva%JTE) z7r*B%CyS8~wj)2;1u7dGRn>u+b6pt`+2@7^ss)GSah;N}?E)iFdf0z$&uGeaW_wiL zLlyU4Ex+oJ?F8*25y?cIUaNe!NytJ=8a=_r70FMX}7R-oPc71tPr z#ce+5X7}|VaB(g93zp8({w8VA%7nL-#J@%9L8yCGn?;Xn3m2qNZQ@q2#I|l6S%n;| z?~w_SVi3Ci#vdxSYo6kDP@LpdJug;KncrwC^0MX)$;V+L%}7m7mSs!^`fQMg(o9jCu6R(6VmvMKfCf79%G^G@*~f+EEuTQl9^4-;e|0XXNBOp!kB=WS zCbdbm?2EQ9@wRQ!Ud$)AN;^F#wkH`!A8|fPQN)#HU5hWxEHqR@h`HUX^lWTxbDeW) zw@8S_>wEWj@|EKgK`FEfM zA85m-5Ud)gD#2>eUk{>-#-H?kK|41KH`CDm#vOL1;xIZ@gvG7yqTB^3A*2S#m8#m> z6}fp+r`l6B&I^iWw6K{9Jgsv_OEg_dKif_xj!f&s&OUWH8n&ck4D??Dx!wRF40mdO zqVDfPf)I?9qA%2;z5RJq`55{DTZ!1%Sctby5Obnw(*$rBsEc5CY~x>f(D*O2lSGXQ z#VdYPat*yPc6I7=+gXL&#iw_Q0YxtOgVq6Eo%i>XEXIW_tTh9t(oKjD&OL3Dpj(zz zy7HNZy?Em;rXhPak{s7y2ZjN`M~?D~6j8Jrpy zF)Y0BbhE!rcR)L1HtZ4}$y=Hc<-0b?Y?%Fuzuut##XQJPDuiNN|L>F9dr7ic4nLKP zi>m?Qw{u+0WSJmcHt%lLH9@F4&^&{N=5~aJ;tty`h!>zHZ`06t+WGGAb7elnqC=@6 z7#huyBZ#?S1vKSd^=sA>sAb@1u^XAfE|17{q9h1jFP~d~{3V6p@y9-Gqz>2hduq1@ zaajZ$3q+ibX%%w57)CI91a?xTcd2g07fn+MYRkLx>k=nF&D*n!mUpZqwQTK7rJX+B z9%IEJpb4x)qRhx`gei&RwKR6&_JLyZv|CGsK{pns>LuE4 z#CWYaH7Qbb3P7)5%7c&F%>)mFmo{n$%8D?eE9tBD%-&u7el4+&pfU9RY0$sdY&XWH zb!Z%;3UOmo|2qMdk<75Q_)TY>C%V37#QptUB<~E(J1|WomSdA74JV3~Ml#G#iMU^^ z!(3)FiPlCdp$<_=?HC%t75I$C@B~ zJv2gSBlpA^99f(DbENK17>jS@YVHX}Z5+$J>xCwM%TdGqBxHU%0wO_D*WKUg9wa=u zh=5@bKb}>RWf4{M6gLn03gYrs717_4?~ijXy_m!4$vL7K-m!y$&w~x*e!b`Sr# zDFmYOWK+twi8#3Pr&Jw!_lp^6ckq>3tH z`3Z!5OmB@l{RH%8gwpCSv?~KD1o-%vGbVJ8re0$$A$;r%?5a;Tp+$P;L7;65A^pSVd^-F&hHa~&veW`G}HXe-Ca|hdQP{^ zJ$;8w}L{G$1MW~O?{xPpJ&!C-4@9!t!o^J(^&n(H#QKki1g%e@Or9C*jKo~K>r-hr_yF(X6y zqm&QqSd2YNRB}$6VM!p>6K$ESs=8*@gBBx3w`ty!7^+xLOU`GUPx$klQL*sgvoY0~&Qhuq+)4<2sN{!~TPtN>8Li4We>|L?+s5yb=& z3Q65Ao-7=fwc>{LsHNts^|DAu!i%~aM_Chy{>DcZ>zpDs^v7K9jqW1*%pbk!>FG8S zSCn$KOy)0Rc&blxrm-6Dsy}migAlVMzC^A>Y=TWjMqNgWHdf zq9_4&T!&}yC{ttHrzuujx>kbr;_YnX8%gs+P_>osz;!kG6_oOq7_WWgb@IanIH8xx zXH@1(zjngqRi;0ecR1e#Kww_j%Uqg;sL*JKoT_A7odh|l! z48PkwktJZvPV;X7cEUn)D}E&Fii1~0MFl>;xb6d-oh%COR0^lxIX~}Qpb5U^t6vi9 zTA^Yn&g5gUF~WTSDI#53MzZ*HSg}^UqIgd5E#MHAf?BKMM=vuCf#xcNI^sbI{0k!h z?iXoIYu)<4<$0&}=;#d^Mh}$IPlR~pW{Mj7Kq4_A&u_{gY0eiYS>dw2CpJV~4AXzs z^D7H;a9*8)JTD{XpsNU6h6r2E4WT2PSg@A@QMg{f203Gc{|Oq#Dvxly?sS?{MWJpb!*DH@>~$IK_URm z42-IDUA6}5w%-SnczLV8h~!OmR{t9Nxg?8o9{um%c*#bj>n;Fdaq19+(nF3{TH!VY zz=pQS5|Vd`b7Z7{qqTyGuyJvdjyeXgqyIqcFkDU%81W;fXueNDsUdW|W(E{`V2qpo z0#_WC(C_o(x!W^z%;66oHYaFpr~5kmIq*Ll8`N(H&=LMT(d6s^y5jr^S(LX zlC`L)s6bwGdIpalg2}8V<6GqoNu_eU%|-A}Th@1bS}@aKu$2e|a3dZ(@Eg&W*qQ?NvRR!>loI|H_*Mgc z1GS7>j@&wm-gEYy`E%J!c(=5xXv*r@tXFT{x&=;SJ1Mr z*%#1RECgy7s&|z4Z9^JwT-=XQ86uUFj}Ok`c-p@NTr>)lF5SSb$1X}}QrT+pjeMQC zIZ~WtVk4gO&x|(GSYU4=D9 zO4mc|naSbM;TiS#9b694~>QePkx_>@*{;AhmOA|CzW4se*>Yz(>E7Tp#VsIqM(wy6ApqYpPbpLT? zpphyfp$`tiDt7$l-MoOeg`dAU=0!%jp-)ncdje|o2>*xHAapCEvQ1OIzE8PA>&Zhmeq*E;D2 z3>T6VOT>R)tu&MMOLqZ*OFC*GJ*FZjN5*Xy?tMew{@2W?;ij5%;>tl~QRa{5d?Vez zrCJX03MYPZxC1t3eXU5l%;8|-zPAZNcZ3KBHkkfkgMdI%zrt*@i2tZ4wuYNM^_%?8Q`0lL zGqdit*`wbs5!-#}k-lNi?R}1Jw_@&4RrzI(GF)MFwY=%s6n_KNMy`>0vKGQE_=z2; zlY~f@ip!cI_nN0Q<-XLl?xOmWoi<#Ev%U7M1oqfR-4(!*9|LOYVDowiN^kl@wgbGw zY&Ejw6kBs{JGR?jdP5GkdGzad6R|>YqWS0hcuhHf#*IKDT*Oeg(%b!#^p@{a>rYMb z%b)tfB0N%235i-V%Xw?rmyV_w>STR>KI8Mu(9o~oCH?kS z7nlX0sZv(4W~t}>ZjKquyr>2kpC~uGYxw5FY1sKJx3XIdr~iYe+2s0%z-meQ@vig zVpp0Qr`|m;EyX3@Mnz!>2?^EZKnV~qcG*!c*QohPH=+#gBa!>#?Z7 z!>1ItkFiu7x@V9m+?-W~#}V*+<^$LJL}0Ay}a^w%3G zr&av=)|sAhH@!V+tT~n{&71Uf^p`%ddHQ1K;NVrZT}!xluS`rA%Uzu4$+Z-o-`Vky zs=LJ;)<^}i)PU1be6Qc#-pbKZ<&N~&TwemFC=y%W3Dc)`@E}|giuQDTE9lUONV*@XB!}6au zDMk;s?t42+|75(HPj=QDxKOCf{FFG|I5gjO|76#Um6i3OD{MPZTX_kN3iE`!I1iYa z;d4}nHH4mr>skOhF|v|qmEH}+i{f-$Yk%-TpN zuaj|+;^~%1O@43usB|LL%c(0B6?)X+=He1JNibe&iLb4?rjk;_b@7OmQ&{UA)IIKy zBXMc0yqo4)Lifm*Vf`xDNO38JU!JE4T6n(U&tZ}PdZ!iFx`{tI1WW~oplcSMQwlr*OLPV?4lCbZQ+an)Y0A&_y2Me-qHUJ0@ckk~ZkF53v3}4z<+W?l5?}uZ(^UDSPwJ-H3dtszWhS<|pjFH~cG&1sZ@>I8 z^V0ISdmw_QW2~3qk-duAsAf1~Is8{~dGnDUsJ_)o4IVu-1u2H&3wGJeu+AcP`ebyA z5q0oqelN71ta(=KPn-X3^1HCE+or$C-l&U{O5E+aBix)C*v) zB+r#@{fV3*VFa$NL=GcL9BmL{{0UQ% zRfCFix%;5Is4IX*?gks|qSK!co;j2Y<#ck!At5az?O6UH_t5zB+n+D( z>Ia{3$a!ULWr<>lA5j7tmhF@Pkt&f+rVk!xqVyuG#%3`sMo^M6GD$325o+JAyTZiX(j z=;1?1f|v+vrwPecKui?$Q|8njA()DZSD>%>pnFC17J?a-_rNJzH$~!v!go8TIT_Ed zp>^1dK6OS`c63}0;>)6|8K$pdGUEfCB=_HEhBNF5+sf~g%)Z!eg8P4kgD)5fadGSr zFEv{RFyz_B1kd*z(wLjww!5%uJlNgecvww5I5f#FM&7WJItd!eE>P5AZcI#0f{tm1 zL7tn2>?w*|BFkFT8;@$U1kU9rSa4>|?gQ`-gv5_kr*;xbHpnU~Z%tG(&in?Nz1+V! z_y2&CNHL%-^E|W)DxsY=(xT?qLjZz%xgfG(3N``GHhO)pvXMT3J5c93pD_ek=*2fS zHXe{wG0ghL7YMBc-G`qtGy{=4WqHbcG*{ur$R7>(Y{*I5Jr4%>>;qGP+)$LGyZh`% zkFt4Nb&EromEjA_`nWk>K`TvPb^rhHUYc=~#qCY(n-HukDkM5WsvG=5aPuh^ul2w@ zjNA+=oLOQ_#U1IeFa)e@-><<=lETNnS_TLg7Z(r<${!))(xrg24MUVgqA5M2K8`x+hyuTxtq&9zoI26W) z0C1^RoCWxrZW~4ZAF#<12K@-Mq2$gv#2P7AR0!qKdG4Nup*sOQYxXeNTVVW(jXlY5=u8J-64(A zDc!L_xsf2AImZ}tOx3IkDqW{C?EP8b zD67ipEE*s)tZH+nakJ|(zoaShi_l{T4x5^~fXiOz$Vk+d)R_nLy1WR2p=~$~!2+KB@;lLE z9UVDr$RR(eU>h;+`D8E2Seh#7+KoOAmqm6rw(tMqL&v35K@;}x&B5k9` zv}&$&s&^evI{+UGt8|Zo1`Qr7w4{VXYjEPDteg4d>eCeKrzUYRpsG3N0xK)o)XN#( z@BqNJ3Kla?S5!aNjA4W(3y@fOx#cTm`p3kmdHg&Xr*D>WxSRd$vP{4La1OJ>CSImq z|HiIaA|6?s=S(K5?O%;wgL-zl!c5c^^H(0^Sb&kjXnTU|_pee@E0CQZHeXc!>#2Z- zANFxLKXvAa1w(((6%9+9I+dB*=XOX^yYoE%^k!jU0jP;Vg3{MbGfb+$dgdWxSlLSB z;heAAF-#l)ISSIZ5;Bmu3%z8w)Svdtg2G74q^+$+cz^5b>mZ)`7zr44+i;g8&;Nvt z7);hen*#9?9LSTwZyagR1_sPH$#RCZ4FJMxRUJ~t8-d)CIdG+%iz-9Wypeb z2+rNVXdxoP=&{Ft{U>bEI7Aty#1#q67`8e?H31d^!2Sp$)LJB7VRsh@{9}V+b{BvQ zM2#GdFZ@4zbhD;{DfCbOye+n=vfsQ33gxdTG;=Ljqt%@Mhq`3}bsxQVSpf&6v;J_% zzh@p}QWPL>QOluNwV#@SOiYElsQ-pz)##WCK`y5D9QF*ZPTA%YtwFaZbP9j{l|TRV zFL~7e`ecF5l~o`cw8ad^Qtymc!uS8TXIE4&mj?QmQ(PNKV)x1Dafyz@JN<7DA)-mz zD+ZKW8JdwATta_^x%4ozM!wL5fU*K|zzRUG1@Qczm4V#u-yb4mhxF6un8HX6@=F%1 zXf;3NI-nZyMkZw^tV{pKvPQnI3M1ao@42;;aiJss_fy}JBIy%jU%XZG*V>IeejNqx zpY-3dJ~dEW{PV9we}ksQu@@KTdn;Ia zU~2wOE7a)W+krAAMgRNDr^;mBxcNhU{ogmy!>Du~;={;We|`0zP5v*r!hh`fG{ob% zp(k%OfG=83rdXP^9+hrJp-rj_-m zuWkCak}Vv(Kd;M}>Hm7}WGR)zAnE0x1!Nri=bnab0^tUBFAFa016p|R_%D&~-KVVk z;M+Tfmw$dJ@&9|f!6x=K%s^bzLp7=#4AlJZr^!mQQI5zA{|nvLpI4y$-(MbtnSUOp z|9rZ1wn9sMmq?GgD!41)2{+|(1_khFpZ{OaC}tS*-d6y?{g5;yKE9Ce$Hk4CKA!Q%3ptlWB@e6!U*9DE#oCPC4}rYq|OX zM~uJ2YlYERvR%#tr--)oKW`0=k$$K(#P7dev$`5m7C}^6gW$4BZ?<3;gS`B&hqwBJ zKU{B+Bl^#siAaY!NR6HjL(|Cf>v{hP+R#7#R1i=0gQMt%!TM;`OA7gh_azX*F z>n`X;E*b&>);!+QkP*#4Zv)M#{!fYxxWW`1e`cO+!R} z@~49%6$PH3T7xj2#9oN^*XvjvMWD2Q_dsdJ=8i5E;Zv!snZaCmhm=Lt>)|%&K0r!x zd9w^`T%cF~E@+;ifg6-Mpm|)1*#oVNv5}GHZ^Jn(kZxj;T`%)JPY4fBYkYUzFot9` zV=VrXdk!3RS%Q_5G!G;xgP|meJz0iL$cp;(5pw+r*MpOlib%y9-_b zMs^N^$DM9mx8#2?_`T3QR}OlHNCp5waT0^cD&@dn0bJIQ%NT7`bEx%OH5>(ETPvtE z&8%NR-rfNvgCO)~0a)|K&(AL)p!|XM2i-?=-PtlRP>qr`?YKLB49@=!R=>wA~~!a}vNaBTz1$4^z_u}6;A@_sx?y07GRBgF9v-&gbPJBon$ zIobMQlh%}B`{4)cGE`IOyss|XTv$+4^sXv30~7fWGJeKk;b6Gaj25=Hflzn;AzI?N zJ*W8L>{s7B&k1@s)|7TjIWH~kb1-^+X5qIu39i0?;gOzc(!hCT@q)4s{2{G>!lYI` zP^v-(Uh#Bw)lx>L8%iSJZ@OlyVERRRdb+p=Q6L)pq6RNXV?dfLIAhEj50vto?^#XV zuC(W2W=2}Q%s486hJ!=JhcLLY@zF8~ULjKS-C}>|roJ>ap|~cg$-(!@mZ-wz0$gtDc;(Q3Wdb`3(-WifH_()I!<3!z*;13$(MNuSAFIR^*6(V&yP zjn*Hz&uU+32&{PB)wE||6U!NZ15W@L>G%36Fg$>xu?IvZouBLuZyQ*VgYCrUrf{%} zbosrPe?0O|gB;>fAhPQh%6r9A4Ndw=I=ne;m~c1Utp#E%Fq%x@$j6L>BKniKHP}dH z-YmhskWb(ecjXP~VFB!{46;G<=@}8pvtYPs_jm|uasgO=sDTCrN znmJ6u?&x7rBA9)iS_9eyIR%A#&SiuU*4e%w^qNzQ-$3gHAX@S7-}h+KLhd?=(Y#(e z01}sy8_{Vg$%%>Po2s{nK!(sH%$XN??q*Rg>f9B(CrUAy5E$&eSZ|vNt+`W#*b`3t*`jrzH8q=%fm)87z4nFC~P_saC(R(lnAR^_gUdV5F0jR!}f$ z4Y!`E=$c{l!vswKdIF~bI@^6fhLo?wY%mutZ%wc+j3@}T&q)WP7Uo`C1+gR;6e@Ns zNVtKub+zn#cR?Yu>sQbjddIE-Lh{0yj}6>J0pcKTY=EhRpr;tsm1HPmq03$`6j=C* zH2!s=7qS|mi3?^TXWmyUM!b@X(eVz;L!dzCas?myJ=COy(sgE4bu^4eoAiZB<6S*G zQH8`M5Sc=iBo1N1aXx!0@I{uFB*Uf^QZw)(j@L(EzUCWb+Gl&5} z4=^uQ z47FO#HB7#7m0*Gtg^u$ToSwjQ%jv4Ox~D&9<9^yj$EYIZ_v=i z%c`$gGbEn{)m5`NzRbARuwE&Z{vE6WbWfq(!1Ugft-al4ti|qvdkLRBMnT|*Z$|ruzcSMn-DvD)hf&*8vV3{@w(RCP)J7^Ru!#C)d%^CD@7H_7jto!g3UB zC@3gT++<`v_w3hYJevZ2c>C0Dz5^Jd%o3%kZF;3OjrVL#B z&j(a0UEhqCxvf-mB)(8M%m7r&z1bD}RoZ;wCQ_iuCIRL_k#pqWcx<#Ij~hM)w8zNO zIbe_I)MOD*r(ZJw9-~4LY0GrmC_)lzz&m(GVSP zy?XV^bhh*J=YT`Pfv5XiYIGv%lM#gl53eYz#&dooqNOVXH&eAEQ!p@>$hk`YZ;GCFnQmhE%fHHkJ3yRHKL7DExuN=%s28R~MB$N5@; zoTkv$1Vk79DURq_QinBKEkZx!zYzkLF=#^ z+(s48#jYb|TiW!qWkw+fxrh%{7E+6!u`K&Taxxz$@5fQ3k2fmJhZltf+Tgx?D5CtD zi;D|{C2}Y4C_U){Q#54M!Odr3bJN^#ah{hZ>~>{pTO=ykaPYflq@fgrLU4gWI{h)_ zqj*@C5ic9t7C^4u-?Fk7)9o)B`QSw=KlHUmKy`)KRbMkCrdfH(8Hh`Gs zoaSI+L|*{eW80ElQ`{@}7{|Em6d*(1Hk-(YzB1ITA@3Khq>(j zeg@TsQAZ!7Q(bNs-*z@o*j>aC^qwMMPsFG9KW@bMMSDlcT}#IUGz@Jxi>bl_10*C4 zM_5n$%;tbM)c{3BqOpLe7;(rS!0ZliBTYXyJaaX`{HyVMgEGV8+Yi1;G-OC89Y}f` zwvsO%Mq^5v4I4vyawvZZF*@@dnJ27;Am|8K8O;Z?l5=3l>I4`WG0ctZO6X7PJXs%-YomuYq>L`0X>|HznZ#|bBCA5-M%Ui`6h(EWw>8*6LjH^EHlOo2A zNq;Vnw3s+8zKTqTB<#L@!7Fx#Z>SXNK8Z8DM`si7lbYmp8fGUxqFHH9dMBZG&(Bk# z7xR`oJ1L3t+`xE2w;c@N?6b2?&$zGM<^~k4c-d>aE|#r3U?XyiIJvF!4}m z>99Ia648foQ6lHXy&SC9Ipzth`(GmEet!?ZdmYSeNJ3v{XiuT}S)zA%P9_c^pU4x` zpNldd0BH!^R`2fyd{77NxM}8f)d4&EKw&XV9GpzFHad}VaQ)mMQNg)(hv|3bEo10Z z=7Q0NiPu(7!yBfWy49i6Yk#+6Y08y5tp~eE0a}5H9@ddiz{Twc-6N0k&n4+c*R3m6zj;m(@XwP9A_rrQ(bF0 zri0(ie@aI5($6^0p=f+^(ix^kGw}O5`hi0Vl0DwvJ2;4~NZ0=mFc7klUu#(n&UuG8Xh@50?G+M_6kp6Sov<9gM8LRMRQIz0U9 zK_(QXRK#@av&%5MDfcY$j#?vRu!6VKlrkl*J>Y)Y@>HZNLhZ_#-4 zpvinBC2%nT5RArE=w}@FWYuZBxuDr_+GaksTX?|zrcfsnw3{fi@bp^VkruQ@_TQ5X7 zhDY3D0B^OUfjYpYFI79M@A5p;zUSO4oLKlD+t_O+|sGzsBFRopBb)($*zI#PvK ziE=D#fFXT8suP8qB1#kyY-Y3%zp#Sa85nHU%+k@p_a9-ACdYsYq!p;8$?%2bSxW#f zVLT;>tkq?pntQ>F&spoF}kn6E|_ElDmYE=|FR|( zvR{$^JoOGYlpbr!;vLKjJ@^HpXj%D3FPQ2K_w`;S8OM@+Rp6Eo(^iLGn{wdRkYoI? zk=H0a=p20Kqav~A#Gvrq2c0~}hBMQ3b#<6@A*S9#lhD^`0_oz{Wkr@Qg6YD-6H!1K ziuIcDo1r}UJUi;CND-m=ldo8F6(zZ zBfvL0QgAb-Jpk4jVzK1F}~{3Rq)wtOpN!L(Ux0^SZ*2XNY^4# zh*>xCxQ)q0QyljSs;};^$5a{>gb`yv!nR5xr5^OI&!jDWG{A^*EbY`Bq{0CAV3=JC z>RZ$xt|#i6&?ble4Xnk@$MX|;%y#?k&Bxz9+s3q z6M1H$ChWsZgOJ>>)$<;iX7`Iw;H83mG=AhzQt9x&PloV zyS|ShDu4=o74-IeW6Vq`fM*J`MPI|qTM0%y2tu{3=O__+m-W0pP`AX{Fhe-g6iiW( zdX8kmfE(qB)GZ{;&^oE*595xs*4kpcW- zZ?X-1Qc<~Wv{GIDu^GoYUrT?KWC~B?;x6kAemgHK9UYwwk{iNsQGg=B7qH_o7lbtk<+f6OSf{5540)a~%}Kj=?{cwU@)5gkZsa)^*DUB&y*tJQn5= z2UFUBwJ%r3#gU!e<=n(t8%TaADdYlH%#c5ur9eNz_9s6aWBwcM;qTwqL!}6i#88N_ zfr03U2WcidbGLUf!(#z!O?t5IE z9d@Kp(NQ7qQ(fJgY}3%0NPKjEIlV)_N-Lt^n609YjB>_^9z-w)qW+Ntcg6HHl|TtY zeDfxL7x!d7oegmFw2Iea`}OKd+9IDmk?_us?K#Pvy{p|(1%ieWpCE$T@A4kC2VWBV zf6lLEO)^_g4pr@fm&iIzCHS-B&iX%fhQl@XAu2w3JOPa3%DGAOj5oaX|IqfW{vNHx$Mzsx!k!eLvkL&tavfUx8VP4ANC)4?Iqt zASImK_5|U3MrP(@7X!$@bJsl1=|2MlqT6FmLdX;f7K%I1ANvSTaCdh_F>VZj5rOrB zChhJOqp=r*8=OhW$$qXfNyrB9GW#!f#^Z8f7k+ooqlUignrg(6R%xN@%EXC@iIp^- zdIJN2^imdM3;FgoSTAC8`Wl5tSM0|{$J+zsdp^OgqQDZ{mubBFCx zd#0zF+%75S#TO)1PIYy4){|vu^Gpe_F>47yHey1UTT@>zdUGgj!Zh{w3@J3WiyO+t zeBI_w3=K)bPvz1Qo+O(Y(0tV%wYO9?f=@$CBu!*>#HQB-W(xiN_-|z5#BZS+yaHkC z*SSX5@7HZY`Jb6;Xpp5r)rROT(@y1+N7+qs!n;hO$jN1fqG{Kvdp zGFbqB$b7gjpj4z8u(N^rH6VEA)wjMRMh1M?S4am9wB0FM#5NOS(Sy-RuGW0lbKj5I zAlP=fqbD|yW9sPyjD=**C`!k@&p(8{%ciJhC|wX1g+A5+fFKM#SiBJ-pI+82fr>@v zS%Raa-X{Vv2r|UUpEdv?0R*~?kBugj^$LcnD7rh4i)2tnSU22l@!8^AG>p1_aUz?r zoH*meq5rAmx_QS8Z6&fZ>VufIb@8YuO&vr*irZ0mEQLs|NSC+y8Zb@5sbOAVtPlO! zPCDTWwfQ<-%MnkMo9JCTQWpw6PC>(7yX`AGA_~ePPP&iBoe$+OGDI&@LW@##pzSU&OJAB_Ck~E9$;-v|pS~gB#F2?#31dxJBW?icWy2-TvCc%E zbD0^;+6|Jdz~*A6(Hl#WXiVo3KYty(>+e+A(8dzn7%GtksAf58#(thqdnb*JLEK|y-a@MO))TWq}` zFo`R+heYfgT&~L;1K=f4^V@ZL8PGn1t=t3hN%gZbbC-My7kSxo5ZAk`fJJ}Eod{c2 zTU%TGnj3jMlBjv;WnUgOO`2o_X(E@BnYpys9wKKmx(#xqYXSGpi+~e+T5S6En+Fb_ zKLJ9kQpVN~H?lSmahZ7qy8vUOuVbH=#t+0U72;&W=nmZ$MK@$}9?`R>J-%qZINLru z#BsTCa&$CP?>OMq`qyItF9Npi10IEs9z6nw+9Hb;P|UHYsWv(Tc-u}@N+gouMCg^y z(LppuuF6z?(3X66*LA%8(eS5 zFM(pY*7dNsy87OU(ds+T5j3|cKpE@G4k|cZy9nV5jP}%=45v{Fgm;9%sYT5_}=0LGzG0H z)eZcpw;VQE7|?EYRyv9w(X5&Iy`TLWxV9J7kQQh>|im(faBO6YVo3EK2N z2TLHrTM{Mh<=~WHOZEAlj6W?Mve&m|^}bJ;`E^ZAO~t1mf4_5v;)~s%^5`KiuUe{A z>LXW)9(%BOBUYh4ilG1g5bd{?3E&#vf-l%KrG%2jP_h_EgAIX4G36gfdT`7Bwb&~B z=J>okCVpX(6i=5q6jjrw+FJzq=%29gybXc^152u^{0+ceQOt0(o==gMO2|WC_8O>N zp?{@gkWjhy3$;CO9930k<>eDYJnh;vGgNHjnTQwTWQOREJ_Dt|AQX>z{N15`c>2@)U#&%Cne+^WG?jub{ZCZ0}I*&Bo zniuvcm7O=qKt~G_m6#kG8u|%FIp|r)TG;NURWS5(0hW$CG4Qa*>ccG0`XqA#3Z72HWZZzhI|Pn4k2MRH{YZ2tTl0PK2i%i zua=~t60U?X+6|Wq0`J3mAxC>c-$sw197I_w4TDbLwKiy!0|;XZ8hBy-Q~g0wm>bfGE6u&txxl>sHvcXQ`!EBf~}jX8?kBlH>N4RJR>6BoLrm$7s( zWWpUBtzSaDEv~HsK3s2-w@5)jv*L~M92m-Vx#w`NMplQ(-I`@L-NUwa2o^IH$bwDW z@lKEww?D^I8FJ5U;ABf3O96sk5_WjxENMuZ@|x&(#e45tlJ9U452f_AC`H$tC#$Te z`h36=2os%wHwC2Ni8nI90#A*NOw@*b^T_ZhwMuy1+^vA%uEvE`DM876QbiGY^x7rOeN%UcC z7jyGXu$0><;g`74?F38=oXJR{TUh*SS;(FTeEVMjLuT-)N#GD-#bMEvb@zJ~CT}wp zMh>PBya2o%y%*zhwimVE!@2$UQLn}Lx@Z!#yX0&7KKVz!vj-X<_Kv7|Pc(C@E3+>X z2)8sZ4RG*b(+QB_1+A7HQoIz(Pe-`3=O^lo#$2f)7zWe*w+dF!3kGG#o0!lsGy`D6UCpvL_$P*= z5tOU_$?s!hjd$>)q=Tt7KPBf5@g1Mh4~(yCH4k1cY-!0#-cD}mdTn~Bli?v$51oaH z3!ng97y9W$J~_a5I8+=4&HxpSnARI`EKNd8AdH#SFuYa-$pCOag!Z4AoD3C`?nnGh z-gI#wHV{l8Hik~S53f;!7Tw>J6);vjjD$w*Gp(tK2^cA)cEK)y#QF;#rDbdFd~`*F=Lfj7*pr?oeqPVp~_J>u`GH;hWbM8>XK@f0tWlb2VL_pt1Y)_Sse zaHF|0>Dfj*EDqf{C?uu*(3gi9xTRs8l?TS-W~*(d&5= zpE-jh1gmP^)tfhq8wIVZDHKj0Nei{yU|@(Wldr`UC68m=_Up%I3;>)#o>AKv-d7d_ zx%rkroCAFkE#96=xF}^p>M+ni4X}23hL_WPW1rrG?gPqRep2oHuN}$!J!*m z$0c!MX>XHyCoD0VP1Lm9Fn1)qENy6bdpcczs=|z6L++Ae4CKCLxAe|`rCyLXDqm4jVpFx$r zlN+(GCzF2ikSlzA;6V8Y z?;!aB)4cm(^5`r&8evR+na~x7>C>U`msQV4&o1x^>#vmF_EuwF-9kkE6tg$z?eEvE zcVM&UkeKB`-9K73#Ckm>odMmtkW8+y!4M6W>&QXA#{79$ut}@tD;@MfBK>lK;t>p8 zsamM1tp!mN)!^n;@w+9-rIX6i1}{|buisY$D>|2GfHEisE8}spO5oehq&ko*m zx{5A?z`g;Ty&diQY;c*itG@f7;o#=|5ZyoPemAmKXuY7WovJpIu-}ZaDpl^V9tg(r zgQc99WU#6L{Ln_w=++>Xt_M8c2<85q9b<$3f|nD`llO_IeCUw<^mi{>zNFZ}CowQHvuvw`C%w zyPXyXEDCXH3*PxbIE0(aK-%1#;s#pN=4levZ-0sf5YsW<`uyqV zl=oIpy^v;#2-nw4XaR$h8`CHQ>M+G$e8*Juif9wH4sqdNoGKjCTJf2Sn68XPgO8c1 zuntDqzUMZ12U-2uVhpnix{RW+an9)3?Z~WjL&~Qr77+)Q1SqjEw3qTnO64N-9$nGx z6Q)NxugvffS<*O@fiKPtDC%EGR;xg|PLPqI@Hq&adGb(4)&srBM)v4_u~ttdj#?_r z@v7K`jMDM)B5#8t)pvUkPL!vg}8=!y0hBoIygb!)hO)i(4|h;p5<(EJx`+>7sed@FfK!LGS&PY8AI7CN)m{!MLH|c*SfW z*)$P3F>&iV%uC1-7R!OllMn5FLfdhT;LM~cvu*YBCnQ}NfZ6hrDjI_9s<$dcLsRqZ z%|}yS=;&KJnoN3&Znmz1wNGTCWfml^ zERt!~)ldcgz*EQq!` z1i(%s;_|Eeh-J*B+-znNe$v|~iWm~_u4AEq0k976FV>pA89)J&k1tx8cGh zC;lpdnn(S5je*no8D12)ZnD5p9)voH@7vq3ZBp^OPGDe@Qc)_#8x~!)BrYa4)9mR9 z{lqh6=qrU_(68tOdbvgrXTnV<^7Dz5l$RD4$qvBSHyu6|R8q22eV&F>6aDEZRzY(2-4XZ4Fl<_GeIZCUtT8!{C}eWzBN%7w!FlR6Ax#+Nc*$IdX_4% zo>0AlqwdAYc5`M%#)1VwHhCmAX(!NPE!A;{eAqHPh@{BK7a4^BLcefp96NWeyr+THd+juYu2S#z&Co(Ci1-9I_zioVix{UT2HPqgnG^?9kRITcI2HvJyFQ+wtlX&8f|hF$WI_{Y_z3HPZ3&d(J*Qy)d$K{xnY0S(K{ z7n`2sBVgQE*9Jfn3bQP+gE>eHbzb&YFmm4HG7Rjp6gsaozsm}Dyi9;cfy!0(0@!@d zNbf~L8sI-tjE_cr{-&IJ?7Z)CcL661LIm>K7ms{(dAY)TjK$#bZ|_>PNW5p6<%~Zr z8;YZMA+Os;7hWnv` z2AGU)2c*m9srn>tMC-P)CD~n;u&F?+tI=0Dw8)(WAOlq0b-(a_e*uocc7X1{#VQJ> z@=^Id6Fn8(xkg-=mS-Lv5)wkmO%t(`B8ZMAvg8H`f^9?QSs{ooC*Qv?ATHdDh>Y}Elg~99 zoB^HEE=YoTCK=87Sl0^%pI)QpG94X$SOu2@7_upO3^1W6)gB)m0hCUC-}WPDz3<<@ ze=>u8U$@UOqVrCv*8JD1im$zUN-O*iA6gKZ+`Qz7YSMj}O>*C{!g`i6m92YQfR66* z+>hLmNs!j*)Y&PWblMXT7n%#x)g3pjKxVJrS}lMTsq?&?a5O4aVA00^#Va5oD~f>R z1=$y~P4Z&+Pgqd6&9~rfLl8ZB(gcG!4|WZ>cL|>$JaSR{9#Lnr6L(TRT3`_~r>7>O zBsNtZTq8@QJmMIZ5Oq%SVN*xip*%w31DUjW$AU^rMLP9WPlM*B?#f=7N9j27=DdP| zkBfstTuZU?k=7GfXLEw%2PNNl<8_y1ztG4ku(neEnF|EX;G?~X6<#tQKYsMOz@8%l zNy7N|no1n_MIct62b)QkOpx;*L+Sj$^Ns}_&G5|}>@QT(*D_##0FN+Ib%%}ZCoA!W zz$Z z2pZdti$3~L{T+YziY76h{O!ALxYAl!Y@)3`)Pkch&K$Y}tazeLm?vJuAS;;yT2j*N zBjhM&yWged*4@JbKw3c6w6{ufk2H4*Gbta&p@zSWYBtxWc63JfU*o2?`1+dB`~&xD zsFXI?q}_KrDw*0Pk9ptJBzO@6S#@911C>zG@oP^I1*ivmured>iEZMcsxjqC^_hB7 zVkdg*0Wz-iCa6@HO4RBb7%YKa-7M46315=Qo4%OHT~s>9&}uJm+PWt}Rwn@3RUB5j zNh=+1Vr`?bG*awkyz~N-t-E*cp0eBmYE&_^TdIkHsx(+9@)^(fET8Hog;Eykp(0(s zt@<4)MS5}@Sk7U=Y>2-p)M~cE=k=AoM)2A?pRY_P>O#xG5 z3U8ZqT_&@2YTG^`$}BG|d@{1eRV)FF+Nd_uE$fe_&qtni$FkKM_ffvY*M7)RT5ucY zS)R(sOGrp0;^amxFly9M;B(W_5N%(8+Fl(-WXxT_D+%p3_mE{oMe~lacgxWoi(5ad zdiOq>P#7t5lWd2J7OdZkj`ZqEWLxvide7oUIRewjVoxlvP@gA( z|Mgo>VSysLW@{PsNPjNBFDgCzV8$G-rdW98EfJ4g#gO8hcaYj;W@g1|!lVb1=kk+v z_7)fhRI}09wYFa$!xWVDEo9CCJw-p?6UIO$3J7Q1&GJr8*SYPMMeOEnp+c7u=Lp

V&eE3^Kr={{ETZ}kMz9WI7WqJGg!g0GE5U}$VHolF&VZO zM}}u-&s=4zQr~Lqd;eNynQYO3a1*4_K9mmq0Tn%?#X2XTynNvK1iv8?g*xCe2Q#W6 z5tsY%t`S_46_z#L-Yp>8T3l@Fcldh`wT@3Lv(6rNd^)=W|K z62^Z+1KatGv#o8({rcFfmML3~gB95?ztrxJodV6~hw&y>j+wJ*}tPaXAY*V785)l!BG(=36J(fx7@h>|)Eu%*5g7lZl zIfj+EY*nxCnA$+w0nX2Q0_nDa21B`RuJB85&kfI@5Q9S~pB{(n>#tIk0kYl*-(HNlD3v(c?eZ zcrWSEp}AtSNK_3oKa;Gl?{9!4H_~)L5C`eWT77hU_|2F%>dZylnpsj2-@iR6kf=b- z!SFqQFm14XK6+5*;af~XG z_mQE>-{Z1vKvrWB$agAz+gY-*tmx>{8g(plbXU>_mmkrSjWWn0K;Z%e3{;eAHfx4w z3Do?i=tcM+IqSS>CYxen#=zJ^oWHyQjkpj6iXV{di*i#gB=dplz-_spF4Z(J0p+gG zj;iC%?c+RVfWm)#DWYl|q2w_YW;Np`pYjhfaq-PnaySo$aWXm56v!5V#TTDJwS33e@x6VB|Hzz0{@GQ!`L&S$0u`u1n zL#d*uI0~aUffuDq4t_UL%32x!@>Px@Z`jfEfzb>+E{5me4q6LIb!BeHGO6Hs2>UP| zn7}Ck?%~rommR8Mg>wbXhE%oG1wd(Fe1~lsAmP+}R8w|&C6DU+YC!Ib!z8qx_031# zS+rReM@QlSFl1l)@RfU)<_UtU?225hSAt~g-eFgKQDd=ayn44uy7zE_8td;<@n2|f z$>Bn0g?&QvtEI1}dQeU?5iHa)w`6Tt@NWFtr39POipt7tlW|B_JUu;!4t|_qCF-ml zo?%9bCS&vF>^gxI$C>eUnLm677A`LIbaG$hD1Q*RMNP27=XcHRy%Tm#n%s2?iU-EM z~rgJ(*Gk*Vns)bbYV21#T)dos+=BjcGh`{q>n*PmG^8Yk5< z9J?ybDFn2ij+sT9%-JSd)1+qF1JZ|fOOlni5N5dnrnmI@Nq(FoKj!0lZ(ka;L(Qwk zH6+W|`pL{NDbPq6)G4}&D2{gBisVj(zuaCLF?*;d`>QMvFY%6P&5lLdhiA21&Evus z{q37@6-b1Va|V_pj|CB?oWYi@;ss<0*oHJbe(~q0D%ZFV9x{_YOYt5;n>rl9PMuY8 zY2u6#Mm2kB z`zrttBR$j5KMEOVklm}=j>9|ZE9FYik)!$+VLw4{(!%8t$K&s>t^a{WKrP%^a6X&X zkVGI}!zi!g%>AiN^jx=|u{2_f)t+n=#k47nP&76ExDnmOFq3#WxN+{M@Ua5vrBaw5 zP-C|-9P9rDf@bDhje55>xL$$(mm6q=`WpI^GVBvN*%x*KQ(c*BC-RTcTlXKB%^=`r z1MqiuyL$p2O98kJ7^CJg4b3RufbOLHF>*sdE)8oQ@@;dH`^C_uP@|9N?O9s7(h=ia zY4t=Vd-o#+Ri z-)u6JE32oK>&`$MjQ%<<{J9jP?}immmet(&L+RqN!bb0IPZqrpwHF+`#lsr+jLen| zw%TwPdWA4wG()xPdU9Yjbl`FCnx*y6lk+*B_tj=5X>KkYxO5?cV~oDtmXZ4@JUGgVJ95j+$7n#w@eRbqM>;TT@PT>FO2EeuK@Jg)*wgAt`G(X19wga&I@b(sXKpXk0w;~5l&$miZ7vKu)Hi{)!97@ zREu2BET2>GDdS;wZ)2DBz4sBWuVZn^pA17BUy471*HW{73yO!?B!C;TJgIlTFIls< zOvJHk62#haESMTWP>k!>eeegO5 zAfr)yuwKhu73?^ES9717`;okY5dG_*%J=gVCf0>B>R`eb#R|3F5ahEU9WE&KJpLBu zxx{*^(FXY{G+#%15CVSfvLo#075!}Ogs^bJ2)y!So0<1#b~9-^DAe`uEzc7b>etf< z@Y2z}08`-#bF0z`#XJ%%;kemNivm@VRcs6y+k7`E$ zHP}t!s#~{3CM_ZJ&Wn9$+uXPK@>DU_xai2p?6IgQTqyPh7Enz|B5dtE*}b{Cr3iN7-Lx2#*B+xQ#Y*WZ6O`G(V=F(%PehZ$HAkiRSM z50<#F#yPqi@Y>;`zxcghsIeC5DJ|oJ#l3Vai%63DSn}EWviCSl`LvO2yv>i=AcVHh zeWN9TU3F(V0VJ|=87etX67Z<_md|W*^+VK7l>s+s-R9bKXFj(rC)```JgMRkxN5j+ zTRKiH;1r(fW&v;x0R2SUmgKk*&tVN1hLlpz4@ah?e$Z5Es^BC`C+}%cc_XsEpzNnB zKg<&~A<-|TBq13Ehs5WalxKToJW6!cq*PQr)fMqK5CX7*5G1)dyKF~Dn?Kci^6=F6 z$01tU4<~FXuqn3Mq01=bOY8)ENx@qgeIluseti;(VN-2K_nIP;cG1|ypa8y!y zA%wR3z$rw{iX=JzDPB|$V#e;k!YfUnE1Xtzlt}?4xao$0={kPOsTFF7Q^xX_VHPws z1k1A@>X|(YK{&?m?tJXP=*Qu!hj~hnSFRt>24%Mxo+P>e{$5k7jpfI zhOAWQ<5O!$0d2YR$gp{lDkQ6WqZDPK_+y1Ih8a^HKx}Kje}~}R9MJ|28FUx%f{~1< zQa9j!w0Cy?QmnzK)8~Pra~RJ=FoqN$Y35mNA$OCgl*JJOPt>awm7pjJP1WunK_4Lj zIs>o^RW2=Bsc6J~r)zC>UWq|e*6+m3Y@ z46wO9Otn-yiU4_sD{{o?{lPif;{fq#Y&<+zk39CJ(74ae&U#Moi*Vx;BiELBDwLfQ zK2Oek!axQM%hLS3M0p_-O1w(I9YZ&Uh43HG?zJ^B$%&?)_#{-3m0~tCFF&hf(+*oT zoM%K=aYMHB<+76f&ba^6*bhqCuo`m{6R`NbY!Ir9Kj0(R4}_zTv_oxgestR%(-9hE z;&du}mMaay_Xk!q*|E~^um1e`Vm<=otZy7Be3Fh9~bih zflDn9mk}dwMaOa4#9dLcEIeER&=Xk$K)K+c|2g#Kv{~}5|Kn0ZOe){631yKq$4%9w z$IHMh0B7a(lZiTegX03KsW|*H#bpC3AF!)9UJe zHricU>hkLa`_DU(nET&?JBCnT2h`w31vHCrCF7WhrQctu98Dsj;*T5Blne|NO&)$D zDJ3sZ_d8oqw4%-p<*-QJ4@DX%_3oq0+8vK5?a5#BJO{xz%$XnCDsUb&>-KOf zlpTqBs}7z{YS10mVsAT-aZ;K}E5-)J zea6<`Z;{D-_L$mC*|K*|7VhrIkdR)B_f2$OmGV7PTziXc@7%lD9_qr!lPE8Fl^PjG z`wL}!pR6x3YnIT7=uII^g{*_)~8c7Q`ZTf~W2bbV*rzUGZ% zwfx}U_RY-uY4Lc!`VC##uEVtAe)Ud|K84B`T!q2WTB@x98bV_b-7ViI4{HEMGo0}2 ziC=aCGi7U96h_*&8BjKPVIMcU1eH~Hjd zATMeUwm`U2R;Y*vtnw%tv9xct%dy4nNK(4w{M$^`-8Mo!Kj@Y9?KH|3rB1(o3oyTQ z9H*Z23{(_TsghPX6eZy{@&*T|#?7&~7G1a3zdW_e7Bx&^Zav!51oK^>7-)C(Oy2r* zMuc-3XvvALk|@gngrU1X!xT}zfrshOLL>@o9K<8Abt0Y?bM88pq%ud+o0@r@zG(TP z-QOE#WTR?0I2`=d{3^l4G-sM+sL04!Pe%bI0J4)o8YnbdywDB7 z2srzGC6xXtt(k}dh#33(kJjt_p+3fpKmul*SH!~Kjt>H1z0NOyrs<1 z5Vo$hBE|61gwTl{Ee@{W$G_@ zADKRXt~K*r$%FQ^YMDrc9>ztGT9`BU^Sk&pH8C;6NHGt2BL-1v#PrQ49roL#LC!SZ zeVDj-htuz*du$ zmDR1WiY2XHeZ$cH`r@+nx^=HD>Z!Yr@sMT1 zTHbkp)TSHNgR%+;MT%pY(w$x>rd%0kdF!ESq8$yT;An2cdQCwtmLyPNQ*@@AFx&OK1c>(M&1!O`hpT)O;*ZP z5k)O})!`?m(`^GX1u&VlO0I-ROZT0O5)pvR8Rsp4Q>KC8@iL(J&BVk6G$#NEC)8*) zy;uiw%xZ0?33f0bV*S15Lx29d|G2s)agW`{{P-J`@-?9>RWu)cj5VLvh zI5YQ$_gZqVi0{SgtO2XVmqjUgn#JNlm5!?~5@)Ri9l|h}Badw$n-3ngv@JWo(S3bR$?CKRv|PJ*;urh$(^3ZwljSzDxr{_~Ri(LTo z^q$)?_C0$X`F7dRLz*Z${?69B%RGlSAdCWKV}vgj2(p03MzpR;9w7>o^a#;zP&tp+ zyrb&ePQoy|O@sbyk(o}q3+pR)tFGjdV(B+NPrb5Mu(O$Na9({i=BAn?lYKDUVRlnW z3i%L=B}w|7amXc7RP>{3>g|hrK~WD}{{&}@cG)8a(8LUy?>=#8R}LWVHCGW`31V*- zWXngjGLAx#2p^$xZ%{F@!2!Zg_kglVqCw=h|&1M9cpo^p#%u-32k4 zPwjZdG2EDW9fJgLGw0itVq5r<%_h&I!zD>q;cGN-h&cDV5C8CxDp3oGC%iH=B*~-(a_(3I`%wM96v73Jj#s~a7c^(r^k)_ztzlfv0Hxk)Iihb3}q zYZYwLctaa4SakU!VexPeG;BE;C{i3z?}3JV=?X}Ely!qGS_?Dqrywez`#WyS^Dnpp z)az=QIWi=ga&+q=y8swX7%?z1_B`MI<`?!g z(W#KPC1Bv9gX;sw2Xt-1p{GAS%S##&l?r8@pPr7E>1jay0oZZh_i>F}8Jye94W=O> zv>hsNo{!1CNVUIpr~QD1_Cw#&s;af`;=zMF zJVg)u3*7`eG3?v;WN5dT1~@7=rp`D+d!Gh)?ae=e$@A~bAAt7@Z0yL>qL2`aci@#2 zb5`iglU(jEL0?n|qKlLoEvPtQzuMAQ2$zRyB}BnYy{7*)IP1L9LiL{igffAi6NDo0 zM)q+f+{7ch;6fIwf6V`k2LZ109&mxviIG76O2(`_pf2M_l&8M^XI*Ru$D2BjB1mz= z7L^ItSS!x~V1UT@jRKCy@y#qAms{!&f{Z0qmu;lt_$LT&GWlNa>~;vJyOLBi0_+%Dt zrhohP$$+0Bl_^R2w*M_OtG_R$Th6!r@$Im>&VJSr9PI_&=&(R2U8m|e?G*&?UH;!o zXBHAVjb3d-b{2t33vD_%$%dE;u?2GDyB96mBJO|JW%TvbMd5xp+_M3U3m8{xw>qKR zPROS_>_F63w?2SKGF?!=?{Kh}MD>HPu&`Qv7eo>4%(fT|UbYMqI^o{zI;`1c-pthP z6ef3-nfMKGXLrAE>XU9ZqX)pi0%>Uc%*OgUBzizOpxrgoUmmwGcN$jS=ICJl#L`Mx zoe=x|v5|^+kocIs zqO?C$E=AuKA-#i?$9Y_p`{nazC^LaeqI>lL9sz)aT3+v_u!D6G7YfSWIz@+6YUSb4 zzJ`JlGx{yP;jl>3IW;8(HR;xXK(KVm09eR z$ubVq@jtVr(9R7(MS=8{{vH*&+>Hyg%k`4_S7^5zcg~+atK6_$MyU+DjoggU5;5Te z61i3b{}Ec>;F|=3XgHM8Q|eVA4&L6P`t_K(414I& zlhY9{_DY+|TnbBlUE)f%m?&WD&qBssNwV6rh6cVed=|eBbABEk-3k+bO1Hwbujy~^ zFk9E}RVo&?RFuY&GWXfjXAZ|QL&^N=3-eprf^op-|5ZmT1qb$q7)A86Mv^M5==GUX^rGZ8u z!~^FrZ1y?AW6y0fsRSpeJ=_6^b-9zB?X>75cBKCe7at&Ji9U3ie;s_nXIv)J>7`I{ z`$qh43^wA@j}?07rn-qqxsx^{N6FmA2%@&mJiv}#-rk=|E`%|BJti(oEzzFu#~svn zl)eClbPgTHe>^XZ-Cii20GaW7_cpo*twB>3)4B?r?P6#rg-90aGK+S&%et;T- zpy1!Zsq3baXfaW66tYMCaB9@?twJ)UiFCv<0tA7!EYYl*WinFOiQX)KWSd!1`q)oN zfBAB5Wj)bdx4LyqnQx6QkPzkJffUP~c|Twv;4AQrMj@qrQX32m{$5^=inw@!sTnk8 zQdb|1S{`h-!S?@LH`;(hj-A;7r39HoWtfT?qadz!Lh=c)!>TDGF_x#z8A@ji?UAc6 znL@{0ul%R+OCj?Tny>t@q!H*;5mrMbTH&}gK>7I+NY;oW<2w%v7k*`~d%$Vpjd=AA z0qh7L>$zm7!aAoPiVY*@=jTAyi;jxYc1vy|D>dV!4Lh2jQ?EBPfCv1ql(V*2{t z2ZNc1ciG+otA9a9@k*v6F#5$;y!32gLX1J9=EbyzbUM6n%nL@J%&jfp;V{L%*Ez!8a zi@CO($PbZ}oN@ebDCM6djBB(9`DH6+g?8rkgMnVSc03y#Wu{O#F7M9yUVQEC{XJ3n z9QN!5D3Y7pHknMNu!Dd9TcSf%>qFUHa2}0Tu(GPF%t*~*DN^S&NTt52-4jkZkOpi! zK+g2iV5|nSiMSLz6ag*f1yuz+MxY*1Z~yMG9?I$f7)9D4Fm|rNWd#!>{4VU5eOO4Q z_wmnAG6E!^K)o8ysOPhE>?IMncMq6MrSb*uqIxzUkOMqPfA@4?1tlxwi?J}EOQM`T zPJhJxzNi`(7q^D!hw~D=M7a-2Q@i5sC~w%7stuU0De><7E`00HdT2EFjSgaY(%WgjXJ%}747?y?-s)wyLL zq=ac{mS|E_qKz*^9BD@CFdq+J;2j?)eM5Ee2vtL5Ty zpr5Q&8m_Fk7-flCmGlRtJ{e|gBn)Lbto0whb+Zv*Kr>7P2|6&7p*HS&lp|JYK0vDd zF7}bElG0x=S5{O~>f82j@r6@dO)W<`3HkG*dJ%8DaD0b)G0WVIyioWdzGlE5 z$^f#FHO(+*+enc1!D=}T3;kK2324XjUe=`}xMI6=@3%lZAaLYXv%assw8^l00`Z3Y zqGZ9V^L!ru2Aa=u8QAoWIi$XzQsZ;{2JWrg;fo=fd3#LGQ;NW+Fs?&Swo#)wbbSSw z?vF2Do_Kn4yvIq|{jGr4j=rI`>#k6-JyFkBD1YBXGf(JEY+cBUjC;?6DXTXu7pk(- z?t%Vt-bgc=0X<^~)*kexMU&c5pS(_R%i&$8l30Pyr1`UF{>E?Nx~Xe+S&<*6GUt&7 zo|B9NAvLv~tu4Y*73U-{%-P|(*l2o}*Qg^&r~S#6K(}Ll`G zIwSsi%H-=<$0{I5g%Ki6xZP~;4#3O0RxMRK3j_e+gC~2x3O!SmZUO<|^Dd%MYv@`T zNR~R!p-6t`7uEf1w!!(<^qO=-Wnz$+`pIFLf%q!&F?-?t~Ar6suVY zQko*y>T9dsS|!epZL4p23=poCPa(E}&c3$6c@a#%mzpVDu)JQE^<)do6_g63S9_0>AO^IB{ znSKb2rA2*!M>Nx&NmdpZaiD1>5#UB5k;X=deV}#rM8>)nR44@koIC^ zS)Oi>bCL%RKG4R4l0xOzaM!~O=Vwf?ab`^FL1w{y3=v_c@$MjCB=S6nLVIWf6Na;L z;D2IFt-Q|yUK+UC)xNla9lVM-Q_Vs6zTa5v`9}dsZjC25!iV9cO)*{TI)lHCQ~t8! zhLQw7@;drk)J4GQt0sl0D$~-^!nC=go*lRdKB)}5(@_t3=OtMjUvKOWj6i~=DR`0| zC2(?ZXu7PJdauD}DF9`{(bYPjHJv$`8$_J3Nyhg@Rhs<>-KP_&YzHZ{%5(8NGqji{#~M4w}xTXu8F?P_h6 zlzd}}l~D4%twvw8hMA5MfHNW`YcZHYhfdeW#Kq5E8FniBEm^j7U>ALK;r^3Kgwqwo zN#443%Y__l%79VarWsk-Q|*eTBD@=n0_W{k=)|2$ow&LhLQ=W`NMe&uU~z_bATsy* zMY)Nc55U@a>tO$pj4cJJ9|Gg; z5~xL6J#0~8z_`;;P5LYk^Q|0)J`)}W!qD_|1Hck{BQ=2}38Nq|8C<@UTftC3h8BWx zTz1D#IV1C-P6J@fH*elNct0Pmwbcd^3Bv}bX8@4!ubqfkk+S1c-EM~9w(iNFYkmhE`7Eje8ERnxDpB(s zMWc&&nCeW(C@5~bvzc{?N*Tf=kay_Y;(f+DYYkh_3M53J{mXlAXWQGO)fJ4%sJSb8 zy#_4^!UK(t4na72UJvaryhYg`9&=Gtg36IDxvls^Kvq>5Ck;lEtT5pdMVL#B@R5iw zWKd7w2n);p(sFlqSC^sDdZ2$>sLJ+Omi+%F4^DT5B^44_{7DmGR>UOiU%dctLt~3t zOvsX=+$4Npp3!&Tc5y<=r-)c)r6*bBaa8tU^oNzV_(54m2vwzIW!M8!Zo_*mra;YT z2z{C)(|vFY8x<~MJedDypWO!(l>3U(q}{TjwPW|nKf_D#qwsw}NTmi*-+q0*>Dc&q zQojO4(Y^k_aT~~}qxW-!!M#DfgVxxvTCr<@2$G6IO~lOKYuG2aVkIy)e)}e5O9N^i zuejEfrx~yc_t@uvY511k-p1zD?;$$pbc+yKO=AArdvR^u`jZQzzpS#Q@Ntdcpc-Aw;PI!@3T-QPTM^@EP#7U&1;7K|8jz`c4WbYBL|tD=RXGQ&TFYy z77`TKWw;RNZI5y1@At}TryDrwy!ph0gv?4biWa9naA`JwrDQS{_oQ$XLp2R|~e_(nQ^QmS%O?1O><7d$n_@3AIY*?;?0eUFaM8 zT|z6R5t8Q(b#QX1=gY^|VPj*jet)mBI9U1E8ZF^gkQJctU;wuPe|C0Sfw*eTSC~7* zXd8^AY8Q`hOD%JjnBl|>Gp`c)C!e&jOazof6u;S$*pX%ENJ=8%?(pA!4lQGX;+I|% zo>RCgSWaW?-p0!xN6!BlK(2Zq8i&As9%&kZ2{3pMNBX^Srpa3eN1er@h<@$;2kLSB z?1aPb4{wuYvE(;*?o&n1Lp{sJrI0Jc9dR!G-^8%)qo=0~suazq+)phnXP&ko@V$GW zsIAV{5G;4=W~-YYhPw@x;MW9p1K865Z>rkH9q}?V7XnU=ZYOV(828*4q?8Eum{_I) zw|3wAUuv~NPqed8woseToL^fpepfcSZ@=?m}~IcBO6ypVpK2w@Q=iE=}D?iq2)UOMj!A$DyyhO*J!~^AGQkwDja&H ze)z!IKd|-J4Yqyd<}iw1C%AwO!JV%ev20w+F1(Gz{m7$)UIZ5{c@zCwS zj(I3#mb~bgm{#j4T*=5>LYAV;<+XFMDwZ36L-$f7+KJT?kvLYf_RBn8UgSc_PhbAJ zC;J7US1+<3rv~mO9|DbAM-f-Fuj!;*>;_|GC)ARF@v@jUPv1(oNreO^zmlX*4 z4XlVfUWFR?qssWjV<5Ds8HNq92!qQ&unb0EHjR~D6s17etQSCbkY0Jkd|>LUD*B?i zYxn9|##=GVrM1E=CWbpfrip|kBtcIUaH)be!AOT+d;~p&8kY~5z?uDyowS+~_ppli z-y=ZD5YM8%yXVnQ)@N{8E{c7mj!?yKmt(recMzGcVhS@~9`Lm|tBa%c#Aw)Wu~f?H zhsMqWu1$Sj8(rKZg$yX0@$!UwiKoA_6K}gW!gbXNt}7cl{NnC0C8j znYNL6W;&^79bnu#x7#;jX-X49P4@?!V&X(%vx1w+0<(poZE*Zm#n^&Zc@YzabvN#E zZga@gD`;j;yjjr^Ku=kfWTj>maOj2M$*P_j4Mtu=r-g6cohz}mA5}O1-1==^Sy2HQ z5-in$6gf`af_2ihc&Tw?LIq17{YbdHY(9SJq|KocLJzxzHL{k&#&q!|n3UUyqu;0X z)v-;Qh&^?S1(TfQj?>Sb6sf8lK8L5UD z-us(-5+SO7sL5ceFHh*dIMe`h-iSwP6qS^jtWW4>T$HimlN444M%VI{N27I5n?*G zL=8d@ZZw25NS?*>^^yEBgF{ga-z1X(!4))FCMCl&c21N~R0QTJpl4;uvm6>8XvFv4 z^_-AR59h)3B*Dwa3!ekJy-w>(-hG^PnxvlGZwV;uGF|ldo^QWdW#EkjBI$4^hq-nx zxkHQGxGGyZwFbUs_hu3uuniMHLeL4+NnqpaYt&&l=MFsGXGw<6| z{>skG%wzxo_8a+T(Y6bbw-Plx8nL{liSrP+GM))LoRET|_|iY|+^l)DFLJfGbJQp2?WLgcJJ{Mkl3sk*~eI{n?HzG;_p%Qz#;KsbPg+ zTi12@Z@+4EZIf@%NWEXW{&?b8f6Q>ru?48$rTp;V?a+=PP-yUytA{YF zoUmyvBKVR*Xbh zAoG86yvYt26q7PCVh3h3BIqlCqQCkAkg(xw|6nX2nQ=!vkWZjmflRzdF*%#CewC!N zu#9$4Aa6?I?Ba6wZCHW#9|O!wx_wKlPR$Eesr9}R9n83np*ITdOa1p>B{p{3q)b~S zy5~th3N-}UM8^3AEr@9M{`}Eik2=2L=qr|TmsNnQ-R99#mZ0-K_A1g%b~ zTA;S*eUZCj_AP6m(`{;h(D4kt>Mt3qx*1p#{(ny)HHI4F7PkEx|FT;?pBam~}%&8OWQ`$^{k%NvnX0IX_T3O( z7Q;xuHDm7cIf7zj)Li}tF!UA`(+&URLOHk?rg&1{g5w{y`O6G!z6j-}!oQjeWD+B1 z2PpC>se36;iy1aEdXrk5 zL%klo$0p3DNjFlxp)mo*!m)IRQ2q}a7IxJ ztM6%3Goa@jD`xd|Pr06=(7naIeGYLZiTY+d(rYrR-kzI#gN)ifax+0+s`X8K)GUA} z2uqFj#0i>wcvQqBiO1xBaJCSGA$9S9R#Hy&i@nFs@1)?P5?n^A>BiMJ`3Fv}1-+He zv5v6wwMx88^v(w7@A6MOuz7^?_;Ir(up|KJ&VRXyjVk2{uqO|(D~!asI3F}RYrt~Z zDL;+1Bd*B?l0(#UU6@Og?8fdeV5w6RpWd+KsJtIHZmcB2T2=xuz!UjKaGVpk_yPa< zM@y0j4?LP_c4_UwmU*}U2`K;s#klPo_G_{{^2dD-_PV-Xiir&UfD>mOaJfXsppGFnLJXk~ujs0~CwWf4 zzvg%@|DSqX%EAU8wBta1u-t8Pg@CN8dwrerxbK*T-WYR!Cb|Cu9k4eQV;ye0#QAmi z5Ldy4@|846tgUwkg?wIr?5@`BATp_u{vP=QAkCuEE6CPKQT1_pjNO?Gwb(3$DQ@k3E~JLH(vLW zioPxIq#`;RPcM?rOyk}nsD~M(zxMUX)mj8BcIwmhwE`#rg=Y6 zN+QjVxDUEtIm+c_1Ne<)ontL@&P(2(Ic#t(puHFMl>DrwIS^1E7Z(Q#N13I$Fjz*U zd;%!s5l9k%r9tYHWx*O&%77GqYDa}xa(x}@A0hSwOn!Epc)sR@0&->HP>9M1wr zbue86YzYp;mPoiOD(XEkpRJr>NbD}l6o(UJRfDXgxJb_r+?v7f$UT;?@Z?8MO^;z( z67ZLZ^E}O~oc4=#2HZ&INuv}(oQfTlu~i?TRwnX6K|wUPXZr|m@9>Zi)xBq^^w)=Q z`@*CsZlfRsrpZv^p6=WNGIG~XIB|-uau{DeJJA`DxY26nHXvN^0!q+~=W<*nY;(Kr zLwtq$N*vZFh+qsWtD-ct&nCZc=N%O9q_TE{jt8i@?M{FW zg8ki)$Q=>NR-|=pj$&OthiRe2mn1Y#X!oYhia=g@h z5V zA>X4TdSY@ifZY5!#eX9>lOoig7={_PPk>SOT$PB$INljFFG+@Fa{N~!}37(PC}5tO5& zBe-W>ArtR_yET8=7sjV-;>G+xZ;N{CvrY4B*9>cGWk55x=t0X%T)LHl7|=~ZavTOq z#ku8x$ue6ufw2va$DpyPfZJa4oy?U^CSWymz4tv2eR(&IGBQDRXPEviZY_8bOb>cU zny)j{mkhnDJzO>Neg;Z@vuYsATotNDeGJ$JB-c`x0EdF>1X2u`)IH%YI2!hkpb^u5 zBw&FWnC*(#DWm>oA~j=SlHaq08C-b^C0hv49O5B4)NkQreh-`2VH_L zPaQD=(dmoces<307HD8J$0Yf#tHB2S<<7>^lV@>&Ad4Rq{ygktdS7fb#uuJ3A8$x( ztFJ!^*Uwq;F#5!9m7~?_!LLoCmoN9WIq^$5W$L$omcQ?e&OjD_6TJVe>35!L1;&U&k=)}&9R@cn>2lYRhVMNSY`E3kV2DsWq%z(uUvaaFpK%; z#VxWxNBh|_m(S=n$@DN8{d|jPlbRyJyB}`QQ-4bUbLC%AaDc@;9o?hW_c@&qmr@}A zWgavAqWz7lA^M*QKJi^Qe<#e zK;j$+_T9R6Bd-)2Oio_pLdVDcx}4U}wl+4-;f$H8cU*Ej=%7X4M#c3`wLvlTp_6FE zNUKU$z;mB#^ApEXG5?RWMV?j#@1OqT1mU*@+h?f~+PcS*X$g!zN&-N`mml<5k+83n z|G`NEUV@|X&v_060SmfoxCGsa>Utn%j}2&|Rc%W2n@wjwVdGtct=c`26g5@7T_U6I zEuU4w(mrOia;#rJAHk@|9ug?zc4Jf)BZay!Q)^o0x^0R>ntV(;^(UOkXh@*ChJ2e- zQ&6$&Atsrk?df;k*&r#Y?pwGq06MUILs3zYnC2EV!-k0E#=in)VP-{M-i!Aq#A9L$ zNOckjN`;0#E{xmW)rQz7$!V;|VtlB%v=SpR-_isW@>Tjyen7$Ix?Wju3eGEOkcB9} zvjI)dGQq<7dhy6T9`dvBA}cwfFB0&~f8EsarYF`BXS#&o(WkEp9D;UVby@q$GkB#u z=yHG9_B`iPw;u>|6-%mS5FTjv1`?!?+viZ+bz~GU<(k%Dqy`INu z_hUOuRAt%bfse*k>qeX>Bw135REfDB&U1PJMLO^o1bBEnfYig=oYxbRs%!3z*KpCw zqQ7kq58ruk-q2T%)9!(gkkh)SJIRCFS>Il~{?**hj?QZ%(&s+-zp32S6kNtI_-O95 z5FuwrSNR%dGnVIh3MlNyPB~t3Y(wB_1ZJ}WKERk%q{u53Eokymu1M2Se$749`0j06 z$T_|T&REZ;Lt39+?@WI`)rQIv6q}`*Q^PSEoSYrNM2M7DmJF-?ygiVeff~4KVSlV$gu zB?fyY@n!DHq{?PbE=8FKaj)iUQoaHlneeOH-sCZP*XYO`3o%yn=TOHR19N zHl2@Umxa&|d;=w9$4~im)IB5 zmNKsD(FMSvH~aBaA3bj;fS5T(*TP$Vuex|*9Ec3@jI^jr7Yx9t=<3P^(3v{gj&QFa z6FD?UQT!nN-7}&>6#qPedB=yz+zLeQYbkxOabNoDoGl$UR1A9aJXgNFTjtzjLM$zM z%ZQ}fJCRi{a&dc_H%S-exSc>yuzu?#DJ7-I=|-lYqY(sIJIu94ZXhsqI8OAw-eZL` z^DT9I%Dv~K4>jN@7DMa}>DNNMZmhPMbz8y{({W75+RHaYM?Nt#heO`t(V^O0_XeJD z$XLR97z*2&r_G)>``T>yW|vQ?abdGUyU8*ISpO>r458sGReoqQ!Xu4sY_xTZq_yP1v(DhGFPO{l$qHCh1*yC=$X?)iEJ?RcC z1TV-5+crW$rN_fhP8fMME~acO$!Hsjd-7`VT}L^ZvJ27@PuNuRocHKtPg}suUt^z- zm@fq&bExMQiv-wK_p%oh6qHy{Jgu=JNPfpDO6M=kc#qtZ00DUrOu)=c-yvs_R*U$f zy<@-tANpy=*q0xjyk%yg!hl^oOb>?U4y7cIV!Em^9BJ$gAAC6_O-cpoG|2BfSi zU1kSMJNz6A7?d4dmFw4T024{=S)3ohD;(8sHKRdSr4P%cQe~SbdI==cCz21Zdwc4* zCvRQ@^36Z_3t?o|P_}`LMU16cWOStPA!*kum8-l*kCd(%DEZ7AMz;+qQRz?inkdwA z77n4Y>oVIZoC_yrzYp`jloWCZmfXSxsNplG$hQ`SI&0CxDtRRaCMJYF+8JUV+`7gA zn;AXj2<#ZTiNH4Q;u8~_ebK`@ydi?(f8tfF;G~?l-))0yfXaqn+E$a&pI^w#IEB9P zlY){G5{D{;pUZSGv9k7!jU_ItO9E2<2b3s7Q>}1hpPGW?p06%RqNG_f&Eh4aPw^B| zzmB{xBbzq0;t$%M6JZ5cGbB#bJpMPlqoM5^V)-L}19=5pH8^I^>y>j*}RNaIRSpEbmzr+LM9wKdMYrzR*{DJ>?4_RZV!Xz(4tEAT5+92)ek|H($xkM}@gpzxm{ zX8rao#77MzlX&1Q+DGqdFAWB!Jxq)(CLI}-M>0z&Ay6rxWX;!6$`1O3=X7kq*(H&3 zv;xcbG7!OC0>>@>mb<`IUI1?^aBS#)7CXHF{6J?{R|WaFBRx-r4U9{rD$4tqA13n2 z91ydb%Y@cnA_q;DCKYiw!%+nr1h^Eu$WxqpRm<=sHUA=(AP!;)F21gciTDCcO7-Jv z>ynT$&7TpG8o^Q&28&Cg;j?&`xEquRH{-45VC)Dy>9 zOkt0nq|mNZq5Ed$5csH<<_iecppdJKFEb;fImkHRchS4MA$TH+sR2Go4o+MwRf<#d z2s8!5vO0;61E7jpHXoW8vbPP!YE{C=-8RzFZ@{kZ%fSska!)G68XUIz`SCWcmyjqk z6I01i2ftRgjlRU{XMo-&OvN4A3r8wbwHxU28g4N3d9yuyh;RoG7zj)zt#;3Cj{R*+E``wd77~)~Fk?m~{y{B{x#UP*keDJMI zPvBcFwO{BMlAUtE`+0hRW}ySjx>-M=LdNwp#7BEuq1$BnE*wZOvLeXzI|Cvhgy|MJ z4JRzkP;6nZ6pe>R_(4wK)6|Grn&FgHxl)z$;y zjcLW0y}Eu`QPHsqybOZB8`U)>INasM-Gn2{rcS`ayJs~-Ya<0x1)zt$MXBOFAOKkH zgHAb3%iC&|qV$)1GY0S0Ud<1jxtAaD6-&@dcZQq)Ezo?VT^3Mg)U&;U5f~DYKboh% zOzS7!T0?OJUOHf6G0QFl`}XMf@TJfpl!cW$eZ5cS@%aE0niK&cSBx6}&usS} z0ysaU(<9!r_fQ70{rX60dJKyPXc&z8`e!Ql$gyW&ZWu^M37kfd=9tC&IXFItU-WZziVzFU3Yr#v5-LD2)<|95K;YhQ) z2i0qz}GO#8YsLLzPklA-G1Xw7k(*I4oc*owm5bgi2o@8W{;A zcrHEENB^=z4h-v9xU&QV zlAuq>GiTSH6AxHD?x>>E{rQ%@P0qNnYLD&LmGAJA%LI~CY5AX;=1GZV`I{e+AfC)} zFy#@iA}zuj7*HnNzt}RfbOHiyFbIT-VVSh&oq+RVcTrIhNBv0>(`lkJSH)X?BW~## z14!hl60E666h;j)6`-1h=j^MDV=7kf{X@Yw@J0ju9_9`zF5RAFg`T8jz<sQSgayfYo-{wxXs6VW!t_p5`n5T#qLgYaDpG$>}J&3^PA%lV~gEKJuHoydv z;IRG55|N`u<%qH+O=$27Bh7+$_EQ4H$}VcC!etF3o>dQWw$L%Cf@`gY1NeS2k5}L0 z*KA0YET2cI(1%U>Ps91n=naI3fP{t*D?N7e6HKlV71Fmd_585H!ovA)5pPbEE80=U zS*N>VIDabCdUC{@$n6wP&S&J8AD9XV2pq%7$cz^8m!IxYZP;&Y*cAV&Z%jbX=;-gJ z^#EV6-*<_B&T+LiauJ8?5+$>Y_t+-zd}!|IvQeW|_|B8K(VKC`QCg-ht*Pk(B^_l7^KM9E&I3Lr& zr7DT0XPt#x8%XJF0Or3mU~MR-7rOKM`N4U-`}{qt{>?y?#4;;;ufPC_r~i#3hOkEd zjU#B5y(O@NNoD2b_3P~PfB@1vqg$q136xAJ+RME83(v}IF;Pmg zwNe&TjGkWTJ)K!q648Ad6lCrvDjzn6i2dO-fYL;OEr;*__B%U>RzbTRNSVx!7ANUK zTq=9nTtguKu_8Wzx(oT294=UkHj$xshRsCacRJ)K9QKqr>A3 z!pwPUWI$H{05U+W$_|qJA>fUq!XHKA$ayFG10L%)b&?c%g#M_<5nO1i*@iGJF?Of zb$#F#h1w8A;)8Qi1Y%w9#HsBp5@n9rls+Z!4aY1p*v=WSMs5DjBE~8gJeYy$pmRdW zG5~K-Za515_Ja(u1;u^5yu9r1ph}&9=}9@j3P%ROUwbSeA)!r`dsk_l-iwO8ge`+4 zp!=~mxJmN^YeO_;u&#=iD?>z*`_AG{=4n zQYXIX-a?hK&&kOF&w1HJi9Aqei@5I)51QndZv8{4FgaiPCnIYPOeAMyd@}99Y{F!_ zfffRv1;fJ9o9=au)h(&t;T|3ntQAz4f1Iv9@toa<5_{>tXH!#y;D1Jv-wO~oq9iAu zr-e^54Q&|=RZgzAGBG?9buQYO2^eZGI4TopL&U;}Yx7RGYCmhMS*v;Vj2B32CxY+nQWkfDac`%&A6mkNhNp@`Ep%yNsfMa|ytn7E zPdXS}!UKd&T(V4Sv}TCBoTzwI!z`{vwlY8y_#r*jx>4fwYuXp`wE#y=ibEf~$c``CE-t)YnH~qz z(Te7Ned-CLSa%h$BgRRQX}$w=GPJJ33fikrFSjX$n7vG$ZqQUhLJ7DdkQp_BwRdX` zePds}@d+{+aBAs@&BRwrGA>mRVlGqD94!^R09u#VRbjNe9k@1&L)t4!RNZg27BZ4k zoZy`Hv(VT(gMJSOt0nxq-BPv%vyuM3a9`4hq$<%@(>Se!vESTM{Lhfs3knNCN zhbmP4n_LnrMbMFEl!S)nTk;q{M*1xemRq_U(ZDkO1kgs)&91-2WM6jju!v~mzStQx zy$Gd1L4$b{5`Utn8$=FdFh{9tt;m!%mxqyf`QC)E0}G7|*%`opU`jqXDm$ZOmdw6y zs()>QbkppiIGgSVZD4g~Pc&K~Mde0}L9AG4meSkXdwm7`b3;J5fB?>LXk%f)^!H(Ss+}I5Z_FmjDCwXLM3Z2l=(jhonl8d}7OHS5-^{`IZS_VUX%7=}h9Dzv&Ytypd z^~D`8Tm27+>7s*!Ll5=9$p@#7!EOcTPfq>XO?HajAn1bng0=u929_myKbt0+62%~6 zE`!kaJZvr?ONV?Y3rDdk@ymTV^i_+Vz^c&qcuXfENc-bcPXHD&n#umWZ3PBx_Wb-j znExen8fYtOcVMLRTk`^Fh*%tqU^&NLsIHs`*MJ)y4YBN@?Q4d(Efov7P)uLYS;O6w zvX4};mYtm~^o-Z^KGZDG!LhrZAc`hv0k=p-8AKB7p8LH=5})bg>A=6y1<*;<9r1UK zUIU5jXevb4JAc3XUFG(ljUcRDApX)5e!!ehd3XF6(6_VL(7zVY~NYD^@7GRYTZvEcv#6Q$e>pqwWANHh@%HrAQ#Y?E8~jNr=px+mnp#&7Ua3FX7Jwn9x=ATtmR z3U!cYKzA8>Hu(ZfvNA@;z53MfM*QO+vu1?g@{--Uk406uyL}{*_5V=z9zaocS+}qf z1px&FBqKRWMsiSc&eBMhEJ<>XilUNpMkIHW8juVksAMInpeQIv5Rse&{CDd+qwn|K zd#nDcnW>s8?C$40=j^lh+H0*142iqXaCH&4DKgmLOaK!d0ybS^5chO!;LCU2cg{({ z*aT8eMhi@su}iejXI z9mJMsJM4U@7X}?wVGwqntl}~>thSIb(%xc!M3_Ot7k1LU4r3x?P(svhflGKUoToRy zy;GgJy^rZ}NlW5u53ek}X=uqnk@xaFgR+X*rd{fV2QH;jpH)gcEiS`TVpJOJN>$IeQ*!3xhB;fK>R;XP2Fd4A+0BZ5G~rk>U2)iI4etu;BHI|FbXaiP`zhe z+oI;X4Tr+_bU$}wucE~Occ0qpGtPRoHcFf1{9VeIefrY2(3KY{haU$5e`-fF7490T zV3Uo*3(Vn$=MyF%hdZ4o-$T?h3h0AYwle=$_s%1GYo(mUo3DC-@fuT!YOe?)-1-!n z{q;FY{nqzek)J>A%{8F(pA=4dIjPn0+io5RG$YY z;p%q-Pn|7y%~*E&F7ah?h5*5bZZ0k;U|o3Ww6wND3nBqbdwVslMC^l#NAf*?!36N115s-Y)eM3gv2J|6tU;ho*h0@ha z$omYw6@RM2dnDum-7pi?P8t)ipPV#$qC_WPb;8RXDy!>Y`&-zNk|0bVz(XlBkm|_l z_w{nJA9T*_Ro?ZpAQd@fn}Lm2qP*;hZoe0kD7`H6O7bB?+FZMUiCKbdu1|PZ`D}gLz-g5$e0g9bJ;mK zx-~G)D%a}@x}cC^33~nrdU5yhB1dCV)X{EY3pu=&<@(4v>G(t!wEDx${F(Y!pYVj_ zViMIyv3rBL^tuXOKrA0*joJUKYyR+TeV_T$?SiZ5J=7Vv?Z#|KK2FV6~T z6DB5YC8l4(Vb~;t6U})7^Pn-i%t+SK_9j3_qvs{FptedYliIXzJ~t8r+ZxIPVd!NJ zW#!5Qy>63Hu?^=(f(<9mI+K0hGBC3+GnUOlx)n-2PT%~FJZM>eM>cD_51#8Vx_4lZ zVSLx(*M)`4At`g^Y-{3O_3qTtMa@y?nO*~uC zySxvBPKSB?6`t2SY*Q~g5IbG*8=!4k(~N$6tVuZ%l1 z8}s1Ty5NP|xgkLGelYBK-vJO2)Q{u%{|4xuAE`$Dkf{gx(Yb_vV)GyhJ6bZ4xogaN zQlS18u$-|gnQw&D#m(X7Yz;sv0kgdqp_DJ!#+Y3Cmjfjb%=<)ZZo`-aAZ7tiJ;!1Z z(50xwdnBEP3q{$!sUno7XSLlhZrvZ7E}Y$V=Kg-wnCnn=8hmq;nSH(|Oxa-z_l-7KH~ms zR=%uCcmZ|cC_XisT6bDYA;C1&0oQ^v(hneQyS|LJu_cCW`<4$<4`%YmOc0;b{i*~< z4tq4HeClF67M`4Qng?M)2E9L?D|_7w-V3jl1dfDg&uXXY>M~=Sy#Ux5M9<019kQ~r zc*;~?^?d_2KJ|T9owkOj0s<+Z2=7dHllXeMaY?*DySdUWBC794C9$Y%su4p75{2W{ z*6&aTD}Ln$_5W76BBuwQUC8ntbwEhtbT7Y$CEl-)>H@zdJ8%uW2#ITTt-dh-)nc`)FhLBBH6y{kHi^ zj|O9Qioa8H=)vnG3F{nY%xpOjcWP!6OzGI$Mk%81TOHW#5JuZ!Fmi}z_Wfec^CCnzrm~-Yy(~pws`1Lc@Xqz;(m{6*PgyW|kU_CGm5e8UJrK%N zk?+V8)T~mfau2=L%(tl4_w6JCUQRTsAVPk1~{1WwZ3?=C(!|Uy&C1QmfX2~n;^_d0pwrX!LY%rW;0WWXSw_NSPGf1mSHMPReTB6ss zlRdlWWzBZ!?OZ5NR3E2<^H-1=)v@|yh%@<(EPO>>tH(`R6nl%`NOO6YhX98=k8~kU~LsW^3X> z`+RVOK8Q2mnnF&DMzRfJGQ59o_bcd@nM%}#?A`f9BXv+AtfjZMPK;}`Z5@@;l*gp6 zE^f>(`aIfZo-!HPmax79QT0X5m3ORSVy~em)~qjjD~? zgz}j{)&Ts>$sA;s3JMB`<+`Z2GSr9Q^u4TjNM~x-5@XnI=IrTU>vaJI4m8`g%R=B)+>Wc>$BUf%#?r00{FFr)>b7Kt%&^{@+J-eIXK2k5p>TyP zT=;5_$72UY`#tM@a&}ECzn2W`r7~)lb{e9?X7L27TcAB%Q@Y^#rfPa9o0*Gn;{-NZ zG9ma%yc_xK^G(cCV##C5%wB$|wOZIb<%hy1%~2h(6Z+)*Y>6v+2O&4MW5h0dZv(9S z0HzZYNb!P)rpS@t%GwcDAsR-T!f=O?`!JMN0IqQCO$W!_#~ zk*%R5GgWl=2D~M0H@>T%D3l*(rz?S`Z50q6hh>Z>I6*D&S+1L{K8o6x9P00mzWRXp2GSzDra z4$H~frFYk!d;&~>m{B%|TFDF)oIpH4+@#b}lw5oG3Pj1DD&99)YMX>g2dt`;pzAm( z*tR2klZb4F4Rxw5JM&=ML((Pxm0Q0^70fi1qwB2*keE8*p9--f*+~6q)YiHd0|a#+ zR5txOvfhklIcK&>3BhiloUWx#{mUBc_vWXYgZDk549jSd1p^Jh8W9VsX9=L;qMa>PscOCOn%kVtA2246 zMfcpAFHQ1J(D%I~!TFVw%+Z39t*HV2Q9Q8Ygwlfm!2-wU+U1j(n2YP5R4?dCF4CF$vt`kO798i6wIA6iz$1;x31&CJX&WFu<*mA4WlxxS(!s8Plo z%~IYZ>482tNZ?}JT^|*+wTKZP-JriuJ!gO@e$wy*=9W$-wm<{l$;pZAK2ptB0D(vu zPbQ-vBEkNy1Ua#F)ifk-A0BnTC7_A5hsJg)w;^ZZ*u!Pm;x;{Z0n1G9AiU~KF*(>* zIG#(?dSx(Y<6K@O5UguDQ^i5qwH^1IPS=>U$L$w>)B6TZXxn+=g6zx5nDn+~r*36- zb>1r4vBi?_ViD2$-!oo6yJK?V+pDy^N!3erZXrkRjFRMhyCsykMfE@q)HH{@Q3i5J zpST{Z4XE8Q$+F8^0e1aHfJLFFk#^kMljzT`M@&u;oRLFmmZ^LPs7bF{?w#Y>fZ5mW z>5IBSOw7zrp%M$Qm1n6o3rOz{;FsuMqIFjfTx-x`_Rt7B+I}N;{(J17trnVY)c<)P zt6F;OtvTxGYstq$DJA_`!zB6wDpA6NilZ00F{i06iU3mJR7}kv9h1=onK@*ExM9o%s;@2%SyDnI+^MH|p2=6olPtyk6EpG$- zz;zZnV-X)Y5s3iN{5Uuea%ch=aZTcB&McBOX5YxMz=c5hiTL(InYRGb z6l}#J<={XOpI$=NvJR(f+TP$c<8M;_VyA}%W7905bN+=HLM4@KAp9%iC*i2b!m;EN zrMLg8B?;L2xD$?Z4&QP`<@%SmtGq7x-gBpL`4PcHe!^JBJ{-R+fmsflv&Uw+(WQ+O zL%Clo7@x}AOTa0g$dwKNkEZ9EQcckL@zj3FNeZ9ECLUXj-VpkH>Pnl#rZL zki4sedqX4(=$+6G8Ev7Xr-wY0fa67=%5@dT2GhM74==Cl4Ad}54&Kw))nrxA6PYjj z3g>j}yF525TEUqWLVIQlOc(QjUinx0*a^%9^BVxVYz_Had-j%V!cZLH&Zd9xks+$+ zDFN%d_)GIKYdzG>uOw(Qe4(gr0QHRf4Z1t@H^B}Qz+&Nr8aNDkFyMjb>len+?|5(6 zUbJvOmP`k>@D{i>m19N#fYV&G&VKuWg2bdp*(XmNKc zRyfIU2asAQ@olHP;Ky}%sW``1$$<6J7*J)tv<3M4hd+#|qSrx(Y>Q6BIzHB@)cg+GFTQTEwY!J(;Ib}1Gw#_CzPB3NShZxel zbq7Q=m42M}ZYNKc!Lx(4hLsSlE60z_#LTTyiX{#)t|~orT^+o%YtV-`y&8dq3%ZIm zkj=rn+s4GOf55v0RL3`~xt9vgKhWv{3~KE4<29`&LCqYMS&uEfiCAexM+RRro>@{C zxkj9(iv+@!QZ|1$ly9A#VfsmPF$OC{q3Lg+yM;!hZ@n4rZKhk9ym@~)?Y!#rpfYm8 z?L%8LM6~*gj=^Ej>R4ZY8glb-6xuFzPI37dxW|xZmP)Ps2GN!hTMo;tJW3%Ms@;~L z-vc3BmwQT2@8BSY%qmrf>EC7yDwEC;`g1J|Mzv;{Ps3#m{zI7>W6+0#;oLm*>I^mz zIS}dk1b!8K0M+Q7_*MAA?DhT_wmE~>@5P8|6CSQE=+H^A6r;q9FJa$PBQIJj8=-@$3a@4Ll2qJf3$@En`nVSkl>GQHeuUnmf-?nCrzK;}xc z3`t^d`l3f%*p~Zw5uU?KW5VM1mLc3=a%590C?zCA&FZ^fRLy9<#0-eQb~5!rWVLU1 z@;X-0)^R5u%JNs`_HwgHO13~SAABZ6cDCwF#wa&Blb&KlQ<_K-w-XWq@L1Cvbvjgz zIr*Upu-ZYh+kkxv!HfY_v|Q%A;`>PsiSWToQup-(0}sH#;t9!sCHQjk-I?F~Ym;f) zrjl)+S^BQ_RW2u+Q7w}t`kg35DI+!{2WXnHQBx&8{074 zHFpK(iAdY_p8eutSZO-(3MYf0Wu;?5C_}K>7`-bX5?xg-AKK>o>WdXo?umYbI|4#vd`G!zNl`PR$8f|k10iU6kzF6F? z6{MF=mq8xy?B9|Ccn~y{&+!;P$P;vMSb$=ozFq`LuM>J=e7!V36mr2+G6amlYhB=P zm9a$KToz;Bd`x$FxW(I&)kxpmgC6K8FJUJNlVRq^ZgN z1VX4$79W=0)RH264sH`(3BLDy(0)TA>e#&+-_F?P1rVR-3agPxo^%8ZWsa~=?t|?s zCC~1aWnf}&^>O42a7Z)W{?~iLd;_aR)?4-J`wc4FJs)CA&DuCG#Isozt1q)ViVgyA z8Q%VL)(Mnh`6vMC8+y_elTQR!-!~`A$b1H?{>&w6+}Cob{5uFGbPzQ)>);p29DX5D z&Z9+rkc*ZHeL zMqRS@?c`H&J3$E~(0r@=dJpR0Wn^_mV;A@+z^f9q>?FR|=gh6<;3gf)_2hrVFJFENSO`5my^}datDi7BAwxoJgKLKunF1ka_^tczxOHhXkV=B{ z@iDaGrEGdm)jFA`sDKOyDES#)19?mbBr&Vn(X~3cJnL9L;kb~=Jz?eKR6Ti;-3Cpg z@hRh4oF(CZOPpIW1Kgx)ZFA-atx$@o^=&>pQjycBB=5_!VKq$^HaU#}ZCt}hC=6!H z9wCvKzN^x^BQ=TS1IZ;n<7%O#r}r*E0RRMBV9XTxfEIeO^?OIM_`|ALfLd-n5B;&X zr^@&vB=NnY_CZZMQh1&GJ|Q0XhK!bI(Ux4~=dZqds*k#Tg8*8Ypt}pf^uq-~fy2zo ziW8hPH;5;4562VDiJQm z$}V~(<*mh!Eg==<7o?>@VCexh%)X!JF|J)|gzr!-iw|__F3RX%N^#-2BAaxcf=K5G zY;5$3)hWJoY;13fo^8#Gf8{6wNt=Uxtfz;^c?nO}Tv5VdJXJ0!Uz!xaq;Nw-TU$U1 zR%c)$>h^vQirUvwS-XE_1JH~F%+y@{XbNWriL8vY?q76q@I z2RKMVr$I1Y6Y|%kkYe^pYui>JQ|!w5F?C#3E1LAV$&SwrDFCQmH`ww2H0`kLQi z=h^tm>O!F<$TH?_A^7d~Qau(!5nHKaW%RZ0bZ!BYK%bSA8AuK4zcUp*!^DQntMb zV7R5qI~+sk%e;EhHk6w*H~K0{XLM(F>kK$f+{zSP=8nP9Td>t5WO+9Ze7hBF zYD2Q#AKuMCMJJ!K&tm*Lk|o)S=3G;sM5`;3@i%aOg5g=yQTR%AF+$Wz|^ZftkdysgUz2x0n2XU zL}W~QzvRRL&@q4m?NC%>N`;+clrnE`=RK0G+#IxfF^JP1GJtpn(J-6tw$DI&01}4v zP90q6V4QyT8X_pM?Ap5hL89~xo!<@CjF$J))0ipk!BqF0@HmnB0%t!vr)0BMKpqVD zK9HQjgk?p#1v0n70B={qChNBnv6-q)x`1FffUkfNgAx{BUm?x{CNGO@zD@D3bFWOQ z*=AT{rQlf57P#H-fpA4#981b83iyf^q_zWYEtG`zQ(2H}#KpwaJ|8iOfa@A2Y2Te} zgbSQjJ)16{oN6d5P1zjg+Zv3Hj$&bBXZm^ojzr08Qt+U@PhTF9N+PGf3(Zur0XOE> zw@bGj4QnF$Oo;|{4?fHeQVz@&=qIlj*$Q*q*Y^_|49}#+6~oLRDT{oq6qId^kMb86 zBf&HXi0TOegE@08qnH|kuq~FI5g{zLGu5hTm6-&XMv1m=bzA0o*G-?NFV0L&Z2&Nb zj7|NOfq9wkLJfRa1O32HTg;^(5R8%b*Fgpe_{35ocC}e;QfxpVT^n|OP-mF}o zt%P103Ve_92>oejZ36%@Ocx3ikBtFw3!Yz1 zb?g#T7#g>C)ZvHeH_ySdNy4+4(W$FvNeiUf>WqB1^5&QddvKLd%hl0C_=puQJ+Q8c z>S>llos!ERf>1>~R~K<53VWP3Pcp#~V9Xaz_>I4zL1Xa;hj{%J)I~)_I5;@xxDD^- z;UpL8@9TA~@$;U$W?5%+~>FWKet)`|1ZVGVI zq{*rQkqz|8uEF4thga^fei@m63Bqiyzz2SJTk1mR>PnyRvErRtqp}R{a>MVIvCscz z6^V8}39}_(yV|?4LI<*Io;#UxrOYZ!Xh7aj;B9$lr(7}(F%BM)vAT0T3WWluXeAV( zz`p_R%xeCSvUPVy;!r(p*iMrCgq!<@1Xh-5Er>5EJ z_4oFkA|bg5uEUiB&z{+V-_CyED&jP0@`M07H_uB>DD|(z2bO^vmci54HxCSyM;@Nb z(mk4ao1|Fxe$N}lrLAzuv$O z-2eO$ushbN>TE^y(RN_Gk3{k1SVkIL=bs=30u=3OJ;qKnGw-5g_Fb89wDScxwRS4Y zz91_f2JZ87pTx6ECv7{_^tx*1fr=;WqtFhFfX~%wNl6<(R82@o0K<6UsM=>``o;ZV z6czxw%~z%!qFdz*WwFmmxf0TtJ zAHFrSUBM1RjQWiS!wO8EVz-F&(g#rk@FUMJ5oy9W_=D+qEjGIs^Dnb{^N`rm%`oJA zCQb84YS+jJso~hzSRDW*g9Qd+x`ejbeT%18TO3E2yVl*Yps+~Q*4lnPuPrEh?F{bl z1U$?1`}Z~UgD34KJjb24A&Cay6o$>HsU^7$NwH=Llb6qySJ1Su>U|UoX9k$G=G9&O}MN1&6=#5#B)p< z?sUxTYml`yHHp8HDEVdroqOoB97E!}B3S%Hg)!vZ*|RmkNNBQH;niij1Cx>A{ak}M z4ISyzl)Sy?B02%dk^@$VZ&Wt*Pxiobc?X}S5&F-s_d_D}aOC;;#IJ0BSd|aut!rF~ z`|Xx3v(Erf#(_}ysC(3wFoEnRK_~4u?Z{NZ8En z5hjzv%g3{uXj!}CN7K|kx%Mb>AR+#8pBT21c=^bA`3!4D*drV_S$&~GJ9ERK-Qbnb z_el0%xB1UdlZA85y?v)~UlXo!+x@T!mjkA5n_;>BU@Kvnk0*LRqUWBXrZH8r&(`G! zEDDGEf52O!KIfxGbbogI3AMI<`&FZ;>Qo?Q!dn6K4>mq)_+3DRK`m9XELp^Gs| z#&t?0#_PfgGyb&d4Ip(95D;jtTmg$K)}2oq*52M?h!0R>y(dodTJ`?n3&=1pz~!N9DY_o0m?U7fc^u{Ku)#{F&C@gVV|u48GDRv{8)b6#1-!k=_x7a zfUMmz4>XsELKC~6T~|R~sTy?S;cbi^wI9EdN9hN>MzTeJs?U(hL4Ia8)m1PFxN>d3 zEDuG>g!Jv?71IOO=hSmrOo$%sMo9GGX!t-HwwMOx$_*=ho9;3-Up@W!*Pe;*!(Vvy zEf?dK{8ULbOr3rREve^8;+qu(Pk!|IeGGXqcLscO=b)brKqK#D$)~>`K$L%m!(w^% z_#V53r?)p97+lX%pKGA<>5JGdxxW3`*ZeX|5_QNWP+}m@Y~!f-0Hee8HN>N2|7qDp zr;6UnPS!b4Ih5>M&i+N~rmsQ_|=WcZ^8T4^{^e1rw9=(?493i^3 z?7J8aZ>sb6au?1&=b)vz^@GH*0jL!%U;^*$e)=5e+R&wsK1mrTpIXIe`yY$oAaIW|c_3a5WH74`H497i1?*;oO;4wK zgaR?ytQnRdp6i~vPp1$Ew|GRGi2Ehu#34Ea?rA~}(!oIyXq*B;H$sNjsN&qAt9O*u zw3P1(rYS`7?LL2pfYd(ue}DGeg%xcq%-iCy*eKs@snYNZ6oQ)@t~gWdF#+fA2@i~& z+Y8=XC`WoqBv1CNzoNZ_WY3yEz_!a(^F6V@*(kTf0E(P0d2^^$;XcK5?0BTa#W6FL zAgN3B_dF}hiTqC5ls_9?t@{wmOAgb^jQ+j=oWI<5aVf)VZ!+j9%#uV*wZ$?7cb7QH zdgD(<=NA@zkl!G_t1BIV(U_0PK(GGxEEMa$L+{>Yj~LdhL-mo_qHzkCK{&P7APZ-8 z4>%TM#P6>-TqEZv-fhx`4Fcw&P#&M{&OYGGV>J)R=lyTz>jMFpzV53t zp2|asE6>~$j=C7igZzx6{t#uFI6giO9&5EMxG+DHm6EFlR$=+mu9J@znL^=W&QeK|V9;sDBkh{VYBW!IrA3so+V z1grS*N=jzcX+W~Y08Z?63k3~fhwJzxIt_$2=q&mzW8sDnCPa=jq zhg{Dl`@3HCgXD|#)YrK~UbAT#go?)E`fjP_Nu2sQ3Nmfo=CoJn7Be|sXE$)Q4AO}$&r)$y0CclKF5y#2oQorU8l}b0*~nHhm*=b@8lj+y-!7K$_CVgqi|Uw zhu9P605Kgk&jQv#>oTa#UTI$?+!HhL%gbd5g8U669WdWK=1ER_FoGUH7l0+zh8O&y zA}PU0BKWU8)=U*n7CVfN-;kCf!BNn}uyZuS3HEFogP`dM^o*0IZ;Y3n?7VX23hn?6 zWJ*}wDt%~fsh^t*tQO42Lpu6gxIlP@1e|?JkDQWHnaZMVPb@=MOQfqsb;j>8BHB@G zzN0tIXn021k+NIkt2)YogWBHgY674nR}!JemE5?gj~=ThVvrWUsJ)RRc2`8#*p*n) zUBKv^(QsQAkf!|i_0#2I0{C%D=cyjBtYi0GYTnq7s>-k1>OC`i=|{N}%qFDB_-5O= z`CPrl_2}B|bt91WEG60XGBsN&>JMyhY!v=fR#L(YiU^Q~ODqf|q;29CeB&ByQ?(%2 z&3sEaCcbnH1}*}EXnh3mo2lOd95oz>FNuUwGs)AdOYa)_Ma)LWe1z%17R|%LP9D*K zYw4LB$N}KcU z+u@rxP%}cfA7v~1dcy0k5v8I^2QHriGHbH&AG-PS0?q|ay4G_QBmYcH}ppkpuf*(@36sZ{qfxcycC67KUM2a8G|mqVg@rB96GQTZ0GsO^r&{TzR zl87;Pg}ya@u#jX{V&X~Sa;@wS1nS@p1CqAq{BdY!sT>OhNipc3o!eXLTxEQHy}kyj zh_zPOx{=RBTfJ*LRunr_@Y|A&Xa*`{StdJJ^-{40q73W2vzE0*u&Cv6-nRJgOcR&9 zc{4HL18`wR3EOvATsvq*UBM^Uca#nW_=qSykcuLQ1vz`OG&8*eoM|pAokkvWSAW$# zs@9ktX3JpDue1zHEJlmXrU`C<>$ZLSaD){T7NE+-K5csd9cQaqQoijbc)ft1t`8t zNH%B_|ZEy+(XgUE$c&`E|4Ii0=T~e_m zy}!QZyTQQ0d@BPLnB=x)W6qX%s2?eVgiQb=e3rm1Zl)M|O0|}lRsbyqOVf;ELDt6( z_r>Qj1y+`(^%%C(D)!iOn( zsno_d#O2)6tVL*u$F4^?na-WG6SV}p?nyAm2^{X+|3Vv6{MLQSs-mEvLW9C+71!wK zz9EB!Mq_zChoIMoCz8PQ|BNhXI3yOb?t?Z(m-qV(CU&G-k!ZVqt)kUd?5rSCq*+pm zkNNMlmjU~tLt4h4+A1K)!t`B26;h0{Z>RgKy(=EC_85Mq+>>jekhaZnC2P@a7s~xz zhZinhugu?%Rd@+j+!>r8s_Y=4v}p3^dSLDhEyNVa5+2*BM62T3iFVe&0ItAcCo~&Z z&ByxBeVeA``4!IMjCKUCLOL;U@Kw3d(_}qhm2k`_dEo32cl+TJ$=dY`S(U7tY9*6F zmkl0J@)!?BKB_&9dN7%l)Z__ar*9K%B(Ge)zo| zF1<&18*m(+c0yL<19L?Ve*pb$-t4ImlQec;>#I*h8_(l4+jSV$E@>F>bV-GQIqpkw z8#3cWBY&&*_I7Im;<;6r<^tYMiy9!UTL}KP2ZK-+mPjw0Vg`j3PU1bQR{TZioB;^}Iibk&$95K2=sR9^+tZ4od8|_5jz0x2w33}= zWYpmg1ceezp6CgRSW7f=Pnx)Eab6}0pMhXL?&^|lM0>4sjo zRe+--XD($cpi006P>83NHS~X?9qT46A(81;0k=Hlh)r;D>0$Oi}Br1I}KsSW8K8KUy|>D%FVhJIfX-;eK3Q?OQ3E`7S$g zo6ul1zf*%HC+Css6jG5Km3<|Z{p6RQwm&j;e*k#0s3aG9*t8w5rEqGP{h4)d!UZ5u ziMDX1Oav=dnzo=+A(3wIkOKeP2XS%Ha!@-M`bQ_9cvL)7UPMLzVU+LvNkvH;bUzUv zC9j?TAa^9wKGX;}wIt9}gVa#01`G3x07~{4#y37n2CiEG_B4}`y5-CFx9@yeP9J== z{m34F@xX8rT`}2%ypjVQTvBIDKf&QxzDIxw38Z+>n>P_aE*Xi1J7Rz#MG6%x`cMy?OPHs<>wr=-@& zSgH=ayVA}=s#U!Qh-786`Miz)pfijrYE!?%PIJOeG;DoDg|W-Y{WU7n=d`rjC&b7cVlgW$9i~(;-`wz{gZ5q@YOe>-0G&BXpYpnA1 zhHu<7!!G)CKm;SG{s4g58fNXN0JJZ3I0jaBn!8pD>aqJr25vs!dl?(2&2KZ0lBP_U zkg4#S*^OSVIR}CNx9W}{W#SMwCjg`q6Yr?OqGxmnBFHJ~*AIA*)+{Jv%siUK`D1|h zQIGZJnZ>gWO-*Uc(3pn6K1OZgec5b05kkDjeQCBbXBQ z1J2HtCoq9`)2`mjxMhv-VX4H`c=%s3y*y&bZ*OnUzlCV&>iXdc9j$IWGZnkg=V3Ov z%aHXx)Wdx<_3Rlgd91nugaP2#2xyqrJKltu;!rwa{_XyLSEiq*C)S;M4}%AoMsKZ8 zy{Rj-a}6cNkl zM)U<9;}e~?>dQeENR9`{hvHln58C0S_zZKA5uDHO2KZUBa$eaISy(2QE$n^cT0tOoS$q ztr4+taTh^&ZaBNL;!>GuPHF&K0`fhMWQSCAYo^{@yj=)o z8y(a82zNL;1w0~5lB43(4R`Yby>!}x7$si(KQCSnK^(?|{D1}Uwd)-)D|qE^KE*^y zYgXYq&|Ux%9^aU{UcHmYqn$(z>=IiDyfZ)dm#> z-U!T8KVL@=uGg7645avWMkhg36G>ncF4v#V4;`HMfctb8zooVVTy_*B9Xp>9z^o4N zWe|K&fLdi!S!(#Id5H6`lWK$qD9+-?PPttBX#Ey%C(y&y&`TmYERDPDq3G`fsI_F_ z4%W|$Fg{Mo)#YT0ksYvd=0ONIH`gO=2MfmtbuV0tpFV%ay>B+$rgpn@jm2;0^CZZo zK!iJ4_LX@9N&#zIsdnE`+X}0{m}i_wbWo}Uc*pm0sT@EC9fB#=&M$*55Hu)6D{an zvHknp8r@dl7~Gpn)&Y-<=c|tG)%S|2>MQzV$BdzGmj)5|aDDa;W5@Stl`VOM(fPrG zF@QJ)0+Md6`<6WY>{&GhrNAQk?%lh)Avkv#{%pMh6!!x_uDX4e-c&Ol<|ZY1LVgJA z@ne7gS+n#bs(PPPF(6?_QUH&^@7ojw6;iMKYf>;3D@6P|-=Q@T&{`e@O#ii$McF3G<|*cB%jQ6TC#Wt*I`? zNKDK9pSBI=WAqR{u=RIw0fL)i=R^`-X+a4+C0C_{|I7QYg@C`@2C#1S*CBylcH24{ z^^_659%JtCkF2E-eem)c;u{m@sM;$ajL3d}p!Nl?@->{~)PMi64Vp04YKkV>UJytV z*|>H_YM9@%gkJuA-M)hbz$oc|p_9MP&3_&W^P#%NDv9!e-yrk)pAVE`#1?_B5GWdO zcKD=n+ks!=9@@DM{AYgL$NP71{A-aW;NE*muFVX`|Ns1zqjn7xOLx%DKmLyA6#}}( zseoEPO}L0D(kSwN%$@A782T?Xj3F{Sg||QkoUc_-yZI5MTt+k?1{2^yhtGl^*D}|3>h20aahybNT`L~n{j8GQP{&mvy z5V=Rj#@N4h3v3T{Xed~#{z_0>U&PkK{t<&HBs4|>XzkzG!rA1Bm4Zez4eP%)Mj`40 z#~HY!a3j(E!*jeQe>k82Svbs_F2p1U&Qc$2&nh4qtTB9%->M_b_WtJ=VD`=bai@^k z`A|uyx|T{&L!#w+{$GC+U53&Q;6Zl%cRydyGw$y7b(R7O*Z=+|%v*?r`VMnMFlYKy ze+Bu?(sUgy^xx0<*KdMV0kedLTrS&-m`?-89}B5HQl5YHVyxkZ6Tq^=H%Il7IZLhK z|L-sUv&bie7y(cC7dztD?)tq*2Z`n5zE697fz#6cXOmvwMjpE-zqm-rc^fv|KVOI0 zC}4aeZ!vlUmCnKF@OFPepygrqM<(+U*OnHM9&U5^Ts@SGaOq_`PaX~ zY=S>e0(dF6^sJ&o>Az1q=2vPOi{Ag(U(qQK7sNZ9-~a00FAiQxbbG3iTm+;sj|nhG zixUZs8-y?E$)L6UKi(iF9suvq*xhbB1@n>FN`M<`n*jTX5m_382U*}ZX;u8% zeGKK2gOVq5!|F_-f$-b-zr}+QhM%1?z zjc6-+Y>+bkNaOz+Wb|!Q^R+2|Mb7^yQs9N)cce~e{o14untp{gIH7o!n7tafAKa(- z_rvwrPOK@$VWLAB$}NNk`TL;$3hVb!LgrrJTk@U_R`%XW#5Rk;Gl=>B5yxV7E(GK^ zi59v|=wSGXzao4RO6X?M|9X$G|9^#QF7&|}32oO>Y;cSIe?64D)W1I>7!d+KKOk3O zcoU#}t^0`LbjGOLjp)0SHZ3z=TLrlE$JK`R6IEY$>K1z}*i> zp6o}vHQYImqu*7u8M$*Amgxd_3?M0Qm@fExbE*lTTY%vEz2nE~=Xg1o1oS$jq3B-m z)w+s)t!ITmZ-7<-j-L{uL93{D84H~@6$ds2=>>3Y8X7C8cd24JfIu~zh%a88A3J)e z0}X?zM)xzj^3d&{wRCrXxNC!>ut5NKEHgRADVU(E*O_BsIFd)#emG~pBmM*?cThu_ zw;HcCU$>p8GrW!+?*Jc~F-+G(nZS%xuqA-#9)*c6T0o$Ke14|o9H;Kgw85^iF};1- zMGS%%iTjK}$HBqj?b9E!r*ISoF&O7Y4zyH5fw#Q!au_I&P{j>qU-}O2oaIBp8G=Zl zxdWdM%=}d3<(~iz7RKIS_(L!a{2jpdyCEW~&_3&*0g?_7r9C`7ZSq7NDI1-}>>;Vc z*b$EM*a==Y1_dL`*7ja`TMKPmqVoa;Fr#GU&OztTqwi30f7~5mYKD-39jlDZco+QR zRvao}MFAE3>N}Ed(Lp_RwuL=d7F(&yNZivFt-e}2pXJZ?KpH{HS{;670CcT_jL8@mt@Tg1VWQoW z;aq?`N1Smgd53>I)HBZ)ZAHOA40F)#fMZRNzyGTNy+Xwp%g}wLO5?h#8JE9|4m5_NL~G~;uI;3&uYDL` zRlRbS_1A?FfEA27*xwf{aklCyKZhuW_mb#_A#lNQs$V5xDPiVD*1FqGXhF4E5erPR zxHGbQ;j+5W1b-MJ8e9azD471YZq$USa<0$IC~GR*Lmeatj{AxwntMZ>j)lP-Z-B!P z$OoEbXejP~UF*Cd06Y@1^Ze6Rz!1QA8{h}UGO6ZaF0j`s$O+6i+0cv7S-k_?L%|yK z)RF6ry}0$Ei!c$oB+^Q&G^Fcf+L>oXu23yNlr$>Mz z3MDl`m3=-6TXa5Z*+*U$Yx>RTe8`}D~Z6rtTb*$4iYr7-Ahar{qc?D0-t?J?U>H3l*~ zQT1!&)ia^pQYRL^$w*1HVg$gTG|5K!^ZF`*L!d; zYeOl%I$8H(@xWd>?-iE4P$EE2lZP05;U4NWM{e0SGqz^E5@kD|_f0ne&AcTC2h9R3 zF908^v&@CjrF_R=#e?{+yK*1g?1XCx@GdjlMWEFQPMs<+^8Pk8;X!dK@+}soP|$+T zxkef2j8;Wxd2aUL=SF!4$2uzrf~qD32b_zz>@Rvk)Yo z9FCMN4E@?VgwXSRvCQ34Xha%;tAH`du5<)sg>r@eANx<^E0xAU0RbcNPr$?EboDu% z`k-wMg2&OHy+VnE><7=Az5%mK$75}lFOlf1?t5B1 zP7lsZls>6ZVtwH>}CnX>{kyffN8I-m0FRvrEj0Przhb& zrj%RWadZ>4fs>Ze_TnzCYNAnv z+9I+a7gas)v7rfJiuh>o43J|4ABjgYp(8NIQ~@~wE8eQ>_c$jszw()O)xbhTWY zc;8Isk5<2(Hl-cnKdD=cX-#NhMgd*>u6q`8gD?DG7pl&f23M^*zg->*iYK}#3DkY1@tIG2`+i9EWPJ0h~oPEhkLbP{?YbGYi}vNeAsRCSQuaHWnwr+4=M7!M3{(BL zwGp`=>$4cvnYf+}#xj!$a3c#u41M0K-mrhDh7N>8#zYwO?{F4C5s&--QT5hwQLfP% z=zwB?grt;6H%JKxDAK9qFn|IQ(nyJvgo;Qv2r7~iGf1a&mq@pubcl3^ca8hpbMD=L z?%&ouGvD{FcdchV@f?oNQ{cKie*9m^l5OcL&D#cf*u;Cssqr#padlV|zG9Re0#ZQv(lrvYt8u!o-n;_*KgA^&Y7@=J z{dcbditu}@(*ZI0BDD3PQ~A{42HLifDs@q4@Li|GgLVS_u;Ab%Ne^f942R_R|M`Cv z6IC<1kn%Gsqz1+MV{br5yeIKA2m1GK^#+t`RqI}*&@JblX6$3hLRV8PD~{k4OTBoc zHJ$+mUVXXpE=)|9wra81GPmPwE8&qpyHo2+A;a%w9HXSezA2uKC2#g~h}^SRde?N& z$Te_^CAH0(p8r}|nMgkU76oJboixZCa~wakX@KkyJUKjr?>okOnV@i#bXf@PqZSeC zEh)_Xpseop!&{^3RNYOdAjER#q)Al$?v3V4a2#JgOf{WVo_f(_g+fA@!ym9A&hNMW z0wl9`hSj%4Hdt@=tgKU@r@rJakRJ@Hc*=h4l2yXHe5sDc!=qI)!~&@yk91qrB8!JV zK4mooJ3==nC;vF?Ms2N0hNSs6b_S$CmDy3BV!-Y@sxQtL%VBbv^NZS$KvJ}oyjjg% zQRfm10D3*~{pZi02bJcd3L7`rrJ||etWZe{E}s(wzPNuvj8Yjx-|MUPb`BSLK5~t9 zb*;iV-?{xHy9lT)_xL~L6gC6z8O*c%w7{G{RrSeVml}<=KsyWG>C>aA~_P@ zP8+eH6o*;$3pIuuj8_f-LjzV*Ko?gTu2>$cmqVcIpGoQ-5Ad(Of;m?^{$b~__fSrx zc8e{;@>vbCBlE3lVxg{!`m-@#s}EOC;>Fn2;bymc7f z$+7|;D5-W_eD_yU#8P0*q>%yLb9eNWXKr=#i}YPAHQGq_XHA8RPB+k{a6$t+thdc6 z3i;sVLC5LX1LWr??&?qGxOR0dXQJLS+4lPCO!e%n`=GIV83fQ@bCEJUO-rn9Rd$@S`j$i1rt&2H5&*{^vu%ns5kBlWjjA5=r62Gktb_tpEr7Xz~d zju$@%e9yKSs)%8YBDi{kB&P5SX5m6$1YO5+=~wqnCLVn-OgP;K$2p_~;w#Q|Rw+waENJYd@prH1{Fm0>e`m|pGf8BkUiXqv%aWx%`P~(H%`3i8PrZ zEdK-vnQYOw=9_yzx>3dxd_3v(>3A};#Ctmbc&l^!!{Uc+ zp2ey4Me*tF(`X_{8MW~sLLg#UZXj`_^+2s8>$3uVUC-ZaVu$*nPf>KYqA8Z<`eIkMK$<`6Y>8%R|KQof1){^-Aqn;e_3 zjMU4igoOl>^+IxVqTZNNm|0q8y|2`|^Hx{Ek2UHQPx%Vm z4zFdfiB+3ZaGW%-Rx*4pNDC3BhU4+ITvp*xH7*T>JL0GTU1!sx0Frn zSsGZmxj{3c!D5^L*>vdJx3H089t7eJ-oM8Mzxw^(?_t5caTot@_>64w*`eAT+oCte zR_q}wxQc>1<6B>Q*cdRqFzNY=V8u^Bm7Z}Rg~q-LQ=q{F0vfmmT5v#l`*(M9vu~PO z2On6i>Mu9P$HsCvlY*MbES~3mO=;6;aJF z0s^8c2e2C9y_Ef1OBFxK%R-Cs*2AegxF)MTg}xIhWonU{T-Jt*0VaLvcbQs#vY24H zJ4j z&XkH<*9EY;=5+LW`bKW;?qqYh)Ye8JbaLz#fA^=1O;||i^1Ax7d$JSmj+4BaAxEoYWXH+fmF4rD!-kjIc-{U`M20b9k}sRY42emEQo0! z)&CF>qXPyBFheFF2zjq5ntoU2`L9oU4~4#v{B7UTpLo!pGGBuAJqwLaI2E9)hlzp z)m4MZ+V^mt>S!7$7d`JqAB?5?(SZO8G=opVLO?pn5g+@8YPJ9BOHE4Lkcni?=lA6m zcY|wr-?q}S+D3vQP)JA@Os)j@_(>HaWTV#vELN<9xpAB_#s2hX5){)C5fOoeB}ygJ z<~x(viRNw(@w@1u{x!y_?9*pC!r2t)*A6K^*!E3kWonVfc14rrgge*2%>4 zP1sqa&- zZfR!fv65a6+7Je76>m}NZxE{>saN^nF1f|;jhCGIYk~5QRDDv9OLObt>!$bdkf1Za zgPa56Z!}A7be%tLG60>>)ye6q)wTP^5s@3Op`grcpIt)u^tHJXS zIx1VU?S{a{-d;zTbf~GRZ65HdqIzwgRru?=6`G51I~vm^N5`dqveo;g!HtyayW~8} zmo~%k2MRaQ3E>`a$wZ+#)#g(}^aHhq9G?LSwXqpF;*}2$TOD72XgSaz5XpWhJcLx_ z`}eA9bHEK)$x<*?GZYH7He*Q+2}8QwJ29N7a59^81+S2$R=DC#!c?H>7#glmR%*|` zl#=G&;YLb$89nV&K(!1888{0rZZLr$xSf*688D)>_3i9SCReYKlA7AuqE*g==RNt; zd@!E4j;B^R?o%9*}^(82YnJV+RnabaSgs?hSOY9tiLW`f}yHD4oH7=ms=8ZlUL=3EpW~)p4y)u=D(29b;u*e^}Lvh z_^*a^kwVAR`B)j(a8?^uIXu)_0SlViIW0QQec}1aV36+Ru1A#+mj}3<(Qn!?CkAjWn@@LFBhx%_|zsQQcoR2{Fbeb2W4j~4F$2R z;LUsO0NJG-qX+>M#%uopftIHJypu0scZl&4PW_GS8w0OObc&-ufBvmW$vrbF&5TQpg%j&`47%sOyG8BMZ&b&nc*npbwIjcA8 z0Yma?cfyBi+kRol-Cf;{sELj2Ttwvoo#nQZM%ycF=!P)UedtudDfsPQh}d&-cBYYV zvkP*2MGQB_xfK})Z9%R*^u@wlMSKDRQM*wMkU={utE;Pnqh##+_vn%ha0GhQh0@p0 z;i{K;-E64&mS>2|tU2%AZ_%kH zTDJ&T7Qc$o)r5U3D=4TBBf56e4?JXqO$Nf`JQ@JbIR#wP!^4BM@4+4T+ls;Lqkj55O)V2$}qLJ>lD-2bVmQRa|d8hHwU;OD>4b0hF6D2NtD6!wheF z#F!o|a5TLNuiSgbF1$7gSD&yHCBjeZ9QHRLoMC3?z>m~sB7AFpKd3wV=6b07UHtf@ z%iRYD```_L_3#>`N5lLMvVD%zgFwJ68}c3`3d-ML*mDErmOH^^N^DY()}J^^$DpBz z&B6@)+Qb{kXXo!0!g&46(J{sCX1p5LtNRum!t4W4cZ?zn?ERh$@T&yfb5eU?GHfK@ zVH5BWnUWXG%87-&#a-B3K8oK;Im8IH_3vyamcJv=FZABUuhvZ?(BISxloqHGlmTQ$ zNK_QIT`xLBzLAxh4qX$EHjD|`T2>%IS8e}nI7f5)y_&(6^5s`;&)`D_`JQi!4n%WQ zOVQNR>7z>D%;02+Gey1SVaSGR1Lx}K90GA5hpn|Wn=sRAYir-rye@C&8LuN`?Rkdwc}oG(l)fgkZ3*_y#!&p=H}+g&vdDQ%h?j|Zz`i{mz0&68TFwMn+Ip@rYup> zoV%!4=owc-(45QH+}er_?Acj{i&(17i%_}1`>mi*$=BuULjHEvldv**wtnSflJ@P) znD_5(zZN9kXb87PP23m>vl0z7x5yJ}dvgZv%?GXvS~4~@XNAyJ#eB|Dy}zXr*7ON5 zP5?h&z&nf2UmurbaZ#0oE@(d5)yWh*_xTX zQa99^NE3nXsD`JmKnd9Jy+ z;dWU>85VJU5!&C|TX0Lwu&buAoVpdosh=k~OVpOVBR%{Q3)BG;3XWzKX7DI19R7l# zYay~>0)UOIHpL(lg?MLBwR<`x$LoQ}K}dQDXoyU(H^w>peB(1z4w8Dj1WC_9s9<`x$6*9U=9 z2>!doT=aMpCqD8-N{x=B8Onmdg3L5K`{hW!7V!CXnwi>Ntww;ymAL_kZwsbTO}|m{ z2`o~%N2NHftZNxmDl}NXyCgp&&~Ww5t;FsC3@_VMxVl$nR|l8OV8x8+1?8a_h%}#G z5DqZJu%%nh@rkAIb+6q(mP)VQcpMDEp*Jk1EzbMU6{5mTHG?xbx!)I3YWgNl)_5hz zIc967U-&*EjX-$IV5gDfh9|C`G!klZLP+wON@5nhfGlU|rX@#yCTZ`o&G zy3#ZQuQGtr>24R`?}FF_P9Af-LIZp$p3CHBB4z>*%CZJL*>aX73E#65%TF&9K7EIm zi;aaPn+vnF&%LKdy1ozjJ}jjko}Tf|6V%ac7YD#H0+x6KYce_oSJ#G>inf%GQ)3e< zA)2xY?+IQDfj;l{S6<@pq$_LQ-#!#4n(^LnMLLrxe9YwM~sfxFUBYa(<8@|EO+3F2}UG%mvY>@wZ{R7YFOu1d) zB%M&LWwSCfzv8ooJ|;~>H6}zzmXbYku7-~|M3$-Ml9cBT$Ff=wGWNW5xumZ7QJlM_XCDUsw5+tlH^rIJ6&g^*7Ojw&R9SIj+Y8GX$bj5Sp(P zxwm0qEp^j#ihZyM4pIB@FS!(EPbF-|S+EODzpc_BvcY_DF*4xUQXCjVoT1uD7^~ME;XXUr)FxLKz+1lFbugQbdT@V^2zIzv`SO~oVfD;r!Iu-cY z+sC^2Wx3#ZrLd9@KBfSRK3jJ~A}L=)>A-ODC-SF0hXlgjRC%~8`x943@G}z-(3chq zpq|b)G-jDK{EFcDab1v=`;31od-?JVzW`Vi+=~ifJ1d9XCRoXuQ+0^RFM;IaaGNXO zc}@c_vT%!WWRff_a>D3(vyG9_6bye9i(ga++x(fLl=iR_fSD{`Y-%dwnL%$CG2H@F zRZq`JtjWH5yJL;mF;?-SFkw{SSJOj>@Dn6}u8f1TK%fr{HMa(=o<7a*V&Xf|4qLOP zdGw?==)*32ZPh;Y|FpTW zJPi#E>Pf<>(YhMstgtQr3(ciWYNz-Oj3yMzMR)|lFL`-+SBKDwi+Y8bV3R?qtAAc# z)UA!O`oq0-jNF}^8CV>SdS~UCaYn~xe5boMPtR94ewvPw>YCEkY~i}~aq|n@QMQ_E zAd`apqDe_0i1CLu>7D|NI)4=y^&Ya!X@ zA|)MkWOR(=%l6hU^!*Gmf9^e=!;g@4)_3cyMOkd^ju@NaCI0by z+bawB(dh0Popi{IVJxSviNo8Htv+#~`?ivTtY-B4Q=rMwGU8{CoBSqlve5jh43Deu5JH5e9S+ms3vELiRfltDe$` zI`C*9{>sFt(bC{0H<;A0I7i1|W*EH}QwlzogQlzMfRcL=WJg;apERj|lAvdt82C!f ziM{j!$kC&>e@|8l4L?ajzFjjp8GZl$y|#oqV9<1K1uQyVb;jK=N2^P1H9V&F5L>p>U~olpoYkI!F9xA-o}9LD3-5*vLm8}PX~ zMT}KXmI>ToQjK{~?z3MYy>r`o$x$sj&XR6`d$ihqrYdCrz^GG@xEw_&bKLb6h1E~~ zVUITt{_48pl=9Q*6bKIjrD+Q5#$qICFGZ{*x^Sjuzx9^M2EPaeo*F4Vy?Rxl?Fe7X zFKpZ*{5(fMpn@$N=xz_nt${~@Wh^ZlCGwyOq$8q;a1b2o*dLd3b8pSi*Y_{X)rCg; z&L&Tu+yXOrh);ODEh=HihjRoZl|r>l)t!8>|0nQP?Ekf`^X1k0w^m{4IeW{s#s-l8lt6jniAUA+cH`$+VPJ_22 zbblXiKE`!Pi=*Y~14JeCq6ndg9ONb}!)DW3K>Y<9nFhXZN7DQEArdAwHY($dlqW#E zcfZfTEABCpVa=soG`z~-#p$m%`B{(%em3d%?Yb?#H_H=V6eh*S3PbMFq^yg}c745c z3vShc*v$r+t6lO(R{)qym=tJoXOfwb;s}ka&(ThOK0V*U=?EJBxAKCv)gK@^7I1e! zR~wC!B?B$t7sN(z5RcV(mH&~ti1?|E0~p~QoKX%?;~hY0AB8n1yan(NLGTGNEyRlg zi{~n{f{7}@d-X|1)`F{8PYO``L^C`gBa6XGdxi7p67BwW?B6QN;Yx09ZgzKf*N~_m z8q(!2Q$5Ti4c5&R_yEAfAjp=(;yt;>8y<2?7DtXg@T!}xu9lSS?e4yV@r6$~4pq8x z06inSkq82#t09gjAIt_4U(=yMUr=1^0_UheOww~Fd;FRSXeF#*B$85BPwzA7xJ~yh zG9)yZCPJZj!>y$e)dZpF17!f^g@<|F*+OxU?*Cnm{|{fIEKQ`*oT4g1>J$c#K@A7- zUXH8z^6sZeuq1XSttX8=&}M_ z<1)L%&JBP0pUIPTzIRzz%)wpVUG10RN4oHcmT5GMdvKh=%&^s1@Q9G`5~4l}7bfS} z%K$`_x@f^_WC*U-Wtm|RQ~Vh(4N2#+R&zS|MEtpqHhN2_n|#|6D1%D^>K2D-T0y$H z0w3W03MvQlX0{{d$z2nPYqVo(5@Ns?Ya)t2JS~zj7-dyHsJ<`BAi&W>p#FG#zqQ?oE-6c=$f(je6HbS#J2WN7FbjGcH1v}b z=q$(}d5mjtpTUT8ADomlTzKcWaG}NI z|3=Hnp<-SCF;~Y~>6R30dE~PXJgo!_s6(NhYfsa?HFKJCbFcN_;(;YpX2}J+i%&-j z{Ojm3&Fke7(-{r#-oCvA3321xuv{PNvaGvU7JK-8SIi=bD|r zx!*@h@?ZxOwN8dWAmp*N2@l7R7X0DbTJcK}aPnK{b2#K+MOecsON{C)+qk0F)M?%e zs4TsZZoC9n9BK&nvx13yJgB&CCeXu-W6SPU(-;Gu#Ssv9UN%(lxCu-$5(3zT1O%LV zQ)U7@4qpE3O4B6N(-gDy?7Sj=m^vREO@Y?Fd-rbAO@JG~_Bh!nYL#zF$mRYM6(slf ziY9@19#VI>G{D+1Nyzg4!w+`L&M@eET{Tbm3@5=c0DOfr9(;!N1!$o&y`FBGi4)@8 zOfZ^l8`7(AZzPU+_eB~|`Zt#@ArOw(RRb3}9v&VL#?n>&z>qv1;^Pw%vU00;s7WK@ zKh-(QMc>qI87n}}J1w?iO#D#u2-;7z1AQ@BMUsKQ8p(X11b-GJSB=k7h^o_d76##uQM=A15CKkvY2>NpMx~wa`?^vTMs6! zO!in@aVQ+84`WOC!xOD-Vet_2#N0gcz|5PnSmo+k@LDu64Qt3}Gkk3Zn> zh_fYR{8Ab;YM75UrXdJ|7?1DCaL%L3t`HJp7gJ9$CUplk>lM4UP=J?Yv)R0*;Eg>8=!M4PpwQ6Y zV6|CF47&~jMGp*SG{&H|=vt$9dr!|9XuXzlCAqoLFx_yAka1tRfz;hRsjT>$V%`?7 zJoi|m&Q43TZhCZdG{5#J_|76AE_F_`Z;b9|$Td)%H>O<37{-E%9|v#0>Di9Lz>*RM zNX+Yw$%aw5Y=EbJRtH+7C2iF!N18z3JT8WKV< zteS)*ebZAQ_fo{B{OTGdQzfScveDeT5^8VPwzK_L%BP$1xUjablDb0Vn_;b|O6X9y z;#U<(5EnYPbyL^9FzMa9rTKaJPolh(_qpe}@UxCSd2dhg;Hpri~Vv?+AyBf})lxX3-2W-*X_wyr7<6cvk zs3?NGbWL#brm`$GEO3zp(|A@t0wxjwB9vy}eemG>=qRe@160m9GVEciJXrkXJ6>w5 z$a`62(@S2E;paXQ-ze#%(b4?Lle2Z-zv)IvP!5k_Jn2eEV7qt&sTuWK+ zn+K422}J%5r?)(9`5)tb>M)~?ko5vv>i+MEv4sD#7?OHs|8FlOOfUEk6MKSJ=_HrT z({Ti5ihvUL|Lo93BOk%QGu56I1QS!Z8FQjG24F(7m&~u39-Zr0A#f;E;U}>5Y9T{o z{ML+L?8g1+7a*`WPA5bq2^OE3{-Q~w6oTB{@pu?O0aogg8Rh`oM+Ez3_A|oWyFT>@ zT$PW~=v7tt81i^nlG#Lw_ogl=zdXDZ*m5(zdGICHk)%`pgtpWV1)Rhcm}Y8?YccOyd+knI5!>ATl%f9G+780{9I|OYoO9V9Q*Y(_&0QlE?^H%^TCvP$-7YMBZO^tg zNz`>CP8&l>PJRM(a~O%4Mf5upK$MHdeZ`t7>KY7scU)QdBuCJ&fnvij| zu!GkG`iF0IFAfHjqN_u6b96ipHhw|#)Xyjca~43{qMjV`bj5*v?TEB~j!E`tbiLoEHXO`gnXzjg)VBlc2l> z8T#P*M=__yzP_lbuQ2m~n}H*J+S2|i-}|&hSxEMTX3xqHX6e~*-iQ7kd%vk|IRPqs zN11@DI$UWb;*!I7=AL#H72GRWSy>6)@GTJ$R(suiBYJdgW24NS-MgLLHp{gB7F=-{ zRIMl8)Da7TzId~Zq)J9`NGbYZ$Pf@J0I?caZ2tC*mx)QH?Y5c5!>7Xc1)6t4LWPmT z9K4izuyNYJfk6TxD96+XW18(SMmdxi<}g?m1MY{M$FWwDyl)gJW<}B)H}5tIr&^jTF)nfO?{?I}KV$c2CCyLRwzStnJ^%{}6+$|ayPrTD}tWxMxfixX)KHREyP`IUIAk_<+W zRSx=?zG5e<>)VVC-_;P~v72YQ0Ub2JNU20%KYR;t!)(AJAKv_C67Z$D@90>7!Z@4C z(FDmk;A>l+s9DXpS=rjEjyJ{+12FOILAHjC<6B+jUd6%{K#%@3uYhCwlkRs7-Yh;q z%?Ve;UH-Wr!Vm-;i+Faf=XSqT@M`bCW$sBWh$^}-i_=}r%%XMw3fEpyYiAxzJUT@- zbFXS<>@bNgg8$2uOGA%qDmUk*8PjVcM zQNI9bSOBRm-VI~BtV_a9X0dRSq2N&|m|))yL&CiV0X)tEVXdsleQ$E~?C96dC=^AI z902NoK;NnqX>DzVCakA(hV*0A!RZR=Y?f9Oj4mK{fgMjTWAWpr3u|xGa8({>b~ZEc z3kRqmAEg;ymY=zL@9LXj{r}tA$m@v&$YS243hk)rWB(tzu3c@@@?d~dHOMK4XWQ#G zJpRNxZo_2@0%hP650nAY`V1UCq&~vYKu|$hMrh!cy~dhUU~=BYlZ@cDJY?BR;5Fi< zZ-=l3#Y=s!{vOMfzKy(QOerxKb$F#B{b_z` zJN&<)iYBy%prn6piKP&JWkoDLgvbwH;O= zEOj`v5f3@jy0YhW%)EXWBS13n=9h{1Z5T&&dtoE{f7Z{>U@ zO+$~4al?fhofl_34bVv5eoBUsfd}$%^BPo`tCE?E>Jii#pPUr*3xUWhw>oR;l;tNQ z8990L&Tujm12`WgX!SUAbp-~8ZvZiZG0eU7Bn32O`J<5X115h?ecm6}F9f2AB)^=a zGZjJDGi8+_^32w_x=bmim%wl$(ML2l!oTg6(oQ}*O#}WOZ75MlO^G$p_y}nbNpK zRT2%$Ir3;Rm8Vh9F}G^!>|<+~V#PCPhZxbo?pp`2gD2p5*zOA{lCy=T}{V z1kc`24nveZ%*X&R#+32!@&eVtP(z~#9Rhdzzl+fC2?vcZOoNp80lA%BOwC1-@)Mm8 z0}iE`j09&T3F&Xga`$L+YT-1mz!`1}rIyXltEoA~ny5$xq&2UPsK+-b@%}fYbuWu4 zeMiZB09zSA|8~key}a02tv?A}P#xa0@-wad#uFPx&ej31fG;RNl0~L{;{S-*AdTJnDp_Zl<%20&E8mNrww?@2WK@gFmlz4hEx20 zE|wJKr$ufo7Y?bxtMV)egtRrbS3%fg!Bwyn$+j2(8Xj2QzOrRp)z>dz{oH<)Sh3$6 zI1d#=&Y_&_TK1EGN)hs=zL>*$3_!Sxh&nyW!)EndK~oBi|W{?kv8 zF*HI-41hvE9`;rocL8t~_yI2s#G$j+wX?%?_A}`VzTZb)DK%poxck=lf*0}wJLnlf z^5xSQr}NNscN8wfmZ{y27Oq-TFu_%X$#(e>t+;cBfpsc8wSRM;4Zr4)rb5s3I)~Ls<1kQean}a&Tk@c^ij^hmy9*WR&**ANE!5 zGd<{6o(hM%UjIa7tEW$b#_$gTHSP#{iJ?px?<5$*Jx0dUd@TEnvzIP6Oe^hN&Vk+1 z^9@Ptm&7tP5x4#ArvXih6Tkd(b+t?6awM>&=P8SVe;-^}XaIQ}*wz5y5Y{{4!NL6? z)Ppk+XLRarll=S9CnN^^yz-&)?5sR~f6cIUGSF&mAG`ru@DGb&=Ls+6(SPW3@B1%i zV%*V@F|0mzk*f+Nw5rH>GY{Ywfc&ys`^5Y*foC3(XhA1mJf=16mNs*VVS6Vda#>~) z{WeeOZXQZE)DG0U0*^9gMaY-KYb~ZYB?hlf-|;3RARyReg}mt7)?MJFJUx9^G+{bK z7QUPomK%ofydfcR9LV5f!j})-4O!b3mvtylTM#AbC5mr^*To#+J-d*>d+yvT5WMs8 z@~S^&Z;IGrMH)lS{IeAu8lo&99Kz3uPEx*Qf9lg>x(Nsg20J3$X4A%Ty-1u0Q7lmV zG#N9@(ryrS1V1m7ajX3Lb-L0e(DGY^V6nlGf=QwZD|dXpk$<`HqjrPZW*bOsk(NdX zk<jC0K=<rkq|APe4=9s z>uaoX^T`v1aUemAKe&6UljP6c6@qGMJ%SCK4fLOUvHy+U#l^*y5&h%q`%vG2J)8Pn z8m!`>gG~7(gyT93-O~RIQk5bH#JdD>;tf@<-1v|4UN_@Yu8zud9K+QIm&B)9&7_-; z8(|OYG3@=@NF~o<|D90-o4Pho0lVs+(wPq7JY#&+5*%KN-f79z;lhR*UuUMxObrdP z!VwzHr*=+)n(2oM-b~x%TwODVZ>ECy_syu0D)pf8b;>+X&gA5Gvh$HO8WUx|D668< z2|EsJLkK?r4=0X~B6##3_MX=fgeCsi+o#LsX zKC_6(P+MEz)Mt1uIfOXh!bm9W_oMPSe2YR+&l&J4~GO)X&A<=vndI zF%_XMT#Q%M$JoSI8_=V|FQll${QR_8OgQ4h=QP7JcA1aLY8Oy{+kpYaWzLjBOLEh37HA?q?cWU z+||vSeSgBDHCWEvY+t87qjX`k1(vSafRPhJJ0mhrQ=(rg`ewXxP7qKCoPh4vdlct? zDTrd4YDZz#RD(`yAwEKv8+)&67-8>KY2{7W@_@pamYVu1a}L1zF!jv2C-B#RT40{l z_BqRZLKCiD2zS;6YKM}H5#@OO!lam(CWE`xuwpJ0?v8Vf&gq^x1sg^_`ch z10&kPr+ogGzD!(937u)2o7!f!776-4412(g>5J^rYtsVbD!Toc>UNmCdYQ3}4u}5C z%#7#WZ{<8zJMqWILFv^j*J{e6^wbC3^Wx>?zc@g5%k}Y6iG>En^svzK`*m7cTIZuT zZ{A>y8wNjH#dVRtoWoMnA})5e*YQA(a)&Hq}~hV-hjt&{`($I1p%%A@PSpKjW{8-;Q0wHF5-5X z8N98tZ0P-U7yh(fL^^zjP$NjBkbjV+rKV4YhSes3(^68a0P3o|@Kj)o#%NUZ+*_GY zQCFu2M!G#3yF7jT*yLh@G5HAXEDm~>P+gYV$4Xqa$TRI~))pT$qk*-W&|?onzux^f ztiKiQv|vw`h?P7%b`{@t!XBa;)0^LMUakY zq7d8icZfBON5idNOMN}+gRb)MbTZvKIF{MNb`nX&zjb}$lKTIz59K3DLvtXF7Z&ox zXeWS(8(3McqiaZN8fPAshGtwD&ie`r?mT8%DOu}(_@J?GiU0XyUA5JKI>&>Hk1v3t z=M|P)nxfMXPgeHH${ZVD9r)&rGs{Wyiq0HMeonRd?RaA7$*@_>Y_*H=Z8Qz6$e6pq zx)=BOKwuW{T2fGes_`rx-wD-{ubbWz^v_%12zdArnwk6R>O);Y2#fQ`o7Z^?VUkWg z9$z=#31uzZXd_S`b7LOu=m@%_3HB>$NV zZ`=Zk0DDdwy%(^-E_cZJ@JE^{k$A(4`%SH2%;DwjhwVua3}@ZXa<=u39d3Rul{TPw zNcx^V{PsBa#AoQxq_w#j%n{Y=Sua`xTwm_Mu9;8Xtdzj*)d0(UEa@@iY&E zQ8EOQ+OL?4@0|bB7IkwXW#4xL1JX9G5(iccH!R8?h3FZ)zuvL}w2F87>0od}TdJR~ z!zhQh+Q*M6&_%7ZrORpE_;2G=k_QkJU*U&B75p96mOInzGJ-=?OL^Cvr_ zTe4m}?Itm}rBoF7)TOVl51d9*?Ew{ne2k_3zYjQ&z${t)^(!^Ub+Bh$6ov(uLv&Uq z#>d~he!axE>tFN$x;EH9FPkm={_PF(>JK!up#;32|1@qrt8hGOXEg(ctg<20@`)NR z(Z6jx|0^77K1@w{WE_tIjohuV)vGDq)l2diAWDKijGvJxkN%KlnAW%J(Gj#; zpBsFX?H;SDs`kfMRvyAM3wU9v0|*;aFxW2J??DGF_~QAE!|i!Y?eqacG$;*jiqiFb z5dU34n`)T2jk04Fehn=Nz~u`eTuQ??L-0-zs-@ov#-G8@i=6bC28XAl>?<@PHj!o6 z=9kNcYqXn8HIpMm65^n108nHDLDGs&-X#}FM_8zUTn5dK|8Q$ytpH) z>H24!Ec;M^p^6wMwVYzEV|Lb zGMAzK1<``sx`5#$ETtpS^Da^tpG%~BX_a$t(Sk(K#@r;J&|I|K4B3L%UJsA0Xm-iGC zRghP$c#+Wc0pA76gDR1zurSa!R$yuq&VBuoKLqCRYMxu|BA3>vQi)aV*Qe{I(-nz5 zgIq&-uOJW_@mSPDTK^ZADR$3s0}=`Yr>=fd`%Tq1SBhip@15wd$F~7_JH=kax*r>n zNRzk4rCtbEnf?qp)`>vS5)toC# z_wBlfB6H!Jl1 z_b^@IB+D`NzP$wyqiqf%)KUWwl2R7$RC} zbR8I1+fo{W6*sBSpl1O=hk%d}^E^-hNAe8yG&E9LI0-Zx@Jr%gWWRJ|jLT(Y@AV(f z=Gkz(ySl%Tx@A!g)t}-Dw))3vf^*JALK?ZX;{Ra9H_%1tP%>1YGN`-KE~0lmSveFG z#vpN_T#&`|*+Jwlrp1W0yg!3U_b6Bv&7qH`^g-Ic zs;Sqaj2o}7{|V{UP!wmg{Sz&9IY@oKipV%H+V)u*vq)rdGZY4w9>KzY?e}jb<;g^7 zxm=zrP%yDfy=t_JU--*uHMDM%4)qM0t-HkhJTH3;sTV{ZcaQAEiS5{Q;M0( zd3p>F-eQM~7u(-NOCS%!;8C@^rtah0#ax%oSOyF4MPKa4V0gxHSn_p@6YK059cM_; zAQK_ZN$iEJHh@LZYn9#W&nr$Qi;6Li98himqJ4u^R$dt|A_cBW@9uX3J69nxbHwb; zcj#rAw_*+J6DRuJ9qj!R)ryd4WSE&?3?~v`SK9p6(w#7qprK^6Ls7UEHxlR&(3q=z zF9&qqJ;cp25U-MKrAJc2a&VP}>poHJKeSrr^Q#W1Hl^YJ>d*cE>W?A|DX3LGE@#{Z z_5#l(-M9oc=1mfh`307cTg@>5q+{cp2d{&PkO|~omMKau1s4 zu=kW+^B+@KZ=c3{#(E}ug2y$CDH^W(B?!`hEYGjTIn(P3B1aGVh!)&RE+B}2UAsG< zVBD`b^5e%T;K80biQQ5~ENFeCi@)(RCjHHunpJ8#Y{<1F{Hmj&wdW)Cg2sJ>sJ-Q# zz_73|u*`=BkeE&^GARjAfPw!0)(D0NWJD8VW1Gg(T}*WH+!u~pvXo!_-_UW}1N~(A z4nR>Y|A3qMbEId1ZyHL<$`*+JGS>uWzxs2rW1Lob%*VIW1GZ1VG5gnrpaxGtzJYm2 z58KGbuP~1*oIH~{pZxTEWkzb&OW|=27cSAC{NEXOoBSzEDv5Q104w}wT~w3 zNBYAQnvnB(PcKW3;D7jvKPMn8?CRpe3_k7plFPx0GXUsrX0v=1CRFcc0c4=4%YZR~ z!U|17LF|S(f%r!2{DS!KpkL)@*P$n1!t%EKw&Y-s1fzX6>mpcj?XKv?Wy%+g%B<(j zQx)~dE6rzM=m7bG_qxXP3lSy~SgvduChkpF#am@QyJj#5{^;b91g^`&x_`sF29(xi zx8&97lI`ObHg|C6sVBOi@)kfkuuz79b;}R>YkO$wkCF=8f*qL0zeQsdB51FI^37aM zCjHk{Pw+c`MRaanIQNBf+@Ir*trygc3*6!M#=7YNI#mVn8j|(!GCu^i|1hdm_8hUS zq$IGYhQTy!M&OHbzaAT`yr>RonH8USUcXx+NnkM`2-NcZ&COJM5d3oR@TeKz8G_<9 zPyVlX2^H*O-IYOOpow<)PdJ+NT&qxeAqQVT4H`~D|W@U*cK)>MP52=w)NwX)DL-SOJ914eiWFQhz8 zS{A(WkG>%;eh94DOk&#Wxd2o2jx;H-phaxjVlfwj2=Qcj+TR`BZ0507Od41^+&suYKtht{o9TsP z-B4sHxI@EjYu!f&FE}1n?}wO=2D1?G2GE%8hq($Ix1f~;_+i$Nl;i$yX z{CfUAEM4p_0&#KO+@80gt&LqoME5iY*Y8d}?mC3>7M7KAG@#%3}bv^e@OVmN-x!S zB0VW`&PadW1Bt?mz5(#2JX@hEUwu=Z_^~1P88I^d3TpKimhV5@wA%j|Fi-r;*u@nW zt~q5?^EhiLkO*xl1qg%KJ9*71#u$~ew~D}PolW!Y>R^rwv;y-1r$=jSw6bJ;_q5b2@aChPtF?XC{PduRkRwj==(bK%-Tz#E;sQ%D2GJ zoR4hiQk2r**XK|BCtw|y&Glx2K5(J%bnLX0U$3}&O6>$`kA0k0F|}qUu6x( zZiT_!L7i6y&i$V&B+;@(*1DBrT|o>__yJy3p23HE+0HUSBXGLfLl*Fc#h#86AJI+; zF2h`)5?Ve7Jcp2p9{1`q?m!@wCj;i)Ji33&nncCD}oREH;a~FDlL5I`@vyN3CH9Yc8tSJnF3$hi- zDLUixYDHrVskn@I>80jgEwwB>3);KI$(aL4XhmwR$We{$W->i)u#ngi>?__?T27Q$ zH^q5TB03SlA-5o4QBVEj5WCttX(Gsv$(%7_(w{fwPi+MaHf0S+v{@ggZQRJjsaGcb ze~P>Ea47fp{g#xJwWzEmN{l5*Vba)&QY1M-QXyN5$acyyiIB2QD29%uvDC38ve#57 zCr44C(h;F!DWPccyWin=UEjaH|9gvfbG=rg9-q$D*zaHMj z=Xp8R)zt^~KI3;DaAJE$UyC1nocs3HB)>uL&!99XhW98AYIH`49WPz!X-;|}L`z8$ zqo&ZSIrl}9yd)U>-1$`~hZdW(D}!%J)<-lUXLWGpPaAV`+0u3iPb01`@LPZAj3hWV zbWYh$9-Gg{y#DkZc^7kbtG2N67(nBi!0}y`NU#Yjl0t;wu(7!rjnd+Bb2n^Ug&uZA zsQoi;`k9(#PMnE9(7z%6alT@jwf$0Ow@zc;+V}K4(MAc?+PRbhr*}evhL#p{vj;kv zv~NSge!)tK17{SdNX!&Iqdta|DsO^Tu&?p-UUT!`?2=8|yai(B9A# zm)|*95^kjNF!{y}wL|w4*ZvqqKx@(ndB)f&<1n8yI_0rnlIpXk%u?Jh*x&m@*!nJb zD=2HpOEYaEWOaQnA8STQiKv^$osJ?fe04)tt-EVcfP-%XPqsqs^sugSXxq%HQ%*Ve z;uN+D95wfk;^?WWj<*$ViTV$DeN% zF&0>~W?%K2P5rX0`kIqBUf8eSeoEJHzoE3Y7qQGEs%HPHX zuTOk5t@3qxo7X=J29hZh^$V$~sj@-eZz3^#nG%4~9y0z{U)+)7ua%Q~08gV`?TB`F z8XIq1;`n2*yF0{h9Kd>(?uA|!teKyHpE(X4YJCeNn>ETs z7B%Q?xuA<$=dp{~9b(Eh64w=})KpI)0RaWOLb>eW8ri;m5vwhaH(eaIN)_B}cr-XM;hJ~#q3^ZyMa9nf`i~yH zuMG~Ko;Xp#Qfm4cB-TR?NA})3C{V1H=VW6tmPX71Bq|k4<`d2l;ER%O##NQ|q#GgB zv`UJKq_66m2kQkB#4pAA3-Om2N~dVFEsH4+m;3S#PG>zi*nXnL&hFUp7}fVJs>*_#e49maiHAzxCdM)89g zU*U4S$w1RxsM7w0z9u(bIXMr!)%7d7a$s;WzhQ>+ekP8I-jm4_P4)F3z~&Lo;bnP3 z!M_xhd%-aLD89p8DL?B=!ZBwKd0p*J z7Z?HEJF~}?@g|LDm5!L{E%;D#-%!-lp z&QQ)grLRDaC8|&!JySPh%SWl%!s)KGgGdX&Sod}&HK4Ur|3#>^129^#iokKD5=n7! zah&1d>MAtnK5Q%C8a+?xIf}6PoS=QF$%Ibh>pa(@d-((RlR6tF;2V~loDAOk(o?=Z zK2^apLGn|tmc=;oP7CaaI9MNqAqjNpc2}>$ z5tEM=6#aRUeQ%tBL%_7e{lul>qCoc!*1nvVb^k~WA#Oh0rK=5^x@VFN| z^XuG|Jj?8+=E{3cBJsmo!Zs@}r|B>~QE^r^{hk;f-^$K)%Pdk!)@b9eD4^M0WYLNq z(CPDas3=LFM})JDxfWxoBZWRhh?J(ZvOxbIsT6tbFm_MWBlkt2pBL22r+BL=*>+F; zJ>r+)Xd$cre$vIH*g(AOq7Yl|URhZ?#|K#!)XNeYR5b^y$@WicpR@$X>3dvZjSLJl zb}_;=a&8hl>F)D|Hd#JisXcYGH>E!&uR|TdIa^wN)23ySi9fzzffG~Qz&%9Dr;!!U zRyUBZj$$u~ZP=r_SM*n^h<#l|s+fIZ#rN>F`=*6DNBE9@nK*y=-=uXOEsI3iq$DU% zSD9c5w3a=+R-()26%`k^PJkgo5H;lXM#N?Ubz@8DL44?u^sV6BKdX+* zPb8f9_siLyG1)M`>bjk%0GGCH>0pH)~61c=ckf+A^eZfgS4SP8Hi;1 z*AI%eIaV)*Vy>qk&Kp^&GjfT#y!>MMNN8%* zQp$spf%`)d9$K&b=FJROV`k<<*%Pq?tulRg!?&E?`CcPaQ9DERcZ+1cNDhbNbrJ2C z&ME!G;%XTEw>3NZ zfJ0a@?G%gQ()kt8vSuhJD|!&~Zf7mP1t=g8Z`f{Ir(LQQRRA zc9MMi2EhG`HOtizo8)qdKq1XQ;36N8c-Mw4Dsd(-u8z2Y#?U4kwg?ctbfCU*9|C~z z569=HpV)WqMCr)zkt&k$?Xw#hcfb`N%1OyB*KT_awdE(t{Do|hu$a3a;GEF4{k%}# z9|xV;QCdV;SmK!%goP>)0dT2xWY*$L?ol0x{+aTw_S>#eiaiz2vw-j_{Wj{XGW#nh8=BJWvk+j3*bb}hi?~q9$9Q8 z6}0&C0f_?|G069`jN~???EqDPW;O~o^R>OvgoRAKVKF#g{#m82e;ZK5Jp%o=MhVhx zbY#wRX;>U>!`wO4RgtjtIRYoQ4mk`kLz>KGiNrBDO^I~+0L95}=|cGt3^gxr9ChJa z>xjB$WZjLU_Qg(-?F^@zo=gQekAh(ldBdZlG*|rVN?fN!kh_wa8lOG|t>JlL0Kgv~ z{P?0LK7&`Hs;XM9VrcjfaY3T19kP8zMaAzpW*X;@#7`LEVWGdF+U90`YzaiaAa|}Z zy3iT0t4qp`1!+hy6jh7w$}x7qB+1z91LUm?3uQ#+CMG7UJ*vRbhmZ7bmKc=^vk9~C zPvEoeVu|5eG;ST8D1TjYT&QS&T3Q+&t)1u|ibGYhCd3ayqv{KYUtw@xEF!%~pooii zJ&Gxu6^W>=Hh88+{yHu)OT8y(0!zdxtK0K{M&h*mW>aFNl&yTs?yft7!N`8nG%rJg zY!jC45TuRZ;B0nP*rHOC?EQL7J( zBC>4l>^gA={n@qz%gWJI+v^`AjVqp>o_8Fo^OD@X&z#wDManb}RT}hd;M_`bCzo~% z37ilaOdNBvvagg#wEfM0_1)Nx zL+k()_4}#^dwTHuXFeKz_Vg*~c!Eh}x(x;00M67|({JLqa5w2(hD{$^Koz{d=PyKQ z1C2Q_QDZuep`Hf853q%&RIn_5qK2N`;!UuYlIaBze(B@F!Vzdi4-A zsH+z)zYjYJf;D@XyTCv$7$`j@vkdzQ2p;?b0@e5`5Q0!J1!N5MiFxYQBH#>aYHFaR z^sPa(2Uo}Xbzg7kNfImz`E~1BjVye8OOYf(?ZLNraRqvppm&1|b6{Wqu`k>WY!ODm zbq<>AIx3u>`szY?gs)5D{t|dd#v|=mmZclCnphie5XgqEL#Qes3(}9=a{le(rUdPx zGx8As0u)BwG^r{Siuw;loeVhyDnvu$peJx zJRh2I8Ll%7IYjamqA|Pw&c4fd#vS$S8$!{WyW`EhYm(w_FSGCd+s9gXEOWn+;`R(N z)Rd36EhK->xmODh){}TY?c6zPi57R8nY*6M>k98%sz=AssQ6h2cWupmA}}PX4Q=KO z-oepr85!)&y(}y(xUBDANXd*t$p~cbwTu5hu1ibdhGzf&nLh3cn|qh2{h#0CJp1F$ h{_lVLv6eq=IKf*))ddH)bwrQ@GBw_7bjQGv{(ow Date: Mon, 5 Sep 2022 12:39:44 -0400 Subject: [PATCH 7/7] Put ripple class in its .cpp file --- chromance-firmware/chromance-firmware.ino | 78 ++-- chromance-firmware/mapping.h | 20 +- chromance-firmware/ripple.cpp | 425 +++++++++++++++++++++ chromance-firmware/ripple.h | 445 +--------------------- 4 files changed, 490 insertions(+), 478 deletions(-) create mode 100644 chromance-firmware/ripple.cpp diff --git a/chromance-firmware/chromance-firmware.ino b/chromance-firmware/chromance-firmware.ino index 36a4eb5..9d154a1 100644 --- a/chromance-firmware/chromance-firmware.ino +++ b/chromance-firmware/chromance-firmware.ino @@ -231,9 +231,6 @@ void setup() { WiFi.hostname(hostname); - //dbg.println(WiFi.hostname()); - - while (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("Connection Failed! Rebooting..."); delay(5000); @@ -255,7 +252,9 @@ void setup() { setupHTTPServer(); + // Boot color setFixedColor(14230237); + } void loop() { @@ -263,34 +262,32 @@ void loop() { static int currentLed = 0; static unsigned long lastStep = 0; - + ArduinoOTA.handle(); server.handleClient(); - // if ( currentMode == 0 ){ - // chromanceProcess(); - // }else{ - // processUDP(); - // } - - // // - // for (uint8_t segment = 0; segment < NUMBER_OF_SEGMENTS; segment++) { - // for (uint8_t fromBottom = 0; fromBottom < LEDS_PER_SEGMENTS; fromBottom++) { + if ( currentMode == 0 ){ + chromanceProcess(); + }else{ + processUDP(); + } - // uint16_t led = round(fmap(fromBottom,0, (LEDS_PER_SEGMENTS-1),ledAssignments[segment][2], ledAssignments[segment][1])); - // strip.setPixelColor(led, ledColors[segment][fromBottom][0], ledColors[segment][fromBottom][1],ledColors[segment][fromBottom][2]); - // } - // } - // // Update LEDS ! - // strip.show(); + // + for (uint8_t segment = 0; segment < NUMBER_OF_SEGMENTS; segment++) { + for (uint8_t fromBottom = 0; fromBottom < LEDS_PER_SEGMENTS; fromBottom++) { + uint16_t led = round(fmap(fromBottom,0, (LEDS_PER_SEGMENTS-1),ledAssignments[segment][2], ledAssignments[segment][1])); + strip.setPixelColor(led, ledColors[segment][fromBottom][0], ledColors[segment][fromBottom][1],ledColors[segment][fromBottom][2]); + } + } + // Update LEDS ! + strip.show(); } void setFixedColor(uint32_t color){ - g_color = color; uint8_t r = (g_color & 0xff0000 ) >> 16; uint8_t g = (g_color & 0x00ff00 ) >> 8; @@ -356,6 +353,7 @@ void chromanceProcess(){ static unsigned long lastRandomPulse; // Fade all dots to create trails + // Doing so by fading all the framebuffer manually for (int seg = 0; seg < NUMBER_OF_SEGMENTS; seg++) { for (int led = 0; led < LEDS_PER_SEGMENTS; led++) { for (int i = 0; i < 3; i++) { @@ -369,40 +367,36 @@ void chromanceProcess(){ ripples[i].advance(ledColors); } + // Fire up a new ripple every 2-6 secondes if (millis() - lastRandomPulse >= random(2000,6000)) { - // renderTriburst(); currentAutoPulseType = random(5); dbg.write("Alive"); switch (currentAutoPulseType) { - case 0: { - renderContour(1); - break; + case 0: { + renderContour(1); + break; } - - case 1: { - renderUnstoppableSnake(random(0,NUMBER_OF_NODES)); - break; + case 1: { + renderUnstoppableSnake(random(0,NUMBER_OF_NODES)); + break; } - - case 2: { - renderCube(random(numberOfCubeNodes)); - break; + case 2: { + renderCube(random(numberOfCubeNodes)); + break; } - - case 3: { - renderStarburst(); - break; + case 3: { + renderStarburst(); + break; } - case 4: { - renderTriburst(); - break; + case 4: { + renderTriburst(); + break; } - default: - break; + default: + break; } - lastRandomPulse = millis(); } } diff --git a/chromance-firmware/mapping.h b/chromance-firmware/mapping.h index 592a601..cbc5268 100644 --- a/chromance-firmware/mapping.h +++ b/chromance-firmware/mapping.h @@ -24,7 +24,7 @@ // -1 means nothing connected on that side // First node is the upper left one, they are numbered from left to right 1 row at the time // The value is the connected segment number -int nodeConnections[NUMBER_OF_NODES][SIDES_PER_NODES] = { +const int nodeConnections[NUMBER_OF_NODES][SIDES_PER_NODES] = { {-1, -1, 2, -1, 3, -1}, {-1, -1, 20, -1, 19, -1}, {-1, -1, 22, -1, 21, -1}, @@ -133,7 +133,7 @@ int nodeConnections[NUMBER_OF_NODES][SIDES_PER_NODES] = { */ // First member: Node closer to ceiling // Second: Node closer to floor -int segmentConnections[NUMBER_OF_SEGMENTS][SIDES_PER_SEGMENT] = { +const int segmentConnections[NUMBER_OF_SEGMENTS][SIDES_PER_SEGMENT] = { {11, 15}, {4, 11}, {0, 4}, @@ -177,7 +177,7 @@ int segmentConnections[NUMBER_OF_SEGMENTS][SIDES_PER_SEGMENT] = { // First member: Strip number // Second: LED index closer to ceiling // Third: LED index closer to floor -int ledAssignments[NUMBER_OF_SEGMENTS][3] = { +const int ledAssignments[NUMBER_OF_SEGMENTS][3] = { {0, headof(0), tailof(0)}, {0, headof(1), tailof(1)}, {0, headof(2), tailof(2)}, @@ -220,18 +220,18 @@ int ledAssignments[NUMBER_OF_SEGMENTS][3] = { // Border nodes are on the very edge of the network. // Ripples fired here don't look very impressive. -int numberOfBorderNodes = 13; -int borderNodes[] = {0, 1, 2, 3, 6, 10, 13, 14, 16, 19, 21 , 22 , 23}; +const int numberOfBorderNodes = 13; +const int borderNodes[] = {0, 1, 2, 3, 6, 10, 13, 14, 16, 19, 21 , 22 , 23}; // Cube nodes link three equiangular segments // Firing ripples that always turn in one direction will draw a cube -int numberOfCubeNodes = 7; -int cubeNodes[] = {7, 8, 9, 11, 12, 17, 18}; +const int numberOfCubeNodes = 7; +const int cubeNodes[] = {7, 8, 9, 11, 12, 17, 18}; -int numberOfTriNodes = 13; -int triNodes[] = {4,5, 7, 8, 9, 11, 12, 14,15,16, 17, 18, 20}; +const int numberOfTriNodes = 13; +const int triNodes[] = {4,5, 7, 8, 9, 11, 12, 14,15,16, 17, 18, 20}; // Firing ripples that always turn in one direction will draw a starburst -int starburstNode = 15; +const int starburstNode = 15; #endif diff --git a/chromance-firmware/ripple.cpp b/chromance-firmware/ripple.cpp new file mode 100644 index 0000000..e795635 --- /dev/null +++ b/chromance-firmware/ripple.cpp @@ -0,0 +1,425 @@ +#include "ripple.h" + + +float fmap(float x, float in_min, float in_max, float out_min, float out_max) { + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; +} + +Ripple::Ripple(int id) : rippleId(id) { + Serial.print("Instanced ripple #"); + Serial.println(rippleId); +} + +void Ripple::start(byte n, byte d, unsigned long c, float s, unsigned long l, rippleBehavior b) { + color = c; + speed = s; + lifespan = l; + behavior = b; + + birthday = millis(); + pressure = 0; + state = STATE_WITHIN_NODE; + + position[0] = n; + position[1] = d; + + justStarted = true; + + Serial.print("Ripple "); + Serial.print(rippleId); + Serial.print(" starting at node "); + Serial.print(position[0]); + Serial.print(" direction "); + Serial.println(position[1]); +} + +void Ripple::renderLed(byte ledColors[NUMBER_OF_SEGMENTS][LEDS_PER_SEGMENTS][3], unsigned long age) { + int strip = ledAssignments[position[0]][0]; + int led = ledAssignments[position[0]][2] + position[1]; + int red = ledColors[position[0]][position[1]][0]; + int green = ledColors[position[0]][position[1]][1]; + int blue = ledColors[position[0]][position[1]][2]; + + ledColors[position[0]][position[1]][0] = byte(min(255, max(0, int(fmap(float(age), 0.0, float(lifespan), (color >> 8) & 0xFF, 0.0)) + red))); + ledColors[position[0]][position[1]][1] = byte(min(255, max(0, int(fmap(float(age), 0.0, float(lifespan), (color >> 16) & 0xFF, 0.0)) + green))); + ledColors[position[0]][position[1]][2] = byte(min(255, max(0, int(fmap(float(age), 0.0, float(lifespan), color & 0xFF, 0.0)) + blue))); +} + +void Ripple::advance(byte ledColors[NUMBER_OF_SEGMENTS][LEDS_PER_SEGMENTS][3]) { + + unsigned long age = millis() - birthday; + + if (state == STATE_DEAD) { + return; + } + + pressure += fmap(float(age), 0.0, float(lifespan), speed, 0.0); // Ripple slows down as it ages + // TODO: Motion of ripple is severely affected by loop speed. Make it time invariant + + if (pressure < 1 && (state == STATE_TRAVEL_UP || state == STATE_TRAVEL_DOWN)) { + // Ripple is visible but hasn't moved - render it to avoid flickering + renderLed(ledColors, age); + } + + while (pressure >= 1) { +#ifdef DEBUG_ADVANCEMENT + Serial.print("---- Ripple "); + Serial.print(rippleId); + Serial.println(" advancing:"); +#endif + + switch (state) { + case STATE_WITHIN_NODE: { + if (justStarted) { + justStarted = false; + } + else { +#ifdef DEBUG_ADVANCEMENT + Serial.print(" Picking direction out of node "); + Serial.print(position[0]); + Serial.print(" with agr. "); + Serial.println(behavior); +#endif + + int newDirection = -1; + + int sharpLeft = (position[1] + 1) % SIDES_PER_NODES; + int wideLeft = (position[1] + 2) % SIDES_PER_NODES; + int forward = (position[1] + 3) % SIDES_PER_NODES; + int wideRight = (position[1] + 4) % SIDES_PER_NODES; + int sharpRight = (position[1] + 5) % SIDES_PER_NODES; + + if (behavior <= BEHAVIOR_ANGRY) { // Semi-random aggressive turn mode + // The more aggressive a ripple, the tighter turns it wants to make. + // If there aren't any segments it can turn to, we need to adjust its behavior. + byte anger = behavior; + int forwardConnection = nodeConnections[position[0]][forward]; + + while (newDirection < 0) { + if (anger == BEHAVIOR_COUCH_POTATO) { + + // We can't go straight ahead - we need to take a rest +#ifdef DEBUG_ADVANCEMENT + Serial.println(" Never continue ... too lazy - stopping"); +#endif + // Die now + age = lifespan; + break; + } + + if (anger == BEHAVIOR_LAZY) { + + if (forwardConnection < 0) { + // We can't go straight ahead - we need to take a rest + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Can't go straight - stopping"); + #endif + // Die now + age = lifespan; + break; + //break; + } + else { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Going forward"); + #endif + newDirection = forward; + } + } + + if (anger == BEHAVIOR_WEAK) { + + if (forwardConnection < 0) { + // We can't go straight ahead - we need to take a more aggressive angle + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Can't go straight - picking more agr. path"); + #endif + anger += 1; + } + else { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Going forward"); + #endif + newDirection = forward; + } + } + + if (anger == BEHAVIOR_FEISTY) { + int leftConnection = nodeConnections[position[0]][wideLeft]; + int rightConnection = nodeConnections[position[0]][wideRight]; + + if (leftConnection >= 0 && rightConnection >= 0) { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Turning left or right at random"); + #endif + newDirection = random(2) ? wideLeft : wideRight; + } + else if (leftConnection >= 0) { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Can only turn left"); + #endif + newDirection = wideLeft; + } + else if (rightConnection >= 0) { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Can only turn right"); + #endif + newDirection = wideRight; + } + else { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Can't make wide turn - picking more agr. path"); + #endif + anger+=1; // Can't take shallow turn - must become more aggressive + } + } + + if (anger == BEHAVIOR_ANGRY) { + int leftConnection = nodeConnections[position[0]][sharpLeft]; + int rightConnection = nodeConnections[position[0]][sharpRight]; + + if (leftConnection >= 0 && rightConnection >= 0) { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Turning left or right at random"); + #endif + newDirection = random(2) ? sharpLeft : sharpRight; + } + else if (leftConnection >= 0) { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Can only turn left"); + #endif + newDirection = sharpLeft; + } + else if (rightConnection >= 0) { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Can only turn right"); + #endif + newDirection = sharpRight; + } + else { + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Can't make tight turn - picking less agr. path"); + #endif + anger--; // Can't take tight turn - must become less aggressive + } + } + + // Note that this can't handle some circumstances, + // like a node with segments in nothing but the 0 and 3 positions. + // Good thing we don't have any of those! + + } // End while loop + } + else if (behavior == BEHAVIOR_ALWAYS_RIGHT) { + for (int i = 1; i < SIDES_PER_NODES; i++) { + int possibleDirection = (position[1] + i) % SIDES_PER_NODES; + + if (nodeConnections[position[0]][possibleDirection] >= 0) { + newDirection = possibleDirection; + break; + } + } + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Turning as rightward as possible"); + #endif + } + else if (behavior == BEHAVIOR_ALWAYS_LEFT) { + for (int i = 5; i >= 1; i--) { + int possibleDirection = (position[1] + i) % SIDES_PER_NODES; + + if (nodeConnections[position[0]][possibleDirection] >= 0) { + newDirection = possibleDirection; + break; + } + } + #ifdef DEBUG_ADVANCEMENT + Serial.println(" Turning as leftward as possible"); + #endif + } + else if (behavior == BEHAVIOR_EXPLODING) { + for (int i = 5; i >= 1; i--) { + int possibleDirection = (position[1] + i) % SIDES_PER_NODES; + + if (nodeConnections[position[0]][possibleDirection] >= 0 && (possibleDirection != position[0])) { + newDirection = possibleDirection; + // start + } + } + +#ifdef DEBUG_ADVANCEMENT + Serial.println(" Exploding !"); +#endif + } + +#ifdef DEBUG_ADVANCEMENT + Serial.print(" Leaving node "); + Serial.print(position[0]); + Serial.print(" in direction "); + Serial.println(newDirection); +#endif + if (newDirection >= 0){ + position[1] = newDirection; + } + }// End else from 'if (justStarted) {' + + position[0] = nodeConnections[position[0]][position[1]]; // Look up which segment we're on + if ( position[0] > 37 ) + { + Serial.print("Uhoh, position[0] out of bound at line 296 :"); + Serial.println(position[0]); + } +#ifdef DEBUG_ADVANCEMENT + Serial.print(" and entering segment "); + Serial.println(position[0]); +#endif + + if (position[1] == 5 || position[1] == 0 || position[1] == 1) { // Top half of the node +#ifdef DEBUG_ADVANCEMENT + Serial.println(" (starting at bottom)"); +#endif + state = STATE_TRAVEL_UP; + position[1] = 0; // Starting at bottom of segment + } + else { +#ifdef DEBUG_ADVANCEMENT + Serial.println(" (starting at top)"); +#endif + state = STATE_TRAVEL_DOWN; + position[1] = LEDS_PER_SEGMENTS - 1; // Starting at top of LED-strip + } + break; + } + + case STATE_TRAVEL_UP: { + position[1]++; + + if (position[1] >= LEDS_PER_SEGMENTS) { + // We've reached the top! +#ifdef DEBUG_ADVANCEMENT + Serial.print(" Reached top of seg. "); + Serial.println(position[0]); +#endif + // Enter the new node. + int segment = position[0]; + position[0] = segmentConnections[position[0]][0]; + if ( position[0] > NUMBER_OF_SEGMENTS ) + { + Serial.print("Segment out of bound :"); + Serial.print(position[0]); + Serial.println(""); + } + for (int i = 0; i < SIDES_PER_NODES; i++) { + // Figure out from which direction the ripple is entering the node. + // Allows us to exit in an appropriately aggressive direction. + int incomingConnection = nodeConnections[position[0]][i]; + if (incomingConnection == segment) + position[1] = i; + } +#ifdef DEBUG_ADVANCEMENT + Serial.print(" Entering node "); + Serial.print(position[0]); + Serial.print(" from direction "); + Serial.println(position[1]); +#endif + state = STATE_WITHIN_NODE; + } + else { +#ifdef DEBUG_ADVANCEMENT + Serial.print(" Moved up to seg. "); + Serial.print(position[0]); + Serial.print(" LED "); + Serial.println(position[1]); +#endif + } + break; + } + + case STATE_TRAVEL_DOWN: { + position[1]--; + if (position[1] < 0) { + // We've reached the bottom! +#ifdef DEBUG_ADVANCEMENT + Serial.print(" Reached bottom of seg. "); + Serial.println(position[0]); +#endif + // Enter the new node. + int segment = position[0]; + position[0] = segmentConnections[position[0]][1]; + { + Serial.print("Segment out of bound :"); + Serial.print(position[0]); + Serial.println(""); + } + for (int i = 0; i < 6; i++) { + // Figure out from which direction the ripple is entering the node. + // Allows us to exit in an appropriately aggressive direction. + int incomingConnection = nodeConnections[position[0]][i]; + if (incomingConnection == segment) + position[1] = i; + } +#ifdef DEBUG_ADVANCEMENT + Serial.print(" Entering node "); + Serial.print(position[0]); + Serial.print(" from direction "); + Serial.println(position[1]); +#endif + state = STATE_WITHIN_NODE; + } + else { +#ifdef DEBUG_ADVANCEMENT + Serial.print(" Moved down to seg. "); + Serial.print(position[0]); + Serial.print(" LED "); + Serial.println(position[1]); +#endif + } + break; + } + + default: + break; + } + + pressure -= 1; + + if (state == STATE_TRAVEL_UP || state == STATE_TRAVEL_DOWN) { + // Ripple is visible - render it + renderLed(ledColors, age); + } + } + +#ifdef DEBUG_AGE + Serial.print(" Age is now "); + Serial.print(age); + Serial.print('/'); + Serial.println(lifespan); +#endif + + if (lifespan && age >= lifespan) { + // We STATE_DEAD +#ifdef DEBUG_AGE + Serial.println(" Lifespan is up! Ripple is STATE_DEAD."); +#endif + state = STATE_DEAD; + position[0] = position[1] = pressure = age = 0; + } + +#ifdef DEBUG_RENDERING + Serial.print("Rendering ripple position ("); + Serial.print(position[0]); + Serial.print(','); + Serial.print(position[1]); + Serial.print(") at Strip "); + Serial.print(strip); + Serial.print(", LED "); + Serial.print(led); + Serial.print(", color 0x"); + for (int i = 0; i < 3; i++) { + if (ledColors[position[0]][position[1]][i] <= 0x0F){ + Serial.print('0'); + } + Serial.print(ledColors[position[0]][position[1]][i], HEX); + } + Serial.println(); +#endif +} \ No newline at end of file diff --git a/chromance-firmware/ripple.h b/chromance-firmware/ripple.h index e0a0b84..3e3c845 100644 --- a/chromance-firmware/ripple.h +++ b/chromance-firmware/ripple.h @@ -11,6 +11,13 @@ // #define DEBUG_RENDERING // Print debug messages about translating logical to actual position // #include +#include +#include +#include +#include +#include +#include +#include #include "mapping.h" enum rippleState { @@ -31,457 +38,43 @@ enum rippleBehavior { BEHAVIOR_EXPLODING // Coming soon }; -float fmap(float x, float in_min, float in_max, float out_min, float out_max) { - return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; -} +float fmap(float x, float in_min, float in_max, float out_min, float out_max); class Ripple { + public: - Ripple(int id) : rippleId(id) { - Serial.print("Instanced ripple #"); - Serial.println(rippleId); - } + Ripple(int id); + void start(byte n, byte d, unsigned long c, float s, unsigned long l, rippleBehavior b); + void advance(byte ledColors[NUMBER_OF_SEGMENTS][LEDS_PER_SEGMENTS][3]); + rippleState state = STATE_DEAD; unsigned long color; - /* If within a node: 0 is node, 1 is direction If traveling, 0 is segment, 1 is LED position from bottom */ int position[2]; - // Place the Ripple in a node - void start(byte n, byte d, unsigned long c, float s, unsigned long l, rippleBehavior b) { - color = c; - speed = s; - lifespan = l; - behavior = b; - - birthday = millis(); - pressure = 0; - state = STATE_WITHIN_NODE; - - position[0] = n; - position[1] = d; - - justStarted = true; - - Serial.print("Ripple "); - Serial.print(rippleId); - Serial.print(" starting at node "); - Serial.print(position[0]); - Serial.print(" direction "); - Serial.println(position[1]); - } - - void advance(byte ledColors[NUMBER_OF_SEGMENTS][LEDS_PER_SEGMENTS][3]) { - unsigned long age = millis() - birthday; - - if (state == STATE_DEAD) - return; - - pressure += fmap(float(age), 0.0, float(lifespan), speed, 0.0); // Ripple slows down as it ages - // TODO: Motion of ripple is severely affected by loop speed. Make it time invariant - - if (pressure < 1 && (state == STATE_TRAVEL_UP || state == STATE_TRAVEL_DOWN)) { - // Ripple is visible but hasn't moved - render it to avoid flickering - renderLed(ledColors, age); - } - - while (pressure >= 1) { -#ifdef DEBUG_ADVANCEMENT - Serial.print("---- Ripple "); - Serial.print(rippleId); - Serial.println(" advancing:"); -#endif - - switch (state) { - case STATE_WITHIN_NODE: { - if (justStarted) { - justStarted = false; - } - else { - #ifdef DEBUG_ADVANCEMENT - Serial.print(" Picking direction out of node "); - Serial.print(position[0]); - Serial.print(" with agr. "); - Serial.println(behavior); - #endif - - int newDirection = -1; - - int sharpLeft = (position[1] + 1) % SIDES_PER_NODES; - int wideLeft = (position[1] + 2) % SIDES_PER_NODES; - int forward = (position[1] + 3) % SIDES_PER_NODES; - int wideRight = (position[1] + 4) % SIDES_PER_NODES; - int sharpRight = (position[1] + 5) % SIDES_PER_NODES; - - if (behavior <= BEHAVIOR_ANGRY) { // Semi-random aggressive turn mode - // The more aggressive a ripple, the tighter turns it wants to make. - // If there aren't any segments it can turn to, we need to adjust its behavior. - byte anger = behavior; - - while (newDirection < 0) { - if (anger == BEHAVIOR_COUCH_POTATO) { - int forwardConnection = nodeConnections[position[0]][forward]; - - // We can't go straight ahead - we need to take a rest - #ifdef DEBUG_ADVANCEMENT - Serial.println(" Never continue ... too lazy - stopping"); - #endif - // Die now - age = lifespan; - break; - //break; - } - - if (anger == BEHAVIOR_LAZY) { - int forwardConnection = nodeConnections[position[0]][forward]; - - if (forwardConnection < 0) { - // We can't go straight ahead - we need to take a rest - #ifdef DEBUG_ADVANCEMENT - Serial.println(" Can't go straight - stopping"); - #endif - // Die now - age = lifespan; - break; - //break; - } - else { - #ifdef DEBUG_ADVANCEMENT - Serial.println(" Going forward"); - #endif - newDirection = forward; - } - } - - if (anger == BEHAVIOR_WEAK) { - int forwardConnection = nodeConnections[position[0]][forward]; - - if (forwardConnection < 0) { - // We can't go straight ahead - we need to take a more aggressive angle - #ifdef DEBUG_ADVANCEMENT - Serial.println(" Can't go straight - picking more agr. path"); - #endif - anger += 1; - } - else { - #ifdef DEBUG_ADVANCEMENT - Serial.println(" Going forward"); - #endif - newDirection = forward; - } - } - - if (anger == BEHAVIOR_FEISTY) { - int leftConnection = nodeConnections[position[0]][wideLeft]; - int rightConnection = nodeConnections[position[0]][wideRight]; - - if (leftConnection >= 0 && rightConnection >= 0) { - #ifdef DEBUG_ADVANCEMENT - Serial.println(" Turning left or right at random"); - #endif - newDirection = random(2) ? wideLeft : wideRight; - } - else if (leftConnection >= 0) { - #ifdef DEBUG_ADVANCEMENT - Serial.println(" Can only turn left"); - #endif - newDirection = wideLeft; - } - else if (rightConnection >= 0) { - #ifdef DEBUG_ADVANCEMENT - Serial.println(" Can only turn right"); - #endif - newDirection = wideRight; - } - else { - #ifdef DEBUG_ADVANCEMENT - Serial.println(" Can't make wide turn - picking more agr. path"); - #endif - anger+=1; // Can't take shallow turn - must become more aggressive - } - } +private: - if (anger == BEHAVIOR_ANGRY) { - int leftConnection = nodeConnections[position[0]][sharpLeft]; - int rightConnection = nodeConnections[position[0]][sharpRight]; + void renderLed(byte ledColors[NUMBER_OF_SEGMENTS][LEDS_PER_SEGMENTS][3], unsigned long age); - if (leftConnection >= 0 && rightConnection >= 0) { - #ifdef DEBUG_ADVANCEMENT - Serial.println(" Turning left or right at random"); - #endif - newDirection = random(2) ? sharpLeft : sharpRight; - } - else if (leftConnection >= 0) { - #ifdef DEBUG_ADVANCEMENT - Serial.println(" Can only turn left"); - #endif - newDirection = sharpLeft; - } - else if (rightConnection >= 0) { - #ifdef DEBUG_ADVANCEMENT - Serial.println(" Can only turn right"); - #endif - newDirection = sharpRight; - } - else { - #ifdef DEBUG_ADVANCEMENT - Serial.println(" Can't make tight turn - picking less agr. path"); - #endif - anger--; // Can't take tight turn - must become less aggressive - } - } - // Note that this can't handle some circumstances, - // like a node with segments in nothing but the 0 and 3 positions. - // Good thing we don't have any of those! - } // End while loop - } - else if (behavior == BEHAVIOR_ALWAYS_RIGHT) { - for (int i = 1; i < SIDES_PER_NODES; i++) { - int possibleDirection = (position[1] + i) % SIDES_PER_NODES; - - if (nodeConnections[position[0]][possibleDirection] >= 0) { - newDirection = possibleDirection; - break; - } - } - #ifdef DEBUG_ADVANCEMENT - Serial.println(" Turning as rightward as possible"); - #endif - } - else if (behavior == BEHAVIOR_ALWAYS_LEFT) { - for (int i = 5; i >= 1; i--) { - int possibleDirection = (position[1] + i) % SIDES_PER_NODES; - - if (nodeConnections[position[0]][possibleDirection] >= 0) { - newDirection = possibleDirection; - break; - } - } - #ifdef DEBUG_ADVANCEMENT - Serial.println(" Turning as leftward as possible"); - #endif - } - else if (behavior == BEHAVIOR_EXPLODING) { - for (int i = 5; i >= 1; i--) { - int possibleDirection = (position[1] + i) % SIDES_PER_NODES; - - if (nodeConnections[position[0]][possibleDirection] >= 0 && (possibleDirection != position[0])) { - newDirection = possibleDirection; - // start - } - } - - #ifdef DEBUG_ADVANCEMENT - Serial.println(" Exploding !"); - #endif - } - - #ifdef DEBUG_ADVANCEMENT - Serial.print(" Leaving node "); - Serial.print(position[0]); - Serial.print(" in direction "); - Serial.println(newDirection); - #endif - if (newDirection >= 0){ - position[1] = newDirection; - } - }// End else from 'if (justStarted) {' - - position[0] = nodeConnections[position[0]][position[1]]; // Look up which segment we're on - if ( position[0] > 37 ) - { - Serial.print("Uhoh, position[0] out of bound at line 296 :"); - Serial.println(position[0]); - } - #ifdef DEBUG_ADVANCEMENT - Serial.print(" and entering segment "); - Serial.println(position[0]); - #endif - - if (position[1] == 5 || position[1] == 0 || position[1] == 1) { // Top half of the node - #ifdef DEBUG_ADVANCEMENT - Serial.println(" (starting at bottom)"); - #endif - state = STATE_TRAVEL_UP; - position[1] = 0; // Starting at bottom of segment - } - else { - #ifdef DEBUG_ADVANCEMENT - Serial.println(" (starting at top)"); - #endif - state = STATE_TRAVEL_DOWN; - position[1] = LEDS_PER_SEGMENTS - 1; // Starting at top of LED-strip - } - break; - } - - case STATE_TRAVEL_UP: { - position[1]++; - - if (position[1] >= LEDS_PER_SEGMENTS) { - // We've reached the top! - #ifdef DEBUG_ADVANCEMENT - Serial.print(" Reached top of seg. "); - Serial.println(position[0]); - #endif - // Enter the new node. - int segment = position[0]; - position[0] = segmentConnections[position[0]][0]; - if ( position[0] > NUMBER_OF_SEGMENTS ) - { - Serial.print("Segment out of bound :"); - Serial.print(position[0]); - Serial.println(""); - } - for (int i = 0; i < SIDES_PER_NODES; i++) { - // Figure out from which direction the ripple is entering the node. - // Allows us to exit in an appropriately aggressive direction. - int incomingConnection = nodeConnections[position[0]][i]; - if (incomingConnection == segment) - position[1] = i; - } - #ifdef DEBUG_ADVANCEMENT - Serial.print(" Entering node "); - Serial.print(position[0]); - Serial.print(" from direction "); - Serial.println(position[1]); - #endif - state = STATE_WITHIN_NODE; - } - else { - #ifdef DEBUG_ADVANCEMENT - Serial.print(" Moved up to seg. "); - Serial.print(position[0]); - Serial.print(" LED "); - Serial.println(position[1]); - #endif - } - break; - } - - case STATE_TRAVEL_DOWN: { - position[1]--; - if (position[1] < 0) { - // We've reached the bottom! - #ifdef DEBUG_ADVANCEMENT - Serial.print(" Reached bottom of seg. "); - Serial.println(position[0]); - #endif - // Enter the new node. - int segment = position[0]; - position[0] = segmentConnections[position[0]][1]; - { - Serial.print("Segment out of bound :"); - Serial.print(position[0]); - Serial.println(""); - } - for (int i = 0; i < 6; i++) { - // Figure out from which direction the ripple is entering the node. - // Allows us to exit in an appropriately aggressive direction. - int incomingConnection = nodeConnections[position[0]][i]; - if (incomingConnection == segment) - position[1] = i; - } - #ifdef DEBUG_ADVANCEMENT - Serial.print(" Entering node "); - Serial.print(position[0]); - Serial.print(" from direction "); - Serial.println(position[1]); - #endif - state = STATE_WITHIN_NODE; - } - else { - #ifdef DEBUG_ADVANCEMENT - Serial.print(" Moved down to seg. "); - Serial.print(position[0]); - Serial.print(" LED "); - Serial.println(position[1]); - #endif - } - break; - } - - default: - break; - } - - pressure -= 1; - - if (state == STATE_TRAVEL_UP || state == STATE_TRAVEL_DOWN) { - // Ripple is visible - render it - renderLed(ledColors, age); - } - } - -#ifdef DEBUG_AGE - Serial.print(" Age is now "); - Serial.print(age); - Serial.print('/'); - Serial.println(lifespan); -#endif - - if (lifespan && age >= lifespan) { - // We STATE_DEAD -#ifdef DEBUG_AGE - Serial.println(" Lifespan is up! Ripple is STATE_DEAD."); -#endif - state = STATE_DEAD; - position[0] = position[1] = pressure = age = 0; - } - } - - private: float speed; // Each loop, ripples move this many LED's. unsigned long lifespan; // The ripple stops after this many milliseconds - /* - 0: Always goes straight ahead if possible - 1: Can take 60-degree turns - 2: Can take 120-degree turns - */ + 0: Always goes straight ahead if possible + 1: Can take 60-degree turns + 2: Can take 120-degree turns + */ rippleBehavior behavior; bool justStarted = false; float pressure; // When Pressure reaches 1, ripple will move unsigned long birthday; // Used to track age of ripple static byte rippleCount; // Used to give them unique ID's byte rippleId; // Used to identify this ripple in debug output - - void renderLed(byte ledColors[NUMBER_OF_SEGMENTS][LEDS_PER_SEGMENTS][3], unsigned long age) { - int strip = ledAssignments[position[0]][0]; - int led = ledAssignments[position[0]][2] + position[1]; - int red = ledColors[position[0]][position[1]][0]; - int green = ledColors[position[0]][position[1]][1]; - int blue = ledColors[position[0]][position[1]][2]; - - ledColors[position[0]][position[1]][0] = byte(min(255, max(0, int(fmap(float(age), 0.0, float(lifespan), (color >> 8) & 0xFF, 0.0)) + red))); - ledColors[position[0]][position[1]][1] = byte(min(255, max(0, int(fmap(float(age), 0.0, float(lifespan), (color >> 16) & 0xFF, 0.0)) + green))); - ledColors[position[0]][position[1]][2] = byte(min(255, max(0, int(fmap(float(age), 0.0, float(lifespan), color & 0xFF, 0.0)) + blue))); - -#ifdef DEBUG_RENDERING - Serial.print("Rendering ripple position ("); - Serial.print(position[0]); - Serial.print(','); - Serial.print(position[1]); - Serial.print(") at Strip "); - Serial.print(strip); - Serial.print(", LED "); - Serial.print(led); - Serial.print(", color 0x"); - for (int i = 0; i < 3; i++) { - if (ledColors[position[0]][position[1]][i] <= 0x0F){ - Serial.print('0'); - } - Serial.print(ledColors[position[0]][position[1]][i], HEX); - } - Serial.println(); -#endif - } }; #endif