W&
zPsjONzrx&@Beo*k%qQ*BY*A+5>5Qnt*Gy)!?ptMLBo0}`okmeqJ29n@;tKwZ=i=dU
zCEnTHbf9X`wuxtABtYvvg~AyBY{{o&I(EW`9v$P|~3p-z#f`}{lBtMI3sL~{41x=8_e;X`r)0vh)nEl;C5&svc{Lz-yo~#>H&M&64e~S+j1!7+u}bA$PO;bA
zxLk>G%xNUzVlroJr73%KhK>aPG`{CB19%wh!i;bCX=;t%!lx2H(qT{+&g{hQeGyz9
znXFR}EyM6&bw%FUHMNFLw``3Erg8)cqdK;hW1Od?&R{2ujfs;hN>g(FXK^gsW2>Tp
zAeh2G?dYdeAo`{F4$hvgmK%?|m_Ni8rAbm|8bXvLq%NJn0{>EY?
z6TXTp4zSMvc;o{j_MG(3XEWt0&F$-g&%Dpec`X4{*w&40>Lhs}vWAmcQvFAdp!#8s
zo23rUEy``je=|}iPW7nc8wRC&%wM!sf7Y_QA~z~&>R_@bZyRs#z;gU4H3T%^UZy~o
zmIto#z5~uJ(zPJ@l2Dn|tp^P~bacNr+Spig$J=t|Hydcn;`fR7C1!pPYQ|G6J7%>`trbA4ySO527@kh=Ff2-uWrkOi7*<`*Ug?B*
z>VCtn@o&If4ex%LnP>7T5>Ss8_YDxPM=YAwezi9=qaHTh9`t2RvIrFwGvLPU{7a~u
z`>OqG-y(JRoc(<+)TqoY%}jd-ydvW!Ps$n^8iONh;Er>Sld#i6TSl~tX-Wt_$OHUC
z=lg(XWJQ>l^HW3#|HQJnKUU!L`m;)!thOR-Qf%@zoRG)vntPP)@9$A@3&Pf6)NN$<
z|5-<}7d}nIPkrSs)2zTCBd8JLZe$H>%;AD=46IFLl?)B-?VZJVjeDWsNJ@Vq9laQh
zL`e`cv86oDA=%hHgCT+=>U86nW>3mVsuFT{_6Q!34F;;wN~bT}Kl*%jeFsBy=3KRC$hLQEOXhI4v2FsI4TUc=cLXTnNf{H!FkF
zeQE35yRKy9MKK>&1KY?QE?D
z>52PfinKVWB6=H
zpDG)`Yv0u5wlKYpl=spAjkK1L5b3iC3jA@B^$GI}(gW9t(d2%Nq{)ok)M7r{4EKMi
zAp1`#b1>2%LP1snkvH1e)xgn$DG_GHw~u3lFCw9@}4$=bgY8XHzclXb8jQP&VXT)%UexQbCX$5#6QJ@?Vm5
zs)o9he9(QLMSR;maLk-D*SsJ2yfWS%JJ_)d)H+M(1~(UKD$u=m8J+8=H=U+4(%VW?S5*=cRc)4S^Bk7$@zTw;JVQ2ZMrZs$osbMt|#OL+H7X&9hyQ>61bDu
zxX)a2ilcE7>zO)XaJpK-pdJqGt?*aiJmW^UgOoXn)A*Dap%g>g`+JR`$ilybNhP);
z!Ec=<*ds*qfXkg<`S_lc=j{cF?arZZZ5+-nM7roIk>_{Eeh`Yn`{;hDVQnrKljy+3
zix;_fUi5cdur@XfR*?B?O(irA{TJ)oK%D&LyR|t$qy4Ci-rAEyoL79O1EfkoW~Q0)
z*KOCQ3p)PWUD3ql0(h$9?lHhnP3Z>|eC`HY{cS2+^BD>s?iuStmRQG!r7FX?eQki_
zlakX@)5ByY?hd@|wAU2N6vG%Dc^YN&1M85u2_>M%vp6Y_xRu6e@w^6!f(_QzW9
zUU}d8t7Wy-s|3JE$eDWK;Z;PveZL{m>_sMXT`ruZ*4bVr^UWo+mzPBuF{ri-cwd*C
zpnK_dym_IcEMoq}HZ>TYM_Ff#B5glff%c^6BW0ekY+
z`EGIU$hcxedjQprS@Fh7FH_6)1gYYeCXzV*gI5!ehrCWzdPKKmSt&7y;Dpmq%g#OY
zC`sPyX}nsOi{P>_F3MBAp^&3}3?g@#eL@g$Z=L(Cm7d5IUF`0U^PkJu2pD&@#=Vlo
z15$@^T2*S4_XohTNaCjM|=Bwi}tZ8%Ni2ye4>^gGVM7fe-v4#l;|m^ln`cy89hP
z^@|VAxIp9NlOBUE1LN{7j-H?bi|+N}kCKw#$2ljP>n+S{2N#6cFyA$&Wui)fLO}cM
zKnW%lE=rMXI-4#~_vlh97zkp5YZwOdqxP={mk}kd)j2z#hJGR;0||@o7PzN*%WpmR
z1XvCGWb@TpKECHSw)k>3GkfeTof0B`K^FROCV&4ju_jyVd{;SH3#|I{W4koWVJjx&
zjyyF}aJIAXOkc)8lOOllnKTz-90a=9q|m;#KzqL1cfac;pm@@MWT`%+Kjg>D7VBmd>}J&jx6S&^Qkh7t|7i=NNH^^}lvCTr7n*zdo|2=x
z=`#>2B~kT}blB3wBKRf-V8Phfc&3!iqP+9F-Jn2++$fX4PNxlnVf}qy@2Js_2_DPg
zVWGw+eX~p3!*oqRWHWL^5kC&Gb|O&cXMS*foTPvDxh7V_R7*@sjt>U3j7fs0FPa{%
zUMBsfuEOnetIG$}k!qRPRqc(vfKeeQUGs)RrTS}<0?K^YhR)|!n(2cogUo36JpHDm
z0TB_TAKn?J`$p2Ay8Yy6J&|y5^Shz6EuH-5#nSN6`;H}EAGrKKlRS
z6TKC9@r<+h{)?*P^>IYnu}Jgu+l0+AYyF!3dLX#tM*QUFRwncRiwZH3k4?_@JtmW1
zAZ-+Z>P(x*&9QlB)ZcA$jJv)@EP-n|B}FMQgRZs3Ic57crUG`X)r){&oex*7bZFTh
zt};RBL64SHp2KWg=abRtIfOOv%Y2~%kr$lI$koqI5hBvTiJaX3(-ZN`N(;S58aw+US_j&
z;}`Z0@5|x|8|`CB*59gyx-Qn;s0V4S)1%qa2)3&dXdysdnOBX#nEq;dP+@7YXz{l3
zrIl+XlOGu7?p$bcQWgEuon^Fh3)tYaTSun+w74wBpFZ^$-fHOc;nfvSmK){>?aB8-
zV2$8-HPw*FoYRKiIx*?}6q%ZHYMGw?nIFSXkgu_U{v`zW!xM?@jpf;1RriX<=Uif}
z+nKvxE_2=aFGbKyBF!y6{Cv#fE^#sGYc`d{dgMuj5+xse5BH%0?K0W4u?G`Nm=vO>
zpZmUUAC%t_3gD@9?l%4hX9!D;E5aRJT_jBuDM6y2e)hDf%$tCl$x``{?wv@x+C*5#
zs>bRZ`?uJST)+zBr~bI4UAgeW{$f5WmXhTB(C&T
z!*#}VyOW9?#QDfZD~OLYCbGA?GTAY@%{d^q;s$qnkTEqXs*KFGYqMGMHC3$uQf%|-
zk`5igi`~hsTKnnF{@(VvL%>!i#pk@Q%{j?`$Z&S>$OS%M^$QA65w-g-d^&ARurL&H
zK1@hy0gOKoI!I0-U*FT#n#uXn#U)=Q$15sS3}>bu{|pAG-EI+05^7mfp=!
z?JD(nZI)hT=G$`Xp+lLkL6cOK@7Jiu;Vay|U2+zIBKh2x$eap15IGf}!Pi{fBp>
zGy+J?x){}ue=GHCjmcBFVS_os6oU5EMR{r0@Y5fQtrv>vhAO*?y?}_DysD6ZqPCH7
zu$Zq|hdcZ4jVK8Qn$tjw8&<16qvPccyg-Yo3wp7Xjg3QiIuAN($w4YUiZ65+l|Nyt
z2(9TLor1PkUsE_6Sq$*X$FsekbK+p^2tQPUP_duW`Ri80LWj
z{b0(CzYABKW@dlAx>UM%8|P+a&6!iElMKE~1AFdyP|VJ+8og|Lo#{>5LT_y8dndj8
zHaa^*Ns^5nNvs%|7-i(5y-+^CV6Uzetac*|jFN2ex`ju)a#3iEh9z75vdg9p_r9yV
ztWLU{1J*^;7uv`2iEgg3p;7!z3$EvPlc!pIMLL79K{x!VTXcI94h-T-nc?}o-R0yk5n4`WLdqm^c2Phu7R(kA}c`{CWJ@0+Z(PE=ZdoK&b9lvv@>%Qp=7
z$Fl#iE=rCjGb77ntCA=8Uhj^dG^5!&2+XS{6(mj<)Zo!HyrOZnL88jVq&84%Lbf*4
z9q?TEIgOAk3`<~Mf*P~vX@p+mQV+|8q2Y)JH_VHVSDjPgDJi(amiXRSE>*CZTGtY-
z;Zz8cFSG34e9;GeX0QS$)POH!TcE4v62BbE`W@6+kw6L*+SRzXIPbCBKYNhWZPtza
z9tkaLB{FZOnS
z(&s!{(6cm&jLJk9>UfI2ZBh1H)i)oj9CHIdan0pie5K~<11k5Vk0-Dp)|b#J$tf}+
zHe^8-QWs7az%fN~%d|h2IYry;X+WGulgO8t9NkQIu5>MeCiY+BHQ?s9Hs+vOe0EWR
zJ)3}_8^gW2+}B({_BZ)&q82Cf-?6_PGdDp+!IK@Ikyct=iRh!~RdL-evUD>3&Dcz}
z(##P*lfE4bgpW){Zgtjou5N4|1?5Wk^lEE*cVG5mMNoEIvB#%Yy?XpC)1K0Xu^&+?
zG)(laYB#>x8ij8sK+cn{N=ieI+ZLFkpyR+sGDI~DiFN(h+N|FDyM!wEPH$LY6kRF~8VEFp=ZJ#O
zc&5YAeCQfR+2%@;{~<}Nm_e)AMlKyUyO*(f53(63{F&{t!#_&9_#AGwnfv36W50#o
zB2(J2!c_<#W}LW>CZEghzHz4!nBMDBUFQ;U8lPj;csM!*_KQZ)&87SLyn
zJGYVesNPMxne8&Ppg5!r1@MEsLwq&&zvsC`V@M??yVfi2-5%h0>uiKTqLf@i`J-f}
zJy|Xl*NeB+YZ-4>Un(=X5YyvNhDuD^d+|dI>*F(;eCcpwZEtt71nGe6?)&`5>sW`2
z45)`&a}V8{)3rFXV}>!0cHSnycdT`HthnSwj_QQ&W=z7frF!$%Pb?2ud@C@DA{?
z2&Hz03NO#zNyGe9VA0f$a{^ukPP_98&oG|i;N%}%B1CL_@e$1G`H^S{Rgy7)(e{pXy*>Jul>cPJ~6k+7*E#D)q;
z0D^cwTg$ic&N`e8HoXw06{UA+3TMu|a^4C)+lBb?9}-Bk-@P+ewcX->JwauV*;n*Z
z64Zt;Mz9;7uvR@mAs|@-Qyz$C#0@m?15^mKe6F0g38Q8JE9A*jCn8UGIBQxKCEFoH
z{7Vz8F%L`6cn!wVHG%m7YX$ay%|+H#8Ry#5)k5tzl2d=PW7$wain^+Wl~ymxCm(YY
z(m5O(la@YQip@M`61b4s8TQ>gKX`tj1@Q$Y*E5oi&sd}6(*!!;n}+Gn58y&JpqMF<
zbF+*4dcrpaXm}%3qzOeBA7?w*ycBM~!*=+xMqt&BlveqCjJcl;F{rC0{2i^QwI{lp
z`SJ6HVsrehN*c9N!&1A)SsRjwzVD3n$o2D=OB+j2g~GSg0f-$4R!DTzjfR1la-L``
zMYXsu3%o|NqmrTPU6DY|+1WSi1rH*D*C5R83$&O2qvea|*wf@@N!l7K8cq~WW5g*=
zSh{Z46MA=*DLMml7`|Bz
z5e_N0;i!Y;@2u6kF-0ePC(FXz9f4Y4Amh1Xv(nd4gVg!KmzROX>g2Z~we112Vn~6Q
z;v+Fb_*f8D$oU-m&jmm$SMf&;Ys|6@I~mrsOZ{*aosg#yhO4z=U&SnT+MhjOJ&js>
z-IC*hj}k+YvTlxN-tf-#&I+kS1PaFHHV6#5HW|7a3F~fnU5y}$`7;QRqT=rTzkvzZ
z_=811;S&zMZbu29j+6BhbOq~xeY|}=Q0*|#SaV6KzVv1VbH<-{A;-}RWmSq9;+!0q
zU^VDDERFc-?9nJdB{g{ZgWcudrCL`Zaffdr&tv`bSboyiV%>F6*QYfvg**E=R(B1!
zGr_%EKapwH!_d_Pgzh{PU@|0oL;TJ9Vqt*RB04ZT?U)yl?}9K)Mp!`+pjO3rqer3S
zy#=Bu%oFiri^D^J;DZSne%uZpzxwkwS{4=bPaQqzQhL3uXR^9jU5GyyKPGa}cC6>c
z6i491x}^p)ppaltgmVK6hlO@tauFV~bQMF%kw)~BRtW&>{qz_Ds;~EPw*tJESCpj5
znDz@C_;fusdyG>eqG;ZQ254P!#mBO^DS`gQj}?Sa)3{$ag4SERFgb;8VwLmg9u#02
z0O}cOmf4IW#Y##}tP~<6AcUxJS85#2EF)+MI1=uY=u1q?j$f%Hh7Se_(D^L1FBIud
z+}1kP(%)q!6=1Zu?4oW_Z6|)uKtv)^Xz^|>lxwGTthsWH!9=o#7`}UhDk;48=(QmE
z-aoo3=R^F$O4!V@DsJnE%s$P&d3XYQ26AXPSiv-@Ync(6AQMQ4{pJb^oY9UZmGGwI
zV8TjQ)*o19@G!Ealn|W;xgs9wS?C#ikZt|W`~y&yK^{V6@AVK^{i@t315)KlW{NBf
zK*)8&dH(sxL9T`~*5kQchd87u+v|c%0(5D>V6kQBWE@f_HO05-f?s|)GXM-q@tBY8
zUo5AeqeCNTvP>!k;Z*0BHtrEWLA!P?%KzKI?x@
zOpjX`yT)s4kCy)gAJy<2P6y^w+om+O{)*DNIBmCh^mi
zS|yVI3kPe5!+|P1TXBR3X?|@!I*ivtizhoiVD2RsFe$U+mD98ji77HJcN%LwtAvRn
zq`ExLe=wyQMPO5ZLZ)<38Ne*hQ7#xStdFf*v+1Jo-`NRGOB1F^18%xmoG#29%d|N@
za}hO$MueK4-t%d@8KD5|%e62a;NoQQStwFLg)^-i+jx$*BLuF8y3hXm2|2?<69FGI
zv;bkEy_JESrv!%IAT&{-^nCdeEip40gqPTe&s8rSj07pXc1t$KXa@lT7K-=Q&SYjKG`;l(
zE*(#^XZ&~XWTQhVTBuHy_|X~_tM8-Qdye)y!lmG2hLn~b!hh+m`BdY^lXK);{}&j{
zqNnG!pe^xgBDx!yS|&nxS3P_kn!V}dPJ-K^i(H`rO7&HJOpU9U5pvQAu<-2n(Ha
zGXOn`!Sb{=UvqO}+;AIU)@mEv#O*Z+e@%a$^f`8o9KduX<`jEc{Pv98dQ6EE6_SI7jLin5z*M*E<#KA{>NC$<*&bWSM9AW
z0Vl+jB>G8NsSu57LBQgwNUpRi_3~8Zax9N^o5=v~IG4GKb~X?L|BP3?cR`%qv&0TU
zT2`sveu}Vj7e$A&=NN}9?PJX{HArcRTk7c4j+|?*0r{uK$CWl$q`Zz+(PhMDmlxC=
z>dSox?j!0%Wm0ek=b7D%jV4*NI1GSi0y{-cn0Yk)5OxN>I2er_0X-@J<1i^lE&%O5
zK;*I(TvfzWo!cH=@)=L!)6YNv6g1{l_HHRDTnj5yY4$HjhIskBLakq
zg#rK+xI~?dM7-R!T<-F6;4zdxF+#p$W?{NoYU8wjdE&etC)k}mre2xNhJEIH!9dt_
zR>joqY$7rTCJb|b8A_9B5B^0=+^r9;ZeX>X&!6$O9>MAHUJ4A2
z>!Sc}DI4t{d1U!IBS(1!nBh3?^x*E1xTEf;C#Iaqj$dUS4=F-YK}qt+nFt}003M5P
z$B793A0-G-bg&@tN-cJU2!7N*hL4sdC1-17kTu@pb)NfNCzdIxX`%WI`MC=t@ILIv%2Dks>@6nPu-s_JgDsoMcj%H=PM@?DkP<+L@Y#V3wB(g
zv$rDOe4m}4i$O_%z>99LR5^Z&Zz2!RF$-GGvw8NMe7QiwY#TIxC?^#V3Roy<{yj4?BH6E{1tmldl
ztis&|dIa*&j^{v^RkjE)(KE|Exy|%{064%IQXZ=*P>rGwPE&l-`So2NoZ*DO37(Lb
z{{!C_Alevb3+FqQ$zyY_m~4sNbZ1k5_Lt*kF3+>}&i4(98M2{krlm!nB7}KcoW7O}
zd0reaueAFTa?Fzk$EXN_0z-UAuD#8_D|fDIjfnw@h7}Q~bm_{}G+Ii!T}Wf6J<{Vl
z?BS^&h`bY?fA7pp%`{qQm@qQl4g@^!apfX!wVOcmmKpyNOqp|Pjzk0(o7Ij8_?`Gi
zj;XYYZ-~zwo`^pfm#cvuNzoKAkXQo@O#%GHzY9PPSX0W_?-wP?THW;?Ai(S5rhWVw
zaps#?)`olJuBK=mzrD9X5z%o?aN_*mUH}h8{VuG1pv6jFdg|<8pnYd&rybk
zGh^}ZFOZJb(D~1MXyVp&{x#PTRVgGul0Vh!id#;%7b{bx1i0-ZVSOYQ1|(PH!{VyE
zr0+p~S+`sFU8cLVM)F~pqX?spj!vRFYJ|?eq9e%QIIG~a99~v;%;_0F%+MwRvKdGB
zqv#oQdh+T8B}RYn{Qglk3jthyrtjyu<16>hXqgXDG??0p+Fw(KE3Xw#TJL}I<{S~G
zXGB7S02csiki^bQ`5VP8d%eev^fqdc_N%fX=Mg`8?#=h!#R}%Js*@?ZfgQCQhitxB
zWhldtG0C^BN57%*o>J3glaX&>sklV}SMi=tSBAOTXKTCD8TWGkHZedO8+#!tO@@>7
z?M}Dw{K)uP7KJmvhE=l{yUWzobUtY*llGjK<^2<~q)y!|%2Pg|P6EV+jbjo}I{(d$
z!F0Zz%CQa~n%9?qtaX!>(Vh?Y!T@(J)Olk^ygJG6s9tt?u8YUElOtu`6%gXy>A2s=
z=1O`g-FkM{ky|IQTt=ZPIR5w|_osdcM66=XEH1-HfUx(2GBt|gVQhcO9It5#D
z;qZZnJdG+s(%s}w38T!rWWqlMn)DPu{~u9b85LI(Y&$@3cXxMpcMt9sBv{Y@!5s$o
zFGz5Q!9#F&65QQ2xI@r)xbMF8)`DLQXZmzkm+abArSqLH=faLI@7+>9*PShE)_qr)
z1*tZj=I3^@c;eIe^5>Q!|0DqtI-7@o?`K_UWmZE|N&^WSc(Xc=sl>L)j(D7m+*NH`
z7Mg(?reYSdimcqs@X=p14u(ACs|Sl>^Pf#|b1u!ILchq`N36zm>zTcT6z6uq$PZnm
z^_HQ=0~O!?zG~*DtxI6EVw^$NweB3_1b}T{;pFI^Je*#;?HYUVDpZjo!DqLC19%>x
z&M;;Qu{7_QQlTAOa@Vh(^MW5^RV!VL?-4H_cyG=bl4!~2s@l;$9TsbDODY8z5q-4lR*O=i5>#^UkO(lN^
zK<%26o8W$hXdq<7U2waUQgV>VxW}Aj3c6NOrpQgrC`SD`lbmB*_W=-@sgenXS?8IK
z=z{6mpPrIFnj|O2IZjJVz|&S=&-Gh8GULi1vM8w~qSGeP%tX6+YRT*3&mM^yMas0e}rZXX4Yaxw4U3uklC;0pz
z?(0cvGB7m=^}xTd?G)CG5m^wtNh$EbGc6VGo(dMpajIZ|v=e&3BnCD@f&vlCqJK@a
zrFDb6$)R}_Avi3|J;%)ltxZ^1*w=2@SAKn}Y!V+74LS957S|A%=Vp105MiRx+*+Pw
z?3>EdfVp@O!NJAbT3WNAoi8t}fyqV($4WzoUa}o#YqtDs
z!ag%?EmR+$?tDno_$J3^oY`iv874{ly0E^2-H6)R?pad(ef#-WsaSNbxt|pY5O;Jv
z2x>2}otlKl((KK>fvx8+PQ;-k)%*L-e0I3p>ba5?HAPEq^hr<
z=id2qf7P{FZC%}4|0Z^Y
zezxkZVPP~fSZb*<8~9`5pOHYr0ZqK4c(hrkQS8eXoF;5H2ThSQMI$xNgXOgtvEh;5
z((bl6jciM?1tGnfxih}n&UX{Bu{}Q#m0fNZab-TpQ`~$;s3z@-W?aXn{GQs`&=J*w
z7_iX=ZTNr#j9)oac#OWpwH9%w-E6aPE_`vZ470npE6IXIeP_aQW_;1pt8rat
z8+&zhJz;Kb84njnR6CT^leGBD1!lbyp;wFCj3xKVx7?ev{0}zX1A=dAY|1@F0D$$A
z@+UZkcVtHNdXGG!PURW+l02NsH2)EkAJz`{j-5|kYg$y
z)uBA7Go1Y
z`%h1U*=jYJWnk|PbKuUus(Pgb3n}PYKNaHk0KaU}(t?s;D6KThr}liLQ`p^WT2FSO
zxH{!;3|aSpI44O?xSm&TL;rZrLV0fR<05KiX3K&OdesVym?$^7==f&**YKkpQoM6k
z1jUAt(gKsw_j?2Q4`CK_e?mb)f^K}FLpvcOdlUk@9|mJzakGV5ERP#=an3SC>`=M5
zzq%f*qgmM;mJ4!1$L!z26N!9f()%PXgc!}Mzb&oj1ol1{jM
z^;pcly}t-RNxIA3GdU>8(MZj_=ecV0+Iwcow^|ZonwGR
zTG0pQTS75UJmH1FCGSe>Bdd_b{JgUM;sRo(&F#=H)Y2uLUYjQN0YDz5Sy)19%Ooh%
zUGENKIb)ibMf+CQVJ!of!u^%IB1+=LR2)f?Qj%iBJS90A?1JowKh{^YZ4h@kBs`md
zTlydY)V4>2RJ?4^2IWyM_GjU*T3voAe7GK}qw7A15xS~<#r_qaP8V^oq7YooYbe!q
zmUE27(vAElaO3mrm6+JXRKvCVhYnG=C!Yaq
z(S@2P;tE|d8TS)dTiaoJm!YBJ?sX^7-N_3fwY-PCj}M=Us*i-KDs0<5OMhMuDJBU?
zT$FgFoS_e&X~!$EF&lgmCZdZQY5Y0;O;55}XJ}_9ADNh6)cU#`$Co=77E>-X-~(mn
z90*V7EQ7-uSJ`AmnuJvA1BE%Eu>BT@Ck~I6C(Stzr}yMb-^Mdu=*P2KLN7c^d-lG5
zvY&>L27l8;cn;Z+%MUK(1$~+swA62ONB{X1rwewq<2YfQwAAAE2V=TGxwy6ttU%xy
z85qShtWQ2*V3YEy<)bcMN78@)1;4=KSzaW5R8SlbN?X7gwn8})*0)%>%l+hJ9`cbcHd3cAn<5o?O<`_WOd49+vI8&?MQrt|0P3MTzPL~NR!$2
zEYaYknx$A{VOnA+AbZlrotz+(5zbIA-gNMl*Ow9tPtD=r$}7F@E8Y4-hwkE-_0ZfJ
zM?G5(Clw3U_UO8nK>aySn5G(9l}p1^)JuO}(7kOD|G7<)pk?z5Sw
zf4EuTL%1WnS@%$ZV^^MHCS9W9=ZAxS9g=lFgcgGqC7=-rDU8Xl<0&-k0Jhhr)4mBg
zEhFr}C#E}lm2=_mq|*!B(?f4(jQe0eziUpuaifTWUaGsSA7COpC(|(Qr;pT|N#ee*
zCl%M9*+R;gq)rPKQ{~3Ub#(pBv(%*nt2b5+(o0uA>ms(kvZ4}BOBmk$iA{(M3s;Cn
zk_3_!ziv>>H70PGjy}_?W8&gcysi=N+Sv5A=Pghn1ot8nm>EVQIgI
zn-dfb%2RQ25g4|@m09j}S6i^f0mMov84SQfG~e31Q#`*C{5g|?iGPP=Oh!(ZdW!=t
zQl?5#N+iGyx#=fJ*Pjoq3(uAk%1O2=rlVpz!Hs1-`Q%`JuXxHdIwI$AsLX)^!#p%t
zT;0h&Vpikb=_%(X@`t_r@c2z8@YCpG4j?`JA9I?c>UP?pKu`B(VU3M&aA=ybc}7j&
z`V#ZAp+Fx$@}&zoV#vkoM+P=;W>~B(rXb@QuJHcLsfTHiMNPKL5SnyliG*!rHpXuK*s((QJ%H01gJ1
z5Lt1-X_lj`2EJVel1rq1UL%h%w{ea)sE??7qrN>pM?^=*CwX}iA_mGxDk@0jV*d+l
zSUeIBw-Nht&c@MR~b79>r+a5p!%{e+^Sn3ze=Wp-vxs}NWjZfIfV
z%U%i@4ZLqnU0^3S-*OQ=6sx3P_VuNDRu#Z1z)r-Bvg4iiD=IKr+E3*n9A;hB|ugCec<
zobZk%JwPqj2ERP9o9~vLodAYChx7*%Nz=UpPz#P6Cp#2>_HNvRgA%r+(}K(i0JQ=*
zncLW!n7A1T87goytzZJ-YWjd@bKdzX;Se$Z<*ldlCk7Ogz&C&LN&|lcJvMQfbFovG
zqg~ebD&%J`??h#Uo-DyW&ht`Mpg<3;-M68q`LbiO-TSv-z8KC89~MeqciWJ|u+?bS
z>3@`LVz35F(JiY&o_5tPt9ik=fOHA@T?pzMWJ>Ai1pVUK^Df5GnX!e~TU#d?yQEKK
zMZaX6WQm=w_!-0=6BQnR+M8vtp0`F4O(>q?oRm#zRGlhvoZ%W-5=vdubu+rwZ2J6R
zR}|tzhPt&sRlCXuwHL^D$5vd*=dHG(Pk!pts3+uXvQZK?ZI=5Znu%1aw2Vo!N|FZj
zEKo--vZC61yl@Wq=V3s<8I|-&`SR7Fjbv{THU!GV7vT+gmelUv-Vc_8ciOG^peIzn
zgKF4xPD=(f($)}eo3l?ZtzDdfJq*u}nIap>fS1+k=^WMJJ6`CS`)#r90J`0qL6=2#-YSfg~-~O*~$vZ<_4&e}4;z
zcD!y5X~)fsOSL1SqQv&c$iuy_<+n!d$Wcgt5=`X67uwChsq5*5%TVbMoWX&BCE(y7
z;DW0dkGewO$t*2xZ&`Hzo0OETq+)nOi+=Q@s#dqKwmm9^<5m1u{3YHGQ}M&a-<@0>
z9mK2thsrEtv(Lumu9on&wq@IQtX)_$V((}7`nZ8>+;;Z?JK)gBg7p3zesh`Eo9$=%
zArtX;-}~n}{}sFNr;Spcg0kiDESuC~r!p)GTC5*$;Seq^Dwu`D>%mm#r>a{is=~wT
zfDEnK11zQBSSroCqdrYP;It?)zpw*;2932
zp@X7Q9xZn-%qE8&X-J4sg1Z74-W?ym&UWqwz~6YiUtkxwSJYHI<~A$j+3h90V;&y>UukQ3PRU3_L4(&&+M`JUmHQSR_Q<;-paZ`z{TCe4FYYRorMu{M{KW~1Onl?`-MH6mezouE)1McPrbC3i1#xQCg$bj
z)KpkZ1?dl-B=)7NvpKk$4U&O+8%YJ_5pYfp-g2X3QElyhhmglj&yFi6unpnYB_(i?
z@f|_(=rBMF2smC|TpqjSApb#MeD)f7Ak2b>k0hEAim*BskL1@Gjiy$WJ;OB3F|C=3vYKsk>B#t)7t@QM_gjfImVIic8;POgZV4s2|iDY&%iF#kv{n%PCQx$)z@DQwB
zDQnH9A&>3S;3#dH1t@+t^Dsxvosh1#j#oOk2QY`M6Oqv@!C#|K$FrOao?`jI!Dv1{
zO>DQV(*DW`bJKkAXKP;HZ6m5#r_1o`QVOoc88+vkVUx
zBEP&f`buKq7fWDYEof`@e4yclFF%)M%Ro1%Rc0v5H-zS
z(r+uP(-03-n-{U`VhLGw(xs@fuN3v%Pt@
z>4PC-Nd4U_?q72aKJ3Xd=jIve*}Pp(U{{*?egJw%_HNVeD5E5IHY#E-Y~DGFTYcXD
z$=t{o4KcJ=|1NZKR2&jP#2shOOB;QL4wno(e_>TX?oWu?WoUyZLReikZErA^R8}E
zn<`6!!DA(g;CD{wn^Zrj5J@R0`*E;cu51l**||~`G7Eczgdr#5{5NPo`a|*R54);H
z?ht=)3SNfnK4(l`J8>U9WIktDE{F%_&!493?~jOmir6=@A#4H^9+LtVL4A`npH3X$uG
z(PTa+i-tHj(|wgA_ZxWnXH0OP9X9@_m`O6}gTONw-|vRi)9`|ZYe)IGP;xggwmROP
z59A9fg>s+^d%%){!YQ+{}S(OYSTt%De;-cZ2CA|
z?X01EJit-31M3`dM}F?UrujH7C;keXOYkvs@$c@Z&$C9XeM_!&jFEB5awDnLbC(ZT
zuy9~WRh{D1?<=`XA}n|<-mtc-&C#A=Zzw2zkx(RXF6kKCu%FO^=E4%kKzE!dDMnSO
zMP>HiPM>+1lhpfRLFP$`o-e%~F^uA>QILIWjW>;g@JJYeY>$Pc960;c>PJXyaXgZx
zb!EJe5G2;xqbUKBF^#0~(T7rT6pu=*FjA%jH!-H=+NFsrSA$h@x6YEk)^10mpVk->
zKa^&BH>z6Oz}=VAA+C4WDeP$~L6uaXMeiAY9r)@^!k!bcxwRwueQ8u_h-1_d)PzVG
z53+_qpbmS6{lwkJ;X1b>6#e)Jv?3EUckaW%YUuPPv>N3=S*yr_=o+~F{tQaHbQaV3
z3Ec`h(*9Cd_9Ge!V~9m6Ku4^|5PyD_2Jk?_a&mOT&sSRaXrhtAl_ah1$*SzF*sbgc
zz~0E8peg$ax^X~ih?GrGl{N(X^~s5vvrUJ8mY4@c#MJ2UVwM=m!Z7wJbb;KOt?Tvw;hGnb;W^xzW$h1z$(@4)7_tsGztEe%D8S<|4ExNV#AW`Dk~L
ziB3ybLQN+WwYJboV_@J7Kv7U2py?hAfH<+%k@RsyMyrI$P_Z_>oZlW!A?>ufjl
z_q!LBq`tYCY12rlxC6KjGIBTqYLuk0gHp!10VYac5eG^=P7rC(6DS@_$_ZP_2WuHs
z`UM`~D=)Q|)hcWuH|o>un+gYhFL}&oh<=p#4xdEXGv(qzi1wwT6R?;en0Sb93
zqT41S?IQHjW=+^f!YCoZrZx_1Up4bb&EDFek?T!sn}|U}aMGX3HeiwWoh@s)Q9}KF
z*}Hoy@he$;`T!{5X#Q`oGCny7WZHogkqV|~Gw}=h<`^JDx^qS#yw4AkxUc5s^qwYn
zFd0cb3$CAe?_Z1U5!=?6zb-*=Zb{)NDe}CW
z-Rty2&by4DU^>QKT*=^!G6Ohx|DuuS9^gK&jg`
zI$B1*>nu{L1!!aY%b6cjgbe?Htx{HI*I@L;j%I&+DR!n5Xib%zJbk%?Ucq5yYZDfp
zD`kDhD&p4;&uWC{jM?nFAgGejj+au3@($6^6dMn`hAQVhopUs(3`#KISWfrz+OGE!
zLIp?ES|0c{R#~`SRvTbN;c!kV>bJV1^EqTib*ITsmO2ZMrguUuREt7^PL?|`NQL>N
zkLR7dUiKMGy9EF2|H6r(#fXYNMn;O3aXxRUZQ$%%dlGj2`v=a}4pQj5Ko}XP$o4uK
zX5p~xg+i6|!SnpQe_-So03A8D+P*tvygadO4{v=D2(W-n)~cZtyW~Q9ZTO{>T*&~4mwAmR7Rwn>l(n2)uDPTeKnNIPaN8EA#gM~r3#LgfIv!^;DY*_WvVJi
zS%hFC3mA^fbRN;Se`7ac5U0duHZ>KPv<-rSu<7-BXN%gTS^$qr9%vYKcV_fKnfV{d
zmTb(>R?mxsgMJ_m;HywlQ^Ny6HVnLX&mTiE$ZWH#|F`vg8LENg0bx!b6?B$oZxkcX
ziJU)Awm?u9;&EJ>wh{n9up5DIm@x3a?|;8;m?>XATrxZ8dwy7J_3mEON4GzMP=wVw
zGL1cY$an93b-B7>vb8IR0U2jGnmf+n1MO9ZmOTber{<@+&qR@zcG4_+>kbb{hsVc5
z2!3F7sC0>L0I8d-P_fYf7
zn7(cG!*T;Ucy4ZnQ7GW$p{n!r$wSn|`t6j{f5<0FhHCvgw_a>SAiqd{>x!ZVjt;iA
zo!V}N-g#b0NeCWmv@ddtF`9@lj}F7Z{R!*Q55ld(DPsMOBlb#TSB#NBagbC{Vxlc5
zC?y5e*!X0!>)h}Cwg8wQ(`aUFw2FkTE}73QlX&2_CMUAo*#IeoWnVrGfrGs{lp52H
zr=lnEo1;BpFR$iWC>qc#FLy|NJ*z1klM~tXrSPu{7dTMSi*UkMApD`BE6R5*)X;CZ
z3PeDRuXge6{Lsh2iPAR;wF#oY=@t)5j0wY-s9DB{hFCRKum7B!TVQQ}xY$PJR_3Op
z46|Fy_n7b0dh%;Fu0DAzCbphilZyuYg#x9};mS(mSx(-dXe6_(_NuDwuD&DfwgQ%wAlDkiuLBJW@3Vi
zO@BL7NbigJddBk(eV(n3CH}UmZQ_Rqg@q658a}zXA!85_l(?L2g-Ylf&Y52ixC#`_
ze%~ek*~C4Rov?1i^c}cZpv9M!yXe|R&Vff%?hCeU6u&d4p%{G1#l}rey+;5DEj3G6P#?ed~Ucldy9R$>Sw*1K)fvXx}d;VUmxfjQ_U3GKBY&YzrS&cTTHhK$DKWxSd-P&
zHI2IF8@YPrhT4@rt1@iqnV&~-HkJ45UDIi^!RzDj#1}Pjx!qiX@hqe+;58C%{LAUR
z`=4BovlNdQ+e&v!K!CX^cMaOW4w08r16Q3FlUXSo-}8UY4*g{@v}U>;5lvp>GZ)lYI*_
zZM-Eaq>(+Lc=>wgjV>MyvewpYIijc`bx~sDStg+?P0t*bk8tkiQ&{g}LPi#IeQ;*J
zc)>O~l{7>i=#&$Bwq{eH(U)|%(j+=Nr*k=bkNS9f-(U0_hUqzVaM0(X<%NW7Y^cyR
z%iD8moH4d0&d@kilk>Y5AAEZ3+mSvrHVOI((I5N#;z-tI6r_hAu7n-%|`;_x7RB
z?NSd9BJvSvs+<;93rG!L9)Ed6#wti0^P%QfRD{zfm~H*L{*)!uafE$_7dXAKmS(@&
z?t1ph{q(YJxozfX+A$E2x6mE`5j9(rek_AvI{!;V?EM}%j+m&`e(DGhrX9|Gsn+u)
z)D*_I*e~u*L)*JZlTm<&mkHRz^5&6L)`|;NO_D2`SoxGIWoSTtzzrTIR@VF7-4gK3
zda81nji~14<{_z7(f8wL^HsElO?Ht$7qJiULqQmM(h=6_yk7|1-FeL&D&eWAMQLb?
zC`Cl@?CqJ-xjs|iy^5romLzIsA7Sh<*POYM)g_?7k
zDWPmsXBmqTA{Td*|Jrp;>%4I%?V`YQwz?8kK!sUQfHl?TDSWcp0HULNJn=6n0jG<6
zreI-J?dG`3|93BajE0tKyDHP^lQpzsag$EQ!8I)nBxY`IeqHSJ2k3X1!>zpD8#aCo
z|E_cStOzY(WCU}%%nxpDWgXaCA_q^By57hE=AenlN=ytfAh+fA(YF
zJTOt)&w~Rk3oTE-x7CTy;Gq){q|9i#ypKaocsp;VO&h@!(~fCtCeO(?Pp>1R%Qg9Q=r{~m;BwUBfs5Q(IgN^zu^+nn21KDxOC7O2CgX{;^@F6
zMYCZ*fiQPkVuy9vszUB&31aY1`+-mZ8^+Eg@);ShF
z1qVv#4t&DGTGy$>OYATA21-kC*rVtjw~zaM9c&+mjI56Abh&)#@Tq*`Kev`u2&r#r
z8CSo|VA-AhOq-jAeHFISad3tdbN?|
z7gQqdM*6|nQ-ig!GUHvz4+_KCM-IJJ%uOhFj%#M;muo}&D1AWbx#l)LVV(Y{s-n`=
z$oAZ=C64`2}?N>GZC39EvV0$#t|0Ay*t
zehd$2@4Z;2fBNe`9*=UFKU>HTK!;yAz-dYOy&Fu~$3Y{`Z^lu*;Z+mPj3@G9zK_oN
zRNO{dP=whSA6pNGH@rfyMN!njbj&+0atgv3|8C+@z$1AFZ;&x@aDjbrjkgdv1qB%U
z=*P-%-t(w*%%(_(Xg%7-2nf^eAv3tXp#`L(0mzSv0rD56Z$)J@aY{$R+w+0Oyuzf81@}0Vb
zsj1EI?|KQgY(G=Ws2-QQe?cPu>RXMj1dnEUF+Bi#U}E`GqCUcqok&8nAs*RSQ1Yi<
zt0Q0y;yTgsGVwf4d<;
z**SI8&v72rBh^2&J%xc4FabsI3Qz8_pTl|iq&q{RPxlkik+z&X
zy$&XdL@#o1sTv_r856YnX6DgU#wEj@^hi2Y+?pw=p(6*vMIg+#_h7~C
zO~LQ~4zWtk0J-KjwL
zR2CzS>>R=t=av`ozf{q)-6=$SCU*@n;BTt3p$d@smalI})$3h`TTg@c#0i7(aTR&8
z-{ooW%*U4nkq(-T*|c@E^C1OD(k9Z2KUNA{LkBs4MAFSc#88+t3nmPRXO7ogW2j*I
zDB$jq@Gg68h^)!QQ4+|`6_gPH>(H)B`H=ycEW9oMdgTVm>8$unJvhel;Zx7NVEP
z9yxNk3R1Z?lEnJR(7`1X$RdgWg?d9Mr*A80==(-yW^T-4k-q+1LkReXT#F-Kl&pe+
zsziXK*r>{AUPbYf;<>%G19)#HRhj{dijx(yrq66AWCHfvupl!(@)z{VfkAI#Nin5`
zKO88@+{wUbjL_#^Kil#zJqi;D%RiQtK5qodop0cRfSj3(1*Y%l&J~a>2xP|vzUQ}s
zq*DM}7!~EsuiH;WHXl41qW7Nv`%@Gd8x!^eLNppX_J<`iJ1uVXL}hpPAgFJvTYUlp
zECi-~%?@DT7soHpC?6gl0fQlM?hPL1MK(n@f_^N(sxBEX)%A2DTA~D>-e6@lW&?Zp
zab=?Oc0hw32zfe9tt*<+oD$YJk#C$(VVrYo=|=^HY*BbRlhJkn0dhu3i3(4t+o7(2I@Y{m8a(A#sy9GR>9JtXTo6>+9W5{}#*@9E$;SDv^KV7zj>)Jn!hlq<&@sV$kHUG<
z;WC7oSf*;diO4f&O@rZH!6SKUzoSY9#Q9
za!mUcO-}|WXd~QZt%r6eN`z04gLr0n)F&Wh^J503E~ZpTo3mqD0s*H2U$5PkuEQ{R
zJniBMscpLTH=0L13mKvzsP=vsjL;geGalIHNBp!8g-`@GszOL+c$^ZZuPlSJ6yWv_
z^sm18px7(tuhDa*(&SmKu1F|-5)63T`ze`+$8%{NIjP^ld7hFdu1$PvN|p3%jA%1@
zs`B4V`F!Ke2_8Cc27c+x)Ly4$t8Z1*E{v}Vg^~_=GQhHf5_7)CfM1{l1S_-^1u|I=MbX7UUZ+@B
zY#NArhvc>}F_0Q=q`uJ_P`;;oW>S990wW>!4G!q8qeYANUdxQDUg%pMD&HRE@Ccx?uY>>aa1n
zG(jb0twy?9bDWhh==|s+XnrUXovlxO6j$rlz7Bc7rQe$Ct?2jJ*4pmbxtgp}CO(=qL4O~0qt9JhR*rWDqclS7qxrJ>=ebe~QjsW~~W0@5?$Ep50
z#qjmNFX}J88i*Q5L)L@V7w-2mFqv>1^ZZ~17AY?W0W=elu%cfypzfY)_^B!nep@@+
z{O~WxhhL6&mixXiFff5Y=>+L{9)`w%SK=7m1M9G)qC&lYW|8E4t
z-*Q(`0hN`Z0KpaahKhn{1)~6E7W8lD
zpl^MeOtzPbri5<$-^zg()`LvGD*ObgHUh7~o
ziT=+}M{>Z1IBHvlDqvbVE2ihu_ryAW^d%EdgNqp6NB<;n^;s2kb9*!b
zmxSqx2^b-~c)oa0P}{`W&%I?HCm2?bD$V16{zvC7o~~&NOZn_@ddgY((Nv2z!%3_YKL!kU(NqyN_SR?xz*2qyG|JG`+Q`zTkQgnQnwhBV
z2pCw?#_iL`zX4j*T0BmZ1Od*^i7E7E-sD82e@x$M4>aYK;hoT&CTHd?#bfwXmp?sT
z{B_8nGROS5Au>kB?_vL^v#T(U`oT|3_w;*>ZbD>C_fGea?M$<3)cLzpN<6zrfpxKn
zYVCJ@HKOr(Cv@1_hm+)z4+Ev1gh=UfIUW4f`nE3?~NY_L@F=)fl=H`uyo#KM!LVI-^8
z#VwQSX0GN2?8gGRNyIs`S&>aKH8nj9P|$&b6ETmii4E+e@z#Mnz0A&^P-X-l{IJ*)
z6krU3BwY&QXcCTczru)8Xi|ukP!fCFw}
z5}=eq3ZMZ7Q6{lgdpRb!2~rebngJl}Jw1P*;z)@Lb3ThUs%T67
zC-sCJ9{#Y?O@4CufiBbah(KoJ<7EaOXsml?p1HB>vYW!4Y^CbQ>t(ybtJ|0=}MkSG1pm8G9UkB
zDoIu?-fC*!A?Pg#SXW&`7VXr?W`yvTR9%m%#UK_=UQ8`LRaOtS&4_3j++5hp$v4W>
zQ+?fSW3}SP@ZyDYtK%Y<=T4i4j{Ckdl)g{5opa4EH{Zf@4lK??oE%&0L<>>+DEJuh
z0L|)9d$hG5{5d5xcxZ=l>>9-fzlg`?TH007b+0i3K!uHTsY4a=w%ogw8d{AsDmc#I
zJ`u6P_9PxTDXGr2e6~3et;dHAhh@OR+iE;_T)kx``*Su8QO;mA+fLs34{RfjCgR?(
zSMD2o6Psw3jt-ifp9M!`%4aw}ad?cEE(SVv_10Cjus$6C=AQ9GVrUzh+zwn^eobLQ
zVi|_R!x!oBoLfq;dF|Pz5MR)&`b>A3X(3<$#AbEoT(`zyjXOR6r5r`8Mu%sIn_Rm7
z+_w1_aQJU2(*_BusJ?@{eZ{*EQjOb8!iMK;5<43^iIf_5Szaz;E3A(?KxDEVp*^0-zK<;*`~Jwm$7$D4qkj*liWWRkA43_4K0^vMsw6
zE^xv&m?tJ5Xr4Vhnu_T(wKSxgbk|(==LtdGQGp*RI90`-6%izx=8Mrk!(5T|0osr6
zQ;GsmgF+$Esk-^JF7t)^%eOjZ;H>3*5@bvYlVOrWdPCI4tJ0H`LV(Snq!5tU>Hyy}
zaT~Ze^CK;{)LoR4H`qkw14wk`wjVGW%6{Lxp{1ZV
z|DGB6J@*Jh1!Y8u*jOnPS!Bs1zG+ZZ291{5ZJe;Vs7pKixDp*bnP?
z>vfvdl%uW%+Sss4GYG`
zS+0g?KJVbB;Dk2s3ZxTeZe5NH?ZG9S2&!n_9n+w*t3+R(rRi+WBdHupwe$@yn6@k&EXyJs)z=h5sJ1k(&`s
z39ZF_`C9QjIRRGWaYA)rp}ag#tsTfi$2*S=0|7@&npfwa@L$`%c^Pip4;_~P<&f#eL281Z-gMYX5V}M%w#D(t-(92)zo_(#nkjaj^J~B)kc5
zTXF-g8XBOMkPb$U!vO}E)>PD#ev4=EG%w)w%H0wT01?fXV8C|NOJ;5miv!;mn%at2
z#KqVKO%&9-9iM=UgS)BGU5HiVDnJtZR}`*e`Ce1td~3f4tsWmShU43%zAfYnRSiYW
zYWCM3LcHN`MuDKK&HL^an3D$TiiGa|?hm&t$CNB|C_(M`&YP9N7#FY%ICxTe%4w%t
z%n1+)T>6?^E9{;?TZIM6$?3$JWKU1mq4gQxrS5a!Ap(~Zh&VX7K@&UDCaR=>B2eX5f@v@A|3)HJY!~IdaVM%E*0`i~2qH
zE^HMxSsl%Z?uL`wN#@Nw{Py+rsM`&t~Ps64~i4#|p5WiQiL
z39+K}+5l;m=K%AJ+xz21bW_&$KUu`Bn{BX2qPak8w(wpllrtd$7$MY$T~7l}f7z&W
zvC1Ki@GbA-*7)ld#DD+c{%4k=f2W0z9S{PS14yMRtsildjRO`+V2g_
zk}^^df%_=1ECdK6e!fONAePXH=&FGP=|}@oVX_gFbewR4{{#WkBPp*14+M?2`;{Uh
zZ~5u{1pPFF6qLMBK%D(3^vD6YY4sh~^lzkohZutCubH3b#*j7?{B{06?HXS_z%ClH
zWw_gr6_#{X!~pc8;}~v*8=#r?Lsx@BYsY%=q8KRJvC
z(Djem?cu)n(7=GN5P;M6j*XkePx>z^)mgt06@4zDWT1*9{c+=Rt*)S?`VJBOXB?M_
zZ9oW=oJmP9U@q3}@bK`?b?>;=d0!)n_%V>f`CUEm2ADMJ{q2N#V&5K43S8W2aeM9e
z+)1Mr6ok>$^+?RgiIa`_21PnH^5s5lKl~ZtYx?h_;UPj%7}80H3KeycK`v3Ex8A
z@_iSQBecr@xJ{gs0YbTyEgyRu$LV`>V(*0e4s*?^@K(`Z#VFEfK3}{jEiV7qIug&!
zt2WJgm1d~aKWhZ;v^hXj)xT1{>}=O8Z;yZ|r{P5c)J>a-b&HMH0i^rWWp6luAlCo=
zOXg&Gir?c_X9qrq-8NB{kT-ECoTt^udiy^d=TNoo)m{RCl-%)G|K=_yw0s6`>n3CF
zo&PX(Odxus_g>i-gNM5j6933UhAK*t8kwJ80!7SC?A3J5#xHJ}i{_uGM=_CRYyK!Z
z!w0BahNDc)MKfBwx;Lt
zl^Fc9zG(;=u>^E?+0+`R=Xh?j*JZF2#!_9O@F?rxoN;$w-bITX}joc8H^&NOG`%yEGY7-GY2m)o1ICeHyZ|JGWnCD}t5+_K8
zKE4l2HB(S!6(2Iu_aYH`CVuFk$GDhk^^gvWV02oWe=f|cbuys_xU{`XEnc3nLLMmH
zTQ0yHtOr=(IQ}?WFY?$2vAeYZ#8>-;TQ34B~QpX
z8OW0~UF>*bA!>;WQqaDuZLW@|!`lAdWEhj679JmO0ZB`~lc_!w`~Ch
z<5Pf;a52$9U!2Ox%NwLXGdPkqU{pIGL%%f;lYD>cI6sQn#hx4KcCbLj%ZtqKBmxT}
zAp8sPVJYe5IX`)L)DOKpK{2qftY5KlQldJq%XH6G-TY$E{!PH)PK*J$qrQ1_i!SJ7
zZD5P6{9+x3D1I|=wQ;|5PW?u~-vsjZ4sZUthY3{bK!H{>g(U$7I#60e#X|!J4A$vG
z$JUk9suz%S0eG;fEbCEuc?tkm5}5tGxf_*95!OAe*$D%-i74505m;>A0w^f~5oHSA
z1-nabU`c@F@-Rt@0Hl{Yd|wGTpYhAeE;t>RH)~#!{H|vseIzOWYpNrQlVDn#(0f8{)6=fu~ogUrz
zfFZ{TZZ_vqK%G+;`x_?7$4gzOFpMnmKysjw2Xw+vxHeO0bu}HIb4DNAPfm`>o+Dl@
z7ob@6xo#ihb)ARpaVq@$U1nSH4?b}pN3H*HOh
zJWx?}1O&f#M6XP$!-K)J=XJ(pfSd~ZUQe{%cTutPCu9P%Korze4{S`!>MU7ehVqN$o?Xe^v
zQDf9$rTP*fhCa&0{ZkvriFL}bY+<08dx_-4V)SB20Tg-w9G0g_bpcYk5#|KmucMic
z7Uy28Tz`k%F}3g8)U`h&$t6~bl}c*=-*iHO{aP;(#Cn>0GNp2<^KmR>5BUW(76l3L
z@spH_N$M0vSy>o%@pthNuCA|Ofw8k8KrvK~4AquPi*ZJNo%!qEmC_p0*VA)(E;Q`z
zgoA>k0Q_hO3#J#n@8D$|Y2OQ5`|~s)VZ6wvQAM3h=TM?r9q>2pu20L3FFG;0{C@b4
z;}R@bZsIwa%<7m59j)H7PX9Kn19?4o2|+6Rs_4s#ja(7M@Kq)mazuBv2hc_R2LLZM
zHPVYNsC_uiHGOx(tKtRHCJKB3i1a)C=h?H1FUy^H!F)-Fu0Mxy6
zX$6fNY_*q)n*a|?C%L)oz;4mnP-;%zT=_{n$p3lacvwQ~SYw0C$Rdq1TbN!F=EpRU
z2?bE^g91sKTOBLl@ZwKIEdu_H;#NdnAiSiW8V-&>`U4xV6zmAkf`lC76$Uu-et*LVH@b{#{Ur50n%*-T1!Y%L6v+_n
zFpR6UE!Wo4kJ(@D4)3Vll!;?1$zFWqoW$@NK=xe{%ml
zsbuf=<5X35w1ESgy}<7Tz7a}65QfQnvg=0>u=h69VY9FtINb^$AJ8k@=8Mr0dkEdM
z^_NpCTKGhe%he>~vFa25Iw^-m(DXLpyYWy`k%6t}NMHkqYqQfLNs5Yp0i`7!5U^x4
zwZD(IIS_+URAi;AD9pw6Rb5~I>JbBMjsesaLqX*ak1+Gjhp5o?wOt6b`w^n$s~g+5
z)P!Rcs3H(5BeWoPlLv_g*?}Ag!3O;tDi}d}u33wk*MfMsc&_v3rUz;;Kz6BHIF=6UBE%&gs6dkbe4Eqr%o^04QU3)5%E)L*=W#`ahL&iaw2&60GNdrXU=~K0WNejW8Dt$XgJj8)
z8OhG@9`7IU{_y^EKIb`~^PK0L>)hA5pYyrSeMUz9_4jwUh=<0ihR-lHTeE0_`}aGZ
z*4F;GI8%EV`c^8&T}#Z3)Aw{s@c2&1;4$va-vU2&-@OFcymr|9WNBs`rVIH!!Z=QT
zS?Bu2dE?q*AQdG0+g0@R_H6@ickG0T!Lu{1~J?Lu9B2Ax$p~3|nfG-!ElW}$M-xo0fViSZb;Rq#Cej&WRpTn`)
zc1^b>wPvzlE4HAW@-W(H@B52is_qDx9@=RMDJj!!ynD}GFJ$1?(}By*N?$rh8P`w&
zdmzVRvy0P(Bctor>fT)&y%+}(fo!Wph2^T=H6nEIAD_TqeuvCQBmasge4TReV16wX
zGRU2I6Fh}MJCp$(!BDh=1;S%;v6mkFAQ+&=xyKZbuZ
zf30qA%!FjE@?xBsp;jK2uN8=v_9W=_Z0H0{Q!u%U*xlquUR!cQEd4QLwXb+Fv7Q@D
zEy&8f=kIDu_iHm~s0y~!d-QBHlTUN!;6b5_rqlBCe@>X6)U7bN;DPnPV`D5E$+nYA
z2E~0wxj_p(QA_>e)19MxsKeZ$+}u*f07LT8uJuqmH@59B0x2koh+;gIYPC4uk4sG*
zlaNs&cl_<%;)Ep@Dpe)PQ0;EqSa4ZflV+3-SkliGWEBUJ98M(hB|;U@WgIgUv$?A&
zjUqmP^_4y>rpQ7icBnxz4G7OHkvS-EK2^e;tTwF&H#{CA@M5uUeu}JUO>FFb-EV-EXYEWX4hNcB6
zI^Hp6s=k!6SAJhN@yBZ6wJ3On?6P2J{8(^tnT7Yo)aI@Xbo9QAVKedA|%OG!AX;Nn<#t!++oWK*&RPTL
zVOMw69lu*4;fyKD)@J|Yq~#(f^Jmyrroplj7$R-$VUk0^lBAx};EXLBhqG85c{r=A
zLcW})mPT~q+PHIxhF(n41L13B1HAcN;L}W%%zpkWEV~0@A}5d@2~tQfM`%0wp=l})
z%A?Fdz$wVxZvxLjW=`U`2uO_O%yvQ`AJMUvAhVJn1dxQ_g=KkPrb4GG(P=&dJ#qJd
z*a?!|2_DKDvh!JiRW<-bemaQ0b=TbD(L!z><6w`L4y+>pRMn!-ndk~xf@^DAzOl$n
zO#+LveQ;@5x#N`-WGbqctfG7hZevrMVUxDzok#NTW7HIfXH!h2bUDe4ab~a6@?}qZ
z1T`$M0x{DU89du2ROeZfiIL-|cx
zK0063-h8d5rM;c(WDqcI+Llpy@y{P|LxM2Xnh4l>=w6vutoPw&)CU&sh-5j@JGhZb-kMIwNVd11d+}k=($d>
zK>N^(DQGu4I|3b6;OUi%!`D>|)d`31?;_!(q(()+jM(5*8$1Sad`J^*Z!o-5OBM${
zeQ*nmi^F{D4_schNaa7^Sco*OkCaqp*vBsw8I9&zBr!&Ur`trOs*BT8Q$q(f!CUTs
z!idWv%0F1f*HR2~T>*8G$hJyqYWYJO%`a)UV92bS1vb(t9woL#uDU^&ot!@mYjWRn5>*SkkJ6<5ab{C5?;n^Y61%{<(x`bFh-W&=^WUNuc`EW0GO&pGfNBeK`{Y;
zGQNH)9q0gGugqPD2xfDQLUK7rDg9+b9na-@v-G_Z^3PP5iEH^!ry0v8*vyOpUkq;x%;aDEGmW+q{PvlY(+r-^5&je7xXI_u
zSjP&Ew5XI+(c8BgMhkNRuQz{-Sap&29(5u!+fWIe8yNE9W+b8~7hReF1$LY)-`HPlPUW6@iYuXBYfYihTU~ryJ?Qy!Hn7-rf^eoIiL#p?22R)|X!@
zJ|Bv_r3ZI&Q!eNxq@*woNl1*)+Q)B^y}#{{kRarRuJqSP?=RT1cUcA4>)6;*X@7fL
zPKh95E^Ba&wXc8*NMObHY`AUSJCX_|B*lO9r)RY>f#)SGJYs#xh<8q12k{Cgz36_Qck5
z6)ftz!78>76ew6RlN2({b=16yhJ7mb=Pzf4qmVcrp;!@ua}C&`GN>zh2Y)
zEmKD5lv)T1(fkeDsUUv@TKXO*>Ax)I5;TlXBMOFE02s>uiGH+UlS#?f$P7wV{
z>2>h_IVlH+TSw}&C}aB6LNq#nPkpyzfh@R9sRBpOu3iOQhuoL?U)=hC5%PAWvaKB-
XMj%$_ZOn>IuipO;g@5?t
diff --git a/doc/tutorial/images/generatorworkings.svg b/doc/tutorial/images/generatorworkings.svg
deleted file mode 100644
index 85a7782a..00000000
--- a/doc/tutorial/images/generatorworkings.svg
+++ /dev/null
@@ -1,392 +0,0 @@
-
-
-
diff --git a/doc/tutorial/introduction.rst b/doc/tutorial/introduction.rst
deleted file mode 100644
index 40240f80..00000000
--- a/doc/tutorial/introduction.rst
+++ /dev/null
@@ -1,32 +0,0 @@
-Binding Generation Tutorial
-***************************
-
-This tutorial intends to describe the process of binding creation with
-Shiboken and using a very simple Qt4 based library will be used as an
-example.
-
-The image below shows the inputs needed to generate the binding source code.
-
-.. image:: images/generatorworkings.png
-
-Putting in words, the user provides the headers for the library along with a
-`typesystem `_ file
-describing how the classes will be exposed in the target language, as well as
-any needed custom source code to be merged with the generated source code.
-
-This tutorial will go through the steps needed to have the binding
-ready to be imported and used from a Python program. The tutorial
-source code is available as a tar ball `here <../_static/bindingexample.tar.gz>`_.
-
-**NOTE:** the binding generator is intended to be used with Qt4 based libraries
-only, at least for the time being.
-
-.. toctree::
- :maxdepth: 3
-
- libfoo
- bindinglibfoo
- typesystemcreation
- globalheader
- buildingthebinding
-
diff --git a/doc/tutorial/libfoo.rst b/doc/tutorial/libfoo.rst
deleted file mode 100644
index bad6b014..00000000
--- a/doc/tutorial/libfoo.rst
+++ /dev/null
@@ -1,69 +0,0 @@
-.. highlight:: cpp
-
-.. _gentut-libfoo:
-
-Creating the foo library
-=========================
-
-In this section it will be presented the code and the build instructions for a
-very simple Qt4 based library. It will be used as the subject for this tutorial.
-
-The Source Code
----------------
-
-There is only one class on this foo library plus a ``.pro`` file which means
-that the build system used will be `qmake `_
-based.
-
-Put the files below in a directory called **libfoo**. Be aware that this
-directory will be referred by the binding Makefile presented in a next section
-of this tutorial. If you want to use other names or paths change the binding
-Makefile accordingly. Blind copy'n'paste shortens your life.
-
-**libfoo/foo.h**
-::
-
- #ifndef FOO_H
- #define FOO_H
-
- #include
-
- class Math : public QObject
- {
- Q_OBJECT
- public:
- Math() {}
- virtual ~Math() {}
- int squared(int x);
- };
- #endif // FOO_H
-
-
-**libfoo/foo.cpp**
-::
-
- #include "foo.h"
-
- int Math::squared(int x)
- {
- return x * x;
- }
-
-
-**libfoo/foo.pro**
-::
-
- TEMPLATE = lib
- TARGET = foo
- DEPENDPATH += .
- INCLUDEPATH += .
- HEADERS += foo.h
- SOURCES += foo.cpp
-
-To build the lib:
-
-::
-
- $ cd libfoo
- $ qmake
- $ make
diff --git a/doc/tutorial/typesystemcreation.rst b/doc/tutorial/typesystemcreation.rst
deleted file mode 100644
index 53822233..00000000
--- a/doc/tutorial/typesystemcreation.rst
+++ /dev/null
@@ -1,136 +0,0 @@
-.. highlight:: xml
-
-.. _gentut-typesystem:
-
-Creating the Typesystem Description
-===================================
-
-The typesystem is an specification used when mapping a C++ based library onto a
-corresponding Python module. The specification is a handwritten XML document
-listing the types that will be available in the generated binding, modifications
-to classes and function signatures to better suit the target language,
-and listing the components that should be rejected for the binding.
-
-**PySide** uses a typesystem format similar to the one used by **QtJambi** and
-**QtScript**, thoroughly described in the page *"The Qt Jambi Type System"*. [#]_
-
-The divergences between **PySide** and QtScript/QtJambi typesystems will be
-highlighted whenever they appear. Things to be aware of when writing
-a typesystem will be also mentioned.
-
-Describing **libfoo** for Python Audiences
-------------------------------------------
-
-All typesystem files start with the root ``typesystem`` tag. The
-``package`` attribute carries the name of the package as it will be seen
-from Python.
-
-Right after that, all the typesystem files providing information required for
-the generation process are included in the same fashion as header files in C.
-
-**foobinding/data/typesystem_foo.xml**
-::
-
-
-
-
-
-
-
-
-The inclusion of other typesystem files is achieved with the
-``load-typesystem`` tag. The ``generate`` attribute must be set to ``"no"``
-otherwise the generator will try to create more source code for the already
-existing bindings included for reference.
-
-The C++ classes derived from **QObject** intended to be exposed in the target
-language are described with ``object-type`` tags.
-
-
-For this example binding just specifying the name of the class does the trick,
-since the generator system will automatically catch the methods with arguments
-and return value of known types. These types can be described in the same
-typesystem file or in the ones referenced with the ``load-typesystem`` tag.
-
-In more complex situations method signatures can be changed or rejected with
-other tags that can be checked out in the `typesystem `_
-reference.
-
-
-Other Common Cases and Differences
-----------------------------------
-
-What follows now is some common uses of the typesystem capabilities. All of them
-can be seen in the Qt4 typesystem files. They are not used for this binding
-tutorial example, so if you just want to have things working ASAP, move along.
-
-Templates
-~~~~~~~~~
-
-To ease the process of writing custom code for the binding, recurring pieces of
-code can be turned generic with the typesystem template mechanism.
-They are declared in a way similar to this snippet:
-
-::
-
-
- bool ok;
- %RETURN_TYPE retval = self.%FUNCTION_NAME(&ok);
-
-
-And is used as in this example:
-
-::
-
-
-
-
-
-
-The ``typesystem_template.xml`` file from the Qt4 bindings can be used as a
-good resource for examples of this. Check also the QtJambi documentation on
-typesystem templates. [#]_
-
-Non-QObject Derived Classes
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Even in a Qt4 based library it is common to find classes that doesn't
-pertain to the QObject hierarchy, these must be declared as ``value-type``:
-
-::
-
-
-
-
-Unused Tags
-~~~~~~~~~~~
-
-Some tags defined in the QtScript/QtJambi typesystem has no effect in **PySide**
-typesystem, they are:
-
- + conversion-rule
- + argument-map
-
-Changes to ``"inject-code"`` Tag
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-You can pass a file name to the **inject-code** tag so the file contents will
-be injected in the generated code.
-
-The ``class`` attribute value ``java`` was changed to ``target``, while
-``native`` remained the same.
-
-Global Functions
-~~~~~~~~~~~~~~~~
-
-The BoostPythonGenerator supports global functions, you can also reject these functions using
-the **rejection** tag like is done to reject classes. Just pass an empty string to
-the class attribute.
-
-::
-
-
-
-
-.. [#] http://doc.trolltech.com/qtjambi-4.4/html/com/trolltech/qt/qtjambi-typesystem.html
-.. [#] http://doc.trolltech.com/qtjambi-4.4/html/com/trolltech/qt/qtjambi-typesystem.html#using-code-templates
From 298b9adfc694feac432f4cc7c747c2f3f2952817 Mon Sep 17 00:00:00 2001
From: Marcelo Lira
Date: Mon, 11 Oct 2010 14:59:49 -0300
Subject: [PATCH 047/564] Qt signals are added to Python wrappers via the
PySide::addSignalToWrapper function.
---
generator/cppgenerator.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/generator/cppgenerator.cpp b/generator/cppgenerator.cpp
index ef8737a2..85058820 100644
--- a/generator/cppgenerator.cpp
+++ b/generator/cppgenerator.cpp
@@ -3054,8 +3054,8 @@ void CppGenerator::writeSignalInitialization(QTextStream& s, const AbstractMetaC
foreach(QString signature, signatures[funcName])
s << ", \"" + signature << "\"";
s << ", NULL);" << endl;
- s << INDENT << "PyDict_SetItemString(" + cpythonTypeName(metaClass) + ".super.ht_type.tp_dict";
- s << ", \"" << funcName << "\", signal_item);" << endl;
+ s << INDENT << "PySide::addSignalToWrapper(&" + cpythonTypeName(metaClass) + ", \"";
+ s << funcName << "\", signal_item);" << endl;
s << INDENT << "Py_DECREF(signal_item);" << endl;
}
s << endl;
From 3ef179b87fb133253181b733e3d1605103632856 Mon Sep 17 00:00:00 2001
From: Lauro Neto
Date: Mon, 19 Jul 2010 09:25:30 -0300
Subject: [PATCH 048/564] Adding value-type copy test
---
tests/samplebinding/copy_test.py | 48 ++++++++++++++++++++++++++++++++
1 file changed, 48 insertions(+)
create mode 100644 tests/samplebinding/copy_test.py
diff --git a/tests/samplebinding/copy_test.py b/tests/samplebinding/copy_test.py
new file mode 100644
index 00000000..6f761784
--- /dev/null
+++ b/tests/samplebinding/copy_test.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# This file is part of the Shiboken Python Bindings Generator project.
+#
+# Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+#
+# Contact: PySide team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public License
+# version 2.1 as published by the Free Software Foundation. Please
+# review the following information to ensure the GNU Lesser General
+# Public License version 2.1 requirements will be met:
+# http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+# #
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA
+
+'''Test cases for deep copy of objects'''
+
+import copy
+import unittest
+
+from sample import Point
+
+
+class SimpleCopy(unittest.TestCase):
+ '''Simple copy of objects'''
+
+ def testCopy(self):
+ point = Point(0.1, 2.4)
+ new_point = copy.copy(point)
+
+ self.assert_(point is not new_point)
+ self.assertEqual(point, new_point)
+
+
+if __name__ == '__main__':
+ unittest.main()
+
From 4478a25b66729490e27460a7fa59ae9bceadd1fd Mon Sep 17 00:00:00 2001
From: Lauro Neto
Date: Mon, 19 Jul 2010 17:13:51 -0300
Subject: [PATCH 049/564] Initial copy function generator code
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Reviewer: Renato Araújo
Luciano Wolf
---
generator/cppgenerator.cpp | 49 +++++++++++++++++++++++++++++++++++++-
generator/cppgenerator.h | 2 ++
2 files changed, 50 insertions(+), 1 deletion(-)
diff --git a/generator/cppgenerator.cpp b/generator/cppgenerator.cpp
index b890df64..1ad7a2d1 100644
--- a/generator/cppgenerator.cpp
+++ b/generator/cppgenerator.cpp
@@ -320,12 +320,18 @@ void CppGenerator::generateClass(QTextStream &s, const AbstractMetaClass *metaCl
QString className = cpythonTypeName(metaClass).replace(QRegExp("_Type$"), "");
+ if (metaClass->typeEntry()->isValue())
+ writeCopyFunction(s, metaClass);
+
// Write single method definitions
s << singleMethodDefinitions;
// Write methods definition
s << "static PyMethodDef " << className << "_methods[] = {" << endl;
- s << methodsDefinitions << INDENT << "{0} // Sentinel" << endl;
+ s << methodsDefinitions << endl;
+ if (metaClass->typeEntry()->isValue())
+ s << INDENT << "{\"__copy__\", (PyCFunction)" << className << "___copy__" << ", METH_NOARGS}," << endl;
+ s << INDENT << "{0} // Sentinel" << endl;
s << "};" << endl << endl;
// Write tp_getattro function
@@ -2655,6 +2661,47 @@ void CppGenerator::writeTypeAsNumberDefinition(QTextStream& s, const AbstractMet
s << "};" << endl << endl;
}
+void CppGenerator::writeCopyFunction(QTextStream& s, const AbstractMetaClass *metaClass)
+{
+ QString className = cpythonTypeName(metaClass).replace(QRegExp("_Type$"), "");
+
+ Indentation indent(INDENT);
+
+ s << "static PyObject *" << className << "___copy__(PyObject *self)" << endl;
+ s << "{" << endl;
+ s << INDENT << metaClass->qualifiedCppName() << "* " CPP_SELF_VAR " = 0;" << endl;
+ s << INDENT << "if (Shiboken::cppObjectIsInvalid(self))" << endl;
+ {
+ Indentation indent(INDENT);
+ s << INDENT << "return 0;" << endl;
+ }
+
+ s << INDENT << "cppSelf = Shiboken::Converter<" << metaClass->qualifiedCppName() << "*>::toCpp(self);" << endl;
+ s << INDENT << "PyObject* " PYTHON_RETURN_VAR " = 0;" << endl;
+
+ s << INDENT << metaClass->qualifiedCppName() << "* copy = new " << metaClass->qualifiedCppName();
+ s << "(*cppSelf);" << endl;
+ s << INDENT << PYTHON_RETURN_VAR " = Shiboken::Converter<" << metaClass->qualifiedCppName();
+ s << "*>::toPython(copy);" << endl;
+
+ s << INDENT << "SbkBaseWrapper_setOwnership(" PYTHON_RETURN_VAR ", true);" << endl;
+
+ s << endl;
+
+ s << INDENT << "if (PyErr_Occurred() || !" PYTHON_RETURN_VAR ") {" << endl;
+ {
+ Indentation indent(INDENT);
+ s << INDENT << "Py_XDECREF(" PYTHON_RETURN_VAR ");" << endl;
+ s << INDENT << "return 0;" << endl;
+ }
+
+ s << INDENT << "}" << endl;
+
+ s << INDENT << "return " PYTHON_RETURN_VAR ";" << endl;
+ s << "}" << endl;
+ s << endl;
+}
+
void CppGenerator::writeGetterFunction(QTextStream& s, const AbstractMetaField* metaField)
{
s << "static PyObject* " << cpythonGetterFunctionName(metaField) << "(PyObject* self, void*)" << endl;
diff --git a/generator/cppgenerator.h b/generator/cppgenerator.h
index 55591c59..b356ca87 100644
--- a/generator/cppgenerator.h
+++ b/generator/cppgenerator.h
@@ -137,6 +137,8 @@ class CppGenerator : public ShibokenGenerator
void writeTypeAsSequenceDefinition(QTextStream& s, const AbstractMetaClass* metaClass);
void writeTypeAsNumberDefinition(QTextStream& s, const AbstractMetaClass* metaClass);
+ void writeCopyFunction(QTextStream& s, const AbstractMetaClass *metaClass);
+
void writeGetterFunction(QTextStream& s, const AbstractMetaField* metaField);
void writeSetterFunction(QTextStream& s, const AbstractMetaField* metaField);
From 6deb06937a34e7ef51098336e0541e543d51b8e0 Mon Sep 17 00:00:00 2001
From: Lauro Neto
Date: Tue, 20 Jul 2010 08:52:22 -0300
Subject: [PATCH 050/564] Adding deepcopy test.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Reviewer: Renato Araújo
Luciano Wolf
---
tests/samplebinding/copy_test.py | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/tests/samplebinding/copy_test.py b/tests/samplebinding/copy_test.py
index 6f761784..3a0ff187 100644
--- a/tests/samplebinding/copy_test.py
+++ b/tests/samplebinding/copy_test.py
@@ -43,6 +43,18 @@ def testCopy(self):
self.assertEqual(point, new_point)
+class DeepCopy(unittest.TestCase):
+ '''Deep copy with shiboken objects'''
+
+ def testDeepCopy(self):
+ '''Deep copy of value types'''
+ point = Point(3.1, 4.2)
+ new_point = copy.deepcopy([point])[0]
+
+ self.assert_(point is not new_point)
+ self.assertEqual(point, new_point)
+
+
if __name__ == '__main__':
unittest.main()
From 8d21f82291d2a7bc38da95c938450a68c7e7da12 Mon Sep 17 00:00:00 2001
From: Lauro Neto
Date: Tue, 20 Jul 2010 15:32:58 -0300
Subject: [PATCH 051/564] Adding pickling test
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Reviewer: Renato Araújo
Luciano Wolf
---
tests/samplebinding/copy_test.py | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/tests/samplebinding/copy_test.py b/tests/samplebinding/copy_test.py
index 3a0ff187..e347182a 100644
--- a/tests/samplebinding/copy_test.py
+++ b/tests/samplebinding/copy_test.py
@@ -29,6 +29,12 @@
import copy
import unittest
+try:
+ import cPickle as pickle
+except ImportError:
+ import pickle
+
+
from sample import Point
@@ -55,6 +61,21 @@ def testDeepCopy(self):
self.assertEqual(point, new_point)
+class PicklingTest(unittest.TestCase):
+ '''Support pickling'''
+
+ def testSimple(self):
+ '''Simple pickling and unpickling'''
+
+ point = Point(10.2, 43.5)
+
+ data = pickle.dumps(point)
+ new_point = pickle.loads(data)
+
+ self.assertEqual(point, new_point)
+ self.assert_(point is not new_point)
+
+
if __name__ == '__main__':
unittest.main()
From d26ecefed858fb548d57f66028f3191b5c298453 Mon Sep 17 00:00:00 2001
From: Lauro Neto
Date: Tue, 20 Jul 2010 17:57:08 -0300
Subject: [PATCH 052/564] Inject code for Point.__reduce__
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Reviewer: Renato Araújo
Luciano Wolf
---
tests/samplebinding/typesystem_sample.xml | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/tests/samplebinding/typesystem_sample.xml b/tests/samplebinding/typesystem_sample.xml
index 4816b824..84396c06 100644
--- a/tests/samplebinding/typesystem_sample.xml
+++ b/tests/samplebinding/typesystem_sample.xml
@@ -951,6 +951,17 @@
%PYARG_0 = PyString_FromFormat("<Point object at %p: (%d.%d, %d.%d)>", %CPPSELF, x1, x2, y1, y2);
+
+
+
+ PyObject *type = PyObject_Type(%PYSELF);
+ PyObject *args = NULL;
+
+ args = Py_BuildValue("(dd)", %CPPSELF.x(), %CPPSELF.y());
+
+ %PYARG_0 = Py_BuildValue("(OO)", type, args);
+
+
From d0a0db84cf61855c8920d7fe1643c9a568708b8e Mon Sep 17 00:00:00 2001
From: Marcelo Lira
Date: Mon, 11 Oct 2010 15:00:46 -0300
Subject: [PATCH 053/564] Shiboken::showWrapperMap debug function now shows the
refcount of held wrappers.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Reviewed by Luciano Wolf
Reviewed by Renato Araújo
---
libshiboken/bindingmanager.cpp | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/libshiboken/bindingmanager.cpp b/libshiboken/bindingmanager.cpp
index 5149a4de..93e61b64 100644
--- a/libshiboken/bindingmanager.cpp
+++ b/libshiboken/bindingmanager.cpp
@@ -94,8 +94,12 @@ static void showWrapperMap(const WrapperMap& wrapperMap)
printf("-------------------------------\n");
printf("WrapperMap: %p (size: %d)\n", &wrapperMap, (int) wrapperMap.size());
WrapperMap::const_iterator iter;
- for (iter = wrapperMap.begin(); iter != wrapperMap.end(); ++iter)
- printf("key: %p, value: %p (%s)\n", iter->first, iter->second, iter->second->ob_type->tp_name);
+ for (iter = wrapperMap.begin(); iter != wrapperMap.end(); ++iter) {
+ printf("key: %p, value: %p (%s, refcnt: %d)\n", iter->first,
+ iter->second,
+ iter->second->ob_type->tp_name,
+ (int) iter->second->ob_refcnt);
+ }
printf("-------------------------------\n");
}
#endif
From ca8b2ee1246853f88eafa05a09684369b6150341 Mon Sep 17 00:00:00 2001
From: renatofilho
Date: Fri, 15 Oct 2010 13:36:08 -0300
Subject: [PATCH 054/564] Created unit test for unknown class holder.
Reviewer: Luciano Wolf
Marcelo Lira
---
tests/libsample/handle.h | 55 +++++++++++++++++++++++
tests/samplebinding/CMakeLists.txt | 1 +
tests/samplebinding/global.h | 1 +
tests/samplebinding/handle_conversions.h | 39 ++++++++++++++++
tests/samplebinding/handleholder_test.py | 48 ++++++++++++++++++++
tests/samplebinding/typesystem_sample.xml | 7 +++
6 files changed, 151 insertions(+)
create mode 100644 tests/libsample/handle.h
create mode 100644 tests/samplebinding/handle_conversions.h
create mode 100644 tests/samplebinding/handleholder_test.py
diff --git a/tests/libsample/handle.h b/tests/libsample/handle.h
new file mode 100644
index 00000000..f76277f5
--- /dev/null
+++ b/tests/libsample/handle.h
@@ -0,0 +1,55 @@
+/*
+ * This file is part of the Shiboken Python Binding Generator project.
+ *
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ *
+ * Contact: PySide team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef HANDLE_H
+#define HANDLE_H
+
+#include "libsamplemacros.h"
+
+class OBJ
+{
+};
+
+typedef OBJ* HANDLE;
+
+class HandleHolder
+{
+public:
+ explicit HandleHolder(HANDLE ptr = 0) : m_handle(ptr) {}
+ void set(HANDLE ptr) { m_handle = m_handle; }
+ HANDLE get() { return m_handle; }
+
+ static HANDLE createHandle()
+ {
+ return (HANDLE) new OBJ;
+ }
+
+ bool compare(HandleHolder* other)
+ {
+ return other->m_handle == m_handle;
+ }
+private:
+ HANDLE m_handle;
+};
+
+#endif // HANDLE_H
+
diff --git a/tests/samplebinding/CMakeLists.txt b/tests/samplebinding/CMakeLists.txt
index 04be3040..c47ab96a 100644
--- a/tests/samplebinding/CMakeLists.txt
+++ b/tests/samplebinding/CMakeLists.txt
@@ -21,6 +21,7 @@ ${CMAKE_CURRENT_BINARY_DIR}/sample/derived_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/sample/derived_someinnerclass_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/sample/echo_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/sample/event_wrapper.cpp
+${CMAKE_CURRENT_BINARY_DIR}/sample/handleholder_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/sample/implicitconv_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/sample/implicitbase_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/sample/implicittarget_wrapper.cpp
diff --git a/tests/samplebinding/global.h b/tests/samplebinding/global.h
index 2b8b811e..4677b814 100644
--- a/tests/samplebinding/global.h
+++ b/tests/samplebinding/global.h
@@ -9,6 +9,7 @@
#include "functions.h"
#include "implicitconv.h"
#include "overloadsort.h"
+#include "handle.h"
#include "injectcode.h"
#include "list.h"
#include "listuser.h"
diff --git a/tests/samplebinding/handle_conversions.h b/tests/samplebinding/handle_conversions.h
new file mode 100644
index 00000000..2c600807
--- /dev/null
+++ b/tests/samplebinding/handle_conversions.h
@@ -0,0 +1,39 @@
+#ifndef _HANDLE_CONVERSION_H_
+#define _HANDLE_CONVERSION_H_
+
+
+namespace Shiboken {
+template<>
+struct Converter
+{
+ static inline bool checkType(PyObject* pyObj)
+ {
+ return false;
+ }
+
+ static inline bool isConvertible(PyObject* pyObj)
+ {
+ return PyCObject_Check(pyObj);
+ }
+
+ static inline PyObject* toPython(void* cppobj)
+ {
+ assert(true);
+ return 0;
+ }
+
+ static inline PyObject* toPython(HANDLE cppobj)
+ {
+ return PyCObject_FromVoidPtr(cppobj, 0);
+ }
+
+ static inline HANDLE toCpp(PyObject* pyobj)
+ {
+
+ return (HANDLE) PyCObject_AsVoidPtr(pyobj);
+ }
+};
+}
+
+
+#endif
diff --git a/tests/samplebinding/handleholder_test.py b/tests/samplebinding/handleholder_test.py
new file mode 100644
index 00000000..e1969dff
--- /dev/null
+++ b/tests/samplebinding/handleholder_test.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# This file is part of the Shiboken Python Bindings Generator project.
+#
+# Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+#
+# Contact: PySide team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public License
+# version 2.1 as published by the Free Software Foundation. Please
+# review the following information to ensure the GNU Lesser General
+# Public License version 2.1 requirements will be met:
+# http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+# #
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA
+
+'''Test case for a class that holds a unknown handle object.'''
+
+import unittest
+
+from sample import HandleHolder
+
+class HandleHolderTest(unittest.TestCase):
+
+ def testCreation(self):
+ holder = HandleHolder(HandleHolder.createHandle())
+ holder2 = HandleHolder(HandleHolder.createHandle())
+ self.assertEquals(holder.compare(holder2), False)
+
+ def testTransfer(self):
+ holder = HandleHolder()
+ holder2 = HandleHolder(holder.get())
+ self.assert_(holder.compare(holder2))
+
+
+if __name__ == '__main__':
+ unittest.main()
+
diff --git a/tests/samplebinding/typesystem_sample.xml b/tests/samplebinding/typesystem_sample.xml
index 84396c06..82684fe8 100644
--- a/tests/samplebinding/typesystem_sample.xml
+++ b/tests/samplebinding/typesystem_sample.xml
@@ -22,6 +22,11 @@
+
+
+
+
+
@@ -1161,6 +1166,8 @@
+
+
From d874d137b5062735bbd0fa33b0824d476c0fc127 Mon Sep 17 00:00:00 2001
From: Hugo Parente Lima
Date: Fri, 15 Oct 2010 16:04:49 -0300
Subject: [PATCH 055/564] Fix bug#272 - "__del__ never called by python"
Reviewer: Marcelo Lira
Lauro Moura
---
libshiboken/basewrapper.cpp | 41 +++++---------------------
tests/samplebinding/__del___test.py | 45 +++++++++++++++++++++++++++++
2 files changed, 53 insertions(+), 33 deletions(-)
create mode 100644 tests/samplebinding/__del___test.py
diff --git a/libshiboken/basewrapper.cpp b/libshiboken/basewrapper.cpp
index 189e211c..7f7b8da8 100644
--- a/libshiboken/basewrapper.cpp
+++ b/libshiboken/basewrapper.cpp
@@ -246,7 +246,7 @@ static void _destroyParentInfo(SbkBaseWrapper* obj, bool removeFromParent)
for (; it != pInfo->children.end(); ++it) {
SbkBaseWrapper*& child = *it;
- // keep this, the wrapper still alive
+ // keep this, the wrapper still alive
if (!SbkBaseWrapper_containsCppWrapper(obj) &&
SbkBaseWrapper_containsCppWrapper(child) &&
child->parentInfo) {
@@ -316,8 +316,7 @@ void walkThroughClassHierarchy(PyTypeObject* currentType, HierarchyVisitor* visi
PyObject* SbkBaseWrapper_TpNew(PyTypeObject* subtype, PyObject*, PyObject*)
{
- Shiboken::AutoDecRef emptyTuple(PyTuple_New(0));
- SbkBaseWrapper* self = reinterpret_cast(PyBaseObject_Type.tp_new(subtype, emptyTuple, 0));
+ SbkBaseWrapper* self = reinterpret_cast(subtype->tp_alloc(subtype, 0));
SbkBaseWrapperType* sbkType = reinterpret_cast(subtype);
int numBases = sbkType->is_multicpp ? getNumberOfCppBaseClasses(subtype) : 1;
@@ -465,34 +464,8 @@ class DtorCallerVisitor : public HierarchyVisitor
SbkBaseWrapper* m_pyObj;
};
-static void deallocPythonTypes(PyObject* pyObj)
-{
- SbkBaseWrapper* sbkObj = reinterpret_cast(pyObj);
- if (sbkObj->weakreflist)
- PyObject_ClearWeakRefs(pyObj);
-
- BindingManager::instance().releaseWrapper(pyObj);
- if (SbkBaseWrapper_hasOwnership(sbkObj)) {
- DtorCallerVisitor visitor(sbkObj);
- walkThroughClassHierarchy(pyObj->ob_type, &visitor);
- }
-
- if (SbkBaseWrapper_hasParentInfo(sbkObj))
- destroyParentInfo(sbkObj);
- clearReferences(sbkObj);
-
- delete[] sbkObj->cptr;
- sbkObj->cptr = 0;
-
- Py_TYPE(pyObj)->tp_free(pyObj);
-
-}
-
void deallocWrapper(PyObject* pyObj)
{
- if (Py_TYPE(pyObj)->tp_del)
- Py_TYPE(pyObj)->tp_del(pyObj);
-
SbkBaseWrapper* sbkObj = reinterpret_cast(pyObj);
if (sbkObj->weakreflist)
PyObject_ClearWeakRefs(pyObj);
@@ -500,8 +473,12 @@ void deallocWrapper(PyObject* pyObj)
BindingManager::instance().releaseWrapper(pyObj);
if (SbkBaseWrapper_hasOwnership(pyObj)) {
SbkBaseWrapperType* sbkType = reinterpret_cast(pyObj->ob_type);
- assert(!sbkType->is_multicpp);
- sbkType->cpp_dtor(sbkObj->cptr[0]);
+ if (sbkType->is_multicpp) {
+ DtorCallerVisitor visitor(sbkObj);
+ walkThroughClassHierarchy(pyObj->ob_type, &visitor);
+ } else {
+ sbkType->cpp_dtor(sbkObj->cptr[0]);
+ }
}
if (SbkBaseWrapper_hasParentInfo(pyObj))
@@ -537,7 +514,6 @@ PyObject* SbkBaseWrapperType_TpNew(PyTypeObject* metatype, PyObject* args, PyObj
std::list bases = getCppBaseClasses(reinterpret_cast(newType));
if (bases.size() == 1) {
SbkBaseWrapperType* parentType = bases.front();
- newType->super.ht_type.tp_dealloc = parentType->super.ht_type.tp_dealloc;
newType->mi_offsets = parentType->mi_offsets;
newType->mi_init = parentType->mi_init;
newType->mi_specialcast = parentType->mi_specialcast;
@@ -548,7 +524,6 @@ PyObject* SbkBaseWrapperType_TpNew(PyTypeObject* metatype, PyObject* args, PyObj
newType->cpp_dtor = parentType->cpp_dtor;
newType->is_multicpp = 0;
} else {
- newType->super.ht_type.tp_dealloc = &deallocPythonTypes;
newType->mi_offsets = 0;
newType->mi_init = 0;
newType->mi_specialcast = 0;
diff --git a/tests/samplebinding/__del___test.py b/tests/samplebinding/__del___test.py
new file mode 100644
index 00000000..79263d60
--- /dev/null
+++ b/tests/samplebinding/__del___test.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# This file is part of the Shiboken Python Bindings Generator project.
+#
+# Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+#
+# Contact: PySide team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public License
+# version 2.1 as published by the Free Software Foundation. Please
+# review the following information to ensure the GNU Lesser General
+# Public License version 2.1 requirements will be met:
+# http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+# #
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA
+
+import unittest
+import sample
+
+delCalled = False
+
+class MyObject(sample.ObjectType):
+ def __del__(self):
+ global delCalled
+ delCalled = True
+
+class TestDel(unittest.TestCase):
+ def testIt(self):
+ a = MyObject()
+ del a
+ self.assert_(delCalled)
+
+if __name__ == '__main__':
+ unittest.main()
+
From b548f03130cdd2aa7bdcb4bf00f5da8240fc78ee Mon Sep 17 00:00:00 2001
From: Marcelo Lira
Date: Fri, 15 Oct 2010 17:17:35 -0300
Subject: [PATCH 056/564] Added test for overload decisor handling container
dependencies.
Explaining with an example. Consider a function called "function" with
two signatures accepting a list of Point and a list of PointF,
respectively. Consider also that Point is implicitly convertible to
PointF.
void function(list&)
void function(list&)
A list of Point should be checked before a list of PointF.
Reviewed by Hugo Parente
Reviewed by Luciano Wolf
---
tests/libsample/CMakeLists.txt | 1 +
tests/libsample/listuser.cpp | 12 +++
tests/libsample/listuser.h | 9 ++
tests/libsample/pointf.cpp | 111 ++++++++++++++++++++++
tests/libsample/pointf.h | 78 +++++++++++++++
tests/samplebinding/CMakeLists.txt | 1 +
tests/samplebinding/global.h | 1 +
tests/samplebinding/list_test.py | 7 +-
tests/samplebinding/pointf_test.py | 59 ++++++++++++
tests/samplebinding/typesystem_sample.xml | 36 ++++++-
10 files changed, 312 insertions(+), 3 deletions(-)
create mode 100644 tests/libsample/pointf.cpp
create mode 100644 tests/libsample/pointf.h
create mode 100644 tests/samplebinding/pointf_test.py
diff --git a/tests/libsample/CMakeLists.txt b/tests/libsample/CMakeLists.txt
index d7bede64..158c0e5e 100644
--- a/tests/libsample/CMakeLists.txt
+++ b/tests/libsample/CMakeLists.txt
@@ -23,6 +23,7 @@ overload.cpp
overloadsort.cpp
pairuser.cpp
point.cpp
+pointf.cpp
polygon.cpp
protected.cpp
reference.cpp
diff --git a/tests/libsample/listuser.cpp b/tests/libsample/listuser.cpp
index 2110c004..67822d6d 100644
--- a/tests/libsample/listuser.cpp
+++ b/tests/libsample/listuser.cpp
@@ -62,6 +62,18 @@ ListUser::sumList(std::list vallist)
return std::accumulate(vallist.begin(), vallist.end(), 0.0);
}
+ListUser::ListOfSomething
+ListUser::listOfPoints(const std::list& pointlist)
+{
+ return ListOfPoint;
+}
+
+ListUser::ListOfSomething
+ListUser::listOfPoints(const std::list& pointlist)
+{
+ return ListOfPointF;
+}
+
void
ListUser::multiplyPointList(PointList& points, double multiplier)
{
diff --git a/tests/libsample/listuser.h b/tests/libsample/listuser.h
index bbb555be..eb5d4b61 100644
--- a/tests/libsample/listuser.h
+++ b/tests/libsample/listuser.h
@@ -26,6 +26,7 @@
#include
#include "complex.h"
#include "point.h"
+#include "pointf.h"
#include "libsamplemacros.h"
@@ -34,6 +35,11 @@ class LIBSAMPLE_API ListUser
public:
typedef std::list