From ec808b136188ab8b36a8b41ff3ba9f42f0981a92 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov Date: Thu, 16 Jul 2015 02:39:21 +0300 Subject: [PATCH] Updating callable docs --- docs/images/callable.png | Bin 15150 -> 39392 bytes docs/providers/callable.rst | 46 +++++++++------------------------ examples/providers/callable.py | 46 +++++++++------------------------ 3 files changed, 24 insertions(+), 68 deletions(-) diff --git a/docs/images/callable.png b/docs/images/callable.png index 67a7e492f5321770e88ac57027ec61beafe9397a..5dec3a6564c9a0e8aab4adf8036c8fabf3931e46 100644 GIT binary patch literal 39392 zcmce-2UL??)Fuj|U;`8>(xumcQbKRiq)Q1spg~#)AiaZrs5AlTLMYM#1QHA-bZivq zH4q3zI)o-oq)+tw*PU5+&8+p$e`hXhWs&#fl)d-a=j{DF=e#kG4YjGSvs@=5Bcs-N zq+vovb{S7bMiFt9f>fd~mX=QXciCCZK#hzHlX&Cw=@rs5xsQqVLo#$f+ZyTNp2H&( z12VE;eloHbugJ)bNkuPK$;kZflaUdhkdev1CnIBep517yNJe(a=&`<;=EcRu?Ck8z zmoG^*#l*yzxP)w96?hkZcgt#yY+5=wIeAe(7gj|GEFU%tO1*iT0ib3i`xwIgKuOQ- z)w9Hp5AA$@Z2j6lIxQPqz8Ttha(X6{(lNTS`=o66edk=qk8SSg&&2(sH?33kc%pu8 zFQt|%8Tq9voMLJ1KdAJ5$Sz&>FYSNuuC1VVp?!Aiu}{1^{1fDD#s2<&N=iywTbqZ6 zM{RBG@bGYPaq-=|cde|fh(w}>hK6s=_{#1~%Vbf~H`l?X);BFvX&pb_G+PB@AL-=u z+T1($OO4Zg&L`k28Pt4Fy3>+upi`KYz|IUrul)@^^ zo+S^Z3^|o-d9_@G*7uig-MzMTuu98#jr?;NhC|CjiiX7o9_6-I@g+8IpST=-3muSSV$Ha!b^jl- zFS8bDJGbgTUs1heKSh0L3nnMY^8fpvSkyY}mCuwi<3Y0-WNcp!+-DMR3G&xHW|g(C z85aiKcySXK3$&Rzd zpiKCHdz*0QMQ46$+9Ac|*qHc6L0Ox7z>l=i)Y*Vrtaz$6%6`UZ>J17Ah4YOz%3tJ| zm(^Dw6eln6pC>M1UWTc{e!yPhKP%q@KF6xUo^ak`{ZBXdc7^z`M7cXRpi>STmZ?bt zrN`0Pd^7D z5g9yfK_p`WrG_{+j>juY)PVrigg+9cTEe8ks&};IJT%3Dp~x6)vFO;(Ga9Czsr2#X zF{u{BntX7M3B#wSy0Ca`NobZL_`;)3gaI08N)xS49mj@={LU$h8FG)9NmgP0*N{xS*J=2Oa_l||(21NknnzygJjzDoKjTNb6O2Wfl zn8$v5tuxN#B+Gw3v=6_aBDm=Z1MSBdi;wg|ggx#MxPZbhham6`rzQ_ASab3vnEzUU z%(R8|UZG~^0nH{IM%?~<%o8!5 zZVofk+3$N!%Tb&E7Vq0PTy5*A4hwc4!It**#RjW2#G}?8uc&pxx&iJw(_`@>&Bd2V zHY1DKBvO4+I~bZZ980%^`LQJ4wxClm-~l52h;-v`@C8Zi38G!kX$g9?htX|gZ?(~W z-Dk=|f3#*K;BcO%Vfz8|$1V-+*q70Lq%h&o7mZ?!iKp~1tG^iCu@3*XA3;nr!Rg0r zLP(2&`AM5UA89OUH*sCq?Ozn;8Fh#t@ju!?FyONn@{cZh4+D?5+bL--kz`Zl#+H}c zFB}U}pOM=BSv-_Q?f!lT>nfuML)+@GCn|qhRzXsZS7|>{{kzO=;%~vr63@dT7$Fo* zFY&6kk7l-;dv^=_0Hw;uhom+#w^#)^W>4mNGDwXtMN`w$ZdP!fZylPPQYe%cT>Quj zd4&%Qo>=U3>Q++N(vu5p!{;XT^M_9H6avnKXAH6t5RT#O*zL zjrU*WP$}M2Il^Rm4ZJK|G=!vwSTozX+*EFE?-4_(9X9l z6#Rl+E!??7^=VjssF2hmD)m2&qcuY5}^%}1_7kIQAATu_lqMBjmI9^~w zKx!?)t!tCOlegdw#hldTcIEC)`9AJ20eGsQSZu#?_xEHu$YB3BJ zvSBDL!=TI#C|AFT2&nwWs5V zHC-_$Y$89Eipx(8u2I?V#Jer-sV)5_x1_Mm{mNpF#C9+Cj81|RY?DPD+m?gUipbin0@)7B_^o_{x<>SJ*#+u)Z!07_wx_>U z3=b~%W^@YbZI#@~7}1hOFy#s0i#^i^(c=&0gyy z=bQwaImw?wcW`seLT*iv*Q*H>>LX*i7I4yqegiRzaq?G9QM|c0|_)`BQDsAOPMx?Y=}Yzl?_cQon|na@4wTmx&e(K+wN%sQT$H%r8xJ?=H~e zV@(KwWU|At;F#Jrp<3DYxm13?9B;rVy@BC_&+%NR7)zLHI zCY>WhERU_!Vq~>it)Nm>+zKA$A^?te2=Q~Z$i)nMw5Nb3H^ACXP@kYI-C2y>n>4W> z6E%DWqJ|Ac$)_+@)&ZBU9S6apvd!nY*-KhXFJXB9Y2McYpGKMR#iugXrwlj|CE-WI z*;%ZRlB}45!n5JxcD2s9)-ElB|X~tx^?T=s$vTU1LrMWVF!TeI5M@@{8%?0Mqvpy-vN+TTGBtR9s=meED? zQKgZy@4lPlSIVjzOIH4j=u#ZM#1K_w=f;~@7#Lf%s$16G3&`xvaBD;8tEU&4j%y-W zmf=71Cx@y1v-cq%Yeyi}N2bWpc_(q)?P~4zufa-bHGIH^$58W%4#|TpdN>a&upl+z z^o}2kvwTSLeK&MksPGDul@vx(Xm!n{%%)hbV_rh4^& z1CEul0|>|IV1&RBAK6<~nlo?P$DSuY;58O&g@Pu$!oB@nF}NJVj9^OHnH$clqjXB$ zK>|89kdY>t1~vV-a!0>kai}db`0)96p~lr-2ZMTe#-j+fs>&UawB~&aBk)>|9e~@f!&aeP=nT(A!Z+{b+kv%N;vI_rUz#m<(ksaNa#>d=WFgs6cp*U z$*)rTjK=hE@r}6n#7iT!N*E~UhkN!75V@PNn6kSCLwCu!D_!H|=4T5KKR7AteRPv7Gzv9rvKU+f;f z2^m#6R8ASxn64kv2`|RKZ@rK1tJ!)#R##fpNo^rD*qf#$SeYdyaAY`&PA#kOx;a#& zV^EP_Fmrj}ZFZslvl}r57081ce6OxdnjRrF$2TX{nnF%jNX|l@zrdnZRPu7d4HFuB znYF=ehva7=61o8S1CJVoh?@WwPSZq{wfzH~^s=FQ%NlN{#zD=kIk(|*$njbOk-R1@ zY-7(;i^3VZ_T{t!nKsJU9xOimY~0_y4j1&J(RQfZk08wwH&~`ni=AB_V%wn`mrvoW z(%V%yD^mW)sY%UhaPR`VZ9N3sO(`$Pq$d>N*@=a2g9+Fr|0A9C`iGrfg~j@gX4~J+ zYI9codb3;~ESwv5sZ$^$0cW=5T{O|JNhw z3HDZ1BYyp|T?L@cHmh_(Dt%`$#kg-rm8tu}@jSI_*uK@zb^2+sPsf7^HouY!8;!G7 z!%kT$1D**?v~3X+Ut8d%Eg~whccpOONc+K83;;X5vC5!yr{X<(C6<5)@ooBY&Lum< znjelG5?LDxyqr@{*xzyx7!UY7h9A*3P{M! z@*XLEkP=(bKe+%YAtixGdYWizHWG-uP6Cw)BoO(U1S&g8Ao42-R66|EnrlP;jL#;9 zjdc1!m7xtPV+xw>AbTcf29tq5)g`+nOyu8gy8D8fhJoNmUwQe(P3ch$wH;YAm_?l~ z2+4QNk1Y3kleIAsxDCJi!hnX6aDck>gsM*Pyf|d`OdVT65mL$NK->8gLU_ zGbgD8soV1X1W0+WXAV-m`-c#~7&Be@KQJ%qCZt&q6WAU!z1#8ij}-O37`e$u)~bu5CTS*p3GG7?VXjKm z--CjaMg(&WEKID-gKtc9TQ~tw9^OEm@XW~6+az~SaL0sglQt#`6AT8CW%eHWF~rtC z@xMX3>g zS)2fQbbyP+dM0UYeZ}a(NH~1mhLC0s>)!r2QB%_F&tumlghg7xj7_FDZV6R<6=6lZ zfnq3@7NEXL)h+?nREb=2B>v#Btbgn#i9m4w3*c$S8JetJXvTGIU=68wc`aDdf^btC zqIysyTLUJKQqMsF&=K;Z6W!9&hBM+4LSmCL=o;6>%_5(PCKJeiK8aRZet7{ zIdwJTHhfgRd;(cIGoXVk7(&Ddp)B+MfcMu98TfGD1Nf(d-6hX6r(k#2cC9px*_($y zj9I&*4aP;4dJceXh;g8M+~ib6DN`x|pGD)x;oFOt8crW|pRWIEqx)C(xc_YqU@Dnr z|JI+jq}-QCtSeJKR`3d|nSu~h+noIT4lqt_=5cLW6f(k75yU{ir>Dm%2fAfYM4SJE zzsfQY(nhr-#w%I`F`9ToR6v2@{;!B=vig2{&A0{HWK7_v*j$# zC(&kqn6~Sk(~zdd;{#6O@#-NL@FVA+S|@G%2Sc3Uw0}uAk}F!k5G1^RWB?bTa$52}m#wY(;O+S%N*FXgEUI+~8`cbHLozCHVT zcD8D|AKYaWmDX^bu+Z?zlqwRh`ehI_6fbQgI~94>mL!vB0b|ElNrtCLW};6X4AdRc zD}7GLcF_!?4HwAAn9f-J?v@V`AE?T$smWqs4ZG%A`0zjUo3Zq{AOoAEf#W>f%URMq zp*SsnS9MrITDVk2FbbRby1y2a12ZY87nDB{-_% z?$=_wmK0}9KNlT*sk3XwTOeH!62dpFsw&LlIBub@1n2CVV1;!} z9c;=(6(#q$J!cA{Vizt2F7tV3y?vyi|LRO>AmJy z{lh!Xb6!&=S9DZ{IjPdv^O55GuTM%{$4|MTfH~;?kwyTLE_NA-Ql@d#HNQ- z`q0F2cKLZ(o#)S|?A`HTP=48S!m)EtU@<_!tgV6}Xl$*X!E~osyXBjt$=IsCEE5fn zIM->-rgeeie}W6J{hx6G=WK({=nMX5?aMpG(!V!W-^s`GI~Q2VxxqoEf3$3YG&xLi z%b4hwY?%aP>Lprde3NcyME_ws#;W@ERrqhrA|NJ(GYHW}v#Pmzf%FNCDB3 zyE}@9y-HfWp8Zi$3DV?Kpp)s|JO59VyA^x*u23jAgV3E^{1*Q#!=J?BLZu8-uP`0R zJ9QfJkKHN3Cz~wHCu~@vz61AHgG^dWpPxF=&`cgcq$Nm{K&E7!dIM(q)PrnDQrKa zCw{Wu1*#WOhp$&%0TN>Z8$;=lzD*t?Csw5{@;(-^!T#p3aQ-(G7Mg3c2BuX}q|Ijn zfNd(Flrd7CokGZH9F<{z`!`b2E^F|go%)>ND}%ZFV`rl$oYtIHd6iSuAt zKo>*FKd(b>~SJKyb0zK$gfH1enP%Q4)h@;%wPOy0asA< zo*q8T2aKZNvKckL8;6?XJs=1&+1DaBWL4yvYVbtE5cqq!8^L#1NLl_B z=M4PTjZXq;T*B0H#@`yzvBRr3!$to%&E#pQZ|Utm9o+Mx%@S^_?~Q_EcP=&tm(8`q z-AmfWehAs$N$Ge_bA}a3*w}A?Nh1H2YDD7=%n6jLmXYu5P zquYw0nImt#*B*<3yNb;#wcTM;fttnl;{K6<|EfXX6u;e7W$~6bnYXahWgpcSX!oj%6#ECD$D@6fKr_xOUv5JK|fj1iYe%nOMe!%YOpijxBI zYv&UD*0uNgwfwV7m*~@I>lG4X4a1|NZ2zzwW$5yG>=CaNnUa|S$I;LK89TsUMme?{ z791a)HCgJ?X}BOZwx42O2o&TXFfzruEFjC!wT>YYQDq_C-!d{bK9_v3z#=#LWSNkc z#tLjh!-+!P44O!&?v4EN!_wz~Ol8Uz&y4i?p@B!-@KK#9H477zdC_l;oNrR{k*5D| zY9J%nc3%_QBzmFos7fQRVm4{UYKz*O6~dF$Fa_-byspJ+>r5oy{}Y?UFkz%aCxUx) z{M(0-d4Ymfb?zJ7eJWih*uBpiRa`*k=8oGxSti);U^2(pM~)dmzv|~=DYMShjaidD zvkIG`)7e=WVRA7J(fkHb2(=@GH|2|PQtlsaKz~^;rmw=+w4ugeLT6m3O!{46YO+tU z19$LHkA(V<`g==1{ZeS+VadFNxbH-bv$GV$r&>Rd&+a8M7Q^vM>G=TSdag%+h zC%M6#Ta}v{l@4S2am$%?VpBWOhwa8nzEf}J-ttq#fz;W-6_B@50; zuO2&ZGnv>srHS?n2MHUza6I@7^YePsGI1Nn7>NkB{F9bp+p%!=mICL07^)X={siAd z4;j45Wr1Lx(b>@HFF~h-)g0fbE%r`B^!5uB7$^6n{N!U*n8Y7=w8RAGtUl8h*yd&D z0h$(1W$GOc<$*NWr8*x8G_*!agvH)}dA|HkmbCM~-HqE6^9@3hB7W!M@JvR}LL7`L z?K4O88E;BBj2=(QmlZj9fC38KNP4NFC#;yBP9!e^S-|?{NP= z2P^+O*$_ib8sDoPPm}eM)0P8NY_}N3O7U*#F=iU}Mu=Rsv=rXF4Iu-P_<-?=_e8S0 z(9)QH=DkYsXpc0cnI037j4cX`67+-r#nn`Co5$wlA0ut(Nr+I^5@zi#6QuI+L*SIE z+lLp5sxS)+aWwh&7w3;3KjPp8l99<$-2;-TuDu{#xhW>8PL@idKgb@-|6eTBy#o2f zc%{vzk0~0ZVLQ8gCL8(6rWBxk4@;NdVqRwbfy_)~5*9Q|n{l(voCBSP#Hp#33ccpG z30H+J&1r#l!?V;LYECbPY1`hvWfSxmnRWQ>Cf#3-Aidu99(MNw>6QSg1U9Paa~UE+ zd&>s%0`L95^NooMi}v1Aey#rU-*)W`@C9>jc3c**v_g>%PSmm>nj`&ZEb3^Z|A@W& z*bL*BrK=;?<7%;AVE3^x*GPb{bN1#BfG-Ayep-`n9)=!YFwAa$XOy-xE?c!%02B*{ zt2>)`1#w!418*F2Gqzun$}osV^hywb^_jVejU6`8OJ^=!Jx zNE6e6ph8D;;ZK{Z)G!jcu!usYniryqHdd+zS^Usb!w+^_hu#05UY5&swOPK@Bsa#p z6jxQSr1jhGnzyK9p()d_aYquAH}o9LFJeKtjJLZc;RRb*!5>Xgk98_tRAF+LFlkYc zSOaN==AtyS2htt7QcOHT<Tsp1{-Dpg3e}4MVh`*W2O)bDArCS^vZA8W^4U zq{-2uj#9ulpK+$Ht1irz0cBAv+|4xa;~5&QJ8B?R4kPnm9SW$CYoKPmo}+`mVDru_z(LS zw?A)8>DM z5Q@e|4?3+!gPmCV_q(rygdH$AC6*m75hz3A3YEX&tmk6baTGab=_<+R`yas?7yUo$ z_S`hOGr~~wwSn_rg`b;4n(_=sOgRX>N&_O1|2pT&(eLfo)+396$I;Y^^dw7WuPl7Z zFzl3Ir^u;xHSZz&w@+PuY&8|6=QgQ=Dy;p||N0w=BXOUd#r*dD9Ujs-uVfjYGXZ<{ zv$P_S?B6z|-@_HJX$N~n_AgMNi}>%!KNl-NHdEOX`ki;25BK-k$4rp274*_4j&Wa}7)%Tv#kr8nE*5W`vOQLqW` z?*NSBSQpxOtajzpl%)3eFOa6zJ{#JV-c2Eo9cOyDK5|(>6xbwUs#vuU*xebc*Z6T2 z{4&-Zu~tghdCTVa01_vW&+eM5GpP!xs&NmVXz9Pw5-Zs0uY{`#Op0XvDU}>Nn{GGq z19m28lekR5^(AQfO;OP1TfD@2Mf&clEuY)<%L^*@(ITYzBGI$}&H0a?c|II5cpCi# zE9c<_XTUuUtS&r342gwwAMum16b2w!@0Z$$(rWQg-Ll_0IRi$!?>?B;P;{0;P5r7m zn9bIA)Jm818D0Ae#5UXA1bfWcn%k3pU+sEe&Bn~nhuxP)=_%(HnJvD`L$Q)WdXm)J z{n=aUs5sO%c@KZ@#h?tV2+GqG%5v??S4~8L0LHk&>cN_KG<;@j)BW-xZ3t#B1NYIA zhM0}?jl!&SR6yx!cd>cg$P;5@$^y2;>%kyv*kie&<+ZqH;@aH%4Tz9}6vjJO_-oxA z)OfJH@?q(Q*~9tXc?-smU$6Yf_$lY#u5##VPAgsn9EC#4f7Wd$XW^epB(lU9j5FDw zd-C^-o;xiYrR1gg53?-qO+hOjF|^-z8MAU`>u^eiZ1DIJ5yL`5 z=^|S0=7@-Dq<)w*A2!~Pdsu&L;9!O1`$^y0-xzOdKgpZtkHBt!Pa32EIY@S1ZsWli z_a(5>u^JZKzosH5w$tr)|pMC%3+m^@Z-wTHBP$uEi4}iD-;fJQKSyC=NFF zE--8Kz7{uki0hG+6gKj3t)6c9!(R;HCq|X*QY3~iNOzuWTpc33IGTdD?c8xq)D6{EwD58 zxV-nskUch98%$n>&bPoSD5v2A)weG8P2bF&cSAKp+Zj5vrtj*6l&|U1LQ|~2)=vqr zj;;O%dF-b=V6Ab8Lzaj+&etk2$o$TPx>p(6Yx1oz6u08A%oqOXSvfpKn?Fmx4Gc)N zyI7EfHO8d?#eSvn@LZJFBuQa$eAgKgmmeFS3UPF5sjCZqF1-zZ_1N5i2;@@%Ek+i6 zWrW;75nbB(q7M@IiXeg{J$3&9eML?cMSV+iV-;e-*^a zYu+o}t*1tsPlCh8KR1INEez-YUFBD(ITD6S{o%Mb6WX3A0FT$+{1=v*NFnhxciz*c z9{8%_W`c-U*(A6hS2T)(n$ozKuWn|6*TVdMUxw2AW)A<>4$cA9HLev(HBL|NwMYNW z8x*LW#j);_L^bu#r*W+JFaOzx{aLyNfO?Km@1~<7+Tc4Y*Z#zPf~#N&p2H+Q694(y zOT3}_QJa$jEg^iHSG)MizkZNv1pA@33)}$E=R;JwVc+#C z?PifO7TXc}StqZ;?IM2eP*uuprm*^*y!4-RJ6K*$SyedNKV#Ak)lOJ?f3eX7tfC#b zO*#zpUd(PI-L=%3S@~)CYi3bgc~q<^NHcC+rbyU(-0j%l;#8w0XuHMcUpvuWf||` z{K6sHuFS|@<67f9G9b9`VaSC;vGVWLq*>!uQm(OM1AMur{F)%4JtOc@;Es)twlZmA z=}lp^zx%N!QMIU(a?J#j07O7?wvqKQ!6)UDIcKMJ@ZK?~MuLuTLX6+|rJOcdGozdi zuxpMGNmvj@P9C!RZG}UPxPa&Vz&0nJvWliKJ*%D3YNIE>9IKUQ5VwuSO_I+DeZXh? zx3l$niJWS;7^9Mg-r_fq2B4eCxu$hIrdA+pmzskZ;9}QYpX)cu74!A)Ia9=Fb}$Z^ zi#~Fx#6xn*@Ln-^w6D-sde*4&ecIEKsw)%vZCbGe5unUo4Jho>#E*eezKq;x)Y!i8 z>5fz*V5z5bcnq$f1*4t~AcilJ_29mG7qhJSHiC{QEBxyw@0U;Rhhgw+<9-_A9=6+~ z>!Qa{5wzy4lQcS1*BCt~1j1db^>6AZXT>4hG&@(NO6kfYP{#cSG|mK<9-YZy)m6;#af{YwAs>S&&x1qG;duNy~#5~h-Vx>vEVF+kKc69991z*8!kU-8w1(J zDI1DQ1FUQd}%`m9|EU)7gNSvP=C_z$iq% z`G*|o*vifSo}k)wXO9+QSBKZb97$Z`oac0PA5%Ld*}->Jbp3$Qb7SqsTFq}l9p03o zg)a{rq6bShhKr|^?i^<+zhjDc#4)Sli^*2ai@`})AY{fS#|83@kjQ|No?%xz+>}36 z_{tA@dOa9*1I9PAdyY>Gyw;?Z!Ly&!PJ3-SCtFL#P_wpvroglrI9;7{{cNo_HXe&R z%wO5F78YJ*KbW;D>DJp6fL64^&tw{Wncoc-an7Zb(^|Q1Yo_(l;x=&x`*FV6x`|)3 zy=1=TZVLji3D8MinX`a@a#aWP;!u#JE>RS{H@#9n8cOiD5O>8)0Cug1g;n!hZN_4MjwNxFvQ-gz-z#F~~6i=6Gjc#lWQaT;4{^N}m<|Fk->> zm>9MxI*`BTZOKQo7IQwV!+)xcL0SAfiorLc5fC%0gRV6BLZ?oiyyKdd&eoL^qYGkH zzaURzAJh*%%HUp6xAk+(;7n)OQF=`~=e*TJ#+|h8O++ybzALgrCKgcOaeD1K2;4Up zRb)V$=-!6N8RJ^Q*|q?t-F){nX&>$D*Rt%dw73!&_OxrYG}T(!%A2PDIa8eSOEKL> z>@fNT*@Znca20o%rjq)+&<-c<#{XhgMhpdb1xA)@;1bg zpkdg-91e#%{@o(O>4FI>RX+RqjkXB0*%#7S`l}0fAh2VYsRo13CKdJwwR%sNu5~7| zE-EOGw+%ylCWH;3QIf7{MKcqV70();Q3QQ(uUpg8c^@k|C9iGpj03bI6Qa2w_9_+M ztUrT!+r^2)Zu@wrb>mL8(T)lEwFMWvYr`41u{za^*ImH}4TP5<4HYXGU{;1%?)X{5 zB{yy6HTG4H*nt8_!fcryAhjREtPltI-ci)c8cMp;8vZkYCN~8VgF+VkV=e7*V*zq1M&h@+5) zbz!)X>x~6F(Wptw(4a?)jJv~-1xjW^%m~PMd}<UK=P7JzQRR1h z#;n3m)?mLM{)f>hU8hnR(I%ly7aPz}mKdgX)xo={!*gf(nNp`|JPezfao)>*{=p3~ z=r$f&h^DO7nILiC+?->Qd{{=NMsQt{?h{y|N$SoOX=W+Y&cQ3vP=J~8lHJlLlT*{1 z?T)3t*Av^v9)O(WtcYHvne31j{{@fB3<73HHRT?pw+f8nn}==-vV(@^jqhV{BY-E; z9^}=w(3eT9a!4C<5;ihG%HofAQWSc*5uZO@i7NN{ z6N&|TcE8{y-XF~bWN=~G#^B-Y?=34~Q{D?w zHba8nqoOy(&x=2uCN7?Rw5KDz4pT_wZgCeQH@rBPhmhRs`T;+sx&R?xpHKRPW!xeN zeKZ?w53k3c&)Xk&&a{Tzz~sD(I9;-rb7}e-jk2rUQ7x2=^w^y}Ly_(heY1~f-QG2u zz5VGl3{%7+vvtI#0gL!)bei%^I(oC_bcVFBYSpnK@9_O}#pgoc8)s)L$k+1 z>W)TTdb6Ccq~k=$*H>)xI&Kz8u-)ozd|QdG66DwPJ}7ZB=fStf!?Xm+QuK z+Q$}8{a*HAT2S0JnQuZ~d<*RP2MJR{nWc2E%&pCf^*q61CGy;cMS=*l`(9D0p|=g6>viMCq_WZ9tOKesB4-|WolTM!+9*5;g|lBZN!W0i z;fuE8`c)Y8X8y&MqC#CMgCe#<#{ie$0+#V-uE8$Xl79FFQDjkeE?2v`$DknG@$c{R z0>Ule&bqMzz4^xvTIja2UePd*+Ge(6o}SwnKYFJNc3QS*e|QpEL}uYJ_7G<*3i zaLfX!d~8{kD0g8|Ia?}IX>Y4jBXN9`wcS2W*QZ}bFyh5xHO}T<5IEU=R!uMfASnNd zptNvKjXX!1sY`4$u8(OabC5?1|akz?hX`u@=IAcqEnO= zf{TAqnRcPRcEXc8Z>hR_0M8R2g)>=HDuXJ~Go~_=u5|I~4)B<3a#&_)Q7;x>DHDUvk@_F4k@NQ+Ugl(moEB?S$mt8F9x5V|aP zQ=gFGo#~EnbMI7BG4a`Y&%A46{G)giu2|<9_c??eXpv2F+aNWJh1 zkK~V4Lj$bf?85X~i^eC2BPsbrrtPv)(AF`dkMIM9Nj!15yY2P|JOka?*ee3aHhqHL zh7Y;J2U+)sF|aA^sU{GEOLmM4Ax=P4Q|{#_Lzj>{ML(2A^cV7Yea@{9D+;Ezntx{oKk-hFVHBZK~b}nO$SJaet zpDF>cEH?@k%uTO7#MSs>bh8b6Mj4mxHV%%?*E_eq@=AeNOG>2Xp=0?WZpO4Pm~vo* zwu4#|KA=D@5s+Zvs`HC_JpQI|&Q&iqRW#C?|2kL`{k7aP)Gm>FdH47B)x{puIKTn% z3t9`vNVqXXzzI~Q1$(hG4Gy+p6WMd9Kurc;6a0_MbI{7puEFZ<1a) zs{3VOdfTa3zsM~f*!h%jQ%R3JMl``}5O&1YF*MxyTxi!zlk#v^H)duXr}0V)Hk4Ea zDSR|LnvcBU@1mqjbG3`y!e`cxYs!9Ifz(4XrL48I#-f8 zlH7m$5Y|4=-0t7La~DS~-V)q*+u1WM9d|O?(LwI4@_0LfJN;ypp|(5I&={JgUgGi< zi(ef=tmL@mjFxI)t_i-?jyjPNnQD0_gvn$FwmTL0$za>Y=9u})l2F3=4?|-{zI5L6 z3mQfXsPW2uh+>cFn|~)h;~&$Py^$w#TNP>pkt|8k`B=~&WeEe_$r@c5nFGi*rU$J( zaSPoMLd3km$F}dq#>d)mYLHmA(6EEt;B5xngGyx+&Is=V;;+6N08C8W1TZ2w#&;BXbnU2D8ORl3$%j4<*j_c zruCr7WGPfp&yb7@9>5tX94EcTcVFC54i~#GrV;OGXv$QKrChaE?rX8Z3G^@<4<;L6 zaI9ePUWFr_Y`1H5R&dxCbK{(ml~swF?vW+kgyH4|K-387z&~zxc1uGZ(kM$#2c8V!&5HDlBzXLRgo;@5^v>X{;TG026DVEXm=O zch|)zTAR~Bvs}Q~J}mf2Bwp-R^yW=`__gzm`7%YWu2GL1)Ik1no1M#Px&KX zj^;1l+fSw_)k*$e?KJmPA)@hf(Y;Im_S`Ad>hqlUe>Gsj!&uZpz^`+x0j_ehxA4nF z?ODe;_)x&fbn+Y=G!^!sZ`ri{YoPEwtRxvkfmFM%?=t$wEK5k_Pbt~?g9Js<^MOz6 zKNRj9{g|M)-<+DpZnU^QV8?~WiW5mhcRyM5rtEbgEO@0sM$1TVQ`Aq%1co&&A*+eX zN%b3ieWcl>$@Op7wr$JEZ-)H|hi)4THYSadj*V{|dyX|=UcAv--rQ^p&k1tq-L&nX zoo&NOuLMVD{{Yjb5}p5|qQszcH9Lp#)6=TC_TUEPuiZo4?@tkMTZ3%FX1hHBaHDAh4S=rsT^U zBWo@Z8d1BRfE_o@W;%bE->}_C0fh)~ zmTaL7AK6`#X<39O;aC8mT3M2uzQXi1AkMOKqYru=C~NkCk)UyGK|}h50+se940~r+ zyOT{i4s_hfzGHZ&&T%R~D_oqSrRI7|L?MQY@G1o?=+K zS*v5uYF8eh)OpCpg9S!B1oo77xd#E3RxkEBrej5}DC-uw*K`Z-!x>9ZMyi~TDyxxZ zW{Y}4G=as$KPFySgjA=_B^c9jV?COEOYq;Hh0|TNj;rQhYJLO*%~bHXvV()9a27L_ z-Hu3l!}xR0HvS;JvR*e=R-45(ylE0%bnSg{_0Rb8)jIRO1m(r%Ps`3{{aje*KOS}| z13z`F2B{_r`N+0f`czxgAa2+>>uegwANTPWI_2#OGKP-6tK9xCASq>AX(lN%5UTGA0&!X6VV?g1h6@;EA_=80oF<5FR1x~1vVSmma36G$Ru zbF(=T+vYSmboE#2f`2j)8!NDmdW#PP{Wsp;Ix3DP+80ei0!gqyZ~`Q_JA*@j;O@a; za2VX3;4nxC1b25b$lw+%c<{l4dkF6Entb0qXTAI0yX)Px&bj}v=+!gb)74eGYVZ0< zVRQ+tJI|{*hqNff8E2o1J4gE7mWo!Lf?!-ig`q0|A^7N0nv=hwtPLIG<9r+R(!r#F z=xd3TDj~dkqZF>^))J9hJt-?+&Uh6wKHFdGQt=g7oY0>O*mDQBTrY%;d2ha&<9Gxk zk$kr#fWS)yP5tJUAc>XGERIkyVYs!Ey)UB%ALGo)&4rGgjFgmHm*E}};y27{r|7KA z;auKw%~6ThcqJD-K)*b$h}Oc^<7)KPS*)uw zIro&D_FboPZz-U@78l;Ps+-(X!q8JM#eeZ1W7O+;!cok~hs5UxjA|s4SN9*xF95QV z`J*n^Hy+S(Bk`NM)qFuDkrn6Nwz$QbTb%XmkVfN^a8>?-*ue_-;nj0rjDLT1bN7a1 zXXk{U<^qSa=6<`mgTOKWM#YLqYfPTc;PA+kf4W6%9U__qm~nn{EIk=kzHAadChBqp zI8(jAiT3S>IQ4&vxU`Ue;;?`2tcwUh<)XQWehVjm3`>8^{Va8NXAppEZQe&`h(h`X zp7SqjKIedo5peQ;E`q0(lTSYhem21Kde2I{c9c8Z$Mp zY1GxbZk+30KpS#(Am*ePq53UckRWXTO?|8SuhIDo@Y%KGhhnRG_M3r<2H#rcHc1F) zs6-TbZBaz7nz9MePYYQ+YM*qI3HJ{n^0+otVw>_RoNgNs$F~~FkI(v3q-^UI5 z;2@lo7rgu}C#|m3oQOi}+L%(k5_;qnY-Jzpe zDvc$_{b$4;UbhFVUZ*=De33rQD9~{#qlDX{^)rZTN1a!!#M-ewVJ%%rQfM*7qf+#K zweF>wv)9pCs4&mQHj{J58l~UG`SA*oK)~h!CN7Z3rj$=vTIy-B^D3>|!lZF%d#%TC zNJz$@;x1yIuOkYWt@sq;6tby~WZL!@|1|1z+=X^ct#8lPNT-ta!B(XI1eb)r&xab> zOx9Q;JK6|%zNlePmG<1mPMvb7+o6jAUn+-3-D;%uz(vK2$MmoFj#28oqsC6{X+jVAG-&KkEbaTjz_{PuEUFuuc3mI>yuL;CqFrv|NGproj~U9;$4WezCCa8i0u?Obsa4{r z!j*)!OSMu}B3PUP?ghqR&vJaLpU9 z|14X$`oZM3DyWuvZ+Dm7$Z-CoMxe!E$ZoreSn=8PnNPQ>q$5PQ;@tC1tlDKowL{Mb zF$4Wzq{lsA29;@_*o-OS(-{(QpAN)Mn7`Ye*1kZXo_H6UT751l#gKl7HCB&@ql!g;hPyv&Dj6&vDRNw<8dYUlPd7rF@Wz4PNubHX6g$ znW}RldI!rtr{@Lt-(MU{2*b4#Tx^gv;zd8=A`$*0Fz({Yhyy}8c zeX^TNR_m)qdMB+CA!Aiy5_@Aoin%8vC?cR1URaNe4qI@t^Hw&2`Do>hyu^t_ftL3i z^r^>p4guib?;T4EJ$S;kc!^0w5|B6T=_y@%R^_&hxMvYVW2vhADbx89Y?JwsbnyWv zu~$7tphQ%X(B5qOI#GDkkV7gn{uEz9As)DCb&<9Pv52=_{p6XkEF}Hf^SR*Uy6X-6 z$cnjJ&vJf=!OCJs&sikKE%rQ5VER;B8-iQ8%9%2cfL~t-%m;csO_`_NIDQ+GV72X3 zyj7JOCZDM~S-#a+vFgD!cSMDOd%7rb`_2`bg1{-SK2anCH|;J0wASRKKbj>(^F$jH z=@EBz)?WQ>PX4xU9yJVqmCv8WK(GGX=}O=4R^&MM%b|YgDjl5rLlvF=(82u4`T&I= z|Ey94nK{C_C`@BDf%D5w4-XtU9fVSzgXQ@0KdztTCZ1m6%njlpQp**|<#}VR_{SeY zP^2B@3VYMbuJ?))p0Kn5QRC%qYS4jHiHVVQ!?z-BI1=rmoa)jf=sRDYM}bPb8H@8~ zi;Mlzwbgx>(}*;(3%KdV9*D%%>obK+jk`?FiHmk_Y8zB42T8>hx|wsgW5K;v*&)RX zva$Nb0f4BJVIQf8r`mdiEc};LxwiJcD zB6fem8fXguM<2fS7cd8)GhRP}0nh_L97XX_mj>fofN(7E_%FKj|Kx|VzrFi=V;Pdy z#*YNpCTU`9?@)T@i2?Sqs;wH;K`0@m+JyX~+lMC)T2cvD3%98 zu{rLK;xfc!gi0L%vZVvq&#k&k^hyM_(32uj$gi}9*1l^8tIm--{%(h7I&RZDlYn#-+R6EJ;DVz$@Nfk+_`B3pWN2l-=&pw`%QHQ zTlcOh?(5Zzn~cvH6?A`q#kWyMO87py>#TbY>EQ>u z9Y=z%!>`Wp)jnP~T!nPw9gefaiQio&D_q|wz0pDbOh%eG3E-hAPGE>Xh(<3GPh4)AGeb)YF+d;rktq)9z`5;*r*? zl>wGk@9U_mZv0HY>vFoEw`)45P`imb;mKOHQ>T`Jk>b7cea$Q3?);9*AC3S`+c0(W z^_=3Qxm{h?S^m|AEPeTHb}<;80>Tq>(eRpY>>EdPnDK(|l() zQ^h#lHCJe`E>jsKJdp7Scq@h()m>-%fN%jot>Ii82-}B_#9y6l8bI7f8NKs`xMefx z((9IKu46D^kL_W3U1zQ+_qqJ4_r2#euw-BV%C^YvGt^TkOOhUVoIOvYmPK9!c(dEV z21O%&^s8{TvGstr|PTdg?ca z+>{&?@XASZgXY^K{3YM7SgAN;zJug9^dG}M>cSDk-Af`bqs!;fb0M~snh8YOPk5*x;Co0g-;O+{rmfNe+1EK2;2GXIk1(wCT6aKO3 z#7sZn0w?sBQGULcBrLn0n{G?Koh%H`g)e`nj$GD}`JE3b)wgWQ|CdTbt8&(>d4bzNAQlg-U4agI2`T4=PIFT- zZm+WexdiV~{oPZPtVbtae*yXru>-El!1d-+04w7}_1^$4arzgZulRt^r+m=HQ!dGT zK;vIMaQG9X7XHSmc%rpi*1#Z#SW=A#**YMG(*6_wpMe?h#2+{#4?2C_IZ~Jm4?&FM z^_)9v(wYy(h|Is=FsFupQWJ8`{~O#R=;7VEgrV{Yf-O>|p3D7VHms-{j*F$NX^J#_Y-lLQ ze+FdbTm;E13Eu=XN)#-lr(PpaHo_Ex`m($x%fgwOBAAR+zv||3tPYsIy zKYdOYH{QuQY>Tyd8Qid+OcVW9y*E0 zw~UkJ8bmiAeWrLNNWYDX{&zlm&(>YAfvP_yvy)6@{9_;DgB4x@^RE#GQQu9l5JV$G;oz$Ht5=&?eetbxU zYTBxc&zM?URT7u+4v_2fbOGvYg;`19@$S+)zLNJCQqmLlATmrOijwtuvY_$N2n`H5 zgHO88zaAEu$Ma!^ytaxaK18OVe=6fe;v&TOlJ5)pKMk%10}$~=B|Q3rlCN#GjA2nG z^^&a1FX`E&yFhB}ZUvF|S<9qVlZK?40{Fpiw%+~ISza>2(JcgKy=lAa#R=4@LY*da z^FKl+YTxIxX|wG;6A=DG`Mgtoanq0BpT|4KO4XPfUXS8iZ~spO|Gq$1h+%WgI$^-( z?^cfyNeIffBounXRQZwP{roN^#qaOrEO031M3`2GaPOaUkh*%&M`s-Uwi`SSCbXBrOTlww z-|$yeW%j4@3~mul2PmB%=5z*xtb_=5Njw`JiznH&U`4b@$_nqFwFog)6r}-KG}NRr z{KHmi%I|P-Z8@AIX8{l%CwQQ2+?+RDl{RS59a~8$`1p1h6VPxa!`Fle4=Jbg0XX-i?&^M5rmF1zv`^fPNuG4z1Ng zs`JAg-n*tMh&^Ebhl)0cr^&8o?2k%23{!BX)*@AQ14e1b9Hch6Qx&F(TQJPe(#ZzP zRWg0XJnZg!7zR+S& zEw**!ba%k6%=Sk?jTSeBfJnN}u<$5Ux8FDsBxWejy&Z3x(JW|9!Jg~k!?L8_-E6Ez zrGkS;hMm65*eP89)O~Kw1P>1)-6BqvmwPXOO+2~h{xWWoQaKW9&YfqM?l1b^#HwFE z*PW;@x%jPuIYj7n1U)?roo=3;E!>Np2DN{xrffUP{ma5=)^s7gwH@nV1XH!GAo~OS zKizR^ge%Y#NOKzLkGvyjQY!z{U=9V_Pl1WU1`IIzYgvkqkxODmu9i8VD|hVgZVx&|T3ls(wX4F|pSJ8kI6|WyG04kp-$P(yUR8 zGJM=;DS~xa#PEKq{G^}i87FHC+Wb9X0b1wn*V~MX5=FlTO$uYm{qjpSPo>QX?4EU@ z8GEVT1E<`~$eApXX*I!g73vOlC5OPw;wkFg6ZMlX`pP>xdMSr?n}5>Dm_Xmqfhyl7 z6P)c|R)FwlfE6(LLE`S*l0rXcitPw3X5;fx6k>{#Gw4Yq5ls5IDOaJb>XE9V5G{S# zD5BaW1`mauo|&lQ-Ks2(L5byM9FL~%H{(9#Y6Eik9v@#fYd_TZOUbX9jc-B!>_7k< z1d53FKQ|qS)ym(DT<9SkyH3{IeX)?%XZm<(AF1vKI;b2J^0c-g3{S;_<}r9TD=#__5U%;Fvq z2tX+nM0z+@gsk>;!k75_lr8_=K>-K__GJH^J4^}`ASGb#_>Kf40rsuJ-$Q~?!2B3$ z;w&+Rcf)>{1H$fSURx{wZeS@F(W)DA|9|Z${kw(bPcFb&%IXad6CDBGH$Z1Fe~(3) z((#UF)bEGDP2s=0U%!Bk&zj-NCzyG1;h(h-=Vdl!K*^g~bAs~E?w9@dP_wGNDh7M5ecOkCrnFT zusCeX3|JN1PU5S^#_&Yhre%!1uo9*Fq%q}K^Ybo+8Q5F4x%LeFJgq{fbigwix^+Bu z^l3C9!YfV;VCq$>;YJ91o=e`3ojqJs6?=kGJH>$k@!{G=VCP&DOut__X#oN7!|=E3 z=!Kqhyw9jNx4vq@%3VO#Tx2m`^lQ0j#k4;XIg*M)#c!Dgr2%QaTZ8)?M5SqQV8cbRNm8nky?3z>IZ<#0bP9Wp`X>midqdFzP-Ivb<;Y2Iw#ASGLM z&@`62e1z|(6yaZk8F~=1mgofimbtG2`63vHKn`O_H{Mtqi!i5*c9hC~>Wx=8Xn2|i!(=F%Fmdg9sI_x?SwD6>rP4JIgGEajCcxn^_ZsF$EdL8 z>`71Re>J9*tJCHhCU_o)W6jZ{(d4o^wi}iNbA1i?ZNkRkM}$0}p5z&4&@6AfeoH%CQvNKW`xJ3ZPRR^C|iuHTc{DNr8 z^1is8GlBgIK5X~CrGrt?@W)5G-?|f~Cz}+zWkg>x_BvL@J-#)#FFfeAzdHDXMKiwL zg4uN(vELn9w_~i;+?p-sGuSpdf?p}@dvF@cvNe4!+EGh2t<3g+N;oA8k z;d^i{c5p?^T~ptz>REl%wV>0tL$Dyp?zMoNr}$;1=PQ%aob2tl=o(@>n|b}#S@(%y zQM22gYH-w5*L2Hz9;0gaE9(36q7OHff0##M%}?UcI!=6Ayy=$0pgN;`4vze0A;3k2g@v!&tmd|dpm;@<{WZx@mM z=yCWS_Q0(W5$Zrh4uliEt>4a)l+-=$dF&Eg>G5sEUr=1|gSYDd6HHn{wp9-NV>k5b z{iipX{5iBE85+EG5s}+zMG)Sv_nh|}B?LdwT@IwOH*w}lQ@MA}d>p0=Wfr_e4cg|P zYHDVdDB20BlWmbN5T73Q%51aG(#-l)-9pdpOs{1FyUj9M+eoJ+o!-cN(=P0VMNxBb zr9x_8+x)z&r_qF(+S8m?OjID-kEk1$E`O-FdGCiVtnU{&yq(-4Y_d-#N9yNgGqqpk zbr;-!wunQoQTd^qS6{3h-OJIE*A3El;y1a$elGZHfY4<@Y0k_~LGj98V*8|M+mX5x zZCVRfOnA_)^aQtPDlq&mdTJ&JtFG8__j`)x=O6ZhRuM^G+(fSmXq@$5CoBZrh$0bF zy@ro|A)-$hTPk--+77s?F;|d`!~4uU_z^VXdov3ct#Z92Pr_=b(D0J&GW#Zor%K%=HuZ z{Bmk6Oo~}3#)r*~F?fRCMPVKA7!$iM0pSig;o++-zO3%@{TQ^&D)YQ>ya8<>O zH)UDqgzHF3oG%1#{3BHRekdpZodNebcChZ6ws>f2ic#bd+XtGaF!q#hFEpKl8gvQu zUgs-F=;rCkc2*Fj4kKL-5N(ymNz9409@CKH&DDB38P5(1X=F--M0B66M6vHKO6{v9 zA0?k<7dL;wWU)E1XM~puU!J?ntO#F-=`#=hQlv*iTSpe68I->(y>Gaay1zBw!dkeB zrfy8broZi!qKhP6!#7go3wsTV9Ya2GKF_VuS2@tN1AS9$Q1qZb_%tX+cp(=|Wt*N$ zUFE;Hh1kQ5YI>ytMrHTtWv8}0Ni_P=H<2~FI`y-bH)N{cP$IvwLnUz>A(5kLYeY4N zenA7ZAqk<*4Hwd?Xphc~Ji$==6EOm&#a;M3Z*et)0&a;%B#=*BrK@) zem(&aFXWBqc+n}%xy6h{tnO#7ybnm?r(FV1K<0IQwhzn|B{}m=bn2s;N2k5Q!VL|R z#2>)d7sm9k7MYS9GCf!I_{%xJlHFWCwYR_^)>yKmA@n+n|0#dxR)lv|mwAxdqzdt| z-P1?!ak7-0D~Z5x=`)cx%@1$>#rA8c&ol0=jzDsiX;Dv);_c5!Nn%wI?JJGzS*g`X zL`W>AWHR<#O7BO-!cw&-92m6X$#^O|F=>U-*{D`y+ENYY4JTc~-AcOdP|52quuc+v zbsFO-584n$xW4&`l|HM2I#*qHfm_P6&xx2^{SFWvyESS!tIu^@8HZ;}pczTW6$PSbZuP#G;?~8CH zNIndUMO@_-YjOVJ`%8|%|1e=fa8|I^phRXY_*pPyES1u@syH0dtWERm8ylHz3ms_3 zKPxUhpIxSldQ4k9z1fL~HLrB0sSBQkagKDAU4y8ZT& zdU=;PJM4)u!FMsGbhvkJ@qsmwC-wPUYnWRgmZDLddY9Psjg1xpj?0#@w2M%ffq3%0PrI4?PUqL zBTj!n@={2rf19xrnWvOTR3NeS{L72jI6)mkv@LJ)U-Gi!|+P}^Y zZ6S#0PuWK0j~GlYL78xCSA(xc`!PKxWATP zoB12zliW&j4q!_89*xZ;JBJTo=H-mKu1DPGRpKeiyJ|j)r1ysXCX=>OX%R&m4HZK+>C8T z5+mzmhB09hbV2s~w+ioCm}$V=K~16r~N-kbI6s7DM`ig>P2N zH<7?zo+@Bjp=muwKI+rfjex_Rw)4FG-OS|Q$@x5szBd!A&uI7)G8hL?I4~k_elLf2 zpC#VMU9V8Jg)OB5K-8~4^>q!ciE>-cdi_>0Rd4KEHN@}h?wfMEKv4$AgJ*%sp(d<) zwyo85E6Jo8TQ6d{rA$LY4>K+)#=3*OY(KUJbvq{z_T!Y?w{VW^&CrCFY;mx)m|vYb zawJz`-egVQFW)DPPTX%N&QVretqT_4FB{v253FM@wag{uZfWsh{>GZqwGm`sF9|dc z6394-J%6$H2~1pCp8b;Z#;3|H^9>(nM)&~U+#&u+8 z9;srUKf?UA(9{NlZ5SarTYd=)Pv*9nH0bwQAHBio>q29McXJXY@X(3*7nQJLn(*+2AV-EK1$sm~7%v97|@%rua#o{<9LtcHAX$iD_nZ~{MmV>j_* zyhk&A@;pNT+%K(4WOwhE@c83N*1*>ItvFm4c`HEIW9M<>ugA?^=b^;bq-Qd?F8<1X zw>dmViYEcW?~m@6>)!l0PI`z@(N5pre2Z^&T$KTv}(_d z>6u7xBXZ(-%E5p{;w+auJgozcGp@*q^la{QOjhG?zd%}_A(MtY&A<c1WX%Bq3-0h?yuGSIfwM1-?w76uR6kLgY<2-;aG zKpl|DxjnlQvxcc;3UHgbwtNTKQT0$Db>%vGQ9X8O{u`AIOv17Y_0AW4_RNJ% zb$nh&iN8dCLt3Bu85B~xi=IX7w_8Ht}|Iomo}Gm_p>fU1!=qKt7O zFHhGzEFvIkldC+)9cMLY3`A0dWn0hQrRYW8t>Qm3=QQ;G5Poc-5t7fF_GX4PKaOO8 z_@_wxsDG$$&*-Zj?+DH~q_0o&8S&_k`BW^r1`cG81_U;!_uyp3NB@v7 z`Ia*S`*ab&oFf5>3V>O|#l)}CiGs(|{NfNZUlgmdlvKh!?oh8F^xDZnPka+Sn~wcEH4ZtO*+Z>Qkd*}Lb*bC3 z!wEf*QNe_@*ZEx%c5+VpGZP}6KF659(}~iS6gD_L_%C;~V>d1~(bH!ND@~Lda=4~5 zd#W?3Rf`tSNj`Z4Y7i!g2vY1p@!7nhX7K5?0OA?E4YO^HME^7XyFY@Fd%S{`XL`}?1i$aN+#bF{60K8JsR#jM@2Zk$_Xl81 zj>xsq^;rv`b#7z89HKmi@6RYLJ$}h6aE->SG}KhAynw5KuRj-*w>7r5dUm5`(t2#i z6#n{RRLOsy+QthKL=1&XMlq~%Xx2$&MmhuvdS7B_R?kP?B zlo>7tc)2B^iR<XU>%5<>NeMqPltOV z0?$#m@oH2r(A#Zst@1Sk)pj^Szgd~g`@`3v^GUDi6pNDbQh@OfP(5zlfnmT2NG!}y z!G*69;dM>9QS$f&76fxv3ZDX;`^>OL4p@l>EkhEG;KzobV_M zXOH9R7i300^a!ju5+Us zc(TdvXfPFpb9=jxOlGsAyrRUa$;Y|W+4A=|zGgA@ERBlvXr2+o~xvV=(OaF z+74C7*w<=|6t|hY#AY3d%6KCXx|xnK#!Y9FfwD#B_vwLx4-MZA9>*9ROa5aQ=wtiQ zUa+!qBkn6+%$o37ZfCoK&t#+S%RL2{O5H;l7KK!1M%wMo%#6obUO zv4DCF2}7*EVi6~YSO<1ek)(*Kp_p0gQO~KS0J-!E)fdelg+g*K4Pz0=Rc1XpGNnYJ zCHkq<4S=Z)+JhdFz52;xFckX1C*N$`QUg-cp``gHQHF_%>9fTYa#`8PLS_{hta^1KUCdr@2ZwcoG{jVoNIT^ z!fXU&=xlkW2_0HovTSDJNL5Y8PEt<6Y1ng8vOghIf_2^hL|jfF0B{0{hBiK}ke2m;W z9^fUuvx9vaNBU>D|F3ni?3n?ifXn#?hd_acFmKOl$|ZiPUI}#Dr&2=>KlkR}_T40h zubBqvNwvrS!FoNJ;`7~o3@-VN>lbCS-4oE)-B%AfbZ_BttjwW^t=hsDGuuYu6^BXZ zY!A5n+{+&S*MJ$qsyz%B^6}hbRCA}h+Ak3^V}YWxea|rzL5ne=G~~6Mvh@3noto@< zbc2>!r>V@k_v+x9?yp>4)}lXpF$ z=R|@3Ye2|}%C)yk3{b8zkMosM^^V*Ye2lB~k-o(vM#hl?SK)_Nyd^=wJx0G!=Y8l6 zM@D~|ij)E-R!fmKhl2Gyz!}0n9kVxdz zUj@DP2_MMM;f*k}656v1io!%{^;sjsp7S>sAaa~9#T_whP-ziT4FAyjazpJ$`f$K| zGe_bxBu|*3D2KdR7aW5pg3RYT&RB#wwIbd-I1~`b)ms>wXMKiR>q8oO-T27CE8u{g z0)FV96SPC-=4^aMl@U*b-k{vp`>x;&D*t`%bke?ns`?jua?pM*`*b8DSC(oPM50vA zFHd7eASv%o>sf~k)RC8{++#boHV=kWn42H z2o#UTv)54Mu<9iCE%0Lu0YyvtKNhx%4p8$hP#A_!Z?53L9_z>B39IXF(0Va1_4uee zFQ`c>jovd(t>7^x5A@V**>|jPA;+(vgv|bFkYTy}l)*@DxL0i?RlT|&&d_mr{qy?h zVbua#*>IcoxKou6rJqfUkc}Hm6adO$LST2nq-$Iq>G0Ro@%dkbF!_S<;tIM&-Y*PO zUG8)=o|%X-s_zYZ*u5TXv4=eDRm{>0qxRWQcXoT@f*#b`lv5t4G=b@lag`JTb;`LH z;!%l32Sx>Ork0#WwP`Z@W>d#`=j_3WWbK$&bKOUPbevvGJ#x&i%WJVmRIMdgAxo4dsZ?rgH8rE*ChijC~3X^|;+6)C(J)5*T9g!x8NxKqrYjxb@yV7KDCs#E$|cdm7+V6YN>aEbg2R!B1S{SGM&vku6ZX6xtX?G@HJzWm zo=yqUH=NQAqNaXf*Cl{i#zk4K{jhi?WdyN;a7SN@(Ncc5CsM-fNue*rF*1^SjBSF| zl7s)CQw;9{HP{6Sqral~%4jkF;b);#FW@bSjq;vU`jM-6(}_4FFymzaAv(WK$s$BS z%<_E5a)6(aPPxZ(us)@4v#Nl|guoPmnqZC5Sf?LCjiFx8HXo>cW$}Z^C5-+^w~7Z? zKoS7rtpY1wOZpg-99*0ibt)uoFCDS0hJwBL-b@uo{Hkx$XQ9cptp6CK5}-YZGG;ZM ziPAz9oWHX_6|u*P8Jes9BfrVsjD5nCGkuwT*uHyNuV>ujn|_4^H3ks3uiT0gkp&7g zt5Z(R3VOj=_`J}T>Zf85Qxrf&dE`#$;7{~76b20CNu9#!V96j>R#+*!WW3v-5#+yt z@959XYuv%}Hs7kBE^UX5uY;@{CkE(IYf0rch+DGExnBRBm~}krWg$iaMZfQHS%TdJ ztp;z&hyUcT0z3BrH1Jb7*(M$wMe^ za-0oBa+zl?E0aBuiO_9c^$+hJW`cgCjX?%riT)tD`xpR{{ulp;L-XPbIxnHtwLM%XcYV-Mg^(BUBWFu`o@Y2}M)lQQO6l>Bx2Hc|Y z6+F5MzCTNq_oDw;u~G{ti=}pRQAG`6#D4c|b~LprLUPU0J-5P3>OKVf{2}-Pq<=tb z;lTjDAn` zAUbTj_W00$b{<)og%+5}XeKZsJE_uwvq|F)tWn0VAZvi?hb5;07D=l0$f z#u<`S$lVv})2R;u)fB+4UYAF?rsew4BRnVR4FmVGOK%VDA1EJLjkpAV1+1S2<b)l11Q7yKZ|HUxx>Mhjy&Mf18@YyfB3A*8oP5 z%xS$)8`h*qn&hKspf;1vgP#4LSIA;1ksF0=(;l;VH8wxCwSe$*nmxHJL z)R5p>H4<*jaqz~C6EXRqDxHwmr&R3QI5r3-mcX6u_+I28p!-4D)Y-xLn_}+6%OPa} zT7aBrT}B|{yMvXzVh4+XbV!x`c4ntoKl2>;re^H%qWcdOj9Z(iyXNQHH|TJN||;fauq z&sPZ(2W%3%^xw=`=mGwir~m0V5H*K?_4S!P|d)>RKV! zUdS5#8JvI(Lyr%C$`#XH;79XLS$IWdV_E+vg@C>S{`Oid9iP19>p1K(6SMhe`}M3w z`AOX&h!95DQ~HEaQb8gAiuCs8fBLPE8r{g-ZSQK()b(3yGNAm%y zB48g<5+#3A8}U-sXaapkCqHovjB1+5qqOK4kK-VyI}%)Ax>|YjSVN;iwVzfpL@N=GEsA=<#iZb`!890Jg+$K-y*Vhhqj~X${FHiy4K9_cF|C`JpUbLLw5oa}$wi>oXbAyX4!ryan(oMhKxxQpM2IHd#y3_+`>< zDQ$o!^+K{17L`8>D)hvH+I(LXruFu$ipSD1Y-USVK(Q2da4#x08BJW#=S$|^jF&Fq z5vQ9shjD%q#aEW~TMO@iPfG=({+>(fI?`r%p-APjnr(TkeZ=q#yH>_~20s=}qp3@x zB~CXQ*k2?ng=LY?sT@stoytFE+%c4*3Qu2i4@cBH1t>=3reNSz*(PHV&mtZn)@WhR zZb=1AuMYPPc|t5Rd!kN@vFNq>T}e-_TIy|t)@fRwRA&7h{AnG(exAM=ZVR^*vz>rU$)88zFtD(RMON(Z%-vKQ(?#i%?tEGHukAMzBTHp%?g?z#1Eh*02JWs*1-WK42%a3%8-o=BGmqC&iTmQXp;FexCHIUs63j zs`l}Nxp&H3&sQa2&avf*LlQ5;pvvsuYxTn7(xw#>ob(QLe9AB8GpZMd?%mAqj07KBj+2KbVgSvz{Pn4 zgj}XK>FA{*T@}0>Id8qro0~l`Ww+_pzwa0ul%WTp98~REJWL|YA0Pv);D)at^-*V z+N%u1>m)*91)C$VH@4wT;)qzbh`r9kq|Mvm4f(b9@E?#PJ%3mPgq27BcOT09Ab9v) z%i!J3+xh^pZH80w17cKvfd|uL>`yP!kOW=g&V8P}uXrdUg(trl_J3!U^J@$^tyzat zbJLM6(OyibYH~T(Y{&5E=%4b6J@tG}JJ1yWR6fp;P%)N~wUO{gfZY?9(-k5d(v#39 ze^>#=WjpU9;O~F6+wrI34q21}WRyo8x-!oL8vJE9jh4@mv;MrjA${~bNmuk0E1|9c z07!eFKZ3Ve%R%w%i1f$3oLIfPE8?qjbYx#=pdzbN0;8tS5fB@H*a{Zt>~SVtIlU z9}&~{KkZcu0O0^g6m-GF=U%GSJW0i)v}!y4SEh>c2XdHZqqU0Dx79_J02ll_T^u5$ z(VsdxMb6990ar!dna&iZPQYCM5u}GQ@B(lr9xQy_qEM_~&rSuOWLJ78Z<6Cj#^NQ| z@@Xn)=k%{TaWzL$BH-Tr|43&96kTb{&5;~4^w&63bZn`M85vrFA-MF_2^u53sg!Ml zA}{}4>ql{M6@H(HSl}={x1bPTcoK^U*cMIP&^Ym`*B+Nqh%MLfTsQnyFcV-o?koJc zu`K=(68)G1Oljz-brG;<{+nh5|Icp3i6(W2&M8>Lm3hUr<|o&j3z~drx!rx7JT;|U zEdOQ>^tul&!~yH{4=%*5TDq!ZKOS6&dl@tfLih|(`duo`K54ySnF3sh`~EI#O|j+z zb|W~LYFyHzKgIrLX6!JVw_xJI|EsrikA}Kig9$8Dz*M8l!`GRf9tGHqKA$ zU9I<=waz*3A7`E4Kl`t}_TIm>*V_B@efINwBR0c=`t-B+y@X@mBp?n=E)0H7_^rr! z!v6LLKoZmCSUS@sU}ml-f^1mfBOzxr{PCQEM9?j74>HvbNL2=b zSsD8Jw=AGL`I>EU?t9#Kb5LV`B}vBsdQnJF`atBKNMILPF0^MO_JwnZr@JG+Fok{U zD`oN=vZZ$YjZ&6Z1(0msjg)}_$+eq9zFG61%Brc8%V|uJ>(O*@OtEcp{%^czUr~Rd zV&;1<1)4HbsFd+4VAg_7-^z{(TvGTe>=HAX!auSgG6F_5qlE*|<)nezIVii7y+V!D z1kz~c`js9uA66MnIzNbMnf5*2D3h(y$vZ5!Q9-+SVrH-|!1%q5n{IBSuXaXukQ$As zE2%c&=tlOy_12jixl8B~@L8%2*&0>gtzc1KUgjwZwU%-7f&w2ac<>8#qnpnRrS9KQ z73(q&*%+VUJ0`JZ;Ee2CBo-83^$^`ng5pVqiOynUeS|D_cv1Q9`p|8hXi&dyT0RNo zhF&l&ZejQvWpd5OWjDo~Qj7DIM#Jvt7K@;W%ca%Di^GMdoJ~A`y@-ep8Z0o*LYrZ$ z5aDKVG^LWHPS3Z2k)&$II!ot4WS39jIC*PX5;erNu&q7U+Nq!qk^`PBq6Qv7e!9;< zFeMZJBfaR^{)t|m)qba!kut`cp@k;T#^7A=!_;+OO4t(5)$^=&KGvj`H*Zmwt68uG zncJZ$#cEMe~n=`v=IRh*u z#5`io%S@V&NB+{U@RAm;I5Cj0Evy=&@!B|j3KT75MAgspXcc74wrlfLyf84&^sogI zy_AnLjKxa1cXchlW!RDMaY({iw4qmZflcj-t}IZd^)ZnYCf>T39C%u4{moNf*#IO& zX2bgI+yQH<_RRg4f}@+>^Ks_*30Ulj`q>)t`qI1VlQkpIk>@0Dx1(|LUS_=T&TBaA z`+i+rs8r1Cvy>D{ce&L`Q*xQyzwebozxHK%lpf?QJ z>W=uxd{7;}AX=4p*w(dm)oCFcHpI5B^Y=U_I{;ZRe{26)xT* z2Qv4uYQ@CkvwcHw6Rm=7C-${|pF5FASB{l5YH%tVR?upJ%TnE=T^SXBFqWo1#O+;i z76T?o@C%eK{Q}caOmljzRFp@oX`M2khJXv7%0T$##uNL)ko7298-#7^RXAMjLNv6p-7s%aV*}}&Ot7absdQV87BiOwe$u1I!>4Z zVY}K?SpSYbRZQ@?9Vv?_5YM)8U(am`X>!V(IbYcgOM&dk#i)x+S;~;>>~(7|k`@az z@koYOe%YvQm*Af5gq?B&w}xuXuVRw463Y8g(qnX!+(pbw2-s5!1{{P_e5_?_uj=%0 z!eu8YHqfRJup6+?3^MM9;4t-+;rh#czNKqlgb!Dg1E$Vm64&i($B{FRGICfokIyx2 z#STluhWH;4MfxEVXf77vKJd)n8W)7&Wj4JR zMUQgETx#V<7~r6;hSN8r(9n@om=ZlFO}E9gT)rCjJz6f$4A$QB8u&9cgQ! zn3oC=Jl|{c-bA%5OoNbsG(-xKM6zwpr?fv2U0}ox$~K z8p(FWq;D&IV!FF2hf{A(#7~>r`(E)ch#jXbnVsAxRmn{M9exfsoo zPcyXeN3ilEQnOkm^gwL`lgli49~;jwjS;U$JM35;aPU^I?;xdK9|WWb!O2cdmkjnDaxt1(V=E&;}k1pbc$n*HfStTL;e;I4Qi`NkHW#48hhg zY`>gmF)F?OZMr*Wm&Si;Wq9YjiliH$O!=>=Mg`fbF5}4RsYxH#<@i6d4f9mg@W&>^`!N{ew%w4BoXt|Wr-^WyKu-t|%m_Vpa48&6 zML{w^jmQ60Yn=@oIABFGQLv2Xd!V8h6bgRRr*#{-z^(_pSj9o~#ob*>vEo5fAXt%>;_gsfi&I=0N^o~gLvVMO zoBrSZ?(^Z?ea9VpoUuQgjFFLN$$ZvYbFDS!{LMKNs-_}~`;_7-006+1my^-}03L$? zfCmFukI*%kryIoRpU2h`$`SxTRTR#R83wxiz*R$55>P$_+(Z{>%;hwc0RS&X0Kh*8 z0JuU|`ELLK?py%C)_VXzC>a1C1*bQui=gR1YD!wt_xJY*1R@|H0Ns;=gM*Zo#V9Dp zCAY^ewI#55_4@kSzXAEFbWG7M2&DGGr+Qw?Gyb)N>N7%Oi>OLT6IVKJQ8qEft&>Z- zuN}oBYu7ioZne|TpiKgC@QL-KkhX>Q#bYOzH-GldlDm=cKl{JO=AOvd03JNV_icWF zPs$n&qX}vEs+?AHjqt9R{+Lj29Fli(a^mRd`1|*7DJiL~tu1|h{kXU|GBUFK{QSDQ zy0Njb58-7FY3(!=G=5h8>Asn9kc66;y2{9E_o5;2_uscSx8uzdks7fl`=^_WnF0j`8XdrJG z>J&EKKd$gf>EVNi1Xu)YqDmAD93LXe*x#x+rgz|zP!d&t8$h${!3RZIDZp0@Dmiok z8!V^q3ILF${rx_WcMpsQ06;79QW9F9=5{ke{TB3G5Yi;hgy+Qj<#lc5Op#Qwqzpr^ zCgc=6rk4)G9U??gp?qmU1ZbT3Yu)jl0PMvwGA z@OjC`RQQ-5BwA(62w+c-Bo1K5Q2X0mNENvN zDl;@)?8WmHe`jmXGd$|}OzYwxo~QVmL8#vN4S=1LZusn7layqwHXs=Q-^Mm)#DGsrjuhrH+{Fr_-p^)wQZ$Xi`OPeY+c^1p;PP{=j0?3hupf9{Iu| zNK%$n>I{1pc-v_vv1hZfiN2+w7P$U2J-wyO1+h%Fq%y9=A8EzK&|_f&bU+Q@JSk)P ze7cfq$;Y3wZdf^rJQ@gz6vuOW6c*K=nP$+c#4t25m?vcC^q4Q7kcSNnB;upz`v`m? zhNlxo=bUdq_&oopK5@NzVok2bfHa1kn4Px^KEBk5`5{#2UOZ$v>7ueQuqK99cx0V?}D2T))8 zQs-$ir>Gj9E~hae#!Vv9KUYU&p`7zAMwo0*XxF~UuqWAg3A=owLGxiXo6%odD~OPx zI{AP_Ah=V24{sQ!QEb%Bq=z|d6w@XhltW%X9_PyU81}$l8}BvHCLtN)3)|CR9r7(o z81hs?f>o0Z8)mS@P_P&qSHYs}AjJ~^2E0!QoCewEK2G`gj&3qEc8;l?C~_nwCa&yH zyqSbM`4jb=3L0&8u}J4}1U;-AUxXx1izZop*&j|Xw62oG^wfUGy$u+g0nou`}{ zzwY~QDt;E$aybB9Y?-Dz^+P_O`%i(O)UsP^N>*1Q{X)}X;YP1$$5!Z(Xz_TwIsw_ zB%Y62cR|0qlK71_{O=eKg3N(`=kylze_2tq{kSIU{)73WAoFxP*kM@K{SL%Fi3%`v zu~?|;cj?`UOAzVIAB;Npy*%06pW_e)lpTg4{H{(msc+2MAHcYW)IfI!_%k2d@56+X zDgDinQ7bGLs67_+W{l%>bKdFIo<-RwQ34V#bkG9D4OV6L8t{_46QPFQ ztq8DDY1V^-qRWi(NjxN(Y;flZmKg}cKT-UWVY=Qp)jiypaHLqP0U$dF%Q~*u z_T<{VvGdQE>%*ky2MBAZBux?0y*ZXonE1+x!9S!5LN%stSMvct3_6>iL8HMIRzRvA+d%ybJ(~ zkkA0%N4*8T#38_|l%)YiVPIj-(5v1D?y}7Ypf~PsD=_O2pBd=5mln(u_3|Wp{n+wS z)CmXu+MYx5djc3?{#DYJmFT?4m!y|^pbMxCGRW}E3z;tRZ(3Sld@mw(&I`_mN~6$Wwn z(=VK|p7HgN<(>?S0IN>FOCAO(6S_su74;QxN-i3QEH$a_Wm#Vt zs~^~^UmqQ$vPw%~J8@oepScLi_6bG9Z@AJH7q{Rkm%#LQ6HIs?zKs`s2>wW_P}~Ei z6UTbK+@~CKI0XZy=R*lCH$$jSRxqj_9enyBS3rp#{U63s!U(-yPIF(V zYW_OE3{5B$Ut1r;UI}=83dy9FBaEbrZwleud?ihlY~ar{{8Q{tK`X(Fo9X_6PGIWd z?UowI<<=1IY^??EkXK}g#h{)+%8nJ>Y3S2hR@C@b_F8*DboGt>Q{w6`hFT87jMxPM z|Kc)&0I%Yy zq+RGmq@L?nOm9Ux;uzm-j?dB6d3baxdLQp{bk?8+x9WC3d+P>p1bA>*fnq_AL}*I! zX&@QB6tYX3UpKent;Gr}eO_n-fKT5Q+b2)PkMqNj?)cRw&QfE%8ZUl;Pf9zjo1ZDw z|9vBc_tptrmDX_$>UbPg1+tD8-!G6n6n*eSh56T_=bzxG6g z-d|zYT_$CKUj$OfLU)HG+vyajtI(Q2oH3YwR95g=U;wyC;juQ5ANFf9A`ff+<3dQ@q21umjwgXZG#FCZ6bJ{lGq{EwQrhP;a5N?>vtv0T$uJJNIA)UTZXr=W? z*WbX0@Kx}3ct##3gA<#1Z;BL$|EEB(a8 zS%>}pzvk$lyZsU^Ap)=4;P_v{j`h*Cnyl5{rhWdQ^$S)H&{n|bZ14#EBiMrusz#@X zz#^6U3DT=+^YyA>itec-^K}F%dcr>zbU{sRpHF0xBiy<>C^uW=$ZNjtrJ=7^NPpSJA0?tV57F*h;Dh}NJ#Ijt#qRLr8o{%(0_Vh(k84&E2p;*g zY3*0@plJcM7WTdpxgp)uqHMfm1xq+y zy0`cYap|PVopJtpR9Ply^CG$4oQn0;BisNa_=@MFM|~+J`j|fU`QXXIUy)XC?oOMi zMwQJ)b zLPMC6i3Wb4nxy-cmMlASWJ}Rr0b@x~3#@$fO-@t91j;5lGC6jn1(P#Cab9=vwCmCX zef{{q_&R-PbNl0gL$RLgk|z{Hq#F{eCHbkRUaLn{f2kx|U@5$t5JX{LbTI!`tm`$s z=>L+stAh9J$5{o2yiSrfmh80ED|X>xrsCrhzlo zY45uh(eic<>;3Ig$?a#!dbP@QkoKTF%YIJS)!?tLDXjM@hRrrXsGqv}|DjZ!2qWc6 zai7n(tPM7bl`hhhhN|qytsGY3oW|jsN2Zc}H!wU{PM@bRjz4yEX9hYi8II0E1>W!u{}}H~8XV7NW7#A76(WI?Tl$DEfxpjl zDRX!;7&S)&eq}afhlN@B>yX?}15~p1h++26yH~~s2Qr|G^(DSsvbAQ`!-Hm4&vWAh z1J>tex~L7^FV_4B?cVZTC3^Qdeix(j?s6 z^K~aHYv>uQSG{Uw$IoQS^4lR<>8#3!>zvoE=PviNrgBd7t2tW@6(VYOznH%(1dFya z+H9?uU?BnceQ1_>^)*7dnnt3Y=Q$rU)Y2qyt!vL<%PJ_VeuZWVsYb+G2vPL4AL3Cn zBw$^_eUJrtb)x)=SNgrLQeO zQS`QLIu+bA)RytbsN+RqXDGaV*EoTBYsqETBoWCFjW`~g*ijpaM(Zpm7Cdr zb>{z@>!9O-r^i)`G4#+StuUiKww=kEb0`g$w6Mb7^b;o92FAedzRGxJf3*C0qmDz= z`!;0Aa@w0h|ALn;tZr@)IT_e@mUyi9 zxFGt9M>KbuDap;_ZUx87^>R6!!}B_6=izXB{EK0ZSqzS>*)|NB`B|hnV7v+-s-C6{rPl2q>7^%y|Lj__q;&~o~`k4OAEqx?y zs)}Qy)=K|zc<);QhjU`xN9|nFy$}87 zUZ|KB9N`>>blv4;EZJ+w8BUzIW%&JKAsO+(K$2Nw!>UY~I^$i#PT#0pReO$He{pwIIQ|{a z;^ZUG+3<5VPi+6XM5PIj{TdBk^@G47vxR@Vy9{0ob0BIXdO0~~#xsxa*Nw(h+wwR+ zrIls&j*+JC zWqPCv(0yszvzOLAg9+nSXaFKVRWmUKg7sGTQGS;DlK2zM5H}vIFVbjPP`IY~>OIjH6^EpOwtvepq9&)FH1pr4T8ft9|L9`+ zH+SSQs3nr7b9KTdywQ|hmsw%ijpl76R)n96mGH^>b3x&zr`_CFdtM*~)OKmY`;N`S zUUyMC?SpUV7 z-s$4VvBo@J<0AsRu(zPZU~Rg}izp#{y$QYkNN^?WCS6sGuhI7j}J~(j6cxGA@JD$Ye zh_8FvXk0Y?a{g3T7Md=ytdy=4)%%ItGrG8&Akxxo5TfYOAp@F;AaW&+8h}uDT&Qcm zDR|oDVq2m{%8cLT(a7GngY2`{3UndACCy2#cNvQoc#*1*NTwPVmj_mI=I^WFKm~f6 z^+TxKMG5h0m>q96pyvm0-7wo#_A$wkKJv86v*%T<$$V_HzA+PbM@5eO8ZQgeY2xLb zLJM3hvk;SnjSpF5q8|Qu+b5`F4Fz+uUzT$^8jwU}tu4d%(6YaiQk<#q4Xz-+A#ojL z?{VJa-(}dk%fEA~ie!^5ZK2&S)LELLvjhUWeG;g#in)GOW7!E`OE~5^EOsC6wWP41 zw%G7Oz}KzqngCvyXCJZurjDmDf{V_|ow8e}qokr@RZkWWTSr1wf**A94wft z$%c)dOcHORj*accJ#K@xKl;u;w5RZE8IAd7Xbs);wGD9+MXbpE8q`i z$GO;pzDxqMKSM9qe}4!QW`_1G{rf2lR@G5aEdX3m+&EbDL0`+Sd`P`D-C0At0|vK? zy*B;N;NPBN)eYiDA}{q@FgPg&*9@LO`mVt6ESzolubieq-wDcIrcH1Zed$N44|o+t$ox`!z)1>i`QL8L#dfC$m^@U+i+@6!$`c% zy$7MKCIRdEMYe2%lzpua(H-NvogDGVV$N*odq4H0^o)G`{keT>=uF-MKi*1b~7Ed-OZdQA1Bn9p!S1? zbVRRz4*vZ3neMkVaf*+0i`h+tgNbsmQE9Ki=dLx^PNjLG$O`+g&KJ}>vuF)82wA5v z{m?WWY{G5$1N=0itOy<@Z!RWGAy^B3^Ds9=CRS8sX}a`C44>#iA8&+gy-I5qI@p2R z6eqVm%--kSn*hu=eAVBCbC8-!7IiCV8vzyJx&u>^7H1CcI1gY9@7R7u8w+ko|9yiO zc(~p#);{DI?FmmX57|Q7JXJe?Ds05QnfN}O@{Oz4PRubeKf{dYmg{pW_o1X%2l6Qp z;Y(4>&G5)PQS$dvLYJH`o1~BQEHELJ`9yy_SQ{^biMk%EvmlQG&0AEdQnP6OM?V9( z_i|X>hfgt~(>Y)eYlJ@KTw`c1Eqq-_Kg05>_!0ex^0SA>)1lWS#^s0DwPeK+oym`F zT~t*G_#ebhEIShwsw>d+AFVOlFz9GB?`(bCTVtwg$WJ-_>`?x(@(0%EDa$uYHVKxe zb(t(!-7(ncaWcVDYaFk%490nP`BrIgLI$=^$H@@2q{>)C#%u!|#bcYKRpE+7eowlJoq zh^}$Qjb<`aTh&a0{8n-b)ED1XHKN4tR5<+f_|&P?#_Z|!3+3!G++90$&6-+-7 zB~c_&-L(L#9iJ#DPPtuEpc{YxM!{aDtSG{?+#Jbs!$4j9G2BVa^WKabUjXq?u%mGLs-Oml*G&d@&{0 za(QbeUTYCnVy~sE2zT)4jZHBj-Hg^;(FvvG>jvBY3<||X;L7zrh_G^@IL0nhiUVhw zrKHS^IOjL=dp{gj9>7k+P3I_9!v9o4`ltVkvqjb&x#RJ}3W`jI5>`J)pgvZ&Q1GL+ z=5UC%*N0T$aA0zdi-%k*+Ff2s9GTVu*(FEh4w`Mu&)kVE3;BbAQGbsQrC-vpbjJnc zH9ArWJ@;i-0Kur*P3upk*Af6o(96G<^39$3Bbc)Y>~O{(tcMQjA@$h)F@I=)b{KyJ zHX0iJKt~E5BK^T-#Asug21pQD_wcV3g;o^kkP1lv_$_GapXdP|R=0s5+G~D^Hl7%O z@5TP}J<7y(=qg4a+S2>~_bLd_T}?kJr5&W_!ywGr<N&V=K(Lv1>+R$F^vF zgr0DU&5ZT8Wg!>2uQtw@{~qv<){4=G ziwiPb!9)a1(?`>oDmYAz?>UD!8Zh?W$bI82Pj(#CZiid&%0 zV$8XdSlyR6jn=CP6w6&*XfVQgfj4YYL(#Ivr*a(2QQPI=>*eh1b+>X#-rDl%C}fCY z_2%=2TVz`2KbC6GE<9;HWMG_gc#vHDcC7o?eU`BifheyJaCmbkHed4PE0SlvEtyr( zMwtgrd@)aP?sblj&#&}#W!MNKtqT{&hnK&rwx2i~jdZ1r^Lja6flOMn$NL3NQsdh5 zlAs->q@*of8#|jdI#AOk6T|;l?R@zC4xjjwBxU8#8;u40FbUH>-jm>`-Mn6&9Ck_7 zQGQOLL-Q}S;yPF5Ll^Ar)t24T8AAOv} z&g_6+vUZTuk34<-n&e-*&^UOJ6fqs9FI*u2b7qXf5T~O9a!N_-iE(HtG&mmFa-Gn* zCtCfH-eR|V9{ID4CS+p^M+UUQpS3;K8<#W}?>RU>v~o72I)wR-Q^VSZq;bflAL|7a zA~qGAJJ7#&|B-ccW@zHHH3c!{c-TkPp606NNE)faQ8Z3K53Fd;SM>e-jPq1~>-njz z^Q?SNQ&4VPSbug%`kTPY!7_4H9rXF7=8N1Px?N4>Mf0>JBCri2!sIV6~8PS>1}N7MnW2lJMouokoic< z#yn6U2t_XNAwG^0#+~{Lb+p**W8*^I=Iw-(E5tz!!67q|o)TIEK7F@2mo^HH@_IYD zaEc-3Dss5rq&t45z+#|4Fsk;N!N)9>m8l>KrH`P$T0KU();vdk;@O$Ax%PI%!bB(w zo1AE{kup_;gHJ?r0v*S?*P0>EBSkOwM1$$)8@`U%*?!EJeT}V=gcK%-w#nYrhjk$ z(qlnn(`IQHX;QZ&y>#qp ztVIX$9E?|KeIR}?LP2HR*F=}>H`#}5#bLd>-A$@a5`qzNBt-v4&>PATeg9 zJv-g3-huS7U-e|Rq(-mtN?PN>`~}l(Z3w4KP@ta;qGb&+q01w3xu$Uq7~VMTegAE9 z&9#ORIpY12Y`FlO4z}FllPBJuq-=Vh5hG#im~c9dP_eqYaK3cZQHv=C2a&JqX%*ul z7Nfv<(lO3I*ph;o**(qPL;Ez_rsG#9<=^QlZEGSEF?5H2U*yk-ZCrV2ut+1YT$u$1 z>J5VoiX!iZWjM7K(cj{qnRTavCy;qe+Zc+$EQ|iiDou*^?pczVuQ2P`=7ANpZ&Lqa+g_fAqmd zk^kC7!O*aA+F>}g+^g@Y%>XUacNTHF)i!Nn5USLvZLuBP zk}c>%YIreU(SEm!C|iOAIwLHrinS4PtS^30Qujg5J1pEeos#lf_13#W4vp(%#AXES zU-XUpJlcHr!QAe3nVrk0fT}2KcFUqP+4fe2hT*Bp;3`$+hqs3M(o12nF@@=_^WZU(!92I8LwL^`qSkH0XP!xWR}W9N#2N`FyNp*Y&_vWTf825_*k|5; zJxysk2^zQ4?&WYLE4*I!B)5D>Y_FTL6q6uQw9@P{_h`|m zg=<14lK_6Ow8dR=sagWh#)9f!`UP}W-0;p9qis-}0Ig?}lYw`F;1Ohwt|0;6d8kOrSU zOWf(Vg6$$=yr0eVD8pNt#*Lx8nxr`|gPQ9V@Y`nTZmC^jg3H-dLs8nkd$eUiCt82mwC}-L<@L#JOn4KX@Rxj@$ zYiD<3UwH8wh)PR58|q{^XUjDXMlq2@;_IFaHt*|^F8LKui}~HjIW-4Ea@ev$#lm!2 z%rP!|4CQso(MM)iI7bx$y}#uNM)k(E?|CIf_CYjT8BuUn8dm)4)5Tk%)su8y&Z#rw zjlOn5ffgQKv%!81&i+~=7I*Wix}jz^zQ#hL4GWc}_fWyp8g|Do^|>=jKT#ri`Hbct zZLHP~Je{vS2&f6K&9c}xuA-G{%E>)ZbJ?VcgDHIt@$>_>-pP$6-<9d%6%?rc(KU;` zvRO#`TGNpeb$P;A{OF!?Ld8=1^#v}c$>^7JgggeSQy{B37(aGre3CeAd^{<>0q=>D>P!Q}Fk!bc$G$XKwUwY*yJQ$<^|bs;obH_nD?!Gq{N z!}x65RQx?#K1=SRkZj}GL5BYA7MqP1v|u0M6FupOq}Syv7xQUae$<8{?!BY(>4g2# zIJ(2!rMYY{LVh|bHFf2_Im`Of+4Nx}r} zS4x)s>)`s6$*7Y{Ugw&X-Ru4Q)WbX3@?hvY#K)KWX%syg!MWtP_ep-i`$K1o2~WFy zdoo%!_lEYI7q!+M;}DMfbQJD?xhaE2B!MHsJRT=j;?z}DU7VpvCA+ZB>99dOc6aE&a z(I3j4xQ>L8ouaJ5kjS>_pHE6VzLftwN-2MWqf6b6YDedRAr-D=5sC~e%`%{H3nK{- zUJw-`7(8Q+tDIm0vUn?<%9gcs4?g|%M!G5ZJZs}xHGM_lO4_rte!u;;hnSEa=(IVG zN$x74x%w52dn|A>a$CU%x%Zvth<1jnP2SSqg>2)Bwj@jKA(MrHI9_NxqW|kL7aP0lLozZntm=7MkWSqSR#Fkf zGz>sb41=?gsu`@*zVhVf-_~2x(sny?2~hmJN$EcwR_+3zdj>KDkxZ@+Fa7@_wdyY; z0T6b2tnRpZNzBjk=mBQmRW1uB5(c4q9e#cL^$I=d1+KeC5oPGO%pmT+fD=i9j)3K3 zG#*^S|KBhk9y)j|hIV{nV1wmv!+V=tB_)nPk-++tgCH}WD=Qkgu zT&vsmoI~;TkL)|@!+XQoHdj~G73EcKAKoPu0eqxh<6jU=A)af$J%=kgb zTFDjW-G^tU7aS$Gr369K;915p1b7#FFetQrTPz- zqmDjqw?$Sm!`|}~L?+;%;j};ey!uktT&|uKB6YcOCQQ*jpy+}UNe&k7FNG?wQ}}tH zH|kF_&ha88eAuy=whH6oo_PQ`s$#-s=ORTbyIXj)#pubfOlIk+eu*5p@YP=TdZ3;z zoKWoTd<3!&r(TukEHzP)QX&2g72*hdQ=zzIqmVn0A%%}$BVuj+m8!(GhLc@cQa{Y) zHWVr4ycXgWs?J4<)eZaWCwPyHPBfFL(iC3VnDan=(dtKhd#cjU0_T|NZeRAzoSf*oSkjB%tXI{;F+MLhoo|Su zj}kVVB^cUCSq96*BtenVXg+!ii0Ov7jJ881d&3Xo9Bp71DIT0Q!K^z^qMlMvh>u(R z;31Na35hk*ns2xAF2{1Ip z{1&|c<6yAGari!;fE_afWR9y%FE<{w=#f>GklIg3O#O>Yd^hoTN25s-0%B7KKOac^ zrkbER^WvSnRP4sX!kiI(@82Vc@gh&PARpgknPmwRRroG`s&j9e}? zLKOk+d50qwCE*wY^CF~CR(e(T7A0I&xEMb@N4Uj?iDc;1TuH%E+3~JOq~*{$i7*Jg z^<0R>utU_Ye7^1Kx513Jd@~HYiMA1(-%`Q3%0Iuk$)N%U)uZx;~tiN1J-ro}mT`M@$=dBsVW{XMX zSn*0=6BQyRc2wpgR(FEBeA1*PVKpl3@idi+Z%{ELEt`G2bUK7egRg)4kU$(ewC-ij zp2$%= z@$SYCH_l6Vz+v9;rnm>wvdXdpN+R6K^cblZgBC&fJI!DCe4|$}@y4{^v!cFavCuC9 zakRiF1@yUw@QcknhE=^p0@D6#=NJhKkg;-X%9%+3!BDa_L5&7}^K)h;UMgh&+J&z2{K-+qZ@8S*U!!c?&zs%KTnB%JGfsQi& zjo!5vFo*yC+?>Izw3=LWxjqC(kdz6HkP@;}`Y{%|SsDTh8gew*tOEAuP8Kr|Tw1BD zTDArCN))CZ@mh-Mvba}s!(T_Sn@8)|g%$cTn!evV++o*K_|dec>ekPtTdy3GDN7Yr z3*5DoP+y)`=*N#FRm!@%g&k52ah?#-dE$(|zKDJ` z`EF$(Q_As0vrO!!Oad4CY4RF%?wrxrds&k=XYM7AGM3RcAry~w9Q1|aWu233>_HXY!;>zcV~8HkaE>i z+tlXSckjDcJ6-u+Zt15GIlM~HPb+Pl&q1uO)8pMktet7Q`@;TOjotAx zb&q05rbQ90_DsAx`)t#Vc%gE`Zw2h_B0>{P__`$Lo6oUu^*+A7`LSTsN;t_t3PWiJ z#Nlc$6`Of3*paC$ zl$inrMa$-?elr)DzmuXYyxMcmta7gsoF4v=TiKxD;$*+h3o!L$amg>JCr_!ODZjJy zWYpJquka&%`bixlke#aV=c*ZH;S@TUj$Sk+{M^7P`BQ5l1@Mn&TP_m2Ae{3Iub;*( zZTVDr1zyIhn63X}wQemPsOfQUu|g6YudH5Ew94Gz3S_Bd2n?r82OY6puJm5k-22g@=m zC8wICq|M~jjSdp!(8txHC|ffXUs4DTFx z&zD0F9z)+2AtrEGIG*2?BBsWU&b?7~x7@otWp6qMX^x7MZ1EG=;HtDhwkK`Pj7YiD zafnfcLJ?lR219Gte1s`py<)VdYI~|pc$Rvs0!d~{Hj|I84Zq2H+#?a<+oouZ_4fRD zt9)AOQuqaNmzT0~Jdx%RPtlZRKZB+P4=hpP)yzyFxQz5-FE$9J^Wk=;oaw`++Am17 z61gd6yn&Hm-dcM(x9=#3t0p`9El@p#pS)c0z)$}(} zJ{gxumMKBss;$r&0)KgY{s)~^-d0S%hQ~i>jG%vJ9*2~1bwydDe9=(=bRvfsJ}WS0 z`pB<2KlE2QN5r{q=gQ&P`vG=Z_JMV!Pd-iCc&g526DIJAH{W>8SP1R2eJy#OLt!wwEl~vdfI&160 z`w2i~bOt~nv!;@!&!_&QqF(|EY5ZG3(vI$d&Zp`81%+h)tsqm?XFga&d;1^$7db@# z2dnX6_n2oNH4_mIz%KM_8Qi4x+$_x8EQQQnEYUvz9xiUa*IWXxxp}pCc!julgt)oc rxVVJ4xYpS@|NiUre-Su1S=d;4{?`PF&Pk$wCoV6oB2_N={`3C>SGxkn diff --git a/docs/providers/callable.rst b/docs/providers/callable.rst index 9d1b4b35..a9091e99 100644 --- a/docs/providers/callable.rst +++ b/docs/providers/callable.rst @@ -18,43 +18,21 @@ Example: .. code-block:: python - """`Callable` providers examples.""" + """`Callable` providers example.""" + + from passlib.hash import sha256_crypt from objects.providers import Callable from objects.injections import KwArg - class SomeCrypt(object): + # Password hasher and verifier providers (hash function could be changed + # anytime (for example, to sha512) without any changes in client's code): + password_hasher = Callable(sha256_crypt.encrypt, + KwArg('salt_size', 16), + KwArg('rounds', 10000)) + password_verifier = Callable(sha256_crypt.verify) - """Example class SomeCrypt.""" - - @staticmethod - def encrypt(data, password): - """Encypt data using password.""" - return ''.join((password, data, password)) - - @staticmethod - def decrypt(data, password): - """Decrypt data using password.""" - return data[len(password):-len(password)] - - - # Encrypt and decrypt function providers: - encrypt = Callable(SomeCrypt.encrypt, - KwArg('password', 'secret123')) - decrypt = Callable(SomeCrypt.decrypt, - KwArg('password', 'secret123')) - - # Making some asserts: - initial_data = 'some_data' - - encrypted1 = encrypt(initial_data) - decrypted1 = decrypt(encrypted1) - - assert decrypted1 == initial_data - - # Context keyword arguments priority example: - encrypted2 = encrypt(initial_data, password='another_secret') - decrypted2 = decrypt(encrypted2) - - assert decrypted2 != initial_data + # Making some asserts (client's code): + hashed_password = password_hasher('super secret') + assert password_verifier('super secret', hashed_password) diff --git a/examples/providers/callable.py b/examples/providers/callable.py index 73654eb4..a85023dc 100644 --- a/examples/providers/callable.py +++ b/examples/providers/callable.py @@ -1,40 +1,18 @@ -"""`Callable` providers examples.""" +"""`Callable` providers example.""" + +from passlib.hash import sha256_crypt from objects.providers import Callable from objects.injections import KwArg -class SomeCrypt(object): +# Password hasher and verifier providers (hash function could be changed +# anytime (for example, to sha512) without any changes in client's code): +password_hasher = Callable(sha256_crypt.encrypt, + KwArg('salt_size', 16), + KwArg('rounds', 10000)) +password_verifier = Callable(sha256_crypt.verify) - """Example class SomeCrypt.""" - - @staticmethod - def encrypt(data, password): - """Encypt data using password.""" - return ''.join((password, data, password)) - - @staticmethod - def decrypt(data, password): - """Decrypt data using password.""" - return data[len(password):-len(password)] - - -# Encrypt and decrypt function providers: -encrypt = Callable(SomeCrypt.encrypt, - KwArg('password', 'secret123')) -decrypt = Callable(SomeCrypt.decrypt, - KwArg('password', 'secret123')) - -# Making some asserts: -initial_data = 'some_data' - -encrypted1 = encrypt(initial_data) -decrypted1 = decrypt(encrypted1) - -assert decrypted1 == initial_data - -# Context keyword arguments priority example: -encrypted2 = encrypt(initial_data, password='another_secret') -decrypted2 = decrypt(encrypted2) - -assert decrypted2 != initial_data +# Making some asserts (client's code): +hashed_password = password_hasher('super secret') +assert password_verifier('super secret', hashed_password)