From cab8cdd6557f2966d28c904cb48d6680c1cfa68d Mon Sep 17 00:00:00 2001 From: Lexzach Date: Mon, 25 Apr 2022 23:24:56 -0400 Subject: [PATCH] auto backlight --- facp/src/eeprom.txt | 3 +- facp/src/main.cpp | 212 +++++++++++++++++++++++++-------------- facp/src/stuart-hall.jpg | Bin 0 -> 23396 bytes 3 files changed, 141 insertions(+), 74 deletions(-) create mode 100644 facp/src/stuart-hall.jpg diff --git a/facp/src/eeprom.txt b/facp/src/eeprom.txt index 3582619..c5ab5ea 100644 --- a/facp/src/eeprom.txt +++ b/facp/src/eeprom.txt @@ -12,4 +12,5 @@ Address allocation: 76 | 0-1 - smoke detector pre-alarm 77 | 1-5 - smoke detector timeout 78 | 0-1 - panel homescreen -79 | 0-1 - audible silence \ No newline at end of file +79 | 0-1 - audible silence +80 | 0-40 - lcd timeout \ No newline at end of file diff --git a/facp/src/main.cpp b/facp/src/main.cpp index 4c3b367..157d639 100644 --- a/facp/src/main.cpp +++ b/facp/src/main.cpp @@ -34,12 +34,14 @@ int troubleLedTimer = 0; //number to keep track of ms for trouble light int alarmLedTimer = 0; //alarm led timer int troubleType = 0; //trouble type 0 - general, 1 - eol resistor int lcdUpdateTimer = 0; //update delay +int lcdTimeoutTimer = 0; //timer to keep track of how long until lcd off int walkTestSmokeDetectorTimer = 0; int currentScreen = -1; //update display if previous screen is not the same int configPage = 0; //config page for the config menu int cursorPosition = 0; //which menu item the cursor is over int zerosCounted = 0; //verification variable int walkTestCount = 0; //keep track of walk test activations +int zoneAlarm = 0; //which zone is in alarm 0 - none | 1 - zone 1 | 2 - zone 2 | 3 - zone 1 & 2 String configTop; //configuration menu strings for lcd String configBottom; String currentConfigTop; //configuration menu strings for current lcd display @@ -58,29 +60,42 @@ int codeWheel = 0; //which alarm pattern to use, code-3 default int verificationTime = 2500; int resistorLenience = 0; int panelHomescreen = 0; +int lcdTimeout = 0; String panelName = ""; LiquidCrystal_I2C lcd(0x27,16,2); +//PINS +int zone1Pin = 15; +int zone2Pin = 15; //TESTING is set to 15 but is normally 39 +int hornPin = 13; +int buzzerPin = 4; +int strobePin = 18; +int smokeDetectorPin = 14; +int readyLedPin = 27; + void setup() { Serial.begin(115200); //begin serial Serial.println("Lexzach's Low-Cost FACP v1"); Serial.println("Booting..."); - pinMode(13, OUTPUT); //horn - pinMode(18, OUTPUT); //strobe - pinMode(14, OUTPUT); //smoke relay - pinMode(27, OUTPUT); //ready LED D + pinMode(hornPin, OUTPUT); //horn + pinMode(strobePin, OUTPUT); //strobe + pinMode(smokeDetectorPin, OUTPUT); //smoke relay + pinMode(readyLedPin, OUTPUT); //ready LED D pinMode(26, OUTPUT); //silence LED D pinMode(25, OUTPUT); //alarm LED D pinMode(33, INPUT); //key switch D pinMode(32, INPUT); //reset switch D pinMode(35, INPUT); //silence switch D pinMode(34, INPUT); //drill switch D - pinMode(15, INPUT); //pull station D - pinMode(4, OUTPUT); //buzzer D - digitalWrite(13, HIGH); //horn - digitalWrite(18, HIGH); //strobe - digitalWrite(14, HIGH); //smoke relay + + pinMode(zone1Pin, INPUT); //zone 1 + pinMode(zone2Pin, INPUT); //zone 2 + + pinMode(buzzerPin, OUTPUT); //buzzer D + digitalWrite(hornPin, HIGH); //horn + digitalWrite(strobePin, HIGH); //strobe + digitalWrite(smokeDetectorPin, HIGH); //smoke relay pinMode(22, OUTPUT); //scl pinMode(21, OUTPUT); //sda @@ -128,7 +143,7 @@ void setup() { EEPROM.write(77,5); //smoke detector timeout is five minutes by default EEPROM.write(78,0); //homescreen is panel name by default EEPROM.write(79,1); //audible silence is enabled by default - + EEPROM.write(80,0); //lcd timeout is disabled by default EEPROM.commit(); @@ -181,6 +196,7 @@ void setup() { verificationTime = EEPROM.read(10)*100; resistorLenience = EEPROM.read(72)*4; panelHomescreen = EEPROM.read(78); + lcdTimeout = EEPROM.read(80)*15000; int x=0; for (int i=11; i<=71; i++){ //read panel name if (EEPROM.read(i) != 0){ @@ -190,20 +206,20 @@ void setup() { } } Serial.println("Config loaded"); - digitalWrite(27, HIGH); //power on ready LED on startup + digitalWrite(readyLedPin, HIGH); //power on ready LED on startup digitalWrite(26, LOW); digitalWrite(25, LOW); - digitalWrite(14, LOW); //turn on smoke relay + digitalWrite(smokeDetectorPin, LOW); //turn on smoke relay } void tone() { ledcSetup(0, 5000, 8); // setup beeper - ledcAttachPin(4, 0); // attach beeper + ledcAttachPin(buzzerPin, 0); // attach beeper ledcWriteTone(0, 1500); // play tone } void noTone() { ledcSetup(0, 5000, 8); // setup beeper - ledcAttachPin(4, 0); // attach beeper + ledcAttachPin(buzzerPin, 0); // attach beeper ledcWriteTone(0, 0); // stop tone } @@ -229,16 +245,16 @@ void checkKey(){ void checkDevices(){ if (walkTest == 0){ - if (analogRead(15) <= resistorLenience and horn != true and silenced==false){ + if ((analogRead(zone1Pin) <= resistorLenience or analogRead(zone2Pin) <= resistorLenience) and horn != true and silenced==false){ possibleAlarm = true; } if (possibleAlarm == true and horn != true and strobe != true and silenced==false and isVerification == true){ //verification code - if (analogRead(15) == 0){ + if (analogRead(zone1Pin) == 0 or analogRead(zone2Pin) == 0){ zerosCounted++; } if (verification >= verificationTime){ - if (zerosCounted > 0.1*verificationTime and analogRead(15) == 0){ + if (zerosCounted > 0.1*verificationTime and analogRead(zone1Pin) == 0 and analogRead(zone2Pin) == 0){ definiteAlarm = true; possibleAlarm = false; zerosCounted = 0; @@ -253,13 +269,13 @@ void checkDevices(){ } } } else if (walkTest == true){ - if (analogRead(15) == 0){ + if (analogRead(zone1Pin) == 0){// or analogRead(zone2Pin) == 0){ walkTestCount++; walkTestSmokeDetectorTimer = 0; - while (analogRead(15) <= resistorLenience) { - digitalWrite(18, LOW); + while (analogRead(zone1Pin) <= resistorLenience) {// or analogRead(zone2Pin) <= resistorLenience) { + digitalWrite(strobePin, LOW); if (silentWalkTest == false){ - digitalWrite(13, LOW); + digitalWrite(hornPin, LOW); } digitalWrite(25, HIGH); walkTestSmokeDetectorTimer++; @@ -268,24 +284,24 @@ void checkDevices(){ } delay(1); } - digitalWrite(18, HIGH); + digitalWrite(strobePin, HIGH); if (silentWalkTest == false){ - digitalWrite(13, HIGH); + digitalWrite(hornPin, HIGH); } digitalWrite(25, LOW); currentScreen = -1; delay(250); - digitalWrite(14, LOW); + digitalWrite(smokeDetectorPin, LOW); } } - if (definiteAlarm == true or (isVerification == false and analogRead(15) <= resistorLenience and horn != true and silenced==false)){ //activate the horns and strobes after verification + if (definiteAlarm == true or (isVerification == false and analogRead(zone1Pin) <= resistorLenience and horn != true and silenced==false)){ //activate the horns and strobes after verification activateNAC(); definiteAlarm = false; - } else if (analogRead(15) == 4095 and eolResistor == true and troubleTimer == 2000) { + } else if (analogRead(zone1Pin) == 4095 and eolResistor == true and troubleTimer == 2000) { trouble = true; troubleType=1; - } else if (analogRead(15) == 4095 and eolResistor == true and troubleTimer <= 2000){ + } else if (analogRead(zone1Pin) == 4095 and eolResistor == true and troubleTimer <= 2000){ troubleTimer++; } else { troubleTimer = 0; @@ -295,12 +311,12 @@ void checkDevices(){ void troubleCheck(){ if (trouble == true){ if (troubleLedTimer == 0){ - digitalWrite(27, LOW); + digitalWrite(readyLedPin, LOW); if (troubleAck == false and fullAlarm == false){ noTone(); } } else if (troubleLedTimer == 750){ - digitalWrite(27, HIGH); + digitalWrite(readyLedPin, HIGH); if (troubleAck == false and fullAlarm == false){ //sound the buzzer if the trouble is not acked tone(); } @@ -311,7 +327,7 @@ void troubleCheck(){ troubleLedTimer++; } else { if (walkTest == false){ - digitalWrite(27, HIGH); + digitalWrite(readyLedPin, HIGH); } if (troubleLedTimer != 0){ noTone(); @@ -326,15 +342,15 @@ void checkButtons(){ lcd.setCursor(2,0); lcd.print("Resetting..."); tone(); - digitalWrite(27, HIGH); //ready LED + digitalWrite(readyLedPin, HIGH); //ready LED digitalWrite(26, HIGH); //silence LED digitalWrite(25, HIGH); //alarm LED - digitalWrite(13, HIGH); //horn - digitalWrite(18, HIGH); //strobe + digitalWrite(hornPin, HIGH); //horn + digitalWrite(strobePin, HIGH); //strobe digitalWrite(14, HIGH); //smoke relay delay(2500); noTone(); - digitalWrite(27, LOW); //ready LED + digitalWrite(readyLedPin, LOW); //ready LED digitalWrite(26, LOW); //silence LED digitalWrite(25, LOW); //alarm LED ESP.restart(); @@ -386,25 +402,25 @@ void checkButtons(){ void alarm(){ if (strobe == true){ - digitalWrite(18, LOW); + digitalWrite(strobePin, LOW); }else{ - digitalWrite(18,HIGH); + digitalWrite(strobePin,HIGH); } if (horn == true){ if (codeWheel == 0){ if (codeWheelTimer == 0){ //temporal code 3 - digitalWrite(13, LOW); + digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 500) { - digitalWrite(13, HIGH); + digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 1000) { - digitalWrite(13, LOW); + digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 1500) { - digitalWrite(13, HIGH); + digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 2000) { - digitalWrite(13, LOW); + digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 2500) { - digitalWrite(13, HIGH); + digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 4000) { codeWheelTimer = -1; } @@ -413,9 +429,9 @@ void alarm(){ } else if (codeWheel == 1) { if (codeWheelTimer == 0){ //marchtime - digitalWrite(13, LOW); + digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 250){ - digitalWrite(13, HIGH); + digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 500){ codeWheelTimer = -1; } @@ -423,58 +439,58 @@ void alarm(){ } else if (codeWheel == 2) { //4-4 if (codeWheelTimer == 0) { - digitalWrite(13, LOW); + digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 300) { - digitalWrite(13, HIGH); + digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 600) { - digitalWrite(13, LOW); + digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 900) { - digitalWrite(13, HIGH); + digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 1200) { - digitalWrite(13, LOW); + digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 1500) { - digitalWrite(13, HIGH); + digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 1800) { - digitalWrite(13, LOW); + digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 2100) { - digitalWrite(13, HIGH); + digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 2850) { - digitalWrite(13, LOW); + digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 3150) { - digitalWrite(13, HIGH); + digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 3450) { - digitalWrite(13, LOW); + digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 3750) { - digitalWrite(13, HIGH); + digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 4050) { - digitalWrite(13, LOW); + digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 4350) { - digitalWrite(13, HIGH); + digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 4650) { - digitalWrite(13, LOW); + digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 4950) { - digitalWrite(13, HIGH); + digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 14950) { codeWheelTimer = -1; } } else if (codeWheel == 3) { //continuous - digitalWrite(13, LOW); + digitalWrite(hornPin, LOW); } else if (codeWheel == 5) { if (codeWheelTimer == 0){ //marchtime slower - digitalWrite(13, LOW); + digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 500){ - digitalWrite(13, HIGH); + digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 1000){ codeWheelTimer = -1; } } else if (codeWheel == 4) { if (codeWheelTimer == 0){ //california code - digitalWrite(13, LOW); + digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 10000){ - digitalWrite(13, HIGH); + digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 15000){ codeWheelTimer = -1; } @@ -493,7 +509,7 @@ void alarm(){ } } } else { - digitalWrite(13, HIGH); + digitalWrite(hornPin, HIGH); codeWheelTimer = 0; } } @@ -508,7 +524,7 @@ void lcdUpdate(){ if (panelHomescreen == 0){ lcd.print(panelName); } else if (panelHomescreen == 1){ - lcd.print(analogRead(15)); + lcd.print(analogRead(zone1Pin)); } currentScreen = 0; } else if (trouble==true){ @@ -555,7 +571,7 @@ void lcdUpdate(){ lcd.print("S. Wlk Test - "+(String)walkTestCount); } currentScreen = 5; - digitalWrite(27, LOW); //ready led off for walk test + digitalWrite(readyLedPin, LOW); //ready led off for walk test } } void config(){ @@ -563,11 +579,11 @@ void config(){ char *mainTesting[] = {"Walk Test","Silent Wlk Test","Strobe Test"}; //menu 1 char *mainSettings[] = {"Fire Alarm","Panel"}; //menu 2 char *mainSettingsFireAlarmSettings[] = {"Coding","Verification","Pre-Alarm","Audible Sil.: "}; //menu 3 - char *mainSettingsVerificationSettings[] = {"Verification: ","Verif. Time"}; //menu 4 + char *mainSettingsVerificationSettings[] = {"Verification:","Verif. Time"}; //menu 4 char *mainSettingsFireAlarmSettingsCoding[] = {"Temporal Three","Marchtime","4-4","Continuous","California","Slow Marchtime"}; //menu 5 char *mainSettingsFireAlarmSettingsPreAlarmSettings[] = {"Pre-Alarm: ","stage 1: ","Detector PreAlrm"}; //menu 6 char *mainSettingsFireAlarmSettingsPreAlarmSettingsSmokeDetectorPreAlarmSettings[] = {"Det. PreAlrm: ","Det. 1st stge: ","Det. Tmeout: "}; //menu 7 - char *mainPanelSettings[] = {"Panel Name","Panel Security","LCD Timeout: ","Factory Reset"}; //menu 8 + char *mainPanelSettings[] = {"Panel Name","Panel Security","LCD Dim:","Factory Reset"}; //menu 8 char *mainPanelSettingsPanelSecurity[] = {"None","Keyswitch","Passcode"}; //menu 9 char *mainPanelSettingsPanelName[] = {"Enter Name:"}; //menu 10 @@ -761,11 +777,24 @@ void config(){ if (cursorPosition == 0){ cursorPosition = 1; configTop = (String)mainPanelSettings[1]; - configBottom = (String)mainPanelSettings[2]; + if (lcdTimeout == 0){ + configBottom = (String)mainPanelSettings[2] + "off"; + } else if (lcdTimeout<=30000) { + configBottom = (String)mainPanelSettings[2] + lcdTimeout/1000+"s"; + } else { + configBottom = (String)mainPanelSettings[2] + lcdTimeout/60000+"m"; + } } else if (cursorPosition == 1) { cursorPosition = 2; - configTop = (String)mainPanelSettings[2]; + if (lcdTimeout == 0){ + configTop = (String)mainPanelSettings[2] + "off"; + } else if (lcdTimeout<=30000) { + configTop = (String)mainPanelSettings[2] + lcdTimeout/1000+"s"; + } else { + configTop = (String)mainPanelSettings[2] + lcdTimeout/60000+"m"; + } configBottom = (String)mainPanelSettings[3]; + } else if (cursorPosition == 2) { cursorPosition = 3; configTop = (String)mainPanelSettings[3]; @@ -791,7 +820,33 @@ void config(){ } else if (cursorPosition == 1) { } else if (cursorPosition == 2) { - + if (lcdTimeout == 0){ + lcdTimeout = 15000; + EEPROM.write(80,1); + } else if (lcdTimeout == 15000){ + lcdTimeout = 30000; + EEPROM.write(80,2); + } else if (lcdTimeout == 30000){ + lcdTimeout = 60000; + EEPROM.write(80,4); + } else if (lcdTimeout == 60000){ + lcdTimeout = 300000; + EEPROM.write(80,20); + } else if (lcdTimeout == 300000){ + lcdTimeout = 600000; + EEPROM.write(80,40); + } else if (lcdTimeout >= 600000){ + lcdTimeout = 0; + EEPROM.write(80,0); + } + EEPROM.commit(); + if (lcdTimeout == 0){ + configTop = (String)mainPanelSettings[2] + "off"; + } else if (lcdTimeout<=30000) { + configTop = (String)mainPanelSettings[2] + lcdTimeout/1000+"s"; + } else { + configTop = (String)mainPanelSettings[2] + lcdTimeout/60000+"m"; + } } } } else if (configPage == 10){ @@ -977,6 +1032,17 @@ void config(){ } } void loop() { + if (lcdTimeout!=0){ + if (lcdTimeout <= lcdTimeoutTimer){ + lcd.noBacklight(); + } else { + lcdTimeoutTimer++; + } + if (drillPressed == true or silencePressed == true or resetPressed == true or fullAlarm == true or trouble == true){ + lcdTimeoutTimer = 0; + lcd.backlight(); + } + } delay(1); checkKey(); //check to see if the key is inserted checkDevices(); //check pull stations and smoke detectors diff --git a/facp/src/stuart-hall.jpg b/facp/src/stuart-hall.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb4053c3352ef58547111b350d91b8b8f5d10603 GIT binary patch literal 23396 zcmb@t1#lg`vM_ke6f?(+F*7sUF*C)?%*+_G9mmYf%*+%sGcz+o>^;f7-@R{Z-@jE` zwelQKSF1^ymNe>VeJp)!0gxoczKQ`rKmh;{;2+@Q9RN-R_}Br({VFW1E3YUg_ElOG z00OK5{bXfm?Ffnl09e~NIVg$?5vprw5<;y3xv&9X07?L-zM-R?puD^^;Qv@27XIh} z0A^|b$ofB${qGg9M#heYz^XUkPsh;C!3k)x77&JWb+Y>dn*m`o1Ixd#*B{scXdn>( z;}2~5FF5}%&A;I0zck8KvOUPfVJ{p9BDQHfEWY- zG)@{iJGlHy2jDaCJ_<4nW(e^U+7j*oi6317hlS{x@&^+Z_fIhh1y}8JOFIvUu$ok_ za`P_l*}h|jkB^U4fG_|C5(*j$5(XL?8Wt7?4gnJp0UjO!7Y!X5lNg_bgb1IIkc^6z zmh1}?1tB3FKRpvWCl3z~DXoy0AeR^`HxK6@At11@un3wwM=1`hH6R<#27 z1O{{xWKd+_|Mvd~{a*mEF?L@OcR3-HnIa17gTxjNV^SV2HmypQVleD7n0_QnPk@MQEsfp%T;Qgx!B!bqa^{vL@P1l3|Fi;mar1dn(2JGzcuvfC}D`An- zE=)Fp=TuGl#XhPkS6R9f2`$~RB)c`br@&r^<&O+QHkxd7cj(_YCOH;|1*fS?+p-Bi z8;nWJ9!rsDosYXDbh1i1NsRI&*`*FTDE?}M1Z8$1*2&QH;BKa_9Mq6Fb$lJD2w;he zN?d95sQv(ul~pEQB!Vw(@*VdB5b=lD>&$EusYEw^*sf3|*8K8#q~UT=FOi2WFL2lp z7@emNpp$o`OB=H#*QDJE*F4E!iq!6yx(r~Gq{zG5FrF3oqZC9pt!lQg2Nm_pXUnBL zmqQ*dPt9wqW@df4igSL+i@|Y08E>1DbJ{9Ko$7JWB@)upfk4fsc)ueZHqp z8Zm}%toh-JmN!rez2(YlrB600ir-f{b<@a%ltFy2iSPSDCzbO-Y)={IWE96=u0Ndr z6sQ;vWV7+F9VgDhm!dYGv92!F^5_y5AWS+v2a51)JxA%@mfyrzIlY67tAET)2GH}} zp30KB42(o)rKy>L60ll2H2_ql7{EdJ{4>Fc*s9b8{t*q%G6wIu_FPq^ZScTrQf1VE z(Nn{^G<$uYPIiEbGTpXHKzyTI2H8Kj(Ac!#natif@y%0VhJD{*qG*&ngWB|)5ol6N zQM-nJ)rbv0Oo}G@ol+$$>V9XD6}ptR`fTfLCE-7+Kp{OKGf;owrIgz?V_W^ErIwxK zN#B1UXNj%*ws>TOU#}dnqUsfo@{Q&_yqWpzHQndy;MdKJQLZeS^de?WHp!5*&;!*d z_?gMwb+gI|+h4eCWlHR$+LEh^yqYJ8HEQ)L3@h#?} zoGMq7w>8DESTf4icaML$yWL99rBgBAFH387DQgVMv}KNue!yLEpU{|lmR>A8JGJst zd}MJM)yD8ut_>8QxqqFC~s5}((NDCf8Rm0Yedz&xH;YiQ)@LjiC3FzUefEHpSSUs!j?l{ zPuP}+(bLtPT`I;fh83C|a(4~AN%lY@zGY!_XmHl%Hd&;pw0+^E$C;WXMCM?*gX_^I zJ-x=Ni~_gSpY9 z?RWrncw2e;y&ExV<{6P%Yk97ex9~|7$Mj712Nd$>qy234FeY;u0U zk&aFkp+;lZays3mle{PaJ#Y{eJYhq^$Lft z{`Btm6w$3}i9XX+N&>?kE7rU>*}-HZsT=S)00cuzDMyr)GH-RUkW*@j*`weO+9eB* zf!VCP&y=Pqp-F(Uq2Z$>KJO`e^fc`+J?<(DiG0qCHcVTaxMc+=DpD^Q$qh5t=c$jn zS(0dHd`wRT`t)YQ3_zujpLW_Vyk%qXM{j}6{ZDbbzXJeQ70>@5{#SqixVAAM0YE`P zKp?@Ofs5bYl@Saa1QY^*gp7iU#sW#mj7~&C%D~7ZK+GynW~cYD0)Pfmfk1$M0Qw`l z`@qP)>b`@W=W$xDgn#mAZNx3#L-C2TnpTjn+WWF>IuG^(3|FBzIg4~mthwyYMiO!O zVG-SVtgz{FnHjl~VztYqx$MQYLtNu$m)>{(N}+)ip}~!jdLEdFD!0eqxHb6`0C}V{ zQ#7TzGb!`C0!~2~2i_3tZ_qM2?U;xKP5t=M#O#I-CQAnlVJ#e5@jYZJb;;VPClHu_cn;n+uQS86A5b2ZhU<G|s&<$Z; z`rcKU6HQ z6Cq*{Pi=KmpWBXVW1OO6%dYPUy1>i%XdvjaNEVc4FmN z63~LaJ6)E38Z1DHTKM!$y^MKf`r|JVD$OnMbpns_@KKbafMRhSc4*9aRQA4n>8!`qN;6u|NPf&`vWa^DTkf^coWuVI2zF+OLD z{CvG8n^7CCn(qrl`zK2?E9gKl)#^FCWV)1QLkV&8DBMPW`;|DH-5R|^zX6?{j(3@^ zoE?}bz2n}@cEOV;-|3~NXIVoyNGThqbW;dU>cGRBHV1({_9%Y&LaCbm*V@lxWTTB_ z@6u<(4_KWafIGYt##8kQ*by{hUDJqE3sorqJF_(GCsG(L85>ka zNd_K!w}HK~(WO}KI~Q=+&6GGNVShx84}fmpd*WEHqDA(89HF+>G-Q=>d^`R3w8Gk**InbG=1kX0ouW?VWnH>MQQ0_V39%;%JCP9Y0ZsBx7UudnmAe}z{ z0hqb3b*HjBveQ$;AwYmuI$2<-pV!OYmUDUY={lT<02J@~i$1103vC1$Zt?!`S5)5F z9(rT?0OT>ZGQK{W7$$p#xt8gm_pn6BoZu%rlV-D?lIlMDrxf=Ij#usv4--OhiSYN4 z$+9MHH%E^l3_NM@=8py$p+D!YtnSK(wTSJ$xmx#@qHn9tM+nF1)Z{`3M9ez32xgMq zabmMhf}7=oKz5X9ZV0;*fivN3DxzWLqL;)I6UXlDI{Un8M@>*)e6tPZ)q=`tD32lg z-SVX}qozuGc=@Np@gV1Gquk1f?7o!*0K+sxE4ZmCqQFMckAapLd08v_STJP%xUa~7 zYJx7IV;Q=%GY-1E))zijeoTI$#{N_eiOq<6zRkOn=b9UecqYh=ffD41cb(v`Pb`s;*&C z{pCT+vaGgMqtjUoqD8^M{1|rcHU@ z?AvULduyc751m-~T%pQpy--yME}TM>$eZy+@CI z0Iau<9(@+%r11rg(gR{+bdgU9rWd&D#ys@z>puXlA@?}v^&#d2E2$^p>f!U!zNY`N z-S6Bv%`mZ5BGl3;!ji2*)C%S)qzcKyhv3e|^wk#8hoB)b#(!kjP_TgPEkTbZ2ZsH) zukc*ICiz$iO9+?Dp4r2~zJt6+yEqXUv{aNWn zp{DEG9{@SiP+kH=?+<|4{4UB|B1)vSiO#x=$mJ}uJK33!&&@q%OSbf7hGu_pmEk?S z=yST*VTHjrnN5FVBR#3OR_%8yYc|TX1dDOZ)dY!gOq3FpN*R+CBW3>>8|`llG@9d7 zgT{u8gpgmor4PQy(`1CDXcd*7?x`+f7%E}AFHl9!@ayvj?OLhF3C<<=!;F3VC8V1Q zD)ZJtxibsCr_3t7h&V9pn}6A36&jSNEi0Pvgka6Pr?2J3Fy>J73o+U4^y@*ay(P9x z_XptXw4)kwl+(V;PC@E;{#kGRY9E*kZON!%f+lKt6Aq)_>HwOcT)kbPC3wh+TQoEgUSg* z{LZ$howQ~Jx*q471d-Wg)!o=9H%TJRO|7M;yc>FXd+!OmdFIA@($(XFW#0mJ$fSgH zphS1xMA87Q=HY&pv$0acAvq2Lq~@eu3ERI`2YH2KZ1mn1uB5IaM$;~92o|j;T`~#o z;oOi$q|m}bel*1~AV|3h-(pN;1-a?nYTfW4X8cDqtzW{HGi7T64% zvLDaVeyRJXjS+y*J4?&_Z;Gk2U^(^IJH;^np$15p%Z97o46L&gLX;vqeVR-%*WoS_hTj} zC9!WB03TrH*&F`}2c1J+6HP+BW~cPATS_;a# zWI?%)Qk`|Q0L-mTblV0T!`T5Cj8HA6zPtS%z!>$(UwS3Z+7RbhMk7M37bT!L3n{j-nECC5Ap`Q6gFLX+6c^fZCeQQoN7tY; zpE|0!m->qa4wL-75S0VgY*4?dX`&nI%$A6gXDF;lA3Aey@4F4+rdUrwJWrGP`P%Y0 z`G`s_VShN%nvn;p#$0YkLn85Dn4pO&$)6Saml}B&WyRw$s-r(rOA$CkRX@)yosigY zsl|3MvsD(c@gf(k&A5e@|86u9GGME?frHf^J{dRuqJB(Mb`Q;!SlcomTV$X~Oii$L zwWw>$(=Xd>_yN!W?i3i20iYmYpkNTtz!=)!{RA*L42FzC#E2>&2#!XqU{AuttnVK? zeN}TUByZ63cdGylyzzs40Ays-_+~?-^n5x<@`&mj?~aXktP3Pt+|&d=HyrIoO1A2~ zgehj?r=L@~XSgK5arVQ5i@-9M{06S!E;rvpZBg(@(3FDf6DZ>?9rbj-sz_GC-QS06 zD2JyZt_mt-7RpoZASc#^D(0}gNZC!+VRp_!8uv6EKOMYsG;BUxDV9hat&9wjqb-nU zUS8fqa^ko{_t7HWc@?1k*d{0{HyE5p_|5mT8FS3ay_^ms;oXiARy}Q1@ID~6^JPHK z%UchFz2;TA1`}rj`*R?xD+U+)aU_VC!fcAluwRshY8eWV94x&s{6a5i9|g$7o;eKJ zJ&pkOB2G6Vl+Jg>-fgvtA?D>ysxkA=8mQ%_xO}j$Gl8zYQ40{xB?EkC6-j0bkrp{6 zSMg5;P!~J%`h`zzc#-IsM7Esr8ov&>=?9Reyc~|H6k*N>Z;~%lyCkTRY%XWb&e!f_ zt7o7)wrsmLh#!06?$RBEm5#tCMYWA>LpR!oOxa4Sr%AP=r@ikCoa)b24LFRvcWdpe zpu5V?f|c=!2;8!8h@I{;%KF7W#k3cXc3)jGn^5IDN89w@0+u#VmBNhJa7ISA?%2|G ztfLNlCo$aNBHSAEj z^vm6}X8lOOy1GAoL$C;h+gZg@IS(ke!&&kEZ5nAIeQo5NNqdw&8ptH8_ zV8wbogq1SQcJUUp0=e8nUxH*k>%g|@T~c|V&N~k*2Dw12$M@(1fV;yf{3AikkahJb zUW(!wKhv%hepQaHwowF-7Tw^lj3=z6}lv3JmA|yMQ1QF$#hrp$I7GGszPY+y8ZEU?`a%O+nyQBO*}`fc`iI2e??r= zH8plTG{<36Z~*vL0&JTQ5Y1PmGy2Dq~ag8(+~PZa#mxCKW-B^Fe$cOYb97Si`e zBViCwG>FZq3HaH=A}pUft!H;-XcSkw{qH?LBtLM^U#od>qndmY^8zOt2PgZK7)R;m z7}IZ~sTKP!*&ooK){)Wl41ZG7CW?R6Rq5?}J0Py1O={d*gdVDfAH44zQiHLEqa>&k zqfXc6({f3TJavlbSidV!ye{EOH45rRd#|^qlGGRpkJe)2a-Tb5w{&TAaAs009qB6O zPTJVLh`t)Lk_>mQc_qgs#pZ=+!*4O45EAYvOE}FO??il{;QsCyI*9zPM9>(|<2aIn z&4NH(|Fi5X&N+)UCQ=}|bMs@mkeZ2^QG3 z)appkJW)vfq8@kxB@;_}IC0u*T-;LLptQab%RvP6qrUDE_quVp$U=wcAg>X8>@1=s z~SMY2|GBc_zfTQ{18pv z3e~i`@vp?hn4dK@u|1jRU8|Y=i(lX7GwVH@sGycz4xNa$l+&O04k**}atOF0CT~+| zVw2-M?tISEs5*|;0tdm>Sk_AE`3DUiQvp$2ldjW{k$^(;7G)jZ7{_VmS{pL6T@ob& zE7S6Q{nVLs&>5);%2(pS5p^)jfP^aNGBWcUU$)}I@cimiM(L?VGd$naDby;-;G>!Q zv=HfrZX_3~?pHo2h*NCAE(4IkHP3KF^J31NKSr$&u(&yq90I#r!Lu5)2P!LGBkOK5IWHfSSQwcA)erjVo*IisL%RTh0*mwa*t+md>)6o!zs?FPnc& zYtdY7T9OYBtg&z=a8u@8RASLW`(qZvlM@L6Q^W^=t+1EThX)nA33Z5hbptb~Z{4M2 zoSiCS@~S=(zoE<7*Tka-3QXQ{{LeEYI|Ss98sCU+FMd*v`|4y^+Ci>6!wf=Voe?D) z&%pS73zY0C42K+Uev8dUnfe1DBv%VLn$Cj?89e6$S-NzVKeW`l-c0URo znOe$R5BDVpSGW}w`>MelQK9MC34h~w0VetqE<7zk^zdo?7&%I5;fh+2=-w2pjb{yw z$9o`!*{uaK5?$R2ucU>>JKft@&`*=X)@SxA2aMkHGWOLhbMPK(1%gfXf|hEEjp@6V zmx5(*3QnkKF!z_Z^8ROBXwU=D3_Q`Q-s+1wx}#QJLd#V13Ws8q*ezNG!4JS3`QX}T z%2YZPdNywsL+$3MZCm|*T8(erYbsJJJk!W{B=4g$g%#8aI@hXDno_axJGT!43)w=zA#Lu+u+18j;AMy@K~W8h za>CZ;S~$EGhaYC=xFU0^MoDs4+NsudRz5g2oz5lBBd?^wA*N+*d!#a6dw#B2_gk|n z>$i#o6G0kli6D9W0BclFZU&Ut8Lq#X9r4SG7`tkSgH=?M>eFEjF+`z&*s4YbYMHo= zOl;-PiVg3c8us#=)SenPvs9RhbD4-XyhG+>JBs7snI_AsDhP6=dEQMxhFSO$x`tBn z3DQ;tcb%_h8f-pmO=LW~2@MB2xfDgk&kC-r;-W;b5^p8ECa`z8Uc#UX$H4K$FRkXZ z_2AFz5#i;8tXZgy!0CmI(V9X&CAnS`oKTmn^i58CU`?ctsKF23WBZX>$3*yM8v3BH zNu|#sT05q>EKNiAL6wCp*56rq%7&F-ue2~T!7&<^mKqL>5nAJY$ILw&gf({L94-uP zO&QTqU?HzKP^0Oppne_Czq2IT4xNbe0VKC6FFt@;waFr2p{$C}Ja#4lBl9-gDu(n8 zeF>Q#{dX^=fo<5jz=9@wKs&Ta65M%#&iPWi+_#1E zyV>P)Le^Kt*wB7=;=y6_A#73(I~hAqtx+~S4@0NxmhzUi*|dV_YuQ>Sxo&h5M&s2v zMQh7e)Y}B4XDA_{ud)lq!kP`~=HMklLD?#5>X}(HOk!IKSJ=uyM46dAcG3xGX)SCk z!xhiiq03##A(%O@3b`XQBZe@;<(aeZ@F>yLRCMV{A81GVHt>K5WSQqITEhwv>#@0- z=sQ_`2^jfSty5p<%GL~7v~tQgr;rtInwBCu!i982CF^zhV{0m6J)%mQciVmv>f{~m z@Vi?}{2ElpAbSfoYZ!bs2%9(*>v%spUjxOyb>Vthl`0L0#r{fG?i6GQq_rwuiOFkh z(${aFm*~dJWVKB;2FzO@9xIUbFzzkdl7t^JM1Sc-6P|d}!Wf^DOO{?u+xi+~GT8hG<%|CDfqQos84DXe%plmJQHzf_q@&7dg&}m_=yRwp+v&dHXTp!v6RLZ@Imt zU^m(!s)ULwc2#?7oBPaOqNGfUVoxyk2=;9$qpkeEW-% z>cqY5Ip5K0RdR0Z2283Dz+=Y90YP)E)~$U~@B*Zs?h85&UW6vd5yOxqYbPH%+BsB$S6ImRL`rsr=Z>tjmYFcD(oQq|(4P|uSZvPWc@R&}g_oF4PWB)Q?sT%2Y2r=zk#>b#w3N1DPP4{) zYVAr5JZYJoXrT!%_FZ}UreRbu6!iduxfWHHJ}Xr50kB{-W3BCVp;bMp(_hMp$7Qe;pWbER-AN;jLWo`5 ztYbE+23xUI$edmK%%g&Z_hng?Co=XxwNXqQNgg2}9WUh?tIX6opRCTLjq4K^xBdo; ztX}jug#F|xfzNsA52L+nHKT5ygwtAiC{T0)^~q@1JYLB>YND$ikMzU~@Y3{TpLr9n z%yi5$@7Kn|>EsG+&3VoTnyFa=V}(WQZF6%q_Hs~&)(IDQm|FEZW+h#-MpbK=@zm9K zOvs%IF2#{YtBCkW$Mcyqv?!~Bocbjs$Mj>8)v^FKt)t!TaBLc0SA%-7FUVaU4d6b- zXLK^b75P66P}SL-jO?FY$i<)Gk3N0vwt_|h+uLwF9h`AJ@CD@FzTJ@=DBc`Q53OX? z(*H=q+wIVZ^3UV^2|4`%fLYBZ%B{N`hqm+ilabc>FHji!CCmcBIbN6SgDnO3?k^)(5UpAnWFS#< zRo^Wh8^O;?Jy!XRv{!pCYn{&PvBaSFnG8HSC^daZm)6WF+F}Ii+VFl&*gN-yNZbTt zW*ufv_->WN_{qBWU(FYvehTWwc$}TCeg6s>$$PbR1sUQ%eIyQUi8jogbJLA9p9kaJnAoV@4~vI zR07eWqMKqHFz~mVD{wr?4OAfUsAX7wc+ZpSTNIR8ukD)_e*l7VU5R(YKNJdbJ zJ$0lk{dCt}=sp0``d_9Y8LPm#no63%KLDR0P+gmya$Lh;#-CEt`H(;pR>!#%n;b`i zo)pAKLKq(s)10DuJO(`uc6U=pgN5qX&E%G0KyD#}CXc3eJO&_R^u+<< z;pI9Nn?~yAY7Lsa7D$dFuJuka6bdcZj1#QwG3ZO;uWEPKKHY85Kv%cSi>hEdc1ZJ+ zy&@7G<5ECGf02wE%nJU(E@^n1fSI)~K9bV^s?EYK!FTfgFj8n^H_)}{YkXV9`da-m z>IqxJx0Hqb!SGp+3X^Kp)qp8MuaL8*_8sqZMQc`=w-bp+wCRS_qI`ED;1+7il>bV( zubYx&gHFb^*COycRPNF{AV2vg7`F{NH<9--IwGHgMa9-J+{hO?HzonW@Vve{jVY$} zKB|rnv#1`jUc}Oe3_D$*k*fl@T^JHH^|0DQRq&S$A;E0k5Zbs6dx(nkwY^E6U0_c* z{)FY6*kp1hPdJDBkh!(+l>M-!^aSzOKb-05tf|Gze3x?KemRGz4Q1hWm9#hM2*WzkP8GcK6iD{}*d7X-&HHFGC1vj!YyVm6R zmg}#Ow=Cgg{+)=`kJx;vDEV`!M+)18$cHjZIW!e|*Rs9I~NaFwo- zvO@>9^8rZkqI)S7jN80dy$LjO`vCOTVePmccB#DLR){L{eS05?6Z8!pInusY)eo)d zB)F;A2j_Sr;h+h-z;IzJ?RV!au=G^BJNy7dR!#`^lFqW0`LZ|EUdxxorO7<0#!))w zU6p>~?{OBd?$G1Em;?qfXpn$G3lLCn$UpgefAbVT0Dl5B3i|d}NQC~ts722-gTVE+ z{C`sv_=!FMJL)VvpR4USb>ATbEk%A!SN7V+X-8yHq~XUQMALR%mwPU;DrC@>QSdrz zeBTu4K1y(j7~hD+_<5g7c;}T$=xq9ms=L)}@uSQu98UAgE6T%n4?;-f+TD7U%_9MONE;&xj@CQJp$$^ccV|QMM~OgiYN( z5~CDo(Q&DD_t@OpSD`bpRk0lhGIy2MT_OV)Uk9E;t>bl}&s@2BEj^YQF(BFAqZq>y zNBY|71iJBYOrqgzca*LAgtvZfH&JjVIb|c$IQjaQz8maZ>f!4QkKm^HWU_A8yw)|^ z-Qd3QW8Y@khESHJ)vL}49!_p(NF!=3?w86m!23b^ZyDo2YO>aEg~n=I7x+({Dsqsc{OXMCT0A1?$qY<_@1L0PJ*MuN%KBoo z&mAouQ8#pvQ5O=|yf>OQd~-D^fnW4>eWH3JvM=A+s^^Mb4(;Ok4VbX!_)4>n++0`prrjqLr{WlItI{eX!bCZkxp&V5j$_`DoCVp zTS~c^Yp$`Q{~l|@K&o{S*@Id_DU;%*SNN$&&qy+HZgD|=e;tt&4I_RF5Ho@3twnA?M>2_>`}VQ{W9kR;8RFh z`cefe(B(*0yI9=`O}m@1$+OCQzD+$E(*o!;8UPCO6gC#)L_E_uY7&bAR#$-pNXvZn(BETKueDae`W1ssC}f%$*I ze#y|^SvF~=nJR2qw4Ndl0KTS_ZIv;Q9QX^a#0+`WNYT4wTzR+Fv$oX3=&4~nel)1@ zqND6dGu&gz^s-iT7I{5e+s~pg9^P)>>(M^H|Ej6HNZ)^o!GN0K$o`IFQ13A|i$67^ zPHW(_+3ApK)ynOafFn5d0a$jsHq2!?JLU5{zADVi-^IZm?1u${ZO?QSehtmZawmhoSQN62FGQ3e2)a5UsKUiyh8Aa zGLjjN89P)IaefTi)l!_1hFBi2MI)Q=%FFcGp4WbN+0hxhzL;3b)jotoKbi=JVhz=_ zr07f#2=1ahy}B;281Fm zh(n4w5=uK7`^o-=0W4x!X~c+J}-UC zMUElo89UQHy1aXOXC={@&3k&#R#m$48Ocg=C_eB2l}|Gc3$rW<6<6k`xHt_4MSRuZ zokOs*s#3kd{qa85Q?i03r$wj3ISEsR9r{83v0KlK5qavPKUjb(49QeX=NGw7#n5ON zq(p6NC}*rhJ~yc_;{dkGJ@q`lPV))KivXtwgUE~^oGSqUl7nP5yjeUQm|puF3PibJ zNL?9(u*s)#hPLLraIJ-)vBrT_^=ytZEt_-GYsf^~odu2$0E3bl;?NJ%gV&HRR_=IW zAan2SK_KvV%Ee(tD(~&mXtBf>{R5j1*XhJC6con+SYqo2bNiYENQ`R-SAGh6xI8!q zbJV4D3>Batq%{PNZz8DO@erQ{Z~ZlhzQg|5?a9n(pt~tdp}^(VCx3JjaWXVYo2?o< zsG8orxvjCgagkMO-gCP&;Tl&|X*XWkY|A7ns%I@MdA**$^%m0ZI(y&hEt?OqU*yaQ z!4d9!GPtBaQKw@WP{z+`W6QQ74!46mF&8gu7 z|6z>PKBUf<)BeNFd*9}aEV<9IGrFpLDcNix;f;1*o+2H~0=;vf7ip(kz$r&Eku+?U zj7G*v6{qv*O2oP+ud!|r`rH_sG)>fL=sQN`!f#}E(}wo<%R@=NyMhn+Bt0koATw^? zzvTmi6SwTO1h1Sm+#&9Zjad^{oMvGG>)t!-e?qLn-;Lvn<@a43N}!@_&A6>6y4!{z zKx}ozJ+#{1UUQU7ddawr2^r-p>YYr#dh$)lqNX=M1|u_m3Vdt?&B;D}xPEqDYIf)T zLeXmShL4UI$BT44pPzfaMGpRj1<_Y=(D=osi{A$(&vu><>~yGkZ(@1!)eXNZIHBhx z+;vb}rm^h{;##gInh)|+H*p<*zc^*G<|mn|O56#1=pW$aa(7HCUrp3#6d=>q9{hX0 zcPH`pOXKKEkS&rZ9YcLJz_D1cdOcr{k}T4V8J!sD8(!v=-Hm05303vNzl@I4>MG@G zM&q;vmtvA#9`S-&j4>aMfU-T$(Bo71?o4+~U;5*SXDgSuLhbYz+hlYhjgftALRA}K z^F??er2uEEbL#y4=sWK7fdKgaMhZ(|I-8a`kHUF;+`LX>Pgj=RGbMHu7#`J;U`}95_s>HgoSiQ?!a+ zS9?`9K>a9lPRDL0j)+Pcgm$&vusDboaA&)=Wj8Xnvu@4E@N99;Ux~w1+H|(v@bQD5 zIc1MhYnO#D)6_AP+T6Q1CFe2I~6 zY{T~K*3|Kugk8}P(=4A0;~IH)0n9}_x+QRn4yH+SjD~_a-pudu!P#_W8D`%iDl>t< z207}91x@TJN2#c?GjQaQK5A~aqV5kIWtMarwE)yey17238lt%?vuW;s0OFv^c0L0@ zn(saUc@X80 zVS}c1`?ct$N3MK601@c@kkTC@4ZHTpsHJ}AEN`f(V#TX884um!8ap?%&& zh_j)AoIAvTMaf;5Ae<@@{^nC%9$k8y$*VuV%dLfp{Ik|WblHcpHjN&0)ZMPi(odD; z#u!X*9iQrj!=_HONO)kBwRy5D#BH0q)0b#;6KQWF%LiLpXffoGLa4=A3uemAcFV7b z6l*9+_3a$q&T?fr9wqzprA)v0%DB|e)9r~s z`S$?g06*0A&cX0DtuyU~L}FZ?74t+wcPL(;#KKbRPv9p>UAF`wl|$<%W_R^nW?~Je zdS>C9nOZ`@CS5u6o@ZP{Mox_{;-nb*JGe=Ue=ji&=P^{BgT_9*D!N zaoe6d?hVj%T@t+ovs4+$H2DZ}k}Ht!u6egDN_Nwi(*{ zThg0DD!*AW2R<8O+_)V@fQ4u9lLe+=Pg2hYUS?#Ka!VE?D!tQDudASa!&Z3(=f;MY z<#mp#%I<_io5zHjuX;+!)cclCB~xjp*P+oNO7sWdr;euPv5&!y1c8~Z{TC}D-(<)) z?~vcO$SbG^rgG1Q*WB;6H?<*Nd^~v~##()^_qdO|W2KQsDUFbjwJsB0tpVs~5V+ z+N1Aun(qc!b7G(j5X`FoM4bs{pt=Y9Za1luu3T;G<)zIkVj4z3D!@3QaN!>Q2L zSj|jGRB@b*6&K8nOKXcPm)Om$M2-z8J!2w8Wp`%OuBCY+PYrC(nz^p`Tpx>bd{Z31lb zZJn23X!TsyK6by*ory?&Fe+k$7N&ak0X(QZ70Zy^{+u#5n78&1-EvGeBrQ?Y?_+n4 zqZ2Sz{_NKd_N_^_+DQZjce0mRzfvE5W7Rl#KT+>vK9Qk2+f3k#&~#~t>Q5t2m?f#{ z*fU1S1yQL=Y{suw!Y@Mok`ck7FW#1tytuxy#!*EWqCZ5e#QTH>$8ulU7E3tTED=n$ zkYX}`pu@bt>FgUSUkj`6C4sBG*QI17BPd=Ol+R!@S`_hTyfB=<%OY``TfN-*F{Mks zlbaR&+^+HvmoQcaF%Wrzk_DG&2$U`QRr#&bqQ3#LB6xXAbX;PPdu0R<%NDx_D=*;Y zQ>SD9W_MEf>gnAwudcS2s+Km`Wn??;Y#8UDZu(^&wMlyqM2o%YO#m-ahdKa|eZ`WV z*r)2qB6bjvX;gh^w9RV&tpIo`j@GW;Y<^yNWC;OUPr!`eNq0{G0s`L)fM1Q#3!Fkv z`GMIE|2@=)bUVrOf4nA0XaCmDje!w6wkvf|KL9fyJ$vq+uEW&x=6&%R-)X(Slp6 zeCtQED}}~9&Lbp+bp4m*#$MT)hc}h}|7l*;w;%pi1hTimJb@EDx3d2w$k7Mjy>C-4 z^4#|DC{3c({Y&*E&+SOV5^fa>DVpOD4N5Os-pGGhe#@d>JJ~D5c+GZ0-;S~D0*U{1 zjaJ5OHZX39-%RpcPtq{gv7o5&sp%_aDlC@VAp3KM5a#M)7Y)d9EiY90xcA zA~^zOd1iqGeW_n0Q9>qp`VfI!3TFiDDZ!~fbk`AWZ)@hV0sJ~ z#6PD)L68CeiZA&K)bzyWOmAPw|0kmj=>veR&c<|fG1tGmr*%D<8YTa711mUsm#&2!6Qr^sncJ;W|;Ub<;}?{GdBQWMqze(=dHe@I--)qWC92Ia~u%B5Ie zU@zlqa+A0GfI)4uvoK~Xk5#nOEOK|!{*y;rk}7x2-8iD8wCKe%iKAk#(E1{MV!eK4 z6}@z4Jeaz=n^D{CK|ydD{%#S0^)%b)ozGGc$~9E{oDGK8*~?4u%7{6;Js*XgFwx|e zf*shmhrm$@XbmBeT|!N$i4jVyz#e>8wC+q7TGV+iO?vfVsTJpeoahMoKoAPYx6}<) zsqr+9tIk5A6?6)m>@gx_i=WiQo$7pZSQxg`j)`!!+B@MQ0Tak%FFe>2VfjJYi>PAX z@DPaD&DIO`!l8d~ik% z6h*)pGB0^dJ(Q(AC=4UY@EkCk!5L0_ve4MJvDqN6AN=`Sj-)Pj%yFoRnwo7(eaW|(b@o1*cxXV%MN#cu30|EmK zGw=(zX8L31d#?N9#yqG#Ng^bJbBXA8a``!Z_o8(cu!GoO8RoWeFv&CtA2Sh|i{y4q z^XOpA>gPhnPar`yLue6wiC>rl4mB#v>5BzE7nKZZ!QXD=^VHrt9z=kALOy?bsbT?T ztalGbM+)9?I_EiT5Ct*dp7+Cg^)WxIJS6Nf4lhvwRNfbvj51DI3mN-z{?dw3lKyll769|gXPceM8hBc!wQ&=w;rHKtGRB`+F(^+H z0>RgH(r0v=d7JpnPz+?9~sy3w*Yj@b_=RWAgDkz zldF6hWAU%(29cmZ5Ymu`XpFh%EqLokPhMNYx}eEIDbMRv1V!Oekhh`OGW;P$ms>DV z@(5F;l@q}gXvv_+)GhN#4tC5sq}U~ac~neBREN00l}q&lP*YV4UH^SkoB@JyWv1*w zP#gOeiE>RXA3$;7SBRv^QQ~*{3P5w5Ik3(8cLW}o{tE&A-w6DFX2{qaB*LDn8ejx| z`}%)I;DPhxjz~O2r9(`r8G%ZO(JU~Zp^ZUXwdd=iIh1^wv$c$*y8x7BljFH6WQwA2 zZQt;vh}N(M0Zd=d?VGtjy$RH40emnDhlC5pzOX(o?mmA3$^uyQ4~*d!E3JaiPhkz} zv&>*;HHAB%T{}ls9nGF-Nb7@-D@W{oi+aaZ>q<;85D8bj^k~8ko8tjluql;xizt;GKqPW9*Qbt z46$X#6oDdBY2>UdKjS3vC=?<1c>iJ^BZxq7tm-aWtOWC5v(yi?aI-NBrF+?Pa zB;!1yOXQ(~FjMIo<1!=uwsNQzAApwZvBID#^MYf_GOF(!Uv(AgRtE-3``YnI<`b;5 z_t(z^CoFy!ieAyHXLjZq2v=g=3N0B+;!?h$}2!2Has)$EjDR%bAvqY(;+I-%7iC{P^vr_FBQV)n4x~c%0bQb z;)n6b_kRTx7whOs7;|$Tk{}YunV{kTJ1d7tr*&ps?7ydw_@fpRdnd>A=O}@pSi7mB zdvo3BQ7?D|0q6`sxWwXP@vS5k%PLM{TD*iY23q+9N2 zL*Ffc{tfod8W99!aQod`Y?jtGmi=9*a4gEurz+EyIaHOteZg$>eVBEM9~<#1>`F8D@vTGyKgDKI)K)BEUFWdN!GZYh=h~#=zzNSYreRY zW6G`8gLT@6mUF0#tH3`LYr&4dLHP9Y9~E)1ouA|SSfZ+gdboZL^(m=LMVaS)cchuf zgOdtSoBdOj9 zCwAkOKQurGHlye*+^f6#SCaLUBvqHIQ03vy_C1~p(#L=*hzV$1GMQ{JoGk6>l%QaQ zs0_TLwOl(U=Hc0gZ&n*mF^d4YOB9h}<@{zIDt6jRRLEPQd#xsb5T2#@AocPe6v3F! z^t{X6443!#nuP_!s77^gPCGswYQUD4(A|%?H>WNp>R+G6Ds2W5-QtlD%BKTttWt3i z7g&r*N*NhUt<{&?YY?}2ygm@BY%*by4QSbt!>u=TJaf$)0@&t4=sS(h)N77T?&RnA z2Yy0;=#;1=W#%!+B=1Qvy>vnOdYdm*6d@8}IMy-Jn_PPc%z?;r`6_Fh-~9{H<6)VS z$6v`pgq%Jj+Q&~z3%qyQIg)j&+YglJ!_(0jK$+B!OhvXJG2f`uwzfWuhS1nby>*PK^q?&cWw{{LQY9Wyj6Bt|Y>sCrBV4IYTjNSjhm%OM+!{GO*Oi`iI60d>%; zcf6955)p9cR~}GUdiGg3NkRf5J8S$AtR;RHJim%H@=gH!m%DBhuz<$};V6L;6}T~e zWIcV8t!NwM9N>4SL=VlRxt{ct5CUS!>jgNz%gr1X$pG zKR%Yhw%I=g=bdOa6=%`n@ZVO3ZeP)sIu8M$LdA~d{S$B?ER6Ui>QEIANCh^WEG^CL zqvM52sg5Ae>zdK|KrjVFLM86)cRLh(c6M&uoh4wS$iOj16zv@;zaiC3zKq{+E^UFq9doZ znJQ31N?8=%XgU#PNYE6*N70!rE`kmu8l$VlV5p=7xkFcrpGo&CJlE=iCJLKR_I)whnOI4)5XY*N|O55bsvei8jTq%NzRhKFW)wTj@~ z+a6Mt%9%py%xc}}P&3eA)9Px$LZ?>Z@mXngbTx2;1%mhTdtynFqO#d1%}Hm4%$~-f1(`yV z#k)fCOOm%%>(AB=6ai+LN0bQFxK+ zq-TB~gBs$Cfi2=PIEzp~DveyUK6tDIBWWGBso|#-@q_vPfv^r732yBZksX@x?=<3- zf)Z!_ciyLo5SVOVruB-o(pqHWR<|4gtfxC?N}B=%=3R{w#aMkHVO&K$q(beJ9Bx&K z_|J6=o(7jR2sUR0e0oYDJDllOteX>f~0djA0F z#~Y-D2;d!(A#E4)tv$k=V7=I$8FN$o6g@IM=e0`+LP%~pacXk$qC{rJmz_-Bg)DMp zl6sUO1Q9AtL*ZPL$M~ZG52p$wc<4Y7L@cx@Uz*v8|DA-Cvas)FpwIAl*DvG_@ma zJ{jp&33M`$hW#3h1t==k2lGY}4ts~`?7Yhb=#pg)n^OuPE(DX`*>Bd$i=-l(RE}tn zq+ARC0Fig0QRfep0QE)2N_dJyw~-^!qW8l9reb*$tpcFmT9aO70Kt$Ix;F&GYf7Uy z4ODXymQAaziytZmqkCN&NRpF;5CyZn8^UFeXFJ}U+OT=J5*)sJQK zWta=5My-A}I3OJ)3pD{66O9vkmhWTiT3<)hVQex5xJxHvc;iVkX z89N8r1W1vX&(r3d(xf^M-?BiBXfEjK1bd#vVJwJ_f;?!x^#ZG?uc|_`sfdV2i@g$T znWU^`(?8q$GrRFdsQp?%rz#FA2@Xs}qO)udLGv^KjKGM)dQ&ZcqAQm4z21!w7gB&! zO6zT4qI@MAh>JD#KZ-8i3>IK1qeKcf<4WqkbID(fOvZX7h1z;=(KvJ*^6vYAG z6akPmm=NhrMrLz_`u#rj^?QAvOT9dot$me7a?t9*)|{na87nE)dr?D|NlzNi4f z3$p(Jii>Ip#DBj~OfCrR^im<%XIJz;wsmqFXAy4n=pcMcBrNDlB^koTg+S^cX@G}> zE&;6`^;L*NqeH+M1+hMB{(JXH5fF871tVyLYEVV_(vr|%5wkoi{)UgVl{k}9(3h~V zV24h1G*cufQ73x;0G|EQ%R(5nVCO~&M6z0dldQyFnA)Xe2y13mb*qUt_9Nrh>G!Xz z+wA&X=tKfUzfJvS72su9?@QXCHij>pd39>Ya>Cmo-d&GhtJ;yv!|cC)p|C`G{-TMe zAKN^K=hYRCIc6on#HolQ2_X}Bpf=Q)8Cv?M#ZHDpv;lb>B6u4>d{8ZDqAubapG|ez_aR@-S zXN4m%A!C}pw*`GB?`8yjw$D$p*{k^Jb^d*RpL+VezR#uJij=or z+-mpe6yK0NUr;1c=RtoWI<+n`K#T2W=6RF}1h|fC>h|_HWOkdPrerW+PCvGh7f9#_ z#L@?rA%up^T&QgA!3&xKVsYB6>;Ri%D`@dkx;YXp8`Q=z!)f#wsVxdpEFXmy7h=G; z??6{%B1n^-K86J=Bqmdd<4AZ)(k3|YsK9nHGMMc2Gbc$TI;f|sa+?)L8Z^PxkPE@|s;vD;`9xcyQtiIygo1DkXb{?_J|ZM^BgJHLmr z&nCeD;Ou*p(^9#V3%olt!Lm0`^+?RI1L?8sU`R}-xBC9s!b(RpwFca>oPMXP*M>l|kzPV5m1c|9h7X$>i1&ilpL)E(8Cybn-sPZCfLRsRo!k@Ab3}r}QCIhXh zwMn;N8rR%jPw^)}>73i3pLND87=VL7UmxdUuKqLfBg_`h*eu2C^-r^m1^*h!E?p7d)310(^zPh_P* z1;pFMGJ8BwOO{Gj&mjV!xPe; zZmwf;Iw|ZCU@6=xW`3xE#569oO#cABW~3u{Z1DEpmXc{V50_G;no)?l5Lg_jS27g< z;x1U$v$UG!7Cg(Z{+;Ou;X0CapmybVC4gbHXO3t<(q?DC(r7gs21ya}cT&Y92F|BO zPfSE1FV->qtb0_&wWP>^h;WE$>ffoReY8J}^FBVTKkp&E254~uxLAX*2r&s>~ zHJy;uZRSp;LT-c>nIeAJ3P3WWkwhWF0Hl)6y3g$LG@FW`Fk4cs1*Vb<03op+YFkaO zD=;g9X?>?b64j1$Fly8{7XFrx2ek)*Rsi6-Nq2&Ap+piu5p#b!5M;ax3Qmq zqG*C>&a_JzY}^qLjPCl~;3R#4j%*bon^2uUnu5tdo7DJgkm5gbDEZY8uAFrW1_dBw zP0vtZQld!$c{?->_BDfecjzqMq6IIZEH7){3`-XXvda(=Q1gQ}%x2xrT zfh5ckhw&<^SwpQzr@~`#~{fAt4Y{$Lu_j zlDGUiQo$f-FunXkc#0Fd*ZGu*=7)(3#Rk_*%x7V!_)jn|e`%%0siA?`3IG5C!R&Ap zGSIFA^1Br#!julS&T7Op zH8qlA%LXa<^6I2yh@J`_Uu0<^gqPAZCdt0zz@pL$xEpA`3sZ<;s%7kIUyn)?@-Bhk zwOBvOJLTShQ>Bi+>jf6YiM_30 zw-PSz=~`5Es1p=`oMU%G@j=ic?ykG9w#AhK!ccc7twuHFc%6tjMK!e8+_jFa=n4~y zi{r}v(spZTxpEzC$*IDG2Z7WiqJ#r(B#i>Zm zg{oG<(9vxizb@1w?vb&R>h&0NvQ_&u+@K(0Mn`R$%}VAFX7`9MNP1jivDqdn>})fV zKH7xLOtE7}k*4{j1nzBtSH?jV36bGM zMD`T_0GgxJe%Br7yO1V8bXT&zmwF4NWOyZf4Fq{CJPGmcR0FI8ACEOSG%g@`nr0aX z;WVQrMa+H71r9bD@k-2+{{TDbP4*lA03^`EHil)_9C^~B468Pl3%?ow03a|?2sjHR zONyHR0Hd?6x>P#4lX9Z{8n`l{Wtxrp&_PP=U^J6MhPu!I0t{PENzX1DVXVJBsut9| zch-M^02PrrjWM<)GL9yCJ64%Fw;YI_#*(Bd8Ze%sJ$(+)4F#@WchYgIeSCaP<6QorOu|JX?|4zL$CfFqbGFB_V1Cv$}hYrZ*r@SAmO#*aQsn3URQwO#+L~w zAln4jk1nb*S&NPl_%}48qd24t#PLQAjVk%l@R^q4OqBkm1dxejYWxactR492NaYJE zXMw}`&R}8Of_{6d?B^Brzwt)2I^ip+4MC!aa=(!C?n4SN4{vreBY~)LU)?ZEDZ}yw z6vi}hQ}I9`cic%IZQ;ge7t^svI0SUbL0L+EB$Ldd=wS~Ocn;pykQQGsW3DJ^F(InH zR+RxJw?Y@IK9hZh{{YP}%#@)0U(U45l43x_%p5zP?M)-+UfKgk{u6WzG8ukEHD z0^7vfpW9K@NSFa~YnND}&2k(!U~%oGD`bN)cY(3|k@Axn!lyv$nsUTdrO4(GbfqW} zio@{X;TttFr2x&CjX>Yd@9k{8>_cSH! zt=s*2Kil#ad#ho(bu^(7Y@2+eP8_|DO?fW{A1;-A^g(8BwhazN6{!TdSyvTSl`(I0 zu>MDa)NxCMFs=yajL^OoP9QW-V@YXCNrSvMc!9k?sS!9&DW@J@jB3GyW&H(4H8(sz zKhHU#+g;dqJe0N%3q`~~X9{v0Op!E(u8jDz?Yhz%#)OT}K1Wue_+9exe~ADcRZ>O3 zj1$s@W4TR!PtKMp64CXba}v6Vnxwc{(36Ykzyz`-l9aYfl<^)A^rOh6-?);W4mBMJ zT>*JE_n~nrW4QoS(3Vt&uvqa;An3XTOB&NVAc6@45aFZ5;*t{+%4Tg`RS1%;XL?^|xYA67@-UrPFaQT8KnKtQ4Zghc1Mj+`FUIoUP`8gKi z(U1fHKpun3IU^!Sar06OYE6?IO{(^AVn_B-2xoKUP%>O~j!_~JX#P|>0!%xOMw