From eb6d307d79b688f63f9978f78f7ffda3ad5cc0e2 Mon Sep 17 00:00:00 2001 From: Jeremiah Lowin <153965+jlowin@users.noreply.github.com> Date: Sun, 14 Jan 2024 18:26:05 -0500 Subject: [PATCH] Update assistants screenshots --- docs/ai/interactive/assistants.md | 85 ++++++++++-------- docs/assets/images/ai/assistants/advanced.png | Bin 103971 -> 134979 bytes .../images/ai/assistants/code_interpreter.png | Bin 87511 -> 95227 bytes .../images/ai/assistants/custom_tools.png | Bin 84218 -> 64129 bytes .../images/ai/assistants/quickstart.png | Bin 100488 -> 100910 bytes docs/assets/images/ai/assistants/sin_x.png | Bin 88094 -> 109238 bytes src/marvin/beta/applications/state/state.py | 4 +- src/marvin/beta/assistants/assistants.py | 22 ++--- src/marvin/beta/assistants/runs.py | 1 + src/marvin/utilities/tools.py | 2 +- 10 files changed, 62 insertions(+), 52 deletions(-) diff --git a/docs/ai/interactive/assistants.md b/docs/ai/interactive/assistants.md index 50182f1f5..f2b6e5169 100644 --- a/docs/ai/interactive/assistants.md +++ b/docs/ai/interactive/assistants.md @@ -1,6 +1,9 @@ # Working with assistants -Many of Marvin's features are standalone functions, without memory. However, interactive conversation is one of the most powerful ways to work with LLMs, allowing collaboration, context discovery, and feedback. OpenAI's assistants API makes this possible while handling stateful complexities like system messages, history, and separate threads. Marvin's assistants API is a Pythonic way to take advantage of those features/ +Marvin has an extremely intuitive API for working with OpenAI assistants. Assistants are a powerful way to interact with LLMs, allowing you to maintain state, context, and multiple threads of conversation. + +The need to manage all this state makes the assistants API very different from the more familiar "chat" APIs that OpenAI and other providers offer. The benefit of abandoning the more traditional request/response pattern of user messages and AI responses is that assistants can invoke more powerful workflows, including calling custom functions and posting multiple messages related to their progress. Marvin's developer experience is focused on making all that interactive, stateful power as accessible as possible. +
What it does
@@ -17,7 +20,7 @@ Many of Marvin's features are standalone functions, without memory. However, int from marvin.beta.assistants import Assistant, pprint_messages # create an assistant - ai = Assistant(name="Marvin", instructions="You the Paranoid Android.") + ai = Assistant(name="Marvin", instructions="You the Paranoid Android.") # send a message to the assistant and have it respond response = ai.say('Hello, Marvin!') @@ -112,7 +115,7 @@ A major advantage of using Marvin's assistants API is that you can add your own # Integrate custom tools with the assistant ai = Assistant(name="Marvin", tools=[visit_url]) - response = ai.say("Count how many HN front page titles mention LLMs") + response = ai.say("What's the top story on Hacker News?") # pretty-print the response pprint_messages(response) @@ -284,8 +287,39 @@ As part of a run, the assistant may decide to use one or more tools to generate You can use an assistant's `say` method to simulate a simple request/response pattern against the assistant's default thread. However, for more advanced control, in particular for maintaining multiple conversations at once, you'll want to manage threads directly. -To run a thread with an assistant, use its `run` method. This will return a `Run` object that represents the OpenAI run. You can use this object to inspect all actions the assistant took, including tool use, messages posted, and more. +To run a thread with an assistant, use its `run` method: +```python +thread.run(assistant=assistant) +``` + +This will return a `Run` object that represents the OpenAI run. You can use this object to inspect all actions the assistant took, including tool use, messages posted, and more. + +!!! tip "Assistant lifecycle management applies to threads" + When threads are `run` with an assistant, the same lifecycle management rules apply as when you use the assistant's `say` method. In the above example, lazy lifecycle management is used for conveneince. See [lifecycle management](#lifecycle-management) for more information. + +!!! warning "Threads are locked while running" + When an assistant is running a thread, the thread is locked and no other messages can be added to it. This applies to both user and assistant messages. + +### Reading messages + +To read the messages in a thread, use its `get_messages` method: + +```python +messages = thread.get_messages() +``` + +Messages are always returned in ascending order by timestamp, and the last 20 messages are returned by default. + +To control the output, you can provide the following parameters: + - `limit`: the number of messages to return (1-100) + - `before_message`: only return messages chronologically earlier than this message ID + - `after_message`: only return messages chronologically later than this message ID + +#### Printing messages + +Messages are not strings, but structured message objects. Marvin has a few utilities to help you print them in a human-readable way, most notably the `pprint_messages` function used throughout in this doc. +### Full example with threads !!! example "Running a thread" This example creates an assistant with a tool that can roll dice, then instructs the assistant to roll two--no, five--dice: @@ -295,60 +329,35 @@ To run a thread with an assistant, use its `run` method. This will return a `Run from marvin.beta.assistants.formatting import pprint_messages import random - # write a function to be used as a tool + # write a function for the assistant to use def roll_dice(n_dice: int) -> list[int]: return [random.randint(1, 6) for _ in range(n_dice)] ai = Assistant(name="Marvin", tools=[roll_dice]) - # create a new thread to track history + # create a thread - you could pass an ID to resume a conversation thread = Thread() - # add any number of user messages to the thread - thread.add("Hello") + # add a user messages to the thread + thread.add("Hello!") # run the thread with the AI to produce a response thread.run(ai) - # post more messages - thread.add("please roll two dice") - thread.add("actually roll five dice") + # post two more user messages + thread.add("Please roll two dice") + thread.add("Actually--roll five dice") - # run the thread again with the latest messages + # run the thread again to generate a new response thread.run(ai) - # print the messages + # see all the messages pprint_messages(thread.get_messages()) ``` !!! success "Result" ![](/assets/images/ai/assistants/advanced.png) -!!! tip "Assistant lifecycle management applies to threads" - When threads are `run` with an assistant, the same lifecycle management rules apply as when you use the assistant's `say` method. In the above example, lazy lifecycle management is used for conveneince. See [lifecycle management](#lifecycle-management) for more information. - -!!! warning "Threads are locked while running" - When an assistant is running a thread, the thread is locked and no other messages can be added to it. This applies to both user and assistant messages. - -### Reading messages - -To read the messages in a thread, use the `get_messages` method: - -```python -messages = thread.get_messages() -``` - -Messages are always returned in ascending order by timestamp, and the last 20 messages are returned by default. - -To control the output, you can provide the following parameters: - - `limit`: the number of messages to return (1-100) - - `before_message`: only return messages chronologically earlier than this message ID - - `after_message`: only return messages chronologically later than this message ID - -#### Printing messages - -Messages are not strings, but structured message objects. Marvin has a few utilities to help you print them in a human-readable way, most notably the `pprint_messages` function used throughout in this doc. - ### Async support Every `Thread` method has a corresponding async version. To use the async API, append `_async` to the method name. diff --git a/docs/assets/images/ai/assistants/advanced.png b/docs/assets/images/ai/assistants/advanced.png index f483790ca622f1c428106f744e313060ccd33f92..2879c08f3ccd9f3c071768c8175ed68260bbf153 100644 GIT binary patch literal 134979 zcmeFZ2UL^W+AfL}fhDL&QMxn{5K-v_P!vQ2RFoDV6zL`O00AN*qEw|SU8;1cp(T+n zy?03HEkNj@CMT@5_xjf^aQ8p%f5*Aw95Y6eFW)!oGvE2P`M&w^R8{djHV+B?2xJnb_HEC605NgPkSs$@Fuu;oA_S{&u- e%cR|EYI}QEb)eKV%bV4E^QEDCP_^WGI z%Qr1ov%LGO`)O+)!fxzquh*}%uEKM{;J^nVzg5yAVmwegK23fHY&o(n!DmBcn3S1f z7=;KaYx6(M>SuF>o`LjLr#$LBbM{R)awaP `x7DQYK-2;R$rN=@oV)L28EAEbOb*9P=J5V3XNjFA8Bklv z*@X}n-<$q`aN&}lFuZUBm)b@7L-v(vFi{yp)b+lL#q_~W2=G$e(0^XPMABdVO|+Cu zRaD4skgm^>oj!4u> k{ehnt1Z>rO6c%PyPM+v_I(?**$f6B_-0gy0L?aiLIkK*oj9VQ-pMb z!tRl_BN-Vz_u>15(sQmAQu_lIFSMMrRGvs0gKcgaz5*MW+;p|EJ8Xwc+EtQtX=CDK z$nI)mZR;rM3b^)r2}#oR;ccO7?7tUrvI1PwQhCZQ4|XtN7rlAw=B;Zol EA2-%cKA5@-J1j{!&%^AFKZ5 z(LYyx>1g6054It7>Ll}D3--5u|N8K66{Up^=l&Ng{s8*-yCkG#D5Zt|Ts0ZW#pE|* zq=jU*c%b%z^i3kO!`I1&q>t-=d>>xV-fJR!eM?3rN2c`P-V4_gi=&WO(91Yk0>qt$ zPfn8J?Z>wlt|8#>*(XGIa`=~bix+Qv)B4VCAph`URXOEcdE`q?hz+*< erQFV-(?eqr;kd->O%I+7}W@tc1omp||PqMKiI^N(u5FX8*==J=P3U)cN$ zB)^ollfMMa(NysZn_t-clim4?i5^W7zp(j*&7TtWzb^jo)zU|4 iFw*4NqhpFDwvq(lp11z3a<-?Vp~rZ? ~qEn}fcAq9mRYL}h9nV!kUKxWPPf$DIq0?LnwJ zgxE9!L?5;m1PN9s`td~dipJuZd-!)*24yWFeG07$(ORgn=?VK9y5Qr`WY#)SHRrWr zyJ>Kjf`bO&Wf$mHGdBl&Ks3d;POb&zZ+}e{Cc M_k$irJk6x>HlKVl6vb+xH*SF46 gY6L$GRdG^_M_ z;g!{DJ*pUbDc LdAGfp$_13PX zYt+|IK@;PkE+1s%_i8^*o_&~pGcHN@)=)7R|Jh?wqO%Md6^dRSDdE(RF1+Dli@8D` z!lJd0HlL)T Mj8+js;o%|-fwr#p@-0tFFnR|YnXjnOL)S;v zKPvec-CtYklt9HWC@*6?H!T{2fUaG96h0Mr9J)Fy29;er6S8*~tov=eh8M_Q(YHSy zCiqd$im=j1|1(zvw*89gRe!XsN5Po_t5!Cd!IOi E1)QO$b}`)g>8V7XMghTgyl~MVB;3^0DwY4sy^+d2wm7sw^tTV zP)m*eIQ7yh0=0ssY=xxhzO{z+6D03YD8`~cmi|=8RV|14SWJ6>8|sVt^S;^dNc* e>|OIP*8)eWC$)hNKTsFF;?cEavlU^R+fyOP4>OD6sQ)*dZ4gnRT5Q4 zf#IW2&@8!sYj-X{_@IwB+OrS+qR8}?qzuJ7#RQn^U_*a)?uUp%jk<*|Rz}ksbV}Dy zg^SJ%UbAoJx(cn7Mi(TqjMtT&vmRpkC7l*7*Ql}Tz;yO2ET+>+@wE8J@CYgevja;P zX` 3sTA0@t9|kbJ5kEH z!ysN`^j%Q}-r-Z4yH+_nlQM&xRsWX!{@vJ*qgo4KLffchROOF1d-U}!Z0* #3ylWWbdWTy@Ar#$70%Siovg!arewy4T@HBIop`7(1t}MZ?bCRP_~`r zt}9gP$|bouT#Pv?NV;7=$idgCPt$KYE5cr;#)S2zdi|Ae{1Z#*73wI{>}Ncv?-ZWd z%oA{WayxZc2vs=9qB`vJsNy#T=y@#dtR76YGyS{XB0!THSjO|&ZHI;EO=~o_D*sp? zPr# bJF*(wb-eaV{WjA7&B El@TCmYAtUut+zL6Nc>eu8rM(l$ 91&T&Es2-^yxjIua6W(zeRb$xn7WWs4Uuf51VtJ$Yi}nnP5T_!U z2IbWlnR!9>6Sgmv*+BH|#0=Yj;b*ff^qi_p`NJY=9x(Sxac3nRnTe4aqwV<`qbfb2 zT7Qe?Bp0*!$ZEYkmjEi{PWi@e^}W{US9{|jqhXOjI~B=Biy*d$cn0bcn~|&Cw$R&s zExLNo(O(@K7(LcH#Md?zYwvOH*4JQM?`p^v7ffBPGN 7_GZLLyWE{8k1p3wVwVka_6tRZtS%Xo4vdZ66a zYU66p9csW#htcaVqK~K})j$_RVC(rs-_+Z0Ho~8@f3WqeNH^IeXVM?Jz!V7<@bW3b zkLlM5LZn<4v_OK4D%{LRyR*;TrMnO)N;lZNE`36@zxZO9Vtoo+#X7g#dS~%f^Vm*f zUsVt+$fvV@TDzfr-@~+WCH)L{)Ne8-=CQ6jtK24n68T0&+>djQ*1jqwZ-GwS~(Q zX3PzhhiG%fInJuxI4Ci54B^i{?YR#OscRFIQocDjY*4f<*d4Eqv0O>PQ&Gbf?hthO5X-2$5@qq z4hc#+EnZ-eguJ(5DyfT%DtXZAukx(ISTg_@;ql^bIn5j^A{4UFgK%_GC1{rR_eF(4 zb21x$(*zPOXkPj!*7_F&Ulblf*4avH;H%dgdz}4Y`^OSS4_nOCQ5-`|MLDDv?~|gC zH3nX`9#?Qm;|~ {9) zEE;WW%`zB{GX BzdD>p(`voKN>bM zr(93hV6wclZaf5M1uqFZ$R1ny#^s;tx&1eNI;926a_n-=kCP?r@RM#$o2QfihXvbz z5AEJlef#e@73#l_%Qwq_9b0Ey_gCjlu+j7-eV)5*^h)_g8;#8N z(`*n*7y$O@NLIv)<16nZ%df$FF`OY!0z|CzEj^U7m_c4UQWGg*A^gxh8z8(6irHH& za8{uLVr5it!#cC%EInd3OUEi*eeWcRP6SIW`v) kbm<%Jp{e|vcBY$@i&J)MG`m-h^eKyCrL&w|HYBargw|7Iv zxFP66R&IGx%Jw@UPtJI#?LDP0M{DV1-c5g~I66D7Q3!b`m4e@IEX+RSETKrOFl|V% zV> gb5C#SX?Kml62dkEZeXa&9Bw;0 zvB`iC)tB07nd`0Sw*?~{>K3-gL%diWXQkmly|Oo3mjbuuIst@v8*nhK+ULu06;3zZ zdgG)Z^>@_TgV_ixvOwm2N(JR}aYw70TZd}Wee|K>(%VOJ3h>^Wi_k=hDX_>Sl{L^c zTS0p3ab6I!eF7e0s;~LYnx<-wv?C_`@kC{2$+@u>yr I`ipCy)Eh-x MEZ5vDqNNxH#e~`d#t=JUFA;@%qU-&?5~R!u~Ke|JsO{LFK&_| zZ#!-sZlPlPTf0+X?X?qiLXilkl|=c8DfM7AEE11MsO6-QjgL>TpUGIwh3G}cqry*n zh@rRh^4&M1i>#-9j@xhcviawZmeV)K$H3WbOUIckJj;AY;}4M~47d{Mh_T3_iHFLQ zr2Wa=mxs|3zz!BFdd$^CMVzjd-5+nCtm30dw`pRzj8t _tisqg0l1wx z)>FL>_~!~oIsw=}3Vux2ZTIh7%paK@s;` >i%WsH~qJ(A5NT zGO~z&hj~n=VY?LfciQm{LSBTJjmp(~hQ3od@X_$x@XBc^+4mOR@g$bnXb&V$hNIop zuez$nY&ngr#leK!P`hCe22X6*xbO(jxD7|qm^#$ z4N>52(?RUz<7_*gKTvC`FCXk9+3#j%?Exkx8gBGg*&KfU5I3FJ-jE5>3}l6j)Rs=1 zB8K*jx-|fVjb{qy-MW4F!*a}|oO6foZ$+W@JxAOc^i+hD+J_|>Z5G!j*$y PB>9jDe_(EA8}&Ggx6YQlU1L8dLn!!& 4>f z%WJnABs!c1IFpRou7^y1NjHn|?B@)TzLs0IC2uj>DmHql(5zjly_rSVZhUIn54Ig+ z)Vl;L<@Y+kVxlUZTse|~zLxVPt*hom14liZAcKvG0HOC{dJguEAwLCRV+6m623f+x z!v3OkgN=7n6&dXSc;aFO^%Y6+TofU?Xt@G&5aPP=$ztBE%%`5;2DZkA3fx 9pm>u?|$MJ652W-m)+iB)%+|Pkn-ke*xA+PZbdg1&Ndw~ z(3rk+3L%mUKeuap*&ea2HmZ5?MT)KGbZsQjv)-jvfP;rwqd i|EpP>9iD4 zf9n&@wIS8MZ!o>Dx3`by#Bzi2-qw;y-pgZ7UhNDHg+0k1*F9n$MDkr*lGxoB@$HY^ zb?}i=Lv>xpR)(ZBQ^y$~WO+owW$`E40X`3xLJ>A`^?_!lCTO_sG!i}Aoj}kEl=OJ8 z8d>48>`&4)ZuaHsX|BDG2S95{%eFH&lw+0e(VHn^zsV~Da!@G?Tb*pEA5{80lyBVd zd2NhyuP4s||MD2t_w)ukqu}NMw(xL;%K9i3LZobsbXUD$N^FI$on6~#)B%^iZn=OU zKlA1LKdOtvcoXP26@%aN=Wahx^6U=FZM19!!}jXuddk%EEmtQ}SBvw|m$3a{Yj=y8 z9V9w^mA=xKT)^E>$z#b1UjOdAb33jx8R{`7A654`Irvcmku=8}%Luc_?)u9HwT3kl z<=EUC8M|xeF@bLD@j}O*gg-4ibawD7@U!6xAm%v+MRw~nAUC%svEnkGZEY-4lVv+p zMuP 9XmREB2mE$=DsPstLpQd*94>rWpt`tyG 0sYX;(R=z1^_E!r8i3G0zG@(I9HiJ>e6lU&9`T z*xo9GB6$1$*oXwe7#+hBUDQx; rJbdXqkc8;#!dA8@e z656mZFcFKNY~)SIkQLm4E?Dr^aYt1OpZ#r4^SM5(z+^r0vy7*yG+{fe6`f2N+C}*a zT45aKV Iq0jaUVL2#%AClumNdv}uV4 zh#`pw3H9a9SmlLisVjd|#g#KryS+f;z816pP${8vaZZS4sIKLZKihDReDlLiy$T-8 znb8YEh$2yqJRL+sj%gvQRw)>6tJke8%6rdh90uJRj@ok~ZOV5f?OgsW+f^yZvcQ(v zeAjfo&2S0A(<9cap3i>Bf|q_6uscV)Iu`DiTvFnahf6+j47V@&gHQ__o(mpbio{1- z&z)0<@wTwAk0%2T@%A6*7W^jqhf1t5yx7floN-D1h!lIm;S^8CznD4m7vJo^Xmt+! ze+cvu)jP*KGi^v2S#-N>q=<&kuJdmv^#1MzrNn(Z#_%IeFXvFv%G1kbjN4dNvftpI z^q;(q-`Wvg0*1i17|Ym>#fFZO#N@4_s?6gfM>NDW?;hs{{Rlh+=S}B-IF(t7@71}M zN1Gq)a(@`z*^I4Ach@J5193=$g!Wh1|2W#ehWKxZ zfk;z;@=SXwWE)=I^`07 zvG{)xkAIq0|FbN<=tbi2YgXa?mhn#Lqr5p!^SrsCbgRXY5`IgK{@TndSw@4C&Bnvc zKppoAjj~+%s9^g63BQL8wsHRWENyLCepX;#5){vh7Taa(l|37{%s?Kr$WUBiX 7>k&-E2_e+3Nb=g7Nq8R55i zb1%1; 71JHqQY7iI4eV;K>0DkO=`lBurF0@4O$V1xePeVZxuQDqjSJOu;O2Ty zb{4};vA~L?Jr2Y~3V(2j54F^F#AbON*0{-x^%2R`zFb{zj27ikh!suJb Exuqw}6Kc?h!bvg8{CmiIZSa{E9yn5@lzM02N;2g}A_znV| zF>fvx6vpG%{SBSC#+?rG_Ba5O`*}}tWd#X(B33V@9lANWO?< m5o~F#ARwLGCbn&;Y z<|uq7w_#sMen|*l873(sU~(QO`|^3;c8WT_&AzEYRaN5ywYjb?L7ajEr~C#Tq%<%@ zkIE-64gzZEj3I@G)|UHXjfT^fl=MOvUDiI%iDklC z_Ho+zW5KiCR``Z{9Cl25_{oW%RLZAncFh2!NY^jGR@MVG+KKo5toksw#es6pnSI=d zt3}(8(cov4WWg)nnFTY=h8i)MSbbO`^}BdsX$mh;;qWBAY$aFx?()WH6V;g|i%NGI z9PO;vc I%GHlnof#ibt8p`;@>rgCX1~1)yjk1zold&;z^2Vp-~Z{?HcakQA~8P z@P|E4O6FbM-McoZiFvx!DHMQCO4L@ld4YynvH)hSUC3RMJE{xnS%6VhVJL7?H_rxJ zY_K%)sC`*W&B(Xa*ZVn`a)T0Bh}>$PO&dPJP}1x &U5lMB!2KqbKWHPU2*E}I=`82KZRkXn *jf^wF*mRlXeYluTt%hYi*qY3D(6P|c{Ko9C z@LhboV6qFFrb{%)jv+d@BV}pIdHL ~b&aio8sv>(6#fy{$=*O0)5Q_AOt-pKbE8-vPA9=ho0Q4?I z*|}`6py31A-wW2_vv46SF)kp!ayUK*g~U8NWi%2K>@Oql-arb?6$Vh~Vc}16P-*iR zj&zz3S~Tgedlu`bnI=2IGOWC?x!O5EDP* L8oy{7U5*BG_&gKY#~*s@Ts6p{B>&z=x(uD?L8$et!=uJRXw=5XCQLy zz2;4&HyAvT&!x{AHeEU1PGHS@$6LHOS7fE8thq%$)1DCe5 ehWK?(A#v%$C>qx&H@GZ=qt}kLFQn(lNF7&^a~oItc-txnu|-+j z{J2oMXcj3*px$s(UegmM6Xp%(A*r^55$#4#$y80j=<@6F1h0Z?&NQg%%+4hdDWhF{ zD9)OP|Flr~=H~p3D((=0pm{hzdyD!Y45uBx`k}kK{0l0Yg^F-XmUIqzYd^MTLIfu+ zD(Jq@pw=+4w@?C6p=xG+(UtdzUNU~go3`5^&(v8(dZmm!EXOA#M83Y?Mx?@`mlPqK z357t{NEnW?mZraX)jNX)SKN|B6@)^jTVAftwT6V-^pZjp?YGj~pI|95&^Y{Xnf*$> zUwwvVd~Bqw(|V2lP=l&qJj4C2E3zIu?mS<2-9Xa3+FU~%qPYW%0qHk`RvRHoR46?u zmwJ{c%#~s(tAN?11GeNaa7G_$ZxPe>VTUM{H;Qy19Y(wVT=kg@pCWowqOxgLOMowh zj&ueVefaUI5r4IT8)GA|U(# U3K zt(o*MSwkY&x`zGHXTn=~$|#C2#Y2T l`K6T+I?e5y9pcC>97kgZybnv#kY z=7C|GOd1ZQLn(bmnl4AX&b{-ScuOOCy3u#Z*)LxD?mJ#0|9;<1Ehcr^n#z5i%7f41 z`y
Y=^=V uO z0cAcuv3$vm>O3o9H#vWIKEh&nhI*?Ql#02V6QoFR*2#7^a&wYR(TpWVynCHr_A+-5 zS{aQ6J5KwkUAfAu@8zL$Fp$%2RF~Y`wZ7{^m?W>i!ltI-ja<{~h#Q8~Cxl67eK%QO zWfSLk$10oRIv?$(bYVBu&wsMZ%sj#9y6jRP??hl0R)Y+6mzcWUyb1fTZYwS1&N7rW zU|Qu#WjqsN)+3v#M_l@t{X>SB71oW*K*w0GR$5r>jh-weg)RGDM6&PXoh#qU-pf0u z@4lS+IZA*cPibr3b{{*E?6_t)F@@S5C`z_p)n}_v6TNa=VEO-Z7DanjcX|gl2U}7f z9F&6}ZL@BS?A>~T?3dVi=NN-16&*yDe0R2(#N@_ROd!?JY$E)kA~$WfT e400TkKrgVlcOq2gstV}|7y=lpOU;63!oQc~(cO&c?7 z!-3 $s~1S) &A2gqfVuBJ{<9)hmJ{)$2<$!)fcdUqa}>x`BF)RtvQg}Mj4d2k zs>o4 Jn$OZQ_rqLT&7cRta4&F)HyXRar9I6NkoNs*ma~Crp7NUHzo)fD!8N#-$ zZVkSa!uD 4N|gN7`R sl=VV29-YxR;Kcbq(!)za0Yn4Lo zLBHyCW8T8Kfg`G{y+y8h?Z92!j+vJzr+%r`xITs`Cu$C_GCyJXH?;}emn?oEF4Vxu zWd3oNDbro`ahcX1mCsxL2bQPY;zFdLy@6$jo8p>htD{014S)6p&y8VcU`3j5 qb_HDDoAGm7#=9(97|5qc|msAwi2?jSJWz`g=-Xf!@4Tax=e_ z4Sg 2TQuq5_ql|2>#%Fq)R3OiXHV^d1&4;*jUi8f`TkP7CqnV7o-zRdVq4Q# zi#^p@qDTIF(%Gjx7P=ZWma71o`7irX49>(i-~8sk2y_bW_cJo_Q!9+7ql-pBZPPEV zHf`V43YVHtS55sIsOIyqj8o=+^k%k>CnZ34V{F0++wqPSzSL= +0$i}oeP5KAfV|wu-x#+wGPiidFtjF@=#+4v=q6$?EbD+4;4$nN%YMaL* zY+=H}kiT11Pcrr89hihw9x@?Xv_F|#=iGcE z^F@noN|YhG7{0m??-8&?l9o{$$s>&=LBO!ycz&bC9`1aXHf8Rp!19$9@fkr{e-mH2 z3W% 2Xy2IGq1NN6S@d*pTPi6G4d7FVl}Q>f)w`6Ws#M+6w;klxJ@Bd-Q^SvZ z=}2VFQrXokba$-W-d@vMX_!@hv+B=Qo?zRN>(hDAV+Q9wDoZl+>Dcd?ERB{O)p_5q z;g&-%Ou$eZ%jSctV3P`A?P3UMO|b3MCX-9wd+}wxu&xHc{-&bwW;cKLdI5Q(Ms703 z^;O_OjBte@7r!oOt|p1=n-nRX(_+0M_wg<&(*&cc!n8D=IG=vOY~RSV@-Em$Da)4J zIY3>;^|?-o$FBe9y(YL~zbw%~2aT@BcF>+}Xw;1Tj0ACf*B5boIqG&h!KG*MeGV30 zf0(La70vp@UG0)Xyas~ !?qia`_gPmBHg+e`2-GM#|sO5$KRtja$UFe?ZnO zASI&dW*CIFLi|a&pmeJiPmVH7ix|AA2%FBG#Sr)ecF}@v&KJ(be--K^s9#} zZsVu}W&?|Erg^wD#oNOBH)%1>)`8O4?+9B>%oxe+Q9(5hq3g50S34|%f-+#erN8Gt zSBoj&C;DBv*Q&|&-;?y+v|Q(ct`gk0a&Qy<$-ZbhXK&|*Twj|Ap~rA%uifd^>$}%pg-9koJK%Kbt@r2EOv6OBSaugJZ>Ytyo(g7uDu6DqbsX6oA4Q=Ci(2E` zXs(V5we9v?X*5wf8MUud006I6YZ5xUyhQXZhD$w_gQ>Dy!9v!86^P}%FXTp*I&1oy z{jq=KDV2kZ=}WkglWS4|le!>OI?5NEM~`F~=FlDmZUZ*MNQtF@K@Ky_)ZTY9*lx>4 zpE~lcNS}zdcZ`PQH!af1lJHliBOQ}V_r_v{xH0Ehp2NB4{mnG$jX}_&MJtx|whzJ! zi=Qk;IWg`68r+z`k#2BpnO|LgBSZ%4lUKb}jOWdww1V_4XIRL4UW(Rp8umT3$&CgN z-8hq&>uh79cZX`8IkexAg(_??4d%IylM WNhugwq3iGA0*TRA zsBpR+6To5x)K%HVeQ+$>C`~36qb3h#&SPUn@v3He!ynTfOSD=;GH~Jah(J3`_2-?* zE1T(pyHXRCpOk(| j5O6yArD$Tg{1Mw&Kj)+| zM*3#GuG6cbg9-XF*@OsNKlhH$1bfR%@h~@U+B6@gBW2YXdZ#3StisX^4&~E z@z=1;SBXnQ@a35FO%p#>vFrNl!I~Q9czo3kw&%50AJka(F2%spfvtUTi9?rA6UhVJ zcq)M8mtk?PYrN4Z!?|0VG8L1s$^Vdw?l2*Y#$(2t{tRLhkBRc?h1=}HtqLaA-n^PN zIRK-V+UsILGC-Kl8Uz-i*;un>=dh9@A691X;NJT;&r^6jd@9lYXPM#PyHeuN9)4i4 z1>5$d0o=%`Y`kluwwxbCwWTL_s~qQ|b7U~u(xb%h3*a@)wxG5=YjvP&@usp^?M#%Y zV!ys#5@!6M%f^n%xo*h?6>kk6u8y;dIs3kj&a2VCb7lx4TWS^y>z=Ak*4c+HhpbNy zf?8Dba6>{AS5f*5cj-$~M~e!0D1p-?wwIog;Cogi%W6Uh o;>bOvw2o&^LIi(v|bJrBDYjPM~t4;5F)H$;p>lp>4?TaTKSYfEg<{7*| zpf*v$F;7Dy7_~9S=+;K^?q7@K#c;*NSbGBtlXiNO{Nitkt0E_A0Z8RZD%1UIgJ NAk!`R zKtf*yBZ%F9OB2s1AIzj%nc~u)TY69+Me_d7i?(PlQ8@>}xonkw4*uP_29Mi~@H1Lk z6qzsc>0`JMSc1%uI&vLtu6K|eniDR?2 |6Vzc)myt42Q*p^c zkur7D`9ouZCv6#c&-i*J*!Nmk^s?ZH#*5j5@$pjTo}^{M#*}j&$%^_;vPeA$dBs1B zu5njv;A&YM$T05V0=DGB2-E&2YenZZ3ho#8cgS?Ee~j-eQ=FaH0}mGoYUk*LS;tgJ zP_P0^8SG*zJ*e1pR3>|?Z&ob+pgN~OQ(4A)B!Y(|WA~aApFz$zGWq9;)wzA*;wZVt z<%fGeR(Vffx=(@dMF(u~oTE%)@9STK8{mw e-u_yS?BtGsoWb3Msxsz(8Pz|QJNJL& zAopF%b;pgkQx96zlsrB?z?O*KjO7VXMA)z}OsP6-o-F`l&q`E+A@@XU@K$Vj_-U!j zbk~l LjozBeL4YMn%L$dV+3T52d zK1C*w+pqej-VfV)o})*@r(O0=V0WHVDQ*?wCCYK5Us4~(e?#kq|8cAM_9FYOt7q$Q zDJhh_DF-U2sx_o0Cud22h*4*_ZUhkSJDF^ $oDy} z)hQnmO?t?wTEO1*$R2ck*VK`43D3TI=eD(eHgCO-L6Lj9W2$Nt6|?o<8f@^HAUkpT zg4|Ib?+Zu`UO$Chh|zb?3(p!BSd4JV)#JG%>n?fN ~q*VW&Nq_O8Bf6FcTul+w!8EO?e>@ zRii8JAVtL+@i8ft|M90wjn7lGl=v=dKB8tBuoB0q>Tz80qkfms9`BT`@+IR-|Bcue zx{osmPrun24i?(yEMf}uxj09?l5B`tEMB8gISwutk3?IJ%o`SW2)OK8w4P9?4sV=| z-oua!y~O#k&t*9=TTucB)5hz!TC8Hjtp;>5A#;4GnSJNO6225cn$Hf3gOjqah~2n< z1-IEFfrxqm#sKagTmwe6ekubYFAHP7jOPH(w;`To-j!<9HlYsgdTFqpz+mfmnwu(% z%sfIvFI5*Y^ZZ6?@S~CZA1R2(p39M`g(idG1mE)y#IU`JO?|dTaRr{!C$%>w$-Aax z;g1|1+bANSVtHX@AcW=V;vCwZ-~_x$UX c W!-e)iPoVe@-ya@)OGkg{f848){x%21 zyR3!KGWA^3t@VJu>)*PITye=5_!fj{V#bBIE%VSN${0lm>7{=uDqYmaidV$R@3}M= z(Zq)qvBa=E1nM8W56^TFaP{2&;WY>s?Cm69 U~BY&iKtX~o>E8kh5Kf(DX= diPTX) z&9#@ZaIeY<=AYYqK$E@{6)8DjF-)I1uOZgPY^>Zkk~6w=DdTHeM=_Y(#Wo_xQnKF@ zsLqWv54|juaBUh358u8 6v2L>dibpcA+z5#A!rc3s5Lh%`& zD#?R`&k1Vg`5JS5(;nZB!a4V_@!iVI`{K3z@$xfl;5*x4jg}~h1e5{yo*PIbb@87h z*gyUxI(W;SR+yw@_*6UPaESqCt*3f0LdnaM0h@f0XrD0K;A-AZEl~*znRQ>Jd&{IJ zVLJ!7A?NZ`5`)j=d=Iy%dZB%5&3SLW-m6d_pC!VtW|z{wzj$V_%mK-%lJ`lwSP#ON zq#s4t_{yoqw*4{$F;Uw^mr`Tnv#2CN9jK5D=#`4&cP`f*GjC5ykO}R%0+Z^hW(j|k z!OyGP0TgXvH4B&hwkto^H Si)`JSIX`$CRuFOdCJB`0xYf?W`u7F^PrDq| zS*_{KU}`%xx55O@R &?`1nuL<)+Gz=roBy>)OdlS;L{$=%-Yl|jrS)W z{b;EAG) Hl |6=dEqnb+lb;pXLfDKW)A|fb7q+>uuDIy@f zH|e2w2qhva7K(HUO$aq1gx;H?^bR3FC?cHzk&*xjA$Kz~-#PbNGiT bG~u zUwrD^lS;rG1AXFZiF^Cm1?hY5G2w0@{oaGLglu`JbsWFWHBI$3_~Gvr`vpp|ksRYV z1dmrMnnI6~tet__negi3QedXVPMcInx>l5|xZF s^f#b) ou51q80Ve#IF(1!ajR4nAD=Mbb%E&<~eg5Q{m=est$lSZg`R2v8NZm~vd`wbI z#$l&uiN@t(EP+>qHG%}B$pps{MMRmDVMpHCnpZ#Wgl3Q^43&)@ z&{w(Yh4^~Ps-R?%N+hFXa^EHD3d6AFVk8zgB;njvBE(Ek*Vwn)Vg1eA9&kt+51;WI z`Lmb)ub B}HgwFgUGj6}XE4?4cMo}X{OiYsYsNGLxaT*RkR z{7yV;l^7+PGvR$f3gR|v0V_xs*VEf0HWn!)P!X-c&cY%6_GPWAzueAt_RXJyCsIis zWsQ&@y(K?-X+}29#}xU1;D0-!(C~)WwPG{8*u^7o@miC-7u&hX-94K~bAtA=JM`$z z|Dm1y^N~qv(fCsghTJoQj;kptp62*!ZK0!KI<^}!4IVO^hh^e(sJu5@!?%JM`t0Sx zuG4&Tb?o~D^bN3U*UMopS@Z&Ec{HOJ>m(>*zZQIQsPlsRE&AYzp%4%V;xb%#V2`be& zmb@zzpM0u?IYxb(G4{)&SP##HETqN!$Q9q0t0It>Hr|-xE#<+!6M>755~#cKhO+Cq zebzH0Xo#1M*%5dRqdYDa+ho7$lE@w~xU9%A;WdR52}rp;w%Hd#)ymK`&L1d%Cpp&@ zvdcc!%l}kgefE+#uivBp_#Hx^q4#jf#~-iL>qZ!-l0FZX*ilP9)~^B&uV+7YAC}@< z8d4EFFJCg-x@~n)#H9JL4vNpYaEV3eCa%oTyzZK8LhoAxp+dK_{Q1kmy7dil$iXL% zb&<*0E0MbIt%q|%OR{k1_wx8MtPPj^7EY1CHiUU^QQ~SVyMwg!PdLb*A-tk$!;;?= z9s*C2#R|qIae-z|v|(4sP%V5`Df^t>-X^L*kCwz1qN)8t|1WB&9mx|zOOvXIO1#VX zaweC2+)xtSid11GDgqnWKb;RHXCF6Od{g%^zD&H}Af5N{FW|Hu0 t7H@n$ zw+%+DkmO9vGPn80Wj+#XvfU}}!lx!&h0(n3yv>*-wIZiv!w#_*_Obiqosg@y)e_8>?+ba`VQ9cSr_J z+IAH+^O`D!MtoW0l8A9%JtMKhaQ}K?q~>4edChZq!_&9&ajUfOvBW6%7PU;T_PhFQ zn<4!Mbf@{aT#o)2+CJVkITRoHLuF1o3+M!;2S`pvHwP#E#~&ldOOQHRgO!EJq%bE_ zDK*i7CfaEn2|Kg3Gje z{~P@$!sm$%1&V*&qdin $ k*qnu2b zdS!lGp3a2(egbc)^(4*ACu>(X3a;hdx3@u;^#s+D(ViJv3VG?I2$=^FChE-e_I9&% zg;-blwb9vPjk7{{R#Iwc2fl9~q&N_*KxflJcLe3&!It6~s^c)(Zf1hohCI|-2-ns= zg4W-BmaF`&Wwp6*wdO}UVMwQD%3wi}M+AnYlmHd!UsbJVc!6%4(=znvB?!`H8Tozu zThI6LVW87kgQmh|x;I(P-ID2R%Eg%?u)FZdgl^C4mnfuPGT|ROKgUcpd?0EEd&dEF zf>QP}_c--+LVs%pk0rdHlOt};tG8228PyD%keIJdF6ggx329wfK52SHk~O5iZc^XJ znUCwQdflG_XR@j|c@*pARzGawy&4|~iUh!TyhqK=+s97I%M5gd{+@+kVJ-OM%oj`x zUce!p&cC?h-ua6zyuUJRuM9uOg};rLC9(2#Lnab!P(xO`NdZ7Ki(b3ACByHmkw^v! zF{$- $s+zMw-4;VmF}$lnozr8W2WyI%;?@&ZofeYN=fC zu(C?w 28S`nAhQt*HSw7IId?PZHp&tE`1?DHb)}z zz3?qv-1gJKi|IGlPrlWYB}S$(N_hk2BDu45V4lpEWia}ohx^_L>bK_jkcRB9Ha z^P%c(JQ^(?yf_hQH$ch>0YfGcdP&X8{t*G|K6t4Cb+fgbTBcb%e>KkuK5>-4u=S0m ze43veCi-bf!39B6vv+yoDn!;C_w{u!svnez G;rs9K-)7(RgE@K=$P>bMWSTbmd2BF?XG2y`i?RRB z>(1x`k5vz(WeKTm#eCe{VK}q^wo}?g1COka=~oH=&66I!3AnM@ljDk^VzUxO^>MHN z(o{}xf7d)X1t27GN#y>`KmF;-%q_CK-cEP2ZwBQd^H)(0INuQF6Iv!wXW=2MwtxH1 zFAjcizr6BuPS^OszZwt$XLq9D-iIHM@JkF%lJM!jx#9~22hm~w{^2b@WXj*!j>WMT z7qC`e?Ja6AGyKgJf3i4sA{?^Cbna8D@toIx=0&*7cp{QR|o3(|QvVseU#QdL2g=hcA#Om(BCFilS56`~6zr4_s1TqIy zaguT&^cz_lbDb(P*BQdEFOu*Si(il7r~Y@pora(KFUKM!Lyj{nt7HQ@!#Jac!0ZC! z+G)SqM{9pln7;A G zo+X= ^DQ(eLMQ*lBJJF{^EUVdR1B=fFh?U@aHdrwA^bG)RqyLR7G__o z4w5g^4dv(2F2sp#vx<_}r~MV?yG<=PaK6jKC|)XOHTE$CkBYJx_?kcLzNlV6?F;(+ zYC#z*#HaE$M!-ULOD!q2IXeBQqC$EB#l2aPIQN;3;C2B*O3EnlTB27nDr3yVq{A_0 z%MpShj2vSfYLe#hNX2^EK8q+R{baRF*cbJXnK{ZAe|`43#Cv9qQ=7=3dG8mOE@9H& zE||L|=;S@^sf#E=JL;ihuPB&B?X-GZYFs`0#}e(vFaNk$#&f89TELS!H) 9vTm#Z$9H3WzM|X?EpJNIzw*R#)AAtj(Y2Y~*~8 zA-4jCEA6(2*x@tnf2d*30Qz!@Ai3AvhZJjcDNOHzBQFW+|-^yB#SI|IWL3j2#2q$ zxO8ZEv@UXZEOw+f`@jUEJ8?Nx8i)Ov4 zK5Jf?FquZ=g?GZ%m+w-C&KNcX#(Q`DNtb)Z@gO_^QS5Pj>waivIsoN~OZH;M4jwV> zaw#af$-d&@g%cm|O$Bc&*F(x9^zgqdKIfyOTVb?!0knb1LD4w;(@Cz7Pj}JW#}!>0 z=2%taJs$2;rd+?M#|8|KPRwP#? (_i8o%j83${i zE{;X|PI7?7@$rdM^tCPaRT7FuR%L*%X(^# M0@V%G|xOr){F JBB8p zUwFf&Ga))F>l$3%b+SZPBF80xXPIt&rQ++?hgQ_;5*t<3{DJJ*ru`!^HSVQOlVygC z?8=>MURJZwhHWdIHS)vx#<)EFN~>;Id5Jm3_>6JEQN?;0-0IdHv_Wy*`Yt?ucd|af z1_(+q2svTW+Jv3(at)!JGr+vkylsV!RF<-`P!7siZNqOrQXl&mD@r2Ge!ZGI=Sh)H zh^@Hz@G^zEjHeLm_BQxYa&-8ieEzqO-gf}fO+$7|*R3F< Y$4H#?Hcm?oD#i+ zuRg0rssv+nyLUOEfsz!?CE4z7W^duu=ZS9XmNXY6;<3>?U)J?T!?#ZFE~LNR=vOkY zDMV*OS62Mz9XyOGd$j5vy5j>q?FL%}H}>h$I{}@!?yMs8k@V%8{QU6|b-BkIZqN;h z`RbdkLkIHQski151x@)04cqzaGfwt7=Bu~ypvl8 `-o-?cxX!- zTr=c`%T6@q&Q0|xi5B-C@bX_s)%e1^8Fw*aVGh$;cZFK*J)@?78QN!=vxEiJZg=FS z2MhA058Q`|IapXzNjUr6ADd@M&wjL0K&;f({ pQYhmh=9*shPW{|gzDn*OhJZ?WF%;=W&NJc7C5z{~=wTjwwgx`9! zLO_cn?_g1$0Z{5ss;lU;uiJ*pZ*3p^Y8JzCKuGI6PvsIZE8Qd$6C39`g_T|l&I7P~ zkh!08RQeQ))%Gq&n!a%bt@p$Pxd zC8YrlX!sc+k>ys(1YzH*LVg?>OaPHbsNjl_0X DCTdE z9FYR%i;(3i&mK@S*r7Bh0>yQB^Nt7tmw~M>aYY%4moj4W9b6@yC!cX7%gS6T@+ J{??Ki{6;)Kv+23=8+W>S@sR+l8Dp)Ja%8e-f?PU zGfb -t>_N23merv@%nBQbxB=Fcc258spOMyaleMuJ-5;>El6jp ztOY_*r)oA;O7Fp+bAr_4RfT1zq%`P$5Eq3TE62(m+jyeJZ@PmYTX^Cc3D3KdYPn0N z^6U&sZN>Ws?=K7Tg=liz>ZdtRlyrMN`+VddS^$?;5l8B5ixjcNrbHELgOuOT4{~J{ z%7B%CjT}I)3MI Xg!SJ#Nu|=wPz eJH`l4J5+CgxAV@1(5-m|_C#F<-Iv?@`Mxic{ZEEgw|Rjn%FN7(a~4^~<#aK& zT_54Y8^&A}_BPC)L~^$Wk4GcSOJ@BC}kSAOOMm+1)dJ zLXN`p#WtRh&+p6k u3>x)!AwsG3;t!7d$CA%QSdZ+v|!yeGZUU@~C){Ai(~2+VlUR&6%(RBwVX zje@#mQZ({}R1dQK28pPUoDBR7qu0~u_TTK@Ha?_KYEovl+B>QW9X@o8!|k>t2 2u~13`}K}9s(kITYj}CONXk$>tx;P2GUv(s?2e! nxL_r{9H 0tU!HUUH!FDTtwy(Dru*MjY}$TOD0tq;qWN-9kcj=QXn;S?`JbQQj|)O zw~q)MgsY|N!S8EJI(fzQ)1_*xabrz=omju~adO4+E@pMUI9_#&nD)^y1+aCw5 zXYjwaRT;nc1x?W%FI8!k#}#>w32+7eRCgH3OS{i3lbXW#0wiD6`0bJlJ?PFIIXSb} zjkiZw-FL~3g!VFr(k>@FhV$MaT$IayHi;em=yC+ffI(Y!d(syv<~-J>Y*b=hz0Ok% zl7~@(i3`)sbjI>t_)nX7^ee7v2Xk!=>N%mxagRoJJxA~|zXj2&W`0=X*b_-aQ~u-% z+<(iyd%Af_av(NV6>#Gy)Wr5s6N}BacNoPqbDGI8{=w2Db!2gVpGwyW!#GkAa;l(2 z)0{$IFR^k?Z(Jj7GxFC<^3y>@RozF$UaA?LGPj~7S% 53RBZ5 zmRr#bmWsERRrT|ps>384oyvchU%sRpf}X7BIw7k&-d$ e;Q|lr+K-^059bYe6T)IsiCvR1o zvPwEw=;ULY>nUr&X$TEv ZYL=ou?4+#z5ez3_3}t`^@KOJdmwY}WJ`vbz7cxP zDe|#o=LmrZ@XHz@3T4ZWKAb#lMH?U1Bgwz$Z=KIkGHMWAG3+1gTkZx50icYF0?N3F zeexTltM}2Hh{{x1-}a_M!cw-NqC}fNL7v|{I)Eh7AAk6TX97VD`+P-V@`Jx8%S%C{ zN*BSU+#DA1N~o2ES1ozHS|gqB$>COH(Cqhuq|G5nu&d#&X{}EJvan%9rl-5d92yy~ zA-8LupuG~(-**;aNFR3XArN*{x1`|7M!w>kbW|?rj%mX_Bn~8t0Nm0p0HlC{m3dw* zP%%cEaV+5oF8DOFOM5l942s&M8fGHdvUTycEe*TuNL@4{r!c5b0PUNmJ1Br(VgUjy zyEG+bO)+hs=hf%x6F#y6UecGOiqKg)D5p4s5`&2Opf#Jsfi*)2bqtBFG3baF#+&`L zU(1Ow&T^d!i7Wx4DC64Q4`JJh@Gm#mFL+rDG1+ww?9N7lVQZaV=s7guDf)#bJP=b{ zF_=0Gj2d1GF4%!GSlS#dhR~Ff%GUjT;k+h$508`n_tp9f?aub$n3hYuzV`QOrEdRt zefvo`&r47i34bQ1Tkh PgikT!zXD46tB z;>VCqx7C6eEyFYj0v&H-Ufa*fZI=B){m4)oEX^)Wh{ZgxP}htQxIH1fu_`H#_(Uo0 zPXRhHfvNDl&ze0^N9r%SEQw}^Bd)8#gk0-)Ez=Mnpo{jHi>EC}N%DXceAdQzWttoc zRbZKcU7Dq%#}ut@f6sI+;ywZomQH3uyl0(2DqXoK2(!O#<3CXxlzaP!Dcxfp=U|K# zS{@yuX&N@QTHHuGB_M(z;D>RAK=*FEXxiWVh-Mkd$qc5M4QTtxZ}t5$T4Ix|*|Q%- zmD?ao=ip1tg)dI!k| n aZSXwK(C`6I4%>zouGx0P+YFM0^2->H0x z )1S@SLVwL>aldD?P$04k?5>CY E7ck?l-G$Juo1+44VQ3J>1jRo BpZ6oDzcy~$$$m{Fkdtt`JU8P)=;X#IF2RdR-?$>&1McAy1xSGdI3-M8u zoVu!NY=^Eu`@1>h>{70Ij6Q~`2Pl46=O!lKD~8 w6Z#*!!Vo?cQpy zPO&6h0n2>PzvEv>l@3_yB|$t&CCuf^89#AqW=n#O%{!tQVy>Qi6mG>KR==>8 z96_{FisBTeBjvVV25B&ZIu>^q%*)Ad Z3O&&5A#4*YF<%&7!^xmlP-_-Lrh;S-(4X$fkAwIHd{G=F8URs&g%6a0j zG+rH=;%_UdQWkM7h@5|=#N^njXN^CqmGhD}UV9g)+bQyrQ!LWX#_F9*-u!e7ka1Wc zq+|B-Msrl73T?kNXC` n- zdp~?~9rupt*H4Q+z-;6){&5lEuV3$Jo0QA%FJ9=W#mHbX@MEtpES&k{-2M%qRSa+& zRDRDg+QK1OZbV$Dh*iszI3TUxH7O2M3D}; ^f===OrABad-XVr;q z@gtXe e NN^GiacXAsDJd3Pm(9u2`mh4jwjH|&M4?!hjcg_?A zU^%@fdFCBjkX!^|rB|9#H}abD(tD&W`yJUP0|> @lFS8a}qYHkzv#CwD!JDJ(st3Ef*9$yctg z{ngCU @#>HhM zBqqX&+OAF9x0<*h`^N&W$^F_tJY;>3{@N?YG?0B+a1i1yX|Z(r-JI&!d+>7aK=vK1 z-k$BOhA4QbSGuOqJcJFjoE!McqeXl>PxE3Bg)uIOLaME}uYqD&qH`4v(G1dT#91{) zw?wdY@Cz8^L2uCPR<0$<+BN)^`xja{@jT^VeaSJzkwZ*!Bjy!I@%@!#GgmdbeE{4F zpLOH8+S~ZuNqT#nlQal?wS))!(B6Dzv>{XROw!;2?A2CTS$YsT-hUDA2mn%;`f*E4 zzLF5WTw`#6(a3?6dJbG;GNCazIEb3 -(%A z;1+o6`KLR35U3%`+b`<(0oK1)&&l^@r+gMWHH;r^)&yJp@7Hyzx0M5Q&iChczM-w` zS0zJa3c+f2v$vrq#^w4BQF=Jf{Rlov%4;I@ID@vfyRf*hRb7Sal%mU0P D zuzcWyBVSY#ZYAFDt&ib#V<#)|X8?ro`Y9l&;Vs8}w#vSE4_z2X>Y<_^ok|?>82J-6 z@rx@5lNC?;gUJf<=7$S~`@rZk_PwxlZwGk_+8CP--EWrZ>E#G;vs&me-AEx%dkpsT zYfOwy>wmxQRRaPE{6tmC_ndn=AYZavGEtLyOWaW}QFhJmhSMfcqflL u+GwX$GwjKCcMLR9o}&KP!M#EdiuzYsZ7pEN1BAAj(SK*Nes~^4+qvCMK3oEs<%+ z-X*|IN8@uIHnV=`$L8#NVWo}{=yjv+K5c%W#2w+1?n)}XH+gBlf&D3uMK{W{R&RhZ z?AWb Sn;Gjj?`e_NAgnBl)ga<%_hFU!CawYzX3V^f$hgOPZ5V2bo!!-d6=Q_9W^_ zS=1X`wN;`MfM8wY*$f97LNoxW$&D{H L=3dT`H;@TQ&q3|a%i=8FW(>@~2$^2@ zJX+Fjk<(e*Pj(zxBp&+z)eT$g(+28(uG(>puL}JWx)HdSkybdTMu;(PP59K0IhM zU2a=G&BhCnw9x7Zpq9GE1fMb$jdtk((p~1AiJLZ^@tXH{!I_~~AOSS0u#Sb-i Ka6LybX&iqT}ZmD4mF*X7#M+g~suOI%@ut zk0PTe<+RN`k70(QMoF(vP%1g1#BtjtU$Y*uD5qJaY>7;D8I-2zMtK**W&NoQZxjOn z(DW=sBbXy>|H}J9Utm(O0Za@`g{QGV<*z)|0N||Tauj~4_b!!An0JWloLHWDYd_R0 zWA8M;*7o0>(>4t9W%Ap&Vnww-Z~xv%+rO0D{Nmg)lgbv?=~pg*U8E8gC= rgy&}G_-OmIMgw{UlM*K2aP-%o1v`= zlN_V9)1l6W$sE8a57GKa$$HMIGveK))%&Y@L C88C`f; zNW`ezh}qvnP11=e=T#b-LZIUc=Es`*CW$lHFDeVjPnl<6dpq637@g;GlF=QQ{OLds z-4IpF#uOs&3V|U}l~tRM$ 6&dy?}6L4E4IxgbrUtaw<^-6p|y9C*o zUo3YDSk$2gHsaW(vuPvv>fgIny_o&*MtosI VCD{{(qN2M)*Dz!e?#>#tJS%^5n&@S%`LA8GTjr9 zfI9lD!_=2!QZ-&n*YwRj-)cUIDuHMnJN?DEUZ_!7U7mV@$1w&5+d@gopVseE#`hJc znt1g~YgITc71?Ytb=|S+iOtuxdnh)1-^^3Ys>&w}CG{YaYxOp=(6};TD`3`av(GPR z{oAxCbn?Lg!((r)7XoQ^EL`P98A)_+g!(E%Ub9lG3?}^-&i4=AQ5q|(`tfYZ$H )iGw5qIB6Y~q!hVl|~9+$&S7G!ig~9fB* 1 z0@`Pl)#H_sQkhRGEb_W-9#I*K5Las4`(bS5wHV4Y!Oy@pe5YgYj&0^`XSDwVu}O2= z34ebE$r6EDNTxKgxS@ipr-rkB-qA`tMv`}K kKYU;o|a!qT8H_~ZaUQcuj3C?JUI++QLz~)`I zOZA4i*G@rc$>HqlK?%m&cq*q+F;IyOV-Ao+Q;m~>Udb{xIj8lZ7ry=pcju@Iz;|xV zWj-KMFLy3MhF)-9$yHMOh$F4a^770q*45ZPldHde?V56(vsaiI&uw{JCNvzSm0cpr zpMSXJWQilzMVxubXSBp$HG$u7GxRH(lrpsRaA~9%)o)#|mt&SLDsKw6)CKTvqLr^r zerE6vc2ESrQ08KaV881p!kXBLl>w%ptlN4OPcD1QJG2Z97+1K&>WF{a%uon3!DZ%V z7Gym^a57Y^PE?xf @_Gqc@lR;nBfA)-XLx$ztnmMPk5C1{^MHf!bi^3d|Dg- zX6@ackLvnR-*00Hi3@XKQ9gYV5D1vM|5%rR9AaSeByub+P)sXZ(fe@xz_xDVeN$qq zXsyjVa&YgO?1S{?KRMs8F~5@@veOide|J`H^P@Gs1c5|iO;gRVs&GBO=fXoMJp}(^ z<*3o~{qu{hN;7|8`8L@dv^V$vnb*5v_z8d;H-0Mks`O`Nw!{ exxAg46Z@_BH!^Dh#@b}NC9jZ^T+nndi6X!=h?uKF56E|vd%HX1m zk*bHtz3#gP)%<@TK>s{2AEmZ`qRWQ_o~fFLb @ktc<8^e5Rz|F%o-!`lQbx za+GQ4pRAfU@&DE#r1nPg{QgU%7>_+TVtfGD13{#nB|YlH*4Ea{&&X w{2Lt~Y$ylGDqsbDv5NRNQaH^vWFT8r<=eYCh8L-|KAkN?YBXEMHBcgO zSSBwt|47>3*Zl{}|M 4ewfDy%eT<9-6Rg&Op)k=61RGhtvJ1m>j}=03or&hV*kY zR5LsX%Zm78gY-|7x`ztC@$~x_4-LKjr@#5<6>;FlG&SBk@ZK=?{{d?d|0PQ6zgXG- zVrBn7&dUCm3IEH4|Jj7iQ8S}jjT9S2!A_;9I9<4sUqSTW?Ks_Qay_6MKlAu%AL{8E zS7Rz9lGcfME8n??e!WW#&tv-Q uV_NXcTcuFXJO()&9TN|JV{P3wiDI(`w%bcATc!XBfi-r_`R)hnZ&kFi zG5J^Blk`>eC-J%aX>&1;I(1?;BF3y$dWEKch6KeR*2GzjlgNVEe!Fo+x_0c+SLu9Q zW6L;< =<7%{OY@4n8FJHyy> !kDRWTt~NzO2*F48~w4=8l#*>to*ZvsmpJ(Z+4tynY_+> z6ZvVr-}&EmTZ_;#BL mTUf36bYw+35^<^k#V#jvdvg+Hv7GNADIJ z>HPHR`fgl$^qlsXcOrQrfa7LjbG;X{*xtgfarh@UMvZp&Vm<6#@X^##*(++t2K6H- z_a&atRLglL1kwy@UU*eGfAB8wtw4Pg_LPHuj?Q8FLH|t^kSaiY3bIj}%$g3GYa&HN zmKogrZJ)4sB-H-=A8NdRFM|9o_Q4+-o2);-aMPF{S0mAreCfsd@P!-Lq6je= z3glqdSaag_=#2IHHbG`!h3;SteY0~dRtvK{8rw`ja?i&3QaT&d9KS3mNtXi>9a)ND zX_3g4i4wD%24WsC-4>HtIG&%WxH<2GE4Iz=BJU)PrzJT1bL6dzFL?83DQ?Ys8L#(N zmKag(T;^EI<8uUlI!`gKj0?n?1vI5uujspAbXn8<%Xz46pT#ayGG)v`tp-y7lppxu z@3$2-&nN>LL`J5YZ!QSx_8?57)^H`(6@X$2e;DIRd}jMx*0UL(m=rDJg#C4ML&+sO zq?4GBR})GPOVd8oeCLZ^<1DuKi@Lbu#X{T+ef}^>Z1X7~Kk^jLtkfPUt{PqjOYPC) z5i>T}#pw&hji!TKITo<$kC I`(Rzf;&I3j#F=SX=(FTwff z&{b0_vQlsRTKW5CTYSDDZfYZ3oTDgB$ai=_!J5$0^*q&Is}sqk$@3Tw3ljz8Lw0K> z?N!Rx98|?0>(iZ4sN`*g^5gkv=U^#tD^piIl44{dnJ;e167Dx4L-Necg!xpjSGOLn z^=yFXRtTo8RXq&sf9CP!k#F8}7oM9z(@|V)ElF14GdYRlJaa39C%6Q~cb%E<>f&Qy z#u2eJo^lK{0|(=8?A(}=JEa!cZgl`{ss3#cc;0(B8!R53khon8o)B>?xV1kW kg0S1pO>qF>LI*8@}xLf;9v;U(;I99~DMgjlTNru>rPg^MppZnFHRDD=|hF z%<7$uJewFh75ETP1S?(!4nuvrGaFJnh!WsCjXy78Zw3Te2j7`ky=w7TXzW}g)P>!* z3eT%@OS5AH+dIZ?3WmBodY34w_?|WBo< 8^IAvg%4-` zsmuE3GzokR(AmXL>#+{PB_&5mPaOhJXV=tTAeZy%yK sHr-pK%o{*>)M_-fUpK&bK#}iii|Y9BV-3i_UciTWUnzOyN!?1n8ptlcecA z4 N!_MIM^4jMqO{6Gd9^R5--u;PG1KPIadib*t-)=UK<)F z9opG`NOxDGhQfO@sGju^Y+&QUjNfQFEw=nTRFs5I^^eeT#(W!@s`GmdNau9O@OfG1 z$Da+AJy?#3i}L|x1#fqT8|kU-XzJ|~<6Bw(auI)@;jqda@-Zcu&Zx5Hdw}?c3#mWa z7yQyTg_L5%fVzK(fr)Bek!q|x%rHJMJ&{K^8#^1#5%+AVz z1xDcTqmsV|Whdr#aaI-NO|G(yg#4;@BWC%NmAWpYkB*&17nfY5?nGzx?BQf0%Vy>p zhSZc}X|>JtE2~q*hB=M$PhojW;hjSrCbC{MlA5UhPII&n*KJceE{zpxIIF+Wz>V07 zfG}3UG2tI=V{e$}#1ueLJ=={g5wjB&foWa4KfV>&B?7`_&V@l=JB)wRiPY*Cau(_q zu5W#uPTYMzkcp+X6f?#MX=<-sk5`TM0doujIwcS3zG*LnC(4)#i*+oXEw(bR`c+}Y z`|E}}QGMZYsu0U1HIst@gC>5mW%*((k7B2Uy sE?^&H!oULw)jay8v_3X!-R$SX%Vjr 2G^_WvVBmU!an8`^0OzJA?iaiQV7w&<$FTg=rwY#jx!vU@@Ds $w-Z?}-t+^qUMQ!d&$`JI$A7+3uXa2>jZF87WS$-3oEcIc z?GZRp7`h~@Cm3Ux&KPrEs6n*@>*`>lsDU=Vj|wx+R|%N$!;+arXF{z$2bBsIla0^| z7_D+|eYpRoZXa}W{ABT%&fE4T`)BzZ1Jk4hhB5^@Qu|lSZB=qc*~dp&mVYrrIl~4x zKRY+CfZiQe_>m_kzr_NAm>$z?xr)xLaN#I*XV!)fcgoeb&A`-l_+T?<_gINnLKlV5 z+4EwQUDstojg?e4ARxXu__@Rra~M#;h#jb?9U}C1K7Lo`VsDb+=MXS>k6*8_MAwIu zs9-}W869@dN(FRRUY%EuyH2a-Ej5~xRywu|#C;*4>Utc8ODh#xkm$e&TquEKe*#}@ zB<4M?Up1;UvCaGBSjGP`;;`JFw%IX04XMUT-NEtbW*htq{^8 %EIdS!bb=_bYEvcX>9oZc|xV%nj7*f{M!1zy%tI*keO9sV_BZ^r_7EwcKYc2?nJ) zddMr&bPq1}cbnu%s58h;E#zxIjgsa1Z!5^{r^=BFnesIg!?p?TbZrac*Tl!r^)Mgt zfrRKZmt&({qDz1zUtA?;>=B$KOr;Q=5mLI<9A?wf+S`%FaMPssRCfV%*c&|29*deS zR#*$KVg$d+0e@ZeZ&eIeq#u42X)zS9p@&DVO(lR$`403`kPqW!6rcB|==tqV@mP27 z5F%9Lw0XFb5&2%-&IhT!^ t&(x7B8Dg>qn8T^!+WQ~o8iNoytPO)O zupeQbs8#piU9`OE#9%|WV}!VMw?jM&bteP1?^hO0m`nE)H`1@f;x8_FHrRU@<_G_{ zJnYpjBXyVb4QB K6O&r84>xi^5g%)A9AAQ$a)jQUr#GU3#$OiKKeX2g?-Ibj}0ZzHdCEovStHA zV~Hxv2o)Y?sB)oJr$D7`2SLD(nB<)@p`LHVcS(D* Izwy4>xt|Ra!|pz^86g05-nAP- zj4mlpHt5EcI-ttYN}P7bPol0_*)7!AfFa`xyb34=L})aS)G-1@-znQetd&;0V&4&` zoXqYj%tOVW#2_Wh6hAC)IS?4)K>5|D%J7>HDu0((WQC>RXHtSA1^4H)M@3enOt9(c zd|#a`ba=$>5^VFw%M>0)WeSL}E+|;UL9U)-yZql))7$kWFV-?LysTE8)o`i5gVw}5 z`V WWly5asgka0PGAS4SRK_7`t{CcVy5%Z zpj#g=Le?Lge1tjoG8C00;k|EG{@M;<)TybFo}2 zCq|m1%j#q zj4Ku(f)?rhVtn4&J*hWTG0K|2{?TL%=0Yv1(60&DNs-lP13IrPtxoN%enYI$QjM#+ zKVH*H3>}1+-QrQQUO83y_%&<$igziRx|Cg*64;Y`-%J?W9_48zBf^?{F+ ?sZ{MDiyv52Ffw@r4%vLGBEL-K9$T}^>t=c!h zY0>4}S74iXDqAntvw$STwHZ-xnUd ggmLPP_R`*lKVxh``=GAKng*R4RgF9+kkH}U63d>xYgF~Eb z5v*%>