From 6388d319b6c7d33bbc5d74fb3261e8c75f3d6260 Mon Sep 17 00:00:00 2001 From: k3ii Date: Fri, 20 Sep 2024 16:54:46 +0400 Subject: [PATCH 1/8] chore: Add assets --- assets/demo.jpeg | Bin 0 -> 63682 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/demo.jpeg diff --git a/assets/demo.jpeg b/assets/demo.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..827e5edf365cd4fe6d841a315f7789f636fe94a5 GIT binary patch literal 63682 zcmeFY1ymf*wl6%mySuwXa1R862bVyCI|P^DuE8NV1PBBVZXvi^a1SoQ2@(hpUeA#H z&pG#=b8Wr1zVEH|x~99Tw*K~>>FHfPJ@<3>s~}8y895mc6ch*q1vJq8B1j5^1do7- z0FQ)-fQXEYgo1{Tfrg5TMuLlniBCyJO-)HgK|#y-h?SO}i-CfIO_Ys`mtROoh=xU6 zT3kTtk)RMi*a#FdGBO$}8Zib2F+Uvz9shrOyYB>HAwn6zfncDhLC{!GFj!Fc-5_Ex zR2VSazcyGX7&vHnfJX%Nu>HjWVuFT&g}Yw>p~66cpfO=E0m}6od_iNDyh9uBrR9pJ zHIv_^_GMi*Y~DXJAoyZ`rX3-2d~RYuf({kLiu#eeeF)~?b)Zo~o@jsW_E8wrXl~B_ zE}H+%-A1iI)8T6Y-F-#bop*^@$KsE@C(Cy?EsA$Hg_~pe?1INC|1LscNH_`=B-kqf zG7$ioK5z&}VTic@QRwex{Mu;r!+ZG7{1G4eW8W93a=bhG5aPJ$nbJZ0|ED%Whow#Q zR<_ra?IwlpwT)VY!g`_ndC{tFFvoz?; zvJ!V%WZuQ{kbji;pU<++4n?glW6?uD#QRpu5dSu0zRNDsXDcfuvTeZOo##?BOs1@B zr)GfXqQ7nNTwB29;<3>4#*N}3Hss&$0X#Qz%3MtCICsfsRbgVm&ZW+0U;ggx`6om8 z<>zC>4c}ObQif`>nH5);0T~0dEwOjehcqiOi~3qumzk;yj0Ui=zQpt$(#F)i|D11!pdw2ay?{4xNZ;yD_}@~FfoK$WF)d9$yYrk7KPL6 zN?K_l$6BO1H0MHk*kf-VRJ$HC31~7N3grJE9L{`&->4}~UOk{1)LUQD36-i|e_Ok0 zr<|C>v>?s4ayHA6dJw&5w`mbOej@C>3d-{`5^`}2o7um1ybw8(!N|+scFh*@UJkP% zwX-n32W6eO)}MaLigvur8uJs}J?KNopNRt!XClCqJr|Q>vgPEX9h*w=WFshX_tB|$ z%spuAwb0czdX|Vd!k3%t@y{y0|KzRsi$ubEB%&>r^izcthtKWT^YL?UHZcOftS4jc zA>V{1`Zf>F#VimjNHXT%W7#wO;BDYyx07Za_7GNm?O#P%MOcH4Jh56uk311MzS@9u z#iF#@fc2AEHlf>tRfcu=vjP`k16GtO`jprj%dqjV>~1k-4fbj|JMtO1d=0+*899n0 zL;wXViU$*r#ENnxtfEIzU9H2cB9|ZEEGMi3$dImv3k4$LNDdgS0_YC}Y(ubvRmi03 zK^H&;maUF4fJ@x_q7$bRMQ6pSn;Oy>OJ@ZaK49h@^>)}z#;xJh$MaWN*Z6mT=wjy7 zZ^zM|g;eLS1)eLPC6?_Ch@t0Xzv%Q)vat8@RjPBg7FitqZr7VbC;XnIh9cp!oti(W z*Fl>Xhm5?E1A%|ngCw@#?5v*5g22i=LNp7*yJPgP6#vt~VyR)Cll$o~SN`s2x8%JO z_inqhA~xIo({g#w8&@*n#wK&-wWi6hv5raWjxy%Bg}CNMGf}p5NIgs;0-4V;)l$K` zdPI*vCU5{#k$Q+8=4z>~d5cJZ&bp&A18{ikC~pMJ%#9#3d85Y<_WrOS%tBlSz{Ov( z;2}i%x92~`z$hSNuuX^^bE7AucUwFgl7M(21SOauZ={r28jCeg^tC9hrQ=K>f91R# zy4X7D;P~`oy3HeOZGMfMuY8Gzr$LDt^~9}5WkF*V@uTnL#!hEa1IsK$JkRNXtN{s* zj;R#)krkg=mKEEz;j>)%IKAhy-R4!BO>=arP`i_-Lh&loa&dp4)Iy6!R`}f*V`a|{ z|Jch+6$XoF7w@0D6ym0>PWtCXRPz*;VfM?L>W4Gt%6+WrHLw%2RA0`j&yoq;LpA1i zXZ97HU0j-ad|#8qm}k_-o3}|XSe?sluZ?9lp)Wn(6>KUR$R`saUCusnwu}8JyI%~I zFY6{1H(v$+ zKvad+@4=r47;_O2=wcH*go<7*dF?_bN;VL~k&`>)aQVZtNSrLI4?)EuT0Q1{-{|#$ zy_hrE3ti>q>`~ue1qC`k$vuacCz66*+Ee=w98izBtM-mxh+xZaemc!>Xk0zYHyZ6z zaXf3S;F!oX@L6UMv)>`?-J%sdlu)Q1fqnfsC_$z9SXRtFSnAa)1RU8Z?}4i657&3g z6#nP}IuRJ3qhRc)mC# zrjM3>nL1me140E~w%J2BfRhUtXw%{N1Kpnu)dDV^&yELU(o0P5SJ@7MTXqC_%$N1U zJ=4vj7P*nWN$;!4_~=j~LQ@l}P$_WdmfI@>^hR;LGTdM)nAy(-k?FU4knJ~$gC{~Y zHHrso%&*!`$A?OwHP;hOAGbsNg2DK((b{l6t)#Vqwf=6-J}hnB9R&*z${_8dObu*g zcNBQ~Q3gz^fsNvni;^)pc&v2nCg-e-q>1GAs)M5hzSYHayyR1S=>YLCHfslU2XPhk zr}(lC>MH7CY!+-*tTL=ppofgW#13MJESL*OgJl6WSQjh-7=g^eLol_9{;(Fy>f0#9 ze`I&$_Xkw4?w(}{EGB$jN2;4Aw}spnHy``EsCQYCgcs1Iisr;rFGMEeeu`O*{MadQ z7Ipa`klJQ6(r44r?}NHSAxfG#?B`gh4 zHHJH@NUvLzu5NF%ZLSHE$1ulA&mCS1jFwxBwd4oSuL{-Y2<$F6_;~JR7QM{2a@`g4 zSqcxBId@!*cho#D@={}iqdh+uz0nDMb+$E<>!p=5d54C^Z~9Dl|+}$LN7j%SB>nZPVPJIXqR_;iF^@kmE4y(E#Ebwsd%P1xgC6st_ih~JLY{4w^THM;pWPqEytNR`tl0%S(zEmG zQz*B=qAC6DD96Pp%DX1-K2t*w2#&`95%S^wedv9{vxsE=%W!{yu+$d1T&PdMg4V67 zmyGRGz?WE^Wo;3I{cNtq^~jC>>aUy!w(Eww-{OQatGopW*0B^jzO3|<`ATS3V=eB; zvo8*lsd)Pzo+7-I6>;(T-lwp_=u);CQoOhYhcmDgC_JXu~njjAQ)sma!<(dDxmU@n&_^USOynz8L`g&)2;v9}^o zKN7VN8}XP;H0M3w&ghtr!ol5cRPmVITzTWkXVOETQdM_^UA8k`DLCWRmji!bL!yS9 zVZ=0=1IJ`5!n-*iahbi)J5x!2*+#!~{oPisaqfajeYD1n7p>TxMDGIEf*6_jHlwPP zeo3CCJFg(GHn6Opc{uPBc=p$rS)R2!upke@DG_W@u$WM~S_z&??>Sk9k}+ko!z~K! zAJoA15+vZ=7N!vr7S!E3YTsYuDJ>~x`7E(gJgE#8%io$43z8*tsgn(Avl#Rei|9$JP-<4m^FH~>{z}CD(EIAA zXdAm&jmmIr?pX(gLQY!8RKw1RySw+c?4)!<^zQyeKz93)h2rD zJ?N3J;JQC5sy_@7Dr!|6c$HWc*DHYvtQDbxgk6qB#`D#DaCQ`z-BDQ1y+sKb&x%;~ z8#)=>5FLE9#PqYv0xvHuhs|v5`b0h7d`>RFDPsx`@4c+sv9`y7TBw3EBaJvr;!CdFh@L%`;C82+< z{-1JgJWYyApkDt&^Bpw=Zd`C+f}mibp`oDQ;eX%SfC27Yz+&NIsQ3ilv1ljJrGf0%g0$I6Vulcn%!?=V%8SeNSQiAkJj3(xp! z`6$=M%LtXRD=6!8Te2Iy4lycTUisOaKVIymsXdAL`b=eT-h7jmuJ?(!DejTH>YF}u ztVRhpk9OIE_;TO;W|3k0nR`&z8j{k5a^3%H|HBM~W1~r4X$=0^Zdl9y)2%f7v)2E~ z?U|^_>v`RO+%&T`KMzPeGlb=0HZp%!aW?^T`Em1vQr~y@bF~NG$L>x0h)b8-Q3Q)> zeB41Xm}IM3SBu!qdH49|>z4>nOxos%9Za3Po8L;usLK;wTH@l??sQ&4C$2vg(LIpn zw2BJ0MZ7H}Q6;dp)PJ$C0{Mk+ufwc5V-^?~?IQzSV z0TZfu4{YcCZ}D&gZ_tl77q*s~I-xCsOV8|#NWN411>vPn3AE3=NAlCc_fp92F?P&o z(^m1gcHibW^?R=}eIuS9I}Ut&8&`7fJkYLtUyb~N6W40`$?S>nLUK0Fb(8Gx2G1+Y z|6%^`CH|X~>5NL~>wn_tziH;*;{5+w{Y&MiaD}7p@93X`Dk=B-h5my9UIWWrLZ$9- ztV)I0<#Sc!(iF~eYNFEkZuxGKz4$Wh+T4lvd@35z8eGn?>gTf)+`f<~QUiHsa> z+bo|fs1(~R$V53MPP&DDx;T$o5bCB4c_AHaJu*@tz2SzLyGbj>#H5)dE!l4^w1@J`2()du z*H~|KhN3GBjTm<}4iOV05CkX7M)ctcw%S#3%bdo}J2pP%?8wcRE3DFZ8;Olb-jcq= z(slEK+3OIR`-TlX}0iG7t&*W-uTda=?1_};Z zp6(}Q%p(mV(`Nc)C2oFCY)Np^&k}B_m|#~4A9c`mMHO5u=i=eDvL2g-OU* zDRI=kNeri@*-2?WQpTKiUS2K1Y9y!HGii(CTkgf1eI{i!6+yY`s~!3%Wz`=$;^yTejOQ6OO2Y3${5l}WD$PN%8 z_FzOHg4tAH;YSbl;o6D7cEZ7Sl|UvC`+w{?0Kfo%cz_!oh${wwP47>DSpjwjSZ@q) zfc5}H0Q|^+6{1xD?J6v={|&7Lpi%*VF!9HcK*}Wr%t1VMBSGZAvBQvpk-&rPc)&pU z3rB(6YQcd(|3w8jK$hSI;QnaqQCr<51k>@S7K-~Fv@UsZ{u&mqK_QhZ}pWaUzHnDsXcc>G(o`!-d%@Gc;#&Bn86n^=>Ldc74 zww0HrkG5`5SaJB$gz+Avio+B4CJ^0TaCEXcD_hlRldFL~{NNK6gQvngL3fcwQiMqo z{R*kTKG)&8;q0a~8zNq3p;>N7gV26cZPI3% zQvPa*vpj6hY$m`CX%;#|`a}8y`)MgvDOJhM+wpaPvAXEGkt_(Cdj_y)z3p0IR$*2K z>_9UI`&ZH*g$NG+5dS|vh*e;) zf5Ci+=pW+w6DJtkEcff}2W%F9FhQU*RG3Rvm~)kq)Rq1fe$8+E0IEN-5d6&VXe}=P zO(i`sR0b5w|IJrv%-!{Wy&(TTFDc=E#M9e)(Y-hPLclEHv8uR$iBT%8&`#d~4s7ZlFTENV|T z&0xB(%$V!wMTgb;RFif+M&po!oc^6Vi#rJ8!0pI3)3{6k@v_#f% z$|pkmtqa5x7YtX21eBZg7z3FTw%+lOPFC~x14>#tYfj5jn(!sp0vR$jY_4*Cr2}TiO{uV5#+F!S|qsDr9?E)WH`9*(4Gpzm(h;Sy#}tD zlz5GC<@i5lMU*WcRB+vR*_f7W` z(!P4BuHq4NWeMloMiF!BzR&Da16WyMm!=J2>n;OT7yQcnq2;N~2L6{#(Xs4~q{Qvwg;@khd4i~>17 zU~?~)a*w=V4kBnOtxe+MmYm8-M8X(`0|*C0r^s#1ZTygMQgs$F_eEo@3IwMPVp7o; zcHVMN@}Sdk?C7q|y{8&&Dsz^i{D~PsI8$-raPTIAy3KU}U2&x~5M9yBoJBml|bnrdZL|7>0{~wwaxK@-tOQ-HP#KsEJ z35`OG6_k1Qdi{unr)8LyI1UBzJTdH}Kzf#E)z6)gcAY$}xOP?7UI|v?T8ak!SOLUD z$+E{O4slB~hfJZ2Ot5iLplWlR^XO-(@YGnsMr%Y$>(GMAM4<}7iT>sINOW+ZxJWA6 zty!_xy_>JkPzTxT+P;Db+3p1_YkkLtQ4-rG-%@aIT5;7Ml{n2EVMX zz|TZ^@hl_w4SjT0AvRh#BPSuPhnMsf6$LG@3ei6J9P?897uj3)N8-cZQ;b!nrpzP5 zwk5aHFk@Q~Pih4@Glw@mR6t9!xkZ!Hc0Ja`iE*nC@3;qHxV;I;Xsq|eZM=l3*(noj z)hqi>rhQ#M{-e3X%&(tVIs0h5>(W{*FU2SpI5a*NoiKqvB2EiA zCx>E+0)h-5^lzZJWw70o0*QzQ*(+`Ps46H@)^1}B2dM5r2-OCDqX)i~8;|vAA3v@6 z5w!Pq`gcxEfb|~gF##RNu5Itj(^ z1x%c!Z^_yw`(g$*avl))4*en1PX*qjKzP`?r zge(8lPZgo;)$=RdJJnk991x@~gaQgvC?!w@6j1CTr~^eNi@!Rs<4BW0Xx&`Lm|lm5d+F$z)&_+A5g+-t&$&sbznpwx_~~Q_Xw~7=%St= zui^qbxHtvZwAz6D*n@MR!n8yn1&cwik^&-l{|v=L(fkJm99RU{f$|mtAE>Q?9s(HZ zw?onsaPiCp>?lA?0)S%{AVxtj2oJ!M2(h>J5T4}FyU$Y(zUUi^n&A@{T@_x4}!snEg4C^@qv#TxCd>( z%<`AtA_L##%+>o?Nb?w87-gjjZwP!fOT9HEszQ~4SJ}JVFX2JMe(Xz;o?)n}v zd(5QsSOtO1F%-A2Ta#)Ac>2rRlcUSWsjEr?O@KIe1D8p7y!-`hz`H5E@#qpv)x^O9 zVPnEZwm@ndyj3nMv@}@bXa+qVws+D`NV9or$o<0S%L(CpseTRHpd>;w?ela$BYmYw zK$D6&_YDfexN)7sf_08e@?@QAI@u^TV>uRr) z)+cLB?mSao+jo7#)nnw^CkwAd=Xx3qthJ*($%j@MXzR?o_F*#vQ1#gOy1)HwGYz&! zGQtL{kUCUPbGS&8oemI^^rK zyw1EUC-4|_Ym(9C?y4e0#-GofamME-z#^4q-4J}NZ?1s4o^~A`;@M}+K{#g*Bd)&} zr&_}>?5~X)W-JwaXbvYLcYxHqfS=CAdZU2-Ns7dN`0|(4ywzhjqV7wQ;)7nr5Q|{G z>di!Xg;!^CMg_PEoYXck!z}vLBu-c$bKFbaqGfzm1;*6(!3*OEjBK;2AD11f$3quC z)vwgMdCJ4ORhb4^54ssj3uj^;4LjPrM0%c>3b*H^Yn4y&(e9=-wbs}cq2W8cn^A8U zw~2#@xu8xBAJzI*QkiU}F&Q@lm6!B9l^87Pk~42ie^P7YlYSGs1)7>p;0v)efF?YI zUm!I`SMgKt3=MurLo^=vauPdIdJjS$W8c0TMl|QNlT`C;*KFe4?@kQSNzekVy{-z5 zwdan)Rhl{1l_`9-_b5*&mNB%9@XWHdSO$k{{q`tailN3|Kd)jUcs^aTw0)Wl)?iHO zhDuL8qQo`EHCKS1ViP2p?0&aD>&!SEZ95lCDRXytJLvL)E7{yX4%8joxojt|zs*pl zkn`4QN-(qbD<-dHC?j6#c(UgsUfpboeUbLfPpX~R0w+I2R5Y2RWy(p(v zKE_*)T?dX?InP7RZXZ&yhFf8_?(&-je#bCQUbiYFw8&vhpt9;Ss@ftFxN@eFZjYCo zZ9rG8W~~eVFdx-!9?hx}M&#oOZgMu<0 zIu-sBNZpo3r|Er0y-%WuyJFPU9?{b15Mdsm8b71qb-=V`XhNVWB1q0dok$Kh-6ows zK=Ti>bPQ*cfhEd2p^}lpeV3KN5TJ^TU{OWd+VMdrS{}P2m!>BKyCcf740v*i^CdRU zstS00KD2xH_EtE%?PB$H??qdH$}|zZkQe>vKuU+!K$dNqZCc7enk^nMc&lzYKhHhK z>_zWdZ91bkWctt`w0UkY)vVh5Ioxx4a0B!Q66bm9AtsUmZ9LlyVfyEE&*@bRD;5C( zt%DSLu(f$UH>IpZwnQN>I@emjfRgEOy&|L`*DGds7=RJ*CRERJ&ocu%pPM|u132}H z=>uuM1;P4(<$w)(z(4&10WH%09;^cuye3Qh_~#ASRXt+Q2)+}Uis@**;=biTSz4kl4_gA*l7(rh>A(Tr7u&Sq=k&&PiQJID{<6If)&Sr_vX}<8 zq8TGMc95)hN?oO4N8y!d{Z2bNRDP6eugy=|*rEviN7XDW$c~Rxjj1m^5Tpz*{q9t@6J(hb) zV@0lbnovWZma%?TIDGdq5ewVVe}{KU*??}lgTbuijyo;_Aua-*%xVy6zu6jioK8cP z3l8yV4Ng^oV8=GKWC68|*x*IxM%P-fY*OB-+ubNUsX4V|CawAUZ7QutyL5(xbb5FM zlj~SUa9N??8%zU7pz{0>o)}(=neXQI`Xm7H#CHJQA*oyPMkxHtHx6>{$0(z!(S^+l zLmx6X!9Fm4QRYO*UsJAbX6~)imW{^}taD0)^Lo)Relj~C^&E6Pae_*HMZ{y(hBdW4 z2;7x_s&@Utq2w0)f`gIKE0-c`}?8KR#u4Dls`*x<5MT_ur zrExv0KkBCYvZcJy^IyX_?J)>OSeUX8Yh z;v3Y(o4tDwbWVv_tH|uAO<90>^N7osfq8R3zD?Qe)QI8qD5V3n7Gm6-rPYac9? z2020uOg4f&DT39(&b>DQn}7rJW{b*bh&}Vq&JT_XUjzQZEPw!pc?=e+sD}IJuy%L> z6ugrFcHk)b57;3=j-moKT+^>dT;mwPhHVO8{|WLej&)Xfwf#k# zA#9%6UI;>PcFNXvE}!!Do4yV~@meu$-foT`RFG*bIMUh|yr53n zcd(ZOkNcGw{7coRt4Qf#p95I~E+bHlJfF~{c5ikps~G*7 z_BaMttdwF+HcO6G;!UwU7wX6Lw`8xm?Txx&EYJ)cqEq87Kgg}Iykehd zGjMX;^Og?me&M$R{KiGg{RwyY`ztTB4+U~cxSK4Zfg;j!$WGO|iuLq56-yxl41{IF zsv&{sMvnq-Xm@Bvc19H+>(VZ`4GGwjL?tM5%~NhvOAEikvLmQ=lM|Hts+P9>6thy` z=5ju@D&*XcYo>UvW%IwGS@)BhO{f3g+weT43(A>r{*z2t z$GdnnUm++MFKKj7ldQwtLUi)9aCmXy+DtPb2AV zn`gG_2pi$>yJAW8n#)`smh&%PWAY*g`>p**2BOBlWA#~(_Uk*x5SCLA=DybnFC;j4 zUzFcg)3iRFF&^E^2;H1YrtljtG!zUh@Yj()8x|BcG^e2hEG7;WjO4Qiyuf1{;!x4m z)!cqhqHuU%-j1Y@VziK=n!KJN#Si#p!$yo)tVZQltcr(UC!b8PomchFV}YE*OY#ue z^eWI~v+X)ZCajG?J=Dd9aTiovJ7~)tm!5fFHl(-{BfN1kpZ{3Oq4cJN^Bv2)sCS zQ{LmgysZ52WWxw;L)iqhW5!9+4mq|f`Oe8rHa|&z zrqOv2Sa3Q-RFYFdK#J5uK2rY5@#XC_$J_i$n^zw^Wdkdf3-Mljy-=sI{7*D7RQ=Rq^%n3S+k@P!lz2ByhFa)_LJZR zkB%buE9G>HOl9VmiXB}1ogenz3Lwl;X^i$hBBbY0B#_eQB5=Qbb}%Hadk+d0s@Shk zTD5ZKw25_s8n!v)p72VnES!bjuR3D6dm;-j>mKPm<|&a9=7~!<1J7v!^KJM!v;QiK#lXwLfr)t?FjdY=1Ck85N=P*i1kELfVH&`6KsritL(_-Meyo3BOMK zk8*luR>_50Y5%YL`xNv}U^zQG=XrnL|24LFO?8D)bbcqE%5d9vMKCGyzTn+;PJ_e; zot?3O0g)vT3`m~((rAT|YZK{gM5pi3uadQ-g(_#2I8iKnf}JnS?#qa2AoTB1!kuWX zIYdft`N$HBU?m)4k$O1SVm%nMiJ+fmKI2}J4iN9b-d->?e20JW>buK!`pu#^o_8&u zv7G)0w6WZXkWu}%zGgBaMTK>5N=|_Oh&aq0YbWe_7B!c?v1|`$hKMaKsVkI$Q_J?( zE;*4Pw4=C(udEN|?bu?jaAi&R;}TE3lgA#P430kIF~GRylVW;!*XE$cnOMtxHpgeT z*;6*E8eg`%2Q^3(?xnpK7Q)LQ15}l*5n*!6qHY0?0>T~pNLXsb9NM+NX#6l zD>`42EVbEMWy@@z2}5}g!hIDH@K$PZ_61_c#~_76XE{OhAmQUAq8V4SqE0i>R$G$7 z8)qf291pUS_sMP7kL^Ah9Anb_)Q!&!{xQjqoTyI-fRRyFLCwm&f( zwH@5GB~bYP^i!$XM!E-a{er!X`N>po_Df7bWlAgOL%F!Bo^M|5-4m;yk&_pAMSCnN zQ<`@#+enB0CHr4!{ZGiM(?2jg|IYLO#Kyma|9`g;C9)S5r?_j=n|@gTy~vc!;@gkC z1~7*2n(6J3w}p-yY&T}ie!3`Fs}C9HE_ z@%WZ;Z8Tpr$>l7a9oB4AhNy8wkJk{I{q0!w%Z!;5P5b#v8iCj<(+)wOZa;SBdrwDcmI2Z?1rr1LRhoY|Evy#%C}1*m%ayo-MF1_KL7ityZ-?Pmf)iVoT5 zinWWwP(yhKT-YQ6$&|IqYR=DI+u2)kuB!z095A$#2kLDL!L|$Jt`TlB;C%UW-pVdX zI~wFXc{Rv%L3+c^7lb$!RXpW=D~X)!zDnGA{QZNbO{KrydfVwDNIasc(kLa9r)xyZ zuT81K>dHk6hI3V(OmR$iDWokzlm2pn8wR^Iv#BwK+z(HoqM73u+0rVELxJdI z1Ea5g-4vZ`G?E2H2r$D%JCf=2GvinFGEfGU2$wqNtgV)+7c$gh1bm%VFD+CY&mfB= zP~B@&*_|1sR?mlGN?b47e5C_pvDcbkQ**Zx!L7%diJW&Ck+SX$(lAg|C|n6;en+I= zB5@BIcXRhGAxXbs8!UbcP#uGwci(s`LmFi3x!} zWP2pM+L}9#C`#68i_v*bwO?5DYU4y)-GgK%uLJ#tUkhZa^hi2VNw1bS_64pvQW!t( z>Hbw3(fxr=(lIvDe}kM10RZe4%XTOn{DVzfw!hAx%DTl`w6va0+g7U1t*7KLN^?>5 z5TG`5jE>Qj>|W!8d3G|)EymMs-SiMa**dpwFKt`Bir9Gc=|#*#gF5RLV=m1_K$L0$ zEH?#k0U^LzxLd{9s$Rw1M__naF;|yW1!w?rG!VJJ6NuLQ?HsGQG$7yzfFoPy{uX)q zw~;vjC}GJlJ6svqh5)zkMo!vCYL=gJZ!j&EJ%&bI*YW(0ggy z0d&BU2?Q&EVJHC52ROoDjfDpdARe&QhbaCQBbfF(MqWtLAO`<~BuxJf+2D7`tjsOO z4~c&K;PiJ2feAPQEg&g)kW2zGzkwi)wFUx)32 zZxkRXzyLRMOR87IU1_08WAH=vE`LWh{{7+I=?Q`42T(%-r*ZxlECdNSF#s0VIwU?} z6z@3T>YqnU=U5xta1XLL{6XYmcInT?{aPS^f;{cUBm5@lghHipD4#vEt)Td}LwsAj zJtuxeTAb%{x2qMu<#1%~<{EeYixNe=1GWDnX|RPbjOI+ zJ?KOBWWuysjSO52!g?{r1=&k;&N?rGdyv<(yvtssrchVT>&xt_OR+Wf5K#-=9VGuv zd7P^?vG*(iCb?s;FP%2%kww@|f-DGp2h&Q(cSMvCXggI<^w&*zb&s28j6q6um7uMd zC)!r@YjmHj6Xm#{dwoW#Fo!o@d@qzCHPq)_!Y&wwf7bywYsj_hzS~@i&brSY^DA^- zwd@e}EpyoX9(O9Qv*;CvbFyy~;hvQAKP_ zgV^!?DjwCZ{L+Iyw6+PwUak>gqP|D%-r5voGN1fzHLrl5*=`XrRdfYHl#1dlK^MsGY2*5a7=UgyNm>@>l^seQth%Kin*}c)Gc2q9BIA`Nm*wZ^mZuq^ z_?_sGu*H_IZTTgx^q&;h%L>1iDV`)v9JEKAN(XQwY6mdZLlGc&6X;HHU#BH&L*d~_ z?eflqrzycF>gx`wI2|(99i=6!mzliuOu(%R$d-KixaE0_sb^mAqzx4J?(yS{R8*%N z*o|qvABgNqcJfL-P1va67b3|l26S>Us~R>7JF3N!v#p* zllBQO<>SDZ@`>6dpe+YZI{j{L$U+S&x;Kn_VEO~6Gb06PA7yL6JbAK=Dm{BWdl{=1 zxWX+++w|f$tX&E-KhVlZc?3~|jN=cM0S7}${ciR>R!t^Kb8P%<{M1kQO~s;=`Y-J} zteRxCzy=`dnGfnwA)4_~b-Kx_1y>l%sDhvbqs#b%X|5c=!ulVDP`eDa1df=EpK87ZuW-{G3{B5o z?eF|Tyn?|c#vLq2g7fs?;7`Z{iAqZyA{X}CjQU`onHKR`&58Y_1xEP~ zRwh3`te*0I2FkD5ReZm3TMW5AS1TDv9LBRp_}mAAkw5s>RQU--Uma>|Hb>M0PWMhfnruL@A7mfq@yv@M!1j7hn58X%G)> zVb%NcRoDR~;C!MbYA@W}k4BO285W%*4^S-&GqCD=gn`(SgcGsL0rxJqyD@Kem1x)u zo;TNE2mzMenJ30JS;!Vze}!~+AI>%lQO~7 zY;;=YiBmERa+4;-T(>DY$&O**mN6t%HOD4#@=-+f+$_EaT??uQ_;A5`64F6NqvayIaK-Tq7K#Db`b$g9?WlgI= zk>v|3Y-?iHSy>}}>p@vV@k+1s$%Wcwh~QM~UdA`4Y1-5mysd|!!V>*}9~)S(azUnR z+uuWKF(Os%P^Xo5Mu2WRTkYsj*YvC8XKMA9Rmp7jM{@jLl!fTC@7L=kGy9HS)N?OJ zG%u)ooqDa~eH74m!lP&FNSlY-n%{20(tp%|^`-q09dT3Rt%#b;FHEW4wcKSB^z1UG z2D86fc+HC{Tlp2Mrd!iY*ruO`1kZMf+c0y)T#uJLn4A*uwZ8f1ML`wE-Du%J?~c|2?+vpOk9VgX zmxj8t%BT6Hbp!XD$Pb;vP>@vf?BD^Q5dSqc?ADF(QWYv*@!BZ3E){!pa##(8xz zqV=nbj%0YL%Ix8qOrn=^u(+#(acG<{8y)KRpn+EypGf=_t0(S39<>s?{H@8%Uhm6; zeilvdJGu(n#aw9;?~TB1w6BJLa4fVh+HP7Hd@Dy+L*@0PVuvk6@+^p$?gg{{tTLr( zs`ymhl6vP-3cJbP7|(M;W;c#5||1w5B|Zp*YH6w|RNg z)TvH7xGF`xKGjK+6xI~rs_3)5Ux+6r;7o$w>w`P?f>;U^&YYxSBe8?Ot_~8^q|>so zhS$FdiZaEW5qiJT+Wy$VoGnvq3v!=G{e=@!M;$x6!_YF);l9+;F?^@3$cjLnnxnT4 zm#w)v@sCBTKGaUo{F6T{orO;gn|+jy*i6)NV5d$oAr$ z*M}F0^1M~A$@ z5ydRIjWtkbNk|!b^!MyxRx7J!uKHB8euk7^xfe|sa@77{VdM9pdbAv)L-`|+%tcZ$ zZgpenansZiLbQvz*_DXm6$AXE=1D@pzmcnh4Y zK)BXXe_#aUjhT; zlW4eZMz5!0R%NM;MPgYBU5dhp+D(9D2!7g#Ye136I}*YTawy{x4Oayi5ojCTK97{n z+N#MlWC`XMeNfvt%pbF92ur)jUPb$aCMFeOZQLULdDo&G+QcWXshU0-8fKho{_LwM zrU}DSH0YYTx@Jblk3SY@qf=D#z}Mh6L0KUDGAmw|O3$gWtno-%kx0`cU8uLYi)DUM zxAR2ByOXtK^~FmXqTSY%Mav(b5)tc%1czp;{0|sNy~pkN>PGR9D4TK8?QB{$=#Uki zGN*;?>$5nW?2+0-Yrk@$Crggd)NJ>SINyVgTG|G*2pt1n5v1epJ<=f?rhqGHfjP6P zmoI-BnqJMxKEiidi@D-5XnS2qTmZkE>f}IGzJbY}e3Xx)&aFE^<&NPiUHWEDcbWyp{ zbVd_2++^nMXqaGwIY~bFLG)o3Cv&xU96hvYwy|WLc%`e4J4jEusym)JW4AsHDxU6? z!YGcmUpe#P{xVR+HY`hT_`WRqE(Py^$kmjrA#rfstgq8c;+ViK-NGGi1r3|V=*TsB zrFb3{YOML4C)~i&OU03#jJ^w-=8C++!`$TRSLJfrFH#|>Slk!DdfdVtQ{^gWRi*zp zk0R~HXG#`t{vJfTiiyXOrfEnxw;vm6CvXqy+xsN)wyLViCRD&8@-kGNAuI_alHa^E z0j5PHlA#2e(2&1Jb=7-$_%!`PZ>psmG@i%-D@r&iMJUFVA88MUIo94=%Qnz#be+N72o0SRL4N ztTmXA4tN6t!#a%VDRZM*$Pt4pb7N)B`fv%RVx|{Ccz;<23yT&n)PaRrA;x6u#PnHo zz;v>I5iG>XLjciQV9&vjJb;4%@DW~P9>#PFtJeVtd;TP9T38DJ2qfwOV3Bd>U(=~W zFa*F=v^O{}bz%9AMvlRK%YbVIloCn6=TX{&rwyOiBKzdm>9p!s zrBwoYyrfKf(%7d2Vj7w>)7XsK73FCYo`-_AnEVAozv@{GAQoPF_nJNP9Il~g;uqS0 z!TsVjST^VuY1_F%OT5uzyX>HmrnbNLBW6o?y5eBiFiR(F-ZfXgIHD?-^em}&1vI*3z_J0(UVS_@c39~vyo2&mmu88W165wy)0EX+O}!oLUcPTg zDZsPY#RjP~>#2L0xuwe*n)&W6OT~J9&{p9+>dwdP9!E@XGxh2BLy;5mbhP!@<+ z4Q!Mt^G*A5B(KqJ=I1rS1V?vX1^R`1SgHh}TX;J3&%58C#_G|?NwS|dfzC{sw!VMvol>Vy<~GS`2wmSnvWszPDZKNCuPsx@?m|_fcw9Q zd+)F&)~{W7QV0n(p@yD>Uc}Ig2ubMDr3i=`dQp)g(lH64BTb~KG?k*LR4M9~-a9CY zs1!wPND)LV`y1T**WPoTbH4YF?|Zp&F*9q{y4PCw^CUC#wAr5hdK5bcjg{4YDsr|` zASqF${$uFz{&5RuUv6*5=CzPHnj%CO8G3KA-5BV@^vwXhG+|BvF=jN|pJ; z+h>s~a$17c&adwiNt-MF=am+VmmN*d zQ|=b+q%Dz@^NFJ`vV8B;T-N69B#SxMNyt+W*IZ$ zq|1I0Hr%>=-e?GQ|D{dq!Vle`YV{4B);NNlxF6VKxpze|63x~6^y2f0iN_{_$K;2@ zh}-wOD~$!7F0j<66A{m-;wZ-W2QfVBy?8Pr)DhMa-xqoKJ!hL*acb_1i+$g$P8Nxu zDNwxowZi_sz|-|KZ&iQIC&+vD3Tz~uKl~cw6mRfOH|l+#yh`iID<8csG$uOLLO#h9 z$n{U8DYxo9q>sd%HW_p;?b~rX+aV}u+M{v7yXMT|hnIDo>{%b= zn#Q2YxdRn5I#=$jISTCz=UnLvJ2%`ltdIqJ*8)&jt4=>kw09Lbc{GdMMJ(YfnlUJ- zJZJTAq_I^v)=aHfr$T+gzagLRs3W8F@+AvrAo_GBe5RRrqlRM#XJPmt_5Hgk4u92P ztCI!Feze!UeK_WXQ`&J?oDlhvJZs_x_&8kay1;U)CYt1j)lxqsg~~>1LXzC{vQNq* zEbe5bs2`0SnHpctOKN(?DB_f9>)O{R^|mBpFjjjRkH~|L4G}7u z)c1vEDh&sDcEJM3p}&9r1TiaKz$w#GyOvWt4|&vj+*v&OdL_op^_S16e`ckb=2Y%- z+mpAdEq+Z&y^aF*Uyr7&!0r7aPB)hhHYQkv^a$vtxlMj353%`x6`lEhbFt&}y=Skh z(d`p9xV8>@o1JIW{VVV0)yDUiPI|~3a#t^UTT2Q#NkWT-1XWw=2_7qn3Oj1ldaqNP z6^dh2XH?%)dtp`a#C0MgmWywtDWMZ}>G2;0L8}{-T=%ng?%W`5r<>@=s!#e?ENSlG z4_}6PwyN}$rC*7jdO5)<3+J%O36-BbsXWI2cnhkwtW#m1;qsl6Ro)sVPyRHl=-NJR zS)x9NQzuzf`n4}#R$>`J&qUy6h`$?a-9iuIKatDmx3Qf$l1RwEwbNQwq(MS;jxGG7 zD|7Y!?MK_c%)s#hIc!y7i2BP%_eDk1SuxsP1s0``@)I2?UlZAU`POF3pQN-fquO$M z)2*sohTNpER{W8+ZSnF;@t0p#xstg)CnQjvL=oZg18vWWOEB{Xr$h~PY@**gKhae+(wO1q z$IJ@O+rzX)e1i(D{LX9V^;@Z>UG+mgywf(f;||?z*BQx@EK9tAa1>Y<|K=$A)i5c~ z0*2Qf)@WT&xEydG;h8%KUMa!RCWjtpFP!6Tx$%j|xJqXW*ILi=kUP2<`^2ZjF0=JE z&g%+$?Mbo>FBccrASJex8p7;4PF=j;P`Ca)wHNOmL%K- z?~CGy?iMvH)6GZrwcv!mt><+sK(3<~=n#i{RiV|JNaNv{EZKbc==AaJp`+jr>rRm5 zeW~NeI113uF4^5Zi$G=Zfk{d%xdevrR_gp7GV%MC_SiYW4e+Lu@u3#`MW^%h!GY;9 z7iC6}<;fS0_uM;P-fR$xWUJEu?tU<%ZRTq;G2u@1A7Qgre^^vkMhcoMJIv~i4)=Fh ziu+2e7CIz_-9BX+vK_CedTaE*8bqA zwv1^guyWdZa{a}eqti4(Ax`{FqWQKeZ zZFB=;Ur|P0Pm*$K?)N!LtU@yxH(xS}-KHmcpzFrY#%Vm!oL?$%xCul(G40T9+Pd-b zoi=v?K~2}Cpq8s4R6m9v0T-BbjyUkpZ9<~A z(bBUhsIbrApSS-rKTDc748dNwcf03_Hs3PWWWlc8AnYdtZ>`1F8C|`|J7HrvZ{2?R ztuNnsB;K%XANAI4WqrAIM&IJ9xZcFlh}BM6AE>Z0wCVPtM0&J!PqY&Jx^-IcPRxw1 zXr%Jlh)vMQFjIOo{gDQE9`dsz^jcrh<>{BL8^58(mj*)bfLd;QW;42PM?%ZE2liCn z+DH9m@Aly;DeA3hrp9Q+7wrwukH%<{xW(1bZ+kePIhS6(E*QdZbG^vwhv4z=@IbIV zXsd5`&VpvYPF@8Mz#TCDiml%WLUEw1iu<<&MBWQBQ~cyrF1@^e%0S<0nOgAm^N|#Z zoPUb}#0rZCK|x|#!BnP--kR0@)pOZaMyt5^$Z-4P=ReN(kzxau)K5A9@7vGG1mFVP$kOA$m$?dO4$DgD=ymmS0l*|bS^+&lB#O1L{4RO9i&UH!-PP$dnSTX-xbcpO#~Y# zK!$^^)E?f}<|Y=uWmQMaarjP{aBQ{8Ht;<8-mWORh#G`8z0UXu4b!wpCYBB3s-s2q z@ovl7+}L-~^tAJX1s$%~cWVh;XeVtMoy-RY0~Svg){(qc<1v?NeLLK+E8>To`y^;? z9KkzqSL~vR2Y=q>2k4@}J|#gBvz-d78SzE_(TaIJ&+_HE?ik+UarZx5s&q=h<{k({ zK#P}nI}|A$T-&@f5u4H6%m3o&wO(}lQVuQ&P^0H8z<=;RJbGs>!8_xACz{(Gen(T_ zhv|k1?;Isq>V|B{{47j`MO%*HAGPTx9O7Rgjhu z-|@kGSL!?+*D)ZjPkf%{u9YFafUo=KrKfyu|Jaw6^4Z`}QLjTagGPd37k}}aw!E>l zUvLO$AmGMwg0m%lUBqczJx1Oq_A8)FQ`r9Xqc5N49F<(A!@v0r~ z(RCB;b)KE3gCnn7Mipm;Ee|9;3>R#prN}p))TrU|7oDV)!D`N(U@`d|{J`yaz}31A zEsye5@yfmdTXp9d*H?XLyTy$DdG4Z`@#jy?3SvaFJjH_UYuI%WR^#_ILl|t={F@j- z`-LhqdDx8yGY|K+b!3W?k57^t^EobsAM1I%d^5g#gV;Kl6>5lFJ6rDdQJGjYJG!U= z&XC`}|AMfvb$s%BpVM;C(nM&6ItnlNy=7FMQGsgS8H^0>m^{k0e0=1I>(k)QcL~qi zOx?IbZixtaKKw9s(kuxafD4(ie0kb2_UfoW)7Qqkel+&EAb2mTxlujwtB}(@+2Olh z-iM_d!gCIKYd$@W(i*(EU6+vb@?lv0{)~I)y+3XVuRm^j5b-AvW>Iz4b@LqYR*`ke z?YUdp!MY-xZPL*y+3~?W=Q34fUt0P5oxJ;|%@H+nFLlZL+8?T7uf3eV~mTXG=zKnc=W%{p{NDm#>_a3qj zc~jkrJ#96VQ}J55NlWSIZ-Kb*<@|kSkJcl>RRcDaUBLsZ{;q&Pw@X?|F8@%-UZ{T4 z-5OvzoWyCPFZ~Z78)fMM`w*VNJ(Holiq{bVk-;E9)!X6O5%YG~+ zWO^=>6ExWi1vC@Y(A)W!E9FC%vs;^F5Y`)RO1omez5ErD0;mCsz`Urlm$T=qTS2qmO0TP1#f6LAEOIK|fDXO110vV|GTPH< zRS0yx2cEDG(bLdt`8#@TFlW#==U*80zfXg>zftn8$MgqH&;29&4lsg4m$UMw_d@(v zz?p?y!h6~8xkv|--y>)CKga=%{zVSR*Kcz6{Y954nCkz+4M^yr`*}*$tscLD`q!p6 z7XKm?Bv4C9#6E;LyO-r1ut4>8^7etg|EBq06b~V$=L$KihY!B~=52oQGyb3cD)V{t zG(ax1H~&#UwP58y{2M<8-I<(wMf;Dy!Y;%uPTZ{EE2^}oB_u`mpzb8+ppoB z_?d;nUn)XTNh^ZVSO;E*+KB5b9}Ygth=<{2OA(8Q;qCGrO`V7 z$2ZT0Xuk$4m$@>1U~;ls4keE@#)5Ug$E)Ge$bkOHt zrEE9`gjwnB!$ln87w$zAg`+OvZ@f4?zsSls z<6~G^(nAitn+$7>KJch7#ZhuyDL~^9f9Kj~Mr#FI1zF4a@ngNAftGIyV7KGf`#l0z z0)1fZl^PMyNyiH1?HlnErg{)@|}3G^;Ay} z80#DsLj#{IWfQMR47WX78j=zgg(HXfNDS^^p0o_#UGEa`HaHdT!>22$2W@N@C$o92 zB|s;bRxP)ViXT?}4(U+8?A;nv6?Wg=c_}``$>yx3$8C6|dp;TL3o=Ow@-OsPEY4eN zeRqcaf48amSmG(aW10t7NnE zzb*9tQ-uJ}p+-Yzj~f9~2J775^d}`W08SU%n}Y>T8vFguA8^JPUd4{=o{bKsm(@+I z;fSPlYR7_Y&_5Q%HNYdc6Ws}<%u+UgkJc;iMnp}*SuWd-LN7r`b)!zm1g0_%uEE1G zzT8~?L=DkYzvw_aO?3yM(}s@dcBCzF9Y@k{MrjS#uuO>XY%dHSv+g>;@lmaI^uKO+ z|4qbOcVO?+GP-mieO0X$B}?QXdY1a?lWau5Aej_A zdQVe|dyr-eyczgH0VkaGGt8Bni6`jng!8tiljHTJDX)%5+@N# zOCT2-VU7O;YR4eYv-{)O@vD)xbr*gv5~0fI2qJk?BjQ-FoKl+gw?=egsf@Qtff3a} zgyy(Ux+|2&3@LE%h6KT0(F}`UAIt>X;hA@Lw8^ZJSLA+*zhQ`*-?QZrZ1F?fIAv16 ztEkKnhCNjoHAjfh%6qA~p$l+jAFGyACaCB8?j}DonJ{iC?u=PWr@;`6m8iZyagFP`NiY=VVYgKk;#ar6Hs9xlux_jePaKYSLZ%a8eQZ zeT&ko%xkLId=^zy0V$fc&C6b#c$DE;YuH5T(C*UNR0eo;M-;B!lpdJ10kPaI2HZR8zQ!AS%rqm<>mRx|)dOVo)BMZS! z)J4mP00~kJ*5;1F z|GlYcNlcvnx8wgj`~TvoCe#;y^O8~<&TX(o!kMrb&q2sQGO-oo^n!BI04u(1nk)s#vE8SyyshP_ zkKn0KQBae66XX}5w1sq_zVje=iA-C1O%xLE%RVBZ+GPN1Szb@~i&Yf4x8I=_xPuq9 z8HKitzL>db76n=9VTJLtH{QW78`ko6&LMnhcbR8miUi)3K1bi8+h!p7TQfuQ1dfpt zFWs_>J+Z)=mNo3Hv`sQ1HFti^OelT>E=7+squ~vR9Y!7GZwyE_M2POMs8lVqX%yzkNNMs{0*>~eVw)a6h)#=h*8F1w_53Q5ZRAmr{*{SV`10{9L!+qd6B z^qLmjcS|4DJ@*){>A@Yq@|>H{tmPFbtezlXOIzO+cBFUFA+`H}^=~3cl|KO~Yr`67v#BTb26~c3LLji-N-u{%UfL|43FWn3-nj%>%Gn}JsB)T7mW3cEv^;$fZSOAy!p-wBO zyZbCasqXkHcPV+TQYB>0s)CFCR~e;;LNdH4m0syi_&6Hx*4N#ioGYUp5v;@p%SSuI z^MK?)A7c&PU^4uCVGrLu)0fWL#(e8=IW#pLwckSj!^BnjlJf_)qb#vlV-pAum2{Cz zdmk1oizvH_UEP%H%6d2mLn;sNy2}nDSz;oEPUp8EQWg3TX$TZ?Lily(Vg6IYwSS2}jUhmNeZ{(_vm^yFR&%5C(;+L?AuURhLS0>;SXZrCi@OrmryOWa1@sR`Q>4lOXT3aF|jjzguIn+hD zsJy7|0iq}iz?xSjM`OiF%#+XzqLFAqIM5CdhY3g=l{dL73M-9{gdM-fUFyw~+}-eN zigjd{Se_C`EaQlH{(c&!yX^(_96rO)zC-R@(%2iSNwCuu+Rjy;d>ys zOT^P6C*jA>aI1af{G+~C+Vtm*Ydnu8isyIqYu9|%HUX+0m+fp_Tm$jJkzHau6$pe2 z=)Dy8y{GRonRkBHw!3C+cP#68iE{$>(Gw~pX?k}IwL2^Xy*2d#jS}1)9;k1NEMkuz z`k;Gw^rd$J>-_Gp$lc09e8C3Ai@ zI(~k)i!!pX%rB|^3MB2;7wV10M-xn_Y4)#i$@^Wy+pGgyd7_6Nnd}9j?>pxj>u#*F z)5%m>I#Z)rQ%snoEsZGj_j(v zkl=nI&hb*5%E5Z!S3_4^gIt~CuXHK2UglTE2uN|QzD>3c&FIA;P_w4FdYeaN84^>I#!waH2d1gulZ#6=!XkP z`0JqE_O#HSJ~8FZyFD+#{7wgaa0&VrR-yN+_}ZreEF+L*}D^HBq1JU`+ObV#51# zdPZRoQ5g6^O5&pcfP zbDhtZ=~yTsHE-L!#saVba1z~kb8YVf$n|0c&SaU>M>#s+gMfeEg8yb9_v8sffmucE zyR}!oMdB$dI;kNhNulV)`1WLd_ga)8$$?zw{k$Mji06bFqYE$9u|$f1tCi~YE22ed z5cX00K`hs?42c_4?k)0NpZXwdQ=&zyr6#l%Tx>;);Jx#u!|al?)US+-cWbSEdFO~f zA0jhi02Movc1P}Q(y@Y;F=@&jG(RfQ>fAkkYlI*FAQH<)K^(&{rbxbA=NEA#4#|%# zQXI7sZSz+>1{Gnx;>(=u0L?VH2?EvVVHsBXL4IJQA;g9$JX}UTd7VPyZ^YWsVE~rK zM-C~h@;V{@vLDZ-VowJaWzDzfw~>mwaG(Y%o)XC;iJqC{)oy8GA7w zzW|M!L}^;g0Z1BNyxYr{5`2e8SCzcEAwYF9!?=qEs5Qs6-?IYk_f3!!udn z&hdQjC0TRdw4WOfsXTd_9h31=X_Q}wiLb(UqMk1bvu)9zO1)g3MmVHwZwPG2zGU2TBP&eQTtU41hpHkH$2n86;_yx(NN^VAV@xY~&)u4RLp^0{TK^00FAT{o!Lr)lq({%E1P?C@XeuTWJp_t%+C-$?Nai$N6j#cre1hncM%FBQjw5IYS;|Wd4 zryzrM`tOoCt*JHb=~z!*EsRNPKIWX`z9X_JRF?!Fk7Y&CPKXr17l3JY3W)Gc29mK( zRDCrin;=Y$MSqLWjgv;|*Yu$c$crsCp-70VM;UvVPpJaP4jf(@Y}c^~23YPS{n`zt zp$uKbR;SH6;5c4`L^8m<(anxUbnj{xT08n$DlL;%6RKaomyG(2_CU5_$2)izCghSv zGB%4gV#Bcxw8wKOKmp?fHrj}TT{TFgR*t^~?Y#rex-%gZxw%M3p@eEcMM%zleh5rR zK&No0YPv-kagyh8NJKvC;RgQCN}*65v{04N3vv;y+D#k>pso1}KyrAs9@JRm(flpi zTM`vwftpUGW#?r8hxlDA4tF>l035F~qhClZ~iD(!~b5{{+lg z$o2dMm|T^Vi^`@2s04yHj3?q#+Cav7$J{?(>@VoH-X3?d3 z+9Y?^+=XdAXM4vT$e|Z8_dWKxHbe9%B^_erhp1$G7J}(26Xu1g4^MEgsBC(ahK=(W zK`AJKjJJhzn+J-0J%?8#ua2p;E}zpIeOp-jtuJ&>kO>OH_XNLnev8J`>i*LC+w9|C zTA*3qKeRy6p4M-}r~d}78~sq$bNKh!zy16T`!@z?@Eb$i_n*#xM+0h!g8}|+_*)Bv z-4p$n5dSv(uOa?R>z^V1E&2`r8|$CB{VUynhyTyG{*wU^>+f{?3NIZTT@Lwr;5Tvq zh`kt0=U=hE{Rc~{kxXJCcu%j3spUq~NgeSghKjr%*F*_2(8}|h@{#k&$#$PYkaQT% zYzM>a$)lyl*UZ4IZxw`8>}*nms@Sgk9J>+Jb@Zt+0D}YDNIA8xr|43c^C7s`m3uH@ z5f6zr@3d#YS5#sBIV#7E6OA6I8#^)Ei8z@{7vHn+_~)`=IU5|fFP8W69e#T4`R=G$ z{lRN)mi)+=8#Q*O{^k)wP?+*N7kcKTENR@4#To+WuL+R)cGYmS6lL{*wzWGjq{xMA z_hC6r%FbTfS;at}rm7Sk?gZNCpROB;57?(+;x$8 z&DS?}OLcB~8=MuD9?6=3H%>GjH2S3B{m8;GWZPGo4HiSrR%-j1?aey_>H*yCUzELOtu8`Yy64=1>Mn3m;3{%I+O7_muqFU2#Gux%&rdPu(eqmo8^hx_b35LvsrJTY$-r3h0pFM#5a)<3;BdZ)sbz zKuh_ONFm3__x)AFfIoqLc1&&pg;2`8x&OG)fjmQ_h3DQds%5_=PKY^8R(<@?z zcChEKJ$fu2e@+mE4uJ5U3V3aZRmyoeugM^Act9AqI@a1kd*O26x{n^k01Fl7?51(C zDRY%Rm-~a>uE+-!LE62Jy@5^S0UI3Y zR44Huk?5B2&(-{0!WzE76?ICro(_dTyK`+QMkWlHiT zd*ZjEGRSbt#0u{XuKQ+)NGKQCy%f77PiD+MZm@3=~)H3St?>Lot?3X5E^ut zud`ez`BZIj`VQr1*Hs|sX8F^k%k>^;8ZJG4MR2k^6LZjQ@nBA)sRwJi2VhP6)+~{Oj&KD=fh`a1-N$6`WLL#Bx$@IPH(-qm!cw0PR&S2yD z7Jp}760(sdJFp4C5Rn>Hy=n4D6551JkE+3k*vHf66#0Z83V>9Z*VwM-7A06RC!W;D z7R6@i&+GyDjm=zz^0sSh8Po21sg5^V%tDKF>?iAy$+na5)B*}u4+Ecj>wBup;BI;}JBB7hHi?y_kli0Dpq zBT$X57q5xJSrVQliU9m6D_!>UNM*c1gt*}_`m}%hEA+6g1KHVHsg~pI_^d23p6~iL z54Q@MHw*HIyE*?PkYH-c<-qrlo5nBT5r7R|30d+3znEVcC_Co$Bc~>qrSUD5%Kfsq z6rdacyoO8lu|b>T1+!Vf4`_Zcc^)d_|BP-RXH0PB!;@|gJ&MszR*b)wYXb_6}rx*o~T!Rm=#Svl6>t< zp}#A@Mu0N!lbrFxnblcFY$7d2SFo3bAFb7VzxzHW;ZL9e?93uu99SbLMR8G~_l>O_ zOl__BaRb{FX8%Awwv2@IfJsVcW2V*FNYO%n0_EbHYyeHwMD|^C%BNo_xy2uun_nL4 zgQFzHP^Abw?ffW?>yX#uE-#k!=YM-CsbuE{z4-X|NO$kXV7j@_^66*svDYm;`!wRZ zA8wDMdT?}sW4u`)E1I}Omw2s>Wv=j)&R+>Gl;;m#+U?@cK$ z{SfGGsd`Jl_T)QMjF}|du)PFZM;><_TITku#xN+A)zg+$k zVC&dsmpbUFX5ts8FO~VEc>ul`@;tvf) zQ5X#o?OnXRldD(D$f)JVP(z_0)oP8#?NQBw9hXx>zpS&S+P2U&<;6H+ce?BR&ed{D z-jSQ|r)g`2=bnr=BiUvhIvWHwLa$#BT%%o-rL&@&j*{*B&e4@*ui~sSe#q9ZKX@ST z;QFSEt>x>H4sL-HNOlZXbfMLKmaSN%QR?YJAYAlYjBNcMF4In~PF({F`i@bQHu)f= zVa*x6E2^alPBUk-sq+dSpf_QFD|pshkg;CQXkhBoQ)(89q>8$%iVPPw&;da{3n zUYDyUby{a z$_!$fTbxL9~l5Cu=1!`D^YkzB}@br@q79&ZYMC6j%Q^X^&Z=* z&6`g@ts?K@zj~M9`8)`veq2gcRK!i2Da#wkgSnX9$@1JS8u?^nGr{rB5vbfvDL z>rgB~8oS=8MR@GW*7%}KPB!Z?*w$t8_Fiz~g9XP^gPoUrnLQitxHM{Wz$bte?lS$l zYr7%3X%k|`n3=V+uQ_fDoj;`e#aP3Z z0Z7^PZ5Vl-r=0IAIOq72Nk}#wXVNZ~;^A46uQnmMlI7#98^@vuMYq8>OP{5}b72NO ze2*m@!hXuV2iv%ozV9`FO@v`)%F}l4lMQs^Cvad&l3#zM0Ae|fnyJ7^1 zN<>uk!2#y$Gg)TelJe?g+HLVf^UE*0(<9;-k*NP|C4ZL7XqULSkD&=e9O8)r%2G+2600e3)|Lb zRw*;QH)U~$B>Z3T@Rar$T|<&dTx^s)G5s#q?sgrM%F_&#kis-O>#Mj7*XMkw`|-S{MCwXDn`-3z4xP(UABPehq@39=MH` zyg>mLb5mt=4M){Ej83|iRH3ni#uh0~+NsrfQ;(sb3-nS*F4~7ql~WTdXd{u>Y2;9L z1GEi*SMSf2Bwk0l82O`VLh4v$lBBnT77D9cY2DF>lxI^h>_)zHBF`Dp$Ts6R7ApEn z!|Fr0(ZUKcrsQp}C^z$=w$@KVA{NLZCs*VbeGl3$J(m$y`)!&8+m)^)v3 z`WM5tSQZj5%<75{N2vs9r$)i@pC@MX)1|qjYtx>Jl2jp*(?-ZsAK4GsB8Bh%q_{*N zti{M_z%|~02ZwEQWS&}^DmyM!$zDuT+DU0SmdFEKD2YHoMSXV-&B3Nf6daSyXMX0g z_;^YPbT_5mmlw!_9I2(tj#%EV6X9klbt*Fk;4ZN(iKZl}pY9Vz)DDIUS>~6F_)+6* zcF3iH1>v$BqnmR3vYHz!BsyBO&62PvN`0gB2MQ>9TeC%yb3+>+x0-{7Zpmdd5HOv2Bm zBuAtSM^xWN#rapi^(b=Byd(=O1c!Ac#1>Ey|vXWh*%N6N+}; zqWAz9?TpuPtJe;{g)^83q_KQuHmiY{EE!tw91^(!U>+5iv7Jng_ko|RQnxf$HIs5D z(D&`wO4aPcQJwryoD=c$&kJY_I+>{N0Dgsu0Q)Iy(DN&ppg_k)-Xt6#1Z(~Q$%FHM zhEwBV!vh}Oo_0FYWq=)0TI5A5ZP7WNc`&O(gi_u=cE^pCwcvX}={-vnxQuo?FD6hZ z!>B(UM@OmxX>~%hd6O$Rkmb39MAk zKhC+cX&0F{nXvINP}}G+Qt+$S)tXHv8;sPxauk#7HCo znF==(A4}Gb!aGu!k3YGlVdza5Y{4*?t%@1i$=H=S5ra+OQtViizZ8KRmTzcpj}iA_ z2w-A&6*%|-Rn}G-j;wvf_-K&SaRv&YaUiwng^I_ZE$H^{4K~&e!kuqPjD2t%E^xkJ z2P<;qS5>kc;!of+R!$rrgY)As;vsjUr=GF=I)m8PE{TTJj{uHW2-x}?-k;xwFs4xTDuz<#24LhA^pm&r1pLQLnXW#gnpi2d(jQx zd^8{}!SO4?-3k+IaNdKtr;{(#)i(sfyMj81eTxy9!zw7Q<9($+oqE(>*;?MxOKCl~ zU5Shm`H0@P$#Us(LgZoc$%!n8UESa-?Bsd0)FO-ZPd1th>=WRDTP0l4H1-lABPMnJPQ6LyUZ^&DvT#k*4)!rutuy6dDq#Ga zdHxB<9TERLsfdNu%yVPQ>@$!zaLPLOzHK!=By|59PD?n;>+SO+P$4EIILKTE)~xl5 zza$LV?V*BAH<837_gv3T1vmdZ-rFe$&)NNb8k78f?{pX@KKXpv@11E=yWbk%CIi$g zR{`%_rtQRx_7F{NRg(S%HfQ8I1$Jfa*ZjekfpDGlHs{ zWxiIoLe)(&qnZTde0ZR!YvVNFmICji1Uf*2O)_Cfo-;5t>5mN*XUh&@o@>tRP-m+f zC=-X{2zLl_nW?N+u8tEnb)*9%=p++B3LHoHYzFXjxgf{$p&#LLRu#E;ExiXwEMCZ# zIdV0D&X+w-VM^oFIgya~q4vuoRc_1slu+av+cKi-uq_jAu^$Tcm}P!ippr>vDNKNl zkKmQA0o_|~lqm;Jw&!2;r%)dX(qU+Go)M(wvrm-pwOSkwhqa|S>peg3%L7IU@fkZR>mYJ&yR1%HT zodTgj>^zu&9~iKj%(SeEKh+}TOBw2MO%F%ssS-K>QIMpB2Z5y~o{Phhz=BadKBO)~ zqFz9Sp38&RUOt4rm>0p(4(Byh$4mOU3!^zDOTp||ZXf})LC>H3~9(G8@?ZUTC+?i%>wFdy&`Azrl1TUm_I<0KoYJ#q#lB- z@!{acS5SFRT*{PWB5kkq+@Na~*%s_Ko+owl7(GDp$dbnAL^&bUK=5S~2}l49^7`O6 zuj+o*lu19U#9TbV*EkhTBTI!+1cjcOFb_Y3gG^yS0yf4V|DyFINGr<+KK%7urUTe_ zDyfGHWwZADR??bZDj8WY->4bKIc!f>MsZ;8@NsOPpJ zmYXX3er5pxs86>_x+S6+{vIoqj76aP8<03kQ}KREK`#Fc@+@Y+(1o;bf9qor%2hF8 zevMh3?U@!!6l_0|BL}TY>L!ezW@}k|-kmFXY8aC2fa*UCDI^+E8Scyo_ZV)pU%BMF zUk{jY&ccXu$SM?P{E0zP#DA=^nw{*WgN7RF+)7m@GB%{D*KFVL zI_>=gBmpIM)k0Z1kpl|RmZMd*M_NzbJj!G?VBjRMG2%ALwv!_bNg6xTYOe342ias= zW6KbYNA4{W^&YZ99%Q3*v0t?l$v9Pxlf}rPcrF5tGA!CzYC@$Qa~CWN66~eTajwZ3 zpAQ%wvpyZ4ylSg$B-8FGh4Ymx@}$$!J7}re;0TIEZm8ThT3@PZVc}y#)-!x9#)twY z)p|hz1v_wJp;wTiq@hNTe4qCkIRy{yRXyYvkkPICp@i zKQDyLQavg-_x3RIn)L#X6p22pdf6jiikX!X%#z@RyI{hV=IilLi|=5i9P|tEAm3RWV(6PnYDmvktwG;x5q>dg&>0WXFnqg+n0#C*xtgm}$k7d-x zv(!Ots9hOo)+Zd0?6KMsTl@fS1Go{bOzSInV$7NIT3d^+ z>vQre6R1`}fGQp5{xnEA_g zyi{@>kevz;htL+w0_VI8~d;(H4>BKh8?}^=0l6i`I z>dMX~0K-vWe`ij?C52#U0=y!Yb0-shZIT03s0;ScV&F(_tEiIpm*wlHlJFhoHMx4Z z9o;Wl4o^ViJl~AeY1JhUcEiGF(8M04{LdJ1(L0x*6O{)m`@6uY_OBuHw?4o(o*#OK zMqt^p$js^z?ULR-MJjmTG@Zhm!M1G8Job33n)>?velTCMf!wUoS^~!@Pi+JBI?(RpGmOClz zdZj-|w3n+T$*O9PRTkr9;$)jUxZ613CW3lMGxag{t!Vi}S56SH&G+rNY- zQQv>3M6%7ZTW%;OQO~A|7$=)Pwa!Xjiz7gv&l~W{>{jSm5O)oDe(_htSOo1F@Ctmd z&@-}XwlqL5oSj6XQDj2g(QS_@#N81VMKE5Weq+s5I{0>dpM7=6Xn znY{G%l9Z25h3m>)AVg5ZF_lH}{p{=L`FBZ+5nxeC&b`~ApL<)OXL*C?g z#<3J13DZTtF)&TeKd^E5_CANPWW|WUlH`Ou`cC{s{epFUu%z6U9Mu+&6K_?-*mP!g z>j{BjU&!m&DOR)T=3fI@!MMI*U5tDPmN+6#*2UGg`#u;m@0)O&Zo_>W*mX92ONo?U zbvwyH5v+^&{P8#$t1Ylx+`s&#{3gbCk@^a(9)nXA5-FE-v1ew_B-qDIu*bsIq5D2t zMwBSb|F9r}RVP{ui~!_CUFoZ3M6yVX{W|9l;mSqNh`o|I3dX>7BDpVRTg-rG=>izB z!_qOeMbB^kJBd=`cmmkA=1U9l;5%^f*A)`-mL(LM8`8|Jx`x0bMIuI6deGF{5c5>K z`JdYRk}j@bhfN!~Nv}Hrk`&p~pndGZjl1u3(~q@F@pXBEW67?ws{vfT5(swQn$dh@ zVgGzWzg2F6j2G-rKP*A9Y5> zX5SRKpbC9>3hZ>fs<1HZ!XEVc?wd97A4+#gP9kj`R^bT0lItE)$XWOnqRUpwJZJzz z2zqaD?CzmunV3=;Lg9WoN2!io8b9nL$9?){oArI(!wx@MZRPxErujj3I!~REt1AGz zNFYv(v;oe~6X^EqcmS&-li$M!SYXx0HquL@>5bfb;oKeSxFS>hR=wj z8pexmPgy_yipN;*`$KlZ9d?NTF2IdylYfq}SWrz4%0o_o9lVDvr2YhYNsO~D5nM>* zbIcqdSoawal0V&4ZAllIMLAi#wg7gkjM0zg*(h;Qh-a$Z0 z0Hua5Rk{>Wk)opFANbXAK84zyyXD%p*5j(6P60lMJFW}$z zf2RQe_%c30$ zkpr+GLjOhwWPxr^{NH&103xnJ3<=e<9SxyT*So8Kw{289=!eB0v;U5{alyYO>FzTO zhHj@8KA;Xidn!Hz5VR3z)`UccI1@aCT_8eh6orYS+Lj^{qPsgEKL&E53#?v8op;5-qZXpAHP;9^Lr3U3(xX#?V7D|4kOgCjsJ10WW85L^z#5uh35#E{N!Y8vs;Vc0PIK>d0aq00SgWYW3RMF44rkfaAN`$#eFKz zM1qI}sEvkn)2R3sh@~F{7{CPsa0!M8vVM5>jSH6}0LT-t$OGWv1Wft^a2z>MNj3;G)%Mv0!3>f3XA<05MSvb2 z6+&K^B?5r)&A@#w+i4b79F~5}Lnh)6GsZA^?$Hd1C}ZjEPB;P|I+F+}CSsAp0*3>^ zX@dZ4Trf5W6S9yc90b1c1MUqFh6@kH1BZeDvbgLqw-DzqdW0_9*BQLqy!^dOiF&W{|3l#Ke_t@967;C_-T-Gr${F9H-Mo; z#>SzGLIx^~q|~rfcv`NRm?5i`7L}e?Lg&P^pX)pGsk*j-#LeSwe1-zM?5;@u?Ggqw zDtfA-cfI(aO_=Y_yo=Aew5{P3b63Tt$xJQ}r#JR%1FK!`*Y8bSy5A`|9mdh(#?jIx zsC1X+SCoi}a*}{kI~!-j*`I_lv#EN|AghU#ov3tqRRvUU!=5}+4r`5X($0NMo+;|I zfzd^hK?J|;fsf-#tk)DHk>2kFA_fyMAdUf>=*AU1=_Gh1H-60 zD#0HMaxeJ*%=^Z?%dl{8FtIlQf1CFWAZHc81iSov>X|wN4l5d9fj41-U2gryyl*hw ziJuhJMwDgZj}iW-Td8K8}5Rkx?JsE?cYf&Pz~VTtw@PQ8r6sZ&h1_aTR!U1P`pStU$mN$ z*Q@N0C%7mu40t`+{(MY4-9uHJgOMVcP#L!*TxWo5^M8(bPJ#KUdi*y(Pi|BNhU`B( z-0=VN@9#vIEH%Rj|4RShpI@KhtXt=tb6CB2QSP6WZT>opHP2i9jJr^e*m2RK z1`mq?9)%~{mm(axyRsFU>X2lUH&L6UIle?`ylVRO%1|+N!S~Y>j%-v$z0=I)Ygfkl*dQ=0Fba;-aXvY#&G91Aled0@gYQkMIX)3#KKkqyqoIO zmLyb4<-lT^xeCmS59UyXx(DR-my6{!w6>R+nd#ORl{Hm0HQD2+IDptXI)q;Mqstvi zEKXTj&}NjC-TI?nYsS2#clLRzt6#o4ALqYP!ZbD2zWOQR-%c?QQ>>R_9N7k+$_ecx z!5uPq-Y@w=M7YD4buHF2-YcR(<--f&umev;)s4Uz`>r3(Br5%}ex(~vh&T~rk34k8 zOk;inY`kzq%#Z8%#Df7z&y%bUi3Mf167h9-Y6m-XL{PyjNQS<5Wjy^>SB4o_v(+kgl^Ih?X!X{jH&MjDbDYE4WwpF)Kb!J-F=3ry zg_6++A`(@drCRHZsmoq6hZJ71D-vaOx(~=|6no*@JUAWLzC(k!_((FnvP~D-S4jFNnWi%D{>`_&I4dxaTDs>ufoL#M3M{xkDU~L`zm;pGB4q47p z^80=<6DMRjE6hTzcON=DoGLVRQ#j^+OsIs8MD|5n!jlJef&TRGnYeE-Sz|A$054YN!=oaaUx;wMd4LWOVp zz2!3+g1`h6XI zM&ZfweE)m9O#}d4G{HS@xGsR$)ujQqM#9^`;A@8UuNDAnbPp=DIvf%%d59C*5m!zd zVI4HYE_WbGuDGbuACPg|)UPtC-lbF~7SU$ie8)lY@wxVSd~TM9 zsIGCpg`20Ec$Q*yVS7paOVv>;aS=m{Hfk>5=DO>r!-JVmyxV=@IL7*_E5Mk6-MA`P zMEBd-)H)GiYIe6}!_LSIa--a8UUm5hg=e9rGjonbDtal1Uf~UME-WyPTe^Ngjm_KE z2LC#XS6`S|lzg;#X=He)G@wWbIc~~qi=sboX^{Xn07O`xit;V)!Qn3iHBOVTR|Xq~ zsXE4z63kYsd+_mk#q!X4E#7fb6WQQ8{|y+&b8$-`;+f(DxQGptWLbt3XW%=egHl`u zGWOv?iY_O9KX5+b*ex?qJ9Wh8&eu#|TyE&lH2L=mjcCzJKRA8%_k-H;`J>r?M*QpL z|Mo1kZgbnzT>U>X{BJq_A^QJoN(H5GO-WXw6gL!vjZ!&vU0UJ@JhtN z^Ot4t*LT5Rr@fWm|L6@lxc>2}?>|l7pArpn-YP?1{02<_y5aa=r!NcwA8K&%h{h61 zLk9j?CN*!3>a&vAuWL^-?P1QmMO0Ds@%U$7cROj#Eaw>0>L~RMSI1 z$(*Ly*rtl7wePx_Bwu!K8|**xBz6oeDG+FJ5SS5$i+j?bUutvyCDVq2| z5kFG${zFBSRpG41Z-D8oRsom(dpU)8gTAyjjvt5cD+MyKK;zHU>iPX+Eecjl-4^iL z{Lzl85*|bTdG^HzsM@5>#o6VTnX0XHE1M&op2C-X2f&t3u=!vecN2f!N7Yr;l4~Nt zBI6=JJARc)!}*@pz9yS)#Csl>a0VliWYSvP#hwPVg&l`j@Yg|y-MYC7@zHDH&rlKo zv2~(0DY?m0pDnk>sEVRp-&kwwXOB5Ve3PvT&{mSABzs3#m10TO4pMiPY~7*vpdxuB z8u50Y@yvo%Vv#m729BY_t~|rIZ3+sCjO-^p6~1%lzG$i#0oTuN+f=#yUw#AFre1XA zUO9d|BuGmsP`ZtdL%LPUPU&%KvUOa3C0Zv=ZNY%M7L;HC-cG|v!|mjaxyI!PHM7C%B%bIQ`YA2{sgdkRb@#?Q$x8drHmEP ztNyG0iSUKdMYnSIL^qh&-1JG9I<=F;8`@wIu~NRhuudxGF6uT!o6SOD4Sz4dk@M?N zsiV_iuIph5_TV=CtH?y{c`0s7``7C;zpT4-s;&EP&;AC))twHf6n~bV2~+7gC0i%d z($S42GnPirE^-vvf5tuUN>xzv;K}im1$+#AZ~4=iL(WeTTDKjdw8yr>>p+wiwXDEu zl0iwd+40kL&d$*~gt!_Cb}Gw*pySejvjF?=5!h7Lq1fHCd`z-|Xn_HFgvc%A$NMg~vOr}Yt9gv{kfF0NP2Bs^! zX6M{qZJnmlnOxlqy9Tw~g)sCFMI2`Xd33H-rOgiw+f1vg-vIoP#dsBM>qh&WVqVRq z(xqn}1+iwB_+JHcI_0r_?=)A(a5I}yma25hc{MBjct7U&RG*V{7eOynoomcPz_Gg3 zbDQCB7P@Y+avC_Tta)v4K+K7an76r#Rg-@9QAVo1l9!<`D0=yv`ms9&EBd3dOYoeI znC2bn_Ao`F=xgNFHZYv7wc}e3B!G;M6_kQ%do^!E%}T7}DtVZHm>>`pgpFW^D(3{RS8+pBKh7$?xlQ$n!uMNSr8K0v5c=KqeUC5Dl7nVzo0X- ziMnuZV30S6ey;v7`ZECDvbGbAE_GdgyJdMK&REvX;5LCMsnfG-`yrad>LdKB2VW6+ z-oYrEz-747dJ0m`RST&dVXy0l)mTRQklnu?UxqxEa-xl&X&rda;o_;h$H1$5PTl^Y zKL@6D{)9aAx=m&&7MgFoe~Lrpmy0a8%|?edguWx^Akp6&-x7MR-=QYmqdOYGCKCbbDXS3uMzAk{%O*7_~KCIA~4QCF!w}?T!GBV#MgNs~Obq0_f1y#X! zu2#U+gZZw$I}ZBXWfcR!yc%TtDFI9)&e?NJWW@ny**+u8Uil6~;Fu*Bkat_X%v%Rj z3{kyDpwrjc_wrlCrIp zH8R-U8+wco)+YYw9(1Rgb03NEggV!|qU1`pvEz!WeD8KvrDHo1=Lk^l-w`USFui?BT`2E-Qjdw8$vb~qS^Qse&R;!*|S9Tzd(lG*=W=5 z9*M_n#;PT1`$TV}8q^*#ihfNPSkL!4B~Z-LU1!)A;c&xpi`kOF&gTdci;k6@=W}Uj zrn>(U_LTaomeH*Qr*-THolCpll&~PkU#qu+G#_~TN6}wY1^VyxIQq3(^j)>bLEY}~ zSrR_eQu7g8&dGKk*%_AANatPKZgVH93zBbp{$+*LF+A7i;)iHhdo=9sN$NCG)c2H7 zA&+8la~&Y69aY(LFLKu_!jFEdXJ`x9!7JA6Aa*joT||@3;AR-@4RLnXB-O^HRH)0e z|FlT0#Oml|8yVR1z>L9WEAouGZ*qo}6c?6kJ2Ssy%Qv~B&V{)}A_wUW=EaS!qAT65 z=UkVg`1Lc(yuKmCQ6*Xt{?(i6tf6FKOo_aj{U^%q!z&;64rTSrB>eL{LlQ?{a$SC`b48U- z;unz_+07~b>L_34Zj0GPC&Lt*VTo4sxTLLd8n*}*s+lTxrc^G~BjcPj6xnzXS$@<~ zrW|HYv-<8RR$=}&k?$1?c6q2E3W1pA)Y=@VKQ_p{qqTo<6|By!tsI#-?`wEB44Etk zbRrq#iA^Ssb)tS=DWdBRgrM3O9_cO*C3%+qEUlGI;NE}to$q+W@1v!v8u4yriZ&C~ z6)3#C&IVUs9w~gy11CRH2roQ*I3q={--IWtXV@4l<<7nC^NTc*mOGK%_3{|VvV3i^ zz-m;0JinqL_c6Ek{TaPmXO8oUR{=`VL3T;4y?zcOI)Pjj6Q^TodXrSo_j9`dJ6gSX z(t2>*sAC@u3jrJ6sO#6jR%=WpqF_X#i(Se}5Pkvy?ZTk%t_OIDUGXVPt6G$&mtXM2 z;w2;imn@^I1cXIMQAg^jru#p(oFCa?`6NaN2ZV{vRAo^L60;!j@9omRAYD@9{vK9l z%s2(gX8}s#aOh=ZVZA6L5~MATZV=)R7<07p@gz?Nw&FETbr19k`)c5PXn1wz6Fyl6 zXh)7hf-80kaj^<19JpI>SkDQhM(yYxOqbR*I(!P{{I1`0@V=Lu0Xn^I?G5SUyGGL@ zY@3YA^l(?+uzT5W2!|3jR zYcONdI6Y~EVd{g}g(M9ty_+=pvASR0X$TM;WfY`!k5w>?IBJGdekvxeoUH65)keJS z1Q(Z&F55gVo}L}ovMBY|et^qG*b-3-kYy~=4)jaBo&LpDyBR02jE=|z-8oi!#Ek-S`P%-k-k#ydq9Zv>{3gC=W$fA!~=mHiJh+xH+2!5Zc;D z;o%+-6YC*TM&_=ZVumcgz=O#M@($ka?x?+mT)#J;h$}W)ZI#NBh&sjGD(7!m@fTL| z2Gpq~vd@r&X@_#bfbRvshOEuiq(L#0}Tj5Xle*H}ScBZ>Na-I6ho5tVq0af5t7+ zGmNZe`%jb&J1|) z8>k*Q%p0Z@`RrgmhBaAdPr#ChJs?9PwKEvNBg4Xt6;M>XvCjGJ)wBFoaaf|Rh*JBs z%0yuMs0MBAE9*3qUdTQ&g)+nY!er99P~7SEG*uFnT`LP4uK~olD2P1&HsDCH!x|p0 zCm+7EP~^}nY{TYiYO)%jbX`cRXyZWT#N~8-Kl^AdLnQib?x!|l{du2Jz%OiXGS^v= z=hwEyakxv!0g6P?f?F-Y!VLlsegjPpvGYHYwIA&86_6M0K&8>cEmWr7|D*{i!G)YmeB^RCY1R_XgV}*4)S4 zlm>_9f`bLhl-bzRV%)2YEixpbP9qA$l5)R)DeXDCkIs-r&MU(x zr(?FF83_)}U$Ijscet`MmHeEBBcoc>N=0W)N%l(_@Gcl)*7D31T$%2@L5VMDTF1Kd zih+f(U)%-jM`_IN>_(PEpOog{To6vof3r2?CUCx}?%jM1^_{AjUXBwZ5`BKnQZbP9 z{$9?}f_I~~Jo3ySXh?@aGbcjw!K^pP6}Y5&?_=fCx-59OPqaEm$@p~%^e6_dgXCU0 ziLVS+nj*930pOl_YHMm#sLLvy;oq`ONKk6#O7(E|emW$mcWCrYTxF1? zey=(u924}Jn1}HA;O-JXr*-tQowa!hYrd6NX}`+lEb%vu%0ZRysh0QIG#%gr&uu^QNEa% z|9;zyV&3_hfQK0Dot@`V;yAsPSF{@I{+-iiV=hBl)!z-_qHozb>+CWf5Uls1S9d+Y zSM6eaLAqMcAf`G%|2N=~{*U@D4L38sxtCcObU=ECS+CxBp=40ip5Dh^J)=iv<)-74 z<;hbyT7p?WE9*AQy$TGl=GL_&bAR;eS^l|vlp7>zCw;_QT~OuL6)qbJL?0ffY zL2$!T|4UU_OS#@y@gQ&Do^-YKj)Yt`=WI;AhU>c5#Fwg<-}R=-x_?wv1^A8y_>|X> z=BR!Ss(ODT8g}h7w>-zarxP4J|D|eAn}tZTN^2~4wHuR-T~FViY^N$V0?S@W2I%7h zV*VJjw7$gsUQcFE@-K}uF9Iw0yVDOpmSGIK{#aG>vR)6iccH;lP*u^gfKj>L0+TbO z_D1~x{Tt@YFK3P=7==%I^~TCNZnVzM09#tuwDgs(#y5yj zugK6aU-!y!=dTX%nf;@4P!C4U?f`vI$+{L#?vL)h9E_!kGjrUR8&yyGjw~N#nN?&V zoEi_)@nwHh>Xtu zf2_zr$W;lCh166BFJVgari{l5v15q-w1T{e@)^97Wx^H6PNb~IJpS&*=C6epC2xSp z%&-AF1m``QFe8eFJ`2~9qAo#QaqMTmqJLR&6nA`-u0vs6e0~+)MX^XdppEB z_AaZ%R1BfoBk~~ZeEX@@4ui&=xmga-64y6uf+WN-uPa@QSM zC!GOI17XlkBASq>?IKFrqo_SALP4eA*C!SdtI?O7ps@Z3c7Q&5O;RsiNm5t&lKu7& zv6u0c~tM$QwNeZnM;-vFqww%qp~Q4&WkCNy~~K5d)m2>b1k=5G4=xO*XAvyh~H&7}+l&>Fs76g&{`4tE&) zJa0*rLTtFm<>h+LC9KexlxqX(d_8O|Ip$IYS9;!~K7ogBY?Gh9U*XYxqIO=We2i1) zwm?gw7`nijq~S>!*}8BLOyId;^v0Y+NjIe-**M;MLW7ZMJH+4~gIg^aK@iFqoBQ-a zki>$3>Q>Y6Z5iFB%gn195_v;*j!>V75jO~N<%lhH^cnxDo83bd+HR|a=8bLTD+=|@ zhXOM%$%KbV^fsv9e4>`xsD@QaHZoQ{T!YBwHOcjbyQVQbFvvvit}yMgtPPwi3it!o zAhosgB>X!09qAvtpTyEg!fH5R@?kG+ntV;K4f1S;7A&dHOT#jqwASI6Ko3c!qzM@z zUSlpKZ+mSotjjnsU9GXmQXTt9y$w;*rb@#_=lt89h;jLt2m3~}05X!+5&_nj%Q@aa z+q8oVo&;ca-^QOy6Q_7n7tn# zm`6TOvG46Z{kWnxkS`-qb$;wiLJi&cgm~sG(BHjPJ8!{tS8s*=%y8MSp{M#;|Fe)r z&TiU8_!F`tYaBQ@z3vH*?TnQo$nJI4ZkVMk! zP%vXwHe!+&IZWeNdOPxRV^(-QQ8)L?ekR(`_WgnmuZoD|HW!b<7^Bj&D_Y z*uDpfl8}{BK3-m91k$$85cKP4^QH@7iM7G7p>ym*_+s`$%UH+Fg!Q?;ol4(A<-&wL zdx|dhm>S&|Ehcus=1IcOPBfA?+H;1Pt-7hU&Y#*zsL#kM9`doirg6*r70kHUHmV_i z>&xYDfELlraD{2qpr7+jxYREJR^%G7fQz%w)I{LegCn|ZVVi71gi+{&N2nU5t_L3; z#pjQ}j}~c`RYRR0OuU{wV39j)1x9NiCyK7s1gs!D6>^6Y@?0GQj*S_ylYw!u_l(BWlw3#z(-&rnp)*Zzyx18s}dlbv%+`?<0#I!>{{xI|* ztG4DRm|41~!68&$hfzR%a|(_{4w*fV+#O|SL+9Q~jW3mqh`EyIWSX&7v{VaaF!_b) z3-d?vL1FF8m(21&`0%GgETZJlmxc*`Sw8FIBl2pI%dvONBn?!lJ~tC-A6Id)g(nYg z^EI`<{7T1P{z{fW#sbm}G#bV=)e@yHfraHZz4(AR1YheLy#b(Dlzgd55N6~Ct4c%a zIvOFxqOeHPV9;%=FR)U1<6?_c*==WlfTblxbi7>i_NaqYe{4}5VV!sRFUD#8$ShDB zlbN^^`d49FeOh(bd9+T77i+!koh+k|NlBGdPv;mGv$5P*UT)s5ZEWx0Bk?zTr9#*X zBBfzNl^BICgn0`Z3^1i0*>S6FyXjla&jwDKzG|pKtw2>$Nv8z5n|`T+3t{Gjt{lj+ zp1_g8OmRFiC63*pyqzPtcR8gr5bH&8H39VcHZE4{9rxD7dt=0#apQ9Jf}IeUD3L?^ z)yTst<)$<9D9kH=gR*C7Xg{pn zrcuK-jIJUj2D7xvn8Z{Q5N{hyhiLQFxQtfV)jCf81`zWPMYRGmee*@ijDFr)9eZSc zZ{ZtC9Da_uHq)&P>aWq(f2Sva4FgWE#kK>B+#osoM5G6w%TVqE1lj9N?!T?w(Vp)}F2os_z( zoINb~F0+i+Px4v|}pr=V=L}cwL+_Rumv|v2SY^o+~^&mPpj>`8BaJ zLod0mevP&jID%)zQRjOIRv({Xt>8A3Eo=QKiFakzKVb_64(?FQCMir(Sook=tZNFM z@ya~|gy9B;c^xba1;6(YHh%xdnDX7R^Xmy0NNvrQ-DJPu&liNxtQfQ7T) zq_CWKiCVyG)3qlU>!%%@yw&{nBwEoWjbn)x6GFgOjm~6x!_nqG5|}Sz_k#)>ZP1Z8 zq*F6)%=vv3{MyVQ&5FUY)F+s3{i!Z?=wUAZEH!Lw^PPTkAp?PaX%nw=%&x~oRn|i0 z;25B0*Z4)AB9tog|F9(4*m6(%PplOOg#1gPTiCzz64 zv{O?^>5whjmZzozjQU)yWuW!8p_oy8m@&a=nL6Z@)rD>Boj^rzwfW%&87-_SaMZI7 z>Ulp=%s9D7d%ZZyAnHwgI^>v_x=df^rI$!z6-rdM?9?J9Nt#aBDeI9}&zG>+BpwBx z&vCl(RM~{@Q%jWnyEk~gG|=WI_$4E3dYB3t57y=n)A+hjBKxY7ytA=)qBRmoma$sG9q}B)@uV2s*&qYab!Y)8 z(>t{~??@@l`4Pc<`yExFE)B$7t!a{L6Z`lpmCNCv@l4%F*cN}lmRN5&^& zY*90<^eSQBk_Hc3UFzPJ9bAR%G6X(r2WIr$zU{O3z@ZKkLI%J6Oa7A9MIdw9Z@|G+ z;@d|Z_&n|L%B8IE#9}5Tz(AkYAfPbc)V;^^me|qhlU)aAhqk~*K@y^BkMm?;9n~|F zpU*xh^Ry=zEt8V%4`z9*qF47J)A}_9bs^w`0fVONCakm?w_74{f(Zt&MCbf% zljs8u&sU{7N*QDCU?G%*p*5d{`h-YZy4=GXlD2W}CFuNy2ln}L;P1@_if4-+Z{-Jj zQiRe~cJy(|Ca|vU7)KV4jC}@Rfp+U^4Sx# zPCQQ9j0_@O_N*6;!ttBT_Fp=K%qCc@2770(k+!MXtQ>!P3TPt_$=0BE8E#4Pq|t^o zSM3<@1}RNnO?a81phruVD4!%-%S)7xXM5px10{ZThKqQKrSZB^`@YEW^L}8WhDC)X z%46xU;24Fcidpl@8LVU8%)MhaQ9DaR*Ya2)3AZXU!1-HFvLy0{H^%5*Nc4G4688fy z!C~rvrzUfv^iy4{8`L6Lh5|2Zbv&rM+(b}Ibpw+lO?y?0lbuUa12woDxuU+&Jv?1P z(Y_Zb?i8$?qv34_v3kWrBLV;D#c9_wCK}b}7!al$m6DUf;rcI4{+!7^7 z=h>zH(9E6468j6yX+0Z+w|!v8c=oC6-Qx*^(6t)3B@59AF#)^B&P()3bm8MVJ7%)O z9nSQgM)_wl+8aaf-~)zKeJ3})d#vT7S13}Ox+r%D>UJgrY@{p64+8xSz{HW5E&kr# zea#sR6nW*Ml%uqlvt{%>A{>~EDXvEmZgBg-=g0ZITe;nUCch<1GX)kUBG{+cw{!HQ z?;$84FctPGy9`pZ(acZYw#2MiHR7ErvD==9Ebpe>HJ2d*94I+3KmUM<|vhMxy zq1j2SLYEZ{bbV=&oz+@y%{kWCgkFjaGEzdA^x{}xAaL9K!ueZNM?WaryIw3iQJ^c+ zrDkN~3@gumLfYWk)|l0K)n07MMpnJeYZMkjUW;v<@N=*o%Vqf?WXIkAIdFMW3o=YR zSc36mpmrxsAX5nC5{@a+1!{~3U)$TxvXmxp4lf1f5_1d%MR$U1BxDxNZ z#oNyMG-3rJi9+KK^hUapc^9L9G)T$fy+MsjxBXOK2}G_2dt$nR14YQFJxbqbOmx;v z@U)!>ZQXci8}pr~#Bc7u0yL(3`x{`K9Jt1~<_ryOjO&2xGr5q2JM{XVXSWS2whLkG z`iT`}XVFtCbSkBKD*yN|q==53()XJX!6U(76wb z!<4#;Y#4MW-~KNB3lOGWoIt!nElQF+nY1D6$Fun@$hjysPmzijz(fre9tEa z-c(tYkVq5F~`Og>&I(=l%xV(Y{r2PN>a`j!oi_35oe}^|SSA&d4}6 z<6*@av4aqKIwbD?Iq5|)?I|OR2=LAVd1*z%X9Um;;0$M`6&UHv_^D4*coZzwZV=7? zeW%AFMfVv3X7}*k0846NIdeU+fw$#ssuQV`yG!*k?av^7`gdKwsI-fGP-^84*pW{=X2TcE=9{@hCjZuR$m>zrW~WIl)M4yMkM}C`=a%Zi_#Crb z@JodQ=75J}ACsLOILWNqqxc^ySQ|ekkk(1sqXKZho~KG2l*fg-Mb9}ps|@3rcMOE~ z3lFyc0tnsS-TR~<6cIs%6Cj##C#)Ko7TrA})lUiYz?N{-($&F<(Xcjnk~SU{Wg|+k z37Y5C5RT!t7AVBZsFo80%vV)iZg8-|yao*X6P)1dir!`@nsBU|<3LsShte!PKv2c= zLl?O5Vv9g85#sHE`J(+3Z#Kq(xR$(XvW{~}#Y%!gzA?HTm2o{IMLf!3BM%5s+wfWy zjH6(<3qp%mQjGcMKZAv^4WBm*=A5Qebjj5PSKGa@l6%YX>%oSY{}gv-wjyO_QDjVG z?#rxFTII~vu;M8`k%b&Jm$@XtY>hQjbDP=*WAQ>OngEmMC$Q6^*NgcUkQ z^TS!d#O56iSKf$9MOe4Cj!+d&(U9q!hMXr5H?Ndq>oVO;zvv;t?igOf1EhU+H|?3t zwy{NE4sty1RU|R$jct0QVRS(gK?fLL|B6GX&6%sLk2SedRFa5DC;VEoQwetY^omQ> z315a;jcud4x%)Q9Q=KP?sW9_agSpy8O6%Tuq3riLF-Z>&WUNi3>{WNLg%N9bE*e++ zG{Gtcoic2BcaU7>iJ!yX@3+jjDMg{mn2G~iF@fiLy<2;`VrHB+M+E4otqojtZC+D- z#wT=#hYLV_a{1V>zLL|3m1xix9TTcJ0$mcy`+;Sl9e9ml=~cprQ;%|wS5=)&Y#w;e zllV><#RTl(!laG2QbF7G9+S&dteiDaQE?R1uFuqdTJx2%@+?2Uoo)}LshJ)?<#-@y zx=pwln`_duU7~90mBn_b)JW_Lp(rnk~kbw8Dx;>lLbKqzpE29m`(`2=^Nq ztP_U=aXrk&W6MXbKTLgFzM>)4{+3BPS_@1MldFvuB)zTCn@v6v;rI5(cT+N_1R{{E zQdsp!=R~h=Tiu@NTV*6l2G4Ip4>Qief@ao9Z5t@XJbgCq7R-138=#mhq?3nEFW$f@ zQNfjM&v03z!yXE#a2xgeo@rMmN73kVjJvMVnooC%_|EiJT!p(U!9#oT1>(-w;Bvs- z-L75@66$C)F)v%TAIfNg(gvZxA}HBaq}r*^8IQcf%Sb^5xLlx zQ21Qg`2A7|s?M)*^mvs5)^mFP2@-EK^*T#Yfl_Zjd|Y^7e+cthsexK5pFV>-1_T-G z$htJ!@W%q9qa*L#)2K4u(P~vRVL~?7$tR~ZZ!j(4E^jj(2^xT&cScdrgJkGfY<-H& zy-Qshs!HnA$|_YI^Rb9JQHXZJ68g{CUJRzVIF?jsJV<7PoC2?llUdg{?5q!*s_Ag{ zRw}!toaChgbo&vj=N1Qcru+Jx=%SeoJ3GesPf`z6#I)8~3!fy*%ac2y)D!*1m{c?| z5pR7t!iW96>h|U~STjT2G9A{`pvE}b^#K#TGK2e7)GO4nFO@=jK_`MkVw>*7c(zuk zMnn;aE11NlJl^?cu1m4D$Md2zXl1_*b#Iq34|%DJ4GYLNA#D=mDPaD6J0oL}%Za9~`B!Z+kLtW1~^P|-Ba4uKxYvqwd4iH`V zJGEtcZBItTI%aX503$#7w}vUwbc`#oA0dDXWtdMw^~5c0otH(1UCD(slWeRmK>_8#Do(1sM?}Y9IlG( zycO>&5wDf*K&U}VoMn@OIG@odW<$15{nbL_&ztdNHU2lC)Di17WVY>Fr7R7*R!>t{ zxvPr#LSDLxX#}rQloZNdilU|nibvd>R--@c{s5FGNJ?v8Z1xb4IpBcLGpuHgJ9|i- zN{6~%4e5VLte|DBGcX)4eFm8RW+^+4G?Ud67EDTbTep|=dC}48fa>WyT9KO8X43ww zG>S6`Cz}CEfX937#N{8w5z+zxP)C81IXw}93|2Zn1iquum6;!YVV)yqv@oZL#}X{J zimN!!8Mc{mZS?~s7rkdw4S$O*r@!AGTaM+!7wUxi)}b98FQRjcptv9X(6}_b zsI-|7u0pL8DWyTmUD>J2*{vRX(E1c@8lJ1>0O@66MK9}iyBg3Lzh7a)%9yb6fG+#w zvd7Lx7kdQq@N5)iH_!0+T+W%BT7ho+!Dp~aROilHpRgPkKc}U2;c;obU@Ff2!h;um z@w|W5IfoN+o)eZMOY`XN47;Kej_0Bd$p<xJ+GtU{P^_j}_J)eq&p8Hq5E&0V&&i1GOMzut&{fF!q7&R~ zkntZ}yidqeIX^=+gIVSrS`9B@#V|W+*%Cqz*}H`Z1N_; zEI^lJ6&;_KJlSXQmFyQi55@V~ahU&UlFH$py%AWL>Tdrbc~7Om1>a9)!dgB}hYS5q z5Hoi9iO3ID*RHg2&73Pe|1qxMQ3brC3@WansvP4E-%0L8^I2mEwwF)*{gZT9l0*75 zFo5Pj<4O7x>S7>m=P}fPf#g}ja*>;ugzI{o6Pj&*JCg_kABLW zeANb6190=Hfvu03pir$s?)sg+3#vH8B2!nZ=^GUJH5KULM%~c z>p<5fO8YFwutrOrgTuK@M_n@KDa#npjMeUp^s?U(x%<9!?0jW~Y9=9Mzoz*_DX}1T zltppgX8ib1b4zF&@##a^eEbz3W=C{zh3sWM-VO9nHgBcF@L}N(HIJzXNwU@hp~4@U ze*^wP+?~6@oJfK?KnECjD&hn-bn+J^2EG9V*KU|fR($CH%2>J8VJ1BvZ<+Ll>qw?T z=LB<0p@Yjh|0b4xJ_sY?28B^0b1NUu_txy1P$dRZzL9^ED~7Gmxo9`j1*5|sv42#! zQLpmy#s+$~8!P@TN3zzxRQyX_jItP7Ox~EojgY_Fow}aM8C=?Y1o-Bg! zykcOSn~tukTq_|Ll0mdPxbe_5Ah+03?K>4 z3IznKu>Eu)8|TP2@erNB-D-G7jhek4r}Zr*R4m4<1(jXzISP|(LhH`yTplPo5=llG zf!WoCJ%Z%^@H0bgcg+tch?x!XS4(y1hbn`7Ln8>f@ga(WQm4>*@p!EIg5mn}d#xVEsohQspG3^C+Yd+Y~-qCD%R3(gmGRxC(_cF+&@f z#-z7;k|ljOr?rt`m&aJMjUPNq;knlwzY1CH?!BJ9OIPb8eu$1qkM6+lFm5Kr8#oc3 zSCc>G!V&&X8;GE>_~gIfIY9G7-|5!674}pT&T8pJ{N>YD#%x0`zVm&_s-miIIkF8b zL5MKf{#)pGK1k-|Mk{)U`L>N`g5#PGx1kg57>NWlZx3#*vk?Zfd(YL7bF$_|JgQL1 zDv{Sar8Q_fCvyN7$s;Z!I1L;mrt*z}mdIN^hg2MBhW;N~FFR~Lw&oQzw(^tC!JZ`A ze{`UwD^$uhOnXvMMW+aa}MK=3lWRdXx-S1P+lxuzOk=vOnc91!kkg1TlrJOG)#q8AL z4Q5_z`s7%Im<@ZP#xMmPglN(+$9N0`bZnG3T!^)ldwFAb|7P9(nj+s>LBt9H5h?gG zbexD}xKFZ$aCDMXs6x(F1HVeq^X|c9vT$f^&my{d8;X}JMJDN+U}@zfd5TWr0nBsH z(sjurnoyiA%JOckg>n(zrn81YO^iMVisoweMJJ0k+lOyGD^zH1t=M#iM#i*qUMY!{ zK{756NnsM9m*J`I0J_6j;*ALTQ@q0IOWIN_#e+w2mkIZH+DL_uCUUo+|l z$98HRY$G_QZ^m{%koK~s&|G|ZZu_$%##Y0@`S|>y7f{rxt%*?X`3 zUFV#2&iDKI?hRm7LoT}p8sCP(X7>7e{f3S?yIEMp#iZ;)EC5a#!u*=yriXzV>TFR$ zvx>rL&vv<+!1D^{tWVIYuL-by*!OSy4&(WK^zS;TaxQ*@y6(ba;I>#F@S5d>wS$-tW;0Gh@=x5N$Do*4)bgQ|UQDX4*fUv7> z7t#buClNy59vZ2^AJ;W*dTI}RbDz)zK1vK_VKSrR&z08SZ8S;sjDSfFd0NquHx9wNF6GH`9s9ZP5{nVR}G$S=B_9v%67VX7|@1%L@(Z@NJRXMMC0YVv904GLQQ6xVSsG$4#P|n4#Ot9vp>r)1HFYFmkrnY5vI{B#mB! z?HZq~B6==6MD@u4$cOp8hTNyZF=?ToO=AMv?3=Aer_{cF;h^g)2~$%UkC^H z2-N}ZeFxZ54ME5#t*mZ?pDfk~piz0sXN%Nw09o*b>~qPj z=iSxaN#teko(;hXg%?}bZycN2r?_*V({(UE-XK3Cl6FkF7Pl1A*o->M=xE#Av%7^y z=spL|=(gdk8XzTMR#{5BTe-Xm`1*Eq>y^QAwu0AGh6?~r#Hty7AaqaS93(|j`?Ck= zvg+siE(ne+^^GQwdadQP?8VKn1VgxK-lrz#>bZM?NaP!*a~pcBR+OuaMqf>6x8251 z>0aXF+_M<3^sy0+!d?4manq+a>?w0wh7tad;m-SOuFGumnRp>2qv>s%zCc8L0?HZa zS4fljS-%W6O@YjqRh4~+~F-XLw<7p za`#EH&n=o~$qQ>=p+1qZRqd}MR#*22Y>IT*rn^@_FxTAN2A*^aXllY;haSb3u&o#2 zE|zLN2sp;Enln2DvJxbW^cS?l>u=_twtOi7dqvUOKQth5a6Wnn=QQTN8FKN(8}sBv zoVK;)ReJaCGDDW6bJWL4Ho|y>Fn2GALrqX#}oer~6JS^&bud*BhI7sr}3xWnhb0vvilvfB)f#l8$5dh%N_@Lkv&X{+<0INWPdBJuA5qXz5i>>4=|y2UAUGN=KX+d>T0h$^(SEzS**; zfh$-fSH^G$v!-0eMZj=_j5MQK2KsAEOlQfl$`6Vx8|^^r5+VO_aiq^d{wc#aj+Vna zhcTViJ8NTy*B-6`QcM&z`++hqvpz8iJjl-KrGrDJukDtyjp&A#m>1aeTPhCKXizj4 z*?j%$kZV;AUN@muUw_8;bdK1epWKukrXxeNdy+&gQJj*WdNp?Tbnb#|>u*EbgX)@{ zuY?of&F)27#PQ=%8lFB7wp6*4uKX;65Go8a^*deX?Yp|8zzzd|T(f>bgKQn~OO=w;YT8lqZ#Vw&Tt$hK5{#8>glrg++`|Heu z@1~x2?8O)%l@*>7X*=fN0)P1!&FhL&5D7P|DFtQG@GZI}{YO*iQ`hq~V0EHGD_U&B z`amYI5iGX=W-ugdx^5GsHYnbsQ?Y8+FXx9RMlKI)$hh}(`%Hgy^Py|c63?hdR~rZP zKj`FIM5l)m71~FCWG~^AWD8zQ?j4v2LN18jYae~@wmRRJ4N_~@yu)#qG=gpUEvY5? zCDQ~R&nUoQy}7mDRGzDJhkW(JMi8<_!|Q(6Z7PT=e|JjwL34(DNWItuFLdk94OQ(z zcGqGV{fX(QJ8i= z+TMO(R>zNSEACwTgt%5UXK}~PTfj3Zr=|LB^mneOmHvIrNz?kZkU5D`w!bSu-mAp1Wirf2hcKB}p2F|!#we8|bMu9Ilw)~2;L9E!B zhsLf26@&*b)dOU!?yI+J8#(NCJryL0-_gSFo52s5FU+Csp~1%F>KOZ=A*t-C!nq95 z54Y;COp{FtKKx8t$JDmpJd6C;Kk;HT>No|q61P*4)bM$)g{#<}1Z;^YItr>Owm1|= zeMfnRdHqbS)by{#M%0HXHorlr<4E$f^4!APbbAR1+T&uw5`izYYx8EN=Kd6)8L~;n z^%_MC+^q2mZVn0MEClcy|pKu>|HMXj_B7pK&r7IY?0$ibV8}(XsKC_e70T z?>@>8B)h2MU$Mt%LZH*wTkk60oT#c2R~#1WMOH3$yqySdQ~x?Vdg}`&07kd;L3B#0Co8G2?vnthm8=pl++5 z8l_LI6%jn4X_pnb=&P!pEGDZu6Dy(Bx{2X#)4VAsp6$nqn>d#;6XARpzPV$2mSpL&N* zo+svq50|6sFMNDuXjoIK^{jD7T13G`64%*?jYoL$C$G?SG<^d{4ZH02!rIJTC5SiZG zfZ2RwxkB%U`~sPBgb)I}e)WwT`XnJ5rN5pbTv#4WH(RLjOlj8IVgJ8T0y# ze}&1jQA`3C2JWn&E0Z63zJZ)X1(Dw{hS+#4nc&29X$lF5hJy-k7)~jh`rg_lH#-RkI3?5&MxAR2K^{gnRzm5N>Svn#;AyH$RxeQ-L|7}?P>b+4o zPxJ9NVdX0v1;QB##)H6SkP0KRU|EeTqddqmo2WCcTCxbu9{B=rt8fbaWrjJkZW^sL zT}5vdB270FFQ;T>u_sqh%Q&k?#ij4=$Ac0D#4I@_ZMkl=jWG1z<6d7y5Z}sU1+vO3 zS-&dJ`_^DF`VuAnI5=w{#L;AB6Uw7%q(#nQmpGHe^cy6*cl1>nRcA`azD_CzLXY$~ zZ-<*Q#Hr47Co&Z*=PoLi?JdwALBJtSf-)gR<9M=%l?0W2wM!RhoVS?nSp>%u<1J+j zQ|1>E2ecgh21=IcU)T;gpZ~}XGU6o_#Qhe>Q$G3Bh3bEWT8@fD)GB{A3@>i3GftXt zpe*yhux6>U6IQB27+b=#-0NP% z9b)C{MpAT(5}bn~=4={kqMjLU`P{DDR+-sRnfbe93jYPB<_PxHcjLkE-tqqypO1%` z_#gWjyyNpdV}SL#l*EspB4bznAOFq*3o9y)amu?@g_+$sk#laZn3(yi{9E{MGPC+O z{yN+0$Uzs8qhb`Ji!MHg$ec^LQEnrL-LLucko%wYe+c{7f2d;={{2P&(ak@a{U2y* WU@5S683^{TF>@hUxx literal 0 HcmV?d00001 From 00b3b92ec753686ed926341374473750d1427fe8 Mon Sep 17 00:00:00 2001 From: k3ii Date: Fri, 20 Sep 2024 16:55:11 +0400 Subject: [PATCH 2/8] docs: Update README --- README.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6787db4..006faf6 100644 --- a/README.md +++ b/README.md @@ -1 +1,16 @@ -# courant-cli \ No newline at end of file +# kouran + +`kouran` se enn sinp zouti CLI ki donn bann linformasion lor koupir kouran dan Moris. +Bann done-la sorti depi enn [dataset](https://github.com/MrSunshyne/mauritius-power-outages) ki finn kree par [Sandeep Ramgolam](https://github.com/MrSunshyne). + +![demo](./assets/demo.png) + +## Fonksionalite + +* Afis bann koupir kouran pou zordi. +* Get bann koupir ki pe vini pou demin. +* Servi sou-komann tou pou gagn linformasion lor bann pann pou zordi ek dime. + +## Motivasion + +Motivasion prinsipal deryer kouran se pou gagn lexperyans pratik avek konstriksion bann zouti CLI dan langaz Rust ek interazir avek bann API. Mem si zouti-la ankor sinp, li ofer enn itilite fonksionel ek itil pou tou dimounn ki pe rod res azour lor bann koupir kouran atraver Moris depi zot terminal. From b40e391b91f011f6a7262525764fd5419f19f75a Mon Sep 17 00:00:00 2001 From: k3ii Date: Sat, 21 Sep 2024 00:34:09 +0400 Subject: [PATCH 3/8] chore: Add cargo dist details --- Cargo.lock | 26 +++++++++++++------------- Cargo.toml | 34 +++++++++++++++++++++++++++++++++- README.md | 24 +++++++++++++++++++++++- 3 files changed, 69 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 512e58e..611305e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -249,19 +249,6 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "courant-cli" -version = "0.1.0" -dependencies = [ - "chrono", - "clap", - "comfy-table", - "reqwest", - "serde", - "term_size", - "tokio", -] - [[package]] name = "crossterm" version = "0.27.0" @@ -621,6 +608,19 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "kouran" +version = "0.1.0" +dependencies = [ + "chrono", + "clap", + "comfy-table", + "reqwest", + "serde", + "term_size", + "tokio", +] + [[package]] name = "libc" version = "0.2.158" diff --git a/Cargo.toml b/Cargo.toml index a1ac02b..cab309f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,15 @@ [package] -name = "courant-cli" +name = "kouran" version = "0.1.0" edition = "2021" +authors = ["Jain Ramchurn"] +description = "View Power Outages in Mauritius" +license = "MIT" +repository = "https://github.com/k3ii/kouran" +homepage = "https://github.com/k3ii/kouran" +readme = "README.md" +keywords = ["cli"] +categories = ["command-line-utilities"] [dependencies] chrono = { version = "0.4.38", features = ["serde"] } @@ -11,3 +19,27 @@ reqwest = { version = "0.12.7", features = ["json"] } serde = { version = "1.0.210", features = ["derive"] } term_size = "0.3.2" tokio = { version = "1.40.0", features = ["full"] } + +# The profile that 'cargo dist' will build with +[profile.dist] +inherits = "release" +lto = "thin" + +# Config for 'cargo dist' +[workspace.metadata.dist] +# The preferred cargo-dist version to use in CI (Cargo.toml SemVer syntax) +cargo-dist-version = "0.21.1" +# CI backends to support +ci = "github" +# The installers to generate for each app +installers = ["shell", "homebrew"] +# A GitHub repo to push Homebrew formulas to +tap = "k3ii/homebrew-tap" +# Target platforms to build apps for (Rust target-triple syntax) +targets = ["aarch64-apple-darwin", "x86_64-apple-darwin", "x86_64-unknown-linux-gnu"] +# Path that installers should place binaries in +install-path = "CARGO_HOME" +# Publish jobs to run in CI +publish-jobs = ["homebrew"] +# Whether to install an updater program +install-updater = true diff --git a/README.md b/README.md index 006faf6..c0a29f3 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ `kouran` se enn sinp zouti CLI ki donn bann linformasion lor koupir kouran dan Moris. Bann done-la sorti depi enn [dataset](https://github.com/MrSunshyne/mauritius-power-outages) ki finn kree par [Sandeep Ramgolam](https://github.com/MrSunshyne). -![demo](./assets/demo.png) +![demo](./assets/demo.jpeg) ## Fonksionalite @@ -11,6 +11,28 @@ Bann done-la sorti depi enn [dataset](https://github.com/MrSunshyne/mauritius-po * Get bann koupir ki pe vini pou demin. * Servi sou-komann tou pou gagn linformasion lor bann pann pou zordi ek dime. +## Instalasion + +Ou kapav instal `kouran` avek enn sa bann metod-la: + +### Servi Cargo + +Si ou finn instal package manager Rust, Cargo, ou kapav instal `kouran` avek: + +```bash +cargo install kouran +``` + +### Servi Homebrew + +Pou bann itilizater macOS, ou kapav instal `kouran` avek Homebrew: + +```bash +brew instal k3ii/tap/kouran +``` +Chek paz version pou instal bann biner ki finn konstrir alavans. + + ## Motivasion Motivasion prinsipal deryer kouran se pou gagn lexperyans pratik avek konstriksion bann zouti CLI dan langaz Rust ek interazir avek bann API. Mem si zouti-la ankor sinp, li ofer enn itilite fonksionel ek itil pou tou dimounn ki pe rod res azour lor bann koupir kouran atraver Moris depi zot terminal. From 9c4b04f60e615f08adcb0db59ac9831a1ced0b5d Mon Sep 17 00:00:00 2001 From: k3ii Date: Sat, 21 Sep 2024 00:34:58 +0400 Subject: [PATCH 4/8] chore: Add cliff.toml --- cliff.toml | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 cliff.toml diff --git a/cliff.toml b/cliff.toml new file mode 100644 index 0000000..1b4266d --- /dev/null +++ b/cliff.toml @@ -0,0 +1,88 @@ +[changelog] +# changelog header +header = """ +# Changelog\n +All notable changes to this project will be documented in this file.\n +""" +# template for the changelog body +# https://keats.github.io/tera/docs/#introduction +body = """ +{% if version %}\ + {% if previous.version %}\ + ## [{{ version | trim_start_matches(pat="v") }}](/compare/{{ previous.version }}..{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} + {% else %}\ + ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} + {% endif %}\ +{% else %}\ + ## [unreleased] +{% endif %}\ + +{% macro commit(commit) -%} + - {% if commit.scope %}*({{ commit.scope }})* {% endif %}{% if commit.breaking %}[**breaking**] {% endif %}\ + {{ commit.message | upper_first }} - ([{{ commit.id | truncate(length=7, end="") }}](/commit/{{ commit.id }}))\ +{% endmacro -%} + +{% for group, commits in commits | group_by(attribute="group") %} + ### {{ group | striptags | trim | upper_first }} + {% for commit in commits + | filter(attribute="scope") + | sort(attribute="scope") %} + {{ self::commit(commit=commit) }} + {%- endfor -%} + {% raw %}\n{% endraw %}\ + {%- for commit in commits %} + {%- if not commit.scope -%} + {{ self::commit(commit=commit) }} + {% endif -%} + {% endfor -%} +{% endfor %}\n +""" +# remove the leading and trailing whitespace from the template +trim = true +# postprocessors +postprocessors = [ + { pattern = '', replace = "https://github.com/k3ii/revq" }, # replace repository URL +] + +[git] +# parse the commits based on https://www.conventionalcommits.org +conventional_commits = true +# filter out the commits that are not conventional +filter_unconventional = true +# process each line of a commit as an individual commit +split_commits = false +# regex for preprocessing the commit messages +commit_preprocessors = [ + { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))" }, +] +# regex for parsing and grouping commits +commit_parsers = [ + { message = "^feat", group = "πŸ“‡ Features" }, + { message = "^fix", group = "πŸ› Bug Fixes" }, + { message = "^doc", group = "πŸ“š Documentation" }, + { message = "^perf", group = "⚑ Performance" }, + { message = "^refactor", group = "🚜 Refactor" }, + { message = "^style", group = "🎨 Styling" }, + { message = "^test", group = "πŸ§ͺ Testing" }, + { message = "^chore: release", skip = true }, + { message = "^chore\\(deps\\)", skip = true }, + { message = "^chore\\(pr\\)", skip = true }, + { message = "^chore\\(pull\\)", skip = true }, + { message = "^chore|ci", group = "βš™οΈ Miscellaneous Tasks" }, + { body = ".*security", group = "πŸ›‘οΈ Security" }, + { message = "^revert", group = "◀️ Revert" }, +] +# protect breaking changes from being skipped due to matching a skipping commit_parser +protect_breaking_commits = false +# filter out the commits that are not matched by commit parsers +filter_commits = true +# glob pattern for matching git tags +tag_pattern = "v[0-9]*" +# regex for skipping tags +skip_tags = "beta|alpha" +# regex for ignoring tags +ignore_tags = "rc|lib" +# sort the tags topologically +topo_order = false +# sort the commits inside sections by oldest/newest order +sort_commits = "newest" From ac9cb35503d6b375e1a89c01626579eccc7e2bbd Mon Sep 17 00:00:00 2001 From: k3ii Date: Sat, 21 Sep 2024 00:35:20 +0400 Subject: [PATCH 5/8] chore: Add release-plz --- .github/workflows/release-plz.yml | 26 ++++++++++++++++++++++++++ release-plz.toml | 27 +++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 .github/workflows/release-plz.yml create mode 100644 release-plz.toml diff --git a/.github/workflows/release-plz.yml b/.github/workflows/release-plz.yml new file mode 100644 index 0000000..7f6d474 --- /dev/null +++ b/.github/workflows/release-plz.yml @@ -0,0 +1,26 @@ +name: Continuous Deployment + +on: + push: + branches: + - main + +jobs: + release-plz: + name: Release-plz + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.RELEASE_PLZ_TOKEN }} + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + + - name: Run release-plz + uses: MarcoIeni/release-plz-action@v0.5 + env: + GITHUB_TOKEN: ${{ secrets.RELEASE_PLZ_TOKEN }} + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} diff --git a/release-plz.toml b/release-plz.toml new file mode 100644 index 0000000..a411f82 --- /dev/null +++ b/release-plz.toml @@ -0,0 +1,27 @@ +[workspace] +# path of the git-cliff configuration +changelog_config = "cliff.toml" + +# enable changelog updates +changelog_update = true + +# update dependencies with `cargo update` +dependencies_update = true + +# create tags for the releases +git_tag_enable = true + +# disable GitHub releases +git_release_enable = false + +# labels for the release PR +pr_labels = ["release"] + +# disallow updating repositories with uncommitted changes +allow_dirty = false + +# disallow packaging with uncommitted changes +publish_allow_dirty = false + +# disable running `cargo-semver-checks` +semver_check = false From ce5f01f16234ee68f104edd2dad0e6305903d910 Mon Sep 17 00:00:00 2001 From: k3ii Date: Sat, 21 Sep 2024 00:35:41 +0400 Subject: [PATCH 6/8] chore: Add LICENSE --- LICENSE | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a25e879 --- /dev/null +++ b/LICENSE @@ -0,0 +1,8 @@ +Copyright 2024 Jain Ramchurn + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the β€œSoftware”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED β€œAS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + From f6755e797c74a5146acb80ab591d6074c2332b2f Mon Sep 17 00:00:00 2001 From: k3ii Date: Sat, 21 Sep 2024 00:36:21 +0400 Subject: [PATCH 7/8] chore(ci): Add release workflow --- .github/workflows/release.yml | 324 ++++++++++++++++++++++++++++++++++ 1 file changed, 324 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..b38aace --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,324 @@ +# This file was autogenerated by cargo-dist: https://opensource.axo.dev/cargo-dist/ +# +# Copyright 2022-2024, axodotdev +# SPDX-License-Identifier: MIT or Apache-2.0 +# +# CI that: +# +# * checks for a Git Tag that looks like a release +# * builds artifacts with cargo-dist (archives, installers, hashes) +# * uploads those artifacts to temporary workflow zip +# * on success, uploads the artifacts to a GitHub Release +# +# Note that the GitHub Release will be created with a generated +# title/body based on your changelogs. + +name: Release +permissions: + "contents": "write" + +# This task will run whenever you push a git tag that looks like a version +# like "1.0.0", "v0.1.0-prerelease.1", "my-app/0.1.0", "releases/v1.0.0", etc. +# Various formats will be parsed into a VERSION and an optional PACKAGE_NAME, where +# PACKAGE_NAME must be the name of a Cargo package in your workspace, and VERSION +# must be a Cargo-style SemVer Version (must have at least major.minor.patch). +# +# If PACKAGE_NAME is specified, then the announcement will be for that +# package (erroring out if it doesn't have the given version or isn't cargo-dist-able). +# +# If PACKAGE_NAME isn't specified, then the announcement will be for all +# (cargo-dist-able) packages in the workspace with that version (this mode is +# intended for workspaces with only one dist-able package, or with all dist-able +# packages versioned/released in lockstep). +# +# If you push multiple tags at once, separate instances of this workflow will +# spin up, creating an independent announcement for each one. However, GitHub +# will hard limit this to 3 tags per commit, as it will assume more tags is a +# mistake. +# +# If there's a prerelease-style suffix to the version, then the release(s) +# will be marked as a prerelease. +on: + pull_request: + push: + tags: + - '**[0-9]+.[0-9]+.[0-9]+*' + +jobs: + # Run 'cargo dist plan' (or host) to determine what tasks we need to do + plan: + runs-on: "ubuntu-20.04" + outputs: + val: ${{ steps.plan.outputs.manifest }} + tag: ${{ !github.event.pull_request && github.ref_name || '' }} + tag-flag: ${{ !github.event.pull_request && format('--tag={0}', github.ref_name) || '' }} + publishing: ${{ !github.event.pull_request }} + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - name: Install cargo-dist + # we specify bash to get pipefail; it guards against the `curl` command + # failing. otherwise `sh` won't catch that `curl` returned non-0 + shell: bash + run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.21.1/cargo-dist-installer.sh | sh" + - name: Cache cargo-dist + uses: actions/upload-artifact@v4 + with: + name: cargo-dist-cache + path: ~/.cargo/bin/cargo-dist + # sure would be cool if github gave us proper conditionals... + # so here's a doubly-nested ternary-via-truthiness to try to provide the best possible + # functionality based on whether this is a pull_request, and whether it's from a fork. + # (PRs run on the *source* but secrets are usually on the *target* -- that's *good* + # but also really annoying to build CI around when it needs secrets to work right.) + - id: plan + run: | + cargo dist ${{ (!github.event.pull_request && format('host --steps=create --tag={0}', github.ref_name)) || 'plan' }} --output-format=json > plan-dist-manifest.json + echo "cargo dist ran successfully" + cat plan-dist-manifest.json + echo "manifest=$(jq -c "." plan-dist-manifest.json)" >> "$GITHUB_OUTPUT" + - name: "Upload dist-manifest.json" + uses: actions/upload-artifact@v4 + with: + name: artifacts-plan-dist-manifest + path: plan-dist-manifest.json + + # Build and packages all the platform-specific things + build-local-artifacts: + name: build-local-artifacts (${{ join(matrix.targets, ', ') }}) + # Let the initial task tell us to not run (currently very blunt) + needs: + - plan + if: ${{ fromJson(needs.plan.outputs.val).ci.github.artifacts_matrix.include != null && (needs.plan.outputs.publishing == 'true' || fromJson(needs.plan.outputs.val).ci.github.pr_run_mode == 'upload') }} + strategy: + fail-fast: false + # Target platforms/runners are computed by cargo-dist in create-release. + # Each member of the matrix has the following arguments: + # + # - runner: the github runner + # - dist-args: cli flags to pass to cargo dist + # - install-dist: expression to run to install cargo-dist on the runner + # + # Typically there will be: + # - 1 "global" task that builds universal installers + # - N "local" tasks that build each platform's binaries and platform-specific installers + matrix: ${{ fromJson(needs.plan.outputs.val).ci.github.artifacts_matrix }} + runs-on: ${{ matrix.runner }} + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BUILD_MANIFEST_NAME: target/distrib/${{ join(matrix.targets, '-') }}-dist-manifest.json + steps: + - name: enable windows longpaths + run: | + git config --global core.longpaths true + - uses: actions/checkout@v4 + with: + submodules: recursive + - name: Install cargo-dist + run: ${{ matrix.install_dist }} + # Get the dist-manifest + - name: Fetch local artifacts + uses: actions/download-artifact@v4 + with: + pattern: artifacts-* + path: target/distrib/ + merge-multiple: true + - name: Install dependencies + run: | + ${{ matrix.packages_install }} + - name: Build artifacts + run: | + # Actually do builds and make zips and whatnot + cargo dist build ${{ needs.plan.outputs.tag-flag }} --print=linkage --output-format=json ${{ matrix.dist_args }} > dist-manifest.json + echo "cargo dist ran successfully" + - id: cargo-dist + name: Post-build + # We force bash here just because github makes it really hard to get values up + # to "real" actions without writing to env-vars, and writing to env-vars has + # inconsistent syntax between shell and powershell. + shell: bash + run: | + # Parse out what we just built and upload it to scratch storage + echo "paths<> "$GITHUB_OUTPUT" + jq --raw-output ".upload_files[]" dist-manifest.json >> "$GITHUB_OUTPUT" + echo "EOF" >> "$GITHUB_OUTPUT" + + cp dist-manifest.json "$BUILD_MANIFEST_NAME" + - name: "Upload artifacts" + uses: actions/upload-artifact@v4 + with: + name: artifacts-build-local-${{ join(matrix.targets, '_') }} + path: | + ${{ steps.cargo-dist.outputs.paths }} + ${{ env.BUILD_MANIFEST_NAME }} + + # Build and package all the platform-agnostic(ish) things + build-global-artifacts: + needs: + - plan + - build-local-artifacts + runs-on: "ubuntu-20.04" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BUILD_MANIFEST_NAME: target/distrib/global-dist-manifest.json + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - name: Install cached cargo-dist + uses: actions/download-artifact@v4 + with: + name: cargo-dist-cache + path: ~/.cargo/bin/ + - run: chmod +x ~/.cargo/bin/cargo-dist + # Get all the local artifacts for the global tasks to use (for e.g. checksums) + - name: Fetch local artifacts + uses: actions/download-artifact@v4 + with: + pattern: artifacts-* + path: target/distrib/ + merge-multiple: true + - id: cargo-dist + shell: bash + run: | + cargo dist build ${{ needs.plan.outputs.tag-flag }} --output-format=json "--artifacts=global" > dist-manifest.json + echo "cargo dist ran successfully" + + # Parse out what we just built and upload it to scratch storage + echo "paths<> "$GITHUB_OUTPUT" + jq --raw-output ".upload_files[]" dist-manifest.json >> "$GITHUB_OUTPUT" + echo "EOF" >> "$GITHUB_OUTPUT" + + cp dist-manifest.json "$BUILD_MANIFEST_NAME" + - name: "Upload artifacts" + uses: actions/upload-artifact@v4 + with: + name: artifacts-build-global + path: | + ${{ steps.cargo-dist.outputs.paths }} + ${{ env.BUILD_MANIFEST_NAME }} + # Determines if we should publish/announce + host: + needs: + - plan + - build-local-artifacts + - build-global-artifacts + # Only run if we're "publishing", and only if local and global didn't fail (skipped is fine) + if: ${{ always() && needs.plan.outputs.publishing == 'true' && (needs.build-global-artifacts.result == 'skipped' || needs.build-global-artifacts.result == 'success') && (needs.build-local-artifacts.result == 'skipped' || needs.build-local-artifacts.result == 'success') }} + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + runs-on: "ubuntu-20.04" + outputs: + val: ${{ steps.host.outputs.manifest }} + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - name: Install cached cargo-dist + uses: actions/download-artifact@v4 + with: + name: cargo-dist-cache + path: ~/.cargo/bin/ + - run: chmod +x ~/.cargo/bin/cargo-dist + # Fetch artifacts from scratch-storage + - name: Fetch artifacts + uses: actions/download-artifact@v4 + with: + pattern: artifacts-* + path: target/distrib/ + merge-multiple: true + - id: host + shell: bash + run: | + cargo dist host ${{ needs.plan.outputs.tag-flag }} --steps=upload --steps=release --output-format=json > dist-manifest.json + echo "artifacts uploaded and released successfully" + cat dist-manifest.json + echo "manifest=$(jq -c "." dist-manifest.json)" >> "$GITHUB_OUTPUT" + - name: "Upload dist-manifest.json" + uses: actions/upload-artifact@v4 + with: + # Overwrite the previous copy + name: artifacts-dist-manifest + path: dist-manifest.json + # Create a GitHub Release while uploading all files to it + - name: "Download GitHub Artifacts" + uses: actions/download-artifact@v4 + with: + pattern: artifacts-* + path: artifacts + merge-multiple: true + - name: Cleanup + run: | + # Remove the granular manifests + rm -f artifacts/*-dist-manifest.json + - name: Create GitHub Release + env: + PRERELEASE_FLAG: "${{ fromJson(steps.host.outputs.manifest).announcement_is_prerelease && '--prerelease' || '' }}" + ANNOUNCEMENT_TITLE: "${{ fromJson(steps.host.outputs.manifest).announcement_title }}" + ANNOUNCEMENT_BODY: "${{ fromJson(steps.host.outputs.manifest).announcement_github_body }}" + RELEASE_COMMIT: "${{ github.sha }}" + run: | + # Write and read notes from a file to avoid quoting breaking things + echo "$ANNOUNCEMENT_BODY" > $RUNNER_TEMP/notes.txt + + gh release create "${{ needs.plan.outputs.tag }}" --target "$RELEASE_COMMIT" $PRERELEASE_FLAG --title "$ANNOUNCEMENT_TITLE" --notes-file "$RUNNER_TEMP/notes.txt" artifacts/* + + publish-homebrew-formula: + needs: + - plan + - host + runs-on: "ubuntu-20.04" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PLAN: ${{ needs.plan.outputs.val }} + GITHUB_USER: "axo bot" + GITHUB_EMAIL: "admin+bot@axo.dev" + if: ${{ !fromJson(needs.plan.outputs.val).announcement_is_prerelease || fromJson(needs.plan.outputs.val).publish_prereleases }} + steps: + - uses: actions/checkout@v4 + with: + repository: "k3ii/homebrew-tap" + token: ${{ secrets.HOMEBREW_TAP_TOKEN }} + # So we have access to the formula + - name: Fetch homebrew formulae + uses: actions/download-artifact@v4 + with: + pattern: artifacts-* + path: Formula/ + merge-multiple: true + # This is extra complex because you can make your Formula name not match your app name + # so we need to find releases with a *.rb file, and publish with that filename. + - name: Commit formula files + run: | + git config --global user.name "${GITHUB_USER}" + git config --global user.email "${GITHUB_EMAIL}" + + for release in $(echo "$PLAN" | jq --compact-output '.releases[] | select([.artifacts[] | endswith(".rb")] | any)'); do + filename=$(echo "$release" | jq '.artifacts[] | select(endswith(".rb"))' --raw-output) + name=$(echo "$filename" | sed "s/\.rb$//") + version=$(echo "$release" | jq .app_version --raw-output) + + git add "Formula/${filename}" + git commit -m "${name} ${version}" + done + git push + + announce: + needs: + - plan + - host + - publish-homebrew-formula + # use "always() && ..." to allow us to wait for all publish jobs while + # still allowing individual publish jobs to skip themselves (for prereleases). + # "host" however must run to completion, no skipping allowed! + if: ${{ always() && needs.host.result == 'success' && (needs.publish-homebrew-formula.result == 'skipped' || needs.publish-homebrew-formula.result == 'success') }} + runs-on: "ubuntu-20.04" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive From a8bcfdccd9ecae9d7b38bc43ab1b5be80457ed78 Mon Sep 17 00:00:00 2001 From: k3ii Date: Sat, 21 Sep 2024 00:36:43 +0400 Subject: [PATCH 8/8] docs: Add README.md version English --- EN-README.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 EN-README.md diff --git a/EN-README.md b/EN-README.md new file mode 100644 index 0000000..31bef18 --- /dev/null +++ b/EN-README.md @@ -0,0 +1,36 @@ +# Kouran +`kouran` is a simple CLI tool that provides information on power outages in Mauritius. +The data is sourced from a [dataset](https://github.com/MrSunshyne/mauritius-power-outages) created by [Sandeep Ramgolam](https://github.com/MrSunshyne). + +![demo](./assets/demo.jpeg) + +## Features + +* Display power outages for today. +* View upcoming outages for tomorrow. +* Use the all subcommand to get information on outages for both today and tomorrow. + +## Installation + +You can install `kouran` using one of the following methods: + +### Using Cargo + +If you have Rust's package manager, Cargo, installed, you can install `kouran` with: + +```bash +cargo install kouran +``` + +### Using Homebrew + +For macOS users, you can install `kouran` using Homebrew: + +```bash +brew install k3ii/tap/kouran +``` +Check the release page to install the pre-built binaries. + +## Motivation + +The primary motivation behind kouran is to gain hands-on experience with building CLI tools in Rust language and interacting with APIs. While the tool is still simple, it offers a functional and helpful utility for anyone looking to stay updated on power outages across Mauritius from their terminal.