From c0f3af91b80bcaa32d216eac6843c5036e446e25 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Wed, 11 Aug 2021 16:20:05 -0700 Subject: [PATCH] [subset] speed up add_gid_and_children and adjust op limit. Fix for fuzzer timeout: https://oss-fuzz.com/testcase-detail/5001604901240832. - Operation limit is per glyph, so 100,000 should still be far more than needed. - Switches from for(...) to while(...) loop for iteration. for(...) calls it.end() which in this case triggers a complete iteration. - Cache CompositeGlyph size in the iterator to avoid needing to recalculate it. --- src/hb-ot-glyf-table.hh | 48 +++++++++++++----- ...inimized-hb-subset-fuzzer-5001604901240832 | Bin 0 -> 165568 bytes 2 files changed, 34 insertions(+), 14 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5001604901240832 diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 6c0f6dd62..ff7b9b2d2 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -46,7 +46,7 @@ namespace OT { #define HB_OT_TAG_loca HB_TAG('l','o','c','a') #ifndef HB_MAX_COMPOSITE_OPERATIONS -#define HB_MAX_COMPOSITE_OPERATIONS 1000000 +#define HB_MAX_COMPOSITE_OPERATIONS 100000 #endif @@ -397,9 +397,12 @@ struct glyf { typedef const CompositeGlyphChain *__item_t__; composite_iter_t (hb_bytes_t glyph_, __item_t__ current_) : - glyph (glyph_), current (current_) - { if (!check_range (current)) current = nullptr; } - composite_iter_t () : glyph (hb_bytes_t ()), current (nullptr) {} + glyph (glyph_), current (nullptr), current_size (0) + { + set_next (current_); + } + + composite_iter_t () : glyph (hb_bytes_t ()), current (nullptr), current_size (0) {} const CompositeGlyphChain &__item__ () const { return *current; } bool __more__ () const { return current; } @@ -407,23 +410,36 @@ struct glyf { if (!current->has_more ()) { current = nullptr; return; } - const CompositeGlyphChain *possible = &StructAfter (*current); - if (!check_range (possible)) { current = nullptr; return; } - current = possible; + set_next (&StructAtOffset (current, current_size)); } bool operator != (const composite_iter_t& o) const { return glyph != o.glyph || current != o.current; } - bool check_range (const CompositeGlyphChain *composite) const + + void set_next (const CompositeGlyphChain *composite) { - return glyph.check_range (composite, CompositeGlyphChain::min_size) - && glyph.check_range (composite, composite->get_size ()); + if (!glyph.check_range (composite, CompositeGlyphChain::min_size)) + { + current = nullptr; + current_size = 0; + return; + } + unsigned size = composite->get_size (); + if (!glyph.check_range (composite, size)) + { + current = nullptr; + current_size = 0; + return; + } + + current = composite; + current_size = size; } private: hb_bytes_t glyph; __item_t__ current; + unsigned current_size; }; enum phantom_point_index_t @@ -1098,9 +1114,13 @@ struct glyf gids_to_retain->add (gid); - for (auto &item : glyph_for_gid (gid).get_composite_iterator ()) - operation_count += - add_gid_and_children (item.get_glyph_index (), gids_to_retain, depth, operation_count); + auto it = glyph_for_gid (gid).get_composite_iterator (); + while (it) + { + auto item = *(it++); + operation_count += + add_gid_and_children (item.get_glyph_index (), gids_to_retain, depth, operation_count); + } return operation_count; } diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5001604901240832 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5001604901240832 new file mode 100644 index 0000000000000000000000000000000000000000..198be09b2e7438f8c0a6b5d0e5df42bed9a151fa GIT binary patch literal 165568 zcmeEP2VfLM7k)Fd*-JBo7HZ%~LMMflcpjz zL=hBF>?kUVh=__BMNm<(ae*NBe{c5^LdS;qyOVtPrtR#^o7tJ!nYZ&u5Rr{yNhFb* z7TgOLn_M70ap;I45u4oX4hh81sDzK5NselQuA#@>C#iIjBA?oJl2eEdQ<imp(K* zlTNvRuHkn7>^(Fs-jP6b9sJ9Q6OvLK!_z5<9){c7x2d2s!#p#Z$ZHm@j!sH)I>Ixx z#*HH)qa&KcG;JQyG$txCs%ev`W--yx5mAksH)$Lh-8ed;X+%tusK~|<%@EkUSyc08 z5m8MM+$1_8G6u0DBAZ9PxpU`E_eTr!vW6?p79EL-NQ{b1jA~;1MnQirt!Xp-#w0q)PVFg;QYnk#9nPc-*s~0bprhoZ?m!}C(@=6y1~sOJ6oJ1;YDulB z9kn61X>?@NV=X3Kvj~x3B>xa`b+KL1NuuKFVNWoX13gz>WB8aqlFn08?(Hd5R8#*F zeqFRdb?wokD+Qq8DjL+beS7e{`7x|5j~aB>M+ete1}J;K?c3$AC+DM?Oeg3m$c z39$TQxMR5G`j_^31=okc9hQ`mHQe_W>4du++<`{J_v!{K9Rc)IM~X9|Zl@jyM}B0V z^t8+@_uXh1^Vr!XG{e!Kw4hh7&J*jh@iN%?2LG4 zM@MR$#kHcB z7%t|vPDmT|MY( zdu^k%8P4pqhPCZ+@lJbkrrlxB%5Wq&Qydw0*wcobd%Ix`Gqcli^8|Zxsy!>oY44eu z%&xdBM^*B*Tu{j?YL-c4js-*=h%0?QxFOOk~Dj>{;F=n4enA{O}IW zRA)wVe2GA!YVA$XeV`poh@qfpbqrbo+R21SAvYR>Hbuk^YUpX)tBM+TcYo`lA^74B1Ado*h79Qt%T(&83qHttNd%uT)s zC;yw#xT)Hy-StSv?P<_prz1gcS+7q~PvUkrf_H7eFhOf==zZ+vsQjQH_DG-~%z#|l zdTf{?G*Cf88GV$5OA|tRb)C22(?+g<2fhwG?)^i-MYAQ{v!}PcapPOJV1Y^EaG~@7ahj$ zFs@rFhUu=m3XgjQJQj3V-(9K4!pE0w@uNz4`qBaScIGE3uHyH4VRV7FtIpZ!y4_q9 z8xIa#Bxx4yx&~B!C>jWf7O{9z2XOyIV`Kow=qafHW!33xqFAEI@H=hPS%#Pm^$kf+3WIm?F5 z9dpmjDYNd$n=)%&V6{zKGoMV|IwR0)Q~#ciG;Y#l*2H~VR4)eGCW_N^=ooICp7?Ahb)cnL}OaU@;W>gILpdk1q7 z7Y;+x3AaoS)Mo^iXHO3DrD_yKqFwvWJv`fz*wQsZL}v0xr^hdWqZb=&-C}z`jIM=G zuXC>D?SE|FW#nX}QouB4W)_tp-XSCk7Or6~+TrWUEu0q`JlwS<*tIpd%;thVg-2b> z%N|`FT=wwKh3SKX4+gJUk>jej%e81%2Uq(t2M@R&I#Bk=!Jq@KdM;nx753duS9Mot zy={dxs~7s}Wj}VwX0`(-Z!BN-h-;CHY%Z^thK7gt7+k1V5BNXc19V@cNAcrb&*HMb z7QAol{(?1o1UR|xb5&4pZ24pFe&d?ux~JY3g+cAx$M?Fe`o}GP3p-FS$@cP-?>_Z> zl_PI*FFraJCoKbmmMpqx!ym|A8^O%@sO`9}t9vvMS6%hfcs>aPCBI+XQCC#IM zx4BdfT$cH>9AIIhwrL5@UXF}p$KavP@a}0Tj?`YxjLhUsCkKTFH$VR7mNKqBpQi6D zyWQ2tH6XZw@BD&p<;$*U8Qk0z<-5nVFL=jG`#;_PQrSJ8;IhYDJ_WZ<_I3FOyV8zV zi9#2V6TIzNS3O@>&*NcHzU+MEm~dsebnZlsH|PkjS-$8*giCazsiF%_7hP$V=t1*D zA6g`CqXnX$7(~a!7FsEW(8D5~R*6JLxkKPdr=v}dpc8f*yp17Aj5-aITv5pRl#~>l`y?Ba_il^xZu~B~n zB7KjGEc#fiqU+HQ=8D#|8d8&c#A141ETO$(DSaT8(LS-9x`;r!Q#7HCVk8X}4QamU zOE-&B^n$pXUK7*BbK+I;yx1;Y5HE_C#LMCpu|vEr-Vi&b5U+{7;zNC+K3$)!&$ZcX z6>U{)m2APb^0vzQBK=>Z7prFwl=nQ zwyw5rwp(o7Z9QzgY<+Bf)$MAi?5&2#KC-XuC;Q8Ra+17N4v?edXgNlXm3PbG@=lo{ zGi8>{mN{~m%#{=5I5}QUR2$XPYLnWmo>5!XHuapEqV7>s)igC-%}_JdY&A#CRr6H7 z`a*rF4yv!zA$3@NtB$De)c0B`El?}1mC?#-L0Sc^qIzDdq_%67)eBk`^`cf)y`%-J zm$ho@HLZr)p@pcOT21w~R!8m9>Z*6Ndg@)RzS^xdQ15BsYLC`Xy|4CajkLzJ0 zuSKbkv}pCQ7Nb7VnyLd@Gxe#~Tz#gsP@iip^-=m5eXKr7pR7;SXX<&>O_ZVDq7wBH zmFW%v6j9N579yKFnuG|(~n{k{UkPv zW+IPT2|=+!Qfr7wwGkS%6<*X%=yZdyQG4M{9fS{c6u#6+_|c8Rp9YICiWfC0LDV9r zs7*se9ZD2+DM{3$WKo~Si8eG|w52s@jrWV&=>c&EJqWq7wU8luNTkv_kw)u9Ha#J7 zXoDC=Pm1C6lo&xDiu-84SV5nN)pS6tp-;vA^qF{oJ{J$tSK<-+Ry;vR#0L6KJSh*! z!}42sM1Ci~mp{m(aAjq+)^Np6+%h`Q+_SK zk;kM65qPnVX>K4^q?v)?Neey%OUw$M%mY=Aes+a1k`l(yhZK}T-AU~C#$RgipKu9pwWwJKW;QzKLZ6|NepMyk59tNJQJZkI2}Epn@TM%|@G zsSMRy^-z6OOEpkFDW8%r%U9$9m8tI3W@*#48QN^^0WDV>r%lwxYZJ6d+A3|eHrF;s z->yBVJ*>^w7HDg=b=pIEEq#I>p-1Xd^bPtt{aJmJzFE6Y+oZp#zpL-oU)EpIU)5jJ zcj&L{Z|FPqxAeF5UHUuvxBC0~KK-!%t4&F1n`fK9@$2yYZM$~vZcLhq`d+|DB{fs3 zw&p~hNMg6YI)3aP@O-m|32h{3hzV^hXs8M8dC)Ku`U9XfP3Y`j%Y=44D2p%x+89t4 z>8lGnq$a7J32h~4eG~c~&;};79MEtR+EmbnCbVo&7L5e7WuOs2bJ$yfwg6hfJ`9xS z(ty4n^g0vzhoGD%K>rAouK~1Cps^;jZJ@1zegH(~=vEUN%jn-`Lc0&NzX@$I=l~P? zr=SB(X!Ae^nXqB*2pM#ukw8`8E)&`kP`)>yEe9QKLR$(t#)SSk=n50InV`%sK;tx4 znb29bf3*qyLC`fO^!q_Q(AUDw^#o`uKsg?uaa;}qY%E&(kO}Q+&~+wsE+5|m(58Ss zVnY7{^idPqG|@FeP@4(L-RY%D&$(S&{wl=A^- zT#ij9v^k)B55UI!e8z;1c1F*d&Jc@rA*dpqzl5Cgp8!F8ao zde9m4H4kn9-2uD-aQoQl0rTfg;B8<8u*(BZ{~Zs027T89ZvVT1y#Uws2PSlO@AH89 z%I)0Ls?`qAciP;2YSP zpWm7gcF-fh_wa8C`hyA43iPN6!My*`gt!&-C*T<3J3w6~bS@v~0}vUY$ALoFXM>(J zA?AbrWTiO2fO5KwAOQR|c-#xLlm`_-15Hq0 z(9#}M0WD*K`wy-U12sT7PXPBNg7d)$0r(yO_bY<)!3YKT9su1ATFHY3pp{KOm*aW*&3~ZEk|_JPIxw z<7R-{EjxxF&F0oR$Jsi0hDMi-!!37QTX>p@r0)+T5cXd4f>9kw+=^FX=Gj6T2( zCTI~T^N4X9z~u*M0VtP^(GTGAFa`lPnlPSiewG+p04^uMW0FxeF5eJ<^9}HrfmcWq z>7ZOrfX6OO`b{K)b~nLe2wnnAWP);e03HMIVqoGf&|W6E@5hUR32rl7PJqV>y#ARO z4a(&Ki0kxL55|LX`2ijq@Umfo+sptHv>kMy2iyh*ncy*m`#1yK_6D2aaYMv=!1bG8 zg2xu&^nmM^c?9rSf){8LT#rd6cq|dg9&kP0Zi2@Xyl9x<`WkA2#}>SJm{kr^D1PcZxxPG~w03K)XqGw_wXs!pPLGw)DQxFn!Okk0K#9R|t zE+DbO1kXW?G8C1A-2jiJcsVq|?eIkt5<%iE6Ff&0Tn7yH-(`YwLAeeXtpVmc!1FJ` zyk>A6GJgTu16qW|u)lADnC|sp3FrqVcupYpd9W1pLlZnl5c@q?2FmpW@O(jVc^J!q zd=u0K^a~FHLBBFVT<3=j{Mq#?>w1d=76&X2SRAl8U~$0WfW-le0~QDVA`Z;_i_*D_ zWQtEcxl)$P$kP>$^7qJ8UKR3FZoDI2M6kvG?7U7dpZ_WwE{9cCoPXUT z!i!Qc0e?;!+)U(heqW$cyvJhf2OZh``1+0eY9GSdaKZXP_tOAA{U)S5WFJY)x*Rjg zSW}Z^Ck;uKX@U#MYlQ#NNE#T}&^$Or(s+1EZ=7JpPi`PKPJ$Z1N`6>VW3$5e#SfL6 zMs;Dx8}TG|zANH4yhKuTsicZhx zKn!)X2_KS*4iyJ{{csd{r&L@yGxg^c;{=WG(xYcrE{G{1DjZpq+JJ_d2iHt=BimS{ zyVw;Cu+-bok(G*4GS4P*QQ7KCiub+M9avl@UY#^{-(6Ieg-T&?T2+ArODZBZ$Hj4F z^>Arr2&uM)7a_nG$sihhEAkaEh(FNium%V$rqF| z9ZAkZy4NN;GSeX#tKfbIZf`#JF6gCg%T#*a{C&IwTkDh-mI zogE8gXWyBf?TL*r1eD{Goc8fCeobBI5BLgKf6khZ7x|9*vSuI+g4gdbXAaxA@L$(8 zUoy{^H|P2fFybGbcl;kueg9Fup8tXUOJ6Q8`Gj4C46yS2Cm*=~R)C}zrJKZ4#JGvO0NCw|%snZVpcQQk16jbDG$;rXp#(3Ac6z~tK}|HM<~J$NCA z^|&Dc!crrFOM2Vo4Y#+Oycz<`S@0W_b(XL~U)#mxbcV{)T z$4A-gM%IaFU~lKhxjDh!HZ5at->fVg{hPXEdRFgx_3Cp5``4Jv2{dZaqJ@7*i?ffB z{^GHF>LHhS0hBrI@P0wY+JaXdTVE z+?$VKEu;5IM_N@8j>CpMC+(Utv*t0<-?7}Zh()+@jC8>IQ^(+L0C&0b9V6}4@fy6Y ziI)-H>+~_wau(diG17h+m99Yr9Om?L_*m*4+HANXqr+17-H>(IxTb*bZVvlpV5w_= z#mTrF|H(7V<&AlN+Y|UFN9^C9FQXyw`=&;LcpMtvbM2wmA>_RX982oZ?uPc2zOB}e z=o)^zck+v8#2u?n!aWr3U$|i$Y}g#lJzx;r13LC<-TjBU$G(PpJG*a&`%$%IFwXO~ z!=1wo=hm6SQE6h9HyTb{kJdeQRQqxs!f`+P#*yR52uTftAX;f|2vO#FzJ@U8QMj)i zg7Do9>S2v1a3b7mxnY&_>A`|)VQ?D_%hpS>&>82?Xjp!C5ewGc2Df=WxrW97f#Qp= z(i;b0hi9aAaPr~SUDC4B_+ad|H{QhORmM9wbu4xq3rldn6n4AexWJD)AMqHw!qVN} zhUK`?%H2PPjdC9i8-IaI5I<}R(w@oT?n7ZwXo-kLf!X;@$Z%crp^6C z*gNjW!}g*cxPQR*wLAfxznC7Cq*;Uhs*51w&rujQh~bHMd%+0vYJ4S(^NWIO*kfd$k){_25rmBba)%ySWb*ln+y2y{9oV zU~XZh_b1X~`8yArow+BBuF9V##9{*^YMxFwEF?eN=;y%XsK*i93fGGjGJBeukWu~=AXB`M!fw@4t;wiz%qA3Bi3z$;^ zljjLoRjh@NvABf&BO5mdD|j8+T;hbEVR-4;3rI7fNid`wTt<_-)Foy@r!V1)7#QBU z%KgE`3$7%bx?o7jfQL#tVE>ri=iI~(x4H&*<|bn!-v<1-oY4xX8nVHwth{2*SyI7V z`~ahLT>7eT$)Yv$!@rPlA8{`=*kNApk40921=cY9`oW*$>ab&eVEl4cFwGRt@Hd=; zc+k^JArf|8Dsb{JxbxUiUVKF$+l@QhTWAzsIcc;b;h0zz(Y!GZxoFxL`dpetM>TC4 z-7KOhsYP?}CX(q$1uFvxvliYHfYFc#PSg1MfIVQBD04Z8;s@f-hR?trBd=T^_;X2t z0z^Wa#ieEzu7mD~6p|yEF?M8!{bMnLj!18P(k-wG~M)S8$$Bw_Wu};Uv!&zjk)3MRnSlUA_ z{;KzP@#hk6n19!8fBy==Kfs>O|L`iyRqx$)MVt4x+C1j7)^KEv3zuvI zxqnAH!AsTEIObZ-;i{|_Ye>1QuG%^s+j@Sj=htcjSELPCY`!9FzR=KjCi}6_eOV*K zKbqwW6~*$m>dtBdf2<8$-ZI9SodxfBSslS&$rEce=}NY#vjiCaobyU%+`89Q@}T@p zz2>>S>R;K(Se^Et`_}s^sf%+P$<;siIblr~u9DVcP2Dc9@4ot{*Troh`(=WNk32y9}<%mz6`rZ5l!#b;3ssQgf0_G=M~!-UQ6qQ=Mo z_{g4;3LvAZ^FhS1MUtEdFbve9oMDLUMS@y&io~`4DCHY?y~rYy_;+Mx;oq5I+_mTy zNcrC(3s&_%)YqUr{a5-LYbgKERJAo!{dXQ~tFEoOw%Wk?+d!^0yjx9!n+DEBuo!Xv zXXGkbTCs$}(?_&;(xOO3mw#@$lmZmDs% z)VNz}-2bQ=_p4Mtdjp7?y$3YF5idE|(h4`BO$FtnLI6uYJNU2?d|>^it4#dg>1W@B za&5%k>Os(_O<4Nb!3RFS4SHfN{p{dDODrd0i=JWWX9pi}c$aYm6VBYS^s|Ep7%Lc- zes=Jo9nc53!Gxus9elVI7!TZL!qU$UKCl=Obbed<*};eF!H2g!fYZ{?{zulTtZOU| zSRAl8U~$0WfW-le0~QA?4pm@3XSM#@pdROCT+^PFrhTF7aQon_5f$Dpu2TnI9)->q?AntzD^1(<+iUG1 z2A`FY?Ic#3cBJ-=P*LQcMRYf@(ljVGiEI`X71J~-BBE)NrV-7fqa$M?8%J^atTe6f zjlFI{l2DvxDoq=no-_kW*hax!m6fK2`ZvJJ>@|zvu4O1qno5q>+Arlpp7CT<+W0n86BKm~!tGpgsF2S)cI{(LN@&@m55Duk4!zqQFiUGg)!lirx%>e! z6@RpA7+k0Jor0h2L)EFeWKBoV%~Ha^4aG`c@KLf4xB;7-ir7RqnN$p*#=Pez{k(jX zrlizLTy0oew`Q)hfp=(vJq%4ZVQ74?#gKcu`!O?hz7QWr55;d7G(w(}Gb8+R zevG_cG9q)efrRQVBc@=LSRT8nYRL3g6iQV*{)XBtkKGF@?XUOPS)F~l$6gvdpJLjP zfKD?!b^$#^b3Jy6_{%(Yh4>pic8$u?vmUz_nkFlB;!HuUkNYi;-G(&tJ$7%zIP9_e zfWs#}c3%n-n#b-3WlWVlcBpw0)jalVT$+gR*aN7nh~^rDDkMR5L`RQZLWNYi$F8Wo z7~`>PCE|Ed0(4HA*Xk4@>v-&?$ro+J@JAv15ItjF$44WMVtjN?b%YLv(Bufm8Xn*P_2 zuUhNz51?9VLtGk5%R)tHg45p1k&)~eJk;q?;}qF2A~K>SKOim5SRAP+PI&j(bC%D3 zXz`3W$!V!}Gip*=R(x7&4!asgMl^4k;<&?^mNjJYaHqX-!{~-F(b3Ig&P}O7_p}s8 zs`1m?nVguEb;Izi3`b|S^?*((?oN%s@YDY12JQ$y*RM$3)XmO>6N~Tqm(%I>RV>C;n6r`JqvCWA)XHqhJQgQc^sV2cM z3%TNuoZ_&C#yy+kUYx=mxSnGT0UZw5@whjH&aH;fOBZdZ^{b2r(Re!1J$thzHn*wo z3QjNbE_lX2?B&u+Az1-a%XrRMS(`@{+jiQ{{^(|74T@{H??GPx#a#5Ds3NWxcL`^~ z^pArASH7M;@Pp}r$LpL--_)vxuZw)Y>+)0j<`CaKt_m;wxc0WqvGYgdP0Fk2m8U;n zb5CJ~`FBm8{lIMl_T~k86>fjt@!q&4A-)BUy@jQx2ija^3r9ULz`1iqpx34?*^g&G z9^%{ga3`1Fr1?{4rfpf;4A;2E>?+i2_}*CP*RNsfv;7X-J#YFHcyGEj`|*{DA-=9M zu2J_7eBvggaMBU$;zZXiA38lS=<}WjkvUs|T(xJ#dn-Oz<9Mj=tnqVlXHK3xd*;O1 zPz~S0JCBErT9Y>k z$=BaisMYWdJ=s5H;yhQLZ{7=e{BM}Ryu1alfaHCWmy(yaIBy|-&oBt{H9R=dnTCC8 z8(zM7P4d2jtx4YZXGAH!xTNni!x5NwN8THTjgwctFHk9rz!-B??b@{if!eiw`Nyzw z-C}rt)g*PGCy{+%;EBUSgz(x^@N${43kyar{9xhp3uiCfv~U{CgnOsu;dk2Xanq*F zxM!L{7go>{dIi5dWsxw{7eDaOEaHJ%G)+R{PwQLa}u9jmby4|Va~FlbI05>bIPoH z@}|t17g%l6*32hUw{m0a-}4b@|C=>&-l(ZF^Crv+tWs!e(Jg$*oiiuS8b5nnUSRdY zHm-du3j^nlzBhaJxI11#(tR9B*R{HN-TL0c*Nt8^Y7IX-m_P+jnYnNnl1{i~dZ0cd zusnNmkT0~fV2gvwGoUmPr4!(6n(*Ogm1FEn_#YfG?eYjBy(1$_#Sx|Wwcx;nV*;hziB z2L~SvUb7;{Rd1JT(XI}z_GJzpa6NRO?2&^(2VC`BzPc;yyPdA;uF!hh3Tsv`^wrCL z?2^rF2TtBtzU&d#A{W_QUM~#|5AQL!P_G{F4`?95RQ-y4m1=z)^(Q`#I`7NapYUw? zC$9Z#F69TT*!;;!GkGS>`K&P4qsbJLMQhUhhbGMwrY3qO$`_n8&s(zi(}$MNSa6|9 zv+6GQ$`9l|`Jvn|KawBIPgGCUOZ8R#)UE0^)n5&epUThV=Q3Y@A-|LdL%4ubym8Hlk?>QxlAsX@2f18qlT-}s*Eb9 z%B!*}NIovt%LnCJm92)U5vqX-R}EDoRbAOteH9_M%NOJpxm7-+?oy*vhU%?)s6MKt z8YrKXPsx|%EAoKKRCj8#wCUOmZMOD+maC1^CTiog3ECuWm9|=&Yn!8Q*B;a!*5+#q zw6)qg?IFFEK0%MrBlRiz27R6W?El%P7kluW@&XB9eR=^tjKTZ<=b$T0*k*#RH1U7^ z=>7uKg2B(TR|pgkx)yRbgJ z01w)EfF*l@4Frbu=>_;;eR@ISPVj+oZ(ZZF3+vMh@Zv2K)~6R&`7X4TJ&OYt2P_U) z9QZGDph;qMRAO{=VsuPmbkoG>W{J_w6Juf`6C)C18YjjyNsNg~jERO%Vz;Kv@EeoJ z8?Wt+jaqEjI-E%v#-=Q9%#Og}`e$z)^A>G{v3Xpyb$k&?! z3K}saViWJVcnp+2uwag1t|{^am6W8&r?#CW1b+@wQcVtXZ%-jQ<^H*b+x>I%$TxTH z-0A*kVP4j7mX9Gi5*3jc6`2^-#Q2X&jEYW-ib;%Wni$nAF)AWDvUws{5Zwd}YMdB- zrTFDNG%enN&9Uo{!E)k+BxCn5h#rR9+Ys#vpj@o|4ub4~{m0b-%!6MJb)c@@Y!r9E z|GC}RD_RQ{cI=SZvrV(0=xA{BDBS)mn$>H9Z!|=|I^vo^y}EYqpfHDp=-0_5*kNQ* ztO#d^F1VgOrzAO@2|fp%CvaO{K`}(H{7d`1g6qTJHbk#{Z;?*8%fTIZTJ(yJz-@?L zMbz!o1L4Sz>|=;t-Hp9_@<$DkJqNN~K4U7_iAwSQW>`i_)^KgLm;|>5H!{)95T6pH zVgFBvAX7S{qa!uWaaU%M`~-*GTu`N;>NNjq1;L`Ank=ZU3My)a_59VTF{d60Ch|+i zk1fz^`hsAZG2#AzYL%(0e|7k|-Tom3Pn9Zo(Z42K`hNegg1sy&1CHs~jr>a-0eF_GzhE z_Ab~Sw%0aFo8in(YgpSJ2O*f`OuNGl*^>lkiX-C=d)kn5Z#S%AW_CJmo?uT-wPz(c z?LAYI*%g=N$jWSloZB5~8TK@UWY|&L@fm5!&di1;TkYVhJ@8C>zW+ca#2qdb8H3SCT2MXarh8PNpR>zb|hDoI*O$h1Lb>4O(9gULihp`%XNPM_%co8T_8jdG8YMfQ@EH{bian~KHC z4lZ&E3SFIT=YHm2Y=jpaRNqGZckshn{{-3Lrn;yUh?>EsK^P7k#h)E^NxwqsK!dBK zUo7I9yZZ6J!(6U*m*~sT?jp^iS=wE$j8FjT`@f?3NBrxw#NkEm@8~_PH2>Lo*;O`}URBMZv(@Br!slOP z{@G@JRkbUtE5%ZT)gG)i`R{H6x&NUyY)uoa)w6$Z8?cnk{d?=qdhV>c`&YFAtGfQt z>N=DCKGutdwTNN0f&X3`xV#dd*;!bt5`Xo|)L)(6f9Q?-53CMdL^SjF2U!opf3WfX zO}*y1>wH$n`;ShN|3K&RxAzCHOe1R?5oGrW6 zy;*I*Y6BN*1C|VzH3S*ckp9+`_ROWNtFGU$gt)BvxwY(LwSlwRz~wT;Iu!p;9E$&6 zK4IxEDm$w{I#an3t0d~>%*agMbaGH=aP#ADZYksH^J)6dvfEvKTmym|_|7lrR=(_t zmch+kQBX~@FL=jG`#;_PQrSJ8;IhYDJ_WZ<_I3FOyV8zViGtpYoZxNGy6XA5dL9pp z@@3~M$Al}(rL$&@;|)5(YnCrGYY3Onl8H1EYXAJi9WPQ+(rvTKQV}oi7m8J z455dis%n);q{l=iJuU8{XT&JlBu3LVF`k|i6KFe5`FUPUq*ui>dPPj7H=rKvZ84AD z5ew*Dv5z$ z#H-?Yv0c0%UKB5hm&Ge$hj?AQA$Ce3UK4x8hx$Z)x;|Tmoiama$}E{JbL23YD<{Zt za=e_VHmax9Cbd~TqqeGT>Nzz<-J_>ahA& z9Z}z@@3m4|pjKKdqm|WyvB3sF0@ zn(A$>j@qTwRqtr^)Vo@JwOebT-qXU>9<8BzU+vWzX^qu~S`)Qji&7tH(duI@Mt!0+ zRR^?Y>Qk+``b=w~KG$06qx3QQSbdT{S)Z!U)bpsDC_}wPCF%o}Xm{Z3;S3Q)Iie{I z6U}L|xRIuan`nl(g=UKGlqce7w&+Q7L@$~vdegn4KP`s(yd`2FJ%V#sH$xrTvtlf5 z5jdYmjH4IDWO@k-0C$KP^tzZy`C=`7As(WG;$iwmtfwEvCi+Qi7R^K+wGx72g{0Ov z&ZiAjwY3#q)DG&+ZV)!8S@Wh2!iPEvU+N_M=tkjBgGCs{i<(fiR*RgXHVqMVC{fg< zBvFr&MSU74+R%8>me!y(-Y;&a2gDuFA~lrO;;f^GL@KQlX|!Hs(-R_xHi%*Lq!><5 zi4pXnxR3UW74(T%O$Wpp`c&LcpNR+PbMYX3B_5$~#S?TyY@qMNlk$)}EWedUFlpIakh;3*{ntuUsro%HI_95-F(^6b^dH zC32~}Pp*(F3hMeE6i9~WgyTRlLAGCe@u_4~#W4`!FXQ?_iH^*4sN=)& zOfu|*M*fLIM+|wU)ksQ{!g?uDMOG??zg+X+CDww}00&<=vQj^?`;ovocM|{-N37pDqhxVfoC@7OuxkMNamqIw7#>6}lzoIFh&NkwC6V79X zT0~!eoEAk=E^fE3-IjK5wG$74VYmK%@vYx?1ug7s7-WGa6J6h$U3@a#D+7v+amE%- zTU%aq*w&YccVwmqGA~M>zzJ(N;o4eHmm41OW`FwpaO$8F?h|hJ7`H!tS{J9lRia$* zEzFy8{S&9AWZj0yQAtV8u5m4)11gqu>Fth=PdPy+PTWnDa<)02W-X((kn)9Ui!*jc z^EEt_kbxws>lwum6vz1?(gMZZB5o}M;##4ZWtTvetBsE>qps%)a~{A(UR9-N%+ zs2Y}?;kaX8>3#lT)4zdv;~T_a!yNZ=_dY@SE|m1*p`0}%Cu56pV*k``8qS%$h24%A z;X>F0?9$#|FNJo)2OZ*!d&8h5jUDC1sWAUFwh*876<#@Mv?Jk|SQXK{F|>me!IK8ExIVOs~A zS1zlv^fpm|NPG$zGmNuv9nQf^Avuzpw;gG)e=N~ABhp)+bh8pnjq1^RxPfNQ~8No&8)O6@YBT+>#ImkMnyl9phJQmk@?27DE4kf_T08<`%3e7lP zh~LR$hZ0d}IWscztk5w2nRf6lfF^nD3T()9pTmQ8bOTP|>;RR)o#;lo3EEw6rY=y+ z*o|(1%EdUS5blYjds83kOa0I_+(uZSGH#333tA4zd-u2@&eZ(MSv0bTIyAEhb+YXF z<7*fW%`o;Cd@dY~hu+*824$D|G;=2(+qO-6`|Xo|+6&L80AD^`uCKayPr}Fa(VIV; z2Swf>gZ(NpTVSZX$?PKtvt zf4ogHH;I08cXyxq9+pU)Z|d#FvtXQis&Y>BWDSh6l6IRY8pe#G{AT=8*ADGE$8{SW zR7lf)b-Qw7-S!S~H?-NeiZhZvG&_?v;P}dI^j&G>d@|n_7rIJt6-&W%z>*?FeZrAQ6V*eP^iAFiTdt9G>C9g z?_sW8w2Fr4vyJhF-NmMAv5h+n%z?+4b71z4BFS@LnULGCVMC*DKYJp6#JCNWyZnhb zr+dDMIHg}`B7U;uL|k^}iTJMCL}&$om9ZA8atsVCs9e zDIWcbE#{2(?0A>w7Fd9T8Y`UmoPpe7bOM-Gpd*LRFa|?hE@ek}ArK0nTh}l)s@f(n zyCzk~1gY&vtQ6i~dYMpxpuK@Uh)@m`ubd1O1iI7&A2b}i!i3UkRqz(r0fm>@YPt!` zQK=dj#1Pd${Y_xDO4Tr(W{8@g7~&Y1!%{WmgCUUNYRCtJ`aMb2FdSDag`1aJYIe<~ zmcfn#pSj(aS`PbiH;sZFt9mbBb?~F#Cq|# zcuYJh9uW_Vb$E4ND;^XNi2KDF%)wTPm12dsPb?S9#8R7Y zW{X)OPs|iEu$nkcOcnQtDPpp?TTBuYvD$etF#^u)Uo*C%(*rlJ%)S1qJpbROGk^lD z$}pZpt5KRg(iP%E&NvKN#w*VSI+olE`2Q6hk$vHycD)+9V~&5&{ig)Y)nTgFl3(2N z-NGf)FiK%vHXtnfHViBsdbGY7Z&h&)Es_Tl#nV|sn?#v7@g%~JqJOWK;*W{3Agn8- zrZ^qGRIf>e3Q_gyMODb|G56M6=k_puMf+a49XjOp>XqBEW3JF{x;H21-kZ!{S}5X{ zWC-~tHgWjp#!@X?N*jJkox<&YhiP#BHQYO#8MpJR5%~y#_qoFg0}Tu`o;Zx*zapjx zJbU~NqcX3S`4rC}cz&5e|p?g*p{xL@Q2OR%&dOo}&MSF_UPyZ=B!9(FwLgnw(795>6g`v;e;GzAF}i-b~%uujl(j7OKq;=1+^a>HXHo4MU~H-)cs zyL~eTJF~J_jYkU7rkd0rJ6qVmDWz5UC7^J^ucBk{;EL7XBdK@6>xLiC_A}kr(-{|$ z=OWJdWGvA?$L2lb*Ynf9b?er!epGDAmJEH(bc8Z_s#h+bZViqfH_n~2g)Y^lG!C&Pc6vsFZGdv4*q&#xZPyT<@WTzAK*jhla4{me76 z|K@EorJDcj<|W-0J-unESKr%{Z|mMKDRIEbjcVx0dD@JVa~1Y{Smlg1M4LfDSO>d% z1KDeoF4KH{#dl~u-Oy*ff1@f-_*cEYui=nz$THXW-4Nt2IZ{xgCrGUKt>34{zAC@; zU9Y{fJ}7X#Zv6Vav)->!tWPPw>VA#x?_YZuc z+G+oY$eK0Ehelg1mIt=~vc#H-icWaM-9lpP9 z*UsIkeYeqwRNrB-VO(E5I0G!WyQG&l}saY%!gA=wnC;Yrij4?E%h85`GUuC*0Up8rD2 z6u!v3K(#960}!7|T}`^S)uCEaJ+-EW6wZ75V*M>fRFa)Wxnb@_r=bS@3PU`@4`=nK$nI zkT==?LZ;rKklpTMAv{SZ)W?Af#k-h4?)ByQ!q2|1`%uU?CF|?F*BlGM>dwE$bVd*1 zwVk$m#1>;bVvBU9*kUfqV~8!jbIot)t=koP7vAKKxJ`Gvf8ep4 zH&F*x!3t69bb1+Aohi-8Z;uz0W|W;TF3tFRH&HM8;>H#9dtcm&R*E$4y(5r7QSTj! zDbl`f_i+br_TC&;qNgtzm#0(cmS=HUA>?;{$;}!UEbDM;qoI$G-1&R7iLRq-Di6Zy z5>eyqy|?Z{KyBaeU1_;__sp35V8X1s=hpCby*P3H)alcv2kLh{Gk5&#N%QVpI&S{R zn!bgrCQO?!cg*y_N_X|2Gj-;ay!%JC^K~T`rY%jFHf?&^hPJ-0RZnJbxBCw3;9D5D zc>bhTzO!#^F8_n3Y9PSiAO}dr*KOQX0U+C?0B$NGX;hSz98dvS3F79U`L&nAz_NCN@tw%G&wM-#;Ywpd$p36Cq zc4M$K?50mq44yY~>H@Pzb5FM%uH`LIe(Q(D$Ug*sVe3U?ABl=E{aSH|XaN5vxI*${ zcG|>JY>|U2bBB?p^vsYkLX-BZbW69nmWxHY*s7UX8EJgU@T5enl=0n0$VAj*;N^2yIjp$A~Eri6MkH!~#*5Sc9I0De-S|s_X;zO(ul^ zdxXI9k<@hMrFluI@ihP&=FM}oW!n?DRcq=k_n-O+2`vy^?VdPdzg$jr$&Nem`zm;V ztI8Pxdkxv_Q|MR!@2N5MXu-=&*-z6<8jTIQTz44|ZdCeldg69kB*gH8P zE2&GGTPtzVS%N!%r;{$svH+CxEVi*m=J0MAY0xK~m7JF97|Ohe{OG}pC?gKI+3xG= z8^lc%jPzf*{=vtQoR0(N(6f-{C;La7KZ@Yox1?^r9tlLx|I}`tH-a-OYVU ztfrS-JuhCpf9mj4bI@Jm4uo}^K#E4U4XMOfc60Y+nCnd!`%d;)FF@)}COhQ1sooK- zK@z15cchd5HJR`j6>INOGqKi)ArSE8Yu5+XMa?_=k920FO}y`nd(*_T5()R75B=xV zq&>3P7M*1Ks@Rn|AndgX2Aqn}G1YV>Tw{l#gCsLIG_(T56J2vJrJKB0(V z-Puq)ANYYGAQ|ibo&F$NK`i{j>SV2t2%ux&kvS0Yrb(3|;i=)JP4OwB&{N#^mn%{m z|6KXjvzj-Wb9d{_*F5^x#x}bVcG|E&6*s#8ewPhzYa%%ARP}pEQ8OT zSs>lsx7%|oM?JlXtK zbnA07Ll@e9(uQXT-!UTLx~y$qteM%h?mgRPF6}oV=D`N@lHUG#)UZS0GaB`a+4AeN zV_MzmXi~Y-h<#hCOgh>!!q+}+e*c|eqc@d$xBsa=LpN-Gx=ucG5>MXsw=8&jW8r7} zT9y9g)=$f)Z+ol9S7mm!ot*e+y&4-_%f8DT_Q>^bEP0_-_G>o}oHFX3QA4~VgMP~D zIDG9_ZJs{#$Sq|z?7U;Zb6z_dk9PZv#^|u)on5&vWMzu2bt^5oHa~n!m7ZT7o?5HA zcTo1bBTs%e+T8K zP<|Ta-%0tIl%Gxc!zh0Q<=;j5qbYwZ<&UHM36wvH@+VXNJ(NF<@@G(f9_7!b{JE4r zpYj({{=JmHgz}e>XfE1d8rVX#$-j^CS5p3J%DoMyHO{2t?$qp*!Ojd*<+<@uO^pjm$zDMA^K>6!+Ad%A6ZskBk^L-v4IYh4$bO#F ze@wr4r!isd#l!zt=+?j4oX%Cr4vHs}KU0~?^;sITSW<7OW7X-M^Cu}+%rQzfs)^3`$n`V9KdC4z5iwD+{mJ%Ch)@~XYQ?vv17jB{zCv|0J zB7auU_w;5OmQ_xhKfarma0N_>d>Zpx(|y4myY87Oj-f*l$=bI&&AF1cfBC*$@e;au z+=sPqb~&ejSo>zyzL~Xe#!DX7zL~XecJ{hWvD?}=D>+dpvRnIRr&o%vsIBC(w6$+$ z?VDNqX4byhWpqG)^S0U6(^)9lLH$MhW<`U}S=4@}`|LfgGeb+b{vY?vP&`9E_lwYG zTvF_%U61{|b{_kUOwTq({6nGL+($!uVIS`{U@(wWa{umZp1SixQ;~L7$vB*@dw1wa z_~*Kx4ZRz5I`0)4=`RnRKOsv>o@9^y+hx=vIhBEHKz4yC64*d-Aze1cNxZh9iw?hj!hWqPKLuBvl z{1&HkD2ydLh`hpl-G{;g+3Nlg-wa&D82g_;hCz_-Tyyq)47XQU2-1hVNLa&jueh|2 z`-`w9myUHAG0c))M#M`;aTkWQaK9fGd+C_qC%1(oVeNs=;H?wKOQ*KMfrJp#5q8MU z#`!mj>Q{kJV8zM1Xf=}jb)=i-NQoDHd8bPfpQRHEKb)mQ6jUU%+@5gQVJSZOiE`zT zX2(1yyfrjwMA3n7VM*U*4RiAmtR&asdhelW@eUlC#2wXo$ouJrM35oK%bWXTPj#d? z<*Ro4(#g#*0Yr4Ia~VYxvHd> zY9U{gFUeQsYjTHtUA`fA%CF@&@|bkVQ_`(`l&`9!DyvWxrkbcIb)C9iwN`CZTh&h8 zpxVo~p(eEFLHUsY^anus8zMkw|5_$AmW8Zs zLK_2G2Y@J}wh*+Q32h}Pe>DZ@4In}J9st=4EeC#hE*aWXQ0~6~4adwHCqY6CS;Hwv z5EUnC4tp!m7C=kbhk;&eLf;R1oeBLzP|g#ee+0_c0NN6N)wj6Y{32iCp7!&&E zpesz+W`Z)m0FBdFWkQFP7p*qIqKUM|gnmD$2Re5@Tu*?u0+izc8pq`@z{X?GLnbsH z8`qi8xqN&NK$`;khzb1*&__*Z(?B0Hp=}0z+=Pw4cwCPzV_r<(mv%fu^aR|1egJd> z@FeVYK%X*UL+3~vP3Q+fIUj(=<=A9Gn*+-C0Bp=pB+Jmbtvzc(9|XF^gmw?;R^U0r zc>(l!6B_e-JMc0P1H9tFb)c_$&>8eK4{ib70lWcl``GCL^XEgCUkaV#4^Bq{Sf#F;QM^+0jK?m2ZunJkBnacZhwH_@_q(<2^0X# zM}`~t%7h32$1__qZ8!Gvf9denqq-v4Mq+zR>=a18Ms zpe_?Smyh!Shz!u?rUa}Ee$H8}k-^sqJgW?T z?u9bJX$Z{(i`5G+575ShZh{9rVeV}kn+t`7q>KsiqU_a%b!!3Y8P9su_% zg7d)$1^6BS-40sGg9f0LO>n;@_eON(be9Fd744CMX-UrUx;gwM-b_pVo$*(E_Mrg8M{K*MsXp>zUwwk);O=#Da3! z0GbFI?m>Idh9+nND3^!P4&X8XI2h5)H|MGfxSRlwNk-YYd_w@vH^5^C^rx6e2jy}CJa$3jg^5Ja?k0E)!9nIGGC{dK0FMFC ziecg|&|W6E--nhA6WnIFoB)p%I0W6qXizQ>KwPJ{dN3Z8%Mb9_08JYvxXlbOLEAwG zdcbX9kO>|`xQ{cyZEvs%9ydh12VB1iCU|TSP7k<#nMVMRC4$S(;Cf6l!DER?_JHg0 zf9+idU=_vIp547A+yuA;0+^8Gk_18vrckAYB4VQk=_P~^B59@(AV7eG1k!;Jq=zC! z5CrKh6rb2Yih`h^R}h{*DoWYlMfd;C?!BbY6@9+vPIB(d&dkovoZabjzVoU=)Sp1h zhC=kdA{3&&1zI;0Duf-S5cM(}XV4qTm z#su7HD=mcmxk5BX;LccS5o~%-AQ~%hR34(mAhSXce`DM?Rx-l=Rv||3{E|#hNN1Cp zjLHF(11bkp4yYVZIiPYt<$%fol>`4p98hoz{=(n?BHpN3RXLz?K;?kS0hI%P0}g~@ zyDF50VKXHH8$YqwbP8p0Sn})!ys?f5t9ac5+c%-|HafI^GGE(m9T`@ou@fEL`d)^Y z;p7~#>ZxI-P96I^8|pS>56-R}!aZF{^XfM`9j+@m0Hn*OOP}YTgFhlyX#(4hbQEs; z^}Vh@`-zWD2$hvhUGaXQ23^x;NjIn>#Q_|@R?V8VXxYryw`D*}-`35W`?c`%Z${}u zb)f%%7ha*=g*;pj?-SH9C@E%iHe;2Oaa|`kF*w%Kp$S%HD`PdA)t7Z9=W!>iVqsR# zVmgmPc=ksLSRt)kjPO?htQY0DqYtfEQ~qS6J)OV2LQ6c5b#d??(e5yJ71s_nh#p*L z;2O#iB14yVuJbGo1H6NyT0h7Ka<;Po6mDun^eDAONpG4j$S1dD8pbbR=1{194&DA+FSi~tTy&AmH5@b^9;oe4;{<4 zx;Y%Gnr(HHY7>C)PzJH@ti{;{#jSx>-Ic)M z+g7&$3N+}jJ*96C%tL3Z8xYpmqgDJXiyG`{D()(*I`%2?#-QblV-2vEr?{bS7kfX7 zTY$FrNmjR}OdKsVy&tmr>zFT3I8&5PHD|_R@i$rB z8djg*ZFOr)^8h|H;>}inJ#!F9YagD4z4rz}ZL7NyGYWxLw}CYgdRpD~%uYzQx*Y^B zZ2l_uR%Qlawbj20t1oQo6POb~t>g(s*hAK!KB^E`p z#qsH#KWlORn)%tY06=F_qK=M^4~dRSq^qWWzOCCt29F7ijvqBYDb(cOw0Tn~4`|)u z?v$GJj*bkDl7ISzh6Aba*`)Z`;Fri11RW~WoXUYdrT%vZ9`?E0&xZT=GIY8pM3zrW z@#_;B89pL9Vq{Qw+2`1NJ5flv9FR|^h~SVh6}-s{$04H8>%_7U^d~0P8CN4^*DG>A z6pr5!sO%N{CqLE{O@<$+4Vs89K;G;DSJ|{|DOF6z2fbM|i$uCn=-Wc^M!`-3nNZ!E;{0Y)9QtW4i>o@LBFZ%k&4nEf z#&MDY#*IrYvn$!*;B~0l!rF3_`f@!Z#8{<;t+Ey-^T4gE0NsNJ?JVMD?O z55s`V&x`hH1v7J^cP(s%d&EgcExNjf7cBMzn?~&%cy9WftPFT>8lu zw0Z)VmgBT1OAa|sE-V>ec&cz;VSeGZLPGwW_IhS6elzo@00neLrfe71(pe%4$FC+_ zP`%sI5ela0k&#CLDEd`@Gr&YoR!7PL$Gx#84;YYTP6_kd5ultB{r2J&|&Q=7;4bq z1$DQ=y;Ku1PKr$ga&VPQ(p}{UHqy#yjj-t4t4MgP4g2GN%nkI_`(lFFQ^=k2 zzUO*+@|ltqCpmEP^w&a3qsdM;k9{ZRi8C5~W2xD-Ysf2u-M@I|SFdv=Y5GH(kG-?c z<;q7dSq4}}4(-u5F*$eEME9|nyZGM2v}n~bpfyb?FuQ2cGQhu;uW!S9O>-*xt^c!4 z#RvY`*KPjn2Rt-=s$h4_9~?9@>!8`p^w29V*JnDY`6mpT2b38R|Idz^nU|1i9Vy>; z)I4Xw{PSxTXV1Ogs9BZ0_#cwJIEji%D~%b4E6zqS<$%fol>;gVR1T;dP&uG-;2**P<$MDW5LBabK;?kS0hI$P2UHHI9Qa#u zpyE-}ilPq{umA3%5Y1Fk2vrmU>*EhF+ylZ&gJ>mP6@>s3I8_uv5sOeoA#6eqswl*R zL?Iv&(HbHVk1L*0DyY#9sfR;6aWsT2o`tAIJj6DFAwOpGv-QcHAxzd4LKvlY`rI@A zL+)%x!XZA7n0|S|$(NDSk;qp91VqZ`s#&>Qm5tX2_eA2J5fCPcz}@BVD_@$5aXUT2 zJ+?TVka{pgTE;x^38k?VX+1P}(iZR(?H;JSAs;)C21n%i@R6a>vC)xHOd}tXcMcgB z8^N5zVnfF;=RZpr24ak=FpMe;qYA^Q!Z4~Z3<>|J!Y~gN9(l46{?~+I{N-N$&liSK zWnmNv@`uU7P^|J2J<*#CUYht-S4{^C&ACWeBNo=(-5 zwsCDOHiP`{Y1hLC&zwJVu=+`BaP^yFrIJDE2GPM)jK1a448n zC)`|ij4Ncvxq0ja_c}WZjO7d5T6URx3#iXO0O9#6x0U_KZPBg63}6En&%WT6vG(|2 zQ*df_Ij}cQa`V}z+yeF)w~(FU7O~SnF7D15*=s;v-vX5A2%xtY0KNNVpjGVWrnC3B zEN(CNFK!=K%pu%mXG7(`2;?Z zAIqok)A%X;R6bSMB5W153EPDo!fs)Yuvf?sW(YHdOd(6i7IK7qVU{pkm?M~lZ-fiN zMd4fFl5ko0KjDh-z3_vks>Z0Prg79%*VNS1($p6AX`T{_HO|6*jf-$VQ%5+caTN|} z+=TZub%nzk58*>iJ>iI^fpApQQ20dCNI0fxEF9M~5l(1)gp-=4!l%M#nx{4X!snU* z;f$u4a8}b?_(Ib{_)^nSIHzePoY%A#zS2A+e64AtOV&-&P1dF9(seU+Il5fdlXGPK zphuuTa3{t9Uq6;>#u9;dKNi^b>A-}~01kXMaNKja-Ygfm?fJlHp9O68**FvYI`Guz z14n%U@YB};YkWH}Cw6j^*)A@H?dGPi16(>g2$Yq>TsC{3%VB12HT#BJ!!B}fvhQ#{ z^e1i``5$)dQYIeHIGc0;9MFEDZVtM&m4dICKY00bc%8;N-8s*SHec>Tdv3eHF0O zR|7+R4bJYa#kt*$z&n4NOJtjXZ@wA0=I;Q{{Bv#zJHstyUvkUYIc^0z&#h!%ac{7% zxmE02ZXNqS?rnC3+r+--HuIPG%l!ZGSNQMwANU{nt9&}2!DsSWd^VrM=kj^{b^Zol z!r$V5;Vt}Zehy#A&*NX`=kvGuUj+z%3q16|Y6LC6fM3Wj;g|A7{4#zyze3Opc7na& zAXFBr2vr3mzmk80U&F8E-{jZv>-o2YT0(8XMW`dV3U2({{3d=2zm?y{Z|C<3euBTy zTxcP*6j}+bRjo{_R;EYN%A`sL%9@!p3$cO%tpr4>WFYvk6$?r$VQ*7NGYdAsQ-Jh! zU_ s+9>mIIobZl?h9ege&$NY=C+Ysal!92WRkM2y7QCxx+^Nd1S3jeu!&Q2&>FY zmRzh0oBTZ#0-_n?fD|Va)`&4Wk_qeIs#d0Fz=M}TZ4^?qGJy}hK%|kVw?e8`Ch!4T zeN?SX-~+}#+!j!Zm8!wcRY=v!1U{U_cXApwNjefO2ALIlqFR|M+1Uwy%cEIprc@57 z9C%y~EWdbVwPTi_E@tecA^98KH+;DJL(SGvvjwNOOigDE?{n_h+J)zO)R^wl{_W2; zr`1f~SQvV0=zIOEE*_a3{EO4@BS9Wh;*ZrjHGRHo?M_i&YnB(Kb~F5F+IPBLyJuR5 z230A3$wi|*{KbtP{=ZFsY2K9}|C*oYJY6t0EoC2n?O5f8H$LrjzJ74bS6g5Fd1A<< zem@x|Wq5XtZ`o}3E`5~ukx^5Jc1%28GvM26bzkdHG`CmQzzc&f%xt#V{aOc~!o{-& zwt6k5lKr+RCnm;))Li%Cx|W}^fk)2Pd_S#8O8c`G7Mrn z*?}Ju6kfn074LvEh8t(4aDCkmXJB~juGq;zHSCmNp?Fb-YWTr1kH) zi_7*KEJgapZ#{p_&3^054XNV0hFSfyhK2S@@7>GUKJ0)tCURuLP#6F1pNWE~`S8>? zo7RkrUFE)I{}qG%bFNhcaqncO69-rB-tIogVCi_hkyzK={@vG$R~>hLxBuE^*=|z@ zYY)zNV{8PDjE#$!>}KyIEV-r|zy| zk!wk9*Em;u0$E)n+UrDr%Np&!b(S{bChf(dci;cXS*+7|m&Mu560AFC`Orzs5PAJi zha#G{=p9_o-QH>A7K?{iV{nkRia2Dl)BDHX{MX0sgEkfq|H9?tJ>oIL=<$PHTD^GW zYP!34RF_?twP2C6=>Gggi~aL`LS71W`(W(g&7EC3cMFdiinM00)5hkHFPP`NcuB$T z9Jka>+IAVk#*J_uu_JNUR5$xA2Jwh%^)sfOuGLQ$hZ?GX8n~8RC*c<;E;k@VT;>Yj zg|5|inobz1e{K?;4RDHIx!P}VZF0-e>9V~TKiNs_>FS=NvriNU9}z!2YA?2%+{a+= zbV4^lG>OfN#ahlkJb$=;r{1Fn1-tDWuHCS9bI~@J57!NQrLHBQcag={{cX!Ar*&_v z++fe``?{yA{o10X>({-uC?+E#b7qG7!4+@qUFR0JN!vAKRIfJ9y_SvH>}G#p!GTR@ zoL5g-CC)MAk4swxJEthomaiWjwbb~#Ijc&oZjcxya(VIIKEl!`d$ZgRF z+BpePvm#v@4Sl(RdwY8^W3|(++1r-vb>0!Yyj_ml)L`mZp-FFoYk% z?Zd-@<5-LyJu&0GenDRx7Cvs&j{3vwOC-+sHe=3E6)}=Gwz`S%mw@fv;s!h%w(I&( zmAgETc_l^0C+RmrVe<`aRH6xvhy?U{Wu(mbynCTEpM~lO{$VK14ot)_gy6*Sm!kCJ zgn!%wnw^8=qwpAcl%kSj2f1_@!Bhi6 z6fOP|3anDPSMO6gL{iwHD*J%a1uT&(N`92+LhqZ=!vy~OhTk=C(n8CrO zGN+kui&m|D{aX08Y~ISZ6z$zXj#$1OQ8G$7f&!6}^U^`4v>DEF>!Q@Z+cXK1r14Z7 zPHtV`xK}cF%8PahrD%jyogpyL5$z0`-k_i!j57(Q#(uKKpBk(K^ZVu@#{Zjd(CRjz z7K)mq8tekvypD`Ux6a6^1D=3+K!5tNlFUYmT}wu@um4<^XS*5@Mh35-#&bP=ktG^1 zm9}U1Yy8W!XL93DX;9LQ@q;Fp^c1C#AH!)9NofA^fR4Sd{ovgi*InS*w#WKUKHe}O z?hSbvl(FH#&{I^|aN=8V`m4aO*3C#y(KxrrSjO_!A-F#9BxjjXo$JH){-5lVP4 z(+hs)@HI_Zx&fV!qQ^*A;||EbF(P_=Fng1<*lUszZjfhsbaU9>os~>`dDIy+6XhryZ}q#UJ9B7qK_9_yYjDNAoV6JkQGbPE$}N-S}SFp#?%x; zS6c#F#J+C=6egQM`S&r(L-BuqneesVuS_*S7Xo|yyJnA^ot}7!NlBt zvXmvy&wng4TaTrhARAfj60|R|&WegBd=y>5(FGL9owKT468IQ4oVSCjoc1`Tgb=yM zq`GRdy3wbP35CW2XXQ66JR-L2H6^A{6?(18Y`Fo`48Z4s7q5|97X%=+n-WGfHY0t9 zxHQsGrk;1ZX~3hTtuV`WqwL4~vsUn+7}V<3kW(UC&NqHhSon8FX}|%nr&zwm1#8S3 zNGK13t4cKGF-1{C1EgFkmy<=QFUz9%%flZk#uGI3wn~#zhA7GtB&iniN$oexoi|}~ z+ulTM)R<6b=8V;S);1=?rgWp`6EN&~$TEdsnZqVkWMVd@ZYC(rAvJF0C75jSY_Td{ zmzQ_;``f90Q{|meiB#2ZRNd}psCjs}p_b@BFd9T-sH%QLF9MZqs_HjY_1j(jQ&}Z# ze^b?Os=PC#updF*nZ%t{d1va09##3DD(|c+|5KI!smlLU<$pBYR^^@7uYZ^{^W&Zt zQsdvn0aXN76~R?Sa8(gpRRmY)DfCj6bN(LXoLl~FJ(Ojn=^h(!AHxeg9p;3omrB3b z3vtJf$x5_vSyv&=c-S5aX(q$=R7kTAwwFS>H(=LONJswl71Ch$4hJ}7QYCf42jXQN z&;*4vw4p}3n;^|%*b@~}C3V3ENa*M;!rrQoDya)Td;vNN`qE05V4t(nb=c<>QYCdU zXQR#C-(X`ylt`7-1s|Njhd&~z>x(o@3aOI1;6n@Wb2{vnR-&VwI9wnTP6+^GMkY1` zHcs`(q)O^CpgYO>r)4SKUf@d@sJB9@q%Qa{8vHo|JKRb*yaS9Mnb;?=$5?4DY;0{1 zv170!tyBmb`a6kK9iHGr5hxzCK_OL#C-`tl)suAB3Y_YpazN#P$^n%FDhE^!s2or^ zpmN|p#DSc@?zv?|K>ix%Ustq8eG){*>?KT=anb|3B2UWwCnWi#vi46%r#$;BJ?Xdm zPhg>1#wXh%JVAca9xY6jKh|0)i9E`$0%gDm%z$0lzG35*)7}JSP_l9O%5qQ!d5>a} z(bAF(o=KKha||GPf9*JjtA1>lvFT75_<(0qDT>`MBp<^uBjELGHh~kUMC>G)rSdO+ zSdC295C(F$Bok<4wejmyCMou?q--hOCn;J+E&feE{tVwj1459(6h2Dw)aC)n&)UT{dQ!(_WBua`O*VD$A^$K55$`~Yxq_*L2ne-nu*DMuA>MG~JR+)AKMTDWz{Be7Ir zs|ix0TrjXckU!e;BRNR^@?U1;eDEO&v2mlnVXbfdR6pG7#9ZC0D_RoaN9x3 zHIEGi86l0{1xn|XICuTd4~dD3;g^Q!fPzZ}rNkUrjZnf5VXl{H+~SN+K;Z$&q5C74 zfSHW=bp(%Uvw&7Do5RBqe}1s-Bu99911W4OZq?!O2Kkm6@-N*+RS3I$ zpV&|W<~2NeWO&pl*#C>8nfts`Pn5L-2nT>UFFk`gWyaAVVQS;ZkHT?H14e=7EWb$C zfQef^v9o`IdGhOg<@5Yx(l0ZMmRV-~k$&>%R`$B0TRP&=-G-GTSv-O$+;(k?TlN}p z2HO0UxE{l8*U}A-Q8u^DmcH|du(@rvbOp~?ItQX|dvNRk$NOp<1Lq?Y>1@n%Z9 zJ@TY4J#cvG9>&#Uq0LwN$YYuGsmE&RqQ_e{zsI$uT^{c|=pH%mS3GutZ^hF09{(cV zNM?_Z$p3z((It=L(oGM{QW5tj4?2MR*apwKaIc#xK3BTr@m<;Xb$D))vwLE4*1az#XA9gw^!~>}XGqW3veoAcVjDFx%}87#}DWloztDa-iOgdwwL=49lq9N)zthFhW+j?B!=ir&=O zATHaSP;4@cea>Jp&M!#oV90;rX@kzGFtJ@zYh@v~BQNvDYxvT!Zn(^Cu;#sK*dU*;uiajznyWmUPeY(wFk z3>IdG^&a^OVRSc-g%ZNdYlbBg2DGUlq$asv=gXPWDIaGWSz))HI{2jwvm=$ zl%*K@y5Ta(Ybml@@v+6gii4awhxHHzXsm|(Y+CN)5MSxF2s8|zKVzoxgjj|!2G~IS za!ue0z#TkQvr-et0&N!*_pqEMpxb4G9+GKp@DeZK)H)0na02VZ#m7d|MbhZ7cvyJ) zRf#z~-c(A?*PTj_R02UTWpbl<$Uc-~r2hj#pSH!3WAcbZ#Bp{UfyN5ZTbhSOxL*}` z&oVHdzNGny*XRVTM$1FaNZ|}DnKygcu03z#Q5{)7{>*PbBcZum50fdef{8QHa}JDe?0g3=J2nO)1Favip(I+ANdWzYa`&>oBQ z)liCB%!Rqbk5)8CBEpLxvaMxD-u1-&uRlIhld;jkBSPcDL%K)DNB0SiitGHsi$1+W z!xAEbV||_rjlxLso$))KT8yyoJ8y_AW z6&yjl@H@Ne=2%)O1*h<`@c{^gDX8H%UfW|%m6uHhaX?M_M8QahqK&JzKb5OnHFU+O zqA=0XGVrodXUQ&c5XXxarW05o8cEZu=|6vlFF|ou>euDv{wGnZZ9y@yp)o1A_AHIc z-nsnFtUT*$*@$J-=4iIr)AGlJ99pYid&(_LAYiBNk^@cM>xI=HH;NW?VKy2Y;?0K+86O%Oow@|qrO#%m6%z5WD-@_2U$`2;V2}Ako5Y6WBeJ7L#cG5~t>F6QE>rqx5YHKxLx_z?4`wB52dbOg`)tSc zjRzU|jz;*!GaX8erqub@yXfm-EQLK+w{ItEF916YSw@1Lc80$VURLA5SbQSDv0Joh z)F1xWji(rO)PWA)>sEmyf$;Nc5Wms43cCp&DLW;!H{yb1OoULKR82v^g>>X^)b`hq z(Mq*F*C1ZCrWLV#;!uT5Y!5iiDVt=B|EgYW~lGL$gu`o!Mpj z*Shv?dxxC)Wk>Ch7e*Cq|MJ!~{pRbp5>0I#Lq>$f*AMyO*E3Tcj4L|7+~bYxybB}G zJNI0+x$&WO<5w;#uDfi-ihsWm^ifK`Nbj3l77p09V}ISuOE*$he=&SZ%d^fw?|Hec zzL;-F`t{pw>#Kg;cXRE}G{c8|(6Y&{WmQ(Djvq5;@Y~0}9_Rc1R-u)>>j{_Yp1b$v zcoyn^)+8mkju|(yUHqPJR^;?(IAc%F!hzFTtZFi6^pR`HV=wt+KRvL;t{Xcib$Bf} z!1<|hr+2xeU2WrQFl81D`Os_PwyMX5{MJ8W)Ap?m%*095y!O539@%2~>U4){*9V<< zirMpV(6^39JEw=OZ&Y`axaj-1vFqA@uwZ|Og!f(^mXSOod6b=B&7b4DC9VFp)7DGt zdR5=_;h3R&wTJyDN|h#}cR2jX(Ukr1aop~PPc3L`_L=0;_rm3w_1*1iCL9}o`}5k2 zz0Ax#n7J1-_hII~%-oNe2Qc#>W*)-K!itFmog`M?;NxN=R@7 zej{FujAj|iZYF!LhFJV84(&ppF+GB07~B4%FB%qy9B6*I44<~Q*e zt_??dy21jPE-EsFX}eVp9eqoRN{Ad08cPa0$N)6DF2J#t)>cP1 zyvTZDG&UGBkuVm?V%b5f&*9t81_~xt2Hy_D-vo7Oh&9SQH(Vm=GPkG+}i^ z!)nDRN@vNLHoYKoId$pi)VopgWyh4#EVLwKY$HZEQ`~vkiyEC2nd$Pc9D_<*W=xr% zHn*NH5>DBXo|`&H^fno$tv4Ai_wh4~S=6Y#!P4XQyXo2W4c-)|o*{XDNz}Z}^9tsj zpI0z{`;zSG@STx|pY$&)nt5~P7cAMl#7-H*_}RuV-VYwbI6QO=Q}H=Z=$g3l2h4qP zA%E`G*klaGX~6YJ9}1fWLB33u&la+!Y!zG2HbeDqF?)|&&%Faq+diX=JH|G$55zYd zNM*o})n%=4j5e#~CY|F97!$g}{}^@i7|(F*M`q8p$(t;B8nTR4yBTg>D6wSj$NcK8 zQT~RX=jTmmXRsvs8#0$YW4NB2HNnrYByEnD!E%1=lHByXETdDqs+OwrCmFJr`x~~5 zz_4^l8^g>R$??;W!fYQzUMEM>S+0*CfY2;sP0?Zg)FLFh3^(*?ZHSrgi&%@jI*4^{ z=d6s)$;h|V=-kS%D$~-q9c%ooyqX;K24u$`hlgAmqG0JYwMW}4XGnwL0lQqhr+ZNpA2Po6qw!qlO|wsn{~*z`jGuYBz`k3HMc zAii*`_4Fk(vNJyR_r7)~DFe>ijK z(dRN_)heU+B~44T23Ou-N}`y%hA3GN9+ym;{NV847rOgTHl?`&H(-=85Y1PwF-Pad zrI_{5G8GZL?9Sm3Osh>4|MwVE`I{;(Wt9&tbJeqq`#w%AQ{JSYifLkb@OH&pq??{{ zktK_#9f;-~^V#N(sQ1)%X6_D?SVv*f zkDdpR&S51$`2`P-*si5RR==B`C-Lkv(ifgzA^x|Ba|O@)SvulbLNTO&d&;XD74v&1 zol9OC*{$_5NSC~f@;yI!VJdTfBfrO=yzW%+vN0<@N50m2c`&UPhSpv*IC^X&ed87I zpqu1jJtAG#lZ!jiIl&qJIHe@}lpp`~4vhn9@(&_(8@)?- zN~SOb2n941uc!$K143tco@LWBLd?ZqMNL4+M3dpvp2bJWUmGT3G*^dr+t_G;-4DUH zB{hW3k$H>qraeZECCahrfP@_G(gbv}gga%;JW|BkK$+5kC3kWvdsooBa*6JMQB)M# zG_PP*Y4TQlAEp1*%UKudq$fEKNqH)~0XRszauTKN?mF252^ z8Jh;*yEUzpnI