From 9cc99e612ada5509abdea8f7525466a630471be3 Mon Sep 17 00:00:00 2001 From: Marc Rejohn Castillano Date: Thu, 26 Feb 2026 21:43:05 +0800 Subject: [PATCH] Allow background sound notification --- android/app/src/main/AndroidManifest.xml | 4 +- .../src/main/kotlin/com/example/tasq/App.kt | 32 +++ android/app/src/main/res/raw/keep.xml | 3 + .../src/main/res/raw/tasq_notification.wav | Bin 0 -> 356640 bytes lib/main.dart | 63 ++++- lib/services/notification_service.dart | 49 +++- supabase/functions/send_fcm/index.ts | 256 +++++++++--------- 7 files changed, 265 insertions(+), 142 deletions(-) create mode 100644 android/app/src/main/kotlin/com/example/tasq/App.kt create mode 100644 android/app/src/main/res/raw/keep.xml create mode 100644 android/app/src/main/res/raw/tasq_notification.wav diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index f9893512..9f5f151f 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -8,7 +8,7 @@ + android:value="tasq_custom_sound_channel_2" /> V!={)Dm3lg3EZ#MBzn-R;=!=V`#P ztl%6HxCS0xr+MEO+5CuB+>I_@lDk8s;(%GWL*(vTcKsWY@C7TegIsL{)e7$!%f|Ks zWi#?#g`ItnOqN3TtI+Bq+B2-q3^}H!@qO5n?^pAwKbf67NUw&-&sXH^Adm2KdeHZ@ zaLd!i8KueHm9AMSY2TLZ=5{}jclj|Lx|6p3g!bCOn(ZM0Uy`%^bl)!AzMow?1V4w# z+b`nfC&V}t>`PJnb|XFW6wl6x8V3x9i=lcMtc!2pDot61x->##cWN4A)`73OAg@OY zG^Y6*7%MhnOX}!na}wJSby|zA)`tJ8EOrJd3rvZF->yIMEHUmbm; zcYrLhA$BksXUsT|57AFHRBMzJccm9*^Gg=8F|V*OFXOunbY9pid>1Qsf}d+09~$@8 zzrM6se;&hRd@!E`y-JJiX0;C6wIva%?7tb@J#YpBcF@#e;;Wa50^oUjvYV!!Ctd%pFyUbggnyI@R=FH67-c`uyEw9~a5 z-Guxdct3;heq$Gok@>y&bu%sYg2>!3GT$2Q%aQu4=$g~C(JuYo20zd}hZ&rKG}ILQwiw@S;T7)TA)GQBcn<#kZ-%uM zZtls$$)WQm8Rg8O+n2MftI7OETHsxF_kC8-H#z9tqNx@2yGiLb()Wqj*;b>0P56Ed zy=rC-)VRW_|G zolwmA`RYITGzWM@9~#H3aXbfw#;Awk^{kZDZjNi{3~kKXi#0T$v1-t>wZ*HdvMQC} z{uw;~m?sBqdk0&3A5Of9&M8jUTp_9$atQzM%g<2nEtFiq&IDgP+pIy@t-7wBSJJm~ zMilq4-lfQVNw&TOxxWT3u7s0|%?(}(8|RVH^XbWp`6z{qCC{h*FJixn(p)!sPifY; z0(@6f8qu{KcxS$dL~?8JNAA(P8))vZ+Tt&JjaPdJF7^- z_ioDj*3nJsB36|A!;T*j+4_|ImNAf6sh-KMTZ7DFIz`|7i}!wlci$A2X}8AcXp_;= zS4PBt&^sZ!t$1oYUz?|LzlifCaDSS0+E32jGx}S`wwrHdty+=!>gLNIHWyZ$%onnn z=5M=Ghi|fdq`V2&i+s0d3H*+M@3D6N_nlUFC@iXD7kc`4nO*DGsJDuse=RHbXEZ2e zHO?(|(Wo9>POn@JJJ*t)687pS{(n5(2fWwQ|2Xh&TYFEf+q$<+6D6dm%!UyeUn2^I zBASFyL@1P*6eTT0QbcBZ-uB*m&)fg`diQ($yN}a(ug`hE_Um=V`*lFu2(&F&rn~j? zdWz=<@pI$Y+3(B>FAzblGjg+E{CG0SCsoPnrYc5(FQx0Z@##;a{dgKRpPpZ2B%}cf z-_1w$=DP-v@)t?@lOpIx6Dfa@)W2^Q=0ln=&e&*V4V{Wk-?NS1>2t?d^*`%>%_aA< z@a$)HdOE-NBfS~#{4=rI3!Z;YU;Z}hsjjE%wNR}*f0vKni*<@ej56#J*=`e$tfhg= zSg5~59dnKR{3=SH$%;(1j(9rGO|T|aTok ztYVCDlTUDAY;t_JQOusa`efdJIWKe(scU3h>UQ%Fz4gob8p(-VaZl6U$ML+QsO1`Z zUyaQ#ME_z%(=m2&53cO@tKGa{7W9gh%%wyF)p`B;d_-&4u4ECeWD!fD}vK1xqra%9lT{%R;>>$`kYNzK=*w~jwi8`%`N&9x0?HEVJ&d%(^ALxQ)nTTqmVfPmN`WknSaT>dg8?mdSH`&mrL5E~E@N$?pK&M7LZ$q}C z2D?#{T$d-)Y5aEucC;3V>ajje$#e_R;LSWmtR%dL$G*>6%SZY0?#8EMRpvn2{HptJ zipkz%!AB*M6%k`2dQzVCi?5~D8ug#XDv$Qn-wUjG4{=Y-M%ecl?xV=Ur}|!Bv6E9p zc0ZW`n8)7E<69Q{3AJ8j%U3wOvz zvDw}N3$h^^%ov<++GCNfE_P^(x=(K zwdP>viae*0%unGlf@Tfi9r{||5?{kUYHdO%z80O$l{Xd#1~#Am+~p; zc#}rgD;S}zWrU@QeqEa0S5>1aHRx*%7P2Pmc!~Aub=cAdD08W(_-botn;W0)K<7Ic zzwK#`>{WL63w-~9fB%!#Y~aaui(}(k)O@USS)5H*>NsvL645^~>-P;SzKYCVM5^kM z&rY=47$ME<4)>n^UOC`$7q5>omii?*{~RSI=&w!SiKmLXe?pyaNZ~a4 z{RMt~!$XZBr6bMHy^exU8})b?FWay&O-Ms!ywA@{MNZm-D7TA*t|zM*`n3zd|A!c5 zhB);{+Vw3hnL_6$vM^uZ+-Mwp59i+VMl(r9g4#PS$BG;^?lhZ68?Hb45HHr&Q6paN zGL&xV+9Qr%G@A7l3%rV5kR^zn{0e<1(D&a+VC;FeOVoLcMCQZyeBiG@>ubR6GPqwu zf?FFWxLGXP9`5(?%@3HZdEAqa=;ikig+Jy=UQtBY3?*X>xFjoj6qmxH%oHJi;%#qv zTdWc)~hfQt8+CkhSds2AImMXhcAps?|i$e+Dg z#QdLL$xm$kR9JpUBi|R<4>C62kC*Rm?BK$j{A;v+x}JQ7(fRz=>eVHiok>M^m;gjeC&aeUjhr%Tl}y_gBS-BgokZvNMj4 zA0x7yY`ya&bK|qk0nacW_?NM?*}U<8sPQZ7Hy;)L#=XDUj0J4RTy|ukTuO80p!gdW zKeH`!#J4kz-+yns=3DKL$Cn94n?|6ro$JYbe>%{eb?;1i+pzbSu&3p4JBKLb0J?7C zk^d7F&J!{J!&_&Nq?5+Re4(sI+Lc6iqwk%pnY&BO8EawMvjeTI(z;%M@kYP7RzIsP z&RpZy*RdK+jj&wLVm2r9t$3g2G`FSp+TzQNdVx2S#aLf=C%@L!9PN`dZ5Zn~iX=@V zeSgvD<;DyTi&B06%j5OOt-JmDW^WG;1|*NOuW!-wZ^`L;J|;3$Hr5lr1-3nT_@1Js zzNq<_sQoUHWLu*&b&X||Hew~~hlu+Vk@lw~>|H(Raq3UV{x`Jbi^LWb!Hw#E)65v! zb#%RDGROV6p6Ts$z8Sf%$Jdpl$yUPA(6>m!VASh}A_GzLU9tBR9(Wo0p60Dn`R>r? zXGzHibo(nf|0F`5%36HPat#o%-9~!qSrL8;6_<)@Khe@l z4%XwvnIp`<+nfFBrQ-PKFJe;dmfPd6#_7)PGoQrXjZ$ z>X7eS$afdo9=ixVjayG7qcN5B=>|N|D z`~saGNYnbk>M3;V!IO4@`xEHf1x@ZpoBPB@_mj;|TDnJHt3AEH->=*8PKW~Q3Yry;cP6xa%?Q(*;-x{Pa-f*&N%8GHyplbRXiqV^a~y>> zuuQYXA>SA`8$s8HqT(>I_Hf!bP8>d4l(U_77GRlc@fq!DL^tv@7;WEY>qer*TQKVZ zs}5*urofonqlqm4f^H*3OZ~{^6K18lDNiY{I3FXDh`Ec6Cu@mL>G_*Q;7Ny09dC@hZ)qlw84Ah?Ci68Vw=ZgeZ_|+lw%t0^9qh&4neI@UE z3tGl#U#uCaBRVZAM#_PfF~hYS-KN6i3p9HdE%{~j2r@qsP2WJvk$M(ykmq;B7%!1U z-w^OZZ=&aGW+(>nLfw*{SSoLyo3}qrE;o|PO(fDd2MYFKH+zX;`oa2j5;jJh^P3~< z%=Fi-`Ga>Gz1#m8QR#(tPoYN_v}{LiFGtrj*YY_(hMp@~kU8l018ROtCTF7O9MoNk zp1V<3c0lp_vv}3txWZs@*}JrPEHCpTo4VM&4fu16ugoSsDoy?>!}T&2{A%SUR`*ut zom{`4ABrzMdx)2wB{u{3oxZg41==~7mcGgg4kM$(#9#05!?E9HtjQmR7w?K6MtJkP zJi&0D;62hZELnr`rIDY%+1jmWnnN3v@TL`Mzn8Xm|3J^>q;(Gu6&clw(Z|>cxTUw=h_3C?;%diN^7~cMwSf8* zJG%_s{zK0R?B!>U-(^GJaeW+_jCqx1=zN6i7Gt%?9oo=r$ixTjVf2y)|KSb zx&YL?o$Y9=t-AiInnx)>md~+e2g&COk^2(3&nAsCXnE}6H---x$KH+BR~${|hLOD? zFc@T9{&^mtH&57$wR)ac=s`+)piK{B`_G|OZ>ya9vBR&5Y=`*Y${uAf9*tm6zV?nk zd8u7^m}zuAo%CI<2iOrro$2;Npl^@wZH-zq&}XjA=3nIaxaeu69^D__GEsl@8(!~w zZ~Iw{@~__PdePW9rMUR7nx4*;WIW~%I;n3Gd$mzF@asx6J+i+a_U@&)`Q+FGCl^cd-aOhgN-N+g}$f|c{tvazvx9H(E7O~Z2 z_wtB>Pm{=%dY*sqNfX4TUl|dYs1N#+F{cH_{kIrvmWeO3XqHWxwPgXgD$B-9`($Re zGv3@m_SP20pDve`ypn#cFV^Y&-Ns1&hY!8T_#ilsG;T8<9j3y4p1*ah)=4&`G`t#s zu(MH&XGJ&f(a^8y`X72Z8(?shzGqD-XDt7WOw>D!&Ciq7dR+IOKEOb+MDcqZpBE7RYL5_pJ*{&T=5FpbY@5DSj!bT z>N9wwnPg{_(qFlU1hwR)8sK{>DJY^pla-7f$ZTo<;TzE5c67KY%c{)Qc7$$XAM$j2 zrrS9)^W6ElnQPB4%KY>EKbe!yFUkDO9Np;i8#6zbIl*31uBX7g4D2r>OP$!y=g7`z zT$@YwxA8EAjJ2h)PVGqP!(zZ!`0P)_o>N(Yzv<*sQNT7neUE=jslW1*xRq_v=UB+(h6Y*Yz5>-TwP3iUx z=5jjfS$0z2%+KAB_`09;3*)=9-}UP*><{-n$)AD>pK9eR)@o96XTO$n>MK;_Z7w7C zcAf^)O?=&L$^-QLRz5Fci2Ce6Id$wRvX3W-S@WM1J4~WhPk495qwe1NFs?l6nS0Tx z6Yah``6lRQ(sPG#>G%$&9lgIEC7baZRbX9+6z$f>vff$L5D~-w=z4pwwlWq_8wQnO zpC2Xi>!D@Wm(7XN=Q6J+|M$oUK%Vfc9LirJ-fhZ)-3Y6W$#;Bf`L}Srz@Yh@IeuZ(oN@VmR*?Zt^{&=OH}b&4w&uLuT;rpXpP+LS9%`8a$ca zjAMPi5u1HwEM^vqv;>qpL7Sbn74cME`re$>-JJBnhl(-=>REK>=Q@+(yUE85W)WJG z@TP2f6S~ugJk=B9H%8AUaBm}KYVVoYwJYYCKQ$&ajlY8sCgP#ew7GzIJMtav#s6L4TtYe*;CtxrOcFX9kG^4Tri<;ygDqy> zzGRcWVr9M-^L;74`m!B@eKNkzFQ@>^0@* z@1pr#_~c%o?nB;K9{y(~M|N)l-=%D*BDzU*z6) z{f|s@1SNU(YVd6W@0RpGEM6Ou)RIrV+}$cL&&x8#7uB0VwU8g4tuHV|{60l&|Be3W z9A5`5<%_l%cRnWrKwdLJ)nxziEgh<-ift;ZFU7OVNK0#d`5XDd_Ih&Q(@BwULVq+TV;yq5ON!}Hmw{0Xlzqm4|@uQ;J%&m<=Xjnv>W!aB3_U{UjUkCS}A|J1?cN0XEv)IZteB}}HR0yAH zgA7%9r}Cn`lI;CSeV5n)a*1z+|1!cg#~9@=*1!D5-~VZpd$k$8{no{tu)}U1YnCn+ zA6+V@X)dE%lxxlUG?ZPVCS5OUq^OV>KQbrn({oq`oB1sDuQ(U^CVyl9{^gBU@o_uJ z>rt9oK%{>$D|3lHM#QoRN> zKLE~q;QkPLM1Q-hsNi9^N2cc(SMTPRUFi3d+IvEInry`w;{#g01>djZ?P7<{DyW{7 zE}f>Mo4~kIJ)a)T6oLLs<|m-Wc)C1FeDfh5$6E9eVvkSM!&snET6u#^jA9|*X2U+< zJ3nIY;yc98$W!b_{xx}@p-o(34YskPC-t^->jzbUY4xPH5xzclt?lZ{GpzkH-D(pv&UtsI|h=zL8r5LH|qRj`i*$Lm< zu>TF&!b(X_wCt#L2zNFoaD9oxZ-H(Aoc_Xk$J^n4FaP}@oqr7Pdy?}P(Q~jiN5Xv^9h${&#?D=l!KeVAbO}CP z=l_UFy0J%n+4wi%J_?-U^%1`#pTDwB3-M^ap44*oemUEoq28bumErn&I2R+BpQ>=L2fs?$VfhZjQDN>{3pTv z2eLjJ-)FId3wX%i_4t?abN`AN|3$YywKE4D=c<1~hi}MOtRl9`iTs}zm7ik0wv*WP zBE8rTav@G{pyw+*TRBmJA9wzNixHina4|uwnaQ}ym*dR7I3jYiHV5fq#2B|M6=Bq41 zDa2RXC4s%W2k##->h?I?WBxl<K;|17rm?Z= z`XZ@fl&WH!;>K}`vVVLr+xVJ(z)RW~tlhT~Ia+SSZ5{8q89fh^h$FtriL7+_^ghbt zPE~TB&cnwlysG+erNCR7ttvq0^TOi<-1gJ+Ey)c1oA~@PI=o8Hhmx8ha35xcZ0u0+ z8d-TsO!$g+2f_74Z|EUP3cqm!S*k~m%8HpXVZED-&d1+h!8QR@pW^#a^((IRQZDRJ zA&WFy)=?zXo^8Gv&h6R0Ta=qgO$R-{+wd@UaJZNB+^@~}HnfYjo}%N=;`w05AEReP zPYcm=tLJinp}4;~pt%N&w~@>H@w83A{ej=l+_7nn+T9VBemzn4j*^YkV=YG`QbhMksj*cfo@$K!au04w;ccN!=vXn}e^7E_*!L$ZUbHVrn zSjW-H_mg>^qhgd}Y*y^j5j*RY6u*`?w^0VJ)x@yn*tv@4J4@)p7Es5oHK*wILGy9D z^$9jwBe8)FtR?g0lODb5Ug-K1-en>GvBhsA|5@x8UJ;)z!=G!>pab82KOV&{37C))_)?P#!(SKcMk+fL8-@o$I8tBmksk+{&OZH=KKE`xUn1J#BvNZGWQYTKXne zEockDxH!Cvi(yLQNm064gq<(UN9QB|x!A18+-Y~H1jnsx{tozV^7X@B$9u`bN#7A3 zGM+6fADJKKw=v)Pwl;^b9j|KlDQ!N0o;RV*rDz&i>T}@xNwBQP^<`qRIqFI5)u&|h zZT<1L-5m(V=i%KGrMmNFPq1wdqrpS)yp5No%J!HPK7VjhX_pxW)(D4bp?+Nb# z==l~Je@*Ux)oz9o+5WPFwUkob{|(?Bd}$BHh`av>hsazQyK=k=&NmVs?=n`u#afZ= z=05hAlRKy!b9~zPR(5kGvUmFJ2k?vUuiu9AtK{k#H14Y0LXNKBRbnnSb|*Lv_w9JJ z42*v((?B&z{W%`Jhv#q7%@^7Ff#fshex6l&k@H8;pbMNIB=`5yocr)U@)g{#+>3q> zYxfZ}d`esW$j}JKpKJSP@*cYm?m(wgev=D)74Ya1uw4cJ@N0L0KQfwi1z}|Bjh%=h z+ttgoWGEVZpuCM9qm*}DA4MlV@O)${e;>_at;2iT9Z7axRrldlBKv6vG---PLGOZo zcNq42@M#Iz{15MEsV9MP4F0{t61)Y@SHbxrzw{zMAG?!3O;;ZSckJfe&2j9C-Ict@ zH@x@J`7R0W$Lab`d_O{V!0J7pD>Jn7U*cmt=r;x6mkzdcFtz}93pBVJ9*^L8WFCy{ zoju9*Ya)SH6S+T3&i5tq{xMp70RPyD;A6Oa2)~cS^)Xi#nGWNNpkeTTUU^X4t<_Cj ztAOXlJbwb5`~ANNjIpzvo}!-jQS;rAeK9gU2j69m#ak=4$$w$^7AF4}k^j7C5Lvh* zW51mr;Pn_<-4Clrwd1>2{g?gL4xAxBr^NZEwVzWD;w(wXj$5$<(?z5+pU5t6B9Awt zMmyK;ajgsZAIHl+U>yke!F~~TEx!JU-8hE9IllIa9e+oo(}!%sXk`RiUdUJ6cp&)NcRl7qyRl2LE6qT7M+U>-|C?~WkXI#kK8_uwWn)!;fljeQ!xwn}u{OqP zV-$Qpg6k01`nc9beVft}jbiusf}THw=PSWI8LS_I`B^mat+Kw%2{C$#?+)z33)W+q zS+nfPyvP{69j`L;W%(yl=G;u{cQRvV*(_PMsZV5{wC47l@hZD!`|YdRouS@BE=qu} znfG@0-tbA2oc{;MjpX&1k}bvV>nSO|FUX#yWQv`c)p=9S`!+z9uTk&Z%nVk>jU)1Bs*hh~0sRt;L$#xLY#Z8rx?WPN@W z?q91T)8`g29*1}Ardu5C(o)Wyubq-3OMRt=Yt_)Nm}}C*$T||4Zckh76T54l(62eo zW1nS-Pm61E=%d^92H#>gr3Q{mfg^SiK7hYF@pYN9LitzuBQu*_3C^GYTUp`$de=@X z4`1F-xkqWEt=gWC9hvi>#VK^!i>5I$u|)Y3%_4hnWC4y{dtX#yEz@(( z`>ThlBi5V-&v~9-tKNzBnc%(%PfPkgRr~2+i+HdRSYyY!$Yy*6x;1q#vUFB;Ei&bw z)kf^J61#Ur7TtH?JQNI(p)z)}dF=n>P8mWr`2z;6On!TFL13!ms8%H4UbEpRatbaOjjzW7@u>T!|`#?tpMKw zID~EJ55wF1zA~Cc+y8jSL@@MMKLXYpz+4Y(Wx$q`TwKUfFAp3(ug;VmNWBv8BTN1E z%yY8e&{4lDhrTV*AY?qgFq*541Ac$8cQ^IE*j4HkFnr?uv3pkRptlxm+tKkbID-G@ z;c~`vN8MWo-+%pff)Y8To^~&G%nKQc-2;j#!K?T}Z39@Bc~@j)o$lH3t|@it#j4@#B6RheW55ZmKK@Nvhc|v z1Lurp#qMFJ$=^xRl%kzeMk+7t>OKlR-h_W-D~??V;=Qp8SJaWYwqJ7n!fwU^K-$MdC}IbQ_-W2b@~>P+|c z;qPj&{*G>+lI0iFv8pY0)yNC>&D#ITyWaKA9_p~uSGiUbypg3imus2$do1&`Z=|yM z*72-e3bL{NXYm|-_+AJu>B^F0@6XVmdJ3%w=x>wyF4)3Ggbam_yxWcuS z>OE+>$1{hW#||Ys-Cqy(+3NV_A$Hx0%&qO*Z|t}#8Wd1R_Srq)j9u*`JNg`Oe~;#o ztvqa4tRD+`?yK(MxeM9Ba~f}q9jA=@fN=*KeE{5{>qXHfcEq|w+f5T5%gXHdM#qtb zH+J-C3x>!beU<0ygS#wP!rsR`K+D`M%8@#Kl@|yF{ok!;Rg^stPS!8!V4vy1cI;)&P zvm@?>AB{}rKYM-x85r!^ea?e^A>YB9-@p~VFyII~-4V=9y+3w~ET_%`j+~y0oukhv zC-M9^exJer*u9{P-^A{^cluo~HuIB&?|A51ad5zl#95l#2PWs_%Pm&_m3A0@JS${1Gcq!d0jb}EdK-=H-=gntn`{o!4)i&SL&4SjwM z%!3l1pA&oKBGWSH;&)`PAMHGB+#i0w#`9)6M6KuezSw#49NV6Qtfm-W%0|{AV|FH8 z$s+!WUFKt_;>c8g+Kf%uhD^OY_R2fgX)D&le6QVc+8oJ$$2VZH)BG#yzUVSg-CODJ z`Pi`_c4vE??7fN4A2|LTj6ZrlVwKpHG5VmfBSUBY`8n^7ue!tD$J+nJ-oMhlu$g-u zhYalUOl13C?fhS`%~D79@7USk0oP-fi?ZbAgmd5H*Kk&y|=!U3K)wPT9 zvN+g^pj{p%hi4*F{YBs^=6)44Y_5*ov_BstZO!Ix$ZY6(>?&fnMKqiS#@Gpc zH2n_W{=Dn4J3;u>9`q^nEOx5+)H73+*uiAI-<@+mJbWecRL$At>Q>&+)_XgFDRu)KsP;1u$as*Y^((NB+WZ2rN+8Qwp}JHmFq;XUz{XY5os5G|i^9<$o_m|J_kvgc#>oORwa3tSNky{JU??9SfX*4<{{NO!-c^NZn8 zo}`p|h=5=m3UC9S=me;mT-qj2&Np0mom? z|8*Q$>Q^M^A_BrH*crb%KK{Y;r%P{c8+$x)$Ui|eBZUmQXe}M^kV}q?3xfeBgL*g zb{GS1Z_h>FW2icIKAWYia2~J~LyLOed4u|4?;il35#agK8>gw~x%Rtv$1Wdp(db_> z#~<$f#=cMUo6kHy#4|BQ&>lXuT#xuDV2vGbBD?$uaJ=X|c1H?d-x{2kdv_zSMTYun zjw^Y#GPtUdg-bls91ZVu?=ioB3s>UXf#qyPtc%aDpI!$Ht-Y^{x;Gt)IT!&jI%zo|%J&vs|C(dc-lWxEH$u+yeGS?qBeyY#Vqsg5x(O`2G#q8|yeS!N2Og zgYY+Yf9S66=KM)EppQCsT!~#nr+9V&xVNb7eZ!aL6zhhJ=FqRs0bV=7gQc@NcJd8g zKL?iQJRPM+QqGArja5629byY9r@eEtvRL_9+ux$&D6mG%{wjI}Z1Js1AG8V|ANDBv z8xiL}53WJr|3Do&A3I$~Td^PK#s0q>{-u2FvA*FZxHZs5jF|fpm!CUpY%M2xM9z>4dJ(&a##r?A?zi&(X0A6w z-z$`c&g(1T3tD@oGk9Ny!zeh#j)JjM?J1?0_tydE4eGnRtEYMZz7O;6(O~(?wQ1m= z0p6LOo5^#>E;V0+Z!` zgzQGYId(wnhKBt-H`wu)%D0~N<*~8L?A~^UkIsefXV{cn{Q7zG;8~2H#y6um=z8pI z8oOGbVlQLovlv^7F~OW{Z+wxKMZ6SwfFn+bUE(4S_E|Hth4`LK^V7NLaE$$*=YQhs zx-9w_#;82k9b8?(`GotiJ5?W4i@s*qt(jn3svPosj622HLG+En?{opj%V2sP%wH&< zx<3&d-+*&wK;M7~hH=Sz}k1*m>$Q&s?mHu=TM!-(s|im?CyJd-it6vCEkJmS`G%*;8h{vV-b4dS=%T4IiJ=J7YJE*bzRL zeuW(@-22$I&s`gb-{V}H=w8Ue2zA(|$H3az{peQ(-Z}i81mk+NSV=}>XX{GD3 zo6z>GG4cyLOvUaqPr|7S9G>)CFR%|r?@ydhXUD?MZ-YywXG&^2-O-ia7y5e#*d9ig zZrnb7RK!?d z>@pSOeLd0YaqoV@aToN8K5*;=^Mdo(BqR;=lFTNp( zagkxl2hKmk^PpesI5bWjz97c+VwdfHes{O)tsKV=9QoBJ&|)3BEmThf%jaN|W%3-|GAn_)BWP4%njad%OBxbc!8G zVvR-YK=rnFk5+%|e2izuy8jvY-ciTg+=X4<&n9DZ72MD1`Pe;Wy?6ZX{Xcrom+DdK zA+E*lKE3cVc5&?DdhkAWx{Q8Y>~#7%7)QDPy?e3K=U%dz%lpc(lL2Q_aK^aSJ^0w2 zggv8{xxlz-ig~`+88dc(F=q$nx7>S42|sifd5m3h(mhku?_&b2GKl&ay!5_Q%WTo>t_zL|o9NOdldG@1}G2Yr{8=8}_ zTUfsbTzTAa%s`KfoKRUGw2G_MU|Yku zYF+QBWvs0}TGlnLRZl;phIq3U`%?!k;OgAS}k)F$+ClVf_7xbBV+aDb- zHd?b&9eYF<6z$dqQzLT)oy21?e$xwWo+X!Wh+1AF9q)?(-!?k=kx1i%WFBIZ@%Z>Y zVw?4|8?4I8poc59x(X#$>%Xl{)=b2j9xJZdm{rC;VlI6(AGwOXTrP%RWj)MNdKC2n zwmyR&U4Y)^cGZ)$uvkRD%?#CP_lk)StBItVsbfvn?V{aB)V+AXfvoLN?;dVMWu$sE zcs_LeF<4%8|9LRRcQUQj4U{sD?VD&EaJ#qdvJz<*`HXqq6UqEXjMF`bmoc~5MNjuZ zRx#%M9#Fc8V0xJYekGx2IdMy6Z?AwF@W1 zH>|-JiJ$MI{D;opcmAq~wYT$!9N*wx6W+I!$l{OtCKJb37k~|AX=P zMaTW|yQ^oq8!3&oW=|O9c+hBeZxnkSpGV=$EXRL`r@0lA?P=dg?qpp?5*f{spE>E%Z(qq&G)V_e?Ch+ z9c9Pk->0s;K@J8v9_aW9r7NrOKYZ;<4!S7M;q(iv+DO+Xs^^i54S0UaZ}KMJl`PSB zUn~|`%pNW_HohF+ms{_$iZ5LQ)|FsftE?cStJRT@dbRs&$;evq-Dcx_>u_lc8?s5i zZYK%dMauSA>u}QAmSg&u=gDa7Dj4y6?9Lr?T}9aY;$o>X>e75b8RHKX#e(JWA?R6I z>uGFqswlZSZ4G@*6NgmMWeC)GS|v|7V45zTtmSJ1U#lyz4*EHKzMmZ2;C?gkq^VP3S>ACq z@>mbAuLRrOuJ<7aQ}BN^StvkCuMh`C9)Xc`eU2-u*~D{fcCi%S?xh^}9mwAESEcMe ze`U%}-;C^)!^zqRkbH)QJ@CCD%#G~g)ml2Uiauvp%edON3oGPTStjq&GV=+G&+k?r z%3LIy@>2cIMbLJ44+~rb_X^-%DVDnwi&&l($gzf&%hC5ww46;2CZg-tu78X-vd|bO zsbIZo8k>;H&ek9wRY_Y7mb4bhs6j63kcV_~a4BD3%Q$I${k$||BXyHCX+M*R?;OW| z2O%5JyLUVL5bGc_@p~zLkMXX)%B|j0M=9Er{sjp-$eFeF!D)_FbvbDC=^!Fy+$UU{kdZB$}6rD*T8u)e;9rBy%7PBwh}4(6JFQF?@Lm)*bRCA`79}$jM;7H z?>F-C8+e{wG$w=Y$n%evz0ms(b$z@{RcCj89?y?v8Y$0Q=^Ln3#*<`V7For2kwZK; z$?VM9Zet2zEf$_~1IS{#}a-epm>JPTVJP11P6OGrUF zn^=o=EKf&@IFGeCd+>ENp89&q_(UargKGS5d4&#xWQ6OZ@#bUvn4q3UCl|OE`{|Ux z`Q}=ED6s=I%+c4>r>ke3ak}p-YS6tj{pHHWbs`HzeEZ)>yq(7X*U)FE3aWITsw%y& zYQCi!A5=}BF4kH5P6JG;P{br)`jrd=Vjc=(u3*T5X z5&g?`;--UmpDX2vZ=Vj!P`}r=A-l{kY_k*UZr@Ao(bwPQOXAJ=w1$ptq}h>o%K9Tm zcdD;R_`AmX?O4y9f&Z)3tDUbhzqHXBur>Vs3gZeZ@L-9vwW6cNqc&ZH zv$NF_J3j_rW6kYk*S;qQ-?9f&y>G1Rqa6?O+#`N^|5$9 zTzLxg_c_1D^?LNa1X#|oABU32U?uyr0pFJ=@xn;Q@8JErWMDivrt$6b!Mcu}k9AI2 z*}0-Pn#$J4y#5vV9p89fjnl1_=J;KozNgWW7)3gZhCA^)1Hb>|GiN%Vgy)~)!Mk|= zE*`&0=ZB;F2Xua{Yd<aK?^*;k&fTU4t8YQfJ+Fw*sm3PD;d}7EtoW-MUtFGCRA-@5$xHP1@QBXenZ$mz#eFrb z!%I(i{CUD}euI90>6wpQ54m{CGdH_dn=D-9c)j<{_Kpwmw+}vda(=aUTmpvjWTBjU zWtF<#eKqXv_uN4GKEZiphB?X4r@=4gG<&o0L(pI%J)dnvVmY2~g5e%~-Us4sc>Ndq z{-rXA&fm$}`6`CKY(de@VyKP!>+8&~txt5mmHMiL?;CvMx5oEst9{F|Tr9uFSnVo2 ziM(&|tx#mriC*S%Hhanc@qHa1pP^5_R!)&6^n4B7U!mW&&Y0|4zF@tt;|1 z(fC^0yN(pC!FRhBY5!|5jbZ~L>&-B*49Dwn{yzWPQ_eR zPUAy)=|Vm_S;`zn5%a#0ZMHa$m0=@Gc{;w7EyvQ7Gxt=E?p5W}E79@lc%G`SRY|F? zA6-7N0bkSmAIZRGp6rxotKi{PD1SHJ#y2X1ls8D$hpvC*`WGxrW>wC2q-^zZC->)lA(C52g(TW|v%=;UFDc$=oN7YvDb;IkSc>OKyTCE&WD#7n6 zxIU=FI-lx#l3iuxSdmBCOp}gWa_KNu&q@Usa zXvag9C!F7>ZieSI9p_btjo(IsR(Qv6+MKNIFTMXw?|Rqy5a*vb9!txABnPp6b-S28 zGUVhV=QUa2nCHC?4Q@&JonI`K-#kxIbSX#%is5}>5qQKzWq5;fC{iBZE12Ugo7mjX z@H6~+^qq&e|02G;tOWl*a&IbIzXDGVqFT{J=hNx1z5ehsGVj04(+t7yk42Fm(fcuE zBI5bi$-=Xa@9|s<&y@AsQ)FnF^1XIP;(LGfLrPmQL<{Fl9A8DhTY{sb@^B)H<;5Yz zz)%A0`C$?3TQkw}Bz~Sj+f(R#S}c9Ue8Lgm!t54LAF?K6r*XzuE51eFc!#eNcaYwV zV(9HGYxLXYr$W;qc-zzYgLrT|{j(0oGiRY2g?{eif zr7OK2NS=l&qwsh%xd>f<5!4TO|IMyn>b#N?GwcV**(&YC*W*8W-+1qhzT4ZbzodSH zbiL);Skf^|y~JDh(Djp|`C^IJ4Zoh9Uyu2Ui^Ng6jkj65i{FpX_Xkj^EpA=O#;5Z2 z1=J_ebq(InN7rfU@nm3RLf=$#J>`u9RAO7JC~4%O8e6Zg=K2wOnaj9cO&WI%9^Qth zk)N`U;~2ji>H28(XLS2LPYrkcy!)}&XbW|DvXI5`I@08KaVOq(aPMwB=;7KcIEca4||_e98;Wai@C5^uNP}*gYQqH$FnH& z99{3N_w|_LJ49sHl7s42K}WC73^)pu07XgTwq@8*--h66jusz+pJH~7~sc$2TUBJ*2rQRkNU+Xpf2bSG>VfjdJ6|#Oc zJ9j5uKZ6c0;(x3aj$IMPkkGM4`9`r0L)iM~*!VmA@~Q-bo%DSxuI{w{d#zacLRQ!z zcrgGE9!K}bTz`N(^iuc5pW*7rW2HvQ zVfg!^eqCQN-v3a#g=f>;E9CeX{%*wQ7(4n&J>I)Vc+XI!kN5OfzpNet&hg$jm0eoq zSDQt3=V*N7#Hy#NJ{eY z<&D!+;>#=GdlhR-D&cn(W2n{4<5x^<{YdB2$if2Gb~}z4tyH?*6!mYy(}$crNx%Cm zFNpji|J2*~{E9mA20h}r8`TZeCH&6H8dRxj?Odw3%8Wx7Ca@ zmH5s-4MDz7O!P)#--?YEi=Zu1vIO) z7dC!TG8Xd;{>SbB!<4t#fw1=j@c41(cdD-<8#T#89?u=q=1T9ItDa2mMzSZeMC12* zau#K?`GL)B{!Ve;W^0vqvNF49`+j}U)2MPPiRrF$d>4Lqr326M?JuFrYj_{uISpjv zyW#hpDBg^wR!?kwaTF^7>at?2i_!jKemph#esKW%+Y7C`iQjwT#|!-K`-#3)NB788 zR2kiCiWutPetkOE2u~ZbD~)}l5!u3H2gN3I{Ti}&H9OyuuW2FXY)#nV)Ms}tB@gyG_0Ab&;xAm=n)G6f&C%^k+3{=f zG~)Ef&^LC1c^w~K*GnCW&b^ILJ!!_Rj^ z>CK;XrD3;_#mMhk0nAnsnmx)6mwaq!Zeu5T%|{dzQ~7?Id_V2Dw-{z1e>Tkd=f*6) zr<<{t%Vs(ftEHkRdx>%#KHQG(53#<_p!pzIhpOLjK2ZG(-gH#o;JO|Y+Sj5PHPF5y zds_|`7hA_uh~5=J`#fxXeA|_m{>9q-+}3DX!{~S}8x!k%k1Kh#Pz@eU;B+JT>+Jjq zw)J_}2E+Fa^-FZC4}9-;?-n}PkbG8f?IQJV;}2`JBpU;YA0gML*|{@xF4nhLlY+u8 zq0P%^G!`AccN`<5d)R_g{CwoktV))zCd=)}@-a$8apV6v$<(-KG??mXbQ`9 zUMzpwx|5h|J&C`E@%be&&i+~iIYQV#dCD+Ib7<6t8cJo zAJD%k%3Qj*ndC;EiO9B^N`ITNwl^6i>P-3`b<|t^f@uF$v-17*FrG>7-NGi^NDAAs z@@+&R*N~7KLEVaGwxY{di!Ga?e`B(D;hit32h*zIARa+JzXIQ6{Qr%AH+#bB9mc6W zq<0(NZ7(5Q`Gh_F9vv3(Nb5zdtLgf$G;5T)8|WL+O?$kG=jMo^BLCno`s+p{MNXxa zRCK-s-P^j>6G!Y0!^{7KN zl57k?EVhem8%1{Q5DZSy+*p^9hd0d0N*1J%xx_vB+0R0rD5$lPY(P;mS2~Gz?xU0K z{Hik=bjF`PqJ+=c7}*U|M^e$c8}wej!)C?_3H1v1J{9E_ZInnNe9=^y@EK^fXu}HXx+(pU*&m_KFg1GQEnt# zmpQLa){2vi`1<59e0T9p`%ocvuZb+|zG|XnM|h4C;@bm$a}bA5khT-BJw^Ku85KFf zs@lCt>0^W=zNPygz3WV3?*-#?VEzb13+cTtqgb+nWUjb%0fnpyD`PEn(JcGbN8MXP z-(zRb$i;S}QjC3AiiKw6ZIk==Mxrh_|1oy@(T{hkchG(ok4UBL8a~ zuSfem>Lu!_iS9=Z^fRb+TKhTZk6mNnb|+dkW`Se=s~(Ot#l1T~(-UXL(UMi_YsW;itl50@oxsNSX9I3V<8m}=w_na;Q{SNTkD_vG$5*0vBl_PG zeQ$HWpAqpfRyt&$eQtK*QatID#0$T(r}Nm+zxednJ$50QE(CD~3Py(hb)egd*L&EC zm}xsfZ%&ftET|r9CbO}Vd1+}bI2S;jEUI6dD!QS}A?3l8K!gpzcFQA0;up z)qRtAC!GbVi=#2~R*#iU6Gz3q(RJh`Zy;w$9r9ksy4X6#&(r1N3`?8FGhV_PRY~S$ z-t>+K$$T4f-WXjQk%Mciul?!jKoP>TVynABaEtSF z@>SJwe3^9uKUR?XC5qW>$9qWs5oh}oFI|pQ)aPl!bF|Q2#AkJrUdBFhyf^XvKeH6$ zScze-yg=XMTfiRRdtP}Dg~K;*2757dyNW(`M}>F!@9)rWfvd}1|Hrk7$_sS;4%Z`B zhTYEmwgUfEHj$@xWa~1=ElE&YbbdfR6g?(;Zj1A*eistiUOP{#pK<akX+8S*pNqpXbjv zlDS{Z#($~D@rL6U$>IRzY5E>}?Y-mLY{#(=SRVeZiE=lNz6RPaY1$n1-z?S7^kJOi zzNAS8IlMWB1M<|9!4a%WA6)GS&o=1UhK-Bw@*e|5jMYajvQ6|qH@RsdGU`CSx|5&h z#qxc~PvkzjhaG5*GL6YsWx5+*e(k}{sHQ&hKNDPBXv1 zO1VyHLRKreevx*fzqrJ^zr}+OQEDh2_a`yWvZQ@^>G!}s1%)&Cj!g0q6 zR#im^x8TXsC^{N{Cb;$kpFS2nN4Wl!Yq#QGHBX*G&n4RYg1!$>I`i*$kb#ciyqm7a z_i4jO=u8%B11ZVPC)c3U9pUyEuJ*;nr^!)w^=&X}tBzb(Wz{F?_71jgAu0dQn8ZJ< z-Cz2t%asl8ozaUb$W~ORtxc5c$YmSSbsbxs?j1$gkmKGN^NxRM?Q7J0AKhL7*Fdz3 z82^3s6f&@oJRCMvjiTwF!*ZO;+yB(`$7MJ<7deHaIw!6&um0rUvQyb8NUykQpB73@4XJc>XG)6o;(M} zjV%4Y;EuHtzo5k5$`bwZE&k5Y{@k93oM827M$057|BnY;CVpCp6AM_jC8DDL&~24i zezEzWnD<}ACoeRfuuz{f=4+RF#~N=~0rGX|Xe}5ThTM-r)6X4$j;?Rw$1~{K9?xP0 zR1P}7o~}#+#W0rnX>@#qmHHq4cct@vNbg88HdEQiLS*N;>+wuC>j^$WuAU-OPov_a z=49?rS}E~Y%v0z2<_!A%AN`&IyV-R77uV)HUauT;oC_r@(EB?6t|ON%>3PJQm-@Zc zR_<5j56hrLNglZbxtEUuY_FlpYy3}qJ2Dphk#}Gh9VLoD(f_U}`7}v;N&SWTCp6uN-r4b?Hf*9l_9*?1 zT^V|4=K<1lm-erQRbX70mCEF!V)T7JS)BpS@5$>-)Sk;$tyT8JA)olYJb7t^T33+^DXL7I{#8KRy1FKF7L~m%T04@jXe#UvlkL zkWE12Iq1F1d1P}+XDe<}N4Dy2&K`FDpz{uNKX?~?v5WBX47k>?Xp7m(AJA_)%QX${ zeuc*(GO8Wmg*gmy=Nad*6SJ01=Dw6 zjB%9c-;E*%Uy-0W=(${djQ=Rf-^6O(*je>4zlykX5ZuGg#e7*CvK3>i(K|cDMlM3r zsme&S9L%N;K*yoVdu-@ep{L6J=fz^tXtVBPFPEB zci`VfIbH@n zx0*HFRmgiy{E~Z8n@w>kjh&9%dMCgYt7LysPoUXjSjunFGR7pAlFiMEYy-G|00i6N z9(|!rXu65c@8s__!me@X9d_8==dR^)#g z`AztS(BKZVybH$7(Xt^~jT!cf(Bv2!x|HqwnT$?Gw=dCelJoDCf6#cH zatvLI_+8{xZHA_|Xy*>?-r@L0ZHF&P_s*jJPJttA`5$!sTd;kY@II??rxRr92>CjW z61(aAA<)Jg`ySsO?1b+QK53J=kqzSR)#wr5BgkiuHs{IRCNdbARwtp~r)V1Mnm$&K z(c1U!%}ZKcL(0}CQO;%Pd5hn6($<}L){ea1piNnQNy`pgJ^-2nICG30I%CcyQ$I8t zo0pfZ$`1EJaL-FWi__1dFfR%B(r_Id(zQ^t1X>;^gBx(`?}UDp#W}J5 zF~;oD&^C=PN~3XA`RrIlU5VwaVuYlMwo>)8s^gQj%g$qs{H5NPO6oI7UFgYQS&o*m&Lc0$ufRt%N4J~NwWInjvf9pD+v3UXRmwN@Heb(L%+O1TagF06HdoBOEH&F zS8Em7keuFal_JkC|FoYxGF|B!{!%ItR{k@M#tv z{a|E0_8f>Ao}WqIY*yzlznl;E_~vImyffJMuqhkpQOs5D@J!5E9{{a9vLcr@=oot^ zcjAF#PNWrE7vEi!qrH&}{jkxkScx*%nu#(q+< z%SmHYzMh5X=#A}I^LFsR3ci=Yzk(9kosW>j<$gVf#r#rq|1Hh8?<#tJgPxNU4|SNQ z^3}iJ{DhlxVeto@pHG&SqwCsa%;{2cT9#bo!=*zcKUUEFNuRz$<>`1n0o*ghIe+Na zEC<;hk!)l-C@CVmM8tHBy1fyQ4m9;<8h;(^8^FJsqrC7xjb5v1)<1qX4Q;1tD|U~c z!LrXHXA8;GM$t`*rwjP2qxaR!*)4e0k>_cxz7}LLe_5687WVWJ`nR2|{J|&xEJhqh z%D*K8Q}iF_=|L_Pq3p)}ljNf?X-y|nS0_5Yg5GabwxZ`wGIkhk4${C2^L6q4?gIMv z9jZ-dEykkC_hPfi(Y*w}tZp|xQIIz-N@9w_t^k~iDfw|f`Zpz$IHV$d$U_feUEq3U zf#3av?^Cro1#N#K+vBzocWd~=#TLgV8lKE2Pvofkz z^h7GZSP3s;t$HfIRE<5Zp71|*D>YuC~x#6R|=S zbSXyfPovXj_=a8nkx%{!oB{7_w)7ADi!8xAaVj$7jNNZ7g z8M%8Sri#&%8vI9XQq`EfYYg{hU~Q^gL))&Qc`e0L*OQnwxYHI^t>M=So-Nt8>)_qe zUn_EOC7Exo&C5|BR#;s4?rH^^&c*+kppO`NI==sdFA?3u-)S@`NaL!~`34}kO1T=| zEqKT)X-9mum*&?+lq_uC4&E$-hR@N{nvLr-{r%?rKipsGO6;j{9CdP`+r=WtM%sz* zU9Q62CVYJOjXLD03horf&G;&KF9>4I_agH78~#V^IGcX{4ndtWA zj;?WZjkqStwfuWil5`cmH___l-Vi;J+S-gYYSCUQI+O=ZaoSiMy>o&fC(m%w)yS!I z+#61T^PqAZ&-So3``PU1QEW}(z}N?BHG2K&|G9ic>>LpznRc*Omg#fG&QGDG3)!>f zNiVIDXrmdt8}dGv(y1CsWjb}?+ubbiIzw7g;29LNPd1JDLkmmMWVJVM(Kk7aE_q-d zId*F+4f(s+;o&kKx;`C`_21?Bx}xOjG>O~i?HQ;)-|zpzx!<)nPkZtG`8u{`mva~~6JIt~jpbfiujonFK zB1W}yXs-mFPiIH!^SKR4?ByVN@bM*4d{?rL zPHcnu4sY9suZPI?KJ+}J&202M@{bf_smg*j^u01^OLez49BZ>_b@9nQEq<|(-Y;c+ zH{rl8T6ls)#+Uv@P_QaFuS3Qg(ewIBT^6*O^Ri0pPaBzmkD*`mt5%}f0{$$Zk31le zw{|`IybBLw@7+A8UfA0!C6R7Mq9qMLkxpN0k-jo0SCk}XX9o_`?(L*}6@8x%>%SfU z$9jh6TjO{eDTpuAvY}T#G_3}UY9zNI`Kd*3YLSO(I9-M;#9Uisln76=U5TF6DzL6# zeO91ajN-2qA?-rBnAJ|f<)Sbyr;eT4Y9%uqP1Ug?EqYE3;oeNEjp#^>y42NXO__{YYf1VF+>Y$W;|zdZyFZYDy*CsetQ6=x0H8D#lok z!EGHXZ}rAixUkh*H>1)v5FJpWubTqT0x*u*1uFnxTP2B(D<$}sO|A!RVkYM-ocF`( z!k5vRICcu0kqv$~D8nx8ru{oyjU6dhqfQ10;)|C>c=ey-r65?sIxbdx=SzNL#^@kE z?@;d`+ndOJ%qYc93j6SWA6mrfi}UX0L*XKDkJ-$~NggvosjPJwIG6AjtJ`zp)ftot zY1o(OeHy&$p+haQUKjP7B$hXJDayjC=OpJBBDsd>7dt1!Oh99;)Yobg7RA1JtU;{3 zkMDhgbDKcFft}w(6F0E!yI7jDUWzHD$Y>>Wh_7ubz`Zn_OTak~{IikB zm_a#2uS4&*()Mjhq!c>{{j1H;^?2ql_^;IF3i1-)OTyv3A<8vi=`Ty_l4wxewZbGT zH#)@kjp4cWCvBC~UMV!S9~V08q>+1Z@)W5*Pv-N2DOT^4ME&ya6a!6pQdh`%e5;e! zaXy-u6)s2d_5hvULgr(&cFdmbCJTF9I{@d1&a?PU9^A{NtFZPkXBc6`2n=G)5nd|aornFKS$BR2FL+cB}wJ_Pw zug*c=qi23Z8~e4l6SZTPsjaZs4zdF{evq9z0+Tb2Q`okGa4(25rTO*}s9u6RM6aM2 zo)u8X_mQ%%iq|(O%M$rM#Nuzq^}VEi7fFcz&Iwn}phonhbHS*H61c|KN3pKA2+1r) zbMt~W59lvsD5(I>vff+`1Oam;cvn#Dr^o^yV=YdyKw0T{K3ZNl!Mh5~FHWdX3eNeQ zg}pnMXjobFEQZo~Q9qA%BY&8@%b?rA*2SK)ksl#4!(@kFUVJJ^=A#c5@?Kae3D>-d zzAuGKWMhr*z5dZcjMDt8jYasKp`{gYkJS>f<~zpsV(f62vJ=h+Q2x03JQ>JEX7j>1 zk2*526?P@Q+$#rP-?qbjYvN(-pQ%1T){l_+7>mj#ipfdlb18+$cYdBd$9YSwo zPA+g?3il=K_#(K6e8(!0rRs%bXbBszkOVD(dwi!JyLg8uU9XL>d7DY{A@URJ6|;gr zBt0(}^W#%d_O66Gv3@3GyexhNJt{k|ir;B)uj!e{OdN9+vD&6OK8JqCH{yj7l1-vOAXd>@+ewup` zD09L-D=e~t{uBv20sn&}?jWr@4CbK23FjvrpQ7)l@IK~ovax5m$bLy$Ul5*!$bT-h zh%Y2k+{^0tB%Yr|!)PPEn>hrVSd)B^79PQ&lb}5ZgR>yc3dY>DA`jeR)qU)DSezV$ z9>jO&u}&qjSw)_kvxz-hi*{@MdOhl`(AFySSf$>O&?Pcfoo5BJ!6K)(=3(FRgFGyI zjMwD!f9~Wc*8G)D_1Z-j+SNXT~AHp6$L z>uc1}`wKl@nba3}y&BGoov(!V3hf0gHYt&DdN;Y+;dh~3hv0n@9Ru&I;LejseptP1 z_>+V5+KCf>MO-fr?y`6lILDfobS>0!KV%@*E2N`KWRk4m**fq~bFG#(gdHr=Chbb+m`5a9`^YRKa~Ui!NbVXcsz-L!q!Dx zyGV&|_7=izwGum;MDCS!M}kk{xK7$&iOBfEw*a!$>nyV5%6OjO9(o@G z;TQe(@}#7yx{^Bbe_hy}AXZyuA?M-mV;x0&A0e|V9MjOSoa2jKkIcozw3pv`Zf)dH zM~2;V;0cY7zp#0s_mOQmW`V-Cuf~-O=WD?nxxChZIdEHtUO|ftzYktV9jibiQjQFi z7k2kP1Mif?-i6G^3eiK(W1J-3odeHuz&$sJayu>rkAjX$f-^Ed2i|4CS;=|m{RO-u zTSwp@_APu}e1jF^eVKe;WbsI$_viS+cqTjAWKHN(+5OO;nBT~&-Mp^n@Z4E&AE$>q zz!v@Z4D~X&E(GUa;GE}tE}HyI7GhR>n)01{liiDP`0w2NQHim<-?a5Nyp}o7@La?< zk!k#lw`7N3WEzP)A`zRWqd)_&gziRW@z`C!ezV3NvKfVoZ1b7ME6y4*jEt10lD>O& z=V^&NoTCq?$VxU69{&QDkf+e&oVt<)q1J@kx#rK}M z6Ma19o}BWDPD=fZ0-=v*l;~w=qd{RaWSmc~UFd^Ed=m7FF@Uh1F&`CeM)the#caE4 zkyR;lKWt)TVqQ;1Hla}*Z)P8M`F-s1xC?xtBma-6`|$p&I`2I%fl%*-UIY@wqS;^! z#yBoGapIf1?#%p|v(~KSCcbv;;9g=IgXxGOL@xsME`c=f*LlzitfTY$wsZE``>CI& zY+6{Sa`e$22U!>wlUMcvqq{FA=lC=7vqTiGZoXE9)vgTFxm-oc<)WRR7YPtyyBy-W zBK%gD*_HifMZ9y>;uCD{Z^(hY8{}HDcqfKhm-X)ZY{zeV?>~Egt z>QdvpDxCFf2>Hs+I??NT?-}`T7ougl&W;MYG8#KiP={yI6XuAHugac)M|_^vty6#V zE{-{N){5r#QuDs5*K|1DW9OGk%S@9+D;lZZ<{P@FHD+_^(7I)Lk3I7FB0GFePU*a; zuOW&%)%EPzr{ixZiE_8Qak-vL6dxtJr z8UL+Hs-UX1jZ^$^b#m=obXte%#=u|uYw!QQzkktZy3zh(IaUFGjzl`R9FN*UlB`TXLIxhF9p=dcJWPDm??X6>cWnO*;RP^-HwkN%NvdD!^Tfn&r?GN_8^@g0i(!G2}#@aoB4W$G6p?**Ie$kVy?z)@1Kl@LtjojBA{cFAd zXvep@_jh{w?=&9W;=kW#_~(1eT&_xvwu4R2@?f9o@PAw5-`scEJN6mlzw@=}u<7ay zqk(MKVY{*XSL1l9&wtwIqJ_Ht{=BFCabvW@%dh*+GtI4ae|=eZa^5weBd~Hjb1q$T zRW!#hS=CtNi0hj*d?h(xcz)gTOEh>*)|uQ&UGX8J?M~6y=oq{&-@;hfybx2nj(pT>^yqu$ z%-LG7H`{xnyPit!wEI)@M^DrD>^i#Lnm*RktDSwcaoL^a@#TCu8M>m+R)*Kxp@~g= zdBHWz;ij&&q3@!v(>?b`o$c21X0xCp^RxZ^$7s@_W9#oao@y@tt2z5s|dlogb<*?V9+xopqYohkA}jdY-TM-A5a0i7{wi>gFul0?I-Mzi>m@8)$RM+>p@2%|@FvpdRk=Jmf`x%1{`#Sp4 zGh#JwH=cL9C%JR5GoF8Yd7rPpsyXK`7#I0;d6D!w%F|)S#4ov_aopOOopWD*-?yym z>|$cQ$;fZ@J{tITWBg|0BI98i=1>pY9lfVgbycs8nm@~z{kUU)6bzSqwwZXk^VFrR zD6(T8Z@Y`I<<=FWU9tTAr_Q2$qCWh4bNgvyR}Fh6x#>Ul(a!F5W8-F*@9hkS8M?KT z$*OeL=gIv!!&)D1ZSQTI{L-6yZPy&*CTrJpEgi~mD4YCb^GsJCZXEdLlVuz_p0l;} z=#lR!28E|oxwdmxS76)VEMC^cX7RUmcR%ZWsX4#8zjcqdyUDsm&xrfcTkHEKUz|2( z%Q*N+=ejoE$hyDR9FQ|)DH-%mbHmSny?ejc=llfmk2m^0|A~HrtDNt1`h!d(Q?_>h zTe>GdM`!B?8sFW`m#R@T@Xd~g8Y|wRBk|J1jSY?5-TAiO=PQ$!>=QQZ#r{3fT@E!i zbA|qlOMK~19nbVPx&N2GXBRZxujv3$&gc97Uwi#ZXTbJ>#d6<`aXI*P)r@Yy{l`HYTtji z&ki+Cn1>xc(30KTp!%?m$=}4oeEZp9?ZM;~xo&r+hdMvf`wuLi!T03Fu5IqG>KR~W z~*racyUIyq(N8 zc4ZxB?O5RssgGT@`%hA2^Z(UALKk=&b+<-p(uH4r0+4qk~nAk$-Z&@0nM6jJ?FpV$;#?4(Qg^ zjrZ*0%ZbBW*Epx%RPSx$rtdE;wkq5m9=W^U-PGvl^-a+V+lluEsj=o~JM+`=><7zu z$@jrm?Fu!1vb7&u#ax?b^Z}12*T`ciYPW1ecB&aa&2B~PXMPWzesg!dyTA3Bnk*6+ z1Um3NJ`!CoF9t8cbc~Z1&b}W$;9GvO$a@&JIg|OcA|7Yw%MMu;|9cHP)i)3iiJ!4U zAPuX#6AGoH$xrqN*=;wr3+YY$7G<%oTIP=3|COHMo<5tgtCbLG8{4v-O-HG>&i!5^HX5~3R&+*-a3{L+;vzR^%~$pr-`H>PyhtxU1d7W3KDUgMUfR?+;H>;2I`a0uK?Y5~ zHnK__#!jGOYwecT*!fHN&p7QgxS`kd5f7B^6#MzCGoR?A#_($Q{jj@R;j`uf942FqjD<1Mn2KZizPJm>ojoKap79GGo?RkKA#uWA%B zm&}XWKz^opjJTFK75@1=eR*|ri8j|aj~Dw)_J>>-yUnqaA(eREctsk_gdLjP^Fr$` zPE8i^*VuU1C>q#Fz>dny(Ul6`{p>YkidAWO?TkH(GsQoG${b^(TL-Pku z`hDa3Lu0kGrMv+6nE30dUaKk+4QJQdIf-5LQ0MzQ9`5}IJ3p`-PC!k0MQ8IOq1_#1Y3tTDK!xxlY-J=~jBL2_^Ex$qnwwg%p(C7{2Ty2kNk z4QA)xBg=inxZTgSVMEsF^X>rS zDz14`qZ1btH5Z@aQ^?JMg|XqR`R^L_FS{pf{@2~>mwgVa{axRAu~~VsxrSZPqY!X@ zx6JXo8^>KeBW(8J?jUFI`+fEgjX_xJ!3+}YKakDpJePlmhkG_|;Gd>i1AFkv4`9k0D zG_k0iJ()e}SU#{0SSNWT-)MYyJ!Z`H)eCm_tG*4}dA2c$JBiO24|#6~M!NI*p3oTB z@30#9;`cj$zw?vb^U41HPUF!{neQnJUyjO_UbAZKzDAd`Iq03gHYaeUKlb{Mo$_tk?7@I?~8|T?@Dye?pEXW)>+*8E6tNQ_rA`z^&T7PhVIRu-_`xa zG#n#u*+L@C`kk|b$Yim;!RYb*@$Q4}@t|*#r;r^oT09i(iTBuXS!|h)>iX!Cl^|0D z4uG!YgLww|L1S~XPtm~T)?SW}-4ieLKRJPR$Z~dy4*W8D`AFCFjPR4oi+uAp`DVWb zwhMWzN6~*{V;8f5+=D;Nf3u73<#_F?c>d~QH)8OY;;(j@?=v|^;?HywS#+)^rcK2% zZupXabO(pWeyg(@xF>t|?{p^nzuk;J))?f@-_^KbJ>)8RNLQkzH+v<&$sQzl{^{-k zL&oE1@3}rhd$0C4-47e3C0HJO^z~hHdoxXLt1p{;1#1ppxRfqpACDb^&*g8}i5Rvm z)-<@3ct2UVW|8w^yc3VJPO!wmklD)qTiJEjcEI$-DCHQMWBNu+U~@F!`eH!%jcgE^ zn-~&X_H^^9Dnu@u960_Knu86EeZ_Y?(Ot&#lY?_6KZ^fxs`ZAG!$#;^{_?rx?(v>g zJ_rBRj=g9bO|sAA+RH#bmmFgk%atZy+a0-Q`%`21Z8M^e+0%WluLS?;VDH-<68=DD zv6t8r=Jl4IOhpNt>07-PR}_bpPaswYzrD9#(h2-1@o!Nxwk;e)eh{A$wkc;o4Ds2< z_ssGdt^og}*UzVKX7_TubFQ&(>VBT>`koO6#};y*`x?*vQ3p(cUjbv77~I5N`FU%i zQ@%9x99{?q7|e)mY5n!BPt>U|4PV7RmO}u~& zOIDD#WC}S48{vmu$zg>3ll^4z;hvMPA|6Idh%b^KJ9=dYX0dF3h>FO&dwoyWXKRfe zc+K*;xarp3hqFNp>|T!U?DmMRb;5)*;V-xyUMJsQ=nTt|Q_bcuCbo?Hx-DJBZoqsG zmCHTiFJ9ocwopTRlkOuw0U##~EWKpc?X z)l-0f!Di=6!a(3&bUM3>v|{NDhQ()u2a-9)Ag-&Q&gJF@-oavL&xpyf9oY(3MPqV6 zq6VbeXjxhtSuhKAjj7+n@ZxLw9vAJ1yPWopjI@4}qu9zi^w0p@2`|!dY+HJYU4v)kFt9Pn)!qFqH=J&H zurqvF>`=_c?oad*xghq5CrC;$WAsPYi3P~#d#gh{@TKlS2DQIg^e}pzPh{T=IsIpr zS-6lKl}qt?b8fd@al%zSH-8f5$(Dl;yZ4HC1-?ZGlejoYyzT1#WkZ`^nBd5@*E`dN z@HY6I+*LB+LNjow-#~;nbU*rnojAFl@DzIZ;^Mc$3n%u^e<35*_RM^2&wfRo(_1ho z7%Bc|L&FEIU?}UON0x+KPWUn06ILo`57r1bQN<*O)3dMWnfd(i>9x@xc?f5L3#9&|W0Mc-mn1Iy6OF;{j&@yZOuviqk@41J@|-R# zcIMfr(|>G9I46voZGT(WytUUblHJ{hZ8tfquqZJom+qI5%FE*1ngY{i*tJpIpj~V_IqYN(9FY$T?^2sV_Urz_ZyT)89N;?kt+*w8SDYDs#J{~9 zj$ke5n{}-PA6~BR*}iAK;NO1FX6M7LiKk(#*4e%m^r<~*&d2v`tMiLpJ^4I?FPS$U z0eq3{kSjE`s%z7ya(O;)y;XscIcgu+_GGNz@j53qre@{(p5WT<1An&8@pEjGT?cs~S6=UCp1Q+v)kq>%n{Y|Lwlb&>7 zyPO_KoY<6gAG=+p9E^;eJ@ICEHLOMKSDpns58pwFti8N%#cS zIJOsgLkF=1;W#WKxV}7kbL#&1T+Rsnjt0nkww;(WY*)U7@39MM*ztwM!JnqkH#X-+f3f_zil#uIrJnY-)Dib@7|^w-$VMyvLq{NUOG( zIGk&#b7D)Y&tYeZ$2La#Juja^zVYqR1iwzL z5}Aia#l2-sf6-bWkEf6HO#EjtV7laB(&J!fvHy?y{Qa!ZkNUM9R~Mr&StC#acar&{ zdezRPH$>ex_wOB@cQ=wfc@eiX1H1eG+PteBeX?P(eD^jIl?Qho`?|gUTy1Qq;yL<0zoO`?X-90Vui8NJBuCDgh?tWwUx}m%6$fnnKMx8nS6Xzp) zcwj1q&$PnO2+_g!qrG?HrMH@Y{iJo%wF8ho@^3ZY&vn?v_u2HpfoSEqe)~qV_HwgB z8|Xs*YP0idvh>B)d4Kn@PoMMi(Zch+_gtSn+jm}UR#}ZNH}^VKKi9oqS+1@6`0b?3 zyUY2dWY6=Bi+dmZ}dzS~tk==@Q~XRXnRxJgB}EI}CtGGJDh z4YMXIW=GzO9w2rG-<>CY$MX06z19=t-sJy%-BpIEiceWJ6R|uM()NDGk$|;wuzMZqJv~+QJ%_xX?lVy&l{j0Xtu3wkZQbemp754vK>v|jlQ6e-H#?Bw z2X^Jwez~eEhz_t8&orxg-Rh~_UX%U*eslj$|Gv>X`ep6!?{|8Ce{}ImbN+INOgvWC zb8*B=al!K)`W(F4sGf_0U(BYrJHU(0&>M~1J~8@ryxhHcimFim()IM2c`@u@e^+|3 zL+6p#`%7Qfm%Hza@uUiX*BY;C^w;CIcCzi7dZX=)=2YnF%%{3zM>D6J9;9XJMoCBh zHcM_zGq5&p*wEbTws>vxXNNf!>FrSkgwvi?j+>YHwyV&)&Am>K2U;6lT=b#-u=jL0 zfSf^}uWKD{i>L1{3Zc*N*F&owF4O42&JVWscXiy>XKSOAtD*r_(Vz8Oy+ihgZoJer zb?|wq*?XmP`?L3%zBKnoZ+QHkMy>PV?cM9%Xv|9QX{~Q*^gHA9TYH|JeTTM%9;ncP zD6wPc71k@wqEGPQ=E|-&>T2y<1T`aNMZDgN7G6*0qXK>R-dff{H~BYPZ@r{G?ENFH zm?}#AySWkH-1_Usa$iqye@~?I^n)GuckJmsbRi>Yb!W6=P2XyL?KAaKYyEP^{@&NA z>W%&#T6?2)m+3jZK6W(wdTH2UST7AdPi}17-rvx(OqLLDllBljlledPh)9`eA~bbl zGswf(+N^De2G%!+E8YW*7o*j zU|;Kfe{1_tYo(9Novr;Ht-fBq+j|eX!s9;E^*(8Rb#Qs5S$aBdc`12r=H?#uHQ3$C z-O-qD==XaXE1hB8^(4NtclG+)-QPF&47z8sprC~^_%=mflV{2%~+z= z_GWKgvkPGosn_RGf5{J9BXa+}c>KU}zGqqY4_hl}xX6fI3dni9s6W$P9S`=}|9Jhr z*6HSG!_HQ+4n<4#XSQ?3YhCx9?(t?c_C|E@X7?C9e^*qyC+ks$mF|#tHe$N`uH}4N z@7ed9bf@RHHUiH9ndPm@;2SQ7M5BK)UPXY2;Gt#Rtv^&q6pHmYJpVzmSRd4PTKhNq z_wCl`wN}6`v-B`~;H79o);J#4Rml!RZ}ucFHCj}R_g`G3*S^lXTK^qA-O4@}X*ttM ze;O)yC>nUPzu)P4ueIvr$y?EZF7t=G*M$!HVO!j>tMjb)Tb-@Hj=l$4O>6%_t1Els zcuy)%=yd<{zi_=SB;wIqn~yE&MP9&lQ3Cty+W6+${+3;NN8i<5Wq15?b62{pS-Lf8 zczahz1LX6)&6cWudKS;yVo@DX;>6izyvZf;Z zlYaN!vex(XWc!*OGX9?B9*4RO$|2|Bn~eJ}U7wbutt zXQ;Q5qkrr7I&0Xw`t@wOmm4ju_(r3*H|yJr9Js#sc4gnK>$@s)j5FIwLEZ;Es9xIWn%7dd%TpYg;+y?Eccw(MzU?&z5AOxEM0{+8Xcae_VdY!u@ylYHurc=OPoVIIr-}!$H}=bT^&s>Fb(7mFruY zPu~7`pu8X5YILr+ue<1J&DTN)*2OO0_h%)`@KM2kZ@>Fm>v30We|P`h-Fn;OL|?x9 zI=<41j4f~>yG|zr{+Vt#^axqw0!m zpF!krh^l$hJ6m%-N!CS|t2)c&k@JHepk0utlYMe1{viX7^i5u@zai5)WW1LwR_*;^ z{70@IT=?^o*8Awf^Y%d09Y!?++e>f8=i?N9-0UK>w{^Zd8n~$$+rH=l5s#OnJ)Kov zj_27BuXbe}rS`YV<3Hege%q1d{%`huh@$R2I#k)g;6OU#!~XuD_dbq`okh4jrQUAx zS5IX>dP22>S2rin@j+L0XV}mxnJc?0vhB7tm+KcA;Q8LXtj(EtQ18NzTVHz=y|=9U zzRveFV_#WxFgY*NV?%4bqvNJ{k{yTlZ|Jx!KGm^`Ew-s+G9>+;-+ouep03A+=f8cW zmASho+t-@&*=1JliB9(}HZ$%ff%Vqby-bmhF^!K5D|L(Hh2fE8E*>kT(3$Jy! z_S@ZGL{P6<9W2I<+uRuK>a(?L*&B~PhbACfqDX^->Vbpr=lRbyI#}OyBih;;?`S^x za%BCDz24pY>D2}G6k)+{W9R8!a(t2X_}q>h(|KO6KsbzUCTm-3x)z4BJ6?z0+>$xi@|Uf!HNcSDEXl{fc9*R|Hyw@zN`jI}8`xYAwZ zMC*KP;qCpc{W~2xDZUv^?eBO$S;DS+JDQT^t1A_mejuIkUNowgqt3JBfQ~-=_rpEu z;hs_M%=w;_oQH?YVP2CBwz9c_-K=koMN@V(Q}nvs6|YZb>KCb6nhzyIU6kS0xMFWt z-rYLgzVN;t*Pr$pmcs_b^K1IP9Wd-La9wM(t2Mr%HMS@Db-lkid9QN(LhCH!??k-q zxAewm(G6U{9#gJ+qP3rB=j`}`wseHuoQ%J&vAK`Fk=we%*52_fGKY0|IMXbtoYH$? zdRofz(05ieW+E~WT2V2G<>sDfORqP^{~M!dT@XphGp+IIEV<*&{qffPv({R-yH8sa zy{(VOk5kEF&x!x`>DczV$C1g_e0yg*f^S}UUN<3oa=za6?V0jQG95;EuxslUj=tWF zCdiuut)(ti`#auAr`t8<-L5@0-LB;<^It^sNY^{Qto!kvlwBj<36r&N>B%TW#)PP> zY&#j5n>+L5VP4mEChz@gM;-{f`Df>yi04mq*0&LE${yF1?@VhXvq!ZzJ-;FT+|?Sj z7iU-EbKlcz9XfUI*2zkjGCaSx-`~@??rh!Z`#YQcJ*_*t!Y&n1evvl%`|ifWciY`q z2cO;2)psqlx~tDb0=6#eE_R|0^GqxI*}~l!I5rnGXj! z)aTQ^4bQ9kINsV%k5KDDFTWFK9q9c7*-@$lR5`p8-@Vpv@i~3}Vl%~_d%4%v>y~y0_>_pEfeo5PZ5;dx|mE!{4pNzP5@yL$WU~B8nHnMxNF6mbOrasvof8EgMBKx;D zk9(K(`DEd9Nbs#)^S0)8uvF`Qrthq7UDvg~FjQ;3tMm3~VROf-_?p?9K zbYgkOn@h5uhL>@0qM0Dmk1XG04_j~ibbV51OY^BOrU)@RO!uB+t--PM=O^(WyX#bI zcQSsTDq7ikul0RVte2Pd(Vuurba2y`GTxeP=rdgubakrhL@B_z?E^ zVOLIt+*@7qtz}H~`1VD{^FQ8=9&}!k=`9oPL^OSLc}7uYeQM-Msqa)Pjo(i-GLcD{ z5u&wv?7}^+Th{#g-n}*cxuN;IG1)DmHQhZ<#ue82XtSdWrCqn|-Dt0K-DG97%it!@ zb>X`qeZRSEvmGI~o60`3PvY98o5kNndpbTn-uJ)LHGa^ze$Y%m*}CZ?{`Xza&I{j8 zCjDLO{@up&y{`G~uJuIMdA#dB);J&TdOAI#4cM~`emIT(OuF=Z68{`(F6~M9c5|x} z=S!{r)A8PKnzKJ9hkw>={HAsPS;w!Mq2D$`KZ_rK*}VR^`TS{|^W)a($6e_cUFWAs zfS-0P`-S}^zW;e^^naT3pLD%{i`#;wXhnmZ;cb!MO&Lf>+BzO0>sFw9~J^MP)om;vdok2QI zPd|CalZ7pN?o6M`|2okxW@l-+W$Ri|eFyc~T-Rs5$I?30le0ulHlwF{auj>C89CET zkjqy(dGJQWP{mlb^;`Y&9NT*W^;~+%sV!g8D;Yrg2kVc2EE?4{SQk;fd(U;8O`f26 zQQLJr>DK0MXRmie_gkWVdT&dwb;}psks<1u$CC*9wI1!s4tLGNU2FOP+YLzu*p;4c zb|v6loNdM+h-M3F3R6@4pc|MN-%HUUpYEk->BY`ECjYKy|9$5_Ham8J|8=zT)2{QM z3q5U*p3s$DV>Z>1Xnr99qGL@y*|}WE0^N^ z74bZNU(vjqG;=CxrxTd{`%X32VrqP|&zDLR zF|yw`2Y-$?f8X=|uH%o<Fy6%Z{Hk|NjwfKh>Q6v^o5BbNO$r%TrzN z$8qW}`uvw&_dmMcFZ%sYS{M6a{i${NYuEp4YxGRlf2C{E?J7wREhCh{da5h&ym*<% zT1C0zxC5WTS=nNuY3rLkdsE49+0~lBSvU0Ds`6wVU6W0vJF3d;W69$aolk|8oQ~g5 zl;L|e{i?!fbvpN&s(h~QZ+IIWY(IsKi(RIh!)>j+iX#;wsxxFxunpHVF36xeBrR?{zFB{F#6$+A60Cmrt!=E3gJb_I0Sxk6RN$!6n9hoKYA zpST+NF@0i0UUu{(@;SsBWn06c@%6dBrJ_WKjU(~6PQP}skex6UI8*)2h7q3>o1*ia z@w{%}aEw!ZpIz%3uBY1qI|3ejIvF5iQU>7_-6_k)Dv{4JdDW7UQ*dIMR@RzsRXRVj z4=%*-=fmm6_)jk9KQ|w;dwHkUd&-{0uiiMMwjm7XdjW%bDUq<3`Z zIlj=)bgE~I!QNl#Q#kqGqM<)G2RifPZ?DbqGp)^^o1Z^LpJeQ>d+%5M=C@t%x6R-0 zy6P{QpPzTVsj55Id#dcdXsuTET^)5cv}URxTw7=0EnQb!ZMvsUrQ4;hB>P3YP`%Q* zR$4ZbKEM}Rk>k-4A4S&AV9;n%h0J8NZHhisKZ#MuM_HR*mT@M-^yH$`ALv>ScHH0l zUu#}fPd(85>}$?+WZBnsA8syh?W%h^#J~9Ossik&Kp*OcEi-zsKY2gXXOBOus}es# zykGT&cqhF0vqsOG&?OtbpsTsF%1hmjb;6iV3TLvF&m@u0c6QkHfn7!(`0jLFn5-kY z2Kb(xFm%eP{Ei`^&XGH>_9Y1`Ozy z=0>KT>Pl7aDvD((%U-&r^DT|Q9`NLWEVrAxr^*#srCa))HPX9!UF+e#qT%w~RBy;w z`>5xVLC!~q`@P*3JEXMcrLa!@& zt-@Ca7u8ofd%y`)|A-mO&X>h0V_R1Ub_So8-eGsa_t|0ODO4Bd>*}KayiED?$-L>f zd3&@7)8~&r*muOuzS^8U*mFM8`O(gg_x=+-I~(%xuB4*m?|Sd?W&)quu~wcVv2>$|$vf1}^ojp7^4=lJuR;&u9tAE#3zt7Q5~&^Yp{rqV>^ ziOwvl$|rO6wdOruTHN zx5w2>t(~s8zR!ODTYtaML8r^s)CJ#MzZDg#29~WUS}NZU7j5hnd`(4yJVx27TNYl| zDO1&}4hmBl08_oKb-BH{yshuUzUd+rad3~R!u49Vp$d+3{jIAmeSa|-jpyY(O~-rw z_x)XOceE-#gMM|HW-+Tq7ROgPEgy8Uq0dFT7yI8X@WwAob9Q7p((6x}yAOMA6*0Ql zs}6a;_hie;SbVo9RVks$U$;PVSf#S}WE9ITR!zZkIMAJ^(>gRpWvwnBBFsibLaN9W zgU~JOe6vjR>&~Ssh7L;Sdo3IBVsmINRk%&n;4KSJ^M}l*EM!^1(-m147_v{s^6mW& zo*}>Rj^%)yO!Da}2UWsT_>6@FQ`bqt9Khr~KTJ=x zHoAGf@2lE+uIE=BJDrzx>sh;0dA!iI{<3^FRTnzBywLp7W&2x;{oO0%we4{#Pw9*@}%zQtV@?z{N25V$=uzyRbt;6 zAKH(H{rF(7b)x%vSA4YVe6900x|Yf!=Lb7f6F%JfJks&?zWYFPrW)aauBof(SNmJX z8~R7ZueGsOY_Q23l`$(reKNkUbc$jhs{Amguxy#?@E94iulI~PF{wJ8_}YqmY`HPI zUdg4>#q^8CE_lA*tC-XU?fE``w)u5dQEh#6DEM1*sPf`3={Qv{=KGz#GhITUDJo3q zaa61JYGoreuJ%c_P~ zrNf8Ubyn34LB52}(Ch$M+8td-WvS{9bZy5VxwH78wINO@_5haOj}9 zoeB>X7-EQW*W?DsP)1+$41QOwFkR5-8Q6umH@sVyTehcaIqNf(1=G20b=OhZ0k@Rh zzCM{r_p7CmX(G2=MV6c!U4Ga^vaK(~?^CU*xVvSs_fv=yZauzN;bHdfH~gV zcV$P56-+Ltj#^hbNKE%pIS4xJ>k?#5{6+^U@g)A0jA}V9I#oh4w)B~<0LFU0`Cz}W zk#rf*WkvQh|5`V2GEcV<&rDB?<$39C z^&NSds_#^#>AC=8)Rk2Q(R7C3i|Ozq4^?iahz?%jmFNJk@_BYvVH2r{n+iQusA%bq z=0VjO`qGU7cCY&aoc61|MxPIM7Rysbs4ItVfM4r9m7I2=K+CE-Rrsn*(9PTYy4LPq z({s}qPDZ;f>#!3Q_o^(|$2`o5PC=LG3pA%I4}a#3&T^R?^odxh7>jNf^5I_YYOi$# zIWKbK$N{qV)vo?rzY!<>Th}q4I-?!vY)y2iFsJ7G?XLA!=a0Gu#>> zyujl(MeFq4Twg~+l`yan9Him{aya>^Vwq@^tX5)+&*M=CIMG<&r< zBwxu=G)BLmIkx3XUEgQVH#c@d)Rh45s}$AY3EiSo9SHG)3Ii2ADoe;4zCNibzPh4k zQNg&bIaOOS9h&GSzKQNV(-lDl7rPX%&oj#_o=z&xclG;Q`i@Fh9hL4`=+N%);>c5x zL+|LmL${ejwg4Kp26Per=WD6n+0k#<7rNMys|t_Z zI~5&cbK-ryLgeMj-BH~Pi5Q#Zi~N__XN&EFHpfSzi_8HmY4tM4V*|*8mnVxhb*o{I zvM;TJJnPXXb7X^0rbY0Y)OIM~hTL(5jyhF9B?i2Ks+6g#2*^B4#xm`Q)I(n8T zBbH`;KI}T;dvbR1xCjycxzu;es7g!oiay0k*`WL;u~Ib-Y(~0B?x4S6@%VkZXpo!q zj5*Z#VCIG_6~i>Q^o^Vc^GT22z3{zm>hc@^SdAhS`zVDHGI&_Ig=%S&M_^R%)zE}J&cCY=`u8SVcCHuhKlLO?2bwkt6 z=3hnI?#`-M`3Ud>yu$`zBj|*!JEuxVd-sW{@$qKo8F6(Kgx+=ICpYAiT}n>UV|D}N ztDec<)SdfW_|vNJXV~&pVf}ObXTSMr&-2@!?KiE@pZon^`>l>E^27MH=wAmw@daIU z$szWYY>$hbS2k9jz?H5vWTE;f`uXb}-|YBS&-O&`eZOb=QLq20^Z)EuKkWFw`u#t5 z{(qMDuI}~9_RU_oy!XHQ?C+!Hf9$oL3jU$zeXQ?2*88wK_UWe1FdMNswa-_o(MHZ~ z$j6?Vmp^vao!ImLthxAk=b!gX|K3{uq-Xlqo>@HZe|HtT()>%W|99W{|DxG{?ffqt zPc=6`?);lR`$fg#`dP7IvOW_r|abH?u zX5t+`?0{?jW5*Ag!~fa$e%RXnsNejc=lZ9f_3u0Xu=6+jO#D*y`&XNLHj(0O4Q04o4*57jUbU`0{XS(aC^|9`{1N^C9!iS!Y2Xutdh3DxG zzUMQ&KG;Dn@|$#4C0}KCkG#0t%;H|U0^%igA}kH5>toEi@P1Kwpbz*E1{SX8d6HzTu0pIu09 zlL2C=bReE5AJ}uAZ%zIjd9T7$)hpSyX7RVCn-nh7)5BVlh5P||IHSW=HtV3FV~(|Y zy3haEI{jB8eyV5tuUPDe`yYMa(=Dv?eF_nWH@_Hu8(SN zJIt9ID8-uo(hp3rlx6ge1s`G#L1Z3aO`uzVae_s`^ukP=)?Ns9ZRULLNA}6ki-|bMNV+ML> zbB)~qmxE)=WM^}-K#4z}CDv;@ZIc2LlLmfzd{7rwu zqs9NpxYKd3_ySu(>{gbJZYZ7~E&Kbk#_fH2lWc&)$RkjteI-UQQj_J3(y_`;QGF{;abZS*hk4 zE}%|e*3r&+)5&2vAj0~u`4UgY`>VpEFZ7-cnP2o8{py%Fc)$1m)-j!6@C_Vr{0R7} zPM~lHd5PktFn)E3n#@BVh&r`zlJgMEK!9v7Z*;vy( z_)6UhKTZzlV8zC}w`Vga54B>tjjA7oZ9dW&wkejuhIyjjz&4-gImI&`?>WB_T|C>K&eYTnQt+z+4YnJ^Zp`CuQ5!>sH)Ia>4@xlKO|zO%mhxs<=c-@dT$JRSaQ z^QH?JT>;B@q4!{$M?&{ww~6gP*PNhX=NI~(4vunEV1oGMVAs)gZG12on9dc`?Twwpdp6f= z8y8CB^RvmwXZAgxef;;Sor1f6t?{x&?JhR)JT~s^z{g(wR&(}v*PzST@A%@8&af4D zpWU|kMPw>pN0io@^Ot$eFgv!THG(6PSFkkpDtpDQfzS7vzk{yf@?vk#cmCb--sS9n z-?KZJj)yDzj?Q=V8^2!64{kDDz+f-@O|=?)V4mli#)ZDwed60XlF-MxW<1bZ!qVi$ zs6m3K<7+#vm={>)SG$h0on>{Ubo;xa)Zb? zF%9?_ze)F8T|P)Vy&CNlFQ4|)I7K&;50Zv>LD%vte5`AxSk*fn_rX2n)rXi zA`|4@>IBADQ*SF*U&Q}hbD~%0V6glrU9;h?>|D9$Y{^R1OS0y)WY|J0O-cga;f zo&4A5<79`fe5ZT=R5tACeyeuS_fPa&GV^S-?l{#5kH+_+KeC6<#Pd3W+xebezOeAS zJn(n2Y}5j%-ID9~O5dFv9XWXyqVF@kukQC`Yppkc&*A*DtMZ#&Q{A{agO9t14q5zG z7zb^#GMeRs@gLyG~B)4(uh*LSfyJ7wEhYGX95es)bXy*?Tj)7#YFYvP3s z%lU!M>M8C_qpS5%S249S>^nQAvFc=C$RggJZzlFFBUJ8(nsPg&>!80e`&EtOmgw2; z1Z(5_P5n*2ZI7p&Hzyb6#jfq|jp;bM)@LTVhanUDlkeP&B`x zwP0Jz&zgAV$=3W_ye@BCUI+Ql?{=JskFBwo`H3Z;>AtkF-HYz)DIVz>x}d5(xwG%f zb(hzCW9RGozRpMMyB`}%=X1!4%vIX$OjMwTPAu%>&T?JeZ|x>7W`}4U9p!WDx#2Zl zm)p-D6q6J;JGaOHHoWzR8_Sb{;h{F3vb-%w0q%oM%Y@SvXj^N8w;fk@0F@Ju$JN9Q zo-3ZK=2Zui?b$$f=-Sj-tk+s^i0Ab^*cc66v&0e66uVwuQGNCtcF=^1vo~dwf7&R- z^VAT(*ZNHtIW;q|+6~z@J6reF3r)y_dwZb?brD-yYdbDmW3Saf$uXF&Z16-F0Lxk> zHoQQrXjAJYcBK2B4$Iz$6@#h^~+_nzu}uJu+Ys^7$k zc%7ZEQ}3C0Uw!K7cwTM{Dpv!0vAe4jxvEciEPNI*x7pqI(`8M?Q|0u+Ox5>Zim&D3 zo$GJ$k<;mSaVPwb$JGI!@3WEd@`BV3vt#La@z%rrP7I%Iq5HfVY_XlKJri4-U%$H* zk)t4=>BeQ<#MZ^^rpq`?Q=RpF(TjNgU9F@3HutrrQ-`rC-iLwMNdd2K?s|N`joF9% zWY!{$3b`SB)kkeR7kPf&G2{LVv?A zV9V-R#F+;x8GjX~!;Z9*C%@hE)3fr{)M}IG)h+g-ia=`H<-_UDV|1se#-Wuaoukwc1Ah?zZH(J_UMNtVsv>dqeMS?6ppN z=we;+zDUh$A@8AczTovyN0jJ`&%7VssdoMPj3(LK{ddG+q3i4 z6X}Y0;>%nqYkju$KfcI!HN$XNG=Yw8=(SFLI~V;f$57U?ED0HBR^93!{W8{mx;3}k zijLRnde8PZxi0T?ju-o!Uka1i-*t3RRpZ01f1~TM=jaA8D_9L&Ru|BT>Z!gamZL+qhw&0}(qbV4qrbj&1c&hLHvh$zfTwUW|@2n4vZf`Q*p~L(awb|B?jsDfvORnKJJAb!lRU4!h=m(v@ z+uD7<^AjD9_P6hndGs|Om9D<7k;{VG77aj&Jqh0gg{cidQclFmgoY923!M8fIf5dXgSX~pR9$klIo{sLTx{;~|+R(ghjHj>3j$5_t6fZ~f z$@p5`)IT=AKkEDs&GJ9@9km+Yi=*UkKGxrIxgO|{W6aK%-HQHHi@n#q54PUV^;FNq zeZTMCe{OtsA9$+I)jj=7=YQ{e|8KMLZ=J3GfAqfEm8W`!KlfWcFdff6;2)7GycYV5 zk0K9@eg0tg{c2}x|7deA&hkXZlg+7}QPnj()-SK*JHzSt=kPu`z;@bX59%x|D_4#q zoN(fn@<%T&hn`&gRJAesB7M-=A>Lx`RS8-(lAi_^O|$maS07Y5;>vkLG{9ycv1v+( z_nJPR{V2|Tc}?;HZf92^zArW zzsT=o_is+7TSK)nc8lH|M!mZA7MEMov1-Nt=ovi*?VFOf8Q_U2*c&oAiyy6ixQ8OyD9E^ZRf3x zSf02{olDD#seNTPpKSj5P;$}byqu5M*;>xl!~tj030d#H>9VXw6sO5%*HwR0*M;Hh z{<}F|=XcL9@>th?DgQUL?rW3r*Rn%rI?I-*R*7`{6t=>$m zT5i;BU5SlK5uyq{>^;VsjT;my`Z&81xtKk3_K zGkaS^f`2K4isUvUx_PRHf}iR_%lFt3huA$|J#h4s6Jp%B^fv!M4!bFC8c)F}mNDE9~?jC<%Zxp>wRxdSibo&z>YCWE4 zHNVy0-&@{W8!c>T9@iz~$$9m2)}5}0<;aSVe}&TZ`jeZ@UuUyzXdO2dpIjZ^uWs$H zY27!s#@2mfbg()Zuv!ZjcILVF87p(cNctn1nK5pz4 z>;Le=<8~6hoSdiA)e^`@rrU?t)q~s7ffp*ypc~Vmk0;_Vu_c=NOlzygOl~mVn*7N( zJL5TWAHV6kD=+3m>pbW=`5|h-?>pL)@iFl^jOloGBAY@#Q{A7{nw?GNkG^4_L%k;& zt*44=-V4jx%cqA6$YYcn%GQ;S1nZjI8osf{Sh@!V_E8XHgxC8UZ$& zUZ=WztG{@pv)IJrU#|5xT37E)o$oaZ=5tpoFgbMMb)HG>q@5e4r;+&V`>j3PMqSf0 z{r%_uR{QYBI1C-w-AUc_Z~Ob{zOOz7t}QQ>{ZC(g(707KitwXZn4}tIH8pZUb%meY zQ8Cjq@%!0oL(cX$TTb1`nRp&Xb1I&n+7vs(Z0$SbFCB|F#r)`XI}?2r6&&h4{7lBe z8QA3TH#?ZT6J6M`{o{Dv&Jl;=czB9_82k$rx^lPIb`P?iZkOA+v$5#hPtJ&kUf=up z-nvia?Aa(?hd2k6faIC@j_%%gS=>UOD7t?9A^GH!vp)SnXZ(DA)GS^CRYy^5aF!Sh zhR-Kc9DAllhUgZo_Q`_!-K=`WGl&v%j7oE^5R3}DZZM# zN;$oDE}0rYfAi1OWT1;9(SS}rG`w76T1f@#re!uxWrGgRXBP?ekaAhzK)3W7#sp&~ z|KTv3mfw%g7X{*3Sbue&#w4CEwgt~2Z(tph8!q0(?vzK*zLO)O*Nhwq8ip*E6{}td zzB9ebtfAa$zL9=8>>+VjST238o{D^D%k%a1zPr8m?L2&a-*YW{^!gWmqsC6B`*(U0 zxxMs{T-?d+L>KGB0bK3)+=N3 zKu^Z^_qQ?{hMpX1q;#~Zu4Ah_a%Xwi<7c;C9y zJ?MODK+vO(i4X%gJ)h#k=45n_nC|7)T8vk3Hg?|ZrXdD|@5F$QrFFufGJX8Xxm+tA;3)6?@xpA@|zHuNbOqT-Jw1GCq|Y;$X` zU(D9Vskiu!Z2T>)^$i`@X6tQ_4t9L$^XW&oaq;;NHcojZb`Ow;dA#R>P0C#p2U8!t zvw6WkclJbI=?r7T(_ih|`=Y%2m-miF2QXMMmQ&pko})Th{EDYW#>@Pm&yTcnpEgG) z?V0%LQ1f`IdDSCFug#OKy*f+1%TK05Pb_xdv3@1*oh?860H9LVn)*-o6el)b z^3l!-)7>A2CJuIU-<`OZod@7f^5X0uNW!tr%&B>RWlSH~4?FYMKIlETsQN(u^J^W> z`unQK=GTdz9BU3w_L^pc^3wJ45!ra?j=ncOHqg{fsRPve_H?`>2LZl)P5dtI%|?*V zqhB%oZU+N2kAu!O7j&Op+ThJ(rWn-h&IyBlxzF`Skz?>m$Mb#0Rw3uvE%I^XRX{4E8xrN6{DU`ADGF*S3hEhF<7&Bs@L%7`}=FZW>(!?U(Yf< z$JeFb^?Hm1_>_ESJx#?+jD`q0IN+pbn82JgJhwh-J|9ESz)>lvH za~(&c13A~a+Urqztoc9M+#gGp=_4esMRl(X1ldZgdp;!#LO-C1`@n)f>9e8DE46!5 z2M8Dbu1jUfwf=DWf717Q4!+uFFZ3Ba_NCs} z-%zd1?0BhTnhq7#g_SgDyx61NDdawjk=pUju4Za6$Z;6#zJ4XfqCbWHZF=qB(fNkH zzblJvOCy`g8Y?!LxxDZrS#?L7M|RuC{iPq$d(HNN&TsXp80&#vzuQb6T;`vSS7*+q z;{ov7`QUmtK(S|+IeiY~uZRiCU7Of9>`Yy}epPDgCT~D26-FUmPD{uq;Qi~2A?8U> zf7)w#J!)a~jeDc_^;y)@O@B9X^YxzcV81!gSzV^SVuyOo`rzBix#bzFD;0AQ+kwH$ zB^r4oCuenIWiBJv)%R**D&g zM`lNRJ`zl1>Pf|1N6zbmXlHkn&sQ|k$)$2ny-3KZ8=E_Qpy9}{XuDgAFFw@RZtJz4 z>vkQJccZt==4R8CrqY+KJNawuM>gs7+`{uycK|2B>*iD32u8wQkw5TJ^r&V-KL~ke zQ>~@a9ri0$cqVH9e6ij2_PDc^yS-n)5bo@(Klt9B?#@<{EV!=k+}3M-e)JF0#bo-& z!Ezu4;_~vb@v>STdWRi+Jgomh@9E!mI=UQuNu3Hjhb<_dVSFRD$K-Olto&{Ty^Y*6L+&ellPo*jOLBc_yPqkhrdaY{{yHb1> z?ZJ}YOiSw>IQ<9p4qV@Sk`L>fQ#}LZGENmPd_`u9JoPJf8T(HBQT_1k&Dm|ulbHFf z&Gp{i+moymkG-?GU+C_{;KS&8~d(W6WW8GXEE^{r&l#= zS1&F7wazwY6PuJzCglflwa*O{KrOQQRU(0e~+mf9yPIBFx!H@Wz z-|YNkl=uDS^ndm=|EuTuQSbez?>^pZd1YeGXj)HEG31FG<8Qeh@DKGY<756u^Yydd zgE9QJG3a;xbgy6S>87q-4G;tX-^fLt8eO?=>Pz*WyRX0X5PhKeljkl^*)CajIMrK8 zpXW7=f+phw!hP)T3nx4h|Benh6~Bu4OkXlPBjS7Bors7Ix_0@I!EN78{iomt@|;O@ z638narWiIkEMHHJ8#@Lc+VM=Sna}l9p3v8p=+8?QY;J|GfY)O}&MF**$;V-@jarjm72ca6)uhHYneVaV}u=n6+P!(Bz){i_PTkwL~ zntS@2PXteVphG?j9Vs>JC`50}Y7BvsW}h+~Q`ohtS$xBPr_d$u{g z++3fp&zxG5Q`z@&P}C1hA9H&c&`dII;00_Y_fjwNP){ij{D~-R`m>24iZyI$-nTUW z;z%2lpW+iF8>|7nvm-a8w_(F}kQN8tP~2D##*O)!@WyNMH(^kEp6k0Ta>g!TYl;`B zOPIbsY`3W^S6?o-Pi~L?6)+?DAoM*tf#Kp;u>oi->}TS7A2vVwkIB*EBeLU<^*3vt zUC-~-Q%?1v*q&Z!;!AvgecI%`uI@hUS7)){E2tz4Pya$SOthSQNV!mObvcpfi=L$y z^b{94klnGNr(7F7?dp6>uh{$Yb?%Da?_B11U30v?wUDc`CAq3wq0SOKFLbxL`^v-F z8XuFJ+nZO|{kHHsGInjpss+b^@yI2Ys{xC|?;@shtmu384hcU{;j_C z-A0SgVYQF-`rau0uI{euqd3XsC{WxD20uMe^xc%NeM%IhdmwSXs>FH?4GW#o1TqwW5hY-mgc9!bP5(o5jFXiSZn95%U3@>%ZdZ?O`4p4e06{=Rcd zf9u04_B4Bx&`xsF=&e)PNqAZx;q%p!oM^uFEjyK5B?~U4>(BHZxg3`pAFmb#if@Ub z%m2ai*Mu=&O5W@9rWQi2lb%oO((Cd`H!XH4ze#>5%7yfwY%cjm{73yJUusV5UtzzC zKQA=5Ci>gF==Rt8Og@;JFgzmLN;GBWUq3YX$JFV_W4x}gEop`O6(5g76G=b%09 zS)sqTY%LUcZsBpgV`OsZOLVmPkfX&%gb9oBn>`%MZ&0;>TJ#Z>Z^W9`byWXT{X^+_ zHZbd0Hwe2=LmBXnye&PF^aByQ7k|{NnePSbK^LENW%mEMu7bWdHm~q;`x1!h$knvx zpna|MZo}{T@4$T>V!n2fo}Pn7OT&uM!<^PHc~vj>TE4~DPihbJq?BVTKaZaRJBRzr zP8qxrW(R9mD{-Y4#lt;2oL-HL*o@pca)7-rr}Ells{SlA9lMr19c=T|VyDY#e!lsB zp-*3k>h;rlF)7KG*VE)mt_2HTEJp@8xyn~F7B;W^U3oovxv(qXa<}&S+U7(piy9XG zlgKze#eb(-H8dr2Q!Xi-lTY(*66)Rlo_#z-Zzhk`??;z!itF|3v40(@Di3mcW9yy8 zM}x_-A@uyY)V1-k>fKLz9{a+`CxDs2pXEZ@6GokuJR%xJE{O=SE_ZAhz30Rk`JsAw z!b@PLUukZ?(!9%0ldpb5R3rAZxz(PGP!<(z^L+QSuOzJdc(o*QOV7mja?bRbRP!t* zqP_+eFm*^GUMx*dq=waAE^1!r8M$KWo4(okn?0>~!o5){-wCd)XY{(hr@N4hXuUo^ z>sjS}zS*3=u+ZVQMbGosUx`9qZ{%+-e4vlM{-7IsLcBiQ&i7Tb!QPO^C?~|3oEJM{ z|4fZNYYaca%30d5NS;3|PR*J5fN#q4;G>`InROPH!^etb9qENGw#GJ)(R{KsAV*F& z&+^FOg7SI%4Kc@IEOT*#!57@oJ=HF{nq5rE7yIqNPTuP*Zwk-DPuSApE_4#!6^GNS zOdW~5J#!1=+tbY2S=95xQ20)A@~qQj$W2a`xwCumM^Vu$o#hX_(4p6zd>egl*izP9 zj7M$Kk=6$)1Yu_v$)mJqkNK4!y|4Ga(MTU|b-o@=+D}K^#$FEkhsb%@*!NiqGOF}% zKGM^RX~Ep(x$-MtZI>m*zyoqQr%ns6^EK6GPM(9h z z7gs!;e6wS&xfkn%m&j8#*WwXkO`aKDs-uUdc<% z3H_t@E4`|2W@XodjmRIK9AdmIUmD%xCc2DoaJmouzZK;E|;%q9iRxfjz<#$B$dUft;?%BLz9eX8O^EXW>mXPzhf z9G%Il*U=eufSx98rIrn#fPZ_moKPm#Shw&z8OP_64Ymn6E-sE$R`pG6t(rU~pL z1H*ec>2#n~h2x9k(mCQKYOK)w=|+!&Su3z?-Yubva}qMR2y zBB*3`C03GbXE=!`J{-TRU9tBCY|gu%#p_3!mm|#wEFP+-rzDMR?%7nc=aPO^H@23y zF6%t8O8ZL5MI#f*JG)xTO@fNrQ`#YFaI`siFX=pcGuZEBXFAv3MmwVk`&R1GPP>v+ zV(4lY#O-E(6MO|j*S`U7EoLEKSUxp+M4|FI_;ajL-ZZVjEBv&74=>MnBK`7dd=LAj zd(|W!?b*pVImUDhSphW=ErCT?!I5LTJ6i*OD_+~%-!Lrs9r`nE=&ZlB&i_NTdbPs} z&^a7ou;j@ZB;(awt@%>k>EXA%yRl~VT{4E13lCl273DLi3Dx^@&oU3{TJ7Z|&w-u6 z#=!3|36?bLSU(QWFK<@<9NT7cm7Ucw+Vhf~V;>cL4fMq%XL(cnCcSofP&YN_;sJ7f z*}7^BVX^j+REvy9#94S$q65%6Sd6$j-;HeztA?e^F|(7o=hyqfXOo4Y3KR9iQ|NE? zTlS#lJIVLAPu0oR|3rU_^Ql^-51}>o0+S`qlAzzzblGc1jo$D})XP}@6?|Dt6GkEyVsGw=Z<2T89qSw= zdyd8WX-^Ni`=Gx*?r+@B&VUuGc zFJqq}SQD#KeVJcOZ6Rwz#w~gteiuKpr=7jX?N>@d^MUy8?x^aXw4-6vwvWuyKTi&f z9Py#`sS!u-a)<3_D#wJCHamaK(?f&!D4+IBvoE^5vJWa>WgH(PgPAAb&}s1KMrvFULuHwYfD_s7Kd`BnM@tLZu!zvFq&JbTir z3Bh6ZGcoJ38tgrCHu@fK;c)t0?fvZO`R=mjayR)Ia(Y?7=8XS~>eMNbbQ_kZ(o4#o zX<|w@w!-`-_`JQ;w)J|bU!{#`D2g4tUKICu8i1aYE3dvz-+p^CzuzHm#Ph3-lxHUA z&VIxsk4zkX3Oyzc4y^5ieQPR9pjpv(-;#v%}+#b+(VJy+p;_ z52w!$_pY3W>7)Z8XS>Ud8(VdHqUqbnR_8}U$JlLGGyzYYR8a9@q*p~HaC6+iI#Qv| z$Kibs;&N>x9L&W2mGC0-@M`agsf!8IJ5~<|>jg3S(fa0Hoo%Ile|nvKt+A?o6A!wh z!}F7vP+R-C>52D3&;MF~+dJjO&gMdH0b53_(M-wkBrEuaYX9LB@<#YCdQPyhWYR+q z@$;JQ4`bo|@gi3DTHb_w0vbXO`8h}c835!5WPq1N4(LP5*ONb{9)z!_Rt3(;CSc={ zIBXYdaAEP4?`cerbd_)PDI7=dVD+weK%EL%k7n?<9-wN}_-)ScL460{2-7c&B`3Zr z|4k00-ZxVhytDJFE2{2FON#j z4mmEjL{5pC+~+&gq4QtW^B?KZ(?d=kTTUMtYp(Z^UYOT5W;l^OgZw|8LuDC3CFRP< zdKa02YEArTB1!Ze4_w4q1^<<-FL{*q8WmN5A=_VCPZU0_{p8p{Y$51_97H&hoCSFO zi3Pj6FRp>peXZB~nxVUTc6xqub3|KuA{Fao8hxe?eShz~ysW$2g)=?7nkBIkeKpub z`WmvMM6{Rr-A!T9*SHe`Q>7P_K>_7zZ)yvH@VufSfKQ*75U$C zwZtOrnfz+A`Fii8doo`g5a|GG6V226dFY-kAukubtHqIDAlpFS5q>Ugko}8?)js$o z-HdYBH)!5BMQQ0v9rj2B8OZj@;;)l==w5E_#E#Slh>5{$)!mD#vg>6bc}6ws_F;Rl z*Y|g*nSd+6%(nL#nI)nI?bcI5-k-W-JpOvm>G@%ZANHO)Lzo56g}mbb>-RCZ1e|1^ z9S6fjM+!)C4i;t^~JBJ z^I7(1T6z61*z#!cRO@|e;dL?pJ*0r2JYzfrR~op#MI+SeCB=DVmPT_-C`%y=T0 zW&jVsHRME)e&ixw&%P&cRB>r`pZWp$O+1k!J->PuRl#fy8dMy@-n)BxhfaeR!{ztH z9d|Seo-n_LmB3=L`toVs=^63-ThW4bR|h91!seU3zmF}pks8|ZSKt`n@!G@c+ADcuH)aaf61lsX5hYLJ&a=Z zmYscTrY%$?lKEcU9DIgKUO`))PJ66 z&FSP*i|u2dJ~f&4c4p7>WYu!><7O|OsR^38KYbkV`s9Y|av*b#4MTfRKbhI{!?Vcl zPu0Vst80 zrru>@#MARf9MWDTcSUVtptC;_j9!+eyd<$Gh^1UabPuOIn_h?Eh<}oUY@6w6A={6( zQoriC?Rg+)PHz=rXR*Ua9)}U-H{-I}`d~3PG zd^xzCK7kkGewF~cPR#LCqqp8->f(LkigMCbO~3<(*J(pFZ6cNG8fApbiIxv+*4esj zH-3+9$DSS1%|0aUX-=4$?+v%fsb$BDU&wJ6GvN2D9JY_|6-v|F%Ja!*)YI}p>mpuo zH2DM>&Qevs3bPPjweGNL&oA~u`;l@w=MAz(a>I!D1aOk+Z)XKPKkns^K=RZK z%`rpB*RySmkL)7p z%@&$x+fSbkwkMf?Q?!56LbIdac}lDU{w$xyv+Bw6;j-rVK)(k)07Rdlqf_&>wvlb` z`sCV;-3y4vfuo` zeOPza7k10GQwPLuytG&VYVy_8>f8kv$Di;M`F0NaMxm_q>*QTc&sBB;89Mdz;xJ-1o?Ay`{=42B<1u>FkHT$~n&^)+VwBc~$6O}pE+CyyRMjz|!*~MVkbvzU( zDN95ga8v8fhexk!%6X%x9)cmqmUX#3+H_~O8C((_$bmLd}Q{#x&WRDnMa?|R(b@>2UZhA#vExC*iEto_?K#U?MFdR$l-z%PL~0> z10*^LLC)bDsHVyr9)buSDI)5j1EVfgvW8^K;8^o1e_S5QM_pI$kky2*u%zU8Z13Cj z9c&)2Z|zrV5#%w_8mv0Vv)n~-b#XU4NsB+pvxQ_%UX45zRtXeBo)(UVIrBt}o_%gs z?L^6bhiq-_j|j^cU_5$Kp9GjVE!pMHVrXz$c9v?s>6^wL zSFCTeX`CVHaf`gRam@i7}{nKaR{L<2pf8S>p#BT zAYgJR_%pnB*Cy+YcQ7(}0yKKiZ=l#80|T9G*XB@@jlCf zeFf*HMW$*SHZ(CowzF7-y-&tl5D8?@vup7zbpPXcJmCeHrqu7Kol@ z@Cr5*y-6|{J6Yy>q!V9_zd+8LTQ(leIdwQJdp0<|G&UXn=8N$pX5C#0&#@M9`^aXw z0dxotM%FscfO?=H`im^~baLrwAXK225DJFfp?JPCq#x%)K*s7o16E%Agl0u+EFqX8 z?vSmg?vk%SqKnkBXkdmoNEYVU8)Q5^KY0vrS=NFB&(E*qsPnH?0I^9%hoDOOgnePG zv;QogpD(B`7r)CL6R(&m9aYP0d%wX;qH1hB86*>*#N#YqF&fcQNRhP`xrKPEGi2}J zKAx3d(>i3QnS@uvGGrimS2hkT50~L4S^KO9D=|nb{^Ws}Ur|@`NrnPA~!{!IywAo(;1(<6`6x{xDFTWdlY~Y=uuA~@*`uqNnChE8`o z^urRQWyw)`6bF)pJam$Q1{)f+-Z;`Mj+Dni_+2;c$&nPDCG`fKpBM#QPuhFW{Gtsg z=~T+_R9O;M5mrF6sJ=#>&@#T1~uf9Z>m6v)*zMbeNtU8(9mU z-Yg6f&i6v4qDr(n{((1HcL)}oZ7?aFqS^8^BFbZr(1`pev`l(JqDNL*f3ba10DbaS zQ8qa`dvscNbV-96A^l13(?wQ*&qTlRp!HAVFX-Fq`p{2tLENwQX)r;W3&uEEIPM17 zFamb-U=3m;g9`CypvPn=kA&aGe#g1=kU5_YhO>Jd>yxZxMakPHS7~>6fTth3Ql=&f zwBCBIj?`p*PK2KCOvbZD=_FA-cl4iCB{#_?7AN0?Bu7=O4Y86ze2o2g-$om_18wp! z$x1v!BUxv9A7z+jHm#W)>4BfvV07f9NSzPJ9m;PWrU7Fvp@CE6EDU znxGrmp=7$J@B}E@xBP-^QW0(x>`?QE?;%xerHMt4gyo;%bUbRk==YJP&co~U5I=Hq z0z`D=YQjxvd4R8wDw9=!8PyqXOypJn!Djo`af8uqODu>_=`=eRv6j|*%4Q;<}>@` zKW#&rO@;8tb$R9fGMnTn4m7uXBV(UDA$pA@!sB%3c=qPg>xnVTAt1|HXe9T@R8shg z4wlVL@>^|pK?!KmH)&Hef!k>rnrv2>--6R8B87j%%V-0(H+=MpE+*%pxA@5XlJ|CW zh803v%nVt?t|!kYZ(t;%^~N2}?r+^msF?>`K=M!S!`RRG$S6h+;YRbPvx>3PnRw7# zqM5O9Jv+TaGFf$24t#p-B;%u}#uo9ub^q^7LC-ccZZsqBNfGxW-#v+0p)c{!pp>Ko zzG89uoYyAD7$!}UntM44bRMZ>{!u%rL^By9DP^?I=yKNIx?+dSGmIo>W8xz7OuNxZ#&1SFukm_Te2JoXN>Fp7HEMEz zUd3f*nMXBQqBMiCunOF9azCx_@H(&C`je3EgQIx_69so~t1BM>?lC(WP9^nZWTFM% zw%VR->}2yfUcuytlTR!Vcapt?ig)xI76l8POk(4Wh2eT;ZuB}TAmzp`!PD@M=`BXe z;6RoU=`h-dCChsq?}a=auV`#KRLoAJ$>a}_HUEEI_qHQTkYr`}0;C?q6}qV_ads>;j=KbS3Bc5si#tbE8fx5?$bIOIR!!Qb8pKeRq+Z(6O#y8Oxaf8{~ASG3B@TH%V`-B0eG zD|ac%L9TGQ%BKReLh2KN7|@j&(L@HxKgdcZJ8Z12a*~<)PXO)aT0y&d;p(lb4JWED z@I_@wD%r*g!kW|FwCwJi39Qz9dQS~vU&7uYU#Z@fbsii~0`ZQvDh~c&wGIb09Baw) zxXJ#-C@9M<(CItkuxwW4wb@!-Q@m5_w{qhD;xz9OQQSvmMZ&^tBGiQeM7z|_Q`CxW5C;6<<)y#Gg$S$kkM7*$*Vz<-Vm-O=@?WJXUM%gR{N76$|4u zTZ<=b>@{vK`-t(dAS?M*&`^deD_|ktB9Sr8#7^d6%~mvK=Qr7#FJUbWirM0?`i~{; z3+fpYst=)Pe7jiuS!8Ad%oTU(7uWb&l?y)-&syV)r|PWg4WKAy@Xz#|F44)~cygdsxi}@Y|!h*v^CXq%}D?+%w!KIaE}* zX(eiPq270ot$0Xt^6_ie4b*NvZ^zgBrcQXc!$Q5r_G(Snf~_$`J6F-l$o7K50WM-m zJO1X8i`)m$jy;yzTW@E}l|j`JOR`X$RQuvKOjI7Si3*s_SwPh(rxp?Lh2LA7l(G3E zuVA-0`D?72(ejV)XIJ$Sh zxxQf)_mV?p4cKuk8jKOJTUoq zq`M=?SzNZy$~WQ60@;$@vQR57ao3D}%1S%Bnx7{XiLJ$r$Oh#C^;kZyf)QP0XQ&wo z)A+VXB5Gon{Nb~E%>-*LFhVwX-QHhzZUt2A!ZoW_Ht0WVi9fPfS5vGt1@lyU z^0dByt61+lF#2X0zU4}awOxC>xS$qL{g@kXU7@09wURnm{BhTen#0|_uB?i+YGtkX zIN9{B;#duj;W#F~yGr8j1)OwOkqo2uh$CW>Y#>Id~i>3&Uj1GuW;ik8{)!i|`n0B{uM`wLA`r$hd%Qo>|bn zR&3cdtSUM6h8hmHtkdBy&ZyzVCe=Lj<%M|X92pu3t60k#9i#0l6!Tl};t2bfHzBG1 z!af|7@!R>~fn{ELnv18kn$K573z+D~r`gq>mN+!Q z(N=kU0LQDOyW>c`07LBL-~2dVr?WU~HlNGD4E|^MpQ2vIcaEtL8A5cq^{kUtoVVzBP#a+EpDn6Y94v;JFxRSBD4kb+%Ve z*yj-8@yvVvkEd1gWt+y8ZAHEI7T{nlWv33l_QLF|%QJL`AsJxnFT1K)>@$YA|rf8Y3Oq_otdC}URAwW@8kA2Y<0 zu3X5l;tEcgrR$k$RybQPiFdvu*Q zPSc}oBNnP7)jD?8?G@+Se9GF6-qukf9r>yO+KpESRpHXCwJUZTUmc~M$R6rC54|5*Al)y!PL3};%ZA??}vusPxXg&43_9E@5Oi+;2ufwJpK5X zy@P!hkXWeVffg3PQ%iPM_ZZo;oosPlu2I$Cn_ue>a#YL3I69DmUgaKf#r2fd?7Y?f zjVlRao~S_QY76yJab6@bP7znFSe1p3RT0*Tyu+0c++eW~4E=Ja?83_Yn0D1xvLU}v z@mB@P4kC{%?tyEKUoF?pj=glptu5qIb)T5R|5T$Q37%tLpT!aFy5oc-)=ycXT?G=u zpjw*ulUq4-7ydM`GL9z#;&f5q;%J|d{|VXr}&nin;SN+1?^gfH8c+5ImF{W*`SH7uwXHo z!n`_Ljf3SyUbC5(pI2d%-&p0`cKG9Z5gi`bhUIWlUtz8GFpw?$#Q}2Qfa{O;$c(I} zb(|;gX?7=(st0o@ma69QniY5*8;iQynO&5JAp6jn)<&*!=J(wVhU;=XovkZaO^r_{Hd0Mt z2^nM!5v{d^H3gmVu{9(c&{Qi~Q{>@2{D@{a1!?F*-JE4Jd}jgikJjX1VcN4JjUYr* z?~AeGthJUHLk1GI?$Fy6*$^{t(aSD@W8E1euku`+HsY+8N_gUxqeW_ z6?5?bzrC(?Oy_lQ^N#j-lOKhG>jbp5Uj!2v#7dPv%!>V8rNuEZg#};@1M3%7g85U>ghRLr)Qw9gV<$)Hdd?Y7^V@F7bygs)KL_ z&gsVsiZ$)k!^B#eJl0h(a2JhOY^LO7eGJ51bsY^vSk_>D_T~vtrX_#VlAQe7>_vD- zjSgLFH?=J5=jYi3=i3v__vzZa&f6QreST&9J{cg#$aboK@g66N|7CL#1D5&yMpnk76G5^KDqbi{_%KDwO8MD6Qlr=(3)b+?(*H9lMGo z*`1H8w`4-OM($xRf6eKy9FBWFFCwn_jGNDf`lPg2V~vXg=3*^u&fBYH;LYaNDqgpa z;2BlYB+t@R-j&L2C6e1-qSW)l|o~*SyT$)3@*4o*+O3w9*@oZf!jU^%|mf0V% zjuN->c`HegjD)z%FU37P@E&S#;^}ff|BE4Fipl`adN^LpsjgCcVYpv*as?eXp+awQ z5Yy=84o2hm35aypPCSA>&y&kUCH`(6D+#Fba+WuX8k29B31(#lb*U=7%3L+kdJ227 zkG6P{9r%?Wv*J4`MRFsG-03XWdX1BzM^9CweCyt0`jemwXfE)7ssA5aLSL2gDe$Lezm?vzbp$Gd3oBjdk>*KS|-j znpzb%t1Cn|h?6wC$DU0?dg7jIfM)cGFEze9uAL!$Tw^PJpxkb(+7&~4mQmo1tBqX!V63V$b~R(Qg=$jn zv0CEu*hn(1*q=6XxH^w*NkIbnCq`D=?Qi}CS2YzJ{^zrOdCgT7_jSl~;&OaDUcp7V}(9DURk}yLLv8`7(>jLPn&gm|{48#Da6HZNU}JT<{L7%*Y*jrE-vWfI8T4gA5Qo#0;Pf0ctmFm!Z}`wnY}J5vx$h^ z3?d_T?Yh|Ndq-tlv${TLOmzf#WKK3~kB*jhWqG@q_)}F#e4<(Vp}3x|;y~EYoX1sj zR6&T^cx|K*!z;3|84u0RtGkPT<@T;SE~b$b4_Qpy(4UOhjS(sati?%JPDK`3PtL)j z_6y4;m|`pplPm4hnT1TXnbQ;9D{r zM6)lvafWuJEE6WDTxP||7VZ;=yxhZT))~&SLs^&YWOg|BoENHKT34Fc)!5<|n^!HA z?~EeG;F^jVLm+Ji$LM5Ln3qG|`jF)QS}_#m^)M36c$t2D87gKbUFD%F4E?iIrf>3Pp5UwJH?> zwe30CjYVQMu>Z6;5C$W}Hq4o&%ai5#<)pH~-CO89MwsOx3%v3m5HsY2@z?9A5yGjx z4f^0D8F10qU8mZfaO3eUmZ?u`QwqC>q{c6W6a9v;a;8m=KVWLCv zg@<6A8mad3uepn#(13T3JQrfvKw1^I9k=%L*oxh)m#TMeZ?%Fh!W+JmH)F6{dVPU#^k-l7qH(h?59?|K{4jv-Vu^9ZFDpp+;*Vaun%CsXP*k^x zD#j88jDX|%z=q!z^I3&;=%2M_R=}L3!*f=O0T?*W z!wNd83mz(-(2>+xoU~&e&BSKDueN7FdjziB7fE9XaZvF&gsCz8Z^R)7w9G})K1=)7x zp#cL{X5DH?>(Jtc?BJRJc55Lv;48+^$nFRGLppyjUbR7pLQ(V}D-C#u`NR!uE1J|R zc48KMS(?9vERQH-`U^q!iUVZAJN1qlp43$?bcRCJcX=#dEgQ2w3Ds~=#WFnQuibgb z*R&Be&DNd=N$GCZ`2bIb6#RJurl|PrWkItX%(o!MUmed=!=VbVk zm+AK(?Xtc8{6Ku;Yj~s&ysKVZgXhDlols*x{)vfIa^$r(q?Nw-=$O%20}kwwhx4m> zymsuuf9b6^&yy!H#4b^+#uf1bc3Mtn$QcDE$Y>Q~eJH=t#;oLaR8)&ySxl_SqeyCY zI%B$-%_R=w5AV)L@)bInlOI|6sBKzHn32zsO8jAuIKu|2O|>n~SUD7bFhTUB_c+e( zn3DC(MM7hW@FWsz`43sdDUxZy=U9jA_A=Cz>RbMg1rVjLa}dBasM3~3)^yIx$0CBy zf%AKeQOUJB6amD&EG{O+YI15>rWC)hwG}5+TDh_nWb$I#jr**Gv+xdceW46lv(}I9 zq*Fh1mbH^X`{O>J!Y*2t1Nyccb)`sa?E)KPkwgq3y?M(>X6B#fp=sKhAFEnLu>-Be ze;!)g(bSA_ zUMAL>U&ct7mx*X!^^8SiWkG&`ry-eL^cT+^4GE0&&=N-Z4px!GxM6^gq6Ajc3YNw) zhe{B0MJU{EOj6{r)t_)+eY5j^4;r*T7&E+wxN+DTt7B8uV&0oootw>Df6>UuFq_5n zHzJ(Xw`8KdciI)xc#P4^5_7~fh`Z)N4kP;Op=TMLJRw_-VzE#$A4KYb(R3n*%w4r& zXBI+^;GsP+=Se7ns=}?}|NU$4?g+bhJVA`K;_2=Yu}2hi6_aE>32imz&LQ6wYUPgG zdb*C*z2dO4M@ddIW0Oc@c9yFqN(UZgWOgLE^RfVppzU~3SJjEtcqy9mC(qiuLu+^7 zTGezXP@i<`PF=fNeFDVYajrVJbGJ`68rLqR>-xs+?tT5t?W$OxUa&*lE+)qM218NH zT>-4<98a{fmCW9$wE33rR&jTDE5_<*=XoHl;|xo(SNmY>>yvbjv4dS_-r!TJdhihT zaIV!kE8~Ue-rd9P))?0vmcC_&ZG9h7^=e~z+ zZTggqzU*Z$thKniD(yP)g}zOsD$AG`R6f)_7_tG}*ju)-(s0GV3J~7* zSJ=Zovnvcd$fsUpZ?t5dVdjdt|QzBr~m-jKcM$(Lmj5nCJ(162{MSX^T-?_?c*FV?dw|50PHN8gU% zPA;Fs5#eAi=J9F$U312dJ|)s!2R_y0Dovj#!VkMHVtwDY(jCa+e0M>+ieq;Nue8Nb z{Ndl^a@VXZ>A4kXcM;SL@Tk`p?#rlRde%gOA z(#nd=`dxm;5p&^`@$~1##@wen#H&^tB0HOt*%d$;3Px3yEX{^IUcMJcMR+@n@*sa= z7d{A6IKx~d@4u+@4G(;OF`X~Fqa6M|t!G^C@kC#rB;fl!vvHp~(ax1jYZmccT$%qH zlT}qtB-B*HrcWA zsb&7@HLOKob*ZS$Hu8XTp4pU5>{PI)Pro@XW{4;Lw^A`htu0dEkNDuKfP9j@`L=%K zat(uQj`b~}`iceGkkR^t*K4mO9qCX_z?0ZKi`$`x2>bFjS(X)H?Xw|RxE{&&I}dN06K%&f}Um?J9C@wfElo)Ln`4fw_Ikjm_hUooKO04C>Bd-;XS| z$nJe-Mk`QUZa0Evs!QHm{kt_tHf1SVv3)x-{IE)$FN>98q&DsZVhgd}Cmh6UJImht zwi)#fPllU(4}YJ?@XUUE7Ps&O58Pd3j<~>wz{Q{@+y&QL(#$>4?=VO-}VsaX<`jRp6Cq++76T@i+K)*P!R#^T+BqSpnL<2SCl- zH>xa7o5S@p-|mDDKD8*9TZyqV`*atoaYY$(^vR2)!I^f|#Dcz4$){uNVTd`^pI-BC zZR9oaKo-Y2&swn$S;bp*ida0qzz+2~e-_{S=D;d=^_K|Ir+3+bzw#~5*>rK(_v@9H z@vD1i*u3-ZVBvl4(8x+~cv(g(w0ctD0td5iU zt)F~zNmt8#V%#xTTGZXm-ae1Na&>X0-5K>?Hnu{NGdy>93+|EJ`CgH!E2+j3+r=O# z$y+S%7_Y#85zsnTzVwQ|5W^L@5~Ag1*6I@-?7_dp(_(^n%JcJ2zKK&Th9m6C=gRBl zYgeH9bX0YQyIFlw)15u~boG}9H!6FxAM4_6af%Eglh{vYT4IRRSbUVf@kJ!W@$B!Y zcf8XYtvJj2Vyb-U7@zXY#~qIY-glP)+}&-2558G+eyBoYjp{^o06VMCS0AuFe(-Nx zz%k$O*&0t4uey{su#?Tp&{hfLRDt&C7_yK-C1lBDr%QJ89eRfwuZ>vDRWk;ieB?06#f@gmnXcnki)M$MCr-|6?x4}AF% zKPf}EUYFae0=v>)KbgP!j}LZ7nf#1L>{qU@b`wqecAD-t6!*p4K1Ey&;ai}LV;7zk z^;gEuaH_aB$-$I+Wv@~tgSVa2%$|i91k|4y%+qDyN#zR zz!glBzn$gBJXSrZIu|X>fCKWrHKF)mPX|xbckC!%@MiW?)5pg6$hMusK>SFrm{_g< z4!v_UF(b^(E5_*oz3h&0^0W*oj%v@&)oESPgqxV(T`}3rI!bQfqkRXp+FEQC|8apG z`5T{Q6M2|lvhmeHr!ini?KY_I?$dA|Cby1RqJ~r;EP{AT$RSkc%m;Z z_7>PseBe1Hupk^$VZ*?MSh>h*@ z8@VW%AFxhwUkyz%dnV+CE1d1+KwNt^6wB?!IG^8^e=$Zy#&&9bYkv8o8d6Lye&a;k zz!iSVr|}6l`_v4(%Ry?vaS8uKDD#?0oR6R8B-gS!3+r2UPZt=dc=)Sl7`Dg36Fckb zCO_eWa+F#RzPw*;_aJ$n@D@p|wTvMe^VfVCr;M?<&-bg#S2tMKsU6tA@7%Z7);;1P zvACfM@y#)62EOl8u4MPi${0i^bBpzA6~}mn6+IhZ5Z^4S(VCTw&r?)=EGhr-Jt$^n zc@e%UAbD2?P=|{ZwG=n_7yEW6u&Ro0x=)sG`*t)w$E(Nq!>Vde2WW zBfrY8;mp@zjV<|CJ;VXgpxlt}7F)W{(i%=47Wvt%Xn(Dh--8Lomey+W zQab|TkJuzX;7Pdxr^qIX)0(^x5)rDTiiu@mIa@0}#JBK??=c%Mrh=ry*$-AHVo# zS5x>lAMTS=*5B>nsRN9qj~%(bt<<-F@mOmBao#6zw%=<#;LgoHjl|b+gZzvCWAE$u z9&{nq>RxLs*!ImLKCzKK`(`PAcOJ2_z!W*&50k*m~TzFu{v``jkgCwj62?M6B+cxvaU=Z~9}3C`(elD8AAG$8fkD zi+_&u2{A;Cf-!UzTkUf4sw#Dw^8uRVL#=1ZK{#H8niuE`5hG)8wHobN+5GZgI}Loc zl_4qUN>UYw_#)<5bJWv5vM7qb&KudM0eZ&SJ`J^4)*e@Ah?i#HI!R5#PO=?OdT)Q` z601p|8t{n+KB{)3qu8JZ;QMmKKR!wP&piK=%{OxV)04y}#(j#_|5H>8IPbbn{Igd0 z*YDdI`^NP?by)1M&m^z3cM#6@7{nI1vyUiWMMEB0R-|O1;sDF5%;6`di`g)34aOh& zu=RZPegD(QUXVQ-Rp0wIP(E%i-~VXzZIJnV^`Yx^zBLY) zizU$H|KubWUc^2X(HrWGQhg>P(vPo+x$T>Y%YBFPfBA_4?(}tzZ@2EYK2rtwuOm@U)pw>1Tf<1{bAy?$X{)@2>qRpVNt z+TT_uwbvpC^J}=Um)IMoYGvQLg_GWX>wo@ zkRO$CjOEdqoe%1v=BUOO$Es^&F}bL$CsUBW`myzhhyy46)h2$_B0N@1Tntnpz*lA0 zRU+|3ZN#4NBYXD>v8ep++1^a`y*!LDxW@PUPvkh#H|w^VYwsVwTF0^ zd#vk35P7V6#2TY(4e9{#wY{L$1;&QCy+-(wjU@DhZr>c^%zTTcIMb(LyRPnAJnhH2 zt|}I|KBLy>*Vg=UcK>0(w|d%Zlgq8?d|!6g*J1BoEA@kGvOaBPPS_3hco(dq%m#8`P;ozS-n!d}eQ z=4>Dyi!yy%n);$Ox!T=vEawZdLF-DsWaaS&dSmk>49d^&)4S||&$y_LlI7LHP*ww| zlknTO-iXq;*gl!HSmUUl!~|%s#4YPeZFy=!$37vV6{tG~Z@%C}Ec9yX)g{%8%vd&hcS2XEmk&k&1V` zxO*+c4&UI8uf|r>tNqpb-Jc;gWCQU-MN1buY4me}uKxk~QLhIH#;*@hd7iUF6Xk#EA%TsoEc&{EjSf(#N zc)fb5d(d!E`7kI$cdL&=B$0kO`FV|@3GM}^- z;D?ULcVsqYdB&6J9w7Ae7iDCyo7po5>1nVtwE28^w+=8Gi589pbr!pbvyz@)wIa&qfb zd^avT@b<=lxwc(@ZA`BrR6nR`V`S?EQK=}&vW}Cz{bdaf?Xhx!Hwuk&pl?L7a7n_OgkHAS{?oWGMC3!xwq*j+WBnTx?Rm79uLuqZyV zx&2)}C%?$evI?%S1nw=5;GG>On24oX`MsC`EA?mh2${uBlDRR_$e5^y8qHrh36^X~ zmMXVJdu+=8#Vj0=iNv+`T~!9E8k}q27h*6HE97mjtv~JitNX`vU%|SH%izTv0lttKZ0IwI%bBh~K{sZ_IW_K@Fl)pgy~`k)FzWq{MTsxH%Cdp2erT0i$2o0rs9EXH2OGY9*Ti|@#TqC51kvpc#(N3yB~ z`LPV-wcp~P+8vu`U&w{>H@F1O&YNGI>R-s#>X`BUVXnz6DV!gi@A!m41g`-CDBM#u1IKdlb`f8>2DBULtcdrAi7 zE3$}QaK@MZOJ2FW>yTnYx!5OR|Hu0+N6W=sD^X*$){cLCxcipbLEg8{cdWZ1-1oqz zp@h-u`#2o(u$5)xs;u5>nGPZ-=80RK!w#?I623{J>Uz4j+lE)=Z#|15*o9?XvxIN; zSS^Zv`mrM{Y4N(eSLF8Wcrl+>^I8umdXH(?wajlMNNdq6ISh-{3)*76_tq8c4ilEd zc3crrc|gY5#=XMLQD0 zo>XbT6GbumNKog&vJ;K?I!^xcdoBB@3i!I3)Mo_5Xa8kMRB?ZIYggBnMIO6_)}d+v zHLrKwmjZ+QDomWgVbP5DSxt%7;-YUm#6A1M_T=sBw^sLGy2MiV;@a1DFF^nEl;8im z*VnqU|J-Dc-(J2L;ksRUOno4N@OBo!5w9>b-xjg#pZ~+t_b+cx#Q#Wj{o^lh?@s=4 zzx@8oPv2B7fA=3j`tO6z`)||s|NDji ziC2BDMBZ>8iQ+GeQ{Z4CdwWXEku1)gbY96&deyB#pllaSbTOqR? zi(!lGf+cUGM)L zcMVUbx8K*j->vmywHj1S)tZ$3MRf7l^_^CtY%S~Hqy01MAGzDL&8~xpW34^^=^-qq z|Hmh(&$;~LPdk3im%EnVy57DAJgs4ig<_(d1pU5499v-F4h&patHSl5}k$Uv->C$nUc>_|BW`8jy>hSM7=@?PsYE zaHcgIo4NWRid8i^&eyf54ugaBfjCv|)m}>bRw{m6RiE^r55t&IV+}Z!NMbfA1Qde9xBMH)8E2Hn6$#R-@`$z9Em5{oA8fhiz@p`a?u7 zkI@pZVNu-nn!IGkTe+?LmG8@W@;Y7q&1=*8$+ctoOg+$jBKDw)3#@Dnz{lOK4e4eO zfBBo4#C4p*Ao5q&vn^S1(6u4w`MPzZea`>(I8+|*egkPun`{@yQ@FhR~_$| z|AS)x#e3X#rdk&tw1Gf2hfiw;NUC6qFjhV8D#98}W8-QUF^%keACKvZuW}r|c72_n z)34ko=hM|U&Z}?ae0cTWGXKx3eeG{o7uo0PY8{JI%ZWO&82cBS<)Q4^YNz{S`2Fq2 z@lH7X!%q#+zLGs9+^Fu~ehGwdVb@vU!`H)uJ@`928^#s2v4lX+ea4PS-jdnL^GxwZmnSd-n?)piNAP3b~UNkPM)$jhO`&vzL4?*jCc!+ zvnGzn8<%`>tSe?UR>%Ev%d@JX- zlc2s9#XQuREUpGC>dD>eGG1%9UgS~(s9AZhyhWexLo2e$bK1Jb?6|te-w?)yerV1I z%*e~S#%qmc$E!U)NQmCDk*bZIt55TFK5g%mzVW^P?qIzeMl^>CT&nDF26ATH>LM@0 zd3$Jm>kV&+&+RwM_l~s+>RM52fox1qaS%^b#qe>gI<{EqJs;1*#XkJ1W>;&;0`MT6 znos>BK6wp;T?gmWY|Faalc0^*fLE?Hi3w^PdV8%taL(9bfZwp^e{b;jzTe~%tF-X! z2>Ht2?T0(2B6nP@YYkUTq)y^HcBJ4{J?S~V=ij`Q4#j!$vnPM%1AbbA(E*3~c=!Lo zL;P3!(!aj?@dy@|E8!|iz)?hEJwNy+-qNWoPd;(YbFrD+?KiZi4F?*E)ZG`OJ$}gj z*8l2YwX!_ND_S`h`{Yk@vAF635BQ>ZgQ05s;u|aTeR9*LAHHh+DqgGM>|@-%3=UY+ zvaS6a{4rkZ9BUvk0`?*#+pvD?Cp8HR@OcI%xs_QJGymOAXBU7B% z4i6q!3C1Y(K%6%-N$}ZTyXxBNmVJ`n-m@IfzBDPm@%Pm{t|!5O2RqL0#Y9yN9OZsm zx(}yH!qMf^;=Zx5fD|fTYkT+PkjTA-*aDAar+c-m_)z?_4?xGR^7>jQ9VOrVCeARx=^94Q(mwX>C@KW;@&y0)nu+i52GBT0lm}G|5eB^PI z@8NV_ATBvh4-Yjv4%_Fb?i1A)xA48ZFE5A(>L9yR;sDIF?)sS6(O$Y|cbb%?Wm)-( zR@JBKFe@*1Ef%nwhkYBE;WE6$wc3_7y{=MV_xPQU%Xf5CDPe-w{w5VoX-?k!Sq-!J zMqbw$=)$*KxA1?s;k7!q_$DVBgCFo_<3d<0DVEcts6&qS8Zeh7MKAGytj-km%Hiy; z0i&wCqC+X#GoW=v|RQ9$< ztxfxWj$6~ww0%1{%$UVcth3_f>+J@WU&~?866Z0oy^DPYga%?C?tA9L{qS#Dy!Bq| z9r;gNzHZ%M-=8Ny(JT7nvp&TDJRbw9I{7xe#5cC%_wHM?c30=QHjfAG#k+65{0}Q} zQ$P5^2*X%Dz2mb8%oo+<>KfM)$Yot3rdzXMfjx@q*y0za6c>4ptm{Wr=Ew6B?#W%2 zp@A$c+LEN2i)BdE@w}b(@01orD9^$gT1cyyo^#Fw1b5= zW|Bu(b87?^AhYpFh9Om`@DYu>myO5s5WKdo>HcjsZgn5L?OXLZ2)1ue8wadyyQ(GMs~fNw{zet0%i&fv@)D26O*_oi z{nqJLPk ztGy9Y!@7s}*`ED*u}3vQSu|Ev1;_SrZ*@Wyk=PLvtDRsZmY7}r4>3Hd7aKtmUgl#j zaZSwY-Uha|Q^CgSKl}I2yN8#byEnW_&mBG?CMNLhY64pF$v!V2Z>vka=OcVs9n-zc zzK4YW?=vvIr>N@}_)C-aKcCP)*cMIXI#G)}tYp0n_tsvd@ZPm?bqd``>b-r5_NHWI z@eW)0zZqDU9x)hSy|>q*4XZ+px696CYiC7YeRyemR$F6bv9u`N>|V28 z7QrO5=i_34h{OlPmZ6~*kPGp#oT$#I-tb;lDEi3#Whk?XH+K4brqVrG>b~~0tnIAf z-RH`0#8hXN3x*##@;~}mfr)cnnNg+i-1b{sYm)EUf9*f0{nvL+w(7ga#0W^*$rI0R zpGKU+86E(S>UdrYC2CDe173c9k70Nvwv!MRabF&XSM^O8S<6@3xCc+HT>OWhYqud*{cD^!UtY0`%Uj?< z*7l*qC)r!Qv-_0PZsKRxG2zJf)p}vd;$m2Jav8ogCKhy$5V`HqS#!_>*6t&)x7K=X z@r`Yv(%O%YRj*f{@}E4aeF8bAJWswdnO$X=hPNFCxbk}bm85KoJ?w}-tnIbhn+09p zq!(?B*6I^W_@-xT_jrXpEX#6xCS$m^{&5^LwaLp>ALgu&{FOXUkT)X~@&$3B@6VJA z)Iu=yJ-9uqk@^n`#REOtAEF1&lP?KbJO8j|#ZA8uf|g? z$U0d{Wm5L7cE!2nt6~p7S8wAn5pc<67VZQk48K=HEy*zGyYq0hlTCbHw zpKwop-?vaaA|Jcw;aR)@IGfC_se7Db^cG+ z?ii38cnCyb8M03dAuKCbB4d@&JFW zbK19QJtr5s`qJKxC`7MXdu9zRwf4aK_HMGR6%eG=dFm0@pv5QaHaWokRq8eS_4JDa z)iUK+GSRwK3CTUmSK>PU@$J^GxZA#aYjy2-EiQ+v=PCswdhJN}{Xh&Fyh$u22j6bp z!l%Rsbx1p9By`MCQg}z&`~Wsa<1ghHenOu-zVmqPh`2;cQbMs&$wwM96xY?nY+W2J z%eSxBo)7jqTCT@iIAi+0yTgvU_@3YMA9G@7J2u^)vD(P_{2WL4TE0(i8Wcr~R>eH_ zPVRi4-O2903blQlC<^6e+v~CGMqb`Y=Q3ka39{uV8M4gDv&e(TGOC!xGQB5-EGM3J z1pyb?6drzfR(nWd4eqfmyURJ+%2(`P%_2(RIX<+`D9+EmeO`h#K=VR~m8#(?P zF-Eqo;IGM`w(A_3@mITYDkdcVE?Y9lzR>Dtc~U)6q9sbnj6dB%V&QAQy>=Dx%4!M^Zll?NxU z?M-%nm{_3ge}Als&BpTJt?^V8^&VDymt101^^$hCpZafqMxs}KQ=dFM3x`?JRAz)1 zKhKMLeZJrRn5qi)^x|1G@+`8mPo7FfxKxMIOP=&_tt+3r3 zWG8L86m#K+dl->_FSe70@6)3?Fb?2Nxu48M{*WgDHn8UTyJIYxAJG7BV<}yoCmqyj z0YB%5hCG8^`E%FT=gVxo>-FjoqxGpM?ej!v#&x5rRm=kc$P}BzD*JWj&S%6f`+BZs z*vF|-;Ac>ZpY6p#wDk{r;wO1ox3z?Q2G@_&Q0c`~o7TL>J9En{B9V1*J9EV+(NuO+%k`NHSc(BfF_nu9_9lNa zz%?}Spu7SXToB{!ag(vwpUgDEQPR&xO_N>tEo+_NlA45I2lhgeNWVPmtx!a5EdUy2`k7ae<1ef;QtuY~2ZEw#B7hFT8 zOY2T}$4|b4jUqQ$+Vyhn+uW`v@DrcaG~;7;y~BQ zaM6gyV{LJfOmNAMhXMOSui7npF9z`$S~x3Wuna4EU;sZ6b+d=~7u&Kg`T3mqEy~Wz zis0D5vU(XY&EfhEym7=Z?5*~zN{Jabkd=yD`MJ@uCTr*I<^J{|pin*&z4R<%(M4Qt zHrWXeRVO^Y%#=^rpQo?3c!_~zF%})dS)8<|;98=X-M&(>wJY$h*SHs_DybR;i{T`u zgim+3z{7qbgk0Ui2m5vMV_qIo5UVyV-$Kr=i=*O89wN@*fwiQ)PkTny!n_qO9xMV8 zeY2^tSTirhkt&Y3k>|0W-&Q-rM2^&&6t!3%5<=UI&R1Khqhb-vA>6N)y)L4#f4+v1 z{Df^WezmDw*1c=ly-183bfp)0LO3vuD+|D zZ;!ruq`eV)3!+Z-pVyEH72IX@syE2vntg@pAZ-X~o z*+Bh|ACTeu?URs%JiLXsi7Blspe^3>|E@KZYjMxao>|*pwHaKy7e?J1_nhyVAkWvv z@oJN7Vx^5I_?RZmoAt9dpLQ14$k}}`*@nchV_g=4YyN3`__BH&@GLh$AZg90zwueJ zN;tdoN8Uuk;zO*`KCY%WUlPmYt#W#Mf$+`Zg2yj^ zr?-A2#zub4V!Q`_a=Uy=J3MsEv-yg9agYV7l#8pZZ`{cs1F$bYbG%wv8;Ic}w8Bu_ zF)FV!qi23kZ`WJ8_oFs2!M$w34#s0^I%U`5Uw)2@WgIw|*E7xYZ0s{P$&Aa7@Q-xM zY|x-B>BuCCYnlDE;@!o3Smz6@BBnXVqj*}QmqE0O0Y+?n4`Xwiv8?L3dLQd)yFFc5 z));h_)8d{QdVEOVER!6`<_P^<0bpBE!u;x*_~$xowPl)W-TNvsQ4Vh98rtC%{aUX( zUR;7e+1+{E|_ebO2^zfWWG$N;Pm zL%k2@xIt!mK*6>Hky`=pQC>4j&2iRzr~Xc%9$8&Zeu~Z2r#fR(GQ9B0+0=Qs*f} zI-`ho{IqKk0H0(J12d9>-5|n7VxU*@9b~=tivM9eyo}@5XlCSj zw1!FhF6~>93D;OpOo+d@>Qxoj%@?=X+vvqYGgfDifjs<2Pq^lRywL2;fgR=g*7n-K z2_v$(wTrpTBCfx3R z+VOo_iwdq0>@K3v(!Y9(j$PyBclb?X(p25BJACi}E8>Hy-rO|C7$~NNcvEeY&$BTm z@PTAuSM`tiX#n{=oh_k^TezgQF^U{VH@~7zh_QiJ^LZR1hiGn0`4%U#1!R(UoMaWT z4Aauv4DlQX%VRwkYr~#?tOPYXL_R|$-of42{jIjC5-p?0F!GWE&hiWf^`5?EOGjwR z_7JiEDL3ISG>icko((hkj1Bk|k5|*Hci};Qk&U+6Kuz!b3x2dpBW$OC-rWAtcn=Yl zQGppZIm}4|-c|iXn&REOzx+#E3^1d0Deohe4fRO zZbrJLEkv`1eL83Hj&12)?L*Q$USBvs(O*5<2-0Jdo?)4hzV&duRkmU>f%2(dJuC#W!Iw+mm$m&Yq%2*S(q} z9mhFmYtQbG%v;O~0g|wQv9O80uqGvmFse9UlzOG<){-=F&iL776-Ky_Af5HgcdM$z z&~&ydtfs?zRw&QuMT&eJLh%RMki`Xak(ri`r%^F4kEj>VQFqYOSv}cuW0QlN7@$Y{ zX=fOvSp^RO8U~Quq(OIL=-YVFhoohJx9$p$RAH^dcYJaxZv90wK z4ULvhuu4c3DIuQC#aHX5_64_p#rAa13Unc5woP8=vvZ6H-7-ElLtJm|Se-O+hz8EV zLra)x>D5pt-C}HY75|4MbVzJmqsGGQ%jTr2!mQ3&1|q$gSs%Vo#6mOSeD_2_RunJ` zdETklUcT~PK5 zs%U7!1F=VJ+vgU@MRXqHIY@n&iL6fsy$g52-jq#{7Z?TIOAH zzsE@uS~O`i=V=dPwl|xfqB}0A#69OtTGAs7WK>oYLrJyTCIpsI$YQ?bZ+en8`z3+B z43cAq@up?6K};`mdrg+OD!RrY&(2moktdljkp9I2E##p%&IjW=cC~U+(`Os&Ip~Bg zd%zze{_?4EI!xNTsKO;JhE*uLRP@+7!lXC@k(^}*Mr1KSiH>FV*oku$b*z5 zEcU6ltmBd`%f)`PYei=kibtD=G%`tEo8EaibonVp43iL|W7^`a@gZ!SkZ-2uWY4Us z4cYZ%Z|{tkmyj$(dv@HI?6h`tD|66KzQ-R7BWHDI@uygG7H?0K|5!7N%8Li)piL4r zdMwI=#FmhrPtEhOE5^fs?;C|i^o!AS7Rz}bl#5`F-oxu8Z6#*}TsP{pH#cmdN%uIw z-fW}h<-6q}m@uf ze)>Bvhal}@DX)h(Zh2_A`Yk!jSdNO;Sv(ullU&)*_+-z=oGTAF(y?)X^p5nvJeJ2H zHWl@a#bP9xr11i3+R{|pYy@9fk9=@oHHdic*J#8+%4W~%#+_VH6gOQh5L??HNrLzcDKgT?_+%F)8wW0oJ?P@wRWBya80{B-h1ehmc__J z&e&0O)SktSu7x}&li8y)>*i~wGI)NKb;((#axM%SAM>-PzFsApR~Vyp$05}YPS){` zg&~x5vo}nf{bIq6qBvW!czCC`W5uLq#DQ_d*v2xZhv&T5(R63CGFGVME2P87s+jQ4 zYPd13l0NP|R!hi&1NH!XHEsu~0YRSe@9**{_hqKw1-c~ViuX=(m1Rx$WW!-Vr zSXDH}^FupQRwc_St*Xh?JYizKa-~<$N{06PX=@I@{D~A+f@|9tWQCtc*2?N>QFTaP z`kT#oWc0qO4jw#pxtpfhCy5$Q+{Ynv$em&UX+nvFc-uM#zszV9sKtGHWY@HMZ{B!i zxsKC}R*qt-tQtp(`!QATa54f(^uvJ=Nxx!X=d!!mv$rvg03$YHF%ry+)N|p-^Lc>L z{H7J1wBCcqn>C!BiBHb!OUJm7H;EkUt6w&RWj>naSsD@&+6dBxC*3D^UlMU!?+dl&Cv?2&Cq7!R?Vox(O`VMgCL;TR6l4M)NXixywA z;xwcK`_s%Qw8`6y5k`6%DY@HsArozDV{}L*N7-esvyRb>+t_^FXgx1?wma-o(%(;Pl1=-5Xdobu=WCisr_Fh@b4hAHE*dXl9{V@@zdzr;Xk0 zufZG5F+M=!G-t2sMfy0SeR9{n)_OQf6JvQ@bV&LgY1aHw8`g$gR%d}~{XA`B)l#qg z2>L~v*`oGw3VQSo7c7F5na4Os(wmgd#B#EF#c$|!h&G15Lm&5j&rL{2b<@0W7MA*vxF%vb<)?D>-Y<>cRv?qZcq$wK9X3qOv?BuK3d$2@$z#yK` zz#~uH>z=c0C^cv88vlzz6<5~Xj1Ud!e7TvzcAf^Mv>xV;V33}9%P*#umlPcgde^l9Ej0f3MQcakFSe=lrMo_Rj5id^Vpr(oxcQ zZFbL#^kNpFc_(k`S@P5|x>R2`wIcqLbwIf(7 zI67+XG^vI9befU6+I(X;gHPg-*DT0VY2Tc+(YN``Vh^kQ5iZArKJKOxw_G)Mt z1zST>>-x|xriMH=8ILXXZ7xX)(~bS~*vX$q+h|MqDtnR*iM7 z`Fg0&FY|CMlUomZv}QB={I}VXk-w20LygWSVB?Y1mZQwpF`gO|dM07^GqX7t)%6Gg zbIbh0J+A2Ql~!gms?lhCR>yT!rQOT+pkjM7)i()@qGz#0Cd)3ZCbc|-lUU24I;4Nw zwqBiM%jLA?3=D2wqst1kqKl*SZVvO9>98|$maRvY&?*!zDq&F8Ih|=@v_SMPh*DvziaO?K3^SWQ z%)CmiIp$GSHt~L_dzYS$^lN<5Cr=hLSE%Sgc4y6<4q6or z%zM6>jK)ryj%M*LAwX^;< zn`ga;Qg$bEmeFr)=v6qc_prP1jW+3VHFSE;o{I&|LSI>-XqQgMh)MTbpZ2mECvA+C zm$xQrG`-?|zRrp)0j+RozTxPZo&3fit$9hTn6(|vyBt||g?`8v$((^BG^*;F$K3f9 z9*3a6W=z`p>EHXYhRme%$Uqdj179F3>^fqd( zCW~2{C5esVp{M>_^!jE!lvy&7{vT3xhBzkNHcRWb@ZqvvzbEZA47TlEw-LakOKNJb8Y{Zs)%9 zBxQD->`86Zd+6g`7#Q=a2($K{7WGLgv&}k=JKE^p<)hiUv;I!{S%`NeizBhOI97#Q zduNPnhP>P89*}n=EPIbXS!U5Itm6QbjW_(0Gr1ve#w35vRQoJy6*odHnZpO$^lnD;oqe*X+0WmGwAv*dS3Ay<&F-(qFe++o?ciLawodGQ zQCKgTpiG!#=1)&&XPGo;J#E#{eg5O&bXq^hlZ_R~ZXBb*W>#?w=U77P={woj&Y4L+ z-)=PMB~QnPNm|y&jAKCl$*SjLX*U)vR%5^rEyEcnE?ZN$R!8P$&s(&oP232FMWZC@ z{Lsi+?4Q+|Z#w*zxiJG!zx-n_?B@>T0F5ZZ<7bG|G><2H5&?d%` z*xXqrt@A9ewOs5Y7wOG8J{nh>c|kI#zY)75iT!5RyrOzxKCMn?8}E}i&n$yx*GZ89 zQ$8co7(0ux^FPn&-W_#SeMyCd7*M}FD!FIFi&{g9&z5DIPfHIPBttkitI^mfuMl~X zTp3U-oR)$sM9RgbeW}tB}_bEj-M;ULDCQY>?FT z*CVuy77jeE|EK_skk!Tvjo-7eu(t?Ei+*X)ntJ#Q-B`m$A&~_eWn(5+vmO3vZl-A& zi}MkD(1OlMJWfXR%3{Ssi(Ler%XDw*pIDNxc8~yx}A)R*D>c;X+2Y*Aaxf_Wr&V+h$ zHv4!D;U3AM^)#gCFj-&6ert1i-mmv@=#ZO_F!uJ<^XfMFOppJnuBB+5Od%ERCS|0(@vxijUrQDR8sF@-rGZCwD*rUABaQAnOoz00X_55v zeJzq=Ef0@-H96r1J@ePoJogv|>25^!T-A|= zV4SN8VdiZ3=#4L{7n>*Tv@m}76my%)9-o$ZMe$>nnT{Q$EBj@`m`olsWUVBDU9CDJ zS{aeQc_eLhm%QWN{%jr#VsIm7i!T;q>&|4y^xIz&4!54OEBVOe7)jEzUSw`eGxKK0 zwTstuH`nZ{y)zrnSTHo|*@WheUsXE)bj-te;nm#u8g|W-#Kto|dBnsp(9-Pl(q5_A z$VwWsn75gJo_?hBDoM-=tz>LY<0bX?l~`2N51(>CaXKBE-{1Xi6tjfHjlA5_vp#3# zd)HA~cW?1f47q$EJmPek%{J^v`}A_o$lqrp8TvC!S);MBxe}}bRL#6sO z92&9LRq09UNd9l6uY}VidH;N;W&QkZRxMe-$m6_UQq%G5Ir+w*&1{q;NUCw8Q8r6> z%GhiX8Yj)Mu(%(`%~Y(zjp;e;l5kc!8IsGqV@H-hxznWgWYAaZFr|-kMus1I<-J3M zOdBIYt*aP#>-yfhQ~NPa>*D-9Uv8t-^q+jSBik42-|ZURF^_4^H_is( zHpb|o<#Z5#+uPj8p3U0KjZ_30pU&g5cUCrQbLBxHowe|dcZDM^glv{f{=6xV3Ing3 znM7tW%2g@Tk{zLM9CL@4vyEe}8|$axU)#pm`dk##LQhAUQ4IVO!FiF^wcR|^!Ev%+ zd-Zub#0zIHa?IN1>CD-EvVW;_UvE$~`KOcbf*BfR*ZGX$$k=pMsDa;E^v&LAmd)MENzc+8hS~X+$Q972c_pD_Y zI2MQEy8c-^X~Hx4^YlK&xOvJ0F$mLH>QI{W%N0pK%*Ibg^Eg>RJfBSC<1ElTV@ozp zzxszjv*rb-s?azY+Si8 zotq0!Xn3Q~e)aLU+0%watE|!~3x{S}89fb>2j)gE4(?U+CBygJ{2^Y{bH{KMYGt_e zPb#vIG7R*Mk&Tka(5qHeXX)+OH#+HoXSGhU#?m)=l4E}J8@t-n!)u&d%hNeTXE80@ zlX8}EUfWxc$u@ zCv6rQvOSN3)fNyShX;JT`r?$PX*OwLylUc}W9!dAKYzY+fAI+Moh_cta$AR+Z}^{P zNt~UM0E(pA@A;|m$Armk%sXD6wb}@^4WpR0thZUlfohxaa+obPCH433&E!?J-!kRK z&KCV$D;7$V>ES$0cN8w9w6kPyG{%r`F=EoqN7&;}3#@%(RTE6Ejx7^p&7}Nd8iqzr zHa5!3yPMh?r+snuUJPq&72f&r@g=q#tCD;2rynWJowRwZe&2Y$xa>JjFGiN-S|39) ziJNCU*Td_2nrH23u{|v_YjO7K+&D30PSVYtOmUOcu-zl=Sg_GUxfWx@aRoBrVAc@W zyk!2)9Tv?u+tnuQ8a2JMc4v*(`)2C>6=dIe+HvML)bk9CtO?$uV+x|~>lBQH&CO=6-x_5D5kGY4X_hoKhga3QlbZfU{66Yq?0n6LzuWYF`kZ{}xz^4PtJ&}G z9mxjz{^nF#7Vp=_IO(yraB1}9PSSflt*@eL+(|ddLNy$;AWdUw(Ri>Na-NM5t~=vc zBN~s?L)>%w8a#e`^X8j87}HM0j(Ew~mNYZ@Xn<*<9`>PYwnq^GwN)Lp5GB$MR9DZbp9rX-hBRbx> zT0^#oax#wfBqL9K=vtd3BV$so=X9w0jtyxTBDK!zLUlIMN@VglX4I>D8t9Q%Xn6s;SvqbVV z8%>gjM%RWE#q4T}a`gP6h!$d5z6g}n$nMvC$F8iY+Mvf-fL$E=0Y@ zymmujI>*Gxl0^MYVx|biA-iBm-cq&bo(alJdJR3&=7bOV2nl*|Kig@OQiP-O6R! zH3pgWG*c|TJGbz{thMQNycq^Yo}G?GW~g0u9EzCrr&h(P<;>(hoTmr$aKL=SaI$5g zY2|3zIMTa(X7RvWtAC1lYu9Y`IlUm$T-ha-tmh#yxn}R=D1*!slhT>)q{QF2-8h|R z*R%@#W*?$G50SiUIu{$Ke~cl0oHY8z&L-n(_S(Cl9y84FJ-;!=m-%YFCb7P?#Oq?^ z_u1=y^U1WDKMijZ=kr<(S!bQ0OEGYm)GyuAG%rk(Kj#=0Mlxa+Ob_@vPon&=HqBu6 z**Dv+UD(&Qan~imkv9#KE0>YA@AIz{d?mi zqDA_Igm>R@!h-yvq<3Rwk)*sCvq2*sZeg`?8zG+zS^bx_^@YtMgW1f5d3jlL zl4;iawz*6{NqaWOcz&-!YsZsj7U|mrw$ciNLo_6Y^la2z)#T$0>Amiu<=A{jH)l-o zxA}TLO*Tf_;BIJyI6O9Ho*ql|58=sg9AmHb@HP$)Ta3}h1H!+5FOt-vIbzAzws$sk z7e~H+xq8yEEHbW)WwBu>#RoDblQ}l-t|G;W*=IfBu=tWZldmzFhdfs2Ma8g9v*z2V z@pPJm?c`WAzusXC@vv;>B)Tz%V{;61Q91T6UY*>-mF%-retgy(etAr2#G&$OoD7*| zA{wWSncL+)dBUjd8wXDxvs@JIcq2J_GK_;?4QBb6x%tM^&SzE$}Mfi$k526mlyRN+lT#M z0s5QA&zmOqozHVN{^S_ywVQ=V8ZTy#P&G!n6%999ZHK(Eexu}F-1t+AG$3KTPvXhG82B$&Dw8qns~=`}Iim5JF??swd*{_+(`m2~7dcwNo&@ze zZf%a~(sTNcDfG!FI^tb3=f!a{M2&nXXz8)>*01@GALS)>IZf_t4En8k;~F^|k7cvY zc)oU?53w%?LO*WLcgQ;phh!tg`&Jd5*-V=`?T1u+TLlHF=@C=EcBRdj35oG%dA%8u zE0)x|rq*t?Ao^aS5 zL-uO2?>Xs0d1!4EM>}T3X7$(W7HrdyKtE8mJJRKw#`l({YE~WPcLYuZ>(Map}l#3 zKi7wrNuN!6-R%228}I#eYF@LEcY5sXpU?PtQCFWHq{KGu59LEZtHplT>s4RSLy68%mdJl6u%p=IlwLdraH0&zYpXSK&0fL8YDBVpaUu z>OJn&gDv*zr0vMiF#ohTHtv- z$J%7k^6|#O%wo`S>l;;Pk3%)9o_327X*O*jXxwRm>pdoCjQUmw__^p_g)yE@ivQm; r>4sZ9Pn$a)6PlNf{L%cwARYakHTU}7)1h&+GRuyP2gB!%FG~DBI6S{D literal 0 HcmV?d00001 diff --git a/lib/main.dart b/lib/main.dart index a3c38c44..eed616fd 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -11,23 +11,50 @@ import 'package:firebase_messaging/firebase_messaging.dart'; import 'firebase_options.dart'; import 'providers/profile_provider.dart'; import 'models/profile.dart'; - import 'app.dart'; - import 'providers/notifications_provider.dart'; import 'utils/app_time.dart'; import 'utils/notification_permission.dart'; import 'services/notification_service.dart'; import 'services/notification_bridge.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; + +// Initialize the plugin +final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = + FlutterLocalNotificationsPlugin(); /// Handle messages received while the app is terminated or in background. +@pragma('vm:entry-point') // Required for background execution Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { - // Do minimal work in background isolate. Avoid initializing Flutter - // plugins here (e.g. flutter_local_notifications) as that can hang - // the background isolate and interfere with subsequent launches. - // If you need to persist data from a background message, perform a - // lightweight HTTP call or write to a background-capable DB. - return; + // 1. Initialize the plugin inside the background isolate + final FlutterLocalNotificationsPlugin localNotifPlugin = + FlutterLocalNotificationsPlugin(); + + // 2. Extract title and body from the DATA payload (not message.notification) + final String title = message.data['title'] ?? 'New Notification'; + final String body = message.data['body'] ?? 'You have a new update in TasQ.'; + + // Create a unique ID + final int id = DateTime.now().millisecondsSinceEpoch ~/ 1000; + + // 3. Define the exact same channel specifics + const androidDetails = AndroidNotificationDetails( + 'tasq_custom_sound_channel_2', + 'High Importance Notifications', + importance: Importance.max, + priority: Priority.high, + playSound: true, + sound: RawResourceAndroidNotificationSound('tasq_notification'), + ); + + // 4. Show the notification manually + await localNotifPlugin.show( + id: id, + title: title, + body: body, + notificationDetails: const NotificationDetails(android: androidDetails), + payload: message.data['type'], // Or whatever payload you need for routing + ); } Future main() async { @@ -97,6 +124,7 @@ Future main() async { // request FCM permission (iOS/Android13+) and handle foreground messages await FirebaseMessaging.instance.requestPermission(); } + FirebaseMessaging.onMessage.listen((RemoteMessage message) { final notification = message.notification; if (notification != null) { @@ -122,6 +150,25 @@ Future main() async { }, ); + // 1. Define the High Importance Channel (This MUST match your manifest exactly) + const AndroidNotificationChannel channel = AndroidNotificationChannel( + 'tasq_custom_sound_channel', // id + 'High Importance Notifications', // title visible to user in phone settings + description: 'This channel is used for important TasQ notifications.', + importance: + Importance.max, // THIS is what forces the sound and heads-up banner + playSound: true, + // 👇 Tell Android to use your specific file in the raw folder + sound: RawResourceAndroidNotificationSound('tasq_notification'), + ); + + // 2. Create the channel on the device + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin + >() + ?.createNotificationChannel(channel); + // global navigator key used for snackbars/navigation from notification final navigatorKey = GlobalKey(); diff --git a/lib/services/notification_service.dart b/lib/services/notification_service.dart index 290d3708..97caf0be 100644 --- a/lib/services/notification_service.dart +++ b/lib/services/notification_service.dart @@ -7,6 +7,10 @@ class NotificationService { static final FlutterLocalNotificationsPlugin _plugin = FlutterLocalNotificationsPlugin(); + static const String _channelId = 'tasq_default_channel'; + static const String _channelName = 'General'; + static const String _highChannelId = 'tasq_custom_sound_channel_2'; + static const String _highChannelName = 'High Priority'; /// Call during app startup, after any necessary permissions have been /// granted. The callback receives a [NotificationResponse] when the user @@ -19,6 +23,38 @@ class NotificationService { ); const iosSettings = DarwinInitializationSettings(); + // Ensure the Android notification channel exists with sound and vibration + final androidImpl = _plugin + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin + >(); + if (androidImpl != null) { + const channel = AndroidNotificationChannel( + _channelId, + _channelName, + description: 'General notifications for TasQ', + importance: Importance.defaultImportance, + playSound: true, + enableVibration: true, + ); + const highChannel = AndroidNotificationChannel( + _highChannelId, + _highChannelName, + description: 'High priority notifications (sound + vibration)', + importance: Importance.max, + playSound: true, + enableVibration: true, + // 👇 Tell Android to use your specific file in the raw folder + sound: RawResourceAndroidNotificationSound('tasq_notification'), + ); + try { + await androidImpl.createNotificationChannel(channel); + } catch (_) {} + try { + await androidImpl.createNotificationChannel(highChannel); + } catch (_) {} + } + await _plugin.initialize( settings: const InitializationSettings( android: androidSettings, @@ -36,12 +72,17 @@ class NotificationService { String? payload, }) async { const androidDetails = AndroidNotificationDetails( - 'default_channel', - 'General', - importance: Importance.high, + _highChannelId, + _highChannelName, + importance: Importance.max, priority: Priority.high, + playSound: true, + enableVibration: true, + sound: RawResourceAndroidNotificationSound('tasq_notification'), + ); + const iosDetails = DarwinNotificationDetails( + sound: 'tasq_notification.wav', ); - const iosDetails = DarwinNotificationDetails(); await _plugin.show( id: id, title: title, diff --git a/supabase/functions/send_fcm/index.ts b/supabase/functions/send_fcm/index.ts index 7a65d077..a7e2bc84 100644 --- a/supabase/functions/send_fcm/index.ts +++ b/supabase/functions/send_fcm/index.ts @@ -1,141 +1,141 @@ -import { createClient } from 'npm:@supabase/supabase-js@2'; -import { JWT } from 'npm:google-auth-library@9'; +import { createClient } from 'npm:@supabase/supabase-js@2' +import { JWT } from 'npm:google-auth-library@9' -// we no longer use google-auth-library or a service account; instead -// send FCM via a legacy server key provided as an environment variable -// (FCM_SERVER_KEY). This avoids compatibility problems on the edge. +// CRITICAL: We MUST use the static file import to prevent the 546 CPU crash +import serviceAccount from '../service-account.json' with { type: 'json' } -const supabase = createClient(Deno.env.get('SUPABASE_URL')!, Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!); +interface Notification { + id: string + user_id: string + type: string + ticket_id: string | null + task_id: string | null +} + +interface WebhookPayload { + type: 'INSERT' + table: string + record: Notification + schema: 'public' +} + +const supabase = createClient( + Deno.env.get('SUPABASE_URL')!, + Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')! +) Deno.serve(async (req) => { try { - await supabase.from('send_fcm_errors').insert({ payload: null, error: 'step1', stack: null }); - const body = await req.json(); - try { await supabase.from('send_fcm_errors').insert({ payload: body, error: 'step2', stack: null }); } catch (_) {} + const payload: WebhookPayload = await req.json() - // gather tokens (same as before) - let tokens: any[] = []; - if (Array.isArray(body.tokens)) { - tokens = body.tokens; - } else if (Array.isArray(body.user_ids)) { - try { - const { data: rows } = await supabase - .from('fcm_tokens') - .select('token') - .in('user_id', body.user_ids); - if (rows) tokens = rows.map((r: any) => r.token); - try { await supabase.from('send_fcm_errors').insert({ payload: rows ?? null, error: 'step4a', stack: null }); } catch (_) {} - } catch (_) {} + // 1. Get all tokens for this user + const { data: tokenData, error } = await supabase + .from('fcm_tokens') + .select('token') + .eq('user_id', payload.record.user_id) + + if (error || !tokenData || tokenData.length === 0) { + console.log('No active FCM tokens found for user:', payload.record.user_id) + return new Response('No tokens', { status: 200 }) } - if (body.record && body.record.user_id) { - try { - const { data: rows } = await supabase - .from('fcm_tokens') - .select('token') - .eq('user_id', body.record.user_id); - if (rows) tokens = rows.map((r: any) => r.token); - try { await supabase.from('send_fcm_errors').insert({ payload: rows ?? null, error: 'step4b', stack: null }); } catch (_) {} - } catch (_) {} + + // 2. Auth with Google using the statically loaded JSON + const accessToken = await getAccessToken({ + clientEmail: serviceAccount.client_email, + privateKey: serviceAccount.private_key, + }) + + // 3. Build the notification text + const notificationTitle = `New ${payload.record.type}` + let notificationBody = 'You have a new update in TasQ.' + if (payload.record.ticket_id) { + notificationBody = 'You have a new update on your ticket.' + } else if (payload.record.task_id) { + notificationBody = 'You have a new update on your task.' } - try { await supabase.from('send_fcm_errors').insert({ payload: tokens, error: 'step3', stack: null }); } catch (_) {} - // build notification text - let notificationTitle = ''; - let notificationBody = ''; - if (body.record) { - notificationTitle = `New ${body.record.type}`; - notificationBody = 'You have a new update in TasQ.'; - if (body.record.ticket_id) { - notificationBody = 'You have a new update on your ticket.'; - } else if (body.record.task_id) { - notificationBody = 'You have a new update on your task.'; - } - } - try { await supabase.from('send_fcm_errors').insert({ payload: {title: notificationTitle, body: notificationBody}, error: 'step5', stack: null }); } catch (_) {} - - // Use Firebase HTTP v1 API with service account JSON (recommended). - const serviceAccountStr = Deno.env.get('FIREBASE_SERVICE_ACCOUNT_JSON'); - if (!serviceAccountStr) { - try { await supabase.from('send_fcm_errors').insert({ payload: null, error: 'missing_service_account', stack: null }); } catch (_) {} - } else { - let serviceAccount: any = null; - try { - serviceAccount = JSON.parse(serviceAccountStr); - } catch (e) { - try { await supabase.from('send_fcm_errors').insert({ payload: e.toString(), error: 'service_account_parse_error', stack: null }); } catch (_) {} - } - - if (serviceAccount && tokens.length) { - // helper to get short-lived OAuth2 access token - const getAccessToken = async () => { - const jwtClient = new JWT({ - email: serviceAccount.client_email, - key: serviceAccount.private_key, - scopes: ['https://www.googleapis.com/auth/firebase.messaging'], - }); - const tokens = await jwtClient.authorize(); - return tokens.access_token as string | undefined; - }; - - const accessToken = await getAccessToken().catch(async (e) => { - try { await supabase.from('send_fcm_errors').insert({ payload: e.toString(), error: 'access_token_error', stack: null }); } catch (_) {} - return undefined; - }); - - if (!accessToken) { - try { await supabase.from('send_fcm_errors').insert({ payload: null, error: 'no_access_token', stack: null }); } catch (_) {} - } else { - const projectId = serviceAccount.project_id; - const fcmEndpoint = `https://fcm.googleapis.com/v1/projects/${projectId}/messages:send`; - - // send concurrently per token (HTTP v1 doesn't support registration_ids) - const sendPromises = tokens.map(async (token) => { - const payload = { - message: { - token: token, - notification: { title: notificationTitle, body: notificationBody }, - data: body.data || {}, + // 4. Send to all devices concurrently + const sendPromises = tokenData.map(async (row) => { + const res = await fetch( + `https://fcm.googleapis.com/v1/projects/${serviceAccount.project_id}/messages:send`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${accessToken}`, + }, + body: JSON.stringify({ + message: { + token: row.token, + // ❌ REMOVED the top-level 'notification' block entirely! + data: { + title: notificationTitle, // ✅ Moved title here + body: notificationBody, // ✅ Moved body here + notification_id: payload.record.id, + type: payload.record.type, + ticket_id: payload.record.ticket_id || '', + task_id: payload.record.task_id || '', }, - }; - - try { - const res = await fetch(fcmEndpoint, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${accessToken}`, + // Android priority (keep this to wake the device) + android: { + priority: 'high', + }, + // iOS must STILL use the apns block for background processing + apns: { + payload: { + aps: { + sound: 'tasq_notification.wav', + contentAvailable: 1, + }, }, - body: JSON.stringify(payload), - }); - const json = await res.json().catch(() => null); - - // Log result for debugging - try { await supabase.from('send_fcm_errors').insert({ payload: json ?? { status: res.status }, error: 'send_fcm_result', stack: null }); } catch (_) {} - - // Token invalidation handling - if (!res.ok && json && json.error) { - // Example detail: json.error.details?.[0]?.errorCode === 'UNREGISTERED' - const detailCode = json.error.details && Array.isArray(json.error.details) && json.error.details[0] ? json.error.details[0].errorCode : undefined; - const status = json.error.status || json.error.code || res.status; - if (detailCode === 'UNREGISTERED' || status === 'NOT_FOUND' || status === 404) { - try { await supabase.from('fcm_tokens').delete().eq('token', token); } catch (_) {} - try { await supabase.from('send_fcm_errors').insert({ payload: { token, error: detailCode || status }, error: 'removed_dead_token', stack: null }); } catch (_) {} - } - } - - return { token, status: res.status, response: json }; - } catch (e) { - try { await supabase.from('send_fcm_errors').insert({ payload: e.toString(), error: 'send_exception', stack: null }); } catch (_) {} - return { token, status: 0, response: String(e) }; - } - }); - - // Wait for send results but don't fail the function if some fail - const results = await Promise.all(sendPromises); - try { await supabase.from('send_fcm_errors').insert({ payload: results, error: 'send_batch_complete', stack: null }); } catch (_) {} + }, + }, + }), } + ) + + const resData = await res.json() + + // 5. Automatic Cleanup: If Firebase says the token is dead, delete it from the DB + if (!res.ok && resData.error?.details?.[0]?.errorCode === 'UNREGISTERED') { + console.log(`Dead token detected. Removing from DB: ${row.token}`) + await supabase.from('fcm_tokens').delete().eq('token', row.token) } - } - } catch (_) {} - return new Response('ok', { headers: { 'Access-Control-Allow-Origin': '*' } }); -}); + + return { token: row.token, status: res.status, response: resData } + }) + + const results = await Promise.all(sendPromises) + + return new Response(JSON.stringify(results), { + headers: { 'Content-Type': 'application/json' }, + }) + } catch (err) { + console.error('FCM Error:', err) + return new Response(JSON.stringify({ error: String(err) }), { status: 500 }) + } +}) + +// JWT helper +const getAccessToken = ({ + clientEmail, + privateKey, +}: { + clientEmail: string + privateKey: string +}): Promise => { + return new Promise((resolve, reject) => { + const jwtClient = new JWT({ + email: clientEmail, + key: privateKey, + scopes: ['https://www.googleapis.com/auth/firebase.messaging'], + }) + jwtClient.authorize((err, tokens) => { + if (err) { + reject(err) + return + } + resolve(tokens!.access_token!) + }) + }) +} \ No newline at end of file