From fb766dfa66c7d4d3aae5024c39f4b16650b098a2 Mon Sep 17 00:00:00 2001 From: raduet Date: Wed, 10 Jun 2026 16:01:22 +0200 Subject: [PATCH] Add fire alarm handling for DC30 CCS main controller. Latch fire alarm until reboot, block recovery commands, and send periodic Everest ESTOP while active. Co-authored-by: Cursor --- Core/Inc/charger_control.h | 1 + Core/Inc/fire_alarm.h | 11 + Core/Inc/main.h | 2 +- Core/Inc/serial_control.h | 2 + Core/Src/charger_control.c | 8 + Core/Src/fire_alarm.c | 74 + Core/Src/rgb_controller.c | 5 + Core/Src/serial.c | 35 +- Core/Src/serial_handler.c | 11 + Debug/CCSModuleSW30Web.bin | Bin 65348 -> 57416 bytes Debug/CCSModuleSW30Web.srec | 7654 ++++++++++++-------------- Debug/Core/Src/charger_control.cyclo | 10 +- Debug/Core/Src/fire_alarm.cyclo | 4 + Debug/Core/Src/rgb_controller.cyclo | 12 +- Debug/Core/Src/serial.cyclo | 40 +- Debug/Core/Src/serial_handler.cyclo | 4 +- Debug/Core/Src/subdir.mk | 5 +- Debug/objects.list | 1 + 18 files changed, 3766 insertions(+), 4113 deletions(-) create mode 100644 Core/Inc/fire_alarm.h create mode 100644 Core/Src/fire_alarm.c create mode 100644 Debug/Core/Src/fire_alarm.cyclo diff --git a/Core/Inc/charger_control.h b/Core/Inc/charger_control.h index 47d9a3f..ce2dc45 100755 --- a/Core/Inc/charger_control.h +++ b/Core/Inc/charger_control.h @@ -55,6 +55,7 @@ typedef enum __attribute__((packed)){ CONN_ERR_HOTPLUG = 8, // Коннектор неожиданно отключился CONN_ERR_EV_COMM = 9, // Ошибка протокола связи с электромобилем CONN_ERR_PSU_FAULT = 10, // Ошибка PSU + CONN_ERR_FIRE_ALARM = 11, // Пожарная тревога (до перезагрузки) }CONN_Error_t; diff --git a/Core/Inc/fire_alarm.h b/Core/Inc/fire_alarm.h new file mode 100644 index 0000000..17dd003 --- /dev/null +++ b/Core/Inc/fire_alarm.h @@ -0,0 +1,11 @@ +#ifndef INC_FIRE_ALARM_H_ +#define INC_FIRE_ALARM_H_ + +#include + +uint8_t FireAlarm_IsLatched(void); +uint8_t FireAlarm_IsBlockingCommand(uint8_t command_code); +void FireAlarm_Activate(void); +void FireAlarm_Maintain(void); + +#endif /* INC_FIRE_ALARM_H_ */ diff --git a/Core/Inc/main.h b/Core/Inc/main.h index c07b3c2..604af86 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -43,7 +43,7 @@ extern "C" { /* USER CODE BEGIN EC */ #define FW_VERSION_MAJOR 1 #define FW_VERSION_MINOR 0 -#define FW_VERSION_PATCH 17 +#define FW_VERSION_PATCH 18 /* USER CODE END EC */ /* Exported macro ------------------------------------------------------------*/ diff --git a/Core/Inc/serial_control.h b/Core/Inc/serial_control.h index 6d63f96..c7dd335 100644 --- a/Core/Inc/serial_control.h +++ b/Core/Inc/serial_control.h @@ -28,6 +28,8 @@ // Перезагрузка для входа в бутлоадер #define CMD_DEVICE_RESET 0xB5 +// Пожарная тревога (внешний триггер) +#define CMD_FIRE_ALARM 0xB7 // Коды ответов #define RESP_SUCCESS 0x12 diff --git a/Core/Src/charger_control.c b/Core/Src/charger_control.c index 47df153..0b81eb7 100644 --- a/Core/Src/charger_control.c +++ b/Core/Src/charger_control.c @@ -4,6 +4,7 @@ #include "psu_control.h" #include "connector.h" #include "debug.h" +#include "fire_alarm.h" ChargingConnector_t CONN; CONN_State_t connectorState; @@ -19,6 +20,13 @@ void CONN_Init(){ void CONN_Loop(){ static CONN_State_t last_connState = Unknown; + + if (FireAlarm_IsLatched()) { + CONN.chargingError = CONN_ERR_FIRE_ALARM; + CONN.EnableOutput = 0; + return; + } + if(last_connState != CONN.connState){ last_connState = CONN.connState; CONN.connControl = CMD_NONE; diff --git a/Core/Src/fire_alarm.c b/Core/Src/fire_alarm.c new file mode 100644 index 0000000..ed19838 --- /dev/null +++ b/Core/Src/fire_alarm.c @@ -0,0 +1,74 @@ +#include "fire_alarm.h" +#include "serial_control.h" +#include "charger_control.h" +#include "connector.h" +#include "serial.h" +#include "cp.h" +#include "debug.h" + +static uint8_t fire_alarm_latched = 0; +static uint32_t fire_alarm_last_estop_tick = 0; + +extern CCS_ConnectorState_t CCS_ConnectorState; + +uint8_t FireAlarm_IsLatched(void) { + return fire_alarm_latched; +} + +uint8_t FireAlarm_IsBlockingCommand(uint8_t command_code) { + if (!fire_alarm_latched) { + return 0; + } + + switch (command_code) { + case CMD_GET_STATUS: + case CMD_GET_INFO: + case CMD_GET_LOG: + case CMD_DEVICE_RESET: + return 0; + default: + return 1; + } +} + +void FireAlarm_Activate(void) { + if (fire_alarm_latched) { + return; + } + + fire_alarm_latched = 1; + CONN.chargingError = CONN_ERR_FIRE_ALARM; + CONN.connControl = CMD_STOP; + CONN.EnableOutput = 0; + + log_printf(LOG_ERR, "FIRE ALARM activated\n"); + + CCS_SendEmergencyStop(); + fire_alarm_last_estop_tick = HAL_GetTick(); + CP_SetDuty(100); + CCS_ConnectorState = CCS_DISABLED; + CONN_SetState(Disabled); +} + +void FireAlarm_Maintain(void) { + if (!fire_alarm_latched) { + return; + } + + CONN.chargingError = CONN_ERR_FIRE_ALARM; + CONN.EnableOutput = 0; + CP_SetDuty(100); + + if ((int32_t)(HAL_GetTick() - fire_alarm_last_estop_tick) >= 1000) { + CCS_SendEmergencyStop(); + fire_alarm_last_estop_tick = HAL_GetTick(); + } + + if (CCS_ConnectorState != CCS_DISABLED && CCS_ConnectorState != CCS_UNKNOWN) { + CCS_ConnectorState = CCS_DISABLED; + } + + if (CONN.connState != Disabled) { + CONN_SetState(Disabled); + } +} diff --git a/Core/Src/rgb_controller.c b/Core/Src/rgb_controller.c index de25aad..0744e87 100644 --- a/Core/Src/rgb_controller.c +++ b/Core/Src/rgb_controller.c @@ -1,4 +1,5 @@ #include "rgb_controller.h" +#include "fire_alarm.h" #include "main.h" #include "string.h" #include "charger_control.h" @@ -100,6 +101,10 @@ RGB_Cycle_t color_error = { }; void LED_Write(){ + if(FireAlarm_IsLatched() || CONN.chargingError == CONN_ERR_FIRE_ALARM){ + LED_SetColor(&color_error); + return; + } if(CONN.chargingError != CONN_NO_ERROR){ LED_SetColor(&color_error); return; diff --git a/Core/Src/serial.c b/Core/Src/serial.c index 2de542c..3b91e8a 100644 --- a/Core/Src/serial.c +++ b/Core/Src/serial.c @@ -9,6 +9,7 @@ #include "charger_config.h" #include "psu_control.h" #include "serial_control.h" +#include "fire_alarm.h" extern UART_HandleTypeDef huart3; extern uint8_t config_initialized; @@ -175,6 +176,7 @@ void CCS_SerialLoop(void) { static uint32_t stop_tick = 0; CCS_UART3_Watchdog(); + FireAlarm_Maintain(); if (CONN.connControl != CMD_NONE) { last_cmd = CONN.connControl; @@ -216,7 +218,8 @@ void CCS_SerialLoop(void) { if (((CONN.connControl == CMD_STOP) || (CONN.connControl == CMD_FORCE_UNLOCK) || - (CONN.chargingError != CONN_NO_ERROR)) && + (CONN.chargingError != CONN_NO_ERROR) || + FireAlarm_IsLatched()) && ((int32_t)(HAL_GetTick() - last_stop_sent) > 1000)) { last_stop_sent = HAL_GetTick(); log_printf(LOG_WARN, "Stopping charging...\n"); @@ -259,6 +262,10 @@ void CCS_SerialLoop(void) { everest_timed_out = host_timeout_stop; switch(CCS_ConnectorState){ case CCS_UNKNOWN: + if (FireAlarm_IsLatched()) { + CCS_ConnectorState = CCS_DISABLED; + break; + } RELAY_Write(RELAY_CP, 0); CONN_SetState(Unknown); if (config_initialized && !host_timed_out) { @@ -268,11 +275,15 @@ void CCS_SerialLoop(void) { case CCS_DISABLED: RELAY_Write(RELAY_CP, 0); CONN_SetState(Disabled); - if ((CONN.chargingError == CONN_NO_ERROR) && !host_timed_out){ + if (!FireAlarm_IsLatched() && (CONN.chargingError == CONN_NO_ERROR) && !host_timed_out){ CCS_ConnectorState = CCS_UNPLUGGED; } break; case CCS_UNPLUGGED: + if (FireAlarm_IsLatched()) { + CCS_ConnectorState = CCS_DISABLED; + break; + } RELAY_Write(RELAY_CP, 1); CONN_SetState(Unplugged); if ((cp_state_buffer == EV_STATE_B_CONN_PREP) || (cp_state_buffer == EV_STATE_C_CONN_ACTIVE)){ @@ -285,6 +296,10 @@ void CCS_SerialLoop(void) { break; case CCS_AUTH_REQUIRED: + if (FireAlarm_IsLatched()) { + CCS_ConnectorState = CCS_DISABLED; + break; + } RELAY_Write(RELAY_CP, 1); CONN_SetState(AuthRequired); if(CONN.connControl == CMD_START){ @@ -297,6 +312,10 @@ void CCS_SerialLoop(void) { } break; case CCS_CONNECTED: + if (FireAlarm_IsLatched()) { + CCS_ConnectorState = CCS_DISABLED; + break; + } RELAY_Write(RELAY_CP, 1); if((CCS_EvseState < Preparing) || (CCS_EvseState == AuthRequired)) { CONN_SetState(Preparing); @@ -313,6 +332,10 @@ void CCS_SerialLoop(void) { } break; case CCS_REPLUGGING: + if (FireAlarm_IsLatched()) { + CCS_ConnectorState = CCS_DISABLED; + break; + } RELAY_Write(RELAY_CP, 0); CONN_SetState(Replugging); if((int32_t)(HAL_GetTick() - replug_tick) > 1000){ @@ -335,7 +358,13 @@ void CCS_SerialLoop(void) { } // 10s timeout: enforce safe-state until host communication recovers. - if (host_timeout_stop) { + if (FireAlarm_IsLatched()) { + CONN.EnableOutput = 0; + CP_SetDuty(100); + if (CCS_ConnectorState != CCS_DISABLED && CCS_ConnectorState != CCS_UNKNOWN) { + CCS_ConnectorState = CCS_DISABLED; + } + } else if (host_timeout_stop) { CONN.EnableOutput = 0; CCS_EvseState = Unknown; CP_SetDuty(100); diff --git a/Core/Src/serial_handler.c b/Core/Src/serial_handler.c index 4864af6..a186ced 100644 --- a/Core/Src/serial_handler.c +++ b/Core/Src/serial_handler.c @@ -4,6 +4,7 @@ #include "board.h" #include "psu_control.h" #include "debug.h" +#include "fire_alarm.h" #include #ifdef USE_WEB_INTERFACE @@ -27,6 +28,11 @@ void SC_CommandHandler(ReceivedCommand_t* cmd) { uint8_t response_code = RESP_FAILED; + if (FireAlarm_IsBlockingCommand(cmd->command)) { + SC_SendPacket(NULL, 0, RESP_FAILED); + return; + } + switch (cmd->command) { // Команды БЕЗ аргументов case CMD_GET_STATUS: @@ -86,6 +92,11 @@ void SC_CommandHandler(ReceivedCommand_t* cmd) { // } response_code = RESP_FAILED; break; + case CMD_FIRE_ALARM: + FireAlarm_Activate(); + response_code = RESP_SUCCESS; + break; + case CMD_DEVICE_RESET: // 2. Отправляем SUCCESS (хост может успеть получить его перед ребутом) SC_SendPacket(NULL, 0, RESP_SUCCESS); diff --git a/Debug/CCSModuleSW30Web.bin b/Debug/CCSModuleSW30Web.bin index fc53466a58b5cf2d1f3d292e09e5b72c548b79ec..0fbd4d5f91c63cc9731cc1e032ed160eb2581b28 100755 GIT binary patch delta 10817 zcmbVy3w%>W+V`Auk~F=NUVt<$B}oeu0#c!1r7VO3hqj^Ib+I6(fDjb4AY!>lg1QPT zUI)CPEDE~rE4~7;N`+c<*VRQ>Q&AVn#klK!MUnL&NKWqWea^iMJAlS7i55W!scccQ=dE23Ww+z)I3eglwe{%u0tW6AobkZxr_+y7TQ z5B|RZUtVdqO#clE=Ye3da^Td@%X^QSP#WoyDuma%GHOlp(`(ndX3i(p6ibd-r+gGL$J>l=)T@o_bty5{Ssg`unBk`_yh1R@G)>;wMm|O$+O&ozV)Gz{zRE9?}IW4 zU6(9-8uC$AgZ;bc4Lwm-f<;~Q>Defs4ff(?y`=|A-voR34-|0mWLyR+P6ShuFE4Y@xBmUlwWOJ5z|yl%H1($k!;zBc^7a*pnuMn-FuoJhPJA+#ks~==~P{@ zKuN4{=dtfdaV+4Ci*mZ0C-;%}qkd3~mCW)$ITl#Q^9DIzjt4fv=+`!^b~P=D2c8Zm z);r5#@ULFdB1WS0d(+^;`uKk5evoAd zDcEO}&D=cimS!!##V>y&~R{jb8o`r=?7OmB3Mo+(^s`Y>w$H(n!n--*(deXONAUOQ9z37LO(?TQV~z)E-~9+TX#}a%;-$TdS#+BHbMdBo6aSOzEs|=)-k6^v}t^-`wzmbdrx+2SLa>#xQwv&|O3McH(&&_8 zmDUb0jngT4>eNg21^*lWNbqYxCF8G9nVU&S8v>KQ95*s8wd@o>OWOwY&Oa45CUv@^ zYaysU`s08C;X|5UnlCidex;vP=P@&Ceh6mNF9wag$2Bf8&;2YSaPWo$&J zOjn6=H-^#@jR#IcSSRpqJQg??7nEGs-3Y)Nj0ZM^C1nnV_#p6QP*k>o#~UNc`1sUI z&ooNP+K8ZRh=@v0wQo%dtZ)O$=i+@F1sj>)DCBkbMe-fnFp>IvUTloevxCg;+c5A) z<3#xmy}S!;0+`$b;WWtj9`b(+-9AL^>rqzo4UW?Douq9Y_S0N=%_ouW0`>!*<`=Pi zDHkfF3M;V~*BZ$EkAaJ3N*eZop^p7?het)!C zggG>O@J+&Vbn)Ql-S*^^AFG>h_{jUpQ&%DkU2S;vvE`C73ezst<~DRK7HQkfO$l*` zGB_;C@aapAnT&|rSbarv)#R$WVtJ4(STxGzu%Ts{>)bwRZ$+!5^bCJ=Q9E(8LmXms z=K3^4dbe+(?jfg#T|&F#z!$(ufXQ(I9^gfQ>DKo*=cXS$a^wi}HCs~X#>6~E$do$hH7})q0FIu$dIjAWq>*=;(n<{t0 z>TW=bXW;>#;vSE+yG|8l%01^sfRR z0CAx1ZK8hy2m&uR6a94HB(Mza>KloL?bWID=H#Ni$b zceUV-wU;39uHKUAdl5hz=O z^ZaEvPBLvbCj;n@-XZ#T;4+TJAuytfxdd<*ExllHa%bfGJxKC`phVEo~L^= zyun=|X*28T;ZY_bO8+@(liM88?P+Y)nDsTWfazey96_IlIW+=>Kq+7brU7LP&2Sql zwDN;{vTN9_WnW0&BJC+_)yV8>(24-P7@>Pc%^+E0CR<{G3t`D@!SG&=>oLD&aWc5m zCsj*(TF;i*abq|z+YLoe!Kpt4;fH{VW|JdBey}RHeV}*m&mMQLm+8?2JqeisCQ2qI?qDM8)lR=aP4Z-n$uD9U%W<( znr&^QjrCjXLRhjCm<>fH&ldEjpu}9HMnG-W$SKN9`o!qIV?E)4GJzW|iG{!ptEPief!Po^0O@~gq_;gPIlU{Xz~(q&y5MIgs*ONO_Q}#lk{&>dE`Li1kSk>k_GQAK2D# zwlv#<)1q=W%J=c|$2Q$*qMQ$l%Iy%l0%BL7Lt@kWmh&ZBfpd3#n0Y``<07s~hHoJs znBF&^I}lBKEN~2MiOuAOd#i$IFd)cb8fBxi8$rAcf^Vx~uD3Qci#HeB7osHK5T6>Z zM@vJh;;qsSqmZv}EcAo>NsQ6LsbJR?cI zzHTmZ=r_1&nxg@2nBaF+%)~n;O8$nm=*+J4+|bh@V&V`A>k! z$R9yE2gthxz6j+~qz6&9BXuHO1k6Q#G15k)wvlxVc#oUTiw2AFc zJ0x&D$>kAckLNMuOm6uJKDjppALT-JLF}tZu@Cc_SCV3zLK=wuF6!apbnOoyN{j^x zg7-T#5W9}gm|c0qb3d=|5xkG9xgPTFPs&@t<*iA|n-;nUZQP z{$(f|gQ!Jemcp=rLUNaMClUma4RvSXhE9z^G_<6XU~R&fPz z+(Ch!?PD2_ExTRj)MwODG`*@1o`Hhg)n)sJ!aO_fU5L&{#fEU+(LNh*Tj3kXRV>Go z8L{R0`f<*I+?*M|HAd}KX2D1ss(QO~93A&&J5Juu_CgOF{t{M`2Y>fwaiJ-`45XMz zUm8*tI_Mz$h5Iyq4FtY$-_`z=nJ&BMvgeBDV1|c)ZvkeibAe09`;cnt1^r+EW}a)l z3HHq5(r93Nlxf!*rD@~)3&-g7<8%A}EliYus419&Xy9b>`J@~Tx{fUuq%_vkJH{Uo zH>k8?!kW3`)tuV!rd&_9KXFQgH<{%0nk>W`0)PJLIwR6?M%3d17s6F36-#vGjg_4W z{FGoP1hi$x&^q)pSx>Vj4ii45<0iVxz5sy@mxZf#D8xeX2}s#c*>#~hIjVTzwRkkJ zB0`mkhiV!@>m~<_Eg`1M>|`<2$f8Y|fbi ztg|Np7JM_!Zv~#iQ1{f+s%n>rOYQDzliM6sI_>h3!g!!Z{7h#Sy67G4?3Cmx`RI3K zVLJABG>{cN)0qaZ9Sx*LPjnW8mQq8WVPzrO-nj#D)l$F?RL{kO2vQBw#K9{le~XB6 z9^X26mB;0+>lvgHcX2zNSYxUDvzm$p%T)!%i|1`zyRcx1fU(OI*fQ;a%-vk>!+SKi z&u3!USJ9Vi2Ig(=eoSI~YhPyWCl6)l4b?5WForI zMH6}U=1Zb!d?N|UL|Ru{U^@;`XETX8*aML~K$5KmWe|p8;e#T!%F}{krL@-8GlLKH zn3^%{m}w!-Wdl?!p~q@(%yOY63wxNvok`rEoy!ktu@GF)5|q9dn_>cu+dim-(M591{U`tX$g zR(#n&m?8N@2t=sMgZA!ef!=3trGK4bvM%6k8lS}3WR>|L_U^`p%Z5tk(X^>Wy&HmT zf-kEEEZQH{3@h7@f^vk8o!Y1WB=+oZ)y0GLV#GFM%Clu;q6W{S4@|WRE9t9K`x&+e zSugDA@JaM!pGP~Uj&ZZY zn9c(q0L(b-*4dUi#Qh^;Tl`LIn#F@c{dyQDv6 zZ+d!7zUPI;@%$*UJC3PR+1Oe;_rx(Zr#O7iVt+1vg@rUct-w9fQQt7aF=vTMF6S(N z=PVA+Qq4OMY+2}Fj?2_E1g9Pgs7$hr^B&>6BRKCc{yP+kH3V5FgZw$kIXxQ1)$JEA zXM*xFo``zKA(cKly>iscQMNpZPh}dcAKS=H*w8EpYQ(xS*ZUAs<^`Wa%GP@+=xPrt z&e%BYUsyy*5u_9QmetO@zu_X0X5K5ABLViQBT>JY*N;Oz_Ilu}AU!z4EPjcv88dom zA^}gFsxvAKze5aLzi*O1w7P}1~XLX4C<i>AZnrZB z@XHYo0K1^Pi3@Dk60i{$CP%BwM<^jBNm*UO56cbmPeAPvytd^jh#V=%nFB5_&z@rMZA-%y^$c1Ia# zN)El;FwC?(7zunFZk)v8fFD>aa2pOpqz~oMs`(|tZn}8>W4+3Av0oD(?Oa_S?aFg$ z+JepEldAW*1%*=TxpPFn_y?kYkhU&*R?vEHTKtAad@Jk~mtGdc-Z5`z*@Sd)f6!}R z?LmFe`{DinomyL|7xX=W0l*UA?*9+;L7VIK-uE7<%@7aG^Xj%31#xARnzzo@9f!+1 zJCCm4S|$4C(GR!wN8$1!0c&H-})I%MbSz#|P=ths)frv>4!Co5u_KzX3fape0ZNqY-P_-?I>931X`! zVO84c__U04oGZg&Xnwv*BMUw})5c$Rr8=I+Dwz@3+2Y^0bSP=~BN^PjVr^scnYL4QFf`c@VjARlS-$3XUuwH{}syZDqZzmkvMTb z-T$d9{v3SzNFM$WDy5mwTsch^WQ^7o4}22mlEX}@B#RSh6=`prB&k9{u(P6>6l?1= zvR<}1gMlA|;|s-hn@ieT?5t>A$wq-kNWGjb6RWmvkkcdw148Kk%2Uai{`)@)`Z+K% zcC8?~<4B=~C{1yC=txPgS=jttn2kI>&Er2cA1$Qw&i67B{1HxJZLVv0%K~Sfvy{KX z5~X85-F)8J#{<P~LP9Gr~MXLyE2X#Z11sCghlt5403QgJSD0$fZ0=8#x#5bvcB^LFj&o_`0ekLvpH7Z%RK=i$5xx_Hl`D zbHfxte=l&M?w9!A>h75;=zj;^AxOLUwD;RPW(WWI@Ie=!Z!!4Y}_l|k=_yyd`$;_e}m|a)A`>I5?_kb$G`6-#REI&@4p|4 z^aMTe{cvFy%{(`pia(UQuik!YU{Ltl9U;kv=D+M?Th=J!k1NcQU(+NE-&}RM-OxJZ zJ7ru7`p%RsE!i-CWgNaJwhV#}&R{=SI%+l$WxM)Nl};9qzkP06k4wib{0qQ)L659& znJE8|-}!cx6@T4S+BOVB92rb}AQ%_C&`Is*%7hxa{M;mA8ErXty}L*)-Me#Bu_8(1 z5v1?juya$N@vm<9tdkHn1|4@H*>ECi;HFQm&y79M6rrT;p>3E1R0PzN$y5=FC^C3W@S+#c zcSR0fp+PUma~^0Zy;2c_ii%#)R8T>vRz)LJy{EL2q-m4yzfW2~-~HZu-&cO?>}l<_ z*Is+=wbvfPu_OG^DDNhO8auxwnr}ZRnjZic0KWiQ0OSvUzacN&mEVbwenB+F-~I1F z3H&jD$ye*$t(k_zEr2CmnNMCV{J#=^|9`;w4dwJpq8SFbmO=3bnpJXb#w~w9xVG%t z_`_Xzb=Tm7*yG|i)RZ@uBSt2vW6P;VQ^z|pYxq*WWM3=sXb!Xd1t@1_ypR^6Rx%{g zkYS*Cl~ZbSxTn>kDY=h(vd(>R*@77t3w0Sj7R&V0>X{cO>vX5-X<=-$p?%EEFCS`Ur~zlG;Rkv@RBWBSvyce5?T~zK~q#{v@{DM~%dIYe*9z zzG)%NFR|d!*ywBWe&3w-N^_jt9M>>IB8;hS*0|K)NNUf|Qa)eNwq{jr^TJuFXJ%Y{ z$5JSf!orI)XQxPHhNYd8GJFMg)aoZ!Mn7!I1{4)&d@Jx}n4zZLDq91!6x>z&kc$f>YIocVqG2!l(M z(u8n#dC!Ofs_-K60_QrYE(&|wzKa~?P7aR19yZId-XEA ze|w5(lskx~Ctv_z44@b=8?Xp)Xstn*(dJocDp8|LW1He>va&DI+VJqMw5Ple(p-38 zcX@eFq}xN;-Q_o=Ably+OHOM{$w)PalA8`?%H+vp9WuTTsk@33kUAF?me#8)Gpfw&&= zO2ku}^rj@l??hbJq%kETz8G;;6K7H(ep^V~-8+Zd5Eeh~U6L`cQ&GZ8H+M2MV`D*# zI-VFu^Wu;U0j89Y>bgg&$-a=Y-nq`1?+m%3!3CXJdrw{KIj+ZSj0GP-m{} zD8D>kY|glq`>sPQ>oYWKZtS4*Ac~4WAaj3)V3f6o%>*4UZtJr!^{U2}gji=5@S@5v zFZCkG$EQ-NoV}43?=d`R7}3dD@)vTJ^$VeI3)L+~=-U+No266KW)9U@L+Q|`qL4T- z^8v%h9R>ddHv_nDcZjDl%{fZx0cHZ00UiUq3OEip59k1-S5l1)P*N$*%D##7aN^6^V^e#Eh>3$HB+G3P z->DSwQg+$c(;$8-1^gW#`#4ADnhXIG^sUM%ET8cl3$BA*;>*&UD0OAXllK%~drvx4#yR2~vvH$FJ=9MBlKCV(2~-y+-&{;C1236(=# zW^gKDD{hr#L;XbB+Y#5z^L*`{rfkan%!^yh16i=&ygaM0Be5yXQ5)h$d-ofJ6h~T7 zc+(B$41trzc8C)!c?@s0r9ZbOBJQ#jsM^%T_?ue%&XRM}iAW+w>Bk5$D@;1X-jA^F z*GN-S55x{f*!K%Ltw*db!oHu#_$i3J7Gd8HV4yW!mW=4R0&&NH?Y2{4VlKJlq^qDM zpCCS?Ep)?5#E;4GlJXUZzl(T=X*ptt!{UO020lHMC+->4bJhZ6sX|cAasqQmWOJAf z^}HEUX^+8(%lX`u{2P$}Ys`s!7=Ia`hq|g;Se-JIHO0iHfxQ$;>10f7A844Yl#a$` zv=uD+clcw0Ux!jsc(s&GlsL6vD1APb!MIei#bt-MVo>iskHs>&c)H4K7D_$h-v?#V zd&EP7`p_lf=Yu{ixmUv!WFr)0jgyz!I}SS6yCTkrtF|RJDb=rs${B=+E3GKvOl+dk zoOU8*gkr%p9kJkx?Nmw+aniFPUi!L2{5hw8);~MeIEO&P)sTV$t9&F(O@uA^BS+ zFIhXNWCGO1`jx7U!0)8eqp`k@%uP)Bv*f(A&OQz=1gYsGCv~0Tjv+>O1RZ}AlrEr^ z+rwZV!aWqxg2u%tk+y)BJCXZhC(HRZN_@Wri0?QiKBBL`+ts|EugN>iOYgV8->NL0;NXU3IMe)! zVZ9r+iz9|Lj+(>j0Y(E(fgeWa7{Vq%2Y~U`@8RYfP8>geTviW_IC1!d>7K6DB^G=Q zLd)s00~=x07;`=>booEke<5%dU6c&#S z&rz|;x&-m^@NDkMsMu@7L=LH&Mi{xpQE|J}ZZZqd{6t|ZX? zIV3)48_R9vYyV*@p*`k+y`-{}<@zRGnl2`e8r+-l&icUmcgNDDOLxdJ94?765Y zjm95($9l*{vU>zs&le!i2{1yFZGgpy$NA8N#kpgOxXm%~nK60XvY2>!OvxNZf>mRv zGiBu``zBzmCRW~`UqUcVS2X3pYVlUSArEP5_>QL0NK>T8AZ-cX-ehykU(>^S^J)6* ztdK<_KJmq|S$)R5K{VF`iUHFAHv(=2ED_%s>*lKYTKjeDD3_HgzMW@wR)UN8lpvP; zmBg|haA>8%lz??&UqoY4BYY*IgZH44UWnxP&4A1G6jt``RVhohWDiwy`#9;N4o(o{ z!A!RnTzc5UNk=-wf^o(kFVz#xS%CUYq8TUNJ?@*-2hgkwz?xqMxIaO>ZM<>Bgew~V zhHUS!HlvW_kb-W@zTTDTN-PuY`UZtmFTOT@v-?=sr0D`I z1FQj50(JvD09zdl#yv{m&($fV%(q_NuBqp%ZHE;C^J>?^<+Q-%)Rhhq6h^W=8r<2z z8%^l*o|pzQKNlrK1Ae}QuRi>ftw1g54;^%a!3k;51`yZZ1E;CZ;Lr(wwx=}=uC4ja zt{?n&4CL(8+oTEgJ*GGJ;UCS{YF&+mT1S7k^z)--e02d%srx4(Yi8oK^Hz}uM zus~pdZ80PAUTA0E3HToVDO5nEe)TYd=B!dS`O<*N12a>`+$LiV66+@Pvxg&tg*-@u z$|Y;$k{;~`?BDyl>HK<7Y3?oj2m{{+&0q{JM))&$c@sS5trB}(Kh*tMEJ?NiNmyG9 zLQ<&~qOX>RUg_7!^Ii*Khdbq^)N^$ijrW)lI>;aqpe4qVRcz&8o*^ea0ek&imuFbe zde=jov4WLz_CMn=tN~Q+lIK@u140+EDjPUyCD3;OJstD?E)aWC zCT0-qmy%ai*%KNcm)YCOzF6b`Du-L-S=p!I(JNG@gUTjQNd=V>P z!_6$4r;Egc@lYBAvP8x>vS~>lpRnOxa+Q`yT&}EIYI|t0Ph15-hpidJPp9M$k-V? z79seKaL4+~jS%S<&w3CpkS=(#9UR1ZzA27)Ai@DLGp3fsS|FY6!u!&bF5`XHWb6^Q z>IX0z`y-wMcop%X2oFJN7eiUAkzRu^3wc`+9zp&G0Qaj%e2B;qgzqEl3xwnFk*Lh& z>IjY=gN;#W30nmG>kx8Qu3@c%2a9WDmWZ_7vl=mjaGxwE(!Nrb( zqUlzoGlb6I0z8|B=8gr_=`VAU|Dk(qxtNZSZy~_gV_G=Mx7z7PMwnA$l=BoP@P0VCf-G8mgVjEXBkZi602?MLYmuf}> z*yz87K`uhvhWH$W4*;M!X~sIJ2y^l}gH=(+U42wsS2&Piv7Wt+{DQnA`xA1ie4HaU zq$e{j$0{qQbgYT5aXkbo#l(s!R(e5va>@(oH@{_tvb^MHYn#%TQQ8^Y`nEW;r2oV} zy-j>bsR^l6IhBu%ZGl)+F+4WB>GzA%%SPv?m<=0-5}QdMkF8xhQ(O!^k8wcSm+p+bPP3_C&4J@C5u}enrH&5*W}&An>%AT6=D|XaK%{?!z7C|wc{@8k46s^o_75_0 z%qd}gF405T?xz~YXkJpBQO59GKnY+Y$`%6(?iU}NYEF9m;8njSuSf0cQ`2eQC!x9Z z6lcWmhjd)tVU_fASS>gCapdQKqEuPJTsR^r>v3L(KCs4*fnexY(7%yoVagB-+?z{508tDD-J$u z#RX;<^K2LysR!1Gmu8shMzQD20s5+T)`||h)2-}`ca2y!bE5lQD``FMskSD6<+R%U zPNd%V%(NEzXCijQgIgWxc~60Ln7_WMIzJWb^glfDb=v1Anl~DL4|n__{m1fa)19ba z-ay=%F{nhO{h~%vD2j) zZR=KX5x&(RxJNtYmFGIbv+tfC-SEbOY7Bv&-7v0??oSrZ5hmT|w3acwg0 zF!?*ADHR)f=Dasy#+rV2>_nxbIA0kOV_iwGCd*yvBU)#ToN%C%4NUh%$YP8go5X7{ znVC;<1Y^p~?kR-w($uAJ%TPWyMf}^WO`Iws8fW)1w8QJsK=<2q&Bwks?tfO`|e)l+u?oBZ89i1)Y@=&*j+ z4|Wd$>+!^{96@2{uG9~>y`%hAUMfTkOJ|sTWsR#d828)*kgWX$}1rYDn4|j z(Y@lh`F-hj@#gshCTbe@-aV7UIxk3At2D4IY-<-dN zYM+KY;!A)y{noPNRb5G@Pb80ukz4cAZhB1ac9piJikELK)As91PDraQyRDsa zeWRk_oJuc?qI0sAO`T#-We(n58R)IN8|D+=zpj@ntvE>kW!R$I2bD3Q~&*KS?wQE=Y&+SCVM zPbh0vV>1Q#63|COHU0iS-~{S^tFF~BF{f2ygt1}0q-XZh3qke)C8=|BH6@&a;y8E_Q_UlV8fcl{y#O6{2EzR_ym z&!d{#$5GAq<7>04w<}Y&MYK(8T%q7!BPu!EQu|)rA*#L{-i3u`g!u3q|Dx+_?>jhx zDsK%FUx8S@tat5^`u>y_ia)%WPX~ymLtgqHwTBPwrP}qN`@(pc_ML}ELAP)?`u4}D zU*WrpQb+CQNAjrKI_!cprLS-4@BH zIoKj3EByysijzqL9m`or6K_$!tk|Y{`NRe8S@`5*&4Lv^VSe;r%amlb(5E5AdsdzF zIcZiU5Hqo`o8`7(PKT!EL?~;k&8+r1irv{K^8~fGXVuxvG^YkK(ezX}oC&Z3inTe8$o7%I;Mf^}r@KYYV1R!gZpVK7%&SUI?{ zM~j;8D`*GRM1q$Mf;!SG-8PyF(WyFN(a@0s-xAAhai6n|+@8&cXqH8oob`%bd$LDM z0`E1vYTx7|7A}`B$}sTN(qZfX?xG>O;+KHUVjKDA%6BUHzAXXBZpIVUI-xP-^7In= z2}<-n*ui6RX~fpxrWmm#iKoG6!d7*zMN;#8i-y}C%GiA>M5>R4uzS1UCYuN2tx2MI zB9!BSfgRO&K}(NbNZq{4(H8t5QhA7_S^f^BcSmf8m^2E6QV8<#h`wf+Wn-w&wykWN z<4uVCG2d2UhrnBANF>2hZj}_g#hELZn4|tw^2-Fan%WAat*jke3X}EYcDLXV;^ekQ zN@^Uie+MB%PuW2qBkXpZ3@mbKrEloGtVsfNP7BAS6*UDcu6auJDNBW27zyzmoI-8ZhQ)HD z1((iwPF+Z)Y#`c#N83qGuAf>M)|fJeH>vH0eT^4-0Ll_B8XI*J}Qd`cxgch3cQ=o^JSo6-s zo9olnoPjkr?v{%@&ox+FXVhQ*p+PNcP>aSAdwA#DXBX3R4nYL{d5peW?%Slc(CgY3 zs{J((i~Y;J3?|V9xED|fSOeI5cVj4T_w3>qeY2q>JB6|5Ks0gi#S3denA>}|R@~d1 zz|Supd9H`Is(3uQ^p*O$Q$4&dH}eTv_T_h??oOc|Pq}hgT}`~Mn{ma8S@ptVcW@m% z6PdFv#$J70(?T^r2d)mpyA6AOj7vbfEiTfk*R@rNEi~~^V5Go=9UrhG4gc|@w#p$( z(O$$b-)q?TBkRVSEi{>)JF6c1IdxmE5}wqy`t{$B)$-T7M_Stw8{ZcEG<>9fwg85> zZmrNY%m*{qGCW6S*k9aw)*(Q{xuzdkZ<+X+`q_nV@h!VDwAqu|Cdd`OcO~zfZzwF5 z&UJQG=#$VEs6BtYKfUQh3D!oyt$%=jm-kI6)g%IT0=n^OSv=12yYu#x*53AsKQIh4^<6 zKwp>WNSvxGGYST$LTr53V)i4KVKkx#6fGV>i=QKp#Sh7G(fr;J&2K1XsN(peg6-Z| zVb)u|M=e$-8QSE>H1!%P&jr+VL`)O30u{hHoY;?Id^MgPMs^W#)_XIPsC08k&S+Lt zS56VDkEV+=-_KHTcn>F5zTZFlJp8F{_zCgKDeND-t&++q=cxF}XW8P*?`OID)ujst zA;F;(GF_)#Q)|=?7{<}$39FzgrBZg3O6Ow=N0!iv+nZgG*e=NYCBT<}VHbik_zGQx zTG(rU@GPCMmynipC2dL95K-B@k*DI^P=DKvq5ejSGyeUN*2|jajS0g~ve|u9cwIOt zEO3Vu`8)QjB4l@_j?<~|qVQ|1GM@e0_NN-=6(LS$TudwT?tib@T*x=;3%BjJU*zrI z7SFh7aZC>>tY3ddyv=j1_0+4#f7)&kMx2~bo`=C(-9d5&oMo3=bAi~Y$M6;D-fz@eY2*z%0KUT>s$1IGy;g|djT z{$Hk79j~&}huDz|)P29&`JwYnD9hHzbxX}W7qy55WzI*PCFsNVc(21s3{GqIKCJE3 zjO*M&wfLeh*V!1#^6YXP^o?@nUexfZ4eTn)T$ScL)|$p!3W;>v!~MPAgyuX;aH`^b zSlhz$IK(~NctK@3aY1Kkyr7d;gVvyXZ>L(ATSG0Za({1H&1Oe`#J&mjf0jr^htpr7 zV$WBISOP1hvry@Qj$^IboA|9{_!>VW(!=}wrP$c_&}gCLo?X~hke2#XAAy+HIa-4^ zg_p^X_F97pk?z>^utKm2J%rZalkF9()NN@Ew&NBm{)(?PI1vb}cy}irTEe$u9$0H| zerG{V9>VqQ%wKB_mUfbQI;q!)Ij0#DP6yxoArE4pC3KP;haa+TCJ^i+P48wrb6Ge8q}qxBsSF5orod`NXEwXlCX-}(h|jC{#Oo+#RR zsWq71PR)B-LaXS+)NS{|h}H#?w;l*6yk|2N;(EIlEho9fcTkWhn!M^}J`qa-Ppum9 zAP!DcP4RqU&1v+)JHs0YrVWI{6nok}@XTacN5s%W0?8?C;Dmxp`%?NjPW?zM-v@~0 z^8oEnEQ#BVB3!3@VotT32pOwQ+s?|ZwZWyJiSvaMA-A#mL}+8RKR`#$A`O`1?8$X` z;fh5s{N=Mrwa1)~=4|<3Qe^GlXQmaMob&_cd%jacX}@@{yO?M2S4y6 z7Q)tGzX+xcRY=K-C#KD*Z@i#~wyJ1rFipmo=8%Uu4D!Oi3{}eK`KziJRmlY=)&_HoA{1kRkM$Am* zRzZI)Fd;;G)T5D0{^B_VM__cL5!yXiScdXF;RS4lQ#BkTW*u6C!^3QXwFb9i;x2Jq z3Vsz+3VT{+t|mk8WNl!|Igxt;&s!2%P0J7=*NtjD&`^Q2;~|DJL{MQ@(;ECCk_Sgx z2QjHe_XGn+F5SE#X#{DVv%%4=?I=@>HlfUO>4!Lzt>1cdXh?yE1Tc6*7ds~-tRqVw zBK-#lChtwcii^C43^EBN@crF&F*1xuhdm=|_St#=I63o`*kCz)Ay(b=om%;MT+Bnl z)Djo+!T>jLN#LNM*|jk+$dR~{Z$8S;zQ9@L6p_Jm{J7sNZ4F-Eo{Q&Dmx4FPZbD!6 zly$B(crcLE(J%&SXpau z9`XyM1D@yYliDibM(WX5E&6&cM9kgIsE|GtVncHj3e6PrCnzSAb`l}|3kb;qqyw5J zjTGED;OFg7oX527aW0q2T$WztGWeVP?ASJjG55Tkv5GZ}>kkI?^mUABKrWBh9t0K_ zu@bQU0$Bg@nz9I-?@4Xx`_i6Sm7ON`3Q_k2n>FO0BIGwc1FqM}T)!2#i3z6|BiUvD zc7$7lSrHG!8G{@Yki!z0Ii{+Yf-gihEjESbX)xz_zFDhy&d$V}+i)qkE6T9r7WG{F z5zMA;im$cnYceF7>`rPZ5%`@%s*Ms$Zl&2vuj_|(fXxNRL)p%f?+yyNLN@!+#jtTh zR1H7vJ2MTd~q z6P{E#{f>vflv}9XrFcf+uA(MGkz!jyRf%9IO4x=cOqeuFYZAahLSwBRYn`B|x@`E& zz;I3)@D$CPSeqy__n1 z?GWju7{8U8Wc~j+n&eergFvLy8w~KZSY}nsh&)_KwEo?rLQ@6OQy#UKt#T|bBF+}# z%pRG_+!}?K=3+^~H$kLWNs?sN4sNhiD4PGwXH?)BX7oslktBFCiu6)HXyHR1qXYFEdD3qS2-MH^2ju%kTiBlNm6ju;QH2%UMg$-PM%teXqqmmY)z{ zQ-Mtljdww|*1Ol9a5gKGSv}un+dhR?Q}v92SgZl9H>v7-gP};fUGWU*4-3D|6kubR z_;gO7F{Ja{5YSffJ7)$?$Z=v>8&G-g$5Nyf*9JttqADvlKG4}kY@oN`TC^>oaeEI! z_{MWyfpL}H$ar+O)x2gB<_k*n2?n^63JUa~oaj-B-mRK_MNsG=b@RtY`E+WxRm5@`<*2{mHJPtSfutP&Clr1{S zjoLx7`T#Y57trh^gB53uJ7{47z}P^B{Mty({LT^q z{*6=>1zTJ3NC%Qqc)4>;4PU9h{(PMEtA=qFMu$yh7@eUsf83Diel~gC^anD8Zyaa+ z)lYLj3Mi_yJ8|ALVT(NnPLx(AOr(EyU~Sk6i^tE9v>aO_)D76#bf_Vnxc+0DrGt1O z##}b0ikNI2NC8rzU|f8F`2 z;ujm@BMoC?d+j{)Xy@+EtkJe;c;=+e6ne`JxzS6l?%?p(le}7y8mIjz>rn8_>o?&b ziQf?m9t@Kf8_%=_){zs74>ZP^WHT)3whn%4bAWj+r{T$n2R6MUZJJw78KuiUXtEpioN~ts@EZ%g?rXbSI?c$bWkKy6y8zIr~5sRz{ zi7$VYjR=1Ja{QwOifAw=A`bmHdu%jV*ZE6e37WhMumTXaQ_aYEXx^niK=X-JbgIAF zUa{9s&uRyA4f?l;^w+mV&&MS>(V#JQ*YY!J<*8RTS1GwuFWwyueiD0Sb0$uUtQFq+ z!SJr(#o$fq#|AX`Modil=W0YeF>%vBA44QBCT1MZMr2S-9DjU)I~r^WtA#aLUo`xY z><`gbHqTd0`mNu-gdN!d9-Dw6Ag*#KUWx|q>p1^k_)ol*YB&cKGBC#mV57@6i=wi4~BCo_@U4T zHcp6&9Un}kUy7w47AGADZ4W4&UjXSG+cqowk3i@tQSq<-$Iyw!jssyGPTpGm3zz%V zic>owo86Gjrp_EFK`gi^wrIIh_)2~L)ZWcr<+pO#`p(7xEr|wKV^4od-l0c>E4$*A zbsto)m25TkZZSN!;e@7gWBpyG-i{2^@N{D5wp8W(!1-fEtLxA1n(r&lx@Lz4kc0Kq zMB9~@@9Aq4w!zd_bUJH*dQ(!92|xLO>nJ%pzps#-XYmm3d;{cjm~$0|1{jIu$OS$( zh|Vz=do?tIF`yK5T@1_v13!U*$4weX0vIT`!oY-@<_h;h7i-?EH#rMK=7P$@-9&KM zJ6R1P+1Lj6sKCBl2RF$^Z9DgK5n7(DOVn`@Rqp2fw3(m$upJw1VQNT``SZD?+P$t< z?0wFayRelWi60QeJhI7r)1-6g&^+xlS17Jn%&0rq++mWRfIb&15){o3^K{H@Xj3n=8_z?dTMp|E|!?XQZPz~FhQ(thYI7Q)5pqGz#P)kuc zU(U{ax;w#+&wC5niu{VrLY4hlU%rqm>~ss)SDXpycOP=Cbt#**s#^QQ)!4y7a9>Al zSZQXo)vPRVOa{rN9XKFSSg?gqG(VEGs@QlEKXcI}w4_r_^TSHoyoKk)=FFb?7K!H- zxjnBtY|ry4EL7yY{1cDbb*IU2zVWt@;(B7e(XT33%GR$iXcHPe4IZ`y@8p$ zS1}U5ZraKYK8J1QQKC*L=C1{5l115=xl<>(739*tm56)BuYonPV<WpSAv~^xNkX$)`}s&Xh^)*EJsv5?W=93#ZhfNP=*p`%!$Ppqw3yL(Bt*65A@MEEq$tF8czBRV%oQ1KNb76Z)u%xAi70G zN16=?`v!0_BxzEeftZ&i$qHJNPP*j|BQq#iI(oB=Y zQ~vrFi}QTMlvo7neRtOME`KKQqX5Zd_G{nJ(N?6Sn!Jug}^LB!KLJp7Ka7WxwZYHR_%=+VT;kDrm)SEM#Y0I zgzxWn;eIL>e7Ljm0!ckx!!`~a4w@1R-z`{FPPb9`wK|`ZnmO~{a&!4>HP2njEmjtd zaUN+I!*(1_qrkyPRQ|cV{6c`f7z>tnQZF?xDmU5!f!&uz6)2h?;%&|hxH)4wk2Kr$ z=VecbnQLYhYr;uzhN{Ejk@rUBYz*(+JW8h>M~l?}RyahTY8L$eK9_@f9i^E3K(Mg=y>LSg_^IA#fIs zh6mt+iY*}cOo(HpFQV zE(iPlFK~``{#QEJwxf;HaQ`1`qot1TaBHWzOa7SaoyfE8u*@Vi&Ix`u_Im3Y=Fi?2I9BYFK$*aQ+^xy(N%*+H` zKX#XUJ|h+s+Ox{iT)Fj&oas)c1bKL)X@65}d*A71-rqyjw4T0XuW{6*tx0sIuF+>_ z_^6SCPU(e6V1-0UD8LA2fZ$uc#JNW@;6Om&lWSr_6lb=WnI$v81E5AN-V65|%$U## ziZi_|Y|V(-@(#ayS8C0y5NuF=4xF};Au~<}WJYc+fI1$ecyoRWJXltN8gUZ~-_9QD zuipWuq6xi<`@yl`XTG=}%=F<}5$^7|b`atsyd3=NTeZ$p3a<8nFLr5CN~a5?V);@s zee!g&ynH#ai8Z)8`oPE?>56#UkUX`xY%)vSjg+ z#bm_7`zn?#9&yL=`-a`SV#Tsm!k_$b?`(YA4; z#ts{K-N-Q`R^78`#PTKgFRNJC9U!`B#HxE2v#iDUt|%YAh}i$wl4Y39Y9y{@Q^}I0 zcN7a#{->tpmfinPP2XL4&yq!GyO7MBF}rjw8BXx01oQ#?i6uNu*R6eTa$)b~%DTFP zqVQXI(gl7--n3DDZQ+vpADTD8x60i(qvw4L72fGK?pOV8RCr+@?c>8Y7j_{||CD*a=+3kkA5f=Qg%l0h7t=UK4 z`U2tTfxq3QE9_>}O?IDt_~y~83(2wRcijEXD~06xC!FW!ep^`ZSlybw`+645{MUD1 zoHsa%wtYTL^{M13x?J|{hupBbq61H#SzEZ~Vi7TR|K+g1?!?t_lm7RAiYtFC-wv28 z|IvT*7q4lT|G0ni$I6ZPA7B2=O;w81zj;1`-IMNyDA0X!?X4