From a2d878fa0fb483578e907c4ec0a3186093c14aa0 Mon Sep 17 00:00:00 2001 From: Nicolas Patry Date: Tue, 10 Dec 2024 15:16:26 +0530 Subject: [PATCH 01/16] Small update to docs (#2816) --- assets/v3_benchmarks.png | Bin 205965 -> 214388 bytes docs/source/conceptual/chunking.md | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/v3_benchmarks.png b/assets/v3_benchmarks.png index 1a54e9390206c9c3ec36e903a200ec42ffb5e2c8..a83672f02ca4ec98db0c8850443f00462620a429 100644 GIT binary patch literal 214388 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⪻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 z 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 z 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 literal 205965 zcmeFZc|4SD`#)|gDuqoKlk(b-uLtT{`h|W`Mz$imt4)9*L9uOxg5v)cpvZMdU{=3eg9tW zy)-m5`>$TPq)S7?*g!)=-^H{We4=u$Zi9w~S=&xk_4-v+Re|d+FdMrE)-*I%p2iq5 z8tHvLl47cRjDhKr%C#9S)~JIj*OUkkP1x8(MXL6`8K7n3 znadFgzvC$uzUy&}yR-TCmPA&SSpP}iWq;Rc)J_s)yvETr;sUYaqpPkD34zWZR^aYw9$-8liIlW+NJQzw5So_?XcnYO35r{UYWgE`dhk?US7(WegFeVNr0$>wvuxw)pO`qL#SZxRh^gOnP_RLr1Um z2&N14?WSpL{B*(hq>YX6#e+B3-bSc&JeH%^3_bPPb;3*4FYh@&>+Ygs4O}mVn-`BI zzF~HL-m`m(C7*SAdHh&kaE00lmS;R4jK)(9vRV(U-8y98+fjD|Mn4x%Ya%|sD9HO+9J&pd)5qR zttPoXqzxR~9PwTn8z|B-Y7qp4JXly zH&oKjcqECwIMMLV%SzxD&jm5bGE3GAzS!-1 zVv(D1Zyka4X`tWTq@7!ZOovpqF{ceaKUJ5-VrlO(uL|qCeAEkFR^e=ZydHMp}4HchhU0(Ij72wmq#pYdOtW{xG4SLV007 z_Vu}rhW&x`3v|;99QXTOAF6F^yU&l?mPvNQbZHEEplYGX` zI=c;r7atS_Z+}xs?zW$5jn=o(UAQ^jJF#*D8!M5JTsZt}n5#$boU@GqG@KsAdHjgZ zai^nb7Y`Q?S``xI1`=n{$Q)qEYBR*)__>hAEA=QRr|jC}eM);i(t2)OlO;bczFn^q z&P~G+x%bcqy2BwN5)2ztY4s!7EYE`E-Ukt7=^2wqJ)_+Z!2h5ZBj4m?!rqSFrMuRH0qYnaA!Y;KmW^8&xuey9M`#f!E~ z^xf*3tQrk`&T0dpEC)j$2^L*B_u|Rj;|DJVwW+=m$ZR&rIQZpB?{UWG>CJZEj`su& zU*J2g)STMvdq@>~gSVHd^ddU_!OP$$uZc4^rP!079(kkD9b>!8Bx2zLPZwt9+z}o>}vW*vD({UGlhd(FtR&wNKpdAO{qZLeD!LS)eg= zVoC|zw-~=c=eNt^Y5&*#8^&AQ+pL6oWp-Nz)rU%T(H{jhh3+1-VGG+c`6&63;3HQj z33oON_NSMGx)Wv&tlv2&nJ61u@vtJk0^t=laKTUW`>CiajZR;Z^gD^1IR>_I!yydP)13M)T!wE=!I}dzSQ<&Mz^B2{pbLzxwnIld$XQ+|vrD z+h4Z66mMb7If6}?(~8Kp(c{n)dAr){+UwhEc>n%=oBMqCCGX!Uy?p=h{Y|X+Tcw-6 z*#-HI*&X^i`i5@{Z;oaLT%$yiMYtnuE-$BNb}iY7*p-%?FJUYx=VsoozCY#3b*tBE zF>1k0`Vky%dq-Y$yw*wQ=xLn|nTef6CLGcd(JBzKbPckJnYz(#nm{pO&fjBl!^GP} zq{PGCymzio$j;P`@&3Nj*!!@4XgVb>NV1K~>`7qJqoQEv$nH$l-lD#-*}M3cbKkLc z{j(TspL@4fZ*snArmtCf^i#?FI7J(A*Tc&K%R&J>O@ack99DfnY1R6-9lcY!ynXTjR zU5pRs73V?qR57f2k7s2t9vBvzKASx@mu)uN783Q^zf5sWSx@Cp`5zHF!ggd?bWSv& zD8uN3Sg|O?D5c!b%Gx33ZfRRicg~PWXTm*mTl0JVolk5g?9XGe2B)gTx?edYT2+5p z3*)^%eLvRP(Ax70U#Vv?#}KTHz^TqTEvbF3z-L&D(Va0;HApqNUR6EIs=_MDDt#iH zcw|DasgMgEuyya0VYXQ|ueRqYTOFq4>r$`1Kc#kfbkI$onZ~o*u?Gu@Ck;puGsBVL z&DP=&qo;LhUp{y)s_l5~SmueW@0zoz2W71(FAHw=_m1}_>g8v5 zr1&@|)Rhd|p|dgB%h~+b1T#)%&TDTrBgPGvH!21JybEDqOui%y=UJ>IRKCP708IN+H{UG3f0e^A%u?B~S*j|g9 z#c@@#_lTXBwJ+O;Z=1X*$?$&H-E&!kAI`p|WnQFKl(*4$uF%>P)rdL_AFA~mUy5i| zj%CsaIOBdsOoCEz@%?xWG3n}zyh z)`u+fC?8wUcehP`Q*cjbE=9zbeoY3e&eQTGp{ljl*m|rpp5She~$74 zZ!Zj6Q`C#y8Mn1nEv*c!?&-Pcp}V`%^V==j)g$HjhOl=Ab=}R@H*(l}*)?>SlSCE2 zz_0n_th-IkqVqAPgp_!{De{-N;`!-M9p)R7GwAcva??5%i?v-Y-OJwNOnX2!j#%0PV;Dd4L;WK5^km<-f4L)zt=Rm z{Be0T;Tz7Iq){iqzaUEuV=)f2DhsUG5O0I^?@M{h;hCVe^IZkt*2X` z(FK`0b~>%8@rt?g9t)1Md*&*ahF*?VrD&wWXT-M6@#|U=4=j#u*AozBwV(aXC9EYF zx6O#xcCZB~v+euyhz0nfJYh8iauT*W+E-(RQrLmcQi@rMp)a5Yejg~kTXNr*kwG;< zw8EB6{9A`V1}@n~(|$~?rb#{XH4ALzvrsGTIM8`9|#Jgseg>{D^wdQ@u9a!(yfIOqJVVF1E0 zNEf^7nd8o`=8M6H18ojsEvBeHZwS=7OH; z)vMsIo|TKWwWF&o%KJ7V_Yj`mw}ufgerW?3IoiXQ5BK*kyJtW3NU8Yt!1>KrEa$P{XN1s}Vz-IU;qH#s zd%?sipb|(!OULjx2P(09p0TnLKIrt${WeWA2M9*dX%|QGfBNdfl&;K-F)OJ<6 zDk?Q1$_A${|Cg3@m35u>KhGsiP{AQEmn{hF zRkr`!GBB`$@cV)P?h)KF0|UJb1M;-P{!2@S27ku?GN@@HyBHd(m#o}%|I28AC8qFS z7S2CQ?B8bWpC$Hl-~6-0{%isNv0}fh$Uj!>&u--(NBPrH{o^SA&B^|+VKGgqpy{2J zcRBMZTk>yGkuN8s_~UoN*P)Z%6Dg-37(?)HMSS-m5B>xz(KR2#v-4jdicamo8fNeh zlR8lZK{d-0E3ekKzoPA7`7UzWl4qtr;Pzro&1G64+XoMy`19hH+QSqIaW?t``NTb^ z>zoYq;$q_WCsY-McbAvsPS*8F%QVNo5t9sPVlm6zMj&o**cejm9&ls`VIPk2|I&N1okQ8k;TvD^-^ zL=LR*&5!skx6d~5z%(ULTP`MEuOIh(3KxB0VD65Us%Jhgg%#sS@n8G0GVI!^e>q&N z%&4}=GS%DIe*D{nnL;J%sp}DwlVE0p#ssdfv+}#k36a>{y!u}!@7 zm1@7aciB1i(Hrdu`*`o^WX~%@T5qq_&-w^Pt|oip-W4F!BA=npol z**!jNaAk9$8fN10#Ts2?o%jPb2i5I*6XJzMRqwskk6KzKY{gCD44PJUBPM6K_)yz7 zOw4zElkr&+D$*y|>-a$E#_{>(7FFL~Xygbi=N8tQ@U~yK=(B`T+=wSR%1cKm>!Yc- zP29Rn!svtI_MXb=lp!NN(PGd(gOP7TUEg}4a$1}1dFsIIr+pHd_fotKsx}F59fZ=h zt;yY}%b0VmqS2sxu_aC1_Rla2{O~QJAMY|{WoUF;=yE`daJHs~c;(%}TfzH#AShCM zi)#`$AMysn<9-wSd^gf$Y<7Ox;2Hj%_zBE#b=5pZN7>vwwkeohPgAnd2w~m7Re2Qt zY0qpLJ&We3+{V|UKEt42tNUyc14BayCVSFo&o5|EubDP?j1Q8#jKnkDUB{L1ZJn6= z>RHq88iqdN?p?XM!O&1X8nEdGI`y)Bzp!$92_~!Gm9trxr!`To+28<3bZxRAG&Zd&eN&Vi_#CN_k)6}uDa&#&k za(%c0=h7-hHZOesqnFPRALEW;Hp_H(I{N9~^h?hz-LJHJeIRbV@0mWK>FBt-ieG|V z*40APwvYdSl|O&%yb1j{@wo*<**)<2g>}zWtYNlJz*2OCJexp7l#7tf;5o+VPPxtR zw4Ozs(9MkWNcsC8S1I{k-;2;ar=UclpZ}^6JQw3adR@x{tFo(kIF9Cr`whDHo9C{D zxTk9Z8Z4ccYvqlt|Y0g{Zh<(jY>qFU9ragCnGsH(GnPq>eSr|RKR#cC=9}Fd-3h=?shZS+eU4dbl^FGUe_NKZVWP@4M&ICF z$7b1(qXz%>V#ua+C?B!k%vCFlaK#UGd{5}QM&{2o#>zPbLiGAAdbf>VRzB#eahm%9 zBDv4=sH^`_wYZ3Ha6caJJLR5M6HwUc?MFB6&XZ3_eDL8ac~%E*a#+2Pz!_GIIs~z? zswKpUC{7V-X5NJN%;gs1EU{<0YS!-cYa3d+x|c$Ip2jMbwy3N&fPGdU)|50w_{Nh; z*UJR4QFRp-7h}4 zVX4&XKCYyTboAQQ;2UBBJM|nlsH)hZ#8(o|_mw^~ZqyIwJ#|%L5+5V4^*wN7TthU9 zZwsy5lULl4!2hB8yx9AXbgKn=49QjvNfk}pLq!momUx&yerUE?5b-uFU^Uk=)9Zbq zHqpt_ESduLZyw*ZXWo57THQ_R%H-}dww5r3B>Hj4u#+lz01Y)rZgHp#*$6T93AJ>p z+cmqxyS}qDy>cscY$gaBiz34D3qBzqahpCF2(rhqX@tf`C3)9Fv-N$mzEEyZV|l2 zJ7O(-gte4bdn05_J;~$Y5?MQ&sGZ!fbi*#|N{&8`+QrBBNx0$aoTOl>y;hDyE}OX5 zbCR|59;6LzN4P90$64a1PooKvRLzP-t>wq~_Q#;sZ=}0>w=s;bCJ+-<{obPT*}5XS z?~IpA2ZW%lXO?ACoxcR4_8+Y)5_1iCysSFtt(L%B7uAuoK-xwWG4>^eKLIXmvoT_50; zF-Kk7ZWJs;BP`n376UfMLUM77-6FNpjowX8(@_N#<6%$?rlb#Mj`JM#$9SSPN9M+w zzT8U{qs$qi7Ca9SIn7UZI1eg5?qF2js9OO}D5Ih&++sjdXZ@N;{!Qb?-~+*#{Yxtf zp2N=SrRF7U4vn7oQ??dAsR;Yjqbq?OPqzz;(#!CkO3vQv6Wi~mqqKT+@=*Fw2jHRg z_3ll-#;1n_D5kO2zfqT;dn~XD|-jCRLL??vL!`4c_nwHoO8C3)@#T&~?KqxNRnt=7k?ze;?0SbuC@bK|Llk&;~_|8$r z*Pduf(2t)=a=Ix0^&@@Ha;K6d#Rd)YgxmGLy)oM&QmAR4SET0N?$T#`Z@-*?MdGDu zwnw}}t7>K}=Ds8DcHw@>2j970O3FEl+S-~{hACd*q{YcL)%C3QTc$#{i3mgeJ7*GP zWB0_r38Bp8!q2qJVwh(mQ6o3ZB^sOM*eX~G&o$Oev(2P>PsL*p9UC_WUBbn3qXJvx zo%7wvh=7;1@*nG803c#B2$0_90}h7=OIWR*&)G@CQWAcOB^C7t6mFsqlKM*42JN#g zx5hc_fJN6lmF%V)hHu~2UExHD!=X{*#bJ!6CdMMYz6$6n4s)@n%p9|D_WJ2O7^*Y@ zgW3wco~`-|6vn+|7@R%ES3YhM{MA`})ql}T!Z%!<@|f`K5xTTkF%sxCtZ3odE}d)j%=?^GZChVSON&T0YS_z48h&^93ZH0WM3+Mu z$tT6Kq#Uh3ED(`$>EI7O8N>(rEW{1kLin(&%9GMrOaIlTQe(Tb zWqu({H-ke8>X*k&+zis zEuV8hQPv`EJba_>y^@7U8FF^uLe2{|1|O09MoMz+Fcwo^+-hLg$y+LJhx(e3(n)nM zQapQBA!ex-ey=?fId{#BZv{5aW+%T|YgVcOcyIm?vI~ExZV78(Dn?oGMCFE)YtWu2 zpCody5>(TFqkcLND2Z>dCe!^Q^Ka=M_PXuHLR{MLff>i1M3RD9Ci)z?m=J?EAUzFC zp|P%^EK+xURz8uIVo_$i^^Z9$;$#MH1)otakQkag)&k5-$^GRZN4{7G)N+S{UDV|x z+6bjJFX>V1;Uo!+6+-FNkq!uYVz<}uX+)r}y$^tTxgX(e5PFYAj1TTZB5y5CHnxL&)CYzmdhU!9u- z;e#?SFzZ;SQAYpiv=UNQVs<&saY0zgm}=x{s^B{!(ZQ!i-;zP+4!rh*SY z#|SyjUtfuK`fjB`H*UrLA?0WIz}Z0sO(cx#_doo&+1JXWtcYIUi7G-qz7|r4W~jzH z?3QmdQf_@K!f2w@F`4*{Z(NyoMAa`X&}(Ibv{sHXpPvATdj5Rj6ntlM^yt~0)S6mo zJ&tG1xeZzQGGJ?h-%!<5O>lmV72$AaXSF7&n_krMO8;!dM5G24Crg*lqPABHrG_39 zV{^F)lSxzVw^!bW;fSllsqU3OF~`|s40C~Au)@Wu(PmuAsQV6Kz?770Oh8uVIUeg% z3-EiQiI8a-?VAysQ7?jWtt=4zq)LW?Uw|keYnxye)IO08pA7YO^q9Ts*&npe3Prv`f&Gj(T?+x%04&I-j~y$Q>vCe z?=pL$b)fM-pmEGrnq`L9TS8j!ft)2P-*@~@&-ezr?fq*>Q@Ju+iUK%=yFNFcg`A%7 zDUiObv*ly7F8`j_{Y{7mL!0{4as|Fa0i#RWXgxH2ghh535D|7^Ah_IV*2A@>_&x&R zft>o{=EHsBry=irUcnL&>G!^cu0$^fm?@oLJIv6K7$^FhfqoHKAwl~)XZP_Ed+0Gt zt7-pa1b)CSPsA4<>y8f&b7*DJIFXd7|6eZuIDSF3zJ`KiuLS1+~B)tNe+ zWf;%5&FM69qPKWUh43bPeOOOF(I&wTbD4u8@4r@@IuAQ<{nMu>?P@uOF)iHFqzL7( zZ&K7fGASA7v%1O8{v0u5&fkh0>J?jkX2?Rcb?6%H(>K)Wt}kCLFFo);ClRh}>FeLd zitWbTdRH`3;$3~m7GGB;Og}CuwI(BXeQSge0GY2Q)ane6?Gh#%c$D7Is6xhGseiVCp-qNM3?oEo!COtz8s%*9mq&YrQsUA9oW&ZJc0zf z;5WZpm6JWiol1tgN(C#-vtRFSfK^VuD%o0U?N5|O0`uP%8M1%kSOb$S`Z4K>{J9>0$Lng@<3=1(fzqY?eFJI&OVCrEI*aQg~)<`M3a%CG7Z5 zuy*Ui5kT|gDF>X=`R&mw=(<%E9gWa%>#quHCZo0D%gFKyU%a|^#s>@7=eT}jb#pnJ z+jNsMU)-XHRckyeTEG&J9G#RIdZ0H?G(?g0$>SWTfs*x#FO{tw)!(c-A&a>RYb2Wh zXcTIPQgE|V&SZBjIy1!UyHiZJYkWaT&o%5;@{J=(nNyaxf_kH2H5P8&m$A?DZa~Xc zKzyR;P&I4g-SN4+Crl*oxnm15`X_&Q_Sh~9MTZ#NXj4u%&iG@vlV`0(vvLA4I3BKu z7udMIW@#z%tn>NoYQWrR-(f=&$q}~+Eq&*$GV$kdQ^B`f%Tj2+cK00mAU0*f1yiYh5 z(w@HFz$6n@HWX0pw#1?%ZfHoFd58RBlc-N}?Nop`yehQYeXW~)lNvKu9q)|d3tEkn zsL=$ZNNawX=DlQZgUTFv9H)?f&T#N13Rct2c?S7T*WztdIez-6XRdnotH!E|S!8V`uRH#hkNJ_qg38W5q0@mI zGbA3yy`ixXu8?!R_m09c0Edyr%`LSg*=fZb%w=arKc1cBa%~VmkX#u)zs0%|5LQp! zz6LjHS0JUV*PLq9!oJH&$T3lV8Cy}u1Ie=DYn!n)=p@L!bin>ZqE_s0Lo^BgEBO^? zZ66FAW#Z@M=|qv_Zd!;*DWC55H9tF*bLS#}RhteGa`m1Aw?m}RM_q5Sq{N`|0qqw6 zXut4WT$L&>Sy8*3?FxS<2*>l?`;4>qCKOZ+=FHCJ7HCtc+yvhg@19)mh6Gg>r4#e0 z9oidW{$ecg0aM1Rsj4-Dr%_2Dl*5)@6J4*w#R*!%6y>IT(rfy>!CuCQ7Psj_FkYxr zh--Q*90B7`PZ{)!MZ{3<-g!&r`~cN$dyNDxe(l{V2xw*2N`X1a6htV#(MhfnC|I83 z8@fryOs{J$TX~rJX}+lFVT}9d&Hi@E%~97P5o$! z^7KxA0l`Ejx8s!0PXBUtY=6!aD-8QV^QS$~jHL4k)rm~4auxcOdvLoVKsWAOT*bFk zGweXn`i^^X&a&^RAF?1oqE+Y`3sLc|4KFJku!cO4Bdrr*Jnh9D=j?qplglv|_ldm> znW{l06jtY9ENg2?y!e*Djj|z!SnXCwqF{^?I``oPiJIMVqsSU z9i>oG5L`S$eQQ}&78JfrBuSEXQ8H*1r$XN7IL5abIyy$0PEi~su6l`?b(yDW*-J&3@%oV^H(HG)?#Z{GSBe47u1sH?$<6x391_? zMNgQV?5SXm=Nnq}L`putdeo44mUk9dVh#Sy0d$TZ=^&=E;riDo@yc&6ZZame%3E(Q z*0Xe8pipw(a0VzoIR?{WQ;F;pC>R;PUFW6Zl;#GQ%Pgg}0jo4DI#y0C0)=@kDhZPYX z6Sp66K7_sq^lJS2_!mjs#mdSGyWafU^D}AM263n{Hne)Q@(fuM2ygWY?AzBlZl-e5 z61A3}&nk1ZKA&~Y>(&$Xd3HIh@*IfCr_U&NX{<<*!F=ENotM)|X2`v95Q9VUKLYsSmp7!Yv*f+0 z68(WbY&8U)Xc8!;h45wH;30jM#kn(Sq6k02@R$|dXi>E!Ezza=bSjAlQsS;iufN^X zWOJgIZwxH}#1AboF6U&xj-V6og>EX7 zx;G5%Gzf32f7t)-Ku^=@bDfIIn&yfb>r55uUy-%AxO+J7oUtC$LdbDW{$*2jave*+ zbB|H~b?7_+xsJp7eJeUnw-GK;>y;{ReZfo>8?>4_$+)(ioyxe@60$22U?9a4BuJ}J z!cuoMx%ucoB+N+D0i)NcWohmgc}3^jS9irNPL@NWMGXh_5%Va@JWOAQSQX+W#kuSc zUvN#ezprrQjxFWnD$}0j}R{&uX z7n{;fz-TG^%TK5)U$Z2&7`B{=*aEifMW4B6vRl779QHDXmN;|uFr-Yd6r-v*hi)GL zQ8MI%u;W>{1j{lP+8xFhS)$pUE9Rro=rrRTEj7g}p*MVm^4-KfvsHam7Lhnt+#zpo zeEDaT@+?+G`mPVJ-_f*8G6ZU{KGjO&^$4lXk_)Z6lOE8~Rx@w8+qM)r9soBT-NfA= z!1ujsVravfgxM<^=hqF5Ya=6jrJ) zFTxm%J}H1JysF&K1CYLfG=uj_Sc+>wWe;V2q@S}zF>)3V)fxm4;9#ivqg4--L}8)c zN=4+?fQ;GYQvD>2jG4nqqkhZ!m`c%|s7XwF`LLOJ=S>lH)PwSQkJ(;~cK)lml-Z(@ zeG)a-9r#tBc1mG1Cxz&zAT2@D`<83QyVIdhAQE~EJ*XJpQ1vhYO6m@X6)~73KrTe2 zQJ|aO^&+HLS0OmBbVWXmk`2L@js zD(RT+d$%;%y40%PMOiB`OHtp7JX(Rcxw}E|3SZq)QRZb1b19{*#d_?Oi|C_b0#F$V z{Leg6&=^n>LTjKB>KebGBBue}>hoFav(>8%+>j5;VZaaYxQf(>YT1o5G(g&EiK#ag zxJ3o{4tK~-JiA}fQ!&OZ?DG^>QMcQ!@#upT$Ew+!*S+c4tL3$;`S-V*b9!cC&j~=G zN(~cDuFQ3$UOgS@1m%@3RUXywzQ|OxH&|M*&{s z(8o?p1tb@iuWSG4UX$T1O%|e0!6MFb0|$}`0rNZ@yW8>HjaXW&!(`wFL`YMm1~uBJ zx&*`1riaXn^MYXV<>ju5ax^iHn{CadO&fD9Ab2Y?_vV$w%&t#mrY*8o{Bh@z$neCLsd zhkGM%bCO#mK>G3L=E#+$J0^RKxcA@hO*V2wz5G0n&2)H^ zgUi7x_AGYI$qJ|(4-?7pAv%qIFYdIMobWkS5cK55n^S8NjLf0@#^(LldA~Wm)N7Iq zn;%-mP0jI*t9r~|_<|@*AJMEclA~T3aaBTeIA?!33NvQfyBkr+m-WnIw0zh_!(EH3 z-#%*Yozo|!C+3J--p}Y*X~~`6_@=sjmH0l&5^9!v*1UV)l)EBbI*7nMpZ6DFY!+-x znkIJHD9%)TeYnrSnt~L4ML*6$9o^+#`P*lH%NeV#0@^SUsx^J_caYJ*kkYD}r5-jk z5H-g$u<8r5Balyr@65gKHpTb4ParKIl62#VQ-D?=&FbWi?3W7h@)iXa&rZ5z5(E(h zHRoZsWS5+GJ^0FOz2rBLUOT@X=G)da z%{JW8zst&E2>|R@%ccQ{z~wlR5F8fyScx61ZC}ngm_64(%;HY&a?nE+yMwLWi4`b(1QSk;W@meo zfVi*E9YtTEj&OUJk73iq=@_nzahQ51CpqHO|3kAYGd+NNAO3l%8{%dkJor1fROiNiW z%riagXHjlg)mN0|5@d-H=DQopcp7i9C8!>GMNcO>WJscbtAF#8&+L|E(r8?&;^5QH zV(p?r<9msv-1;*SJ8O}<&jNpWb9orOYLmg4;9np&eXVfEv+eD!T)zh~ZWMPUi(s!q z3_;S<+e{S%180_g5=tuN)Z}UFsaeH8lBa1ZaM#e-5IOR;hkt5yr*E%Az8;K!z5X7T zyERg_4hI1?G^bo^rRHg3%w)u1kjK)-1i}!)QrO|@0VNf}rS-#c7l6(nKz=qOIw$3# zB!~41>;1ibjIzE<1Pj>Cg5elIsG;*-~PVq&E_iK{Z!ZRJ%V#>}-N9-8c{mFo0q zk6qapo80hRz9DCS_6u_rO<}XQpS+Oy@-5f9BrP=)<~PBET{W)M;$=nHm)aLp3SBN- z%UyCe^gAV}rG)MEJ`~838NDPW-710dgWYZgNnLXJaH22T4Fpj#50=I{LENp6dEAvamX8!8LS=5l6p z6w#Y1!exkK-*+`I9@PD5wwajk0m6A~YgW$Vk93mw_0D4!xQa-gk=6O;50H)KCNUyT zzzZp^Em`(dX3k?SF_NkYGSJbbhPhWH4JYiqIa?9mZr?~hWjOpOxmR~(FG_+XhEFN$ zjp2>9cHy6Tk*C6opX_qKO$i>wCHlbomvynL)t*`~exi{wxnEhm!Ph00*sXzm;$FMz z|7s85vK*Ow8iI9#}RXsf%s1kuHuV0$ko7 zV?cf#1VvJ76kZN>{9S`zlxmtD7}4YxW&FP$`7gTuqvb!{`=1j*9oTm z?fu$Z|2{bX?A*VyMgJIKZfNm2j_puu%sT_v$C?1!6vB2{I1}a zwEgek0VmMl_?_j&KM{56y1KjQh{kcI)Sr}HOJgj-uwb}7q40TOxH@=HqaSDTG$rd5Hmod00- zwctH9Af;&sx_HgIWVr+gJ+nzuiLkc!)0Lv0tc5)wn~_XqvDEbLrTTje-p|d?ncQ{6 zNMIiRkt#CvwWNwnUjeox7^tz7E%U3te`xKw2VIVD@;LYZ^RaGzm4K5pOsr${a|AX3 z3-=r(oU<v42)JV^FK`RGOVX*yX$sXX^D7%=nCGF3#8w~RC{iXR;t965U_+COVwiLciR3cJ%22qo*w-R%}XWNwh zTjf2Y{BZdA=u?#P_I58^B4i0VFxuNU&zOrRAW+Igf8siNG_?=K6D-EE2FY}=Dv17)i_r;cu8!t-WopRfZD1)jIu6D8uiUt$9>cx z=$KjP=Ml_9a|F33k-0pjJoDhaQFTl5GZr`PlWbx15%WDW0{-dui*Vb%`Wu_u*d1}- z9dD`aQmJiT(mI4J@r>GUGG&&6zP=T|xM{lM-%KcgbE9~`3nO-#B9fa@!*Kha&25g6 zs|_1h%ki-OQ6wr63FqU6i*cg_w|CV2{i7Vr;A?jdSw?rur^5{aDK@>WCtI=YL>VLJ z60?t=OW)av$9GyB?oTaHHixfmo6k^|yEg2*Dloo2sx-VMQKefydb-IX3|* zlfrUkIh7hrQ{8xmmTsZ-98ITM9ZXt>%*BW9x5qlf zkUm)0dsnwwo92@~C2gog^L(g5Kyj96fwx+W>Tmd{NhDtUAsKB zF44XaDU-kbPA9W`)JH_Dn&hpRAY1tErVh$ z1LTk~A*!iB(1BUO=#0XWm4PT5)U9m0l`d>8cj{P@dt!U+vXfKFM%H-rzkmd0EOf01 zvHE3=S^!3sSn6*lj&2F%S1(lg&z=6C-ud6h@S_U2GyUh&{4Z1(-oe+aM>7u_njIT) z!?aTz*;Uig?`NYH!1$E_NRtIn#+iH|HPHXU60jId#Yu*wCF?@u`Ze@Xe@%V29m;w( z$PvFW6Z@^<`s;fKT>x)$V4N&+c|aG!=VL1mk_eb)MUD+1UBzT)uLIf8i&vm(a0Td) zZ`Qv7vdtZBYJDL#*AGaaG&_}d{D6tB>;d_VSWsK|s%Zf@w4xONh?J241KE8(8JpJ! zF=+YAk^a|^Gf{_JMc4XP5HRV2`R_mNoduvo6M#rV`Gt*%o+msHuJ3=%hpeNPq#aUy zqkcb`kvgxM-3p35pf)aM4WNe=A_A`1$chi)5AdqmCgXG6fxJgEtm>yi{I4G$fTuw= zpn6c(7zx+~ay5^rFj%TjOM3F9U4mVYK4o8{C;N}hsVOjt87iY#vWrr z*#zgXxZj0>e|_n$GC-FO-Ie*(U#fx$l`__xOBpEdZ`+ZoiL|DU_~<6V)(aLcXZ=AI+& zSW+h_ZJq__fa_j3kT;0)g39JuYB?rVq2V(bW7zXTLp&ZRW-Cit#j7(iLDoKLh%a?N z0hCa?&AblD0{&4%X{lMzj#>mQl3$`rElogY8xQ?@p#Zz_t&0}fH2}E$ForYR|?^j+|haU$fNN9Kozf~^HbjL zy|Qj!C=W*;baUdMC>tQ9vof||+t65zI^ zUs?aKi66g-o;_BmNA;6uzM3mD45Z@s0ts`6JU)-=+1JW_-n^{Tjz68pO)dYYrQ_uQ z?}3u7)07BxM|6C_Y4n_}U=igl~s56PGr)6Wtqs5l zs4CGcGP_lsdrQN0tk93nd3l0V;V7@C@6Qqa={Z!QKkDfy>F?*|Bd{o~T*p-T+%}^d zhm%3=Cbxaw4akjlBxzcCM-G(S-`6*8`$84w8Z5i@#nb{#UN)$k%d<$bB}hK=WsbGT zewUphueABS*zO6J&D(Gs){~a#88g~J^`W;89*i^U7iLl3a`GYgjwX)N*2+7SbgRvx zmA9QiF4FEtu^;uV0MrC}UoHlyc%T`$ZxQ>OBq!vpkB&W1`{6N#E&#gd>Y}Ril|Okt z%>X*KxJc3`MvaMstjeI=0)z7Sb;p6vRiIvQ@LBqNDwk*Me21(R)>m{c02CAHq>|e1aj&*&GJLU0 z1*J(>eYS{b40vBbauy&8b2!M<^3)Q*Hc=67QPF2m&~3V!0B9#TE)Jz+AYR(5iw!u= zj~u{D*i5S{fRPg)Z2^2^68X zZYtTkg!*$u;Gi{&obNRUjdCmPh z+6?kE{#x2^fu}0ee5r3MXo6RUxMB8xb>0)I{(L`ZrvU7Jgi4g^1?2%t>t^XS)r^~TSf8VGG$jA{#6ZhZew1nw2fKz+ai zptxbB+7pyguglegXy(H^?JaH8;-`K3O8vqV#>Upb3j9l`rSK2V`z+U9&T~qm=Fk5e zmz@>f`|XxHcymQ5Pl$}TY8FIB{2ZytCCvMimF)s2v_>-(l+j@Lfd-w*;Tbf_#aZm% zr1YbeujL}IS3qZt@`zu=(E|>%G`AABui!@pYW4Y zh}TWPc`jsmU$mN8lwIQ-SA3$;j{KBcHm7z6x&rhzH6{;|m6aG1G1LM|0~5PUHz0I0 ztbc)aNd{)V_WqSsY6&m(%`}>FUdfK2Ho(VS`T;02bTkn|pPjFS_+dLjpewJlDs}1? zi&H5Nq&c?!Kla``s>!TfA66__0V|AD#Su{iQKT1@QIx78ARMS2Y(K!^;Zpa|&D zMLh`JZIQ>W0s+fFl419=R3}n^yYtNYyTOGboK;r+X|GmomZ8$a8 z{UQ5-!z17rB#}$N*=aP=C&795?YHwNY0P&|+3%A+s+}{__~488jaYAbM|7p;H(tkQ zOTKAixWqLb9KQCZrtPs?XuTOGEgrf5kj%4<{3 zFfx4Q2EW5Kd2M{(kauHKB%vk~xUr%rN)vGvGdGbr0 zLv7=y-5IE-UwV?h<|L-~gtk2;TOr60{?H81ivC=zm7;KhCFWK7(_a5nkjBeC1AL%T zCAW{Dwy}^vo;25*9@sBwJkIZ*BKW-CENSI`TzBkNsIykbsSFv|$A?XRGJd*aunNf* zzyUU}oa<{htkq~9UCa!fee1RaKxmVtaUW;?zo?n(decJ5wm1WBP_tf9!HEB$4;M^0=?@sKMh5LDj9KBGK3m$Y z$h>2&IvDJJZ+8<20ZBchCCYJ!Iq1*!fWcaBX^H=iQeJ{nI-& zr8sm)u zZFl-#HM*rY&hygP{Ii@)T@Dn)2f5XT!UGolfGdBh-T-tfr-i=Q9zF$1I(hkay^?mv zb!GNSBnz*6%F#^-4h9X;%OLz3hsz>H( z5>}$cL(@BT|A^sR!!2K}AxOzBnq)DS3V&tQ$DKNNN)RR6R0o6lS7`f#H);9}0R%rK;aLqPJ)#)>wA{9r*0y!P^;lFyw@@#V)E38P7ZVtL%@!j?DwFy=?zYr>)m z^G`3zyWwC;QHE~eO=s54gQCZVkujkR;5NHh0Dc<0s3J-lLYl)o#IN|Au;gSZT>*fK zndi7xLz=qIrza7QdT>iT&{j`*`}BxlOSz&$^H)hOT2&PE97!D8DobR&cC6~6j> zG|st{Uz&4;XBgI&0H<@}x7>L^#hrTlI$NXrCy(8ttB7UrDIU#N&tViN`Dt+d#{*9ygD@mHK}^)? z!gdL_j)G6~Y%rXmVq*K}fcMi`>AD(cE>#;2X2qDPKD(I;`r7F^pz{@}lz)fe0EToF zyd<*6H6}JXE}q0M_uSSRPst`&h`3c2@A83p=rv>``@m8OePO_7S%COYbXUv6yRg%s z;`8aWZNK4XgR!(P#Mxe?USsnrSwb%Ag zI;xJpNKKp1pe0`C^tv`gZQ)0* zs3P}WR1kg>^0YEkrnzqNP#Az>=RRKTN}K%nB&@thW^}XLXQWc%j?lJI?J&c(zl$W5;izleO!zqI!~(5_I>`HK+B#|y$MR_|+w8JGAC zee9DR(St_UyTfVM!|cLU&ooJD3_Xt>Sps5wrN~>lQ-&7%??IlZu&d~ffUTB090oS%w7=9Va2l3tuC++! zaK_~O?3oU+)G&}NE>xeb1CeQC{((C1x_YoP3%S~=!k+*jZe#P)9Nc5&4BwI|1Yco7 z3n8}d^o9L#U@XBdrRVmQTj;Q$o(zyTWe*ny$JHZNSF{8}FqrpJJF*=RCuVBAI2ncnaih|U<5+Czyf^tceG9N*quSRcxTU^t_^&ao45lYyO{N3C z_2hg$rIPg^Uq;-lIjh^ER62(~i_pvCCtT{?a9|t@KD?KA8VdH;3OZ(~9Z< z8%xa4wFr_ey@>#0kZ5li51FuYBOsTh;=SfReRW_yViH73LQ2!#;uFopk6GhjYDkwp zwz}A|X>KPp{fHEIjn-+tqJDZ-AJu1zdG}w!_~TAT#G-f`Q$ie&y263YCkE$+nHY^j zpv?}X=K5zd;WWr+Doetu`R*BhLnc3!ze!2qhf@6N$1{bDpr-_7;Soz2bNxnEUngkq zdc+^#m_S}@0lT!25NT&o4GqSo>2ViHicGHg(rE;Ux^Cx_+C-1e+1c#=0+SqOuL1hR z>v;DQ-~1kj0v8Kqk||T4t@n3mN)S`|Y=;1w*rGzVZkvEB{x>-Kf1bye|L@Vtw=Fu{ z|DXN)aaaB$fB&Lpe{InZ^1?L;VG2R}t&(A3b>2T)UUTjF-44NfAH0*l zu*OePYHxNYVO{6u^@MdnS>2*?2ik8|YR0~kTP=0{=1td!1DixNEcfhLDYZ+eZD`}V zlcEy&2a=5^7Z!pS2p#>r(qZ^Qi22W1?fP_Y)>~V56lItQdG0^RgVG~b2(6R5_3!?u zciSi?=183%n-V*|V&&@p?vHTKg8;D|P}Wn3{dZ6LFMn59v0~*+w}WH5$bbJ#@Y}u$ zA%H1UJN-xhW{KY){GY`Nt^3c;-ujOi{ChD7_g(Mt*jT}v9iR>SgnbsTflyAb8H=9i zDvIoEx+`g^4O8=cterG#u3he{iUg9dQNvQ~Y)j>I*sc3KTO`{qNYOjKV3(2Vr-28L#_trvfVqMWi zyE=MFdXhCBRh)J#5@&@DE+7{$^(yc+*adrN6WMX#VIYE1+S!f<fU3oAk#{oikd<0SQ ziD5t=2-}@*cCNPeYS5{FeSY|RARn^SPTvs$*|~2q@-d6jxtX`*;oDVr6#avB)&*E z*L;BUUM{uy5VML(-wnOp5Q=MqDxuSV!MR9~(YJnR^sncz za`oxm;GDO&G@KB4x5HlHcHHG16FnW6;H|Aa{c~%w$m;_Oyth5K+UG5U6v^myZqzSv zJbH$8fq56ADvKkCFz7X(W?Y$#yaQVw{L^o_79L|c@g_tj*<6Oz+%@z8vO;HVD!gKY zI?gDy*R#x^tZ_l)3c7A`)Va^uuJS5(6kEZ-nuPFhyad~dt(8)W0%!YGj9y5Ab5C}b z*4!YVN7mLOA2(;38tG4W<(+feWUhm{Xt$}lrnsv$$Wy-G%MO_z8}1!5s;-JU;@Rpb zHMc9h9ZRI=N{3*}3-(5S-}Y~x?jHwC#dSOH8vgQqJDpmEaQeLE00z=QP3yLLm|j1< zMN>>NqF>pPWebZtb`00mK1b>q!kFvnGoT357vy1s#K2+Fy+`-p0!#gBEuHe#tcy~a zpY`z(R1e3IPYS%a0E+mq8f1@%X2IccJA<1QEV&%jjoxOQmynqn>r66KJLGE22mHV#>vRSt3Kzi*5%Z=&B zr5`|^T#2Y^&uh81LbvCTn(u(-LL96khje$W8MVyTX~#mfd7a7SC-(~M#@Fb!UUT)j zs5s|zO=E#wJblpTqYCeoHl)R1P6i=;5gaenXS$zd?(CSTwI6)z)QivyO>~qk&+V-H_}ecS=zzQJd$Jj;CXxD3~3+hCEf6; z8boF+A;|y15a)4IaN>l)xQa;m!$P1&hpC*5-h(Z7zKPKH*!=!!AWS!t?yVBAkxq|= zB8l^#%6w;Y&4lSsD1{fLC$&YN%2m=;7+$CqB>YGDHhPmo$L{f%eQaGgvVx%XLOKFpa)q?0IwA50x`@!I z%Md?Utu&e01I^ti!&Zk}|937!9+(m}lg4lXDL8B%ZYV7KNR<66;mt$WHP0d|Bx+-q zvh@AC$L^-`)R$4zGvZSS@|8igli!u;+oz;cU~gU)uEvFb-?#dE8>DK+kLw@3U8&(M z60G66?lQ}qCUG1(pm}eS^u~*%RzYn++s7Z_eT-YX%*GQgi$po%ac6!KIK6MiqKt1W z0$nu^3&@VO;mGtc7WxT9`c?5l!O+_J6YlPFYu)W_b0#T95gJzWtGmO>2Li5!5p4nZ zD!eYr##=Q|K(xOE3QlkN3cMub8zdmI_w7dtwB(A9m#PatrpWo{4Y4N|iq9K(n!)Vy zo(+#Ks?uk!*$!#Y&~+^pEVj6m=FJTk1XlLVHf-m+wh~jRy#jAU+M$`SYP7UMA|-Hm zqENrIxm#s;vjd$uAMLM2FGF$8+3Gpg5qmY-$7=DI1;gv}q4QymM9pM|Ig7AOjBc5= z=?B42vIU!e1SNtKkf{0%>onzLRu#>s_rj63m3LXYOwxo#kh6&5=)6e{zgL$BQkJ6Q zuS`8-7Z!oI5n0N%J9bEV75-UU9fQAc*+I`iDH_I{dEnK-KJ`|gV9EV+m9WVg)VIfe zUvNDj<3z>%nx$zfuq{moz`LtX7c$<5aU|x0GV-B5+DRSF=ptF3eWf#Z&o$&JPPJie zm{G~Ud39y}tJ_481T@m=qfpqd!SG$GeR>BE4UYWd9!b#8Jrlwh>aKkRIk4eMf$6|Gd)M<0-R95) zmWU72zq<3%&IppSio7asVsV=o6CJtz2eE3}1D30Fu+dl0NL&b)5Mz?wN1C4sclQ*z z;f{FjxM@mV+NIXxSS(r<@$eIazr^+bc!?rWxYsuC`d8W{_g)tXKwn{nsRd6_g5$C; zULU?@m)thFZQuYZ(5rw$)#qVW37eg{_x*sreY$@Vy#4;9yAgtKUn>-e>NkKjELppJ z7%A-xvZ-oeE#qoZyb0s`7cMK$$@hRCk1&B#8Is-EcUz}{gubmSAmm@<;r-?f&W}mr9!Guk3+oRW{eEYg?MmI}lz;(!x zRctrD1a7J*lDhtbn7wG_n>H9kQ(ZvHtdG~nnZ|`X2q)U_q&M{_>ikRSKFk2)1V@jd zc(;W`9>xE7bYc=- z8}82iCSEI7H(%s!)@u*7ui>}$XoQh8a!u$^>>L9-y>Wuiw0$&T!JD&4TgdS_M7&%2 zkY|BH&bng?`y9eAI>GgXdk_ocFlD`uyG2uXIrp@KtD$P=KsgunlacDuxX^QJJ>Elo)h`5LvJSvdPIEyQKeVEj27O0XB4+WoYNo z!NxZd!yoJ=^#`7Xu!^FnI$kZ8oOM;we?%EEE>jR;_LDc7lRvMb_5u zON6ZvaV$j~n9i4vdF4t@bc;UW)tmU}CzNN`fG4F)gzdJy@-8gV)tNi`r1#S^I87{B zNK!z)zUuZ_u+S81N}y&BzvIRpFjw2o#KEVW@o~JxIHWT!Hb@U2yJP-mXiF1*N#Yi)UIP2c@5vn=nr1dO4xEJl08K)NKfZ&rsWu|WlC#bJN z@%hXIG}Qa(F#p_;fEGf_fVqwKHV5F&y~Q@$(q!V*!<&5LpQJpJ=bl> zMp=%K?!>nAPaE<}zsC@TxwjC8S6swbwTQ^!M&=7c9nTG1_HDh?)2mQ%olB$9gFT1vK+42OxEZ@)UX9j-2kfL9#y7 zGOgw~G=b7S8;zY9oy!tM?B`!|0*Oy$S%eVqoq%gU8qm07!!vBy4V?qux2EY3h&C7* zXFum%9D8!tbrC|a!NU3eJ$8D5QY{ekW5u%rSHpxxqidsYMt?W;Uq7|T0T2F@_0{#U zC$Jm22}s?aIm2|0gTETkKZVZ9(3Z+gGW`R?3l(!wM!HX3vxyRjL6VF{AEr3;U4%@+ zFt{WFi3B%cOniJBKQV-u5uc!Q7reoMcDVEMf;ZMXxalZDd&t1xUix=9#A#5-aOI5l zbE#Dw`tFH&_H~VzeE)OH7u$6-?JIxUZQvqd^exp0_J{xEY8|66pllp z8yp#rdY`F;e%Ls%**nOvhE_v)M7+$-A?vAdW>t8zBdx);%g|69^jRE&O`1SsS!g_; zr(Z3bNDEg1vk=CixH?CqJB2bq=CxtZV!0HogAKfGfj?XQhBD_>J>hb-t|VhVyw%R8 zGMWWqdS}~K^zcM21cI)TWxz=b-OO_TRD7SxxRor^IV=O?Wf`}vg;En73w|vlpVU}O zNpJu1e~B7ij&MhvWUUy^HHUd$gK_c%MSWhgq_((#90eY&dhP$FN9*Fa zf|rNX7^4T_bUMMUf$z*b?`#152_0iPuT;>S!KlV7Q6 zReA2jidxm3FP!xI zA@^m=1G%SQHRi;d2Zp}Q0=Q1-GKc;$8dB3l} z&^}koi+*~Tq0{Nz{8)Wxk=w{r!60t)Y=1}CuzyP9MUL_&%6N-vydyJM?1J_h9=D8F zJWE%}G+4gn$%Vb4-+jwFOgN&Ccx_M?%6mhTld6i2uA3I>}rT7_=0*GB^A3no9a~~*ox7qgl0_mOmQ+|lU z4@V{rIxZOpzl*?t!>~s73%jQh1j;K ztzS07g|cAmQto=-&uCWFei|;c&?aLE#$)My=%S0~5SEAKy(s^Wzuy0cJNy6gS7#rg ziFFV?kN&ch2AKs*>fbVq^&22($-cjVL2(Cd~+lR;r`A(ics81LS zO{y)V@B(MZ8VwetIwNs`KKJT(kSbi~(v$U3 z9VxF*(D!XV;l8F3URjB*DPkt(r#IJC$5|2#+Y;ulW6a{;HlP zT>#n91?3iL|8o}0GYUB!>^7H9QQdLj&JONW$AY=v^vJ7#k^1mlbLf2onr~d18xr@7 zNcDoY#Mv5TV8Dfq26Z5e&&bb&lEFpE9!>8^{miL;{D9esX*vr-cb{|s-2}O^+z+xe zPov#`WoPw%8>KKe5aMOU@_l^#_Hjx?kA4frsfaRp5l$lYYMgpku)bjEhUPe(Mj(UB zJ*AuU|N770B48ynfIqG~W(~|N%J_}!o_G||`-~0-0pl~r>Y>D)vXR_aXsx^+2*lIf z7K9Pg!V_mLf-hJuGv?8%(G6>VHefsF>l$`!bAl&6P*?vNe=-7=lM+<$MVC>xmQIILBTE}zoW*C zavec)*#x-hDaDO()PQkxq7uQXOnYeo`Wz=5m^Hl@;dTC?_iZl+N#ze2;1AV`=XH|} z4D{&9VTwg46q0|-;}YB)S@fg$14$mYqVNe%|%t4vN`D3?9JuVb^8o2nl}3B4J& zf-*P!J^1BCc4mRg3mz-i@p2{>OGp!dMjsN~-{O!Yv+yGFSopX_=;*eySXpk92Bsu+ z9<=_o?v)iKeb92^f*?VUKauP#ko2<13YT%6T7&{|qKLYrwT}Cktc!f>2wL7I!nEWN z?7ot5Xmj^Czm-J?N;8!OmsH>_Gnc#O07imzWsOQT@ZM&!-|p+!_?JZ0FRli6p@sJ> zw^J~s`2!8`m>e_WX^tI9hRDa!k>wS>N^#D4_C#xdu~Q!mcyZzEJ3&Od+ed!T_)FLL zSbD7{v>}T_KyfYygBu@oe!2|xpg?Qq(}ss>keRwpVeaIrG@6JFM-S-K+-;T6-EcBA z%x3vrB)1gZYWf+n;SWeMMn?sN)TNoNCwn?8|@>a0qvRd=nJRdh1$BDOG8;0vX8#szM|1xeN z0sFuxS6ss3$IMoZ4{nrRl-mE7WUUY)ZI48!}FtQjIi zXIy1Z;N>n*Mxj8rv%YV{*H15|!1I#fw>9+z#O$>4h*54Ya!bTesZgmIEOvOgc)AZq zQmiUiQKcaq0;)K;FAx4jc|Tq zi+oyN-dwi1J8|cj6*a)9n!W;RkbE%ax~e8^_Q+O7W-K4&4f)3?Z`4X(0~z?Ii`%Pu z#+@n_B9|NMz3{$GE!LzeNrw1cef|=Yf24B!-4bsF>4vUJm-d0c?8lE+wv^M2vT>MV zrlzsg_@N3&f1!R!(X1P}f^0QbNrP*3D1?$fBBzzexf*U?WvGj>dn5lty-I@r=&OmE zrv)B;TIq>SgY-EF0jgchNbiSx-soPUdFBu%;c?WmvPWT%p+YU)VnVkaC<+3aP!Fe^ zUUNMo^HvbC`TUQ-cZ(7b_f(rmX91wuY0YZ(n>mS3kaPXl0ShSoWyEV$*_KH^s=JaW z1byN1q#nw0T*ZO0>=-oiMC+(4Z>S z73(_GOUl<>;41~<7bgW4C|K$I{$thSZwgj0ni%w)U0%csZF}KsfaBFT)HLs=Q;qwkv)*s?D+`0!f(11|yM$6sjnitsHPHRXy&UPkn5 zr(@*GD3QMnO-kZsH6hbAG6xr~a`B+1Rty#STLe4W`MZZc?)1BmNR*Bb)$;kOK1ls# zYL|k3b1k1ac&Gx@IM9>Vx5*mH7I|D|G2R5U{NwZCD}ZIVP5SAtoE$&&7fwz!;N(C? zY_hA&S_@2p&I;F^R-pPvR&DS5ZbiR=d#1o-;mR&c9TYHu^4m27d=PgFD{#Y2DB+HV z@IHywz*Oz_=8$)JTDgI_vX!(2$mCymw*%I)?}u15{JOZD9A@fZ!_0SlSMIRi%AwuG zPHuxzKGwFaIQ0_cin~jF!>`;E6;WoMoX@!QUFU{SkL+5?d-@YwZ|`OMxr2)}ma-Sicc&+;whxiP0}P#DGE(z3$u66DofO z=J56Z!W_=PEV4x2XrC+Q7W+>g5%#Q;Wj*(JSR|tpJEo1?WwS&*Y_M|X)bOb?fdl_q zNxBYdRG3W#^{U@}z1)jG|H5MTolgZ;WU4@0ILBhFHUbYx%Tm2jex2J6Yzar?+CP44 zP#UW5&$DP*>5|y7?M*Q&FR*#01&t*F zp6u|+aFjzSVrx~PoGo$-pD%Mr{n0dIE}h^;t`FQ~j`NEl;hyQ7p;fqvgD9f#qn|cc zTt@SG@s9@JR{c%B*}jpdc}~D=Hz~dw+?^r+UQ+8w(XF|6J0p5k4Z2*4wa2mcY*5}P zhDyf#DF1iCgH+yM^Vu(86bhf#7lJD073n#zPO&oUkwIw4K!ax;>LT?b4Fni9q1Kau zX3gyQCre5Qnpoz%`P1)(x^Fv>WW|@y;!U{Q-_jpY>%F&5sy)usroOs=a$R7#BURmA zs?5viCb%K=#UKQdj|o!?vb3={N3}tliGxgP>VL?jcE^f-*NgCn8@sT(i&ywd|C#~0 z2f1~bQ+903Gv|-sXcDd#7kwQx%+I6Vz1{bY6Yye><<}+bNZ{>{sj^-bCJC$EbU`+Z59%@zy`&k0F# zYa8Igl@WMjtK1?Hj{>FteQ3Q7C(sa5e{cPwMgvK@NB@*?Zk>UJwnb)N6AU;(C$SjM zZ7p|ZS2sikJQr~G-)zBlU<>XS{HZEn5MP`GbdXwlg46@6{I(PB#LcweZbfXyLG{5) zw_*O0$egm;;Mz+&88p)Fp^T;IKj39ZHeeSdZTK;mT@n6}9}>Jh>6;=T%J;3n+dGfg zlCwF>s*^LiR`ihorOZUAodFl^g=3#;FppmLj|}3({&Qmk0+(gAYcE2qohlSN-rEs( z$gqNR*FblyV2(SXKyLY5IZ1<2c0H{*6*0=ssSo^ZPQ4u`NQ5}ECNwf=lNtpCp4O=q zSv8$cYxC1-`NLcjp*Oj|NfP3qbf(kWs9cY6Y3>Mwf1n& zVI}%JwcCUG-K3y^8T6jaU*gt(yhM<8MxvgSt}0eWwMcymtX|;Uoa^hImods~u5GMP zPU}{vuyUXdTC)b=TsWYCJor)3{*DI1FP_gvF^by%eC3ieQ|yz>oR5R363g1oPnBQ! zWK;-#yiP+UfUA&|UTlO$;h-B~0>O`#xh^$(bZ_YBuK`=+r zsJ8!^;$GPb%mm#|>z}KzY^uzvI*|itrQw(&%RnE^ac5imVvv^?dD$47)R7_0>_&G7 z-bPU=HH9CKPVVpq5P)T0+9&dzP5>^H=SOsv+8c$RcbhLQpC_08HYB6508Q;ITCVn- z>R_jF=DqJEWxk~3&b(|#&?6D!N?Lp$dKlN)l($VwFID^^ z{eEq}BrLJ)T>Oq6W1E3zwpZ-S^O(-q3pQBqNlwlqgc+jeL0kyj=(3%`!5nEFJi!)? zC$uv<2^lC8ck-|nwQBll8Hu8DR)_oc=W2Ve*Z&&s*Q@hA{^p&jmIBIMsGu7~!*djoTv z0i!2ivPZscYoX!`bjd?f+s{@<-0`aUH99@zkBM)v(wX=x=WA*z)GosM)#5K(co*m+ z2;~}7_IM;RJ(=xvnFxJ9_qJ3ZO8P7rz=#2!UdfuV00AR?Nj)5dyIm zMc)Zsf&Uhkk7su97D9hrZffJDc)@rkoii4^yVr>E_2s?Rl>Q=H$&X&*T9N3q$HpzW z@UirYM$e}UIYtA+W+9V$PxFm4|8W0pDyz=K9*J17g zCq>j;eIsDYKc|*2_JDZW=GWa?n+0?;$*LX{-vczHrId^SNB-wNn^`ytAXM2eC3I1^ zdvLW}R^tpsA5>}qJ;_C<6%n$!APq&^5fnt8R}YjlIAjZjI}72%k6-_k^IF z88O=CNv5WMh_`!(#*7vFGM&O;Q$>)n)_TEp*#Lf2qzwES zWJUExtC~~meU{C=nJQT=ou}b-ymk(Q?@;u?c25;MhUAP_p22!_g zDDz~36>SoY#%Mf}U8^#Godf@94xhujYFI0KLvx!SjbCr*bm~;<^~hZ6*u7t$({xoJ zSmB?h(;Qfm5%%}T-%ZsDp_W6RlNzWO<)*V-Ck!Awe_R}fGlj*S_Q>&3 z6>PwH*~@2~euc$h>P``77w29=^N8_@fW4`I= z3JjxG5?SUPcCeRA)}x8ymod@1d>sVr*ynPIL;)YSFP6f^e3vgk9=>)wbl5OJ(nvC_+D;f_^mCTBa`&@ElkqvcpSH$$0DlVN761sxvm)d?}- zrH9~$71(FPoHM(NW!DRw(&t5zwgDC;<`^kT0ArF!1Q9tt>kVzYl#mriH{2r*AM-*B zsXn}Hm{m*_8g9jw^PaApiFah5tC`?&@7_;0L@gD243*pe_M!+;nldIW7SU_w%j}%< zmLLB>^TzrcL#ltilCEZCLq@lx^5)nb9By*1G?Y`^l=wptu89v1-!EuV6#(lF?^!9_ zKr!?hO|SN`&R>9}j#;&X@#1fap=U#ts%!B zBk8)cB>|)F5NDCGT(~xD4x1Z8;`g+sUC@S^5Hul5JW04N?TDeceFVVr|$%& zXxspHT6=~`cjpFYRmVPpaB)uwGnxy|8vhm6;%l7#bxokyHaA|GwBmucjcGy&u)O`R4>-*UEy>COGh2> zDrtekV_B}fdNT1n;6Bd<)f?Ntp7Y<3vv24fv3L0xjWOG$OqhK7f*v@VivF=`>-Rn= ziT4y5MO>_rH9;2h0>-^mG zS82N8dq87gYO%)KoXj05&^Gq_td*5#ok)H26Q3Nhy25`FdqQi*97XzP88(?gz6Ay= zIrK_=Uxf-i(5z-N*<#6SHXRDPM1ap&b`siA6#1v$DxlV;!0OyPv>z#$y}n$}#~^yw z^xh~yjaaj~z3`3Vo&#GR-Ex&yg4(C&qhvP^cXe;O$p6jlC6gDIC8CFShrLFGdJw8U zm{gNLO211{mp7+f^y+s1l$#?9E0#u?E4fFe?e((U(EI>@J!fCCDgynYsAChaoI(4e zo%deD^!K-)!@0+p`WY3hf;4B*JJ(V{)B>)y0Kd@9Q!3a@MAXpt8WzZ*VHjRfdbtX9 zslp|v6wA%ryxBom3HIY9e>#=OK6-=5Pkf zLTHf6Du9PB&s|OqZ1t|ZUwxZLD27k46)=aCSAWj9!tr8N^Zq==A$Dr=c*kKxT8iEo zPTnV(uYE`^4y_@zm#mpFEHC;?s|-h?Vte&sei`K{ZYkg!lJB$z03oQ6r+&r)odYZmYU{ z2LV81HkrOJp*TIO=t@OqfGaD2<>@%yaemsh<>trG_+X!Wd&bKM) z%!Y^>Pkb!N)nD$IdZ%`;)3c@OLG>Ap2qZhZ0OK;KcP&4|w>`zip5DZcaewH3J8;T0 zgx8(P^gI7K)qPQZOC~;yVU(F>fL34R##hgs*C|^n9rPTZswa(gaL6s%lT_8}_;Gy3 zaZY4L9`y$M7G^9@#yxWhu=ntq)!Hi-(Z9Uy?#q23E&Na(=&<|u3q6Sm`o-s$3X9T@ zYJjL~8gz{>=#S}@`h1~wNQm`m2Ew)ds94j9h7aS6Lt*!3IN9}W3{LjGq-^#bea?_V z#ZWUskC(eR+`{cBt6)$D)4u@<*1zzTTWK#+u(|K$1^`W&?DtyU55MYH6A?0lbxch;ri_4>8f45X{#`hb9KAomn5Gov3om* z4-)MROF#Er9FDAiAIBRA04?)F+pC7==yWOPHoQWGFJ^hQ#|^(BDZKfkR{qan9-xt# zBHu~#W-Yyi#eeN43-9J9#k(kPYz4Qv>@)PW0$y@4Pu)=s;9v9YDDu5=-+nVsn6D%< z%k9YLp0M-zF-sb0xbmv$`d327$drc#D(-ft`_1i`5y_7xdi}6fJ=&3&v{m~L*$;0b zC^;y|`YJkN2WUq_izLNHmhznCreFM$(? z5|1+!D1JC?0s$ z$n@wAkyzX@N{?evE%|&`=UA3a@$j21v*o!k54+PoDmiBHx$fdp-hl(jmx$%D&R%g# zOb3|fue<*`7mK>XL(5AVYKJ&)!A(rf3LAjR8ZvDMvKA5{K8yOWImRbx8wzz1NV@5ioZeZI*R4jc_`C!)kA?R=J_H)MrAk(|@ECy}N z?0RDD+)Qj!U%?5W&$M{X5;3mQUUX{Vr&-WYq*cPtp*ODcczh<3H;OnbiHq}?R9iaJ ze5{$lL27#Vy_FqvnPd?Owjp>79R}z643@ZZ_J5^Bh5PacA&_f)y95mB{nPaTAKRF& z9TcgQD4TCtr{So%AbtEZj99qZ$izE2L}^^bdRF3PNpff7s?p$IgCE9*(~jJz6f%U& zj5PZ$dwC(37X432zoRy%I3CpfRrjI-ug=CdG6>c&%kOn-Rq&aeHUgs-i1@T7!^{#x zi0{5~%aO-)1FrS^oO#*pUAgmNOsexDs{_V+y%BFK9vX6G?YF|?VLsCR&<)P?9 zAv>hShK=W#p%=BZyB^YIPa&6{H}@9}PFj@OR@lXm!peEHXp}Kpd6`_i?`zHi3JhSY zmxTNl1-4oV4N`>}P00KA;=1+@$xA1Z|8s@kKL^+#C6s@G_WGLUi`bd;>uKwXey4gs zMCs`I7Kxe;Te?)DI{k@m)9K;^<@UrQ*M5pviZ&OYa~K5WCSn|)Ay6MGq=8^-;7e4v zZ*!Zd$li;9USM%F*&TsK@HDrPu?(*`;}Fcet)+XT$XDld--e%r^~TBz>g)Ee9f@RX z;i+gWm@)BDnNE?VT*J7gq4rRi1(4n4n>Q|OR#oIP2^@dx`m>~E6dFZ&IAPCwxnWlk zf}uMvUu!=+_lV$IUwhvsU&{E?_@^3=V#;L*?k$^}9r3g@8I;ine&@F_zR0OJlMS}k z_T@OvaO6#5=2^Y{;=?NGEDMBxOL^|fZwoa93)Sqon=ODLI+cCyZ#;{HE0Aik9*h-g zC*qz!`SgP$yc;VAT8~)A4eS#09-scDZFi75kx|r~)kdYL;B7a$^ME+pzpGn# zQH0mG>+NpRX-8|OBX~A*kiXiUPxEuN-=mv$3+8J3RvH}9bGX^nXymCJ4RtOU6jyN8 zPwE~c^j;!N2IiEdwRk2RLCier<$)&OHZ7ary#`0>Jc+YAEyOU z;7ftwL6M8rxLqoQ1G4ns3q)J-5IwIc`b*e1?Ad}MGE;kV42sDvZlJ(XCv9v{&^jXL zR+W2#wVm=cE=_c;cKQ;(?buSDkG{6b`+OXVGegG85@ti9arbz84t6jzmEWnzBbo;a z%(EQ}2l6uqnz#!@-vvw=Gi3PFzHd|*P&Nnl!tuC>KtUMP*Qcd{<~jFWfGSY_^d1bw zy&RYr{Q@dup8xcH3X7w%{=i#q^x6hdM>s5m{K%;JPc6_z*k6M#vwvDvy)9IpNUckf z9KZOs&`iF7a5Si)T=(qy-wTlLCP_=zpSE4T-hnFTVG4>NUwWMDrM^#BIP@C1g=p}y z{Ro0*=SYlS&|5r|*7HEI zL_FOLx{{X241*z~Tn#LFNa-Bfulu)#<%(1I8oSb2A8&ecgLj!p-0*#a}oYaTuc2|EPceBRzNPu zFN!kLSB-jSmIow!72A3+#WO0-rC zdv_~|S^_B9T_&+1unk;_NYq2^D-1;9lt{3I8n0l-B4bwZpq`a~NJocv6tw0e03E_% zt3{+kZ*qNfv|MYJ{Btk19RSxzsEQT#fNNOUEXUdT0>U&0S^Ba=iEKO8hNKW;172~V z!Rx-&vm~m)2|QGhixg;|t$zuKEe?^iW#yCkrUUO99eUA4xbvAoGkxrG; zVYj2nI`(Sdj>unw!=_-iU0yqy?fdob9r3Sb3@{PyJ;il#S;~xc`Se+>{e!Lj!%MB~ z%C~^4friRzfjxAR;g7BO!ysX<=oz=`UZ&O1nK8>39AwSG;e_bSd)!vbpNI%;G~vjj z^<7?DDrxwxF`|356Yp5bPv44Ke-oWZiJ?@E_lWyYHYRCn%+I8o)9BGj`8JtZhhitV zV0r*v{9Sfpj2jOR|FxzmZT2%1eYWmt{#|$tI^zpeol_n+=!%EnTe_}L+b`PUBbGK^ znJE`tIb-Inuz|npC&FL%PI>DyyWa4UY9jPqudP7S@h0#^uI1DevMbG?2z0Q$@8S&I z*un$pOO52Wg4X>jz;3@0fACt+!St^QIIroj*gew}9p8Sid#8%um&rM(;2O{L9&!C+ z_XZkjo6A%YzVF-vI=Osds@4Vu)Ef_ta3?~;557C(pPZ1iv_QMkm#7}$F*EAy*~#u~ zXdBRPMd^$kDystQlS9Ly7x}WBc#A9XfG&#fEDo+9KiimrS=6Ga!C$F4mF2=@>xI4Yi!0VFCyHC1U}@B zf#teg-M2Y+)rT*b_GAUXv}f{6-u61XIu5)u?u8r2No07Req;Etk6n?0AX@eA`ZCSH zNhExHLbDrZT0Wq2&j4Hsi!l9k1d@`-bh7j}r2=UlJ=}lM&5@y*dm zX>|Mf92N*Z3Nwy}dOYuF7ndprlW3rm+DJnxeCC2@LT_$Z*vFfe?=Y=LGal8X<1h7y z96MX_njJl?2+<_&#_XKATm-OfQhwr{V*mWkKWyyA%Ki^+?;X`t_iYU;iV7&8D5!Kn zP$`k#iy|P>M5H$n=}mekA|mk61O%k_CQW(?Buej9YADh>7(#%M_MV_VKkqy4{qFew zc*n?K49FnoWbd=rnrqIv*Zxg>S4I4X_+EE@HcyFI_(mkw?w5Vl0k)d>64s;(x5xZe z)WEcm*+RIOmRBz%^_idAder%>VoUbgu2**4H|pCOqebS4PJ%YDTo6n;i{a zD@E{DJl}3TLz31;#rA!|I%%sx&L=^cpFERzo}`4vwkEv&Ylyw5_1r6GBQ?|~g0gM74h=;82I*x;nL!lyfru-_bPG36j5kbw$MX zT0&#dmH%#m0D_A(>3d%CaXPofAd~c`bmVSINGD-*gPxA8a-<+#1`=y%#pGil+M zc;4bhD_QK%(FBo0^8`p$uFZ1HG4xejLJX6=M`D9qBYk0U+#kkVq9>3K?AL+)Krr@~ zlf=i$5}no)&t#)i4ms6L%)mDbc~{KfY3i+c4FF9KB~0_p5e^tduP2;9JL0hY4+SA* z2!^ColNka!I(}O^+zGfiG(WLp)q>a{oCV{ zMYD1lFft!3_Ar~p?%;EtNzKW0=hu{QJZ2SmzG`8!s0y8$9HGzUo z9mEy-Li%BALGyd`3s>Nc0Qt@^Gut_|?F{ztaPr=`2IRfRJK2%=kfgYSYQ#G@3e%A&PLPKk9*O?To}r1sU@qzPqd)fs z+-31c*+%7VI%l`H2!|Au(&H+_JMO7d)vW!66rJUU_P9^3=ezu(^|oIEKAN~+Bs?9C zr;iOCy^bhfOB(lZwB@OaLv{J|mCWTDpWdseE=p%xpht_8!JG2B(fF#flc*h2Jjedr zlk_ygELWNRc;ML+9h2!aX)7A90d470P9Hsv%-eQ_f{!YVaj67-U&3Pa`W4GxI^GK* z;I_-!#hq#Yx^3#g zo4o zQPeq9*Fye`CsQp7I($si3HbSI{Jd&ypRJ^?tIIa-&dB{Xek}rlRl478vEVP%em&yr z{6TqU-|2Ck*F`v++VzF78fnw&LJ%#aRBd!TYQ=72gX}Z$jb`j}Gvq#P(|zBgjh;Pu zjP$7CN)e&7EE7)36(ud>l)5E;50>y=iO?f<31|aiynm8{R;~f!Fap_;?p$tX z#a-)>ycgPWnBJb-rt!>iNMvREM$ZP+X>OYiH%rsO@&_dL5PMhFj|FD`-3@B_?0Y8q zn;;eOU000@D4?zbynl;rC;N#0FE%=}!W-%hD|7s{0g0~Z{xtS|-T4i)-|jD7y31&u zDF?)pP{L_6B|YO04@SGN%io)!jYx5Pwp$f{wpBuasDgZzB+*pwSYN-7wiF%*x^U&A zUql}x07{7b^TAq6*jT?r#L0bQVt&J|fMuY?4AgM*+tA-Mqch;V?x2W(A}!WlZ3;V? zm|2gIzL1d~S(MQ73lC`D6OErj*#ovin9=H-$B!4xqrDY-o%_!iahC2@H|5uB%ndsY zbCSP}=zFBs`LsTlT1??9YnY8d(~sX8C%a6&%YEVjL0<4h{lIt4v9t{^gVioYXq+_n zqMrjph35ztLJ|(?fA_K~ehVx)EnWHkzeSAOw7{l|xo=BhE&qBHM@Z+r0m{L^zTBQ6 z0Ub6ii4QZr&g&79pp5RL>2skrC~An_l{`2z*wbL69`#l$b+|&zWU8o`%gHw4`T5t% zj<6b+l~UW@IbEI&qQ&htu_SmQeHwhIVe98i9L8341fMTKf8S@ocb8KCw~^&*B0$yp zb9_&v`HPyeXa4~#R|Pd3Ot@_`$bWq){9%&i~4(r=7s<`+lG69C`vC2L5U+Mpy?E z^!9z!b$Kg(hsQ6khF|gT{bfVqrB;s_SRbD8nI1UPvJi z2U@`ts6&KDnQW2`;__ae&moixuF&kB>uhUVQ9fX*52LR z=uOEva7AdjzBj#?eOPj9`Y~XPp6QTlXnJN}%E@9Z`5OVgxJC^6&G(!s{|@@)z<#d| ziYW0{+v8D}Bk~t0V#@9A>{2B9V?Ac#(P1H}v?!DP=GS!8Amjl$!EF8Qh*Mt!N{4IL z>uR;D*IHbWi1Rz&5^E-S{N-t7>ye!GZY+NB-TQ36aw?Ay#cM>O@#`1~0urT<8Ci3c z0oNuCE$-p+G1+ge+#B#={=1X5#n3d`u0&3vZU{zjpHdX~p zfY%aUH2H4*so5U`5?Yk&yr|t@Pe=Q$ACR1dpb!@j?Wt2TW=fA9JXd3c$i;V4jTX)( zPpvnX@4j(9*&KCSRNouYxJB%=24bRyal0fWzRZ9WKkzs!=N3!am)d=kNCGdv^#VBH zw~f7^de+5E@yy+(4SmAE`xBV-f|9tHG@;;+jwBYF(zsyz>Dl*|3z#_|$u984{x3lZ zdZ(D88A@TZ#y+Z+4D1z!e>Q3SqVK&Aa}bL3IceDjJOE#Is6kwxOa$!6^vAj450jtt z8N8joJ-&_6?S?dS<#^lMZ@&r$y5~XaKN0qEhek@WlF*`)O-=@6N06u~1kS8+j=(GV z`gKum-k*(w3d9a_>=bRLe|z(_13Wb*Rx`p{j6PI;95bghZ}_+ATgiXd^o)$*s5^ET)Xd^S!2=~n^>|H+A@g-8Ynt(Ca7wGl#OS=BLMx1PaGO_XnDnv?Yu zPZCVIvx-r~|764*mH~j&4&9#dhq6uK11LJn@U+ms(8vVSAIjEp=MQBYR*HglxOZcd zN$muBbft&@gnf>+w9ibW&?D*Qz={u4ORTEiZ^lCWekob<|H9k;$X`5S>##Oq9!Jv@ z5^cS4fMSBl?wD$+QN!37jaxRZ9i~AMf7(+AEE8oohRv@Uf9J;v66hTUkl@Bbws1ll zq+Dw!EcWlMXj6U5!cP)mo_#>9&z57PPJdh*mi@^5cDRvEPjej5o-E1+yXpH&J7WTUF zdPwB=&ebOj5FAu%_DuGDqWb<kqi0)@ zS#fjd$c8IrhfU;0MoqJTAaiD+R72msJ_Ma>m?VZwKnZDVa_M6;pHI2~m-YeS6 z`g0WP!so|qG(Qru%RK2c2_rZK9|5{y(yzI`e}zaP>)oOJJFl0M_X4}Zc&W#M#_nYx z4qy+ZGWu=B=BT@sCML6{S0y<#cdo`t-@|rHO5Et0O_^%0 z`3Us9o1VewcR|+K8da+)VN-lR=f)&Z&cQ{x-K6SkS!QGAih4ROa_@;>(*n#xEk> zDpwM<`T@2t3&5AYOXdlxJm0G-UA2Y}p#__Hhog$Om#f2vwrb3eZzJ;jy_+|1B2pGN z2C|9Ftc})`$MQ~Ll2$UY3eiqrAOiX*S?o^s!Dz?Os}Q~AW7p7t7g3p2zW6(}UL&5A zUpl6KwIc+IGG-D57h*gh7RFx;i3r73O7!MmIY?XWD_zj$py`~vZk#oJ!^Ea{ElL#C zW-tzjjvhz#tUFDjCdqN}Gn;^gu8VC1X*ST4Zb9_e2SC2aP*VRjo^hP6|OOvAUY(<$o`o{t$=7^~CHa!!HW)PE<{GG)HAWqdW{~;*3 z(*f|gY(Nuv;XiRSAnppV*$a9~&*W<{NSFM9pKpFF29uS$F=}ZQX4U|M3lR26m#oaQ zr@%uJx!6wE2$AKv9hEqtSZ{eP8jP!lk)xo@MdJ-+Tju(ayv@9X!uqMy!iv1}NV>WO zTV|4l&>oYn6G#iBe zEYz6hSkcOhK!*hyXU87UHEDLAMyx}=36<`W=wukI@ZRM?ZqL+z;ToMbu$La==mV)v zH*U9L8#HGhh5>t7=Qd^(rHBs(Pln97B}|9w50i&8oEix_i8ba}d^HeQojDqRXVCwl z=`BEkA0`x~ZHukH%?J7Si>sR4kD!Y+%9F0#V{#;VhMm8~p?OBrr)m#iJizAuv_kz) zN`dRLp7itswrPP4+t~wtz8lZ>P`Xp&!d1g=>BDUASCcRAQHu$~N`PWzw7UIQ7l==C z8D8RQC_c^YgUE#ek!ln(O@j)f#j@1IcLq%fUqYd%ig4W2I1%?H-VFa^Y}CC6gaqYk z28N4&6{ba;)Xel7l}J*>?GB)kT0{T(Qy-JY=k&|fh3U*OiyeQ>4leiarzadaq_uGgm_u zV2jbVQa>NFfBf0% z`@4}PdB@+(6ge4SdvSY$c$vqmf4q}_;y2#S$~(3SvsYHSySYgN=O-+j6i`tr39iu~ zDuqL+a*zL^E>gF&(Wc4`_fq=6#mmq#;jTG8OY2>Br8zrYPZ$Bp1*mrc^Q6FH`J~C> zf2fggRG*_R0401>U!CF*zdLtmq~=%ER+F3a5rqo1r$YdQYER6shvL3JFuIE-a{Ye_ z7oda*$fYd+kq@|hK{T897L^^QHgFrCif}{r>ePnf%w}E01dG0#6aCo~A+?YBto?r& zRNxE*L0(}#IQS2D`0HV4*HS~u2H$F~+W99V!{2;FLmOqcX48??$%TL}}Tkn9cHU*U&KeMWd^wppAA4m~;b~n4n>`s-xBo4CPl-OO<{*3 z*Mk1-@9oK;$B^_9-7!sPS$J048V{H|&?2qLA7m+;Rv;B_IF{`Yd=S`E(+q}0Ne(AEVKT; zXfr$hH!{`F2M(k5_#BJKo^@Uvtxuftj4cyBbkTp(lfF?1khv!qrsH4R#Qy*lC_~0M zmnmW^pH-J_O1|fHZl9ZT^-}T66#Kh1eJK*;ZCVG=C#}Mcs;49sYek$tHcl5!8>OT* zgrw4CdNrfLX1gjsitm+T!E5g=cHbAUqI*K#ir1NbTt0Iz>&2kxG2e&QDCM(^XV{%i z6NW97R8%k(%B#WP5WrDaqJ$0J; zR6yg|iZxd)@Zf^a9S^=k$4`A0&j7zh z{nUDQmW1UL3CkcY*^38_aSFIVD(Q^2FuIZMIIi_hw#Xcf{D`bGRFYrfW-m360;B%# zD~Ree&`Qi!g*PgwHAlSG#qioE7xeLMErZU)dxOP76SHGRv)bpPO^!8iW* zpOHuoHpn~A?p}?!ZQvXuUU->ar>E>ea^|gxOAZ|J<|1CYw`+{qhJy=kTgnv1`n#su z)^6`dS%xU;Twy29#GQAtr4zxp<+PVBE)vmmHi%SGL=*%`ZfSbkydNj=W#VzEeeA39 zN-s+MZ6j*O=_ha zqWCYoIrX2{N3MYPKPH}H@VFZ)Wn0%u!c^kBRxRnl6}lVP6u)IFHG@@;A8}1tZVw1U zt*%p{^Y16+`rbKS(aMgU1Q#AYIDdwtBT!*v?pt$h$)U-DUp>d7_-X)PaV=|!UdIQ$ zKe^fx``4(j2iSR9JkK41_7?Hu5G^D%lW>H|6f=nhbZ&(daW2k%b%)Ipu44ZhF z&^f9xbyW6wldb^Sx&9p2wpekAexJAuPLW(wI7P8=n`uxZTVbdx?6Gq+aX^ffV}^%<&0;YWBwkkRW-WA6*l z9vYr|w*#xsNn5j)x=bp!EtZ+rIBic+w0yLS{f0F}ffJbrQ^Z^f zG*|np{Aa{BMvHWcQH7fM!@Y?DB|F=-b2X5*>Tjbu;HaItMK$qu?r<3W7VS9d!@pVU z?lKT*TS=}E z7wgrBFU)X-^Nt_(af&;d^;19XT@&F8?~W{YTfsgREd3oh;NykmZ^-7EI&(jHZ1i<- zD~Z>cvbF`7`{;L6F{Tf(ZqhCOsNmPr4m|3*)S&t6X})_G^sCl{7J?AOPUJUu(mfYK zt6p_o5nuWtXSLl>eFLQ~gA+vbBO0c}r@nu=o6SW2S9$@Wn<9z#14H-wT}$^@ix-zb zc9m*y#Jex)t?5W#CHRK>5R6Ud0s)wQhv2&8?pjX$BzZfgQHx5XE@hMJV)t!)=DXST z?2dGxGKzK?D}9feymDOIdnwCZey`)LXN@g|H}P_hIatc6#`hS>5mAd7y9>+I;M@qG z=Auj|E_<&H5*z#$n@5&M^q~nIs7q^U;YMgYHQ_?khX&4^Fv67Ew)_kfalN`|eWg0^ z)=Aux&87bO){{(eFC&mL3x-FPxdO+24~^=WFxnF1rj4zwbw?zlE70YB1XwaxidLI< z{SOVqx2r$~xPxtYA<&lfhVawBgXkOC`pX|ILpW6px>~K02A+pR)m*-TgLGN-=}%Z0 z@rrG?zTUs+6y-nYq(IP~pKPCf3YCAoS_F5i7`J$lv27;;{4om*%=XqT+0#S}w0GqP zsZ)Ii`;1l&ucKUd1~s!i8~-s#8m~lu*!kMtgg?w3yBd423ND`wd=OoJ*~g=tJ>sJ- z3qCqsv)z-N2~*jX!>r}4g8W$~c5Jxe+N@<-1i)$HN8bxOMcb+@nua@Od}2F}r<-vb zHxl&PThi?bqXXs5w*(u^$Wci>qTy5vA9XR^nXVV~$9jG)5&-tsn+AKHV*&iu|3PWp zF#tqc2A@i#UP_5oF>vZv+K?~hzjjdf$Y9gBRl!;7T1~#2J}q;t0JMW%mywS4hxZTTp$$g~Xgm0iSSt-_JZcgrF zZ8@QrvqMRK&7T8FkhGlSu|gy?x8B?*jH2Pi4MddbtuI&U{5+_>3)3`>S?e7=iG4XB z##somc+iL*iL%Y{_VXL1lPc-2G|QP`##|E*(I`Kh^Obr62?56}w!cK@NBDTAxO4k_aBsvpma{5v z%thQ-h%y9#*eV}SW~UXdqKH=>tAor9D;)XY=)!ptdH-ZthNsdTxJZeej5H~q!3|)e z*PAnxUrHRO>!Kqi_a0AuF+GFYnSnDE?Ra3iIMbh|OZ%-=4oGJ^`XiGC9cLxy&YJ(% zfT2v{{HlSl;-%lCdamJaX-<$+%@8E3Dypi({^!{*?ADsyO45e;sG4-y1VH2NE@e03 z+^)^V17qWuCe`~|*vJ3jYkqNuZubAE z-yaIc2g(R51}lm8_wvYqx2P@Eeq|KV(|{jv_u6cX3TaOWm?8Kg?@IjW6hddF5QYD_ zd{<;7-pf)GSwq;}shSVIw}ap8tkW4Mfh8#fx{Cp+=Tqy^r->m2arvK)8PTV*?O<8-Ua4w-Bq97JXSk6m(N*d1|Ro1T1<( zP~8;Emg#P^B}XmH#s26$b3v=YAD=Ff|JS5jdiGVqb5YJ~z8_vZ8HjftT_5OkmvrKm z$Y@pHPq9r+W^myNnT>mOd>@=T;lhin8pV%*La2nkPe0xaa_A6jAaNcII&<@sLUzRTo%9cd;Mt0ofG)=THeP8Kx_=ya&x1T`WUvUs6tZ6`K4VuGS& zEQB!JE~Uzh3$2kp9C)De_Q*_qk&6EFJFr|uva$1sH$@xRs6+DM=y`@r5YWu>7e5sBhzO)8VXg7%dNZ`VIefo&F3os88KFnDRei1qd-f zWKkjSdC9+8AM+h4cq`x6-}~jL7dvdlRK|o)%H*wA%QY=5WKqc4m-sUpR`TmcGLq|m;WP}8p zNNEu>-^}0H)RCA?5l2GF^kU4Z{;R1B*hissEvp0R>YS;r&k7n5@9Edi%U~bqO8f1v z?}u@MA4qxcUvT>!kblS1jA^npB~vuFtYc# z*OKj|r{c|PXbgC3QTR=TF^cB5dqhAkdj5HflDdUW)%-<18ruGcMo9@qvZa@5bvF+} z;9Q+mLw27H?Uy$7UF|c#ikwNVY6Hv^3(iuv&J!!6<_lN%>aJTWEnK|YGo!L^=&*@U zwDrSRQ7ph|aqn*GNZAHoL3E^bFgL$;>;MZXhUcoa5ajXf(Sav*#PbWMxkG9PWr0{2 zT;+*)c|7u2W+)*NcjXeZbPBPne494}I4WlyirL9#m3u$f8O>(h{qgQ|BO}Jj2PfI? z-;C0oD%;Ym*}~S3^rKD0E*qv5c1dTc?~S|Z*VI_>My8we(G-5GGJHmpsfHC(Bt%NI zT;^T(AcFB|7(J;2kC>7S9xmWx-QVaD$X$f&APfVo<&F=1oc@TP;IZtYNO&&SNFv$qn78BSl&x zqf)O623@fePmHcCRyhsi4;Vj$NaHILX_mDwgD)5)D}Rf*JcY5qYE^^58^Z39e)*oK zPio}?2H;6{%q%yobztN%s0r6D!wXdJ4h9?(7B9OtleMf-m>fN%Kut9C?U5X{P|2ta z$N*;ppbiYG=36d(FPqDB-6}t`HnmxryBH-Qjku(iE}a?=GI3DfbuqmKODg1&KKzhh z(wlWmJg_8Op#SlH@Rh$-{fjwHme^)~RNL;S)mG6^wcU1$rZfQ>J?GL@cJqEQCxetn zyHAFS_HPTPgi+!Y&2IVnru7PK4`o)cFvU=w>xf8%2Qfq@T$>JgCk}bkuMFoey`?1P zJ-4IVxAwHJ;Ju8-4?4l#8=KSo4MlErl*g71(qM)}2hjCKBAAo?c9#9XGy~DJYd@bD?(}=5BS=o4Z&ppIe_@u;PkvXkLov=IP%XCbiXx=I_^iZU- zr$YldQjA20mK=;@N7|(fR??LE;Din#TX98fxg{bvT)kaX{7as`jp*Sp6ObPZIo+5= z=4`3uPar^mGbfR$i29)_GV=&)_tVh2KSc}xmq&&i=2{-;<%AL3;hf_fGUPIw6>!+r zci>1SZ`7#HI;RYp%zma}lqns**8>^>x)-+$v>#7R=~qfLCgvFm1$i@1NEFiqv?PMX zkt*T~A#9I=82);yGI}p`=6vyodr$r2vHG*MOs&F9am&-0-{2+v%zG7^jp@TUcfB&d zHcA}iuEIP!5r&EMGFc>;8rhyU8o4uI)^K$@=E|j2cf=T0A~TV>?60k#Iz9sgHX zH5M&HWP00nOTlh!2^v^=M#!`6Hkc;3{=YmmqW{nf+hqh&iG6ann|mN6B;<-ijl)S_ z%nIT6N7R$$7cpByKbpM#((o76HwmG5NM~ z{9s6|dY;jW*ScA|Z(N$+fmmTyu5!Zg7gLM3y(-Q^f`U&EcV=3|FZ>~5o zT+m|Ywd!4n+;=aPz=N%|C)ruC+I2enyAz~#XSLouMh@-26LAkw9REX~GC6SspiUpp0ZqxxN=#h(gj_M( zwFWauLbhvPS}4Ot6U^oj9n1n9x!@5fib$}Aa;AMk@Ttk*T)mg$bk=?ZVg?)BHe0-< z$^C|Nl)jfa%6JoCvs9@6lF9Fd0mucJA9I(BKw~k2p~)ORx5_WJR(o5R|6B29B`Q`m z3cpA*WX<_rL`G0h_^DGre`uns(UBX1KkBaSG*|8CSbfPTk2NDOLfFV>I1(spE8{Ao z_7}Q@8jBq_xpKgga*{WVexcb5rx`I{nmi;fBzNYm`h*x?h!+<1IAo6Jr>PA->OhRS zRyg(N(cufh7mfr3Kn;+)W?vU^uQ!Xk?hD+6@fuq&k6B3=Ty%}21=lTag~a*p#pAKt zpFbC3YK@}?AO2!c3oe|n1@~ut2AW)#m$--paFuxv?Z#lHTrtXRb4+6n>Q@p;H!vW& z7_RFlMtk&le-})^d>`5hnXB;wT6u4SBb^r8hZ?<*1N<@gKXnG&&H_iP%*F`W9()yOu4zgRGusyHZ?3gop-c;0C*ho&1d4PMre=K zAuLQxi4Kuc9)UNbT_9QS(%5$6qs<94G*Me@c&F5=uc&A{+FbkeZ~ZL$Fd$mVNj4m_ z1Q4S>>)Cz4_YH}M>d5odLtb31d?e(gRD1hSa*P!pI)UaE63DwdEvPrAxB-CRWCH4} z&8)pbOUnB$+*J0%66z+3R+(M}g>TVw;|ntWGHx_;A9_xS{VF1ZPI!j%G3ku`1JpA6 zgL3Nt@a?gx?_!|u4_i)=LA27i&U&qyPkc#a{_k(qa6IY)l5$~^@7rk%j= zUq6?XWNBN?HZI{>wU!<|_K$TEUz4bp+&mq*S-lV!7TDW5#Vs%6+q*p~TamiZKY;Mk=>Sf{u z$Xl5s>0*b#0wpvA#Hd~vsgnr%3F#j|e(Pk>u7oFB4(=!Cjr{l)XgyhB9?CO5Iy$t{ zm%NVXNY6kHfC!|BR;t2}jRGkiAudV$=Hz`zLR`h$la-wIQ&o4lF%Kc`TCUsGgoiTN z`4az8V=hM#$Skf^LiMPA)xSIMaN9Y~jb49D+8Q+_l3olSt2j_D8i%4^&D6wKo9H(k z^l@(1R2SohH>w?_^=eDZw-dC>{E%G@_B^(*D(~%N^)Y)}JxuPX?VN9ggF(*}sKgkv z66*%nAM^iz{*m0fx_faGt)R{QM;VlE8X;BMbg5d?Sg z1uB<$Wc5H{%3@hk*ajaV4DIN_S~PA5CUkS>7XUZr{^bAH)G6891z1;Z|bwqJ^Z?(Npj`B!sBuYaM? zms(>b=!@0352sauJLRl$?At9_a%I;taBaMek>jIo?%jWbpV7U};cjyk>x7$xQHgl* zf}OQ*2mMTc0rZ$TGH?ceXvkQ4dhy-;mN{l9xL4jB-*PAe1v?S$O5<+~f5U!_hUo;h znv8zFv!To6dkOC7qSs5yNN*9F8?DP+{uURjKp?rN%UQqM{NY?Cvr5nK znWCluGM+_>`2)=Or>ReHzZ;z4usPZUF$8BiOY1fzahO~A?yD-BQb`;c(t53N& zO7~k4&3RD5!4PZ_xP|J%9kATEI#mdNmt7bAr@@PeU}o@7Z#&yIu;YHBDL$=Nq8Z10 z2*$L9U|=|drCqL;mRs{>{G8=KVoDz0EBJ>v7;@N=VZ;D{4$WUr*+mkkwTU}~>ZV`_ zP=KUOI9IV4-%!ls^n2{Dc63Q(TJ~_-C2B@!xXH)Edp?M6?W3j|SzqEnEfmEwRbx*- z;|{mKK{4z5@whWOyEp4dt@5=$b%_b#!5Tz_bduG0tIW9q-DUa1TMZxSGB*IS1<&bh zhz_i93a>F^(fU8jSP2b?p5tSLUv4DQ&i`fLCe=8z2?btg$wb6o&qM}V_T4G1Pu=b{ zZvJ@D_8aUycC#I{x!G|TC*EI)4plX1#CrzUK{npKoqzQR<7j1(x769J^o&!?wz_z` zUMfv;B?lhQCSnxfGiq<82miwD7Gs<02&X;X72V1WhcWhjgW)}TrEY(EG@^Z3XH3Bk zRUqb57%N#}X)xw|Wm1(r?7hooeyW~zjJ7=gan#zQE1J>3=~+kOMQha`ylW0%a(*%} zZmCxz`GtyvA5oj?(9LO+NP-6d(y@MMyS4-uhlE(i#lzKvl31^-Qv7Kb%_@hNlWD5WCy#~w< zqA3~7+SHhJ3U8Mp zJPYVo=M!E`*Gjs)qnCsrQ#eZ6@@bF8vgDCL$6kFCtmrV}mW>d-7D zjJXhjT1)Txu4-tbc_1n^o1b%e)g);2 zbe5P@U(yOE)R7{BAL%)~d$q;D%-B)y* zy8^9@cl->9ARNh-?_~CWsM~+gFpqoy0|dcdBn(u2pS ztebCXPVmkzRav&^%1_Q93NHcghsr%$T;^T!`JA$DMyxor@RUiAN*7aJ-L1Stzej!de3$5VX8OIP;zs@i2R;Ymv7rf+f$HMnYQRlSJ?KX|{D`5O(Sf(66Cw5g&p0vgLZlOQ%nXQSy&=K3QQQ=^K$s%f@dUI!( zi~40Q78DkCHN3#X=kW1RARoYm0o_bV9Ec#5HNk)DVF7*#vZYF<;AcAO*lx~$;vdQ{ zI&b&f zY;;2hkMZkoq!tgbp1 zA90>&$SyQF?~~DLigu}?k|ML8Yrn7t*@^c23xa-eyz+t6De-HZ;cSV@QTIFERcOS7 zb6Szw)`Y^9+5sgjyN7;lPqG^p%u2Big;iy{)I>j5!sVM#uV%~5To6e%deCSK=XrSE zmAf~?Se41ZZU1Gs>bH1R3+Gx496cFtXY_m})N1wXB7Id9K5Qk*OfGQq+705fc=fR? zDCB%Cs6HZyr!)1R&CB3ANX-{=*1N1ash`Rt*jIXpSD$KLfbBaCe92J!JwAr`XCH{9 zrtI9n~2n-1k)vy7mklo6Kpe&kya)Kmfwm z5r#W>JG;tLJNPmx_Ryyq`hKetQkGZu9gOG)U9S_@_vdIN%_Erzaxpa>N}!}3R9}{%p{h80sKVf zhM)QCm_H`L#Qnw$;p>?Ldv2qKj}0EXOwikUOLX%2YN-W|bI_Vj3FvuB2CFDlf^V6z z>v*x=es!5&A5&((+Z?*zV+}QKQd@I4Zhe%e8<@EzVUP)yKski)S$F6d8ztVo;VpJ# zmhe$NnC@gzd^!aRVZ*;Zw0YltXcajmdW{C$DV2tkpQQ(UDr_UD?3dKwEiddhScqN8 z5mo-;PZRnRasD|iz<}$FdG4Up1zvSh>qC9L9^jZmfr&_N|c%N|3j=as_Rief-4}R4dd1wglHqp4OW?wge`UrFb%Z z(zi&Gp>17Ed3rLDzGs^m0XLiTjQhjzd0dB86~oP|TwAP!tOX{ovTx@fV9mhpI?u7J zcK}U9Zi{9Z*d7er+%-8s%i)py==;ulwLg_&BPdFDb+LtT)FCs)I7}*5opl*DS84=# z-_g42!*%97lRB3+met~*o2zUP5SJAlp=gVOGJYC;9HrDphem|LO%Vsff?pr~`>Q`q zJKL-@|E?AknzC5vOQplmwQ117C#)(@KA9sMS zGedH+xX6B6Dp+*3TJX;5<@NQcosMxw{cn#tX1szbzr^sb;u&@A*vD&>Dkdf+&l3PC z)ke+r`vo7a%YBb=ss7%T|J|*BhOi$3-g3ZR=>Y3eQ}JrQI!QJUPJC;D zU15-MLzf7nrI|)A0Y;B$Cqd_>LJKDkNk;p$us-Y2&szIil>@_o{{$%eRrd+f$04%@ zmG6ZerXSN8d$LL$uVwT6>_3>{puc(3DgupdlxsAB`F{s^JHNxeg;XMg@#mFuYml0O z-X@iQ_2+c)>%lCOJ{$0@5BAuug|AXtOGAndry#D5X`g@tQ>~#~%J10@mfdpH3y_NZ1E7Gyec#=!M z&R_Sdu#W_u>mc||h>WO>@=dL5uGk|gnRC53#$f%EHKll>jTJOu_j+9W#a5r1nVBi{ z%rv-VlTy$Q?k3>U@>J4dG(i7Qfa=~b`EBvtJ<+88CAb4BIDW{;rErqrl=|(M2h*RJ z{kL|hF$}-}K_|C9{!=OZsP9pMbR_)7QBF`@|I9;C+i9BS8LKb(O}CoK#(o@Eq&|WS zl-w{8Tayt2Z^bz4Q2p)8BK+&i0_LbyCSLheuz-v;RG&6Ye-*P)F#%}lTa-?%%qtIh z2uBpnj-4TUIP^03DkGRZ!YIdf@`y^Jm2LRLi8A(#sEoa1s|O^&o6^2@_K0C+P%iNd z$0`CI1K$HESnJ+Td{t&0lmJn!dhU!cjJr zdfj7TlNL1s*Ef$YCl861OXWXa^fgpgbG&rLco1gpFo+;CZ~NJi^Sarb^x6qG#{#I_ z$v;ym{`F5?qdV*j3OLd6L-(df7d>}Mj>;Ssp51u-+wu3u$&e^uISf!Gg<#;+Yn#!} z;qgEMP+shasy)6$FZ{I3xQX8`=^sAT8H}|@Nj;!dThhWKS-+hB3 z#+GBk60f`adF}^B3LMvx4+tN;2h=zNCQCCJF_W3n*e2mKXY4HvDu8#!I5ZqD!-v?U1o}P)roFsymUA4p>I`0=Njzjh|_*L){8$A!F+&`e1|b~k2ECRyczbH7p^iP$PT>XuF-xsPF1i5uu8Tm5Hp_=q@97}aXZ zAeh5NiWYDYNIWHlDhyDMzhawmC=>l*^MBBR)o72+mr)vVO z*^WzV21)d_wRIVE@s|nLIY^Y9hCB{s?FEKxQ{#im1n(ZCxWpU-2})ynaq0m!6R=hF zu;Po7_upT<<$SWH0?1iU_|&EF8v<6x`|EO@G~=Gb6Xo^ zZ8`UMHFKJ}KoD^ENhXoIq{sB&`Ld3YJ@0aW88pA88A&*>2fTf^Qik{DMndO*IhN9i zj-_I-i%i8WUhJiNwyRvHt&^sA-rNT{$6BFK5S=kP0yEIqA1MFhm zqr>A1b}_u4`#vr~wKtAH_R}NxeXcK1Nq9N~`%q(I!Zih<7zb=H+lT<6KZ7V$|JD*C zGXRQ*N%B)Xk3swpKW(ePhyOBhgXb=E0w!d|2#%KNcUHr#_u*?s8dHi>i(Nu#r{dUS z?VqXb&5M`R;?6c)Y_fjpetTWq8peZ4cYoaJwI9VI{q2$Mi&g9dGftxaG(`(1-T$}MNPG5Qs}Z-$^rG~og(&AJ z!WWh_T)g>FHLAY@dUm3+3k+4s(Aa}`OJl1&4-Hf^^(9muE%}q{`_Z7*H zowG%*;omv{Rv;B#x5a2^x>KhJ1b6EQl~bo=PZ775q|vCGHdv!m^0F_+%j z3EWfEnEoIiwBz*P=5k$F29vA?Eh%HdY1ilPV0S_U?!Cj~ZCxhD|dm&`%ElWWN z`3B2{imoiXGObsakC{!TvHXq-=33@Zhhwc#%mTx`TMpA9oyYPAJv~j=qLJ}!S3hcB z2xy^{;AZe%%bdTV4)#9kQU^~7tat!UKuK^1V=Q*oXZKQ3NsWF~#Ecw?4ar z#UHG5&4VSiLkX8K%+xglT(TE8&r2QLZ4k6*X*cDJ%tc3ptR6&##Zzk*`K~VnX$*uc z5F}S`7oh)X^R{XIfXu2{rw11qOiqb0*~I@d=6ta`I$ISP*t+*Ked_Sm#Z2~-D-On- zvS%(>yvvRWR$s)Q+P1b=-w~ev%;`(ugNL`wsv^rOt;muMmX+y1clQ4ed+!+))z)o` zZV&`TvIHfIh=`IUCq+RdgM!2&g9OPr6o>=^1xU^)0s@kAMpBUkBC$#fkptC-GP7Z#>-uFP(Io-9_+K9ldp9*^9){#5`(K_GCJk$!(@=b$p^`u@2%Yk4o+<&*x_^3ZB#Q9D3F{ zJ=6D`IEhwOK_cY{WG(7lL(mhC%&?0{`*gO44Jbb|-6@vR{BZgcFR9n26y?~j|KMOo zaf8vo&PBgi$|m|rW=iD1?J-EP&#Lv81i}zMLPcDl9;G#VhY>VV&G~G3%{Yb~B}_pm z>+L&fV!Y^y|8u)C7hPdJk!BEF|p?zcB26p=6J?j9y0~IsfCGqwc4=qgcM#=(pJ0`?!t@cu3gDG0z z)H*^D?~ycKTcRKCJg5CBqx-DC{fNGs3!_6y-4pH1nn->9Jxtg-XQbKBsOmt)i4`ym3C6HW9 z>l&wO_p`gOvUZH6HPk-Ya>4)hmXo@9V#nBpgeUxn0@i`hG|9)(c#jM}65eK(l+VrH zy73=&g&CLiN#hn7ldH#cXkhWo{+oK|*ZXwv!$Z;LW3`dPk(0U;v8|}48Ua>suilC* zqIr+xT-CD0wV07ynvfEFkC@L-kO8heVg+8WhGlcc*%rsX-o^g<=1V-xJq_v2o<|Ms zw}Er!^q&lJ*gF{|Ko$B9?w?AWT^p027f|Lxo1oT7gZZ?1zZG0TtAIoHGWUERQOZc; z?7Y=}>O=m|H=zXH1Ufe$;Nztlr`ehe2@s|Ycnne(lM^I+(T;lUK9JRyzD_qH zDN$}NS5&wSUI_DusNbZ2Z%?M1<0`NAS{&bQ;gU|5eS&89dzrG@r`m1pde(#@^R>cn zMLx3(ouq~LUpZ3Qa3lBP#GZZ}a?1y^u%qg@T{Xns)WDMixnF#%2apkl`GK8azhbFd z&6tGo!-t35T93~k)nA@D&F|>ux6kzf*i-ZO^?}D9bkof-_XPAEJ$1gtdRUXOtZFXi zOu)8G+COx%aRitJ_>^xKqJ%MpWjWFjpYf9xVtv(Du8T1W!AO`o8IE?6VQd3k7G zSLYL9Iz~J+a+3Gx%&zI|fV zWv|GHQ^YhzZ@X5~$o1^G4}Y1k;5lMI@NJo{Jx&p? z&t{K%3ru7vb?EvGiw6?QnpjfrrHwtZtu>S^7jg$~Ro7qy)gcvWiB zNezaKXM+r0I@Y*vwZER<^%F2(N3!SknM+FNQ_l{ZMD)yBuWAX zXY8p^>&oV4{l}?Dm-ADe>&&ni8C}EcPPRR5c+d2HL3$|}zEqz}53eVcHJ6f7n1)xN zioy5015v>8cd-sE6d{(r7qpM%-|pw%El0jZr%KoM7aWb4(c^497ZD8{NNVk|_|c$u zvUoLrQ!*O+0BOWHP*cy-?8VgQLr)H_ezS?m$uQV8*@-8JUr&9f-_y^3LCFzmij=fj zvpT#RTJSF7l>B9z+mxS}ffs-N!HhRUd=K3GBp73;eKb)OOoOm&N zr(m{v;$!yA>l&>Bj}5r*Xys%wiUHJeepa>2t#G|>rnl{%>&zjxEo zs!55-pb5~ed5P?d&&rozDyw?;R4K;O()WUecZVF#PRfKlE_ScbJ~0%nmzl(TJhq5; z`5xIuP?(rvu*`{ukM3wcN=a+ay5FhP!EXj#b(xbYv%FMO)>${zOj3q=4}RNKRA}G) z*0nJy@qKf%38*Lo`_#K*tXK4ZdjlM%NB6SoKm6B80!QitBaU!j-2#o)GK2r!M54mY zU#1g{cF)}e(yFPg1)8+{k8IvP2TN~>l_;8PS)7Ha0XPH8B*wvl~U3tr56jjH#8v2rL6bc;6 zQ4Z}G(~u6VPs3jr(>XoKyQ05ZWCJr@K8g@%xPU9n zyTAKpP(!A!KT>1VeOUv0!*Pm6u@*DvGZiaGYhO%ZS!Xt!{$9P_%kcpsDMsmCm13&z z4Y^aztOEmOf_jBC&&{Ai2NI)g^y-{4G;B9x%+8p@m2b3Da$bn}b+Y|AXR;e2)*`P| zbsof!fFOq5;@-Z}-yaP77sH#EfJS*`Whd&H2u~ed4y39hyMucTzE_+nX+Y!Ta7cBG zDzBXsh)I1vvSFs=b5gk=eAZ3he3W?rh8vQuMd{RuY7TU%$r7m#^~U;0bxK%thFkll zo4t{+_=qFIErfBr%zpRxmLA5d-3U;|RK3ZHUnlhvMc9b5MD>^<16zQwDp!Bj92 z2nF6{CD^YvuK!iU=>yJY%@At~*W`)?n`GwTp7n7kHnP@}r~3U7ZUumtCb9^2OpT2- z|Gs#N@f@@46N&a=3J_VyaJcD9L^8k^TP zPP^TCit~DBO;vigV~(@QCX8VwJxVo3BtMvNa5SCnc(j>EQ32upo7vcv++*dToFFh+ zghKBLSe6uqitHm^pMKwZYVD`jIRE_w1BA=r_o7aDSq@^A;YAH%$5*ijLLPgbZ{}sz zzyIfXX7+!eJU5xGK#+BI-PzakT4z1?n*BTD5vt_$Dv~|#-HrNn7Xc`h=H_*>R0Dd3 z=CbG;W?iQ+mPmm<^H|5M=saZ(<>#CAIWsgv`K;60>tDl0>&2(8zSO7TX zM|~6em$3`W;|k(Zd~6W<_tof5ZYW*5c{#WK0zv(*1jhAT&7nfK|t;kyVUP)DthQU@pN`T^J?moa>=5Ya$nsV zh7y?Oz~e{W+MvluO-4pL^IM8;ID<}tRMj*qZ@6InNvY`V$DS9CtYe=&%p%1abW5c_ za2&>%4!&I!5KlKsXZg{BndN6Z)i$^W0zxq2A=lUxdbi<}H}N1<8UDRNkPZ7oad&Yq zho}sDu1@^dmciQDcJe1RUvk_h8rP6LCJ@HaY^C%ii&`h{f@YXS`%n zp98qQB=J)xxZ*#5NOB!H-@fl0noT*b_cn7G;P(4Kt7`Kf5PZI?WZZV-=T;$& z%HJ`#ay{%p*y%?z)JZ4>gp0~t=Y=wczu3z?uUP6M3vd2Gstwb0`|rrX5gR#(SZCY) zGjd>+PjkL3q{on)!r`Xe^;UD#~%>UJoL_1y^Q$97L7Za z?;44+MdXWubH;b@m2Q?71&R*8>ox9HS6#p8R@2dSYt=l!p5$G8I@5%3m|ckjqUU6s z?fI1aUr}Cw4bvWipKWo+L7l!oB1KbtBM7M)>+%al86w(U_evw)lVb$*_qY*wuC$;sQw>tV_<(x9xykCDyd9Fe8!;VY4F)rSu z@~u_WPqa#fFG=+a9x=zORIp}~zQ~6M4;UyX!d>FaEHPXs`;0%<1vQ>yJy{T0;~Ll# z!j#<5s}}p;5|)?Dahx^FPlX1Ua62)6L&K#xYJ#`0?pOF%SW?1yC~*ZFN(8;nRG|JH zMEw5K-{D4hgABcL(`3ik7W!Adz@E(0-OuFODJMtu-8;2+x7OAMvuyHvXYMoC3v5Q^ zl)xUPvzEHjd#Ja|M^^UUBO`fR$1tlvFq&)|PSB27&3O_Ax@sMD2ij*Lntn? z%g#z=YH#FyJl`jmvHQe~ZC~P_`{WVGW;Yq$OnUGye{^Diz+XJE{{wlX2=G#cpoG1X_XVX)xURwc75_R#re|;4d1)MYvSFx2X9M)dw&k}u5?*i zD<()e+;^m6!EfQD{%iNU-5q00G}YMcWs=Og7#gv5wZhLjQL+4K4L;<93Mf#%pmH*+JK&VWB!$gK4xg|;vArllO zCdh*Hw5MEpdm2HiU@#Jviwf1F!|*#@NemE5wqy(#eKBO_KqEvdUE%Wh-m$m_ouk5# z=mVzgkE#N29@aE~+Q%KiNX9TB<`)ost02{+rF??Y9kYh5Y- zayiV*Jr;@s8iBSl1df+&kKGw!?w@sUq~^P-Y;_1Pdh6}g)yyFiZr54v3Apg;c|3aSEjGd`O*rQIukZ>R4!p)Y;mSVQT_$@3d!)q- zfSr=sr#4UEY?+$qG!mzgXE20WeYa$LgaDM=seyX!u8wh-*vS5+R|pW6Xd6?;*}lpdZ|FOTnt(#SK`W_{ih!-^$B+0r>Q#T z4E;X9njeR6HYOEu$w-6?vtkgUAzKxT;zKz;S!Idv_o_3e`aC zw?BS%9thmvVFAuHH9T-|2vxrCimYb$Fvf9c)D>yW_1LteJ{+7G!R2KJ~|%8 zzQZnA-)p}LpS0<{lZaCjy&MZ4{Bn8CvV)i-J>8!N5Um;u&z*;3OfPrb;S)MVZ7w;( zZq6H04Dr+GEkz3K2BUQYW+e=LdG#1;ApgD$TP|(4@15{*TEvMwN~CY@+o}2N%>*Mr zT&GV{bS^KN9we|eNLk`AmDm+#c4I>c!lYuCwpM8kt}`^hq*1*D%WY-&(AUf+*=aEWkRV_AdhZKsgkOWONEi!DD&x+3p^ z3x2?OCw^$M4RKXsh({DWNIXrqLqMvX*jW54aUWvKjr?rv@66Dzob;I)G>%Q$W@rG) zL$?|^X9Fxsk(Vj7?-rdMS^;RYLj3_N2*f0&*xZi~5N00!$2v>n$;SKv5NSdun!&X9 zfs7QBmQR|GJ>WU}mKb_L60euOtUp^CYE0t9GUi2P3#m(cwC)aTur8G`S48KC7PM|& z&Lz?K^#$1U#1E~Scqt+9I;)p;K0C4pjtB?wg^XuIUc3PIfE17D|ExX{g;Cp%?l z&Z00N^m?8-Tw(#4!<)Nb>Vy7i-tORRU0u50B%+5eqLk3J{PYXG3uEXex;WW{HTXlv zn)+}-*vR8+o`a8l@_VI*e)5Xfxj)cDyv`wdk;Twq_GVnOOE^+g>s?Kw?Ui+>w&V*h zs{`g~yNn~tG<|Fz(a9j`l2_#jDzjLlNdQWKIQ^=3o}rRkBCBa(&%}SeQ0f(EzYT}% zRK0?B44N|@&V(|VQraS(J7|ZY&JrOIHL|P*)3XMQd{fZLWKeVk+ za!%)dWpK4ALZ@;uA?UW*dYB$Ek)P4NJp)bR;B=*=ArIH;$6HSn`E*p4LD}UCOM)r) zjWX17)Q2)E^7?b?vzCI1s*S&z$eikbF2*j|m2)h@4B7&3ubhDJmwCAdw`0;yC48|S ze7g02cu0WeuaKEeJAbmF`^C35asTrUXC>> z>`4@AYBYR6WTnd>rb`WY?Wz>{+^VkudPus0@{<}yhH)g<4`YXL|N6k9_hkyUA@r71@uo#=NVMILp0%t*xPEs)WZFarcG)Yu_T_;T!1mywmSqG%f9A(%M*v zo>QU^!iYuw3I9hwL$YHOiGj&}l5mWWzpHNxEXOOC#JO6Xq)@520vnCQ3Qv-cl> z4J)B&x22Wq4f6>nU6a$FnL(yTOf^4P0J&LAFUJ0MBvtcqXW`kNN#n=z-^nm9)`!Gp z4AT6wIQR3WbXH-5sPOIhLNNjuB(>5c*wbG5K%o!JsmNYI)^fuGCl51HmW0^(L?WPC z@a?_%z`zTUtdE?7d7Clg_hWDdi&JX0HG<<)t`8DGNM*Yo~H_@z)^ezDRCfQjzl93)`iZp^MZFm{I zhpwpqepp&|tVbEJTG9EZN4avTbc}_Bz=82in^p$@wW^tWkAwLpK8f9a01eMyvV%9| zn#9RvW*vHD;os5Z(j}WQu)Mip^<&*$Y4}qZUN+mH$ZfO78dmZw(+}a<)OQjZ<`-5X zDqKTogx>LCcc`VjAJAxx%!UY+c43Ox-3O2ay`RQP&#EzG;jW}36B9J@F;isqbt~w^ z44GVlB-1m$1+eP>Z}54G!hHG`Djr6LZsl(%)(^K{fmGP_3KLD3q8sHf;=zTRN{5dD z-ku&ttlPm-^6NEX|5C|*!LhlOLtJg10bD%Xz3$mPQ};*@tKN(GT5Bfb?(}Q`PXAKg|-b%iLj#Vephh zf`%IwHJ_jKw(HWy|BKK6i_iay&;N_h|BKK6i_iay&;N_h|6S7g7oYzZpZ^!1{}-SC z7oR`J0S*7f=l{j$|HbG3#pnOU=l{j$|HbD)9hk=$56JHA0Z|H?FS!W`373NzTt_cg zHA$VJdgsDrNI2l*fLh+%6nK;hi%#WgIN7xaq8-7I(^ajxaq9x&-27^*QS(IGCZOn( z7Y*f2Q2VpsCL859!y>s(QAbB)*3d=Zvx2uK1UmLyg7(w%w+c{RD7R^jK)08&M+Yf( zDl{!fQLRr_T_g7jw7AJEh<5Kjj#whtNOChcoctF0tW2S^MD4t(HHgwsIteNlyuS^N zP>VS=(ZsDHURXvIk?tCueqBR*Vf%uFEtB*P;Jaf?Bxc3NFCf>>n?n0FA7CHsRuHIw zQ-?+h}g9qqr)PiHCk@i5FJ%dO_`UH%v&|{(Tn19P2fn1<7YgN%hR%6j$^f7X`M_@DP(2&EoMWI^Ea15WL3&_)Q|y} zC|+uZriz?ppK=*To;Nd)`BMY7Pr>__p3YTS5$j>?4ucyF`C#b#0x6CeR59rEe%V&w zJxqqeKmGx|($22Y@X9jw)I?=F z6G56H1N!h>PFa{Y81pMCxIf;lVe$4FI22L{)+80~z~I26jm|m_=JdavmtAfJV>=^C zVvcX!;Gw|Fuifq3?ojdNJ4J9?dR&+X3N$K5Z9?_r)2Ewm!C=dGk}{aHGQ(K=g}~~J zyR4T_yqas}_H`JwOb=}W;(=DSoHd{QjyiAUqkfn9FOsKe(2B-06|N7fq=-Efx#)Ot zt@D8%&ce^{>n#aVO_uY+G0;Cr2SP?Zi~`dA&X8ZW`=ZCAh0*kU3S906sXV%8Id+-U z!5x5$(0$?Uh{DjrAffoI1DjdTGRe$PxY};HCxcEVq+^Wo9;c@-1D(##=knN>J5IJ; zPP(@SJs+Slnw)T}u= zcY`}wxl6R)%{xLgoa&KiY4f&H{Rl)+k*N^noi`H3-NrUb4LYuNg*2{{RW8Qp_Wzt~ z2bz>KLIy307v|4Usb|-eCH4pHf7~Czs}-x|_#rEOVhus-9QV|w03|nxNniAa5g474 zX{qUi-(o@4aO-y?cspSqhhEj5;-`^Iabgq2{(3`Utq#nf!_aBwIm~2+K&B{_POw8Y zcr)!6d|uee2$PSq1Ez?(uU9?DJ0~v4!0s2hdh6uuadadX{!hFG%+1`CbKXMKshY$Y zr(pdr?T@Ucq%o%>Lz~*yAylkr)_g_p5ha~2-tvZ}wRYz-6_wweVuaWQXyIE`01H4- zc`$C>d@Iq0Z~KP%b+Q@jg1RPo_GAJ3^-RAbt@_<)`=5{Z-5BaoKkV}L5v0D`0e**m z=)LNZIxcZkhswcc9aJ}e?-i-j6_tUA4Xlmr62xno*^R0AatyW@ohuNrEZ$hnEg(rn zPa>L7h*YLm)hn6yV5~-9u;kt+BVfmf`+QauAlF?d9pLISG-RgmB*@wENHdUPBf|h8 zk)Zn{di)y?XN=$9!#xsTxYm2SrWPTwC4Yw82OGG^8!C1^^{9nC(?hk5>i{8+5V;+* zLJB>S@kAW;LNQ2tFwf-;Fo;t66WD=3?+x}oUl($2`nf;bQ#$Rr76?5%gsRjWhKYk$ zq3^Ka9_ArQgZ{IDBTfvDmMm-Gro z#ba5KvwSf3^5>`fn8z8n6e1lT|NMwwd5uej`(lObz*027ioTbml@k>pckK6_TkR);{+3xWbiRp>DZTZ%c}m~D_uvccKkqLu77RFe zsy_YQrlx{zQ-eJ80iCfvxaqWH4YRL_)R_g@DdFOm}mf@;=I z5HRy%&ZF1M;PPvW)v{Gd^g1Oqw*kGTwpsKZ#31F?=7atJzftGcIP{a6?gD zW
ExjU$BztfYq8HM(S5%;)lVIRf#@n?38!71KwQ?G~v-D-)62$UK4YH+}=hWq5Q-lu@@?v zUgHxr0co-Y^?q(<->tgCOp^xa&U;8ywRK*Z=20VoWH{`QE3l}~?n*(xZWSUW5vBll zSZ7ahHy-=26`VZsL^y?BF4V5@`^6P^=R0%D_IMo*EvRTMgKLGHCqQM_&}p0)#`FiX z5j&bhY+be7DE0v8pHY>MnJ4-&(J{NjLs=p6MO|&L;Xf&`&uFlP`>}VaUEij?9$J>F1#s08WKxshL7LE z&zyrLs5a8G&4v-P;fm6$9h#N%ThJjN96K94Brv_gO8;vz6+6X8Z>asDCBlY8r3m^bT_d1w3!hb6CZNbKeotXPmOxT!n&m>e8$$&x&@aEV%FwY-ZGIgqu5v8 z&CU#M&PA-ORG+p^EJn`|4dskM$~cNcJu*o3pG3TfIYk90GdPVWCO;<~^7LAxwBa#J-&+ILekVA1n5~ zaymzb0SEJ`32LEZ2j*CRcCudp^$|w>itNIGUc$>ebqzr7uIPH2(|Qp+hQ1KVB=>3I zbY77OJqm9Eap$NIGfWyi7tF+14tz?f$%zrE*9%XGDEdzxYg{7U5s8Dh*VbqNU06-( zu3$m1W26S9Pk3#GZrm+IkA5KQg;DBCUc6Lt+W$r5t?$vSt8_3jt9w=cm9 zO|--YB2)Ih?6C%9GR#{xi;X&XSD&|g0^{V4Tct5tvCruR&)}9xbym3DdoeHhH+t z4fID(=G1Ose~R)EFhQ4e6n&`3Y1weouad#V${bFPKC&rzlFfzeXw|Jgm)JFW4HjzV zthkFy0Upa5@*%w)n5vl|5RTsw-~NMipU;+w4F1Z#ws&&tk3*CE@^PybVRw3kFlN;8 zTESLgGj_Fl5L*g%mrW7Kh2?{lm6bMz`BYT5MH9&A^lM0-|Blrk{egE;B+w~~iyUnshJw%x0H?98$|@5k#CTtv`A7bUD<^C%0(%=h_Uu%#j}$A5`X4hCo_2_ulhTcrD%*;@!l2S0H$3Ka!^eS zjnHt)5362JC4gfRbxK>fJNg`5OhtPjJDjb>i-1}L2s>e4G2H$)ZFw2Ru^qXeDr&A` zpV@F7o4mOyWD-&P?=bT`#c?1LTa41^huNr*ihZ#I^DX=ip>9gHxbvg;P7f*?>JI9W z50FQG!h7~fBDfQn_T5Yjp(zs((vy$fXvUqlNby+u;7jPYa|Zr%;0#E5jF3Ns5Y8NO z;S4n`=dDuUuFUL>e!>hdy0hhkXnxt^j(I>~3r_!cWHEL-bLZ1G{jt$9Tjg2f7J-N< z97*@&mZ9K0UYw1b;xb^+_Te-RD6rEA^2hnmu9Lsag7hBI0l zs2`2U=Sl8(D#N_l_btBNO5?EKj8N7#2nJzSeLUY}cJ?Uqr5cJm_`U9s))%ab#aYIA zBqb8yjDw*YyPmLCl7SG(E9!KfRMbyK5!HZOSF1o_n?(i8YWbw_VzU@mt7k z;9@O4o=ub~v$;N9h!n3^q6WYTE!5T*1FDlYg(JU z+?&q{HLrD5E^N8@sAuhSP*Aa=wnPQ9 zSg8Qiu};pI+14BN(na;%-o@<^uIx9;OxT5`VLDsIjCGYl(f^M~0?^rNkj7BS@k8ozQU? zChzURe;Sgf4I`zvfk=SG|v4obBnZ5zY=x z!%^#;?#!{~*eMtmM<~bO@=RN9PJhc&>j-27I-TCqCv4mv^1^2)$gXm*<2dUGl5uOH z-ify5+4!w9dznIkV7CiqgD95gXndr;ZIc6HSGV6}TQQ~CS-%~~{RSI81K+>y3@_U9 zoyMOREWg`NujF&*-V1W27)^deabrVELyvs!z#&=Vt)aJV~niPq; zI-s(yqy=S1H;SSCy_@EyP_jk91t|7;di>wG-?HzeC;X1k(}(qb$v-4dL31Z*qD}Ez znxRhH3-dt1$67SyBu4iY2YR7$x7T}#e@?sCQ&Y4!iFmYXb4AwxzLQA%6F>Vyh(C=>jtw@$)&V4saV&mmpf_46Ue9FC#x2s zTo+}H>3=yD20dh$=VeY&FH*-dc=AL3gT%8T7`Nq(qR@MTMVj8!CNZy#h1@^i@2onkuICKw);3S;uF_e zJCdEuCC+OqlW$)=ABElp-KnWCDZG~PXW1_}aJjErny7Zu|FBuOgBDy%DX3phEv19v zPe3n&KH}W-062~r3!n5EujYm{-X^CF^gGH0u!rA5U;K8;#(S>n+u{HVAw@+j^=)C^mXdMZ3FyzrDy3MrlHmQPJOMf$0E|d+9x&bB#t9VSK}swzIAk&-Id!eEqTCF%XNq z=dz7i$6Dr>G%g(L8no184PYlX59``76e`p~9{OQ`?J2mwKCs}qNs8s8rX`bO@C1powTfy|b+^Me@z;A`sFoQ8$j3YWV(!Q= zLxY8r-c&`F%m`O;5}$^DthIa;!!A|N?Ih0Kg+3PD=SW;b0yZpns9478H`brag!^!Z z#D~fWEk3XO?Vqd@&y`_ETHYPq|5qSb~L*K$1HPKBx0@W*NT}31d`>eRl~jk>U75$GMeC>x;>Vwp_kj zh}ZS=kBdzM0${}ZF!`8xH1BxS&)%)J&NU^IqpBC?(_f^X#Pr6FBpx6CZ@vQL`44{X z@s|l4w8QYFXu3EoG926@m~hOTbYt~BR|D&pR7k8;3XC=L9#cX^0wwOB9~nbo|M3-J z;#HqBjNmc}rP19nsRQ~8xk+-A4do{m#)n5m1Czy4<~C4)JbgAVdmy|`R`4YET*WQ& zA=uaQ+VVaCZ}yL1^PA;`T|WbZK_~>LoCmJHXe(OK?+1gi`9>TX+Q_l8Kd)Qq|8-+<6mU{i!6;5Fc&Qe2RI+&C2rcQ!DWW^)l2}Bzf0JWB2eIq* zT2{ddXko`cnBzLXNgaz1_SvB-75HJ+2s= zJdbTvEq60Fj;+X(ri z6xloOF<6T1kdu%2dPDq}L@h5+3n&2k9=)543suGI4cR_kDqg=j&qe0|>rn;EQ9)F% zX9E^!b^l-5G(uiwPJ-}>tqt(S&S>Cor7;z*!=v2Q+btCsLF{M+Br&B z7F=EopYT^etH&kk*cVLq-anojkLpUqi+?p1(ll8rbqA004Bd5*z5L(z+kcX=)Np-c zpZUIZCcGi{nUhR}VnW-1P4LSCg+{KAYH*eH9XOH?V$SsINkT(x7394O^*vtIds4aJ z#1&K7PH@6R@{&{Sy>8rlFBh1p^rNUpe{pe8^=)X^JTXpk%7HpL{trl=jT^=@%zVRK z{k$X>L}7_0*;(aw+}FAukR_+bOVn8my+PUJsCP0@N0#-$ksE2YyBIzw2WvS1nP}%` zk%KAJy_jmlq3|s8peFqNZ-(C^!-v@9kcB9_faN@N{%gmiKW!vv;na%Lzqg9w{fzPI zV_5;K?rgeyw56woq$77+?Sy(TG%KBK=u{%J>Wznvg+!ixQm9&^5xe)Ee0OhCv%ay+ za`@z8Qvs9?Fz**Pxv8)(I1L|5qN!U!v7+IX&w7t9+eCh|+PJqQZ{D(%n=Pw88&8NGz^iZxJz*yA^hz1RCrBTpp1&h_& zvNevlzBbXfXBHK;5AB1G{8Vp$=a4sKDtG~X6*l~^_xMx8l28x+`*sU5kU9~t|BilC z8kyo#4(~9@7vTV!a@(h11@EZda!^1${pgLlIBaw{S`l%|yLpg`JAc7$|E--kz$u&Y zY4pPD5rc!zgx3q3FZv>|)no5PPRONL1J9S0V9rMqKqZ(ML9!T(jpL09>JBdF7Sta% zV(NENyf!a^QRp=T94`zczkTp1pLFapvf})53W7n>U?yMpqoD#{Dy+pTT+PW1vMnFG z<-MjmqrFuVM0-|&(>O1|9e`w;{y|RU75{W#*B+aETqetd_PDX187OD zF6^Pu`YlkwKY?f+vb2p0&&Qa|FOli)?=f`;9h(Z%0VT$D#xbVSjY4gKwxl1-G=SlpoWUAP4IR^n71hwF>H1MrLKC>`Z?@y zj8Ve?;@YpzQCI|c6sTygn1#DAlM0;{Vpo;``Yu#Mn_%*2U5K-#usL2tfb@ z5!pY(Y@G#xK8A{KxjYqE_HxAtWX9mnPKDp752G_+TQ;*?vADJS;O&NeIt%d{f+2S} z9py9%M*W~dA5ord!i+Yf-mTGo*Xa|56unRhjT?DAshP7{OYM~H6xauQRvKdxHz=7~ zC2-b_vW|^v$ofmi0kAAJ4&X=QP{5t%^Dau31zJ91Os^` z3te^+;Prist-a|DsvdV;&{RvksZ7A<*A})?>+WfAET+?w$)%x+!hCEhLD<%{W@ZGS z-G;N%t!5KOB&~sZryZyX76NZKY?{-p4{UGmRN08oKlQw#A2x~wim)U#KMx=HQuQJK zQKuT>=W;#wgovPHJ63u0^w?cL>XV%QAmaE$gMp!W;5|)?3)k0bKbP?cJ=w3eWgqyn zoiZwkCfgb%Eha_6GsSMhitY+(TMv!MmhuWT{LJ=s_VW@|UulE@=5W~gCP`!P7c6)` z_oS6FbZAd8;Dh4{RqEQggibz=!>EKJU}(-@n48B6&#saolEvM2ISXp}yg|WC@eE}* z#m$TX6-r)gt=-`M#$CBSI(Xg;DE*X`TS%eDIBpwI3O|9vP(A{I=L^>dsz={SdM;xV%p>&786!+|_3Iv&{he8fd2BZN z0#sveTXk=N>Cg5ceY{_;c9gv3&Cbl+dtR7L#q4EqFsqCOL_jyJAqus^g7uUz4v5!A z8ArkpNanR$rKlr8y^gx;%X=(M{qM_vhs_VTX+l1`W5NGFP^RO>$3P}6CJ-`tl?*!T zPk{Ri)CD0=Z@X6<5E*R0E{2`kRq$!0qKi{cezDJ8>vfmaPL;va$pf#J&O*p>}7 zxiz4t{Qfuvg}Y{K;oP0)DyCR_9LSY7)6E>oYHAc>003`z1SSz_b{5unot++XuX)UY z;=CfxA!mN&4e$M2$h|~zLTH!n^vBhSS2eby9*E>F!CDh~ct@)5@yZ;i(kqW(e=yi( zSeqSNRaE|Ffa=uBOkOn0`s~LnwuGJT#E2a}?5B^k&aX1>ZzVYaCOx-p$7=>{&=`jI z3cz7|^{!Hk^}pNR1g2F6yN5xfE^rNxnA7W>EH^Q z0ZJL&!%jd4!c|`^Qhx3yz+!Q^Jfmg6#$-J@%TNEryn*A!0?9Wn^>M5-gq}d0J5OHO zNT)gV$JX7AO@|eQJ4!_Ah#}1KQK4G882vDk4Ubs!BH^|fR~DMj#&b50pK6b1edrS$ ziDnzV2fuD2F!;?bBe>jg|Gj^NHt8zd$_i-`Ma!G;Lwb;l$mOuHyI+A zIdSJVZ+x5r_z<77M}-I#Hf!`rE3IN(FO&7BB+u^qP%}>F#hIy1ZQ3Fy>TiwiQfD4p z-H*|7Kn9Jw-4p>zm8{{%?Q)XESHw+54nfWp^SbpvU?}OjA;eaD$S@;v7IESAQKfn2LYS0f9vq;6#P6E02{=gTQbFsO zY%r)FrI%1wQ~bwK1dRqyaD9W13b~)a>Go6)YP^}(5bKZWK5p4jpy`Lhs_Pq;wiahR zvaU{NT$`Kls+Z6w>s`|e%((}ts5PjQPP*4#a`kZnQ>oLm$COivp!yION3ZO88w;(n zAJA80U>F7i=Vi4I!n7~_68w;kfJ?RqWBc{CP`&M&b7>BaV@zEZP~oVKcSb%y&F7fc zP~Ph^k#NchNPVAF0^8HMg-V<`$t&N?f^L z;Gwi3%5mrs>nH4c*H5G{w?+vUauPSoLhA9P5}>2~n>#0`Yo~1@Sil2z1fpWW<2cF@ z>}V)#y}qROjW~1tP8(e?$l{A^wv1tqNG>rj-2Lwh`wWT2O!%o@M@y1y`kmhbBA|kjY_wJ1eIf=0X;lMbT z?bGnASzGZ{J8fsK$0{0=W3#$zW*hQQt({Fwens(2XSw^UA#R-HRRy^W&#*m1T8r0EPAaD;{mvEZ%_G znM3zcp!&tYRkzn~53rqBM?D(TBUnH`DCE=G>m5I)(Z5O-W$~~9fF0@C*v1N8@ipz< z%YT)DrK3w_82IQP!1PDJls6l9(D?-^Pq)XQ5W(2O@f`3}zThMhf}cgMFzu?!*tq^?kAp`ZfeY6A4GA7_AVr*=pDzgX1F=<$zc0nRe=8OL@$mn=>ri_% z$wjP%-ukI+sl94vKUwQHjuzcz;h~3*ky_s361&4BJM*%?>z4N}ZNvS%`S#a>Tmhni zXXlBT6%j}T8hT8){hM>1Ug#Sg#dJ*-LO#$EXUl!RNQro}v+&^ni}TJy@x$H4OCbxi zE_jy6H;3{K^Hc@xt;wq%Y1jO<@$AqU5(lFuvpsfrgXDg)Je9UhhobJ}`I;LsDepZ=bruoZ(`K9fTWIktQElduhFyTIbm9ATf~=+TOC ztK4m{KgtFl@SK7MN5>r2w9`1ac&3dEj@S~mpsyaZFuK#@aI5=0vxF;(bx}&(Z~eTv z6@;d0SCnuZ3R_$n_Ac*As=o10TXh>NwX9&~+qmm>5Q%`P z!u%&Ov1Rn1H5=WXdC)<=$h}BwOf_qDiOEr=yJ@xVS5b@qZQEnbSx$Yt4*e}4+Q3VC z(}4Rq(X|<|6s5T5|0h}whax8FdyxwTHKce>SAHEFGG$D^0ZMRv)nAYH7A94cG5S!# zIM)!9acmc*r|Zb#a$LpG+TgZlxVFwtFBDxxpI>bJjx&J>$;q5T?Wyc5PK)EF()=cl`Zv($wS(KMr zs3c7WOT3r+*7epJKvn2RnsCA-1&7(Z<3xrfd#o%vi6lAP~d5d`$Zi>)!Wvm*@ZK z-cNvg2ThghV*8>vP8PanTbrPFGTZ}ERJC;nlz0Ln#(H}{9`4xIum3MSl^)xij^&*1 z_CC~Zc+X?l$qM#3F)r8Sq`jWQl;;F2ijdk!ZW@61<<_YDSup@PvjNl!W%2y}M+tn+ z|BJe}jEb^v--T6FL?sjvl?DYV36X{YQBhK9q(r*A6d06LU=Zn6k#3~JK{^DaW9Y7- zdusnK?&p4<=icvst^Mwgd#(B4g{)!biZhP$IF2(R%`z(ntL3>M&5Fr*9rI)Nw^YQK z_(%;o3cxb*vk)KbQM^OOor>8~p;=2p=TP`E){J)%dO(a8x6tL2$p}T+PXd$N2)B>3 zN#lBbY_OxYO=y(8Hn{IKH+&jF*W)=PLR=R<4a0ARH9*zZi<}xosYD`fFx_jUT#)7_b+W;_|y_^6tF8iEj z7E=Ofofu0Fz#3?ESvT({nt>YFW82|7`2xofT7i4eO9jDu|9;hJ0iL?Jo74i?*qGr5 zo>0lLTFE{Y!~wIlP`i+E zpsb2;vu1fZ_Fx(}3Ii2vyREz30U!)@6;BlSNF73G^)BA7z<0Km9EP>$u~fIEq-eRf z=}RVhmre!`#Gte@Bl=0X3*GF$4o|4>AgN3xhCu*N%b zn`EZ~9w}KrX=q*6&jhAYTPc087)5-Oiw7jd7di)8&m4BXg)OuwabI2O0?;9oP|As8 zB_oRu15rCZlNkRl^UYOtlh#i+u09!A{W=k=@g6rcvi<=wEq{?We?nUn0=s`G>jh75 z3DqtuLZ}6|$5ap+DsW7a&e0M=jq2j)w}NE9vs7u@MHt11AV?3YYj{AGb*4Qo#1r-m z2vqx%Z~}cPM97_Lb)h{sai^3dh=2l%mjTH@@&(QH>WnL~lh!{vdy5u_x7NWl@3ez+ zWB5YsC95Liw$Gzs7qNB1+q7ci4w0h0fZXyPJ3!(6bix0g?{ef5++D(bbZ*RACWbt|T-x%W1rV%q1X<;L*yLQ*V zeiYKrV?wQw-G-m;W_f2^hKAv86xQ%9>V8#}!UnM*E)1J=`nkQvoD!KQrnQ$k1gxhn z%VDT<1B^oLLDaSFFZ)kuY_5U*hs|I0P8dRYWuqLg%$!so(!6gI4yduY1qNP#jBy4* zy(m`2cW>C|9c+SD+FX}Gm7XFa@d)5V)L@tInmu-_B|}PbzO|??$%>DQ(Hn$x;!UH6 zU+AlchhAE7e+*dgkiyb!xXTKIk|uCJqTU>Gof8<8*8C^ZN-1B*K-13i?Eh8Aahvsd zKppaU$F(?3^c@6>Ko*6h!sEpBc`B z11=$J6yVw4iP8P+eWQ*KbW^nuGrs6n`~;ZgCL1jZEy#=l-g|u@3_Go+Ati2j14Rz_ zEw0PX)Blbx&_8(TA%3B*&AeweZR`Z;K*88t|6KWj(HqFrJh-v~a}npMqi=hwqq}K! z9~i59k2xg5O%aBks+fhcoj@14Jbk*H<@vj*=dxB7JAN|EC*L<|eSqxYuTQ?;=93sh z0}>_WbuTDgNLhi65YlV}-TFR-{XmH%C&6UOcEz%5$BZ6&5wW>hVMFM8B(VS5m66g{ zuqX#UcTt9%jivXiyHE~gN}puRT+zrQjJ{U>_lr)!QVBkX&?xK#REAK{JBbkXPy?Vr za&R(SAaz1tmkILHt&c5qZo0!@X0G~$s>KWAcVL?0-1|&FvVB-P^dS5`6E7y;tu}a| z8GC|)zzG|Kfzd)=9H+sNobYVOeL0c*>6)D``CmIK!e4m7lK~nB;^Ps4;DUmPS+8UUxrZ5k$_i+&<_fmZ&}^G>22&Y+fx9x)u<5v zt|KEE69RfHH4vM{(AW0IoVtBBKKfw32GZXG)L>pg;#_GQ1uZ%oNz}fgG){;xvo*Q8cud_j|FEcE*?;)D6Rnf&D5;Y<{=$XAc-6N1f~mPa z?)TZAoeVq}-o*_|-T+gi1bUOE+tx-(xXM@X&FbD;jMRnhyh!+>&!NL5pt%adrS&;{ zgo!)xT2WFEM;jqT(zj}-ai0KM;W}MCiLwNa@Y$I2LTWOYJvi|Z|o+RiSmo@ekJEN!CeHoRhXZy`WJ32 zlZ7JmmGJvn$=FVh8*{`dASoYR%kTtxkjrB06-FGh!_I`+Q?wr5;MtCn-h^P}<<|Xl zqnRQ7x9DA>0EmVUNb}0iaM(v$F&gI9k4m;GPl zDTKmeM8>l?WtNho;vt*E;KX<*uYMDPxbXgD|F=8d&jO-zSo#**@LA&{HCEgV#K21) zP$w~s9DstwQdbT7*0X0b1Jghx;eraq%VF+~ET1g_X$Z`4D3bSb%?1KsAf+}qCGRB0 zhftmUUL=D7EY#GyuNIH(fHuLWj=wkN=WbeZ>PV3l&Bh{qG~lxJ5F|D{ls#(Pky{k* z=V7e0$_TeKmiY~{45ehF5K1LsrnTCGiPChR#5+v-9{&@!KBV}|u|GeB%%G&4#Mmj((r-d#4>`1_H=?Y19!HL{uE}HmQZ_y+$}#n=pm2mpa^ek=GuN zoT{e9x>#q9oBr(-dBVXQNo^;sW1|{1Aq=M`=F+AY3ulJP{V_aaaC_g#wzvJGPYuIg zY5YkD65BoLyw~L4f!D5tMq}6*{)26&E|H9}@DMxLg9lWb6RX}N#~bb~V)fAd{PGj^ zF~qJAKAiG}P}t@|(5yzuFy06;s>9hDFLCMDRP;-q{^eTZHpX_=p(v-C9S53T*}AvC zyhOpINOfwW188Mpe5T5jg++0o7b>IPi*)c5aeaG#euE;Ac7q2FAO>p5tq;omh)7u) z_o=75kT$B+r~~SYecZh6CjsQvf><&?i+x)5jBvf@Vv^gsMKj<2g~C~kqOx)fT9T1$ zTF-5qiVSdSc9jmmBb3@NW4JeDS8VrElKl~L2cCxTwDme16CCs_L@Bzdm)J{f?Z#r&DK&+|7g$ zL(NL|YZqnf-1F1H7UcA#WvH8VKWtz~o~Xok6R_ROTH9p`oB6Ia)L5X;P|&M$icl1^ zXrij#yt35nGUfheEwW_`t+*UOWBasv#Ub%Hm3}X?a5+68o#COtvYg-qRF`h-^$q;< zmTvvmVuZ(-apC`)#Ryff>y$f=2ZDoV+6LJMdk5L9%8dqlUgmo52HgwZsJUlpezzlX z!0A%4jQkGU(A(SRdz)iYG>Frl+MNP6zH&>uCq-Kx2_qvg?M)u=2{03|7Wf`F%;4Fa z3hUr(z^}eBu7azFtcA^&!#0CkM~Z=~FB!g+9opee#L{TlTZFJReXYw0*e8f zQ0Mhi05x*EPRZuh1K2Du=k-|l`CBQ;O^zEOmiF=8(sep#ruoF8KP8-*R~`SvX6*F6 z2xE8QXlL!gJ~A=fXeIi6AtRYO`$ODffscDqgyqSF4Uwvp0ZQjDElMAXJn@e{@Wfoa z&&|aKtt6`%oC$8lKZ8{#fW0e`KOm_q`||&3BUzei#q{>l38#=*zh!)4?TOxCxXk|_ zR^iKslpk!YzamO!e%$zR?OOG(aocajAF4(e6MbJVEVT%B&7!QwD(@p*pQ*cjmV-Y0 zpMW|>6fy2d;hBeL;%2#=dvPo95#)5L^O)tnQ8H48+rb{KH({AXZza(3G-sNq?xmd0|}p=HU%U1L-J#os#0j@bZS$*zJA z^zFH*Yd-j(15@&oxr(Hq*C7&Vpb951G#%2+{I2Ci-)}#kiEqZ1%5msR9G__XY)M}E zSD*>Q9opK}#hJ=U!(i_ji7vnJri$6oD6hv$?f9YQtjYd$5>Bu;>F`qN0h(t-a-Zj+ zAyir{k)MgD*a&m&*ZvRE0zG@NcmCL-o{RCe@#50i{5)MBXxu8`=pJn1#c|+Vi%WhA z=tm9xPe0<)wtlbQZN=&cyv(At&mO*8i1j9?XHi zb*-%b+R0jmuCsF0vuc?`6L3yvu@BFq*HVVV-l?~zel#e@2EINRE|wWDh6Px|)k^i4 zXtXiPoQ;=yFP^M_LsIG`+!vH^xY>tv1Fr9JgAm zmKc6l7ad@zc;a}DNim3;>l#FIduMw=T*8f<>oaNBK5Q*xG%9>$*j?lM8Uwk#z#8(a zLQtxWO#;f^rkeN;sy8luEv47^*nAW)sx1pN?woWg-B-bf?-ooV`^%^JuYsY|**CsE zNfe70S;@%i125mB1EjMR!&qLI-{i=MA5~?#0}O304RCX!1_vLZHS=}0qMmGDZz>@n zsW9}%ScaX;7MrP@qa?@n{(hr;=e9*-2A0*&t04pX6Orcu-<`Ydq`-~`*6QEC1%Ad+ ziVW-5P_Gqy1rd(b7=AV(RTf@MbTD1wD4oOMgpXV+NZU3U*4%Oy?+BCyCe_Q#FEXhkcONDXlM%C*e>T`rOKS zSx)~PL-9SW%l|A#9!B(jb6WV?1qQ_OW#vs0!|KLQx8RvFleg#Rwc|+dlY0seOtz1e zHC6pseDYime|?go-1yR{gFU57vorqnFtzO;JE~jPT`AVxm(GZCFIO_3 z$wr!wEMWKOI(wVG2SFjp`Su^QP-C!|qeIM->94^ZmeN}LVP+4t0)o-w_Z>Fxmh;oF z8eD(ob!e|(C(5KhEKx)|!VqmOT}=(RfU;x1pZsrEqLL%y-RbX9oSIc6l&r=&7hE-8 z(z<`k8rGw?fS!rJUm>tFt`BQ&TnwhAP%ghx>L<)-VS=tNQL4nbW#=5TTyeB)hpQ6@ zJz2Z6D|lKl=)e_2+R?+{wcE2EY=HfSX?(_3839n}QGUMD-eBHU&52*U=(b4b zR>g+jrY=7U)}I4Z6)`t}B2_~Iwo;GPt4iB0K+%||&HwwGIrDr3T7UOfDr`v~6rn>@ zOecHY{&hm?Zm`vH_w_Y!op1O?rS*XKGF>%C`+}iIAv518xt3po%{kkQo$WFbak-Dz zFU@7&PH5h4QN<||2P|UVP4o7|`x>pbW;Ob@k@(lUAeIr)|dCm3$A{ zUz7fhAT2R{)AXr&B`on*?~hH-(XFA24)&i<_HV9}41+(e>k%_YNf8Ymx)S>>y`z;f zr0F`Jkj>9Bz}4BZHiqw3;W9|J%3`Xno;;*%B<2rm*b;0G$&TCDQk;3f^n4s3xoCvg zzOdWz%?!=!h+QHeHgy{q(9}$qabL+IECYzZZ*(`?kGpKRUINtp>dz|I0I=W$OlY*| zHUADV&dRqk1SSYi-S$V!h-<-sr<2a%aN2ejNqFmq+Z(Ee zh}*Wm-k&q9-UHN+W;AF8_2|gAf5%Enh~JQ6OMi6u2d~@iU=6Wx%GH1oWZC{twZJv6Pf(N0r-|`1du77DT zne!I2e5Xw-bJGfW6wcfkZj@2Tk^YSW`cQKfharrZJqLaNKkWcK1YWM z|3`+rlDpjVgU(M+e-vQ%jRP6RJgahY;v%j|QK)hpcl&62zGEEl1XiJGwRoQ16wvKB z{4hPTTRnVHHNEjCbVFyhJ$UW?GAsENkd>r z*NTcpOv?)MWr-DL$%)mJ5&Ku}6NyP)VrFWcJ|^ya4;a3Nld7NDsMzT67zM~H;rVGoIr;S zxZoApz((yqZTMvyj6CH`&F7PCa8d-QARv^OXqq_!&X)g%mnJ&{uzpwv!gcd!5Slh7 zhI3uE7n*QSMFCh^#~Hw=wLsV7nTG<1_jm(2Z0xiCo!I+k2(g(U7TPjJ0N=n3(wI-8 z*1tlD6az)9+c^Ev^~EHmKwso0+LEI^XB#CzLssR@)nzCC{a7NzTC4b?;XM}EA-Gox zD8h&uxP<7>y&gckS-w6I8K|3ff$g`E2Oo*q$LG@@x$-RhHMX{WR~F@o!x3eqrJ5h= zPf}Q1-F>HnPq=9@0|jI9K-`PRHA|>qyx7oA6j>lnNUb`stXY12s_vWY`*_rUgx!YbQTS*x3ZuLn|%Tlf>xd49qy z_)j|br7JpJqQ0jP!8tn?P}`Qh-TwaefAiOF^qnmPd1Wb^;YONLHB&>CKr8x-)h)A; z-5ejjynM2`EP44=`B|<6?}9;C|2xBEx6PX*6i=^FqNai;T@lAwN*=FioBX8JLjvAX zcXW9^d3doy6?a8`j_OY=1L;MY8y8P_{nTeG#K@{?kJYu~n(4FTGVYN&j==nF;G@2@k#+}x?ieWVmg#HkNMI|ZO$m?x?1vV&dmZR*n5ctPDZ^9eOmRu-joEE!W zH1$2w68MY)Fwitedl4j))%D6n`hyj?dnslBjm++U=3n5^X;uGmClw(%nx|XT8z}do z>F(cN0CpF0I*QsMwV%Ub{vp6mKbfljckTA2<%0e5VKRZ&n^zG0)wgask|~WAMx{A6 zzPPTNO`Y~wum2rLr3JP}LgS((^E&a`vvou`;n1W~y{Ez4DkX+|J#;44Mcqw}}&s32&c3vZd4n`GhzV(>XtXjsX;rxi0aY-%8pKj{#k46)2kH zUXFtjqyi$ctlv*LQpoFi$_7BCVYua=0`9FzkqiTMv+5EKuU2b%8l}CsCoo0jj%>Mt z&m-H`!UHC^Z~}B&t`_RY7RjzhaZixhHPAsea?BKc$QSBO)eRla@Zk63i>7zq7=mAy zsEy9<%`q+$r%`f&-c7bf?`4#Ce1@KPdQSmI0XX=%!c(p-=BTM&VtGFpml@ry0I24dawXm*H$!6IufD$m$hRQ_^*kvP(qc zxVr;Xz0!M>`>xoygD1_gT2pZ0;dTfjyr%li*@3Ym~R z({`mlYaOui0b_iTw%l{1_{-a)`IzeRnt5&}@lhD;cq_~+YU`4qfU(zxPNj|b?yCwz z#fu?&jj=-C4^zx9$a)BDznA+Yb8*P>dNzJ@^V1e3To3Lpoi^Z)|8b!pZ`kmpg2mqKi)#-G z8&4ZNJ38*(&ITrjyz)#5Sk;m>~i8$t04Z7iP@C{zwgiF+c$%Hq1M|Ob^ zBqR3V^Qa8mTcEk!MkuH>kzd0IAvwcSlNYYNhe)VHtU5AWS1y`7|y#2 zvk1p8eqIk1!jE-M7?GEIHaQ;DD;g}(dmM(V9GgEbd`O$WO!HJ@G63x`)TYhgDS24h zS8BpZhWx zTHrHU{`DELO$Hl~_ zvuJ}~v{d)`9l9gWV2_aIP6X1ez*QtuGIJFWfdbh-VU)d${Z8QD44 zTJ~2@s1ogmK)O382ncHG9LjM}ZTk01gZwmxuG5&77xqO|ggy){b(g>KE79dEgJMhe zJ|mU`1FCGAI1~Kp?_?_n*UQ~7w?!41C=uU#x3|j2k}Y0}AjDrFKgnEAx+#87^M+;c z(HHGG#eR<7_Nw1D9X?!D_#A^t3Nuvuze+nT6tT!lOq`Zd5^XJFjbVT99H-w$Z}E0C zk2_fgZfKWgW@llIHjKw&*s;V~HL{yck+a1iAN&RC#Yyt8Lys@9M`Mhsu@%{XNeszkynX0b#2+@3JW>RJaX#~m#tLxI##tEEwRXP zrJ$;W10cQ%nxZnzLpGc`*_xTpPV|!h0up(fN$j5s(^YYjlQl;K$>`IrWyAP%u6Mlq zO-7$#G9rFA?#P5m5Z_#;wQt1LT6Y&!^1k99caVp6UrZN%x9V%d7jX7_e69 z!-&UXsee>rBL z`6v+E_nnqcB-yr4Bj0JrkV$s!if+U9YvSflJ9m5xQNb%}%5@%arY*@~e>{D5{o2U4 zr$xSlP1za0HVxZj=}SH4c4Y>mQ&jY{zu&$jq6R-pee^kuwNd9D8_7wX$NkR3`=R*6 zGaG~JKfYuXQ4XuuQf~w0=h`qe;A$0@KdETfPXDc3%ZddcUx&5c(crpafC>(Jw~yj1 z--oRLSF1dP!3LvTJ?kg`0(Me!YeKM*W~WF=#ImXXA*35{gQ&L`5n}6F2XWnr3#^Lq z0wou{@*$SedOK%WR~9*p^IxRjwhZ9T!mcpO zp~~RVT9$4MBs&Wp@p`0r$CvWQw}$-Og*3l7pPULtpBUgl8p(#24)iJ|l{w$SZs?as zKNDqpZ4KG%8b(k9LzZvcZ%6Qbe(v)INq#3^wGaBLeVsz$#Kdq9(0c z)TUq4MCHPTp9W&lv>i~G$tiwV6Xn*+Tlvs~SsZmVR$iIX-&H1QhGCSyoMFO5Hk6;% zC(cKl|LJx8aLiQjrqj-B6+TXONi4ob^yJo;5;|MIF8oX=;t^-CA>q6p=ps7L)7#HQ z1ju|Nu=Cw}{8_;Csb{n@z7q}V!4G${y6zB1=d|H($nVGKpa0FHaPH&`+g$)ngn0eAO_hl#_5IvlD+R*yRO;FrrMJP(&zI)?zwas1fBqBr*>ZH{37V{zl{%VH8bFl#9Q zmlFbh$FJ52fr-I2i3gQbUbdAyrlMXeJ%M8ZS;P#uYx?v)KO~OqH|;DB>^pYtbE$}} zA3q+ZcM&H~?+FwL_!>+>+fWSW4Oe2`B+9wK)p}&~_;E!%QX?oL-t%PczyQr1Qp#wz zd}wBT&HF%-p2$`fJqV>aJ0Tq9n$^u9Z@PDXq8D#OI5D!3%#Q zVfnqwt0a`4#6kY053%5R z+ozmKY3-u`)Fg&#$YgLGM6TcSl;>G1xbp9665P`>mf=tQ1dt00D6hGy;MtfY25Jtgh zbi1xO;V3pOCRzj+UsQi18`wB~TBEeXa?9_q@&`abKj6~F9cH{_|AFC;G%WJlP1NwRhj9;;55ErP zC7EoSS_J3EBWKQ3DN=$o2FwwwE7S!CM?aj}|+(h#Kywe828h{ravPhxvVZ$2)T~e|UAh)NNy44_qnWTKEY1NsSO$ z<^inP63xssN8ev5S^ktx`j5q|_J)ZI7T|3;*ISuH24rg{(c~Q_0^RV1waT&;#PsWq z-P0qmG|q&)>p1;FB#5$HB-p_& zXHF^|h#>0yEjyVm6F|s@IX=A^uD(O!0IEG}=C^+e+MBb{uP^<+{6?$2^J|Zm(;>I_ zx7V)En^x@fMdlsta~&cSjq5n@nHk4{T?VLt0QqNs-?m~*$u0(I%hJ~x^)D|2Gc**# z)MLbjp~~T%7PU=(Bgx|zqjZD?*Y4chCnF5Cws4DwiE#FlIQ|6=1w;6#irLB7=3fO8 z;~AsRr`Q_%d}r&7lgM!bp(d|B^?Ac199NybjI>(|bBl$_l*^qza?e99*YRos`o&89 zs4=WsVu`JB_IUlZeU(5Enucl3KKWW*8GG;#jRGaEtZeV@T6sL^Jgc0qL4%xkh_fr! z493RP>WiAoh4ovO@Z9_zJL`kQY9|3x_d2SdYhmjE9<(4VJMmFb7d$#ibhA*Rn9N9%3XvApVo`hvs*$)1`S5X1GWhbwr#i6-C+FL|QLP&}iVosVYA4 z9XfX)m&*kfG2DHX`(kBhy^VrrsPC19h54sV@=4hKK=fw@-`tWWbgps*_=ziMkAy|6 z{ZYXgE{#(XEw{!X`N-sw^=SYYO!a437K&C?tUe?_v|LnhUSPMUuxBdZHM}rP);mD9 z0dG}hQiX$(wt6{CBLkN)?yxz;$_72MxW}Nh#SJ8jCj7j^yQCrhHbrOaH=&BETVh4y zp7&Uu?r{i>Zdo1d1(%~QXY}#u+T<3=AQ~2uT{=+bxe1u{C zm>8SQ60%Ww8rBcSy>BCG6l()$Vg))01}MeYn*0Rby^S$Hi-d}2_sbn9&8$i0nNpJZ z|4n<2B=J*MNgX4^gw?gE!4}1I{%E}`J+h7!4F#3m7H3-Vdtt88b*XJpuP>JB&zX$B zPIQ;)lDFL8XX+HrJ`QHoavy0d=xOzhvlKQRFwkm@r|9On@>jm)JacproE&r&F41Iy z@a6;Q;zb$KTxJ5(h=jPt2tyBk{RKw8jGV{#=;RW^pi2z1$-2KRbH-Ob*;yX%?yqy4 zVKw$KO}XiG&6;=)Jq2$au?U^ZlB)iqD$n7<*VFTkrBpjAF%E|~6++$I-dJSlzJscu zcQ8$C@lT1zCwToyPZS`<$Z##cRX*W$4T_=G5#Om9gdy3Q;+GF6O@20eTV(J#RoQKU z>DcCLD~)Q{^g*+-TVuJbc0Gz04e74+$x5ad(I;H*po8sMMX5R5VLxdq#wpA}2?N7K zPGQ#lHY~rI-Bh0CF~VUJl!Cf?hW{2AVF*t$q1-Z2xF0=r zO=Fh)2Q(?7Ej$V0e}tefFQk}7xy*LPw}ZN(iQKD!8`nUNl?gZ4v(dG@P=8s0Av)v@ zdr-|-Jjd;l(N9}hTpdxYGUE9w2RUtQ1f0%zd;$_x`OL~hZSLPgM1ecJJSahdIeF5M z+sTh)q8$K%;C}PbOQGm4C|j!Mt(ef_78_mPd^`P6urfLw-_@_Pdh((i?zz+In$1>6L3+_d7~XR41aSI z$b*wgPKvG=D9*&Zly4EecOln(!M1!8PUy?q&1q1LiT})7IQ?E+-Y-TJLt)s!)!p7( zBdFxn-Yk!!Ot+p&xAA(PP|{T<4xIM>PI9CdzE4sFk}_dfM(vY$5f3mq%YKKRNR{ld zL3{{S%G^S1`^%?f3#vF_5k%ynzrFG87A;%ekXo*5H#yifQix6N{vWv)7Fag>wy8S# zqrRc#JFr*y){~T?cXRRtNJI>UZ-Pq4>=lJ)e zLW<@Lx{S0F^D-sH@Yv>KuEImf5m-3OsWkEIFWQ5b`wDvPM0rC8{t@SPw zr-UD_WOS-rK{O0{L~|)$=`PO1^GeyAe)$CYzmT-^{@kTSG(Q1TbsQ+?7S?}aYysu@ zppsN@xXz|>K6*XW&NEeP?vul2VnZhr*^#o1uCcYsT7J#PasX4qZ8@tZADCY3Y3`ysnYjA3rS@{1SyK{-QarLPx`(yr+y> znYG;xD9Cwu`#)!u6i`cm2NGwsPur--cI0R03o zy1&X=3Z2rIN!cg<+@SD7I0awl&X#ipEr#2Wu2U!qoO+HvS-GG#0wj*HUG7aw<0u<< z)j0rO#8tOx(5;J-2Oi4nT64#%tPR$CJ$-3Em30uIyzzzX8~y?^6gEY+mQ*&0A$ek62as3Dd&=znoezq z)$f}TCYX}fpC3V4>`jsnYvbG6b1qmf=~qoPV6nNI=P*qfXT1!m632rzrc`NJ2L4sX za=UY=5&>%$ZF-YG>bNGU2lUUT&afd>Jkgq7`lt-q+b47;D8uJp7$$KT3PgY(UF@shumBTtVu|{peL($7kG`OI1siN2t6;TBW55W)>y9g z578B}!1`j7jxpfMI86_xhS4+4^?rxHh#6@0C8vHFQsIC=v>_Ag@DNO3l&HPp)>2x( zE)B6zZr<$J@BXt!pGcJmGIlAPr;*i)`(*pxLUN(+1H&;GpfJ75W5SRf=nmBS;O{?E2P z7cy@{v*f(;iK-HQ&-O@mvLimG(Bc>#gXBfeiJjy{JP-|4WvON?6o+4Y6}$^ku+wIK zoziK5ta5Gl*GAGxdJyIhJxe}>bsqCFbxEdYYZ|_cNZnu!8!*(`Ygtz7h_}wo_3rUO3OZVRzt$cr z5H#J;b1i_p#W{fO(63NW0*_+DH8@TAeUiYUR9-jXthy zBopfDZVMU31dr84?y2T}{5Svj_SrSRinXu{fvztLMhtR9d36Wy;pa5*kv#NE_iJw? zo3j6ToE_S-1o4eh#sntE{RAIy!=t-@X)pC;;h$>de0P5w!VRBqkFs6(9S89{j^0h9 zMhk#D;EwPa8tcM$Z@1gnoJPQ%x#9{`@#6Ya?!ZU{y$(1p;=m?U$q{la0lx~|7T;qa z$B7Q01QznkL-ACv@w;_!&*zy=67UDrkW^u)$xjq9Pz8xCbL9Xl3lAJl7lG@a;7N{y zz#NaOto5+XcZbFNtZN4V_Y+5h;NT3H^+IF7KE&zZa5k(OtnDcPGnXOP)x2{3*fBVm zpswu$Ljc{$^So^c(SnMZiw8h2^-E%_k<##-xW-qbb9kmeT9ui@tuVNF%@<#4B6>iH zs>uW*yY{d2!Zn3HF*kA>+TVCO(bfR746^dqO&{&8hu_mHa0|_0c2Wpy&{(!62oj>K z1KWt8w?G6vcGE2JN*7fNg1@h7Tj64eFhD836a%`}EG%5UXXtvT${kJ>9htSEz_-|( ztnvGHU0fp!U$@+wTFPFBpw&t?hD!m9;?3&6JjDL2LM7%ZcjoMd#hG9R;Yn`qIh|?R zi$=VX6lxMTq+5PcS?^Gs4Urc=^`~dpxQ2tgH&?trqV46}PpO|#R()D{_iXrzDREU6 zk7#7Zy?=u>Ujj~*D=0_gaWi33kDF@hOfHWY{F`%?C?uGtnt#}=KHVVc#VB9QS!*PC zo6*>2P$4>sMm3e|dV~0glvR4m^4{}|6os&=Y$PQ-kAggAG8Xge(aK3KHFU7o+6yHy zsJ1x*KJWE&Jf0P{8mdMQuSYZoQ}d8{Z2GD%K~|gevZqk#IwOrAD939&cE%t<0_$r& zL*;US)>Q)^j4nbFx!=IpFoKS<+WBx_h;^l?xVEcymTtoyGV@;j>^tUNKttJ|f?G3l zl61K_xtH%&3G~nfY6rk3V;0E73V2EMW5~CGe@TC5-2E2CSY9S<3xWy_!8#B`Q=xk< zVlei1OE!)pFzQIy4D(s0$^;8|ajy?RJnjKTUUr;$!!3^_*=BOuqpgik2xalx_uAMP zbGJYq@(D|u|sh+YoYhoKJ`0kA;O~F!6aGOq_eNZ1+gpl%BhV?EXU>Z zi5rsa>i8M3{a?&pY8azLRrKCk|0Yk_3mH0QQ}F(oP_){Ve3taBysY8h;q~;@DUK{x z!6(%M(L`|2LFHhu3CckmYdYL7BV50Um01{?l*#`Hu&Pn2h!6USyyy8)^s9cW8Vv6^ z%4ZvM9)BNkw_raMoiSM?bqe*(>FV`}&Ine;cJfOReX{f(-!U7&i%d7*!*Zq5;=)#T z9rkFaq1`FL6$rBYHUf1 zDuBN+)=5v7FyuWaWd^O}Z>%FZ{K|6?uF+R1%Hs+U2H4i_L z#iT8mJhH%Yuc+W;77Nr>_Tz71risYK{}}r3ocO0|(ngIC0`O2jLu# zyR?Oi^FZ`+?AhkVA1=DjemXDrJ}1`*?lU}x0W?P1vV-)?l4S%u;FB0Xj+$OAKuTK2 zAkf1+6;tnZiBZi)-)@qjB8+kzXki*1eTJ*{w47xhTfR$Z_#3Udh~}P0f`>`w8s`YO z63VP1xxLM9BamCy0c1U7Esqc$hqTINYQ#DUa*#2Xle@MLnMgN1i8wNE_OomoTPyWr} z>L1-3jd@GcsHiGS>`;z`nhO@ zCx%g^&X3@&_ZYWfy65OS>O{?28A-2~@EHAJYwBmVf@H$@y1`!`Hfxr-&vEiew=UcJy6`IMh z2{-}gOU63)6$u3NHHiW~Z@jUy41sz5eI-@GUA`_-#FM*tFlmm=0n9SRbp}v$gKT^# zc#xyNm#w=G*5dr41LRB(>;`^)qh6?)=@1B@=K+hgQJgel6*58iNhR^K1yKwPl4Dn= zXy%8{)2{tpvMa(Q3Q_5uwhtIM^pDx04woM$I0j#&jhhAE##A)gGpcLYuL#v<*q2jwrsz?`jkbjf?3|` zjVz$0djF{g2Y?b*tzmai}E)Y+~O%(vh8zs zn>pSH(@s(oh%&M#EX2)!vJiQO zU>3DWV=qxr$WToe$kyRVstS#s@Fe&F_y>f%4 z_6!pvO_V+^Z0fwTf@&SwI6;W+k z(XUJnAm5Eb8_}{2CC%X3gqcHx8`}X7VVj4H^JjvvZCsalta!`*tokH(%k|mJ)T~tj zCfkmN!L8w+v=ObtAF*yoOwvgO*B+&7M^lRS6V~vZeY@a#u7cYs^ugc-osPbPj7HFrg}_0v2i#X|vCb_pVN@3$HmYY0^>k z4YQ~(_oqqcZ>7wnHAE7R^cKACDB)-hMJGGCMdPOP_TEVr0*p!xSNim1jZCc~$UwE@ z-lE6!teb0jvK3U9W`sIkc{cPMmgN*NWjNS2XhgSPk=3@((vQ6E@`Cv1N?1+&W{R+v zypUI*(+BmxsNmrKmO6Ku>|)=b&&Rct3m+BYhZ!Czh;xC9;TSXdTTMh+WUhJ&(3Oi)uVDN)!3n5!&V^ zn)|!i(sC6*D0cIcf6{3=zw^Ba+kgwXj4K2gmG1V)GN8SIx1XzeO%jFd`5HB!s0r7O z?d=2PtkCFbE6z!cs93qCaqtEP-T)8#bIHi6>uTFuWg>&{zyCrq$2xY&3P z7<9sW`$NZe^?p7!Zdk<(T;oi}!pdhpOjblG!`3wJxsQ?FdoxOUFK**}47aN+&f!)XLD|Km?(> zo;2Js=um>qRm$+}FFndR6w+t+x3f5IZwbQ{RiRVDvkY>+A5!y|VZm-Iuk~-i_u9!X z>R3bJ$RqKzH6hfdZg~*c3Kc#UnoYuj^>cspfXC1}V6c;*(q^ltV%4DCS>piA2{&uG zEmFprBG85!k4u2Te>Rlop|39}ydA2ZP(L0NoKM1n@+_8j0<_(7lzVq6bv_%J>}%-Q z%oo}mLAJx1QA$B9r*+~}^MSU2HP;>v?hYp}nmP}onWRb04FM)Zo2#eHSXE5zc1#83Olz^b=_q3TKoW00t0|`@HCr7 zh>CRL8uToITp@7{>0g}A@Lm^1s<1zcP&Jrh&6{tbGpiXhd=bU)B{zUE3n(HoK^1eD z`AXvs^B=ia6QP(lM6+?9UUdpO2WNTw64J;bp8e7#-4ZRGT7PVzAAPB^Q(j_#LDAZ= z7|WJhl%KGr9CLM`@X)tgVmcbXpi;i;26N`5mY^c#ypc@w({!UD$4U4}*#qapi7g+n z$%6dMr)`DT6x&Ogo$gGJYjOGnKa17sHl3e6iW8O%VR(ML^0LUbtTy zzD7=-uDON;3dEg--xte1tdTo4VO{~y0bmkd|W|`2yU;A#2q1z-E1yj^KnHO1N(_qahru5!FjyliUDosGTGywtWy%Uk9^e%{i z2#WMh=s`ew?+`lDLhmIcIWs)}z2CFyIj}r#?WWzdS(>WhEm;j z-K3RpWhs|&TPIgG>Q|YxVivVnf>j6H-_Ya%nYqa=pr7}>Wtz`TS#ov75X%W~_Q<4O zHg(V2-OGq#eCUg+VsJ}VMN2TBZ@I>%-+6p5-0KzeH?%psaynxCg2GdKl9UfPNv8c9 z4fYW`H35kae7!tTWsZNNlVpjPNFLu|)R^c>pk9`Rtn?23`jR{0nwolaI7|2p z?^T(>2&{72yv(h3{?}-kNwo&Fq36IAS4vQfgbtENUqcmx7BWm3cC1hxXAZs9R!Q*Y z>{TTeII1e-q+VB=ZF8m3wsmcS)V|veXq3-N-z*DgTOkVJ(IHR6>v0W!0)>; ztxBP@uBYcc+kwh~P}dbV>_s~8sPrrazsF%@s|Zg9qy0y4?1P#f)sOIX6$fYB`0s-X z+*qdt$+cT156&1prb~tIM~$8v1BUH~7ZNOF*FPKki(P|N?)o!7V#mAE}| zoHi#(u!B9pVvLtXTOYBcXE6v}X(UN@_26v}b)AHmjbp6OS;1Upk&3OkK%Sbrw&%K= zSREL;RAOUC5n<_gh6g*%bg1Tlo(5pE4j#bWuzJ!b#_%{_oILvABWc!zTVlp_g(5JT0WozE!n0Y$gI&Q%SeL^?sXAYQ|5h1q^eK-zrB|88b9OBiThl%tuRQ0wIuj3$| zrm4;auiM@^Z1hQ=y!HSywd&M-7pchB$D|JjLGItGxf z6ibzEIH(r2Ts;B)zO)S-Vlt{dOlwCMtqKENt&shn$|*OWc+&lY$bww#w!Ct}Q8o^C zJ~BIZu(0&C(h0p4v$ezm#CfY7AeC?b;P=aw1l7;!`#E3bs6&aIm45|_SG{YmLMB(h zL7&ZqQ5k9GZ2X|rh22cT#EzN4ss{UjtU)!Zt`R73-C}jXkF--1t|7x1n{!qZU6v^P z7k8={cu&?pQu6`*Z6?hT*yL0B)9>jdGpNRjs&~H#O~`pU7VKL;GUq_G*qzac;62}h zo>MQVeWwewvBTa|q~E}_*ff{~zpTe(@u08ubDm@nX^J=wSIPWV(YHiY-1`HX8&5xi zUXmhVK^S#_>eZFrneH9ANUf$pEjpILt9EmftRAN6Lne`eHuc#!!L9re%vm)hKofZ# zbU;&lF4(C>!}#lVxM6GOYG+TIj$T%f%-(w1Juh0z8hJCHJjJe^b(0_%owPb(Bb`9q zJiyl#?!X~L;5#POxWT-OpeZ{0LN$HIppix3U+L|~rUBsRsb2GXBfjZnn_Ef~){u~x zV~W%KDj%!;=CiO)3E-;Hs{*3m5XWJnJ>PEENoKv4TZIEk$2xEzM;dqIZwK?;HoJC0 z#?yvDC3(dkH>`Na7nVwaix_>t^n!Ju%5SXw?tBJ1rZYHjYYB&Vumhm1wYaZEn0;rM zyE_NwdA9^L%nUI|;7~;~H~?%O>_}4OqfQzP(ht!7s5z4zz^=7h=wd+B7>WUqr)!j_ z^lfG_tPbQ zOxI@MUJjjKg~j<$JM{1E86R)j&=tSHlUt`TzZZ;#`qnX;C9LgQjo5RiWov%a$JF|T zjj2qXFCe%O0KTJBfq+*JSqBnuve3hZdrW%Yl_X!@0JDBF z-zMlV-g+dbfBSx?oE%T=iczc#25IbaqGqL0kCcnML|oLeHxcc9=l?`EI6QIXb!(;> z<06<1LbG2UF=1fvR>U?%5HcLv3}1h7zs}7n7sI0w7mU9|$MR=Naj73jMOTZ7_8i5d zI+>O0>o*K{oafHRU=mEs+MIKqOOf{Iqa}|A`J7QTaty(yZu_A4_!o>IFg6h3YrEP^%tq~Y3D|&7J(3>(JzX6U-yU6 zs=#CT8-=|O5{D(h;#J|HHln$Vx5}86jWVE^vuzwHiLVi4Lo=YSiBoU8(BXfjP-O7N z!GZKS|Kut$Bf8AunE3BCSqF=CM%Y2qu_2zDowmleqrL8-i?{mKiG8{yh_xYGHd@e= z1Vo!`^Asi^r5k;ek(cJj96;}zt{1LLF~p?pT^);J4I30?Ev?yV!)A&5Etx; z8g?&Jw$ZUKv8`uy(}Zk!YC(T@mHi`Ht$ICL53|*bo{$(w~OoK*@G;-Lo<)Fb+6EAZP?Uc7ZgAS zan)s~Q8uc2FiO#P*c;3y>G}a&maY>rGxmyLRl}!efY>3*AWELjNx2H~d}*@W@^h7G z{|yzq2{J~+_u(Hvy26m(w1>7Uc%jC~x$$rTUG}-5hgYwRU9HWdaZ9wHzwz`?&p6X3RVZf=Tb-x#v$m9?0mHpGWZlA(J%1_S#I=`7)o8fr6 zmC>K+3x-8oc_T|H+mfRZ99#su;-?742W$0>W!A!-3b2o)Jaxn zHAEi0?#Iw&LuxwT03M+uH>{02Hg#SntQeiwU-xNBreWVX{^iw>aPVD+hG%zC283J{ zV@aPRw{sc(Rnm6#|A@Y=cJD$Z+xNAgradu4)sOsS<O<4|Jp0*tFH@9j!Cl-)?CF(M zhuP70+ggPlS_fwPv^-7ApmpOU_SRN%wspZ^3)t5`qChS5R$0I*FbIrM>nM9Jr7r1G zN83#fa$fX#dz0WyDASa5_-l2 z6GXlBoY4Ytrc8_xwg(^3FL3X`j12X>AD8`5ezDxwoH6M5;VgZRTu! zj~lP$DJTTBglJs*BrAjmb`n1KQ)@BaSnor``mpDFvS!DQc3#E6yQuY_Qol5!8xt)Q zmS;Wl;OqD|@A5XTE5i;&=Sb`Gyr#6nb#oP&hiF6i7>f z?u`pp{OfcS^`mqIe)E}sgi@Oee-R?I!@GbNl!3~XCD=^&nEZO&^Q->zZx@0`z8kuv z-7Q|7+X!r)wC=uSG^n$^cL2(sd*1IpzzpL^h0m=7l_}QX?%SkaIJG^?ELlpUjc47v3f!x+iTn6PTxOw1=y#f zs5r_BXg>rAo|f{AszsHibr#I)c1Sk@uf`!hp9{W?9fcM0Qi1y9n$; zF}2FdNVZ>rB_*1S?p5>xdX)V0)B~XLZw*+OfOlcm3{m;x1i@a$F_&nVEQO{inO~a6 ziVyh)LBKP7jbcHe>4G&L-SPlV)1L9KsJ-DfE%?N%bDJJN4ws@FYq5s|XiJm0)Y5JR zviv{GKtB|cf!i4}a$np6%Aag<#VtX-mOmk}p-$%slaI|($BNQxg)c?uri<-2zX_!y z9nRlZ{2eQ<=J4>#YGRZTxb|+ePcYi_rX|WUFhAu@5i_1lFKXhg^gErA%ya3xO?mF( zY8er`BRY);mB~H7(XP0E^{cOLTD>_bd4GtZuPx(=wLWBd>L~>#D_!rfr~vv#sztpP zJ+)&+HdGdpqf4OrE1L2z^ahK-1+E9M^(X(5TH(rxQ?>tCIXPgr9oAr+g#57zwZMO? zlGYpTIJ}qcwc0mys+17{IojVA`>(FK3O{rPD)kU$`$s@_e^xf5EVde}ImP1#Hm%9@;J)Hq<3oB5>WUN&19Wdy=by(-qlyZo6g2tmUKS5^4z-}{ zS2bdvJ;D;%6z+`4>=LUbFyOnQ|LsFmu)MT5d70KgxhT@(dP?o_H|8snjSppMz6F2l z9_@0lavHFp(OowBogbAYiDLW0xD3ABsQ1a2Gjl}R~Q_}iY zI_;M9bco$veU1TLbFK^st)8}FQpA1i!{B!H6M|`VeS6#{`3lCz{Sz>#w}+hXKriYH zF*C0bA*n5C6#1;uG`|p~W^R`9Y7Y;-(1;}ib&K9vDrnvbA{Xm|T(RsV`yI+STMe;*!A6k6&MSS}+qi?RY_oFi~f6{H`Qg|HT4$&Qkc1 zMm|g6N7=p>mV3|GXRf%0Xv5)8xBh?VCj?-d?62i_H}m2<)_(>DWY&3=b+M$#)(Pi5 z4khzlNRIYTxXsTXJNpTGDdz`b=Kz0x1hk>v?q0FWWyM$E%T=+JK#9qnp;f02%zfK* z)#K3RXZ~6;w8NyK=wYzeFXu-qvY@z(78>4R50OEqVP_|`XD~QKcka|+-Y>Kfje1Xl zZAZ>AM^pQIUx-ASt__g3&q2CBK&Fn=<}eTJ7b8AT%D>bFRUcX)`|+i{n@31VOMHcl zM2KHXI{YliY72W8@SiOY~aI(u|>;#z5v8C7wxq4;2hnHHg zC*S&xAIr?bH!ipt$6&SR*gbuyS>5V%+L8%bfYxal)Vl?n#Bj@bYvQEqseq8k{8FwF&W%Fn$tzP^?t|-hNGu{{}%93$2 z@+sl)x6hP1dbl=izPLCvG;FVMR9KODqEpA7!HRJhML_5)a0W z=HD-e1I?@Vu`%xU2+ujB@S)g9{Cw^-*kF&4-1lDxUY6QRBnVAHN z*dRhWQc$v^dAoAS)*(-WQ$oe0n2)JeITW=WW$@WM#m!7u)KbP!44O#>`)CZ&Sy(w^EidC{0ca+_ za9ivA!zkMXGsr&S$VpUHm zS&|BKr?Qz*>h1FA;&U!3tcCp+x{*oE@Y3OQ7mtzX)ueP!s|?3!qvS%}i#5G!gi2nw z*hK{accLY=O*04RN5(=As2BY=2Ik9>Sa+3Q&*zeU z_?#kzTNAWycw4s23?!(E`EJab74%y>jIZ*a7gB|9RI0P*LZI<`Os^g}^!4p6qv~fj zpXr%$=0wUr^kWxNIaV{boP6SIy%8OO9?z#*?4NZHGT7Vnn@rT+inZQFyvBB@7#e6y z;Q?KxTYmG%jYec~JyzvQ;|~L$P?!AO=b&d;LJV{hjl{bNT35A$Wj)1S@P5RZ2i%13 z=!&`y{eJWFhs?gS%}`8|c1&x$Rmb=9B{rhT59;x}6}NqTps@W(h@j63N<-|t-xPhz zb)YBWf=9Vr*uEw4mfp}O>(Y)qZ7sCQnObsVsR8Q!j?UxHm+AYHZy%cKZ4m=83GNEd zr9Or5Si=axacq&Ajpx&6FSZ5GBqhAdrBDc)!;^ICfdxW>7`0#sehCBx}S55aFV68_qwd0hKJ~r72>B zC$!H>2CAA|8w-LO*y7%X4%kE{aGS`)%e=dkR!{$-THJITR;?;xM+&7e`ovg%0&K=^ zm}!#br9VK%A`cR0wg3KbQ*>_rIt`jve(lqF!2FQ=bml{iA$EJTm>4k;lc2zTrj|(u znWnEQsg{VG&j|e^@=7cow);&}X*H(s+A&bmTh^RQs*VL2jSDn*@O@isUn-}tL zM-HlgcMf`;vuOG4_Hm2EW*iXAlEmWTU_#Z&Cnj1%uL=|1>2S`y&5DX_Iei~^rFqN1 zs$)R0w(@u3bkem3?$5}H(|=Fki{kB-=`fBTqL1=D3G}Skl_Z8MNY@o~Nw%+txh?jX z`u!z&N9bwUqOP%*e~v%?tb6wg_PI?pUFfVy&?RZ-Mey1n-R6IZ4ln890RwO!5xaxBfm zMRV2ZO~K(|@RB4*=d1R%a#qDfb^-9J`bR&yS(DThJkWZ1?jEDKvHS1os zI<57+%tP~vIu%rh3&cc~X2gHp`0|JIe_)kfJ(ScdFKv@EdKnaUaSB9tuKV+qv z74jC1rs;nn?S`dKUK^WS;_{N@#=V&o*j8nv7_`C&g*jhV`rVdX;S6?*Z$}FB5ZpDO z87?T$tWK5E4qfoigLjGoZ)=JLXSq-<-L10D6oSXp_usWzPoF>E-CXF-XS+(X@vQ3= z`pQc-48|gaZl^(9ZuCDE1x37RI0vS7hEo1{_{kmnnE-otMx zjSBMDc2Yt=j#*10dv;82oMUUJ0%RRL)Wel zwd%?(hPrf(xM5B>RH(z&!_Ky{d}7f`AAOIu=WCYKuo32~pX}G)n`0xY(8Kvv{X*kg z>&0IaYq6fhr{Q_$`R~q95732LinX0)ZnR9^Xngy$$#E^_h-_R2fIHGzvNWGk>OR6d zwlhs??Yk+%AgKbdnwFj))CdvRf=5o}8P7TI^Y?ezCVS1dfW&E~injyAv2lhRS`<+g zSx(UsY+jhfQUZYYOr*Y@h{Jn^2F0vFeHXvM?|vJOOMk#hp~QD_PZNFrOt3ux+tUIp z&b0;qT2n=?=4~?Nbz`3Sm>)vauRpa;J|;NRW6bY%JwA`fkvV7z&64pI`zbX2S3&mg z!dT{VT=SlDG*Gwm-l`q;~HME!ZsSVj^@I+t%LLS z8zZ#%LOt)`AiWXrVS!qQ`;ZxzBGOL2JcH$o5+%uSIpbx%yi{3 zRvk3&MJnw*Q&a&1w*i+bq&=A&by$6qVe13wU~GWhRbG0<7o6Q)k-6%(yUo*Wzdafb zKZ^nSy*|1d{W>R)4{jJ)V5?!J|FstZQUXO=ROiS#C~2giexED~wS0Hq$*t?m*YU z#g22eZuzwtRcaTZ`X?H(A`RFHcWscYeft8=iu{^q+<0uNcNu9{5;(Z4+K3iKNS!3^ z@VyS`^-XAj36eorAD68(+i@d!5iQfLVAzXlLj+-&=ITee@_t*eM9A^GhX`mmX-J({TJ zM^zyBGLu>NbgA=Et`nYt6657>U=W8GO@>lAu$bMzZfB(U)R~gj6i?vg>21flyn*#* z3m3lC zL_)Jgt{0s`*r*OV{i$p)v(d82@{)Mn@rBRPLWdFM`W*?Lft}i90bN&AxPjGDR$=nY`!yoivsi}VkIUfY5fH(5#pa}B#k1Ig=R7yU<4qSOs9fk-NPB;bQB(c| zj~Uc6>_YDA8U}$$)~%_V5rMVMt8dJq|0t*-pkFAWReoK%s@9TZYhT2lP2_-wFj4CW z4q9msZE~`wI|SdYL|;T)hw}lF!@h&yY#_18$$<3*2hi3osWnKf1p1JFZTRV>BGQ0S zzmD0!P!Z|>bmQrq`fsf0g@ZTNR2rv-M&c-s>5&>wOr8+EA|=V8F3SpX(7C3bj%2eR zwiR1DH*#ybVcId#Cz7poApr3mWuC;Ns-e(}Pt@=k>5yf^xi@ioBK zg&O!D3RQyPFH(0WiS}L+JRlBjx>@tzBGsmQd=jTYSaA}VDpCmh9UT(L2R#a zdA|H5)UC@IIbzomjFi@hWBBf79n+1u&pD&XWUd4c;~fSHST#^&IA0I){1r(3m<9F= zOcdlfwOd8%gHj-5QhICZi8U_H8F=wN{O-i^pu;Fn`ryX)ZinXQ>ouDhvE@+EJX(E2 z83fH$S>j*NSaoB@eU{?2Qc$bN+cNXWx$As>#c#hwxawKl>vx61DkmAS4Y*A%dn>CN zwCEn-Hg&<+Cs&^a|D*ll_uBg`wWXG#wzm>Pw#nC(IQdkZ<&uz^(J~uyua6YD&4&`8 zRQMcZ#FmdNB5BXswPd~OLS#p}EgH3!l4g8ORw#w+5ko7yhc7I@P?M1BDDz0yxxa!F zn9@Ccngp*RBc+MDJb1r7z+<>oC9SaueFG149LCU4hi-EpP%54|Cba8<82W~R>931a z`Qsa~YcLUnU+`I9&9A+gN5MM~3*EVgs!!4YXf&02jcu=TWk z^>F~VJi4G)`M6|fN=_9Gu_%8KSx!CQj)O;f?p<;E*`)TBCKt1?FqiLegG(pq`(@n9 zebwZo!~^*%bBmG^z^Zw#IB&EL?wc{4UcO`T;#}+Y;}lc5*T;(e2;(xJQySJwKUXbV z)5DAfBvdld4CUYx^zVO0V!@9G<;ws5F0;}RdFS@R^RxKz)9&2}c*Sc)%7U8aZ?V-{ zf9LY~@%Lx(@9<9Fd=e2g3WqQm=Ny!@_e&UK$Kr$_(aSKi#U>rQ*!zi^4( zY^`HqKzv+$Z9;G&*8tMn?aTu6%FQ{?qEt}5kL4tPcCgCsa04Z0+ODWm&!J3oA>bvm zHqL4Gr|hJq*&^Sh87D$)<#B4#iG%Q8jTh+7J`e3N#&4N?#IAPvz1}t1V#+HwRsa|N zZy-~#CFOv6qS;;nN>nTeW|J=xF^ty0^h*iL9_8l4yIdS0?`Nte@=|7B9!C=hjkUwS z6b*b8wY0=;y^Vw)www<4v^Z2jYo)2$TxjfC4!?om?c-tdf#ont&B+}%<6s1bWo4x6 zR4@s`ZFA)>Xz#7F3lA-tygA%@cmIyCvZc72f12qNP$r6i#s`=d#1YTM6PJ`HDcx!P zX?f>yos}`xk^03a-s^s1&$8sd25Tg71SeF>NF!-Sl@*R?e0drYaM9Z9*F={i6`Iy4 ztwaS{vYMoIj@35P^3RzM<;{L$Y$OC)c!vx9D5n^>^jwR6mwi%T&!${bsuic;gp zyFH$bJIGiENUubJMx~*Wb~Y$X)g7yWYLhS@PMNlu@y3@!;5p_lPe$om+y>C%L+;5{ z?WMQUxD7Ew;ST?J(E{8}tHd4t;ZKQJ1Agxo$@z zomx<@yI(F+Nk|Z(S%Q`W!P#9VD#Kk)e*@StZGv*b@ymfZ%fwVI)vw?3ME}SJ0m$FPk z04QDfeoF1xWd&~ybU}a!YVc=FtMT8eBIp+RSB`#n;eKO~>TW1q+TPZbL2GQlerxp& zotyLYk_EP;m|vIW77Bh(3HsXwl%qJ8q{Wf|Su-Hpv|Ih_6?WctMsYtAmpZ8WFVTsc z84CWHaSiR&N%om zWtb2m31bMjjH_Q8LfyUt>{{|S{7@GR%Mur%zpT|zaNiEKLgI*DZJKI`el`*rX5!(?GC1uV!`kB2}|(lZ|SsbyEngLAxWzmQ&j z>R-5mu+do(fE9)O!F(M5)^Of6{;>GZLKW8hWCHI0FIGe73Q#MZ6&W@pd8MvDs=M$X{41TC7S2vcrvAmH2W_nkGqyE;eO?5b?Z)TPP1 zK4Kvr6FD+B2g)oU&shHPzfPq0eqwULxmQdhNth@iNE@x6wgiR{c7L-^bm%tsN9JP6 zu2=$<5+jz=fy5=)^Ai*&KKda>ES9aCRq46mA>f;Q|EHoIlQ=r2ayjRf4(?^LQRd$Y zjn^_dj34~a=gX(0F)=X(LPM8mnRBaOH$XWS*nCSye12b}sRlMuVg8LCp?+89^MTO) zQ>$x5jpy%9#$b)3U^;Kbt7RP9+8>OF{cN7acs9K%vx<`#t&VQPv6yWjdF)>z{wOO6 zI#m4IKh)`^BN=6Lkqt3mmO}-82e}NRk4>BAoS=n2k|Y?{hdCNJeq8+ucM0DT$mdx8 zti+;QwAAujaHXJXh9frIqBW!{3BNnkXn!dla-#SMbI~?F`t0>+0pfBz?VfBfR4~)h z`hTQD=Ga@l+8LKgfamtm9Q1;o8_OFEDNMfu1rgpSOI#cYR6)R=8WlD4#N;ZGqY16n ztq>#1C{D*oE0}j>Xp)}vhzfdS7a*@)y1x^F8@;)(@T>j~!;uTM7>QqnIEVT$+-Ng6 zxT0!HMJ{*7kG&_=ay^gPfjfR+;LOHk;_&ze8NtcoiBG!s~LSt?p6g>V;Rm2o^rITkU$IpG-*4u^{jHEG}vLr zzx3BZC}LdjhK=eUn>XKp%#qslKaj;#`V+ft01u*cOpZgMz4 zO@=4h`<>DXJ@@0EpO-Jot~ z85!gel_=w3RJ1e=Zd1v_r5aztvsnceuR7!Z8E++{Nt|-@rclnBQ_UdfA9zelc2>P? zMPUw^Ng&Wd4#LU`eofP>9f>}Cxq^ZPA6)OW(mJRpyiNW8D}CW!lNiq@SKPC0!|dRM zo+WN#7okkvzxLmUO0f8YX$Cdne6=0YK>tfNM^@~dZzc!Eb@G$1_AI4Hd6l7XC>fyG zwIfJ`oY-9Vxc?b00G4A| z>aDhS#nOQsXj6m@L|flTaj}0u7CR;Fb3EafR>#e&2-q*!=vt(rrsYWMh_lRt4RgX= zOy+^Z{(E64+3fA8Li#!1Wqgt!4~=Xeyjvz@yH?a;*&@Qce60VS1h~>FSWUZA%w_w! zx-TrPf<5PjG$6QfBBw^4b^Eyc+rbiAjl)W8g%!PK@dr558Uy?L#W6lu)SR(IAI{fL zHg^TK{VkBp8BBhyq)u!GqYqD}!KBgKRkqmQxe_IvGX2x#Nl>xf+zdQ4p)rD}P%fTE9TbVc!u{xUt8IHv_gh-;>yAU-p7o z2pB)xT(dZ_$9Pb|w-O6+CmLxW{5T5~&YNk2-c|joEm~C!2Ght(c&6kn3@G3+C^69f zoMA-;YCpBLtMdA5wpBf$8uNLJeC2_y#ItHf$qGGfCqwn?&|gO<$ZrB4J8+)MCgfcp zH6MZJp&drWCj?W-CZ8Q*dFIZSGBKPt?ly7O6DG^Y0qqd<7nm3m)In(yzWWR`bR|}R zL%^J3t+*(JLTG6btlg81iCKr<{@=oOuS8Xr#@_w$2~7ECSdeaHRR zMTP#nhFtaiazY@tB>QrqnV{(1P`&p(&hFbSdCadWH1Zbp?>rsU{Yrra+CECoH#$YF zOJ=S>!(9gymm3#z6SBI!k$``{IkbS717C7}s-Ok20xw2#c8~02X2&0NRFA;lVb=4bAMHc@9gs)t?GRk)#Tk%AEr9ko)%Gu$l)> zuwC@wxsCD)1bsMM({uf8PcmiS*-191bryqY}S?VK{0G57;9$tITVyA6L4U;i!Lotp#+3NR-C@+ zT22)y$}2Sq8S(V8=O;Le|MZ|Q?Z@6{$H7JJLPu$H&>>Ckf4L)VRd_i29b_(~@uYtH zcREoHxHP8X|4L)%?g2>?DLE6F`G8VdZ@6&l;C-{HkTjRPrT72RdW2PT0~}i5Bb$HDqmlwn~ZF)%Tzf#K_Z&>?$Dv&IH*T_ zV|Nm7H~BFPjxNNR*$+-%>U=cz*{Z}5pgOuA&wq94b5fH&dc~KI5JZDu$Ya8JrWQEd zyBXa^)VBc*$#Nnr%{uuiSi*=I5rnP0`j0ttxr-nwRmTj>Va|i@+?#JKj(|suJ}%v7 zTO0-ka3=MYbCX+$>5Kqc5+~JS&R6F!oB=~uxe$VbjpK${0blRTW3Ducc4Du!o(u^5 zRS0LRl9)HAhQ-P5{3Jb#eT#Ca@gQ5s-&f2|lMptW%lh%NgNtpkH4C!`a?Os1smJh# zkgoeL!X6$kTX>avKLew;goQCehopNS)&2#ha$K=Z=}XVyzOmExtlTvJ0jmA@{8~x^ z%_5rx7KbSNRUJ-2^SA@EhTh9DN~ci6J{?jT2X}mQ7@c#n4XHxorpNrh#S!x@>hC-U z=HJ(+e%cgUnrgSkP4Ef1eZ@%HV&vHqc23qVoN9N+TJvHqWbLK8QAwrecY zL$s!F44@f6VOiTPyTaK|nS-#(ifm3o(ir;50$53*nS_puSSw)`&uB+n}4WZ3q;M|d>m2M%Ax-7p}DEx^AWLcW^X=xk~qs} z54#gdr?T&Hmd`@156X2`##l1JmUG4Xj}$faMAPFGf8ULixoT*;?jL_m#{b~Vu!2ed}(8_`G2#^GD5Nak)_ zmKhIxl5!T+O+T5xLsCh>v1U+g@cLNv+iDf-(Bax)vFy5`n8q8GMqpbWAmF~ld)o_UN z4w0qoEH7apd#PjSmguu4&x~~6nVsn-&EUZ1K+n0b^Vb~YeH1oG>d_b%$cc;F1(;#t zjquZ;~NGEoHIxBYM_umWO zkg_c@2FCM+la^S|gI>|l+RfF@J^JMf^no#|(%1!O>e<*o7TQ*B^)d!Tnh1%Gdf*Jq z6QA#e`Vuq3`BhIKn0BmVzt8M}w`gnWAZ`eJU8vMwmW9YYc`|YK3nPi{ZvH@7KuP!| zu5fe~qjaF_UWi~GmcTO95%`S)pePWmHlnZCyVi@)M$0@6>0j@&{j{<>9{8TuH4LZj zZ2EBZ+?M%PcG&hoo%zIk#R|4^%D-ynU_~=E?U|g?#n&^P4M>Za*GxreQ9W7{+5g8C z9a3$f;O{46J}i~=8I!Vk?o)&@h2Y3CYh2$*_xweGq`&lLQ!gbck+At(TS_tPNfu?Z zREHL)QMXv>dd#xrP|b5y`RmRi1;=a;99hhEJC`#KLQbP#!Vb?f4W|kBpb=Toe)^t= zA}g)^5v(wzA5>9z7cOq}Cq_LqW$akpY|{&+r;%XB8xtC?A@lPXf5b8C&ad~X3YCk- z$X?36>{p@>=ojZtz%s4E-16!=u=l7-#i1|$0{2g{u#LHICaIGx=MrpmeOKJcmT%ZJ zp3cG6*y#_ova`E91Dq&|^xa03^s(+qkEP6Tn%kJ3X*~2`rB|em+Q>?t!6A4_#i3q- zJah>Je2uG3EfT&Vj1HBjV<`J+D}AA zSS(tz3f%s2r&EEb!~UsZNO(pj`+Yo{&+kQA$L;4fdUBMT_()C|!yXygR;&3Bu47cQ zr*;_hTC1#E*lzH0x+GR+9JJ2%A+1ekZ$}_MeyJgMm8PC%*N)57ta&sq$$CpJ-Rag5 zEGy;}is{)urnFkWi4!eHdW~W z&NGlMo0iYWftOum&<%%0k((8MzO{bsQH*I0A8|Y9HeJ8x(+#m(_v2-Cll3ePpzdk~ zaR>dSK27)PS&UTj%Aj49@Uf5?AxD&lfA1E;DN)j~{b;+%P_zc$$KENh0ao)HBY6=o z<

E-5-ra+dG;-f8YsJ(=2Fr9zl@GOKWX`buz-RS;WM~^z;QMHfZ{`D15>&=a~_?57$$PA8?c;c|8JFH-pJQ|sl7@cGt5PX>@ zpEbzr3w&Pl16+gmZTg9wpXFqc`29RNOSsWERUDZVe7Z_|Z?8O4OO4WVlx2_eNSWka|7wk!AI*Er&+oQLmC2{iQV^tc*6K}Bw5MQ? zjInN>YzU1e`XS&53T)YduGaps1&x4pKnJZUoRef8jhX?LA{oo5NIO*Le$oC!hkpzG zEQNUrd>{lj_+pkrn(+PkPW^%E2@cz{{g~XFBK3xh$mCv9_3N{%wVO=o)JJx^=v#jj z%zCta5#os!4E_@MRmk!W!02B;WgG(q^CU3CnZLE973Q_LS9O8%N916lTZI3%nh(%= zS8u{K=Hl`~CZFvzZKuwp(_?>co%JcsU}omXC9bh4opTv^1&R8i_qwv5l$6+{k%VMT zU$nK%wE0N=wv$?65QVRAXFW;e!c(|OYk`^%@>IDtXDm<#{jQqw2%TC!8|WWteC^3c zGRwa{DU3!O!)>O5e&#~a`eQ497PZo}3}fiWFQT*b^0$h^NcX%WD)2Xl=asNM1(@DZ z$d-{d5Egz52kWiw*FBZ1oU(VP82}t=@LAE6T6wH;R&Xd`ifd_zS8jCKg|Kyp68*Eq z=fbztQF}>2w!iPKQt6-CT7l_C3XQjC(auEouNig*r!pkvK9!HZE!YEhCvW3MSgY%9 z@dsny8PSRaTK)V`Ucu7nvZ@+7S5=iEz*S&;mS}8^9upa+*{1>DXviKL(;ndo$PG)h zsAZlvaTvZ`B)+6OWQKpNe1Ahg*DBy;M-fE9WS5bYQFz z?0#8SHnoQ^-G<4}K?z)3buPRNnx|Uu)K6jnzu;YL9r1y^$TOCNUc~-ulS(9q#EqZv45rt(31Pd_}c5vGaB7& zsJ1pXh$Hb`y_S%Z&EaD#|IyK0syFJwA^F%NQte7xeLtCo znelf}@e8E}abo-*15ofqVK(5Hjl#&)TkGJkX7T`21b=q2E#0vDi2coc5#Y0~WUN0P z02{!rIAGcqs8(Gt2icB0zN?ZmUaM(3-L7^Y$5XWaprk9Fm^;@#spDUQVmP;PY0{crsA@KBkEs@KnD`;SW-Vp~OG#*k@|A&9)ND3HFGEGCdrE9MrRobJW6m{5axI&t<|q`+m0sja zdGE_VqCbAIc}j1bM@zV7_HpocsVHHWfnEo9kTu3HaZ|TL*N&RO`nJp1#Y=)a78ETU znGbu~xt%3g&Q=t`D`)+SFf9Bymjn801RsyP^Mkp9DZ+I zpHGIk-Evs>SMkS>tsi?uWmUW(>mHraFO(2UONJJ91|-8fahCc~0XHEj+e+G^&kFDx z?ZOx4g>HVHwT+E(6gJpk)k@(sqE<&OT<^uJh@d5tVI#sthMVG_ZyRlfh|PLq<_RDZ z5)CvBYYJoz8YeZNYf*Vbw?E#n?Y0dAu3X7KfcZ&Y?b0WnBNY7!vd;!t+?AYj4@~y* z!+_%q#|49~KZ6Wu7oc<<9R>05m;m+`jZuskV z%BIxq(@ja}&IPDAmG}VE>C74Z;uM8L<^zc#kVpo-d$d6XB&{ib&hLST!TBmsw9;HE zS`GKb-O0PgtH@c)AW3%6f0jz<;b_>G&2;IxGewV89pj~p?p^q`ZPO1-3@wLd$VF_{ z*Teq(!~S~g%pUIvv=QNXxI{y46vrx%byeTEeO>Hnz76fqITjhg=jWEb=N|Xn`(Hx3 zF!zTr_m4O}W)^F@T9HdWrMvteM9bz_o_@>%K4HakA}Jkg$yZz>*B_SvSY|O$(mn_% z68-V?QAcO2pa|I#KG}6b2=fd15Sjf#Qu|>$!54(d>c8@aek(M-D>k@+Y0itNBpZ(3{-Bkq@f{!pTcJ-;9&eK z!>n!9HlT630h@Kb%DZ5iIu;D>hWn;p)Xkyo4Vf|?!2iZ6O=mG3{o3txemmc5R~OKG zCE=8_zNfkZVXs6QTZ zm`M(%%z7{?OdDgCjmO|@pnd?6ZcVANLx`Mo=`;?dc`kmsWPG21KR=B_S=N1S*tEFi zG;y~*v6(BArLY8g|Un9+ReK?Z)kdY*SNe7Ph{HhS>Lly$AiH5H~KIf^|Si zmVU9pDuD%WiNhpgBFhPnIlR_!y-j4OfPwSxNU79C@Ylr3qdfF8zEEgXKr`?=Q!+!G zB2+ey--`4UPH^>J7mdnW=jwoIzDd#5EPq8E6bBtl&_s2w8Y73BJKx{qmbgK`2;aQ{ zpWhXCmAL3Twv;)bJ1Gg3?)i}+9NI%aclz`M6x~u6+0en@SQj}T+y))Yn7+U)r2prfugk%@E;v?k?}fhm`vJgx zogb_hzVN;3@B_QOgR!?_CMW#%)oo+Em|TJ!?qts>vRPcSatG$Np>6lkKp+<%o1RRP$m!-Z;NMhkqouE5jPE!p|{A!4OKVmCv91W&T;Q^?CF~F zRvLgSmHTwa9;opOk}Bkv|0XYvcc+ z>^-BJ?7ntiMU)~4HhK||CcXCr1*Iy2NJlzI?+8*NQdOk)7L+EvNk^A*YbN?)=qHP=X7x&Cjobr8}p34hs5t~wq4%6Ip zzgYqALP5g1HGD>mpUmHYu3Sx#uE#C7P^;ezrst-f8#?HYbgcM{sGt%!R5ODNl~HtX z!eQmJVy8BlD_eX#)=z3E$lf?*y?M38+WJV;ss8~)wcf-^+QNv;pz)Q=?awwEwSf(6 z1D;Osr_$3jg{jp$urVq1pa(|y=jXt3m#6%s$(e(bJx>y1$9W0m>?gQL%%T$bf4~aad+#Z8MZi7*A%nqLs4>uWITYk@iO-2`Q^KAq8Awv#}v_u#n0xmG6Q`EHU z3n)4ly1BL9qb0j>`v}-0&Fv;E^F$qkh&XbrV3%OyyHm6i#srCo9{f1Gc+}knirr!i z0WBA!=jXeOH;OuJ6(m~--b>B1%`e6$kF#7c8S8(+_`+Gnxt&W#z<9eQx$1lXni(z( z114b(2}*R{i=GFBnOa7EKq8>`(1*cvhLm4s2;BV zH8Fnd@(DFfj;|fPj%!!uTCtt{p|jyiKKjLQ46bF`V+p45j#rTAKJ}lMWZzhh?=8bm zctR=<2CWaNPQV$SQ^C+oA|hQf`IyfHhrWRP_*kAPQ|mW+&|ti+&g}78I@NZw^yW9; zjpMUFXbXvu-ltE-@haiHylUe?QQ#W5wza@%OO(KV?!tElmgltY0ixus5|9A#hH~*W z?-P^Qg>^F>`VkTpnajB{gGGcv@Qc2? z!XYzL?B-IP&1=v}))SPrdhMCczeOokSjw_+@LH>dF?ilgMnqd(QKJf_}YJ&L^9gw4%G@L1xKkf^x60T(@REuXDf7AUmGa%!?L?e4PM{EWuaWt(DLYXd}0(S;`1 zj1t(=XaOF?#<`@=l>%-sufF+8N9HxlWY|&ZXu&lj?8gR4Vs-ktLZ?kabL)=*Hwc7d z?S_@)o=!b(nqpmoTjhif+KoP*lnYpvLlJ|-%db0i{%5&MmX(P0Eo)4vddcSdMiBwM z4$;x~4>-s9{fYu{XxUGK$*>=nJ1ov^zzOuKX6!j=TDGL2mKx-O1sELDK}`!y8hndQ zu{z3Wdw~vHG`An&zFC$ay#A7pyNd>j9~%vghv;#BU0!o5y^gmkm^w;+^xeJ)W%k20 za^AZi-rQV{K?vX5YGY87(8+@>-4yHmZl*pw0yU1t3%TrnfzA44ePe%2e7=?V>UtiE zjmp#x!f3Cw@uU^EW&8m(;VUU!KiZ1>jQ!c?*Ys}B;;53_2F5>+i{w|kVfspYUByb` z)}n~OGsmZ`DaL~MA*oJ2<=|MX-7o=Sj2H$VKe50buZUmUWSt%)Fuh*ae}(%>(dNJX zIzg6qxkG&NS7lb{)q20k;ookH*N^$Ty^bX*4}Xbdxlea}lJD(^V4^6jox`DO1WBUr z%gixR!iHKlg0=m;BhX`(&|P~YG-TE;k8$&%k&~S+WA5HaD~Xw@>J+uvNNh?hVM&RJ z0;q)tOeqs>QOm%TcRa5bcdo;J$_#|?g=h{C1H{Sob}=ML0gk@zayYEG<5@}#BTEA_ z{Mb)wV*kQB5vKA3t&zf4BI;7pty$r?w0Yl#Y1F3|n2t|TZvKko@4ix8&q0PLF?qj# z-&<2C^&X*xT*rqCwMOM0(w3_wIpdR>))LC4VunO=_q?!D#0B{<&%e#-9C`p;&4~e8 z2d0O|l(Q^j)A^anVj` znDO@B6$NI|xNB04R-fL~2rYdwr($C*?=3?_7VW~sWJg-LZ$6gLba)`q{F{(MS99Du zW8_kAoEId2(VuJD{dKY|ee~PCJ)UOX(KSF**Wd#YcJ5=-Q_n4yk@kr5;47>O zz;K|*E2tlbmAovjv#@kHoi}0bTQu7=*1^08>_;~38J-U-$FG{?4D;Y9+(y_4Si_SCpw=^IrOKLe;D0sU>M4#VhB#e+o@JLo%bzX9o**oy7)c^ zeT6LaN7{%|JifdBtJU2WyHN4G@ZJFC3-Fts8P!!?1|(3;Vw6G>Y47m9Zt~Z*k&ImF zYX@h@EtkgEDFvs-^e=RjLFrwSQ5%HGL_Nj!r3sAJ+M@<~Mc-@EN5BibcLz^IuWV94 zX`g5{wT5k)C(Gi&oZK(s_Lzzh%3W}S4bJ)4nI+77fjpL?tKzUR-i z4*Vg;aM~(b_pA?w2!stgx2!)g_U2(Hs(ExPP$Qu`Lk{OIu%LzJzV`X$#~4mSW5a^O zq^fFCr7JKQgu?R+K2%v_W_OCi%3Wc1GM@gmj_#Qrd0m7^_qb89=PolM+b}(H#U@OIK+$Z8|A)%)=vhPTwc*k zyO>uV4sa@FgYtn5N_ROULeY~t_&2f7aTxt1YbIW$#$j!K@^hO980o`1p9pGrYzjt_sHXZOu+J|6kY^jwPvyz=Y+7!-Rdp)KdsxTy&o>ZlDF}aES}MFe}ZWD zgje4wUL|(Rpbg~u%&kev zT{oNn>FwSZL9sHu+K?oBp(x9ou=_R!9dlJbfE?ms0H2C6*lC+jdg(a=d(e9}OmX*W zrH_{5rdql+i(TGrIc3aVtRSXv@<81$Rsbtl_Y+|iB?>Z>m0`-=UzZqPD>`cf%Ew>_ zmWV)P?M@NapdLR@+w=u`40XoTlL$rFuv*+e^eHtR3?3g0hO_#GPNNs}4-Ycq@0&}K z?QoKA(x6RM`dT2&A)_R@M>XAun#*l6WNKbv%QkaH~0GbyKvV6-em{b zBQyvk%^0oRHM*lEgLb;?Udvh(t0o9Sk-P>TlUiMG%N5pnqGF5$@kf)aHUFD%vQ_tw z#Qrg&JBz8b!;CU(;T}&v7(76#G>z6?pNLvB+bmRCruzjWU}mZO;NY63=N*9d6S;1m zz7zXYP@ODbH9TCSi}}pN0N14HgB}eB&QMqQH*J2Nz*j>(kW^E?KABSE@wKKCH7(@D z$Jb6$9FDfoP}&A;eV~G3r80xbeq?56iWqzAo!Ba-e3^JeY;A5Wt zpbcgx{e^087qmOA;ja)G=|=qA6wQdP^e(+%Uq|t62u68*kIixCN4@_eu|#dF`>aVP z<|{&&LSjteh*p8|tkr{CubXfe!qCN;e%O=}Sn+TIm?$ay8f-L`uiD9^Q3;9;IbO9k zu13^#uFQ(9)rHM(!^Mr~$OUwxtLs{({;tDo*`f=>6f~Pt>HUnSw$7tPgpl>(bEmJQ zJr}qKxQnn!;5Y`Uc;sVU0zJZY@0<^nU11o*XEF9~)v%?Hl#K#}Mgscd%SpMV0`uRY z-P?DwER+CGzl+i@@);b^!dJ_=t=H>2oeFs|Pa-15Z=8npYL6xVZNkwMcPHCrm3+XS z^dGrRvz&~h5^vB1r*VIkfQOYEXGeYs^2QEEW9xy3a@MAt8A6D!1}Eype7`bV9DF#J zv{Q{hy4WTXaaC?Mu^UOaH>KxnlR+qkqu(^(1XnY~RZ#SxzQ!5()tWT#61nmB;YNew z+Gwq}P(&{U!konOas#4iEJcP^gickCzwN;tOMDHQi4XezFkJ zzaI>f3K+QjlJyz9LxjCqX6$$dndzF>YWB%9H)o2wUmlk)NU`s9HrM&e{WDStSR{z*iG^Fb?)>%BtBibrnkH1oNlB68#g07!hDVOCBQf6Kb z8H%;e*DMKDdNg5KVIB3H^COB8lKiZB@@qgaIIOjHB;nGW&uT-Eg4qsS zGPXt@W0j6FE2^XNrs~Q$(CV96wK2rhl*2p^wE`^(Bbg7bfhbXk!6x#nFIkik-L{y) zP}pN8HtWToFD*5N@knCVcz;Tc+WG#P7}&tK$}chwo@?y3DedWNwab5=*`%@9FGqsxT+h%>7s{Orb?e_2-}G5@+~lK1cN{Nq27t2Vj2y zD_1^C*emUalpEqc3g@K`9w`UU9IBzANg$3ut&KPc>{qJr4(WuJYX{R=&jvD#?kFOYFjI zM5r~=hXvO^Wm)^FraGPEF>*h9G*uc>ZQ5Fvu*zGAn!XfebN@l$sb}`YGUJi}?rB~U z4a0ZsuWa26W&KauLUuYdMWE{YJsS}pmGDN+Pvi8Acs`&w8hYv%uY=6HVC0wi z8}QahgCPU15J$#%=sg3og;sawgT_{Kg{f8zn87_D7?ve2qA z4r>XY8rNy~{I(hoLUeg0EReV8?t^12_YaR2ahK|=%N@_ZF?^#?x!&OXS^0A|n?yz3?3F8oc~~Byb>+2aE&>uuPDx#+UrmYs08cNLB3bk-lgR|vw_@)}N91pPnE4z>W#s1CI2&%$eGj|IE zl-4BSild?p%ZH&4i$`f2Z0(-l2Tm%UoVqe)XOiAfQbcoaCJY_A*3B*hPhEsizllyY zRv&OwW?zleFl|qEH*t|qkNso}2! zE%c@wa&NwQaHluMqtpzfQ`)g)4XboKCO25tvb;0}e$A0qpt=I#nERl-`UGWQDP4Bi zU3vx8_?cpLB&fz>o9tyMZZh;M%>M&?&~lI<7*YqTU28bp6EhxuJYQ-R^JbsXx-qp^ zyyq~?P^IL(o-#`7bx4m9r>IU)Me0;WyQs)F&&J|rQS#Q z&u+79H_KeI>&8FcTK&Tz5zh9GnyF*=!CT&)kWzst<-blk*Yz-zSzIH(yvso<<|~Ol zW8@Mz&7q9F$r&<*3bZ0{2>7qF;k+cQFB#s^y7_SZ>r>fApzSYNtogZ<26ZgXkQt%X=tE`p+MwuU{L!L_W(LV}IuLG_D`Dz^N=%4; zIz9l<)Ppp3(92e?_70H^2zh)BvH7{C_kjlNHu>fVqpLPX@xBWeTR3?HB@TS?vXq zKo2h)%Y%=&GrY-?^gw|$axzM5K9@z#E`QMrSBo?pWiG|?L7FY) zxeTe|tX6sBx$sFntEFy+TQ$j3XNaNOJMZIQ-p2@^WIu`oX-u1uNjb6O3H6TOT(@0o zu9pg!@QxYfPA7)OCHTYJnZ1@XAmmb^t}biv{+ zeBngMS&2y@QF@Y9qZ+Chhf*~#DHlvcza$Gzs>kc~h5L$<`{zmwroZ6ml}Gp7H9&KF z+@b>btEXu%jrZzi_KYN_5E0))bKW|t=nsyk`xB`u@IAt{0|i<3pBQFW$U}sX1<_X? zq}#5XdGnqDZr?jB5u3C>@z%Gj-j zfvRxmI8Ugn;U`MU*%J2d1!SV7^pC_11Pf7rz#i^;!sE z&Ia@tjz>$#xL+(n%Yb~CqjnXm)_+Pd9l%%@@4Wf&(VduM>2-X;DxHxA;8Nj7|YUHB?di;OzA2LqEh&qARn>YU1|_7zdDPpr|af4WC(+vzvnO{!}3)vzFx z!d)cl0B|P^O@r)ceP1d=HjtY9CKFyJt(4MYYdl#G3%uR=WgUBrdcjZYK<@XD$@@Fe zpZVgT+BPRbI-sBX@XXduGZEajB^&RC4FV}Li(-W^90OCkzD7(_bl%a9BIsm}7gN@ZNtcUsILPI*-m_oMdYo{Re9d06Y#|9G6 z43!5P?83H0CUmx9;{51E9^8+@1Bg=x;NP>@so8twj1lr9cRSfo`f&I@wMPjXxFOZSDxlk^9W$D~p?T7JDfmjs69 zEokQbWxEG)#)s8y9Q4QYE#;OypE@)hF*w_j;>jQ|(Awbg%Hjyb09+vpfOFN}vL{3~ z)WJWlRl2HK3=j+<36!bKJh&4x&t&OB($^Alqjhv~!jQ@i|6WH%ZoibW{BzJN7Nw+~+)Q9IoBEJ=#igP4P2Nm}=Oag)IQ_e%skey8|LzaDr;x z;{WLz$cM>&F;yh@AsZI(mU5g(gR+#Gz&J-R%u!c70bD?6G%9xxu9N779RiWix0X+?Y)(lHa(;$C z)>%tV*FL#M|6FwcEp}`>glhkwbx(Wj1{LPz|3EWo`)LTJmCg)~kw3iG|2LcY{my@} zna@V)IdIT_@l0-xQM62wnn9TME;Kbx0_H7NbD8E!$ zj{8Y%hHkR^@dm|2@gO-W)OgPUb{BU7R57iHOZta5g7u3&i==9@PX4qKnr<`C^yf)(CzfGL|nh*J|KwJBQEoFV9{}->x8xPGLXu+M`wnZgyOX%tNr!5cU)9>@BXB@>;0$jvF8T1J3xnTH zn+oG~e2c*Kb)2J>75zAP0D*h7v$jL^@dveqUf_ic2MQ7+4f&g|%4DG#xfYCd61fGF z(u$ALNj z-V}fN0i;hi_k-GH`Zcp=600QSXP#12%D1+WFbgro8^E`dI{3}i=h$RZ*_)iZw;7^E zvS`>iFon(u2i{y0WqH_?X5j>!iKb^}E3FM)H_PBX+AD{|V3hsE&9&LDd1psur+%ZJ z$7wEO9;_gj@Rl@KA7~L5s4AlEY>-r5tKtWL!Ff7@zKkxZb~PIRpvBjTAE>WS>8l_T?Pz-2!w&9T2QG_P$)9K^Bcrh{ z-a+wNR<#v69wd;_v|${-&`dA>L?w#9F@_38vvWe^nEWqrc0_)16)xU=`aifsC1w0s z!tsrGOY6H^vg4o{mPFZ4y^~%GrL~~b9-JcEHy-|DxFFxgIdf05Z#MDUxcijz34;y( zh8;fXG&zwO#xyAT-m1B;P=5dM6~R3HG~hyssJ9ri`xg@|TSa+#Q>6i!(f;Z}!3}TX z3OiH0c7))F(8~Qr`;9h}+3RBgpK(ia^fB9$ttbVfRIGkAG6d1JxBmYH?OUYW&AaHB zDy#{;YAXEJ1LYhkKKC@(`JDyYbT4;k2sPxZZ}@*A{lq|-sR*W3+;rEHc?aNrB=9)& zRdVAylqxl~f;vg|OGzzLR8r5Avu!%vcIedzNx$`=p~aa{dm~t|Il_6|VT@Z?6E6Dh zQ2P<+m?E|1jS-AamLNcdAofhGaAsAuhVf71&UINx1z{?5n+p%U-&(lU4&0^bR={4_ zjZ@>{#)?6(2_^mye3C`)n-hWCgdy-(80bR$hec#81jw*L2Ne;TBL({;4}kj`)JkTB ze;RzZYP*Ebe#LSN?t!F+o^o8`iL>&(I#HA)to&3<{)RDmO}1^u z;nFd{3Ebv;9ybx{uu%!GK;%;voYp%)Fm=Q-VM4GMqpf>CL*{!0lVCuFU5>omQ4M|F zzy2Y`0hZLl^Almg*#$*>bVXPj!CeU$R@gS4rUdU9R8U+&1=P}n+rae4c@ypGlr(fO zKeWXXEe`muY3TGIoqK)hR(i9ArcNU+E ze~qw$bnHVo0t9(hx?qVPT&p+Hz!Ri~B0w4>Co`yv1R)+JP!#T#$Nb*^GyRW!Sb!OQ zAhN!-wKH^PQN*<(%-#&<*oe*a7erMATutRVzXAWGg+b@s0F;M6 zLvw_ki$IBOT^v>n1Ngkly(atZfwU^jDi)h59@xbO_fp4E+>cSHJ(TZ1>Rn$8!+sk$ z#(nP=nH-kB3o+Ga*l!9L>l<_}5dB0I?Gd@3kYVcVogYU25?3`hIu{fjZ0Q=^bgW|A zzgBvGdMDzBRq4feO{x3<)VVexmd-M#(%}3BlDNmZ$o)0(g-S_hv7X<-Xm~!A2{grF$64eS@#S}%s{zb*WrE}0mwvR0v+Q{^!@&%O=_r@ zP-h8^d-CE3jw=^l3HJZJbHOl!WvXZ>d}tI0qR0!J0g#gL-nln@aFMkR2(*vpQxeVGTOP?}2v3BL#i@Rs{aV&0Q zjQ$T*i3WAH4YnD`rZwTzp#5f1{byU1;8>(m(b^F?yL`cWt21b!mF*d28~|;g8PPlZ zX0RG_*sCm?2gwa{UC#KGO;(nS|Aeo-EE+`Zl`=Mz9rw5H64)2FGxkM*p}Xo*K@H^p zOutON-!`cH7k{}|1wR%S2!wBo4N)F)3Dk)dzt{G2m=CECyzLw*X2fq)|!dC~iQ)q>9-zo7{vs7NyC=6bdBq$Zro4WSNXUu_T+zIY6&% zEG1jz?9_bNpuFZ6k$oji^-ac%$VlfTt-EezL@bs5>X>)u$Z;Dzvjgzi`ozE`k()mI z9G5@GG(Z!rkcX-6Ij4yd74iD2dYXApMH*u>==sF z^D;U{c`M3F*J?e^W(l&IeL~K65T|#0O8B-yD=?h|ssFCYf5%v4HjTPI!V9#oi!p;) z7;#S}awAAjIx~-1?Y;Dp?E`H}`M<^H@-H=J=qwT}CzZD@PMd++LZPeL_vq(c;>$ZS z18HLtxO^Bpa|ySOi?zLssAgM5RGHK&93y;XIvy+=`z`E~d5`)gbKY_2LHp;k%GRSB z{}3u=&pv^`EuG4X%H%$%+#ctf!lX$~A0p6jA8_gvj!qI9XuSx11D7?NUR^A~_R#$72|M+mvHOQfVa013*IUVL zaEqt0sMoU32*(_LFI|*OXYcSssqz$}PJRWif?hOHD6<2`;J;#6<{*m)D3W#j?~#m? z7m~;dkO$lKO6B`LizBj}jrOR9f-j!i;L8LIkGH>|`sRmG>SdOt~~+j>7vfD#rS{h#{J z1T|}V<--gDjB*5E6v3AS7-e4Em?Uj{{1P!{4@B_NhypVy2cn+{N2@a>bt~LgS|$6r z^owkP`I850JSr!;1z&{U2Gh_aSy1|SbA=45_E-cuKrP$xLHa=8z|-@d+1Pif0II31 zh}%BiFEcKFiy8@lk}ddi_<7yl5T^~2)F05bLy>Ub=-CS=UP|(x+rw`?HckX_9L*`~ zD*B~e3t<_kSnsXH=FZ;-JvyP<1wvGyw6;77ZEPwmiAmxD(b_HSb^9mvLw`3ftQ~F` z0GNico)E*!&2NDocvfWQnAtu38rQQ=7&GvHVNqH@bA(gH-w8c`@Pb6N{HNZ$@Q{~| z+3i54eY(CXEk>TPpk0TvUQ#A5x%WvlWcnW1On0o~`v6e==H0ia8c(?&;C2Oan#`1L z^^V%N>MwIQHx~7C*v_Ex1*Usy2R;|mu{_W${lXvz&eci^4vxOI5v_>u?J?+Csw4bg zOp5#5UFjFN@4TTK#d}v(ux^?$Rcmciu1;b3dxHSiVqEgp($Bg+or2YVi+x%=t2BE- zAO`_E8HalF`|1oDnOY8Ct#fHS_1tcBY6d{zXHr$X_)3aD*f*6Ay0|~U_K?}brxtrX zZk?l(`XtPr*7!tod?NaXSBd{mQsqjPv=)#ej0&@{R#q);4wdO}JAyk0j=pu1;FL@# zU_KM?r4HV`rb?MuKK4B47L^5N?EKJ>8omA4d(g0!Lfi{S4YtupmUBT>{1r>mMuB$siwu$O&*X^wf1l2K*eBtgvMl;UPs5Pd^6Yx)#a>+QC9v7 zu(LN@AYm;r$m9RK;C8Y-Wtv(-kh4EWM94f#DHqOcuO4fW+*nPla+35;c~$JS$C4^D8s zBby!!p9+!8)kb%R@ZJUABg^#szYEdX$ZKPkj_VIp^6WN#bl5fv6y?!M0Oy`+6?W7| zN^dtmXDlEwnL4EX%QjRK>7Mz{w4*@43H#aFejVJ*L;Fv`&<*ockOf7g@!SWf5P9+4PGN1QW)0pSM5BHztjeG#$aoh z_z6cR@We5)yrKi#Et5pcddX!h-qpv8d`ya*ay>S9$xA3nls6gvE3kk46h_ZN>Q%lK zBOUUhADS9LXdyLCUChuKYb6bgPH^JVcWvZ%!P#8x>G*+Le14wlo{f>>4V+=?(|a`d zGp(KWhq&?-+X`qEuER}&3N`Z46HQ{Z}-bT1W}t>jGFt^RB;fsN$%?Wvp&)- zY|)Ay-;mFz3*PL@khkZb@gycZG`Jr)!yku*I^zL8xz^ACZEfu;kB&rD{Zhr3nplH9&F@5+j@=BFkv&a1PN&+fVQO2Gfo*?kebYSeq z9_XWUzA#YDo(sXrXl?BRvH*W)Nd5BrYLz&v_XTT3^LLLe3Q}3~{Zv(kXT8w zBwTiaGz34#=Y-O8Mua81um~ugJqYpfu$4~#id4(?OH}GEda~{t7yiS6dXKJ)IZ5g}+lX`WJEy)sK*uFVY~Z)tZVsT>_!Ka7*g0=fc3> z1_i0sc_e6I!LA)eKhC2U;c$q>k&%a$>cH5r?reZM&rV`LCtgX;1A zcpBW5nZ1WE7V0uiJE-fM+P6&ykj=wTimGn-dJtZ*69T)1<4+)AGg^P|1Y44R(NOyV zze7#@hyjMcCNS;eWFj8o&PNIiILmiJ&$*{&%x|)WN^eQmZ*Nn1A);T#rgU7mUNUW= zJs~K+;3T8xL}%~DBt~j1(<#SHZr>fiuZ{5C}@-l zRXo226c09vAUOi<+QnY3@oZl*N?bbHFtm(mDeKBb;khsR7mXo9daq&S+Z*zFAQUGC zl7ezp<+X8`YyCq-!ZmfO`_myE??0Ilm5l2SSioE~y`WzWqWd$LrszZpW!;S@Gl4Oe zNvb*KU`?>YUkTRT|Gfj^730$AsY0~`L&{jH1p_%M%+MZCE_sHZbDUBJ(W5~%sY+Z6 zNme;-+P9)s^`7PEp_SWpSf#Rq?l_8JvQydk-tXmn7#A_KOeqxU5<}w3jo^ zZo~X5ruS>9Wb3N#T*Mxwiwx!E?=6I8kVwnL=fT)(RJm}h-#us7IA)U* zo~?|rZqDCgDV+9iZbtOhHz?q7ka>4s>Tf6`r_^pW)*_LgB}BXw8hCTI2;~J5J(_1d zoE>*W+vc3*H`ZqgBCz^W^}7pq+z)+GH6P^p-gSnjX~F#t;#@isLt?afu-D&A@cD5b zx^5SYT)}&1Hb!5mQF}PS;w?|L_FKh);>r50FrXLZ|AB`)pY4?v&f56pHhLIoE%P5W zyfT;1?Xnw$>YvXbKf8}Pm_0C@GSm9kboG*4>niGR(~rhxpQa1`KIn?&nN?_1&Gd`% zzotU8Oe_?oYcDt8#r4=H9g823C*HU|XAWmxp5YtB<83DwdgEIvvXn zpmXsFW~mdEk*vY4Rcn?>76na-WTg2RpI92{ z)APOi9mV)bx^DW=ps{uWmpOlX)&q~SVC^!_^+m+3n= z+35Mi>PP6p#(6$9{2Cbq3wPQmdU{+Rp4`b}EQ=+34yx0m_SQ0r=eOs8e`ftJBcvEpdUJ#%{W zc$-A+YE()CCAYlbMw~}3Xjd7mUNel5T5~&y zbB+~1C9%4|8Q@qUjNSb$R`BoVwY)P}f^fyBvI9C!tWh0{yW>%h{voc853~s6v{iS8 z7U*qBJtwR#XL1)rAdV1?QH4Kcy7d!{nSKYnLRc|5bm8*bC-Fe6yax&(WYqWXo9hra zQ6!FhsthNIDQUcEr+(mUn0M<+F0rfWkhGdjfL`AufSB$%w2652aQ=g5<)7hMi)VP& z&nH!N1-_c2MDOj{dUrMq|KYP%+|Kx{Xsg?}`L^ZxnesuiKM_lFI^{6A>z})!-fFpv?xy0d zLOZ>dMcSuXa(}i`8V`^B_=U0o*3O2^NYNYn~O5R>% zjK=@Q$arAbq7};B0|xu@Y`W?bNvBoYMRZ41zM#Uh&Ten4Rx=185~_9nBcpvKrLv*? zC?w>%?5S=S%L3>iy&Hbzu!DebP4OS!V!m|oR5!eO=O3u7qzaqK4VoSff?;=PT%Eh` zr@npkieBZ_7eDeJ{ZOGT4z_KDzuon1R*jFJ^f)ek;-gW->m8N=XGM_WH!wH{QJqTG zBg|m4%oA7zu2GJQN~+*#9f~!|Y^^Wk?(vY&%bEnb@vA@!1WRG-Qp}52{5m;ZT(EmV zW(;t(Hf+eC`vttMbPO+xZa(Ylf=CrwoD_cPw?2s=R_r_$0Snn*;Qr$NGyswX0;8Rx zijeQou-@Nx3Q;dkVm~Y!*a3=`)gE;8F_z&yr1F;vmH4pi7^_JX$&DlN16PnD?qy#d zm#y$etA@PGeKL+OMG$}j|9UL!uSCjs5~345Upk7Upm^*uS!W5ysVmMe5^}Aks{po> zu|$$}NaBM1(!DQs7a1pYD;^*?iV45}SA=af9 z=KIu-5RaBkMN6&9>cK6uV{cKN%L=R~H`l)Yb?H93oc_Hr`Rck{*SyAPxbu@B>9X?R zEVaceW=Q{S&~5ZZ#`0($G*!-SBj#y8GO-6jLWktXYQ`$?YH)l3tHQXm%&tr){4Zv{ zd*(3P%;y3=W6`S#w_gFP4jFXpC@9OrWgWHg2JJM$R%g1(kX+>N@_neN;HUo}cyho_ zv%3m-Vgh%(;z88i?1Mok1bjl}S?)=@*%=&H2&oso;#g+tY}yG>wxNYQ7#9qm28g(= zd=&o6{7%MV%9jc5dl^8+D8OZT8VBvIx^&!`ype(fg>2OJwQ@#HE*XrJ8Gkv5YGe9oH0NFH(3wjGC^(b zImpvl`&Am*g(Zm^WInP5KiHa9-G`94Ug=nb?o+GK=l$l1)OjdteUj$o68~h(ZgiDe z4-ZM}a1Jb?#R@{GVL;G;OUIrF|n z02dZTB|ohNIZn&jD~E2WmL*}J>oENQM8f>a7_%X6eK;SsR2so|SwA4|;cVP1c zbXI4evwAZ@qBt8Tu;*ORF&ZGwx(d43NdcbM`k-{zvLkTs-J_!y?4v>J zJ?wQ48CeXUi=>s5Vu7fdH9GvQMSyPfs)Q%&pO<&))k<$G6)s6$clU)v>Ax(^{nW-B zmN#{zNJM&>H=IxRyd5oGhc?{Z=fyKD7vAT%IYMhHZ)E-Nu+u~&zrY_q4gA5C=JX;P zmk#O)uPvbl0q*1bvzk&9-nr9<(&E`PJ#oaDgL1)CommC&_+<5e1Fl{ zs1*HU>u~Za)n&0JoC;-gQ_bdXgvBQQWkC_Bs0ZI9B!>$V-x!x#bWbNk_jxza8t2E= zgSl6+I~a*b|9W*~#aX6kweX(Kr|R#oKwQjt<{2*d2^@^zO7PY{0WmIW4!?xL%u}S` zc6A?^kRGNU1sjcy-qIes9z`7(8p1%vLq>J-RJx#(Kk}uYs$c>3q)er`42r)ZRqyTx zz22#mnkET0B?zThfm(79(@ZrY;wyL3?E0ccn zRNR6_=GME;b~Kevsmalby}t@g;989!V2(Romvr)+W?hB8_&ZNC=>8&bQ>(bXL&1iq z;?4q{-I(qk6Z;a56XgN<5H=Y8z%%}TarT~3O?}(Hw~B&D zQ&EaEE2wk=B3(oQrP-*VSCJBWkrELBl@dX!lz>Q)E&)O>f^-N)YJkvN2rWQJLXx}r zoqPVzGsbhrJ!d?O{elR<`1w8dMROkIB@JgCleM|-u9ba=+S3CI{V=??V2O+)5oTWk+c^Or zsX~i!m9jD1Te4nVONQB}qOHe3(8pf*9L~D;z?nqiY`WHnGgO&p7z+Qv*7LC{xJOK1 z;uxyUu3dLVYDi^xPz7j4TtoelzA;MpzNdGA#871qtnl-NrowVG>!YVMZ4JO=gMV+t za)rfptPa{Gu&w+k`YScXpQ6yz&v(SM<$*_UI+BWuGWSs3Gqg-XUKTWobk(xL%)RZb zF(9_XlZ3nsC)nt$|8`L&4K3c@5d_qp>dhikfMiUd(D7K4^8fDfX%4?HH02eCb4uIo z%`@ivmxKWk&Ns;i|-4@Wh69;oL zJ#ug5@Z#9_0_#8T+DvQaA>>ivBh;adQd3H6@E1UeH*hS$qBzHc&YYrydfwv~P5A#W@#gEdlh^s?UfYj8E|Aixzx(~5mF3%+*W8l4 zf$A5J*Xik<5fz_+M#{B-^=qc^T$rRbRMRiybo^JUBS-NIezQXnr(@A2q_%^7I+09s zH8gOT+!U|x!!_>eNa~Hz%1ddwoob|eBOUrb?Y1#{+YWU)c}FI`cu>Y9V37C)XXKEq zY{!8;b~p6f*8{YE!G(YVG*OcJydIM?2EJ1Iw19F83*_oEM#t{R(|;L}0W2oZ3#8nn zfXt6YTT@geD)zpfTWEuCTQKls7O~L9W`S%9Xr(E}v$GTkZHmzMN$2gQ4M};wG-_)* z|4%AW>K$F$A)VO4igkFS?x6e5xKp$hiEsYK*LHtOv~zX0Y2R@_N|+yu&-Cg6=IAnV zYq@Yb#7wrjC0)fWwC>38G+|~_CD${_lT09$u5S?Jo#4>mekhEEES>e@nXcK}ri6B3 z;z$wg6ff=DUWTGzbR;a!x|pf>J~oe(avTFTVQ6urY9WRuT0*UJ5_iy z2dne*c^*ezg8J`vIZ>;V$#AyESL|k6C*(d7HS>6X2Z;f0f`IKO;OzIyQ;2|G>* zv{0|sJwg9tbz!>M)U9tO;&bF3CGowO0-T`mu8=Yf@js`if_tLEbf*Z#dbMa3l0s#F zi)1#NM(tJGfZDi3YRWgN+$v+KHx?GO*y)-&qP+&UA0Nk-E}Y|8{|%f>=(vwT4=`9% zqGf%xd%p)0kN|#y#LK@;fKSLA_7Z>22K@f9h*t8q-{<_$es#k=f{rn?OP5rp3^;++6p~3!FgTun;gzq zo;j#OdM{tw2@?;@3K%IgA4#?F2>+J^SLAMU4i8!r;gJjg)_1o#Jq$)i3lDD8@E%vC zk67GAtlLYk0U#Y*pELaBzBifurH+a!f60?icGfy-JmWj@1+;(rGYSp+n)!#Ikyz|L zPrT2iH4-f8N&h~ohl#g^jry=3P~FmM)i$xL{)efYZwmUGTA^Y=m}vOEd#Pby_K-?~ zn20v51P|B3tgED&e@6g2LW4wk>M$NT_Uc@IHV#5q#AFV(Gu%# zYb#}9n||p({R@>-c^RgRq10#{VZcF}q&!;+f_M$(mCAphZQlNv2pA|145=)w!*eE- zcngM9ZeiiLu*TC?-mpEr37|+vdxoDaBA8R2M~I)L zI@cz2SkfAJO_uSvTjsP~<=~SOJagmcBNUdCZKfV`HnahjWCUM}qj}D0Eep~M-yTuq zhkEEy2hjj^D8aQa0 z&-hqb>^7EfZSJcz{qr9Yt~m=11yOEy30So74qel1z%?|@AJDenl*+^*N;ALcm`MX? z^cFnjL?*#Ui6{*2k?(fR*6aO8cP<2T=Q+IstPUTi{r%@>js%-tD*xEko*R8`MXXmE z&Z@I&$ih}BaPi{A=*cIvZTIfEnbY~5{T|VC9~=QY$WzN-zI2kJfZ29C@zrCy!=me| zKUS)*+4F?~_J?nver<6&48OB}m`;1Ht4bFC&! zxc2BZe)qnV^9a!9^Py!5!rL*|<$eCSlRb_=I~+5VTgb6N{x&~2X!2j?l*vc?V{d|4 zsw{vmhQ@_|>5>UM|NC|WYa$MAN(tpx+-`N6<}zf)~$Mk!!QPZ6*pT@WA}r6W!L5k8CSYHrWnzufXa!e`07oNmY{v|LI2p_~EP}6+0~EMN`!9{&^{Hw!k&`a`$OAg{Ptd;dwuyfDXy6 z9!V?Bi@A2l_n*hpl>XED?1Cbg?xfMMEmF z=QeZgEojb7nY}WAIj#F&_e;6KcK}}so(_2(!1UvIfu+crues9lI1e$Wn-J?BF{eqI zVhbd&6Bgszs_KeeFvo4{Kd9LOM1O~V#DW9K1i>6bj9TZCX#!)`(;Z`|U_ z-?3uwifiqfpzq;a1Y1{p8X(VhXH8C={e2Tml-7NyzF#Wbx147M2()Rr#AAW>8|Wd( zJoecUrsLRAQ&z+5$i_mt{fRI6%lu#&ho;nY{O$xDpa_8{Rt6AvIR~frd|$o z(`kOu6i{X>l=#*2@Q$*-VB=}ntuugF4`A|g)0oncdwMse#r~D4 zEy9KR8Pc?9?|Omk5)f+_29Vm}dwTU^?k+E&?=PDgn)I$wQM(HRfV9pb3CiVmo}b=1 zMxP{9ZmA+eQK%z1Opo3$>}!2zwxCCHIM@eN-~c{gxPp2yo=GF{uR>G;;QQVqG(1RW zc9a7(NTSNQVP&UXXjsR7Tul#;*T#-VX;Z%Nw!q3ml?;@d;^)gv)P`UL^z62aD|KMO z@B41Y1K?$|c~@|kQ*b-Rx4xCKUP^s){wNtrCJ$0YxBoWa)3>}<(tXV}8vz#7^n?RE z{qrThEt9lg;Z{jj@9#7#U+%cm^8Nvz(Ys8W^eEp1)eIdr+$+F$u<>EzWjnkP&BR${ zh5im88mI4=`GhY0M>MX?7y*dJU7!7bMdM*HPsI||{3`|I3`G>-f40Sat+;CczF~|J zO@jgz!AGq7IS<9CFTP!-tSm22XE}%k+jyUE6X;gq}f zRPx8Up(p6&$Da=2?6S-!x(D=FzE$)~_j}~~zcP20qZ*P2-HuWsMH2?+2=Ep7U;GD3 z1#eZvm9<<3^`(jaPn5Pi;u?7}NWC@-{o{|1dZpxDJsg>z?%`I(E)r~=Sw@2rtf9?R z-h$z?8Uh-R6)%|4D9+A?dS)~to!@#7?m{#xtzk^*7b*v;zE=I*ACXCu*bH7yw_DGk zE#dg9pUd07G8f^asj>RRY{2tNJEKi!(b9!mDg00FEnN^u(C|N0Nwp$8pi)-mz6QDH za{pu3$iNBv>ca+fc19ORG)DQ@f2|6n>fJFVSc=44S;*dfmdNUH9D4(z_mwT^TK{^+ zYvKYt9I?k%A-69^*;&WX@sm(bX{Rp(fePPopkhfVT09b_ush5;u41gm0^|0VJ7W@= zi#>WO6-u8(-;3XXccE3}NGlLjLl0j?ODW-y73KsObxC;mTl|e$={&RZ-2b56Dvq=g z)6kzznCa`AD{)%|oRWP?1E#SC)uZJF!^aL1m2YAW{80hs)rX^GRMyrsvJ_w6NNCuq zxdBs@TBHmLP+|k9csS;cY)l&nr8sN`kargHO}sw?K%)P6G(S3<=HAY|34mzenqb7_ z$9ruKl@10(ccm4%rnwnlX{`=rQy#}nRucpBV7hgEd1aqmUXEGD5`@E9>kQK-gGQ{F1KV zTZ=;@BkGeHH|#dQC%wWJN zXCMFx@MiOCrh7O9uqWRV(pD5Z?1e@C=@J7>8vfI9kb$r$q~fm$u)F`$dH?qZ{_QuWY;a0|cGxj(!;eoM zXa|r&CdZIn)=I*A&idwtWtmdOHA9P_N`<)(?BTZY|K-X59|r@QTV+sM@bT(g2hcl5 z_}mvSY+^0Qwdls6fazsq<9_jW&7Q($b?ZNV{KxkxJ?}pb&3}JD{*9}`|1=Z*H#bTS@L|YM z(<&E!dIAE42kze4TrW&THmv~hdd(1Qc{c+&o5j*8u>#bstvw)vJUw+5u*&N33z&Wv0GH*YH1`@qb<~j$^m~ z$XmB+05lkQ?wIgbMo2N$MV(x z=4k$QtTmTG@5=*t^ppS9VKfcg=EhpGp~HXuV4MHy{fOEhRO1Qy~7KNtA8c8y~eU)R?02{^^n2vj<35^8rbH+}cW4V^uz! zy_Pa{I;xb8f%SvC43iCG2V%e-K-OT~eP{gh04P9f)6;;M|p0z7C_*VoN+zWg$KQ8Sn2SRD%53F>Wu?)3vMSP05&CTs|8)hK|{_ey3fR z5-N2+0vM~cb<;Rk*0CWIUkqi_ce;bNv;eRO}PX?ry=m#)X$+kn_U|j8bZmO#X z5)&Ly#%MRZ7yZ66wGm3Ay6s{|i@_JpmSt^KFT`Btfeb`cXmHeuo5ZpkWnSd(xh-kx zY5C5kL-HlS<=R5AD(wxt730$%yN`D>b$3}RJf??udg47dX9%@Og`Gwrj$c)$corE{ z4ntbUEAMG0HAv~k6xO)L%$0cFbXYV-muYc0Ry%|?wvbM*e4iq&0pDjKSptmGO@Jz) zVe#@BUq}A}YLHI^RK6S2o0EvmFZg(KU5;0ze_DQAzgp}UtKFDVac}ZfyTuxJSR7Ohls--I@lk zf7|SPCNZwVGlTtad?yP}s@%CBHgS8oXbQ zhRLrAweBD7-C57{HIQG`ECqdMm3Q546Y}TVn`2{3&$g3zN^>5sw%R_%?1aMhR)1xE zHZ(r9+zDVoQbKi7?|H8~LFttJHa($Evz*=zq~1E`gkv-RxwK_UV8Vi>f{2&P%3tKG z3C9VEpbjUO*n}av19>w!GyMrIz0{KdYn?Y3sP0A(aeuQVTn;SIZ`_z1ikzWu1m@ek4`KtB1fh0ZVx8bL93h!hDn?0Ir z_22ij4d^`TTR#-5 zUHyK>4uhW|um+Rzpl{udb~;#&)F)?^35}@Pw7fJ>HL%8MBnE8-%&>R2&@(P=0>DdM zrX(KYwTmDtS>-uK7y+u6Pw7xmZik+8R0(T>U%7fzk;j4^PK7j1fXLA;t^5buEu*1T ztZuNN^`CjH#|R~6pUo*buUEj2Ixs638@fMQnXzBwz;dMaP|bVq*0YE=qV}~;4Syp6 z{1O|v_D#{6fxuFK6PVRxN}k`lJH??SO}C|TkEdyeCp1ENFDtYd%=X4itIh|vZrAR? z1|4su2eX+UUfC#qeMU;GZlnBZlA_hNU#a1H)}2~9>VklPcNcqou~;J0q0kh5ZB!mB6V1*}q+9?iySi88W=ophgHzYwqbpL;K<%_*ZzcxBWZuf}aX4cNY%(2~jX1Pe5m zDZoZH@N%}Q>)PwSJfI4-_ZoQW@?j}W(e*w`&Y^; z3n3?Bm^*#0(FS3`dylqIV#LUU$Mua}z&B?ah8caK`-&@GTbm{81;|>1(h~j3H|^ZRW99*(<_@7`Y_KPI z`X0z!a#pfew}01X{*zEU`7+Lux5}aMb--?y5a(kpw)?a1s^%{Xj)sLYiI;2I1qV(f zrb+*ti$N*TOyAHwIr6R&u;0sr00?8XG=rt7aGuevi1G@oGA9dn>bc;kT;ADSj2Vl&gHoXd%43e`*yoBUhq!qyW{B2ex*wiRHxoaGrdpqI z8R(vh!~vL%XW)!49jTC-oNGL|PW?g!VNXOcsfy>z80lK5pQv`N=IM6&kmFUu(XH|u zqfNYt{m&hbislYQ0R^x2>k>8LvHCWW03DL%Zr_oo&Ao2xnn){dy=~gvqh(X^8{lg3 zSj2f%$JlNog5+_tL6rTmm-ed@OoZm=$va*Efv=scm!T-vfbUlr7RvCuuC)L6y2}^>)#-o!jAX*yc@>rs1#tRRiYv?4JsLnKris67%ZC zhD7CN(T;hfA)|QxT=8_Dbw^c;D{=Zjp7~4TqPM#3<=rmoK&rL@4uSf6r;ucpH}R%$ zaLn=b3K$j}nA|JL*WD=D{!O*sP-?K-!U5}@t#4>1(*R(v&NZPnY3*NJAJwY4xXzM$ z7g^AQRAr|;$QiX}BW64Kk88q2<)i|sC~i5)&lpQ0^(?I(L^o+025nLXZuel%>8VK4 z+yGS6)trs{jqpBw7I-?5yN%d>NF_AE#SnW^I~n@)JHUi5XD%zrg)411n7oAIJ}!z3 z*Q|UK&InkH)wseBZ}(&8Szx&`e+Lh6Ued$;8jf0IPa|I7wpJz3=z|F0Cm%%XSM)^Mbq~zKrBYthiMkAoC*EDaEl$qT^GH{;n2$0BT@qB;uCgKr zYr!u_g(X-?tb(_9-3JFCV^+BNgL!W&hSqgStn`mt!%K04ig zE(BZJqjvtaN|-dzL||9{(z0aFV54?M{ctlv=653 zqrVU(kFv$aBuziWl-uu~$?>XqnDXoML+q!5qlV7wOb$!t zE|nuMGN!+uAGLxZq*mPo3bQl~C4F;>x!U0V%PEpOBJo|xgR=so)tf0|Lr)co?~;M> z=|5Jrs)gWK)nZ}()`<g+yY^c?^9RHCHP4Oy;o3|t`io&+&z_@_>)J{joN-{)JpuW(n{>GBGm1iv2&^%e}o9xFM!=p^};CjAf zZ3OO<)m2mDGVV<)vq|ZqPcv>4dcnJ2SZih~ z20m*(vy=wt5^8=^fs|8h-#zR%I(2#B6jMwQx}is`&X$~Qb>3lGWOwJ7$8{b)BCCE` zK-)1Nf1w5-GTIZ20A_m7#Yyq2+rL`&d)M7WKW21sPj-%snWkIcZbLi{w$Fz}Fj0O-hmWxcg zWp}SyJUi^VVfsb<_ONn%7iV`fL**G;qErua^j|x{P0jG1I`n-~_)O->QWJW~)QR^F z1J2J*c)M)vqFw9y;*txHs{#hgKq|7jyeJ}Y{>z5R)K`+P|4&v=D;B=xTBl+Ao)kAK zFo?BLa^$okGjo6x|Jsu#`vQPS~N6t^9uy6oPOKpA$5IS!k_!= zn3lD&hrG7Fa$v^WUlu9Jb7NbhketbS_V*fzK852r<15Lf~q zjYG`-Zkg5+Td}%jrV+lJK$HPCS28!=OhC z0 zb#+471HE3qVfMQZjRVi6{!tOHm>5T1ob&)Se1I?tstzC@))lOSB}4s!pJl8Gd)IF* zEu9V$RvcDDSD!{jT$6J**7A5?pJ9AW==1LLTcx|i_4X}e2W|-o8K5Lfxj>wV#snXt zjeQOeO#S9ULb57y>Xq9c9|V8FeD! zcI#boT6HnZ(cIm*Oj*$L^^HvAcJc71ncaa)U_eYXJS;iI+bN(zIe`2ay9E+wZ zq-*i{YTdntKaJcQqSPhaD=ct(rU{ zpJg|GUy$EUYC5`Q=9rTpRTIL=NbAj_lm1$`tQ%D87_oTQ7?Lxcs{I_}!}2d%au$3>)g4qeMQgil(4l64l!~o+W2hbh8_6Lc~r3|KhvC#2un{LhLjTPb?92T z^bYI|W$9MDF@WcLUIc!-niXN+-Pkm9fSmS0k3WG3zmU(AAdvK|Mk!#F8n?3S{ zs&2}uEi^s3+U9Y{UP#sJv7L}|Aj#Q|@kxuxVAnh9EqlKIBQ%yPY0jtEg?RsuPHOQ) z`-x2ZtXo8>YUj{t7|v^02YkoEnaCs%K_TthH5h%k5umO0)E_W9pxi-pc}&@h8BFKk7o|lGK=y3VHczn zAvbrJxwzg_f5V|F!=E&cbnZ<^N7j&Y8GyJ2LX;_24o`;_m(E;np-&XyUM^E4tQm~?VR+2z0=`R!y;Lf|Ei zA3Y2@tk018wVl3A}+4O3m^w`2N{!h28Y zkCs|L2{CtyHa27g?sj>_$O$rkl>t&nrljtk(#351^f!U9zWetB+A!>9A^qSOD_chn zZF{1$GX@HZWexTGyeRB=nDcNWg9|GZCSxS3)O4%g%y-%@slDF-8jV}QU%0XVIzm?~ zF?o*KahfyPD+6p^ugYtq5*mi%ZSM-azaRf{-XG#8%~v}ugVhn#O%9qRJCB($G@{fO z$T@ueba|bbT_Qpyd}~`EK~|%NQ5={E@RT0_4XAG!aj7fF{OQBS%Z*kW!BwI|TAFEH zXAlhO<0W{s9H8Yf!hCK(4F(04Rc-BGhR$rEE2-vHa0uLj1ws4V4HgvQI{WID&}Jif zGdaOv_reWt|Gepybmubq%C&l~yIk63G%C5H)|L_Zec&nhTBCb6Pg}~-?{_~A3C&Gy zwRb@uU&0N>I@7U`tG~zOX6}0)MUtEJV`qRq5S;*uIgLys5gmja|=Y^;kNgxVr zwSD?UT#(jd+x_Azy}kO%@NU8d^b0qrs}(T9=UpylG?iQKBv&d=wvhUgSSf16#y;Ie z8)5IU0&Q*=dz&R{^yH9HSHkYKQ`etqzT;Ls_}!lTdsRnWbA&}G|02rkioB1QwB zsd=L4Q)Xfn8|!8tg!;_mY}Am2WeCxRYQ+8;(I?9$FvZkn6OZz(MR0sfaM<);?q`05 zc1GyP=YbVIab5~ZxiSSwY%%WRfZ3oSvK9Q#ecWMGVt=1~c=C4wu&zrPOp%e1 zZT8o?lO#-r=VLjkSC)Fdh^RI?^Dp+CVq)bhj1$NAg7gF}R>#%F&_T&MYWZ>E_bflK zn%N%S6)uhA#vN{_`!@O`2x4|KPWq<> z&lh8Xl{#ZibNUgxcPj}w^epT3Q1YEXzi74&hrr!}uLv2UrHO2s#JDO*NWNE_F5Nh{ zwf7$O9Z$e|H0#}}3V-@s7v9MTfn?7ae>L?7QGEv+7Z^B)D}*M0C2@OuB?y<+znQIJ z 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 Date: Wed, 11 Dec 2024 00:07:09 +0530 Subject: [PATCH 02/16] Using both value from config as they might not be correct. (#2817) * Using both value from config as they might not be correct. * Fixing max_position_embeddings for falcon. * Simple attempt to fix the healthcheck block allocation. * Much simpler solution. * Default value for Backend start_health --- backends/v2/src/backend.rs | 4 ++++ backends/v3/src/backend.rs | 4 ++++ backends/v3/src/client/sharded_client.rs | 6 +++--- router/src/infer/mod.rs | 9 ++++++++- .../models/custom_modeling/flash_rw_modeling.py | 1 + server/text_generation_server/models/flash_causal_lm.py | 6 +++++- 6 files changed, 25 insertions(+), 5 deletions(-) diff --git a/backends/v2/src/backend.rs b/backends/v2/src/backend.rs index bc264138..cfe87f98 100644 --- a/backends/v2/src/backend.rs +++ b/backends/v2/src/backend.rs @@ -104,6 +104,10 @@ impl Backend for BackendV2 { } .is_ok() } + + fn start_health(&self) -> bool { + true + } } /// Batching logic diff --git a/backends/v3/src/backend.rs b/backends/v3/src/backend.rs index 7ae794a0..736301b3 100644 --- a/backends/v3/src/backend.rs +++ b/backends/v3/src/backend.rs @@ -111,6 +111,10 @@ impl Backend for BackendV3 { } .is_ok() } + + fn start_health(&self) -> bool { + true + } } /// Batching logic diff --git a/backends/v3/src/client/sharded_client.rs b/backends/v3/src/client/sharded_client.rs index 6d4e207b..4701c560 100644 --- a/backends/v3/src/client/sharded_client.rs +++ b/backends/v3/src/client/sharded_client.rs @@ -217,8 +217,8 @@ impl Health for ShardedClient { input_chunks: Some(Input { chunks: vec![Chunk::Text("liveness".into()).into()], }), - truncate: 10, - add_special_tokens: true, + truncate: 1, + add_special_tokens: false, prefill_logprobs: false, parameters: Some(NextTokenChooserParameters { temperature: 1.0, @@ -241,7 +241,7 @@ impl Health for ShardedClient { top_n_tokens: 0, // Block 0 is reserved for health checks blocks: vec![0], - slots: (0..16).collect(), + slots: vec![0], cache_len: 0, adapter_id: None, chunk_len: None, diff --git a/router/src/infer/mod.rs b/router/src/infer/mod.rs index 86606643..6497d857 100644 --- a/router/src/infer/mod.rs +++ b/router/src/infer/mod.rs @@ -33,6 +33,13 @@ pub trait Backend { ) -> Result>, InferError>; async fn health(&self, current_health: bool) -> bool; + + /// The state of the health on startup + /// Typically false, or true if the backend includes + /// a warmup phase. + fn start_health(&self) -> bool { + false + } } /// Inference struct @@ -75,7 +82,7 @@ impl Infer { let semaphore = Arc::new(Semaphore::new(max_concurrent_requests)); // Backend health - let backend_health = Arc::new(AtomicBool::new(false)); + let backend_health = Arc::new(AtomicBool::new(backend.start_health())); Self { validation, diff --git a/server/text_generation_server/models/custom_modeling/flash_rw_modeling.py b/server/text_generation_server/models/custom_modeling/flash_rw_modeling.py index 2dcd1bf3..fbf1a597 100644 --- a/server/text_generation_server/models/custom_modeling/flash_rw_modeling.py +++ b/server/text_generation_server/models/custom_modeling/flash_rw_modeling.py @@ -78,6 +78,7 @@ class RWConfig(PretrainedConfig): self.alibi = False self.rotary = True self.rope_theta = rope_theta + self.max_position_embeddings = 2048 self.vocab_size = vocab_size # Backward compatibility with n_embed kwarg diff --git a/server/text_generation_server/models/flash_causal_lm.py b/server/text_generation_server/models/flash_causal_lm.py index 07b7604d..5d376990 100644 --- a/server/text_generation_server/models/flash_causal_lm.py +++ b/server/text_generation_server/models/flash_causal_lm.py @@ -1304,6 +1304,7 @@ class FlashCausalLM(Model): self.num_layers = config.num_hidden_layers self.num_heads = config.num_attention_heads // self.process_group.size() + self.config = config # Validation is done in the model itself if num_kv_heads is None: num_kv_heads = getattr(config, "num_key_value_heads", None) @@ -1594,7 +1595,10 @@ class FlashCausalLM(Model): if max_total_tokens is None: if get_support_chunking(): model_max_length = self.tokenizer.model_max_length - max_total_tokens = min(num_blocks * BLOCK_SIZE, model_max_length) + max_position_embeddings = self.config.max_position_embeddings + max_total_tokens = min( + num_blocks * BLOCK_SIZE, model_max_length, max_position_embeddings + ) else: max_total_tokens = sum(batch.cache_lengths) From cc66dccbe8faba2f2c19ca575bdb9958b68145e8 Mon Sep 17 00:00:00 2001 From: RodriMora Date: Wed, 11 Dec 2024 19:45:49 +0100 Subject: [PATCH 03/16] Update README.md (#2827) Added instructions to clone the repo and change directory into it. In following steps there is a "make install" step that would fail if people have not cloned the repo and cd into it, so it may be confusing for some Added python venv alternative to conda too. --- README.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 631a97a2..6beb8281 100644 --- a/README.md +++ b/README.md @@ -196,14 +196,26 @@ Detailed blogpost by Adyen on TGI inner workings: [LLM inference at scale with T You can also opt to install `text-generation-inference` locally. -First [install Rust](https://rustup.rs/) and create a Python virtual environment with at least -Python 3.9, e.g. using `conda`: +First clone the repository and change directoy into it: + +```shell +git clone https://github.com/huggingface/text-generation-inference +cd text-generation-inference +``` + +Then [install Rust](https://rustup.rs/) and create a Python virtual environment with at least +Python 3.9, e.g. using `conda` or `python venv`: ```shell curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +#using conda conda create -n text-generation-inference python=3.11 conda activate text-generation-inference + +#using pyton venv +python3 -m venv .venv +source .venv/bin/activate ``` You may also need to install Protoc. From 07b01293c53d8596940b1fb90c858f330de5a400 Mon Sep 17 00:00:00 2001 From: Nicolas Patry Date: Thu, 12 Dec 2024 01:33:50 +0530 Subject: [PATCH 04/16] Prepare patch release. (#2829) --- Cargo.toml | 2 +- docs/source/basic_tutorials/gated_model_access.md | 2 +- docs/source/conceptual/quantization.md | 6 +++--- docs/source/installation_amd.md | 2 +- docs/source/installation_intel.md | 4 ++-- docs/source/installation_nvidia.md | 2 +- docs/source/quicktour.md | 4 ++-- docs/source/reference/api_reference.md | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 806c94a0..d8155153 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,7 @@ default-members = [ resolver = "2" [workspace.package] -version = "3.0.1-dev0" +version = "3.0.2-dev0" edition = "2021" authors = ["Olivier Dehaene"] homepage = "https://github.com/huggingface/text-generation-inference" diff --git a/docs/source/basic_tutorials/gated_model_access.md b/docs/source/basic_tutorials/gated_model_access.md index 60b347b1..7c32f0b3 100644 --- a/docs/source/basic_tutorials/gated_model_access.md +++ b/docs/source/basic_tutorials/gated_model_access.md @@ -19,6 +19,6 @@ docker run --gpus all \ --shm-size 1g \ -e HF_TOKEN=$token \ -p 8080:80 \ - -v $volume:/data ghcr.io/huggingface/text-generation-inference:3.0.0 \ + -v $volume:/data ghcr.io/huggingface/text-generation-inference:3.0.1 \ --model-id $model ``` diff --git a/docs/source/conceptual/quantization.md b/docs/source/conceptual/quantization.md index 953e3683..f7cc8929 100644 --- a/docs/source/conceptual/quantization.md +++ b/docs/source/conceptual/quantization.md @@ -19,7 +19,7 @@ bitsandbytes is a library used to apply 8-bit and 4-bit quantization to models. In TGI, you can use 8-bit quantization by adding `--quantize bitsandbytes` like below 👇 ```bash -docker run --gpus all --shm-size 1g -p 8080:80 -v $volume:/data ghcr.io/huggingface/text-generation-inference:3.0.0 --model-id $model --quantize bitsandbytes +docker run --gpus all --shm-size 1g -p 8080:80 -v $volume:/data ghcr.io/huggingface/text-generation-inference:3.0.1 --model-id $model --quantize bitsandbytes ``` 4-bit quantization is also possible with bitsandbytes. You can choose one of the following 4-bit data types: 4-bit float (`fp4`), or 4-bit `NormalFloat` (`nf4`). These data types were introduced in the context of parameter-efficient fine-tuning, but you can apply them for inference by automatically converting the model weights on load. @@ -27,7 +27,7 @@ docker run --gpus all --shm-size 1g -p 8080:80 -v $volume:/data ghcr.io/huggingf In TGI, you can use 4-bit quantization by adding `--quantize bitsandbytes-nf4` or `--quantize bitsandbytes-fp4` like below 👇 ```bash -docker run --gpus all --shm-size 1g -p 8080:80 -v $volume:/data ghcr.io/huggingface/text-generation-inference:3.0.0 --model-id $model --quantize bitsandbytes-nf4 +docker run --gpus all --shm-size 1g -p 8080:80 -v $volume:/data ghcr.io/huggingface/text-generation-inference:3.0.1 --model-id $model --quantize bitsandbytes-nf4 ``` You can get more information about 8-bit quantization by reading this [blog post](https://huggingface.co/blog/hf-bitsandbytes-integration), and 4-bit quantization by reading [this blog post](https://huggingface.co/blog/4bit-transformers-bitsandbytes). @@ -48,7 +48,7 @@ $$({\hat{W}_{l}}^{*} = argmin_{\hat{W_{l}}} ||W_{l}X-\hat{W}_{l}X||^{2}_{2})$$ TGI allows you to both run an already GPTQ quantized model (see available models [here](https://huggingface.co/models?search=gptq)) or quantize a model of your choice using quantization script. You can run a quantized model by simply passing --quantize like below 👇 ```bash -docker run --gpus all --shm-size 1g -p 8080:80 -v $volume:/data ghcr.io/huggingface/text-generation-inference:3.0.0 --model-id $model --quantize gptq +docker run --gpus all --shm-size 1g -p 8080:80 -v $volume:/data ghcr.io/huggingface/text-generation-inference:3.0.1 --model-id $model --quantize gptq ``` Note that TGI's GPTQ implementation doesn't use [AutoGPTQ](https://github.com/PanQiWei/AutoGPTQ) under the hood. However, models quantized using AutoGPTQ or Optimum can still be served by TGI. diff --git a/docs/source/installation_amd.md b/docs/source/installation_amd.md index 3c9c0eec..033add75 100644 --- a/docs/source/installation_amd.md +++ b/docs/source/installation_amd.md @@ -11,7 +11,7 @@ volume=$PWD/data # share a volume with the Docker container to avoid downloading docker run --rm -it --cap-add=SYS_PTRACE --security-opt seccomp=unconfined \ --device=/dev/kfd --device=/dev/dri --group-add video \ --ipc=host --shm-size 256g --net host -v $volume:/data \ - ghcr.io/huggingface/text-generation-inference:3.0.0-rocm \ + ghcr.io/huggingface/text-generation-inference:3.0.1-rocm \ --model-id $model ``` diff --git a/docs/source/installation_intel.md b/docs/source/installation_intel.md index a5578e76..3329b476 100644 --- a/docs/source/installation_intel.md +++ b/docs/source/installation_intel.md @@ -12,7 +12,7 @@ volume=$PWD/data # share a volume with the Docker container to avoid downloading docker run --rm --privileged --cap-add=sys_nice \ --device=/dev/dri \ --ipc=host --shm-size 1g --net host -v $volume:/data \ - ghcr.io/huggingface/text-generation-inference:3.0.0-intel-xpu \ + ghcr.io/huggingface/text-generation-inference:3.0.1-intel-xpu \ --model-id $model --cuda-graphs 0 ``` @@ -29,7 +29,7 @@ volume=$PWD/data # share a volume with the Docker container to avoid downloading docker run --rm --privileged --cap-add=sys_nice \ --device=/dev/dri \ --ipc=host --shm-size 1g --net host -v $volume:/data \ - ghcr.io/huggingface/text-generation-inference:3.0.0-intel-cpu \ + ghcr.io/huggingface/text-generation-inference:3.0.1-intel-cpu \ --model-id $model --cuda-graphs 0 ``` diff --git a/docs/source/installation_nvidia.md b/docs/source/installation_nvidia.md index d954481e..71f3febd 100644 --- a/docs/source/installation_nvidia.md +++ b/docs/source/installation_nvidia.md @@ -11,7 +11,7 @@ model=teknium/OpenHermes-2.5-Mistral-7B volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run docker run --gpus all --shm-size 64g -p 8080:80 -v $volume:/data \ - ghcr.io/huggingface/text-generation-inference:3.0.0 \ + ghcr.io/huggingface/text-generation-inference:3.0.1 \ --model-id $model ``` diff --git a/docs/source/quicktour.md b/docs/source/quicktour.md index d1f3efa4..fc24a7a4 100644 --- a/docs/source/quicktour.md +++ b/docs/source/quicktour.md @@ -11,7 +11,7 @@ model=teknium/OpenHermes-2.5-Mistral-7B volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run docker run --gpus all --shm-size 1g -p 8080:80 -v $volume:/data \ - ghcr.io/huggingface/text-generation-inference:3.0.0 \ + ghcr.io/huggingface/text-generation-inference:3.0.1 \ --model-id $model ``` @@ -96,7 +96,7 @@ curl 127.0.0.1:8080/generate \ To see all possible deploy flags and options, you can use the `--help` flag. It's possible to configure the number of shards, quantization, generation parameters, and more. ```bash -docker run ghcr.io/huggingface/text-generation-inference:3.0.0 --help +docker run ghcr.io/huggingface/text-generation-inference:3.0.1 --help ``` diff --git a/docs/source/reference/api_reference.md b/docs/source/reference/api_reference.md index 42a77703..6b333fdc 100644 --- a/docs/source/reference/api_reference.md +++ b/docs/source/reference/api_reference.md @@ -163,7 +163,7 @@ hub = { # create Hugging Face Model Class huggingface_model = HuggingFaceModel( - image_uri=get_huggingface_llm_image_uri("huggingface",version="3.0.0"), + image_uri=get_huggingface_llm_image_uri("huggingface",version="3.0.1"), env=hub, role=role, ) From f01f2fb6e7acc9836f4c80fb942bfb09f8a3041b Mon Sep 17 00:00:00 2001 From: Guspan Tanadi <36249910+guspan-tanadi@users.noreply.github.com> Date: Thu, 12 Dec 2024 19:49:33 +0700 Subject: [PATCH 05/16] docs(README): supported hardware links TGI AMD GPUs (#2814) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6beb8281..6d3a9b12 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ curl localhost:8080/v1/chat/completions \ **Note:** To use NVIDIA GPUs, you need to install the [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html). We also recommend using NVIDIA drivers with CUDA version 12.2 or higher. For running the Docker container on a machine with no GPUs or CUDA support, it is enough to remove the `--gpus all` flag and add `--disable-custom-kernels`, please note CPU is not the intended platform for this project, so performance might be subpar. -**Note:** TGI supports AMD Instinct MI210 and MI250 GPUs. Details can be found in the [Supported Hardware documentation](https://huggingface.co/docs/text-generation-inference/supported_models#supported-hardware). To use AMD GPUs, please use `docker run --device /dev/kfd --device /dev/dri --shm-size 1g -p 8080:80 -v $volume:/data ghcr.io/huggingface/text-generation-inference:3.0.0-rocm --model-id $model` instead of the command above. +**Note:** TGI supports AMD Instinct MI210 and MI250 GPUs. Details can be found in the [Supported Hardware documentation](https://huggingface.co/docs/text-generation-inference/installation_amd#using-tgi-with-amd-gpus). To use AMD GPUs, please use `docker run --device /dev/kfd --device /dev/dri --shm-size 1g -p 8080:80 -v $volume:/data ghcr.io/huggingface/text-generation-inference:3.0.0-rocm --model-id $model` instead of the command above. To see all options to serve your models (in the [code](https://github.com/huggingface/text-generation-inference/blob/main/launcher/src/main.rs) or in the cli): ``` From c3bd7212c2e2dbcb1e176a39052283bb382000b1 Mon Sep 17 00:00:00 2001 From: Nicolas Patry Date: Thu, 12 Dec 2024 14:09:35 +0100 Subject: [PATCH 06/16] Fixing latest flavor by disabling it. (#2831) --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 3e94f730..6d867ebb 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -137,7 +137,7 @@ jobs: uses: docker/metadata-action@v4.3.0 with: flavor: | - latest=auto + latest=false images: | registry.internal.huggingface.tech/api-inference/community/text-generation-inference ghcr.io/huggingface/text-generation-inference From bf59118a93d5e7e50a5a00181067ece0481ca0de Mon Sep 17 00:00:00 2001 From: "Wang, Yi" Date: Thu, 12 Dec 2024 21:41:30 +0800 Subject: [PATCH 07/16] fix facebook/opt-125m not working issue (#2824) Signed-off-by: Wang, Yi A --- .../models/custom_modeling/opt_modeling.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server/text_generation_server/models/custom_modeling/opt_modeling.py b/server/text_generation_server/models/custom_modeling/opt_modeling.py index bd440321..a6348b5b 100644 --- a/server/text_generation_server/models/custom_modeling/opt_modeling.py +++ b/server/text_generation_server/models/custom_modeling/opt_modeling.py @@ -99,7 +99,7 @@ class OPTLearnedPositionalEmbedding(nn.Module): self.offset = 2 self.weight = nn.Parameter( weights.get_tensor( - f"{prefix + '.' if prefix else ''}decoder.embed_positions.weight" + f"{prefix if prefix else ''}decoder.embed_positions.weight" ) ) @@ -317,7 +317,7 @@ class OPTDecoderLayer(nn.Module): super().__init__() self.process_group = weights.process_group self.hidden_size = config.hidden_size - prefix = f"{prefix + '.' if prefix else ''}decoder.layers.{layer_id}" + prefix = f"{prefix if prefix else ''}decoder.layers.{layer_id}" self.self_attn = OPTAttention( config, prefix=f"{prefix}.self_attn", @@ -755,6 +755,8 @@ class OPTModel(OPTPreTrainedModel): class OPTForCausalLM(OPTPreTrainedModel): def __init__(self, prefix, config, weights): super().__init__(config) + if not prefix and any(s.startswith("model") for s in weights.routing.keys()): + prefix = "model" self.model = OPTModel(prefix, config, weights) From 3bb3fd19ae115484878e421649dba4b9549aa42a Mon Sep 17 00:00:00 2001 From: Nicolas Patry Date: Thu, 12 Dec 2024 18:20:13 +0100 Subject: [PATCH 08/16] Fixup opt to reduce the amount of odd if statements. (#2833) * Fixup opt to reduce the amount of odd if statements. * Fixing cargo lock --- Cargo.lock | 14 +++++++------- .../models/custom_modeling/opt_modeling.py | 11 ++++++++--- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9551ae2d..f0b756f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4367,7 +4367,7 @@ dependencies = [ [[package]] name = "text-generation-backends-trtllm" -version = "3.0.1-dev0" +version = "3.0.2-dev0" dependencies = [ "async-stream", "async-trait", @@ -4391,7 +4391,7 @@ dependencies = [ [[package]] name = "text-generation-benchmark" -version = "3.0.1-dev0" +version = "3.0.2-dev0" dependencies = [ "average", "clap 4.5.21", @@ -4411,7 +4411,7 @@ dependencies = [ [[package]] name = "text-generation-client" -version = "3.0.1-dev0" +version = "3.0.2-dev0" dependencies = [ "async-trait", "base64 0.22.1", @@ -4429,7 +4429,7 @@ dependencies = [ [[package]] name = "text-generation-launcher" -version = "3.0.1-dev0" +version = "3.0.2-dev0" dependencies = [ "clap 4.5.21", "ctrlc", @@ -4450,7 +4450,7 @@ dependencies = [ [[package]] name = "text-generation-router" -version = "3.0.1-dev0" +version = "3.0.2-dev0" dependencies = [ "anyhow", "async-stream", @@ -4501,7 +4501,7 @@ dependencies = [ [[package]] name = "text-generation-router-v2" -version = "3.0.1-dev0" +version = "3.0.2-dev0" dependencies = [ "async-stream", "async-trait", @@ -4550,7 +4550,7 @@ dependencies = [ [[package]] name = "text-generation-router-v3" -version = "3.0.1-dev0" +version = "3.0.2-dev0" dependencies = [ "async-stream", "async-trait", diff --git a/server/text_generation_server/models/custom_modeling/opt_modeling.py b/server/text_generation_server/models/custom_modeling/opt_modeling.py index a6348b5b..db73ae84 100644 --- a/server/text_generation_server/models/custom_modeling/opt_modeling.py +++ b/server/text_generation_server/models/custom_modeling/opt_modeling.py @@ -12,7 +12,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -""" PyTorch OPT model.""" +"""PyTorch OPT model.""" + import random from typing import List, Optional, Tuple, Union @@ -317,7 +318,6 @@ class OPTDecoderLayer(nn.Module): super().__init__() self.process_group = weights.process_group self.hidden_size = config.hidden_size - prefix = f"{prefix if prefix else ''}decoder.layers.{layer_id}" self.self_attn = OPTAttention( config, prefix=f"{prefix}.self_attn", @@ -478,7 +478,12 @@ class OPTDecoder(OPTPreTrainedModel): self.layers = nn.ModuleList( [ - OPTDecoderLayer(layer_id, prefix, config, weights) + OPTDecoderLayer( + layer_id, + prefix=f"{prefix}decoder.layers.{layer_id}", + config=config, + weights=weights, + ) for layer_id in range(config.num_hidden_layers) ] ) From ea7f4082c454e00e52d2fe06a757675c2f84843f Mon Sep 17 00:00:00 2001 From: Funtowicz Morgan Date: Fri, 13 Dec 2024 15:50:59 +0100 Subject: [PATCH 09/16] TensorRT-LLM backend bump to latest version + misc fixes (#2791) * misc(cmake) update dependencies * feat(hardware) enable new hardware.hpp and unittests * test(ctest) enable address sanitizer * feat(backend): initial rewrite of the backend for simplicity * feat(backend): remove all the logs from hardware.hpp * feat(backend): added some logging * feat(backend): enable compiler warning if support for RVO not applying * feat(backend): missing return statement * feat(backend): introduce backend_workspace_t to store precomputed information from the engine folder * feat(backend): delete previous backend impl * feat(backend): more impl * feat(backend): use latest trtllm main version to have g++ >= 13 compatibility * feat(backend): allow overriding which Python to use * feat(backend): fix backend_exception_t -> backend_error_t naming * feat(backend): impl missing generation_step_t as return value of pull_tokens * feat(backend): make backend_workspace_t::engines_folder constexpr * feat(backend): fix main.rs retrieving the tokenizer * feat(backend): add guard to multiple header definitions * test(backend): add more unittest * feat(backend): remove constexpr from par * feat(backend): remove constexpig * test(backend): more test coverage * chore(trtllm): update dependency towards 0.15.0 * effectively cancel the request on the executor * feat(backend) fix moving backend when pulling * feat(backend): make sure we can easily cancel request on the executor * feat(backend): fix missing "0" field access * misc(backend): fix reborrowing Pin<&mut T> as described in the doc https://doc.rust-lang.org/stable/std/pin/struct.Pin.html#method.as_mut * chore: Add doc and CI for TRTLLM (#2799) * chore: Add doc and CI for TRTLLM * chore: Add doc and CI for TRTLLM * chore: Add doc and CI for TRTLLM * chore: Add doc and CI for TRTLLM * doc: Formatting * misc(backend): indent --------- Co-authored-by: Hugo Larcher --- .github/workflows/build.yaml | 10 + .github/workflows/ci_build.yaml | 2 +- Cargo.lock | 55 +---- Dockerfile_trtllm | 21 +- backends/trtllm/CMakeLists.txt | 54 ++++- backends/trtllm/Cargo.toml | 9 +- backends/trtllm/build.rs | 34 +-- backends/trtllm/cmake/fmt.cmake | 6 - backends/trtllm/cmake/json.cmake | 4 +- backends/trtllm/cmake/spdlog.cmake | 4 +- backends/trtllm/cmake/trtllm.cmake | 9 +- backends/trtllm/csrc/backend.cpp | 79 +++++++ backends/trtllm/csrc/backend.hpp | 231 ++++++++++++++++++++ backends/trtllm/csrc/ffi.hpp | 162 ++++++++++++++ backends/trtllm/csrc/hardware.hpp | 81 +++++++ backends/trtllm/include/backend.h | 144 ------------ backends/trtllm/include/ffi.h | 75 ------- backends/trtllm/include/hardware.h | 59 ----- backends/trtllm/lib/backend.cpp | 203 ----------------- backends/trtllm/scripts/install_tensorrt.sh | 2 +- backends/trtllm/src/ffi.cpp | 89 -------- backends/trtllm/src/lib.rs | 22 +- backends/trtllm/src/looper.rs | 223 ++++++++----------- backends/trtllm/src/main.rs | 154 ++++++++----- backends/trtllm/tests/infer_test.cpp | 14 -- backends/trtllm/tests/test_backend.cpp | 152 +++++++++++++ backends/trtllm/tests/test_hardware.cpp | 82 +++++++ docs/source/_toctree.yml | 6 + docs/source/architecture.md | 4 +- docs/source/backends/trtllm.md | 81 +++++++ docs/source/multi_backend_support.md | 13 ++ router/src/server.rs | 4 +- 32 files changed, 1192 insertions(+), 896 deletions(-) delete mode 100644 backends/trtllm/cmake/fmt.cmake create mode 100644 backends/trtllm/csrc/backend.cpp create mode 100644 backends/trtllm/csrc/backend.hpp create mode 100644 backends/trtllm/csrc/ffi.hpp create mode 100644 backends/trtllm/csrc/hardware.hpp delete mode 100644 backends/trtllm/include/backend.h delete mode 100644 backends/trtllm/include/ffi.h delete mode 100644 backends/trtllm/include/hardware.h delete mode 100644 backends/trtllm/lib/backend.cpp delete mode 100644 backends/trtllm/src/ffi.cpp delete mode 100644 backends/trtllm/tests/infer_test.cpp create mode 100644 backends/trtllm/tests/test_backend.cpp create mode 100644 backends/trtllm/tests/test_hardware.cpp create mode 100644 docs/source/backends/trtllm.md create mode 100644 docs/source/multi_backend_support.md diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 6d867ebb..c0199a66 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -8,6 +8,7 @@ on: description: Hardware # options: # - cuda + # - cuda-trtllm # - rocm # - intel required: true @@ -52,6 +53,15 @@ jobs: export platform="" export extra_pytest="" ;; + cuda-trtllm) + export dockerfile="Dockerfile_trtllm" + export label_extension="-trtllm" + export docker_volume="/mnt/cache" + export docker_devices="" + export runs_on="ubuntu-latest" + export platform="" + export extra_pytest="" + ;; rocm) export dockerfile="Dockerfile_amd" export label_extension="-rocm" diff --git a/.github/workflows/ci_build.yaml b/.github/workflows/ci_build.yaml index 5190f321..0d87cb29 100644 --- a/.github/workflows/ci_build.yaml +++ b/.github/workflows/ci_build.yaml @@ -37,7 +37,7 @@ jobs: # fail-fast is true by default fail-fast: false matrix: - hardware: ["cuda", "rocm", "intel-xpu", "intel-cpu"] + hardware: ["cuda", "cuda-trtllm", "rocm", "intel-xpu", "intel-cpu"] uses: ./.github/workflows/build.yaml # calls the one above ^ permissions: contents: write diff --git a/Cargo.lock b/Cargo.lock index f0b756f9..74ae6e16 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2850,20 +2850,6 @@ dependencies = [ "urlencoding", ] -[[package]] -name = "opentelemetry" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c365a63eec4f55b7efeceb724f1336f26a9cf3427b70e59e2cd2a5b947fba96" -dependencies = [ - "futures-core", - "futures-sink", - "js-sys", - "once_cell", - "pin-project-lite", - "thiserror", -] - [[package]] name = "opentelemetry-otlp" version = "0.13.0" @@ -2963,24 +2949,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "opentelemetry_sdk" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692eac490ec80f24a17828d49b40b60f5aeaccdfe6a503f939713afd22bc28df" -dependencies = [ - "async-trait", - "futures-channel", - "futures-executor", - "futures-util", - "glob", - "once_cell", - "opentelemetry 0.24.0", - "percent-encoding", - "rand", - "thiserror", -] - [[package]] name = "option-ext" version = "0.2.0" @@ -4369,7 +4337,6 @@ dependencies = [ name = "text-generation-backends-trtllm" version = "3.0.2-dev0" dependencies = [ - "async-stream", "async-trait", "clap 4.5.21", "cmake", @@ -4377,16 +4344,14 @@ dependencies = [ "cxx-build", "hashbrown 0.14.5", "hf-hub", - "log", "pkg-config", + "pyo3", "text-generation-router", "thiserror", "tokenizers", "tokio", "tokio-stream", "tracing", - "tracing-opentelemetry 0.25.0", - "tracing-subscriber", ] [[package]] @@ -5086,24 +5051,6 @@ dependencies = [ "web-time 0.2.4", ] -[[package]] -name = "tracing-opentelemetry" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9784ed4da7d921bc8df6963f8c80a0e4ce34ba6ba76668acadd3edbd985ff3b" -dependencies = [ - "js-sys", - "once_cell", - "opentelemetry 0.24.0", - "opentelemetry_sdk 0.24.1", - "smallvec", - "tracing", - "tracing-core", - "tracing-log 0.2.0", - "tracing-subscriber", - "web-time 1.1.0", -] - [[package]] name = "tracing-opentelemetry-instrumentation-sdk" version = "0.16.0" diff --git a/Dockerfile_trtllm b/Dockerfile_trtllm index 3ccb0310..b4523ea5 100644 --- a/Dockerfile_trtllm +++ b/Dockerfile_trtllm @@ -1,5 +1,5 @@ ARG CUDA_ARCH_LIST="75-real;80-real;86-real;89-real;90-real" -ARG OMPI_VERSION="4.1.6" +ARG OMPI_VERSION="4.1.7rc1" # Build dependencies resolver stage FROM lukemathwalker/cargo-chef:latest AS chef @@ -10,7 +10,7 @@ COPY . . RUN cargo chef prepare --recipe-path recipe.json # CUDA dependent dependencies resolver stage -FROM nvidia/cuda:12.6.1-cudnn-devel-ubuntu22.04 AS cuda-builder +FROM nvidia/cuda:12.6.3-cudnn-devel-ubuntu24.04 AS cuda-builder RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt,sharing=locked \ @@ -18,18 +18,21 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ build-essential \ cmake \ curl \ - gcc \ - g++ \ + gcc-14 \ + g++-14 \ git \ git-lfs \ libssl-dev \ + libucx-dev \ ninja-build \ pkg-config \ + pipx \ python3 \ python3-dev \ python3-setuptools \ tar \ - wget + wget && \ + pipx ensurepath ENV TGI_INSTALL_PREFIX=/usr/local/tgi ENV TENSORRT_INSTALL_PREFIX=/usr/local/tensorrt @@ -83,13 +86,15 @@ RUN mkdir $TGI_INSTALL_PREFIX && mkdir "$TGI_INSTALL_PREFIX/include" && mkdir "$ cd backends/trtllm && \ CMAKE_INSTALL_PREFIX=$TGI_INSTALL_PREFIX cargo build --release -FROM nvidia/cuda:12.6.1-cudnn-runtime-ubuntu22.04 AS runtime -RUN apt update && apt install -y python3-minimal python3-dev python3-pip && \ +FROM nvidia/cuda:12.6.3-cudnn-runtime-ubuntu24.04 AS runtime +RUN apt update && apt install -y libucx0 pipx python3-minimal python3-dev python3-pip python3-venv && \ rm -rf /var/lib/{apt,dpkg,cache,log}/ && \ - python3 -m pip install transformers tokenizers + pipx ensurepath && \ + pipx install --include-deps transformers tokenizers WORKDIR /usr/local/tgi/bin +ENV PATH=/root/.local/share/pipx/venvs/transformers/bin/:$PATH ENV LD_LIBRARY_PATH="/usr/local/tgi/lib:/usr/local/mpi/lib:/usr/local/tensorrt/lib:/usr/local/cuda/lib64/stubs:$LD_LIBRARY_PATH" ENV TOKENIZERS_PARALLELISM=false ENV OMPI_MCA_plm_rsh_agent="" diff --git a/backends/trtllm/CMakeLists.txt b/backends/trtllm/CMakeLists.txt index 831372cd..9c1f3436 100644 --- a/backends/trtllm/CMakeLists.txt +++ b/backends/trtllm/CMakeLists.txt @@ -13,10 +13,11 @@ if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0") endif () project(tgi-trtllm-backend VERSION 1.0.0) -set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD 23) include(FetchContent) include(ExternalProject) +include(CheckCXXCompilerFlag) option(TGI_TRTLLM_BACKEND_BUILD_TESTS "Enable building the unittests suite" OFF) option(TGI_TRTLLM_BACKEND_BUILD_EXAMPLES "Enable building the examples suite" OFF) @@ -29,11 +30,20 @@ set(TGI_TRTLLM_BACKEND_TRT_LIB_DIR "${TGI_TRTLLM_BACKEND_TRT_ROOT}/lib" CACHE ST find_package(CUDAToolkit 12.6 REQUIRED COMPONENTS CUDA::cudart CUDA::nvml) #### External dependencies #### -include(cmake/fmt.cmake) include(cmake/json.cmake) include(cmake/spdlog.cmake) include(cmake/trtllm.cmake) +if(${CMAKE_BUILD_TYPE} STREQUAL "Debug") + add_compile_definitions(TGI_TRTLLM_BACKEND_DEBUG=1) +endif() + +# This attempt to detect if the compiler can emit warning if it can't apply return value optimization from a function +check_cxx_compiler_flag("-Wnrvo" COMPILER_SUPPORT_WARNING_ON_NVRO) +if(${COMPILER_SUPPORT_WARNING_ON_NVRO}) + set(CMAKE_CXX_FLAGS "{CMAKE_CXX_FLAGS} -Wnvro") +endif() + # Let's build TRTLLM as part of CMake add_subdirectory("${trtllm_SOURCE_DIR}/cpp" "${trtllm_SOURCE_DIR}/..") @@ -41,15 +51,21 @@ add_subdirectory("${trtllm_SOURCE_DIR}/cpp" "${trtllm_SOURCE_DIR}/..") set_target_properties(executorWorker PROPERTIES SKIP_BUILD_RPATH TRUE) # TGI TRTLLM Backend definition -add_library(tgi_trtllm_backend_impl STATIC include/backend.h lib/backend.cpp include/hardware.h) +add_library(tgi_trtllm_backend_impl STATIC csrc/hardware.hpp csrc/backend.hpp csrc/backend.cpp) include_directories(${TGI_TRTLLM_BACKEND_TRT_INCLUDE_DIR}) target_include_directories(tgi_trtllm_backend_impl PRIVATE - $ - $ + $ +# $ ) target_include_directories(tgi_trtllm_backend_impl PUBLIC "${trtllm_SOURCE_DIR}/cpp/include") -target_link_libraries(tgi_trtllm_backend_impl PRIVATE tensorrt_llm nvinfer_plugin_tensorrt_llm tensorrt_llm_nvrtc_wrapper CUDA::cudart CUDA::nvml) -target_link_libraries(tgi_trtllm_backend_impl PUBLIC nlohmann_json::nlohmann_json spdlog::spdlog fmt::fmt) +target_link_libraries(tgi_trtllm_backend_impl PRIVATE CUDA::cudart CUDA::nvml) +target_link_libraries(tgi_trtllm_backend_impl PUBLIC nlohmann_json::nlohmann_json spdlog::spdlog) + +if(${CMAKE_BUILD_TYPE} STREQUAL "Debug") + target_link_libraries(tgi_trtllm_backend_impl PRIVATE tensorrt_llm nvinfer_plugin_tensorrt_llm) +else() + target_link_libraries(tgi_trtllm_backend_impl PRIVATE tensorrt_llm nvinfer_plugin_tensorrt_llm tensorrt_llm_nvrtc_wrapperm) +endif () # This install all the artifacts in CMAKE_INSTALL_PREFIX under include/ lib/ bin/ to make easy to link / find it back install(TARGETS tgi_trtllm_backend_impl tensorrt_llm nvinfer_plugin_tensorrt_llm decoder_attention executorWorker) @@ -60,16 +76,30 @@ if (${TGI_TRTLLM_BACKEND_BUILD_TESTS}) message(STATUS "Building tests") FetchContent_Declare( Catch2 - GIT_REPOSITORY https://github.com/catchorg/Catch2 - GIT_TAG v3.6.0 + URL https://github.com/catchorg/Catch2/archive/refs/tags/v3.7.1.tar.gz ) FetchContent_MakeAvailable(Catch2) - # add_executable(tgi_trtllm_backend_tests tests/infer_test.cpp) - # target_link_libraries(tgi_trtllm_backend_tests PRIVATE tgi_trtllm_backend_impl Catch2::Catch2WithMain nlohmann_json::nlohmann_json spdlog::spdlog fmt::fmt CUDA::cudart CUDA::nvml) + add_executable(tgi_trtllm_backend_tests tests/test_hardware.cpp tests/test_backend.cpp) + target_include_directories(tgi_trtllm_backend_tests PUBLIC "${trtllm_SOURCE_DIR}/cpp/include") + target_include_directories(tgi_trtllm_backend_tests PUBLIC "csrc/") + target_link_libraries(tgi_trtllm_backend_tests PRIVATE ${TRTLLM_LIBS} CUDA::cudart CUDA::nvml) + target_link_libraries(tgi_trtllm_backend_tests PUBLIC Catch2::Catch2WithMain nlohmann_json::nlohmann_json spdlog::spdlog tgi_trtllm_backend_impl) + + if(${CMAKE_BUILD_TYPE} STREQUAL "Debug") + target_link_libraries(tgi_trtllm_backend_tests PRIVATE tensorrt_llm nvinfer_plugin_tensorrt_llm) + else() + target_link_libraries(tgi_trtllm_backend_tests PRIVATE tensorrt_llm nvinfer_plugin_tensorrt_llm tensorrt_llm_nvrtc_wrapperm) + endif () + + if(CMAKE_BUILD_TYPE MATCHES "Debug") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -fsanitize=undefined -fsanitize=address") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -fsanitize=undefined -fsanitize=address") + target_link_options(tgi_trtllm_backend_tests BEFORE PUBLIC -fsanitize=undefined PUBLIC -fsanitize=address) + endif() list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/extras) include(CTest) include(Catch) - # catch_discover_tests(tgi_trtllm_backend_tests) + catch_discover_tests(tgi_trtllm_backend_tests) endif () diff --git a/backends/trtllm/Cargo.toml b/backends/trtllm/Cargo.toml index 97ef1a76..5d907109 100644 --- a/backends/trtllm/Cargo.toml +++ b/backends/trtllm/Cargo.toml @@ -7,20 +7,21 @@ homepage.workspace = true [dependencies] async-trait = "0.1" -async-stream = "0.3" +#async-stream = "0.3" clap = { version = "4.5", features = ["derive"] } cxx = "1.0" hashbrown = "0.14" hf-hub = { workspace = true } -log = { version = "0.4", features = [] } +#log = { version = "0.4", features = [] } text-generation-router = { path = "../../router" } tokenizers = { workspace = true } tokio = { version = "1.39", features = ["rt", "rt-multi-thread", "parking_lot", "signal", "sync"] } tokio-stream = "0.1.15" thiserror = "1.0.63" tracing = "0.1" -tracing-opentelemetry = "0.25" -tracing-subscriber = { version = "0.3", features = ["json", "env-filter"] } +#tracing-opentelemetry = "0.25" +#tracing-subscriber = { version = "0.3", features = ["json", "env-filter"] } +pyo3 = { workspace = true } [build-dependencies] cmake = "0.1" diff --git a/backends/trtllm/build.rs b/backends/trtllm/build.rs index 98501926..0a0f6e6b 100644 --- a/backends/trtllm/build.rs +++ b/backends/trtllm/build.rs @@ -4,7 +4,7 @@ use std::env; use std::env::consts::ARCH; use std::path::{absolute, PathBuf}; -const ADDITIONAL_BACKEND_LINK_LIBRARIES: [&str; 2] = ["spdlog", "fmt"]; +const ADDITIONAL_BACKEND_LINK_LIBRARIES: [&str; 1] = ["spdlog"]; const CUDA_ARCH_LIST: Option<&str> = option_env!("CUDA_ARCH_LIST"); const CUDA_REQUIRED_VERSION: &str = "12.6"; const MPI_REQUIRED_VERSION: &str = "4.1"; @@ -43,8 +43,8 @@ fn build_backend(is_debug: bool, opt_level: &str, out_dir: &PathBuf) -> (PathBuf install_path = absolute(out_dir).expect("cannot happen").join(install_path); } - let _ = cmake::Config::new(".") - .uses_cxx11() + let mut config = cmake::Config::new("."); + config.uses_cxx11() .generator("Ninja") .profile(match is_debug { true => "Debug", @@ -53,9 +53,16 @@ fn build_backend(is_debug: bool, opt_level: &str, out_dir: &PathBuf) -> (PathBuf .env("OPT_LEVEL", opt_level) .define("CMAKE_INSTALL_PREFIX", &install_path) .define("CMAKE_CUDA_COMPILER", "/usr/local/cuda/bin/nvcc") + .define("Python3_ROOT_DIR", "../venv") .define("TGI_TRTLLM_BACKEND_TARGET_CUDA_ARCH_LIST", cuda_arch_list) - .define("TGI_TRTLLM_BACKEND_TRT_ROOT", tensorrt_path) - .build(); + .define("TGI_TRTLLM_BACKEND_TRT_ROOT", tensorrt_path); + + // Allow to override which Python to use ... + if let Some(python3) = option_env!("Python3_EXECUTABLE") { + config.define("Python3_EXECUTABLE", python3); + } + + config.build(); // Additional transitive CMake dependencies let deps_folder = out_dir.join("build").join("_deps"); @@ -90,26 +97,25 @@ fn build_ffi_layer(deps_folder: &PathBuf, is_debug: bool) { CFG.include_prefix = "backends/trtllm"; cxx_build::bridge("src/lib.rs") .static_flag(true) - .include(deps_folder.join("fmt-src").join("include")) + .std("c++23") .include(deps_folder.join("spdlog-src").join("include")) .include(deps_folder.join("json-src").join("include")) .include(deps_folder.join("trtllm-src").join("cpp").join("include")) .include("/usr/local/cuda/include") .include("/usr/local/tensorrt/include") - .file("src/ffi.cpp") - .std("c++20") - .define("NDEBUG", ndebug) + .include("csrc/") + .file("csrc/ffi.hpp") + .define("TGI_TRTLLM_BACKEND_DEBUG", ndebug) .compile("tgi_trtllm_backend"); println!("cargo:rerun-if-changed=CMakeLists.txt"); println!("cargo:rerun-if-changed=cmake/trtllm.cmake"); println!("cargo:rerun-if-changed=cmake/json.cmake"); - println!("cargo:rerun-if-changed=cmake/fmt.cmake"); println!("cargo:rerun-if-changed=cmake/spdlog.cmake"); - println!("cargo:rerun-if-changed=include/backend.h"); - println!("cargo:rerun-if-changed=lib/backend.cpp"); - println!("cargo:rerun-if-changed=include/ffi.h"); - println!("cargo:rerun-if-changed=src/ffi.cpp"); + println!("cargo:rerun-if-changed=csrc/backend.hpp"); + println!("cargo:rerun-if-changed=csrc/backend.cpp"); + println!("cargo:rerun-if-changed=csrc/hardware.hpp"); + println!("cargo:rerun-if-changed=csrc/ffi.hpp"); } fn main() { diff --git a/backends/trtllm/cmake/fmt.cmake b/backends/trtllm/cmake/fmt.cmake deleted file mode 100644 index afd6ea5f..00000000 --- a/backends/trtllm/cmake/fmt.cmake +++ /dev/null @@ -1,6 +0,0 @@ -FetchContent_Declare( - fmt - DOWNLOAD_EXTRACT_TIMESTAMP - URL https://github.com/fmtlib/fmt/archive/refs/tags/11.0.2.tar.gz -) -FetchContent_MakeAvailable(fmt) diff --git a/backends/trtllm/cmake/json.cmake b/backends/trtllm/cmake/json.cmake index 67eff2fe..d6cdbe3a 100644 --- a/backends/trtllm/cmake/json.cmake +++ b/backends/trtllm/cmake/json.cmake @@ -1,6 +1,6 @@ fetchcontent_declare( json - DOWNLOAD_EXTRACT_TIMESTAMP - URL https://github.com/nlohmann/json/releases/download/v3.11.3/json.tar.xz +# DOWNLOAD_EXTRACT_TIMESTAMP + URL https://github.com/nlohmann/json/archive/refs/tags/v3.11.3.tar.gz ) fetchcontent_makeavailable(json) diff --git a/backends/trtllm/cmake/spdlog.cmake b/backends/trtllm/cmake/spdlog.cmake index 7f529a7d..45e6790a 100644 --- a/backends/trtllm/cmake/spdlog.cmake +++ b/backends/trtllm/cmake/spdlog.cmake @@ -1,6 +1,6 @@ set(SPDLOG_USE_FMT ON) set(SPDLOG_BUILD_SHARED OFF) -set(SPDLOG_FMT_EXTERNAL ON) +set(SPDLOG_FMT_EXTERNAL OFF) # Define the level at which SPDLOG_ compilation level is defined if (${CMAKE_BUILD_TYPE} STREQUAL "Debug") @@ -11,7 +11,7 @@ endif () fetchcontent_declare( spdlog - DOWNLOAD_EXTRACT_TIMESTAMP +# DOWNLOAD_EXTRACT_TIMESTAMP URL https://github.com/gabime/spdlog/archive/refs/tags/v1.14.1.tar.gz ) fetchcontent_makeavailable(spdlog) diff --git a/backends/trtllm/cmake/trtllm.cmake b/backends/trtllm/cmake/trtllm.cmake index 5f1b6c19..4217892b 100644 --- a/backends/trtllm/cmake/trtllm.cmake +++ b/backends/trtllm/cmake/trtllm.cmake @@ -11,6 +11,7 @@ set(CMAKE_CUDA_ARCHITECTURES ${TGI_TRTLLM_BACKEND_TARGET_CUDA_ARCH_LIST}) message(STATUS "Building for CUDA Architectures: ${CMAKE_CUDA_ARCHITECTURES}") +set(ENABLE_UCX OFF) if (${CMAKE_BUILD_TYPE} STREQUAL "Debug") set(FAST_BUILD ON) set(NVTX_DISABLE OFF) @@ -20,11 +21,13 @@ else () set(NVTX_DISABLE ON) endif () +find_package(Python3 REQUIRED Interpreter) + fetchcontent_declare( trtllm - GIT_REPOSITORY https://github.com/NVIDIA/TensorRT-LLM.git - GIT_TAG 201135e58aa525af7e523d091d4c9584229524bc - GIT_SHALLOW FALSE + GIT_REPOSITORY https://github.com/huggingface/TensorRT-LLM.git + GIT_TAG 1bb9ca4688805444f203647674bac1d7219d0579 + GIT_SHALLOW ON DOWNLOAD_EXTRACT_TIMESTAMP ) fetchcontent_makeavailable(trtllm) diff --git a/backends/trtllm/csrc/backend.cpp b/backends/trtllm/csrc/backend.cpp new file mode 100644 index 00000000..b50044d8 --- /dev/null +++ b/backends/trtllm/csrc/backend.cpp @@ -0,0 +1,79 @@ +#include + +#include +#include + +#include "backend.hpp" +#include "hardware.hpp" + +namespace huggingface::tgi::backends::trtllm { + tle::ParallelConfig backend_workspace_t::parallel_config() const { + // Single engine (TP = PP = 1) -> using leader mode (no MPI involved) + const auto world_size = config_["/pretrained_config/mapping/world_size"_json_pointer].get(); + + auto mode = tle::CommunicationMode::kLEADER; + std::optional orchestratorConfig = std::nullopt; + + if (world_size > 1) { + SPDLOG_INFO("Detected sharded engine deployment, using orchestrator mode"); + mode = tle::CommunicationMode::kORCHESTRATOR; + orchestratorConfig = std::make_optional(true, executor_worker_path_, nullptr, true); + } else { + SPDLOG_INFO("Detected single engine deployment, using leader mode"); + } + + return tle::ParallelConfig(tle::CommunicationType::kMPI, mode, std::nullopt, std::nullopt, orchestratorConfig); + } + + + tle::ExecutorConfig backend_workspace_t::executor_config() const { + // Retrieve the compute capabilities to enable some options at runtime + const auto compute_capabilities = hardware::cuda::compute_capabilities_t(); + + // Allocate the config + tle::ExecutorConfig executor_config(/* maxBeamWidth = */ 1); + + // Set the parallel config as inferred + executor_config.setParallelConfig(parallel_config()); + + // Define some configuration variables + executor_config.setKvCacheConfig(tle::KvCacheConfig(true)); + executor_config.setEnableChunkedContext(compute_capabilities.is_at_least_ampere()); + executor_config.setSchedulerConfig(tle::SchedulerConfig(tle::CapacitySchedulerPolicy::kMAX_UTILIZATION)); + return executor_config; + } + + backend_t::backend_t(std::filesystem::path &engines_folder, std::filesystem::path &executor_worker_path) + : workspace(engines_folder, executor_worker_path), executor_(executor_factory_initializer(workspace)) {} + + size_t backend_t::num_tokens_ready() const noexcept { + return executor_.getNumResponsesReady(); + } + + std::expected + backend_t::submit(std::span token_ids, const generation_params_t generation_params, const sampling_params_t sampling_params) noexcept { + SPDLOG_DEBUG("Submitting {:d} tokens to the executor for scheduling ({}, {})", token_ids.size(), generation_params, sampling_params); + return executor_.enqueueRequest(tle::Request { + {token_ids.begin(), token_ids.end()}, // Making actual copy of the tokens + static_cast(generation_params.max_new_tokens), + true, + (tle::SamplingConfig) sampling_params, + tle::OutputConfig { /* returnLogProbs= */ true }, + std::nullopt, + std::nullopt, + std::nullopt, + std::nullopt, + workspace.generation_config().stop_words + }); + } + + std::vector backend_t::pull_tokens() noexcept { + SPDLOG_TRACE(FMT_STRING("Pulling out tokens ({:d} available)"), num_tokens_ready()); + return executor_.awaitResponses(); + } + + void backend_t::cancel(request_id_t request_id) noexcept { + SPDLOG_TRACE(FMT_STRING("Cancelling request: {:d}"), request_id); + executor_.cancelRequest(request_id); + } +} diff --git a/backends/trtllm/csrc/backend.hpp b/backends/trtllm/csrc/backend.hpp new file mode 100644 index 00000000..f49c437a --- /dev/null +++ b/backends/trtllm/csrc/backend.hpp @@ -0,0 +1,231 @@ +#ifndef TGI_BACKEND_TRTLLM +#define TGI_BACKEND_TRTLLM + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +namespace huggingface::tgi::backends::trtllm { + namespace tle = tensorrt_llm::executor; + using json = nlohmann::json; + using request_id_t = uint64_t; + using token_id_t = tle::TokenIdType; + + /** + * Represent the parameters used for generation + */ + struct generation_params_t { + uint32_t max_new_tokens; + }; + + /** + * Represent the parameters used to sample tokens from the logit distribution + */ + struct sampling_params_t { + uint32_t top_k; + float_t top_p; + float_t repetition_penalty; + float_t frequency_penalty; + float_t temperature; + uint64_t seed; + + constexpr explicit operator tle::SamplingConfig() const { + return tle::SamplingConfig{ + 1, + top_k, + top_p, + std::nullopt, + std::nullopt, + std::nullopt, + seed, + temperature, + std::nullopt, + std::nullopt, + repetition_penalty, + std::nullopt, + frequency_penalty, + std::nullopt + }; + } + }; + + /** + * Represent possible values from transformers generation `generation_config.json`. + * It usually stores default sampling parameters to use, such as top_p, temperature, etc. + */ + struct generation_config_t { + float_t top_p; + float_t temperature; + std::list> stop_words; + + constexpr explicit generation_config_t(const json &config) : + top_p(config.value("top_p", 1.0f)), temperature(config.value("temperature", 1.0f)), stop_words(0) { + if (config.contains("/eos_token_id"_json_pointer) && config["/eos_token_id"_json_pointer].is_array()) { + const auto &eos_token_id = config["/eos_token_id"_json_pointer]; + std::for_each(eos_token_id.begin(), eos_token_id.end(), [this](const auto token_id) { + stop_words.emplace_back(1, token_id.template get()); + }); + + SPDLOG_DEBUG("Detected {:d} predefined stop_words from generation_config.json", stop_words.size()); + } + } + }; + + /** + * Helper class representing various items which are stored within the TensorRT-LLM engines folder and + * can be retrieved at runtime + */ + class backend_workspace_t { + private: + constexpr static auto as_json = [](const std::filesystem::path &path) -> json { + std::ifstream config_f(path); + return json::parse(config_f); + }; + + std::filesystem::path engines_folder_; + std::filesystem::path executor_worker_path_; + json config_; + generation_config_t generation_config_; + + public: + backend_workspace_t(std::filesystem::path &engines_folder, std::filesystem::path &executor_worker_path) : + engines_folder_(engines_folder), + executor_worker_path_(executor_worker_path), + config_(as_json(engines_folder / "config.json")), + generation_config_(as_json(engines_folder / "generation_config.json")) {}; + + backend_workspace_t(std::filesystem::path &&engines_folder, std::filesystem::path &&executor_worker_path) : + engines_folder_(engines_folder), + executor_worker_path_(executor_worker_path), + config_(as_json(engines_folder / "config.json")), + generation_config_(as_json(engines_folder / "generation_config.json")) {}; + + /** + * Path to the folder containing the TensorRT-LLM engines + * @return local filesystem path to the folder + */ + [[nodiscard]] constexpr std::filesystem::path engines_folder() const { return engines_folder_; } + + /** + * Hugging Face transformers' generated `generation_config_t` mapping information stored in the + * `generation_config.json` holding default generation parameters. + * @return `generation_config_t` + */ + [[nodiscard]] constexpr const generation_config_t &generation_config() const { return generation_config_; } + + /** + * Factory method returning new `tensorrt_llm::executor::ParallelConfig` instance used + * to initialize `tensorrt_llm::executor::Executor` with multi-instance communication information + * @return `tensorrt_llm::executor::ParallelConfig` instance + */ + [[nodiscard]] tle::ParallelConfig parallel_config() const; + + /** + * Factory method returning new `tensorrt_llm::executor::ExecutorConfig` instance used + * to initialize `tensorrt_llm::executor::Executor` + * @return `tensorrt_llm::executor::ExecutorConfig` instance + */ + [[nodiscard]] tle::ExecutorConfig executor_config() const; + }; + + /** + * Error raised by the underlying backend implementation + */ + enum backend_error_t { + EXECUTOR_NOT_READY = 3, + EXECUTOR_SCHEDULING_FAILED = 4, + }; + + + /** + * Actual TensorRT-LLM backend implementation interacting with TensorRT-LLM Executor service to + * - schedule new request + * - pull status of submitted request(s) + * - cancel submitted request(s) + */ + class backend_t { + private: + backend_workspace_t workspace; + tle::Executor executor_; + + public: + backend_t(std::filesystem::path &engines_folder, std::filesystem::path &executor_worker_path); + + backend_t(std::filesystem::path &&engines_folder, std::filesystem::path &&executor_worker_path) + : backend_t(engines_folder, executor_worker_path) {}; + + /** + * Submit a new request to the executor + * @param token_ids + * @param generation_params + * @param sampling_params + * @return Either newly submitted request's id or the error why it failed to submit + */ + [[nodiscard("Discarded executor request_id needs to be assigned")]] + std::expected + submit(std::span token_ids, generation_params_t generation_params, + sampling_params_t sampling_params) noexcept; + + /** + * Query the number of tokens available across all in-flight generations + * @return + */ + [[nodiscard("Pulling out the number of tokens")]] + size_t num_tokens_ready() const noexcept; + + /** + * Pull out newly generated tokens from the executor + * @return + */ + [[nodiscard("")]] + std::vector pull_tokens() noexcept; + + /** + * Cancel the specified request on the executor' set + * @param request_id Request's Identifier to remove from the in-flight executor + */ + void cancel(request_id_t) noexcept; + }; + + /** + * Create a TensorRT-LLM executor from a workspace + */ + const auto executor_factory_initializer = [](const backend_workspace_t &workspace) -> tle::Executor { + return {workspace.engines_folder(), tensorrt_llm::executor::ModelType::kDECODER_ONLY, + workspace.executor_config()}; + }; +} + +/** + * Helper structures to define formatting strategies for various types in the backend + */ +template<> +struct fmt::formatter : formatter { + auto format(huggingface::tgi::backends::trtllm::generation_params_t const &c, + format_context &ctx) const -> format_context::iterator { + return fmt::format_to(ctx.out(), "generation_params_t{{ max_new_tokens={:d} }}", c.max_new_tokens); + } +}; + +template<> +struct fmt::formatter : formatter { + auto format(huggingface::tgi::backends::trtllm::sampling_params_t const &c, + format_context &ctx) const -> format_context::iterator { + return fmt::format_to( + ctx.out(), + "sampling_params_t{{ top_k={:d}, top_p={:.3f}, repetition_penalty={:.3f}, frequency_penalty={:.3f}, temperature={:.3f}, seed={:d} }}", + c.top_k, c.top_p, c.repetition_penalty, c.frequency_penalty, c.temperature, c.seed + ); + } +}; + +#endif \ No newline at end of file diff --git a/backends/trtllm/csrc/ffi.hpp b/backends/trtllm/csrc/ffi.hpp new file mode 100644 index 00000000..de2333af --- /dev/null +++ b/backends/trtllm/csrc/ffi.hpp @@ -0,0 +1,162 @@ +#ifndef TGI_BACKEND_TRTLLM_FFI +#define TGI_BACKEND_TRTLLM_FFI + +#include +#include + +#include +#include +#include + +#include + +#include +#include + +namespace rust::behavior { + template + static void trycatch(Try &&func, Fail &&fail) noexcept try { + func(); + } catch (tensorrt_llm::common::TllmException &e) { + fail(e.what()); + } +} + +namespace huggingface::tgi::backends::trtllm { + class tensorrt_llm_backend_t; +} + +#include "backends/trtllm/src/lib.rs.h" + +namespace huggingface::tgi::backends::trtllm { + std::once_flag backend_initialized_flag; + + class tensorrt_llm_backend_t { + private: + backend_t inner_; + + public: + tensorrt_llm_backend_t(std::filesystem::path &&engine_folder, std::filesystem::path &&executor_worker_path) + : inner_(engine_folder, executor_worker_path) {} + + size_t num_tokens_ready() const noexcept { + return inner_.num_tokens_ready(); + } + + request_id_t submit( + rust::Slice tokens, + uint32_t max_new_tokens, + uint32_t top_k, + float_t top_p, + float_t temperature, + float_t repetition_penalty, + float_t frequency_penalty, + uint64_t seed + ) { + // This is enabled only if using add_compile_definitions(SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_TRACE) + SPDLOG_TRACE(FMT_STRING("[FFI] Submitting {:d} prompt tokens to the executor")); + + // Submit the request to the executor and get back a potential request_id used to track request status + const auto signed_tokens = std::vector(tokens.begin(), tokens.end()); + const auto maybe_request_id = inner_.submit( + signed_tokens, + {max_new_tokens}, + {top_k, top_p, repetition_penalty, frequency_penalty, temperature, seed} + ); + + // If we do have a value, let's return the request_id + if(maybe_request_id.has_value()) [[likely]] { + return *maybe_request_id; + } else { + SPDLOG_WARN("[FFI] Failed to submit request to the executor"); + return maybe_request_id.error(); + } + } + + std::unique_ptr> pull_tokens() noexcept { + if(num_tokens_ready() > 0) [[likely]] { + const auto responses = inner_.pull_tokens(); + + SPDLOG_TRACE("[FFI] Successfully pulled out {:d} responses from executor", responses.size()); + // Transform tle::Response to GenerationStep + auto steps = std::make_unique>(); + std::ranges::transform(responses.begin(), responses.end(), std::back_inserter(*steps), [](const tle::Response &r) { + const auto reqId = r.getRequestId(); + if (!r.hasError()) [[likely]] { + const auto result = r.getResult(); + return generation_step_t{ + reqId, + static_cast(result.outputTokenIds[0][0]), + result.logProbs.value()[0][0], + result.isFinal, + false, + std::string() + }; + } else { + return generation_step_t{ + reqId, + 0, + 0.0, + true, + true, + std::move(r.getErrorMsg()) + }; + } + }); + return steps; + + } else { + return std::make_unique>(); + } + } + + void cancel(request_id_t requestId) noexcept { + SPDLOG_DEBUG("[FFI] cancelling request {:d}", requestId); + inner_.cancel(requestId); + } + }; + + void initialize_logging() { +#ifndef TGI_TRTLLM_BACKEND_DEBUG + if (const auto TRTLLM_LOG_LEVEL_CSTR = std::getenv("TRTLLM_LOG_LEVEL")) { + std::string log_level(TRTLLM_LOG_LEVEL_CSTR); + std::transform(log_level.begin(), log_level.end(), log_level.begin(), [](unsigned char c) { + return std::tolower(c); + }); + + if (log_level == "debug") + spdlog::set_level(spdlog::level::debug); + else + spdlog::set_level(spdlog::level::info); + } +#else + spdlog::set_level(spdlog::level::debug); +#endif + } + + void initialize_tensorrt_llm_backend() { + SPDLOG_INFO("Initializing TGI - TensoRT-LLM Backend (v{})", tle::version()); + + // Initialize everyone + initialize_logging(); + nvmlInit_v2(); + initTrtLlmPlugins(); + + const auto numGpus = huggingface::tgi::hardware::cuda::get_device_count(); + if (numGpus.has_value()) { + SPDLOG_INFO("[FFI] Detected {:d} Nvidia GPU(s)", *numGpus); + } else { + SPDLOG_WARN("[FFI] Failed to detected Nvidia GPU(s) on the system"); + // todo: throw + } + } + + std::unique_ptr create_backend_from_engine_folder(const rust::Str engines_folder, const rust::Str executor_worker_path) { + std::call_once(backend_initialized_flag, initialize_tensorrt_llm_backend); + return std::make_unique( + std::filesystem::path(std::string_view(engines_folder.begin(), engines_folder.end()), std::filesystem::path::format::auto_format), + std::filesystem::path(std::string_view(executor_worker_path.begin(), executor_worker_path.end()), std::filesystem::path::format::auto_format) + ); + } +} +#endif \ No newline at end of file diff --git a/backends/trtllm/csrc/hardware.hpp b/backends/trtllm/csrc/hardware.hpp new file mode 100644 index 00000000..8e5fa696 --- /dev/null +++ b/backends/trtllm/csrc/hardware.hpp @@ -0,0 +1,81 @@ +#ifndef TGI_HARDWARE_CUDA +#define TGI_HARDWARE_CUDA +#include +#include + +#include + +namespace huggingface::tgi::hardware::cuda { + static constexpr auto VOLTA = std::make_tuple(7u, 0u); + static constexpr auto TURING = std::make_tuple(7u, 5u); + static constexpr auto AMPERE = std::make_tuple(8u, 0u); + static constexpr auto HOPPER = std::make_tuple(9u, 0u); + static constexpr auto ADA_LOVELACE = std::make_tuple(8u, 9u); + + /** + * Get the number of GPUs on the local machine + * @return std::nullopt if no device is available, otherwise >= 1 + */ + inline std::optional get_device_count() { + uint32_t numGpus = 0; + if (nvmlDeviceGetCount_v2(&numGpus) == NVML_SUCCESS) { + return numGpus; + } + return std::nullopt; + } + + /** + * Store information about the version of the CUDA Compute Capabilities detected on the device + */ + struct compute_capabilities_t { + int32_t major; + int32_t minor; + + compute_capabilities_t(): compute_capabilities_t(0) {} + explicit compute_capabilities_t(size_t device_idx): major(-1), minor(-1) { + nvmlDevice_t device; + if (nvmlDeviceGetHandleByIndex_v2(device_idx, &device) == NVML_SUCCESS) { + nvmlDeviceGetCudaComputeCapability(device, &major, &minor); + } + }; + compute_capabilities_t(int32_t major, int32_t minor): major(major), minor(minor) {} + + /** + * Evaluate if the underlying capabilities is at least greater or equals to the provided 2-tuple (major, minor) + * @param sm Architecture version (major, minor) + * @return True if greater or equals to the underlying compute capabilities + */ + [[nodiscard]] constexpr auto is_at_least(std::tuple sm) const -> decltype(auto) { return std::tie(major, minor) >= sm; } + + /** + * Check if the capabilities match at least Volta architecture (sm_70) + * @return true if at least Volta (>= sm_70), false otherwise + */ + [[nodiscard]] constexpr bool is_at_least_volta() const { return is_at_least(VOLTA); } + + /** + * Check if the capabilities match at least Turing architecture (sm_75) + * @return true if at least Turing (>= sm_75), false otherwise + */ + [[nodiscard]] constexpr bool is_at_least_turing() const { return is_at_least(TURING); } + + /** + * Check if the capabilities match at least Ampere architecture (sm_80) + * @return true if at least Ampere (>= sm_80), false otherwise + */ + [[nodiscard]] constexpr bool is_at_least_ampere() const { return is_at_least(AMPERE); } + + /** + * Check if the capabilities match at least Ada Lovelace architecture (sm_89) + * @return true if at least Ada Lovelace (>= sm_89), false otherwise + */ + [[nodiscard]] constexpr bool is_at_least_ada_lovelace() const { return is_at_least(ADA_LOVELACE); } + + /** + * Check if the capabilities match at least Hopper architecture (sm_90) + * @return true if at least Hopper (>= sm_90), false otherwise + */ + [[nodiscard]] constexpr bool is_at_least_hopper() const { return is_at_least(HOPPER); } + }; +} +#endif \ No newline at end of file diff --git a/backends/trtllm/include/backend.h b/backends/trtllm/include/backend.h deleted file mode 100644 index d23f6288..00000000 --- a/backends/trtllm/include/backend.h +++ /dev/null @@ -1,144 +0,0 @@ -// -// Created by Morgan Funtowicz on 6/30/24. -// - -#ifndef TGI_TRTLLM_BACKEND_H -#define TGI_TRTLLM_BACKEND_H - -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -using json = nlohmann::json; -namespace tle = tensorrt_llm::executor; - - -#define CAST_SIZETYPE(x) static_cast(x) - -namespace huggingface::tgi::backends { - using RequestId = tle::IdType; - using TokenId = tle::TokenIdType; - - const static auto OUTPUT_CONFIG = tle::OutputConfig(true, false, false, true, false); - constexpr auto FMT_NOT_ENOUGH_GPUS = FMT_STRING( - "Not enough GPUs to allocate requested model (detected: {:d}, required: {:d})"); - constexpr auto FMT_EXECUTOR_STATS = FMT_STRING( - "Submitting inference [{}] to the executor ({:d} already in-flight)"); - constexpr auto FMT_SAMPLING_CONFIG = FMT_STRING( - "Sampling: topK={:d}, topP={:.1f}, temperature={:.1f}, repetition_penalty={:.1f}, frequency_penalty={:.1f}, seed={:d}"); - - /** - * Initialize all the components required by TRTLLM. - * It is required to call this function before attempting to load any engine - */ - void InitializeBackend(); - - /** - * Initialize logging mechanism - */ - void InitializeLogging(); - - - /** - * - * @param config TensorRT-LLM configuration object - * @param workerPath Path to the "executorWorker" provided by TensorRT-LLM when using orchestrator mode - * @return - */ - tle::ExecutorConfig GetExecutorConfig(const json &config, const std::string &workerPath); - - /** - * - * @param worldSize - * @param workerPath - * @return - */ - tle::ParallelConfig GetParallelConfig(size_t worldSize, std::string workerPath) noexcept; - - /** - * Get the sampling configuration from the parameters provided by TGI - * @param topK - * @param topP - * @param temperature - * @param repetition_penalty - * @param frequency_penalty - * @param seed - * @return - */ - tle::SamplingConfig GetSamplingConfig( - uint32_t topK, - float_t topP, - float_t temperature, - float_t repetition_penalty, - float_t frequency_penalty, - uint64_t seed - ) noexcept; - - /** - * Attempt to retrieve the - * @param generationConfigPath - * @return - */ - std::optional>> - GetStopWordsFromConfig(const std::filesystem::path &generationConfigPath) noexcept; - - /** - * - */ - class TensorRtLlmBackend { - private: - const json config; - tle::Executor executor; - - /** Frequently accessed variables cached here **/ - uint32_t maxNumTokens; - std::list> stopWords; - - public: - explicit TensorRtLlmBackend( - const std::filesystem::path &engineFolder, - const std::filesystem::path &executorWorker - ); - - /** - * Query the executor for the number of token available for pulling - * @return - */ - [[nodiscard]] size_t NumResponsesReady() const; - - /** - * Submit a new generation task to the executor - * @param tokens - * @param topK - * @param topP - * @param temperature - * @param repetitionPenalty - * @param frequencyPenalty - * @param seed - * @return Request id related to this generation for reference - */ - [[nodiscard]] RequestId Submit( - const std::vector &tokens, - uint32_t maxNewTokens, - int32_t topK, - float_t topP, - float_t temperature, - float_t repetitionPenalty, - float_t frequencyPenalty, - uint64_t seed - ); - - [[nodiscard]] std::vector PullNewTokens(); - }; -} - - -#endif //TGI_TRTLLM_BACKEND_H diff --git a/backends/trtllm/include/ffi.h b/backends/trtllm/include/ffi.h deleted file mode 100644 index 449bcd4d..00000000 --- a/backends/trtllm/include/ffi.h +++ /dev/null @@ -1,75 +0,0 @@ -// -// Created by mfuntowicz on 7/11/24. -// - -#ifndef TGI_TRTLLM_BACKEND_FFI_H -#define TGI_TRTLLM_BACKEND_FFI_H - -#include -#include -#include -#include "backend.h" - -namespace huggingface::tgi::backends { - class TensorRtLlmBackendImpl; -} - -// Template to support returning error from TllmException back to Rust in a Result<> -#include - -namespace rust::behavior { - template - static void trycatch(Try &&func, Fail &&fail) noexcept try { - func(); - } catch (tensorrt_llm::common::TllmException &e) { - fail(e.what()); - } -} - -#include "backends/trtllm/src/lib.rs.h" - -namespace huggingface::tgi::backends { - - class TensorRtLlmBackendImpl : public TensorRtLlmBackend { - public: - /*** - * - * @param engineFolder - * @param executorWorker - */ - TensorRtLlmBackendImpl(const std::string_view &engineFolder, const std::string_view &executorWorker); - - /*** - * - * @param tokens - * @param maxNewTokens - * @param topK - * @param topP - * @param temperature - * @param repetition_penalty - * @param frequency_penalty - * @param seed - * @return - */ - [[nodiscard("returned request id should be used to refer to the request's generation result later on")]] - uint64_t - Submit(rust::Slice tokens, uint32_t maxNewTokens, - int32_t topK, float_t topP, float_t temperature, - float_t repetition_penalty, float_t frequency_penalty, uint64_t seed); - - /*** - * - * @return - */ - std::unique_ptr> PullTokens(); - }; - - /*** - * - * @param engineFolder - * @return - */ - std::unique_ptr CreateTensorRtLlmBackend(rust::Str engineFolder, rust::Str executorWorker); -} - -#endif //TGI_TRTLLM_BACKEND_FFI_H diff --git a/backends/trtllm/include/hardware.h b/backends/trtllm/include/hardware.h deleted file mode 100644 index 9633495f..00000000 --- a/backends/trtllm/include/hardware.h +++ /dev/null @@ -1,59 +0,0 @@ -// -// Created by mfuntowicz on 7/23/24. -// - -#ifndef TGI_TRTLLM_BACKEND_HARDWARE_H -#define TGI_TRTLLM_BACKEND_HARDWARE_H - -#include -#include -#include -#include -#include - -namespace huggingface::hardware::cuda { - -#define AMPERE_SM_MAJOR 8 -#define HOPPER_SM_MAJOR 9 - - /** - * Store information about the version of the CUDA Compute Capabilities detected on the device - */ - struct CudaComputeCapabilities { - int32_t major; - int32_t minor; - - [[nodiscard]] constexpr bool IsPostAmpere() const { return major >= AMPERE_SM_MAJOR; } - - [[nodiscard]] constexpr bool IsPostHopper() const { return major >= HOPPER_SM_MAJOR; } - }; - - CudaComputeCapabilities GetCudaComputeCapabilities() { - // Get the compute capabilities of the current hardware - nvmlDevice_t device; - CudaComputeCapabilities capabilities{0, 0}; - if (nvmlDeviceGetHandleByIndex_v2(0, &device) == NVML_SUCCESS) { - SPDLOG_DEBUG("Successfully acquired nvmlDevice_t = 0"); - if (nvmlDeviceGetCudaComputeCapability(device, &capabilities.major, &capabilities.minor) == NVML_SUCCESS) { - SPDLOG_INFO("Detected sm_{:d}{:d} compute capabilities", capabilities.major, capabilities.minor); - } - } - - return capabilities; - } - - /** - * Return the number of GPU detected. If no GPU is detected, return size_t::max() - * @return - */ - std::optional GetNumDevices() { - uint32_t numGpus = 0; - if (nvmlDeviceGetCount_v2(&numGpus) == NVML_SUCCESS) { - return std::optional(numGpus); - } else { - return std::nullopt; - } - } -} - -#endif //TGI_TRTLLM_BACKEND_HARDWARE_H diff --git a/backends/trtllm/lib/backend.cpp b/backends/trtllm/lib/backend.cpp deleted file mode 100644 index 4dd41de0..00000000 --- a/backends/trtllm/lib/backend.cpp +++ /dev/null @@ -1,203 +0,0 @@ -#include -#include - -#include -#include -#include - -#include "backend.h" -#include "hardware.h" - - -void huggingface::tgi::backends::InitializeLogging() { -#ifdef NDEBUG - if (const auto TRTLLM_LOG_LEVEL_CSTR = std::getenv("TRTLLM_LOG_LEVEL")) { - std::string log_level(TRTLLM_LOG_LEVEL_CSTR); - std::transform(log_level.begin(), log_level.end(), log_level.begin(), [](unsigned char c) { - return std::tolower(c); - }); - - if (log_level == "debug") - spdlog::set_level(spdlog::level::debug); - else - spdlog::set_level(spdlog::level::info); - } -#else - spdlog::set_level(spdlog::level::debug); -#endif -} - -void huggingface::tgi::backends::InitializeBackend() { - SPDLOG_INFO("Initializing Backend..."); - nvmlInit_v2(); - initTrtLlmPlugins(); - - InitializeLogging(); - - SPDLOG_INFO("Backend Executor Version: {}", tle::version()); - const auto numGpus = huggingface::hardware::cuda::GetNumDevices(); - if (numGpus.has_value()) { - SPDLOG_INFO("Detected {:d} Nvidia GPU(s)", numGpus.value()); - } else { - SPDLOG_WARN("Failed to detected Nvidia GPU(s) on the system"); - } -} - -[[nodiscard]] -tle::ParallelConfig -huggingface::tgi::backends::GetParallelConfig(const size_t worldSize, const std::string workerPath) noexcept { - auto mode = tle::CommunicationMode::kLEADER; - std::optional orchestratorConfig = std::nullopt; - - if (worldSize > 1) { - SPDLOG_INFO("Detected sharded engine deployment, using orchestrator mode"); - mode = tle::CommunicationMode::kORCHESTRATOR; - orchestratorConfig = std::make_optional(true, workerPath, nullptr, true); - } else { - SPDLOG_INFO("Detected single engine deployment, using leader mode"); - } - - return tle::ParallelConfig(tle::CommunicationType::kMPI, mode, std::nullopt, std::nullopt, orchestratorConfig); -} - -[[nodiscard]] -tle::ExecutorConfig huggingface::tgi::backends::GetExecutorConfig(const json &config, const std::string &workerPath) { - tle::ExecutorConfig execConfig(/* maxBeamWidth = */ 1); - - // Retrieve the compute capabilities to enable some options at runtime - const auto computeCapabilities = huggingface::hardware::cuda::GetCudaComputeCapabilities(); - - // Single engine (TP = PP = 1) -> using leader mode (no MPI involved) - const auto worldSize = config["/pretrained_config/mapping/world_size"_json_pointer].get(); - execConfig.setParallelConfig(GetParallelConfig(worldSize, workerPath)); - - // Define some configuration variables - execConfig.setKvCacheConfig(tle::KvCacheConfig(true)); - execConfig.setEnableChunkedContext(computeCapabilities.IsPostAmpere()); - execConfig.setSchedulerConfig(tle::SchedulerConfig(tle::CapacitySchedulerPolicy::kMAX_UTILIZATION)); - return execConfig; -} - -tle::SamplingConfig huggingface::tgi::backends::GetSamplingConfig( - const uint32_t topK, - const float_t topP, - const float_t temperature, - const float_t repetition_penalty, - const float_t frequency_penalty, - const uint64_t seed) noexcept { - - return tle::SamplingConfig( - 1, // TGI only use a single beam - topK, - topP, - std::nullopt, - std::nullopt, - std::nullopt, - seed, - temperature, - temperature, - std::nullopt, - repetition_penalty, - std::nullopt, - frequency_penalty - ); -} - -std::optional>> -huggingface::tgi::backends::GetStopWordsFromConfig( - const std::filesystem::path &generationConfigPath) noexcept { - if (exists(generationConfigPath)) { - const auto generationConfig = json::parse(std::ifstream(generationConfigPath)); - if (const auto eosTokenIds = generationConfig["/eos_token_id"_json_pointer]; eosTokenIds.is_array()) { - SPDLOG_INFO(FMT_STRING("Found {:d} EOS tokens"), eosTokenIds.size()); - std::list> stopWords(eosTokenIds.size()); - - const auto to_single_token = [](const auto tokenIdObj) -> decltype(stopWords)::value_type { - return {tokenIdObj.template get()}; - }; - - std::transform(eosTokenIds.cbegin(), eosTokenIds.cend(), stopWords.begin(), to_single_token); - return stopWords; - } else { - SPDLOG_INFO("Invalid EOS tokens entry found (not an array)"); - } - } else { - SPDLOG_INFO("No EOS tokens found, generation_config.json doesn't exist"); - } - - return std::nullopt; -} - -huggingface::tgi::backends::TensorRtLlmBackend::TensorRtLlmBackend( - const std::filesystem::path &enginesFolder, - const std::filesystem::path &executorWorker -) : - config(json::parse(std::ifstream(enginesFolder / "config.json"))), - executor(enginesFolder, tensorrt_llm::executor::ModelType::kDECODER_ONLY, - GetExecutorConfig(config, executorWorker.string())) { - - SPDLOG_INFO(FMT_STRING("Engine (version={})"), config["/version"_json_pointer].get()); - - // Ensure we have enough GPUs on the system - const auto worldSize = config["/pretrained_config/mapping/world_size"_json_pointer].get(); - const auto numGpus = huggingface::hardware::cuda::GetNumDevices().value_or(0); - if (numGpus < worldSize) { - SPDLOG_CRITICAL(FMT_NOT_ENOUGH_GPUS, numGpus, worldSize); - // todo : raise exception to catch on rust side - } - - // Cache variables - maxNumTokens = config["/build_config/max_num_tokens"_json_pointer].get(); - - // Attempt to discover stopWords from the generation_config.json - const auto generationConfigPath = enginesFolder / "generation_config.json"; - stopWords = GetStopWordsFromConfig(generationConfigPath).value_or(std::list>()); -} - -[[nodiscard("Returned number of requests needs to be consumed")]] -size_t huggingface::tgi::backends::TensorRtLlmBackend::NumResponsesReady() const { -#ifdef NDEBUG - return executor.getNumResponsesReady(); -#else - const auto numResponses = executor.getNumResponsesReady(); - if (numResponses > 0) SPDLOG_INFO(FMT_STRING("Num responses ready: {:d}"), numResponses); - return numResponses; -#endif -} - -[[nodiscard("Returned request id needs to be provided back to gather generated tokens")]] -tle::IdType huggingface::tgi::backends::TensorRtLlmBackend::Submit( - const std::vector &tokens, - const uint32_t maxNewTokens, - const int32_t topK, - const float_t topP, - const float_t temperature, - const float_t repetitionPenalty, - const float_t frequencyPenalty, - const uint64_t seed -) { - const auto maxNewTokensChecked = std::min(maxNewTokens, static_cast(maxNumTokens - tokens.size())); -#ifndef NDEBUG - { - const auto &iterations = executor.getLatestIterationStats(); - const auto &lastIteration = iterations.front(); - - SPDLOG_DEBUG(FMT_EXECUTOR_STATS, fmt::join(tokens, ", "), lastIteration.numActiveRequests); - SPDLOG_DEBUG(FMT_SAMPLING_CONFIG, topK, topP, temperature, repetitionPenalty, frequencyPenalty, seed); - SPDLOG_DEBUG(FMT_STRING("Asking for max_new_tokens={:d}"), maxNewTokensChecked); - } -#endif - - const auto sampling = GetSamplingConfig(topK, topP, temperature, repetitionPenalty, frequencyPenalty, seed); - - // Build the request - auto request = tle::Request{tokens, CAST_SIZETYPE(maxNewTokensChecked), true, sampling, OUTPUT_CONFIG}; - request.setStopWords(stopWords); - - // Submit to the executor for batching - return executor.enqueueRequest(request); -} - -std::vector huggingface::tgi::backends::TensorRtLlmBackend::PullNewTokens() { - return executor.awaitResponses(); -} diff --git a/backends/trtllm/scripts/install_tensorrt.sh b/backends/trtllm/scripts/install_tensorrt.sh index 4c2dc26b..7deb2fe8 100755 --- a/backends/trtllm/scripts/install_tensorrt.sh +++ b/backends/trtllm/scripts/install_tensorrt.sh @@ -2,7 +2,7 @@ set -ex -TRT_VER_BASE="10.4.0" +TRT_VER_BASE="10.6.0" TRT_VER_FULL="${TRT_VER_BASE}.26" CUDA_VER="12.6" CUDNN_VER="9.5.0.50-1" diff --git a/backends/trtllm/src/ffi.cpp b/backends/trtllm/src/ffi.cpp deleted file mode 100644 index 0a92c050..00000000 --- a/backends/trtllm/src/ffi.cpp +++ /dev/null @@ -1,89 +0,0 @@ -// -// Created by mfuntowicz on 6/30/24. -// -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "backends/trtllm/include/ffi.h" - - -huggingface::tgi::backends::TensorRtLlmBackendImpl::TensorRtLlmBackendImpl( - const std::string_view &engineFolder, - const std::string_view &executorWorker -) : TensorRtLlmBackend(engineFolder, executorWorker) {} - - -uint64_t huggingface::tgi::backends::TensorRtLlmBackendImpl::Submit( - rust::Slice tokens, - uint32_t maxNewTokens, - int32_t topK, - float_t topP, - float_t temperature, - float_t repetition_penalty, - float_t frequency_penalty, - uint64_t seed) { - - // This will copy all the items from the initial slice - std::vector tokens_(tokens.begin(), tokens.end()); - return TensorRtLlmBackend::Submit( - std::move(tokens_), maxNewTokens, topK, topP, temperature, repetition_penalty, frequency_penalty, seed); -} - -std::unique_ptr> -huggingface::tgi::backends::TensorRtLlmBackendImpl::PullTokens() { - const auto responses = TensorRtLlmBackend::PullNewTokens(); - - auto steps = std::make_unique>(); - steps->reserve(responses.size()); - -#ifndef NDEBUG - SPDLOG_DEBUG(FMT_STRING("Pulled out {:d} new tokens"), responses->size()); -#endif - - // Transform tle::Response to GenerationStep - std::ranges::transform(responses.begin(), responses.end(), std::back_inserter(*steps), [](const tle::Response &r) { - const auto reqId = r.getRequestId(); - if (!r.hasError()) { - const auto result = r.getResult(); - return GenerationStep{ - reqId, - static_cast(result.outputTokenIds[0][0]), - result.logProbs.value()[0][0], - result.isFinal, - false, - std::string() - }; - } else { - return GenerationStep{ - reqId, - 0, - 0.0, - true, - true, - std::move(r.getErrorMsg()) - }; - } - }); - - return steps; -} - -std::unique_ptr -huggingface::tgi::backends::CreateTensorRtLlmBackend(rust::Str engineFolder, rust::Str executorWorker) { - SPDLOG_INFO("Creating TensorRT-LLM Backend"); - // Unconditionally call this to initialize and discover TRTLLM plugins - InitializeBackend(); - - const auto enginePath = std::string_view(engineFolder.begin(), engineFolder.end()); - const auto executorPath = std::string_view(executorWorker.begin(), executorWorker.end()); - return std::make_unique(std::move(enginePath), std::move(executorPath)); -} diff --git a/backends/trtllm/src/lib.rs b/backends/trtllm/src/lib.rs index edd8caff..d6acafa1 100644 --- a/backends/trtllm/src/lib.rs +++ b/backends/trtllm/src/lib.rs @@ -4,10 +4,11 @@ pub mod errors; mod looper; mod utils; -#[cxx::bridge(namespace = "huggingface::tgi::backends")] +#[cxx::bridge(namespace = "huggingface::tgi::backends::trtllm")] mod ffi { /// Struct used as shared type between rust and C++ to represent the result /// of a single decoding iteration + #[cxx_name = "generation_step_t"] #[derive(Debug, Clone)] pub struct GenerationStep { request_id: u64, @@ -19,9 +20,10 @@ mod ffi { } unsafe extern "C++" { - include!("backends/trtllm/src/ffi.cpp"); + include!("backends/trtllm/csrc/ffi.hpp"); /// Represent an instance of the underlying TensorRT-LLM backend + #[cxx_name = "tensorrt_llm_backend_t"] type TensorRtLlmBackendImpl; /// Create an instance backed behind a std::unique_ptr to manage the lifespan of the backend @@ -38,21 +40,18 @@ mod ffi { /// ``` /// /// ``` - #[rust_name = "create_tensorrt_llm_backend"] - fn CreateTensorRtLlmBackend( + fn create_backend_from_engine_folder( engine_folder: &str, executor_worker: &str, ) -> Result>; - #[rust_name = "num_responses_ready"] - fn NumResponsesReady(self: &TensorRtLlmBackendImpl) -> usize; + fn num_tokens_ready(self: &TensorRtLlmBackendImpl) -> usize; - #[rust_name = "submit"] - fn Submit( + fn submit( self: Pin<&mut TensorRtLlmBackendImpl>, tokens: &[u32], max_new_tokens: u32, - top_k: i32, + top_k: u32, top_p: f32, temperature: f32, repetition_penalty: f32, @@ -60,9 +59,10 @@ mod ffi { seed: u64, ) -> Result; - #[rust_name = "pull_tokens"] - fn PullTokens( + fn pull_tokens( self: Pin<&mut TensorRtLlmBackendImpl>, ) -> Result>>; + + fn cancel(self: Pin<&mut TensorRtLlmBackendImpl>, request_id: u64); } } diff --git a/backends/trtllm/src/looper.rs b/backends/trtllm/src/looper.rs index e26155c1..3addd95f 100644 --- a/backends/trtllm/src/looper.rs +++ b/backends/trtllm/src/looper.rs @@ -1,14 +1,13 @@ -use std::hint; -use std::ops::Deref; -use std::path::Path; - use async_trait::async_trait; use cxx::UniquePtr; use hashbrown::HashMap; +use std::hint; +use std::ops::Deref; +use std::path::Path; use tokenizers::Tokenizer; use tokio::sync::mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender}; use tokio::sync::TryAcquireError; -use tokio::task::{spawn_blocking, JoinHandle}; +use tokio::task::spawn_blocking; use tokio::time::Instant; use tokio_stream::wrappers::UnboundedReceiverStream; use tracing::{debug, error, warn}; @@ -22,7 +21,7 @@ use text_generation_router::validation::{Chunk, ValidGenerateRequest}; use text_generation_router::{FinishReason, Token}; use crate::errors::TensorRtLlmBackendError; -use crate::ffi::{create_tensorrt_llm_backend, GenerationStep, TensorRtLlmBackendImpl}; +use crate::ffi::{create_backend_from_engine_folder, GenerationStep, TensorRtLlmBackendImpl}; use crate::utils::first_line; type InferResult = Result; @@ -30,9 +29,10 @@ type InferResult = Result; /// Wrap the requests along with the channel used to stream back to the client the decoded tokens struct GenerationContext { request: ValidGenerateRequest, + streamer: UnboundedSender>, + tokens: Vec, start: Option, queued: Instant, - streamer: UnboundedSender>, } #[derive(Debug, Copy, Clone)] @@ -58,31 +58,22 @@ impl<'step> TryFrom<&'step GenerationStep> for DecodedToken { } } -/// Wraps the decoded token with the channel used to stream back to the client the decoded tokens -struct DecodedTokenContext { - token: DecodedToken, - start: Option, - queued: Instant, - channel: UnboundedSender>, -} - fn executor_status_looper( - mut backend: UniquePtr, max_inflight_requests: usize, - mut waiting_requests: UnboundedReceiver, - post_processor_sender: UnboundedSender<(u64, InferResult)>, + tokenizer: Tokenizer, + mut backend: UniquePtr, + mut backlog: UnboundedReceiver, ) { // Track the tuple (request_id, stream) for each request let mut in_flights = HashMap::::with_capacity(max_inflight_requests * 2); - // TODO: Does it need a spin-loop? 'scheduler: loop { // Is there any request pending to be scheduled? - let awaiting_requests = waiting_requests.len(); + let awaiting_requests = backlog.len(); for _ in 0..awaiting_requests { // Retrieve all the requests - if let Some(mut ctx) = waiting_requests.blocking_recv() { + if let Some(ctx) = backlog.blocking_recv() { // Submit all the request to the executor and move the context to the in-flight tracker let request = &ctx.request; let generation_params = &request.parameters; @@ -93,7 +84,7 @@ fn executor_status_looper( match backend.pin_mut().submit( &input_ids.unwrap(), // This is checked beforehand in validate() stopping_params.max_new_tokens, - generation_params.top_k as i32, + generation_params.top_k, generation_params.top_p, generation_params.temperature, generation_params.repetition_penalty, @@ -103,7 +94,6 @@ fn executor_status_looper( Ok(request_id) => { // Insert the context linked to the generated request id in the tracker debug!("[in-flight] Added {}", request_id); - ctx.start = Some(Instant::now()); in_flights.insert(request_id, ctx); } Err(e) => { @@ -117,29 +107,40 @@ fn executor_status_looper( } } }; + } else { + break 'scheduler; } } - if backend.num_responses_ready() > 0 { - match backend.pin_mut().pull_tokens() { + if backend.num_tokens_ready() > 0 { + let mut backend = backend.pin_mut(); + match backend.as_mut().pull_tokens() { Ok(responses) => { // Iterate through all the decoded token for step in responses.deref() { - if let Some(ctx) = in_flights.get(&step.request_id) { - // Remove from tracked requests - let parcel = - DecodedToken::try_from(step).map(|dt| DecodedTokenContext { - token: dt, - start: ctx.start, - queued: ctx.queued, - channel: ctx.streamer.clone(), - }); + if let Some(ctx) = in_flights.get_mut(&step.request_id) { + // Update the starting timestamp if not set + // This value might not be the actual real starting time of the request + // on the executor side - Need to expose more info from the executor to + // retrieve this value + // TODO : Expose actual real starting time for a request on FFI layer + if ctx.start.is_none() { + ctx.start = Some(Instant::now()); + } - // Submit the work to p:the post_processor - let posted = post_processor_sender.send((step.request_id, parcel)); + // Try to map the generation step to a DecodedToken + let response = match DecodedToken::try_from(step) { + Ok(decoded_token) => { + post_process_decoded_token(&tokenizer, ctx, decoded_token) + } + Err(err) => Err(err) + }; - if posted.is_err() || step.is_final { - debug!("Removing {}", step.request_id); + // Attempt to send back the response to the client + if let Err(_) = ctx.streamer.send(response) { + // Client has dropped, remove from tracked requests + debug!("Client dropped - removing request {} from tracked requests", step.request_id); + backend.as_mut().cancel(step.request_id); let _ = in_flights.remove(&step.request_id); } } else { @@ -159,80 +160,48 @@ fn executor_status_looper( } } -fn post_processor_looper( - tokenizer: Tokenizer, - max_inflight_requests: usize, - mut decoded_tokens: UnboundedReceiver<(u64, InferResult)>, -) { - let mut states: HashMap> = HashMap::with_capacity(max_inflight_requests * 2); +fn post_process_decoded_token(tokenizer: &Tokenizer, ctx: &mut GenerationContext, decoded_token: DecodedToken) -> InferResult { + match tokenizer.decode(&[decoded_token.id], false) { + Ok(text) => { + let is_special = + tokenizer.get_added_vocabulary().is_special_token(&text); + let token = Token { + id: decoded_token.id, + text, + logprob: decoded_token.log_prob, + special: is_special, + }; - 'post_processor: loop { - if decoded_tokens.is_closed() { - warn!("Post processor IPC is closed, loop will exit now."); - break 'post_processor; - } + // Append the token to the tracked generated tokens + ctx.tokens.push(token.id); - if let Some((request_id, decoded)) = decoded_tokens.blocking_recv() { - match decoded { - Ok(ctx) => { - states - .entry(request_id) - .and_modify(|s| s.push(*&ctx.token.id)) - .or_insert_with(|| { - let mut state = Vec::with_capacity(MAX_NUM_TOKENS); - state.push(*&ctx.token.id); - state - }); - - let out = match tokenizer.decode(&[ctx.token.id], false) { - Ok(text) => { - let is_special = - tokenizer.get_added_vocabulary().is_special_token(&text); - let token = Token { - id: ctx.token.id, - text, - logprob: ctx.token.log_prob, - special: is_special, - }; - - let out = if !ctx.token.is_final { - InferStreamResponse::Intermediate { - token, - top_tokens: vec![], - } - } else { - let tokens = states.remove(&request_id).unwrap(); - let text = tokenizer.decode(&tokens, true); - let generated_text = GeneratedText { - text: text.unwrap(), - generated_tokens: tokens.len() as u32, - finish_reason: FinishReason::EndOfSequenceToken, - seed: None, - }; - - InferStreamResponse::End { - token, - top_tokens: vec![], - generated_text, - start: ctx.start.unwrap(), - queued: ctx.queued, - } - }; - - Ok(out) - } - Err(err) => Err(GenerationError(err.to_string())), - }; - - if let Err(_) = ctx.channel.send(out) { - warn!("Failed to send decoded token back to the user") - } + // Map the correct response depending on the step is final or not + let out = if !decoded_token.is_final { + InferStreamResponse::Intermediate { + token, + top_tokens: vec![], } - Err(_err) => { - todo!("what do we do?") + } else { + let text = tokenizer.decode(&ctx.tokens, true); + let generated_text = GeneratedText { + text: text.unwrap(), + generated_tokens: ctx.tokens.len() as u32, + finish_reason: FinishReason::EndOfSequenceToken, // TODO : Map FinishReason + seed: None, + }; + + InferStreamResponse::End { + token, + top_tokens: vec![], + generated_text, + start: ctx.start.unwrap(), + queued: ctx.queued, } - } + }; + + Ok(out) } + Err(err) => Err(GenerationError(err.to_string())), } } @@ -277,11 +246,8 @@ fn ensure_paths_exist, PP: AsRef>( unsafe impl Send for TensorRtLlmBackendImpl {} -pub struct TensorRtLlmBackendV2 { - executor_looper: JoinHandle<()>, - post_processor_looper: JoinHandle<()>, - executor: UnboundedSender, -} +pub struct TensorRtLlmBackendV2(UnboundedSender); + impl TensorRtLlmBackendV2 { pub fn new + Send, PP: AsRef + Send>( @@ -295,32 +261,22 @@ impl TensorRtLlmBackendV2 { // Allocate the IPC layer to communicate with the backend let (executor_sender, executor_receiver) = unbounded_channel(); - let (post_processor_sender, post_processor_receiver) = unbounded_channel(); // Create the FFI backend - let backend = create_tensorrt_llm_backend(&engine_folder, &executor_worker_path) + let backend = create_backend_from_engine_folder(&engine_folder, &executor_worker_path) .map_err(|e| TensorRtLlmBackendError::Runtime(first_line(e.what(), "Unknown error")))?; // Executor looper is responsible for scheduling and pulling requests state at regular interval - let executor_looper = spawn_blocking(move || { + spawn_blocking(move || { executor_status_looper( - backend, max_inflight_requests, + tokenizer, + backend, executor_receiver, - post_processor_sender, ) }); - // Post processor looper is responsible from receiving a bunch of tokens, decoding them and sending them back to the user - let post_processor_looper = spawn_blocking(move || { - post_processor_looper::<256>(tokenizer, max_inflight_requests, post_processor_receiver) - }); - - Ok(TensorRtLlmBackendV2 { - executor_looper, - post_processor_looper, - executor: executor_sender, - }) + Ok(TensorRtLlmBackendV2(executor_sender)) } fn validate(request: &ValidGenerateRequest) -> InferResult<()> { @@ -354,20 +310,21 @@ impl TensorRtLlmBackendV2 { impl Backend for TensorRtLlmBackendV2 { fn schedule( &self, - inner: ValidGenerateRequest, + request: ValidGenerateRequest, ) -> Result>, InferError> { - Self::validate(&inner)?; + Self::validate(&request)?; // Open-up the stream to send tokens let (streamer, receiver) = unbounded_channel::>(); // Send the context to the executor for scheduling let queued = Instant::now(); - match self.executor.send(GenerationContext { - request: inner, + match self.0.send(GenerationContext { + request, + streamer, + tokens: Vec::with_capacity(256), start: None, queued, - streamer, }) { Ok(_) => Ok(UnboundedReceiverStream::new(receiver)), Err(_) => Err(GenerationError( @@ -377,6 +334,6 @@ impl Backend for TensorRtLlmBackendV2 { } async fn health(&self, _: bool) -> bool { - !self.executor_looper.is_finished() & !self.post_processor_looper.is_finished() + true } } diff --git a/backends/trtllm/src/main.rs b/backends/trtllm/src/main.rs index 8ab8c533..9c76bafa 100644 --- a/backends/trtllm/src/main.rs +++ b/backends/trtllm/src/main.rs @@ -3,14 +3,13 @@ use std::path::{Path, PathBuf}; use clap::Parser; use hf_hub::api::tokio::{Api, ApiBuilder}; use hf_hub::{Cache, Repo, RepoType}; -use tokenizers::Tokenizer; use tracing::info; use text_generation_backends_trtllm::errors::TensorRtLlmBackendError; use text_generation_backends_trtllm::TensorRtLlmBackendV2; -use text_generation_router::server::get_base_tokenizer; use text_generation_router::usage_stats::UsageStatsLevel; -use text_generation_router::{server, HubTokenizerConfig}; +use text_generation_router::{server, HubTokenizerConfig, Tokenizer}; +use text_generation_router::server::{get_hub_model_info, legacy_tokenizer_handle, py_resolve_tokenizer}; /// App Configuration #[derive(Parser, Debug)] @@ -61,7 +60,7 @@ struct Args { #[clap(long, env, help = "Path to the TensorRT-LLM Orchestrator worker")] executor_worker: PathBuf, #[clap(default_value = "on", long, env)] - usage_stats: usage_stats::UsageStatsLevel, + usage_stats: UsageStatsLevel, #[clap(default_value = "2000000", long, env)] payload_limit: usize, } @@ -126,18 +125,18 @@ async fn get_tokenizer( // Load tokenizer and model info let ( - tokenizer_filename, - _config_filename, - tokenizer_config_filename, + config_filename, + _tokenizer_config_filename, _preprocessor_config_filename, _processor_config_filename, + _model_info ) = match api { Type::None => ( - Some(local_path.join("tokenizer.json")), Some(local_path.join("config.json")), Some(local_path.join("tokenizer_config.json")), Some(local_path.join("preprocessor_config.json")), Some(local_path.join("processor_config.json")), + None ), Type::Api(api) => { let api_repo = api.repo(Repo::with_revision( @@ -146,21 +145,24 @@ async fn get_tokenizer( revision.unwrap_or_else(|| "main").to_string(), )); - let tokenizer_filename = match api_repo.get("tokenizer.json").await { - Ok(tokenizer_filename) => Some(tokenizer_filename), - Err(_) => get_base_tokenizer(&api, &api_repo).await, - }; + let config_filename = api_repo.get("config.json").await.ok(); let tokenizer_config_filename = api_repo.get("tokenizer_config.json").await.ok(); let preprocessor_config_filename = api_repo.get("preprocessor_config.json").await.ok(); let processor_config_filename = api_repo.get("processor_config.json").await.ok(); + let model_info = if let Some(model_info) = get_hub_model_info(&api_repo).await { + Some(model_info) + } else { + tracing::warn!("Could not retrieve model info from the Hugging Face hub."); + None + }; ( - tokenizer_filename, config_filename, tokenizer_config_filename, preprocessor_config_filename, processor_config_filename, + model_info, ) } Type::Cache(cache) => { @@ -170,24 +172,55 @@ async fn get_tokenizer( revision.clone().unwrap_or_else(|| "main").to_string(), )); ( - repo.get("tokenizer.json"), repo.get("config.json"), repo.get("tokenizer_config.json"), repo.get("preprocessor_config.json"), repo.get("processor_config.json"), + None ) } }; // Read the JSON contents of the file as an instance of 'HubTokenizerConfig'. - let tokenizer_config: Option = if let Some(filename) = tokenizer_config_path - { - HubTokenizerConfig::from_file(filename) - } else { - tokenizer_config_filename.and_then(HubTokenizerConfig::from_file) + // let tokenizer_config: Option = if let Some(filename) = tokenizer_config_path + // { + // HubTokenizerConfig::from_file(filename) + // } else { + // tokenizer_config_filename.and_then(HubTokenizerConfig::from_file) + // }; + + // let tokenizer_config = tokenizer_config.unwrap_or_else(|| { + // tracing::warn!("Could not find tokenizer config locally and no API specified"); + // HubTokenizerConfig::default() + // }); + + let tokenizer: Tokenizer = { + use pyo3::prelude::*; + pyo3::Python::with_gil(|py| -> PyResult<()> { + py_resolve_tokenizer(py, &tokenizer_name, revision.as_deref(), false)?; + Ok(()) + }) + .inspect_err(|err| { + tracing::error!("Failed to import python tokenizer {err}"); + }) + .or_else(|err| { + let out = legacy_tokenizer_handle(config_filename.as_ref()); + out.ok_or(err) + }) + .expect("We cannot load a tokenizer"); + let filename = "out/tokenizer.json"; + if let Ok(tok) = tokenizers::Tokenizer::from_file(filename) { + Tokenizer::Rust(tok) + } else { + Tokenizer::Python { + tokenizer_name: tokenizer_name.to_string(), + revision: revision.map(|revision| revision.to_string()), + trust_remote_code: false, + } + } }; - tokenizer_filename.and_then(|filename| Tokenizer::from_file(filename).ok()) + Some(tokenizer) } #[tokio::main] @@ -258,50 +291,55 @@ async fn main() -> Result<(), TensorRtLlmBackendError> { } // Create the backend - let tokenizer = get_tokenizer( + match get_tokenizer( &tokenizer_name, tokenizer_config_path.as_deref(), revision.as_deref(), ) .await - .expect("Failed to retrieve tokenizer implementation"); + .expect("Failed to retrieve tokenizer implementation") { + Tokenizer::Python { .. } => { + Err(TensorRtLlmBackendError::Tokenizer("Failed to retrieve Rust based tokenizer".to_string())) + } + Tokenizer::Rust(tokenizer) => { + info!("Successfully retrieved tokenizer {}", &tokenizer_name); + let backend = TensorRtLlmBackendV2::new( + tokenizer, + model_id, + executor_worker, + max_concurrent_requests, + )?; - info!("Successfully retrieved tokenizer {}", &tokenizer_name); - let backend = TensorRtLlmBackendV2::new( - tokenizer, - model_id, - executor_worker, - max_concurrent_requests, - )?; + info!("Successfully created backend"); - info!("Successfully created backend"); + // Run server + server::run( + backend, + max_concurrent_requests, + max_best_of, + max_stop_sequences, + max_top_n_tokens, + max_input_tokens, + max_total_tokens, + validation_workers, + auth_token, + tokenizer_name, + tokenizer_config_path, + revision, + false, + hostname, + port, + cors_allow_origin, + false, + None, + None, + true, + max_client_batch_size, + usage_stats, + payload_limit, + ).await?; + Ok(()) + } + } - // Run server - server::run( - backend, - max_concurrent_requests, - max_best_of, - max_stop_sequences, - max_top_n_tokens, - max_input_tokens, - max_total_tokens, - validation_workers, - auth_token, - tokenizer_name, - tokenizer_config_path, - revision, - false, - hostname, - port, - cors_allow_origin, - false, - None, - None, - true, - max_client_batch_size, - usage_stats, - payload_limit, - ) - .await?; - Ok(()) } diff --git a/backends/trtllm/tests/infer_test.cpp b/backends/trtllm/tests/infer_test.cpp deleted file mode 100644 index 8520065a..00000000 --- a/backends/trtllm/tests/infer_test.cpp +++ /dev/null @@ -1,14 +0,0 @@ -// -// Created by mfuntowicz on 7/2/24. -// -#include -#include -#include "../include/backend.h" - -TEST_CASE("Load TRTLLM Engine on the TGI Backend", "[trtllm][engine][load]") { - const auto engines = std::filesystem::path("/home/mfuntowicz/.cache/huggingface/assets/trtllm/0.11.0.dev2024062500/meta-llama--Meta-Llama-3-8B-Instruct/4090/engines/"); - const auto executor = std::filesystem::path("/home/mfuntowicz/Workspace/text-generation-inference/backends/trtllm/cmake-build-debug/cmake-build-debug/_deps/trtllm-src/cpp/tensorrt_llm/executor_worker/executorWorker"); - - spdlog::info("Loading config from: {}", absolute(engines).string()); - huggingface::tgi::backends::TensorRtLlmBackend backend(engines, executor); -} diff --git a/backends/trtllm/tests/test_backend.cpp b/backends/trtllm/tests/test_backend.cpp new file mode 100644 index 00000000..ae097405 --- /dev/null +++ b/backends/trtllm/tests/test_backend.cpp @@ -0,0 +1,152 @@ +// +// Created by mfuntowicz on 12/3/24. +// + +#include +#include +#include + +#include "backend.hpp" + + + +using namespace huggingface::tgi::backends::trtllm; + +TEST_CASE("parse generation_config.json all set", "[generation_config_t]") +{ + const json config_j = {{"temperature", 0.6}, {"top_p", 0.95}, {"eos_token_id", {1,2,3}}}; + const auto generation_config = generation_config_t(config_j); + + REQUIRE_THAT(generation_config.temperature, Catch::Matchers::WithinAbs(0.6, 1e-6)); + REQUIRE_THAT(generation_config.top_p, Catch::Matchers::WithinAbs(0.95, 1e-6)); + + // Stop words + REQUIRE_FALSE(generation_config.stop_words.empty()); + REQUIRE(generation_config.stop_words.size() == config_j["/eos_token_id"_json_pointer].size()); + + for (auto [lhs, rhs] : std::views::zip(generation_config.stop_words, std::list>{{1}, {2}, {3}})) + { + // Currently we do not support multi-tokens stop words + REQUIRE(lhs.size() == 1); + REQUIRE(rhs.size() == 1); + REQUIRE_THAT(lhs, Catch::Matchers::UnorderedEquals(rhs)); + } +} + +TEST_CASE("parse generation_config.json default", "[generation_config_t]") +{ + const json config_j = {{"eos_token_id", {1,2,3}}}; + const auto generation_config = generation_config_t(config_j); + + REQUIRE_THAT(generation_config.temperature, Catch::Matchers::WithinAbs(1.0, 1e-6)); + REQUIRE_THAT(generation_config.top_p, Catch::Matchers::WithinAbs(1.0, 1e-6)); + + REQUIRE_FALSE(generation_config.stop_words.empty()); + REQUIRE(generation_config.stop_words.size() == config_j["/eos_token_id"_json_pointer].size()); + + for (auto [lhs, rhs] : std::views::zip(generation_config.stop_words, std::list>{{1}, {2}, {3}})) + { + // Currently we do not support multi-tokens stop words + REQUIRE(lhs.size() == 1); + REQUIRE(rhs.size() == 1); + REQUIRE_THAT(lhs, Catch::Matchers::UnorderedEquals(rhs)); + } +} + +TEST_CASE("parse generation_config.json empty", "[generation_config_t]") +{ + const json config_j = {{"eos_token_id", {}}}; + const auto generation_config = generation_config_t(config_j); + + REQUIRE_THAT(generation_config.temperature, Catch::Matchers::WithinAbs(1.0, 1e-6)); + REQUIRE_THAT(generation_config.top_p, Catch::Matchers::WithinAbs(1.0, 1e-6)); + + REQUIRE(generation_config.stop_words.empty()); + + const json config_j2 = {}; + const auto generation_config2 = generation_config_t(config_j); + + REQUIRE_THAT(generation_config2.temperature, Catch::Matchers::WithinAbs(1.0, 1e-6)); + REQUIRE_THAT(generation_config2.top_p, Catch::Matchers::WithinAbs(1.0, 1e-6)); + + REQUIRE(generation_config2.stop_words.empty()); +} + +TEST_CASE("parallel_config single", "[backend_workspace_t]") +{ + // Generate temporary folder + const auto tmp_p = std::filesystem::temp_directory_path(); + const auto config_p = tmp_p / "config.json"; + const auto generation_config_p = tmp_p / "generation_config.json"; + + // Generate content + std::ofstream o_config(config_p); + o_config << R"({"pretrained_config": {"mapping": {"world_size": 2}}})"_json; + o_config.close(); + + std::ofstream o_generation_config(generation_config_p); + o_generation_config << R"({"eos_token_id": []})"_json; + o_generation_config.close(); + + const auto workspace = backend_workspace_t(tmp_p.generic_string(), tmp_p.generic_string()); + const auto parallel = workspace.parallel_config(); + REQUIRE(parallel.getCommunicationMode() == tle::CommunicationMode::kORCHESTRATOR); + REQUIRE(parallel.getCommunicationType() == tle::CommunicationType::kMPI); + + std::filesystem::remove(config_p); + std::filesystem::remove(generation_config_p); +} + +TEST_CASE("parallel_config multi", "[backend_workspace_t]") +{ + // Generate temporary folder + const auto tmp_p = std::filesystem::temp_directory_path(); + const auto config_p = tmp_p / "config.json"; + const auto generation_config_p = tmp_p / "generation_config.json"; + + // Generate content + std::ofstream o_config(config_p); + o_config << R"({"pretrained_config": {"mapping": {"world_size": 1}}})"_json; + o_config.close(); + + std::ofstream o_generation_config(generation_config_p); + o_generation_config << R"({"eos_token_id": []})"_json; + o_generation_config.close(); + + const auto workspace = backend_workspace_t(tmp_p.generic_string(), tmp_p.generic_string()); + const auto parallel = workspace.parallel_config(); + REQUIRE(parallel.getCommunicationMode() == tle::CommunicationMode::kLEADER); + REQUIRE(parallel.getCommunicationType() == tle::CommunicationType::kMPI); + + std::filesystem::remove(config_p); + std::filesystem::remove(generation_config_p); +} + +TEST_CASE("executor_config", "[backend_workspace_t]") +{ + +} + +TEST_CASE("sampling_params_t to tle::SamplingConfig", "[backend_t]") +{ + const sampling_params_t params = {40, 0.95, 0.9, 1.0, 0.6, 2014}; + const auto config = static_cast(params); + + REQUIRE(config.getTopK().has_value()); + REQUIRE(config.getTopK().value() == params.top_k); + + REQUIRE(config.getSeed().has_value()); + REQUIRE(config.getSeed().value() == params.seed); + + REQUIRE(config.getTopP().has_value()); + REQUIRE_THAT(*config.getTopP(), Catch::Matchers::WithinAbs(params.top_p, 1e-6f)); + + REQUIRE(config.getRepetitionPenalty().has_value()); + REQUIRE_THAT(*config.getRepetitionPenalty(), Catch::Matchers::WithinAbs(params.repetition_penalty, 1e-6f)); + + REQUIRE(config.getFrequencyPenalty().has_value()); + REQUIRE_THAT(*config.getFrequencyPenalty(), Catch::Matchers::WithinAbs(params.frequency_penalty, 1e-6f)); + + REQUIRE(config.getTemperature().has_value()); + REQUIRE_THAT(*config.getTemperature(), Catch::Matchers::WithinAbs(params.temperature, 1e-6f)); +} \ No newline at end of file diff --git a/backends/trtllm/tests/test_hardware.cpp b/backends/trtllm/tests/test_hardware.cpp new file mode 100644 index 00000000..4cb7b562 --- /dev/null +++ b/backends/trtllm/tests/test_hardware.cpp @@ -0,0 +1,82 @@ +// +// Created by mfuntowicz on 11/16/24. +// + +#include +#include "../csrc/hardware.hpp" + +using namespace huggingface::tgi::hardware::cuda; + +TEST_CASE("is_at_least_") { + const static auto VOLTA_CAPABILITIES = compute_capabilities_t(7, 0); + REQUIRE(VOLTA_CAPABILITIES.is_at_least_volta()); + REQUIRE_FALSE(VOLTA_CAPABILITIES.is_at_least_turing()); + REQUIRE_FALSE(VOLTA_CAPABILITIES.is_at_least_ampere()); + REQUIRE_FALSE(VOLTA_CAPABILITIES.is_at_least_ada_lovelace()); + REQUIRE_FALSE(VOLTA_CAPABILITIES.is_at_least_hopper()); + + const static auto TURING_CAPABILITIES = compute_capabilities_t(7, 5); + REQUIRE(TURING_CAPABILITIES.is_at_least_volta()); + REQUIRE(TURING_CAPABILITIES.is_at_least_turing()); + REQUIRE_FALSE(TURING_CAPABILITIES.is_at_least_ampere()); + REQUIRE_FALSE(TURING_CAPABILITIES.is_at_least_ada_lovelace()); + REQUIRE_FALSE(TURING_CAPABILITIES.is_at_least_hopper()); + + const static auto AMPERE_CAPABILITIES = compute_capabilities_t(8, 0); + REQUIRE(AMPERE_CAPABILITIES.is_at_least_volta()); + REQUIRE(AMPERE_CAPABILITIES.is_at_least_turing()); + REQUIRE(AMPERE_CAPABILITIES.is_at_least_ampere()); + REQUIRE_FALSE(AMPERE_CAPABILITIES.is_at_least_ada_lovelace()); + REQUIRE_FALSE(AMPERE_CAPABILITIES.is_at_least_hopper()); + + const static auto ADA_LOVELACE_CAPABILITIES = compute_capabilities_t(8, 9); + REQUIRE(ADA_LOVELACE_CAPABILITIES.is_at_least_volta()); + REQUIRE(ADA_LOVELACE_CAPABILITIES.is_at_least_turing()); + REQUIRE(ADA_LOVELACE_CAPABILITIES.is_at_least_ampere()); + REQUIRE(ADA_LOVELACE_CAPABILITIES.is_at_least_ada_lovelace()); + REQUIRE_FALSE(ADA_LOVELACE_CAPABILITIES.is_at_least_hopper()); + + const static auto HOPPER_CAPABILITIES = compute_capabilities_t(9, 0); + REQUIRE(HOPPER_CAPABILITIES.is_at_least_volta()); + REQUIRE(HOPPER_CAPABILITIES.is_at_least_turing()); + REQUIRE(HOPPER_CAPABILITIES.is_at_least_ampere()); + REQUIRE(HOPPER_CAPABILITIES.is_at_least_ada_lovelace()); + REQUIRE(HOPPER_CAPABILITIES.is_at_least_hopper()); +} + +TEST_CASE("is_at_least") { + const static auto VOLTA_CAPABILITIES = compute_capabilities_t(7, 0); + REQUIRE(VOLTA_CAPABILITIES.is_at_least(VOLTA)); + REQUIRE_FALSE(VOLTA_CAPABILITIES.is_at_least(TURING)); + REQUIRE_FALSE(VOLTA_CAPABILITIES.is_at_least(AMPERE)); + REQUIRE_FALSE(VOLTA_CAPABILITIES.is_at_least(ADA_LOVELACE)); + REQUIRE_FALSE(VOLTA_CAPABILITIES.is_at_least(HOPPER)); + + const static auto TURING_CAPABILITIES = compute_capabilities_t(7, 5); + REQUIRE(TURING_CAPABILITIES.is_at_least(VOLTA)); + REQUIRE(TURING_CAPABILITIES.is_at_least(TURING)); + REQUIRE_FALSE(TURING_CAPABILITIES.is_at_least(AMPERE)); + REQUIRE_FALSE(TURING_CAPABILITIES.is_at_least(ADA_LOVELACE)); + REQUIRE_FALSE(TURING_CAPABILITIES.is_at_least(HOPPER)); + + const static auto AMPERE_CAPABILITIES = compute_capabilities_t(8, 0); + REQUIRE(AMPERE_CAPABILITIES.is_at_least(VOLTA)); + REQUIRE(AMPERE_CAPABILITIES.is_at_least(TURING)); + REQUIRE(AMPERE_CAPABILITIES.is_at_least(AMPERE)); + REQUIRE_FALSE(AMPERE_CAPABILITIES.is_at_least(ADA_LOVELACE)); + REQUIRE_FALSE(AMPERE_CAPABILITIES.is_at_least(HOPPER)); + + const static auto ADA_LOVELACE_CAPABILITIES = compute_capabilities_t(8, 9); + REQUIRE(ADA_LOVELACE_CAPABILITIES.is_at_least(VOLTA)); + REQUIRE(ADA_LOVELACE_CAPABILITIES.is_at_least(TURING)); + REQUIRE(ADA_LOVELACE_CAPABILITIES.is_at_least(AMPERE)); + REQUIRE(ADA_LOVELACE_CAPABILITIES.is_at_least(ADA_LOVELACE)); + REQUIRE_FALSE(ADA_LOVELACE_CAPABILITIES.is_at_least(HOPPER)); + + const static auto HOPPER_CAPABILITIES = compute_capabilities_t (9, 0); + REQUIRE(HOPPER_CAPABILITIES.is_at_least(VOLTA)); + REQUIRE(HOPPER_CAPABILITIES.is_at_least(TURING)); + REQUIRE(HOPPER_CAPABILITIES.is_at_least(AMPERE)); + REQUIRE(HOPPER_CAPABILITIES.is_at_least(ADA_LOVELACE)); + REQUIRE(HOPPER_CAPABILITIES.is_at_least(HOPPER)); +} \ No newline at end of file diff --git a/docs/source/_toctree.yml b/docs/source/_toctree.yml index e31a3788..4503424b 100644 --- a/docs/source/_toctree.yml +++ b/docs/source/_toctree.yml @@ -17,6 +17,8 @@ title: Using TGI with Intel GPUs - local: installation title: Installation from source + - local: multi_backend_support + title: Multi-backend support - local: architecture title: Internal Architecture @@ -45,6 +47,10 @@ - local: basic_tutorials/train_medusa title: Train Medusa title: Tutorials +- sections: + - local: backends/trtllm + title: TensorRT-LLM + title: Backends - sections: - local: reference/launcher title: All TGI CLI options diff --git a/docs/source/architecture.md b/docs/source/architecture.md index 6660630d..d3a6fa92 100644 --- a/docs/source/architecture.md +++ b/docs/source/architecture.md @@ -9,8 +9,10 @@ A high-level architecture diagram can be seen here: This diagram shows well there are these separate components: - **The router**, also named `webserver`, that receives the client requests, buffers them, creates some batches, and prepares gRPC calls to a model server. -- **The model server**, responsible of receiving the gRPC requests and to process the inference on the model. If the model is sharded across multiple accelerators (e.g.: multiple GPUs), the model server shards might be synchronized via NCCL or equivalent. - **The launcher** is a helper that will be able to launch one or several model servers (if model is sharded), and it launches the router with the compatible arguments. +- **The model server**, responsible for receiving the gRPC requests and to process the inference on the model. If the model is sharded across multiple accelerators (e.g.: multiple GPUs), the model server shards might be synchronized via NCCL or equivalent. + +Note that for other backends (eg. TRTLLM) the model server and launcher are specific to the backend. The router and the model server can be two different machines, they do not need to be deployed together. diff --git a/docs/source/backends/trtllm.md b/docs/source/backends/trtllm.md new file mode 100644 index 00000000..8eb37180 --- /dev/null +++ b/docs/source/backends/trtllm.md @@ -0,0 +1,81 @@ +# TensorRT-LLM backend + +The NVIDIA TensorRT-LLM (TRTLLM) backend is a high-performance backend for LLMs +that uses NVIDIA's TensorRT library for inference acceleration. +It makes use of specific optimizations for NVIDIA GPUs, such as custom kernels. + +To use the TRTLLM backend you need to compile `engines` for the models you want to use. +Each `engine` must be compiled on the same GPU architecture that you will use for inference. + +## Supported models + +Check the [support matrix](https://nvidia.github.io/TensorRT-LLM/reference/support-matrix.html) to see which models are +supported. + +## Compiling engines + +You can use [Optimum-NVIDIA](https://github.com/huggingface/optimum-nvidia) to compile engines for the models you +want to use. + +```bash +MODEL_NAME="meta-llama/Llama-3.1-8B-Instruct" + +# Install huggingface_cli +python -m pip install huggingface-cli[hf_transfer] + +# Login to the Hugging Face Hub +huggingface-cli login + +# Create a directory to store the model +mkdir -p /tmp/models/$MODEL_NAME + +# Create a directory to store the compiled engine +mkdir -p /tmp/engines/$MODEL_NAME + +# Download the model +HF_HUB_ENABLE_HF_TRANSFER=1 huggingface-cli download --local-dir /tmp/models/$MODEL_NAME $MODEL_NAME + +# Compile the engine using Optimum-NVIDIA +docker run \ + --rm \ + -it \ + --gpus=1 \ + -v /tmp/models/$MODEL_NAME:/model \ + -v /tmp/engines/$MODEL_NAME:/engine \ + huggingface/optimum-nvidia \ + optimum-cli export trtllm \ + --tp=1 \ + --pp=1 \ + --max-batch-size=128 \ + --max-input-length 4096 \ + --max-output-length 8192 \ + --max-beams-width=1 \ + --destination /engine \ + $MODEL_NAME +``` + +Your compiled engine will be saved in the `/tmp/engines/$MODEL_NAME` directory. + +## Using the TRTLLM backend + +Run TGI-TRTLLM Docker image with the compiled engine: + +```bash +docker run \ + --gpus 1 \ + -it \ + --rm \ + -p 3000:3000 \ + -e MODEL=$MODEL_NAME \ + -e PORT=3000 \ + -e HF_TOKEN='hf_XXX' \ + -v /tmp/engines/$MODEL_NAME:/data \ + ghcr.io/huggingface/text-generation-inference:latest-trtllm \ + --executor-worker executorWorker \ + --model-id /data/$MODEL_NAME +``` + +## Development + +To develop TRTLLM backend, you can use [dev containers](https://containers.dev/) located in +`.devcontainer` directory. \ No newline at end of file diff --git a/docs/source/multi_backend_support.md b/docs/source/multi_backend_support.md new file mode 100644 index 00000000..5899e4b7 --- /dev/null +++ b/docs/source/multi_backend_support.md @@ -0,0 +1,13 @@ +# Multi-backend support + +TGI (Text Generation Inference) offers flexibility by supporting multiple backends for serving large language models (LLMs). +With multi-backend support, you can choose the backend that best suits your needs, +whether you prioritize performance, ease of use, or compatibility with specific hardware. API interaction with +TGI remains consistent across backends, allowing you to switch between them seamlessly. + +**Supported backends:** +* **TGI CUDA backend**: This high-performance backend is optimized for NVIDIA GPUs and serves as the default option + within TGI. Developed in-house, it boasts numerous optimizations and is used in production by various projects, including those by Hugging Face. +* **[TGI TRTLLM backend](./backends/trtllm)**: This backend leverages NVIDIA's TensorRT library to accelerate LLM inference. + It utilizes specialized optimizations and custom kernels for enhanced performance. + However, it requires a model-specific compilation step for each GPU architecture. \ No newline at end of file diff --git a/router/src/server.rs b/router/src/server.rs index 29df3d06..aef0f812 100644 --- a/router/src/server.rs +++ b/router/src/server.rs @@ -1593,7 +1593,7 @@ pub fn schema() -> ApiDoc { ApiDoc } -fn py_resolve_tokenizer( +pub fn py_resolve_tokenizer( py: pyo3::Python, tokenizer_name: &str, revision: Option<&str>, @@ -1619,7 +1619,7 @@ fn py_resolve_tokenizer( Ok(()) } -fn legacy_tokenizer_handle(config_filename: Option<&PathBuf>) -> Option<()> { +pub fn legacy_tokenizer_handle(config_filename: Option<&PathBuf>) -> Option<()> { // XXX Legacy case for FasterDecoding/medusa-vicuna-7b-v1.3 // and state-spaces/mamba-130m tracing::warn!("Odd tokenizer detected, falling back on legacy tokenization"); From 1708865fdc05432565c7fc33e0ba0ce99e235d1c Mon Sep 17 00:00:00 2001 From: Hugo Larcher Date: Fri, 13 Dec 2024 16:19:06 +0100 Subject: [PATCH 10/16] Feat/trtllm cancellation dev container (#2795) Add devcontainers for TRTLLM backend. --------- Co-authored-by: Morgan Funtowicz --- .devcontainer/Dockerfile.trtllm | 0 .devcontainer/Dockerfile_trtllm | 75 +++++++++++++++++++++++++++++++++ .devcontainer/devcontainer.json | 19 +++++++++ 3 files changed, 94 insertions(+) delete mode 100644 .devcontainer/Dockerfile.trtllm create mode 100644 .devcontainer/Dockerfile_trtllm diff --git a/.devcontainer/Dockerfile.trtllm b/.devcontainer/Dockerfile.trtllm deleted file mode 100644 index e69de29b..00000000 diff --git a/.devcontainer/Dockerfile_trtllm b/.devcontainer/Dockerfile_trtllm new file mode 100644 index 00000000..21b7114c --- /dev/null +++ b/.devcontainer/Dockerfile_trtllm @@ -0,0 +1,75 @@ +ARG CUDA_ARCH_LIST="75-real;80-real;86-real;89-real;90-real" +ARG OMPI_VERSION="4.1.7rc1" + +# Build dependencies resolver stage +FROM lukemathwalker/cargo-chef:latest AS chef +WORKDIR /usr/src/text-generation-inference/backends/trtllm + +FROM chef AS planner +COPY . . +RUN cargo chef prepare --recipe-path recipe.json + +# CUDA dependent dependencies resolver stage +FROM nvidia/cuda:12.6.3-cudnn-devel-ubuntu24.04 AS cuda-builder + +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + apt update && apt install -y \ + build-essential \ + cmake \ + curl \ + gcc-14 \ + g++-14 \ + git \ + git-lfs \ + libssl-dev \ + libucx-dev \ + ninja-build \ + pkg-config \ + pipx \ + python3 \ + python3-dev \ + python3-setuptools \ + tar \ + wget && \ + pipx ensurepath + +ENV TGI_INSTALL_PREFIX=/usr/local/tgi +ENV TENSORRT_INSTALL_PREFIX=/usr/local/tensorrt + +# Install OpenMPI +FROM cuda-builder AS mpi-builder +ARG OMPI_VERSION + +ENV OMPI_TARBALL_FILENAME="openmpi-$OMPI_VERSION.tar.bz2" +RUN wget "https://download.open-mpi.org/release/open-mpi/v4.1/$OMPI_TARBALL_FILENAME" -P /opt/src && \ + mkdir /usr/src/mpi && \ + tar -xf "/opt/src/$OMPI_TARBALL_FILENAME" -C /usr/src/mpi --strip-components=1 && \ + cd /usr/src/mpi && \ + ./configure --prefix=/usr/local/mpi --with-cuda=/usr/local/cuda --with-slurm && \ + make -j all && \ + make install && \ + rm -rf "/opt/src/$OMPI_TARBALL_FILENAME" + +# Install TensorRT +FROM cuda-builder AS trt-builder +COPY backends/trtllm/scripts/install_tensorrt.sh /opt/install_tensorrt.sh +RUN chmod +x /opt/install_tensorrt.sh && \ + /opt/install_tensorrt.sh + +# Build Backend +FROM cuda-builder AS tgi-builder +WORKDIR /usr/src/text-generation-inference + +# Install Rust +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | bash -s -- -y && \ + chmod -R a+w /root/.rustup && \ + chmod -R a+w /root/.cargo + +ENV PATH="/root/.cargo/bin:$PATH" +RUN cargo install cargo-chef + +COPY --from=trt-builder /usr/local/tensorrt /usr/local/tensorrt +COPY --from=mpi-builder /usr/local/mpi /usr/local/mpi + +ENV MPI_HOME=/usr/local/mpi \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index e69de29b..8b4eb89c 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,19 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/cpp +{ + "name": "CUDA", + "build": { + "dockerfile": "Dockerfile_trtllm", + "context": ".." + }, + "remoteEnv": { + "PATH": "${containerEnv:PATH}:/usr/local/cuda/bin", + "LD_LIBRARY_PATH": "$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64", + "XLA_FLAGS": "--xla_gpu_cuda_data_dir=/usr/local/cuda" + }, + "customizations" : { + "jetbrains" : { + "backend" : "CLion" + } + } +} From 6f0b8c947daacee9f5c47c63d60b7b16d50d35a1 Mon Sep 17 00:00:00 2001 From: Nicolas Patry Date: Mon, 16 Dec 2024 10:34:50 +0100 Subject: [PATCH 11/16] New arg. (#2845) --- router/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/router/src/lib.rs b/router/src/lib.rs index d6e42edb..84e9bc48 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -459,7 +459,7 @@ pub struct CompletionRequest { pub prompt: Prompt, /// The maximum number of tokens that can be generated in the chat completion. - #[serde(default)] + #[serde(default, alias = "max_completion_tokens")] #[schema(default = "1024", example = "32")] pub max_tokens: Option, From 11ab329883b70796b3fd417d01caf57d0d2daf73 Mon Sep 17 00:00:00 2001 From: Nicolas Patry Date: Mon, 16 Dec 2024 10:58:15 +0100 Subject: [PATCH 12/16] Fixing CI. (#2846) --- backends/trtllm/build.rs | 13 ++++++------ backends/trtllm/src/looper.rs | 26 +++++++++++------------ backends/trtllm/src/main.rs | 40 ++++++++++++++++++----------------- docs/openapi.json | 2 +- 4 files changed, 42 insertions(+), 39 deletions(-) diff --git a/backends/trtllm/build.rs b/backends/trtllm/build.rs index 0a0f6e6b..d9c1aa15 100644 --- a/backends/trtllm/build.rs +++ b/backends/trtllm/build.rs @@ -44,7 +44,8 @@ fn build_backend(is_debug: bool, opt_level: &str, out_dir: &PathBuf) -> (PathBuf } let mut config = cmake::Config::new("."); - config.uses_cxx11() + config + .uses_cxx11() .generator("Ninja") .profile(match is_debug { true => "Debug", @@ -57,12 +58,12 @@ fn build_backend(is_debug: bool, opt_level: &str, out_dir: &PathBuf) -> (PathBuf .define("TGI_TRTLLM_BACKEND_TARGET_CUDA_ARCH_LIST", cuda_arch_list) .define("TGI_TRTLLM_BACKEND_TRT_ROOT", tensorrt_path); - // Allow to override which Python to use ... - if let Some(python3) = option_env!("Python3_EXECUTABLE") { - config.define("Python3_EXECUTABLE", python3); - } + // Allow to override which Python to use ... + if let Some(python3) = option_env!("Python3_EXECUTABLE") { + config.define("Python3_EXECUTABLE", python3); + } - config.build(); + config.build(); // Additional transitive CMake dependencies let deps_folder = out_dir.join("build").join("_deps"); diff --git a/backends/trtllm/src/looper.rs b/backends/trtllm/src/looper.rs index 3addd95f..969046d1 100644 --- a/backends/trtllm/src/looper.rs +++ b/backends/trtllm/src/looper.rs @@ -133,13 +133,16 @@ fn executor_status_looper( Ok(decoded_token) => { post_process_decoded_token(&tokenizer, ctx, decoded_token) } - Err(err) => Err(err) + Err(err) => Err(err), }; // Attempt to send back the response to the client if let Err(_) = ctx.streamer.send(response) { // Client has dropped, remove from tracked requests - debug!("Client dropped - removing request {} from tracked requests", step.request_id); + debug!( + "Client dropped - removing request {} from tracked requests", + step.request_id + ); backend.as_mut().cancel(step.request_id); let _ = in_flights.remove(&step.request_id); } @@ -160,11 +163,14 @@ fn executor_status_looper( } } -fn post_process_decoded_token(tokenizer: &Tokenizer, ctx: &mut GenerationContext, decoded_token: DecodedToken) -> InferResult { +fn post_process_decoded_token( + tokenizer: &Tokenizer, + ctx: &mut GenerationContext, + decoded_token: DecodedToken, +) -> InferResult { match tokenizer.decode(&[decoded_token.id], false) { Ok(text) => { - let is_special = - tokenizer.get_added_vocabulary().is_special_token(&text); + let is_special = tokenizer.get_added_vocabulary().is_special_token(&text); let token = Token { id: decoded_token.id, text, @@ -186,7 +192,7 @@ fn post_process_decoded_token(tokenizer: &Tokenizer, ctx: &mut GenerationContext let generated_text = GeneratedText { text: text.unwrap(), generated_tokens: ctx.tokens.len() as u32, - finish_reason: FinishReason::EndOfSequenceToken, // TODO : Map FinishReason + finish_reason: FinishReason::EndOfSequenceToken, // TODO : Map FinishReason seed: None, }; @@ -248,7 +254,6 @@ unsafe impl Send for TensorRtLlmBackendImpl {} pub struct TensorRtLlmBackendV2(UnboundedSender); - impl TensorRtLlmBackendV2 { pub fn new + Send, PP: AsRef + Send>( tokenizer: Tokenizer, @@ -268,12 +273,7 @@ impl TensorRtLlmBackendV2 { // Executor looper is responsible for scheduling and pulling requests state at regular interval spawn_blocking(move || { - executor_status_looper( - max_inflight_requests, - tokenizer, - backend, - executor_receiver, - ) + executor_status_looper(max_inflight_requests, tokenizer, backend, executor_receiver) }); Ok(TensorRtLlmBackendV2(executor_sender)) diff --git a/backends/trtllm/src/main.rs b/backends/trtllm/src/main.rs index 9c76bafa..af299f7d 100644 --- a/backends/trtllm/src/main.rs +++ b/backends/trtllm/src/main.rs @@ -7,9 +7,11 @@ use tracing::info; use text_generation_backends_trtllm::errors::TensorRtLlmBackendError; use text_generation_backends_trtllm::TensorRtLlmBackendV2; +use text_generation_router::server::{ + get_hub_model_info, legacy_tokenizer_handle, py_resolve_tokenizer, +}; use text_generation_router::usage_stats::UsageStatsLevel; use text_generation_router::{server, HubTokenizerConfig, Tokenizer}; -use text_generation_router::server::{get_hub_model_info, legacy_tokenizer_handle, py_resolve_tokenizer}; /// App Configuration #[derive(Parser, Debug)] @@ -129,14 +131,14 @@ async fn get_tokenizer( _tokenizer_config_filename, _preprocessor_config_filename, _processor_config_filename, - _model_info + _model_info, ) = match api { Type::None => ( Some(local_path.join("config.json")), Some(local_path.join("tokenizer_config.json")), Some(local_path.join("preprocessor_config.json")), Some(local_path.join("processor_config.json")), - None + None, ), Type::Api(api) => { let api_repo = api.repo(Repo::with_revision( @@ -145,7 +147,6 @@ async fn get_tokenizer( revision.unwrap_or_else(|| "main").to_string(), )); - let config_filename = api_repo.get("config.json").await.ok(); let tokenizer_config_filename = api_repo.get("tokenizer_config.json").await.ok(); let preprocessor_config_filename = api_repo.get("preprocessor_config.json").await.ok(); @@ -176,7 +177,7 @@ async fn get_tokenizer( repo.get("tokenizer_config.json"), repo.get("preprocessor_config.json"), repo.get("processor_config.json"), - None + None, ) } }; @@ -200,14 +201,14 @@ async fn get_tokenizer( py_resolve_tokenizer(py, &tokenizer_name, revision.as_deref(), false)?; Ok(()) }) - .inspect_err(|err| { - tracing::error!("Failed to import python tokenizer {err}"); - }) - .or_else(|err| { - let out = legacy_tokenizer_handle(config_filename.as_ref()); - out.ok_or(err) - }) - .expect("We cannot load a tokenizer"); + .inspect_err(|err| { + tracing::error!("Failed to import python tokenizer {err}"); + }) + .or_else(|err| { + let out = legacy_tokenizer_handle(config_filename.as_ref()); + out.ok_or(err) + }) + .expect("We cannot load a tokenizer"); let filename = "out/tokenizer.json"; if let Ok(tok) = tokenizers::Tokenizer::from_file(filename) { Tokenizer::Rust(tok) @@ -297,10 +298,11 @@ async fn main() -> Result<(), TensorRtLlmBackendError> { revision.as_deref(), ) .await - .expect("Failed to retrieve tokenizer implementation") { - Tokenizer::Python { .. } => { - Err(TensorRtLlmBackendError::Tokenizer("Failed to retrieve Rust based tokenizer".to_string())) - } + .expect("Failed to retrieve tokenizer implementation") + { + Tokenizer::Python { .. } => Err(TensorRtLlmBackendError::Tokenizer( + "Failed to retrieve Rust based tokenizer".to_string(), + )), Tokenizer::Rust(tokenizer) => { info!("Successfully retrieved tokenizer {}", &tokenizer_name); let backend = TensorRtLlmBackendV2::new( @@ -337,9 +339,9 @@ async fn main() -> Result<(), TensorRtLlmBackendError> { max_client_batch_size, usage_stats, payload_limit, - ).await?; + ) + .await?; Ok(()) } } - } diff --git a/docs/openapi.json b/docs/openapi.json index 1caf6752..48120f77 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -10,7 +10,7 @@ "name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0" }, - "version": "3.0.1-dev0" + "version": "3.0.2-dev0" }, "paths": { "/": { From a72f339c79728c12e66629ac179d735d586ec10c Mon Sep 17 00:00:00 2001 From: drbh Date: Mon, 16 Dec 2024 16:12:34 -0500 Subject: [PATCH 13/16] fix: lint backend and doc files (#2850) --- .devcontainer/Dockerfile_trtllm | 2 +- backends/trtllm/csrc/backend.hpp | 2 +- backends/trtllm/csrc/ffi.hpp | 2 +- backends/trtllm/csrc/hardware.hpp | 2 +- backends/trtllm/tests/test_backend.cpp | 2 +- backends/trtllm/tests/test_hardware.cpp | 2 +- docs/source/backends/trtllm.md | 8 ++++---- docs/source/multi_backend_support.md | 12 ++++++------ 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.devcontainer/Dockerfile_trtllm b/.devcontainer/Dockerfile_trtllm index 21b7114c..239a7bf8 100644 --- a/.devcontainer/Dockerfile_trtllm +++ b/.devcontainer/Dockerfile_trtllm @@ -72,4 +72,4 @@ RUN cargo install cargo-chef COPY --from=trt-builder /usr/local/tensorrt /usr/local/tensorrt COPY --from=mpi-builder /usr/local/mpi /usr/local/mpi -ENV MPI_HOME=/usr/local/mpi \ No newline at end of file +ENV MPI_HOME=/usr/local/mpi diff --git a/backends/trtllm/csrc/backend.hpp b/backends/trtllm/csrc/backend.hpp index f49c437a..40b44a84 100644 --- a/backends/trtllm/csrc/backend.hpp +++ b/backends/trtllm/csrc/backend.hpp @@ -228,4 +228,4 @@ struct fmt::formatter : f } }; -#endif \ No newline at end of file +#endif diff --git a/backends/trtllm/csrc/ffi.hpp b/backends/trtllm/csrc/ffi.hpp index de2333af..d0342d4b 100644 --- a/backends/trtllm/csrc/ffi.hpp +++ b/backends/trtllm/csrc/ffi.hpp @@ -159,4 +159,4 @@ namespace huggingface::tgi::backends::trtllm { ); } } -#endif \ No newline at end of file +#endif diff --git a/backends/trtllm/csrc/hardware.hpp b/backends/trtllm/csrc/hardware.hpp index 8e5fa696..abfb4afd 100644 --- a/backends/trtllm/csrc/hardware.hpp +++ b/backends/trtllm/csrc/hardware.hpp @@ -78,4 +78,4 @@ namespace huggingface::tgi::hardware::cuda { [[nodiscard]] constexpr bool is_at_least_hopper() const { return is_at_least(HOPPER); } }; } -#endif \ No newline at end of file +#endif diff --git a/backends/trtllm/tests/test_backend.cpp b/backends/trtllm/tests/test_backend.cpp index ae097405..14d92b75 100644 --- a/backends/trtllm/tests/test_backend.cpp +++ b/backends/trtllm/tests/test_backend.cpp @@ -149,4 +149,4 @@ TEST_CASE("sampling_params_t to tle::SamplingConfig", "[backend_t]") REQUIRE(config.getTemperature().has_value()); REQUIRE_THAT(*config.getTemperature(), Catch::Matchers::WithinAbs(params.temperature, 1e-6f)); -} \ No newline at end of file +} diff --git a/backends/trtllm/tests/test_hardware.cpp b/backends/trtllm/tests/test_hardware.cpp index 4cb7b562..e14f1f35 100644 --- a/backends/trtllm/tests/test_hardware.cpp +++ b/backends/trtllm/tests/test_hardware.cpp @@ -79,4 +79,4 @@ TEST_CASE("is_at_least") { REQUIRE(HOPPER_CAPABILITIES.is_at_least(AMPERE)); REQUIRE(HOPPER_CAPABILITIES.is_at_least(ADA_LOVELACE)); REQUIRE(HOPPER_CAPABILITIES.is_at_least(HOPPER)); -} \ No newline at end of file +} diff --git a/docs/source/backends/trtllm.md b/docs/source/backends/trtllm.md index 8eb37180..be6416b1 100644 --- a/docs/source/backends/trtllm.md +++ b/docs/source/backends/trtllm.md @@ -17,7 +17,7 @@ supported. You can use [Optimum-NVIDIA](https://github.com/huggingface/optimum-nvidia) to compile engines for the models you want to use. -```bash +```bash MODEL_NAME="meta-llama/Llama-3.1-8B-Instruct" # Install huggingface_cli @@ -32,7 +32,7 @@ mkdir -p /tmp/models/$MODEL_NAME # Create a directory to store the compiled engine mkdir -p /tmp/engines/$MODEL_NAME -# Download the model +# Download the model HF_HUB_ENABLE_HF_TRANSFER=1 huggingface-cli download --local-dir /tmp/models/$MODEL_NAME $MODEL_NAME # Compile the engine using Optimum-NVIDIA @@ -69,7 +69,7 @@ docker run \ -e MODEL=$MODEL_NAME \ -e PORT=3000 \ -e HF_TOKEN='hf_XXX' \ - -v /tmp/engines/$MODEL_NAME:/data \ + -v /tmp/engines/$MODEL_NAME:/data \ ghcr.io/huggingface/text-generation-inference:latest-trtllm \ --executor-worker executorWorker \ --model-id /data/$MODEL_NAME @@ -78,4 +78,4 @@ docker run \ ## Development To develop TRTLLM backend, you can use [dev containers](https://containers.dev/) located in -`.devcontainer` directory. \ No newline at end of file +`.devcontainer` directory. diff --git a/docs/source/multi_backend_support.md b/docs/source/multi_backend_support.md index 5899e4b7..c4df15bc 100644 --- a/docs/source/multi_backend_support.md +++ b/docs/source/multi_backend_support.md @@ -1,13 +1,13 @@ # Multi-backend support TGI (Text Generation Inference) offers flexibility by supporting multiple backends for serving large language models (LLMs). -With multi-backend support, you can choose the backend that best suits your needs, -whether you prioritize performance, ease of use, or compatibility with specific hardware. API interaction with +With multi-backend support, you can choose the backend that best suits your needs, +whether you prioritize performance, ease of use, or compatibility with specific hardware. API interaction with TGI remains consistent across backends, allowing you to switch between them seamlessly. **Supported backends:** -* **TGI CUDA backend**: This high-performance backend is optimized for NVIDIA GPUs and serves as the default option +* **TGI CUDA backend**: This high-performance backend is optimized for NVIDIA GPUs and serves as the default option within TGI. Developed in-house, it boasts numerous optimizations and is used in production by various projects, including those by Hugging Face. -* **[TGI TRTLLM backend](./backends/trtllm)**: This backend leverages NVIDIA's TensorRT library to accelerate LLM inference. - It utilizes specialized optimizations and custom kernels for enhanced performance. - However, it requires a model-specific compilation step for each GPU architecture. \ No newline at end of file +* **[TGI TRTLLM backend](./backends/trtllm)**: This backend leverages NVIDIA's TensorRT library to accelerate LLM inference. + It utilizes specialized optimizations and custom kernels for enhanced performance. + However, it requires a model-specific compilation step for each GPU architecture. From 7eeefa3b5741c6a59690a80900a0d5ba30f86d31 Mon Sep 17 00:00:00 2001 From: janne-alatalo <48620812+janne-alatalo@users.noreply.github.com> Date: Tue, 17 Dec 2024 05:55:11 +0200 Subject: [PATCH 14/16] Qwen2-VL runtime error fix when prompted with multiple images (#2840) * Fix runtime error when Qwen2-VL was prompted with multiple images Fix runtime error when Qwen2-VL model is prompted with prompt with more than one image. The runtime error was: File "text-generation-inference/server/text_generation_server/models/custom_modeling/qwen2_vl.py", line 459, in get_position_ids text_pos_ids = torch.arange(text_length, device=d) RuntimeError: upper bound and larger bound inconsistent with step sign The error was caused by text_length variable going to negative value when multiple images caused multiple loops in the get_position_ids function's main loop. The error is a simple logic mistake where next_image_pos is initialized as relative offset from current_pos, but was used like it was absolute position from zero. * Fix runtime error when Qwen2-VL was prompted with multiple images Fix runtime error when Qwen2-VL model is prompted with prompt with more than one image. The runtime error was: File "text-generation-inference/server/text_generation_server/models/custom_modeling/qwen2_vl.py", line 534, in forward inputs_embeds[input_ids == self.image_token_id] = image_embeds RuntimeError: shape mismatch: value tensor of shape [512, 3584] cannot be broadcast to indexing result of shape [1024, 3584] (The error message shape numbers can be different depending on the input image resolutions) The error was caused by adding the wrong number of <|image_pad|> tokens to the tokenized input in the image_text_replacement function. The error is a simple logical mistake where the number of image pad tokens is checked from pixel_value_shape tensor's first dimension length. However, the pixel_value_shape contains patches from all of the images. Therefore the code added the total number of required image pad tokens for the whole input to each of the images locations. This resulted to extra image pad tokens to be present in the tokenized input. The fix was to check the number of required tokens from the image_grid_thw tensor. The tensor includes grid_t, grid_h, and grid_w values for each image. grid_t * grid_h * grid_w results to the total number of patches for the image [1]. The number of required image pad tokens is number_of_patches // 4. [1] https://github.com/huggingface/transformers/blob/31f9a289a6207be6cae746e009d8e0db523be203/src/transformers/models/qwen2_vl/image_processing_qwen2_vl.py#L311 --------- Co-authored-by: Janne Alatalo --- .../text_generation_server/models/custom_modeling/qwen2_vl.py | 4 ++-- server/text_generation_server/models/vlm_causal_lm.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/server/text_generation_server/models/custom_modeling/qwen2_vl.py b/server/text_generation_server/models/custom_modeling/qwen2_vl.py index ddb4e36d..a8e1e8c1 100644 --- a/server/text_generation_server/models/custom_modeling/qwen2_vl.py +++ b/server/text_generation_server/models/custom_modeling/qwen2_vl.py @@ -450,7 +450,7 @@ class Qwen2VLForConditionalGeneration(nn.Module): width //= self.spatial_merge_size # calculate the length of the text and image tokens - text_length = next_image_pos - current_pos + text_length = next_image_pos start_idx = ( llm_pos_ids_list[-1].max() + 1 if llm_pos_ids_list else 0 ) @@ -480,7 +480,7 @@ class Qwen2VLForConditionalGeneration(nn.Module): ) llm_pos_ids_list.append(image_pos_ids) - current_pos = next_image_pos + time_steps * height * width + current_pos += next_image_pos + time_steps * height * width image_index += 1 if current_pos < batch_input_ids.size(1): diff --git a/server/text_generation_server/models/vlm_causal_lm.py b/server/text_generation_server/models/vlm_causal_lm.py index aa0fe107..81b4369b 100644 --- a/server/text_generation_server/models/vlm_causal_lm.py +++ b/server/text_generation_server/models/vlm_causal_lm.py @@ -68,7 +68,8 @@ def image_text_replacement(processor, image_input, config, image_id: int) -> str elif config.model_type == "paligemma": return "" * config.text_config.num_image_tokens elif config.model_type == "qwen2_vl": - num_pads = image_input.pixel_values.shape[0] // 4 + grid_t, grid_h, grid_w = image_input["image_grid_thw"][image_id] + num_pads = grid_t * grid_h * grid_w // 4 padding = "<|image_pad|>" * num_pads return f"<|vision_start|>{padding}<|vision_end|>" else: From 8f66d323d038dcac93d5f73f47cb44ab1da2ce17 Mon Sep 17 00:00:00 2001 From: Mohit Sharma Date: Wed, 18 Dec 2024 17:14:42 +0530 Subject: [PATCH 15/16] Update vllm kernels for ROCM (#2826) * (vllm) updated vllm rocm kernels * revert silu * update partition size * remove grouped_topk * (nit) remove log * update moe-kernels commit --- Dockerfile_amd | 13 +++++ server/Makefile-vllm | 2 +- .../layers/attention/kv_cache.py | 4 +- .../layers/attention/rocm.py | 57 ++++++++++++------- .../layers/layernorm.py | 37 +++++++----- .../text_generation_server/layers/linear.py | 8 +-- .../layers/moe/__init__.py | 5 +- .../layers/moe/fused_moe_rocm.py | 52 ----------------- .../layers/moe/unquantized.py | 4 +- .../text_generation_server/layers/rotary.py | 2 +- .../custom_modeling/flash_cohere_modeling.py | 2 +- .../custom_modeling/flash_dbrx_modeling.py | 4 +- .../flash_deepseek_v2_modeling.py | 6 +- .../custom_modeling/flash_gptj_modeling.py | 2 +- .../custom_modeling/flash_llama_modeling.py | 6 +- .../custom_modeling/flash_mistral_modeling.py | 6 +- .../custom_modeling/idefics_modeling.py | 2 +- 17 files changed, 95 insertions(+), 117 deletions(-) delete mode 100644 server/text_generation_server/layers/moe/fused_moe_rocm.py diff --git a/Dockerfile_amd b/Dockerfile_amd index 7638947a..dc748f49 100644 --- a/Dockerfile_amd +++ b/Dockerfile_amd @@ -234,6 +234,7 @@ FROM kernel-builder AS vllm-builder WORKDIR /usr/src COPY server/Makefile-vllm Makefile +RUN pip install setuptools_scm # Build specific version of vllm RUN make build-vllm-rocm @@ -267,6 +268,15 @@ COPY server/exllamav2_kernels/ . RUN python setup.py build +FROM kernel-builder AS moe-kernels +WORKDIR /usr/src +ENV MOE_KERNELS_BRANCH=a67b35841774b2056a73806c36661134b5054edd +ENV VLLM_TARGET_DEVICE=rocm +RUN git clone https://github.com/danieldk/moe-kernels.git && \ + cd moe-kernels && \ + git checkout ${MOE_KERNELS_BRANCH} && \ + python setup.py install + FROM install_deps AS base-copy # Text Generation Inference base env @@ -289,6 +299,9 @@ COPY --from=exllama-kernels-builder /usr/src/build/lib.linux-x86_64-cpython-311 # Copy build artifacts from exllamav2 kernels builder COPY --from=exllamav2-kernels-builder /usr/src/build/lib.linux-x86_64-cpython-311 /opt/conda/lib/python3.11/site-packages +# Copy build artifacts from moe kernels +COPY --from=moe-kernels /usr/src/moe-kernels/build/lib.linux-x86_64-cpython-311 /opt/conda/lib/python3.11/site-packages + # Install server COPY proto proto COPY server server diff --git a/server/Makefile-vllm b/server/Makefile-vllm index 45a7980d..90da96d2 100644 --- a/server/Makefile-vllm +++ b/server/Makefile-vllm @@ -1,4 +1,4 @@ -commit_rocm := 4e0929e6e4fa0a3d09d358715c288020ea9dc247 +commit_rocm := de990cd12537f78f74e40b5c8ee1a62d63d734dd build-vllm-rocm: if [ ! -d 'vllm' ]; then \ diff --git a/server/text_generation_server/layers/attention/kv_cache.py b/server/text_generation_server/layers/attention/kv_cache.py index cad1d98a..93d74732 100644 --- a/server/text_generation_server/layers/attention/kv_cache.py +++ b/server/text_generation_server/layers/attention/kv_cache.py @@ -215,7 +215,9 @@ def paged_reshape_and_cache( raise ImportError( f"Could not import vllm paged attention. Make sure your installation is correct. Complete error: {e}" ) - ops.reshape_and_cache(key, value, key_cache, value_cache, slots, "auto", 1.0) + ops.reshape_and_cache( + key, value, key_cache, value_cache, slots, "auto", 1.0, 1.0 + ) elif SYSTEM == "ipex": import intel_extension_for_pytorch as ipex diff --git a/server/text_generation_server/layers/attention/rocm.py b/server/text_generation_server/layers/attention/rocm.py index ea11c2c2..0cfac25b 100644 --- a/server/text_generation_server/layers/attention/rocm.py +++ b/server/text_generation_server/layers/attention/rocm.py @@ -6,26 +6,42 @@ from text_generation_server.utils.import_utils import SYSTEM from text_generation_server.layers.attention import Seqlen from text_generation_server.utils.log import log_master from loguru import logger +import vllm._custom_ops as ops major, minor = torch.cuda.get_device_capability() is_sm75 = major == 7 and minor == 5 -_PARTITION_SIZE_V1V2 = 512 +_PARTITION_SIZE_V1V2 = 1024 _PARTITION_SIZE_CUSTOM = 256 +_GPU_ARCH = torch.cuda.get_device_properties("cuda").gcnArchName +_ON_MI250_MI300 = any( + arch in _GPU_ARCH for arch in ["gfx90a", "gfx940", "gfx941", "gfx942"] +) + use_triton = os.getenv("ROCM_USE_FLASH_ATTN_V2_TRITON", "").lower() in {"true", "1"} ENGINE = "triton" if use_triton else "ck" use_rocm_custom_paged_attn = os.getenv("ROCM_USE_CUSTOM_PAGED_ATTN", "1") != "0" -try: - if use_rocm_custom_paged_attn: - from vllm._custom_C import paged_attention_custom -except ImportError as e: - log_master( - logger.info, - f"Custom Paged Attention not available. Complete error: {e}", + + +def _use_rocm_custom_paged_attention( + qtype: torch.dtype, + head_size: int, + block_size: int, + gqa_ratio: int, + max_seq_len: int, +) -> bool: + # rocm custom page attention not support on navi (gfx1*) + return ( + use_rocm_custom_paged_attn + and _ON_MI250_MI300 + and (qtype == torch.half or qtype == torch.bfloat16) + and (head_size == 64 or head_size == 128) + and (block_size == 16 or block_size == 32) + and (gqa_ratio >= 1 and gqa_ratio <= 16) + and max_seq_len <= 131072 ) - use_rocm_custom_paged_attn = False def paged_attention( @@ -66,13 +82,8 @@ def paged_attention( num_kv_heads = kv_cache.key.shape[1] gqa_ratio = num_heads // num_kv_heads - use_custom = ( - use_rocm_custom_paged_attn - and (query.dtype == torch.half or query.dtype == torch.bfloat16) - and (head_size == 128 or head_size == 64) - and (block_size == 16 or block_size == 32) - and (gqa_ratio >= 1 and gqa_ratio <= 16) - and max_s <= 32768 + use_custom = _use_rocm_custom_paged_attention( + query.dtype, head_size, block_size, gqa_ratio, max_s ) if not use_custom: @@ -90,8 +101,6 @@ def paged_attention( # V1 to avoid the overhead of reduction. Also, if the number of # sequences or heads is large, we use V1 since there is enough work # to parallelize. - import vllm._custom_ops as ops - use_v1 = ( max_s <= 8192 and (max_num_partitions == 1 or num_seqs * num_heads > 512) @@ -103,7 +112,7 @@ def paged_attention( query, kv_cache.key, kv_cache.value, - kv_head_mapping, + num_kv_heads, softmax_scale, block_tables, input_lengths, @@ -112,6 +121,7 @@ def paged_attention( None, "auto", 1.0, + 1.0, ) else: # Run PagedAttention V2. @@ -137,7 +147,7 @@ def paged_attention( query, kv_cache.key, kv_cache.value, - kv_head_mapping, + num_kv_heads, softmax_scale, block_tables, input_lengths, @@ -146,9 +156,10 @@ def paged_attention( None, "auto", 1.0, + 1.0, ) else: - paged_attention_custom( + ops.paged_attention_rocm( out, exp_sums, max_logits, @@ -164,6 +175,10 @@ def paged_attention( max_s, None, "auto", + 1.0, + 1.0, + None, + _PARTITION_SIZE, ) return out diff --git a/server/text_generation_server/layers/layernorm.py b/server/text_generation_server/layers/layernorm.py index ce5289f9..8c7a2eb0 100644 --- a/server/text_generation_server/layers/layernorm.py +++ b/server/text_generation_server/layers/layernorm.py @@ -72,7 +72,7 @@ if SYSTEM == "cuda": return normed_hidden_states, residual elif SYSTEM == "rocm": - from vllm._C import ops + import vllm._custom_ops as ops class FastLayerNorm(nn.LayerNorm): def forward(self, hidden_states, residual=None): @@ -121,6 +121,27 @@ class FastRMSNorm(nn.Module): residual is not None, ) return out, residual if residual is not None else hidden_states + elif SYSTEM == "rocm": + # We use VLLM RMSNorm kernel that can be compiled for RoCm, instead of Flash Attention ones that can not. + if residual is not None: + ops.fused_add_rms_norm( + hidden_states, + residual, + self.weight.data, + self.variance_epsilon, + ) + return hidden_states, residual + + residual = hidden_states + + out = torch.empty_like(hidden_states) + ops.rms_norm( + out, + hidden_states, + self.weight.data, + self.variance_epsilon, + ) + return out, residual elif hidden_states.shape[-1] > 8192: if residual is not None: hidden_states += residual @@ -164,20 +185,6 @@ class FastRMSNorm(nn.Module): res = hidden_states return normed_hidden_states, res - elif SYSTEM == "rocm": - # We use VLLM RMSNorm kernel that can be compiled for RoCm, instead of Flash Attention ones that can not. - if residual is not None: - hidden_states += residual - residual = hidden_states - - out = torch.empty_like(hidden_states) - ops.rms_norm( - out, - hidden_states, - self.weight.data, - self.variance_epsilon, - ) - return out, residual else: raise ValueError( "Your system seem to be not supported. Please check your install or open an issue at https://github.com/huggingface/text-generation-inference/issues with a clear reproduction." diff --git a/server/text_generation_server/layers/linear.py b/server/text_generation_server/layers/linear.py index 08306d57..166c2874 100644 --- a/server/text_generation_server/layers/linear.py +++ b/server/text_generation_server/layers/linear.py @@ -11,10 +11,10 @@ if SYSTEM == "rocm": if ROCM_USE_SKINNY_GEMM: try: - from vllm import _custom_C + import vllm._custom_ops as ops except Exception as e: raise ImportError( - f"Could not load `vllm._custom_C` for ROCm skinny gemm. Full error: {e}" + f"Could not load `vllm._custom_ops` for ROCm skinny gemm. Full error: {e}" ) @@ -95,12 +95,12 @@ class FastLinearROCm(torch.nn.Module): out = torch.empty( inp_shape[0], weight.shape[0], dtype=inp.dtype, device=weight.device ) - _custom_C.wvSpltK(weight, inp, out, n, self.cu_count) + ops.wvSpltK(weight, inp, out, n, self.cu_count) elif m % 4 == 0 and n == 1 and k <= 8192: out = torch.empty( inp_shape[0], weight.shape[0], dtype=inp.dtype, device=weight.device ) - _custom_C.LLMM1(weight, inp, out, 4) + ops.LLMM1(weight, inp, out, 4) else: out = F.linear(inp, weight) diff --git a/server/text_generation_server/layers/moe/__init__.py b/server/text_generation_server/layers/moe/__init__.py index a5ae7ff4..be40d78a 100644 --- a/server/text_generation_server/layers/moe/__init__.py +++ b/server/text_generation_server/layers/moe/__init__.py @@ -24,10 +24,7 @@ from text_generation_server.utils.weights import ( UnquantizedWeight, ) -if SYSTEM == "rocm": - from .fused_moe_rocm import grouped_topk - from vllm.model_executor.layers.fused_moe import fused_topk -elif SYSTEM == "ipex": +if SYSTEM == "ipex": from intel_extension_for_pytorch.llm.modules import GatedMLPMOE else: from moe_kernels.fused_moe import fused_topk, grouped_topk diff --git a/server/text_generation_server/layers/moe/fused_moe_rocm.py b/server/text_generation_server/layers/moe/fused_moe_rocm.py deleted file mode 100644 index 68accb99..00000000 --- a/server/text_generation_server/layers/moe/fused_moe_rocm.py +++ /dev/null @@ -1,52 +0,0 @@ -# coding=utf-8 -# Copyright 2023, 2024 DeepSeek-AI and The HuggingFace Inc. team. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from typing import Tuple - -import torch -import torch.distributed - - -# TODO: Remove the functions once moe_kernel are built for ROCM -def grouped_topk( - hidden_states: torch.Tensor, - gating_output: torch.Tensor, - topk: int, - renormalize: bool, - num_expert_group: int = 0, - topk_group: int = 0, -) -> Tuple[torch.Tensor, torch.Tensor]: - scores = torch.softmax(gating_output, dim=-1) - num_token = scores.shape[0] - group_scores = ( - scores.view(num_token, num_expert_group, -1).max(dim=-1).values - ) # [n, n_group] - group_idx = torch.topk(group_scores, k=topk_group, dim=-1, sorted=False)[ - 1 - ] # [n, top_k_group] - group_mask = torch.zeros_like(group_scores) # [n, n_group] - group_mask.scatter_(1, group_idx, 1) # [n, n_group] - score_mask = ( - group_mask.unsqueeze(-1) - .expand(num_token, num_expert_group, scores.shape[-1] // num_expert_group) - .reshape(num_token, -1) - ) # [n, e] - tmp_scores = scores.masked_fill(~score_mask.bool(), 0.0) # [n, e] - topk_weights, topk_ids = torch.topk(tmp_scores, k=topk, dim=-1, sorted=False) - - if renormalize: - topk_weights = topk_weights / topk_weights.sum(dim=-1, keepdim=True) - - return topk_weights, topk_ids diff --git a/server/text_generation_server/layers/moe/unquantized.py b/server/text_generation_server/layers/moe/unquantized.py index 75af0409..3c9bcaba 100644 --- a/server/text_generation_server/layers/moe/unquantized.py +++ b/server/text_generation_server/layers/moe/unquantized.py @@ -6,9 +6,7 @@ import torch.nn as nn from text_generation_server.utils.import_utils import SYSTEM from text_generation_server.utils.weights import UnquantizedWeight, Weights -if SYSTEM == "rocm": - from vllm.model_executor.layers.fused_moe import fused_moe -elif SYSTEM == "ipex": +if SYSTEM == "ipex": from intel_extension_for_pytorch.llm.modules import GatedMLPMOE else: from moe_kernels.fused_moe import fused_moe diff --git a/server/text_generation_server/layers/rotary.py b/server/text_generation_server/layers/rotary.py index 123bbadb..e346d0f8 100644 --- a/server/text_generation_server/layers/rotary.py +++ b/server/text_generation_server/layers/rotary.py @@ -7,7 +7,7 @@ from text_generation_server.utils.import_utils import SYSTEM if SYSTEM == "cuda": import rotary_emb elif SYSTEM == "rocm": - from vllm._C import ops + import vllm._custom_ops as ops elif SYSTEM == "ipex": import intel_extension_for_pytorch as ipex diff --git a/server/text_generation_server/models/custom_modeling/flash_cohere_modeling.py b/server/text_generation_server/models/custom_modeling/flash_cohere_modeling.py index 68719106..ece15e94 100644 --- a/server/text_generation_server/models/custom_modeling/flash_cohere_modeling.py +++ b/server/text_generation_server/models/custom_modeling/flash_cohere_modeling.py @@ -75,7 +75,7 @@ class CohereRotary(PositionRotaryEmbedding): rotary_emb.apply_rotary(k1, k2, cos, sin, k1, k2, False) elif SYSTEM == "rocm": - from vllm._C import ops + import vllm._custom_ops as ops # NOTE: On RoCm systems, we use a ROPE implementatation adapted from VLLM which launches a single kernel for both query/key, contrary to flash-attn implementation used on NVIDIA systems. # Compiling flash-attn rotary on RoCm, it appears hipcc is unable to unroll loops, resulting in an even slower inference compared to eager: https://github.com/pytorch/pytorch/issues/113773 diff --git a/server/text_generation_server/models/custom_modeling/flash_dbrx_modeling.py b/server/text_generation_server/models/custom_modeling/flash_dbrx_modeling.py index 2d1aa96c..aa032782 100644 --- a/server/text_generation_server/models/custom_modeling/flash_dbrx_modeling.py +++ b/server/text_generation_server/models/custom_modeling/flash_dbrx_modeling.py @@ -23,9 +23,7 @@ from typing import Optional, List, Tuple, Any from text_generation_server.layers.attention.kv_cache import get_kv_scales from text_generation_server.utils.import_utils import SYSTEM -if SYSTEM == "rocm": - from vllm.model_executor.layers.fused_moe import fused_moe -elif SYSTEM == "ipex": +if SYSTEM == "ipex": from intel_extension_for_pytorch.llm.modules import GatedMLPMOE else: from moe_kernels.fused_moe import fused_moe diff --git a/server/text_generation_server/models/custom_modeling/flash_deepseek_v2_modeling.py b/server/text_generation_server/models/custom_modeling/flash_deepseek_v2_modeling.py index 906a83a4..2fb733cd 100644 --- a/server/text_generation_server/models/custom_modeling/flash_deepseek_v2_modeling.py +++ b/server/text_generation_server/models/custom_modeling/flash_deepseek_v2_modeling.py @@ -43,9 +43,9 @@ from text_generation_server.utils.weights import Weights if SYSTEM == "rocm": try: - from vllm import _custom_C + import vllm._custom_ops as ops except Exception as e: - raise ImportError(f"Could not load `vllm._custom_C`. Full error: {e}") + raise ImportError(f"Could not load `vllm._custom_ops`. Full error: {e}") class DeepseekV2Config(PretrainedConfig): @@ -408,7 +408,7 @@ class DeepseekV2MLP(nn.Module): dtype=hidden_states.dtype, device="cuda", ) - _custom_C.LLMM_Silu(self.gate_up_proj.linear.weight, hidden_states, out, 8) + ops.LLMM_Silu(self.gate_up_proj.linear.weight, hidden_states, out, 8) return self.down_proj(out, reduce=reduce) else: gate_up_states = self.gate_up_proj(hidden_states) diff --git a/server/text_generation_server/models/custom_modeling/flash_gptj_modeling.py b/server/text_generation_server/models/custom_modeling/flash_gptj_modeling.py index 692f8ca3..45b90679 100644 --- a/server/text_generation_server/models/custom_modeling/flash_gptj_modeling.py +++ b/server/text_generation_server/models/custom_modeling/flash_gptj_modeling.py @@ -91,7 +91,7 @@ class GPTJRotary(PositionRotaryEmbedding): rotary_emb.apply_rotary(k1, k2, cos, sin, k1, k2, False) elif SYSTEM == "rocm": - from vllm._C import ops + import vllm._custom_ops as ops # NOTE: On RoCm systems, we use a ROPE implementatation adapted from VLLM which launches a single kernel for both query/key, contrary to flash-attn implementation used on NVIDIA systems. # Compiling flash-attn rotary on RoCm, it appears hipcc is unable to unroll loops, resulting in an even slower inference compared to eager: https://github.com/pytorch/pytorch/issues/113773 diff --git a/server/text_generation_server/models/custom_modeling/flash_llama_modeling.py b/server/text_generation_server/models/custom_modeling/flash_llama_modeling.py index 2c007d15..10309006 100644 --- a/server/text_generation_server/models/custom_modeling/flash_llama_modeling.py +++ b/server/text_generation_server/models/custom_modeling/flash_llama_modeling.py @@ -64,9 +64,9 @@ if SYSTEM != "ipex": if SYSTEM == "rocm": try: - from vllm import _custom_C + import vllm._custom_ops as ops except Exception as e: - raise ImportError(f"Could not load `vllm._custom_C`. Full error: {e}") + raise ImportError(f"Could not load `vllm._custom_ops`. Full error: {e}") def load_attention(config, prefix: str, weights, layer_id): @@ -392,7 +392,7 @@ class LlamaMLP(nn.Module): dtype=hidden_states.dtype, device="cuda", ) - _custom_C.LLMM_Silu( + ops.LLMM_Silu( self.gate_up_proj.base_layer.linear.weight, hidden_states, out, 8 ) return self.down_proj(out, adapter_data) diff --git a/server/text_generation_server/models/custom_modeling/flash_mistral_modeling.py b/server/text_generation_server/models/custom_modeling/flash_mistral_modeling.py index c66c732f..0fa172d0 100644 --- a/server/text_generation_server/models/custom_modeling/flash_mistral_modeling.py +++ b/server/text_generation_server/models/custom_modeling/flash_mistral_modeling.py @@ -49,9 +49,9 @@ from text_generation_server.layers.layernorm import ( if SYSTEM == "rocm": try: - from vllm import _custom_C + import vllm._custom_ops as ops except Exception as e: - raise ImportError(f"Could not load `vllm._custom_C`. Full error: {e}") + raise ImportError(f"Could not load `vllm._custom_ops`. Full error: {e}") class MistralConfig(PretrainedConfig): @@ -318,7 +318,7 @@ class MistralMLP(nn.Module): dtype=hidden_states.dtype, device="cuda", ) - _custom_C.LLMM_Silu( + ops.LLMM_Silu( self.gate_up_proj.base_layer.linear.weight, hidden_states, out, 8 ) return self.down_proj(out, adapter_data) diff --git a/server/text_generation_server/models/custom_modeling/idefics_modeling.py b/server/text_generation_server/models/custom_modeling/idefics_modeling.py index fc6becc4..9fc9bca6 100644 --- a/server/text_generation_server/models/custom_modeling/idefics_modeling.py +++ b/server/text_generation_server/models/custom_modeling/idefics_modeling.py @@ -52,7 +52,7 @@ from loguru import logger if SYSTEM == "cuda": import dropout_layer_norm elif SYSTEM == "rocm": - from vllm._C import ops + import vllm._custom_ops as ops else: dropout_layer_norm = None From ab5f61692096523c4766ca5d15a025e142e6b420 Mon Sep 17 00:00:00 2001 From: "Wang, Yi" Date: Thu, 19 Dec 2024 19:18:58 +0800 Subject: [PATCH 16/16] change xpu lib download link (#2852) Signed-off-by: Wang,Yi A --- Dockerfile_intel | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile_intel b/Dockerfile_intel index e024f31a..720d7bee 100644 --- a/Dockerfile_intel +++ b/Dockerfile_intel @@ -97,11 +97,11 @@ ENV HF_HOME=/data \ WORKDIR /usr/src -RUN pip install https://intel-extension-for-pytorch.s3.us-east-1.amazonaws.com/ipex_dev/xpu/torch-2.5.0a0%2Bgite84e33f-cp311-cp311-linux_x86_64.whl --no-cache-dir -RUN pip install https://intel-extension-for-pytorch.s3.us-east-1.amazonaws.com/ipex_dev/xpu/torchaudio-2.5.0a0%2B56bc006-cp311-cp311-linux_x86_64.whl --no-cache-dir -RUN pip install https://intel-extension-for-pytorch.s3.us-east-1.amazonaws.com/ipex_dev/xpu/torchvision-0.20.0a0%2B8e8a208-cp311-cp311-linux_x86_64.whl --no-cache-dir -RUN pip install https://intel-extension-for-pytorch.s3.us-east-1.amazonaws.com/ipex_dev/xpu/intel_extension_for_pytorch-2.5.10%2Bgit9d489a8-cp311-cp311-linux_x86_64.whl --no-cache-dir -RUN pip install https://intel-extension-for-pytorch.s3.us-east-1.amazonaws.com/ipex_dev/xpu/oneccl_bind_pt-2.5.0%2Bxpu-cp311-cp311-linux_x86_64.whl --no-cache-dir +RUN pip install https://intel-optimized-pytorch.s3.cn-north-1.amazonaws.com.cn/ipex_dev/xpu/torch-2.5.0a0%2Bgite84e33f-cp311-cp311-linux_x86_64.whl --no-cache-dir +RUN pip install https://intel-optimized-pytorch.s3.cn-north-1.amazonaws.com.cn/ipex_dev/xpu/torchaudio-2.5.0a0%2B56bc006-cp311-cp311-linux_x86_64.whl --no-cache-dir +RUN pip install https://intel-optimized-pytorch.s3.cn-north-1.amazonaws.com.cn/ipex_dev/xpu/torchvision-0.20.0a0%2B8e8a208-cp311-cp311-linux_x86_64.whl --no-cache-dir +RUN pip install https://intel-optimized-pytorch.s3.cn-north-1.amazonaws.com.cn/ipex_dev/xpu/intel_extension_for_pytorch-2.5.10%2Bgit9d489a8-cp311-cp311-linux_x86_64.whl --no-cache-dir +RUN pip install https://intel-optimized-pytorch.s3.cn-north-1.amazonaws.com.cn/ipex_dev/xpu/oneccl_bind_pt-2.5.0%2Bxpu-cp311-cp311-linux_x86_64.whl --no-cache-dir RUN pip install triton-xpu==3.0.0b2 --no-cache-dir