From bcc5305125f3a38b8ea7aad501f891474375b6fd Mon Sep 17 00:00:00 2001 From: hugovk Date: Tue, 2 Sep 2014 15:53:58 +0300 Subject: [PATCH] Add access functions for ImagingEffectSpread with a test --- PIL/Image.py | 11 +++++++++++ .../{mandelbrot.png => effect_mandelbrot.png} | Bin Tests/images/effect_spread.png | Bin 0 -> 43292 bytes Tests/test_image.py | 15 ++++++++++++++- libImaging/Effects.c | 10 +++++----- 5 files changed, 30 insertions(+), 6 deletions(-) rename Tests/images/{mandelbrot.png => effect_mandelbrot.png} (100%) create mode 100644 Tests/images/effect_spread.png diff --git a/PIL/Image.py b/PIL/Image.py index 4c9a77e79..5e1416a33 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1910,6 +1910,16 @@ class Image: im = self.im.transpose(method) return self._new(im) + def effect_spread(self, distance): + """ + Randomly spread pixels in an image. + + :param distance: Distance to spread pixels. + """ + self.load() + im = self.im.effect_spread(distance) + return self._new(im) + # -------------------------------------------------------------------- # Lazy operations @@ -2436,6 +2446,7 @@ def effect_mandelbrot(size, extent, quality): """ return Image()._new(core.effect_mandelbrot(size, extent, quality)) + def effect_noise(size, sigma): """ Generate Gaussian noise centered around 128. diff --git a/Tests/images/mandelbrot.png b/Tests/images/effect_mandelbrot.png similarity index 100% rename from Tests/images/mandelbrot.png rename to Tests/images/effect_mandelbrot.png diff --git a/Tests/images/effect_spread.png b/Tests/images/effect_spread.png new file mode 100644 index 0000000000000000000000000000000000000000..df7cfa4745a9acdf92a4baf1727c731741c3521d GIT binary patch literal 43292 zcmV)1K+V62P)&%{#8reyD5OX%k_4cPA*C^*Gss^FZe8wO(kZ=*gl801@NhoFLONv40 z1Hb{M92u%8A_;7!ASDLE0z?E!Aru7!HUtzRCZtAS02$}1Mw#tF17m=E+X1?eRHIA; z9#$d<06PS}F9;45!UjfoV@;&BJFgk~lo{2B_YF>)89ltORF&4_HI;%(9T$BjAk?u8 zxO5fG2s|GkN)Q(z^0`V)2)JlkI=St$9nEVOeER&RHP_DH^u`Wm`>v0pain8kaNr>= zf*8@_ftzL0l*|Q6R1jn!`S|C4u!AEKmZ7d>H~_s9M%*?Fsa6|rT`vN$pIuDQYn>46jX&k z;Ss_};0lI?WFd$`#Gzt@5MWGK;?7(=>3gbqUmaIU2T-wpsof=44#1&lycR|$mR zHR*_N`+}>JCnXt=O_-KRS3}4`4E<0LA_eDxzzQKW^d&_GVK%`Egq)}@b9ri1v}?nz z?fbLYlO5;WvJz2a)pbiP+xA%)GQRM-H4p&+0EB@bSdxP%@f4LHZr8@7V9uTEs)g$T zCfho4&CSVdKn7a7LV;k%3wHt`C6^fcKuUq55E4LjKolSW z1X2;)6O2FvpaekkrAN4A0C8WG0_=xDO|{uK5{99aQdA`LbjoP&7@9n*rSs@O^MqO^ ziaL#O=|JWK$*2)yo(+H!@<3Ce=ZpHKbGyFVBas1vf}-pBKuaoKvOe0@7UoWN3=|P2 zydi-ZA|6MGC|gcwzX5WdOgo zO@TFOy^t#mjTENL9Cz$QY1B9qqfpT`!AFq5NQpvZLg7;t3E?ZybzO`g?ca7%gsK8P z06=nFg8_N%qFIC8towLBM5HPOD@-_8MhxjuL#5m^O{K`x&TdxRaU*duY%w|%TqpBM~K5HjfWtXWk*dq#Ze;!3O; z8#kP^U156x7D$&NRwDvPuUPN_D%e(CTINcw6#&6qMMq39iAc_+2uK7&Bp3|x3JL+y zgsMeA=sT7Q3n7e?{aJi-;z{vtYX212%+$ig8h)Ik+>5ALKQ0f zfC)yZ4s8Ia&j1BL3-gNPWey&;bHSa8skc>mbPe5JCwFRzeqle>b{<0_qTf|tR9_An4#}&e&L&xi9^TcFrn8%#c!pn&h(_I$RND>7if^|Ycx#Srp4jGChW2TC$qDnHI3>nJ~+fiLn!V(}@*DwVHV1+6gk~R>b zZ37aa0+=xLxsW`BFkr-E45-)-0Y^k~ZxjtK}E#>k|EV3g31z=A4pbOjh&0Rm1Mlx$T~vldaOOvx06N`^vwhNdiT zESIpV_?&4{h5!Hod{tpw5G+tc16(Sa5(vg|Bpz^@-F0+$$MKUNf4%(Hi+cu;b*Odu z^(%@F09eV{+zSE3^o5U440I2ggeg2YYew4f{Q%&5E^7e*+;;xhpj7(%n@1GI02IKX zH}CTt0(bxkBHU&YV5)j0iz=9yiPGRuG>ty_uzOUE(O*C-*EE0oEz(M5XTY02no;g6ve=S11NQz5CTpS z;}A=z63GRUkg*U)6u?Hxwy7(9IZ+wM5-5oX8YzV7gdR;(NK}H+aQi@}S%m-vEK2o& z1(X0wND3wNLLV{0F~o?(8lz!<-YQ!yXD{`w;nJzTia85G=n3D=pX%Q9>EUR^pjy=R zUB!&?vZWiGBdw=%XyUlkKi=z670Dc5O{PjkPX(?Gbd|d(a0CH1p%98ds%a6g28ymH zVi045v7s;~B4?g8al+iO%T`wI{l0DGs^+SswtjoQ6hIhy2!v(J#Z;C(8AYM(3Kv9V zSRBcE9*8o|Tt+MoF$XSCLqFs^AchHpqKwq|5kVC?(3i29|3EhH{0gQOS zgw!AeO6Rw|wgUHm%qCrgp(iYh+Xd;mLNX6&juTQt;Zi~xr9cL5fI%4vNK{I(1O!$@ zu%RopDdY!!l-R?=h59N@)!ERnzzBp$WJcF0RAD?qfkyyQsn0+J5fu<(>MxGWykq?D`XRFz7eDjXmr7JzCL2_P7!kf?#}ATdnKgF<4rP{OJfl(M!BDGUe| zDD)}SX3tA~zbzNo76_SNvZGN=NK#o54Shx>F1Q%0s+G@=6az(tN>EfO))Y?_E|<)} zL4-&a5F)q@ql6VG6fP$c1fdYF6i_8701!f7Dy*r+^(2;DBcVBEw2Ea4=O9$Tfse{o zz>OGQu*$8S%3K>uNp)SDzt%LUgaRUIL<~VPoTxkmfyaGE7K z?IVhwHjoch1-L#J)Db$SfHCIe8Dj|~IprlD1e|$Dk0Bf~8MtL%!6;TuJH9>Ma@ttP z5yS)#6Hw#$yI(8y6Suy(v#BY1>t)Zq@a~;A-uUIuFB^aJxuYXdRY>L5a~ddCzSuTM zVaO!D>yn8a0oNx8qW}WwkMzVVb?K}2VA<>J7NvsSlcfesHm7A69NjYj31Ccqy}m&7 zsKns3`IVVUvrzJ}f(esY)jZ#+G=!qUXoLbnh=KqBhy{V5nCb#R=5wi=8VQB4HR&MF zCs?YW0Nny1oG2+TF&aV6wFp8Gb+qcyxD zaLaLtRE+$v5D-lzlp+!WkmrnrIHoCp6UYO`Jc%&ZVjzS(uyl-M>-v+B2*&kO?|q3W z23Wat&EI-^^L1-Zzj{S=?~zu?{NKNEvS+Bk9QR)zbv*UIPCsCZ26!kL=g)l9js<`S zAYi#j26}Zf14*a_T3T1rs#J~0=t@X*2}!x&PoGyUG1~a$@k~Nut3UAhw|n!f7$SlZ z;C*>ZazPah0KhEID+f&}KsYFrd>g4A;|w5(kP=A>rZPkz#u5nt0LKUd1Km$siP(qKYb&HZTHZ=@W>&${OtJ1AvKfIsOlZ~&h~^cYnCtZ zskdLPIdf&HV8_;6XF`dv;fe^9*bfO+K{TRhI#F>*k)R}O?-(3B)ouAxSB?}Y`IAkH`T$YMR`o1IVtmhORLJb%c0U(U=jt{?R{qU>t7q2_<-k0$S zsYh>UsjN;SW(}9z&P@l1q26{*&1+xw8;SIf&Z~8OCk&Y@4T^b0L4ohbb*=yhiC9`O zG*Rev2RbCw5JD>Anc8HrvtMxOb`3_8F%FOrv}F4u!(PP198pA2yi!ZWu;4Hg(Na;x z=V6%}p%fY=eh3wUJx*hi8!F~PLZL~oB!eO7`ynuLzRBvRVFn;C4ckEg%?xr3>@mQ! zLaQ5XF2x)Cjzj+OqxloP&Zt@b$&-p?X#VLG)5z%;xI4G&2|YS*rSt=woRnCxqIvC% z;cs`OWBTrwUg5x%JkW!J3`=S}qM#5EVFxrjR2(V>e!v?iv=p3R%(T%MIitrnQYjS~ z0059z5?BI_LW+103WR+T$3hYz5%e@wgOX`PTDIl6fdT;l0KxFmRex+*IXQy8!F>47 z4?1tW;Mp_I8T0RNhII_HMfdFa8P8|`{cOmRN-Q2#2vQIhLWCS+sQO-jkmn+e962~d zqdHZ@H=my5B*{38rK4W=aNv|wgG$Fgxwqq@tL7}3TM+;pQ_T zW;@m>lcRMCjUb0c&r6LTRb7L^F%!yR6pb8Hq*d6rFSX)yUOwD+ytQ`S6~mvr?T2b{ zYb*Ag^qO@B7O_=lK@s$n6`$$lyvvZ%(HGjbm5Bm?wM5kLbA_?v>JEN?*v|V>`lnh4 z2w@oczRRT*Ac;9gfHUT~3i7!T53r`0X$}A-37;v%OsgtJ+=4((xb(a~-Z?#YxLZkN za%Jzf^G98^vUd1X@v0S-7>dvKIb#~)Ebv1vplg+i zeDd5TiM7MqhR!%|Dj^O8pmYC8y*8yq4Gz37HV(D+dz;@sdbr)5HoGcU3bt?R!or1s zIRP&gTor)0iStFfG72kAKmjTRT%!a4Kq!))+czj8aSXYLV&Qrg=R`uq2LJ&y92u($ zM$`3uwt^ImNofxa-se-w*SnQrsfZBt(o8C z76kF4Z(t}yF=$;fFcn#uj1WZ|@u&>lilo+8@Dad16G$`S8b{1wP*o6!MM$M4Sm+g* zF1V!G&a%+>Ku<*XO_>)&_i|lEEaIn|Jra*LB=w{*QZmS-d5JU&_I?rOO2uA86~FrQ z)zO8kv`9QMcU6!bW+awcwIXxgjWKFftXWl&(B|CpKulvvUDp6$kaE}4%=nb?284e5 z$)0IbYKQuAzU4*Jrq8iz8jum4hCJj#z;rV1JCX^)O0EV2VrW1$h+<+Tfg>h>ynEx} zwy%%mPiDI}9cn&r?a0n9jf#*`jDlZ2xNG#PX?I-s_XuJ^IecSFju220*Id^}5SdX^ z1a?>+;Szu_M2fIK`k-sWd)pbL6{G6wo0F~EkCgj+P%IX!seARmN06$%_fcCaf?j|1 zP&BEmT3x&1^yYWpZ})6_LN#!0k3iU4h9#l$Q25ZOOn|{04<$+_;();6qVR-pBt=+b z7z|n@>&Ri76KcrPFaSUr6{evuq9P*(64j<6463P$EE^3RE5j#-QAE)-1pvU^Vrt%e zS~*5btBP4+7Xt*`{x_ddm68I6L)VsCDjLCEUu@8#v5>(d&;D)H^>>cC{H8wNtgSX9 zF(aQZ?LHK03MjkYq2nXf4Jz;*$b~o5&qLvP%#~_!q`*TSkAwTT;@tX zrC0?#rGiK-SzA{F5hO^!ZTFv-F+tf5()Cp*PnMcTrS*vR{wGH-xoE;i@3k&nP^nc^ zCUIT&&EP68NDs2$uO$SXC7(d%(4=5a_X3R1rm6CX^tn)s6GA-9k`J=f>2T z;qXA<15h(PQre+4Of)K5?BOni962?4x|jxeX*aCI@~ z_r3Z2kPQkhXo@nIAs^sk(M_gPk~zLFrca2wzDgoEt_DRLQi!2o61Yf7Qp5^*d+*6% z?y#kcYZN8PLrX$E4BezjOAduO#xBuX?zr4BZqA54u`lX>!$M+b} z;+lklhd8QG>X(ZR_36B2JLMANk~5aBYJ~ZBeg^H4Qb~NXHS1dC3)W4c2Kem#qiZgl z&aD7xaOhZj<%AZ1z^?C3mP?_e3Ufjurc2IrO>t~riN@SQwl)(Tu>y>>>PnSMieZSk z=S!{V1hpw$NFX5)e&Bd49#w`tq7vdeB_Bqb;=z!sR_cCHZw&Qn!)ZfQ5zGOSKs^b7 z6WW%VZjfFvQCl-&Y4r^`21g-7%^f`%iK?I?=48D{MI1_rrx@gVBcR$*4YS6zWB>l$BVTUpUpBXT(&!2; zg&{>}T{IRj#1(jS&wvt-?c3TenV2=Be$Mn-FC*NX^pnBdFEzRj52#R(X*k#*+rmi*4Y6O83+Ifsgx+c+OCnL#dkZ$lwSzJCA zO32H30Tra8z#4J5Ry}1*ydf5wKGTg?L~FGGHT52AbB9YtO`TRrFjUOidSX_NtltRS zfsVIcTXOIHr(JWt?McoNRg6?RHSgz-OsI>Fz5A!Rg5CG(E2sJ_MT4P0M-FuCJ2ueX z-XkoFKqMjIOr1ZyiUI7q@Ud4~e|p0b9x&BVEmt}=AsC0;hN>EpDB||l>-+A1VqakM zH$J)|6@!^L{p&a7M{b=0Lmqg{v4UvKpoqAka6Es+2@@tE3^2F&{x=7GPMcENk8hcV z&N^>)^O%b94N4>mJBF<6kq%xe@834?;RpMV?`)eexhkI2XD%IY4VL!p?cIB{uyke& zQv!WEZ~3}G`-`A5iIZlCkpd+evO^Q##ZG-%G#6&UnL?DgHRz`zivZD zLNO97WWMbsBca#dJ=~Xd%Yh7tFG-PWB(QB8=maG&8*H*^fg|56A!r)>I-kbYr(xg|MYi%Etai!e*W{xKf3AIQ;*FY z9UXJSO$%oy_U`F$3Vu^_?d%CvMHjhcJ6;_}z9T3sjO0*TY#2-C+187n z9*t?XihP126!M3kJD@1hvz9m74FCR>&dyJ_6)iEGx6_mjwD&1_@Y^rRyBqT9tB%Sd4`@=+KMvnC7m3U=Tagh;YIHURn$Z~!F z^@>U>k*33Wo=I0kWqHKYGf6ES#V~@1<%Us2RIiw&YCGyLs|s z|2=%)^>gq4$F|?zFhx_ncQ)qNEw3V&go0w=W2~dFELG(<|7rcz4U>NH^g$IN1iVNr z>PzCgAps&3A{NoEx@6`vuk2kkw`p8++6_@v0{r)#6YExw0stW4*ntn4r&fksce4Ql za^uHGo9Z$@xMZ$bS2bxy6++;g^TvL*$FfW67h49h{kat@CkmJ-hd5hiT*@I&L=~?( z3UZ->eWyAuC_}E}1tDaTNJtQqen`9^49fYU6}SO+%N!#pq?95o`(jk1E+t9EO`IN8 zBxxp@m+f|)0by1|CyZj{o&+z7k#=XeKr36~<3`8p>RE3`srzvMU?M15+#ZS7kI_gT zN8%ESkQ3jWruwK^t10j_`s-Y?eJgzudb$Q?cA#2f&4&650ZY!kO;%3 z390J(O3!AR3Jo*)>Zhj=rUy?Je*DAvjukXj>V)zTMpsTXp+FL<55I8e*ROVP30X@6+X-D~;j#%`Jp-X#v<6FGeBCj5e!W}bXUt4~zNPi_c} zF~%rqg0PT_r_55nUFgrdu9IZP;w%fSawMU;GKr-y(v_Yt%!=A*W%cN>qX+iwf;5>M z%B#&&l-jv*?>JRWO$DJ-0D1)%2qUSA0S#Hc=N2rcCMzj|N#vgY=5=POqPkithky7_tBQpJg+}S&z54;OI0HmAQq?s# zUoxv)28R!J_w-2!MSG6@=iN@EQZ*DxM;;vOmVW4ewtiR$7ZX5C!X#ZdqXyt;v@-JL z_XDFU(XNvNOBd7uiO*P6?QvRN9Sgi74a*LsVI0uvo%kuC@5h*CZghhy$ ze*SDAM92wJGzY4*dNi|LEn@cd=S$^$Y*eG5CUCjqfT59q2~DMr$am*EJEerqNI#jr z-0In%sZw(rUp1&7I<7)JT9cu;fRUgSA`tKZ1U_fJ?}tJPBm$S&C9bIRA9xs(aLjeL z&bjk$%kkg;{LrE~m0T)UUOY2ZZTexjbyp`sBy{`(2L_UrvAeFA^vRaK>WD~3z+c`t zB#|coXG~EQ;bY^xl}%0%K6%H?pFMkAAmDhi_2kI^y>KLC(u_olu5W5&-slJc;HDc^ zUwzU1K;Rp%nRES(=e(A#BZ=bDAnBGSX{T zk7BT~qCOsN$mBb^?ct#-ubEURL*aUxw{`75nBRK1bfTj?GVCgbQgAo|RF#$jAcH*M zD4j$ViX)}M0vQ0<*B^#NPt;eY;zqITL`|BcWzEe4qHq8e35cO{$+G$Th37?tg8=^Z52ru!!hvX%*q(?*=(FEB zWkGz`7FfnA;-SFX+bj>t$N%%4?MTZD|Mu*zCm!GQ^h@78|H`h|)_##sMT)KKSHG3A~G!R&U&wzvr5%JGY&jF|C3Fl}|q#ANcI&Pi%SWftAisuZ&a{ z`#ZlofzMrDNs#jJOZ$Jgtm1`lOJ!f)b4KFD?|n~lRmVZ89D1T6lbkni(&X`=JnTRD z^3J;Y#=)WCOl8WkidX+&Mk*PXvV_#o7LX_g-nFM^>eLEC;rH7+7cCuAnbNa^xv*qq z>SF--2+H@~-2K8!`!;TD&-D#8R>oWEa5kW!poC%{k`Ttsgr2wkM9e4_eJ1sihX|z+ zQIMYP7xGa4ezwQz8InBxwu%N=jCTMy|}NXI5X5CMY0PK22hvTOxFi74qN7#}B? zFL?Oc9k+Y1V#QszAp(`<7vgOnV$Iyw<{UUO45i$@=_FwC(c30>*fOSyapNlQeCoi| zxnrnVz5YPy`G+3+)zka_c-JB^|2*Za+hVKEufF^zyE_U}fJa_902r#StwI>abolt^ zBN+OuY?Vj6d+#_?HNjA!@a9L`9)EsEtVWwOVQf!d-_P%ydCTR^ciucNl_XpgA(jY9 z7INsiip1ob&Allk&NzK+A_G()Nl+wa1_+N!4nc6q#p4oD4KuKPcRv80<&t!S4itRX zDkiYdWe$dH(x?OuT~!f;xPW_cm5m!iB2k6L41nZ;@4L$u)Z#P`Q_wCM#K*~MtIQIL zGmvF1jY>@9`c9n!L>)ZQVU6?*6~YQbjG9+#_{ES{sj!Uwa=H8X$f+bzgf6n(qM_YEG8m|BV+agzr9j z!=%a!Z~D~_r#$igU;g-Zn+l|5`)Pv|T&yaDlHgBItamIxpsb0)A6<9a-~X}ol5?7V zcJuQ0J{cB(y!G}mfEXlZe#l29p+bT)dN6l-^=V5o^Ox1@QG#H6+MKFbUDe@T$C>39 z2a1LEzSrMs{lUc(m#k>4sZIs~Jkg$&q1{p&r3&>SLYfvb-qC55T+b;xOK!Tr^F`K@ z`%XeTqyT_LS1pYvwfwLHpi&wb>dOf&qS=8=RYXh(6a|^lq-w@S`b&w3k?rVgS$q1_ z6%&U>ih*yY8d9oWhN?_0Tp5|NFi~3%5-GDbh06V?VJ4{<4G}Ta0SS;wfSb*-FjVYg zo?Y~VfMNQN+kV10Rinv(g>!DbdrNmA6QRW^7YP6Z#~D`}Vc75{&WSENgDyBL7viJG z%VhrAKR)mx^R4=%_NP1M7kf?u0Guyh`0dko(r8>c{l@%YR#|pYPiudFF$i=mN<$7j z0J%c&aNbi;U`FG2+;YZE*Dd?oQ(tHlKK$55)kGJb-|+ZL$1c5aG89AtmaH(4V3c4K zaIWye=3PZQm;3(PZiGT)B>Zx=CZiJ#f4QOeqi;tpyKKs?EnT~J^|f{lXOd8*&~}3U zoDHE`$dx@i00jGiPzY5G<;$l&0wBa1K|BaN?%Ce@=e{Uptyq%x_F2h@8_yVy4TuoQ zy6QoYNXF^0LtT!GM%OAK3@6Q-4FGUtMY4J{;L6?&$E|Y0%JJfmfcdN$<&lWu=kv(a z`AARDb1KZ1LK#<}S8VS#BdVqw!fa3=&{Q3(>AU~&kTpEuTIedX1U|2eAp z``bpy*4M@AizV}n6W>BDDYk$3=wtV78L23C^r2{mP<-kAchMCWX_cc%IBc3x#faQ= z-cLDYZtuh8`hB>a5XvyX7g8Yvo8Y0vkS`Z2(=NyMZ&laPnyp`aYtBmL#!EGT!| zgM)-pA|=tatxx_{-Tz+r^|NIEm(#Ai6|cT5Vq_HT(fQ}!f6X5m7yawsx^hM#F>d_B zk6jO-URfXQIow7ux@gTKcmCrrCh7|xJ$Bc*_e2vJyX=f`^U0gXeERk#Yq(_Fj1b}n z;OYNvFi7~okI#7QU)zes;-gRQXl^!zltGwFq%cgP|nl%NUYy*mPFhCrLcvXCOD6EJ| zjF3xpEuG|cP&uKcbnGB*n21#$X(|8!=ZksYG#l%P)1ky`ya5j?h?+JwEB*X{T0Mp5 z+kl$JgaO5bfJvxeRkcp+iHx5o0@p}HOF0KH59%pZGsO3=2}s3^wbCnxrmB4VaK(MgjlsY2TN1Ql%EMH5G?z|>Kr z5xPvcUeJ{ffae($Bdmj%KI8O>hdMamHin?}lg-=SJP?$M$KU#F>Z(bnEw2Co2p*bo z&B!DZH8p~vXoTnu)gkob29ZTe4+oC!KBZJPVBew=5tqrb7MPXMF;kRckB_R$IfJGF zHEka1VJM)7S)rXrTaa#s!(D+@0$6kWh?5KShKV5)$nN$X<_vTK5=GK;O9i_6CbIY< z;1zX4k=_0N=+%0*r5+Uy!Glw08nzC=Jj-O8Q6tEB*`bw z|EJJDLIrDrZ#;zKF;=6;p zcJ}nO+XnI((T1}HBaF+@xPp+tz<#h^S=3N7iE z3SQ>{O2y#eo6l{l5K=G2Fe)I{prDMG9k%L@wO>8)84infwu}+| z=&>&mxR zSu8nShXlaV>NT62tiCR;)_Qr@REIPj4|VpJix5d{Dsxq$E8dZ`TkFz{kJ4nn#3 zym>6Nksk`?P>p(d&nkr#qpIF|V|P56ZH%~>%&S;uz1xwB=-LNRp8jH!Ef_NOZJl1-$W17f|}Gzv)ayN&I!y40&L?SmmD%scbU#=u9e8xCYaGO8#FZfr;g zK34%mSeHJw1OKa+b_G6?Fqk`yilI}3d%B7t?bxxkBs5p6H{!Ifv+P=BT2YS(!hX4A zSutIS$MuMTMCfs^OpJsml^hpXxe@?CIyq$b+c_HvdALjU(rLi{TTM@Lw;WPgtd?PB*(qBd=D66+VtVpb{^z@{(t{-tziCi{l}L*Kmhu`$F41w+^$W#vSnb~ z?ms^Hjmvn+c5k|7?xRm`e)iux08t))djEgkK1iW6Wok4i2<}-(H7Nl=sz3ycp};R< z=7k`JfTD&_b?t)7u~c=Fh||xVECa|w_2jlAt1e%LnRoHUQ!cu8q7T$JUq2R0nX#lk zdX!OcF%xv8#8fOo=6fNR*wqvzaCsuamoAU1wG$5<&K*8(t-JfQGE3$)F(V zafXS^q)HWx1;6wBM{mDwDOI(nU)py6oy)GhaOyM9e17L$i+*_7EC%&|y|5EfN{JAR zdyep2&R_t5z?At2s=`O1UuK>limo8+dt%Y*3F|*P`t|2WkO9ZesfAu)|Mp&@Ajn~% z6fhvOxjcm2DLJ9<2@zzHloBA2A_3Ax2mykEt+;aemTlh7FAgm^f9A9~Ef^~c&um$6 z?t)y=(vs zC-ooPQ9N?o@9Q?1RUUT!_WGl#Su27tAW_A2{TJRlDwsTT^+MkVe|vtz9k-t$+yJPE zdEmxtW+9bvh%jebETU=%N|noyO9cTcr3c@?VV%cCTvx4tFJ4ryL`|TXJzEZ(9O9>~ zZ8^ESTZXO&D2CufS9#56Dlf}dDoEl(UTjcZ*AG=R#nB0{%`BFxwV=SB*%@euZc{lF3nm5qTz@Ui3g=T z6eYgk!7_=0}u^AmyTzje2^?b>e&7?VaS%#U3DgWvIN_ej<~ zXIYhGh1#h#Zrh>I_loU<%yXR}rdBn2uC1al47jeTj7vq23Mqpi^leK>=sKk{e|F~= zPdxSA)BpM4cYpVzz_*=OUjO{wa~`xf3$3nUok{#2{9r@BsjfNfCNT2h8S(A=OZneaD^9@mc6Yz{gHcrfMtw zLe?17s6^zx?~dpOY;7-BM#H&tYI0>cQuH9_isD0|YDoBkvOs+K!4b*b02yA0Uw-0L zqFLR3(DZ0!U%pg3-RRF&6r4cUjlsMNogxRke*9P-iHBGN00en28CS|4QtRsXpOT8I z@7!xC&0`V`RlR*D_I2=BMO}NZ{mEx-fy3&?OwMOTys&%FQ~&Z}`--JAo_S-Bi%Wn0 z)tjJ{-*e1=_Ngn)sw&yvqg1CoABuribIfEuQlK#qt4N!QA9$`JZ6}wLfFF75DNM+h z|NZZCzx#J?=LXG)n?w75{iDai0ANIy-+bZe*IYDZ}(1`Nai-sxk}#Ku`*asLv@S5D3i+i9#ZrON21O7*d2d zL6C73c%jeIR6td3{kB&Eym@oZ9qLUsG$QHx1LXr9&Vi$)?p)Y92$&W60Uy&4Er%$k zDQZ+H+DJ!%g5Y_#Ezgz`XPg^9|0ioI;`HDD=p8$uHV$&<-F2RmlhOK?Xgq2c%ISEb zVnWk!-w0rCWds2LKsZdH`1Fv9fRyFp*IV0LJ4(rTB;Pvp?KkZx7VGUl(SCSuB!Z%m z^z@1o$M)@dV_PKaWUg5^WlT$|P$cPy@!f~pG()-Pm!Hp`lzH^gZ#^%7EFVc22&ukS zBkZzPlUCz#Kfn_B3IyM;KmN@}N6d)PeC8GYVBcw1Uv=7w>Z&EHykp-C_YVC2rH7pE z!w>*D)LZBtzV8RWLqxvw%~5wGXW*P?J3qPOnPfbPF}U&KMF;jC5uCx0vHXbiEudjV zhlEltd=>f{<^TYyMRXkcp^sJQg$P1b0EKX_QPp?3q7&9!_^pIiCAZ-*;Y&KM4YvSI43P+FQWPfn^&Z~p#M5C)%~ zb<;e1#F5si=-E|0M>Z&VFw|vFZ5jExJ7$2P*1fsf%A}$&jJcODA%g@;;;d=@+dB(W zYb)=)v~gFLF|ipTj&~@oww9LJ^%W6aOI5P>%F;IGpgp!fq*HG{QZLmeth@K}4~VAPM-%WB;T`j+t+piOQe-dc!})PH-K#yBDsB#h!ltO-xusH!r(z!SIn2 zMN4AchyZWU4<*oQN5${CYt@r4ZoTdL`7|97AqIiXA>v#KVH9B%%5um6@f`^uf-Gbj zgaS(!aT|Vc^Vt~DKrq1g!bP>~zwKXh?l`Z1c-Owdva_cM$Ru+mhyk~7Xy4G0Q}(6T zPW$@(!<1quxe#z@#IC4Ggl>>fxhE)wLNZq1N>Xvo{?Y8O|9#XKFkf=lT)EIXaM-3* zqi1J&`W?Gp3t66Mu^muAvi0t&yQSFl@(C6{gqq$q{<&=t+vyh_35K z$+2MGwjTb)jRv-vkRR-$N5B2x*N>j{=G&*{k3!XR=Y`pTrln-`nSX4&{?^5Yjsp)d zLO|$Nr+gQtDUv=^A%HUUF|;ma&o23`7q}1n^t4AF{YoJ~qwvn3TqqeN zAmk!|6oWt@8A?@U9);8k{g7&@Feqc715{!mrbzf4B7rpw0c1cm(vn7_I`7@ys@7C3 zJA0H2*vW0(<8DL zK{dQ{+u;do7U2A`C!hT~k|| z8U_UbfRG^s7$FpLML_|gk~5$-CPZ2(ZQk5bwq%d3I9&rfK07H09Y42*JB2r1JT960 z$%lul6L9xor#gvQ=%!=PpeTZHOrba|Aw@L^h(&Y+!0dGupT4#&6!@|`S4JzUOQoJG zes|m8uzKM8yu$6l?(&eG=&3KU3*Xkv*!OMKb4L4t<<=b%p=nefJcHqV|EK~zGsCKTe~CywBRs!#<2oJqxh{NNQEH|_oFTYvoZ z)sKGh$$@`9`(?wpm{XJpQ>dB0|N9n!6fbXU8UuhMBme-ABPXy8CLMxP6EUsb+as@wTKnejzL{S0rgQ6uax_kDv4~AN5%CRX+_HWqR)7Do# zes;O<7uO%X{fwF+ui|i9ZuGchPk*pgznK4Y!_tYUh#6j0v$+3bk&y zNzqiS_>Z@TpZWdrS6|t6a**Y1tP-YD_{cN&09`%u^-k(rk*XMx0hd$&%9!_;zwf#8 z%F)T1i0cZ3F%SVzV+1NZ%wmK90DeFr2nEtW;6NGp(m+T`SuTbWw=`GuZ9h>RgUeSo zw{G0ix}|&b$GdlYeas!~n>$`Rv8Nk&CCNqOxLVh7nroEB^C|#@rhz5r0L!X4Wh{(D z(fPN}5E#ZPE4)H}%Gl(n+C*q0D1&21i?O6XeMaW&b+I(;s~%MYq&m>k$I4dwfqh1- zqB`y0dBM10%Y5~VJxgb%KKSIoS+kVazp)M+=~%O%rMt)0&1xi^zTTd`j*aurJ7-!; z_3s{dcirj*_Q23vZx3{Ksf3B8XD&SNyqZ;ul`!z{|M9Rke_tx8cuesyOX*JgB3s$`R@%|S+Dx9~l;+}^$ z9_{n5zUmAZ764p8qrV~Gl7suMdhGry9)0fd_n&)ZOL?for2NZsJM8`eipekUnv!!Q zXGo745EH8FFbD#t1cVBp&LJU+Dv(A%2%#z=GBk#ert^3@9#IaoJ6)EV3lxEA%ZeGv ziX@k4!RoO>)ps1uH8rO=rEh=SVWhP&%~99mJND-X`^z3ezQ^J!>Kn8mB2nmXdA$`& z5fnzweduN$x~Z9UN4`0lYRIVRM&If`xo-d{&A?0(COTvbN=+cT(K2RKWm;GzAGtwS z&RRHg+`F3wjaam`-5nV?g*?04Nk$Xk?e)9cy9QFpDoWyg{oNPcb>8%OvlgyxPNc-* z+4_fj*oMv7cmMldrPE&F_7OGq*GJD&RG2UFYEq0>BgWyt0QsUT9T7kOioZVc za&ycX*HkyM_r$deO{J;j#ecr_r$28DN3t`g&I%ZF8UMrm%N-9@H-{LYq8%(-F)@|W zE;wiQS?4SwYGP!h=;h^4Zk`dViDM8zf?CE`2u!%|6T$@pP$R021<*K9q>!As00mqC z1_B`?fsc?vuquHNa(V;c68NsQ{>u)pU?*E@<}a+5YL%K$u%t#!@|~9tPMeVaZ+r5sL)=Jz(xFvn%-zS@LROBO>c(Svq8PPxHQTm* zF=@_93cZ4{X|x@@_ra@sl!>QKjmSEE#_}nRwWEK2{|~ObZQY^0 z9gEIeo{VaHTkT)`X)|}r5B~TQqA3QA)l^p{;+fCC*gthvYVGotnx@on&K>Eto_eFT zy{%|DFrV`f_5p;RCpc4tV}+hau!CSALJlQEf-|3Ks#J7FsDNMHds!F=2)GaMqNSrZ zeSL(5QgE^6!U>?lOjpmiW%Bknjy0XNy0ByS{^Qv(X+bk%MvC0@x`#a+SCr}Jv}}C0^FTS7 z0fpAi@`cNjyABunia1*?#v`P)F zWnzYehHBy+o4yz`d%5uC`cJmh+o!%8QX5RCy{O-P<@kTSeXMubzxdMAXD>(zU_W%v z``j%Pta79iQe)Z8Q+lNc%)(n@W%?LI$U>LsZChHPb$?_30qquQQW@N~ieAcS!jEj9I zW5T|I9LbgID@;pCOSS?2TQq3%uthY3|z+C;q6BwgD0vglaX}2y6ECl zr*iXFpSF1Z)Sv%;YocP}!*|Vp|E-UIb>GWf9VX!6Blj=mSWzgGoGUmC39-vARAbmQ zzWMIZ73VigtYbw4C8$MYXImaYApHTBIa_*GfABy2NMaoP)H!Tt15^GW%%}u z7eER@z%f-A#q(#??%vjkg=Y&Qe5WC!x3pBg^G)C7SB(Mze*LXeL~=w>Ra`B&kPyZ^ zml_5IVJxaql|qiQ`J$oe1uv{ma4nWe)u(&g9M>r(bfw@1gd!_CH|ZS%GC1DtjUJV* zP%V|{54^Nj*JG(flu}wdYHH`vy^Sps=S>d&@WlG&y81$~>;)14Fn8IaD_4bgJ^Xzp z8Tak{($lBeWc(SUd+6kOR$ng#-hf+EP5RO#7}V>kfR&@^#;Ry<-#|#>4N)Npbr0=L zEm#`b9w6x6AO7j_7w>=RH&0&siyK-`4*ltOZ-s%M8avtQ>oiqy#Vt3!{LdGB##JDV zcw{7RC3TfE2P>-Uii>pAY(C-vuSMt1p$voSP<$%<-k;9Mnp2- z1ptI$xcsKI7oGFmPcEPF_SYTpmN|R3es{r{Gq-F%x@_i{Fy1^g;_0QW$Fp$&2=fb` z!xSyDWaX%@KG_#aUR6Ey(23nMCXSCLs#c#d@!{V*`|NYqh9Gg^sJ$>Vk|zof!51fL z&Y90+rQC=YR;f&>Zi18oUSc3gm_y?6&?)laei1nO#CbcPd$H-fi`4f0=G;Zczuz~M z3nLAq>*IyL|M{cIqf*yHnFL3HZW>I2)4I0Kef@+lM-T{h*Fm-n~t?mV%xEfR@CP3a%VLC!1V zSTLeureta>T(=Tkb8f6_ zAa~=6Dn=_M5aX@ALpk3&bey}v`HKh>K&h$_(X{W1a(jC?(s!!IMP7;dg&?2r&6aU> z6K$Bm9D8si`?I^AiA2%c;dIeezUqdda$i<&z&nz_V#2n5eNv0 z3J7R!tie8y#qs=kV`M-P6Q6w5rmNW0RRDQcPfjI9q7r2)lBTMPP?Q`Xq*qlLOIK9q zt)S!)OjuwQQW4}a+?Qpgf(>ARK*&5d5Y&WHg~B;-vOi&BM9LN8M|%wH*xi+xGJy-= zkL0eqcJ|Jb76Sat)9Wg9Z~FM^k{!ANWy_qQSiYl25)3iv8z^H;^4UVEYVP1jsc{Z8 zt5eT?VL!Q9{`IXR|N7_%;1LGAzkM`l80M<6%8g57BR##LRa&y{%G%LYyT0ELF(V)- z7IUS#Q4=5h+g-XI?;R<<@hSi9pSNgrjW_+`<6337WyzA_!EceOfJw91U~4pjV?YI% zhS^+C&fomP>sl&3jHwL7=*AjqFq9sRlyJk?@7TUvlV;x9<7BD{i~> zztgU|)*-QfK6BIFVeVnHG9_cyFDc^C) z=smd!=UqCf*nQL;>^$twUO29BsFlxeV9!7QY0K(s<}Zk=hOT$)?sV1BmC^39laXAH zsQ@TS!_>zdk$C4vAcGkdHn@@zutWD?LX)rw7W;h|6Y8v zZ2PxdHU|Lk>G~6)8`joW96R2lC^A=Mw_G(pmXws>=UzT>@p)rn>11(mAeD)60Rd1s z4-f&IxddxYzzIM$(304OIzNW-Xbw z=$xfeu)VwcLXccLvG~$6@25|@f$w{}r#E-UPp;_PvaMEn=`s{?~%^x`lcUTb=pwYdh4~Xykhyni&nh( z{`aN^9S;NHNkp!@V#TX3eO2b-!Fx|*06;;Yq9SewEQHtyJzGUg0!({PRPyn!rxGxC?0F^Co-o$unY%>KOLa3ZYdWFtW z@b2sTF1l*r_n#cAOv%1HuuFC_MtH1Vw+DR&1J|Mo_P8{Oh$Rv(6K`!E{_Bq?9^2h* zhlE5kfBxUehc0b?bAN12eb*kbxY^zH#o+>H9H@Fq7n5od0D#Z79j00eYhmc3Og!`B z-<<#JpS++)l0m-jg3~9?y7Hn=fB)xwefYN9FMs~U?|%CGi+eu(pkeV8KU>t0{?+?m zowj_A5>G$=#Jg9ntUuJ@P90^W=PXn+6`10!uf0F_%y~3f8X zc_yL!==wRtj4_W<4F^I(*X|!;)s+&dx)+3|5^-DyC^~?lCS=Z~5C-X}Z~{Cq;KY+^ zT$3dSQw0_|MU)^3P-(cJsga9Z?0Xia3O|a*MQ?%j1c(t2Z#Uh^!JH4F1f*D&+q^BZ$F2E{r1nF0=o>5 ztZOiQX>uM=f?Q##T1bQiBz2kZc}`s8UZ67HtFASDANA%)$yGE3>&%1i-gH6lu+>ZaYR#O9q3;5$Zu#<1#}K^qss*3FwSD3!(3MAupj|`O z@g8sWtR%u=(~{HTL2mQsJFDXIql4jviz?s!Zs36j&-~l#PU-N+H=I5Cm3!$O+K~n z*oI@?sG8VCmoMD5rDOlTHKuQ%LIMJ|YNym1RhAg^3S5VdhsifxEu4Y7BmmwrV454LNilSu$aN4pu z9lBgnE`n7TPdwS@ckgRMu>{6)>6w$`gnjqvE<+D%$JB?8Z~InbMp-#c50M~(v~K$L z(B9rftEUHA-KZ3NX=`}z^>d&6SI=#$dWJnUS((-n6}vZWDU1xZZGG?9pko+x=b?kl zCChHOyRoUMvbrUbG-8Us`pk=vlmKY|eC+@R-mO<9hmm7}CDGl{ar%#lSIVXFauMY=%zdg9S3jzQ#mFX9r zU*FtRg+NFt*|_mQxloYI_kECvz;?d`Z-0SjTkAonR%F)sy0 zfhfb6_XWBy$#BsjP(UGS8*s@AZC@gvi&TP20eZWKRS3V{*t7V8*>2J1lCu!aUo)|0 zT5XWC000}_J8Ds^R+k395gAjtsNt2eX+4KE(Ygesv%EMnj^QTiMju{bh^VLgS zF3(*C5sLo#iS3X4blTl(o7|4_4L42w*K_aj5*nYulN)P4_|vPY+W2YB{m0&X6AM({ zcKGoZADTF}<>!C@F=2KoHxzHIRI8={S6C%h%H_*SW7ApZj9Ig^t~tHyyUm~d<%Q}+ zHr?4!1d{dP-MbG_^dOubVkl27?kstbsg~n%O`^;D7SY zvC61gnW6hmS`BGxdm@q0C5M4$&AI4|LmzE==a|`;AOHaB^jv<+8Caut-~Ua)u_iBA zHgsUe_!-Mjp4^vC*W`QJ21@1mD_01Pk8k^G(dtWaM%(oEtGcdDYcbbv8>~xL-gaZt zYafi{hWZw-n#!EQ+Ox*o_p@()aqfiJndkR?@MitF7nQ&L^vfNs7hZL4Fok8)wPs_Lx=W`z2a)OSo-4eS5LccH2~oI_x3J5W71c=Up+q zFYnhh#YWXe^=K*)i)AK_?dLN*q3u5r*0 z!b`5mbMoll?!E2Si=ydx@2Qi~2r{(jgOA!d8eDxM9o83c$j7ODd`|k+=a8N#$s(m(2?| zWTk-g4pP+HUo4j$PpA&p&i%pE4?gJJ_|E=U{=4sByOXL{cy+Q&u)40*&PsxLXH9@ zAp)*Pf$Nn6&tZ-e08Dj*LYTEg-qDDmBT2SwDu+UL99$lj$=~tC&8q%PQGW z(e@q*J5C(^ENC{*ih-tsLb@f2j zJ?Fe@$FV2Lpz8X7KpI&fyr*N1X8mWm}bDEv${9XnZ_w3=o^M{IhpAEtyz%dT8-f=fcJCGqcxva!ux)X0w9C2n_8+jux$xlk9wdqB3A;sQk#PJ25UKUM$t`{Vc?zc@o4-3ebz%dh=3sBzcgM;_4=tOZeZI%e zyX6U$M#GFnyS8jbhVs+ksEDM(oi)e|z6uixi1G zE`1>lqDx^10nl_LxF8T&BI-CL0Klw;spGqHhM{2Q)=y0x+T%`}Z3rp1d{dhG7}jt*hz)$KV@+l)>PG8asA}y{<YgLdyZy%`cAZVL}L1Fw_f)5Kfh4UXB`eI zV`>mEsK$LOhmn}Ha_#}0C$))EB z42Iu--Dn;y0Q6cl1hBHx$~SKOhSe!ktZ46zrN3^nf=}Odlsyms~-E@ zC)Gp@ytfxati()u+9Wd{oph|L+;?o3?|YCMEX+=rJfZz$Y0i>4yEcCh06?M`uWLdh z-9484!J3uPoBEw!bQ)&x95&^i4(`1kM`S--?w1T z_Jg17%RO@6S>JCuG__WB1254yUTIFEz~8;M|I=?yJb3R}fR(w&3MWq~(Hb6Rh3_K{ z_qP`oU3=kon~L-FlLMu~wA+4q*M&cM=#HgNzqqZG&#STcs)<@dO)@%f*@F+fsxarC zhcABekw?6C;yEI07>M{Sp1G4-9-_fMKVf8Wlnix*C4?R5$ReF)%&s))<^&VfW4 z(P<6C|Juav{OPi1{Z?-m-X1ONaLcs@OHto_X2{Z3lL zLz^~KtyiLIl0&5+VM>XVvEx-$bp%ds`D$p< z>X@D9001+FxHKVhw{OZXI&(by-}UG0Xm_f0c){6C0Dw2%J0Sp!#*MNT#%~|r zTdBj6dD_%aQLWZf zv56BHfZS54T2>7+d*l=}6L#kjqaq1a)fvu4V@X)o05LBfI&2yVMx$=v?A~{B>FU|C z#AuBA#lR2UC*R!l^WXijJXrkmU*8#9qmB&OSN-TB000aJ;uWUwz2QOj<~!T3xqMbK z6X5^}#t=~gm$6W&hT1jgSHyvoy6=}vMHxFiwq--#tOcn<2g8{QYxi#HoITHkSjiQT zX-bMb7-^8uV4T9o&RP?Tz&=Y{b7s@O-|w0=F5cSjU4Qu`qH{nKZJW0@%%Ak(tGlXZ zo!7PP{ZyuMay`gqT`xLyptYkzX_=Mo?`%8yeP{fRm1>uVs>^QgeE9{cA?gfsEgoBSVQI&vKfbu_!CRIGeZ5b8dg|tLry!mW zYFeK8=T~dbUs1|Cl{H!w7%nL7GAb6Pt{2woDz5RzPJl~5(^?<=J z^c5po$QE^tFdj0AOjYv&$wLQ2F?VUg=ad3lsC8SvY+JO{;7Ad)hNwU?m*F@DA@ZTp z(Nk8D{QJN5AQUcH)?^}A3jXhB_Wt=V-!{yfD6`q~uUxTwTstMWt}e3kP_8rU!jZO_ zEcA*OG(1owRn8jHPVHa%~kwV|^LC=?Z2vfP!s zLMO7W7IKKUZE|*Q%mDzle{o{bVj^OrnK2F$EQ;;G&%rPhp-K`amLk#LpRZ|1g|2(* zVE3_ZS0aEZz3H4$kVzR$Sp&IbTEFPZ1%QzKd)lH3X&dSr5mU`Z1bz3lU9vJ>9?JD! zb6VYCRk{kabakFMvU`(VTL(a-X~x?8v9ET2Ra|q`orT>WC6no%VSDua>3@9kf0PKb z2VQa0x^u0*ww=44c=c37BRD9u)J0;Aqn>(a<8LpW)ZRZbuAxcQ(2?Ho{uhq?<;SZ9 z=Wg$@icF%^doX)AN{cRt$!P} zqmV+So~T;2vVlgqkC@}`-goHJZN+#@eP(?-@V&W{%vZneXsn1-H&#X>{^;rRfA_cb zx^B9z4FR4vHNANCTtw_3L>TGVD*(s}PQ=h0A+Zo1&D8GMK18LgpE|C3Tydx~TRDC* zXTic{9TEWuJS+i1JPd$pX1JF_Y8?J$?NUf%x=t-W7%5s&MHd2Oi*`bn!v&Cvfcqaf z-RkKY>dB9qF=@l+#}_WnD9I`Sz!x8P3&gD4h^~d-^;b65)wZ4JEplts*=KYf?#omg zZAbTvnLIa;M!miD%iVqm!WzBMH1Fbb*HvzL>D5xzqVLyl>Kw`?HF^E{EgLos-uCRT ze|hnbZ+qy*SD$=s?eghwe7g51s}qlXHn?(PzhZOoZJ|z8{e!( zV(!2oj_4R`q3=LNavaqW5SWH`4ncDCaBp)3Fvm^vP8<%k4Au-$EW=RWyVZp&mL>WOl{NmVEI|253N60v<0RRQ9OHYj2kJ5 zB2uav%KJ>mlyOfGSC~mnbIV!Ai6Z57SI>Fjje}RMG@Iv4*9<8_*>V(P&{-{H*N;S3}ICSp0i$LcWeTsBTwDVwFBvo0vU@1h{XUTn=-akx& zML)c$XWJ>0w;kL3A&OspqK~gxREalwFF$$7&mR8bKkv6PK-yk;>9&V%{KG>pJ^rV4 zyLz-oU%NQ}(vxZ|Ri6T9Eu6vyA{yNHkN=#$pg!M9a0)&^i6y5+zkToMlG9Uyg;0w~62nkn1SIrA9x$9h?x3VG zNfo3cyKf{f6de#UVd9vVU*4`T`<3-Wf)$>6Vsmk@T-S_c=*=8o*MI25lCxV5?C)u5 zh(?3%>S*cG=3GN?;Ec74$5fyXj(~G#Ra=}@jA?8=eB|?|pFFT_d-bGRp(&Q-9D3^m z5hz;a*jP>V$oDUueZjgXe*f>1!{2;ygX@P0m7F^#ot!@L+26l1w+TP|hYfWV#_z7a zU&BGXF7xhz!iMAJFyyT#+8UD*)5zDmdO~*?3ar;Pgia2LP-F+VsVI_9Sh*Zm)CKv1 zS3k)sYc})+x7EXX9op~3mK|WsM0%bT51M8RxxyKX?vV%#Bo77jwFU2 z4`$BdOIB5F-vxp%H--0f{jV!ytsn1WqT?Dd0YlB}A!S9itkAim(^X zuC_T6EPU|ZC6tmIf4B@%ENQG^_T5s=5iHsj#PAa1jo6c;CE%TuTFGr>iwJZ$20~ zRot`N&SgUx)UUntPw#e58yC;|;E^jQ{^md1eS~CpyTz5XVZHt0dK4BaQra(Xo^aLG zt7+931X#zhQxV1IzA%VaQfdiRA@VaRP%irr3rFZW6)Hq~w)y*Zd-GP92+=JYvec*w z%Yz|~smL8Ub`Z*dvXT@w!Y0Hq1c3l1DwJK@W0oCAXy&qBLP0;ge$hZzxm=(heRNn) z#|IA_b9#G#m-7R(>wt3k^>Zi1^FV?trk-jaG6x2_>YJNDJTyWYhbDe|zRm6N`~}RjF8d?z`c1%>4aj%|E|n(i!tASs=NQ005|& z3LL5MNBTu>gj*%I=+^hTNte80%q-Bs*3$2jo&7&$@mlDin zu3J+mr3^qdS4N6r0!fkJzUR)Ep&=rs&jedHh62(>=g;GS_MfsSFEY++s&xsV&@-5r zOs(O}5zr(GL5Wn7XiCIX`f`QFad9R@nc>RjxSpmLUOXKH#ri4L?|j-P0{hGNx3=&9 z_Pzh?SUMvLAb4eO4FF(jv~d37!7> z^FrR~+4%Lc(IdkJZ|hz@{gPGBetN30Dl&Ck?EQ_$yrFN-Sx`4FHQ}B=-FMB!3(aJ( z;gt{LQ6hS~QmOQ5V`5j#O&sYe{r#Q&uYS`lc$go~C1XI+s3CE>6f*QtnsH6TIAAspol>E! znTfsoIc9LfdN&@0*vJ6k@7>rrH0U#khfbc9@doJS5jBx4Kvs}A0WcKMfPYwbnjTGu zBf~u<&IPQE%0R$7?^*oe`zOv?H-|GzQ6+*{F#pBp_Fa9`ybs?x004+3(g*U%h(;Pv zryk3=rIACW8YTj-Jfy_xD(hSNdfH8sR5exa`s|CAY4h9Kd)(ZyvE%1L8m?P4>Gw~* zPeE|+Z7YBO_iry=ru(i6Iofn|*u%6jiibz6S)-%1Cjb1Hw`k6od?DX6==AiJ;)y5# z;8&N83j-dMM~s@$ve*kr498;|^IJfhNI%cBM zJn8nE{`}~*(^-E9scHDtGg~CpQZX%`EzBMlg$V9ET!vUyCY0{1Nb7LTswMy-plU;7 z1;$MH(6CQgnOSzpjvEYt&~YJFKyJv2CJbFe0f$V2Su1C3|MCa|;oNyTGwJ|itT;q6 z)c_DosNfty6iOXPAj2F`<3#${4hjH~#nY?Xx`tM+m|j;)y4u{H?vbATM@CO?L=Xvr z-hJi&OQ7q=x{8Ehz%z4Pu1jt_jkZbK)SWto8c?jbEba>|ys#{=%i=4*;w&y*yc9}l z3l-`vNzq`d^oHD8tcxwG5v&{)E>=#&9Z^t6V?TeliL$Zm_BfL+ zefZutUw&-Sqc87v^GceLj`ukXi>EgQ6cbZ4?e(auSJt<8gT}EkP&A9!4CUsX(`kPL zE~LFkhm7B{2*cBwrpgg7R&e!L4pETtmF!)=d*0(F4V6B? zx`4ORQdNL-3L?OA1kv!pnX^=fom%Be6-+H(5WVhOZkjyYqn0m~^2x5u*sJ$${5Cc?(lBG508O{IA{FbZ zZ>sxn-8ajYtnNLrIivDwc63aYJ6-V39ZT&wo3``0t1fI}YNn0u`SHw%mPjZR&0t6{ zjB(4xo%GH(nXqxCO z?R8`}lpJjx%7DuHF~qbGFp#^*ifS)^x9joyRzLCD&j`v6OAC}fqlC9;d*YlW-+uO! z#tM(!HQxsKm(3@-PY+*n@1-0`L&TV-Ay6ix#tM8X#Y(`)Ijmq6Y=`0*&ViPu+Q=a? zMcEK5iU#IgJRLfQgH4AH(IjizI!12bCH<@awxvcO?QuEgFYTIOd+qm z{q`XYh1`f{YL0DqvZE@X)C`cXy<>WnZ)E<0uz}@^*EABx8X1UPd_ncWK{#{5nD1Nc z(71^F7GRx1-D*3;C{&PFpYdNzQ1MoR9k0P z_YfqAlX%t@k_6gS9CA1h3YSpPQHXQFam9pYp;=%f6+sV=@=!E@L-~2y7&f8~ML+)f zP6#QC$Yh^3r6DZ%;lXZd-|zeU9_HceYO?83t^dsVvwU~_uNr)JN&HWQyG-Qm@Y2?s%n_YE*rXR43Qmk5DV!rZD%ROLjbWu z14<%*0#*iDfQjWS1W4~l-gH>6i0*!1mTenC$c-EWajGcr4)%e33OUS%%>#$FcV&Cq zKRZ^ovPr!D)=Li_>03G>98F?dGY@?Dwuk2O1ye~4&~_4f#FFx=WwVP-+sejML%ruN zo8tR)qkOt`=U`j!Gq*kELS{aLubmfWDLA9K(n_U1e6`)N^pl+<474)C+3C&YhQmf^ zv$q;8c#ZuTWrE@C54m4Coax1BnrWBA;u>D2I6|p!$#A4P_0S1;u zu*lr^@sU%#@xf@JY4zoQx?!$|RYPueS|yzUPV4EBgKe6Ka$W(CW|VKX79?bRzG={8 zOMsGi?cF`P>Bp2Nt8p9fBF;dHr#V71$Sa8!qIs5#q%4NEwtRh1!yL<~XZo1)FPnU1 zPaFc1)dnH$A{cOV0U#a{g>q~bXpRx1aSAX2#Myvga@xFdSQoDZd(H$$D(5Ea6mrkxNwUR!zD|zU*Tt?5h$BxDZu6+LaKq)(^!V4WV z_lCQT0+sDMTh&;3{A^-kW1XwCd`=zz_l^C_myZAUpXSY5R9|3x58iic!GMR)=2Ka9 z+p$bIL|0aMZAvaH^&`k&UOINF`_dV*%Og#wWLd_!WNN6y%iKKQryDjaaG|mywUC3* z0IUSD29$*DSQapoJzcrBqseTaXlPU*u%&fqC^7itjWZT4o>*E@`pBKH{&U@t6>}N^ z04z`9Is2|FW;m9~A!rb$sn&b8Yjo50{_?Sv4z1gI=I%Qdc;r#W!YVCG*n$#G4AnLu zfj}i3O;9{byLrhn^<|e%GAw55ywJRr%@ivZbi`45Ap;ys1r%*3yC`TPObEaj&<@38 zBqFB(@0hW;soLGwIhZD%i)OmMKahL!4-HD*Jk>dR{_3eLAr4DZ1aJ7UQ_U%tUt5cF zTLxgPT-HK# zi3=tQkP+B1rLJ^JO=k4lmX=5oC-dU>yV_SRnNA~OnTiky+WDN3jWL|Z;W-HfNr-;n znO|Ogs5yGFvvmIX1jE0)`s)){jQz`(ZGiKVY|N9VbsOTQSab5CFioA)shLYzg7C=FkkyKuAHeZh|K@kUksbfu$^1 zJ+<}MmV}B#o}RU=#sM^fv}4^!&!1TRY5r%Fb!2zWCf}#g|<-xpz3S`><)7q;Ya%=LqA=95G89U)hrO zxlKLM@AA4rQ&&buGNLy?3ykGx*}mQh2nf1I0f{MF}6bFT|)eKQ;6 zO41Tdc5@gLsF=)|mP|(<%@He;P>EwH4zH#XvsXRZ(Gl~%pwTxyNijsGB{oY+jCO2$2 zN+U{29i2C$JQtcE<%i}x^5BWM^xgaKTt1%d?Tj96JuO1xOCpbhQOg$|L;A9XF3v`EFcK2 zj4kl8000mX7Fa6ea*ij3uwd_RPbzuiKtHz4)cNCO7THbX>WtBNRb?@hMVmmzA4ZIr z?CUv_k}`C_0)enx}b7g6Se`xfow+o%lej|_I3l})YO&?=73*-^`%08icGI! zTDvodvXZ*eI3_UT!ttzT{QJ#AtJW@!>2^j}GqlIh8IM;MkS4H9sz7YZ6nQ$SNK+ai z!=O;u2LPBlD?sGH=C2Pp*xda2K4`>WfAnKZHz;C20tq2E-mnfZZVJ(WV&JvS3q%&u zM7v;m@wW#v^D5{ImW^|jFu!ezHdKflZHH?kJzY#iiORTnhw!idXZOmvlaSr{_6|J| zC>k6}XqIX@Tvd@DP~vbZ85YcjN%Mz$4v$@a^Y;I~Idk3n^Ux{1 zxY%>!t&0J)ac;!0*t}wkGSm&mp-?iJiG&4cgRbr*002;e&r5mT?98RLw&eg?I{a(L ztYsC1@mZRNINy`EzWTSf?;%KM3ImXJ*^Wur3Sh>aI)bGzSIz zf;&=NNXA?xLSZz!b1ymFovsOFE6S=4bf#8M#kF(hKK8=StYS}}HvZUw!=Z4nKcVmp zTT;XoSIzKM)rBV1e(=cstJba&OKbLj`a|Qanj`yLY8q#w_({2Zytiu1=I=i8I{BOm z0YX?;3K_$|EjT*GE+A?iJPFY-_)6?Q*Oa zC}27c29l7EWg{U^|8OP}l5G%uLE&sEly@HEp4H*J6o?c_nDBz2 z9B)a`v|Lu|$!MA^a`}|9{IYt)@`mA198VmJGBUT_{N2A^Sn3LiXSV%5ZpEti{<{9! zTPItTS1OG_%edqEPte#fC<}6Gby;U3JCj9{tsKPDXOr9}!G_FsXy@Vku!}HVUEW)NGGnSar$0P?k#V+&YDBUxta(Gt*H*t3<#`RexGN-go*B9N=0B|ee#iXTb)Bb<+mtZ<{EJ+bRqJ1PdG&2q z1;@@f^w~Q&H&QlhIS?3QG`fHLW?~pK<}EpPXvfvJT=?V1-)ROT@>DXd&72T8*OOHN zLs_a#u#2Y*!m|Pc4E^$%MSI#uSI?4GPduEQV%zStK@= zWw|1#oawV@$T-+LZG5h+@2USDdj6&B9)EVz>(8!!cau_|4 z7>e0rLTr76YMwovase%CmAj3Oek)k)0*)=xh{#@wa}14XJJvqFsVuEQMaKd%x?B6p zCpG5dv8!&IWojlMCe}>=?Dgw9GNaMkpI-ByCx5#4#ak#~sNE;O{=5xaR!g_07}mTA zAtX|uShRVLZm5v^qw1GG9DV)qDT|ksa5V8n=q($&0bq~=Su}JkH-6*Kow}A=b?qu4 z9GDSu)WlFA;+<8+I*|S9lP|E+pHHU<7dh{$KUhFM^UJ2HQX!Mfee?H6`g*$pW9R?= z(-%hkfKB;kFCBaLoonPsB;=D$Z2lF}a>1}Eh#8k_D5k2|;UE?zo?>}OBLIM78Vs_( z+#Llx|G~DwsrBJEHut9c`aKd?8uD?HAmJ`duxf($V96PAVqBtcAp) zVqa-ho!28K3Wi~mY|O|iS~%iAd$PwR(gHI2I|rlyU+gErNO0@M!B1cNb^ZEtoXg9( z16SR7-Yo%+C~?0jc#6Mr}kV--=1BJ(5 zd+^IWSsFr`qZ{h0YvwL(UUvSvm;QQc$A)l4>6!k~?o-EStz1zzsX4Elojm=5!PB&r zO>O!5_*?I9_<6&Z^A^rKH)7fvaWf#6gH}GD%oseyC>CT{SXU;oEa#UQiV-DQ(oG|p z1y|1wzP+i-w3*NLjC}U(J|qSbiM$GEQTCvc3c^Z=;&qB~M}mwbhGtEoMDHb&XfvIB z=dH`75`oB(UkEWPJGXSMLeRYJX3EAQ<#{`JFqC zMM6SZa6Z^X5?3$e1$TQ(8Omyt;V{OBOE*P;URF*UtLK zgI_?JQj*c{UitN-C)VkznjaW?=cVl|MFYn^Z<6Qwzg&I6d2qqf`S68hi;BjLKe*%I z_~{dO9qnx{=gtmlt8cw%QOU5W3O|0c_wd>56L(Gj=XddE?;m&X-*&zI?Bf4@)xP6o zf{=V(6KUEG1tj3G4lwho)6h_L=G36%6^L!+3Mv3#a&u$(yvuryY#%(+Hg49^V3A*m z4#zU-*46_{R$SJ$b-n23hmy+N3U(x8gln4)9`6Y8cGjSaL+o&WtT@Ev3Y6?+)QnYJ z5^NsBo#{&_Qf8eWH#e5~iYtEDbGjY{m$a`Au=GiT8( zl&4P;cI14UcWp!+gCykl&CbS%G zUwq+IlR$xUzWCp+rr4; z!2GFIcil4CCp+V{6A<#eOkZ`|k_Y~F}=!<5B7mr&a<835o3fS>>SY9LZ1xV?rl+I_OSVCDR> z6rrtPd3eDscO+9eQ%6Il&#=t>`%iMfvN5srZ2w?hcJYW|{9eYf@Wd)Ao5@sqX#l{K zvAzQ%4$GiaG`eO+(S$0Oqv|wGX=%lQNGq7Q=d4r`0D1;v$ar0ZSl$WMyrT>rYMC;B z(cAyn@X*tLc;>^u<%RIA&pv1~9LQ@=zxK!3NvaUwzizf4q(1xxfGM zf2(ghuVU65-Z3|Sy8rey;s5=6BZakJ4vgM)|AM`p$}ivd7)Az7J8u#&wOO+!){Y;0 z!9+G2v!8ruM!2?Ow0l%bWo)QvnL&Hhpg8pCm1Tx*ezI=!jSud;Zf5e=*7Vj5Uwb6) zxxQp+akzfUk}1=wY1)erv;UVbgSCxepRnqxTYLHy!$=29%SNL~nP$st-P<>BlRRwG z`PXPE^Xq^8YvLI3o+qyqtoVrGM!?DFa43=Y_&ntS#>3O`QLTSeTRoZWiX+p+&whE@ zQgt30)5--NB3>{Z3=PNvmN?G7@R&!cX? z=YnS*e$!EMZk)8$L~JPW&iX&U`pBEJ=8W0%`!Sd7efQnpHAUa>L;JMz8mmG~AncJ` zA|jCY29QB9l;QIb&gTu$-IY_uPMcYA;g!u}8p@Zfsw){=dDWdWc5WZ-*t+wHSFdE5 z{6I%%%i*Y36nlHMkjMgxd-d%LOX?$%qXCN9bU24Ne-U7XNTm-WX4{^gV@BmkWz2>h z=|R4NV!6cW;iG5bLJ7t3cD|&MlbGrv{`ET=Zus+-o9?`r6L>(`5OJ#IP#kDKaf(<9 z(RE)yKDu*f_vu61zWubgqPC{4X8Tv4&7D2H<@nK>Mt*F=q_&pUb4RyfQ<+jmS1q}J z&xc>%{MxfL?Z|FdbHw(`479B7QKLJq0zyj5{Ob=GsdS;pM@2mR<#UTSA4^x4crq5| zY&w_83XVx2Lu)ZFr&G!(TUNo8SD3L8+D==eBU)!WMuMGF0pK{VyFDtiF4yBvuW~Sc z1>K8Bg;^mDKoqr9r3}hUfF)dvN3u-zjBHUzk2qmkKX@95;_ z?pUMA^?Q<@iPL0ISkz3EbHjP6sH&EVk0xLIa9Gs~00 zYOE;sRL`L~B#FRhDCF)z+s8Apghv7pq!95ctukovAJN z76n*rVv6AqCiwCjE}j^||9^iP)A_)Yzb>p8g21`3Dy_PcaNZGrYX~Eb9v=JYqB^PB+%&|Obw>YBd20M z7R`wmJknM*1B3Cbo$Bt6Dq-Gmv$RW)&U9zpUYTWx5C}RBmsf48khP?M32DkK_@_6+ zOq%oZ_Gr{G9AM}KV>6=&GWYjaw_*Sbu}&y^-g>%)V`N*etyJ-_#fr{!;90#&!kJA!Z?qk1 z;qsL`c5V|bgBCqA&tIcN2M+Dq>n)Ztv8-5C;7@Mq+LJnS#`@* zN-9AtYX9cnrp}d*Z#zaIDOs>-m&?&}e!shr%DKX2x6XvG|C)e?_P}K|n_F^2L#caK z)gfB}0AOCWRdsMQ-%uApL^atk(o>LkW2|$&AT5dj*tUrf&pNsWY|C*FVksuzW(1mX zMF8ig92LnyOUvHA=E-0~0ZS9AC|9<0d6U$_Z^W2spM*XfYm32p*}XsR~fYFgR%D zDaar*Erf~zL#qP=wrVm#58_z}02D+-5pUCYQ&$1S(t%2+&`Th)3rPUk_r855b+(UX z;G3^(6CM1~$H$8+y!ExAS6b>m#3WbFCR})_Oh#*Z6!r0_P6bY zeLtRrVwmy~q z2rnHs=cc=sfAY>2b7}OpltX1 z8|L18K84i}U-&KP_ZUj9xRmRT(i{a`h;*xz&n=>>@4fQt_qHvX@80~=kpsVtCUc6- zeEt4Ad%t{h)0=NpmioG*N|3XWVW+Kyb6crSd)?*)0$8&C32=9(v=Z5kt&=X zGT;BDlL8t*UIs#zwpj`T(M=FbAZ-o};ezcX2Q5{x2>^~wfQ@81-QEEhi(m!N7Qp!V z7cQ|K;1mX%F1Z@$8M~nA8vEOp7PnonvEwgq#*kGkS0;yOVjHGqnx--`vha#27hgAZ z!ODiYO9BqgvJB+_zKR;80Pft;d-b2M+x^)QLafS4?w$Yp8WSWSFcQn!y52uvgS@6Q z-i)fbk>es7`uf$c*W7ny>HL*Fq2`(}f~Ire$Bhl>%z2R{Wt$EKf+ZrYTW--7|y)q ziva)#5bu!P%I(nm!G<>?)oJ)kQE^;*bE0~kFH>ZH3~bnp_%4L>yX(3L&?ty6ym;DYKcAy0`o$;S z!nUdAlMaEJh1@L8DufG%cmH%IKQwe?XV<>%Bg@y+Z~ne_<=P32i^dlc$%?rp-#qtu zS%}0>w;nyAG}XxaKH8}O+D#dX5K1QV09sTwCc9iRWkk~kTrp;v#EA_>$Z<#RzbxD# zH8;|IAAa9`%Zk$2x!w;qk39b9LdO9>F96vWJvCI)B;WZ|%OBRv8Ye~n@56S76$Flr z$FnYptEnFoDI2r@w@u@xHMO7Uv>oDddGmR#P*94>ii4$Nii^uP|M>0dn{VsbxjQy` zZtdOoW`?6QZT5AViL*aon(j}UMJ`SytW4P^hJRdD5=$!E+A+h-Q^UKhDOv;_5qYc=e<2pCj1l+WG?)0yeTHESP&_>u$>iZjo0o#tzZ)rk^!5 zB)B=GVTb5KRgHb*l-}SQ#U@uVxoX$%F|QgkOueGibKpeE?WP9eSdtl~U`4`S7U}&_ zJycwx71A6+c>pN~GZY6es-OMPbGL5&^w(9lUiRWcFJnOdeb@L8e;s}Jrg4CmA<_t@ zcb_!oRO3JXtJN(?1xuSTbpqB32Tt|bO2Os#XL4G=1x?d5Y#>rBD+(4xnfa`4SOIUK zanh`xw`^Q-#oF$J`)LjvI1s6*J-Y9^3ogEDG_FNEkFB_7?QqwYl9~(t_wKu4885o- z-W?ymB87ah!BGskhgO!pz9n(j5}z!JHZby8jborU;s-#cvE~39LdMbxNa6t$pphm3 zQIIwmkzoO}8DeD!VG)g)q7u7MKvuz~JwnqokdK;rmSP04Y6dIhZ9{ho0CIfGmft3= zxQGDIx^;a%Pb9xLle1(2LY7rC2~p%JND#3dhte#fIjjJ!d|sPT?+6uDa#1-^2N-Yp z$4`F0XrcRTOFWT7b(P}y)lC~eY}Iu$Yl#NNf=k9qHlNojLhgWzf;+!`|CPUdQX7Eh z-+t3n?)bO+@f8b0A8bnBw6y3PTh({!^vX%Lp4B;-iJuvg>Z_mncWW%3E)BaMT^)Y( z(*YJ31v*?L8pI|!tq=?q_4oICJbq18J${}G&oQINi%P3n+B%Bd?4lcP{Nclo5JzOd z$D)I!Rg=qWDn`%lO^%Ejkdt`8^E{%ZOmdXrd1$JOCWOK+%Ox=VQEgm9xl0nTZ9!yH zj+xV(cebnlcUgs|W+b-{VGAK_7$(QD4g`*2+LVAOj@T+9HeFRmvMI-5h~v1X%%nKk zA<&3-KxdS_dKsoh-R^FKck|5J@Q{-!j<=2^Y#n>edFEZy&XNTy|Oda---B46Loq# zoiu<_8&BDU7j|?Q1mYLJIpMI929BBEztEfIA4Ii5M*>|TqDM|9&JO|u+s^EL@U;Z3G1t@?M=A}pa`};{qu9z zJaW&boxM3mzUz+Z1kpTY<}qrRHjZ(yLkqGU|L*HfnxV7F{G8Q|M}KZTu<>a5#3pFw zyd}ku;WvMm>>kXDxX_b#6-jxB%^}OpDwz>gXFa}TDnT3sWj{;IEEbXBIFPk|dFzY+ z`^N*z@4xM#Kg^qS?b_<;^9Z2x@f=o1hEMkrNC*WOult5eg9|3s)t460#KI))3EF0Q@hJT9JAKiWK0Q{{c@=jan_ z$Cwlcu*LB-a3~rIU+zqV{eEbRgyL)pIBqXRb5MyA8^BN{$R_M;iV%vCy;gsW=q7v3Os_}w5q>P-|`N>H_NN#W>lUHwl{t}C3lcS?& zd-cJ%DKMCGaemRQIfz3bQNSEFdWJI+>!5r7a_cR3uNYO>!H)K~p8N8xcYZna**ceO z{MHUwulUW*L}{HneyZC}6=JQ4LeD@;N6*ExdCE2~nP0PU%kkbsmU781ktT>`^@7hM zGZckQE#wgZEJOzezIytBIp<%cSjd67!$16#iw`%{H&)x>5&u9^xEf|A!E zcIyuxLWEk~AXy59~rhT<;zhPKgH|~Gpxx<#F zd3{v6bgpAb+~wFtKAf2(z+7@dF7pW8u7N(8SC_ zLD!U~GWUtrVPxbI!P44Ai^hNc->ug@eElW!0uMYm|H#hHF%1oz$2GA&U_%#;5MLJd zHB^XIW&e48%99`T=$PJepxvQ((=a$YhZw#n6cSvlq8c8LXh4+A=7)!pnOw#fDNA(i z9$Q&)`1b?-LjwoC`kXD9JkY&2Q&6Fuil06dRjouk0UUkC7|t}P#q-C{tPQjb+W+_= z);uQIT*ds}0W>wgXp+45#L#0Ov?4^?5U~v4B$^U=kq3f+u!UKM1&joQ0Hjz0I*?#w z6f6vJK_kebDjICX1ezv|nFa5e#YVKo5Y;AyvZ?qpj^zWqAa z6R!@ch5V`&(>MNdOcuqgra_vgtt`OMhOnk#Mtt}r!@7Kdl4N2C0Fciqi*Nkn!5`Km zPcf4@$4cl$EofNhpzV91LxW60rjz(CKj4AqXOYWV>xT zz?79aqrFUd1McslD{8HR!TG#cSKQ?dslE!@fTbk50Rt; z2fD_N2}FwAX^lvZ8E&lE^xdv8rT&qT?Cp0nRX11BVnB&TfB2%S5Rcyd!t$+e{oc}( z2^W_riKwe)5~5IFTWeX77kJ#Qt-~dL5-cijZEY{Fs)B!*GUw`tZ|*xYB#O@Qtp~1| zD?keEPZy7!J@LebO?gB(YDJg#(Xgb}1! zGn>zL^dgqAH7jT7`D~V@DR&^~cZ=;^DHrYVZrRT$rdTB~-hr;Y<0j7cg{fVee`#KH zVdt?!yrpGTEgbYzhakvjPo?N9X8H(5mBqqKKgIrZfv+#F`h0vzX)!hcLlL!*5oCq{ ziiJ?K8J-txoTnYjbO?eNQX*g|h*+Bu5X-~tsD(Hd5g>_xbz>#N*EL)H=i~{q0ptK8 zfH+1WE%{hem#~pr|IwH8F1)CAd>IDxcdvbripQF#R_*)!-29a@D~rrco4b~+tQ48KJ zBu7W8s!Psvr>0G;*}tz9-TvgQ$A8%yZ#f*Os`a^nrBmwEwG$W2XcGFay?p$nr88+8 zQ;fIw^bnz4_dLBV;6Zo%<={F5| zs;XuH!1P&_h%t1fkilZG2#oga4F|)u=Pd{{%$u@w^~oKZ8>XF?QuInc7)fb|JF+KI z;`nl*rAJQ}G{b}v)@hNcuL^i&(a6NGtpbkb1>Q6)j9EhS5UUne5p*!3Da2yh11Jh% z2ptFM21<-LwoY>h7M0os)iDdu#hb(JY;CipriqcL(`^Y~*mI_(>&WkYVV*9nbXPP)?t6N5d9irrXjd*}7kf#`lx5u; z_a7fDvb3bbP(CVKfK)sOXa2d}^D*EgP?HyF>o|K|ptA_0$}83b9- zam=iitDQDm*X^;>mO$V}Hcf~b4%Z(!xOJ$vFW#Tzgoq7*5S|pNnmhHvYgy6#>*w!o z`|q)f|l6u9;%0N4~5xV!;&MXeM4%J>S`zt(r(wxUwxBm-M{)uuQhXCot< zw`^UMeKcbmN}l0p;8=uWY|C+2fwHrZ025IFS_BcB=K(Dv-iuh7uWv+32FZQ^fUOts zP=}!yY*88GiV(*lh_jrGqFeua{j;@?-1FgI|49q<^$%aO_R^U=Pq_kO$j4?f`GSTv zeciKb)2Ytm9XSm$W@>h`#JRjL{P8Q=1+#-4^B2_hoEwm7sHo7#+38e5Nsd%hl*si{ z0$$1G4)l!ZN>=Y~@2jgWMvAKa;mMm>tcD(1fV zUKvh=< zA~w}9Y1YhTSLdTGCx81!VBCWvL)r9T{p?FSlNM#_7mj6Ilr1te&odUydA;IAlUb0RWUlXl1pZ-uURoM{kA>aEC(a z;gQj#)^Nd!tZo&7LOg9IP1<0PVp1|q4)5;o>Wh89SzY(*U@V?5_OeV_u}hNHZ5WaT zp|w{lj<~6CsV7oJI4+&f9@~8&uj_mE9ASXv=1ktjMbjGG|I=6R{N=U3zyIh<_r69k z^i>aEAMgvl#Bo+c$FpU7zS=c*Qe@c-kD1rr`QOOd{@9vH;>On84YLFPJEZb1F_%|T znSA}^shzE-B-TQNDk&}N>>r-HXyw7(zgHBw+RpV(s16T~WE@a!hCgc?LUL z5_#jo#f`u2=`@wR%PV0^w}A*BTXR!lbg;UnYEEGIz29>8y>Q!>*FS#XfqCETg+8vZ zaC-2cuOFFN0vD`q1OOO??7e?G#>(7;`pC(Se!t8MlBa(tF=xq=13R~QJ^oBKMRP)# zzj$P%yC_uIH#!IjRZ<#IHKS)Jx%{Hbx{m)!Lmqm3jAK}|Yvf$(;*0P2?Yp-wZDuyM zI3^^2T2Yi$(jK`;%P0IrZo@zVZ6k)Eh-m|fqcli+AcJTGEE^)MU;tT801!GBMl=Qv zgAoRV0f9lJ4IP1ql>g0(fJT$ykwszV0P2YB1b=z2? zS)Y8^AtNo9w@k#*078!Sd89oD&rGfl^u$d_6Jo=Kv+CNqVgr2%o&}0Y;8Sa_jSs~d zCN|Ao5Q*zc0stI7e7v}_s;%`*O|Y=>lcT7B4a6;gMC!TK>o%Bp3XsSTBFA{Y{hV%-!Q^M=5NuLI4s#L!vo0Vg!b;9%3mJB{^0KGLmCx$m4^G>M#N!*l`SG5dsa$TLJ(evKMj^ z7&$=)%k`Wk)Q+>G-4rVmm%xR`A}Uwt?fr7yE&xEWhri_hI}UB!9UVLaS)u(%*R<)C zl^*+ahQI9Uvfn;w`}X&Nx87cPhBif5t-if=qK=fS@pP_*nr*Drnb^L;i!k^l`IGaOw~6zb_4 zKpanDa^CWbAtxT(^|KOlm^`6IuWcW7(?g3z>>y8F|P`JTf7LFy&!bgiRX)gW_a> z0JLpD(KZ2;V*ty5g4ZGj!+VIH0{}qC0*ctCLl+gHKnbBZ-e07gI?k{f309Lr`rTK4 zaus`=yn5r`9&mA@rsfgNeD~hEwfA1}{afpc1jEPaX@eg~o3(yYP)IVb`z7jv8)v-v zX1h$=@dBX>3Bm|!UZ*6)*{0+QxPorh6YOj|CqkUINO@V&k)s`woA0$5wCYtCr$+j#`HW+LZgE0x*N@W|)d9$Mw=5wY}T2w?sHvph>WZ3Hw1O`MRwZ~2zoU>@z{$GEoZ>;l%Tqh13F|jmt<^)@1 zMPHfVC2f0tn;OcUF>6NSgL5M0o>6*gku$xVK`hyFvT*sFGR<&AnXz?Ul2{9)?*3$5 zrJDj2#WD_t6ej{Z&oZ{}%cco}$AK1rG(=?myB}V3>zysX?mE}m3Lu}3CMHzLvR7#B zi7{;Pym}`aODYVfX33F0=aOmcu9kFx^0Gt^2y`rK5ab|&D=N!%3=6qzO+($zJ%{VU z(t(r1h~;Tul?A<}0fL}y5p2a%xt0TmW?#_cjGuGr^iV04I=a6QaqL@ zYFJ1!ZWd9Mlcz?bE&FzUJJ5MDF*=m>M@9zP)9I8~Bx@$nV~fOBwr3@g)ie_TEOVxf z8HS@x3~A(47xR`)EC7gYu+TC!70{w#v5?TT!vII8ARt=KvP}j!5MTlwn!x}Yj)AdZ zK?smkOi5m#>yATVZxB!n&}}n1=-6>=64~YZ=-Gb~OT~t6sJYAUy1C`oT|Hf$vcM|Y zG%LZL0y^Gn`ish@6f5UafG}dImlb4o`8d0yU-y)agGOdy9ZEySaxB^7;VHmz93pmE wZSC=cEmOvi?;X}fNkWd}3An-`&MVUY4^FCv62gVa^Z)<=07*qoM6N<$f@<3sHvj+t literal 0 HcmV?d00001 diff --git a/Tests/test_image.py b/Tests/test_image.py index 77baf4fe7..00fbc438a 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -152,7 +152,7 @@ class TestImage(PillowTestCase): # Assert self.assertEqual(im.size, (512, 512)) - im2 = Image.open('Tests/images/mandelbrot.png') + im2 = Image.open('Tests/images/effect_mandelbrot.png') self.assert_image_equal(im, im2) @unittest.skipUnless(sys.platform.startswith('win32'), @@ -170,6 +170,19 @@ class TestImage(PillowTestCase): self.assertEqual(im.getpixel((0, 0)), 60) self.assertEqual(im.getpixel((0, 1)), 28) + def test_effect_spread(self): + # Arrange + im = lena() + distance = 10 + + # Act + im2 = im.effect_spread(distance) + + # Assert + self.assertEqual(im.size, (128, 128)) + im3 = Image.open('Tests/images/effect_spread.png') + self.assert_image_equal(im2, im3) + if __name__ == '__main__': unittest.main() diff --git a/libImaging/Effects.c b/libImaging/Effects.c index 2ebd9f880..32fed6ddd 100644 --- a/libImaging/Effects.c +++ b/libImaging/Effects.c @@ -124,11 +124,11 @@ ImagingEffectSpread(Imaging imIn, int distance) imOut = ImagingNew(imIn->mode, imIn->xsize, imIn->ysize); if (!imOut) - return NULL; + return NULL; -#define SPREAD(type, image)\ +#define SPREAD(type, image)\ for (y = 0; y < imIn->ysize; y++)\ - for (x = 0; x < imIn->xsize; x++) {\ + for (x = 0; x < imIn->xsize; x++) {\ int xx = x + (rand() % distance) - distance/2;\ int yy = y + (rand() % distance) - distance/2;\ if (xx >= 0 && xx < imIn->xsize && yy >= 0 && yy < imIn->ysize) {\ @@ -139,9 +139,9 @@ ImagingEffectSpread(Imaging imIn, int distance) } if (imIn->image8) { - SPREAD(UINT8, image8); + SPREAD(UINT8, image8); } else { - SPREAD(INT32, image32); + SPREAD(INT32, image32); } ImagingCopyInfo(imOut, imIn);