From 782628ecd778f908d24b3102f86f8f19db57b120 Mon Sep 17 00:00:00 2001 From: RoinujNosde Date: Sun, 8 Mar 2020 12:17:11 -0300 Subject: [PATCH] First commit --- compilar.bat | 2 + fetcher.py | 27 +++++ icon.ico | Bin 0 -> 138663 bytes interfaces.py | 285 ++++++++++++++++++++++++++++++++++++++++++++++++++ pflow_quiz.py | 10 ++ setup.py | 66 ++++++++++++ 6 files changed, 390 insertions(+) create mode 100644 compilar.bat create mode 100644 fetcher.py create mode 100644 icon.ico create mode 100644 interfaces.py create mode 100644 pflow_quiz.py create mode 100644 setup.py diff --git a/compilar.bat b/compilar.bat new file mode 100644 index 0000000..92f5377 --- /dev/null +++ b/compilar.bat @@ -0,0 +1,2 @@ +python setup.py bdist_msi +pause \ No newline at end of file diff --git a/fetcher.py b/fetcher.py new file mode 100644 index 0000000..18aae60 --- /dev/null +++ b/fetcher.py @@ -0,0 +1,27 @@ +import json +from urllib import request, error + +quizes_url = "https://roinujnosde.pythonanywhere.com/quizes/" +detalhe_quiz_url = "https://roinujnosde.pythonanywhere.com/quizes/%d/" + +def pegar_dados_do_quiz(id): + """Acessa a URL externa, baixa informações sobre o Quiz com o ID informado e as retorna""" + url = detalhe_quiz_url % int(id) + try: + with request.urlopen(url) as response: + data = json.loads(response.read()) + except(error.URLError): + return None + + #Remove as não aprovadas da lista + data['pergunta_set'][:] = [pergunta for pergunta in data['pergunta_set'] if pergunta['aprovada']] + return data + +def pegar_list_de_quizes(tree): + """Acessa a URL externa, baixa informações sobre os quizes e os retorna""" + try: + with request.urlopen(quizes_url) as response: + data = json.loads(response.read()) + return data + except(error.URLError): + return None diff --git a/icon.ico b/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..24253943b14a8fd79e3dd00953f24946088d4ad8 GIT binary patch literal 138663 zcmXV11z1#Fw7vAuLw7gQ4bsgBh=_EDbf-uR-SrEobVx~eOG$}zcZWzy_q)9J{6=Ar znS1A)v-e(mt+fFF0YC+w{~!Rgfan(hcn^LLhyUMmRtN%+4gO48`v0HH0ziKb0>H!b zf6t4V0N{87d?oGwKZgRqX9ywy1;0MOpA9kqNRc4|Q5xz>*cjv(;9Fy>D9dX;|L^l( z$n&KQ-HO3$!T}X|87-fM10!#rx6>2>qr=9_1q_Zsh(^-$a)nr@5jk)~#0_)IU(|f> zDB-lMPOiCmd2rSFkH_=qbp;UVS#ei7x)~8(#kG+} zB0tGSDLKXjzuU)@_;`uDYAUT_%Z8B6{Vh3~EIg^2f-*MBX(lKIwpbmI0$V2%tRu!g6wdbF&< zRuD>xg`e5A_H*}ii!d>rg}Y#itZ#4+t1}8p@9#nZH2(=C1MmPkAb`_E33UxrFqse+1_~_(s*qMLXNv_dvGoFVczP#iU zYIcpf-z9+ia(^A>d73+3b3kv(otmdWQOw#s%x{zMn-C~cR!?D z=K7+s733rbLlI>m*M5>)ZlacaWZ(G62;D?OW$CssP%Jgs7&X}lF;IS*^EPHHGa_b> zD%skyxw*S1{r6w+Vs&+s=U-wN48|_z$VO+$i6ANdab4EcXysV$;)KHVCHO*PDn4YB z`%4N`kNr@G5CmE31Uw96@i=4d4Lo`#@vOO=Nl|{Re4dg)F07sby;M)S&;f)2)`Iux zGhtAABwFDIPQm#GeA3m=5l;05Q#R@ZvYk9w^5(puhzN}M=->t9i9fw%{v?yDLCR9y zE7WY8{z(?0*$}5%9ufRkGJ7=6kr+!bOueXQd+2j@;IT2Ks2ehQ+)kHK9;s}f5Dr$` zzuoM>nZeqRHUU4M$TKoBcs%wre)jkGnDTTkFH<%D`GaM`L2TzKhAv2Ic#Rm8AxIiq z%GRT-n<}_ip~yl=`#$bPIl<9uUD1LmhcgTWh)dvxBq7gh=2R;gHk5>Zr0h{)b;V{% z^J-FzFhu;Q&^rV6B6eT8s5Jfzc}q7me7G~ z@vNVwJj!}7BU0+uedN=Ywcc|nQ2GLnzliy14p~*^pIQ#&5!hH$@ML{<-VKLFY2q?MZ{0jHrO%qt=Ji~ zG?skVhwJx{fUa(Rw$aKXTclBdT5AHr{_%w~l;U7P&=;O~s4N95(v zpE0LG`3l`O!Ay!tXsYJCLrKY5PZQU*1 z=5Cs>0v>f;l%vDJI29Kuuwm6ST;xyfNa}e;U z#q*CWD;-Q@Aw+WlK^hYXNY?b0jl?X_!mv3>SWBH=Nx}~iVW{4A|g%JhD z8ygm*u;ZsR=7uSOTqaGnEj}_ZoM=-9X$djn2#B%2yCOOCgq`j3+V7~6Vu2-sZi~H# z$7nR;Ws&E3v)%c79C8832T{=#j-hyz6Z(QWs#tWgdK_5@D==dU4Arci-6$6Q7l!?! zIwPadamOX$LtYw-D9L6Dj1E8QsIm^*Mp|N{(Il{!Bs*}#pEKV`vVynjzoeQ zVvh6b4^~btr;(ZiMA)App2FAq*tPA0yJvJz2(6%+_}NxnM%DXw^OX51X%0qbLM$vS z1F9-ySUmz|HP}97oi!XQ8Dc~_6^6Xd6Hr-g{!l-Uo%LpSk!_Czz5a z^omV4&TjmW(a`es&UQ{NF2YJn?aA)6xjxI;)wmAl=7*~+!cn#2udjV#srbYBQNRj0 zi%w@TV%!A%6X~uih}7zJwDc7*UE0=t=n&kmcHgVMw@9ct_Olg+9E}Lr#kk4I$+V)P zWNd?j0|NunPEK4Hn3!)gH4!t_(O_&~Ui^uVzGP@LJ}`tCMSjxB9h!AIV;~av=%--v2SV2~V$@VsRA`~I-+Xm-_OajX zA7+^B@2|qRlh(iChFq1$))R2>U|ow-dmYWKkMY*l)VN%a(Pc<_Vgv;Ro&3A3nEg0K zfhF=`Lteq;6u`Q?I$O-l`0qcxPt`A`fEKSK@g&XL@|%y~=9lTU60fhXU)<7?kHOJ$ zC;yyuARuuNSW{xiLX0T|F(z012oQsEjE{JQg-J&5j|1Nw;;X>bce#w~nvYAS?Gx571>hA8|-`*()i;>*>_ssYN1W8bugjQGA$b=Xi4VMgbA5lhR9RiUqTYR}#S>Gf(om*yrJW9cp76#C0#;<4gVhA^J%4$f zGQy=fQmB6o57*ls@SQ6eiFs;jq&^TaM`UZT{!FX4$0H=v+7&h;`geBbdbl7cuP9H; z%#3=4kDr*76okgU#~#+&`tttaVO)R*3T~vdjV@`Lpgn4?hVE+P44gd2|L#)6`_iF2 zYjdIA-p74k%kSo5){~l-HZ- zMX(G6tk$6~HaLaB3fQmO4Y`!=E)Vfm3bDKO8|1-Hw|;QoaDUqTvepM(wJ>O2nw6bh z)=d-tXr(=-xR_O5L4l50Y@vp@73==~{^Y=YbiJ8QZf$>GpL_HhLOfCd;b$(RZtLuT z=$DPoi+U{zjY#Id<-z<_r%-i1Cr{&%I<- zQI)mTNA(bG9wQ=zPus|_VRrMFhRU8~X3~1NhYSo6m`gEzLwHO?5sYB$#Kp=^_-{hf zup@wqWF)))E5CIjl*Z)f7ObbJxYV(qjRVMj{P^Md=tsV$yLaL1aDDXh{@)OHj!;^1 zrkH2F}j@_xybGh!YMl zk|i1rB6UZM&7#3g5W?xU_G~pn;KPh@+qk z%~%ZUDX{p++HDYga-$rX(BBn;Rvozd!)=xk3gJ1p+2sxB4iyVj$956FJYJ00K5o}x z-d!QTKR+9Vl;`iwMG>&@1RfdMdlg{y)JcAP^a~Yyc?Kq;-@r9091Xyt6oJ0RCe>gO zMj@R(P0*?Mx%+qa^P8*1dglc1l@DkHENa1(TJckA>3FSvM4Cd*3hTp=y?_4>r9|m+ z#He7C6K`C$#rV9A<@R^VS)-e=b-cYj0=;+?ur%*$lDTBZ>bwfZ|w?& zu9Uw#gwv8%Vx`l$B3uZ15%Kh%f4yub_{YjDK8nA5kM$g*H#axR%F2MLfS!7$c$7h- zQ?5mSeBz*`=f5TLHJ>^NMzDT)U%9~y!Lg;K&Q`HM{(G`#D}XXEbUz{jYHa{bNAh*DRp za}i4_5iI>E_lkyGZY?^;zc_}}5;%?Te@9rqL6_98MqGV5k^B0y_-uD%efzWV_X}MQ zBs&uD1IkHD!>8|dx3|~5urneBgS6Y^`}+*&Kg$(dM21& zY3S=?bdtImJl*Vmk+eYlcS+M%kW@+Q-%p)R#a|z_#J}t6crPIT+bC9=#oFO|9qo69 zV9XHK(CBFYfnMzi*e1+g6$s^oLovd9?EA3NM}obW6W@kEXhZdOF% z8bt`%@I7GHJ)FMqSboCQ=g2_Pi`fy%jF|qDcygG~BosjICvSd#GWmM%Ve8Y4f#%LC1OaYBBw4G zjV?)fti{v*d~cor2^C8^!fcfOZjSAz|1A^j?PQr`IXfS@j&W9G;?-yK-d`!#2a~U> z=cgte7iY@BKH`g0K5QO-tCao2|8y`-P#gUO{{>50JBWS3P1ep#&}7e3w0(24Z!Y zIU=5_=f2s!+J2Uck%{SD+I-RM-{)Sw)_QcKvg1k7%S%WMhdi<{KV0r}CX(j?Rq5!c zUHyQV4>CP2uDIZlpiRC07x!xCl{Rz|5|Yq*hd(FQw<7ssLEs!DpqIP%~?{jwUqg)iPh))*ApVZx=C4(B70X`v%Bm5)?kfr|8Bls?RyRO z6zD5PRyHn0Hy8%~#%As$Sy;Swe%B1Afy;B=_qlUCH@FmHR3m42JaaDlfn#Ut`mvYA z^cC!+Z>j{m-LBO@vae~9MvXYbX~IgaV$l`izpev%P#u#U9goOTUbOPxMUq-)&_6rhuwxfVs zA|F1o_rqCnbyHdyVxAbj?bOE{M$xMQPwn0Iww?YEPd&KTcay*$N{(O8kw)n1bYucJI~R z;dEgHz}VRM`hJL8h5#Rr_ak0$#m++b*d&tU52J*#34GPBd?r$eTQ4fl|dDXR$Ys(``r(f|1C?HC{SIu@RJ4IdF*a+tS zagSfwcKcne8H+AA_xkAWnD=_#y4i8n|BiDcLo|dKb60xpy}<>|GzGNXM>MpT$;bP~ zZ6rXVDo~0`OZ8w5AV5qP>@k=uvN#yxw%GWla(!?%TD=}Yv*y?}Xw5@f<<^Ules<{? zCTIwyPl8ar^r|x#=$B?s(QmH|vMSdUCWEo{^INL_t|n;~71eF@;=KCM{WHpjh&X(& z;8-p_#c_5{Z8Z(cRvAjnX*fXir>Ui7{b^#V^6B2fHAzVn0NxZRrXusDQHTYzYKWfnQx|B|fVWTwXIRolN`FO*m6$Zkj~ z=L9QW^fr= zo@C1E+RufbHi#?_?nyRTRN>b7iU9n&N#x*R_Q)9LN%R^Gd9C+N{x65x_rWuS9S^rJ zyp9*%ZA*d;GFoSB#G z>c`D^g)3Pul#_T^#!^e`t7YB|CUH(dNVfyH1@60}yOK{2vnH%Fc55&FY~uQ2p8mar z=n)gJsBbkm-rwx%>zL3eVfoNbX>UopPh+LP!a%%djeUk=O#X7lPANCvG@oFMeX%|k z-Lw+ONj85d%63yv$74{+(=*NCl`ky)P(}kJTPR9@JMU%3ymRiHe7*TqCggzpO2*@0 z4)1WW5zRD~_+YgW*LV~QC_#|Q;pzYeJ07E~QL#55@?b~lx}S_Rk@;kCa(c=pH*~06 z5s+$C?Yt@(OD2f%bX4-AUlHuF`d(Kp3)GPa{gfw}P0!36P7!#SA?g)pKxRxTnQ?d58H5CFYUynD zPbZH{xt*1gwzVZA^7^|PIQz>}YNYAI88gdum@M7x`Jw&Qmt@ThsX%H1uyJS|O4Uo5 zDLp^y=`YopeU$)|IBxIEh$3*R0U!SXx~aXmQum$y0T=bNv;+|7(>7|W^V0G5o3T?L zFgrg~Gk2V#8rrdWHd|L3XY_3E#8I%aa)jE?stc08s?=t%*fqu?7ysgJY1HO}M}~8B z_Shr~ref}y%KkDkei5|&^vR;dVVw`_-6*PG1ZwbH#_;g#xWSTOIiGqTlfJc)kdQdN$K_c&sdyRMFQY;hpn`q2b+TFU~D*4;=1;;Pa-+rz9CEbJxPS) zP=T5H4jW9`AW3{i!qGX9#9%ML{M?)w|NIt3!22*PY=-IYwL6k|`j8-%imoyv=pcab z&9OW(`V>LrC)!DWq1w`Fet#^&YiH?y&gq9gY_oSG;22@o%jWkgpO~k`tOFMt9Gj;$ z1_qQp0xtxi2px*(s=co08VdazB?w4Otew>s{U;N1)%Cu(3G5RS6VJ3@qD|8Be1-o< z4*fdFqY%_fcf(i~ai-iT#(j5W-XlYqu{$)1;1qn(yC3dgj#gGvk#RDnj-IlEh6l;! z!Zk}mD=RDIR&)$9;WIV^ezK9j+V*F)fTd=4G#xcF(Pr5oI=OIK|2wC>f0zd?X5E`z z-aj=c#eAS&zxJ&}fP{?|%-J3@l`P5oXbIspefZoW1(S-Pjf?`MCV^6^NTpJaJteQH zi8KihkCm0xhL)%tpz*(^6TTq}?>Z;rKiMdLBeTJpOVz#IwnBF2dt!g)EJo0P&H|I@ z2Rn6?tdF;p$bOOw-g`i&4G5md$X#eShEi=2C(A#2$C695D1I`joZZZ{8anyY;whvS zP@)w*@4jQ&gDa&adV`SjCSP%2c(7#3gE{oMUu*R~?6$9L3w~}TH)9Q&4V~(v)Y&}k zCd>5d?|88i`o99c?JGN^_1dMqK}cv#qab{hTlsp%s#ag)RD$7yOBVXl`^ZH;4n!F~ zE&E(0I3cB_ApH!oi2w?%otFFV>+xj~u!n4hG5||e`7ehzF~ZG$ZOz2k%~d98M&qV( z@49K0DI`!!ob+c0ns3E$>(`GdGvbGahwJ;RJsr)5L~Zsn2p28LwquN1mD4hYim((E z>9q2%PM|BZh3S_!47LXBod3Dg3oO^qRhcY|yq*YWZ-LRCyF}RU;>xq0nCE zZFE}s*-&oaD2AIo+Nf`;0oxAkFZJ5x`v8POi)m~I-w}C;QK_fbERcrFfUQH4|9R-L zUSJL(^+VRr=@&YQ7Mdw(jW$8=haESMYDw_lE@hdK7HhGeSkCBJybH~1@)`K1>GRnn_H3Y!9jGX$9w+EqtyhOfZM_McTfKcUJ+Ha5#_3-3tevvaW}92OiCQw z_W8Kp4XZ_cy5Gc2@2^XRheGMivBT|ZQ%F;-UIBY*XdnvKJzRTl_`@S=lhuCuJCV4! zc%uJS(=x95-a1aviMELEIcsBi;M1e$NR7R52|C@Foq!+=twCPJ977tSGo%g)B4S#6 zQh5e(eNo2VN4iRX`gpJ;^_y#EUfeRPW<-u;zWltHm6m3AQIFVn)w{66pRD;q5Jd(H zL4fBG$<#ol%1X8VV*)h~ArZsVKfzX-FZPXGIY5z-2JF;QBGHzI7%{>V=&590{_VO7HI}uFVqZ(a}+T0B$H$)&Fc5qa#MJpuqqMR>IjGZAMzC?-^v~ zBhJZz4Cl=4j3ME2A(^>|VoCH~uaRrHZt^~kZuLIyrtHUpKv)S;0bcV!ZM-jcOWCmt6`qe0tx{==26b+Qo$@O~l7cu&c2#^@bW}U8Wi~-x;@Y&7BM$HSP%2;(A+{*EpD8TKmh< z&zVh7hiVdG1($b1z}`D{R*ohFs=@Aak@dcdzt`4_LN)^AOHHmw){Zu<#N@>9Q#PxZ z7ZlWFATmBaKFx;>iuLj{)=2ojYPhBke^LrpY-FsPSQZeR%nYX+x+;Q&B@P|;bNOg_ z1=hbcVyKAddaz0>03R`GnUio*GYuf-7?S1s)MXkHQb!M^#=Q;h=JPTP0g6dMqR_B6 zQ=VR?NPULHLeO!6&`G=ave)Y|tD$?jCx1!EfNHV9hBMUc`!w*|4DpDw?lP?IAa4PL z{4K$>z2tKAM~o2lmE>FM>2YNQ+r6>(?Vm__Ww}i3Q8a?iU<3teCFR)ARkW!X`#> zF!oCtJDjh6>j}k+7FII+;Tk^f6yQ2lOg`RzalG2G;13e<_8vwJ^eilBn5zL4{TzAv z;Ni;V?b#Vf&3_d<{3>bq0%%klCLjx!iOHcQbXc~1`jiKMn?5twc=uzg;`21kTFnyx zD%8uQ7gnIBOe48|^~|;H z?RQMah;+y*QBn1&CVASW)iLX-_45rj?OC>*IV4jKBFX&vnx;fvHvjSkdwQ%HWA6)iZwTc5%79uV#fdI=Lu1i=1 zcy16lGNKY%fHB+p$e08rOG`$226`wJQP}nMwOe7FG_ACXib`hn9;jYpk%%;$@?F+1R(oevJ}it9K&ld!+}-GC|4ymr-iRt@~VCm9gtS0`_0s)EusiA zP$JU>UsWVtv=CTdg?x%Y4cQ2Y7cU?z-&X;?6&AW(?Hz8Tz}N)Hy!sB*Gkmar-Mf?lrgbysj=C zOMj!-yY5~(a_BczVSNrFJ6ve&?^cL`YRIW0bt9QdwC!u=NjTR!eh-kGD`s`nS``{0bdWKgmqrRV(lUI`f+=EHtKN+v9SVf)Z&TaXKODzH&4gD zsSt#QhUZxgr9#lrWombZK~Y&+kGNovO+!JR&g_o5m_C2~tXm_r{>N%99Xnsm$niUl zq_v_r3h)>0+J}7}vb%PFdmBZq z?!l^DR#*pOXauz$|F8K2mCn;w88(GrwxJ|5Qe^aj# z^vj7sg-h|BBs)e@Qj#)EwX8vbj1C!A@SnkSPj@$zkn%S#h5ZCyPIR>5{`gxB1w}b3 ze~R1gZa!Jf84hUBYcM805r8@|9t};x#Du0n^Wi}_r^Lm9Og`FNFgh5^E=o4lx(c%)81j(__ef?9~c0UxlkQNYTWn~RW*;0&~D^bJyzVLLjZ(2b)R!`^9O`Cx_QteG0N_~0dL zf^t@_QL9(I@90GsPNvxU$$HO{HLOIg#ZgbzDFjs-Qj$uN=-i?)a#l2MlQa2;od`(Q ztl$ZOB8Gh;sG&@xWk5ecDLenmiQ&xt|{^q~sB?kO&&$|``?SF+zQ!PJrX|v>jo`4huJU_sc zv~a8pzlH-dQyWt&Pw0<_7?(`n;Nal(1flLIody}>W59Eiym^BM*0aV&?{*Ip1dZ_I z8U+m~7E=MMih8w${G2`y4-J z*p3+*84YQ4AX)jV#KWa&0T6$(ha^Kc4E6Q(nK*TuM-TykSv?~XY-@59&US3(TLi_@$bXAq$mW97*?|6}Y_~A!cML!<|on`36TH|jOqlE34#rgchjv|Q-LtHS@vknXfP+q)?X!N=9AOeQ%7FE zWoaH&BNq<;UIl$KK5qESAvuNmL#h=X6~SA&$=@LmZ0z1~1|@(r%;1X4NW)Kf#O#H? zLLyot-0d9VgR_SjXN>z*H5^o%zcI4pS5-mPalGOsIKUEc`q#N*df^(YM;a7tm;lxS zbBUfv1g#cOx(O9G&K)t$0U&hWe*I_q>X>&ld1@_^L}hC`>i5}|#9@8c_5Pf%?0R?Szc$gaRX(sr3MRYnn+b(V6)vzXBrxaLr%As03Sc!$zkK_#@u*5NF+a-7+sVhit&_Dpw!^QXvgoc zhQf#%(uFQvpazL$hIe)TgS_ct1itU%|E~3se(%gueTGKV)B=PiM{zaHzQs5JTdJmx z#RhvcHDA>JZEIXYv)r+L4?`j*Q^LZEii*A{r?i7yI=YjSbL5~T31uRpkl^x{Nt9&R zS1S_Gi2@|=wt7Tq=1*Nxv;YXh48PaYb0GhD`BcAuy}!0lPoU3{7Blpjd-L<_*^Ta- zv+cUH)N*~Zsp2=Fu3o8TcpWeApo+EPdp68B?+da}U1NDL@>s_`C)~+dA#!iLDmtV`L?L zneKVA?FL5-E2Ih6w6kZ?is+)OK!jgXiRG+CKX51kYg2_p`1trxYHFv9y}~c82?@BQ zvZkz@VPZQtT4)LM%P^0;Cn0FFTDm`gB(PkhJp^T)QO*vsy!6CXH(-^yY|gb?Mq`piCw4Dpm%#@PJ25 z8p7+v)ey|jDg>yA#?*HzkCzM7W3|`oqv@}!@Lh#{IhO_gb?tjrGol@9l z`G`Gj_RiAd>ma3V0Zk5AN#_O! zuwV*7yHL0Axa=hRAnm%s_ox%^qex3L?S7C&kXbaHtgFUgph(SaS!FOS>u*8=t{8F&6Kkm$bksY;}t zoL=;T?9=*OwFOYH_cZl(`qtJVD6R~~_0Hdx4JexcfX-RjOcl^#rSW3%i`r1nwVPfA z@$|b=QS$x-n%$`mu)&vRPoiD?c6*COhMW-4{>J5oe4^nvn4O+{zu3kC^Ss5y;f*x) z66H!yR@iJOg6TJWkYl3b=O>t-pC9=ByG+PA7#h6JptyE5vmcX(<%sjy(hwAH=ZhEvxOeC zV*MeK1lc_Wlj*_b0`F-jaF{i#uVE@mb za2_nnF3y~mcl_OG?Z1ls2Gkm`K?ZYZG{S^RGzsMCU2guXE=`hWR~R*JPrR9x%2+6k zk49x6lm=lxI~pU(J2YF3b zugw?Z)$s8rrKUyS2O|#j$bxaNTi^ek!Q$847_PxeAgHyT-q8e_f^G4$=|4I;dTsqE ze#QTG?N3p5g=aTZsf(F~R->S&a{_%}`$>D2l95&9i~A+WLC6$Mc8RvVi$j5PtzIJ< z{AaN>Z8qAL`O?cJ>V^N^d5|i*!qf`V($)99#hheWYI3boL^w-I&UDMWXGeSY1T+`*pC07M=sukGTQN%|^vg9KEm!Y+dR^ss=LO1Zx!QKj9Qjz| zZ{8$E=&=Fx79f(zcPhl_i4x_x6_^ z^r92_zDdqOjxS(8?Wm{{PsBlRe2BJJ-nBxDeY_(ukkRp)%mL+LL+i~r zEmp`0w^WITxSTDU`W3a!=hU3&$nd99?yk{M+`+H``aI_R5B52k@sH#LlyNGIF0w*7j)Lqx?mzw)DRiRQ{m{Cm{P*$qV0co z(F1b)GLSA1cko`s2|o)WLah_~J+L=E55&lb2%wWTu2iQo4|Ll+Q<$?XS;Z+4x|*87 z#~pX^clQfTuF|$_noo~K-4E~Z-ZTmPBZ8ZCLXc?@gLo5+X@T|A90<1JCt+sk1xBFv zR8ZJNt8mN$6oh93p9u|h6wqjg1m={cv&QO)C(!eyXxhOds$^C&+VN6U6s++SszdbJ07f57t8l#_OV&jmE~Ox5vO%2NjeD9$fbsGKl}d$+?}!vE(({S7oS(FeMWrXy0xdJOjM*C7>T} zMrt5n(Hvy;;$i(r2?017wkGZSK3DVg4Ka^q*i)-DuAdSXN(X8|TbX*q(&X+~qlr`n z&e~X4h_?5O1{BZ%3>sM<*gL+~zL&{Pk4Tn!tT_F$Q08D$Q&V>NMF#^GC+>Se`MObS zlYxPu>l2K&KCdWK>=LJVMME1d_yqwcqW(QVCl6){cB|QKWO&xI1fq(jH_b>0^tGMi zUtRTO2ci(|IScqyT93yT1OJO;b{hA7`VI7cLVKhlG^ zZev@=c)j7_hwa<1#-W$sfJ|G5pD0PXm$!HS(ucD|?@L6!t9hmSL7f3QT=d|w545B& z|NMUUhBtA@a><>Ol~vj<`k`*C0R%TLX7ivG8gyk!Q`;$&3caW#(F;0`<3ZvEyP-A{}chxYx zI=N_EUD#I6OEzC#sHc3%)w8*t>Af13VdiqvGc8Cx8%yjw8eWye0yeP%wy_}bVJDs{ z#*PXf#{v1FUA}+G#2@hMvE3C-&CTgaMvtfXrmjC~zeUQ8j+Xfp^jZd->nPWDk5j3s ztx3#G38R=Ds^u88R%7gTNp_HdM#z7sIEB+PSes*N< zT1)C+zMVoW6Gu-^4@}##$HwinPz=WaU69TOZH}Y{jSlM#?SlSdk5?T}batn1#q@_U z@9xB(DDO=^qCY!9#k}^BJw33dcm+o-cnC>)KF-w+yeW0PEK6dW@9#%5YVoT7E9R)+ z>no;o3YO2j#kUVh=R-8o?^4nTPXet3wuX`DQee3nth7n6+}XdS9vpu?#I``=D`*jL zT4{^oFM4eOZui{%ZuYg+rs6#qdCwN!zq6GLbduDfqM~4W2JMc}nYB!xDc7w5y!efB zawv7reNu9Up_xteB*10ZWV(Zbtl_V667oejP|`T?;vLvsP)Y?*f+I3NYn|1?+3E4a zgv&-z^EqPXu5|JqxGAd6Grgc@l^mk6=w zQWnO(=;*7Dkr@O2R2BpxiRKG5#2In$akIm%EiFZh=iwl*d?yD4xOjU9GJXkg4C_v9_?N8x zolBgQx@nbZuCFj0jEiTt-^uW-2@)WwSBnb9KJ@Yw4RpBb*KdDIWsUEM_;RI_dv*7! z%I4I(?0Sy@oUH<915G!sPoKT7q>_Fj3-!(>wz(?cs8ECBa`dXOBm3s4&rOOBkLQBG zH>c&GpU1)r7Yxex$u`Y9a!c_sJxVkI110-Llp6dw@zF9T*E*diKBm~HOBHD0nTcZ> z>i!8)Q9)huEXFCo+Tb^6lgQ@C{%B%@Ct7G0HOTwXzPXhxI}fX!AX#~YdEh!D1(jk( z+PaZrp@Ifs1}3Jk&G)M6>WX$S46xdOfLb>f9W)SwnpjeHc0wfDL_Ax8VS>u5$vm~i z1{{XHGVZzmum?2vHRrvpR+wKIcjl3M2>NeN>$skFqZt11BLj^ApcT9KO6oCkCcCoh zLdAJLnKs#Tjpy2p4VCi?_H#dQHu4e_{t*fY`{Sv5tMirCK@%T1o&ZK01hhQmXMW9$ zD;`h=XARo1dcT0ymW*ci)1^c@<@q)u(6YW%K_k8QCuqi`Os1lc(0%v!dL(lmJ;QjV zw=-07wW7h`doig1F~&Ft546#FHC(@35u9rw;|gC0*X2wE7ZpVp4L zd7NvpOVr|EE}~vQRtc;l+U3 zk+8dr788zW^#lnmasiv|bi6Ywm*RM)2;nl@>$i%esPxX<`7Ro_(g(Yk+)_+w0*WEg{7rnfp2#Bsn6sAd``9`PZ=kbub<1qwsA z*!6U3XrA8DU0xsvl4{sl^Ar850d+1pTRZZ9+>$3ubWjmC+RLkuxmg=y<$J&Jg;A2s zJ1HvxPSwKP`R41R8Y@bcoMQ`Gz+nretWI!OUG zpEz?oO#=9nyhCr3wUPe6u_d+IvY%4oio=d+*%%=K`ATak9&WkQLrf_`&cw4J?a@@cW{E&m+biPnTbnhUMj8P?EM>5#9^<`(#>m!nVB zIi)!luepbTk^3T&gTyM212an=t2$x4&gJh6iX=n0>jT$tW)Y32NHocb3;{g-Vul&< zUHEf5eOQ!jesnPZY#0X5IkVaqc<-yvd8-pB&m@btb|8j-?nSU76;;fhw7E9OyGek%iEMx!?uIPhCB;eoF8V(O2nsNB%SiHSC{#KjBvMVi$J8Ap7#- zfcJ_hIRaIO3-I&L;bujCO&5|o@WZ>9nHI~!uI<0bjZpat`Io)P%1ne9>w2&KS*Xwr zGT_B|qRIu#@ODt<0LSklDu3Ldy1yS)^wK5@VcCB5L%fbhd&>g} zn@L7NLK24EYc`7>3|Sym&~uuOR=h9QG812lDL9oA{&vyjzWxKh}xii%U_1pN$vF^Wuom^OnB@J4Uz3m}eN<9Qd1zoH2bKg_K`^WUG#`K( zVuHd7oKsy|YaN-RHd%ZCb1!n~aBa=>{(AEDv(vcIu|J;5$M!d=VQjqYNo&m5QBmc( z{#!o0PreRLw%f&nqml9u(kBeD`%{9tfFEC8eiQ<&i9>3Sa5&(1^>Agg+#(1hGxS)3 zx0AN0#9JQUjIE)sj$LUVDmiA{rum*x*2Vo++|c(_kn!>Q#ZMRwaz`!H=xI6pq;jU) z`zKE%`Sjub3+-FC!xeac4+3Ov2N`*7s^Y&9`RD0I#?^c8cT~ZS3i*n0C&S*WX6Jk3 zOSsSUiD>P6vz^~xl{fiq+5-d^o>~y%P$f|cshI>Apq;xnyJNPC%-65|unoMAI`>FS ze*T%fA_(_A-wOg=RwY=w{TY-Y)W1u*6#lDh8`|%! zvNyf%jQJl*+{N{kxq?Oy@77v{dS4Qu9+!>5Pq-4z-fC=Yvz5Cuz<#S3eVAOW)(bw)?haagPoiQpe+#h7P^G|s4Jy62L z9SbkM-!0sT8w5Xm!moEL;3TCWteiq$=byA1W3yi*7~_`eDspjY@cx6!?Lf0flP)C5 zpDPStn|ed`*QmknURtgVh09J`hFagpbIpQ~46?zhnASDHj$Vw8SiSY__}!sJGT z%n7jqcwjO?gD>RSzw~6DQakHe;aGGRBKSOXk~mweBC994cz(la6spQ z5VkQ6?i_ftAs!kN7sp@peC#@i7#JTSSX&b3dPg-k)W9fN{rcE7;Sq`z>S5J$y0s5` z22qdRO-HOz<|^_o)lxox2;ugyXU`}gc|>)Ynsskgzq^P2pVq)i@D;FHLwvvd+cyH% zw*f~-)WPs$`tA9FEdyzossnM5hWlb`u3|E>vI(jx3q4l-Ga-;4WHePKgP8;-ym#8@ zVY&{tMm=U`48P~$mjQ-CbZpks6pL4+?>h%}iu`U~xNDPH`S|bZp8w0@;<@nzhK9fW zY8W4TCLP_<%aZJD225igl|*YLe)cWAUKAB7(|}7@XHm|UE*e&@oR zbxjYEvGwKl4kI;P>}zT7`bsegQTo=RsIKqdF`BrmyL*^Yp@RS0y*gHE_(jCQLB^naN$TsMJScwAd2-~joKX|J}_0Lng(LmvYu%efg9g|U`Q>fA7+J!Hm>^`vwIjQ)X^+`^kI+P}vtQ}WDlGLBB z>c_^sH8yJm5$=!Ih-#ew>;$xj1J``_Cu{{>25Oa;dfyrg&bR$SJ5M#G^S-=!`!-Jg zV03Nw}Ds%q~h^$qq43XC^f+E zL7VHUSzN=GTH*IBb9|5n{_q#7X&c&CUq5ik-o|_?LYy!{A0c+cTj!~_CAVCI+C}-S zxCH0)DNFi(`H)ShCoaIaU(MH70#S5r`)sMd=Fy&g^s&_EhZ~uC4+FHR0`NyHdDigX z;9r|njADt*WUr=wQ)CUfctU1oW}cv+d(U#L4ej(^>|*9;y~ax$8zkn86vZ+E)tn64 zRbz%3652wQ4>L)ObkwyJOlH^TJ1b6?lXHh!jx|&V0{9DCD5JgdgQB!9-@j*ae$G&& zp3n(%s*a!c1yQtT1k23JP%Obgojmym-_lEpYATkW`QaNIneo53M*6;&+EzVzf`z3B z;aTv_tiQd$Dk8AV{PnNl!NCM!$sVpEPFgCCA=P;6T|ynAJCf^|5~RVm`G_<5(C`9D z`y|c{>YCqM-By@V7~J{pGsVTPtamyieIKqHt^cfxvpFasI1CJ?(?5c_oA&sm0FIjY zhudoAvIK~KN9=c2(oKf>3&bR;k6*Asz>`4O#U)ij0b%s&Ku+kBY<*`>j9TQXk|fq_ z-?Q1DXb5^VMdKsb=Uzi?C(tKFZBnJPuv|OQHxWPvq0$ap$gBJLZT@NuC!Gml4#&IH z9nBnw{{H&z*l#+S1|8!vK0{nDJ>tMLO$liRTt9amo!o3YEG(?#Y#nXNttn+Uw;Hbm zZCa$)Z2|xNRop16a%-Yes_xX83))BU^N1z6=`Ya#L9e!jjS@|?E*FnPlZCN-C%lE~ zNLU-2`_-DTN2*k$x_(kdR=3Sq>p&hMf8C|0eB#}l6$Kx9_@KsNMQb2aoCrHVnBGMz zI||0R@oQt1iYAIHv-sqePaP?!sd4YI-$j*crZ6~z0D|%Bw$5djl8+% zFYDafV>~7hp+nU>qYOv}tZ^FTB0p7Hl(4-H>t-TnI$1!wi${ z*BmSa<_?*%9lXv}ytrf{tM+5grcXA69IGk;vZl&c0UhA>dsfkLrj_xA%dc5Ivjny9 zTQtJ+&tem^2LB7cg5^k6VW9_1CK0AwfSHO`E9z)%32@u}eQ#4{`LCI(orwG0{IVTc znqF>bE1wKii-4qdyC?w!LnsSYcPFAFqUQfD^~0DogEnIKkHe@NXRO*jhrLLFSjDoZ z6--^x$)dT>R^M8E?!r;uMn0!RL?j0$(hP-ib|hkY;O&nq`7qrERlo*H-tE9rQk{$A z-dAqKt8CpNJA%({I7Mv{DGyylvi1md@bXG{@A6>6kqo5OL~DEgHZ5UkWiFtr!Z4BL zy)L5KnDNP0&uGA7S8(Gswk>QSz`!{wDxH?46XJD*>piL#lh)&!UyQfiuy`;@ z$gt+g=ZQ3+lIC5&5wi`Ey>0iSS(5&Sb9{HV3TRCW-VJ{n@FB>1!}f6)zkL}x`WWuL6ys~#Jja4bpgL6((8 zI?zp^S%$haW=Lye7y|RGQ%3kOu@7Iae+5s|X`Z*82;Fdg z@PMNeZ`|Ud67=b~Ic2C~LxB+TKhIgU7B{-8N*MeM#i?P+ ziw&3nH+Hap;+KvUZTARLO*cdaFa%?U&`eiwRLit^!or8%`4Po@I1u?!WWrTQ76!DR z;sGP@agim`VL$a@xBKRhhb(&%kJTlDBD{nNp^wGBabVmhPW`l$+`j}y7E^hg!q@6` zy>uh?+CR_~0cD6ZxtL&L-d200Ng#w^fF?8c*#RNY|Hc2B@N5^4)zq(FA`gCRW13t9 z7=z@x3@t)Pmfp}LH~$fi&QBU$h57Bg97AOZ)pKt0aPlVzC6>Q`RZc8!r2Zq#aPsnV zO*TV98X3#+F)uK7TzgdRUDoeK!h8vgMhe9`@K7l08=*quZteBPs<7-wA*?ta-;oTk z=yxDP{0P-q_1u~N=swvWjYY>bbNXJb$PIPX&S?(jt`h2fU>~av7!wlnvq3)ilJ(>K z(;cN@Z5={0MJ({alKBN-iMS(;*?4&gR$s8KSug8{>b!Yj{aFIZ&R*`)yvmc|bQcVg zZ*)S1tIk!aPUv%e_9GBqrowa>o}m%6xahinDP;3vn@21CPF13mpmhCAqc)s$_44}I z{VAn!aP3E>s{JD_B|{;6i+cxNGZ5O)rlDqSL`vTPPZnW-BoYf|#lxju4x7_xQMbX`pH*I)^g(;Y74C zxJMwxIQ%N%D)}3T=n*Xs;_rE?kM}a8OS;_eBa)+W<{-3V$zNUfV&LO7?-$#TaB^~U zCDrD0)*U&F$GE4hECr-Q-w8NSyOkOJAu=cn=ekz*Gl-wDt16IgJ475GQJqOM6sy6p z6#T}W0d6zacv+`*kpboVV{LcCp{a#?@rLyio;OAIx~h{K>iRBm~!JB()_*vc+r@Q1j#jD@%Nnh+8B$cPx#RHT=oJSG-M%Ng#)`QOe}dL zb<3WM%i@e36AOvo_Va2&N1sU+%sSw<<{Q}ptTa@hTh=Kce~F|O+=~J@2jBZD5jZvp3OcPDt0gwFs+Tz zjRh}Q!XK9wT!TO1`)$r>Fc#GL2j7o-#6sMq3RcwL-|F~#by9M36BZXAG)T-!{rzgD z0LhsS8Wa#gh0IlMdZi307NoL`g+&206WWEI474W^;*l`L;{qe0f)L46WOO&l;RA&QDx&Wo8Y>2oS<2^6nA<{c z(MCXAVeUDe=>EF$a;q}W2TH>tkDVp=7&zajJZG@%xVAmLyf8r#=cx~o;Gf1s0R&I> z)V}rH@qWzur|CdR(qAIaf0cKAx`jcY-x_L%3|U*P3c0asm+$CILh9DbQ(*jCsq#nb zV$wGqh&yUu`q8R#(}=FrLgWdsJ_6gUlq;rP%tGN_g3*|+(_<1xas*y@q3N)OB;_m^ z(&Gb(sqr=5iDE?r3NyV;#%TR+b!<=#dA6LMHH14E7{4!>(_A*O z=T0*ij20hASNhC{gFCfjZ>=X74Y4wa{;O|h{u^cD-v1|_hBaoIoyrrW$SYWcC8Jf4 zI-fKX^8QGI;Z|6G%gB-#`rcjngox(m=q$Q%gWa_;QpikvdNgIf7LNHbzEHs;<1v3q*q}MV!Sy-Udm@x?-j?P z8~Qd^7huV*x-V(~ks*J)CP@14-+0DIpwwbefLG)^QIILX!+YW7D`8yk82ji;R>%8W z>V3D%<)1^{#v{Pfp4O+~cyfA8h-$3d&jWRvRjU1WxjiFOV)hMZ1;7YEwOh3E4*Tih zLY23^(DD^|T)^bq&J)G8)yl^!rjqtqZ+{18d4j~1$d@lU94}Vn=03;JSg3T=G4NFO zVDaqkqHmpe_sO`9*Hh{|nSDrfM;zxMC0g$M&?b7?uqB+Vxy2GIkx`Zq&b+pZV%gzr$t=PAXk$kdj(oQtS>b`dQ}k_bMvcDcwL%9$IL?*)svV$wl(=Id`{!fImpw& zgigUP*Mw0YO~qeA+(m^A3uv^gI50(g^X82bWyy=xX2ozkw=c366ZIqj8AH5hy2}C+ zgQiXH^Ej7b|1*1lD9~aoJ)sYGI{q#lK3-6Zt|PlaOMGZ~SK53unsbpui2X?l7z9K5sZAn$l@(7&e3V4_D93BQyIi7^uB z8MyxrD!U=~8Ch{lMC;+H2b}h%jqbQW2?(7TzvoSaZhl9T>@hDk9k?c#BN;^B*w_gA zBjy0AUeEPe7g~CiYW-z(G-pFNP4j9{4>6T#OJa_$zAek&mlTJscI681^bsgCGtgyu zJ}}rCp0#%+E&^b!HITr#&OQ=DA!Cte#^l@~8u)(Im*E4pejkyM71PqfJWlOp@c;Wd z_mPzw)e$yboYAyh9C2S3GLK)e@Wo=3@{WLsKR}j!WtfbfFOAy)DG9hgLuH1-5dOqA zsdwrEDVHzD6JGg2V*2i&^SyM7*V7s>?3n-YTRl* zie`;~5;!}r|IKhwjaUC=@ETx%4OK}D(XVv5XMc9TU*~%^{NT~tK7QG7(8s0>5jVE$ zfd`C;*>sCwMKE$N4`k!ljMo$QMMU6~pZ+cqb-OS$52797v-^n)KmUe0xL@YLvl$pUDjy4-hP7;a6EGPzVy zRx6R9>+CM+?2`RM{@@&-%o|(@A6)ThMVQR4t;JoCTtT%rdpoj&g@ulD5l z?ImXAZ^9v#zYcdEj`YGwIX9Ya(NmJbT~W%I6cf{a(w}a#o^kad*Tp#ea|YelY{373 zA?E$5E~TOQqdsB2&d{@y4tud7-Uv^15V z4+M;6MEvfqsEuZ^&Oq)BQh1;uQol^P9;6JGwIrg)ETTMmy))!}gg{q$D1iN_vxe~s8WZBKO{ZN$l$*of1m{O#F9X(ys!8`!es=*#WRWjND zrZec4OB0s+mfXw4J;B8+P@J>Y26z*^mTA5p>3DjiP_qH%#u~;nSO_`uI>I(Uf@gin ziW(T-7a%_8rIb?S6Qwpu5J(cD&$1Oa8zxEN|M#RXN23zaxxxOce5c}%z z`sxtC*P$pK?WeOgKT+O8_sqx4ypRR)rKs7FF2RXcLAIJYpPFzq54vSMPjsj(<@c!K?bq)%6R*t{q0&%b+DLaKh+xwpg1Vyp(x9lJVf@g?`_+z1 z9X(`2hW>bB96;@3Yi>bFuDVsqigH7 z5I)-1_Q0$r0qkz56JJSZRdpLsFfnnKSe5PVZ3QKgw+Pi~^FFyp*|XXaxLvk~WTtK2 zB$*|jc!c=oxvn0B+#}c2ymil1F9KNGZ|)C^jcAWH2Qd$daU-2|8fJID8m%Z6`k#I1mIWvVN;ySNQpy5rJq` zy40FNiOR>Xe@XS>G_ab!;)}PG1*`f$+;>C2|D2D%3%FrWVS0aAbyuHH(NdbSdOQ_d z+ddpID=ppeucY;GFG;>U>vXxgQt|^kMJ!8tKkMZ<)|7tMluyZddFHPO{#*;ko2whM zQ2*95^R(3_X{s%5E5=H@);adz(cp5#BY;p`Ek_=2mI7|PymW#!0>#^fx|a)`CMF0~ zjQ8&#$^Pbc*QKW#5lMzsJrQmT$=TU)K+C(GEk&Ila>V)be4CSPSuk|<`2quaRp0)% zK54T^{q10-*@>;2-~^&9H;tlZ4vJu$e4jpf=g*ph0CxS=%-&xX9hXVk1GW{&3af8_ z`v$p$xs8o4cO0QjEzu){FJLCbe6-ehCu9Ftwg*^#P4>nVkc&?>HyAS@WRQ`ES6 z+q_FXl4koJAeMyX?!Uj}qLupu9&`>aF6(a*1V;Zpaohddu#GV};M94)Sv^R(sUY#5 zNFBW2osDJ^Lgvje`uv7$lDx4e(>jcM`h1WuitbRO)LGoXwHHyyei*cg9wbtBT^-@A zd~BD(b?5U?*920NSI+k$h$;i+#sCT{HO%Tc`0%c7Rk-%K3|r4#p|Tes~#v4 zEbS@>&P0wogI9?ch|wwK)N+imaYVNSUaAb+Xj7buu#1UNobt3AHYtV~p9Os&jQ*R?DuY-o}kkj-QPFl(69Ow(O>Ks^kv{|h; zt*Z^je~xxI41LG^`5%?{y9hGDd(tfC?U>N>u1>vRY30c^toxUDLmk`kMlb~H1mU)G z`ULvS^_gcBfz^SM)8^F(`Vb4x@m=h&=R#P9gs zReEc-c(};zbo{EbJPc9-k0)#~sMl|I_^TTqt3M{m3VqVtQt+vI+HspvjtUb74Z*1~ zidVesMN`khDM@E>e?uHlG}BARuR#&`%m@O z^HlyD?=N51!=dQHhB_{<2J8?K$)~+_9EVn_FiHvrXRCl&bB0N1BC~W948N^Leh<@% z`-@3kI%obXY^v6i7t|*k#N>~EY#ZTRiAg|$x&n49YKjofCooi6?X3dksjGZ*L4Zj@Z9R?DM*Jp05RBY<82JYtQSG*l|RIJ(p1 zp25bZ?D~DXJ^%ITp!{pIku>IShTqN9d+}GAwi377848;=)2_zwM0;g>hrGp?IgyRU z94n5x4tqTb3^p*U_fBw#13Ro^reixHZaXQo>{_|f9`x-Yh47n1CiQkT>?{mJY$5Q2 zGvn7xsf$!98k@D}g5w_^5@A{ixVAkvzu^`_bD+35uXY zLL2WZSNHa9c)^dQG~W^sBN>E|@*DitE>mnxm5IE&&6Q#`G~3||$QnZ4MnUCAz}dD$ zDLyWB;zF=rhUvbwJ`Ng%vrQ*OdvfUtx^yVx{m=)mHTsHIB_$fVq zIux3f-+8o6O<0>DPXyWH&aaF;t^%w$anA*6vKv0W;*eD;y@7T6eZSv16TW%7Iys;p zJ6^-=w9K$_b|pU;;?D;J5|qHo&&Y_8KR?7K?rH~rIut?M`}ny-gvSp>)$>)I$G++m!;ire&?&^C3B^%EH`3)Pgaxp~dTezdD`6=Gv& zubBwb_v`44yi`_I^O4}tlD3+Uq@aV~Fd2fOm>^q3#B7?O1#l~X|DbXEwhB0W|GIk= z8kF5L);tXyvIKSr?pz9K5*2kN;ST(;pHuhbg5!Au7H~9A4NJHQ`x_uYXa$@zd%shFs%x zlbdStd*df$0(Vk)doK~QP)0BL;3asHWOlkKFVQhq-^YG4O<;#q|EOb_Ys;X0jZ6vf zut*x3bpMt_suVo%wIff@?)fi9e6d-~k-=^;Cb@~0mpM5I6>FyM?Z!dqxuCh&DV0cl zPInG0On+EGsH?isa2Bdbx1D)aM9;6#k8w0b68o2)UH>^J?><`9XFgu=Cr_kD z({%~AIT_5e4H%~OnHlDDEUcc3v$L8nY+E4>X#yV}VVq9?_SPB)bzf;k=2r<){zL%>i6fX99T9M_4TrD$r0rlPwkn3sgX>u{NN>VHP`p z_sDhmcB5HPV9@ZWTAKeyb!N9Q2H1Rn0XINm;l=OzGgD&3?8RRmjV#=Gc$_5!i){z< zFj?kHbTbs9nFGd3WZIf#q}WJAk`>`DSGH==aJ!`l+V%=Js#-4hG&3asg;(Hgf3A;R^A^0?t&`Oh7>Q zQ)>|5`R+`i9lrh%-rvJR&9M=s>Iej^ZipjQV)P{uN(bdnQ?%WGAQ8!oMTmkn3u?4Wb67H}9neVNK9RqvoKWY(e? zTAGVKsz%KNd~tk0aLbh}Y&JQWo(OiK4BNSaGXbOf0G`2ewf3W0=lMXJl)nzW)p zzjNya_teRH2*SEpSjrSTmT(b?=x> zTs-ZT?!G?XMwSX49i7p|pVz-uKIy(!W8_oVMl(Avf6XA z0<>NL>*#yTlOsRB^?r&ix%cs|?Xjbr^EA1RPj{ zt_W(&?_b44{`>2(c`g3>t2rQ@k3ON!ar*UEpC6;>+ypO;muIo0YCN9{-3MMi$lk~1zszM$8d#dRM#`4|TpojXDxVP4S z)nF?}lPKHS*#*sL$;)MzQEWselq=-mX_ruLL%M<`f+|B^ezh45d(tpGy&E$@_&z>9*@*zakKSsl z+A?|L0k@-@On}_0^;Qb$u7Do};CWFI3?_Y+(d7I15OoR!yYU(an&mI~ur}v|0t=bz z2_)Z4Tl}f>E6q%zs3ldR!59O~wZhBIXWlL1!*x$Dm-|!BKH2GAA-+%_#n-08bm;(^neZIQB;*@rvX!Al z3f#F>Hg-uh^&w^p&SvEa^1Wf8&NBTM0u69mW0?6q1DI~A_9kVwkOi*68trJ?CkD!n zf4lAK%z^Eh8W^{~eHgu)4oaa?z@jax1%vTsy;c^@ob zDb#({cAmi0jJ(zn3uzugmxq0-n5j9$7Ftt@r zNfDNA;fD)pcmn+gwaQ=DMm}%`s>>x=Tz6i4p$UVe3`qxrDLFL0B|E?No|OUu^K|Ai zkm@p_i(oh-;`WV0z`S9o^vp|&5hFUcUuak-FRl9TeWp%*{#*GRV*lFM!y;8z|7re!Np9fS79&wFz4*Zn{$4r5GJ?VUgq|fN1fr74QTTt_i{3krF-lYG5>xTkKi+he?+g zLzuX=HD`a8nF=+-9iU*}q2tKItN7SnN;5@Q``NQc-Cd%CBmP!db%1sgx5h2i!k&FDeN8Z<2nXF^ z*}iGk1bkGp2M-?>!juPm`Q{+v!$2LXRef95v>z2FCU;7Co@qC&_9DNH(FC8L=itpz z{$!Zm+?>shb3m22#v57$kO*eo=-rET2_3b&@>d{Gy#?XdPbQEjm)kG-d%T1)FKDyz z_&if$+zx59f+Hr5UnpWg2Ht~lD(Nc12r|r)Fqr71pE&nF7j*UZ?&-dnvfa5oSEuy~ z!X$-ye2o!_rIi!kyNV2|mhJ&~4wkldbaX5oZ{Ne@+@C_mAFQR$Z(qN9$pV4K$0a3c z$0ZIY^iyR$^|pOwT6y6f$e2G@Hn3O4)qrxF~3iQ78 zMqC7R!$$A?#X(sRvEBS-95T+7mp4j?(By@jr+L}f&Kp2phAJSKEi4Z8lEpv06(A%e zl+b1S^iupKd~R`Z>iZKDBER>j&!?dWA=uf`h!LKtg-NLmfboZlU$M?*GhgwRhb%Bucf)}AwD2P-T2Euh;<2&2OqxTTczl7ro7Zj~wP5T{~i4bEe zp}?t8Y0;Jl`xew6EC%&{0Xr226YUVGH9=v`FI5{A5pinUAI1o7Zj9$1YAw(fN(X#K zM!Ln=*%w+ZHMAf1210SqhEIGQneX>U$Qh?r97iO)WM z632-c(f8k_Rno+AJxcL6yV zzdRr<+;+?t79LK1a^5SFDxtP_@OzShDahaI%r@VxygT$u*4*frdD+%v6~*2ragIEf2AyqN8Wpj5S%kTn`0>gf8j6zTNSDCQ#SuP`LR{cJ#N+6XE%k(XyxM zwgYz^z@`m)r>)*umAOyfVIViRSpE&{mBIYpys0LvarM72VvG+9Lq@yl8{jf1g?5`# zm==?=$jj#w9-anjuVRllT`wr68UHfHn8066;1C9|k<;CUr15&MGJU4+m^%!naDf7p z1x(_w+9ZNKeCgkj(Faf7UAjz-!*6b-A@4GEt&(rn*ncE+{+389Nm0S%YGfP-H*Yr( zTB3AHRJ2`1AQ6V?ZDx}JYTjV@@XpT&LtX?tVpeCMeD7-%*87T=GC4Rm#3L$nf^S2yyl1nUR8ynNf0KaYS`Re3k_{(^rP{@l-E_GY{b z(){3KUR(F$<74a3sl4L!gW%_Yt_EC{6I5R$+{ZIoG*F?iN#h<%L=+ovbKyAh&dj{- zhRk@21>_*u#v~>#ndy-}_rEG`N3ZUHHdAQEMbY^PY`u`@kZ^ZIVX76m^s2n$BRJY(IIV z97>Zno#WvTdkE?s9AE&NuX$nb<$I~4N-kja5u(A-g%3MogsRK&-;gXWFVBZB_4kuG zi~arE8HP(V)S{k5pKu?Nd|()(4mmw<`Z6ZFooS2V2$V6usgoQhc|(VpOn?OlsyyU# z0TVpsN0;Z@PJdXf*!}In*{1iKEoyux`P~(S>EBS5B=ka@N&4Ub3OI7AEAhVpcdn|= z&Lu?;O9LP7zfNVldX+pjHdexS7L2UpZ=D!`!BQcWpFpp$Cx@W4A0>D*wszI#cvm!% zeUOAM40GQZF-k!Q)}YcT)HBZAzyVXJ;S$lj02guECM6wRY*+Lp)=jwf9y};0C_upE zAKuPNAt8)L3fEh-9I432^@2yRi-f1>xJ}Gkpi@cN&1O}gDJ#jivqYaZ&?1mY{&X9A zev{rLtFfuc2KFV2GhG96oXHRvDb-pJ*&Ya}Ryj|#qaxwAFDpm_?G1pq6(6YJ0G$xv z7=wab#9iaNmnPm|83`inVYUO|FR-TEvgw_#`19RC>~jBGjIgt_Cfqi@=*1afiBa(# zj(6>287s{jbsjHSnmY?&7O_G|B(ODDHt&4q0z(1Gz8}Nj$_&o%rBzknD?A~f{t5KAbVgekedWMi!po@=acnDj}5k?L!UvW-+MjY3oZG96hdFWHvC zhGW8x*aX*37~Zy}ml<5n4q}Oo7ulKlQ^o+pwCR|1G5l$_s0epq2VWZOOR>Q;{vO9- z2IZ#rD_>M%jV_FQO2O>#LZqy=dGe00U+E4xPw4tOC%^enBTK9&nv%?H?zf6XX8uA{QWR;AsN!e#U=Zzi3wLb zwBg3vSYj^IS3tVY30K!wX8i}`d=QvD^3fQ`khH;TJ=>Iqn484uk!&T8fIv6weP|qnZd0-BxuBcPPe5**@Ag%U?#tS?(tEfP4uN0le7E9C-0;f!Ln)jKNg0d(6qVv z^`qzZorHQ7h-%Dhq;)g&B{ zhmURi{QrRB;ds1fc)B-cv4o=t@+~-cqh_ucM7Nlun*bOknd;KxX=l6n%o8c#;#;6knDGg#L5My z)qZCrt&}IvX*sc<(L5+X1{*7X{>0X;{TSs7cUTcJtM;6DOV}n2wBd@}1Gi9UuuG}= z8wQ0F=_8>8hFzk}UD}Ho2Y2URtEBKQRC}ywnKt_lH{4-^i3icfrIpRergZ*K8$T)- zFe_2&gM8|Gcc=-sAAA#i%5Q>;{-r|nh_jpu#x}8)kbkZu@9c`W!q1O;vb#Y90|w)^ zJlGRcXo7o(4Hl#9Xv?)l6XXXS^NxL$Wnn>p?yLB7f2yy^b>b>F3y$FBL1ir~Rym8d zyh)kIpHoFEKH5LYg;^J?a`X#{^E~}^6*l3!WSy?-BdIzd%8z?GM=Dtn*%rUhUHLjn z1f}H)&d49n>pnl~V4sIIEUUy6pfA{*Y~1yYGKDS6RO;}lsY%mPQ;kfj&honUo3*vaKF*kRhZywC2taD)zRx#~LolWnh43Zewr-oGK72P+o-H!!M53lO0o7gbsg{+GKqXS-2 zZ+Q1{>HW;SZ>w8b#t)F9#JW-M2cH5@rXd8lcXvL@L!!LSzU@Q#BdS=HB{6WF=y7xP z6~*l32Y)VU0}yw{-yQ~ynImC{Q+SR`8aK-_sNx0DokxR_cZ!vRS=HVvGv|CIidgY$ zP0G-c$?F~X6hL1YyqD+a>;KafVf#q$Ed?8P|C7=LWVJvUvH+h2VLwQI2)np|4WtH> zl~=cO?Z1EV`SX*SxJ$3;!w=4Utm0ZzXk-b~?T!$<-YD*1V^I(j01O1>QPI z{C48Z+m9+Td2v|h?Qs$Lz2AX%BU`KoKQuQ%eVpUNL(3`K{L$Y=ur3s6)Rzo}3^#Z_ zSH2YOABI8C;cCBdfAtuJ()MTNuROZUJUV4NPeCFL>_*i(OkRHfNC-Wxh@32%Nx_UQ zF!1NLi*us(H$uY3Z*c-!#T#8myF~ZpAM}wyA3l-#j^*!;lA4;-%E$NO@WB|~V$m^m z^_8{+Fy&W$|Fg%5;856jjM%rHZ4VtKM32L@G ztsLHzHAN7pufp~CV0}6ow(&BGwyL*Hqs}aOwesX5eFQq+v0DVzbk=%!ScGE+UMnj_ z)ddJ#SXU`F{DX#y3UXqs^772~-!D{ERW(F8s~bOjcmXTxG){I5wH?l6Q(`U@H?9s7Gv{ezq_5r|-ZhDG|l`(N_(dk z0A;0reI2;l8b#uJ7Zmx@toxE#`(! zH0Js5y`$wp(lR^*Lbzp@qTYEz=kY(35(<_I3>QUlu#>WJa^mW8-Qnv!Rzh`vdsSrb z%MFH%2>uS5wK4Xo2hWb61pk@s!nQDj-6!eS^Ytm#f%z19{k&ODiz^lpjlgW_DPQ=* z{Ty)9>+waxMhz-L+#EAgu&d22F5&<~2X<^K@uhWs9HquYKfSz`l)RUASHv)_AEB5(+pt1wcc= zOe8Ry-aYV_iJLE`17I~ubTt07N$VBxl9zAw?hMV(e~dd^$qzx$h7^6g^&D-e7vJO{ z|31L+Aa9E7!@QYkvp+;uDkG|N2)HAWT3^3HB6XhYEyT9t;)uYBZfa^ax4upcA09@< zMX{F65(@>XVQ&S-bx0tLIJ88gVDTnQNRsh5#)yjQGFy{2F8Ka-`KU406(t|cZ}3eJq4z(K@+`v-i5)umtH zG9pQ7qd(m~JJ7gR0_vZ+??2dx*mxo0u9Z{oU<#4&hJ)3_TEWRe!?MC_cbCJEzljJF z^7Z-PFHM;CdoGy%`W|D9q|4WiD;IE)fmAk{f$FBXo|QA|fZ(c`qcpiE#^r zgoFs4VguEtK9r@FJ|a5WWV6Q$k)s2Gb&Fj~ZNA z5Mao9wAY8*itAf>X6Q}$Z zENshgFcC`cABMo;?=k{O@phvYNzZW+gj!*v^MRMaqDRf)tA&Hc`ZV82_gy%L3?6PrNTfT$Yg?h%_8a2>@ zUtU=daK-W~mIx6#i!9XW#cb#!cKwc09yGzPa$zAMXIIbr?Vl#-wCXgj?l*LTp9c2G zwtuK|z(QCA9dY^}Y$m|Y-f>29-&7V-XRO&^3bHPd>y)8JoobXLQX~l22n%*ykMDzd*H#J1{+x~^??EoG>LFrAZ^d1P1P7->RCP=e@yKi??b>;5N8cPiepX4o@dpDZWtm_EAi=+MW7 zrAYjySowf%zbwBqBc<;LW%@r-yv}PI9vi%9Y_&_YY3l|B1lkGp9Cln11MI zuYLm`zL;^e-oUaCjf=dp^|y8VQvItRKe5?66s;Ogq^S5YD2*6XNTOjVpkDyAY7?su|+c;yxZ&UF->oqJpYYz^$s?Pd7wsA z=jKnowRXbt`$rG`_~{CLmmXjD>z1+~-*t7&bHe4mRCoH~E4%v58#i;xkhwKR9|?VI z?W@HiKlysNSHPxfe&5~Q=lKJ#PCEGA$D?Q6Q*1zF<9)LI*6b%%6bTwGn(wA9?reKU z<0jp`9un_5FI27a%HN9=izqQm3~S$cesPoe6J>teQKZvT#k*$Q=JUpB=~l9-?)Ign zdOs2BRbo~q-d-#CocCUn`InRp8zQ@OeRRixx)G8x&4u2 zjp8bcq;Jc&C;R`kLFAnW?iD%AglP>=o?4l9yI^0%mss+zrA`g@oqKi1cd^Bn%zLlL z-Z^))iTEvO$c)wPzbQFu`O5x>mrpzLdzV&gYkA%N?}s1uy71b&ON#bw-Cu^2_=sT8z3g^_5pdE+`0mb+prjJIj{GVrosvlNH-!%&ikL z@PW2VinqHvATd4Wp~oNp%k;WGrg(1}_}qiH6)pPtFK<4v$7{$lZ@&3Z?=Bgux_(nM z{)gU={%2x~6AzAiDDWPydmn3b|Lbl0*57>o&bMY25zF{5e*3X)?dfkOo=jEhhs@X4 zj6QqM*;BD`lb>r`YTOH-RH$}nM2jj<`c^owY5XMbhZjDUe0od5i+lDBd9i!Pm*)!u zUb*#!+4WxV`^#%}Cj9j5#B~SiK2zlIq7Qp5s`A_`MgI2E^AE(l^GaZy_#fg{mnpNk zfAIP5+N+;x1)Y6o@|xjgD?HHc%H@-t&tG1DDz

GG1Tx_xkDhgI<3Ns~kV%zTy1&NYi4VOb{$y+XGpx^|1pi9kefR#)DZB2-h<R}--KTyW_k7L1%NvT*t#`)Xo;3BF zH~;P3@Bf~iGvuX(3oqO^ruA1*fXj=gc#AKTz$#7R#EHdfYd&bVTq!YgetXwZoUMmk;^zggUzM zVvEP0di>`*i>tqfJiJoe*Z(Sh5mtumn!NblFPc@73_h70>mBy=tM|=b`=7*?8y59= zbWy{*Cq<8*vv1s_hUW%8@?7AzuTCC3aOl?8!_=T+6|P=faM$rBuZ_8U^0&X;8Q#X% z|Ja(pYzx0!>b}4J^}W^s$!hjH?<6+3y@LPF#U&~|(xI{6{Y#_0UcK+Z^U;S|{3|8# zg9Webdu!0zL&N$8{rBCfr>1={l#*lgabvJ~BJ-m1D=NjTjq}*|pZB%q0_}|9fZUyI(rCcF41H zD%?Hi>A1Jw4*I^yU8jEdC_>FB*Jj#+ZSBurnbfw{z@0TlpI$V##-nSRebQoQi+elP zp8UcOVLvsTe8#WXh@EfzU-9I{ei5-D_g6{ibzjHYv6cGn2uhC`)-8JIXun4~e0FgC zsoz_@^jd1`x5}5VyWn8yr1W}4U!IbD>B^PlzsU|aLyG&}3Sd!GH`)V8Nv4jDZ8K-};zdhJbK9PL%- zm0e>??t7yBj9EP%_3gj8=_~JDKHOr8UyC0HKV4(c!*$0!&|pXUvk$f|`qe9uk9$3O z``(t%C-i@<&yYDfPvXm#X6pBRkTZzNNHB~KK!5iiWTb^5b!|U zKT6E{eEH^fOJDn2-O^V!`_(J`_vYt2c*$N!qgRZ0;OMto0?#$Sux|9<2aj93y-}CZ zf4RHj!*BMUFm!-dk;pr}?wD1xYWdfd+&YxC=+{HHa) zt-~31Aq4DRRd!+JDhg!6~dv>|q?;icO#fx{p z;axUeUHz$JAO9nfqkRqsoZm5M@vb(jmJa{rvvqzKKmYPX#-Z>ju}^Q`vLI^b%DeCR zadp)LxAh)Tq*~P?#eJUZ;q}$HQcF9X-w|~0xLQ8T9;*D7*T6%^20!rJS7l$X6+3ry z(C5Bw+dkcP+VuI$e*101fS=!N+pJo2>mE%K0+W-HDpq{7h{2_sT(ha%_wb-(1-UP*ZW{IHknRDCFY zxc{2=F~@`cKK1?Q2X^XGr()6Oo128LZBg8B?Zc7PYt*PQ^@$065_*;P_8xjz6d!jL z6G6d8t+xOC?S&=(x$;zv7e+z(5o>=KR&TkH4UBd(y0H|x_j?4&+d4uPEeh@>!f#oAh~b9epBlSxaw=akN3odmwWMK$imM8 z%RExEbMy6kLr)a_wpi@XUA?w84yv~Fw#OnXt-HNt^wQSg9$~RPA~u9+u!cl zSmYV6)epzETYDj-&KvJ`ti8I)lA2zxZU11#%xQrqo*n&u!;oWPzMVSl>Ei$R)e?~h zE3~+HXXi&AKf0^oz1w?u#qM19!kobEg9lVeXn6PD^a+huoex1Tdcan ztJ8nZ{9m6glb;!1`R?xf4*XcQUg%R#4flEbm-8EYXLf(8?aNIviq2}cw9TXG170s4 z@l^a_uj3>BuYJE_s}?1{cKm_Gx1avoo~r+R;=;${FZ3;x@SS{H5$@_XAM}z?vs&G%%PY5wep${Vxlx3_ zXE>7}7uPA2DB*qY+i#bwD$!43n8bb(eI&M)SWjYQiEl}KNuGVYWXV$Z$@%RSDpa{n zIr=l%8&Ly7%l`-+=SloQqRMByD$ie$cvj*;iAfSSN?ay!hQzTFV@Kn8+i!c< zk#AO%SX|=s5+5yDvh+PAOL`YAUcAJODDt1*kQ$Kwdza8-l*C^p=9lh;{rvBeho2-~ zmUvp?K8cAE*GpU^ak|7Y5~HO3^pQ5xMb2Bu@m-1KCB7l$`B#Y&rT*^iUHTqx?=nS2 zUF7w^1CM#V_+s%t>20b3*;fSG|6S@YUSeU>@m5IhH!0VT5CDNA4N!`5e?Op0wX-5ys`CrPGEq`0}>Xp2_y}i9kmo9Cp$v@Vq zSZ{bq`6@`cS4(8vz7=S7tLK5Sk$I7}bVA~8i8~~&k+@LCqFAZZk#Zg($6gXUN^Byr zro=Kb9{oq!5pC&j67QldRj5$at5m6SUjO}X%^TK$Brgw39+yZ|rAwDp{rZKdHEY(Y zW5eQ*z>cD}6Dm67tZQB;F)~;Qr7B60+X3m_YCQh8B#J*XH?+FzY z)K~TB;iKBNZKoPHeoxh^Ra;f4P)SK&xz%ZTv-3w=`cC2{i62YMl*kxNTUsD(X{yBG zLaQ)|0TP=@oxWVERGDjH`X!y0B>htoRb*t8l6Ahi9zihI>bvj0)9H&V4z+*(erZdo zYU|c*YW3cbBgsTnh7>b5j&*l-mV7NL6g?xVVO>!I4TakQnHHQ!a`%UAfbExC@( z$AyL=(iZN|?|>og>7PRPb7jhuQyVvKx*lY|E@}Sq%P;ENZ@*O+FJ4q9PMlD(1(r%l zNmX%iacb47)w(Tx@WFI7e*6SAWXMo8U_iJE4D6%2cI~cOwQ8dpG-#x%SAR#zc>DiT zTRJc8pl)89kp|3!gZn3A0bh}46Cod{#uHKR^Wp1gg%RyQ&r~TB`c>8%kTMq3A=5p*K0o zI?225TW>v+Ycr61`jc1s$)DlcYd|1r>ZhN6R#&ckrOur@r;Z*yrZO{ktAvC^wQ18P zwS4(UYTms0DmHeS8a;Zf8aQx}3JK}2diL~J9XobX&6>4Pb?VepRjXFlJlHk1qwby> zfXo$lOZpcZHf*FAOaBbFRt-4X(ogEkFTYf0&z@D{9Sj^;D6>O*BYQb1PAxaOB>jRjLR+v?Psta6EA?de(%o*Zp|84xpI|~ zwO?-SAcw%bLWSmDLjOHYnlvl)g278MP7NJ8OwV_$`Th*ouLi_@M{etv(boRYm>~53 z!r#AFp=YdLzfhOYRDq6w`Ckzd{lD{px@LVXg^X;}w11 z^j&?<9P|0-pL}{ z$Kk_AJQir%wr$RLE?l_a@!6a4qZo4OHS+uKf1qw={N$4}Zi|l`-VObKv(jJsAkn!t>AAY!D-^}ZW;E^g;tgJFK&Z^4Z zJ5>3%w%_o$?89@aQKR=%R8)+|Z1?IFXh;8#ZRlSixADZ|hYImWct4}f-fHyUvuCf2 z``&8KoVhBf=l&Z`ccZOM8hb+d`1q;r-F-aPd~k4xvo4J~m1Cw2{p;{MWAx1q)2GkS zc`jeR;?2%Vj_)IvXY403sg(cRukVdu`BI&b80 zK+r*tZJ>6QBz5fQw_4Y;Y}sv};>sk|vh=>y2tDMaL#}qU+#$>x=9r-t1%8CWcLp+$>U zcHf8JU6|9UF#X#>y#-eJ+A#aj2fWXTe}-Wol6jG|4!tD*C4+_;Ixp-^wDR;^Jj z8m8s=2J=W#Qkt%t{reBNEo!}b4V?9F&_RwvT>T-D{< zty{OTd(`7S#y0R3W04Gg!^|LwQEvAGb;%Qx=lCvdk#QkEVa1A- z&UD(h@0g!gZ^*Op@$ou;3l=O?vZ+(9V?ebsJ7pd?qvu9+Te*ek=ooQvRYTSZIr+eu z)5MXy)JdN{LAJ?UzI?@5ca}EL-iH1gYt*P|n~vR0aQ>u;Jj5=Dt5DUjVdEU%2V1*v z;fJy(PR==lbPgRlB)rjPZATCq+F$p1zJt!t9j{^c{Tq1?c_4i!Gvm0bRVnv*z^}_5 zwQ|KOT{q}BJOwablz-!f&Fa0{DK716X!KFR3Wf@HxwUN)@XHpu8`q6(=${0=@*2P? zk~VmKcLCcF_;$NIbm-90cCA5qtk1)1)6Z_z0A7l|1NL{_s`D;1GSC0!^A$_aY55&} z`|{<>9*f4>5Lw@h*wdmG&tZ&&JNv9B4av7vSefHk$&W!80d8~Pu}4}VU- zuUfU5o_`qY-38`I+KL@Mk@fJlYwhY$yZ{=&~g#8fx zXwAyJ%>x_PT~O`Xbx`lVTSwc$xho&*#Z{|TY1_-ZV)L=xvd~>$%R1_xX8Mbb%5C!8 zRr+Us19>6ue24PqHK5s>?HV>(+P4A2RYkTKN9^ z?{%L9uQqq?JdJT?e0IzOCpEujH};$FMGrWvZOM>tWM*a-S`{FhwDvK%{#|&n+YQ=t zlxvOs!Y(o|fi*d@U4y5CKlOw|bC)Kv6Kno%HQNK$spzcWrPi!jqoz)c)i%hiU*P%8 z`Dcv^))Ad7_mNwz{wQzr!1k>dRnw-;HKqgoS78LOLFW8roqt!Nge&}C^8F&ewp_Ub`;8A*+Bt#U_t&d(^1WVi(+7=+R8C z>&^LOoe!P(9lZ_w{`Tz&Dkb@-=;|)1Rm;zd-E5+>Y+#sr`|it?7i|1)ib_q{qxs_r z6DAf)IguNh^PY8n!QA&bmvN^!zp>uBQDNP>^>%qv@P{`#Sh4c-Yjk_?L-Zkd?Bt{j zq486y02vQafGfn<{OA`b6JZp+ZHG3!PN&$a>E_=G&d4 z`=?DYt{y&o_?oN1kkMG$z)>6eSL7LNxnrDJ-s{H*xj#KVu#3M#SVMnr?QSaq5VR1>C#otlf)_fk>!eesE(Mm0HE-V1uCC|W(7!Kv$7jy92J`~7cX;SYlO}7L zgZn5`CR=`Kr9b=*KA&!80CNRa@}rMdXdh?jAh(JSD%Q1j_$#BoY8+PLE?v))Cr@#U z#Y475xk*2u``%o~n2s$o)RxT-8#vYw1qoL9N>;s3wxRz(ek%++JLoPN4 ztmg^aKiBeGv;4%6k(%>{9EmldpPzr8<^kp(Y>aq^_L<+{hR^D6rN8k1GohJT51Zd_ z8P9`TW^GrgQk5JuXPj@+q^Y(CC`_EW@$JGsvi`^a(!#lCJ<@-v@P620F^7Orty{OA z0=Huq4BQMdRR3eUXpP)gD#Zs|W~`X_4t-mlf}^vi1P$_t9M8@LX1Ibc}q0`ma+6L1g9 z7JceAZDXFnZY&!sGQcj$9QW`Cl|^ssv5^h^lN&Y4JN7Hb$8M1u%-^ix@l$N4TQb)N zGF~uM@TkdQ30`+Z_} zw@>6-nQD9d4sBOHV#G*|*JIw}ohntTio9-^3nnoya-n&%&ZrJ8GF<3azecj!w#{KD zh|f@W0e_)-9?1AaRWFzjk%^RdCuvhfcgzc9^-kPdu&zQ`(jr@Xj zKYiDb3w3R4KL)Ti2no!I``*0aqQds7S1 z9?50cshVlexs>l!GyP@zWa$4DevtoY0lOz~ap-B&()OzfqmC=^^+tW=^+?}~?tfU@ z?@_a7&(ZA?AHwc}p?l((7d>&5*akD! z(N5FT)7>R2y7`SR{oZH?(odc;)4xoa3Pt6&UkZZ#a{KWc@B{b*)|0G@(b*w~wWCjd z?}4pO7ujoMWVEh7#uem(?@vBun|`~d>1yE|`}JW)`lq@bX+JSyR}Hp-wt$QQ+#KTz z5xY<3p|sR}s;#7#Tb{v+Aln6J;tn@!*p3-=H;&S7ikayz`zNsfti*(Z2WgIC2i6de)zX1i}0_sDZv+CH5( zrme=DW~QIZ)A~6gm~c#JgEkB1oYDT(;S=a@$X>z4 z;1|cxkFXX*E{A=M@t$#M7g`N7;7XEc9me&2cyUwin_7h0DN2G<(UznSQ6oS$#5^U>h(S4!>5LwJdVAKe0_WB`au@J{9sLI$F_@t z4?L3t=Vd&X5dVeS-;8Gp``EN@s@O?7u;zAlk?pZS2_by1p0(d^)<$1zk1j48PV z+5mF{Yd`!lS<~OV{*nsvv$yM;BI68lKyaZqDyAemZ2Q2Z+XX*A$Czem193L=*Vr%i zNxGf^y#-?u>nZfv&^JMRVIhB+CUYM0O)w9w8tu~Zw2_04Y1=r~x!-;Fz4jeOS&-?q zYV3L55A3l|&6+h^e=9%!jM(SL@r{r4{A_Lm{renLqXqM8zGs{>7J=Kt9+&=z%;0)Q z+9_kEJAWwPmo2pC`Xd|q_u#pG`}SWq@?(ccep%zPXVR|J^Lp*&iN}RkN=kCzYBDo- zYgr2OLV8;6aHQaB#nTmkApr*5eaLpKzgd+a~F`jysIW=z!rX(f?lWxN+k~ zx8-ZrthpWi=UC}4wC@M~uNMvjzLGu<77-m*Za(vjKE*LL`Mh3xq4&VgCAhlTAGp`W z@ecg;j_nTni-L@4BSwtUc0HTcxvuxBm))thZ~fe*O_=k_`8cfy?xp2LZV7XPesJS= zVUi8~2SNV}7d-o-DM+@LEnBABAiOs+tGxKeFxTmdrRTMbYk=(2$Jz}$jh?ya%J7|t z9V6pSUgmvkxoB(fpsC5O^e11rt@H5zf=xE#^34wD6`-pn4zZ#Cc*={fp~4K{dl;|# z%f5K{DFP>Lrfpu%M+`isb-D0}lmk1fYSIrqy^H--g9Z)t-i`$+k0FmwNy@pt%#HrY zBarKm*TS;lD@Yl5hcVYed%5-wwW0qkc&x(2=CHPd|3NQ<|4QVko@nOox6Z9I^;*Cv zM_P)#oZbBXuGBNS+{nKR5{xxwN>a{mZ4kSldLHZp&^@7-Aiv;DZdRb}88T+0?l=ma zeQoH!jQ&-a!O%Sbb9!-A{}rvlmmG!GH>(y)^lG;3wup;x4-=IYk`V{ z+!T2*echTqdLwN0t@q8>smT|0es82Lt+k+F7p%1BTIk=vhW;twWeO{tJb6lg8#!7N zkx`oK#yDp_7#4F>Wu~9e<2%?R<{v{aB8)?`bCyWM%*-QJz zDQJ1H(ZPNTY>4$6?DJuF-~8N$H5au$4_l|36|fz4L;tEa^gqNt>V*}Iu|GY{zVD;= zNKZSbG2rNA;1Q9(;|B@(ijk^pqlG`lgQ|3FUS%L8dx`s968$7m*b&> zUua&|{7vgQIwWM2$PjK;02kth{;rN6q%p{IXBn#tD_}2EqsBXGqhr#X@L&vf>_`y4Am_T!+y=lD zp!09iq-jC2P$=(g-|pantZhKn1h1I;|D%uI3;n;wE~&5rWpCbGY$hz2n0nR4&r!w^ z!8=ygb%Vc+yaaTc=b*dbK-fx z_|Z?cZ{Mjgq~>p%&l?E#*T8lo>&A8yI|6VYH^RQ2vf?X_dbUOxNAEY&Uw;29&wx3} zZ$R$=kB1GP!MoL~S6|C}C^LJS81(|5fBxL}`g!!dV2zpk`8K>C7#usAVLyZ%WB&a4 z3Y?vhp4|~09JW^l^)XKQkuj4uJFFk&sa5M;!AX3WtNtl1P4N7(rlww4hZ}2gc%8zO zv$&%fxKk_b<@(pMWh+?yem%i+`N4icCuAgs&p-MyGOzSq$7OwfLE)1aJ{|w2Ryr{U zVDknKotkuB`_*aNw!O|PdNZqUa0A1R907fhH9hn7)=if*mf9U2&Rty@_Zh3f;)4~i z!{Mf-oYwhdeVChnS1?D|j3p&}p;8hrsN}>mdjD(c`bO+w;>HI1n|I%BXzu=Ce_kd} zGiJ;*s=?#&%$YNKZN)qA?8#ymvrKH$z*?ATk=OGUg2QKCkKdM{-g~d9?(2-fMjt^I zL;tta$6LRVmg3k81Ai+83E&ba7k2;FJ$HrX&+a3(YXfV3tk=m&4nN*E z!p{L~Ps(D6pL%aILAH)wR73?qU@XTd1@C;1v`U(duY#? z$vBQaA~bY>mLV@*;92L3U4(&mr;QdQ82%a3Qjfdj89ZLbt}A+Mqu*P7eOc-3?m8vu zQ%w){#kk%9eVc{$Tpxbq5f}C!-oFaZ;or1kx-+p%VPj%`1av`*@5B>37?k-@z2JP|B z4AveR8)Y*e!(~6hOtDR3En(>ENSlZ}0A4srbU}7_dviMY%uP&8bNXGxA0wC`^E1|S z_%--G#*KmoWRA>flgGK@KG6B2`?r46e2w0xjmWjo|Be?MB;>^Sgh)+3srvx@5_~WG z1-QKH9k6RP>fUtRVx_-~wXONx-JFE23T+n5JhXQ=_R()ybHLLhKZ6I`v15nc8)B>Y z&->`7;P3eAjf$ zf&G%-eE8kn{&C2{q37<5Gq(IZ^@Gl3{ko0%d+7Sz;RvwPgm+-wfd3ozMKss5^&DLf zGJkxkT7R=%r=}d%-!CYJ6^tPD5Er*CM>&TNJSsfwkfR&!c^%lX@TIEQ_Z^jWhts!qIh>s-l2meD^(^7Kk zeDKx9oXzj_X>?`yZ5Td$gkJY<-@aYjjJvbLGnfBHo!72iCkOpYlqfmDhW>*o7k2K} zfIoL^4A*@XU?3pCSiLGCXc={efkVFps(lsbLo5Rb8OJs?#P_WxQpJW zpaEK<^TqG0^&8lb;J*(3z*v_S^gB1|J@^dhYKenw=s(d8`*rA$V?4$7%@gm%+=%=K zta*L{xLB~j?1N^;27%u|MudG7HW%pgaj;kN{S#jOZd+pWy4+`i-AWrIq>bYlR?MxSoHQn~@ihm;CTr_=lpN;^TMbz?Q=E8*(N5Dg6-wealRD<6P)( zhyB_D&uR|Fz6{6&J=xdd&mR99q+bx3_Nh}2oDl0qd>$afgWt2#*V8qa;%Spk$@=7! z#)eZC^27QouNZ)jK631lla`Xxt^ipCawY80^3$fw^=Un)+~@<-($WeoP4hRo zABFz)ZTf#2I9+pKPgmYc5noB3*4>R|FG_5&;2(1HMPyFje9j(bte5bi)<@R-$XZxq zL^gUxy(`$?&^`w=?l)=Ymx{Rn`w#Sq=zeq4{~5G1@ZZaq=fr={o;};PZt(Yn z+}cRPII`CVa-o9Cm8|6k&uXR#=f{p6vp(i>&E7Qd%L4}vw)Iix@~~W_r8#WotlyD( zw!?m%L+5P{*x=GelSOxF)PvozF#5mYqmcEtb#Gh79{hAgg&tOmWSx34euHbF>C5K+|Hd0{Apie{y&KJewvNnq%f_4-7;`%S ztG_90f5G$TFPM|a*LnT=4Ykey{}<-;?ap_lUeNZn^auEcl;piCVaG)^M{ET`dmm6? zB2R#iho6V9w+3to7;|Y;=Jc)Yh~Mxhh3t;GpD_wqXi`$rHO<-34<82xeX3Wlp)Os@ zDSI*J8@>bmJUZRH?2iB@$4K9N6djHo_Uku%=9vTXX=EvOvJi8fah{ZvroVOY;6ZZ| z`8tP|==s*H$T|O7zX#R;`5XEuqioO`c_Qlx_$uaWyS)h6e}Z>tH;f(Dw5`|h6tt;i z!Ed00GWK-K>mG^jDuMBS%9L2`=itjPzjXIlf$xL8GU~>Bl>Yx$bN`n%U5wwY*e_@Q z&jT;co@b=tNq?AILEs@t!;b&9(gb-R{8~%d8wq~`=q8b~<73hAp=DPl^1!qFmYK0X zPkV8hzs=lm=JZ#3UZgMH$N(maIX$oPWppN#(-MCvQ>MI&-!Gy6lRRVPZKhA3p~tAC zou21^>L(@fGhHX{{2b?{p4ji3e4sc%GlYx`wqTZO5n^QKQwmbvfk^{ zCrGc2W=_lLd(BLL&cTC_@61BnCz&-i7zp@0boT}pmG7_?W)BdsVb~-VBtUQ44(Som zedHzokum@T}1DI;&IWRTm^zF_Q6ZY%!U2j_oa4hH&;BDYJ@#S66{R#2YW1@vV z&+B-OZjL@`tUqX*p8QFptG0eit~cAzzb((%`3{7?4hjlZx$S!dec%)5BaD{?4Ti6- zq@6i!?yYSgDbb*R?y``A=EvQ8?sNdG%fXMk3xsfWRcsEZ{+v4 zN`Nl(0ronw2K2FJnGbmf4_lA`b|#CST4rgN2D&ff8Pjo=4gEv;{gmjVtN~p&zwJsp zl0(L7rAIHpN1=OXPRr{W)%rcgH@=s+GbjGa{5@nc=x=!T*s+hT$=tMS`abwiJH8Iw zBl$H)`c^>#cBMu-hYlUGO#)x##xvPR@9{SDAIk5SF6Fep#!oKo8EjW>JV0gftDchL zux-gJk7~`hfxk;i$f<)h)1Uo37%Ry4S6|(@b(l53)@x7tPeZB*xQcz9Jz#DfM>AN`$4A-8#dUzqVFMRU|hkTi9MnWYyhT z&+)&64h{V6trEb=P*1GY-35GsG3VRRMcb6y>44CU+da?v)ZJQ}zDz%|z9)3w^Q?Q}eHu1w zr12!~o<}x~ZHSdNTtf$|T_AhXG1eh-z^;Nm;%?42zDYZ>OJC^U+J^pH-+i~X@v7|+ z+&i+J-5ICd+Wr`Q6qzaOhH@fb1!t4jz&Z$hBYUr*zctdc9+AhQyQ6#sweierp7Q$~ z__uJedt)BRt!+YAbd+{<3JD2S$b1SK;N|Vo75dk+q5rP;-fQCVQ|Q^Qt2{+Qea+BkAw@*B4$-tE3;j4Np=7X%|x zSKE0Mv~Re}M`7KkUDEgA1@gN##dg_DH|FL1$_FV2IvaC3#<}F{B^&yG2j7*KaP;Ug zz2-!>ux{0Pk1`?JN8-+ldM^#e4e%vq-{Q1+_G8A+4*3JGHN|3cZL}qh=$O&R!H49< zUsPVoQ&`WOJb6m{M8H=mW%0BQ^z==;y*hH^_3YAPFA#&~=A-262^;$VhF|r(2C!A6 zNuR}+mmOx#pc^=jxJ?%{Rs&fD?Ew7=<4DDdm2^7TC~n-iS>yMO_smDq$NtB_Gr;@Z zY5_gW^y$-OJw8s$%2=-#B;c>yOfSx{t;lace`!sJYoY&rHuV1?ul?W12Yr?FXam@V z=7!Uc2|KJZWL*e$0{k*OGI*oy@#3dhu=?)s9@@4<_yJ>nxDh@xj56NnBXT`Enia&} z3@ndLTECPoUG6p;`X9j`L4E^xJHCN0ybReVH81;>;u|A8_>dYX?EzU4duE#Zy7?R# zAN~Qrr892C#=f85EdHUMr$5-xEYEl^b79@2b)|gy@>cSr|DVfzRS-NA`WpBg>}K!< zwP^lXRlj<&Tbi2bYj+N=Cq%HesYw^L&j;3!;I0d*PcYZXt$faWQLbG19Q22Gb|;tj zR33OOo3?bYbm`J|^l!qm1)W#fFNpOcY2X)X`*yLFTzf(L!11)NlR;t z7+9eu-{FZG_|9b3JmOBprSLs+R%Sq4&uuVdG2nB7g*Q1lPBkv z3Dzj+?hI@b_7&(R;$?ovevCcw7#rBjVV>*-uyWaX@gww^*lipW-fxrk+hFLc8Bf5j z-D*63Zgo(Q-@z`q*`Gzs#Y{?dZ=vp}+S3gKYU)0&6;aP9y&? z_^cnK4 z&9a~F=>o|(?7n#`-osy}g%-J9hlKRMCLc4%$SmK?;q$@T7G!*2|Myey99A9Ftyr&r zlssW)VxfiGYxrICz1Je!#P^ludt2Uq+dId)&q{x;r42kI?;hfP)^+HS{tVYv1B~NV zKbU6vu(rh(nf3H#(X(A^u=xDmC+Yvqj@It($@BM1{@$1P8+il&1Ev?uAvTN1DOfB1 z{PWdo&FcTm`|!ue2zT$^E&S1T;RCh^Z@gV_0(;e!EBUiu@>FTyE={<<%|gG2+|k+7 z{mPXqdzCEd{f4xG*%H5&XdP2De+sV-o&`)gxDE8#*kH0x1N%BN_R+2vE?lVjA9xG) zaiiSW?NBGQC3uBv8S^~V$^X)Cthu0-&^@eV$HF~QsPe%f0vk}-PqlebTwWC-+SO^XiM<0w50(9WX})5 zlYl3JXJkJ$d?m!i#p!)C_U+rJ_bg`KW9{(2+LqR@U$6V5)bD1I=M@U=b88#s-x)K? zmM!a5s+6~v$eC|P*C1`@F^Mlod{by#L1JBrEhTo7*jM5}$?sTcPqd|_5;sXqmUvL& zClW79{8?h2+md`s&$rkSH4+~Ity{OzI!5>zb#Pdp(DtRHRE?v4*5h>U0vL^Yf(Uzoq#U)mjSWjYW ziQOd{ZE1qk!7PbJTS}30+R_<`UrD?wvA}H!dmHvhL%xE)jG;q^>$WsQY?jfvArHp~ z0{9E;2x&`T@vtGg9&PE=snc3UC}o27`=uV9`Xkc&dgi%o*=k-dyzpOSTt%b}8Exqa zsjHVHzAcfqR9}8?Be940$L%La_ClvE!T&6mxLIPVMAk;1O8iFRFB0=KzwsRXll2|= zZDgIu%+YQ25x+a&>V^#)p>?9PCG@0g*RECg@JUNc6FCZP>6Dh0VE+%c3O_WAb&~dP z5@ThKcJb?RJ?r#;J#Cq#es+GdA5JbbL_aQ*!=q ziKQe~m+QuIY%j5=MB35-iQOeul;7OSbMsRlO2vCcn3}NSEV!8IRUT0^|@#6pb^=U^n zIRD?^>ms>)&-(jKzm9j-ls+kPi(MDBY1iur%lxEV=d&Wpb-rX?Hm7)(o`SQ}a7@X{ z`PS3=cl}SlRw4VEhh)CS8E8d`krIn|JtO}mRMh|T^-p*b_7EH=5g86LL1cr-b;e2* znPEv}hg~H$msne3d5QlOKIUH%ACa}p-6C@?lCO{60uM{R?~ro9-{)DbAkVtv^^tXb zA@QWdy%LeDu9LV(;`jD6zA|W)f>j{gspWy2R%sKM%{g8RWc`)mNmuc0e8BpQj+c0NkZ{BkmhM z9!>SI!e|3>FVvHbzd3(KI_PAr;{MFe7L9J6Vo?-4L zZO?!>D0#+JB5QgL1M}?8IZDC#jf-&1z80Y=zy1F(<*Z znaV$t^5Z*N)^p#Q(=g8IgOmphzd7K8ojqYm3tKKQgx52We$Sr0Ra@Ds*`Pni+Op4Z z*nr_0cV~Q``hsp?i{RU+eng*o~`a6pD$|9J9KXXMS|Lu4TImpS_Z`jIs-pMmSge&na0?EMn6t~J^d zV}C&cV-o(8GBPp+x3fxr51&W|&xajzMEFQGXy63Bcg?_Xn|?5Sor1T`Em(YL=ry49 z<)>JW7bF-qa?}B1OF;rWBla_q;S(h;P|VpeVd>g_u3fWqC$AF|wpZI?`TO@#t;Ocn z+z;5#reAQB9)CUMVcRwr9}?Z6zm)$~u$}o0ixxS2qfz#P*cuz(WBd*c4Rhgh%w=Qm zu(060YW$eh+86EAsnet%e3)a;u(05C-48tZDFw@8v{yN{$|}D%a+%x$_*U@JadBI< z&5Mx^a{=~I*AhB)>a2zjj#p6w;+225Z2paU7%@0ad<-^o`XGSs?Ao=P%yF*%dhn?* zYWPQbymprt@JvR&JZ;USsZ47nTFxA5>GF6Ck00M@_bMjY1so{>-b0rM8+ zHJ6{g1cwh@px0r>v&PYELoJxF7qiOWlXcDY3Si^$YZetbPR90ilHX*BsS>y9^=Wwc zaJ{C4$6yW(2nf`CjZr52Y;azs)D9IHF-p&qMqcqF(<`8_YT3xO4wyIm{Ca7uqVX(8 zFlj~~mT~K`tn&9SEc-z7w>ZbwRbXI$)judRM>{pjNBiy7V~-j(WRb21{Oy?c>odyF z^Mj+3v`s1Ye8AbJ&E-e-F=4`V;macR z-Ym#Ska02p&YGU$Qpfme8amj4tvAZXvsv{2#oN1-*2~HDWahSO4Mra(9r`yHQ-Q2iRos)g*|)2UU4 z>e+RVOTTfXl`iWBe`nFa`ev2?3bZH4^}K@YH^Z6)+YGS7v@_-|`Z+oa_OXeHnwW!E zA1U**oeeO)1xE~9rpwR18?!&i_LYrKmGFLtRBzcsH@^`X0k*0}U_aoj@_*tey)OSs zc>TNvAD~sXt>J z8z?eQqaWixWMKGVEmxqP^Apion%kwx&+-9N`M06J%S*ubDe}KDBe$r!;^V@|qj3xi z-mmk=dc9*y*S0?>YLiFajPgf@IDDj<`#fpmAC6llvVJXSKsIVB{|w51|NVD*HEPs2 zPYZX(9sF03r(QkMrJwiI{J2#QKtB%a>v+z{e@u9a=DpnIoxJrAjnF(E@5F@1i40(m zOC3gquMnHvdG3x}dUl}Gm8~h%+pQ!Np zPC8Oo^{OWeAKc5W43Tfc14i|CjQ!K6o>Iu|-T9zo{Edm8p!qCwzH>WgY%;a~Zj@iH z{|&EV1TYhfLt{qnaLSk1mvYpI1zNU*-Vc7VfB!+szpE=>-#;i_^Wib!+g-{}pCL_m zfp!dE&YDg4eOd1z*Y46bQ$>jWCMI0gi{WczZkZ!;&@tkNCsfS*M{$E>Oj{1b+XD|!;pQ! zThQ)}IfycG&OJN%H@>rn4VkaoDSZ|mh55m{*F8FD*1_%qI*KUK-x_ro6+T1z6ms`` zLGM$CCi+**Dt}}2YlMv(H_4i1rZXSpCnh{ouea^K$-D>dD$r+-^xeZMB=CUh^Xf=R#l%jtR?_J5c_pu+2I4kT!phy&6J8 zqx9Mx`h!(r?KU{#i0aW{w_+_zI`j|L1cnb?utuFab`|_WjL0)4saA~~a@^~s&%9U8Nqum*73S@geLx^#KS5C1bCo|Qm;jB%JU z5NnC<4PCk?-Ew?F6@xziu|NW-&#~br9*pR+` zL$xg0pdrVBk=s0uf$Sdu4$b@y<9@LCel*g~k->c2KxSfY&jyB-^4s+Rl4id)+Q&EF zWW!oS&SR86(Nz9SGhfTvHN2ne7{FSDwT*S1Zxmto?meQjo8VG@^cRdbg%QA?AZs=P z?HYf6&=Q~fhh)!jBcLCIFQ9JB`^ZtoEZTG2V3fZ?g^C{=?{Z{~FnHk19BZ$^183#H zQ5x^zS1>Akp-cG(MJ5YRA8tHyO~<&nI6XF-+rYtthxB|(nPe{0zBn02xX<&)j=2;| zW7tgPH_N^*nKOsZ6!~sgu&eC0SC33B+eaQ^4UAP${j=AC=p`b;M~T0XRO_P!zDD+F zUZ)uev8FeC%_2i^7Z~GA<)3cQU-SV#Sl?lPo8F?cvtmp}4&9;qfiYiz3xsDLHsk{r z-P@>PqR+F)6s+IK>owySeHrY58HZ*z9N%3*tJTXu6> zkhbxF)PvYOdsmg`8%k^|5uZPy5)Gd}bLBkC=a2U;p~2C2-l=s#))(K3J?C%mis(xE z_s{m1$$B4*)ykDCwXH%@lD)r7bG{4XoO!5Ov*tfYese9mxgPR+UZFw-uQFvyi=V(U zw@V!slRA7#;=d(IWtOZiv5`c>=MDaDhDn?vah}9g61T~-8Rg4YIEFs5QKR?1ZzXyu zbTf=IW`B{?rNdvO!}mI4J8Ssk$4_W^8rXa0LFRB77tTrA&hak4<+@qVzxn1{=%%#) zAj$vJ68}$PX^Ax?z9+GR!~lt55=TgkmAF9SYKd_Y7fZw+V~)L{%w-Zk1W(h>v>}|h zA;>ZayX&;$A;WKr(_c!wJPe%*vLQ4axb9Iu_0PZlN8s%6V73 zBjIAF9Y>+HzEc63i%*IO{6xGVv7JPxpNQw>A`d~@);-e3@c*z);x36>B{D8DK2DOz zc*(fQ_{liRc*?jcP9;jdBJV#bN5B51Cg* zef0GqLF=4yho*vmnK*8p>gh91;`_?qXTA#XS+0Wow>oiC0lrh6ItO$lS@}Oh`;qhd zW-Kfp#`eI_?IX+Ld8^(DtU0*V{K_?uM@B^s6kJC(PL%Ur0sXW*7oHW{;;5(?<+>+=u!$2gY8*Ru)+c^RcX_wCstwjkPD( zGjwbP9amW^^zF6Q*^ZFYh4!1QZO6$A=?)q+T!r)z9d+nzHDkt1oke^;XXRgGMddt% zK4A{b!C)VaywP7-cc7mN7X1fp;93Lq5EVr`%HD&qb>n2goegr1%gBN0FUeqLS0s~^8d{b!d?y7=pnv-{)+n_|wnIzs5?6oN&1@)>!j| z-xv7FCbH)Z@1UPD+p1Zgx4WjjMhJGYf9MEl>)G~9fxU(~ed-)PenR^01ebm4`}JO_ zeM4E(G~r!>82?2Mvc>w0ag8k>wo%|&;gOFV$v^ghw4fjTzh~D3=Xm4qE7(qvsUbTf z&?kZeH#mO>?-0^&WDXf#xcC{!s(-;M7WEQbeW56n=tGRFW5?N3n{7*o- z#B;u zPTmB2pMJsPRdw0R+|X-;1TEGWIOA*J{<7-74r?;8L$~kf#tXR|!8!H~8Y=#4viX6I zEmKs0uk;z=LUljxwgZ&SA^zXhy+R+f*kCD$}Ycy=|I%j{c zT_sWa&QRxmQ>|OKHS&*N={rS_oae!Wc7X2@)@ladgD?Bet+Rcx_;wL{Wto?dzoA2k zjEqsfUACzzf_<4kd!I93=u3<`=7?Pyx}&CbQ?*?S`XuA`pujm!{zq{6M*i7n|z;1{C#F9{~jMIU!QQjM^jL5N1gI5Y|10Thq~Ygz<)+X4wp6|wkBeK zLEGV3@*f?(MEUiYm}?v`AksPKi%d8x|K86_{vVL_X3jy@l>cMLK9)8)P{xj(F19ZL zzRNW>FVHv6Sx>$Fw(D`k^twKU|MnF-E3o23^3NO)(r<{~vx0pqJVi6kr<}|`w13I_ zqZ0oSD;O?!fqAW8zi8FGLH3xyx0xeD`=p8wl6o@lWczIh@clr`XszkND+Kyv>VE0d zF&l@`(|42$t*q}^uNkAV`tDW9`~4z^c*WD&aqZf*s*k^eM+Cdo%V(~RWSXzSK( zw(r>8WDS^=|4YcR<-F>~jjn4)cnRj35hF%Po=0k(vVXT-Dya8R;Ymkn`4#z3PfwRI z@aN&lvq&&u$5-xBm?1JAppv?ISg>lb5+2J|iptr)1BqB68lq z%uBMK4G$lv`UI>LyO2~prZE>W_LZ0R(W-H(3hq5$`wEyLe4u~#YY#6rj@$KkIcn5cHK6|pnJ*o>e%g6&ziryir%jV=e#~Fi*w%Fr>1rO(XPd?Xw{4QH zZGil{WlCS#Cj7)weEpLNhc zCq9w39uXcb^GfzOG=9`R2VJBevi2L$f24EGY|aGu$M((B^teB9;xsKEga?L?WsU=9 z?2i96r^C5P->$J%lK)WZj5GoRCOhd$Td>MhXj^^zh@By0r|h9_#w0hYl`Qhxp)PzD z-=m)l9yChly;Y-B&D(LmpaD#HR{bxAcP?GJ>=5K2$gj-v5Ob`72Qq&PIb3xA{kl&Z zV<5-+HIh`{-tz}}s`X596SF2Wi4l-EyKEKY{ z`9}r@w#OR4a|8yAbG9?ueSrS}jg1{Tbd=cFIBdR<#|#LW>w@2E{a&&P={wCW-j8=q zifqjY%>7oZ`nYjUTMLafs$ILz3TTI~hCrWeY+Wy(4SIhqBQ4{|voX=5oc)%z)6;i^ zQ&tCmO2DR(ITyTmKu;-`??P#x34%wqZzIeRj1lI59|HV>m;+e5torXm{ma@hj^DvY z_VRVmnLKsxkgCgMe%CmM7h|q9+J8@G^vh-d2Mqdr^bI9t*7d9({rS7P2YoM>RelL66NA7CK>a5Rtx<&^@ z`tW46YSq?$uC31-zflJS6RxQ_`4_u$EjT2d@US78&oSz?cR;Le2i7!M$1^wcoP%e} zIc{3tv0l^X7A#nxZ}V-iPt@zEQKOx5Hte_X3u(670k@D<|Fy}#tR0F4#xe2b48 zWHaV~9|rsy3Qok94@cfj{Yzi@FZD0|DZ3L%Ldcr?^&O}Ehv%sp0=4xJlUK(RyDqZH;eS%MpHvaj10Zvd(^BqzBDp zzNKuey|n(fOqp^KcJmbLb;hmes1Y(Qjg@(HvdBKh$k;zpkE_RzpD>cW<|Ekfw6tAX zw~&=Tr%cP7IPDwxz2twFtX(t)M9OiGw5fR7ja{Ihp>qa@2cN-pVFy#6)R+b4QaimY z_5hM!bny-&A3A^pxhH%6dIxpr&~dknS6>VqIOtm$$9|G@enn=vWC{BduG6+AV2-IT zaL4d{@GZ#N!TZs63lgXk(!zJPyZYh2=u^NCxa8eY0>^)E?{e^??E84Pl!yJ**!S@T ziEqk#6(!b@*g|4Ai9r%$L>@i1YSrp91S`L!Nt31<#YaVw*j*hE8Rco2D=&$@gSz;I zItBMkpIx_Zz24Uwzh#U;@Hph1c^RI^S`V~kN#}dXhwc6f<}wt<`I~Q+1S6*RER=78 z#bMvV$K?2;#NrYwNvtcemBj86gQXq@ip|G(@!2{{aCXaN4B8}q2rIZDsaM>&m@NQl(`um3UYGuP*!d%PrlqmP3AiljtR zzo$7C^YYS&JUN2XdPZVJiB6o>19IUZ2rXZdxKbh*mc0@aB%1e~87${{A?7CJ;szgpOf9#7 zJRINhL4mW~#)S))>SWL#N%?=_`!b*B0Mauj8EeL`zWQ3m$sx|VaF>rAJ9ethZ5@6A zI<`zx?OM)JZJIAqZJV!F&FaT%-g5ld#rpNE^}gQELa+i(Jq`XO3Fu0onGtsH-mUj` zHm>cC&}#I^S$b{E`XRt~hMoto#hW~7j+W8GGZLmxpF#OgQ+~?i-ggm$7)^` z8v}T5+KoFOrN+A)*^{7W4+kGzt5SlRGTDKDf_{O1>s61gBXm8oR+I1V7d=%Gv2}1V z@?enQ?FnE5uoW}pfcj=G|7b6B=gwCx8adW0?V7I_xondD=JxH|o%*z_^>U(&75BnJ z5LlzrXUuawc3k)%br;|>=FMHCCX8FG`UTBV?OT7KdigC??b`)8y{$R1D`=3U%!5%tY;lQ zkvg_s?cxU%9|ZF4=@N^>x8*g!%Pd*4LiC6W#m~_KHG9@_&GW2Sv0At9ZtXI~2THog zvsP%Dj~qTrRg<*^{UI!LmXr6-;!VfM_bYj_RWs)cT8D+cFMAav=x?=eu~D^e5hpU( zc-5_If33f2pXC!Lr0*iln=;Py_MfZ2->~LRwP3zu{At)wulLxGt}Z;LT>zUCCwfZS zCvuj>i$4lJ%4LH^VOl5r09t-ew_@hIf(60Gb)xGOz8AliE_T09`JQukRSP1YJ__for zhvu`L@^vFk^N}$^%1vx8Yw}?8Z=B;-2CP8)maEkKc}q1e3_MrcrinUz`m;H#TD3;o zpc}qJ+csaLaeC%w%;&V>tnb$rzJ8$b8@QZVGndHtIa9BReY-7HbMnL`x_yltwnG2jq)vkB)$@Jr@7YM(d_+H<_5JdKBOcFh;PQI;E!2AE?wvjq z8S5O?y2(222c<{nj|5ZauouUFDfX-8&{JgUUB&kk`f;#2?V7KXd2g<)lU?h{c!xHS z_5J_K+G!^A7!cyH;qKCIk<7cN6k+x1wR#*!7Tm`#Q_KX%|-Vj{EWT-s%Lf8iy1?pN=MKSbTOnr;wz z)I8_<5?x5!W(lf8n;ClkFn<#~f}N}+N$`$*U&j7N#5eaQ)@{aqDMMvkGl!KzclMCL zpJt%%S}E%S<=cIl9>>Oyo25FoS)j+aenImz4bAVO3&I|bK-)TX>Xbf*zvcU^M<-31 zl0q2_{8I0LS^62{ALC2A<_^7HyH+1)d4Vxs#7>=~{JPJOJS`EuL$cuZ*BGzqqahpR z0$!T&i~zo0zK>56c&~%#{@OKn)PLI+^Ii5wK_1nn`BF#SOPfM=Yz_FVh>OF9{+O;8 z#t-fZZ{d_TkPiGTb31vF?`w><^y{;F4(;L?+gdbCaGCR%$J#V==yE%>neOCAt$8r6 zj~_pwc~|%*sb4*I@EdX*?Cxpn*fq%aPi665x}h$Zzf8|7w6U1T+0J~!yR>T-r~Bdf zajtE{_@?=I`SKMfpNQ-SAMEhal;5a-|%v zHZ0^rt%LOMvDC$HgZZ20bJ{%m2_rDBNIQ3t|Ff2o?%i51}nM3-nBZ9@+DEPPKYUPS}RkPxDwR%;W zeni^UUKvxSo1f>L{yl9q^JM zTi(meI4b_^x2gAISBO4whuR*$OKpuy5#6C+(CTkdLt^69m=QbFP&pnuc3KH-*U31% zfp0P&v~0Xy>PGNZJwH_M)m^1&0lirB*R8(JWsZVQLjOgg`$$Yp`F{i60g|&0I7YAu zd^SUN+UEZi#gP8hf&G{MCq*9up3QL(*tdby*&zEsc^IgF_P%}lFNgVW`@dK(%%3qcishhZTmlCDr9~7;sq!F z`+IDFuP*_OFN5p?jVXire;{|STD1y1Zw1s}3>-W7J!9&D|6%^Sfa&@QaPPuyU>rdF z4)P}qfW`?x=?iq<28afgcR>BA!1Fs#gZ#8%-6`PNbO-;hU406rPJ!tM(V($#&{|$l z*#~Uf`~&K@0hU{Qz&TCd-roLLV4EWg7#n+a literal 0 HcmV?d00001 diff --git a/interfaces.py b/interfaces.py new file mode 100644 index 0000000..88f6071 --- /dev/null +++ b/interfaces.py @@ -0,0 +1,285 @@ +from tkinter import * +from tkinter import font, ttk, messagebox +import fetcher +from enum import Enum +import webbrowser +from datetime import datetime + +TAMANHO_PEQUENO = 8 +TAMANHO_MEDIO = 10 +TAMANHO_GRANDE = 13 + +class TelaInicial: + """Classe que representa a tela principal do programa""" + def __init__(self, master=None): + self.janela_quiz = None + self.cache = None + master.title('PflowQuiz') + master.iconbitmap(default='icon.ico') + global TAMANHO_MEDIO + self.fonte_media = font.Font(size=TAMANHO_MEDIO) + + self.container1 = Frame(master) + self.container1.pack(pady=5) + + self.container2 = Frame(master) + self.container2['pady'] = 5 + self.container2.pack() + + self.container3 = Frame(master) + self.container3['pady'] = 10 + self.container3.pack() + + self.container4 = Frame(master) + self.container4.pack(side=RIGHT, padx=(0, 10)) + + self.label = Label(text='Escolha o quiz para jogar:', master=self.container1) + self.label.config(font=self.fonte_media) + self.label.pack() + + self.quiz_tree = ttk.Treeview(show=['headings'], master=self.container2, selectmode='browse', columns=('nome', 'autor', 'data', 'perguntas')) + self.quiz_tree.heading('nome', text='Nome', command= lambda: self.__ordenar('nome', False)) + self.quiz_tree.column('nome', width=150, minwidth=150, anchor='center') + self.quiz_tree.heading('autor', text='Autor', command= lambda: self.__ordenar('autor', False)) + self.quiz_tree.column('autor', width=120, minwidth=120, anchor='center') + self.quiz_tree.heading('data', text='Data de criação', command= lambda: self.__ordenar('data', False)) + self.quiz_tree.column('data', width=120, minwidth=120, anchor='center') + self.quiz_tree.heading('perguntas', text='Perguntas', command= lambda: self.__ordenar('perguntas', True)) + self.quiz_tree.column('perguntas', width=120, minwidth=70, anchor='center') + self.quiz_tree.pack(padx=20) + + self.filtrar_label = Label(text='Filtrar: ', master=self.container3) + self.filtrar_label.pack(side=LEFT) + self.filtrar_entry = Entry(self.container3) + self.filtrar_entry.bind('', lambda key: self.__atualizar_tabela(key, False, True)) + self.filtrar_entry.pack(side=LEFT, padx=(0, 90)) + self.atualizar_button = Button(self.container3, text='Atualizar lista', command=self.__atualizar_tabela) + self.atualizar_button.pack(side=LEFT, padx=15) + self.jogar_button = Button(self.container3, text='Jogar', command=self.__iniciar_quiz) + self.jogar_button.pack(side=RIGHT, padx=15) + + self.info_contato_label = Label(self.container4, text='Contato: pflowdev@outlook.com') + self.info_contato_label.bind('', self.__abrir_url_contato) + self.info_contato_label.pack() + + self.__atualizar_tabela() + + def __ordenar(self, coluna, reverso): + """Ordena os itens da tabela alfabeticamente""" + tv = self.quiz_tree + itens = [(tv.set(item, coluna), item) for item in tv.get_children()] + + itens.sort(reverse=reverso) + + for i in range(0, len(itens)): + tv.move(itens[i][1], '', i) + + tv.heading(coluna, command= lambda: self.__ordenar(coluna, not reverso)) + + def __abrir_url_contato(self, evento): + """Abre a URL de contato""" + webbrowser.open('mailto:pflowdev@outlook.com') + + def __iniciar_quiz(self): + """Inicia o Quiz selecionado""" + #Se a janela ainda não existe + if not self.janela_quiz or not self.janela_quiz.winfo_exists(): + #Pega o ID do Quiz selecionado + selecionados = self.quiz_tree.selection() + if len(selecionados) == 0: + messagebox.showerror(title="Erro", message="Selecione um Quiz para poder continuar!") + return + id_selecionado = selecionados[0] + #Pega os dados do Quiz no webapp + quiz = fetcher.pegar_dados_do_quiz(id_selecionado) + if quiz == None: + messagebox.showerror(title="Erro", message="Não foi possível baixar o quiz. \nVerifique sua conexão com a internet e tente novamente!") + return + #Gera a Janela de jogo com esse Quiz + self.janela_quiz = Jogo(quiz, self) + else: + self.janela_quiz.deiconify() + + def __limpar_tabela(self): + """Limpa a Treeview contendo os dados dos quizes""" + self.quiz_tree.delete(*self.quiz_tree.get_children()) + + def __atualizar_tabela(self, key=None, limpar_filtro=True, usar_cache=False): + """Limpa e preenche a Treeview com dados atualizados""" + self.__limpar_tabela() + if limpar_filtro: + self.filtrar_entry.delete(0, 'end') + + if not usar_cache or self.cache == None: + self.cache = fetcher.pegar_list_de_quizes(self.quiz_tree) + + if self.cache == None: + messagebox.showerror(title="Erro", message="Não foi possível baixar a lista de quizes. \nVerifique sua conexão com a internet e tente novamente!") + return + + for quiz in self.cache: + texto = self.filtrar_entry.get().lower() + if key != None and texto != '': + if texto not in quiz['nome'].lower() and texto not in quiz['autor'].lower(): + continue + + if not quiz['aprovado']: + continue + if quiz['quantidade_perguntas_aprovadas'] == 0: + continue + + self.quiz_tree.insert('', 'end', quiz['id'], values=[quiz['nome'], quiz['autor'], quiz['data_criacao'], + quiz['quantidade_perguntas_aprovadas']]) + self.__ordenar('data', False) + + + +class Jogo(Toplevel): + """Classe que representa a tela de jogo""" + class Direcao(enum.Enum): + ANTERIOR = 1 + PROXIMO = 2 + + def __init__(self, quiz, tela_inicial): + super().__init__() + self.tela_inicial = tela_inicial + self.quiz = quiz + self.quantidade_perguntas = len(self.quiz['pergunta_set']) + self.pergunta_atual = 0 + self.escolhas_salvas = {} + + self.title(quiz['nome']) + #self.attributes('-topmost', 'true') + + self.container1 = Frame(self) + self.container1.pack(anchor=W, padx=80) + + self.container2 = Frame(self) + self.container2.pack(anchor=W, padx=80) + + self.container3 = Frame(self) + self.container3.pack() + + self.titulo_pergunta = Label(self.container1, width=35, wraplength=250) + self.titulo_pergunta.pack(pady=10, anchor=W) + + self.resposta_selecionada = IntVar(value=0) + self.resposta1_radio = Radiobutton(self.container2, variable=self.resposta_selecionada, value=0) + self.resposta1_radio.pack(anchor=W) + self.resposta2_radio = Radiobutton(self.container2, variable=self.resposta_selecionada, value=1) + self.resposta2_radio.pack(anchor=W) + self.resposta3_radio = Radiobutton(self.container2, variable=self.resposta_selecionada, value=2) + self.resposta3_radio.pack(anchor=W) + self.resposta4_radio = Radiobutton(self.container2, variable=self.resposta_selecionada, value=3) + self.resposta4_radio.pack(anchor=W) + + self.anterior_button = Button(self.container3, text="Anterior", command= lambda: self.trocar_pergunta(Jogo.Direcao.ANTERIOR)) + self.anterior_button.pack(side=LEFT, padx=30) + self.proximo_button = Button(self.container3, command= lambda: self.trocar_pergunta(Jogo.Direcao.PROXIMO)) + self.proximo_button.pack(side=RIGHT, padx= 30, pady=15) + + self.__atualizar_botoes() + self.__atualizar_pergunta() + self.__atualizar_respostas() + + self.focus() + + def __atualizar_botoes(self): + """Ativa ou desativa o botão Anterior ou muda o nome do botão de avançar entre Finalizar/Próximo, de acordo com o index da pergunta atual""" + if self.pergunta_atual == 0: + state = 'disabled' + else: + state = 'normal' + self.anterior_button['state'] = state + + if self.pergunta_atual == (self.quantidade_perguntas - 1): + texto = "Finalizar" + else: + texto = "Próximo" + self.proximo_button.config(text=texto) + + def __atualizar_pergunta(self): + """Atualiza o texto da Label de pergunta de acordo com a atual""" + titulo = str(self.pergunta_atual + 1) + ". " + self.quiz['pergunta_set'][self.pergunta_atual]['titulo_pergunta'] + self.titulo_pergunta.config(text=titulo) + + def __atualizar_respostas(self): + """Atualiza os textos dos campos de resposta de acordo com a pergunta atual""" + self.resposta_selecionada.set(self.escolhas_salvas.get(self.pergunta_atual, 0)) + self.resposta1_radio.config(text="A) " + self.quiz['pergunta_set'][self.pergunta_atual]['resposta_set'][0]['texto_resposta']) + self.resposta2_radio.config(text="B) " + self.quiz['pergunta_set'][self.pergunta_atual]['resposta_set'][1]['texto_resposta']) + self.resposta3_radio.config(text="C) " + self.quiz['pergunta_set'][self.pergunta_atual]['resposta_set'][2]['texto_resposta']) + self.resposta4_radio.config(text="D) " + self.quiz['pergunta_set'][self.pergunta_atual]['resposta_set'][3]['texto_resposta']) + + def __salvar_escolha(self): + """Salva a resposta escolhida pelo usuário""" + self.escolhas_salvas[self.pergunta_atual] = self.resposta_selecionada.get() + + def trocar_pergunta(self, direcao): + """Troca para a pergunta anterior, para a próxima de acordo com o parâmetro 'direcao' ou finaliza o jogo caso esteja na última pergunta""" + self.__salvar_escolha() + if direcao == Jogo.Direcao.PROXIMO: + if self.pergunta_atual == (self.quantidade_perguntas - 1): + self.tela_inicial.janela_quiz = FimDeJogo(self.quiz['nome'], self.get_pontuacao()) + self.destroy() + return + self.pergunta_atual += 1 + else: + self.pergunta_atual -= 1 + self.__atualizar_botoes() + self.__atualizar_pergunta() + self.__atualizar_respostas() + + def get_pontuacao(self): + corretas = {} + index_pergunta = 0 + for pergunta in self.quiz['pergunta_set']: + index_resposta = 0 + for resposta in pergunta['resposta_set']: + if resposta['correta']: + corretas[index_pergunta] = index_resposta + index_resposta += 1 + index_pergunta += 1 + + acertos = 0 + for pergunta in corretas.keys(): + if corretas[pergunta] == self.escolhas_salvas[pergunta]: + acertos += 1 + + pontuacao = (acertos / len(corretas)) * 100 + return "%d%%" % pontuacao + +class FimDeJogo(Toplevel): + """Classe que representa a tela de fim de jogo""" + def __init__(self, nome_quiz, pontuacao): + super().__init__() + self.title('Fim de jogo') + global TAMANHO_GRANDE, TAMANHO_MEDIO, TAMANHO_PEQUENO + self.fonte_grande = font.Font(size=TAMANHO_GRANDE) + self.fonte_media = font.Font(size=TAMANHO_MEDIO) + self.fonte_pequena = font.Font(size=TAMANHO_PEQUENO) + + self.container1 = Frame(self) + self.container1.pack() + + self.container2 = Frame(self) + self.container2.pack() + + self.mensagem_de_fim = Label(self.container1, font=self.fonte_grande, text="Você finalizou o quiz %s!" % nome_quiz) + self.mensagem_de_fim.pack(pady=15, padx=20) + + self.pontuacao_titulo = Label(self.container2, font=self.fonte_media, text="Sua pontuação:") + self.pontuacao_titulo.pack() + + self.pontuacao_label = Label(self.container2, font=self.fonte_media, text=pontuacao) + self.pontuacao_label.pack(pady=(15, 25)) + + self.mensagem_adicionar_quiz = Label(self.container2, font=self.fonte_pequena, wraplength=220, text="Que tal adicionar o seu próprio quiz ao jogo? Clique aqui e faça seu cadastro!") + self.mensagem_adicionar_quiz.bind("", self.__abrir_pagina_cadastro) + self.mensagem_adicionar_quiz.pack(pady=(0, 5)) + + self.focus() + + def __abrir_pagina_cadastro(self, evento): + """Abre a URL da página de cadastro""" + webbrowser.open('http://roinujnosde.pythonanywhere.com/register') diff --git a/pflow_quiz.py b/pflow_quiz.py new file mode 100644 index 0000000..11825fc --- /dev/null +++ b/pflow_quiz.py @@ -0,0 +1,10 @@ +from tkinter import Tk +from interfaces import TelaInicial + +def main(): + root = Tk() + inicio = TelaInicial(root) + root.mainloop() + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..8eac34f --- /dev/null +++ b/setup.py @@ -0,0 +1,66 @@ +import sys +from cx_Freeze import setup, Executable + + +# GUI applications require a different base on Windows (the default is for a +# console application). +base = None +if sys.platform == "win32": + base = "Win32GUI" + +build_exe_options = {'include_files':[("icon.ico", "icon.ico"),]} + +shortcut_table = [ + ("DesktopShortcut", # Shortcut + "DesktopFolder", # Directory_ + "PflowQuiz", # Name + "TARGETDIR", # Component_ + "[TARGETDIR]pflow_quiz.exe",# Target + None, # Arguments + None, # Description + None, # Hotkey + None, # Icon + 0, # IconIndex + None, # ShowCmd + 'TARGETDIR' # WkDir + ), + ("StartMenuShortcut", # Shortcut + "StartMenuFolder", # Directory_ + "PflowQuiz", # Name + "TARGETDIR", # Component_ + "[TARGETDIR]pflow_quiz.exe",# Target + None, # Arguments + None, # Description + None, # Hotkey + None, # Icon + 0, # IconIndex + None, # ShowCmd + 'TARGETDIR' # WkDir + ) + ] + +# Now create the table dictionary +msi_data = {"Shortcut": shortcut_table} + +# Change some default MSI options and specify the use of the above defined tables +bdist_msi_options = {'data': msi_data, 'install_icon': 'icon.ico'} + +setup( name = "PflowQuiz", + version = "1.0", + author = "Edson Passos", + options = { + "build_exe": { + "include_files": ["icon.ico",] + }, + "bdist_msi": bdist_msi_options, + }, + executables = [ + Executable( + "pflow_quiz.py", + base=base, + shortcutName="PflowQuiz", + shortcutDir="DesktopFolder", + icon="icon.ico", + ) + ] + )