From 9f9ceb0519d6d31f7f30be5ab7cfe8257f3566be Mon Sep 17 00:00:00 2001
From: ShadowLight8 Dynamic_RDS_callbacks.log
- Dynamic_RDS_Engine.log
- Dynamic_RDS_callbacks.log
+
+ Dynamic_RDS_Engine.log
+
+
Create a new issue at https://github.com/ShadowLight8/Dynamic_RDS/issues, describe what you're seeing, and attach the zip file.Status
-
-endif;
-
-$isRPi = file_exists('/boot/firmware/config.txt');
-$isBBB = file_exists('/boot/uEnv.txt');
-$dynRDSDir = $pluginDirectory . '/' . $_GET['plugin'];
-
-if (isset($_POST["DownloadZip"])) {
- $zip = new ZipArchive();
- $zipName = $dynRDSDir . "/Dynamic_RDS_logs_config_" . date("YmdHis") . ".zip";
- if ($zip->open($zipName, ZipArchive::CREATE)!==TRUE) {
- echo '
';
- echo 'Power cycle or reset of transmitter is recommended. SSH into FPP and run i2cdetect -y -r ' . $i2cbus . ' to check I2C statusStatus
';
+ }
+
+ // Detect platform
+ $platform = PlatformType::detect();
+ $dynRDSDir = $pluginDirectory . '/' . ($_GET['plugin'] ?? 'Dynamic_RDS');
+
+ // Handle ZIP download
+ if (isset($_POST["DownloadZip"])) {
+ $zipDownloader = new ZipDownloader($dynRDSDir, $configDirectory);
+ $zipDownloader->createAndDownload();
+ exit;
+ }
+
+ // Check dependencies
+ if (!DependencyChecker::isPython3SmbusInstalled()) {
+ $status->addError('python3-smbus is missing ');
+ }
+
+ // Detect I2C bus
+ $i2cBus = I2CBusDetector::detectBus($platform);
+ if ($i2cBus === -1) {
+ $status->addError('Unable to find an I2C bus - On RPi, check /boot/firmware/config.txt for I2C entry');
+ }
+
+ // Check engine status
+ $engineRunning = DependencyChecker::isEngineRunning();
+ if (!$engineRunning) {
+ $status->addError('Dynamic RDS Engine is not running - Check logs for errors - Restart of FPPD is recommended');
+ }
+
+ // Detect transmitter
+ $transmitterType = TransmitterType::NONE;
+ if ($i2cBus !== -1) {
+ try {
+ $i2cDetector = new I2CDetector($i2cBus);
+ $transmitterType = $i2cDetector->detectTransmitter();
+
+ if ($transmitterType === TransmitterType::NONE) {
+ $status->addError(
+ 'No transmitter detected on I2C bus ' . $i2cBus .
+ ' at addresses 0x21 (QN8066) or 0x63 (Si4713)
' .
+ 'Power cycle or reset of transmitter is recommended. ' .
+ 'SSH into FPP and run i2cdetect -y -r ' . $i2cBus . ' to check I2C status',
+ );
+ }
+ } catch (\Exception $e) {
+ $status->addError('Error detecting transmitter: ' . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8'));
+ }
+ }
+
+ if ($platform === PlatformType::RASPBERRY_PI) {
+ checkRaspberryPiConfiguration($status, $pluginSettings);
+ }
+
+ // Add success messages
+ if ($engineRunning) {
+ $status->addSuccess('Dynamic RDS Engine is running');
+ }
+
+ if ($transmitterType !== TransmitterType::NONE) {
+ $i2cType = determineI2CType($platform, $pluginSettings);
+ $status->addSuccess(
+ 'Detected ' . $transmitterType->value . ' on I2C ' .
+ $i2cType . ' bus ' . $i2cBus . ' at address ' . $transmitterType->getAddressHex()
+ );
+ }
+
+ // Display all status messages
+ $status->displayMessages();
+
+ // Output JavaScript
+ outputJavaScript($transmitterType);
+
+ // Display settings groups
+ displaySettingsGroups($settings);
+
+ if (!$noPage) {
+ echo '/boot/firmware/config.txt and comment out dtparam=audio=on',
+ );
+ }
+
+ if (!RaspberryPiChecker::isHardwarePWMLoaded()) {
+ $status->addWarning(
+ 'Hardware PWM has not been loaded. Try a reboot first, ' .
+ 'next toggle the Enable PI Hardware PWM setting below and reboot. ' .
+ 'If issues persist then check /boot/firmware/config.txt and add dtoverlay=pwm',
+ );
+ }
+ }
+
+ // Check I2C configuration
+ checkI2CConfiguration($status, $pluginSettings);
+}
+
+/**
+ * Check I2C configuration (hardware vs software)
+ */
+function checkI2CConfiguration(DynamicRDSStatus $status, array $pluginSettings): void {
+ $useSoftwareI2C = isset($pluginSettings['DynRDSAdvPISoftwareI2C']) &&
+ $pluginSettings['DynRDSAdvPISoftwareI2C'] == 1;
+
+ if ($useSoftwareI2C) {
+ if (RaspberryPiChecker::isHardwareI2CActive()) {
+ $status->addWarning(
+ 'Hardware I2C appears active. Try a reboot first, ' .
+ 'next toggle the Use PI Software I2C setting below and reboot. ' .
+ 'If issues persist check /boot/firmware/config.txt and comment out dtparam=i2c_arm=on',
+ );
+ }
+
+ if (!RaspberryPiChecker::isSoftwareI2CActive()) {
+ $status->addWarning(
+ 'Software I2C has not been loaded. Try a reboot first, ' .
+ 'next toggle the Use PI Software I2C setting below and reboot. ' .
+ 'If issues persist then check /boot/firmware/config.txt and add ' .
+ 'dtoverlay=i2c-gpio,i2c_gpio_sda=2,i2c_gpio_scl=3,i2c_gpio_delay_us=4,bus=1',
+ );
+ }
+ } else {
+ if (RaspberryPiChecker::isSoftwareI2CActive()) {
+ $status->addWarning(
+ 'Software I2C appears active. Try a reboot first, ' .
+ 'next toggle the Use PI Software I2C setting below and reboot. ' .
+ 'If issues persist check /boot/firmware/config.txt and comment out ' .
+ 'dtoverlay=i2c-gpio,i2c_gpio_sda=2,i2c_gpio_scl=3,i2c_gpio_delay_us=4,bus=1',
+ );
+ }
+
+ if (!RaspberryPiChecker::isHardwareI2CActive()) {
+ $status->addWarning(
+ 'Hardware I2C has not been loaded. Try a reboot first, ' .
+ 'next toggle the Use PI Software I2C setting below and reboot. ' .
+ 'If issues persist then check /boot/firmware/config.txt and add dtparam=i2c_arm=on',
+ );
+ }
+ }
+}
+
+/**
+ * Determine I2C type (hardware or software)
+ */
+function determineI2CType(PlatformType $platform, array $pluginSettings): string {
+ if ($platform !== PlatformType::RASPBERRY_PI) {
+ return 'hardware';
+ }
+
+ $useSoftwareI2C = isset($pluginSettings['DynRDSAdvPISoftwareI2C']) &&
+ $pluginSettings['DynRDSAdvPISoftwareI2C'] == 1;
+
+ if ($useSoftwareI2C && RaspberryPiChecker::isSoftwareI2CActive()) {
+ return 'software';
+ }
+
+ return 'hardware';
+}
+
+/**
+ * Output JavaScript functions
+ */
+function outputJavaScript(TransmitterType $transmitterType): void {
+ ?>
+ indicates a live change to transmitter, no FPP restart required",
+ 1, "Dynamic_RDS", "DynRDSFastUpdate");
+
+ PrintSettingGroup("DynRDSPowerSettings", "", "", 1, "Dynamic_RDS", "DynRDSPiBootUpdate");
+
+ PrintSettingGroup("DynRDSPluginActivation", "", "Set when the transmitter is active", 1, "Dynamic_RDS");
+
+ if (DependencyChecker::isMPCInstalled()) {
+ PrintSettingGroup("DynRDSmpc", "",
+ "Pull RDS data from MPC / After Hours Music plugin when idle",
+ 1, "Dynamic_RDS", "DynRDSFastUpdate");
+ } else {
+ echo 'MPC / After Hours Music
';
+ echo '
';
+ }
+
+ displayMQTTSection($settings);
+
+ PrintSettingGroup("DynRDSLogLevel", "", "", 1, "Dynamic_RDS", "DynRDSFastUpdate");
+
+ displayLogsSection();
-
-PrintSettingGroup("DynRDSRDSSettings", "
+ displayReportIssueSection();
+
+ PrintSettingGroup("DynRDSAdv", "", "", 1, "Dynamic_RDS", "DynRDSPiBootUpdate");
+}
+
+/**
+ * Get RDS Style Guide HTML
+ */
+function getRDSStyleGuideHTML(): string {
+ return <<<'HTML'
RDS Style Text Guide
Values from File Tags or Track Info
@@ -183,63 +538,85 @@ function ScriptStreamProgressDialogDone() {
| (pipe) will split between RDS groups, like a line break
-[ ] creates a subgroup such that if ANY substitution in the subgroup is emtpy, the entire subgroup is omitted
+[ ] creates a subgroup such that if ANY substitution in the subgroup is empty, the entire subgroup is omitted
Use a \ in front of | { } [ or ] to display those characters
End of the style text will implicitly function as a line breakMPC / After Hours Music
';
-} else {
- PrintSettingGroup("DynRDSmpc", "", "Pull RDS data from MPC / After Hours Music plugin when idle", 1, "Dynamic_RDS", "DynRDSFastUpdate");
+HTML;
}
-if ($settings['MQTTHost'] == '') {
- echo 'MQTT
';
-} elseif (!(file_exists('/usr/lib/python3/dist-packages/paho') || file_exists('/usr/local/lib/python3.9/dist-packages/paho'))) {
- echo 'MQTT
MQTT
';
+ echo '
';
+ } elseif (!DependencyChecker::isPahoMQTTInstalled()) {
+ echo 'MQTT
';
+ echo 'View Logs
+
Report an Issue
-
Dynamic_RDS_callbacks.log and Dynamic_RDS_Engine.logplugin.Dynamic_RDSgit rev-parse --short HEAD/boot/firmware/config.txt or /boot/uEnv.txt
+
-MPC / After Hours Music
';
@@ -600,7 +618,7 @@ function displayReportIssueSection(): void {
Download log and config zip
Create a new issue at https://github.com/ShadowLight8/Dynamic_RDS/issues, describe what you're seeing, and attach the zip file.
+Increase the Log Levels to Debug, then create a new issue at https://github.com/ShadowLight8/Dynamic_RDS/issues, describe what you're seeing, and attach the zip file.
Zip file includes:Dynamic_RDS_callbacks.log and Dynamic_RDS_Engine.logUt`3{{vwr|371OA)vU6Crbk8R6>Izk~CbP0-{
zEe0oK&x|iko=$}*i4BX<{zWSXx3`?ircAy_DZ-U1g#Dt)b|{D1ANaUjyjX)v4{|7G
z?54H`R`ql_apUmbA}Bs}ZV>HO=qfWTmpMf4kGultcNQ$}@-wW<8lh_nvVWNs`6-;_
zZY#=+R2?Jq*rEm3H3}z+8zMxJ3|lmv#t~Bjd={MtMY1Ax%L`|QL#ku7t?aVhh1l6%
z0c-J>*ox_`#^4
z$XHe>C$$_46Nb~)W2!vY_pX0a!qFca=f~W@c*~@aZ#nhvi$m;XQDR;2RLgjkyF@h+
zgTWxUVqx!kl~W*kpsP7yh(!p$Ie|@~cshzzaJThv3;$OuM>Ox~&?IZ!S6f$evbvH(
zckQ{8_i?Yl7xIqpwQ<5o)YEHqe`ee27>l@ZT}-cQKJ20h1h(Ycejf5LZ4>80rfQtK
z<$rp^7{3=OBb2wv>OneIReq;u8+(H6s$?^L5<}zoWm}pYAX^xRX^*X#jR|wHoh~Cj
zG_mC+!<*T0X`XMm7u%NjjVS|BIh-{LDA$N+RqRidJ2wfhcYo*+HK(ulRW2HO7!f4B
z{eJ$ku+YQOSXWMiEnP#zS&c7r-RG=qkCB{`Pgqffl94?h`qkd7X~s3$%^_?kSu!9x
z_<4e 4}K(l2OK1&P^x%}l7yvM#5AK&}%oAvsEc4mc`Kb;P@
zDnfTnG!W(b){xIK-&zE_!ZG=9UAW3C8TvDbvTna=wj(-?wRKGw@QpumADSAscc7C9
z)ImLDtW@v%)yxk%RBFyyJcX5SnOjGn%+*&7zT3^RX~cv1%9zxnq3%M~FvQ_St2Ftu
zX**)T_1^-8&|)uB51I`xq901x??nASdwU-JXRZtJJK|@ucUj|w^eyGq#XiGn7lpoH
z^=LpoKxca)HS~~DgXI-|REP4~AY|3Wy}+Dy?c^w#e7SnBna+2i^oqYeeI)Un<9`Bb
zIF3w9H2Q=LD@3Xwh*?U^DTgBzx;W9n%|Hx@pRY!r_3oOV-58WhDd<__TQ?LjQ)?w#
zCz<6lI_h&Os#j7KYP8YBu@gu2JUNEAV?d`m!TWwR3;Pu~Dr7^-E0-=m_CkM}pqfu5
z+x{N3m%X4C^-K@L4++R8(@XI94TpW5hqShe<5SCK;64g)9ygA(AW4#OIEx{ZC=jR;
z6Ffuj?5MUdvaQbK(1Q;5y>5i1{SI#OVBzJ=#8XINKL-#C{}^V-B-}v9kUV&p09XPA
z6-~T@SG*?Re)c^kp`hdJAy!+#NY+BER*R%eq@|H@&Xi)-D$<)BKJI$dViS3edH13j(
z8bgZA^Gs0ym_2?F@w&uplDBcMQvWViu|@2{NS__G?Ryy6-h350wt`9PsV92dR
Qb_(94}6vbW#y>!;BN{jq4hWdu|`$KpQVKdsb#YHVAI#@}>l_ zmVLYT0K9BHzYj`aOPIvNc-z|`Py(?=8<00WOLQ~<)memqp&W7-I1~Wzj2s6WS^9cV z1UHrj{@3ijY9S6Ab0IxGl$g$f+u}*^@wd~b&~&$nfc@-Il;fc!9P`CRisoyn>UOs} z1@ez4>@pkzLc{7a{b@J{GbwnVP|>%33DoiSJ!g4yfQxjYv+1<+Q|#Ee*J9xK zd7$L{_oSa$zxvd Htt8teGfHycHHxto5`9+n0Bti9u1a_d93)8Vj=$)%caDMi`= z9Ah5504vA4ay>4G9ebzvu6Zslt~4zjnUTY>3-STjeB649=#5!LSk1*tc6FW>)F-?* z+HSLLrW=b>7zW-oWdWBXKBpC%lWTI7)`qW$^ow~sCw~k!mg_59kfmW!&)_J8q@=Y5 z^k;=?5Sut7wRc96GIO!AE9&6=)Xx?w^&3K4bEaIMrD*;VC;UW5VX53{lbLPyuwjNr z84No9dFVzBVN#l!)ai@1#m3cV*6;1s^;E$TC18&sa(a?ZNhbp&p4Ala>Mr7~R$Q7I zI?G=F0A*=X++7J^mMJ8+fG*Jp-L$X1ab7+xr&h;a6-$$Hi(bdWsDCk;U4}+D^sY-C zI*A?JYjG^U!y=WyQGk7gB!G*|kL<3D513pLj+pnSU@Yjd-`r~O*;rmlXxDj$X_a?j z2 K%;#Yv^5VU^a&9+A6sf}d4@;|*aN s|IikfKk-Ahq;)9r@IWVSKmmI28m0m1FgeR!{&Y4u02t!>Yr{AH VA?Qalm>&D;+{(_-h$vYLIO!EyqTeY+z<_|h7a)pZi zwe``DJtby%RV3k2v|kOSB5f8|VNV4`^WgrKkJS9l7AgM#DjwR+%t|A&xVwT7KI2@p zoc&E{95hnY%2g#NeT-{}t)72APd(V2$@|`0*PL-#PYV-xR-VMOY JHZ5W?kdzJ+=n>a zrL6dK!}|1ZX+Eq&-H?m>#Uzk(fDJ>0ic?*Tlkmq)(R6#JwA5shP>m{!h}46DoKa?n zc=kCRHfvaJ?Iw=e0W!L>?2K++NB;m`v_ziLE)ZPEtteBTj4)`hiHxqGV&X6lwIDLQ zS$B^K>P06_!Y-kQ9Ewdbs~!ulyl +NgWydGI zArQt+;6bDXh}nh|u^A;w )a`jJcr zmS;I)2|vZq&<3Z3U9J3Cq|8Rx{?@rC-;DmXNS17P>>v0_FG2qJ{{YZy=`dfyM}u4V ztnI!Q+$-o;IB&TqUAsWW6ncGn*O{3w-XqY#UzL?UBkER`GwAnsHva%?j@J9kcvl;k zZ8-di&(^$!Ze!He$0B|rY0G6LvC}W5kfUZ tZt?CzT zZ!NOQw%|tOv1U}-TR7-(Sy*?}?YvE@Tw8cgQ@pisl0|MzWRK3S9~wex>7PBbJgi;G zW+OcQb@fnQ>O8k(Xj(7)N^XhAYSHX+)PKE3c^IU0l3Pq|=UG6`I*(crGmkWEbr&8W zv6sVk+I!hs$k6c{y09n-B%Q$LuWVNpToRnQ(KKsRf^laxeQ~H+#QIsdjiC|=mPo*2 zayY}Daqac4Z>k;9s;!_6dsP~wdXD%! 1gK zOs>vQZ&UuubpzV1;N!|?^@gf)nm!%zWyXQ!w0d=%(?^_KNUUTT{CTTbNWH~5%XGzU zUrClml1&N*cO{v!<0SPzdb*VqmW<_cuibsaf3-Ah@u9)^GyeebRbJ1`T-E%(;>Mq< z=&Pu}&!j^Vi5D^*>=T~2-P`DEI %yE@vB;Bp(YtJ3^hKs4stZK&cE6ZjJ6p||` zn6TJm!6$)}oB`Ur)fqPww>?Ej>}f;DLi)zQ-ffmfqg(;m_G1npRFvl!c1^T`DHl z%($n}>$EKhYhD|=)Y?r-=TWkq6epZW9Ongb>5B5PQBZms)01+uM-O*lsC}+o_BRU5 z>_{-M@AR)U?6D8_ZTabCaDVNYq#{JowMYB9eZl_#wq}4N{=?NrT|ROD001#r+$@ znytm`aJ7~6al3%#HD$=i?~3W86xOW9q?&poq1N=RH%Hd5bm(7H@|A+Ji@~+NP (HTu_K{M#$5$1|?aE~c6%Hd^sn};Y73@YXD#x8Vyw2jZd{y}pq(;aECahXy5}?~r zDBRX8xoKwFip?Tj+QYK|#c?P?+;thRpTuFRDYlX6)2$v +6=lav+kaI5NjeP??B9<|Q3Uc6a-j^c|WGZS9 zgcy-?yM_cBO*A`?hFHbzwbWMvIqhayk(>fJJ;g3paop;r_?N4yPM3OKn|*ANv&uJY z3^?cyS~(cGl6#YQ0^h_QB(!Z#OPd(1% gzL3w9blDtKr~_HXPhL+@-L$;dg!Ow;Lm zi^{}WzlgNWUdgR(bW59f9lm>srN+>_{mk=IdzEWyauDhEx{Su&X 0vaDJ;hd2PB&GbXyp-&A4o0wukJK+=Z5W7soq2z3E=);i*x%^ChA( z?<_7X?hH~PJ=NEhVc3e5D{gm1^DCmil;Hiw{EZyS`;}+Z($ep(?8JuaPLAxfEgA_> zkc9sL5XW&&Pnjz+J?OULX38E}Hwc&xfMC?NnQ>M_e3?Jzn}6RmDoCp`?wxejY*K4) zHWvHH%aK&tYS%EUNy({4bY1iGFZu*Y^z$VD02 P_)IqxXNo6i=c9#+N6qH_84q z_3khBujP;9{$hQjL?=JlPyYaY$^JE8G2au~Kacr}E;KNC(j4S;^CTbEmcPt2@jYU{ zAM+RO8W0%%$8rAvZDs!e8lFo#^A7lr +QWLY_pl>Ot- z6ZNGk5UBm+RHoq@i+AEb5=|*%t4>M!e}!W#Bsv6ZC%IL%{{RrCS+!ZQ?~m}Pcvz!F zQZN1-iF{42Na0slxGdcO{{Zz?e#W12-PcdVkn4USQ}b$fhra_j{DnVfNp2;1Y>g`~ z9BbC8fvrqH?7$k@IC?Wzv6P)u?1-bdxYxA?bTVCCOm{XHlU)&=Dsi%BBvXW}(mkB3kh~7xR`|J7Ax-CXsjcpS{ z()F8JB)jnqy@ZI^@||)>z~?z1 +~4CY^G~G9paxZ^N3!&Gl9~BPG$C!7J_bspg5IxX>C$ z5yqRDj{pu$VLGWYk|mDT=2qH}o!f%o@N#NBvMZEH?5?flbdufF$IE=Y0qdI2+Us;X zGBie&)evRLz!}C(ZOwg1*s^rpLvdfRO_k1YgyR(sy4bEzO*c?xP_{D?-9AJ9d(&8i zE=E_+%ex&7bSbAEVr{L9BTLktDC8DXn54ri1UpFeu4h&)>Q^ZC(ls=>@|MbXaySTu zv)i>lYZSwkv690y5=#ZdPaLqFtc*EdYU-yb&JM;+a 3M02Ct~^)$X3k zX=ArClNu6!QJ$Et%5hB@NwcT;T^YOab*%Ew6M0f7@*nR>xDk=YI5_<3=Lo2_gqyiq zaUH+JL*|r48kfzU00K@ 9RF<3cF`jAC+VkxLoOvW;9Rya~WD&aK~y#P6S&;;?JE1Wl_08EjB;De5t z1n><2Ur+U5Z2?Hg$8$grT|94wK=yU-(V5 z<06*_elyMv!_71%TJhH5;)}uGa{mD6BEFXe{3LjF{{V{4*WrTNTzFb|k`^b=K5p_G zaVk1`4wdERT;9`j(7``-q5eLACW&id1me@qyn-J!0W6Bgo|WV|JLu0&D?^00@QjjL z8D;StsLQ!o0+aIwAwP?u!O!7cJo8I)9$2?~8~z2e8gGhkw8pxY<|(WqpZz6vym=>r z4sd!Op%o5It;(`bL%Y_r(R< j)!>UTbz#CjbIR89#+6wxpT{&k5TOhO9iu=e;>n z$bMMILyvQgzm Fm$-70h^EyxLA0F)GrdB-^7eB6XTpwJbj)j4r^FO@9 z)-JqVph*;Zqf2hmf>0TAxDNaiT{NpvsO=Lu;UxukC-;=Cyh*OlaU3yTIe8c=jprFW zde-xd6mHR)qjzN|_p`cB2KeQW7t~`$#|!4M{c~Piv9#0C9V-Cse`x;pa-Jl*@h^t; z5o3FOnMw!wBqU(x-`cvc^ DaKC13zQja7P( zqOQ=X;kn(ppWe;+JR{?%p_XR5h N<}(rOFnZS~*C-o(Mt{uy z^0m!}jx6-~Z>|=2qJ>MjW?)ngtvKT7N!T6+YhGvfhl2jm;_YHhGgP>DwlK3Y=Op8> z&rY>?sj77OqJ>6}ziwyuoAdk_jir;x)QU%+kdRAayycipEsp;HVF#h-&_ec0d25hN z6FAO3@f?3nmF;2bdrExAk&22{R9VybZ{eNyh_ooRH`PtM&ypi#&j8~!=U2wgoUD=P zQ^V4fb}D$g;l;;>G&6rbs<#=HV+a!&-QKc}K2w)0k*C$*mEw9t|c6=E$y^Ff{|CcBE-O{;)jKbsgo)}_g d@-1a$s9QZK69zQ-ID9GO@PtLr#SFEME(G?c9IiDB!Qs2RmLw97+$>y*{ zQZwpvQSItC?-j`&h~lm y#*7b@&s@aKgGiZ9Fp;cc+PEW WS6mB=@wTu8m5IbQ{F e-7fdSu nimW0S&@laJ|LF;A3-x!>8Zh;@xR z+6^a7yq3uz5c!eu<^k`Vb*v{OnMpQo_-@C 0u-8v!0`~JFkV8I*qS~rMQY_Wov?}jB+pn^!)3a5dG^H z1g&$a)n<9F o<3gFi||F zNSlB;B!EX;*9wzH)=a7KjuQHYjzg F-S zkVn`2E4LjRQbrV==6UAPEAHAr?ma8XI*7c!!>s^G8UlLfoN+)C2)Z4tK^=_%S&9%4 z5~uK>3k$b9RGrP#w*+Ig07<@I?o0U^0Ca@z1R*%*7~~&Z(-6jD6-!_aFhDc`*nBh0 zo;S5%K~zawKEEldLS&vhQ~v-7P3ivtXn*J;zK;X^BzQQ7`_^y#KJiYMqiEMq-d#s* z!chBPjl&q@@~%9>jHfi>j?5g?Q&MAmd*YotP|_{t({JpjnQmg4Ba%(I+H=oOO7Y$r zs+Py88qjH^&PhCR;sF_0{{XTfQe6Gz>c? @q9dsP7hz z1hqb&f^?P$ n3A(-^kb|~8u-ZZFNy7ySNES~1&^=H)!&ypHfM ke(;@uwW=3EiDz`=SA*dNT-hIZJ;@rC! >5*R6BU&ioj*~s?OdHEma99E}#(tII$!K>Y z=WRmdORMV-fT6CW;CAHK(%@h24;vV-SstzMuI?A`ZM<>uByup2Zrn-ZpKhay@$sL; zx#-bq#%IPoK@Wz-s9?<3NTdVP0Gj5a{{VQAyuKD{_$N||e+X&P`D)Iw1TDi6j?`kL zqfjYDxae(7eH@UmYjuB= Z4CwcG3twl&h zh0dSEx?t0FEmFxQo>*X#+^3x(WAh;=uTE>tnzClmcQV!}a#PAA?qGj(TO-gM@mOkV zK^~obsiWHImeWr+nj2~iuoxqpeiYoTxFvU?t)%!bRlf-wGh7RpByl7uAX21t YQTf-<;Hkb_ zo^^Rx)6+E@jVi_MEcM&FYj-8uA#Q{Q$F6;<=Y+evGgybUhS~Vb#4txRiG3+nQlaEP z!;kLqN*HKPI-=z{CY8w{@m9Ary2|?f%1qhFNEDC6@lvpndkR&YU5;krHj?r2A)Vcc zEw=@aekuDkPeVl~BxqRJ>Xug#-Psci@tmV8jlklvb?Ge`T$Ai=TX@68cDLlut=+=S z!7ib{A=0*|LX|~yV>!wQj{fO&8NShVJlAua{LVJ>>%sjivW^i!-5iszDQI**45E?F zw2?TC+S38Z&fdJ&CSt#Kj+{I9&pCJ c9F3uc5%d-5)=Qf4*lY zBA!R5>0R9i1~&Et7Iy8o4bE~aIYlz5P4luFIa1bOUNv+lm0^)jky^&HPD<(OS=2PR zQZKhzF6(wbGW9VY+4ihdR9%`1b)58jls5I}n$e}uyNqCS>G;uhG%0BcV93RN38!~p zNnb>4X)aBAI6Y4L#C|fiwVLK5aJHq?N=n8FIOCjh1$sCnl(~+2^GR8| ze9ZLl_Mon!c+wSO04*w &3ZLzS}miR5`> @Dqo%&D2g|q2TW^>E zc<1ObUIe}8bI?l2&hZzBbiWd6DS3GEw4x=1e5G@Y^ZJ_7l}AqY2}hf9Js(}N@ZPAi z*<4PAc$OR;vJB>`rFT(Tkg25ZYj~5#QfsXh!eZV8jKw4?ova%pCa_V|)w?5y(r-qa zsasu~u!XV;oE+nWUd+FNZzGX>N1 B*Xd{?krYVga|u6moDXr&y
MQU@ATOB&?;IR{kBJ(3? z+^Ca~0Un)tSEGq?jWn6hO~P*I*0=HIu{G_qscP>e1c+SB_*{?6psz8sb?QY1uw;_u zXVP%|v*q)+o=-b_*097%F|sn17)jnpZinNx@ZHRp8g-jQ@&X-9fT-!vZ61{qlb)=k zlGznC-F3BtCCiC3bpB%oBMR%^jyf9C4^27TDoM0@Ps7U_%|F7C3#9Va;mq)igSi+C z9y)YAYl|N%)zIG#z0;~3#N1~pMm=kZ9S4EydTrgNzjde0ZRFf}p?rmH+e=`9pT@qE z4JGV!Jld+$J?aQ#hSuH}QXL^hVb=r!Uprd<(b)89=@e1%CY^Dr_ qD0IH*PC2*e1@HU1;xM&KNm0Y1! 7l`cQjz|=Cso*4Km R z$>itSu$9eAIzNcD4-HQx=A0vWUO^ZWC@YhkdSmmWMy$kbS@_$ *mm1!{~ z`j(v>tl=b`0oXEnj90f+UXnOq*E>FreI{p-$auzB@J~OEE9d1+-0xKtj#tNebWv$B ze`sAxZ*TU64=u6F41zJwtvYaUmBMn2k>SWQYQz(Oa5(K>K}|PA^W@h#@16|OqdpMR zR>nf`d2CUpATwpy=Z}2XiC&v>(C()+mZr7NmvFE<31b*j%C{qf$oCb`?4+H|J)~`8 z!nIvFG~Ittw@Kb;W1DD_TnA%-#F6;d)8+HLbv&F>*FqRA#o%dWV;!O#79C`7?yvPd zvt80|Zp&i@`?Ytt{fAO=7j3 MAH7!4eBUX>UEy(VcDC2g9FD@~F ztDKSe`qsR>u``Uh=3emrjV OyQ&P+u#)`vZArbv~~ zabH~>kDjRQD;;OU#UEwy2RQ!#LT-IJ*O8h02=s8T-Z&`+VhnIPVEzNGct@Z$V-7cU z$9(pn2^1WYj@fMWG{ANoI~)dFXD9#|{{R{QUBn^-7&+vV*XzXs6=PLx#Tb#_aL=)z z2{%9YhyC`{0LM81Y&?5~$e>~-T2Gl!l6&+N0nvB?-aj5`X9bCohvBq}sP!gB&yI2b z00}kN9RV2pg?$DG_(#uTzl_dPA#N3p2n2Pm^d<0 g$+%mTy=h~aIMipsuYPUu9vC!rD#r&`a=gSeRh4uun z; y&Mfo=yKPBd!kzz zrEONwOFIM;DLFiFYqq;?EW!|icSwBF!X{>ItOF1OAA0be_B+t8b!{R<*b(eu@?))L z^d9DXlC;+a*@vJw!0Sy|MVEE^1ER1kfPY%rn)i`1*t6k%2>63rx6|3AjyZF^<6M;h zAM3?>wWZ5Rm_=SkW8ocY(@fAH)6MKwx6N}Tfn;`tNEjG*!P-d91~7Y(UN1e)u2#Aj z?O-)cXT;K5UMyD8+s!)31Vv+*0;g|10seJVYI4X^h1RDz1^&xhg_i}4VO6{R;D4oh zc(=_>GnSkbXLM7yzPPn;(9X&M&duB(!o0gPs`{EYX@51l$hvItE3$@=gVcN0ZLNys zW?j~wd1O=VcG5%U4a>Y^aL-ZeRGq}rMawxX-Z2f-axf~}8YA-~cKZD*(8AN!<`rc6 z9?jq}tXODE4yj`-gtq7&Tp!(>U}LcM_pVG*gPEm1Zd0Ydykxa;9ftV|9iadm*CT`t zQ+>}K)_=2`To(rF?(bN4R(9TjW0YVh#tAsbt$P?cPuV?AD)k>Vl0Ap}R_@g!j%#xq zyGH*2m#N1+J@Z~{?ab_ssHe)VVfedNp6f)O-WVE2J4q)XC !lBybYI$n-zf!-| z7DyAxM|C13QG^2?)$dV+WlLkuteSkzRy{WV0OA&gZ3I{HxZF1GNJ|+w>OcDR=T*T@ z_p!AcR3@yoIWHP`m%|#qkg@2|G;^e}`K96V_W_Z|<6Q2SE{yBv<~Yc2#7e1%oG&1_ z$?HkPS2g@8tayJ-)Fqq55F40S0;(h5^ZMiQr^(E$h0M{_>0UYT)|q*CBrA5&%R4+F zEwZSm9Y^6raFb6_%B}WBaPdT*CHRG8noY2Tt-xqxa1(e6Nh~qc{{TT )D zSGnkd9Z7bERQb6-UrOLNvCI5G&@Z)L4$V8t2iVc(Sd+g&NnObf>c^L9*32(--!e}i zdFXu1ecTaV{OPwv91)u5XV7;8QGwgbD>5ESmfM=}-P1dk$3L%ldi!3sHq%V8smrPc z`^*8xPvcqY#(0Eqx@qok4j%^}=i0sc5pIFQIWKEt-Sj;=?#IJAQMGvGQ*NhWBm~{b z1KXeHUNvi}opIQ{V$?2GM6x6+oEI73bnpIotewl)@xK#kbH9zXZ#|qqw+Hv6bzBSp zd+}b*0xnTFu~j{vsa+zIRA7kSO_U>RNCyCab$w6x^IoOC%uYL~E_v=*lqM1=qY=X& z2_L7q^*;5{P6{himQ`Hc$Sy6+wyvr<>L{AJ3RASM&0h*?Qd)hQdvF?iNjGf%^7pTq z%xJswBi+MKq3I9f%|GmgqPLvQw}^`LKU(mbcRN+LxyI_ZuN9TW-N^!LhGxL^YV~jw zWagR8iKwF%b8tdpi4gSzn)?N!K4x>gu5`Z-z!ttB2cfb**1U|*;76&1e(}JS-w;xz zwt>xfN2DlFBl+^*LDQdF0C8=(JBjq?oPJcm7jWRI1a&99055#=u-x+>VF ;CcM2;f{-TklhI-c)OgNAx7H6YXgF$V1w>ES8|eiqXwE7MLUd44@!K) zxz~I#Pcy}#LL)cXq}jai4;{Y>;LH{1o6vTV>VYL(gKcOr*e_c7m3N`&^Ld ;H~OYA?x{LJZedo*%l)SZWK-Q)iNX0B(0Hdwa)%RQgN9v#q|!g_VgHYj|-%gDJT z@w=1m59eM+BA+bUJLuGMjnSFo%?C}f_;-Ew8+ejocCPLe5(#0)w;1B05WJE!=Fzr! zhMlE-l4!1_!^S~5X!n9JbCJ{3b O!1O?V5m4O2U?kaPE z>E50yAGvxOLSFXgu)o^Zcoy)1oMdC4%va8O9rwReJ6BUDhqacvRr0>UC~S2nZ>~Q| zs%r8;+4JGI^Au!rUrQP)P**q{?JWzo8Yz|`E5-slY*`7$Pqi K$u(wu8zrs0 zR?8ElP70}IARLtgwS4T-=4Yh|d#dM@d~6Lbh;-E$5v`u(0ALKee}#5oX(_U5PRR4v zViEGE1RkTPKDF&al8Ul9B{t7e)BY;kL#A7$)t$`Okwz8d1xS#NKMM1zU|gi+nQ^X? zvqgmXy<}LU=<^~G!z{sypP>~G0NUJZ5#1hpu4-2I{wBHAZ6Ro4l2wru;1EC_o$@QQ z4~O<}ab!-XJGwi!_`wI4{{SFaq;fegae@4+l2``a%@ucHu>4xHc>uZ5og?d* t{Y;ahVr7$6c(E7-$Q_Han^F>>Z;v!zH9Cc7KH((G5w<0wDb z^fkA$Qg>z*YB)Yf=#6Vlaw}UoAiUBowI+EtiDx9Z ?jD~KLRuj9XcR_5OB5A|~@2{G5y` (JaI;cJRZK*zr59ms{7bFt8g0eCrLRa~n{;fAYO)fi(BxvX z`ixt;Mb8(=?JNEUdRW@-R1-@IM1OT4MPf0~kzLcJ?kJ>jM-gecGecF^_0eF(d{cQY z(g;BSi$91axPGRS)g83)YHrCt!~Dg%@xO_sx3h%mdv|=L%uBd~$0xs9so-h!LZ^tG z-QLD&)9lKdaWt(HozD9JIVZB`fnAWJ%TJXYa>Tb&oYsd`)vfH3&JPye#{wW#RkTro zk6qQo@NQDQj-`%|XZU}a7MtRodrs6RwM}AMxJu_UE_3h6s*Vnu_>fe@OOu)o-*@~H zrOp1M;;V+a)o-In;r-qbaO^Tp00SB4sjaEf_G-~YRH+EsQ`S};BaN#RY9od*h~r+1 z@AdbtxIsl+;hje}c0yMsv?k-DR%uc=m7YgGA|jS%KEQRTsW`=Z#l{kwvPSK%!_N`k zPP&36zLp!G-^sL->$GPdO7ZLBsY~5T=dDJCNUwR=*KZ2=syN8En@GB0z$+;Xe=r4b za?!ooI(e$>q>g6(%U80xXV)zyONHVs>-)9$1aM7y_+>`k;pSr9W$|oOQMmnU(b)4% z?*prw9}tMZENoi}PBYfLjMMmN_Aq}Dz=Ad?!u`;A>s|@!4+$dR1Hm6IPAC8kjDkqy zV1Q|Wp@7K?hCM;Xe?Lk9IUq5^ `6uxnX(BXkQPis`!31D~Uc6e8y4d7tr)Dy#Tt%%rQoGVG zlJ?49DtPm?zM`gZjY!#zGj#k(@m}IrQBXZRlt0W@Bf(O(sN365xlu2*4;pxbPqx)> zcNdXj53yHjlg=^TnxhH{&H{BMD< (clq>{r${I(^Nh?V&3S<% RJ#QeB5mq+pt8xpU$_4BqKiT3OU) znj6GtD)G9q$T=L~=O^BxmJ+I(WmLq%F>M}we`RrC;uevf2N^~O zR@$sOm9*1&D6oPV+xxlb2d#I~#b4cO$0dJpUOKi#<3A5-dJ X%xK?G?SXxg&1g zy$@R9uTp&cv350wEw0tecK#jk>^>mXn&(cw`wgX#xJy~Gk^)a4bIA9sy|mpllh)(W zOI7kRyho?{1>gI-Ik7; zf?QhKw8Hht^4Niska}m|6`ZA361!zZ!dh7K@H%l`lpWRCi!}6*KY#w^bVVF^kFr?P zarQC(`K=?djw9nb-w$azT-sds`kl4K(KD^Q5JAH;k)P#Wek!d+H5huDP>e0jG~Z1L z;qcCpd*V@L7`wE#YgUw{!jx#+-#v$~y=C>9k)_P_cQp2Jl}=Qe^(p@V!Zwzc8nWK0 zH#TnwjH_@%w_n6nOBE?K%15&0Z8K_JC&LqJ^XM?xTt#%KLR@*d8-niXSt_`TDvju0 z?miw}eNGn`TpnxKi@HqVdNQ53{{V@d&-=9 Ws5sCPb(|BIa z!s`0rwJ2U|dwXY?q8t;9S3WLNj8`KS1s2~jxhIHh^c%kl%d2U2*B0Mrof2rIecOY2 z9&460D=G3x-sfF4N?!C8i_>_2!@7pM;mbQ)d7!ttwt3u{GDzE%&*fPAYO##3(ASck z?6kRA{4ln2YLVVMIJdMn7Sf^lWE+ML^!zKOVw{w1+~Rb3CnWnE=G+`tr>jRL%8-Hm zuP;CH&-^Ptv~^1U$p)8!9H$@h(ug5qH(rIzeAultIf-qo?sW^uY;2?7aXVoLVd_t? z6^&Y|ly1$aQ*|X{(6oISG>KZrLyjr0P-5>?oMlk|0Cfj*?c2S4-Xj#{?@gZl8VM^z zmr#$xHVV>f`jcKvcxJkr`6xIQ<~&@Rv<}5W3v|9^YbiVjslLl6f(bh`6KrAh!J%U7 zMe09e2eMxx_3V0%l?iEI`)f%&NfgQqk*}(r_0vZa89vPBsX?Xg>boA|jJAGa7az>fAz8>feo#W^o_|UJkf>y40=c9G{Py+97`R0E*0FaKm%J4D{-{eW=fEuPkK|eDA-ybyq zX?SF9@otbw7+bW-?f0tSOFbUvO^a6elO%JW-9d?@9-%-uuU->$@Yh{W8c_C_n;UX! zG1zH0o*}#IB9>9pY(s=!>-g8r;;OsyrhN?xeOdGOh`d94;yp@BtC<^NKO}kK2Wrxl zB?aaxlX7Ni!cTs_g0``hj)%e?CcW^ks}#uP?U}JOCAcHhdy2|&Qbk3ydnbxiiz{Cg z>Bko~fn?sl^3o<5!Tb$1eRWt=&-?Zg(xHR`QqmzEE?v^y4Fcj4(%q#X-Jrw*l1qqm zcPt@GE#2K+lK#%;d%f?UbN0;46FYOAdFFZU+xAPz1{Z|m2l$(t%nwK4l8fUDnoh&C z0|xC>9`O-;Dexa?qV160%Y8)#0sEAKkfF|g=F7%}US+tX*0NTgCVTasLC+P2)goy0 z1v(I!n2>7CCa)ncV5Dfnl(AS-XeRih)M(`k$F*&mX?vp>8-&27F%+U-+7argb)#8l zzfg8R#X$;_eo6ish7judh1FjtnC$!7O =92yta+ATk-fRmd?-YQ!HtQNT~1? z8E9I-iWM 9_iEFP#^+@d|;(M=z9={-wu>9wiLOKI6g1_Gu$3a)JZ9TxtZ+C4g z$d~&BQtK;#bDotwk&m2o_Y3YVoYnWl 1JOwU_0!F~{@2OB>O< zTR(ZHFl4rXkM7-r>T=<6Gy=IYN^D8XKr1h-{;Vpm@%yy1j#&9^;%HzxP9Q?pBIaWj zVgI+lt2xiA^cwdQW-qstnTOB*QftG*xIaZt8r~*+j<>Pt_r0Gn6=kl;NW#{2l5<(- z3sx6;IA~*bW2Q5xD9WzE<5iHDleV)4GndgYWQ@NM=55j{G;o$WP&G2gDxcngthHIm zrAtODA)SuhhohC#pwq|C5PV2|d|%?7?a-zI2uTH>RuJWE&w8ZeD%7|)OjYo=@>`$# z_f4bplNrPN71}2AcJH*#TRntUh`e)*W*pY)ksNx6DF(uNcGoa5?49}gLbVj?c#W)5 ziEn$H%%=rr#Ocao50Y;i {S`t()6%xbFPTEx4Rzx*VknlgHW>4T&iFSAJ>!Of zO)`srkpKRE@Uw{;=ZB^k;<{kCl!-y9w%c}Shm ubp 2)3`7Ez>ckjPfa z$J9Gb$UpKCq9iZ6ix1b B#F5!YRxQ znPD#UJ=4 0MN- zE~LWSjGcMG+MQXOL6hkP{HBA@cRh}LJTuu#-k-g>Ovh&5%g8Yj_SZ{;*hCfbEO~*y z2tzaW3+txWh+EgivY4X-xb{~vt8F0D7jLtBm8L&m*V*l9$vc@-M+-eiv2HiOhtB0P zQO-$=TU*Tvg)h*3C}WOf2m8Dbb` 1?mlXXXoHpT!Pm=Xh8$#6eR>uQI$^ zAUda4qyi+rq&_zY#=g~>GjUw@J|88Kf1%vCzgDU?Lbp{5bIwZ#ZvZ5g;&sRjTYjIb zH!LE2wWk4jzb6=``o))E!`C8o!u?G`PGdQp`eE^ hT-cea-#J!}Xj2>e#dv+@By~B{R zeuC7_X>qZp$yNN gm=x@4Mvd){StX d@NlUnu?k2!C{iRRIl6U_)^t2(ul*3}n4 zggTyABzoYj=W}=9<7jEecxHiVH{Rf;_t@_u&b8Ck{%TNS|KpQodnRs$E#Cm_lzbUy z?C7e^_Urog#5~{IeDDC(Gut1Qft7N*+_i0m%EWdOFHamCW9uWW(O+u%mwpuv4k+77 zf(eYUI{NY25vH-swkgw4dcXY}ifi4_-oR*$!;MW9B+Xul8JSH{%CW?UgWS;LxDtK1 z+;l%MH{bTIN1iaYRR8r_GZtC1NvCN4*%GF}SNnmc)9r3%z{*8{ZN@ozoO+r%g>`br z2A1ouo@tD ib`q#t_!h<%FyT#8;d+h`KToXWO^YR`<{AqR`=#udv#&lvGtr*O z(JOpew?u8mlwJeP >xdI{fC}xDI`bD zTVN)%7x7h>T%^d#D9f&^z7Blr%AcYQWe_6o3-F9}qY+O(i5qlu{|AbI64xTlMmVn= z6yLoGS|tMjYI4aQ4mQskVbi61eb7f7C6e1ssXTwpWYa0jNl_^a2adL3tf^EVX>Zc* zHQ~TZ!%Bfmdl}~bKpJyG`y}JOKLqapGB$xLatAN7Z0PR!8Gj06vBs%+L~^h1ow1ri zU8G8~RjA~V(KcC*h2kJ_MDeHy1w}`nVQrg|G8Jm~{A+eko|1)|D)?n(l2W01pw{B` zYmFN%F2v{7pf&Qk5(lCMtt#+$mQF{$hq4-6z?W6gzGQmE6bT*LA++JNJ8@H2dn?-T zx>}LhkJWzz)^Jrn+4DC~d7ylM=t>A92L+Nz#QLYbBNk3wq`L$VrwYkrptAVP>)HJk zFt}Bvf$<2$xl3Gki?36n!o?LKerXNs5L?P%@t)}^%e9ZkV}FWg9;NyH4@B3V%+cF? zTH7F>9$5q%Rx2 FJnLqcwYT5*W^r($my4J!)^vgX}OEK$O>lo=;F YRAZ8G$LLR=UdRQSHm?w91+{AWnG`Xi>Y&O={b% zvfD0YzPiHCrIg5x5!CC;dAJj7_IbZT|GQA^y}uMI_>r)Pl4LJA4_J3C)pQY^Nl@Mo zjZehx++< Wxcr87vr1N9 UbWsge2v4%P?1C- |9CG(S^$pGfPfy9QnM2u6$=WAz} zA$|DY&ZKwI96gRaxcqDqFGqa%sUrepV!~;cBhV^u0_!F$mFv77z7J|=U6Q!JC|tvu z=c2IXc)oMwQaL<|zWNki11nd3({yy#kCC5W?|k5y`(oF2HK&bn6B0S+3sv7R9?o wv zJKW%?i`!!mqc__G;3l>yi}U~1?~92@M#xmXF3Ntn%%C}7hT&qg_GVP?G3H=2Df0q+ z@~yhhUhqerbXRz$L%p;_`;z>YxqN8sV(~as*OVv{vu8waL4A6=zV$ ySmvOzJWbP0S9V=66!@En0f#`ts>)MGs=pUVgPt$_Tx9GL~@xV;Lsk_Gr` z4(g(TI^ARa+3@!ea+P2n_(U@|a?7aPVX?awNju6fnjBZuzE&m&5ApJYhLqcCc>|dK z&DMy_diy1?L)uCU9!OsNJLXwsWM8)qdy_!Z$=VJ@3euSGL1Yzo2U)?%^>%q^d9Jrc zw8v2}D_G1v9eN_;sFNDiE-|$}b#;9&^hc9LRvd_J93-2or)Z`MI}F1%t=L%A29npN zYcP^4YxPx#UJpD}z-u7!2l^S~9yYsbL_fc(%B?)`AdftJ0!JW>OXbxsqr9Ev2*IK= zLu~PD0fY|ygv% 2~*9*8geiA=5OBYXj-{9+dltvIE2LcMr{Pj4qO7v5X^2MVGwFFqt z>mh$3YmbL_sV$4M%GUU`Wp9(zS_1bF7(l6ph;KfG +7NKX^6PD}jI;Ncv4(Az+PdVATa{GWV1>PbcU0um7v zso{0b^piy`4H?oF8P68E)tm!(%$bUghDM#zxBw*`+{afXp4s8L>xqoKU;D6>lux#^ zl4S2M%BWYa#a+Q7#{vB`(iVw$M{MpyYBPJfFun70WzT8j1ZA&SjqN7G6Roq?`ZtLF z95mB!WsCUg#qQ|m?bBZ%WSE@qFWdpWe%4r>HUZ8yGyH@i9WqLOFj?p7r`(3WsI|}B z>+p$6-{kygkzeoNH}?rpKvEIFsi~w9mJ-kWiht{){@ g&(ccbu}%1J%}NH&iwjS zaR@!0-q%YKqE($;bd^FY;@dN)M@(!55azk4>p0mot3S{_QB85xJ$pXvpGOy*m>BHx z_hHICpKVf80pZ9U4I#3CR3!#Qp7)#y+@$0UE55%~M5;CLOx36PLr&+15M46MdrA1G zL}-F212iF(ad2s!G9h=!q(w1#cRxYS>D|-QzKBclV&CYAnF7ELx$k@Vi_1PBE?sR{ z+Y8?Cd- Xb`<%`Fk~BI6ZOX|ynmv{=!T1u*#6A(i0Il>mabs>
imZEmKk!)1Fo)dEWckYUfGu0T zr&8`r2UB`Imy+~y$=Q;`m&K*GBAA^o&%YgaAv`||?@q%cw;BL;M-9}E+=JFYCS}YR zI#eZRCHd)=1ci+KHvnemGQg1YAByB!q;}_8=KzhAB-VIR6KFH86%Rn2EmXgFtq2zS z1E6YHSK4#+vb!pryCBWaUczC2gG`bQ>cW>kDF|fB;*zI-X_9()8(>fANH8+ULGCT8 z7savfPGr8 z dhsafh*!xF_clbl-n3bOf#T{-5-Q@tB+SDAe3P*<3Zu6@0%|Ah7;!U)5L7qUY{FS zy>B$p O}}3;3lV>Ir+A3Lmox%rq9Y_iDl~4{Mhxg@k~mUQ!5D4 z)!5#(7o~?gdf)~S%=-Z)_4q=Z!;A&4@*T94AEAq9Cf~EfSP|o~bA@c@QPX<2Cfk)2 zm34lq<~ps&z_EFE*ef)4rfquqF&9%LJq`hn=G1qDYsvA_p9u56smzb=l^W~j{kPbK z`*-2-E<3X(qMULB%duCaqefrZh9=~JgvQS!#wV2C(HixF7b`+CNS1}1p~kgzi`C;; zYPPb8ZL#c>`P4(f@t9$eujqHl$eG+lTew>ItClL{ff?51 ~-GS(3YT zm%H3=>|;OKbQPo!Z`lZN_2%UCX<$(0dqnojf$pMCqVmFv3dxQwn1z#Te+&;2rt f-9AXwDfsWC#xW;Q(U#tVPan=yLVvPJpr=TMqh=8mt|rVrIskt+rcv@Yv;`E z4iP1qF;BX1%4#6FaNeM_!e|?psJDs%TGYl;(q~AyTns7xORtKo)n;t}J!wa`h_H;K z8)p)l9~q KjJ9~@0sR{W{ z)E>5FynQqAqB35D=}fs@3SA2!CeA~rXQ_yW$kM4_dZudQ77F>dJQqBoX^xv2mupy3 zhSa)B9-od!HuC!K;?fKGqnWQOnw4 *$nd9(rEZi|@-FMQiFvIn>3bZ} z5(M9sgwnxRN^#Oc +>0lzH^VpD=L0kE=L`FJ#p;4G#d>Yx;FcNk!%HY!&hVqG?(2^54K~xLytN=qGf0 z!MD7s3Pqi4l}2f;yuHTT*s3{JHbSwXBXM%q_qwvA&y&;R0BadbC0E|&4^CV`a=c^K zOu8{wtcYJr_88o4#kBPYg`GHS>sZm$o2f(cH|bVi8iHCv5H8S1cA*b@{dSy;@?=|> zENx;0%6bz)Rdr1D@2Gt~8X9&xpjU_W1rXpDD-9aKqoe#Mo2+`~|70+gHYkNF%&EA^ z{sW0U2e8d&F7inubZu{w!%O#+9tqZQt8(R-8p4g+D5SnKeS7Km`AUw;S;S?z-Kd@B z2M~Q@6rT4X3=rwQySY>1cNu18Tyu_5Z@jAHm~ipUE-jpK=k|v5yaXq0duBR;Gc3aX z64V+VS^k=a85n1~T+#7&5Og($)DFG+tjYDuzB-M(4N?WyYBrM5bE9TCdj<{5SN>^W zg1wcTd7t+HX%1U%8`43(s?Df2rq)$#>VQz)K@Dm|Z$9aZwxCSr9^K(wl&K=r BUQw49C1t$Jho#-qAuNpAEUK9ob>Cy&}wq+Ltb>=0Q7vTe>`F3q^ljEv2H z6nC(tIdZ^c+FUEiS23Xffb?Zu=>1RwwJ4N~0v}hYej+s-_vdl)MV~DmiFRxDpm#P0 zNqXLp$)Jme^W@?%Lv_d7V^>u#MzXT^J RmQZpOIiy`Wlt7+C+Yqsk!;A314VU=Q~#Fn4Iad7jjyP z@>;A@p{YwxD#K@DmlPe}j-4v#tV89 M4|MlR<^-(`J0d&+ z&{XTE1=yn%`H%KB>6Uib1--%R4Owj64qay38rkedzRzvkY`Cn-_q@`R4HrxYV$oyC zJy8_t!FN--vFe_hQ+eI)$P6bL3C*M#*$kFT4xQ!x;ijBHo)q!aDJ89p$MvdMCHF%1 zzK((auG^@~eJ)lm1S%O6uY*>Cyz_gFfY^1~$!!KHI2r)A^Lae1vRcoUUcOtlElkXh z)BS|w( eB%ilZ5nkrz!m%?#+M2jAVCfq8*_C}HoFZ^s zh$F7jmRc_bTF5HS5N#?v^jev*sVQnsMqN-!QJ7LM8oiKd^YWRQW;`3)Uzy%-9)_HC z6`zcCWE$zh=`7v4;1(xFmbT)uWb8j=Qq?oGgCcW&*-senCo!d#ifsXCI$v= +%R)C-vwGbh0 Ifanm_$=WBDR?{k&vxoFlgy~hO@}7IHbwq;is;x+ zw{_7inSOo)OD`3gcs_2qih(wwq8jbBm0o}OT(FQ_bHOmvDsN@=lQAy6T(tyoLv7C^ zT^b$AGeTmkIGUl k%n`{Bslw5dCrNjZ-J{TP zU%o;`L$`Mx+q&bevd{YCE0`)uYl%#xhw Rs;mgSCCZu8R!G;bg$?)^U MvVScn~Ej`9-%Xi#2bQN;3RFE=8KcmudJ^5#DUQBs{froa1IsoIS@5LEe zq^{?#=XfrRi?^FgB_^~r)IMbwnJSoFmJCP36B7TCi&=)sli2uN&G`0H@QaVVelZKp zn*={bRmMP6OM{M>qC17Cq=Lx}o&>(sC=wIFud~{bx*P}v1mTV(kx$TN4{#tgKg&f| zB=&yew)Zqj0{T*eL2ju|Pl9LX;Q!DHMWX=8p;RUKoJ@jqv7lrIr*bZEDw`KN3&L5w zhOd7k@U^niHEhMmzL?S6Ixqz+PTl)le)Izev5}dbDN_3f-#PI=wyCWh0^1SW{a2=Y ziGxoPr}Xj-utl*HiBv4rZJ!L8e;_n|Ki}-0Ihkrg-b;6=34~JU;J;VQ`g6|nyv!Tu z*5#<%E%Fz1js@g$&MO;LZ*o^hSw>Zw3Xk@^2(8s`^%tofPSk4$|AB(=C7iSy+hQfQ z%$?gE{(&AIRN?oZ;(=#=6hTAntHgHbL6w E2*jw`2a;mN@16pX~n|-)9E?WX1?UGmOv}0Q&sz z+1C?warX$c`|bF0onr}W_3HaC9Nw6`fMfv_<_2Ye)*?96m+ooiU9l47y2sQ*Ip?{A ze(_fms{mM@&0U`vV5)1W=1cb<7b^rn8!%noLy0EG`HSdCv8p%4R~gxThqfKn!6PNE z%l^ePJNyBkDxI(S|AA5ix-( ZH$ zE$M)tk1qGO0fD#q2LgW4vlCA`T=N2`u8?%-)(DMZ* Q(AI{(a#y;b-Es}s)}c&-25g-0^4f? z908+{++)sjsZ-lOx&QxWj^CKl4yE&4{(*;I{OshRkfR4F=I05N6^!@_U0_<}-{I@` zd1>m1|C-d@ITnF4fy41)@qlNh0MD=nv2-{fg?&!;rvLYT*~F8^E8+0P+iI%=`RV-| z!m`Q3H%&+aH~J^0_=>4x3E pY}vviNGCMQ2s=9 zdFJ66Cm}&^9ydOKgwa|i=YuhD%5id8AG_rO+b= $x5{oB?;X9OD(_#h5nl`QDQK+x=NsXr)pvNSZ32! z^9QZx4)X=hLxit=HfH!cy(MQI!IZ$NP{QCz-a$!s*~dx1{M|=ONynJE`Icw)37m^j zYoqhQEha_-G!{x4{txthCk7IS1hpH X6=F12?_ zZhathQ0Imnr=LeIO0d%pw2vMP&V*}{*jvX=saUiSPv0@L7z?#+(_F%qhD3msR|&@G zgARb65V%V=Q4v=$ph@DBePWIw=sdRpeZ=b|u^y#Nj6z2zp+vb5
T~6_aHhc)oL|fkMGGgt`gg2USqt`h1Ipi{1gEI#={Y zEE0K+p#oH(J5I0FX*S1Dk7T;$oz=zU_aw2a#d=BEq;^rZzXK`a!wHhdB&&h)g|t*# z1j|{8qg#?#Rb`|mS$I?nE|ORSIF1WhAMvch075@fK`1xo^3^CmsPxA&mD@_#s1b-l za1eug(ZhU85~qqCe}^OP>CylbOw;XbjAnZzi6UtbD!97gi6Jp+gf8K;=q!FCi*Spt zl#&GD_>y9hzwQ9?GeDzt&N4Aj?NA#OLmW8HA=`o%#M!qt54Q(gXYLTt-yyQ0mdIJ zwA6Xyde>JHh=g7-&kwAaLTD!%Xx>`YJd~%BB%rZAA=>X%iAlcq8t8E$)pDpiiCGk& zz%A?s8+xjaR8;!iE}d0p&tSP{X!xDSpCPt~A{wY{jh3@)1g )fE*BirOk- z*>Ij)Q4O2!J620jY<=w9yerFdJjeN#1}l2@u3Sr+R8O=dZ(2MJv;$FzVlz)cb>9~9iwwTU)!hXZolnjiB2 zgO=U-9LTaX4HoRlN?yEzt3dJqUZ2hS&1abOU |mx4ggI v3SU+m}`CW%`sL_h{2H1W9J z>jR0NCDE{X&tt0h2a}bMCA=_jAKZDk%zgG|!S3yQN_XmZB$mXt&^B-M