From 55f5332d80aba3920437d95fa3e20918e2b7ae6a Mon Sep 17 00:00:00 2001 From: rxsalad Date: Fri, 17 Jan 2025 17:01:54 -0800 Subject: [PATCH] long-running tasks - solution overview --- guides/long-running-tasks/images/lrt-so1.png | Bin 0 -> 22069 bytes guides/long-running-tasks/images/lrt-so2.png | Bin 0 -> 31026 bytes guides/long-running-tasks/images/lrt-so3.png | Bin 0 -> 29989 bytes .../long-running-tasks/solution-overview.mdx | 167 ++++++++++++++++++ mint.json | 4 + 5 files changed, 171 insertions(+) create mode 100644 guides/long-running-tasks/images/lrt-so1.png create mode 100644 guides/long-running-tasks/images/lrt-so2.png create mode 100644 guides/long-running-tasks/images/lrt-so3.png create mode 100644 guides/long-running-tasks/solution-overview.mdx diff --git a/guides/long-running-tasks/images/lrt-so1.png b/guides/long-running-tasks/images/lrt-so1.png new file mode 100644 index 0000000000000000000000000000000000000000..5774bd8a013eac1b7ed79f84e1b74326e3047333 GIT binary patch literal 22069 zcmZ_01y~$S*1rt_LIS}xxVr^+65J)&;10oE2N)m_+%33;;O>LFySoNwaJP@_CeQA* z@Bf1yrlzaTsp?bJ(^d7mFM<{2C6EyC5TKx-kfbCFi3W#_!vcp5(_wwN zaej&ubgbK-%Xj}8Gxrdte%(-=$rC2o6L!`D%_GgVlha{;@4>@kWX~xRPOcyfqiKw<<~C@!<8nhb?PerLn6LGg`+Dz&O1DkdHx1?ayWl5f5hv2q(Z-Sd z-%kGe5jAl%axk}ZGPkuM`R&)h(AL>WfQ;;SMgRQ#yPYO(=Krb5#_`W(y<8yk?;Pe2 zOf1a*FEb}|)Bhi{-#Py_``2~-yE^{g&Uh8g-At@BM9r;VqWaP_!4ItL{Qs)v|K$9q zq5rm2bu@7hv9*3NbQ1hexBM~w@67)-{8yEL|5VAt%JJV-{#VX_S^mBRUIhp9m)Z<| z$58MCKlA@N_oqBR^X~xvSHS<>oBuld(w%|`{LKFh4M7Afb^<*psE<%mqMuaUppVkv z-BiSIzO^=HeI+5GYnH@-rdQ>i;CmC4?HA&cPXbtj$3o4OktiUOgg2K~3c*C9od6z- zdEmq}Kl4=0qjn^~R+5sgx)W8p=B-|j5N;3guvyNNWkx~0{omsw)En+sid3N#(C8%p zdx-c*Q}ez0zb0*O6!+fYYGTX2qWJhfM{cZ_53J<>93=X%`A)CjF(Oj^Zw=^~6a9k! z>*Ey#D$6SsUYKtQaIycV!HRpv#Q&$E=x=bL>C&J@2K}V|r)nQq^e!ye$)9qe^l~PA ze{$E5Uop2noDmwl`{T*?<|D}nO_~na>C@NONKq^X9XBW1h8IK%X*_|UiDhJFGhrVz zZ9R*u79lWw2|NNZlu`t%HUd46>x%|NZr62m2a`ceBj?I&Em&k?p@1k<>Pi!j2Q`wi zcfN3l*d(fjD*1|8uY&)?{$mq4s#)B~RDp7iPNR!t0)s{qP|~+$9Vw-5J@8a{yv6JO zqdHdEpzUG-J|4T3&x68t#4N!p_j4`R!=9*UqxnRbxAPM7gU^~@;X)JNKD!8h?jFrY z#9`_h#oy8S6EYvvwRCwGm)tF;wQ z4%xUwQXfloFdSMOpndT*Y3?0J_U@P$Px5B{L5i}U{?-u&W!83j=nDkvfVdI5_6u$6S5f^Lh(RJRqoyY-5G()ZzGyU4ux~c7NIUVsES0D6 zK&^9g3~QP1__#AW_x9<`?C8%xMAdq$xEEHUK=pc23{iWijcTXOk!rJz?MfBq_CC9l z`>*TP->z59h+TH7kpr^c>;_cOI38Q+zdt9*@;SRy=k7%Z`Qs}5ZFubO;M^|RHd@xm z!z#T8hf9&Pj3HpYDXdHE7f7o+58AW+8Tn%Ry=Ua^&)6rK!N{C=e?Y9XhMzz4mZ$~Y zZA1kEGx|ND_Fs)Dxoz2HiTHD)Y%oK&O7Hk}51y>_rr90cfdpwUcb^Hx!&45~!ucF# zS03FCzAD(??0#@X6*?w|u0cK}$!ZgV%2}F3z*HO~C2iOK_?E_CHDEINI0eP%&mbph zK|d*SvRQ6H+{_#47*65xVok0)L1ECV=`q6#=XblIS@|-KJ!v-Dd5ehi_|wd<4P#C8 z!%0}pYfWC5(WHct|5wzqAMTNQ71BH6l3F*~vdC#Ps!{i6@(IL8YpoeH@2J&EbRxO% zr$v6g+w0u85N1pf(=80}ba!0ECR*0JdSXRs%o}Cz=0&IM5P8p*xz=b)db=4Z=BjG& z>nM#42Wa{nB2E6yKVbQ&dmM|t!hI@|Mkt>dnNb7V`j>}gWL@yaNi?U+VWnKH|Aca- zX~l^e2BK7q8$B%~@K^}y9p1j^!8M^n>o`y-+CczQ-E8NC*q}@siJQPqg$Aa`6pQ4S zNO`wN8)Rm7nkEpALIL?89$X%R!)Y*5C*-4=Rs41m3fOKq7wi4a=%Z`wYP?cM9mHqZ zjHOtC!mEWJvc@N9?H-xd{5shMHvByTg_Ng6@*K84CXjh%>uaD7^w+eX{UOX6teK`r zh|K)ddXUexHdUu8Esdj~#A$Jv+T*~*h3*pw-}tQeuMCQcXYb0Nt{_;w<`6@@r_rTB zF?ViyK2W%sCTHhnfZmA*D0wtSymbsBQf5wuU*W!mtIchPN(uG~-eusbyksN%^S#_f z{mPp$ZQUSM&=Fa6pR4`k1IFobtJzqw9MB0eFT~K#jEHUUP^|%|d|>8RuB01D6~MvH z!;uozN@6o-7ks|?y4aC(Ke#8SRc9(CS*LPCFP$98d8@mwg*yTa+S}i_*St?X_Ih_X4=?$QxqD%bubekOcPt#b>RqQ)=8IwZY|mJHW4KORs^v;8Xby697l_B1G%y>T z=LT|mES4eCzipy?5VQ+E_g!%Vr>Dz`H6qD;X@(?fwI$@b%O8TnJQ@P%GrNd&}1#q(3NygmqCgT%F z*$;?)P8WyZ3>ZFTo4A#Dmy{>u$)vo#Q;47V9#v>0K^6@NDkTu|jc&;3(bH+nIomy! zo3=>eueS>h27zxE-Ds4>i}%=|BDY2Z598_euScuwOz-6}k8Wt4u)H@<#@!%~*f(Y; z*KXOGCInALJWMhTa48&OV87er`ZVPOF2h8CmaT3>NE6Zlsh3hBhxDKd{oya8-qSh6 z(X5Y?v(SSvPU>OV1w}XOlmUQH;zTF9Ky2pj0wnz5Yr@z(aydw<+fP+TZgh$_gJse# z5&Np;wvbnt2N&=KUUVh}CX3?tcH91X5CVPJTk#NJE`5HABrGGXUYg60%u z;+7EP(<{eI!(p^)7ryhY_S9H@47b2e2hNy8N4qm7FjSoG=y9eemRqPY8dcmXV0LRb zTE&)u{jr#~q+8uX!vjKnie|0iXl$~aXw`2F3mm%<@KJ=UvJBx!Y>8xw^{~@vzmRJ< zto5PkcTi9l$}9_wR%gwuxUSlhI9n*4h+gYf&rN?@;9$&Yn<_OSb!AeYPyYz4qG_C5 zm^AH7XT^v>gIRNvxC;n!yl|TX75fyg)yKAHVGk@!L%EOo5f3BXC&C%bjFgK;HJP)~AAcOy2PYW2GbGu=1s*Yf}B+-YJ_I}PxpGwya^R?9);?Q9=EJ4j#KDYpJIE1$Jh8KTZ9FGcC3O>79lw&>81dy`7WbhEMphLi^uAVg@z2n zkf#lVkh4|CSMpe6+Rhe+_gw{jfTlMN1I}F)N{BP|4~o0ox-3ovvnL{p5!>q2e&gptXo=n@p)&JGS*mVW)5O{EC$Z#tl%$Y6@Qs|2W|kxpoZkVyUtr z*B0=4ecu&+y|aHQdv^kgc)G=*Y67g#)KJfsaLpFNu3%bQYvv|%gB`F^vwa!e8Yx}m zV}o1zrVuz}=NEdg2>DW29&<`-i-6viEeDq&5jvUH%9PIbDGC)FQ()eb&y2;8ah%yv zy*38(j1>txQABk>L7m=BCGz8SMtItWVG+X0g7ZcU&A@lMSY9dX>4jhpOW*Sy-&KEjPEM^oM!zo%i`F zHWc(@`8k_sq`=Z_{bdN{bV=4i&KrTmI_t@%Qz*3;5}EBq6P&an;YXKvy!NLt)|g@? zzWL7)CWF{;Q^r*B1_AFSPHTSqj-GL&(gV&TtKA2u8yb8aaKpl)M4Vak z^TDi+_1OJF<0$*+Cb6@CD}qlZNn}}SztMqVSp8Q%(GP57UPDUFWPW!}9HrF|zatR| zeQmw&&9kKu&9EUOBe3Mxpg@{yo$G&Wj#M;ICoH5n54^~IRlMj=W*qMFU<%-ZRij}nh2WezJ zrxoC$la5MCS=dIzGDOorYGT>(bZ*;Pw>O*2K$*YU_H&r2C=dHPRf&wR#mYc%S&Pen zu4Cr&M`~TKW%Ii*U6k9AZ%l2nsfYV8VASkqmEb9{n4q&+I(z{SzVYV7@Xks%rJRV# zCUP!{<}0itK0X()gL{$sAd@a{*HnS^j9>{O&B_Xg!qF67Q^07diP2AniTt6cmoTOR zXpe78m)rQx1b4}zikUM-=TRASUR%XoZwa`YQOSbOz2!*Hs97JD&6~Y+=Rjj&dX9K4 z2E~z%dLVcip*=T=GiTO_Q3S4tNJPS31?xHE9u1unzGf5ppM&3lzq+JyL?cF2QSWyi zza4E-8}(9XjJ=6J!q~bO)p&#dH`7Al8_aB znm(Ql$cHF+`J>n;k3FDxxqSYI5LxW#K{lF-d%;jzz-nF;Y=6u~%*c|c)3bc~>q|wi z4ctxeo!9o#*rNcrQn1n6Xjl5aHKmTMfMy(==g>+MrZ81($`Fz)WZRjjbhSt%Np(8N z=OW%0j*mw`bpVedf?hGzbTx}^)J;ICHdEtuM;=&Q&oy7I$&k-yXM8ISFht{KF0JMz z<)xzEpZ3NJr`EIfAyJxpe$UNb+;oD|p8abom9ssr)vE)O?ft|d79lFs=YO z8)G^xE7r1RKVPN5ILTo<_yE$lQ3{l#s-xrWPv`6>O_2C5)iA?l2`*~+{7aa{%0Jw! zTl1p#Grkv)PqD6c#*AFf0`dN;Q?{=avfmb~@QU7KLP!I1Q(>`T|G`W^QHp^}28V}4 z%dm47YdaZRL-NBQt~@A$3~!2e@n+*igh-YGcl}kLs9(0o>cNdBFOx&8xYK=;ltdunyCc%AO#aY;08TRcl zTvs{RfVXy1>c&pgS*vFd-fhf$ENB7{Op|_MObqPWzn0R1AL-xdiQLpatTJ)rP{5(+ z33FOI?e#@aO}%k04d3Y2M#=FOK-6im^Piy~CvU=)81+PoW-?g7AQ(l31+|jC5pDJ99J?S^9EgJ@(fvzEIySiCuAG)zA7tW5N82g%$(fo zMG_5$6wd8);mMb#^9IDtSKv0oUXm9&P|n`53t z%E6MDDGSHj%5dVI`i?0=wRp*8F0LK**{w?Bw@C$|^(inLyKRk>A1QeU&0 zRd--64J9$oOE3&%MY?s zT*{Q$8CCQbGkSZ<23%QQns-x#mF_8D5U^8M!#S1qsVpBpT&6Jb26vcusq@OM2@c5| zD6OjOJ=eG7CloO^eh#kDE6(}a>X=-X zE3MfVJNSzZ0wLd9YR-&~k z?(&8;K`WC{F}O>fZ z5|a{uV6ipt=?Ud~8O+|(*4gji>(OVzz{Jvz31=qu!rGNnIz=6>Fi}M=NU(!+4f3W= zqd)0VQ;f@^dXAIts%AF?rb~b#s?fTNwo&HC3B*0_!^gB8iNbL-S#U|`N&Ti>i}G1GL+K4uqI z7n(RuuY!p&Xrfl9(`g+@hHO5BOcx)p+xT|p%GU@slK_9U>~FBV7W&YU@|c#>ThEXV zDtp6b&abbpSuZt4G40ehFWFcVIPDc#W+du53Ifbq zCzO+F%JT0o^T#X8)UWUk1UE=m8{_)L5dDU9H%Z2C0pksc{-7z&%k z2_=YO9s`hCdklNg9%qEV3$Kq`Z`@RPmoFz}; zek$KcA&;A}*zkRkYYMqCO?aNIwJe-QC*g$3+#z4#*g>`SvhY<_c<2K9vgGrDs{?b) zY5UREpecusiYlTg=!M)?QA&WsYHM5Mm9YmrqW2#XMkE2$p7ED17y|kd$h_`KOJ&_P zYFM(i(?VDI0sA%G4iswr%zQjuuiVV~iEACccdBa+5LI%mIN%McEJkWC*I1eb+FN=S zgw(@@W*z6uFeNUH3cBdGkx-{Iqi1WOo;E#TetSv{z?*dv(vC(a?PFd|X@dA@<~T9$ zpNokMJ=Lh=0k)&E__Q{7wm?UWUMOSsXRew_ z?hG>AQwT{&{z}Zs>*WQ5pd~i%)|EY)T!I`-`ziRgF0tPfjQ0WB33Fb1$l_0bEc)#3 z_$CTc^3J`0lcB;&lc#c7N!EBWV08DUxF)rp{K&hd_(rVk+vcK8o6+9d&9)}kzqCK`hXhVgsz6-U<8H4K^1PXOj-hIv#uhFE)2sz8vzF#kW#ZsmltR29 z_0x3{46U(k6_HA={Ohu2Qq3fIrCe1Mw278dct8Q4o9L-(nFsn89ifQW=FxENV;^un z5IEaZGpXg)RqJ+FdR#%&^dpoXoLDt>zOrgLOsw%VT4Q6+ z5ONuAb#!Ij>vslP zYU)VM3ZyAT>+_5oi{+JOQzWv7T!xG`8tOcge(~Bf{t=?&y4U1jVeYKN08wQM>HPuj z|Hd{HfK>pg=`TH7k_aS-g@QEhL>BsznqmIPhs-Z@gPYeG9l2tXgAk*Dz3?LzXJ*3 zX>_ye<$2_uxsBkWaPihc>O4R*w4B7bXDjP!wkL_x&7R& zv@p7&<*G|~UOH&5*FW`(1GAnk#N%cZA78DXGw4uqYiAya-^;Po4A-HP;a$j@q6qI7 zgu?AfhBBLHlF>@U9apCWlP~7tkTme~f!Fb;yQG(yVjwc1VyQOIi=MYWBKhr)pw|W? zPvY>i93Imz@2!;6N+DfjI;NxoLf(ueL+n#E3kuSdm*R7On6vosooQ=cy1rKS!4A=9 z59E+Ane3fZ*KgqKjOF)^z@WwEldCblR&!okb8@=WWUY7!1q@H5$b35s4+R4}h{8pp zpy1w`=;~9cSGosDxTb1za0QiwSk-huRHM#2C55ja-SI{3_AXso(R4t~KM{%1l-8%X zO|~WW-sp)s0gjgMLpl?SX3?g5QI

E@+1&(mfJQv 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 SI`|`vP*r73r9wrs!2ba5C+;l( literal 0 HcmV?d00001 diff --git a/guides/long-running-tasks/images/lrt-so2.png b/guides/long-running-tasks/images/lrt-so2.png new file mode 100644 index 0000000000000000000000000000000000000000..32791050948f83d45236d8a6eaae5534fb3e11b7 GIT binary patch literal 31026 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 OzLS+ylBg0h3jTk1QH9L_ literal 0 HcmV?d00001 diff --git a/guides/long-running-tasks/images/lrt-so3.png b/guides/long-running-tasks/images/lrt-so3.png new file mode 100644 index 0000000000000000000000000000000000000000..9359e512273c23c3599dcece9573488ec61f0764 GIT binary patch literal 29989 zcmce;1C(UT7WY}UZFbqV-Ni0v*|u$T*=Co!Y};m+)n(hB>U-b2@6CMQ%$jcvDp%!+ zj2(MNoH&`0XT|ToGfY8F0v-kj1_%fUUP@9_5eNwQ@F{ z6)$V@oQHX!m~ZLXYCUGGB*>kfjw++^$*s6`uI{5`6W$F>-iH=6I_(HAANv`ld~xF^ zvzuZft;{lZa4-@Nvc`4aZA79`_-naTc9b%9*gDHik`0NsG`HmVD#(H^f+cp~eMQW}MvOv_IWhfvJU=$$G&l2$G z11QuS2<)#i5D@w25eNu0J_HEz^N8~KuaFD!Z!7RgF6h6@K;?fL3Mq+5Nqrub3>}P( zZ5+*Po!YG5%z%JE_{^2noz!JzxD9Qs>Gh3l4UFmCtnL1|0P(tUe-^Eco%D&^tgUPu zx!w3k{%XPfS^iVaKtl9a6DLbP5_MSxA`x2$Vb8@odW?*o2b)|P@p|^D~Wnkjs;$mQAW?*Kf`)ony=x*br??z|iNcwk>f5#Cu zb~JP_w{tSLwITWwSKq+a*@=&Yk2v^kn1suhaTGL54pT1}1t&hX0wH zlex+NiQ6B`-)?`M*Wcao{t3pdVD4sY1rRm2{+!j%q46_uF!TP^&HrHe&p`k7RB<$R z5V5uXbadkX&t>_S^M4!vkB)zJss5iXS-F`0yUYKw{FmpSQ{a|&F#qgL|IZxqfBO6n zb^mJ5%kXD{|7*hkzM6m4eqK&~7+!{d-WvQcz+O->KtO^(Qldi2ZosG7kZx!yi$10S zPD!PC^+2nhUinN6{r#nUvw^N`J7mrfKw66_}|NSuqL07VIgLI>iJmz9>D`cDlS2nsM+ z`MmHSD;fw4aIheWgdp^Zs88Up+rM7_(fd5w)e!@g?q_JP(rl$68)7dOTs;e0fTW8s{Knh^c z{|w>NK0|VOxh3LsGz*SSqk8KWEnir@(dNpqKa~@cNTuZA^`kV;6zX)@7b%}yPNZt` zjL$OHVgS~^F{^c_F61s&K)%wgK`m-qoapuP8ypT7!dvSbva7L5-vN}>S}SOT$YQQx zMl%1!i}^*hNGO7iZm$wm`Es6IHgC)8&2zX4XcH9J7pVXvsRSyk^}OAT1gQja70wrk zuPGg1U|;-um&jP56-yw&hyctDgWCT1f=h1FqcNv+22*a{ng#Gz0Ldv%TK=wf$&85u z?@|Oq5xIWV8pYhPkP#WOZBDY`ShBGjW`_=GN<0fnbD z2M?Vjd{y^^U#?ph1du{I`l3(14*?8hxUj;r;XugWN2L#FZj-9-(c`Bi1x9hCQgMIU z-3v^PdT#kfu1Dowx`swS93)oX6V#cu2FoxiFC|$>uLD$3LBIkuXs2TMYfN2u+B2b{E2-p|29@+V(e-hrTCc~Zzep;h zH39*j$F57P*qECBSy6?}$>m5w@l@WoI@MGrS7e*Dc63v3m7Wi%C9Akmz7yZnA6h~0 zkN_&t_o1bAsAF*H^XaSiwJwj!t=9qRRBlgTxlHcBTC#|IoeAn079?RJr#la;l}6N$ zhi~3SK5R<2T<^WfPGK+&aRRpISbLrPoZP<12vezaZSzNW(NkUb)G$7G;EEmBwN;_v z=NE_V!JN#lz|@F@SlSqy45o|L-Pv)5NNZgbaur%Tbv_mQq?_Ek!ng$N!bGpJu@l+( zDhYIDAq+T{x2-Z|+1c;cI~0EJfpGPYs>LUFXLoM9d4}AS(=FX?H+sjKKSM)23fslFlYVlsg&l z@`ixSDt`LB^WJZ(=LFo>%yi^rN^~Cz30@o39Div9akW`WDE8|Fh2t^~iSaebRh5Mw z2=D(8V|%%WZI2UpKg;>zBN76wWAJz^y*ZJCK8rRr&>`3OJ_i}+dXe|*qU$S^&CJB| zr35D0a}kw}ds`|Q?V4P^6z0p7=NNZ(_7aN$t4%g%7;~0yD8tL0lb8IlyD@;r#cl7{ zS=o9Tt500McW+E>rrsF$^~yEpkoqPi$e{O@OTEQ~6eg)6q-?QLB4>x;)#k!ILF95( zesh5G;jSmCx?_pQgZEsw%b&+|(!g`mA8JHXasx{@#`xmm`kZe`z$NePQrBCjn2_}M zlZ4{o*47zM^Ui^tf6_pcM@9EG8Hg+CFsTE|V_T?y(PrxSxvsVziOuU_Tz4>Rx5&e{ z95-!$^vRhlG4bAednK%o7idlgxZFES%WFO>T`x=37ANq*!!V@KXu)Y6)_vNbsQWau zQ{_G^7VH2Y$sRe{#1{U6>Qk}(gBDm5F7H;-d}|6l39S0xt~oG56N}pjJ2YxwMY5Qj zHo_5wV_?U=dU~q}O2p2g!DWtFZ8&D@b{(Ti)N4M zj=LaH6kl}L=UqGRd$8u-u2l}T@%qXlI9H+*gf?By#;s^^E!Qr5mnv7G9wpu8GPZL` z#S%;JN{?po&gSF+9n`@`L&0UCJWvxXtx)>LAQ?{*Z0Jhg)mA57YqY>vysSIrCdg}q8)&AwuP#WL!0h(5e*6xBpp{_NABv=;K@4CL)p|JZo3PkK@ zxd)r91{9)X_hcG{Q5%l(y^DR_dv*uNn23Md1K4Qd!leyYofmjii%phbIx7zKOx42P zM1EXD;SU8N|HPkuET(>83GlyiYfL9G^e%eUbdM!7lEFxiXn)X*bN%{RC^e{C+!(S} zmEqk6!d>}59&zMITr?TN-_CH$V6KgXO^iyUS^;X_Iir1Sg}nF^VVXa}i;AQFm276g z*@+CX3u;sfx$Rz-EhC1ak})i ziL7z_5>*UmoivO*bCC&WMw6Kjw)VRyHX=-P%}cbT5@Io^O+?H}Vi(vXo{J_J7v=SG zL#FuIJ0$CaYm9z&yPzC%IhvKIi1a0u?TQt=OvSa=?11BVCNL1 zKS=y&GRv96>UhDS)R6(L>Uwr&Gf!*7NnyB|#Mism@>ePbr*406lWkkEtlUo{2GvuU zT+EY@&3Ld*#{{m0uXaokbYCG&qE4p(xZ?|qEmM^x3LSO6}15$%`tKsYt3HpQ)vn5~hF2Q@~>CA(lOs{G`HL zFpt?&=1*xDa(m6fXJ5BF5EYwKU3TV&nwtnZQ)GCPYfvDmDnWwAKJ=viJh!TBS9>ALdDVHK$p2*4GkexNhaIb({t2M6jr2CPW7_SRcZMU zO1tBGin4j_%HTe}x!7<5m5mE~fKKN-*hy*WdMefJvi%pJ$?nUR@)XeO?uI6%tp0BjQ z)=ns9@n%s+Y}CZL5)?<*jjptES^iGn5<;a>D#jk;)g>%z)^ixST|#rct?FOV2bZXj zjOL|BdM&^26Qc)OffF~L#`?w$1PbK}2UUh#DM5Y*?vql_X)1?Iue(xXz>4}_gPbZ} zB~<-3Eho2n$c5B+-47>qjlKRHOVM-NzC5ZNe8{6r4cVBhfpo$#+A7A} z*fI2IHY4ERWFO-F)IfnAe!4ivKSqFMH+|~@6cV<2o7+6R1w!3_R{*24T#I{dP!?qU zooTwEt=nAj*TaDCrS@_gBFpy!ajj;` zVB6snaC@&AMZ8o-@T~+XExa5g|k%o8(7kw3we^4Za(XcM%V$t(YfK$8GO1|26?3Mb5umsf#g^f2sXg7ALQMBd>n(Xg8sP6nFF*ph0 z(wH}~v@JbXunW8U?2l;W%i0@th*XkKzf-U5QR=xYRZ=i$o2FJTy}|B|LlT{QtlI?i z@(Iyh3$j2%NVotHIaXR!75i~U^R_25kX({|mUxZ9wD)$IpLg3h09uaWy$RSOJafDG zp-`gDAwnWQv@HBL2rd`wH@^4+k%}W!;}1x3xul5it92lHwmGcM)JJ6BZP11=F-TtP z0xG|QD+E&)`FX^#UUYrTE+Z3#vE8I8IX}H=8t_}CEmRc~&(Ywhr!rma!}~CXQ`MmN zC^yuSzW_w(@2iF@e8N*fP+5wP5}a$Dh|{oRI7~yhbXp#)u(-8y837b!s<5}O5)vKU zyxD@S^*GV^p+-j9+(*MHh)aUw4lq<`0v~44Ert{dX|%!fKe#D_{mV_Rk&x=v#j^dw zdvKl~W(?gy#sP7RHa~vAOgsrT|1`3DBB^~mSy-5^h=`s}0*T5<#adqF^j(qcGc8Q{ zD3`2OD9FJS4d1Q(YLwkX+yKu#D{&hU&45d{BJTQQhW}UBv%pO%o!$cVsnLfGUjZP2 zcFFH3zmN@=D-H{5VDOIqOcwZ6T<1{0mtp5HxAKlqatURwcK$iF{36)IQ{w};>>%Nn zw54`TxgGgijBf6Hg^=nCKNmtu81!7OQglT7pj|xLm-+!AhdbL%aPQv&(;L)4)_WS? zW3Q$+sCr~+M^MMkALL>#&^-bCPYMa)3$=S7+B_$ZiL@4tCS8^zqa{Fly4$=|w(Xd1 zeBcSeV+f3miSltt%dJV#Ck1HH*roqRyf#S z-Z|w@N+A0Bv0tw)d-k1`tE{`j*7?r;hDda_M|Q$qmC`eJ&}8o~5MFk&1b8HUQX{c? z^qDP2A5L+!v$~d^-0mp(`B}qbQjVuFWaaU?8!kmSIgPo&0MHyU_(RsS>8ZX8*=*Q9 z!=Sa+n{;txnYg34B@;+_N~5u(9sAWN;g-4 z0DHSFXjK<#l_&i?bHw$`!)aSe1AB4BKRhp#b|dy=rz&ZA9O$-EB)Y*$7*k0U=9Uli zfFc6_j)}rRVp4kwthXI(B*rVC3YHpgKZ`uTWt+uGwYoZ%P|U%Hr|Qj_(&qWjp+>K_ zRswWX>f`Uk+$NFuGMs*AFKJPwV&ewK=%^wm zFaki^Oh3Oe`GH#y;Q3L2#^OHWH=C>_HOASpe7tHP6Q^jlfotP!#x*j{$(Itcma-xA zQ>koTgqK+JH&}xpjY6VjE!YAvG4X&@Yif`HUax?7)hid|Ba)P)wO2!iZ_Ka*a~qN9 z<-dvGy*^H-waA*-6Zn2II-1n6!;WEWUbV6nC=L=72H0AtGY)Bunb2L+$FcG2RTCqQ zCC$ekII|QO>XN20$EBQRcCeq}YfQXvO6rtE=Sgu=C0Vd{3*G})Qe21JT z3)|s_iAfG((`_(OL;aR+jK$8|ouaMdi=`z(2CokDB)(bBGg%F_r-g|mx>D8m1}w;_ zdcE>rsk>-Tl_=t-eN7U4Zg)3A-LGppG;rE(IVCnW;P;FWauJGgZ-?#_(yJbrf>50; z!Ho|P=ER%4r5MmMrWYSgBE`j!!;hNtPM%P zugDevuNy*4xQnsTr3-HDh`KRF8pyWEUJK;7IdJCRo7+Jh6Sg;+^a}D>{i=~GM%mcS zL8BD5U0^@a{Y1A~06t2;XVtT3?3Dt}K9pXk7#X;OmkEX}7-qjr4K6ViWt+<5Q6XcV zx!JA~?d^5NoT<}+00<1U^Vgy{RsG4?%%D@Hgc?_nbVc$zl@<1wF+BM4No3AM!{x%l zD%!hlySl>Fmus^le-O~<>MRU{5@GrEITK=q#vy@QP3n1VXJa&(sms-@IA2*R0l9Xv zC;d4N6!r?X=COK8%C7ctEZs)ckzSJ;zdjKA@s`L-CofFj}1zum|!NigV zy+w@@r86=E_T969{M>zq6?uq(tYyVL&PFT_bes$M1?IJHf|<0y8o{o{dFk)gN{4h^ zaihe;$H}`ycxMpj22m;a4c6w`a{GxF50&Fv2dPtr$(XU>&+^Zm6PFH>a|N;(OS9H zvgg=k9VTq@WezV|r#X{NA!F`SS9l(GOpJ!fEr@4#+TI=(fa2nY(Msb<(rv9wx^+)! zq13Ahj=VNwpWy|j14JePx$R4=a8kmq-`zuX5Gg5AhP0WM3E-LJY6#0YLO4E?>GK6O zjrkWucDVO88gVrIW8QW8gMgElA=zH+?UVPSW>=G6aM|)_9tm|cQ|Hev*|a&*$a{m1 z{3+8zj+-B%tqlM@2*g7&Ta2k6&p}8>+t~`W?U5hJMMIEF;U)%ZoT#uDw0mPxi>}e7 zNd~lNfSw5fxvygn-$3ogjl~;UhlQZcFPyAm%7ylf@|F{GOVuxrFqwrSwa=~iA@1Ha zVIJ+pHib04;@yOB_LR>~zbj5xSzzMa%%-ANQ3CJdXULEk_E@pK zjxm^*d<&&TuMP0Etx8y>b(z}aSTt6gLOWJ_#y>bOZL3w>2{WTAT+e{s z<{<7XX$727EO3}8R!t}L%AVqGTMtQJ01FTML8@HpD;D$&2+d0Go{Ov3A2_p` z6v){d`G1{<`-z8;I}PP&60lKtIij%*{{&FSdA!5K|4HQErR^G=F1-h}>pFds$A zmBvB8IKnDtLYw`va{x8zPj^O-oi`z zs`S_j=xap18NK^i(WI}Th8 z{*JqVjU=?*5hKx=C1(w*GLG4}>D&xyADNGJl&r5ylKtW0XrjaU>=_fT%7A85f9E$t z(G&-aJy>KzD!Grd~9uasZheY=umW#O8t-bf^ zTAa>4S?BH*F~Mh3#foORdfUvl)v3Y0J96TWgJITa z1^~SWQDLqq(^Yq%r|rN{%NjbL(V+f7ffn0$>NdPawQ}>DjAqeFE*pUsEixhKK^u*J z-uWU~+?r3|lNxM~=Wb%tl5jsY%;h=0teesoX7G9-Gm?jLojF!WW@Q}Bt>(hH&p8Fk zjA}Y>LA0}+iL6sJXN$nL=9`q<0J&2AqBCB1|EQtmd}bpke+-y69vetoN*Yp)VX^1Z zWSZP99dC&)GxXUman=Oodr7sol2dkgaDa1l2d;chi4m^JVdL-5rt@`g%GA0@p1Y~f zHiUeI%VD{SiWrN!m>$H`A@SS@5^1_Fqmjs`I9Z?fa5~S3sTkb5j1Gk4Z2dXERJlJA zRX&=}<8&3AAelnTVdOwD<$u#1@~t)vy~Y?{t$C=1?uOUXYNclFo$n{)!$x?FW|CvH zq8B9{8Ht^`GcMnDM$kQ`;Wx{{{zs=hdt9<|zL4XipX%%5f&+fzd@`@TrdLtH2wl28JfQf)=$%r#Pw1K{b`e_tu|mp?1* zRU%)q_KY}NZYHsR^f7`e8=X612Z zROSf<`N%(U&F0%%f!b*3kxEOZJp$KBl+L<^2OAl`bYc2CQg>!WG0-AxP983w(*0-` zog(-6crX3JAO$u$+tn4{KNE+9Y&f-8?0=iS>WS`g>3>WoRT_y}0Ww zy<9lq6xU)~7n)0-5RWcf-rLq9@aY5N`XU9AGI;nxkY;S<0;vsOaO(ntph})Ui9xKz z)s_a{2jh zR$w;k?f#dSc3RxN?DtYC+pb{e8&Tbz9iB(?w>7?~Jr{u#*TA)=Q_&#cFm7zpQND+L zWf-Nk{~%{H5a@8fZ~z76ng!!Oh}$jZ6Etra7HRwkH47mt^l}SrsRmO04Y>V;yFJ1F za88za;eTQAze1rbK*KcQ$ox~aL7E%X@R0fw<3HeA;nPn}p?O~KpQ=lOPtx5nB-8L8 zejY$_sodFf+U*Yt4HN%g@j69`bUVFtoF6`|TZ?QtTB7Ca5Ddx z>pDLHoa9=sHtOicE1qYx3E&NB?`pdCV&kD;dL z?{6rUMr&^i@}duw7n7{YVJB5RyP?z4ZCvDC@gG5-}(b3jXkK#1h)F1(xBB=s;O` zLBQ(`GIzW@oFQ%Mqtobwv7~D0#@BA~z(+s!36IirHMs9Bq|~ecK3{LUs0`yy0fLf@ zkZ0oTBCRM#=n{c52E60RGkI&p;!Qdqrh0N#Z}(-L##N-h&%Igawx#D~>-8AAW1?`nvFZclli0Xk^}zgR9O z$>uyzQ;o>GwSH!fR=4QOV~qK`L1h`KZ?@LV!F&oupdShebYPnU@-w07UdN@t;JNtc zGAAScNW^TA1cT`HW} z>+vsGamu>A!T01+wtKr@IHp!LB3dw>rW1EiYwUxLNR^C_Y_CROIv%UzQ&h|mMJAsN zcR;TdI~4uF`M#bfE8(?x`*CSmwjW*m>wzN3Z$%Fpw7qxvgOi5gb3Oe>s1Pv+-|4=BIFZfP-B)2^M zCIM;JI*){A5y)r^H9+Lq1NJZ{Q#cEK3t4SfpIcIKPxCTZzw#6CO09l2&7|p&F6MtQ zzRvklcCa%cir;_mc;MJ#y2EZJ%zM4<%bIiDxJ%%0I43*B5OO+!$!gZe6+^tvNkLmm z#AbK98efsY9m1G??3C+-Z~u{R5G^(rONg_ zQ$c$@hAr^eGwy=-cG?ieOKSs43PpTfG|bd)0`?S-7P9-u=4^0?ntEY9d8r5XvDy6 z1iA%5?=WyTYbXU_;6=2*0-Y;;1mrR0L3BAir^3hDjmhB8wWs*#`_gAk4F}RjF z^llryHxZ%U#6*}e1gc+97Vwn`UeS?g+-yV@fADc20M3W>H_(hOM%{CD#meCYzs1)Z zc4zT=WdUulu%J{8LfDr2w{&5Lt6V-E9-G`PY^#jHo5S~>fQ&R77t{K!7?I@Yf#B=g zds(?hgw14#Kx^(ahwRnp>HuwqBTp2$_UX_C-HDrr!PNJeX7}wcqfYPmou`X)SA0J) zO~+R@!s>DxQ*Ibom$f(VnO`V!9LY+~4p6smzAovU;`0$aRBd)=v6$9$TnGm3(tWXw z>>BK9_e8vp$vR9puOj59J|L9(I@P!8YIktTm2+!3A674}W!6`=2t%twV#fi(>Hd!{ zVY0NUxZ`z(6j-jo?eHC6@Tye?;|nmoUG#Y*3Y#?{NAQ)vGjb5=5RgV!Bl%|E{XmmR zlC+v$WHyvgHkFXP36>*9uWDmD)zZ%pCKKlV1^k)y8ioDmTk-ru=BK?i@VZR?^|+a2 zUJIVyT=1?JWhjeI4A+f_|3!5|Ti@o@vm7lTB;ROl>4;!Y@orz(Wk>6TNNU z^RV)4y-%}z>j&_njnF;r*^!iW`d01& zBE{edy-SGE0h}~y(A9f=U49-{@!c_W&Zp}X)pj+xm?WtNnROZ7mK?n9$VASWC! zXoa=M^Q`8?3h7|`dsi9sj)_-Rqtp#$PSnnlb^M0fSmiazwH?@JWYi zC)fKk!z;52CAos5%H3%!-TfmF7Sl^Crm#oapBkSmpVFlNsn}qs-Qngtc3PVnQ~2M4 z137u6L*3a{B4%N7!Ey~qB$m2_Neug}vDOh2s7-)G=&y@ zNluv06al`$!mQaLX@g4WAx8(@|9?$+a3DP?JDyErcU&(R{6J7;{ugXvF#;+debQL! z>+XMHpNJr`rS9pF&gDIe`-(o1P~IM$V>IplsqOcTX%9<9Czie7;cy5>L zuKDfLVMB+P$_ihVMDMS4yPn43;JLq3ocHL~L&-n6S1hcy^|)P##185|Pfe;BOhi9u zy&dBj62n~KdJVElrJcPt^H!(E!o}zC8rwc}z+o-q5)av8u^6keY`4PaRKS~)Y(r0j z8Qk?UxDhoaVE7d@$2I4XTSjd8gaOkB*6NMf`eYul?u0cl*@crXq$c?5*DZJBDIKf# z6GDKg$WT{xrMCoC34rmOfESO7*`#~Fl8>=%L!#Mpk2*T8&D$jExwdnstL}uuV4J5$ z5xcqByZCjo_Xb(2oi1`@w+{P`87O(90i0FYlVUAGRKs?cAJ0^_J?80V{(`0 zh~ax@rMAT7nmT8d*%QmX7~p1(W^pjthR^+;?6#BD+|v zEn2K5Yl=l;XeNx__Lht$#%gC=yB&z?NGzQsoDj6#grergZb0`P;g{)MOA(D@kq}(7 zOJa1CidCY^16>I581!a0%`y7aOr%5nOtDN0C$SD zmpFOuk^@AVLf`3lc6E)e^pHxBew69I{sK1WwnJGspgWmq3)X*~hZQF^umUTZu|)b5 z0VT|_dmsc=@G^i~*PU0%e{wpzQd%a$?AbD~z#&86g zf*q*>Q55`CM(hY2HnJTv^vZL@q0CmoZ3t_ddxz-pJMz!(z~~6gCPV%ShDfk3fiSC- z4+1i&G>|6u0aSZ0k}1f$Z-%pGM+OA(WE`A6J?U#}5IF&CZDXGI#Nd44gG@U+U(6gA zO6lp;ZE~8nUZ9TW;i-;ZS6qC%?=OilCFUl9MdC7P1LfH(6IE{{Ymb}m4g>KDw%8C> zg)uxiC(GA?qG*$Gcdz$@ouXNrk9S03FLn@-1YTB^EWBoHw?@Q&UxFORIGXRy!eT`QMN|Al4eYJZ$@ zh~^<1UL+J2jr_!D-oiio4MYZp911Yjxngajn8W{IGK#n+g`+#tQ$@LVB zI-#(dTN$#DF?L>t0K}lNZJ0%YNnPZF--A}(kBbInkd9UP2Nxj}M-m*pt|*4@`U*~~ z^9*vUVy-AU6niIy z#b?AXR$=DL7Tz)o55jdc|Iq_59ETzPw;sTih+HP{{hRj@)`C$b6SK=B@vS zpl2CSeUc@y@SuoiaS&J0z(+G0iOs!d@z6tf2W^g5iIkY-vV(tRmb2Ga3^vWW%?2Z5 zbZA18%>iyDdAs%@aC-tgaT~z6( zn`h&}a_u*!kRyl*$fTSy;<8WK+WBQSm^_44{3E+NBKePQKM|~FZu^0?U%yItYPTUq$uJTr9oxOn*j65APkgj()K{FUlk%P0PbYZ2+!Wa=4I<$l< zN*<0Hod{3kG1WI)y1|UzxpaT~fWjcx4Pij)gjo#m1?;g!*vbh52wbd{d zBrCPLo4*0is=W2W#_;8>eOoAxX)~nRn#A}2mOsJlqFHyj*ZjL3e7}fRa}Z7S{zy!_ zvRyBHTIr8RHcnVy2LHnXA}{qaTu?XFO((^Z3Q*;q@1wQa5vrh^(iss2F#b9`IQ(bKOl#WpM= z%u$l6TslS#zTOgHhpNGVz}LWB+*xR^?JQ4wC{XWVn3 zx0Ve#pZ)K-K0hp7EC%|3aKDujGSY1)q)<%E_8G~n7(GqP)6my%;RjkY+4m;pdf<@e zzh6v4_o-VN(oUs<(^xVZ0P2m8(Tf$tNzC_@=w3>F0bKhU?3Qt^VdYoAf$;9?mE|G4 zRT;$iFE}HKVeLjm6+|aSg?Hn-Hd?A+>L1(QL(1FMjuo0`Y-R2mNf{md?-$LJEr}_> zT%x;pigRZM+ek>Bo#o$ebk~ACPS5^^`}Qxy1Y#8`L)G{QlaB4)x4YC{vlo=)i?mcjY=^e8vzi^i|8QnAqn&$6}q@SYpv&|;IUz4q8L5x!z8h>9i zcaDK%7)}7F27Bxg4tH%oBd@j*@KL5iSxvCPm<1-|0D8l~(3o_%)%N(IkF2VU7-^IpBeI~18Xr)t zCeO7%Q;g8a`Pqn&$STb=;j33METz1KfWUzt9irnQ8{R+?Lb8G8PdAEhfZ2ajd8!h{ zF}uvj8&{7rTde{WH#PFoqfPeUjceSWcmd@$QnaV}!`6J2J8Bd>npU3fsnWH91)?F{KTTI%@m2W3_D$gM_0g&d1*`Nll{Fs(oYVv zcUk!sg;=m+s&+Rq3A5MUzku)@)4o;EJ17XR@ZhhKS}Jg*nX!|VP-A#K2g@KCrtoCM z2z7iUgZOC8xW*=<47C%>F_y8`ccI1tY(LXF{@ewc7hOT2*}7{>9|my|An>uVxy$>O?WNq7)p85}4~*Kpa|$ zNUk4wTni;MV}7E&m(fajT@fe6F4-#9rSvD8F5fxkKCM{Zj+omf0>-Ph!l3JE1}%E0zA6NuNr^fnS0d)~;LriL8bWsJsOrT*nF zo?M?y>RC?DTXC?Y@KFeEY%tRv0rBnC0QOcV%Rhxh_~V2F%UAJSjC{70UMEB~oVA&g zvePncaV9m6dms*+T7{*+fzwZz^fV3HBc+$ZGK^!_RNwsfqOMax5gLe`o>B1vMU-TE z3lYYBrq-Zk7Ah{6)y^N$(-e9Pn+e{YiRn8OHKpA}>7a{=t{G>tQk%g&_f}F|HptOSe2;-ddwyIg>t{MB;ijZJ?<*G8 z%~d-gM*ISd!Tc$b=H9YHn-O=^Fc$luH;arZkG2S!V^EWEn?@^`O6`BT{B{j@a zXY;OKJ;n_?uqni~|DRL%{har{{xz{NzRHWrZP`}VK0EEeACq`kRN_Hc0Vs=L+BTW} zcjY#1W!J-!#5O}AnR(#CNHR6w#~w4ASlvp9#iN-SoX$K%bkvpzB4CRrtF*g_EqrHx z-RNV{YUEszeD%ass~RXX&x|60Vw7JfDZaylY~L~Py_xuNDk%SR>NgUT;RcC(SzEd5 zTk8p%jH(mu_TBsN!1K|k~=5rIE@{pJXfrfmqR7iPwue!rPHe<7&%wfX*Wn_;U`YWT$9LfGqcI%bzh0-a5 zw2?c*ERHlGZoce@r%a~4+V~XVS2-+X5gvSHjxF^;731FyMiGYa4%`Jzw#zl(jd(Ly zddHleCw_#yRAskTu00rJHw-Oqms+}ldMHkn(reOB_9K8adSr%;Er;8as~Jx^YvJFZ zN>r@k94-$<8an31x1|`m83A|@`uSDgBM|KaG?e2tywcmOcXmCR%1=J^3~|HM6l!@F`6#aKJIO8~K)@@Oo- z3*PMf9a*CAuEptxVwyQXz#U^~p}rWy*`Q0{bj|LemT>6lrMIqUL-HkoDcYMN+z z_^j`5NtF6;7ffD79tybQA5BVsk}FdsF4;}e8S9=eB0o8}VzQS@-zUSyPMi{#_!|58 z!A~7L{DE}?1#=M8vuuIpdSO*(|AprnZa~lmeFjo_)V3hHL{43R z3jZf~9zcA(ABXWVb-0Wtv|XNqE1jPR}zOj`*;~Ry~VC2+{%1b1pG1^wE403+8 z^EA<N2)dqa`NP!YjRm(5-hx(iec!}v^&$^wusVj0 z1m+ADE48tB-56&(e{Xw-e_*4%dj2?I&>ra7F`ce4l=winCA{z+ipIyn!1lj2AJ1Wb zjp>W~o#IQxi|74vTSOR?@0vgz?%&<&d~&(rc`-m4aq{~o+CuoqfV1X~@B4Md%Pp$E z`;{Vu$5ulgC-O9&PbKr@=r?rwnTykKKO;(w`jTQ<<&MuSFuHAInB9>uncFh$a1;Xn zo5k~7g&)1Q+z*c(zC2r|nRcYt8&&Exd1{~*uOfsx4GKyBO40t4?JcPQrab=tFI&$I zat`RNfcQ^d`2*CWmim--J>1*@Z6ZsH&kp%B9CS|&YVof9;qe_7i+Srqoig2LD!adE zVE4e7+HNPm<9U1LT;5(8qy0196CcTTB`>DWqgh^BRr+_~-vGhxgI zdn?Yb8x0(%xUQ4E#`SR$e6Y1CyL^+yF&4nXWt%ZA5HkG}3Vf;7({-xnl+mwT@I3Vriiuk#*;3rRs%D49&03O^QiiLr+D^0p3xD#^Gye!#?q!-3{}G+}$O(dm+Ig z5JCv1kQr(=%(n%-3D#oLaTdIv|U6@LP#Q z-J@6jA`+s5ZsTw)FFLc9w%5RLHd2RkW^9sCX{b2Ebqy| zqmg(~5$Y6b=1JK|Y1Dh-%-Jj*HG*a>=S}q18_#^x znruc|v|LUGUix!vmP_JarF<(ecKL6FL8C*;qe~D;z{pbP!@z87k1$JM+o$uIYL~M+ zNYwt|lM}Z0k9%5EkQVWFJvvlQ*?gYN_(^k3TYL8jaQ3+P-)AJS|6(Lmd+8lq?@75Z;hHK%o}A2$ zWUCbAH6l{kP_h8USjXuMZXEE%C`oM1j0Hmwpy0283DTRIb6+(a;9}MGw@fs~wc3aw zPyN6NLNA-QI+^EGHVZ5&S-4beti#2>VI)d$$2vqnCmNGi^WUo%k&~U34SGIiYpWpy zH2n=&_{a74I*SLfRw2vxd`(HWJtmBo7n_tbCAtV0_h*wb#9SU^t{m0R{0QdXesi{e zg!_A>Q{6?PPscr-UEJgGw~)0a)!!irJH8U*;kev;z0RD05ZNwiGgh!7HNin+CN1rF<+86J7(t&KqH zi^D;WHxoNwR%zrRQhe;N3nhilZYX?uyj}=5@(Q#5WZ+Z;BcJ-0o*+Atr0lyPquo9= zzdPc=r!FpZd?9Z~`-)V;Fq~g+X%=^J(+;WEaEQnzGCCd@`JryNG+(7&z{?HTnfU2xxi`9Zn9_Cd7@N4-sA z!v@Cgit54@4O+I-y|JAlniQcr^Kk+UjehAzpvo)dDyhq`JSc1Ma!$K3#O^y+RWW>D z?R8n9u{(u>pGPZ3%nv1MKyL&RTL7wZe)u%YHt;QYp@p*L6E09Yi*!GfC0_4fkj41_ zy0O3*`RqR>0vs$geCDc2!4_jSo=?s)5DNzu>}@uROdnLE<8#);KbRUYzUbeRUJdO! zJItQzg_M=kZM=Ew6vzjY8-bes2F#!^8DEGWf;3h@w8CmQ;#s5kcV6Khyhi#0F3qyAXTq#KW zlf$3|u1a38P>E4>d#ZBviq{i}oIjF*6qM?NA}Aeqa95tbQ>=h9h|3~ca@R>N9flpX z`sd{gL^vF$(HrBpm%il8#%7O+VCzu$EsOp_QBr^3#_#2kYla4Ccf!DLSm^_Y>BK~H zEbM-c^r7VV8mvFiQoU6-rlxo^4~;wjBa+!J!}~_h14X-kNfo@~bNgq7fs6R&2@aKo5X>mB$bA$x?ip^CA(?>)?$5nnmE^{vB z+;z6$G$~3;8Sxx{D0-#$W}tUiv_!?CM&s$sU28#A9W$aJO8oq~z)H4#`JyBm0-uZ} zLWfS9yHmu2X59sf!ttOKej@&$xPNId2>rb%Z5H1A-Ff2*N1`Kv$nZ7p$MKTx;Iy1* zv{{(W&m0^^7AhB=qA& z1!*Hd2+G`10W2Xh)^(oihS&9oAPt z@0QG77wO+U7}UN_o|YBJH#ODx;JTN+`zzJ96@&!LMLwJcdN&4wYSb>5%@`b3JGCE} zt8Yi@E7XKXE2rf(mp1G12XGnagZ2{zf7U!!`50%Qki7M@+>sPyn|3$?25bzV=o7HFF>oW( z57ElnTl>}d9t(fT9-a@bp9w+cnb;6#pwes--5Bpgjv!^UyZl(~+$ypP3p-Z<*K^Q# z>1t~8O}0dk5tS)j3v8u7gI||^96?M?#|7)f9wXEpX>&NAYa& zn&EeouYQ7v^pgqr@F;m_1K5rd-a2=I- zgF81&Z~Z3Dp$$au5tk3BCa5L}r!AGm-Z75uTs6k?I>SzV7W9bIxM3BOHYBO|?9tMD zut4J9+%kEkhHq3P5~IROjZ{UE8lsF`ixap|EB^W!7Y)`AQS@Av&HLybyFM?%@paOz zh$GfE&J%Y-#wBND!_^H8X`mS}0G8?25{hcEsAGRP2U?ArV?jo;mb3 z?G#B4h$r7KGZ`Rd`l*Av0R1E+W;!K;v6^*hGO_`(!R zUz{(mMw=tR0#54{s)cf!`0Z`h=wuAZovxtLuNyZZPuy#BM-t<00g1k(|gIZ0+jxNo~WCUXcpqYZ{k8 zZy(%cdw7`R!Fclj5Z8pq5BVw1$L7wCKyPu#$1JrhVPYg z!sxSgsm7kqJ8uri^7O|%_mp)2&q*n0T7|dA=0i7Ou(+n9t?mJ25r$u_KC`J*ln;C3 z#)g9#9m=vk7IyWGnm-w5FzI{|9oioIZ4jk)CP);FibwZtZn$(7O7Lw`p$avcHio4l z*l3V~KqL7(|J5!u0KG0<46%P)IMwKE0YRBY#=yB4^{WAS*>3@uJ}cK)vuwla;8(93 z^~`sUs#FnLKZ?a1h0tvn2(&vwnO<8OxSfu3DV+*LwrOZ2?*O1ISaXIKx4g3*KKpW7 zbvniGaJhH##-vvR)s3S0(Fb@WdH~J(NSi_xZ?q@1H#5?@58sR=;=!#5qE7bZtj682 z-^iFN7KeWIbr3Bz_Zpls1q5JuGB?+6x>Z{nHY#0i9wy zr~P`tZKDyi^ULJ^KVua5>i4DHx7)jp=^q5A<9m~?=xaH&nx^bCY^GD}Y3>&5(&`L9 z+uXpDRJB1Vms{v}i}_6zjHXRycLYa~+!WhO7q{Zy<7%9)oX36OKc&xpU*Wu_B`!Ve z{I|%OnW2ge=<4#VT!Z`OEN7%zWc7YHRhSwb7q$c&jm%0{>UIfsmrKxQ`(+I4sHo#nVRM>JnHDaa@ zrt)l=HL?&tLy{zaIF>|Z5P6Vqt1N!#qQ(6LhQ(&tpfQV2x{*w;jmgT2{UKHWbIzOi z?U$3+U+RG&Ed3aX4fVTlC(abbIM#bUAlGJ!^c@ffT_kDj|4cogM$Ss5D=})k2;J3( zG#uvUT@KGiy`4`P=D5ahuh`g>Oe>eQR{CeeVJ=vyfJ*Y*-(eSOAQCaA@(54Y?F3`D zRHIJFrc1Ra;}cY#WSYrIqv_^|eYZQ(sH{d~1pUJ4ba;!ldACE^KEik0nQv-UzE{-s zKl;gKa8Z(3<6{IF=~(FhyO4roq^P9BJ*S}D)A8x@$r0zjU=;K;XHT|W#WjB!PN9Hs z8}D@aV9L{xi1`t<0tVPM55<3qL*|KmZ1g#k2~k~?mOQBoA;2BtXf_$Lw<2yFFO0Ur zyvz$XZNCnMOvLAJk=+!vDXWW9wm_-$CPSZZ(>j8cmU34+_6s4SUy<3xDiqPPf^fft zhuLA)$$l1LB3Gl?1#SE@q@bI-zt#2o-*FE(qT?npcWgUbekq6${Q6;irdmJhPtus? zj?PC*&n|s&(j>+*it%I9FM}PD93~%Gf15K7@oSh1a{eJo#(6*2>9)?E=(enV{Es-S zX;t*wr%FebT@w*h48D*Vr`8l+n7&L_Mviu;vw6NI*-RD^0>Z((R(I?MRgzwp(X`*Z z67I=jj7&dHjr#}Bv7$}pZzC8QVoQ_}^2gJp00t1{0E;AT<_M`G4a7u%Z;S^Cyryjs z!N6+0Sm{$owouU11@>-!^HCgC*&C0|v|Fc53fdYOY8>681d~nF9)+*TA=x}TQE-MkIIuPz_G{schONZODk0zUDzSv$?!*@3p*4wxS z-u1kXA~aiEn?<1i!c<9r=t%gZYDo47;-NaMvm&V5M?G~)U@+$po8wbg5_TXLd1a3` zGAv8bIaVq}7-kEX>Q5qhX4GAY2&t*KM>m+wV~v3?tT~u~&=P?{DrCW7b^Vp} z&9%cuh($UgJ`uff;0eWU^~@g4bW2H_RU)=V(*xM^(2_`xJ+2qXPHn-=t4_Qm(`Q9@ zi52Ca3OjwZU+`3yUjVeXVz*)7Qj{-9+Ti z(17f-&9Oa+8QWo@c>}$4lx{7R%X!dg8JRw1w7+U06+N6&6w{&a`_)}H%^aT7UUlyl zh&({@{|k9QVW(M)2zcD<4eM~u)Q>>MEN9MaDAXASf6F}yU)QCSUsmy zR#Q^Ao=s=J^Cdse)(85t%mQy;SnkaiRAJTL0ph{uuL(6d??`xFzrkq<6I-%sPSI>T zl6hwj@6;`D+Us0d5=9zk2WNTbz$A&(MU@>_H{D5uR=-142ZZD5;f6uK!D=PmcP}n@ z%%e^STkD?#uaszW3NajOz2=Y`Q^};O!i8$HOuTHr|40llaljvpvc@?Qp_I`ai4|1E z%batxDt?>t=cxIy_BnvgyXJ#O6)4+`KWCaUb090>XY8-~%JAfz#E&Q}sD`W zGUG?wDjW?dL#)$>SDR1%Y}E`zQ2oPJvHz!;f6r?a!M&W=vAo4i;n-{J zw7}%_{eK5gNJx72t*_ebo02!rX3vsM=HdDJ0$GcEJz?0Ms7j>YT`5>L0+fa|+5Ga# z8vs%@sIAi>c7Y* ztWQiDE~N)$s=8{NKRM4^rj#G3_Z@>{!*8c6T4i^9Mg%r31P6{n5z7Y}76Y55nr41O zn4~gy2dy%PeQ%OzdO2|?@G{LE8QV@r<@y8-Ax{p1#st~wQ|JUY5ff;D#WWL7l)xkE z+xA1;ZZ4c6;#X`eG=aaC-qS~PCdEyORlfmM0*Y%#41V^f0y=-m?4)krK{QI33Hm36 zpGTFfm+CQOl062^1UZ{lq@T@p(gpWUszx>?*k2tBjTOcVKPAh^EC7j}D^Ki3?K9zw zX+Wj3A_H}Nlx^RN)`=~e-x!!J(drHE+f&R=FB_VVmR5Z;XX;8vlEOJ_7^5pl&9)q* znu@?}WgO3Zu30aA3dfDG9(U~93+cr>XS?`QTaLSC^@M?5ypnM^=N!NG$^1F)IM6!ickiK#C3r2niTt z!r-#hIwPHKY2H8VFrRh;^SUGNtxb8YDDoR7Y>5%@qQAG94R{H)<>=_}{S4+F*_u+0 zI1a6jVpm2e(vNhno8jDa%V)|6X~lrSi^nJ)WHzMyVmMX&nYi*=(UUVM$#1HU-Txh(M2e+1wvF{GR|`7xmxD(01xT{5Q%l7!>gxuofe?Q zZlTC6Ftlo9v~ZT_Su%KwBuSnUxrI6+X=fX<4VOShaw+KsTAB(b??}Nk zAkq86ukp!7H1~5m*?|W6E zOKkwNOQJ>9WAd3wAe7;0Rn5q%=eb|6gjIWAJ8mcw_k|n+OJH{bM~mg)Ittw<5JGmH zn0}ewn-)o2MC-kLRv%=|MCjmVCt31A{JdQ!Ja8Zi$c*Y+@nRkN=nrQx=+)jpB zv_1THDbz=V4t|S19@JfOw47E8$5s&eszatJ1LP}q68**^8IZSRog)utlZg(eqtJ~2P#^b4>YfTn- z`MOn;S})c!R4>;yxEdo>A;v2f>n&a(ao3;fIrCk^wV)LlF`+(|Q+89(`umcT!^1=Q z`(9I!zc&T((Duasqk$Y9;XTG&>_!Zhs0cbb49t7cu19oqgHun(kHiR&6aIEsETn}5 z0hJHquh0KFEFBGU(tqPJF>22e{@bSl?zcxcL774_CF|}XZC7q>&g24KgrWvKHU!(> zGglHhOzrZxN|cDqL2eiRdaXZiHSyc`e=p~p2qODPM3V~V5HIF-&g@>zuG4GHF(q(( zMl2IB7}II<9HWb8FhK;y3Nlhl$Mt;)j}AzCF+{zHTVr0e(PfK>e)_gNJRTE@n3pB?t*1HBE!prs;m zB&}PgN8Q7X6t#iyP_U32k3zTB5iqRhCGLn5WyZ0~&c87x zXR4$* z2SSRytv4;g|BxK3(T$#`3x6Y01*t(j9Q;yhES+pz?VK9s+_y?{Y=m0&c~miIGQOiS zGm?FdXTajCPs!EC1h)BRL8IN^dgRu2SH8nL0 zxm8CUf~QP!f1Padpw-Y4Y;6%K5z1^tjeKMOk_rybj2 zeJ8jXIV8pPc#VWmz>F2r*d

j99M}UY6Tuw%Yx6;M8kxbS-imO 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�u8$O}e3mNKIGUL>&Ap$y2*naVdv4df&2MB>vV_Rr0h<2Ll6c~oPP^J;Of z=1Ynde=6np-~|=xRpJQ=nV6y+7l$6b5Ieet01u+}Fe+E1B@ zKsr~I%yI91yNh2y0Qn8#g7a%x&|~^uzUCeezT^e6$)$>NAJSwu$FKu8A7Tu+obR9* zbW2cc#^VX+%Z5e0*m*_@zb3}vj;3UDDcuDy7$Eya(|I`tX7j^rcl-M%Cnhjy26C@_ z4F1qn4?5mDTF=ID$Eo`AIPy^D%K|Sg;cCRm=c!-K@wWZAw>0*t^x*dTB-M{RWbt_- z7Ax>lgnTTWS92Dw(k_1E5DKPCgVNFxVXkn%nZQidLX5-eqn&e~B^ z?~*`v1j!~K!ERi-9ShE zWwcmr!a}e9JKhfa+2@ek50&^E7>P0WCyS0frZ9ny5=+~YwF@x~4KP?7q!=?gI5p-x zg(elZWDO`8W=>MprW-5Ld33b{Q`o#DDs9I0~{%U9> jNWA>3?(z2{UeU0g5!f*ufq(7C`A+)tcZo_degFRfPIrRl literal 0 HcmV?d00001 diff --git a/guides/long-running-tasks/solution-overview.mdx b/guides/long-running-tasks/solution-overview.mdx new file mode 100644 index 0000000..04c922c --- /dev/null +++ b/guides/long-running-tasks/solution-overview.mdx @@ -0,0 +1,167 @@ +--- +title: 'Solution Overview' +description: 'Performing Long-Running Tasks on SaladCloud' +--- + +There are [two primary methods](/products/sce/getting-started/architectural-overview#provide-input-to-applications) to +provide inputs and retrieve results from applications running on SaladCloud: + +- **SaladCloud’s Container Gateway:** The client application sends requests to the gateway, which forwards them to the + container instances, waits for their responses, and then relays the responses back to the client. +- **Job Queue System: Salad Kelpie, Salad Job Queue, AWS SQS, or other queue solutions, such as Redis, RabbitMQ, or + Kafka** can be used to distribute jobs to instances integrated with a job queue client. The results are then delivered + via webhooks or retrieved through job queries. + +The input and output data of a job can be directly embedded in the request/response and job/result. For larger datasets, +it is recommended to exchange data between the instances and cloud storage, while the gateway or job queue only carries +references of the data. + +You can also create a **single-replica container group** for a job and use environment variables to specify the cloud +storage locations for the job's input and output. In this setup, the gateway or job queue is not required. + +**Performing long-running tasks on SaladCloud involves the following key considerations:** + +### Container Gateway or Job Queue + +SaladCloud’s Container Gateway has a maximum +[server response timeout](/products/sce/gateway/load-balancer-options#server-response-timeout) of **100 seconds**. This +timeout specifies the maximum duration the gateway will wait for a response from an instance after forwarding a request. +If no response is received within this timeframe, the gateway returns a timeout error to the client. For jobs that may +run more than 100 seconds, such as video generation and long audio transcription, you will need to either use webhooks +to receive the results asynchronously while still using the gateway, or integrate with a job queue system for better +handling of long-running tasks. + +### Concurrency and Throughput + +The simplest approach while using the gateway or a job queue is to process a job at a time, ensuring that each job is +fully completed before the next one begins. + + + +The lifecycle of job execution may involve multiple stages, including downloading the input, pre-processing (e.g., +format conversion, re-samping and chunking), executing GPU inference, post-processing (e.g., merging and summarizing), +uploading the output. Each stage has different resource demands—some are I/O-bound, others are CPU-intensive, and some +are GPU-intensive. + +If the GPU inference constitutes only a small portion of the process, concurrent processing can significantly enhance +throughput and optimize resource utilization for these types of jobs. + +While leveraging CPU and I/O capacity effectively, multiprocessing or multithreading-based concurrent inference over a +single GPU might limit optimal GPU cache utilization and degrade performance, due to each inference running in isolation +at its own layer or stage. Additionally, the multiprocessing approach can increase VRAM consumption, as each process +requires a separate CUDA context and loads its own model into the GPU VRAM. + +The recommendation is to use a multi-pipeline, staged architecture, where GPU inference remains sequential or batched by +a separated process or thread, while other tasks run in parallel or asynchronously across one or more processes or +threads to maximize efficiency. Typically, a local queue is employed to connect these two parts. + + + +Compared to single inference, batched inference may achieve higher throughput, but usually requires more VRAM. The +decision should be based on your specific use case and resource selection. + + + +[This repository](https://github.com/SaladTechnologies/mds/tree/main/inference-server) provides the reference +implementation of inference servers that support concurrent processing while using the gateway and the job queue - AWS +SQS. + +To handle multiple jobs concurrently while using a job queue, AWS SQS is preferred, as it allows your application to +handle each job independently and flexibly, including pulling the job, extending its leasing, and deleting it once +completed. +[In our YouTube video transcription benchmark test with AWS SQS](https://blog.salad.com/ai-batch-transcription-benchmark/), +which transcribed 1 million hours of video using 100 mid-end GPUs within a week, utilizing three or more threads for +downloading and pre-processing enabled us to achieve nearly 100% GPU utilization. + +### Save Running State + +SaladCloud operates on a foundation of distributed and interruptible nodes, meaning that a node hosting your instance +may go down unexpectedly at any time. However, the majority of nodes are capable of running continuously for over 10 +hours. Please refer to [the benchmark test results](https://github.com/SaladTechnologies/mds/tree/main/demo-app3) +detailing uptime and the number of interruptions for jobs running over a 48-hour period on SaladCloud. + +If an instance fails to complete (or delete) a job due to the node failure, the job will typically become available for +other instances via the job queue system. To avoid restarting an unfinished job from scratch after an +interruption—particularly for jobs expected to run longer than 30 minutes (depending on the use case), such as molecular +dynamics simulations—**consider implementing the following features in your applications:** + +- Start fresh while pulling a new job. +- Regularly save and upload the running state to cloud storage during job execution. +- Download and resume from the previous running state if retrieving an unfinished task. + +Key application settings, such as saving intervals, upload data size, and required upload speed, should be carefully +tested and aligned: + +- Longer saving intervals reduce the required upload speed but may result in greater GPU processing losses if nodes go + down. +- Shorter saving intervals require higher upload speeds, which may lead to upload backlogs. + +The asymmetric bandwidth of SaladCloud is notable, as many nodes are located in residential networks. Your applications +may perform +[initial checks to filter nodes](https://docs.salad.com/tutorials/high-performance-apps#perform-initial-checks-to-filter-nodes) +with specific download and upload speeds. + +Consider using [open-source tools like Rclone](/tutorials/high-performance-storage-solutions) to optimize performance +and throughput. These tools support chunked, parallel uploads and downloads, enabling more efficient utilization of +bandwidth by establishing multiple simultaneous connections. + +Additionally, progressive or incremental uploads can reduce the overall required upload speed with shorter saving +intervals, while also allowing you to tap into a larger pool of available nodes. + +Your applications can implement the above mechanism alongside any job queue system, such as Salad Kelpie, Salad Job +Queue and AWS SQS. Alternatively, you can create a single-replica container group for each job and integrate these +features, eliminating the need for a job queue. + +**Since the release of Salad Kelpie 0.5.0, it supports two use cases:** + +- Use Kelpie as a job queue system along with its built-in data synchronization for easy implementation. +- Use Kelpie solely as a job queue while implementing custom, flexible data management strategies, including selective + downloads and progressive uploads. + +### Super Long Running Jobs + +Certain large molecular dynamics simulations, or model fine-tunning and hyperparameter tuning jobs, can run for several +days or even a week, generating tens to hundreds of gigabytes of data (e.g., trajectory files or checkpoints at various +time points) that must be uploaded to cloud storage. This is fully achievable on SaladCloud, as validated by customer +use cases. However, both AWS SQS and Salad Job Queue are not ideal for this case. + +Due to the 12-hour maximum visibility timeout imposed by AWS SQS (starting from when the job is first received, +extending the timeout doesn't reset this limit), the long-running solution built on it can handle tasks for up to 12 +hours at a time. After this period, the job reappears in the queue and can be picked up by another instance to continue +execution. + +Salad Job Queue can tolerate up to 3 node failures for a job. When more nodes fail during job execution, the job will be +reported as failed. For jobs running longer than a day, the likelihood of failure increases significantly. + +For super long running jobs, we recommend using Salad Kelpie: + +- **Simplified Architecture:** It significantly reduces application complexity by eliminating the need for job and + leasing management. +- **Enhanced Task Duration:** It allows unlimited node reallocations, enabling seamless support for longer running tasks + on SaladCloud. + +If you have a small number of very long-running jobs, you can also create a single-replica container group for each job +and use environment variables to specify the locations of the job's input, state, and output. In this scenario, a job +queue system is unnecessary. **While a job remains unprocessed during node reallocation, our tests show that such +interruptions are minimal, occurring less than 4% of the time over a few-day period.** + +### Summary + +Here is a summary of the recommended solutions for each scenario: + +| Job Duration | Use Case | Solution Description | +| :---------------- | :------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Under 100 seconds | Image generation, LLM streaming, real-time transcription | SaladCloud’s Container Gateway, or any job queue system. | +| Under 30 minutes | Video generation, LLM non-streaming, long audio transcription | Any job queue system. To handle multiple jobs concurrently while using a job queue, AWS SQS is preferred. | +| Under 12 hours | Molecular dynamics simulation, model fine-tuning | Any job queue system. Applications need to regularly save running state to cloud storage during job execution, and resume from the previous running state if retrieving an unfinished task. Use the Kelpie built-in data synchronization for easy implementation. | +| Over 12 hours | Large molecular dynamics simulation, model fine-tuning and hyperparameter tuning | Salad Kelpie is preferred for simplified architecture and enhanced task duration. For a small number of very long-running jobs, use the single-replica container group, eliminating the need for a job queue. | + +Please refer to the example code and applications for further details: + +| No | Description | Repository | +| :-- | :------------------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------ | +| 1 | Reference implementation of inference server using SaladCloud’s Container Gateway, supporting concurrent processing with batched inference. | [link](https://github.com/SaladTechnologies/mds/tree/main/inference-server#use-the-container-gateway-load-balancer) | +| 2 | Reference implementation of inference server integrated with AWS SQS, supporting concurrent processing with single inference. | [link](https://github.com/SaladTechnologies/mds/tree/main/inference-server#use-a-job-queue) | +| 3 | Use Kelpie as the job queue along with its built-in data management. | [link](https://github.com/SaladTechnologies/mds/tree/main/demo-app1) | +| 4 | Use Kelpie solely as the job queue, while implementing flexible data management strategies, including selective downloads and progressive uploads | [link](https://github.com/SaladTechnologies/mds/tree/main/demo-app3) | +| 5 | Use AWS SQS as the job queue, while implementing flexible data management strategies. | [link](https://github.com/SaladTechnologies/mds/tree/main/demo-app2v2) | diff --git a/mint.json b/mint.json index 55d5315..3b19814 100644 --- a/mint.json +++ b/mint.json @@ -454,6 +454,10 @@ { "group": "Text To Speech", "pages": ["guides/text-to-speech/metavoice-tts-api", "guides/text-to-speech/openvoice-api"] + }, + { + "group": "Long-Running Tasks", + "pages": ["guides/long-running-tasks/solution-overview"] } ] }