From 3d422d924345b95fdd7711d0fdfab5bc6d4a7f48 Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Mon, 25 May 2020 12:22:29 -0700 Subject: [PATCH] Allocate segment chunks in slabs Another speedup might be to special-case when the number of chunks in a stroke or fill command is 1, then the segment header doesn't need allocation and memory traffic is reduced. But right now we'll avoid the complexity. --- piet-gpu/shader/coarse.comp | 16 ++++++++++++++-- piet-gpu/shader/coarse.spv | Bin 40472 -> 40892 bytes 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/piet-gpu/shader/coarse.comp b/piet-gpu/shader/coarse.comp index 8d593d8..81ea890 100644 --- a/piet-gpu/shader/coarse.comp +++ b/piet-gpu/shader/coarse.comp @@ -69,9 +69,20 @@ void alloc_cmd(inout CmdRef cmd_ref, inout uint cmd_limit) { } } -// TODO: aggregate rather than doing an atomic every time +#define CHUNK_ALLOC_SLAB 16 + +uint alloc_chunk_remaining; +uint alloc_chunk_offset; + SegChunkRef alloc_seg_chunk() { - return SegChunkRef(atomicAdd(alloc, SegChunk_size)); + if (alloc_chunk_remaining == 0) { + alloc_chunk_offset = atomicAdd(alloc, CHUNK_ALLOC_SLAB * SegChunk_size); + alloc_chunk_remaining = CHUNK_ALLOC_SLAB; + } + uint offset = alloc_chunk_offset; + alloc_chunk_offset += SegChunk_size; + alloc_chunk_remaining--; + return SegChunkRef(offset); } // Accumulate delta to backdrop. @@ -101,6 +112,7 @@ void main() { SegChunkRef last_chunk_ref = SegChunkRef(0); uint last_chunk_n = 0; SegmentRef last_chunk_segs = SegmentRef(0); + alloc_chunk_remaining = 0; uint wr_ix = 0; uint rd_ix = 0; diff --git a/piet-gpu/shader/coarse.spv b/piet-gpu/shader/coarse.spv index ac0895068da7b6c3cde6bbdf42f33f2d10928539..069209e9fc4104d855cf5680c2673a39454a7ac8 100644 GIT binary patch literal 40892 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 m#x`(c;SeOb;l}qtp5k5-$cUz literal 40472 zcmb822b^A2^|dd|OhWHXYC@6TyR?KBI-z%lNis=>OlCr60)(2-yV5(NB1jdmU_n4Y zP_c^*MZ^jyVgW%B_@3u|@0y%>!Qc0N_y0ehwbtHepMAJ_qfy(ZJxOjkefw6CD<-+8TcPEMASQI;h(z)4O{5G;BP7 zRqaAqg7)f5D&nlarH%i?Ts;nHuNJDt?bA7K|NY19vs>rH88bQu250wnclP%5b$3qc znb|#Yu;;{X{T3+vdio~z&YDy@bl_3u(1AY#tH$>A^&d1ivwvFmK14jId&+^`laa}+ zqhS~KPo6x`Jy)x~RIoVDqu+tI$QT9o!PNx7pDtr=_gp59)E;TV>{?lo@=9o5osqw1$^ z1plYzHFL^@uFi@5z5O$rIjcK{2^0EH*4|MqQY}ZF_U}uz?!1|y{%zH=_&0MLQLRw7 zZO*w_Hv3WcD)U?sK5z8RJk`8f^HeYMbWCc_w|nKJo=JmK!5z%lD%A7hzHbCWsg+|` znKl{2YIXa;uEFj}%^@`ATHR~j7#6A4fZJEYw{x&-O1Z2FPKb{C|tkT>FiNVvMM`4XT}c`u6M_80_ks z*xi^p_o%wpym?!!+8SQ?cJ}m5>OMJhR~QJ=n7vu`{jeqNn)BCQZ3S+$qxSyTc6iLj zzE|_=?(Lr5-8b0T!!CF4sJowL_Dq>N*x5a43TKRaXM41w`(cw%=t+wGJWtfTJVc$hG1TVR*L^allld)D?LwV)t;wa+ za$oO^e>1lc)o$QjrcWB$|IkK1>Rx4jMj^-aTOC-^uQ zM^QKXS-$G3+ch`I|7`mIJLQdjI*0mctBwOV$FoG`Gs0XQ{r^Lc^CpRQ=0Ax#^TcgD zw3a>(*aP18Lvy9(HE*uktK;FdUt=xhUL0dHz45#^)!e_`eUs>Osj44bw;7)DybjB? ztwnpe&Td3io~@2Pn|4RlX26w1ogNz^3J zxR>9TZ0_)uY#TD#|GJmv-D36h+P*%cXVG8AbRxJpriH50z+Jt){S!MUP9J*xVc}Vv zM(@otzP&mHKRoLDsG~Zy=Dj`Bdt49S+|C?|#Yj6Rdfcvqgl&Q9T0@?vESC@n}^@k=bL<}-`_U*P``g_^19!)>Q#99c^901=4S(z z{fun#p?(%=@}Yi~Z1SOgmTU5%@vYS4L*p9_Z}!Xc5j>-7W|#MjbGJteA3uz@RmZ@S zXBW84b0VDQ=zz=TeIxgpfM)Hwb=R7G9p7wUkE^Yk0ndEQ2B)9Xn|}3PX|K*|X?H=< z?((ADHQ@1s6MK`7+-nA!wfS6EYvMbLwvT|zd3m&jf4hZ0GmN)Y--9>vZ>wGz!u&kN zLE`g_dy)S6KloVh-=RI<)XcAOU)On#^Z;sLentWx??bZYi^0oWmuTVZ!&!sIdz$x} zKTA&O?L4f1=CpA$`)AGAbJylvY>j^M>`ln3z1kT(IJMCPzChz=PulF$Ke4NK&%P6> z27CJZY}wp5yX)V>51IA-y+5p-&yId!#q?p5c1q7&nJ$=qJt07~88}_{>S+9n}f&#`CJ#5wSX| zQ`Dx`LOu2~(Hg1L{4Dsq_2{V1DcW?Bm1DSYnAUt5HU4Eyy*cdeUX=Fg`j&XNH+?v6 z8%HZX9o1cEIhmW|ZmS+Z>uKcFQ9WF@X`Ij8WVU&%*6ITtWkmI4Q|lRU&V39u+K;H7 zYw82M^H1a_IET@Q@yn(@o$WQjQ`>xBM4LXl6RkPce>Q#U9~TCOov~ zGsDJPxNZ3SE(V`BzwOn^Eqqk`$!#RQmn>(eMOjD9nAR%wMoO{AB$E8Z}i$Y zPxWiOb90`8=gmt;H66}64D|L)^c9Y%?bQiQZF<+hv<5#7?$7$MpFS)`do>4sa$_Z% z?JsQbF7EOszXCqHu;19=vA0#X!6!A>qD~apOGbsGb7%^qn}++drf3yRCW_ZDJ#C zTlFG%LXCe1?yCEH9Xz@I2IF|%fX^EUIBngHI-?Z4YVSO&hpVT<3L`cxIPP8n#P^Y#r4d;Km8&`%`WI3|jNv z98o>0eQNWNt6hjOvU;Ma_p>*K8O`JAqW#PB+UJo$`w`V&(Fgg8(p$84Z~a4m-tgjV zyw{CapWW};&a=F6R<~8}X{*OMvV-}a*+0QWbN)XBALu@z-j5yCT5>mBabK)o`|xsD zzXx>$jtt0PmkQ*g5ZKj*e<7TI)SC18w*{ z(_Wo~R_^(e;pHAW70&!L#&_N@TYGi>Fy2vJqVKTr@@|Wk7h&i7a(T&ka=K{b`33ZOV`#4)8pcOdFTyhqoEJmu^-`f{{a-^P z-=Q<&&0(?HtG8PCk|WB#JF3y};?dm5Z|!J}ebZ5`4|fpr)~~(Vd{~_JYReYB{jeDA z)h;de-CFowaDJxZJ9Tq^?LExiQSAr!9i;R*e3(yrbz}?gY~fwQctU?Rebm9X#BhcY+cG&rlqP;P%GPN2_b#3Lo91 z4L*T)(lTD&)z=vEX=}W{C!X)^Wjwj@s2cIE29)vgu3g4cOFZAZ%Xsq9#M18gd@uGY z+pDF$@55z#x$UVM`S_0OpB?x;+wuEnC-RkQeiO;cKSWuYR<;{WbmNPcrH$hmMe$k{ z%Sh^`=AWEY4X(Bvwgst2QI@COLez5OtjbvIM=fPEK8wKBjbrR3s1tihuyNIlw-mMU zT>Dk|-=(SbRX5f$)M~af)(X^#<@k)HW-iW0+8WdL&WXCdw)dNS+K&R;UQJ);xM^$h zwcw6p6h-^G)W!sabB6#Zsn2#?drz!2WtDYoi=?=pf<)hit{#;+W2zg>N7yCk2d4@ zeqfCyc z%FXX%wU63%HNU*pjN^E&qJ>{6TOB#rR*O zcD|bTTzmDkn!7go&!v8pVt@MogFF)b)zk~7BT;p-Ik72%%Iv2Os+dAuRmzFaf=+Xzld zmAd`Oeg3Fv-=xOnp4bLWhxq$^(m(wj4xaRsN9tGc#T3>bB%l%HErvI*B?=@rSzguln z*I({81pT$|RpZ>B)(4<@Wi6(_Hz;^Nd{n^);6BgwxBa)^oii@nB>a2ub*A<07yb)4 z*VynE8hp+U^0^o`AUW@i*v~OphH1W!fTgaP(OTK#x->-%HJv9D4*ZdwDZoK0P?z6DFh5HS(^!M9mcn|(P1vj4G zI%Ajnt+V8Q>kRj7_M2w7??-;q47dH21>X#QeZjq-{T^BR`z^BMej_aTTP^&Zf}4-u z0OM~yegh1*f4>2So8PE{Yxf&q>^_V9{ui#@?|npk6`%3ON zzmogiFWmX@+h4fzy;BSK8(?YoJ7CE>3vN8W2bOlf2bSD#f+hERV9EWyS8~7QmE3Q5 zCHMPX$^C{`a=+n~-0yfL_d8z6{f<|1zu}eK?{_8l+g-TpURQFz z)s_5~7VdYu((d=VlKZ``tZ?l-!U`;D&TexnN?#d!Tj7w+@KZ*<`UaKF!m zJ3oG(3)kOobK&~?ZLZ{gn+w<9Z*$@L`)w|K6!(YU=7uIj=Ht7Y zTH@{xZk?y`XzI!50I)ID)9yfUYd!~|sh?Npb1+z~%;yle@wAzb?~ZEOXNQ5+()STy zwZkd#ITGwRGRC98`l%b!_fNI>9|KlP%wxf73sT0jfBd%830Akg@2hgh>iyCMR`VN6 zVordoCx?k(HDjJtkAD(aeR+y;eeYEh`_4PL#=h?c`>yL=(x(UP&%$EgaijOvIJr!R zyU*^Y--^1AqUOB6N!uCJUjJdN+WIMK{v04qoS9(n$IR0JSj{-`83fx`#ytzHpL*Jz z1Xe$hV(uqUt0l&%U}J=z2G+;oC{Xd_bh7pw!|8P z?QHNa)au&Lq*hC;bHV14wLTB5Pr26T!_|}D1>kciwl$_)pTxWf+>AM*v41Xx8}m`} zDC1s&rY&(V1z$+9y>aFGB<@GSWv(BCx8`~|n)*HUUbq6R=H78HTn+YeFKD}paudb9 zAWmP`fSu#4^R-|#zfCyrn-b$XxVpJsPc3)ex5ah?*x!v-KLE{V#*JWgFWX!RR{J-7 zo0mD5OKdl{*z`$$w}5S*x%)WyGKzC#d$~Tw&R(}p`&+@zW$u|zfYltI^YkgOm-D3U zlN2>`6erFd;H-&z_cN5+DeC4Sckaz2?X9)lMeTmjb~o7A*8ifF4t=w~~zF(05#e-G9+Yh!+%`U{lA{9t@SyxFFCo;(GA zlA^A^JagoHI1cON@HE&QviH9UR`dSN9ILr5nPcZe{w-?bSv%*?P=ANwrTx3L-8%h! z4?L~l-v{?n@*MdASReHV>-+kLVD)V%u8aKJ6#KJ(apM07?0jTRe+*XJfZ|^N3ALAT zv^`5vGmbcMehN0uU3CsW1FJcg#`y)<%Q)J8PEj+C*tvU-T7U5`!MVrdXYD+tf9u~6 z?^fDaeg#iH&x6Zx{Ti;8as3ADWj@+ops1OTIB|XpHcrlx-+?_#)Z_Deu)2A_NG*@; z4`8)dd5iX(`y<$~`Tp!!wL7NtZT-K-^e1fPm|lXbWlXPty&RLamnmwFNt~Si3^u3m zzktmtYxgQxANBbB6>OWk>-BvNtmYcsQEPt#+g6)v{txQpqwVh$HS-ZC_Uqtsj^BX$ zj8~7(zrgCb@7@HfdGX0 z_IvOPDeCc|S*33Kcc|sD%?DP?e9sS8%e~SL&b(=Bql~0DZ{o!10GD};fV(%S*aqun-N?p6( zHPsSp32?@;IetsR^(o(pmV&D%zoo&hscnrZ*C#QT0XJhd-?f&78?*IYYdJJ+iMu@5 z^|ZZl<@zM<3gB|yJ_L6jvNuR!ofHMr|* z|HhH)SFW$?EYE#rEzdb%{lCta(X@518+#O3o-wZuR?D7U1FV)kyB65Xvq#&S6gBsp z*c|fwQBT};z}~xgZ(J9yW)6P4mdAHJa5?Ym!_6trt_{HYsC)iwM4g{B6L~ zh#$T!-2SqcJ_6TAJwMBD4_5cj&W!0dd9}nC16Fh2crT3w+i!ULxjycNtb=v>*atkS;QNA| zo6N<2a5epmr%lax-vPU>*79%F+&$O2-)*};?cBTK@!$g}$>Tt9xz7%Q_Yx<091Pb- zJ#7vFn@{%Qp>X}w-HV4)dwG9oJB*@c&f>&55^P`LN5RYea5P*W_3VdZ!0Oo#M}XB5 zqZ6!_bL2R%YpouiF0i`u;h)jSW19d@d)IX$#dTHJ$F-kS>zPk^+D`@>Gv5HFg4L!_ zyzf_|eGgdO_TAKS+iRN!R?~JowcPv5_o-g+8r16AT~{^tK<3vvx%7dZ&wPiP0axp% z*nT>-TKs2%^?$nVZxF6FKzR~vE`84edmm^!jhxNvM6kLsPoS13=1E}lbYGlG?e#Xl z*`j_5h1;t-nVN1Jwee=d`GV7^-81?b`wD9JuK30pJ9gvhXPnIA8Q{$0>0r6@=P zG0p?q*TpR{&PUUBHaQ#P0=?{jNdRmYlBz zXP%9rJu$8WC+9N8_2}9%&o_XLqi)XbIkm*O3H(7h-;Ay;ez(+qtvP=jU0ZU#6`XlC zhW5nx1o(q;{v^7#%=4$f#!)wC?+vxY`83!#t!sWenzs1eQTw&-`_G_j%N*SawynDT z-A1jJICq27Upd$JplgfYy|thHm45f3YfFEh1>08L{_dhy%NcV&cz;UX*B$_?8Pjv; zb6_u@N7^2wsCj0HbANvxZ0s+we=${G0IMB9G0sEOiKFd{l!qzC5htH7fu~dQ4Ei$I zZ(-{3`3m?1%HKI7JoCN^*3X^CY+&-#6g;r9bWZdcQvncHS3ZCgk4) zdr!32wyeju(Y1Yx;(C0S+RJs-_8rRiDbAPJz48q8_b84m`K+W#1ApZY#UEzf@c3E2Ch^{oFXnzqFF8Q8X&kDr4xAKDV{IdI}R zuWA2FbZt2weg*yoMg81*T+f4zt1W)N2Ahkv`27Z~{sP4@Jxi^YzJ3cfS8Xp+%ah;l z!RFU`p8Nq#oA-y$+dqQ0X8)AW&_AK6=L~oWY&-SDe;J(k<@jGg*Os<_2CF#->GLmO z`z+hNil&}+e+AoCJ>z{1>^L(&e*^2Mo_2o+o3FO`{R6C?dHfw%&3$w#wfk~5wf(Hd zTK)^%O>th|pqBgovNX0g!5dSnYk!?uE%WjgSgrNE|2LX8+svVsr_F!BX>%*FGv2q+ zwb|xEYI)lH7o0ZbJiddj%{Et1%hTpvaN68n^z$CNHrw1tEf+ga2h`Yk4}KP$`#SSy zoxIyQJm$c&-W~APJvIVOJ?l0SY&-R=+X7&9*Dd$sf^hH01uWn`)@&|#A+R>{_IH=$ z$!8I;^Ot-Ug}3Ij7@B(WSsZLT_2jbzSiQ_=Nx1oVc4|*POM$hSkH0%5Pd>|l#~1l5 z3vbP5IW+a;vpm>#>d9vXuzH!#hv3Oad-7Qktj&D<-7R_YSsCnJ$^5JWZ@oWPMN>~c ztATB&o_t1u)ysTF!?Rx6lh5j4ZRX?ej>(hHnqc=~@>vVsn$L&P)RWKJVB4uDpLM|M zWj^b|Ge6ps&w5~O=Hu_K$<1dj>$*PJJ+%nCPQD@782;TGZJx3Ij;?L>)1I~)fnERb zjlpHCP2h>8ulB^Uo%Xcd6ztk1kIleotF6pKKkaF|IoNql+bzIptF3ISpZ2uf66~CW zZv`%6Z4FN>eYIx{w$pA~?~!f6o-5%WfqS+j_I7Y%_t*a0gVnO8JAiGYKDU0J?g%!n zHrK%4HB?K?F<@inXXdeBHGOxYmisK&nc8Q8wSR85EA?&^FYUY6c57q%?l=x?jP$h! z*fFQCJ;7@EUb7e2HtN1R$#bR%D)w7pR2OCHIVa_AcsLlY}zc$C2{H)*L zXFz?<1e?EO*WcV7-&|@h$EVL6ikjmSXMAUaw<-9!;PT!0Joq^j^_&;yiz(V%i?gWJ z67vGETJFgU!MP{3<(|98ZMRNd z_koR({qb3_T7Kt9eiy}9<|Izr`@yyie*o;a{H*hXaL-x&w8igpU~S=_2ODQB=ZNR? z7r=hoQIF3T!Rq;Qf``DyQU5Mub?<)(te(C9Ww2Ued>WevUxR@2Y9)TZWKId6{F zI_)0@n`hd84XlH8O8_54oQb714BXYGCocI~vKuU~=H!=DG=LCOC4HCRo*>_0WvAh}!r zuX%g{TRE2Bz>S}rUId$ye#V#UV|>@!xv@@uzXdxN$?tbywd`+gYULhsz0>~pVDrg4 z%pc)uf1tQVFHw8BM%w;FQ8N#*dHeU=UjdIKj?dG?{xjMgl)U@>1+3XspYZ#6Ko&a{y{B|?G3PVqV09C z+&un8?YOPI2j5bscxnGnZMROWx535;|1a2Fa!yvwV39y=bChNZ>-1XO%I7@-mbN(z1 zHnzHZds%8P=Uv+}6g9^zPMqby_Mdf-JNNOmmOJmZwNBgR!Ol;{z5-k=_op_saxI=0GngttO-`rFZruE*5qNW&A(%qXWfUv=4kDnUWa;JikEHItL@f~?S8iZ z+F<=`Cr(ZqfQ=o#A=t6zeP<)M?>qWwi{HjzZQ+}Mjg$ShDfmg+smEtCuzKEiHU}F= z-7)(2Ce`A5>!a>o*q++U`O>x> zMa}sVJFl5P^~Bu~T=ugQyjjHBLz;-!7h+HP%Lo>O~)jqyOm|FDkxP^s-ragOA>Q;cP7 zamKVC*jy58f3UG~295`Bz#dc2S{?va&paFmHjcVu+m~7`eH;XKp2H6YyH~;w0ox|; zUx$L7Q+4k@$9Nbxdh$3NO+9<`2(Yo$vk#91tEbITV6~j1M}y5z-Mw`zwU_gz?HG!h z^CnKtonUj$TFPCY_*%Q!UOS|b{ z_gH-T!1}4@cij5H>e~^^T&9B665|B0TF$JQ;GOVQkIw*D-S#u6<*^Nd)sp)xu-X)2 zo_Yyf!}Swmpej&0PIAHBJMo<$cn>TY5TN zJw9jDKJEeg)aOhz_3^|x9zF+bJ9Yaxm0B%hoC_}Z#aZxjUz`nhU#Mp-&H>v_oAWT0 ze$EA}+sAp-a{Dlc3&8fP?R;vvzb{MJ>OycowQaPye|@KP|63=|i?Eqja<~|-woSbc zwW--Y@2S2++UF(co|}nv8Qk~VJOe)p_ZjG1Ym48|e!K?k@1tam{a$=6n!5g1Q_JIjJ=kY%>3;*7y8hQu%hUHw;PPjio8fAC zKe`p{<+-KpL3NgtmC+ehAcJ_T1R-<@uQ`|hMI?LG}wPaksE zE`3+N3scoapHtJsi-^Dz5PszUuSJU4(+SJm=!{BmWz6N(* zG7pb{^-<5W^ii;So~4h0)e`gTVAnDC_2Y0g{mem|TKt~?dq2njNw8X;gWA;M{|&HO z=Kd+Lnm_CL?EWU$%emL~G)2w17rS?|N7NJd+hF5{KLak$gYUpSQ}ojozwd&zIX34~ z9^3c8Wz6rx%a}iaKSoUbw58n-!P<=J{*cG^Bd{@ZhWr@pnWG+`XTj>WcMr*9`w6&g z|5LbUka~Q623EJd`#~Pt&%x!M`2}2`+)K}a)v||v3AT;8@$R8kOT1r!)v}(?gVk~` zy#UU7YWp=s&Gi(!o}LSGb$RYJ>-6(mu;b3N|94x6zkt_@Q^-s8d>c)JHS}p#sgWZ$iZ-Dj5djAWo zkGk#Oq*janzrk16wzsI|IoJLJK9?M9qs=z1!`tBUT>CFvO@I5)rj|b50hfF9U3i(} zdvJZ!)5gKOk28+>;QFcO?3*8~o_){;R!fX_aC!E1z}56KPi<=P9|1P6+&d%TYOyZ> zcCM4tf^aqcjHgX4{tJQ2cnibTVqXO8yd>VDa5epmr%f&Xi-Fx!xn~xKtCjD|OTg7_ z@4KqwU^H^ZL3k#%u{S`qp2s;HvOy)FZ)>ou9mZO zEpTFLTa%(@O!2n#H4cXlgU_T+AM*6E4%j|ClQzd^UAX_gQszspk9PlUqV;Nf=3QRq zyaBxYd1XVmYm+^<5nRomS+bTJ%PHE-(SOfLEjexiR?E*an}XHMsfV041DmtIk8FFn zKDKxKTY#NgZT{O(a&0rQZ3VWiHvgR{d4BfU8ti{N%Qo8FTbW<$;jf+bKZ6b+g96d)bh;RII#0(8*R>;bKrO#cjE5}&boBd zkG%A?jlQc9YaejVp1r|x&z=>r?F(L?THSp1qE<^k`-6?2c^VJjkCJ(n>!aP@<30dv z4Clod{#pHjaP|D|+(F=TxNp?c?qINSGyih^w0mzI0yeJw8W&g{%Kxax=PoTxdnT)2Mb7BfuZ4xEzrh?PX{^a^K zF!8(x-BY8`+<(>?Uk})`FZ_6T`HYzcSJTgU+SJ6hOY9ZUjBRaSd4IK*-$AY2pHtG; z3HX+0`%Ji6&Wu5@muH5y0g9Svnf1fPkYIn4sg)5l5R@?1I@u9iMd0ejhpw%L@k zDfS^woKwNZk$aw=2DdNyRQTy&&z14jh{oA)2HZCKX-m5~;G8FCg5~Btm)bVjBWHm< zKlIV&9Ga_nnP1|a12zw1cz?@FU)#j@+``u!Q>!KBC1ABY&n^Y4>FYeo9Y@yNy7kYM6YDZ;{w$JvXaSi2iiv4I$+iStv+>4G~9^3Wc zGVYCVwdS|PX55?LiK{(rZw6~Ku5&1l?c?Aw?kC`Cw^EYtC&7uUJ#9Y))@EGSLLS?v z!DZY#;A*#168AIU#MPd*cY?JU*EN;Lb~m_;doNt=9!lcg2Tok=Y5Q5QHsiWChfxOSPF zAA;3$#{3AZmT{Y-TKt~{tL2RO30Un)O7`kc!P%?Y)AnazZSEV#Dv#|K;4tM$g`x{`j*#8AK$JpNltBvQ5Sc>{BihUZ_ zw%X18-_-x1n0w9xx&Fppn)+>ucJEDb?#&g!t5CdFqIhq9h;%-f_v7YvKO)j$YYfa<7IgxvHKDb)$RdZI$ z9Jhhha<8_-)viR#-tT~CFKJKP5nyfZ4aY8z&Hv6w8FxXr+6_hAh2V*+J#7~TYcsBM zD35JXa2auPy^mT)xp(CH*xqwuv)b+%BF-5y z0^1rCuhA6GkWtjDQ#?b~q|W?qNjvrO9^MK~J@@d|U^Vl|J-H1$YpXqD+7_(MoEo_J zIcII!d#y!DP9FxF(>m0iYYR}1p}pr$a@-!SUzy_$XzDpPb_A=rul?E8_B+AV-Dk#> z=XYqvf)~R_-CX6FKj(IRir2c7`=Y5Q z*Zsh1$#n_*_lK*St1;!~YAy$Wm#h0SS9x;X6n$%o*A^6W-Hdw68gEX$6~(-_q0agr zObmU>JP$!r&%QepY}L?mCOJ&SS9cLh%|)ah-Rf-kIV$?@FC@ zolU!PolkG!XBGT>@C7x`7*By4w_N8_(bTifr-9Y7&i1L6c{l^CmUTW8tX8h`9C+44 zd)m$gYjb|hT^`%n;4stg~Dn+mFG1S#5Wn#aZY1vF%Io+Kb{k?@qmUjrXM9hvJ&= zN1ZjloEYVqc?H}yTFMZzzF8ls8TR<<6xVq? z^}#hhkopjc>wFk>*7;82lA4PGz$53a^AEd2%+3)Aj)HA-% zgVh{ga`^&0xo9^RHOJJNOBb5gv6SS}S!3_F<0$4ef!cNOetd*jIb-#CwC2hCi*RF< zc|U}vp1i*VRx9)VGCX-}H*d9jh?Ur1fw#u~Dw=xM@L{l;?L4D)qy8FP-I(StcMt4= z?J@9i)Y=@2Jb#w-b+BiWZM3z{-(+lF6DgU$Ni}vKcT=3dDb&uN`~2I)$^7Z_OwBXK z$Kl2(=kEzL^~~RsV6}4oz5&ntX?HwozF#HwQ{dLvPot@4{=NxT%lz$6F5iNy8`J#d z&ffvpz5{lg+8m2K^Y>k__quJgwa#BZHm_ca^VdT?y~fk1`zX%e4CfTo`L`XN}&`7%#qsO22^5m+sA@MExA^BidYd#KOC&BuP!ZR;8Q6Lf7kgMSKE z%l-H>aMs1R_OGU2`u{n&?Ee>VwLIH50Y67c|LW=gm$fbZ{|c^_{+|b@f8*M}nttj3 z*Wj}M7vO5Q(vNZM|2Gu-_xV$f|Hayt{(lQsOaH$Er+?$xznXsO|M%ds|3ARhZZG=( zBRu_=I0z6Mrn?#JeH>2GlJDf{_5ntI0m4{*kA z49BjfU;6qdxa{k7xLWq!=JfFf+`e4`zU<^!FCH?C;-jwOfg8 z9Q*qZ-2R-OvcI>{wWYuRg43UI>`zU<*0nv2SYER!Ijc{pv3;IOacxhh&f2!~vQnPa z3m4qy_F@J1EMKDLId9(~5Bn&`@UFR0G9T}O?K{5@I3F?eQGb*1w86dnvv6(mQ`F2= zY+qMnUjRIkVqf|D=L^BrT}$`Qf?(&!acN5qi-6U9UV5f43RctCG0XKm9NXex$E3~i z%eC2VNwEIfoC|rL1xtZ_UfM=m`d%8GzKy>OT+JBvBaiR0wQuf=<=|?L>n!GB1pX_4 z)t9Fj!?{)ScLFkR*5&>fhtHW5uQMpl?HuaN?T7Gho!gbr)HApKojK>vSSy3I`!kL> zKjX~Bb}q&1EQS?nExQwwT k+!*