From 0a41452a7db23bd336fbd161a00d08fd5ac46368 Mon Sep 17 00:00:00 2001 From: Miguel Neves Date: Wed, 19 Feb 2025 12:57:00 +0000 Subject: [PATCH 01/11] feat: added converse-api support for images in input. started making an integration test for this. --- .../providers/bedrock_converse.py | 7 ++ .../providers/data_structures.py | 6 +- .../test_converse_send_imgs.py | 82 ++++++++++++++++++ .../test_data/llmstudio-logo.jpeg | Bin 0 -> 133432 bytes 4 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 libs/llmstudio/tests/integration_tests/test_converse_send_imgs.py create mode 100644 libs/llmstudio/tests/integration_tests/test_data/llmstudio-logo.jpeg diff --git a/libs/core/llmstudio_core/providers/bedrock_converse.py b/libs/core/llmstudio_core/providers/bedrock_converse.py index dc756e0a..630c47ba 100644 --- a/libs/core/llmstudio_core/providers/bedrock_converse.py +++ b/libs/core/llmstudio_core/providers/bedrock_converse.py @@ -276,6 +276,13 @@ def _process_messages( } ) messages.append(tool_use) + elif isinstance(message.get("content"), list): + messages.append( + { + "role": message.get("role"), + "content": message.get("content"), + } + ) else: messages.append( { diff --git a/libs/core/llmstudio_core/providers/data_structures.py b/libs/core/llmstudio_core/providers/data_structures.py index 374ad6eb..45ca5d70 100644 --- a/libs/core/llmstudio_core/providers/data_structures.py +++ b/libs/core/llmstudio_core/providers/data_structures.py @@ -1,4 +1,4 @@ -from typing import Any, List, Optional +from typing import Any, List, Optional, Union from openai.types.chat import ChatCompletion, ChatCompletionChunk from pydantic import BaseModel @@ -91,7 +91,7 @@ def items(self): class ChatCompletionLLMstudio(ChatCompletion): - chat_input: str + chat_input: Union[str, List[dict]] """The input prompt for the chat completion.""" chat_output: str @@ -120,7 +120,7 @@ class ChatCompletionLLMstudio(ChatCompletion): class ChatCompletionChunkLLMstudio(ChatCompletionChunk): - chat_input: str + chat_input: Union[str, List[dict]] """The input prompt for the chat completion.""" chat_output: Optional[str] diff --git a/libs/llmstudio/tests/integration_tests/test_converse_send_imgs.py b/libs/llmstudio/tests/integration_tests/test_converse_send_imgs.py new file mode 100644 index 00000000..3d45b715 --- /dev/null +++ b/libs/llmstudio/tests/integration_tests/test_converse_send_imgs.py @@ -0,0 +1,82 @@ +import os + +from dotenv import load_dotenv +from llmstudio_core.providers import LLMCore + +load_dotenv() + + +def build_chat_request( + model: str, chat_input: str, is_stream: bool, max_tokens: int = 1000 +): + if model.startswith(("o1", "o3")): + chat_request = { + "chat_input": chat_input, + "model": model, + "is_stream": is_stream, + "retries": 0, + "parameters": {"max_completion_tokens": max_tokens}, + } + elif "amazon.nova" in model or "anthropic.claude" in model: + chat_request = { + "chat_input": chat_input, + "model": model, + "is_stream": is_stream, + "retries": 0, + "parameters": {"maxTokens": max_tokens}, + } + else: + chat_request = { + "chat_input": chat_input, + "model": model, + "is_stream": is_stream, + "retries": 0, + "parameters": { + "temperature": 0, + "max_tokens": max_tokens, + "response_format": {"type": "json_object"}, + "functions": None, + }, + } + return chat_request + + +input_image = "./libs/llmstudio/tests/integration_tests/test_data/llmstudio-logo.jpeg" +messages = [] +with open(input_image, "rb") as f: + image = f.read() + + message = { + "role": "user", + "content": [ + {"text": "What's in this image?"}, + {"image": {"format": "jpeg", "source": {"bytes": image}}}, + ], + } + messages = [message] + +llm = LLMCore( + provider="bedrock", + api_key=None, + region=os.environ["BEDROCK_REGION"], + secret_key=os.environ["BEDROCK_SECRET_KEY"], + access_key=os.environ["BEDROCK_ACCESS_KEY"], +) +chat_request = build_chat_request( + model="us.amazon.nova-lite-v1:0", + chat_input=messages, + max_tokens=100, + is_stream=False, +) +response_sync = llm.chat(**chat_request) + +print(response_sync) +print(response_sync.chat_output) + + +# chat_request = build_chat_request(model="anthropic.claude-3-5-sonnet-20241022-v2:0", chat_input=messages, max_tokens=100, is_stream=False) + +# for p in response_sync: +# if p.metrics: +# pprint(p) +# pprint(p.chat_output) diff --git a/libs/llmstudio/tests/integration_tests/test_data/llmstudio-logo.jpeg b/libs/llmstudio/tests/integration_tests/test_data/llmstudio-logo.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b4f753fda2f29a29819ae21e0b9329c40be5dc10 GIT binary patch literal 133432 zcmcG$+0yISkuE0r+?}iQ2o=>44m;2i1_C5lmUII1M1Yv5I}r0cg8*O67k&+2+7EET zkI-H}xoeV2Qn#axs?8t6T8TAfuFNkp@o)d@Gf zxBv0Gf7OeA>F1&!zB~O9`5j41>VNqkzxz7=+gFL-{r-2L?C0;l{olu4EX(i%40rP% zqojYNe~kMU-lG9V|A@f9`_q5lhbXSo<-13km))Pg|9}4X|Kt1b%H+@AdxVOp1Cth| z_?lAdrP=YTj<3o0|NSrj^-uc`dpor05`DL~O*j9r|M~kj@gKnX*KPRw@7_h0`p@4} zUvK@+SM~3heoDW){t^8{j3DTDm+K$T7a~Ej%fEhyA=n8<&M=Dp0lof!p+BJK@4g-1 z|K-1evp-Eq_Jhgt-`)qV{`~#7jy<2xKR!=??57+?uh%P#U@(UL0hIW|d~{2+|Dl`z zZWgF!w zTn%adC-~>PKQGX)qD#3n=`X4SB5yXKn&sDbe|*rCU+nWk6LnyX?SDwpELxl8`@gv5 zyhhD;QUd0pT#i4%Urf=Izb5jz`)k_ow*7T8{sh+k56qN)jkn$R&0jtOK>B$WzQf2r zBH#TlY802<0pa5cCHG`2~?r z$-knZ_DPu?e?xR5n>c1%T*VTboOQI$E8v?)42=$j`|B8-XtnH(V%4Ytn@%gPx1<`PX->a5@z3A?$cjISwomDAb-QFXwil%ao zzERvvQ7n8hsM!&UEfKD-NVq;FR$Wz!!i~DoC(v1UG`OmeF%^GN124*}ISvw9Dr@f4AI;n+<E;E(Osgi zQ~2}dhvybCC`40Vm8d!q+$sVmH2ZZ)sc~ak#@BQ9>v^t*sA;_k{_Ua0CV!2 zMZcUnVSaq;|E~mpe97nUU#-I%FE?T99-&86p+$R<=bj>u=-z9$HHSoKwns@1?-qiS zf4l~n-2z>2;?@O|1pd!#2_*eb z$1f-4+f7A(pLE&~9-mtVDm#*(p>Y@dSn(TQIuw&rIz=0lU{EQ=s2@&Iz(S{3iPE0b z4uw70oVq*I`3Z!b9#GH|Y*a=}vj%5VW=)GvuA!`%R&x%gY@9X? zUZq@#eiQTzKBv5xe&jq#`A<533O6d0=r$J$Dyr$(5C|&f=)(|ADyeDQ5CC%GA#fAyd(vxd*tEX=Pw^O$LCP?2oFa zS>~v^VeDSEpH0p9wOl>hntAl{>)AC-HY=RbcT9ySE;Woy&nYc6uFUKxCu({z&-wNy zDCIN3pxiAoR*E6=+e~c|193OVcv>vetHyJWS`9sobH%!g4_=Nb4c@Hf~kvo^DxDp%VSF}WS(mctDu#Nn^gpTZJ4qX@>&(%&;Sf4KQ3gWy9`^lS;=A9$Gxk{EqmBnKV3J`%{rwJRAqYUQmMI1n(A>MY#!@6F^0s3yu>;dus}hI6Rp> zCzO5Un8QgJ@Mt%uS=f!oeP1d8?;mrqMIt4|O0ip_ILH0|Qr`qc-ATj(6-A#)TJyw; z=`-aEf)d+4ZRj&3u64%kBqU;W*3b|vLVeC#G%X3wyk%HU(y2mZcuDe|;!Uu(#JiNu zrF_V))Jx@b+!E>8S9eBhCBmqlrT&y@vbHUgl$E*0N=KIMyongkm*cp(9ziDqd0rgR z=}k~x^G;wASw8jMcx16cA-#SSyP`-v%G82l=RP~+Ugm_wA8*=RD3V60g3C8SgVCsvV_M^$(2B#4MzqtH zT6!9t%q-6BWV{A8b9Bn2G|ogU#Z(Efj$PLb2mVwCrP(IJh&-O=%N5@QQzWA-Aipi7 zG%YQWMW?B(sF6voKUp2B>|bnxYPYuDN}CzfxIWIdA!}BR*>tSBcqE^W4`*g6$&W&BNacFp$D`{=--V>FiTYKyDzF6zdz$D(2Ej*WLk z6V4@M|J_2I&o@s*g9EK2&uhY!??vz@8k!095ckozTjR5CTr@Aww~{2~PqJSO>4QIC z{pU3cT<8^0Zth~tM;-?HUf7sW2ANx0o)QNeT^ZQj51^$sfN>Vyn@0CMD@>DC_aZA? zi%$1aJA|5E$4W1{?}LH0QIzo?f|f95(Uwd$wssMGon7qM9!9YQ0!BOvd5y3O_t=Ro z6<{-FmS@qid2A1R;{t7tgyE+-<5yhNu@0vE+WyOLqSATjZhi-vQ4 zv8L)yC|xV3X>vBZu}PoiB{*$N#_(kBzlzM^uf31cSt~-Dz33DH#p6psKoTt#L#du+6>q~g!7@85p)@Jw zi@7!ZMpnXIJ$huX!cv2AqOIn$uJuq_Q<3o)Sg*DrbCe~s?nVnIG_AfwjwD-3qg(Eq zpilTRSb1JY#7cAWd|WQn_Ev_n+!}3mM3FqXEuuUo;u&{R8(#^u?h++6mY64+R9kW*Jd3nqqg6laYrN{BuOz&Dp3u-<)ciKD8Ng`BbD@=&$-Kwq}6 zEisP0riZSP5RR~&u`V2mJT8`gz0n9_+xue5sJglK;+tsWdzhBQ?=GVd8-!ZbW8Nzy zlL5oF?U8Fw{v=Har(xcyc%}V94yQAmYb$fb9lLnlWgB0%DuDEf5cL|qdmNFU+Bd;w z1$y(j>(#X+&(32&?!)7}`cr)0E*I&sa48mF%4%KiSL#B(o}SJ&q<`CCSW(HndkwIG zT-6)u=>A7@xV9$@f>Q;eJABk@9E!8E3r`(%%19bM0@&)V>qgw*l{ViSz5Ju+OWC(`4ILw7I!jxclqn&{qM@;OB16@nd!WFV zGXB?v4T=H11w#@`jM3jfDF(a%DD4IV?tu{jG=LcU5X@B*-~ha2O1t550*7&B9B__0 z2nD@+yHV=2vxtSdhb76FN4{~5@iOgtRF2@JGn!*`_4)qNisT~?L(yiDRg&ahm6;+B z3mFXEXd&*Rxe7fUIIMH%-9|$H3n1{&J@K2X7h(lq_GJdJ+7_HlH0csN{p=~jB@dZQZYE*F||UrbW^hy8VHd-ok`JOoSGky-spTrP>E*doWWW3$NIC-jawa*AsLq zry#Vz`Q~-mb9WQT;G7zvoVtcpeB4iP^HJKjnpt$xihLA@FPM=;F5I0{$o#bS0#mXl z67*zzb%_?M)L^d<2+~XQg7$NRV4mXPOBi$>P|V&f#IdS&iYD}cy(WR?9-9N7ob5b7 zgqjBSdPafK1?lKYlna!k;<%13eg&Qj1$n&`)k=+IibTC-4HJD6L={wg77KyHbB)jt zicAHm_^~_RMKCuEZbVJgU_B3daPAtUzx$c^9FpC8cKkHnFvhZPk$vievHG;o8-WeM zI^@Vrvy$E)-E8=ZzeXx7snR;>KKTEkpvc43j5QIwuv-^43Q?3fxpjX$UxFDBHH(CW za(TCK&e_S<@|l#h)8k=in@JnB*NfkTzFR%YZ?S`1B}|l8EX3{rPq{Rc zY$OA*klQJ#(OA~wsnjsKW zWm&V6*;Pc0(vvlk!n9#`V?UQFPCA}XJ-`aqE@0ht?-sJDSC21jdFFM|8by-`ym8bI zPTU2b!ggu6EeW~rk#WAs?73WrcsT%~lxjx2?)WO_q4UJRp7A2c&%W&O7&^oU=QD-n z0?WAX5Bixp@nf>f=o;6tB)X|wrxlc5Sa&KF1u;Xe$%-=)kB7pda44uV&s+@oql#!y zBDOatp%Bq}oR6&s*ahlg)@7C9F=NlGTSta?zR1i9i`Qb!a&~K2jR=FReL=x|J%yeQ z$v4Y_KP{Z`M`}IYgpUYekdx_gm?Xa`%S{=1*ft~T4#57ivOV+zTDCiqRt!#J=lpg+ zD_SHo6i{D&bNDY&}XuxaY(?FIbUzWYh}HZmu>QXp~MR<`*C zEjU^(c+gZuY0$38DTV8>JwOaYnK68y07B`p67@QDhNidcr-hvg$YWsUPC-4t#A>x{ z2Yrg7xZ2@Euf@a2eE3N}-3lI*;#R>X4p)vk6&`k?LS7P=3K$yAJg(ixtgtpkXiv3! z2_h}T7J@!FcW0^6QUqs21!`IcY3HbWiFH*L+C;YBEu(f(LL}Q$Lfq1mS77{}yx`M^ zm&s+}E(@uP@jSpGcF6gi&_*U}P=YbhFasl$kID_E6pc5SB`J0?7Kp%}3r^$k3a&Mt z-kp_X$qcKK=_S;8N3Kw~gqs||ceF=FtS*i6f*c>s!9$nF`f38wQOwtN5BUJz_M8@Rdl*Kx^j%-wptyKGIVd{bW*)LYFB z%>fi?*8;0x*L!~>!-@+mwFsfpqcsc7tcZ2TphAaOsfd4 zuLb>P_|QXHqYdO`^?@KIfwVWfe}#TL+9!r%@j)8XcJF~e-gyn|C4w57CI;}Sws`^e ziy*5-EY{Q!fb4w0w1wza=@Bb;XYKWoHa){QJW-SLGa??PHjUBI__(Q4^KE%*#zBTS(O=K- zfy<;>IktDEE!rn%SUQ%&w{Eev-VM`8t`+hzZ?oIR*E?=hi$->kzo@l&VG!@6XfHQ7 zkK1kVOKrBB+O$$m4PhYaE)%pt-sC+I58je{2Q8C)i=*u0{*WIQNeehWBf+CCh{tH+ z;?e*d67qE-u~Kg`UgvJQ4`*U*c5@I=<C!&=JS$5^avxD$!#S)j50i}OtAzAF1a*L}C}P2kS% z1N^E;6gSSR_>1#j5U_C^%=W4KqP(>*xkIo-h8G06w1D^3Y}-HHiq~nf*9ZI(FJ!6$ z6?OG2LyA;$y%SfmRqOm7nnt7|1K24!aa1}QM<5c`A~u`s>_R>+ujSK)Hb%>H4+M8ZJFp2%pJ%k6qBRncw>+DH6&F*jfya|3D1nh{FXLr1U zz@#ym!~{Dp=W@5Ix{s;pfD+*zv#hMpt2|&dKe+HQy$;jc&irCT09_GmdgmqZ3d!-QHlaLCvUggGB)6;WP zS3%wcrz_04N370$W<`d<#Y=O)Ssj)Xfzdkw0F~%@{6Q8Gwf8Dgxme72q0vyqA$S zhUIoK2cVeyXz#+^c zGtf=_Wj>2lJPN|f+p;SF5)MM~0-aWxiJ7D?Au{vhN8zOT2*d@D1*X2&bq5?mYtD(Ak){p zuyFi@$KpxAj+?1Ne)+KcoA3Yjr-z*h5IOB4OsUj%Rd@JkMJNRJ*1Ltx-fhX%ngKs% z9N2H442t65W>6_qxR(HP|{ps?5Qg^?4`X=~y zXLtNMc!zd{CxuZ5q#Cq=vHZsTwk-S-gKvVrDJk8cNiv{M0qZQAUWI1DsRd8s<)l{! z!#3MR;9D=k%PLgj{4xS$nR3VU`X*>LL1`m)1PR1KtiU$2j6Twzfws$hBy@IwGYoI* zW(M8!?s#0yFAWdKct}5KDNrLSVN2tywQ4c>0Wr=GsMFk{MqbXXyq`P_rA%{TY6Jm* zDDJV=Udqg`UP-|ej@u@^B8blt${jLF}LP=Y_C_x+s`J7l!@re$;I@xXR zt&a~c%b9+=4M0g!v*zLw+jN^NFEUI9FO@4RRWIp&V`JXaHv^ay7vBt!t3~Fs;9Y}6 z;AB2oH+?@U=PG>gL%{?1N%h-v{Tn;ww@vcfB6u?E=}h9blb!1Aynhz<^@WppeZ2w! zIG>AHi+!jD!6otC@LGU>4ZiHez!XGfOn4q@jNoN%>E%%JzMasBZk^i9*6z#1U#d63 z>Ka5?Q59;(Y`|B>kYJNQCcL9{S@BV>ktilT-{2kLAUhlHAsp&gNUyFhzlEAQO;Y?Z zyTOSl(UbQkcwz2o^jdbAnan4KK7gyJYXggXJ_}uT09;00l_a`63Rk`IsBi(|FY+$) zE3DfbIC1vS6J_t@My}a>^usx-mU7|~8J2J4mMGhD+a4CMm$m+)UdtIh#V>Qbv_=Ck ztvVDRSMo^*k6;|(R*r7k#V-R~AoPk;}BP?f`&jM2n~)*T=-A~tQ%VfJ9k8B%Bbq&04jWC?m zUY%e3L;TVv|8`gTyZ7ELoK+P#I!hD+TPxltPdiM`9N06qC0hkOe_jf*nb#{L!dV2z zYDO0)mbirvPtk1GaYPW2_pC(jk<$<5Gbu8N0{&4V0p0L|E^6 zMlylj2cUc#Fz~DC94Sq@ag+;PxW>ikua3M4{ztm>cl-M7!JFWJV2J)1y${m<9~}4J zChFwmo~EBY5UM`Ebh5U)o+*Z>fj80UL!kg!`^vDW_w*x~EZ@$T&~bzPpw^L8V;(2SCg z#D0K9HE+vg=LhgWdEQp73|L>W>m|WBoVcxjT2}7jiZ|d0h`?ybJKdaU6+{sbRg&Qk zv_;U(#1n4&5Y!*eRoxyQj?z65G$8aQtZGJ6m`z2;?RlNiwYyk%TNY$4b0TQOFz=pQ zBu;{0l&K$~c;R*Q;)faXaR;Zy352FecyNgi??StD?2!*`!NsA4o1(v~vJSlFN&DOD z<=3nD7o6g;&os-_=ve zc!Etbf%SMv(%ez&`5aRny}JBTVkc7lHij;IW%u(0)LN^eVWb6e@d~!31V(gm+;XXZ|yk((dos;qtg-pi)v)XM;(N}c{I-3BexX1=8`tkU{9MG5V5Dn}N z9u6Ck1i)f=1^Shrrw`Ct@c4p@Fr8rme4I0)!{FI}>YBSGk0`}0X{Xb0@EaczKD>N> zEHRA6TOO4A33rlaA4w)g&gdnH5`)@m}zZh2?RyS^ck^tgdI zsMDNEYV#7qAG!Cv4u9t3zk6mC%PkeW)YGWBIqn zIu>gCDfrmS2-Gvm$qM%MnIWkQyg7Tr;Zm;bH%D4A1?=bEYmuk3HuMr9a0V5kZUsWi zQA;JNWi*8#Lo=iSIN=9&Rx%_Uz-%6e0h7R|H?%{cVj6}Nm43b>Fx<2yFn_*mg|tV` zP304{hi)u!@2-L@LCzUSB7U-%?DDtQ`5&&sWQKzbHeEk;TU!%?25c^?(P%LpWU2zSLAs?tCQ;9%aMvmPhK>9u69XQ2k8)=ifed7|(4kHQ&Q z5f8ap{dnENWxO`}P3Lu466+?y3H}Kpkl1^aWWf3NlAD^+Zx>HuNFWNoKW%F5a%%VYSVz=D+Dr!6JgIo^1Ig!WYzgT)q;7R?&+bkYpb6}P4<$McbgqeZkzYb9v zxH!8YuWQZ)ssk=R1ZUeJU2b-|yLTs$ZDYij_M}a!pe+1BAeW2wk=RDMJstqL0D&n9 zO}rYFObQ}LF6PZ_s|anIJQ<#yhzw1Avz5xN8>4p_(l*4#=beV^O(?lp*L)eiVX$5e z1$3-d`ont0Q-uUw@Pb{eSY7B=!onn-gnYt-@d~twzbiiEMJ9*nvo8;6fAV?^QOYxL zS`zYI$T_%@+EUGfQ?JPl6hKutg;3iPhme;K;sRN*T<}g zUNgK8B*2-M3y3BvmZHXuF~d_}D4rl4i1Ot{SD0Wt@NEtuolwI9zKJfkWfKbpm(~+& zkM9v}l+N#2=0rT2xVfP*=)P^8o3$c`^Ww{doa<}y+VTaU&H_aE5QN#(nsRknW-HJ$ z2i=`>nU&0H>*6_EKwCbJLJjRJ`@|llb9-q~40bmPs7Av@y4wTt%f-%B`B@^!85JDRqt}iePz#!(MaPII^zpgq7{CC;4ySQX_xDVeH@|A1U{*gxr zj=)s|wcr)HB*(zLrH0|eJMF{Vmn#SrM71Zov}fG>_?OWY@vu6QHlAlDTv1q3ZK4Gq zn`P-i*3bEpM#u6>bS*Up?mClXuzCszi+Y)aO`8yf%CF%8bM_Y4S5~5_0JSJ5C8{7B9ROq&EaeVTmg)U!(|hn zO^i@-@#^hB^$GQI;s($XEIZD5n+lmf-IYk1XCOR5#Ny$ybZ$FbYy-)}D0lh8DVjur z;GiU2h(~8l*!>Dpj>1z@NQoj}$Li*AmGmlu60}u}5fP}^v$aWvPlL!3?F`%?c$HYLD3mt{F-!GF@8xs8puCy<`j#5`SS-3+cZ80`^$qu4I zgUG;!393uSKhFw39&b)5tj<87Tf698BcbtKEKk!(-DnLB+{Z)`UxPo{7M{3k;&4e3 z+xp}AnnYP)Z=&B0S3bPUB3EVd^Rr2Dp&AB2D-%glKazI4wfMROaB?3vZqHW~Guf9$ z3-?ak3ewV+4g_@Z%Jl+VFNA`*$Fjxe;T!{e;q~cqTBTfkD>XTI9ZZ}cjdM*_$SVPg zK9P~1PLT^eMB*MzBf1P)HTvV}N+=*pXcv@=q21(bliCVT>-H!95L90QKJ-=hWs%7F zwVXiMScT7zQsvO#^5|9@4?#j69x{(@wIA}r&aMSJK+n6*1VGIiS9b}h-IUKp?}Egg z66l~6p94kY>;NYBEdnNZ7{fsj4@*8TR|SZ&+Ykd)1-`_ooPnFgVr{1uIiCvvc%*Ty zmN)2QfM4c;I*XJ&zxL;7XjR){cJzK=huJBwm=j071uuvt#ekB)u32Azmb z(0WcHJ&R7G3J^5Yy8{qWdw6?<2Qwc9Ub3CD;ZR@MgSSzD*PVpt3^t9qe<-ht)22rc zY^Tq%aSGQD*mMA@BLZA`=>~#`PR&aONpl^##%rj1;xt};&xqxv8BgM)O!1)wxhvjy z8hs**G8s5IeZG+11VI!SP`*ijR0fB;&06W{_T&)eM0*kpVnqXe61UWX9+@tH`D%th zsPwzWcgqAZsc?@%c^YK{U8n7{1;pZT^{%FF6XI;}@_p_`8|1o1*Gp5eEXt8^0_kg- z%hPh5y5`~&Apevfk+q%x-g)Dnbzr^JaWX^k0|bH0u2h#eSF~2t8;`wa&9#8Hes~5i zE)%abaBXx0)&tMJD)c}`Sz?3VfMPW;WhDqKM|52gI$LR z7;mN~U^ZedP~mpa{b?El*&gHF1j03VfwWZB5VcEdJ4t>)hIG!7HM8erIGF*J%sZVT{Wtey;<4F|+`rHO&?Fju651vtVWq`5cR)=$XY zv*-)LIO*l$V_xzZ!%Y@T6+Hp3;C;@01oe|F7L_O@15uJSDDYbuW8g?XrZzDJ&qstJup)ra1ht9;4bW>7O}#>@jlA$V(EzmX3P5>DOgXT*F&?uBY8^ zK}h%_2iT}DPE2Mo$j^qKA)1vSi35r;(g1NB?=eJQnWE z+WT#HPV)JJk5_GX3Fa{vFpE6Og^6I7I6od)ggYR7+lUmqJ1VfL(;&N|`WTPK?$vql zGHfHSf$gAy)Bt#fXA~%YAhhdL-I5&YbqUxuw*$ZkCYoDO1sooe@Y+v4R9VCAY&uXo zYI^kUvQjw#o#j#PugOd(X;xH=2n4DK%m$H_j&$~}k|u9%MATb0Uh8s;H30;E3c!C2 z(o+oE4uIV-*{1x-LaMRxsc&o~)gY<{J_F5}K+|BtA`-bnNV%`K^|Ux^;YFuas)1ZI z@wz7?kS@mXTJ-3ifpD2&n=KmQ<7^$z=jsL1rV!6@Au-6h$Ur5^ju*1(zJA-$=p^(f z2Lz00sqL|ouqTi`OGK-IAi}FcvDzRQd=0q}^hrd;u^=9SsG!6_(R}#U7=>6T1rW?HOHK!L&l}weq8k|NhNVg5L$2T4 z?8Nzm7~xBw+=>~O%@`nETBVD+sOEhI&0*`1QTIT0NQj`+QhOv`VJLxj{p>xd>r2>P zDy(!chizJFK*98pHg*%qoT7)8ZOv}z(UAedZ`A-NjXPXMmuf!o5Hadg6`oGwSr}6f z1kdrkPKe&M7(wn#3?;e~h00y}#AC04r}pC*&J0BM$eKFzd{b_Gad zTK#|$o`jT{n+BNWybnM>&_BFvT~OBXS74>HH%+xb8b<69gUMZ--mJDL&+`jg@7poR zP}E!}ZEmNi7@KWi$w316lq;AxWYiTm2_I{;qf%9ETs}cDupRd*w&DS3#d%A;12|Yj zM!CL_>bS;!>~}(XXqWi)tgKUay{D<=(69SgviY^(6L}si5B>lvn?zfTVTUA6=5OpD1Kv&S#^Nd|nEKECf<0KiI zw)doL<5AM?=7PvA5EZb2IKo4P=T|`9T)eBr0w9~OIuYX|;(<(f!ai1^cieT`Kn#PN zQkJFFyE{gNKFIOq4C%el%9GJ>2zg5jP1tUQk48yqfs#_ue|~>*QXWC6^^XoZFedaNi4D) z)Unh&BI7tnj9MrN?+Q?(Xvjae>2+ublEnS2IVZsa7LN8YE1Hc0UoY};fZe%%U8PQpG{RZ4MjeOHYfgB_&;GFAI(tvbj}KlaN8`X4#{SEU zxEsF2ua`G%IxQ63gbGC1dOa|LI%U*We>WtMZD%3dK}?RbG&{KtL;g|cPPCo~Omqst zcU^KVD-;#wzbXn3^Ax^@J?RuJnn+Ng?G#(hMc%9y%r3=fl0N`4jz&)vc`<>zpkB99Aj~I~jB$H9dHEfSbjVJuyP*LrbP7|M z=f7{TV+EvHwQv}au|Yg^F&LK^@9?x&*eaOnorE#XZoG$&%m`zU)(c(7l3vs znTsFy3*=`+HXA@DM3&VvdAl!5P8;k+wDKp(r36s2u#bK?L|!uS5!g?XC3-3n4l>vo zvoFhXEES5UM1z$j7kDqqiA@|>oer93V>>F+an_0$ga?&o{seIe!T4=Yk;Ry74&ecY zA{PRB2ngnGi+BchAZa^8D8VOQupPh$Uz=oTEy}Dr!*M^Z3Sq-?tBlj*)HL|uTt0RR z220b+oZRDz1{gM+CvF^K%{&Fb1&2=N2>bx{fD?7FFcMo-vz~hLadj@_mKtDOCxA!~ z%MA%7;<>yRwhZ#4X(=gD?WA8^ySiDWGz}nza<}ZqomBp@9r>$W>I0d2(~DeSwLw9= zWh`6^>$!%QY)#G1Je8b+Bc2bg0&kOreZQ+1>Rmmc0Us~E=g=!NUwp1ULp@o=1@Z}K z94S5|lms{jGX;ofkZ+xw2Eh8--=L3M=fAE*glrz0f-l-3Sc^f+iN_K0@Ri+;u@8Q@ zX+Y<-;;yH+eFE{jcNIjn5{oSs%J@!*#F=XIGKlLjgOt}*o9IqwL9RV;Ho z%4>NP_1{$>-n0BSPdyszi0n*=n)>J*T*f^ua6G!l4EMf2+UEo4l8o7UAc=}(;)o@Z z4zY-J!idkV2R<}~_}E>dDyFM<@ZqWZsRH509>|lVL5>Ltw>)v1bVNKC2XA4}$$ z;7d;Bk{B{qj+P;NaaT%kF&z^k?NoDWlGgSQ+bX{v*K&jy#F5 zC~p}Qq(IvMALQ|zG{_X8e-q4_jTj>gc(!N0(?P<`3Fuj~+;p_mRHb(}x$s#YWY@^U zOe6Q_>qe>wYTbzx#1rErS=fIz8B9$bN6KS z!9g9qJ>oF{?!`*)RtP=sbMTnV(|BEFVk%K4KCPSuzK-$fa+bqmBY+U;YVmqhkJ8j( zISNE?XQv&GPC-?$hQq6N+x46Bl;fK5)Q!9Xn8k23Wf{ijD6A6vN_5LrMvcP* zqsN}Wr=ZYX{j5WyF-{{-5da+nc{eQZA0{B*YQ5)#E_ICnBFcaz9cBhIQQ_Tg_)6qC zW42t=oO$6%syf9l^6-Vp&L8ML?LgSW)p%F|!2z^2MHeSEag+*ct|hx&y?al2sx!97 z_~k4@7U>c~JHlRKtyc?t0m58B96eT3(>-@c)WMj9FRJ%%VPD7^%XkbnodF*A)bf)2I9ap2YI3kt_Nkoc6uw}OBWLK;EJ zNR<*=2)!6W0-+Ni5UMj`rP*kqy^4Z>fP#SZkt))pOBd-~dXaJu!#Lu+^Ui(0|DEr9 z?!6D^c_8bYefB!*{MOq0?7G(9OC+uaxCFsD5Osk12!|2V(RY;dz=FxjcnVol3@@?0 z;l;(#!_Gwks({k9)AsOC!D@+lIBN-mDZ)y?th^zx;}~HhY>Bc0W2q8qT6iQ1jRQ6v zs0)K(dRr^0sbps@I8kL_1Fj2t~ur!`Tv;MuVzb=!mGH%gYJAn1v!EhBPuz@m( z0=$nfL{|WFL&>EwurRaciRJ3$)b9V;@Aw6tyhH7BAqq_&f=!&z8gT1_`E(Wd- z^DsbS^xd~B2O}$tnz|a%O4ZrviUHcjUBXh|9Y&(sP%Yp#ZYTpcZKMItz!I346Q;k)RtN#>aT@5KHO?h<>puQBltOHD7107~y zpR)wTT^XxQl~)nAy|QgK&@HDfNQ|qz8&V#DBUk`qaacXHHVGw<)Nlpn?XHW&k8 zM*};+RhAOog{rTCz+v>o4AkIgjHaQuB@viw)N@wWB~hKV^p$W*}9n2Iw7*fwvkpk#}qc*uF8$Vg3yF45gq;rGUpE5cLQz{L<)^Q5bY zakp02cW`vl1zPyJFg+(-Ln8$&u&4ZrhMm5Xfg)N7Y)HkpdSD4;te7g;=rS;)k9Wsd zLVWYBlY!kOFe{1`6>0CP zV5s4Qm%E}115AZv^t~>#XmLR(pd5@JuYuKJ4T}=bqEfYq%BAA z@^&~E7a1qAqa#rgaL)ak4F8_~U6kMRYm!NT+kBjzf+OB-%Okvsf()=s%2E;mS42Qj zVh9O@yb=TgIA=j9iUSjvNWjamJh0^u`HlZy0? z({E5(5KzDnmKaB-`Hh)V0&f=Tac4%gY3-aF$`U=Sf@Y_z^k+22dmJ4zW!THCl-x2_~@>}Wu zwQus@f&@t7@LR=B#svo$$rivs;DB$}zKi_bH~IDrJ8a{dz5cff+~U6@`+t6hyEVb# z4=?i&xb9X!3b-U3`pwJywj{sZ^`DslduLtUab&_}E1**ND-ZZcQPhtf@VD9inD0OH z$6EtV{0Wva;BU}z4P{41D?5V1);CLJ`~IIOj#fB3QIaEA6o|D$cE!87 zin!v)Rs>fU5eupa$r22agDX}Sdno~)>N<)!GmDuBH{>4LD`8|IoAAaPw)i3 z!D7H?Nz}#(2ne!W&;Rk3e*xroEOvaefM^ceId@$9+q^rf%Rln&xb_!$zbW|-4gP3w zTVnlXaFMNq|4EpOKbh37&F$J8{!bxsc5QCAo>Ta@Y6!53EyLKZ4|mjQyY<{(#uNIE z)gND--EXVpj_>FncC+K!Uwj|GaoV{og_DGr1_6y47AZ)v}0-3Dz(pupd1knO8L7(yTf zBKVIOi2tE-*{Wdv!Q=Zo{ew*Z%xd=`e@5hQ&v)VaTX_DQxC_^x5&7HmUAX=hoLdq8`lBEa;Gv4FqbzsIz|iOvV;zVd#0=U8f`C9c!0Rp=qolhP%vnWI{*()F(-!^x zSZoF2I|E0P$Q7+qr@mkRuP7G06WJ9A5UmB=4YdTKAOo~NK-;;yI&EG50?=$0wp%p) zo-LXT2nf(8w`i+vdMmOto5eQ$(-v)M?_desvn8{WrM=}AT?Wv%DQ*OSW>5#{n-mhk z9iW>5`kbAcJqe(f0h-O8fO7$X_8i>0?n=O01GE@GA0+GQ$OE(#2*h;IY6oqxgLWl& z0CIvr^1xy=VCKcz_0$Et;3*&kw8SYO@{%3F)m20b2yKlcTLOWn?VWHAR1j$Uowss< zj%{Ik3IG`aK_L(#;-Ucje;j|C_{Uv;Pi*OS`;Iy7-*iTIqUQUx?|Hvpb9@2i&IF_Y}$DKWX@Xm~Dp)TjaJ~0|e{S4G^2TDClTC8;D`D2DFFu0EodP7D%D{ zLvQNLdZ4Y6r_VRMZTA2Tr2qE+hkx`Tz$v{8$?DYBWqBRlQ+Qyj?iLM{iLHNoLHj{R zKx`lm5HIK~=mJOtBo0D?E`fdmDS}i%njl?}A;=7b2U&ycL1d6S$Q$%C=q4xtbPp5? zqJiQ-PeDnbG*AX82UGxh3#tHBgFb*-K%JmZph3_$=nH5O^p%c|j*;#V9V;CN9Ut9! zI$=6-Ite-%Iz>8lIvqMgx~p_nbPjZGbl!B==>q5;(9!4~(k40OSekTK!1>)jh=^|pB_vvL4TQEjb4}Dl-`QonckD$pFWsAg8m8p3;JyOxAfKY zE%cx0$LSXsKnw>MPB5Hi5MhvDkY~_jFk&DwkQsa#?lOciJYh&<$YZEvXkz%pFu}00 zXWt&yJ*W1F?76h(${y?<{2u2$zIy`q(Dppvlf9>GPt%^hJzw^0>^-!Xd#~_b$-OFj z4fa~?b>Dk)Z`j_1y;*z9_qOaE+`G7M-@X(31ok2KUD;>2&t{+3zQBDk`_lLQy02kh z|GouAMn(=sVMb|2O-3A}E8|VZNX8e8#f*)NgN(~e2blPn#F>`vvw(@7LXLv;XJ)5&P5jm+$Y| zKX>53finkC2ec264qQ7Bap2{FcL(|otQS+<18E2=kHiM=l>RJK}jH>`3O3 z`XduZnUC@xl|PC*>U%WmXztOrqYEsoED#n=7JHUJmSmPHmXTwO$M}ya99KxR2G+Bz@~n8)>#R>%%UK86_OS`Dsj%6w1+b;E)vA8itb-2B_cPRKEcD&!YP9%NQrNE|O7CEg4@1nj@_gT8^zz=UB0SS;)#oE46S--4IG*AYkr z8Igt=mMMfjrB-kXhBmyPgq4uKWP=2Ta)QTiR(p54;a{7|UCEH8Mmqw%nqzF<^ zrTV4MNaLg*OMj9%C398gUoxL$Ps`$DpU8gx>FiIIKPCJ$d|B|a&E*%Dr{u)s$Z}b7 zOY)NPKJvdRFeoT1+*PPkJf?_Mq$&0&ol&wTcv3|ID2{`JbbeG0?4F`=JO^~LF=0nYHEdecOt$gi$ z+FIIC+Cw@J9dDgV3@gSQlZ;u^mD3H;?ZjTdx?xN7j_8@_CFw2cE9gJa|6~9*@G+=1 zOf1jx*1^y7#L7)#R&d zI8EFW+=7LQMYP2iygWV}KW_Px^l)r&5_Y=j^vPM$In?`X8bnWTMc#{C zqgm5hqU55|qq(E+L@&iy#x%zM6q^>u6BiJ-`Y+PIK0a1{oc)CVNm%^8cuM@xQ@y8^ z&m^8DC2%GLB&;VoBz}6X^SmqxnUs{wog9)vpW>D>`oiSJhg5~sH)$eikJC@22fPHm zbbC4W>guc347H4sOo`02*XLhHXR&78&8EwyW`D`C&iVAl@J&OmYHms1rM#?s(fq`M z(*;q5#|uM>_80jVZ5DeLFZ}BC>%?2DxBVsNC7q=PrOjp9Wp(9hS(W=<;(bmvqB^?)(7peaLH&YA9-yZG79L&{WZ^(p=r5 z(bCY0ZT;A0()Q`2<;RhByY`t5O2^mEYh8Q0?sgyT4(s9WdD1J`oBj#$sjyF>ujVu6 zb7w!ke|*4YU~SNU=+IEuFyC;}i1(bq2j^*bo5-XLf`m4iV-Pah`BGv`h^ET8r zx;E`MH#et1hksj@0J8iQXbaG7c7ptY?!|w7(0@M|{y2WmO;1M$qym3`B>cC;=C2?Y zrahmT&N9%kfaqE17+B~w%RtjW^M>Jf-dhb9;9%Z=fN3A&-aQP!vq1FQiQ6e45F_*6 zeM~^ge!8PTvuGbZh=HDonQ0%>-o11nI(mjZd-pLiu^eM&-G7>m5}xCM;yiOat3@v? z8)*PJdxG7)O@iaHcoX*IZS8Z-q55y$smMXkKOeza0A7oAS$^Zdu!rd=)BZgNm_ZC% z3|aQAX11a=YFMPL_!T?BR!*hOF$fn5Z45!gjw z7lB;_b`jV`U>AX11a=YFMPL_!T?BR!*hOF$fn5Z45!gjw7lB;_b`jV`U>AX11a=YF zMPL_!T?BR!*hS!f2LkESDIsYgD+Y7=Tuz&yHBmpa;#NL(%s~1m`$Ffs!N!HT$td3R zIqoR2p_b+caJw{x}4QU}I5H$kbF3ZvSJi;DAo)nZm;udfKa zmo$Hp}wdQ=a&|Fqm-I94PN3W1{VMPrBG7RV18A?KBDw+kZJJy3%<*K zo1kHMR1WomCf-0a>$2UO> zejCtD&_`Z#zs0z<-i^qm(oN7N=#uQ$H=CfDz^^y_*3CCTft#R3#_-$!nXOY?BJAO}P?<`DL${t;=%v`Q7 zvzJc471gfN-*=d+H>Q0S?CmDq^kowyxG`1NUA=5}>-v}2!%2yWA4c0gjN(F+6ZN=b z1RV{z+p5WwOdsA5|0hDF+)fpcQtq>Ssyv5Vc>l$BBXg3oCp2v+d$LmYW{aDtBL_9| zBLy8GV0H8D)tQs4&@OY!*%iAWTQ6?68!^mhrB$=69;lr6$Db@YqNgbk)$Br<iEy>KFwjC^X~DC8*Fx%JrV8k&uIS z96W0NuqpLPUVU~KF58$W!-ss8T{vf*M_&?MG>>OZl1=Q|NzXNzAMbA#WBsV_e;Uq3 zdo<)fmD|xs{jRW~TX| z-=(Zw2S)7&MOrajO3w@ho8N>z{cyjU z`^u-vqaN6ZgqZQFzQi_tr5>A_Ws|I`3B`A}X+kk?v?)>U{AY+4A_9%|qEbn#sS<<2 z>*tg@1PIzAE|m`a`0RVH_1<6m-%*eOo(vDYw0j($&xe(&zo&#pyzElMz0;3OIfUqk z+~{->9~NEckmw9-;XF2$x8eDW`Nf67$pjkwv8rL=3#nH$v5=cHxhBY7-!rB)hFt|W zYSz0_VOWY_S_=G-w855=!BQ?^TqD+{Yin;=d}{V`cFKX*n;lN*^twEvrDJuufS%v$C`8{SX;uts?E& z{JaW&MTt5X#zNygq@PmB@fr<~l zJ)0Vvm6VtRdY?&m(vko>u%VHH?n`AJT`@1V6(+tYU(G{U2NJzlM(mZ$f3#`R^&J-b z(eazfj&At)-Y>2Q4qXkY;p=W+BJ?LNdqKY1r7sLWT4i6n>r?AHzX_5lzS7&Tth%l| zbYyDcYsO5|nsmf^w*Kned!GYe6=jBsJ%3cOPrJwH25*gTr|>#;Q0B(^lQgt*f z9Pfn_23bs5gN`exYZ3+Se?4+(en&Y2E$3YIVl64u|J*eVr!d}wa9dSKcDJ6W1ZNSg z2huNS6@DZydR&x_DY|q3|EOlbAzfU5e(=U6TbrgT&3Zi#HPslEfsgLSZpd3cZYf@c zc`L?|wZsK@Ens)Yews1#vhC&cj^@I55<*H^xX8|=+YUj&%RX@0h7-?^0{r0C^sG};Z(;J z+hp31#rSzb(0jRY!{$tn5uLoeGLtIivqr~Hb7}`RmazEa1srbedlOllr#l`M|ID;* zRNFHJLyig)3}IHlz%e(fUtIiUe{wnjv`>1%bScSZYxS&wT}4Y#v?beaB9 zq4tS86xw6{Pb>6Mk#w&cFZP40uU7wB%b|zz13~gey{<8LJ8lf7X8UP(iDerf&Y|UG zzw0y{5E&sjwR6G;9u#t7pN2g>E%l(5shY_g+XP+ZPmFBHQggAwyf@D!F62f;KAB7& z3V5X61XZtvH$kAR5DB};n>H<-?vohL=6;(zi|4U5>Uh?X(vMO{{`I34cAhcF)_Vo4 z*(_v^u|7zo#ieq=|4YXTRo=?UycLs5TINLo{eIj{|uBOc}P6VTr zy2x|o1;utl#a=qD9}3W+%QR_)TW1n<_fdIg{gM_(>tjON^W-axc{cd2c}~ZyDZUGf zNO|AdoQt73&o;zejj~vTpQFv0_jCIb%MA@$!r1!4atiX}I{lgxa;ay+M za2aHxYe!n_T_@1mtSGx@2J=$9QlUeF>*w7ndiP@U&c?4^Nfzu`Cl1*n^`eMG@$AI? zFW1IaW+pLJEbSFuC$a7A_F{~U%PtWsm(sgp5?llhO;KZI2a05CI)}5+=?u>M*_S(4 zkH*HRx(PNvNKKIEy7xLor(^N`P>ikGxN3{Ylwfnb4wb)je05()A*T%fr?%O}IU^aH zt_Dhra}XRO^QZ|6Wx*bAf?$s;VAadDS^4aWEEe?^P=SRQ#W8`C5u2b}0z?!)LQUUM zU33yJeOc1DO!{6T$?A4zCW1XLUC1^Y67@N6Ns!bADV@x2C2PV}o?EzJNsZP0Nobu^ zRfC$)f>5g<1I<1a6U)BtsS`5?Wb-gseen}x0g<*3tIdoiTvOE-ZQ|`y9{MYE<(QPY zI-yq)@fshKR;~PV$15I=gqI??Ldd0i~!xgrm-Wf0oP>0;QWzgj>x>FkL|rF zre3bSCkHnqgIBqZT+o);A>Mx2*H3%}z5#1@hC`|gOfn8X?h)+Kj2_6ZDM9r1whk7i z`lbrmCkAnJBGPd!IZ|%W*q$IN7nmw0#0YiS~j*roy}iY0_-i z)oSR6*a7>*l}wfqRcdri`<4{n4z^cIIr+v1yv>azu|F5nj%Og*y8{OTY>=!N+6jbK z?FhH2mGgN)Z&8tHu+2m`oTM97EuwbGCiY5Y6)gLBvlZD>Kg;*@5NYAHf~EKzq+a^K z%AMe{GVj=kh@s>+m0|o+y)PEo+MAMMGFMfL55YD;YK=F}>Rkx_2@t`{48GoP%_rh! zUY&iAlKwfmt#-;iR3^;NSTj2W``UPA*7d?SNwrv)h`mn^pg`40!jhF6z)zkX^Qw%YGmu#yqGb_kMI+=*GRWy<$m!&`lpeWvqV zqs#gesI|HgGx2WZR*U;>Sxe{li2m?ck-@K4@UI;Y6K;IAOD}5}JBKCh-mLGr#zT0YI@A=)jh&OXvRR%wWo+?=9EO6f7xgyCULXgk&eD9F<#>Pg9$Yjcbpmq{|ly;No?jzWe53Ov_V5}_c*#uzsfAu%Uc{Rf>f`$@ysK5wVrtI5Q&Yn^sB7LI{ON1 zJzuy-t|gCr0j3}hRplP(Z(m%TTJ2@DZlv4dJ}V1iwDTmb$D7ivPPplhw#h4do6Tt! z@(p&Yjk!ni@Kv;%M|Vz-+J1PVyX8j|I0Dj*iZfCQ_&&yBX6uea-KcYI`Ek}wJ$j{% z?02BD>@qLJ{Y^`bY~8vyX1$fSRsNP&efB~<>i%+eN=KdSo6676TT;&pTa)A1j0cxQ zG*VSV!46~5?5 zn!RaIOu(z~G-^@;ZP*eoQcce66=+U=kCn+-=aSBnsPR4g$eqY}E;&Z{+Lk20AL3dI zrjw3q)}GfWYBA0$%(I*h%G5VaZ|eMPhqG^S%yjRU)QfVrQZ>p-GOBus7kgQ)_aM6A z0g}4EX}JQb1SyDRcF^32b1J^lo$`9#ZNGSfJEVO@aV4tF!ip(!1Z)1wotQ#S!C*^{ zG^^qQH?{VNX!}|N%p|FuH(E)${gL~5y>oylj9LBWJ&2!Y+puf-S1WBc1Z%x}hN+lQ ztA*EJtpWFE#c=|1*S^X8+wZ{vpRu^ty$lPcpVK?0w2TFG(xExN?KK?&5sf3hMNbjYsoyi85- zZ6AG)>x;_V@eU~J=N|KHpeL3jX>G>;ehtn0ME*WTh(Q2sa5&Mf8?~^1!jY3O(=zGi zlju`V9zJeKOq3FVn&7J1ql4>H>j`Eyt~fWDe50{`W~x+%8n~a^wCwz?uwxZSpI?2J ztEQI@z+%kGol%`A8}VEkb)<$clF(g)ci=sCCaPIUHYHc-lJn(`MWsSnY$5UaLMRrF z=}btfkQP;$EQ^PTiG2b!)^|T23$ARf*HD+~&+ixdoIO=HP1PVj!%^jIy@O?cDlEC0 z<%`PB53`o92*V#p*RAVR?h7fOBg;85Kjy$`bvq(^1q-_jbMG~!+?|y~7)3|7um-`+ z?~dpC;&T+;%4x+xM5p#FF$Z6zg4p})qDseml5ICMSlCvbdBBQS+e8ree!%;mJ7H@E zioLt^i51&=*?VuYde`L(>2Y#TYq4G^+;lDESGrDKnxA#sPrms)*j2X=4ZZ9IP1DLN?mDY6L(0lC z+4{qXud7D$7eWDNz+1g2WS+KHq6X=9E4bLimr z)mB`#$?cSm_kxr}y+-p~xU)9qJc_x* zFLXO1BBFe$nkf8!NMy)r29Z2f60BrsHp5K_9AX`CkG?(X)Y=jS9$Lo?YhDqFM? zW|C#9H(r{_BV@%q9F(+JJ_bcxs4G$YP*Lf5xHh#6*3C(#Js@GC+Fv(3ypiXweo; zxj1{h+L(70>6ahfojiJbOBCsJ&W)MZN5b;b2Rrv&(x1_=9a_5dK2A+GHL+7UxkF@a zMUw5C$lJeGXQy@76PEdsr;q!#k$-8I45h~8FV+!^`JuTB(@|OwVA>}Alrt~ z#6|KvXoue^?RnIXb;Ib?H$)jwj>Pk5AZnc5o9UJq4ag zX{}ElEN-kkD{|m@WmK*CWYTJuziF{ABy)zZF-cdz0ptYTQ3~rz8k5<5iFwMqRD0Zr(~(7QK`7ZHS*l;l^o`~ z*;RHOCzKZ1;=O_kU#7T(gj+YdJTz`v!`)7Cku!Rgc;4uE>J+Id{bK3c9_TcZ5kA`N z8aE%r1@R|lgtovs3)S&Av~?BD4lkUnmz%)oovejpOj%)de1;9=ygKu@JqtNWYqZaZ zrsdDn{>Bo@bNTjZ_x|ST)ck#VZ9KnH9o~{CSvHj{#cqoppV8MHhzJ~DyRaXint(8pAhXMYPEYuAEK6f%?E0PtSssbOu|#gC zi2PudAl;^SfzbTa7X#xF0T@azT-S5L@8OE}sHgbAx>{pYbFo`Z=ckwJ2PcDK7MdHY zHHtdldf)mN?pa_{^*I^Ht7#7rN3+*qEKz+y#!07{JSt?4`df6*b=mdpiwTde!&6^N zrZ&|A0h!l*Z{!2RoId*reK}8T*@Z@$LW@Hj?k0t3JiomrEWB#&m7cF8KyF24Hk12} z!Vjf)8x6heHf1Z56=W|G#l239OH9wX%;pZ$;iq$ZD8uocLRM57= zge<_}IRMP*E#B8!7mXFTO@vl8GmQ2dk=zB6n zaP3Njrt~!gy>bxXwpyO!5}Q<#n5(~tZhx-z*j6qmD~nTav2{M_Lr%_P4OQ3$t@v|- zjqysM5^5TuLb`+g8Pyk0Gvkgh3FjpzrzNH3My6SDM0P@<)llh20W3G)4fv(Z?ljnc zl1@l0qWhXVl2dI)UAs}9wh0>J>9-$TDN-x0iCI-gJ~#Jr=Op3*kab|>!jrA0bkJJkMm7mmGT%CK8~d~rQHl(E*y&Ul&#JS zZ=M#Hlnu%#M&?^6n!Du1k*xYcsyG%o3LF&yO@G+vV zsE+}GDc_$L1d=TpKK?NC^~-l=`1DCT@r<@84lfrgXSt^HA}?k!d9;$DRFrj(n!V1` zjOHLz!Ymqgnvbb`_Q^t2xKNfuo=v_IP|e?=IS-5~U&Pmj2(Qy@Zr_QB7P!B5BxMb> zFF1C**EYT`Hm;)z2@M*zflrT1-%O>5rn zv*cJqW~t5t^SAz|_tVBhb9vD-N-+b~+6_$$HLuMo&N8hi#s;O#u(Z>>4|OEQrevv4 zsu@Sdu4sg#Y!bP`gi2T7_KB<7JkJdw?`jLaK@GUkS6|BVGCvd^=DE^@b{B@LTXEPf zb+uRN=`9dx9SP$FYQ|3mhKdSOrR2U?U_`} z*oU9!R^bp18;MTuT01kPurpHyi>;AHVfx~DhcuFxCdtv!2Y$h*HC?kEJ@mjZ9wzl_ z=GI&G_u!Ao^Mj*lcZ${VuzsEk!8Mf^m3mD0rj=eu8fYqKtPQtpfEYSv(xvdn^JhvUz{5S#v_`vsAQN&1nU zz!00CTew30WPijm&BrJ-)vZYjw673ocUXac@_o9FUETkoS*?8f5?8~9MRQRuRmyrp z@cmjxFI6p@rSr@W5BTwdk{xdR**?4xcv2Ouyzi2!Hgrg6P4c690LQh5`6hXv`@cF3jLA)KYaH8 z`;H|0#bL7~zcPWmzUC>-68vy}k7SbltJw`nM04S@$+`f)8mSx4XDJAlAfbB?d91Ei zYt@@7S489Z=?zwjn5tw!Q>|aAB5g>MhRoyTk`6hD*(`h&d(!)l`Qa&@XxCaAmC`dX ze1`#ge?@QbW1+h5g9^BxK%y>oS>TyW3mWNn_6x{Bt^3)ex8(GgbgFZjm&nW^)-1^) zwVSiLQvwf6e54lxKeR7rp4Q>pYnXxbIxL>HukqN*v$^4+Ikmn%sp!nsC9+gXpU9-S zh_V`{!4X4CJo5evbXBTWIyg{U*DNK=LM)clks~WTi#7u$7mSM48`jc{{0_R}J7H0D3+}Wj?IV&B;3>Y`3iq9 zB}=|^yj|)>ZEbnt1v1h7d@?3K>_zy=4XH9sP2+xbI7!$;H!O`cW@QXtBTE~F#H$crzaclNODT`JgWz&n-Wxsr`bEKa*sMdn1mYs0>Yc1|egh%U@$tCN~b`m6K0vIS0_jnM`PziqHDSh@sP#FTG;8~6g?GhJd?+A#SuzO!kA>}`v^irQ5N_Z8#GxmdW?y-+rcA+|h)tgyE`&A)vldj1 zbvrb<%d|~~LA#96v6Uw13MplcvA~53nj(ivEy^qxqo-e{3(#2GuL``(d)5c%`dDJE zKAu`OW?ClwIY-IeE0e>A^{lSKyimv^;>(zPd*kFNS3Gx1&)w0OP~-ONTJ_UuF=3JM z0%-m5V85!wrijQmxoClmYi6XS1ZmZkV^bS(C$;(x7xxV>HqSUUOH84AEnh#@Vf`wU z%UvmCiR3<^c2*8p@H8igo0uG$RqK~ucSLGBEa_|<9o5B1){IF$TP}Up=eW$}A~l0X z+1Tr&p&z5Nu-QKDK&ue%;}(!9!}zu%F>1eaoW=_ap9@nGM;sU4EEsnW=f=Uid#+~C z#taE5hvX7oRW_BP=*Uf^wWnHNU1ow-7cmPA%dj(UE z-LTOWL@OQBd+61;D40M?6^tKFVk&t(=b_25{`5TUP&g`1! zR7okSENV!;M1>Gldi7T`tNAERDZ-rZ;a7aj2_d&WEvqqwP(ANE_39*~MCHUbzpkm- zP{(39Qh?F#GjE>EucAUqv%;$#E1ua{KoOIsi46(q8jz5o7gkM2JcgUvvf7qYW!>6c zcnk+>qUY`Hzi{`;AgYzC281e0KQGG|RJ5fesc6=6SUx}%mtj+yX~%S)N%inb#gy?T z73g*aV29_&5euojwR{VxQ|hlj46s#d8qD z!~)NL8d4oe>vnM%KqCbs@7xLG=SQfkYkZ7|HLz!aKmy6K-OC_4(@l_;xrf)yLfK1- zc?(`n<2eH46JDxiq+GAmM57Kj6SFgmv4hEq8Ek#}MqLTkGf z?~-sJIycdjuZ`Z!ZFMi*N`Hp(7!FR}0+(EqEKTO8FYvBd{LxHnrfY13Oj!a<#_^;A2Cn5UHL_3;Ri%t>_F7h`@cg} zv#`Gn+{YLtYvyXc$k?UnCEMHKKH=yKt*%M@)ntBDW+}v^*q_&Ko!a2{kU~wXTn`qHqjPC``n5-zym6G8xiG8rs$15u}%=ME9(#JtDz-I zWgk6$;794Frr*Ra`W3&P{@Al-f8?J+Alz&o*#qx0TV5=_n-`ztR{F?Q9XPPHbE5cxMzLVX+?4GrDT=k zKMag4GgtDOJ;GI8Je-qm*dWDzBM0lt{_G|z%Pr;j_KErX2YxWwOFK;V>OW+%27XQB zd9>o^0{X5+A4WU$yh5BVCE&@W9b=uM@_dh~+jW~L(Fv(8MukJ7hIV5rUd{ouR0*{s z9G0<1LrR%)F?UU*>zwkv=eQ!{YK&@$mS)NYy0tq#vKK5;iRRkj`QEO=YvQI%qB;xx@v%9U&9 z;eCT6Ue!ywNfx10t==#tlA>hpNbZ?3D#RijIC6b(;M?@TLZjtHrVx2vR3&*nlyNcyqm zULU(Fdr}4F}q~*9~4?ZU;9KX@QU@y~@HCUJzJQA6V0ZAKXw6<-#9=B8xe1 zv`4%*&anxu={Gfht2swFZrqy&P6j@(*xb~ZsY;>#vn~Vv^Ydz^$UqV%EXD|H8P*ZU zZPW20yN6XPj3qGEFfk0O1|#~4Lgju7R(AAxGvlZf%6}%*Ycj$Ao zYkUXKGL^`V5(R!P;E5=$O63~KE*$S$|N3GRL@JybT-uOXSX;2`&rf!H;pP6y{zPnV zr^)ABM#ayQL#>PEOdg%h1s`3bY6e4@Dh!lM8mBs}{hnCMLHyl(Fe!`-Zbtl3wBspA zu@a$IUQi-F=LY+eJ8|}CP1DqoHhYcgImpLknpI1nkD%JLzRzTu#jm~nFS|>|V5 zPS|MY6!u66&2EAeyD!?~IL;cMbxyEvHx0mcibLgC<=8G*y1i$alanENzw-a0w6ehY z0g6beaX670@qXw_WB}@2!a`E4jm2cLeOH#IgLSdKjdOc!m1C<#^6|Y6k7`*Zd;FvM4s7CsM@U7M}2DF$6o&e|v5MntSuzn&OXxBuc+ z&TfIIJ=)_sX|CCFVbpR;p@k(ovR&65zl=XQnV-s;q5jX0bRXpz!;W{C`O>;?XN(t3 z|7sFaMUCo_XwBsXFl={=RuWee2^W0zc?3_)s&0y%Lh7}^tA=C!_|D;U4CMR#O;IJH zFKE;3?mDUCOOfxSzg77UEDV{j;{R3ka z9;taPceK%Gnm5;vNveHy?#U+TrOaoq_Kl6EV!YQ(tQkRuemGIJvCw;P!tv@dt3PV` z$gRS*SKPg2+_u#pU+mK;Jn$my2v?O6k=^B0>42y`?tpPX7a`5Y2yTP9l^Of=eqiyQ ztDo0LKR7yM&y8Jr6_JbXT&4IyLX-0>ENElZ-D%A&Ktu6v!kvgaoh+A()AZJe8QF8X zW#vGHr>ijM`b6MJ$?8}7uh)Pzf74m(8>7=#UTW1+Y-3@uh}<_>K|=!CsqW^|@1pkd zaXfvHR$S@XQe^J(zN6mE+zQ@u=|X!0O>D7+RNW6lPQL5&-I!sA&id3hK{@iyyb#J~ zVKaE*b-Xth){)@U*+5&x@I6$otGq6qOj@;v)a6HG;AiG6G!Rx_Wv5)v; z#hWI08pgm$=1&4E*2eWF@GMYZ{h>ok4$ZN91fyOlbHYJMDip`%Ix)1~kwAQ>@?=NW?IW+!X%AdH7CZ zyj0AILO*YyPP=bJLX^l>1E6!tRjid2uRTGngGhvT1)J~R&@55Y^I$5RtAv538q{&}-RK&xuy()X6 zO=8iC+h#DCXt26;-6+jD1?v7GT3Veih%`1jMkTm8Qk4q}X|btUhQgQ!)1e6U8!wug z0{O$(Pav1v5&F9ECw-4gz8-#H?aktUb>8HYIisjHVyrurFCKEUCM(bC1I>b8AcytX zT1EbgvVM-Jo-tF7O0zGwQrvm;vTyLVnmc%Our|e}oxShTdzZ3`%xFr1n-g3jiW;AG zj8jFqj(CB|yYrBqJfZ5TeFZQv{|60Rmxq6S2>6H+Os*Yx?y1wEgp;&bol=g|Bh z&nA-Sx6ucb5##g3-D@{v3oJnZVMgN-C_%YFQXgWaW(o_^d)7O<&dVwQKdoohhZMz8 z+Z}6V>AKeu!(uwu=;GK;s#v~K zi)LVx-GUoohB*K2zXPtvf8p^zK2a;4aCm1)d{Qn{fghi^ryYQc(ED8@EMq6JRLDjb z9-`xeo=vj&bHSG-drtp;%AN?;CI|6F;7OO;is1YCoyfAWUMh*LzI|YSYQwK>NbI%^ zZwP=cLQRa^CpZC)6C8DKef1T(wF$-rMV8+H+pbQ2<2m873Q^^+_-qf2X!xg8uj$n{ z;G=d2-0q+m*_0b@El7RR)MLpCm!eNiv}6F)(9n~Ly=Ak)IO{Le|sdtNcHxIZ4vS1unEP7!i}IyI;Z|ZKEBy(MOMO1vC_btg?8V)?@n#Kl}Ry& z*AyGWDznF#t3yFBo#ZY*vF>U&xBE+jPpz)m$FABJ6gcR$k%i`s)%1fDd>}qs-WI|^ zpv3Y;v%a79h-Lo?Jh-XCy$E2Yln!0DpK6;uGS*ora}oypEtRS*_O5**@=eSSj#eqT zaF}Jdd3cZa+ml5Fz8(o{JhA>F5a(m%D13}`-=r#* z0+pH7$hn0=-W}!%d=ei~4eD@d;{&S(98?4z4ftw zdALp00IX-$jnN5<>Q50ya+-55VEE0aSJuqWSJiZ`4a4OvN@C+j>)r^v`Sf-Y(t|_0 zgWExIV4sRSS35#(8whD;eH7P663};C&&HMNU}At?XT_iZ^)DT5k6tY zOH6#r5?jnZQ;q){y7M-3!;OQZS~~dk(vYOukDF3$VP>ZbKXnces7C$eg-ZK&%awg< zVNO2UbZf>+LazOuO1xMY?$D#aZ1P@maW6by&k!V`z_d$Ba3Vc7Fndw=MI}f0Ig&F-J>HR05j^nqG4R>ek$}SvcKUd%O^Vq;0O1FJLqg3#Pu5f0n)=h?#2AI z#%d=$vF6zMi(dp3?Z+3AXpMiTtse@W6r_6E0mR|h2VVrbPbR#cT>FIk6Zj)b>|bPL zPUWe$-cEbj>076R(o-P#tG~(xa#>_-`xk-EBHgl`0D;Tu4P#9ekl%Fe{PPBOxug<$ zWQ3Yt_VZH;60{Z*OASLE9hif0+4lvsMeb}ROT8dTc^#K`OGFAin#sL*9ta*en6@D0 z4Ec+%D>9@88bS#|EUF{TcDBIBN8cz@1SYJ|Utm@UPcc-t((k7^OtU;a@VDb}R68|4 z*)UMKC#@netp{q z?N?`hZf6@@zF`hWj!#aN26>u>^_;!$uMcTQ!}l~zXbtd?%V!O`1~YWKge9RE!>fCkvDaf|Z%dY`FR?6n7KhAQoNO@H8QaXq=gYA` zs%>NW6aHaf&1G^oa$CJ3JgdEHWvy?%bywE2LuvadVjhp2$AQ5L1PMdfn zF*yODijaPFuQfI{LG}%?X%=`PQVWS8kl*)xLWd6^aS(^hWX-eY9|yZuw36Ot)_+*o zU=Pg^a!{ksJyHFox6&7_3F#=`1SIUOWhnGEK4;tbhIeVf68tnf%wTwH*FV(JB`L8R zhKyS*A+!!!n|S8P$!EyPxVX67=2wQUIj%aEL#-W%zOP?5I~U}=Wm9b=hOEr8qcq#A z<>6~0Qs}MO2b02uuCM>xenm~*wPD-s7ADZ6FM2xmB`0hd=)9tnlrLCWN6)2IjG5bT zq^%qfwe|BFR(V^=nCUuBG`_B%B!;JSj#I?qA*dWTN}$&U1Vu=j`n+bszQ)GDCmNf29!SMxPVqXq>M>QB!7e?aX4lm83Uei`xq57Z8Rvqz2`3>Rbt#WkTB zKY8XF)%Q*uxr2|2Yj02b+~{Z>TppsLOYpx6s4W737tPQ!eEH?lPd2ae9aTa`xXIhs z3;ErhGX|Sxu=(MmE{C$D(eDI8ChELd0hgWrKCzdWeEvOhj39lp%=5^sJGHWTk@7jFSY&vsBe`^`u9KocHS%e2z(^ljvvsvX@MS5mt| zenG@55aocnZVo_zcXP_lyhD33&H$O#BE)c`SFiRxcqdPW)F04R_p${qg!&#uJcbtN za1}L2Ct`$eVR%X35m3TSWK)>3kB+3Vprs*Vw#W4jtBajcijOXNSg4@LDo?t^*Z4Tg z8{AMV*8B8OS;(vWc(7|DZj3jCd(|c>@{SFPN1u5PpUU_Jt zPDuu5BzDgFtnc{l>60=4I$)cqTD5CjsCtf`+cl+oF`r|UQ}xno6Xa?>&ijXiW!Gnz z9o9SVL(xz|@P0TbDDtuSN2IMH9FyrbY-e8i#LAmRR-k*wAyV*nh%$H=V4>f9YtQiG z`TOy#pj{*}T#lPN{lT_5;-A3v^R+wE{HZmkpHwy;Vys*mR#oha7pg1kr;?0&ohByG zS)mrBThFH>mgnu0+HZ~4Tyjw`Hwx7TfMw|52p7mG=MX^!ySCd3L%;NI1 zGd7cQRdM?rw)*7ZH0Gw`vla+NnLjOT&Ep71%xgtB$|n3HxW)7V;;R zLl(9~uGf7LcpsEV&zwKF_eJ1A^4=cb*2l}K$SBcRTK`Xh<$HiHo~ZlBiAT+uC4?n1 zM}Ir4G$JwgkjAE)ZYDX+ykCD?wiPY(`G32+0&@V|*0I?1kq~@b*Vg^RvgCB`>_M+_ zeUGfy$%(h!7<+kuNNIYrFQA1OH0Oyg3bGO8CbL>`t?4~{1mM@*TXwRl|G0Rn-gP`b zi8XeN{+{&fKd=9_Ln!Mc-Qn|T>sDUIi=u2wAE9CVNT0A(EfHLAh}&oIozrC2z5^&x zERj!EtBFfNAE`4-FW+1%A4c~PH;$+KSe|kXBb(Qq##oa>6p;orOLQ~YXTPOt|B|a> zgnPx|*=c3+^jK8c=A7dXq@-p?uG3KA`R9e|?#T~oE?_Gp!yW-`;YTM+VAG zV%Kw9dc7S{jGXyo{1WGN9^aE~R1@brx9CLNVZHhopQe8`X+kk#OZTjvJ|>HwS=1as zlhC^iHZQzOse``z^~{ez5G+CKpDlUkmuJ0u>0NrYRJBjjfR1_>)pm}0MQQHvKzmlX zcyYK$+xu3FpRSfBd_L6idy7}_G26KeaJQNfV};I;o{-p1ne?Ozi8(kaeqQU*?@OC= z!Gmx~X1Q_2Z6Gc84=@los@2Hu4Pj&S!j@WJX{8N_hi=DyC8MZ-z4cu#7z+twsj^1#?BLB$@&62Vq@I>nE*W1f))2`R@}`KQH2N&G+LW zlR8tCJI{;qY~2#vIk2eH3odzPP-{%3p}@DlIWFs2&$Q=0nY%Z%;CtGkH|n+PfVE^$ z^|9K)9WmYy_Qiv20#VIUT_#O3uHdSY+ay8dXD+-M)j@qj=iByyW0OAX5r>`LHt>4C zT74J^BZD0VTbKr$`0sdHxgk4Jo1szq-~UnY2Wl7*HTKb!Km#_`Ea@-G`m^X_Ev&pafZ3t`vqm> zf%x6J+$Nx#{UXT=%670Yz1Hf_gql3T%mE52Ui}cooI6B0fa)*dW~&-X2wDl{i|{gz zdh3MS%{rdY>lv(IbA$R)ZLb|O#WqJ+reoRuJH>H3ixF^&zNQir?ynCY)gm|k+?evqcgTEs>l)QT)!rrckx5XJRptUa9sZV7cQQE0HC8N5MA*y{5RJGX6=@XJ3Z)Zffb?w**07!N)!&q{j2UaR1oy~Lwujmv9q z>PR%5=G7s$h6#By;jX!DC>wRoY2Iy?UA^+GTOp)sdyG|d(U^jhkI`U%I1!0IBKaFK zt)5apmzzRoE5TB=%yB)rqF7wE$cs4de!83Rpw#zqa^Qz@DVgVW zqg*%UR=4%3+N_si=Kh}HoEc<9sk-6Jn?O&g1>$Pf;?O<;Z8x$xd|NZoi8TOS4V%ZV?3w z-p%(8$d~iWAaejz@+*-2YEGMlZteRx*WgGH8r?qZDbNyhKPQaXlbaoBQ_v4~=VTV|)-IeU>>BSKT`)R*`#bH_z&-VbW zog}TC)Kt!(c!juz`S`j~ZqV;+u-5}h0+0oT15Fs7#R`&m|8*P&@e2H4 z$DOaVM)JG2Kv^0m=E%Gtsw0x;TMd*LKh@R$@NZL5|2w>P>GYglXIg?B;`zu{&FYng zQkN~Uo?U-Xh)+`MRM|+j5&OWT#Oh{{WjghhmL$SQ2gN7%DL=G+hesBidjyKu8ue`V z2l*(Z<<~JNw85v>tc0LI<*N-~!GaQ4P%F^YtD-%<-+d9dO9pU^D_L=Xas=V$*g2fr zhn0VnyOjKboRcf;wQ=43lJ>23DXCRI zR${IEhgO!~O|Iz_gUrpThP$aA%DY3%5Zff$DxyEPK7Bh-7W&V5D)7~iV`4<}3fCxwTyucl^{?)azfPoJ(O z_I_yBe(CC?Ut(q7XhnMUHAep>=l}UNgZ#q_5pNpq9SGM)-1n2oc*qRd;Y#P&9#W&&by70j zNAS8sf*|+ua)Ore60V1}Dav>tvF@a+Fp_&O1ZgNyy@5c#FrNp+>-(Jj);)p}0RtKt3CpRbM zWgri1z))?6ctxh@r5-pjaXT+uR~b(p2%In5i#P&6n-_J7^@{rg+tanMzw4^8FL(FB zM*A}lyPDbnW9U7<%~WpCd%g8a_B;>OH?>;4P&y?VQZUme>9Hr@Z6=7){g#kXP&k!G z8~q|+KrFp1nac<*b-vndZ8hR)M8I1MqkbD zO-$O&=!gW&Cicn7$(qlcm?I{3>uJwIie}UrtOP>{y|buCfD+8@jC;-0pIc5}JMzG0 z%oXtrC&R(TY}_&H2;()lTH-*ylb@$g&XF1V*zy+xtia%r*aY_t(B$g6mS+TE z)j(}m#4{Rh%Y8n}Z2A43Cu*D-a!IYa4PV#ThOTA{8Q(%ZLqEf(fp#aqzNy?$^?MY+ z^HQnwr=t}ZoFbBUiNX19VFJZuF(Ed$1VDuXAZ7@34m75kX`q#{K!$8khN|dNRGBAcGBjRHZ+t1H9FeA zD+)_%Dm1zZ$QioFSPl8%b+fZrvN@6KWt*_e!tR7Qm%iIqtzao6m7IM#Wu+P&UYUtH`rcfq>| ztr;uo8!PxI7|e3=71pLC-1~DYCu|n};*@-oi$3iC>e-eJ1+BLY zM`|6afluHUl>a?)_}?y{OgDx%eNHy&^`$pY4z({FG=Yd4Qumf~fYf12aF;cZ&%B!P zJ@fq1yhh(M<|q?D+dQ(1?EuCvDpZf0vzK^(uR@rbN1@h56W%vQ>wuh^xvbj5?+Vq7 z6a6nn6#Gt`C-;ew4W{?udNGi#edAlVOQ6qmI2ua;(c3t{Ta6czP57uj^m6h-_0e zfgYo)9Ov@vwC=YqKp;Q&Sn0{f72B^4fJsLX zJid<}#SuBU(xr{2>zDhD}n zr{hramI)A#Hbc+#)V(txWWO z5!lLe304GTnPMcoYT2SL8+&#tw-A9n^?RWt0GvGUXqNzG=Ax=@rOGE#F8J$v9Lz?^ z#cUOWDPII^uZX=^i9S#s;@UB~0>eZqg`wBC`1YiWnJWx4;U}%;R5EDQtTm`!f>s0& z8A9r-EYwkPE+ESJQIjXDYx&)4e;$%gU%$xflatsEMIOz*u$tma=d;(doMhFS5Iz$f z)4HpI(#3kQtLu7FE7^d~33$S7wbZv?Inf zWs&)zu9|VHJ>zus<)!{>P#6`Ln*}oy>Z83J3RvyU%sNo_mbtg%LQPF@);N`yg#bx5 zq4HMUwd5igWK&PnU;lNn@8$O7?(vX9zgO8#^4+4v7^B9brj=*RQb+3V9Yf`W!f2j} zK0JZt!4zd0y+bG=L_aV?*WssEz2_M@6FjrsNVOZUymuW}tun}Dm$~?Kc!>f<+TmYB zdMdts2`!d=%}x1f(^&y{FCR3-{pTR&{o8|RF!2vQ z^yK>~J%R~jetZ4R2lJSr$atql?S$cz#HJwW*rPICa#Oy&{C4N7V{XKjhQh{SazA>n z;|+eYoW3@*DUCVHg6$Yborc_>%_=#agSpGhst zdQVFyrS#E}?UQxMtz~+3+e@HvK{JB$>h+~j6ZPo$4_grN74b%z)h}EnOgElkZ_{t3 z9CUlGp^$c-dgoEEhraEMXfv|$?7hJJnWU*rrymD)PChXJjh?h#dxn4WXtu>QmQR7G zNzaVNwtDXHr^-V!7hcb-)iw5$C(atY*KJ7lb^0%&c};H@v;_XE`!~Rlw z%>E)^gXNxE$2PI_X0WqEdCx*03VfUG$a5N%_#my!=vxZ&v0~db>EiR46y){Ot0+J)1F_lrCA6 zK+|x@0w&Z*Zh3+#bBje%NK1&uHJ|MBC$b7sB8FDio|SY?h+ z*LHm1zx8ysAWnWkd=1 zNG>c+X?0y;03YH`(H}ldNO#>x9qW|VO5KYobzE~TVW9)7l;-`$O$|yuTF&9$zUCzmX)Td<(EaXb#E;?2- zZ#qrBCi8sbiiG@yRk3rO`a;JBLYvw#chTvk?$nuEZ|XnJ@aChm2dzmnb5YTC5g~N2 zj$gLjV8O!9Y1-6ar61Qj4ztBd)I`4#^&&*qF3-mjZ1li2432M-4ZkjzobQqMc&lJA z%Vw`K_u=ZgDZ~RXx^6X20n?^&#ehDy@X&}7(tagOS;C`RxotkL)_G-i=cK(E0A0h= zH-p##MSaprgO5D)zguzWo#gdSf17)<#5jEAq?4BL(BT5{o*iyBzM2x}Jw^^GVmt+d zs%5_|$Qj(mNA!J@Lx<2j9`v3*{-((tpm6P0HwVVApl2Q*na_GAF zd>J~AS?6fxO}O^oI|`oHmCLg!L^}iw34B#*K+GHM{v=(b2aWu#O6~j2u-^6^Y!*$W z#L-+_FV3$?ozAu7MFCYJBE3Om868HN@@>qihm@Hjv&VfksC|{VoTq!04ecmMs?|r2 zd*mLLW@AA4Vl?6l(8hA&P=o)gSE#gZ8X+1?~Fg6{mZf(1jV@Y$#PXuD}(B z80IpaK~ZhgYN`q1YEW|@wS@J3^4_3rc0hY-W}buflku!oe~ZPfKJ*o2y7=`U6Mq%> zIzC`#Ag0k_mE@JR@PbE&;*Tgo4-BlXIbIE}}Cm@tja=UK69MLg)^2^tWRjg32er?u+ zvB;RB<;XfklpDJu&(55r-T3N3uA|1@lRD*$j)Br{9om$nkgWEAe&MT^#C7dFApclk z1`b)@9^8E5#vt7q4DM7`C~8MKpR-PoosUsRO@!_}Y8xdz{=~n*e1E*c_MDq{AM4-B z&8_!s$;MTTj+@L`Bp&T9%L8fsgJDxe3zSDum4@bSD_n$Sp;`|* z#Jy0>6Q;6O+5N~4+Z_F~p;&?5=YyMqEiMlt!mGxXzX+VZTAies=^fScA?}wnUr-d? zy|qWSygG2Zr7ubhmba~Yc6mLa>0S52)Yc|KbNG{z*m87zSP{k?20UG0U>Lh0Y29_y zi-$BmU(|9~H+KK<)e)|Va&AA|?s9TBAdxQm2ow|5kE82R>1TsV_?jlesM9w&B`z}H z;pqtm4$zn2l<@Eh$*!0>iU-59!?bq^=?c&kqZHF~%^r^c6pkG@ zv-eqnS{mc&IJL`#teF3vj4#S+ze^;$xxCNf2nm7i50i=HyLiRdarr0EmB$CLS@>$)g32%!gz=YB|#x3j1 zIuQ@9@2st=ta>k+>RhB~b;Ad&3oQ)`ZfyY%4vMlSMYgTdmbXUZPz9jB>IA6QaYbZY zGuchv(*!uoM$$%2EubJMI1wz`+Vs;F_K*KaBK#NpTtJ0=maZejhtn4FKH9_APv3IY zxlY-$b;n(Llanmh23lm{T{Wc$34t^3YxPc54`1^0KMNKn8WMdam}?EY>OsqF#|cQg zCN`;{@l{LLHS=Hp^RE7usJnl5T{<5iyM)Yat&1qVd><4Sl)9jKZ~J~CeUH!ZK|4{5 z@Fk}Pp9Ofyrg~NAKlB`u$R`gMJ=Wv7$i0H&x}pfPZP|i-j^cK9#EEj~H6y~mE`K#} z1-1(fdU+(&6=~Z{^e)v6-Sg*(hjop3O>fG%PcN`u{SsgE(`SJ*)=oc}S3n9UW$4Mo zD^DytY)f^sTejo%pk??yM5`?p4Z~W(w`%G!{vs*OZc5aOX9;c5^C}8S^@Yl4<73Pt zZebxmoh3FUc9-K|XM@k#>iCSeEjafFN2Fw~)FP{!rRqethMHPb0IJXJa`Jc=gs3}; zc$bKzc!5QYe<(TPXWkx6n#CwmaTn3qVP-0`J!=r_q98TfwFfssG6{svb{u|ic(X{& zeo}hgm+rsM)QjR52&!_WJh*$8=*>W|;{9!E!!S{(w)pXrtIX7e|r` zEoOTc&2h9V2m$r8DDjBmSwHp@1g`*SJ^=lGW%t$If6TDI)pNJcqOnu!gUNrNxg_@} z%yfnp=B5}6`czF>UH7W8JJ(J3!x(*+2!D|$8S=9A)1MQMo8KYiBA{b@S$lBX+l~6<{gnV+{G0#hw1u2^4xM$)6O*i_&Gk?xj?ORe|UHc*+pHccj zQf#+p`1*3}k6$@EVUo%BS0V4$7@dr9`^-ZKl;)Xt|9L^6zEQPsP~CfTif>>77b%Z7 zNlf~XN+DF?rJi-e&WIi~3M!445AQ`Br%$Qzq?PRli_k$uU4v0m*0#w5Zt`QyYd~@i z#?YKWjUOj>@q-(z5vVpDy*WRtefL5sRv|q9`@{FTdm{TvD^A04G5vZnbwTeta+IA` zk%!DzZ<-?SRc=o97v(K~vheu#G`@sQ_vq{E3OoKKH4H_ja`Xba9JZ&D4;v8_(?q32BJ^-}|vqQ%{M zHJCfc)G#$bCiat;sb~O^eCWW1c*^558iv=i_YV)#t=u z^keKe!NZidei)f(bc0}U1tG1xzCc}2Yc_g3O)e#@$JLIaS+H7i*I50eMe=lL-@S2E za(&RPD4}5_et7yt{AegqhL7ubzO&d-08X&*yTg#Gjm_#<#z#=iW&P!Y1RVf=S)#=O zc+p(N4U~j=Qs+h`^jA|ejmCWWz7o25Wp069$-<5gOr69C>@A2!PNQzs5Rs6>@&po5 z3QREs@QFOvesTEYg5Ow%QEx#?$-U?6WBGHn1u0}jV2gRrGX;PD8#DaVwD!sOAR7s<0T^H`YF%sP3Ml?<3~cIX5eqDZ2LD7 z++RuANBg{NzBVKMkLx~IDGg(Wq+;kiJuQc)(K=cV#x)2V%(I@xGSufo>Qx?Td6t;} z#M=z^IJPzpBdPcjG6JpueKgf&hyy!IP%v*tFio}ztq~@k{ z97gtLLr9mrLH>?IfwCLxdhwwBQww3w*LBu|rqCzB#_2sz`gDgUiHmUWbXXLSw-iS< zqi{G}A|cAp|H&=dcVIv=SyMWc#Dn~K0t=?>)}>wV9HR8_CaeARYP<6tb~k&%O?9b8 z!?jEA1z-;J^0C zcV7e=rN0Q!-H*qyONq`WkD9ifPHevj1j{y@eh~mb&RyFPR$g1zQ8@f|zu=`?9x<@net+Xgt@9QA(B*~2y zqlvD?Mby>I_|e>KcQAG*(?x}V0vZnU2%dRCvAiqqqWb zH)Ia76l84zeOjCEk&la8dupNDZ!=RDMthjn9;78Cb}si#r&>>>C{c4EBSe;fcx0wC zL%sMqfEkt)++sQmv~7Akv^nJaa5(S1bFtb<(D|gd=Z>`OF^Uq8xV>XP1F0}o*G#7N zwth%~7%>51123T#t>B|4>}-1+nW&%@e2GJy19ZHkXn{;7x`o+c^goWIE8Egs#%(K2 z0X^mWv9ZmvpJFNzlRpZC`w&78nkVvRbYfx{dr4|Zzs%&~xhOFmfA_MC<=nem!&!RQ z)Or!qK)%#d6i{W%2$8rj%pMMOzL19M)V>M+`$X;%SCTobj6N#QZb)Gj_o|N5ZA3eC z)CQ~Zij96tev{H-JO zlMh(yi-1*#A~?|X?HW#8mFymH`BkxxN|A5O4>q)|Pc@wbZ5$>{B0VF$;Rfvj6pJr( zjJCbbVQnWLVntPJt0v5{Lmc)yIj(D)#jrA|ch2TiTJWVw=) zjDm^y3?lj?Temu7DGvejxnj7m^PS_;^(p}YwThjzqX!Rf0wTMDqc{8#YvvZ>Ln23+ zk-P7f-UeqYZmNd9zVg)M{eOcP@6&DX=X0i3FEvtA83m!W_&$^Ah_l|aUc~9V47GQE zE@erayp&h2N^O5;Q%^xA?OXw;0~aV>^r)g9Iam|Bg;wm;k3Rm|Bl>)CEn-aY&Knp@2{0~l&lxM-ytpu7${F0#!&GRM z7V3*fK34Q*O328SM1zDJo<&A2TuOHD9#jp31oKW-Q#f zO#8DyT~NM3T?=Irb?EM+^JBn4WhU+@OgZm$Xh->&bzw|di@l-#_W2rr$9wfvE6=xV zANm_R4#KGC;2e(r&vUm*ZHjl*X`{o6R2#oxe^5=%y`Eq#4AE;o@S=Yr6eik+sYuuF zLXx&nJq9J@;_yoV(87-)5d^V(ou6}BWCqqk(zUbvO(SpwRESQ7_L~6DNZppJ&WO0S zXQMNq;BGC?NQgvob%CpMa#=;eZCY+(Vs2F$m8Zm0UiwSw(Xacq=IyA8=I^3@D2=Ck zPu4+?_)v%CWk7_g2nVb{UmPyC60GIs?%6x~v&B`Dr>gDOT8^Y4hXUtb@%46ItjHIs zr>A$im1S`stP-?@EHh&I4!IAaZ!EO)yeN-_OSeo5tEvhot3pcLGKBhTk~>zPZ|k?u zPxjdu4bs2eKWe-oJLFNB$#C=!K$l94DyEzCNA(0yx_f3m`#2{FnHQJ5*rw3Dr0WRN&i? z*WEKEi=83SqqO4U6sy9l;c6vURFF;3gKnik%c8lW+joJW^!A@?n0*h4gF2ko(gdX+ zYsj=n1iuotvNjXuFwB)jlvzTi0X&XqD-$eiqLb4(|3D01!N7+?-se36_-%bc63!cP zy<5MYF~nl9jLZhyqNLPKPQ~`~1CjT2-;l12oBIcD<|IyDn=3}U?qhEU3f{`QUfnT6 zeejT1oEHtiKiRkOV11xUXpOZymFA3}%J(+B0X)G#jukFJ_5uQI(xyp9RH{MM*IBw< z$L*qz9L7%``Qx2_WoU5Ab);u|$K+W=9dg?}3$OnO6aHmC|Ig0N$=;6jw>ItG_cvg9M>w(?rz=Mml&~##3M#Hb*94Ro26ZwrFs64 z&Xo0$@d$;2DP#g0vvSF6cHohe(1a({{qz}g#!e>$B0F09a{olR zB)wZ0s?E2jLAyZn#J0b;Z2j3_(o=_|rQ%j0jRTxgGe&}sBQCKmdDJ$!$n#!CjHEORGycne9tTf>8dD&Pr z{JXfZhuLcesrJgb(>?vymLJZ$`5;~ihZB0$D|Y%&ZYmDMkfnz2UqkwIwsK*!L%r&& zR{f{eJj%XISO5jH;+8LPS+arMTZFYBo6^0jT4O^Un6S6ad6Y)A}rCj zEs=Slq8nIK)HkU*SyhyC!8TRQLBiF9@{GH5q2aVS?T=FXEMI{IA{muepq!4E+B|*Z>sk?Ggm@6zCrfJzO_LE|B}h(SUiIlaEx~pzuHV)(eemdtogCO_I<$f* zt@J4)dbs~%aIERf+$OWD$Uw9E8D>7$87e|FH(GBL7DLbNK>k>Z^&R#LSW4?%xAV=n8!F@6{K=?zK=p zd-J^ZymdIFs>*gJ?{VxsvuUfWD(-$yFZpAG3x!W%M*9O+AUdv#|X8@cB#|V zWLH;gnSZSLws?wZQt#bdCDn8c)R*IfyTt>S4J~uFhs_ROIKAfl15?8_m4)b=z0TW- zw`LyKcc|{89UdyQtGB5!g{P8KTU%QV50rh3hh%h3LtmF*)!hqVj2yX$OF)Z9Rr@Z1 zGwD0`k^|2qXg>CvpOB`G>qX52>URMnnu4ggpO-W|NjINEBq<7Zka9OK`Xy%LW4%|| z%2_o`&!Z<~$rYIh+Mizw&t<+yftF^*^-0znqH8vAP*{x|q- z|7xP})$5}}DgQD7xt59HBgA3Y7lHdu2k`j??Lg}GH>KE5Sl*3nmkGV&pE6IK)>cqI z5Tkm5+xc7S=|1*!B5&IlfHJAY@GpE3U}E|1C!dq{j!vvjA*ZH>{Fs721dy~f*2$at zt6Q9$)68nVP9RVLE;{DO^X&|i1GJx_Ik3sDzq;S#=q%eYgB&o6XMGN0BqG#Rbc$Zc z-?SRqvK&fOD27C2p7kyAVEZwZ2F%5%yT`n=PZ_p_c#oFu^Mwh{qCX$soEU?Y#))5f z8A>3)Pf3X8!R~=d@0z+$9SLjLe%1s6tZAwO%6i>Q_JYP>5ErnQT4cUi`Qujs42gvO zW!qtS&EVU>OcD5Ui%64K3XJQY;TOziYjEJSn$eImkVhd!theT}J`|TVK$T&4k=D&y5wYT->XJEW8X0j)sS8ujh9cEcbRRgyJoJZ?+rC!zZ#(nLvJJ`rT+(_ z`ejfe{!tnzfr3G5=iR=`SbsKNmcqgtDy)iow|Svc%kiM7JTY2|P%~0iwS0^&AI6Vp z<`!q{E(S6mzA`$7T}`^`mt>qlY1zKV!Bg3N{p1(TFETTAQY-ViU};UFoD!h3D-*61q4|J~u#%{F#c{Pt44o<=3#?tCdm`)TGbEr@@c_ciz< zl}`fT*wITLMtU_nTo$_4A7V|lckVthy}i#Xq0LY`wOLb=?)3J}htAVt z#63%okiyOFN2q0fnp9_I z>-jyQB*$R$3{7?jRaw$Fwr0<3R(nUMs_L%&2rA3Cr*(e?o@!_Xu$>ijimQhQ9@)+p zIToh?F|_`7NkN!^OKW`KIWbiu9XfeTc)5Ph3o_5wzz7>}rgN7h+MI>M#fF1z;~wD9 zxa>R%{RvAq3bFreb*n?pD`&7vJF!P%Zf{11leU*z`upy9)a@<9pz<}_Ze9%7F<4BSry5kmeS z_TD?HskGnw#+iG@HWmgEkajBy(nJhJq|Km$Ql*4Q9|#1KK#&?kof$y|0*rJ5gi(Y* zARr|K2mz%8A%qAa)BsXK3!(Qm&-Omg^PY45JLg^ZS?7J9b@pPh_-pUY-q*g$@A`f} z-{D`&$I8`18`_5GykHC4(JZ=~p_lC6WgmY@lo_TTXNFsS4Ano$7c@{mg}#*jCA?-6 zRXpOUwJ1pc5pTSdcD+NRcF~UVx~{$$0GOrG6ld{p&vf{k=rNbDYxN^E{FsID(@)d4 zGW-T8KfuZN26|%ifXaM=dJU}j)vK%=+3*_IhJKGR$8r7*$c6U&+mYY5av##~5Kj5K zNj_bQ_0}>pog|6aPSGs8pE2~EBGBd^A0ul+fm!S|9i($}i?r3S)x-&wE&a)X`lH0U zQg3v;Ba^?E=Avq%n?;RWT(@A5IROp2!o9?&iBAUed>rysJ+QQ*=Ftmn>fBe&vPK?x z;71Yv)}$G-Y@Gxk*$3I1*=OV;4_v&bn(}Q8Ie)(W4`RIyjt{#w0^oQ)0kp{o#r6f4 zc}$JQKcIfHEjYD(TY0enyYkUzOG6%?d#6s{79f#bL#nK9`PY7(BHY?()-~WQTZRRo ztE|SD+Ni+GI7+Bu`-w8eJU3MFOd(HNIoO?&Z#O~ab@O~@D>H6oL|x&DNOxfrKIh2m zVqa2^e>h0#zk!%8`-aDrb_siZy9&{gXbVeGYPEDJ{3cVk9`Q6)XuSYHc9jmOcT>JOIc9 zRCC@KsT_7Kvs^jyCiT9p$j%g5uR?ESXUbsxSD~}SNrUxm!{5BB-?T)OEQ(1%OADj> zZaPv_Q9A+;gY(JflV|NyG_~r&%$jqWesk=9m-qbK^Doa$2cG%02xf4^u`?oO%+Zo` zY8Fz{dE-Wq-c>7EL0#y95z; zm8Q@YDyueen2Wam* z5k>_PH0&+v%Ws#-ieSQob_{0q!2gq0T0!|tx&i!JG1+zn+xVC%tBrfChN+M3i9w@v zT{BDkjQc~n^}EydMZ`l^7*^hAGA+ZDn^G!4b&-obkPXCk2Z!%go>VXnlY=LLo}-c`rUQ2DQ4IxCkZ=} z*Gmn1SZYu$!VotW#$NfY z+<}%s1!LPZts~>U?mFTSg;3Ad)(LfWU3mo`(5kxKeY-A;TSv1UN52AH>3>=F<^M-C zt64&0>lgV>b{ko|u4_sgMJ>rX3NaeQ-o9GO8~e!w!ex)TZx9!I?epzPoX50Y_d$-Q2s_fNK5cu$-_vxs+AB1X6>aR72NR0UkSnjtj1}V9$wo3skPEllr*o6rj zMDVWDFWo-WGjs!xE#6VvK0O=)H!gT!aqWS1BQ|-b!{*)PkGY}SaZ66fvVoWI2T7%2W1gGwCEa8#`$rIh$?`9njxgeDHa;0fk0#Jg|ue!kB`3&mLRX~ zyd9hNxWh+*PK7tvlUupJO`vY^;y-<^!Np)fJA>Z0lT=MpdplIC2gt?#F*HHn)dL;k z*uG=lOM8$7%Ee;)#SHmlNod4EMY&lYNa6|IA0OlL0|%tHb8klJZBB^0iLsV#^gXB9 zjQC4^Ttc#-9ib}mEGsV{qSfO2ry;8kq= za6$z+rMi>%ZMhx6mbo~KyRbHN+v?moiEyu^r0AZI* zEXe>dQ9(`b7$PSlUyu`33oGuf51!Ol!2TZT=pUKuU5zSR@XE>?l6KD^pc1z2Nb|K`5Z^ry6;F4X4J9jpl9tB{_%A7>$T$$&15#dpuh`jL-9zbOYPrw4t-Pjdk|fryozgAKhI`vP+QD5OmQR5mwf5t4 z-Y1Ja+v|O1bc=o-NO|?69R0b{^kB@197H~~)`R?-@*1114TDN#&T~v+UI8hu^Y|c% zGS4U~*=*fhiBIT6i+U$( zvjbjA8{Y}xMg5U)^`)k~a(vP~vp@l`7)`@1fU?Z>*+j|Le+dz|)|~ACj?6hrY}Xj$ zUO+gY;+XffHD7P5N37TybdFjBAsTwy+b`0*L7;^0B;#^l%Z`ne_But0dyD_F^!?^N z9vD54`7MW1eW4S-c0NSbgb@Bv^{KM2USM6D-L!54uV%ks+ox_QJ+vR68X>u$dY@Pw zj52ePMC<6!>pu@3nxWbdQ+YY8wYPzus1F_~T9Dqqd}B2`d} zap&!hjp2Y)R(X@_IMPzY@MXSqm&2&4%LSotx{vth>?XQgW=Fy#a@xba!3%k^Tu*f{ zu_u{Sjj>7-tnHx)rUiFCC)~-qz!q$ob;w7{ zV%C&b9|CN$}c4{d8Y13eYEVcao8)K75xs5jbe zK8~q+jzO16WmG-g)>%Djr#oj5#*7(;#fw{RqK!4!a2SPFRc;!(b3m7rGifH_jXKF~ z34#W|kY8ex+RKtejE+tNfrbyN%9q9v-GL99EHzvxw_CS7pk8(m^To2bNkG(b2~j97 zFD&n^8l@Oo+6aq%y9ugMIFf``s8?e06k+54=*dFzZ1wNyX7~QU`GMfLyZ-ERMF2M( zdihO%V~W?*56iex4(c*)Dk2>Zv82}3rjs6C#;E4%#hkFmBShz|v~y*a+fUU-wfZy+ zjR`=iINFN~W3N^)aauleFx3rIt8vHNMq%9hS47;~o1Ou8YTgubdOJpmxQHZG&}gB5 zlF1KYKLSvXf~JO-9}gQC{P4@eU9QK=0EG_=89Pvez(~wLO;UjInWix{+M;P)qu@{e zTRrJ@c^$}vPDovKeKD`#?qz)@LhE%I3bgrfOuw}v?Af+FwZ4Ww5=*2;$ZmAegt1Jp z?Y$tskwPs_0M{0*o&a`?QzTX=ybV$bTdAkfrd1O=9#TkjqnJA0`uu~dMuFP?iK|3 z&S;#dPaG=1Kj!lGPe*?Q6BdDT!F6PV-|wHCSdy!XEqc$v2}FccJ3O2G4fv z4P8r_V85E!l+4Za4I)3GVH@~5bak2_l9siS&)H4fB-D z{#d3WY5y2IH*d1P(kx?Q?A}MCwTJNLt%l(le*7m3Uw^%8F>sRaRxCiaRZm;El976ZC7LrV%tHf`X zzmNX!t&2aJ8e1!OMYU{f4I?fqLXLF%s-6}0I13xG-LpfDg7n1gjaIn z>jzL9LdH&&nKP{;TSG7KZf&q-qVJjfiKDn)(U58|sVHeGzF8!i_w{vs|Fc2vdNK)Qz5i*Hjx-&4ALt#yd=su`Mn?T5 zbXNO!<{+IDDj%Aa*kx%C!1Zo!!&5XC976Nc)kc;l-Y3VffqkNX*6}}-z5h+w%cwrj z5-NzIHF0ipp`n~n^Y0Cr1_q6H%fi#p#@O|~o!r@}T!0+C#NWSe?5I_f5wwL2B@^#9 zYoY{jOat_4#rv{+T|p16WMy5`wR1A($WKPCo|%uaVMyW@;X z=rVYFWN_KKb9RJdY8s*^L(b%NVAc=Lo7b>%HX|Z_ zGtqKt>0;+Nx&h&TOnh&plUWGwBgdzCqo51`5T36leEZ%8tPS{chRAysF!@rOqQA!U zs8`JEad`Dsx1y$e*1SF7^0#Ff$iEA*k)!kl!hz=A6aPj|X4OukV2DdMdGD}Gv{@-P zaUSyZdCG-CO()@=#ZJ<0Nl!y05CQb_>A7^*rVQqZ-5Ekzjgx?f7F)+Ci$V!c`sY9O zP&~O5kgEqwhZw&(fC$qVCdjm!hZVful}WlE99g-sF&EQ%91eXAhV|`x{AN2o|0yJNR$~eBQ)vEp#6=g$Dk@ z+#H9`JXPfa-*42qP<6XbzBbu3t#lS&qqPRVmcB6D@W-0*Pu#QD{hEFtt1YXty19&v zLcMFnn_Fu40$r*AzI>H<+~gG=kojHjjg&2dW29{ce($yxb??wiv*qF+F9lfXndXkR zZClmt8<(UF)!Q;~e+lUzZ7lr#z3AZtH_7&Jf}b%U)P_hVjkuq3M%Dn>CRunO#-Q9( z=H?0kKm>1bWvJBhVq0UYR~X59l%J<1R8`cCVZP1*lj`EF2MaU1SiXNQNG9RP38BHC zs6Yek=gc3O@9B#ob&s*f*ufAr1IY^KZ##2-_CK{kscGVF95m`WclKcsW-5bcYMerc zYub$9^HwTKgRaiK*j^wlXiCNXEOj*EkW1UFSWD>R+;Z4^N{5p}aAmdv0aQ%2dvM6* z0`QAWn5mTDCb&qA5(O-j!pSA8t9w7r%nbh{8vC1#F~M>vtfP~1n`M>w**C*Mz!r(j2yn#;O*aNF@Ssh>hijCur>29aHEJdm$ zI@kA2{nwp*v=2nwk!lsu5v6#?`nD&#`R7!Q49@R(WkIFy-r}%R$FS2!WmH^*@aWqd zo-HLMc^a)RZX$VTXMu6lnY>{|_$eu=A?1q+Uy{^j_dWZN|Z>mqpr=3~!a464Jy`x^d@t4BKy$PlrZZTpb#Os=1Twxr^O>;$W0K7*v^wQ_ zK6(s}c(&8Rm~e;)T}v_EnZq2?B$){#j#L;OdP!tjapOJEr9z z!QD4-CWT?YE?Mt^QY$igY;oxi+*qRh*c1BAXgPuVgg9MzrE=*l#J8Kz-|~nuvy5!B zm3~F!Sc}XtHA5e;qOL@OGfJ{Qau(XB?2e6{IU#f@Yrkn1sls}vW`XkY#)XCq&nip; zQinCGYfBqfdOC8LQ*ZuGdMzmRyULASn!v z?C(&Su~tq!=f2}vS7?P@D426H;V1K*ufv=AUqYLwnL|FK`^y(Q60oc7KGGi+8~tQ2 zHFj#sd8N%H^dI$W%K6z(Mtdimjtvh_Q%GswmB;E`X}lrIEA!lOr)HTAK67$Bn|J>) zlwoPZ1Tlp5DpeZZ0xO2Y#)B441Z@)`y#cw*1m|M&X|*Mfgrrf92dL>wcr-I&1odDiBTlXj#%v zjk)G>q>DcvC9*JFJyz!-5U;^)1dr^kEg@7T8!X0~1TC3QEE<*4i_ zsit=8@w@K4QwkrxKJkA!jv42Lf4iO36ZKkebr&6<{&Syhn{LN?P6j5^cw~Q%OCgtY z3M?RBQ?WzZ3-g9GKg*W2gClc;G|+9!8v8v*E`5yz%8)HSPrIrEA7 z&60g3>c_)ao}tQwtu`c2Kdf#mL7(TNwfZatv>Le3a{WH{?<+#bh-!Zlh9rBJUpuw4 zk6%%QmJZ}uOzgJh5eF^8DkfE$$iPxT?a5{Qv5$=eeQ-*>%a4mmu7Xn4QCtUc_ha&YGh(C`u8OSv#?S*Sl86O_s5N;l;%Iq? zOW*>V1k+TcEkM<`WtozcDlIGvlu~D~RqSFQwW`g<}(8MzV;3iByDedp+!v=r z)VY?@vtC752nl>PabL3)Eb#Vn`yB?Y88D6s6|=j}9kDO)_w_f;4GW7Cy-G5oo$56z zQ0halv3(1@C6-StRC?(*al)&=#{;hVe;DZ}zZ&U9q$<>hEPHMX5>57+{{Hp#>g3f$ z#5Zrs5*zl1R2FNWrQYPkFIY-+DiEDrPZxmgj6wJ7a!}lsypO|iOIC=Cq(@BlAD>3M!5ygBOaV(H z6cin*60W5W%u0Q91m#{G&NEv2d7#w6z}>Kp0^G84Hq#B#;S~U}HB(7u21Y~#+LW#W zkUFMD?m2ZjP%JLkN~QMPyRX5PE-JhtSNofCSxFi*xLcD00_kVr zAyfM2KAlaUZ*l?UQUr$I1XJA-n97ZA(@dmIQxm!166ZaR88(F4R?QePGJTCtFE1K) z^F&1c5S2~ND)KwpH_3j~fW;n^Zt&e90#AwM?dv(m zt8+F9(3$;=_5SR0xePgIVdDB>A+%p>{9GAQ+{cynYpVl8qb9Rd{v!Q_wrB!59Yer5 zg-J>xg5E_##hV@6SK97MH1tCaaa4RaL>q)I1G@xUse%VUV6YVma2_rZ>aQ1$3Zq^% z$9Y_ls}TNlNXXqgW+(e^gKk`?{~C1j;Qvj~4X_c^&2V4UIq+SQ)QxY4z2Chg;^e9B zfK>KL*E$-GI;T$)B=D5_DRv4gJD&K51xbhJ$no22l;SS0lCm+6SURpa3m_j?i5iQD zjKoHz*;-il5U;@T@cRRI_O6CHhx|x7+~W1gX!ZwYtTX*>f0>lH#Z`M9v-z+PS7uD2 zh}EUz8rvALl#2w-vDEnA!3MH#alig3HWl z(^f8&!(Aul$a%U;iaU2NJ*g{&&A7fIV&>_I+b8mjuZc8NEu{vvd*K)OfS_W~QkhzZ z*Hj!7{5Z!YlmW0n2X|vS-TZ9KdwR59qxufraq=Au8+G>lO0@jpxpIZ`xBM+G9iv&1)v>kcjnlWcxsrbs)_Q zu@4w1_KP1@)xt}UR8~F&#>M%^P~zwDO(k^N#8EZHVFYo@ra9;YKX~`u0bIxA}?~*%KYexakOczD~ZUpVC7O`Iu79{-ku}FzgnZA_<9Ts~Civ(bC|F(fRCM_Y>E(U3x*fO=aF1Qp*SHa@n+uIwpUSOB{95p#|T{ zD|IEPdtlpSU%Lp~p_Q;uPK0o5#83YvM4o?)r~fCwr)^JYQDZX+(wOB*WFl24x@ro@ z&j~z?@4Rv0=tt*#qIJ4yiiL`NJ-!C<_z~fNjHExje1h)xx8wcKm36xR=Jy>g^l@7b zElf`0@M54^NW>4<0k9%=9kfq!yX(qep^7%n3-QkTmQ=EPi+jx=Om-kb- z#e_Z7fo3VX;7A&t!!t`XoT{t}Lb6vGFDLHpFK5QrleM79oTAtz4hT}LQ6jTwobw+J z6S{RgVtVw_l>bKRtaC0&iOlz(nQD>jf?KcApN({M?2Y9|*lSGrxrU~aR6-WWL=3Dz z;wnL6$}rvGU0%UnKElrPHm`7~%tMjMTMzNavpSYsUhxvDwBE{PNaWn4dq5q=_H6@= zsCEH8V9}^Mayt%xlu4fz`ewv+{@k5mL`2?VyKAL(HOX_v^-4eGKvX#{wIF7ztwmB= zkh()X>3tM}+)waJ^;?!t&Wl!{v|DK$8Fadxy~Jly!Lt-?ld%#zrY&K1>2diF5xxzh zwfHpWQSrKrw>jR)C9j1Us(gQdBdr^z2-;)#+o7M}txSvaevb5lUS0XxC}8kqrFCY8 z=3e2N@wXyq(|zHACH<-H)71@>Y^G6-iJ12v)2e0BmsgC%#C_XeuZa&I-HeVPr+x;c zLg`Pq=j<$o>Zn|?PFOixV;p$=>nS3P3mlC>ihify@!RQ;lEm;wTiY}FAQHqv7f!yf z5$akWp-6;&{>hf$So_~*x)n5KjDMYqOMU$kdldTm_B&c+~DJ47Mod+O%x#Y%Td{Uv|>_HIBSo4_&`H)MAEN1O=^zL z;ba&-%vUnqKZI&b3A1@PlT@*@H4#4q2gZq$a;N>YTQp!`KNr$)U7As^_;MLf_F>#)h(HzCdstFdFv6PFr5b7V@OsJ{fCeg(cRuMxx6<~x&L)xW3ysWWq zc48I{{h8@!ygIGzCnuuQa1_9ddy0LUO;OC3;oaUS^!B`G-YtCY1ybD@q8bQtn|6AO z$TL!hdcF4!2s4h-se&ze)4CQN!qd@e7<>3^2|9%_*8j&paNI?83IqgvfriIV;wvqnd3!<-n_QUh1Y14SS! zn!nm8J^lLK{F9FV!F2<;?&PiCCB6uGdGRwi;=v+)vf}~b6ac(o13WBpPD-F=&?!L8`pkSQ*c$U(z@O3M7ZqVZj_Wn?(d?TrPT~0>&k6A zMs_cH!2I)0roVcdMfCRJ1hfuO?N}<@RE35t**}nCzHD*Fve2MyrI9MKC{&nx&m-uU zUyl*R-dG`{CP&yN+Qk zTHH2Le@!663AWVs{f7xvj!ig;=N9aKTlL{<+bUY7Weg9(UC>{~{`{ggL&%;v?43>7 z9@YY2+WI&2Cda+*y0v)<8s4V^#Fr-6+?W${N>G%mCB=cO9Xe7PY`ojd-=^~>l&tHU2 z`-K&bK1y63>_!Q;TCfF9$3Nm+WI&%$s3J4Nq^kirO03+@N#z}jOAy?E%;XK9GWQ+z z1nKk#cbO-c6D|7a?eTqT(1xI;b3i?-uSz7dN!V~<*XPa!j?`+vq1}L$pPGK*X6=yd z$?UqkGJRiSsK!2`4yK#h+P;=CX@AE`=(~TesQQXwg+aYc#weWD^`+*B#dj*3dS2hq zJ_gUxj%TjbI6C7ENM>P+;PA!*_ppM=N-eZTVS#v{w2;0su?&x9%Y=8rFieicW zi%?0qp3I-i4faR(f=ekoOJ$pqP-Y*_v2rTp2s5f)&yhqVH{Z;+UrxGxgzte|HpS$h z%vYgmzWW@lrxy;LQZrdCcvv>06<@O4VaRd!GYJ7+CUL;^VDITl(CGS$ECw2M;5 zrp4k%17EJg+Z&^0w~mh~ZraS&`KkC~7$P4X1siOptt)>kFQI29U*e5MWw=#v7kGHr zwA1mHmBzIgm4iRB=^|D$I0yNRe6$-e<2y7APIb+8EyyOUuTv1Tq!6aeY1P|Xi!9`c ztXSZRL!_CS`-9|r>(7*8$X0fOsS;Ix%loN3n0yxG^K|- zyed=Y>N?dd8fZjSAk)45S8B|~`9du)7&qgg?|T6Zs*=FIm|H+YA7^853uS&i8dG*% zEK~g;UwofA+Urey$&W=sLI?ZIW(j&te{&btchFl3v}8K5;M=Id?qQ-5Ku99KtyfAkEh@_b zSb92u&_xzE2S^1`)A#Mn-PP5x<{^_92WnW0YX&!Les@s+_#d^B(va^y&{C>K0%|Rk zN9^jWry};P>RT*o5rdAKMEiO|(fE+hme^oDcoql5ga-Rss=x8I{Bgt^jJkzrupag4 z&uHMZjn4EckuA{gn*%SR+9FT!{KZXT3VjFecf4wT`nGP917J&Nm-^Fig-iA~JIClA z`U%!A)TK!k>T~T^l{*(+6bYSy(k@l*{xDlWFfI>3i#T(8zDS!1TLKMD?uMb;&e*pi zek(@j*M>bRs^NDJ0rTOhKc4+12V^W2e216 zo|5YwlKoBoK}6<%;jRb$ZjJ_`!JVnsL{B3fDLN(Tm_+puhj(Ealbm4HD%D?${djnC zSMR<=#cD>grjoIYEZ^dw;^;SYpiP1|y7CeY)JxD#t_W4An((!C)qBn8T{H=h+RY+= z2^3Rdsfu!}3P9&FKx(gm8V*4xs>RS}Z*=ff+6}MwlQM{@1ir3iuco`}Hsqu4?GaLy zn8N#H61;%Hw;3H~p1g*G7m&n_gt6h5UY^(XW1MN{Y`b33yAfsC1j9aUz5ziMk?lwE zHM7Q~hLtV&ZrCs{YA^;(lU^4Jbh+`vW0Or@MvZ!$96)O6kQ*C zR%D$HMTdxOX$Q&UV>r1y5?slq_-aowMn2kIyje-K$z#iL6XOF&=raM!C0O%bn;pk| z0t^zVkp~V1AJg!{B4Q>05X{1Qxc#|n_*v)}Pn$Fjp3+zFoA%{vdY8c+FIM2WHG=1t z_27eFHc8%M!CBp2$mh z)1>FHmMK5tL;L0L2pz7@_Af~glGScKn}5ktS2k(AE@?IzmuUveoOYd-^fxthl5Qn&uzbR21=GnZGR(vH^V8r^*_86 z1SRVVK2oI9=OOTC^37vmIpfz>yycL?q)P#GOnyC+H10YtLQlOcQS#6PRb7ckJYB)P ztE4}+P=TI&Lwm}=D2|@JJV#}Oc-$J&H*G@$0?p?WSJcqzWKFsrm+C5QrK-ccbL42K zL2}rJ94hrn_%ETq ze@m!$8#<&E>K9Dh=!V-78oK=D1yDS-r6X8BRm;V3Eus5dNFQ;u<7B??T_1KOWoLc? z188+n;bRUBdUA!U#{&cOe&*6l0?86{y!9c>Tjdtn;{o!@RUvYCUzfu8*OKaU6IlKF z$dH-5TuKgQ*M6b>Y*&DJs5(d{-Z}Ba%#qe&-r3aw-PP|~{Hj-*uJbQS+LvTfaC!JJ z-3}NbF!9sp0(;8j!O}T7V{)Q#H-<(^J0v4SFP}=CiN4-~K?g!crK7Z|j+@0*CDY|# z6i;L*(X=>6uHb%97w~Nixd0#-pG?a-A7;*sE4JG;)EUb@FcpQlsrM#Cxx_df z#0y<;pD!G9X&wEP4v=Anzz6XX3z?brZyd>rWr%J3uHN!_tBNR4VO+7-L|F0@D=HO^FZ=rjpHV7DXSK|^%^T@oDRA>ek+6BKCx~F=dG+__3l84 zmK)a8@FyK!%T^|;M6YE}BEEG%IAkCML4%D73o4Mhqd;6%yo>d&J+ZKML(8hb!q(vV zt@|yPKM0vq-eeS6WDr>BU|LdG2h;t-0n6Piwyu!;uxSBzq^$S{rJhrFw)FMR8&WW$*};5shG4o(G?S| zPFoaby^8gbBoparMQv#BAIP8P27qkAl3fsExUKk1F0at2xBsYlVQi1SHx|Q76Xb?M zv@+5&Gzv(*!N@>k_#D@XYmIl9#y`wgS)&7yIwy(~dG!JaxTKn?4bO^=#mdWTedX+a z-3a-F^8f&@BR?Kxd;yxX9c1kFrdabTAPn<3G^icXv7CKf7a1-y(H-ocaU>eFq|)N4 zy6)It@H&R{5HT{NBj#RNL&ag)&9^2h))|heeU%qrXo#)M1(>EqWTPTtYepj{8iG{l zC3ta}K}@k5?8J_@Z6e^?6MMsx@Ju4-QI9s;zOdg_qXe|)lxYz`g!-6-6pwHdxz}x~ z?s*8EHr+3BK89&RC#C5uEp>+CmfdO{_oaO!PT5*qt2ty0-3i_LCK_q{pf_delIv+N ztoz9~HtOjz=dq36;=$ap_)zb&x11{OKZb2u7~u-lc~xlyg7XBUauX9dkpDc08(uov zSHd(8W!V2ElxzR#K-kuZ{P^0}O5s20_|NQjF5PDQ0cx=7(2M8{ZAcf@LTQX?8vHZ> z=lL$UOwM-C*YVH93(K4KCxkf;Xo+~LS5G+Rq`{f`hT=wWsH`}YoS>#!1_wg(bbGP* zK-G}8ZtMiaNFeG|k`EFQh8Pz&!xT==Wb`tJOI_a{iU-XRm9QA~So+0F`y7KpKJw;Ch=e-*S zvWE0(`ok_pbnQn<)CG>O? zJyU`@+BjDSIUXtIuxC-e70B@QuJGov8VxqBiktRdmNaQPp|}5x=&aRUsb}^2MpfaR zkoxfkGZCxX#0VhRhO6(gOB`vUeY*tyI3Cj^2T}$1l0s72F5+ zR#kSJK=>SBsy((Aztd|=pm7q~mTrWXT}i#6_|O%*sb~!M!atyk+!b!PByWWYlG<8A zfSlobFD$nl7kkt#BF`SylOR1=v9C(pHRQ{qNv!98jSYXw8xm-DZjw zB}bZo_1_HlYSj%+Gb@q8hq>35q$WZzwCGKDR|olmQvuBnj2|<#&u^wpL<*i}M^z2#HkY3LEv)&Bp(&fP-2Vf(_;Yhu*oi5TcK^S#0p^Wc0g=(rcGY4L{J*tq% z7S_Yds#Wqd0NDsHu0D|2!&ncT%U*xIlI7&ECpQ3egb;E`vUi=G`$55}^e5P#j`~)b0+67wx+6NL&5VaKVzF2O3q1Bxc>7CWE zWE`n7Q#Oqu(S{q&YTm_b6M=tVRBIF{s6H z%Wm&!ltZ}xUqY`gS@B&@AB{x?E{qQa8djB$;V%tT64=l87*k0HKlMgAuDETj@8{Vc zF|rPGBR5w1X=w&Ivi)vSQIp@N><#=5uyOPLpK}vlkQa+LzWlpuHyq7!nkr|ayxnMe zn&nK$N=O;*EN)fjWOB-(k65cZko8>^Fj-O%O zrr%;+-q66Z)fwcF?R<-xnv3O7#|X=&ENpnCE~#BAqRl}P_3hN1zB0LB=%M7~0wuFc zuyte7F->(z-APQ&#rswb2X5q`MQJ^>GLC4aJwPUa9^fAA;QoEG!H_JFCE zw&?xxOH1=ZII^^G9}@_aQng`q<>sFTB$OrnU*)TUECQ{xjT>6W>dfgKg|$3hR!K;J z;pHBIwR+6RYjz3MesH6BuKmx<3qP=a{pOzwF_$n1?OOS+-6_H%4E<*_JxoeIFfD*v zUd))r)}$;Pv|p1kZ+}E*9i;iZ=Y)jT&Y95FlM7PUEX0{t8PtWpglHF*(Z{P*Z3{$U zs?)^`m&G0PG9X5`taaexI^W@`y1~U1VqWq`e`OCCvKH~FDP7mw!@BDI_J$-XiPe)?xy67FTiSV`!atJTJ zdW@_uSq&Bu8O+S_a4g$%3e8v*EB14(kcusKgFX$X5g&W_>n*o7T>^sY_Ac@qhv7zPMv<8!LlTYTlv|;{Zz}IunW$DR-U^|oZWQpt?C;H{J9AX_FTUm zI@13(N*<kBQ)n3pZn z0b&fe`ZRGHbQey%jg*L_puxk2-e2n+%n-_-%<)VO+!ui(E&fg@{yb!i-* za$nPTb7K@J?&01@`t=8lqJ5@|GP6_faUjToXj^IS74NgHt;My=)saGH;D=WlNVNGf%9-8Mb( z89$F)w3>tgX+2%>FPTx@^3T>}7ULiAaPnc&v6&+v{BxA=+zE^(07^iosLO+p~fjnVNU*mtfu zmsRLvp7f*!gP2c?q>A+msmFbT@{I;Kk z)kCxz+}=zJh(>@Gpq-~$P@dJ%i|xBLa6!?@$x1UdZI)J9Mm%&0q}D}_|G2%@I^2Ip zWKD|X&tJUnudWl{$C@4k(qlMvBZw><|5Y6jI>rj!PQ)@ng`P_EZiB|!>5_9y0y#-# zea*PbpTKCqofrCQ`6$_!dnU)D=p3r~E`;*YvuxYl8monx6q&haaRW8wO{wcTSye)v zDg7ga?Of2N_$=uPOVmI&Nk`4lzdPrljTwftx*3Fe^vP`o>EUm~lmPmkJFeq5Am1ur zd+@g=C-kBQUM36#hm14Af0{7JD&m$Ya{@y06|zPWTqV^kH12~#mWEf*gzSyXz{{#r zpDgoAT*$&P#94wBxdbK5&4F(SYvhRE6tZm3_a?br34J2a+!={z=jniof!tT;n$i3r zPI4i;J!^z`%h6@o*VrY?d#TlUPB+V~JeO?Y5x3!69_iv+^gKJCYTe(}*0H&U~Ji z)e4YsNkAH-s<#N`qaUYK+|+{GQ-c$&d)91v36AUEVI%_Tk4y_BZYX>}UE)ork9?n3 zG1614!cnkN-Yn+@9*xWAj%SSp&XyalEvUqDPNA2^9X_15TXOJfgq zlV#7{c4};R#3}CGHdAmJzETuVS%@X5dMKoq47|s|o3+}6d#TR%cJ3(UVngzY)74Z1 zF>U926P1}GV3$uvG7n}mVT6T*g%su(L5i(4ThH__e7cqA9|dpGQ-mfLqo4QQ+y++y?l9t0?P{p2mTY~WY##QlN3wf6gv*MXbK4-djNiZz{c?fD~{Wrq%-##T-PgT zvNNh?{EQTO(qv9KleC>mb(gMGQ>4v14qSsvW=Jh%b~=!Bqc|bb%04X+9Oj7^nN%W- z`MrBe*}@WzFa!90Vo~;~J?S^GmkmFPQ7!rcamM)>oa()qu_)!p`2LbaN0igoKr8_p ztZwjpHDpwb1cpsRQS~r+T_BsM{oNrcSX2f$5qg*=FZ;~M)zdmfl9`Sl= z_YOBU9K$Q^-|Ba^?w2HTBv&)3jSYH*%!GyVOH~pMnG~cBL@oMladW&w)^tfh43({a zXMy4jabb?5(Zm1^x|ub-^qo&(nL|EVouRRHbHwWEJ-V$Q}LI|e>u0Yrdd$h19wi)Ark=JVNx;mo0IHTIe7qxXMp3cmHuITSy-23$# z%27$<3PmVr;CPk4*yAe4cEc?kiMFI9dUGIkJsjM!E8a{h9nv5FrQHtK0vl3C|Hzyk zsMwq-QAPNtACcebrSdn+|5jhJZ2Xtdj1QkWh1$xf^H+zIC%*93v{Ex>iiYw-780E{ z+0m_2i0o`wu8H$lLs_2rV26cvU_-VR+XUr}hYq&qzcfHQ=XG#@V@kzP)+kDXx?KKi z^rB#?gCd}Q*N0lGYv?v2RF?<(+x*yJnxJ?sx_a(W{x#h&#E%b+vB@^c53i9UB#nEw z!%QpQK1o;QRp*e3Cc&X#I=3NS5Ir zwdC=`yA8e#P1+sk-PEY2CL$vYacF9Xc)X|eZ!dYQ=G)zgpa-Wk_P@wBM8+S)&L%M$ zoGZ`18B-jy%9*BiHEWHJ_w#6^NRkqQx-0v?@AuogNkLVMyqUbRcDab}f@xsdvxCL| z)!ustwUwpqzRdKQb`CT)!Pqc1#+Ym@a-4%fG$u7cU~+?uKmsI_g9trioQNg~5a|Pq zWF!yQCRWVCJzn&Q5pf{tOW}O01VdxIvXJo|`8JTiTkh4Abw&H&(pnDE|P9 zQHp-%b-p1^0&vIp7u6yED!^S`4r#eC-iHtRCg2RJb~a2=3MlBP@KjozR`v0qUQjH` z{JN{f#lWGuWAwG;&N(lP!AsTQPjOKmqMvE&Tj(J1cP+Qv_PnYVp9f)9A%Z=w<&hc{ z-vsE6gofDeaLVm`t>dJLe3z_;*~vqjgZgpP`Y$Du-uw>B0v#}%pVKEjY88D|(*ElG zX>aHxX;ohBbyG!hHxwlcR!Nd4iZ3HF2xi{|+H|Y_a`2c|-i($<>12>{bDW14N%19q z5aR%#Ze^tlIO&C!{(i*54x;KH>L3)?=?Tr;Uu*c=gyP@6q*ZqdxAKwIu!#D}k@)Px zgFC)Kb5TG-^qwhL*GQ!jRR^BThJ5Tge}KmbCha#g zXRIH+K5X7G4gjN+GYAUM*AtAXey?3CB@y3ZLJ6uO9-k(i*1u`{5n&&g4K;>znvK!N zTK=0=@rcu_i^4Sz$DOT9QU0i>`IpdJ z|0RCuw^qC594s&3H(v@}GKg)tA?o+{@eR3`YXPx;>7$(Ze2f;_l&3}}Mzpd{>4oK^ zaPhsFWrI5>w{lJ^{viCzcViosYvO-8@FkqOeu7eBZ}6H?L5*eGXhUG^@`!M(&L z)~nt@a0LE!n<46g?D$X)$JMkh)7N|$lm{AGHP(tc?(>!fX_|CDES7CT=zu~Qsv}kp zB!2&KT&-PIac}SeAFHNgon(LFA2aMd%q#+_=#S}K{9}2Q*e~C$>V>c1wL=Wj*BiS= zlFdf4u7k1*3n;(ChbN<`-E!U@^C?*)F!dS(jeo} z`4k&y8kC~hI(}lmSEsb15?+2TSeqG;+fq{sPBux`Uc*$?G<0=6{b69gBSv;AP(6Dr zLVJk2OCkKk=JOHu*hi)QD61ZYMwR9!u;OHso9~;kc4vxR?_d_w7Ib5ldcK#9LjX-6 z#*UGMw_H-$xX!Ry3{N&bt*U5p*DRu zjl+aYOZ-Ttb(>k{JI)b3)Ysw${T90d)HF?H=!kKP3-~O?1;Dr6y}*oc?sgDl(Bk;D zt)hjsD5IC>=2>9Xy{&C2yQj?QYhf-s z<{K0r3+4=Lvds{~n8q%q+9!>O@;_(~;Yw`Qe%GPhbo#l{DyK;GbYOT{DzB*quls&? z_$C+oxHWS6n}GGQqYJn3o4^ktIuQvs%+0xh)-Kj=LdiFINL%CR3v&dlLcd-6;dssF zr(3U&8Fm&;>O+Her_tfiJKaE=YZVA|r_8o8c4`j^nXE1NaV`n3(SXXW1q33X@WSLIiqXO@d{gQBE)HF+82)1c@y^7*ide({uSRSYM~Sj zP5g**D^=OleQm>COniaG#lw84l60Cocv6K4vA$+$B_E`dOU-zxD36HGZ3zW**4d7gXcm{Uej`$N}f7LiYbuD_UNRT zBSn9da&>8#&6qFNu0-s9fg>zY3b*EdO+zv!>h@Y_X4;UFW8y;+AWBFxGM`l)417ew z!a^A;4q$J;_MY*Kp&<6{7?aS30NpB~YIIds3hJCqY`y~lzwwz-xQCP60+}B*uG=1K z;nCQpqj9b<^#nKn>#@lJE0Pd<`!-;&9_jH-03;b!a546c>ROOPi*7NX3{f+2Ecy1E zfOaLsYW8KW!J4@N54yVb*=n7azlzwK&v2UB%`JSnAvq6ODm#7=wIZjGdfU9KvqG;xcqSCiI?aCZUWu ziSyUg~YFoReAS7_V9vCK}OP%PC$WExwVB#l7)D54Z9_?#F{G6%&Z`eL3Cse z)WQaJyT32r5&7l26Fv#)NAh1&Sd|}h9djrR@(uB~FTIrOi@hmLG@Riy$$lV$fmS|4 zxD4hI*0Jb(tG+TL*gEhXHSiuW#HhU;a8=a-dcQC-1(GY~?X$Ou=YqcpaO`(3FDr>$ zD-Dz|v*la9dQ;>Lg`4G+dEM<&*X*(SyiduJ`xT`Kif|@WM+v$5sUIA@jgk;DyuKbd zd>Udj?Y0k7LTE!owk<5@dV9GK3e#D3TYXM-SlPF`>T*?9@R~V|7D(5i@G3)tZ$j=Y zeN&r6o+N(AjyB^Q&t4*G2XGFbH2=JLz36xao29xu4$0elMAWU?4FPF?pX-)+G2^bn zH-XD!#{Dg@Rcl=HfRB*gkbz_I9N_ecl5padhlab9hR$C$co(w*P44r9B70vXo;011 zRSsP!)_R1QXeW<3niS`RZU#mBx4Ztag_u^RusKV1No9oY?y9Fp$b$3Hlh9|g%ejeh zRb^t_B-zKiRdLlls&Zfu*fILh>ZhZ@K%S3AOEK;)j$SLetr?qaGA#c??2FYSG zylbD69!DgN1XU5A{%~ZbTVOvce(U{Km#-yiZgEw7CusW3<;wn#i&{^&B6mcCgB*7GN$Xd~GDD&DqzVcdqa8|78D4sZe3{4G|*S3R7)1N3ppAKM9 zLg4F_PNf~M&^id~iuW5KRuBor@oC;M&==tA5GAp+46-0B5ndGc!DKFp;Jm$5dwbap z`nC74i@@Vo+`<;E`fe!D;9-?0Z)H}6O(^WcH!$yXz2(AcsCI?|0{Wj@qyI85K}Cih zzxrzwxh3H0JW3&>r0}bH6p0!U;j3^OK3hF7OY#}#RjC2J6FfG@)NQz2O4Q2I2mI*g zu!In55IXo^0C+xSG8eZFviO66_o6fP9_AE(ORydbJutGCPJxJgATdlwwYL+` zP99pZlDTp;z`^OFk|`aiAx)7&S?jdO5VG#8PLX=vpwlzkf*VqbdpG>@qAShxv+6A zmOCaVP5mK^3emLMf@L3HEv4->G-&AM!xawGKdU|#`U&eKqM_scM_2YBZFAquo{}V= zAh+|;F!r_TbbzH#+pk+~2Trbcj5V~Cj3!3Zv?$4=3HJA1tQhs08|@x~CeYroplrV? zUkSeZ`mvJCd`m>-5OC++pziBg`OGvodR8{87?!#Tf0appo-66VRLGF33A99|J`O)( z!@&|7;mi)!w2cHJp!EEK$30}HE$7PW$x@Kkveu;iiKe9(ppsXzXkzfPr{5D>vQO2$ z?@=AVg_50T%X#t_^z(mndDV6MRgZHhG?uG4kDQC1_o&0JY1N^0 zgq;!Wz&#%S|b?s z{^K~E8^FZ1%EA-JhDiQVdguaI91`)skizjQe6My6#OA^kKHU?Y0umAiMlB_t%N*=6{v^S zK*vt3_PbCaYGZW)jT({K!ex;%@~*bae)Dpz*(DS(>>d^^7>QLki6i0Co3&MWE8xpfNz3}`27OIAkLtT64=Z{?b}Xff03f)qpav^E3bI$#sA zH%!CC=Sgxp>Qp{rIoG&CtE@-V`pcNBO`I1--(B=c8-$bJIdQVrO*caaPZSh+N)7M( z2D4m6HyI7t;buYOR0wE1a+9{g12-4g@I#mQmV$btbHK#2>M?u`9Qk1(RJ|6hZt_b6 zrlRSgO`%j*l!@(~=rB=J`yV0oryqAo^3_T1V$&K)+N#rHAF_aEIau7pPI(CES2{ir z`Fw$;dI*b^QN}JBg_dybw?J<~y|ZYq+q|RIh}N%y5c9Qo4nsNi6MBSGs+H&Od^_yU z&L!LWviVI|$f*ifJ}*;J?c$Kvu3atZ1-nXcH$<+--d(T!n?Ro}MsOny)TOR0Ka>*Z zi0%(uMY**Y#dt*|*4XNJM)=S1S&Y}+CC{1qLXu9@*=K}D@sGEeFj?ZhZ}#zd>dGFG z`LPofKvN9DqMtNREQ-0qpB|+IyLY&_mQ0N@*V{y}e+}RnIG5DSmUXs1?#jZR>cc%$ zp<<@9UEZ-nA^0s?#P zxLu7^e}vOXzcHOs60e>%3zSb}o_q}(ym~YwLV0#VeE&(~W_{DhF-H6am)JmrPsek} zHORZ@vKKo|?VM*WjGBotdb6jK8|bIcUn>;6OPrPlB4`ceEu#E&Y9O%-?%=7>V^`eZ z=<{x8*eAPn6#>ot+&=9q+1;etchlDROHx*7Fq{?C?>hQTz>uP%7AjYO(36Orne75y z(J93^N@GlcpZk~}y6yv=t$z!-9KGHEClg?_{ra0t**+L7pup}6AW8c-WtM+VQT@O8 zTefWNmzdQ^#m$j|*t-F~Er)Ny$0K4;X=_^#zX`;~LNL3m!;FtZRoj05e39?`&TX|W zyuSel@@e5GA_qcD$*geN^E*!(Z5s=rRFzmdpfB+(4L3S6s-7sgrvHkf={Ig}X`N8m*0Pm$* zA-9$A1Z6&AZOLrxy!S5x-+P{JxZ8OQTiIT#&S#+_j%Cuacj5bc$ol5a z&FBwG54$YmMg{}zC1p|zQsU(LYrDqj;T9LTWi~VQAJ?cD-9L7D1>FSBU8$~);<=&Q zibjyEJQ<{<3~5qOHyu*HK9~I#g??-xH7rlaZe=a3r%o1jp9Y&BKKe`8Q?>v2pCJFh zJQ+~>*n0GQB_%}tw%4<-e;tL^@6a_eKU%0&xD>$rkQ?1$m@QVEY*%bNoxO}1S{mH4 zS_yPeodpIhJ@leOcvG?GG6po!nIvro1W_;hEnp0BM_$XPaE4_!Meq!TBHxX_?z$8Z zs5yeRCaD{RYop1vm1e_-fsGewX_^88|6V)5bLms6t_B&Z`Q&7+ORgRKL!})OcSo=-+Hx1@Pclb@p>Mo127k5=!Z$`xfqWuhB93`^-(58kwcgKkXR8C41=MCm_plJ|)8u=Pgzhh$bT%{aK)8d6LM;w$7No_j!7Ge$cYq zX(G^_WpLR)Is9#`)#dYl|5h(e991`Gu=^gi+wEMQpY)u))_~HU&ou2D8 zMPPSPCTZyN^w!=@@07G;(6tCrLy(0$DKbCcDt#f~7LSjBbTlcuQH-;5vfn07mJ!Np zK?WBF8(`T<)ahvW@H)etHTSvkZ5p#wLJphKW^o)g>p;oliuaXY!G-%UyZ z#-GAldbCQVc3y9dG{*X{I6viSgth0O5>o7K;$J(ym#~fO-%&CjsO4x+y-*joOl?|@ zsCa@L-pt?;lbOC~VeMHVY&)mx{`L|WXy26#vB~I9gL}t4*ueOJuP5q_AxjJTcf@bi z=7bWplbv=%{9W)~b}m#qh_UrJPz*{84Rueb<#VVIV%1G&0&uD;ka^xF$Fw)FK>lfa zV1Lp-+7Kr$e5?*R^!&1AF|h%o<@2lU{o!-n9fVZ)pH^ z7tSU}u)g_xK$zLg?z}T=g(1B6Qu)Ss-{`w>#IDftVzT>p=nJGFeyg@U57rQJS1-t< zp=AC+@2pm26;^Jg(-R%MX@&24lrYrY`U}A8yYT?(?bV5vFSopf18QlhsYv~?e2&gcgwC!HKWXQR(H$nKH1`OXeAM-E@ov9Q_wZf z1~zMb8$!9xvOtdmf>1Wk7VHx3?fddB=WVnCo0i>Rk)WdHN&WJeAQK`I9UrSoWCQM)AB2Wfff7NQX) z3U?*X|My1mwQV0-A)KmD-cLub9jJqn+= z#?|eE`Tg~`{M6NLhn|qm;4w6n#n(rZXvl-7?1G>BcN#<)%6~vcpzACmJ~=}D8~Z6U z6;$byhRixvU0?mlEXTT-i4PBSHX4YU@G7NjbB~d}Z#l-JWmF``Ob4#+Ffg+rjium z0mw|DgO6XGm}!8mlqH(W#&w4}^=!vdPEu=KE0+2fl|LOq{B)&%VQwMCbLM$b>KoaV z`nH9=F}u18!9+f+yW-+@WvG9e)`e<8wlq*$#%7Ust>Zj2a(_+HywiER^44a3vadYe zWpLJt274F3X1rSXIw4(1NSMDJseg@{tULNxd-avuJ69mLCZc;Eq9faO`4OM#b^YDs zpZ~WG+57?=*Ge%Fu(SxT0#j}xxl8pf(5j}Y`v9nX&0Z+Q3a%$g9aru?@C-<{E@W0J z7wNlK98^$gt_Ccn$4#M(DUSC6G+wROPtJAy0eH7&M5IBOoY48xo0{nc>=qrqXp5h% zu#i-kI?;d3fcr!{9(F(DOf)6^b*g6ryfcn_*aJgC$U5d=K_nMqb-W~%28$igigiwO z5MI;gLox^zPwrZ3ndTvI1|X{7iVkO9+Iq5P;J3{KynZynE92%34%37DQ$#j|AIx4W zonBQy9{A=2)-^OFNhPQeKgy0t~aeVm6mHVZh8G%)-@$zVgAAa z&;)d4tKKBhaRh11Fq|_7W`9|NXrKmLmPEFwhj}77*;xN}dN+{}FWRV{dbkOthnil5Z`16ADMK#8EB7driScM#iOy0Ua zN@cX&1!sx{I$JWr3~wT3Fi(RYnqCYY9$FatT4b32cy0A~?VKRB1k{A?3Ts7(#n;-3 zb~LEZczL z=k5L-(ZA>Yf5ExqpDuXilO*#}@t>^mQvxTm+wOB#x-qUZ-1i|@H!L@!=A}6>!P?VP zsv_Ta2W|_Q`f~g~K6>jmy0p++S@k4TOMF4TVyR-ea~^8-O+ab%kQXhF)QCq$@kpCv z{Z~OqpMSerpMb#4$i1@2(i3EGipdJ;nxr0`#Y+BDsXBskD<)#LBZ}rOShiAC@YD`h z>4q~1s~TSJQHAY>?zV^*JbIG|d*ihu5BNYR-Q$Hl0oj4goVuBYGDnv7at$cVi{#9l zUZX9RgCWpG{ya)Q-!d?JXIFll@7pS~z8!tpaYoVN#xMU9pjy#(>QbIIe33uge6yu9 zMrrbHiPPF~zGa1&toxHRn$m|O(n#_btNV91u!odkPZveG)P1OLV(GQ*hg->L{x^Y- zw{2N_uUXN023!zSIc`=`rswoE%Wn7HoV5l_FS9!x^D6apZJ?aXdqnGBgzyRD`WVfy zyHX3OSpbHAw_5Rc+}o3%CoI@kmB%%qd8#fVQX2(p9+zV}34ZEZ_SFq|ONtIrrvb6; zU4l;N@m%v6tRpv3h~U*eUS6ipP}+wy#%10rN`hAJ#7O#evX?P|tHKaVfr-vIdM^;1 zhys2KFzf>1!EfqpAG34bw1F^Hxnz5HkhufwHE>sKwEm72* z7$Un}4{4cnU8eYgXKs%TXr!FSxAjh^wdnWYK?V;1Nwx+MLd$a%^!07$vx#Gl4Qw|* zX@y#Kd>DPLFPX;~(f%anVsCpct)-O*>Oygy)9YGdl177i9N6nt5&z#-?5EuqS;8jp7dZ`uN;8^Et<`=A|ENJ!k%^F=m1 z(-xv;0SseX_Xu^Lo@1ThSg8>;bvZdN&ldC$v{|=T& z^32}$&Vnu?SmS&5SXcyUWz)zA$PV8PDg3cA6pPEuWgUqxf#O@ef}Rm}X_HdK8_0ko z;frl|QM#1!$5GSi6ztv~J~2`D&mif}Rm7l_!q&psOV~|%v-ZvTPB&`mNA4Q3@WL_; z>{f?WMu2WQlL+2kc5{n)@+G2dEx`0+7WJ3noQ26BvBLBF+GUKTejz*mgs7@XQiRMH zy|1@#)PY|abslB!fxYJs76^FSd%l{o%8?{5Oj z8mn7@4*$)+!30__Q^Y%vs?4e1i#Q>_4srG^Up;Dd2*DGB(vr!4E>iTXo$eUor4&rf zq)p6y+Ag^jb^}i-67TqrotS0o4=5#Y-(r9~2qoL3KJ$>0OH(n09ZqyMHuIk(=MAiQ#_$3YgveeeNGPIY^!JYwxhWX{(~z>xX&&P2kPp-|kue^1($Q5EWeS z{8?}N*ZizsXnRgsDkPY6(rMGDQA5rYa+Xog;WXU_uYK@Z{;4im{^t(xj8D|#q1wjU zGW+4BOkXF~M`q)Ty|>OiZHioS<53m*Gmn2bj#;AnyHh|ykldm6&ZqI8lEZ-;f_yQY zghixWEx~(HbZfXl)=5HLy4y_E_AT=m2~)Z>cB(9^q!J#jw%dy_@&D`=Xyv*VI4}m+ zd(BeGsd14@E39hevH3;oJ95x#myCr}5}%a&h)v$3<)#jHo3GFW0Tm#$ z7$5Ln$uS}X{``x8fJBMufQE$WcnJSe3MFcHxxqij%;f>OY-yi3!TDU!!(p!Q14hg3 z^^-cdd=|VV&Gdd^)LqfeU*kMC5ZcL4e*7{yv|~10eHaq|pdkwhxnXUr(gT42;s}E5 zoEZK%EppC@V$KRIYrQ8WmcxJYB*l>VMB7!cma+oOcltld;jmYpJsqyEt%Te3sKqU> zey0Upd5jTugv+vOyEc>ET6q;12PrQbw2ls-Chxa2Qer>D;}IjfLf#YKg|KK1`H&vx z6vUiGPkPeLd17%noB(I5a?1$!8bX)f5(ve)S+Y2SPw_kFP^#}ywZ3y+YtW#$6z1VO z?)VBm4W@47ml)c+<=!-Vdb|GRNiE9YQ;m46wZXAtWpuvx-oVD%{P931-72yO+bj6~ zf8hvpywWTs^l2tA`|_#soxIQ9DkF7?!y?LF{%P&p4J~;@t>bMs+dJr|l!7OB-jgfz zevc^UAW4lLO8yWR81bG|`TLuVQ0B?@~<4Din^e!H#Bvoz_ z;G~@5x_3C}g?HmZLJT>R!%ygH+W6(!Qh?4XHAOp_5w6EQuc{0<-%rMS<_Rvp!ZaZIRss+$=dyA45+W0AK^Ea2 zf@1Zu@34rKsp1D%8q(H^L{sUb(OAZ|*a4|q-hSirDR2DZ&GMFiC=U~K8Gurip-TFi5GR0-Q!F(_fxXC3x(5ce#n0KT8 z3LNfOu76r|haRzdL{IN5huxXmbB!+_X6@dd*o0IK)Lg#P0WY&6uN~QKBcPPLo08rJ z7(^0HMa^HQn!O&o6M4D^Tj=3Ri591HH^tN?M%_sW-v(;&T6+E} zdh(gpMi$nqU*PN}%VV$2U<=3=Qw=EfMU=4S61|~jl}}MmuZnJep1HNJ7fB%jdHEw& zMZTpck67-fP)TO_^Y%MPC1qpwWkK#Pv&VNL8hyrEKlr-47-~4!S{PK7qJGNrn+;tL zNOw)_L&$Zn4m*_{DA~x-AHHL20NOMn$|JWa9QqdV##^3PH5yyHKj;9Hpg8U^2CM?Q_txpV!Hv~g}FSqnT7xYg0v;>T-2 z+XR1Yw8-4Y>KVPchqL?s{{t6Dfoq$UhObx`heuT5F3v81s2x!A*OLFK(y%5KZ=ZyK z+*Q-AAq-+4GZeliK8TCDcVY{%gWT)~-E5x~5`XYO>w!$QIkY6y|s8Zqt|v<_W`Za;ZI%TrcQ23y_})AfvyznD~p&4r!=$s z0l^;%B978u-g&WOF-h?a(=4>$Klu@V(WkF}nQUJ+_qN4+dNW?CpwaW#$ej6_;3;K1 zOw}It^ahn~`vXG$GF~9Q_m(&1K%ZqQ(HfHQ$<=yFS(90nXVMTLya?Cpt=Y(pxmQt& zb9+^4>NDJhI9L*-jnuBl)D&D#1KQR@BD`$r5>LtD%V3HU7DjxyQ#%pUG zp4Bn!(5Qtre>YzCoqz2J6G6J)6^6p9URap?Avjb$eX%tvKxcGUs zZ#Sq~?D93KJ>ddhVxFY#kTP#b`Qdoi=oL<1I55&;cE#zCvpSeqzWjtC?OcAM`TQe8 zq1hbbD2GNwMR$;>NBQ;kq(z;V>N^#)<5sWU6{b2CFdXiA1_9r&Y?c1ih_ykL{`}4# zCsue!&)uS=JSuc+{_8P^?;IQ79OkUu`8nTc#vdJ5ztx#-sX5CC{E_iQ7l-CDzT;J9uqT!Pg)3eqL((V`d2_5KJj|F^w< zmDrDj@5BxT3DHO0dSsUfvM;XayVOHh!*it8%{HbFpQXgp9 zi4RJ(>k!iP&kn%{+G@AS^Z0Bx{y*Q1 zvNj8AM%sX->SFuRwM#plcWP!;qYG0XPZVVq)vi!=?4L$gs#PGIN_P-qmk6qI)>XNJ zrO#TO9>sYmntJDU(!-0~q&AczHOoj&oI89HBQhzkR4Wn&jFeivEar|^37MPE>dCYC zD;~FdhjVdW!9<~~ZewdCfmcQk7*`QoGSX3$tiG1GEAr?4Zvx~A*)J2{bz=_9nsvE) zp|zE@&K{3L9Inb;nuKCk8Osm{+1qL$(^SC@X!UpZImzEG$hwFxuO(3bzl zUh-`Q`xMaU8`4+*8VNalx8==z0No1M`!eg^wm4;spOW}@EN2Xc*D#+9ZM8+tHD2f6DVS$r<<_N z$7>IKBX^c6Sj2gG95LNk#Tca8Z&BBp&6cQryB%74yTGQ;L=kMOoak7r4%O^q=Wthh zR{36w0s@jCUd+9It)q7lQgJjLA@!h?2xqg=8pSpd%bC)AM&CIY-NmzV78+~PI(sLb zS`u`tmTFgWv3BGKpxvc4LOKy7-a=Y(t|ED9B!DYFFVSvyGz=5kMC19ao3=@yY61*; zu`EB+7G%DX)v4k+jOd8)?N1^sVqrSAqOqsaf0zpWZlH48Dpx-OB$=Bp{SUfoEmEph z(4fh#y`S~ufTGR;c|Kj`pzdfcpmKV9t$1)PnuF^d<(K7*8~0zN1k8{s=wsZp?@ zYLV?_c3zS?icOk?SYvS58F?H$r?@=Y-&!aM#LzU`K?SQihsn|`)OrV1bPzd7>B*dd z=!w=bAauHI!ilx&t3Q0Zv06gcOQrL3^c;Si;7&cVqujwQ+cn`onZ6u zskbDM)uvZU&Oc#_TFkEBcN5<*iQKm(Obv&D8*X?9X~ll$GD#JYDjLK!rGiAQp1vI) z9qmLo+1uJvEb`_cs3ydDU_Ozv6-|t|qHwLNypX;;#+VaV5lLpyE-?$#nEqiUeYESgrFKjOb9T;_lBm4L605g(0h}$U%luF!YW(H=n zRoKRQ&K2A&?psf;!alRG>|5pWS`9AC6zP%yFB|*WfY`UkS|q999hW|L8KJ~cg6FDJ z0GHk|N}4d=8nI9v86`Zp_iSP}1-E2^%C>p?d)M~NIt zeqXl=Oz$_TuTq2$P^yYnvLNt;%8^t5SBAIGNm} z(}uz2>P#1V1qF0zJf`~guqJcEJWtfDVD}mVl1JN8%Xm~FW&4Tz!v(&Bpu==>vP4Gl z^82Qt6zhCX-fFZ=^s>wYsC40J(e2QKdc?tay#4^E5W6QfP>jv5_iqN5U z`G~}rXY3Wt7!h@t-ng7>u;^M4uf`DhhtBLjR(o>#g2OK)(rq#;%vKwhuycDiPcogv3PPvlcKphYP~IE4AD72Dk%`-P zWwr`#cvskVtw-oi{RO5y@!~-*OL)h5&r?bi`#7Sm)BAq#O26io|J&a#Vq1S}$ECI` znI9bc2b)Eb)}D2fv3hO-B6sR;NLIo|0P((ZQFJ3R7uE)jW07Q;Hk~5G4L;|G-3sks zud+E}CMC|R;=V4&#|~p*V82XlP0R${LOML_+5DU zM}eo3@4{xanzb?BdafXl@lDo^F)FA>eZ~3)n+oaz8Qw{zmJS9>F$9Y%*9NktdVbILag*tK)K0-OoDb?o{6*89hh`CR6u z#M-S+Ek!Fh1A@2FhsWrI1t{nOtyzy5s!|V;vA4oY>o8^At8_|URcgtm--zl|m3gQv zIVQJuAq8#$T4+~^UVoCMh((GW zGE~@wSv^!k$!fj6YbVoX^TplbzOHU;euWL{&4Eo*bKQhr@!R6^KEwKA1Gzv9P)GyA zQ=Z;^m(Tdh3y4RWY;una|M@vy*wSor>r~S6P*Hz>6J)fjp*Qhg)>HmZTEeJRIt`C+0V3C^2qq%VKf&)NOC4#)0V_nLSQj+=cGZ&d=7OU>)zP%PWlN z1t2KP%>6ta>Zfnz#(uQl^zwJuDjFU3BBC)G=X?!A=h$FhaSUV3zO+16G|SPr?4yTNMmZ9kH<1{7oyl9eD0~0xx&2-JmPTI6%mV zE+kYd({OP)Ok^@?!2}xU=->7VS({wE=4iU?0-?_Onq5hMi{OlGfzkDi7P*zs%SM3E z?Rz}@m)@VNw&&u$zG}gubhW83B4+|LfIH25&Mm*?dVf){);j_RaZjrRWCR(QrxS-O z9YAkLt&b2+uX&3RwA`GS%mngE=-{e%I?cR2^!?2qx5c#>HSq?*gmw31DDU$9Ob_V{ zrJ$p*+kEN`9`Sy`*!;O%R$x8rL$#@{H};2lU&ge8$9b^+GmF77Nmq{O{6}0qN{TQC z()4dlaNwIDg6APDs%?hY+C}o#xouDp_?WoF1J;^xds_Zvzu16HV=i>onE#P`D@Gq7376d8JW!I zyWfUCEAuXOmnOYPrc`YT!&W(SITuTmB!1Pzx4ypH4Sn@Cq@<~}jVS3z-ii=yWUz0unz1`sJapWjj<=2hRIHxzf z$=a_MMm!VykSz7paA)h#2Ux@+SP&#?sk?&2f0*0x4IT$F5f(y;9-997Z<+rke9Sui z&+w2Z`LD%?|2NTPwp;Oz@|#1G&ygdpb#hES5BgYv$@6Yc#ab6`bb_)phgHxry17x; zJz-N~-Hy;NLI2*gAP*9Dfli zn&NB@W#^agK9R~AtnSa~G3vm=U@CduezQ7gQZ{_;XQ1El?NQhwV^Ct-gV(uh`sHN9d(uZxiJ^~baMdnP2fkKLiDTBrvb0pp+WcaQs2xj zFZ`4~+H<}Y@p$Mo)aruNv_YExU_JMRgPw^M2yN5FdaWnUb|Mt`7cT6$Cx-66VCzJv ze4dzKASb5HohoVW&GGKCok!HuPa@PX%!uCe&od9lEmR*)&1o%H?kGOKjwv6SR?EvK zS#(XADr~kfuO(U+Nh)~E{$?f(3X2?jAu)Ml1Y8x!we7LcQdm{pi*$^HQkG%Sij{G| z9S9W1etYUF`Pp_YDtfglGS8pIFQT}GjKuS0_9(`ITleT&*Pn{1LtEn5`lT(4Di5J_Im{B&)N}HKa34iHQ(y4vYzKu)s zc{aD_$6sYudj(`&kNZm8&{0qv!93cuPkXclzC3lcv3@s@72(=Bpzs_AJ>P<*X)GsC zs{15_E)ulrLniTL^Gy&xhx~F^CZPDoJ@+c z!Usqsc&SogZA;;!KUHQlVe%fHsu|kacVlKc%6M^I4O8Q?IxOL{Y=*Z$we{ z`zY|y62;e) zNVM$oVD2HlR!=o`rWYNDDy@5|;;;tgH=Mw%3EO0LRb=8=%rd%cumoP~GELgL-hzkw z2V7#$SNxf}8)Pv(7xy5}VA#w>b=LlP9ZN?k*NZ$Ja_$>J5}Sp4UFrVD0ahkriRupa zdijZ#_~Pdwh>t|Ao96vOf^pM5uk}lQiTURYmh`p%46Y6m{w={5Ug~8y>gh7`S^)n0 zfTqhywXfO_VdtI4K!?n=P05f9$!i#88mZjgdU3iF(lT zam~IZk7MEFlW(P$P1<4O3X(vs-8e$MYUh2Zj#N&ySM}~@PUPd^fOR|D8+0A-^K;RV zxaePu=0l=IwEz25pGWPye%sG9NvY;Bc(%pWBzoBw$16~=E3vqQu`{Sbz9`$O zRr@J2c@18VgL1X%NXTu^{7er~utCz7mVb_Bb4RA6l47snqlF8j)(^yr(c%TGR{xxU z?)=Ak#J{v`OK#V7C%kwgwDIQBLI$d0JLWE6wwSOzCZ^N1sU@e4`*Q_U%_1`S$z2;q zIrk~sc2A$y3V6|ZR@r%msG&-bTSNJLSc*#@>T0QKUr8Z@)9Z?bmY7ep1QIC>)l8~bRs%g~1)=0>G?Da&D)76dTqsouA zgjHUcTIvvdj^@b?CA8g+1gV+_mlZ@J=-86y?QOH!JziV($HK69q;mnH_<_MS15~D) zQuh&Y@_Q~}?|^h+T+5btuuNOFD@|y9KF5{ND6*kqBbH1c91@h;!>tenKMg%nq%>*i zKF4I-4W9;za>{7<{_|hzUWJ1t+{G5Vtmp>I`{DE-zIU(K`wnG$(`5)`kMq7P-^F_X zrRrUjPt-{VjX{?tPC|3o$akv_R_ndGJgLd1otUnli1u3*w@zDZ^4+}^YuyXNuTmlh zBBXQ22Xepb(rWOr*}y*Dx3V!k_K^I%zMdEzb~v^!!LYVy^5g?`WW03#+vJhTo_@`} zd(hfr+j{NoP4?T>5tDU@QrhfV$djRTM8*B_*W<%6kE$@Smr^<>5-2Nlq z?vmacBcKD``sQ$R?Hj;EMPt*@-^6aYvQ;+|BzEZ*J&-4^Ev#s5RiaVZZx?w3vfmU+ zm2#-u$#g8%2{C8>ii@`U7;-czI^BD7*g%oZVXZ|aD5MS6H4TP`S+ob>)SYu4#6h9X z0b{6xbMo1A$mTZzExp^wdo%C{iGa(rk72Per=Usu6c)dN41I^`wz}`ia3!kPOLQwb z<2qC!xBE4e22&Kw{a~97@3L^7<=jIeAJD6wF2Lw#C|D0oS;V{#jvtGge6ie@RO(ml zXh>g9Me&iLr$2oeD9G1BNz>-^YG>6b<70D(!B&Ip_l zI3sXI;Ecc-finVU1kMPY5jZ1oM&OLV8G$nbX9Ug&oDn!9a7N&az!`xv0%ruy2%Hf( eBXCCGjKCRzGXiG>&Ip_lI3w_XDglFU?EeeJeUW|u literal 0 HcmV?d00001 From 2786933039a1cf3ce66641c5c1839e6ea8405b59 Mon Sep 17 00:00:00 2001 From: Miguel Neves Date: Wed, 19 Feb 2025 13:18:20 +0000 Subject: [PATCH 02/11] chore: added integration test for converse image sending --- .../test_cache_and_reasoning_costs.py | 2 +- .../test_converse_send_imgs.py | 151 ++++++++++++++---- .../test_data/llmstudio-logo.jpeg | Bin 133432 -> 34010 bytes 3 files changed, 117 insertions(+), 36 deletions(-) diff --git a/libs/llmstudio/tests/integration_tests/test_cache_and_reasoning_costs.py b/libs/llmstudio/tests/integration_tests/test_cache_and_reasoning_costs.py index 50f2777b..6ea21bf6 100644 --- a/libs/llmstudio/tests/integration_tests/test_cache_and_reasoning_costs.py +++ b/libs/llmstudio/tests/integration_tests/test_cache_and_reasoning_costs.py @@ -168,7 +168,7 @@ def test_metrics_reasoning(provider_model, metrics): + current_metrics["output_tokens"] + current_metrics["reasoning_tokens"] == current_metrics["total_tokens"] - ) + ), "Total tokens mismatch" print(f"All Reasoning Tests Passed for {provider} - {model}") diff --git a/libs/llmstudio/tests/integration_tests/test_converse_send_imgs.py b/libs/llmstudio/tests/integration_tests/test_converse_send_imgs.py index 3d45b715..2523c19f 100644 --- a/libs/llmstudio/tests/integration_tests/test_converse_send_imgs.py +++ b/libs/llmstudio/tests/integration_tests/test_converse_send_imgs.py @@ -1,14 +1,24 @@ import os +from pprint import pprint +import pytest from dotenv import load_dotenv from llmstudio_core.providers import LLMCore +from llmstudio_core.providers.data_structures import Metrics load_dotenv() +INPUT_IMAGE_PATH = ( + "./libs/llmstudio/tests/integration_tests/test_data/llmstudio-logo.jpeg" +) + def build_chat_request( - model: str, chat_input: str, is_stream: bool, max_tokens: int = 1000 + model: str, chat_input: list, is_stream: bool, max_tokens: int = 1000 ): + """ + Builds a chat request payload for different providers. + """ if model.startswith(("o1", "o3")): chat_request = { "chat_input": chat_input, @@ -41,42 +51,113 @@ def build_chat_request( return chat_request -input_image = "./libs/llmstudio/tests/integration_tests/test_data/llmstudio-logo.jpeg" -messages = [] -with open(input_image, "rb") as f: - image = f.read() - - message = { - "role": "user", - "content": [ - {"text": "What's in this image?"}, - {"image": {"format": "jpeg", "source": {"bytes": image}}}, - ], - } - messages = [message] - -llm = LLMCore( - provider="bedrock", - api_key=None, - region=os.environ["BEDROCK_REGION"], - secret_key=os.environ["BEDROCK_SECRET_KEY"], - access_key=os.environ["BEDROCK_ACCESS_KEY"], -) -chat_request = build_chat_request( - model="us.amazon.nova-lite-v1:0", - chat_input=messages, - max_tokens=100, - is_stream=False, +@pytest.fixture(scope="module") +def image_bytes(): + """ + Reads the input image as bytes. + """ + with open(INPUT_IMAGE_PATH, "rb") as f: + return f.read() + + +@pytest.fixture(scope="module") +def messages(image_bytes): + """ + Creates a message payload with both text and image. + """ + return [ + { + "role": "user", + "content": [ + {"text": "What's in this image?"}, + {"image": {"format": "jpeg", "source": {"bytes": image_bytes}}}, + ], + } + ] + + +@pytest.fixture(scope="module") +def llm(): + """ + Initializes the LLMCore instance for Bedrock. + """ + return LLMCore( + provider="bedrock", + api_key=None, + region=os.environ["BEDROCK_REGION"], + secret_key=os.environ["BEDROCK_SECRET_KEY"], + access_key=os.environ["BEDROCK_ACCESS_KEY"], + ) + + +@pytest.fixture( + scope="module", + params=[ + ("bedrock", "us.amazon.nova-lite-v1:0"), + ("bedrock", "anthropic.claude-3-5-sonnet-20241022-v2:0"), + ], ) -response_sync = llm.chat(**chat_request) +def provider_model(request): + """ + Provides multiple provider-model pairs for parameterized testing. + """ + return request.param + + +def run_provider(llm, provider, model, messages): + """ + Runs a full test cycle for a given provider and model with an image. + """ + print(f"\n### RUNNING <{provider}> - <{model}> ###\n") + + metrics = {} + + # Non-Streaming Request + print("\nSync Non-Stream") + chat_request = build_chat_request( + model, chat_input=messages, max_tokens=100, is_stream=False + ) + response_sync = llm.chat(**chat_request) + pprint(response_sync) + metrics["sync non-stream"] = response_sync.metrics + + # Streaming Request + print("\nSync Stream") + chat_request = build_chat_request( + model, chat_input=messages, max_tokens=100, is_stream=True + ) + response_sync_stream = llm.chat(**chat_request) + + for p in response_sync_stream: + if p.metrics: + pprint(p) + metrics["sync stream"] = p.metrics + + print(f"\n### REPORT for <{provider}> - <{model}> ###\n") + return metrics + + +@pytest.fixture(scope="module") +def metrics(llm, provider_model, messages): + """ + Runs the provider-model test once and returns metrics. + """ + provider, model = provider_model + return run_provider(llm, provider, model, messages) -print(response_sync) -print(response_sync.chat_output) +def test_response_output(provider_model, metrics): + """ + Validates that the model successfully processes image inputs. + """ + provider, model = provider_model -# chat_request = build_chat_request(model="anthropic.claude-3-5-sonnet-20241022-v2:0", chat_input=messages, max_tokens=100, is_stream=False) + for current_metrics in metrics.values(): + assert isinstance( + current_metrics, Metrics + ), f"Expected Metrics object, got {type(current_metrics)}" + assert ( + current_metrics.output_tokens > 0 + ), "Output tokens should be larger than 0" -# for p in response_sync: -# if p.metrics: -# pprint(p) -# pprint(p.chat_output) + print(f"✅ Image Processing Test Passed for {provider} - {model}") diff --git a/libs/llmstudio/tests/integration_tests/test_data/llmstudio-logo.jpeg b/libs/llmstudio/tests/integration_tests/test_data/llmstudio-logo.jpeg index b4f753fda2f29a29819ae21e0b9329c40be5dc10..64ff99b9f9230a533a50be4fef3ded5bbb7680f9 100644 GIT binary patch literal 34010 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 From 6c6c3434490d2bc58d3322b3e90b0ba18929b250 Mon Sep 17 00:00:00 2001 From: Miguel Neves Date: Wed, 19 Feb 2025 13:48:32 +0000 Subject: [PATCH 03/11] chore: send images integration test now also tests for openai --- .../test_cache_and_reasoning_costs.py | 7 +- ...onverse_send_imgs.py => test_send_imgs.py} | 79 ++++++++++++++----- 2 files changed, 62 insertions(+), 24 deletions(-) rename libs/llmstudio/tests/integration_tests/{test_converse_send_imgs.py => test_send_imgs.py} (68%) diff --git a/libs/llmstudio/tests/integration_tests/test_cache_and_reasoning_costs.py b/libs/llmstudio/tests/integration_tests/test_cache_and_reasoning_costs.py index 6ea21bf6..46ff3e99 100644 --- a/libs/llmstudio/tests/integration_tests/test_cache_and_reasoning_costs.py +++ b/libs/llmstudio/tests/integration_tests/test_cache_and_reasoning_costs.py @@ -10,7 +10,7 @@ # input prompt has to be >1024 tokens to auto cache on OpenAI input_prompt = """ -What is Lorem Ipsum? json +What is Lorem Ipsum? Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. Why do we use it? @@ -20,7 +20,7 @@ Where does it come from? Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32. -What is Lorem Ipsum? json +What is Lorem Ipsum? Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. Why do we use it? @@ -30,7 +30,7 @@ Where does it come from? Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32. -What is Lorem Ipsum? json +What is Lorem Ipsum? Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. Why do we use it? @@ -115,7 +115,6 @@ def build_chat_request( "parameters": { "temperature": 0, "max_tokens": max_tokens, - "response_format": {"type": "json_object"}, "functions": None, }, } diff --git a/libs/llmstudio/tests/integration_tests/test_converse_send_imgs.py b/libs/llmstudio/tests/integration_tests/test_send_imgs.py similarity index 68% rename from libs/llmstudio/tests/integration_tests/test_converse_send_imgs.py rename to libs/llmstudio/tests/integration_tests/test_send_imgs.py index 2523c19f..a06b2f42 100644 --- a/libs/llmstudio/tests/integration_tests/test_converse_send_imgs.py +++ b/libs/llmstudio/tests/integration_tests/test_send_imgs.py @@ -1,3 +1,4 @@ +import base64 import os from pprint import pprint @@ -44,7 +45,6 @@ def build_chat_request( "parameters": { "temperature": 0, "max_tokens": max_tokens, - "response_format": {"type": "json_object"}, "functions": None, }, } @@ -61,38 +61,77 @@ def image_bytes(): @pytest.fixture(scope="module") -def messages(image_bytes): +def messages(provider_model, image_bytes): """ Creates a message payload with both text and image. - """ - return [ - { - "role": "user", - "content": [ - {"text": "What's in this image?"}, - {"image": {"format": "jpeg", "source": {"bytes": image_bytes}}}, - ], - } - ] + Adapts format based on the provider. + """ + provider, _ = provider_model + + if provider == "bedrock": + return [ + { + "role": "user", + "content": [ + {"text": "What's in this image?"}, + {"image": {"format": "jpeg", "source": {"bytes": image_bytes}}}, + ], + } + ] + else: # Default format - OpenAI - requires an image URL (Base64 encoded) + base64_image = base64.b64encode(image_bytes).decode("utf-8") + return [ + { + "role": "user", + "content": [ + {"type": "text", "text": "What's in this image?"}, + { + "type": "image_url", + "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}, + }, + ], + } + ] @pytest.fixture(scope="module") -def llm(): +def llm(provider_model, **kwargs): """ Initializes the LLMCore instance for Bedrock. """ - return LLMCore( - provider="bedrock", - api_key=None, - region=os.environ["BEDROCK_REGION"], - secret_key=os.environ["BEDROCK_SECRET_KEY"], - access_key=os.environ["BEDROCK_ACCESS_KEY"], - ) + + """ + Initializes LLMCore dynamically based on the provider. + Uses **kwargs to handle provider-specific parameters. + """ + provider, _ = provider_model + provider_args = {"provider": provider} + + if provider == "bedrock": + provider_args.update( + { + "region": os.getenv("BEDROCK_REGION"), + "secret_key": os.getenv("BEDROCK_SECRET_KEY"), + "access_key": os.getenv("BEDROCK_ACCESS_KEY"), + } + ) + + else: # Default is OpenAI support + provider_args.update( + { + "api_key": os.getenv("OPENAI_API_KEY"), + } + ) + + provider_args.update(kwargs) + + return LLMCore(**provider_args) @pytest.fixture( scope="module", params=[ + ("openai", "gpt-4o-mini"), ("bedrock", "us.amazon.nova-lite-v1:0"), ("bedrock", "anthropic.claude-3-5-sonnet-20241022-v2:0"), ], From bc5ee260e7779ed208a74abfd930910de5aa3fae Mon Sep 17 00:00:00 2001 From: Miguel Neves Date: Wed, 19 Feb 2025 14:08:04 +0000 Subject: [PATCH 04/11] chore: integration test of send_imgs added async testing --- .../tests/integration_tests/test_send_imgs.py | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/libs/llmstudio/tests/integration_tests/test_send_imgs.py b/libs/llmstudio/tests/integration_tests/test_send_imgs.py index a06b2f42..7267754d 100644 --- a/libs/llmstudio/tests/integration_tests/test_send_imgs.py +++ b/libs/llmstudio/tests/integration_tests/test_send_imgs.py @@ -1,3 +1,4 @@ +import asyncio import base64 import os from pprint import pprint @@ -151,6 +152,30 @@ def run_provider(llm, provider, model, messages): metrics = {} + # Async Non-Streaming Request + print("\nAsync Non-Stream") + chat_request = build_chat_request( + model, chat_input=messages, max_tokens=100, is_stream=False + ) + response_sync = asyncio.run(llm.achat(**chat_request)) + pprint(response_sync) + metrics["async non-stream"] = response_sync.metrics + + # Async Streaming Request + print("\nAsync Stream") + chat_request = build_chat_request( + model, chat_input=messages, max_tokens=100, is_stream=True + ) + + async def async_stream(): + response_async = await llm.achat(**chat_request) + async for p in response_async: + if p.metrics: + pprint(p) + metrics["async stream"] = p.metrics + + asyncio.run(async_stream()) + # Non-Streaming Request print("\nSync Non-Stream") chat_request = build_chat_request( From c8ae83f91085a6a6f11ed77fc1678cdf8ece742c Mon Sep 17 00:00:00 2001 From: Miguel Neves Date: Wed, 19 Feb 2025 16:30:46 +0000 Subject: [PATCH 05/11] chore: updated examples core.py to also have send images --- examples/core.py | 83 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 66 insertions(+), 17 deletions(-) diff --git a/examples/core.py b/examples/core.py index 1eab6c81..9ff09ef1 100644 --- a/examples/core.py +++ b/examples/core.py @@ -138,29 +138,78 @@ def multiple_provider_runs(provider:str, model:str, num_runs:int, api_key:str, * latencies = run_provider(provider=provider, model=model, api_key=api_key, **kwargs) pprint(latencies) - +def run_chat_all_providers(): + # OpenAI + multiple_provider_runs(provider="openai", model="gpt-4o-mini", api_key=os.environ["OPENAI_API_KEY"], num_runs=1) + multiple_provider_runs(provider="openai", model="o3-mini", api_key=os.environ["OPENAI_API_KEY"], num_runs=1) + #multiple_provider_runs(provider="openai", model="o1-preview", api_key=os.environ["OPENAI_API_KEY"], num_runs=1) + + + # Azure + multiple_provider_runs(provider="azure", model="gpt-4o-mini", num_runs=1, api_key=os.environ["AZURE_API_KEY"], api_version=os.environ["AZURE_API_VERSION"], api_endpoint=os.environ["AZURE_API_ENDPOINT"]) + #multiple_provider_runs(provider="azure", model="gpt-4o", num_runs=1, api_key=os.environ["AZURE_API_KEY"], api_version=os.environ["AZURE_API_VERSION"], api_endpoint=os.environ["AZURE_API_ENDPOINT"]) + #multiple_provider_runs(provider="azure", model="o1-mini", num_runs=1, api_key=os.environ["AZURE_API_KEY"], api_version=os.environ["AZURE_API_VERSION"], api_endpoint=os.environ["AZURE_API_ENDPOINT"]) + #multiple_provider_runs(provider="azure", model="o1-preview", num_runs=1, api_key=os.environ["AZURE_API_KEY"], api_version=os.environ["AZURE_API_VERSION"], api_endpoint=os.environ["AZURE_API_ENDPOINT"]) -# OpenAI -multiple_provider_runs(provider="openai", model="gpt-4o-mini", api_key=os.environ["OPENAI_API_KEY"], num_runs=1) -multiple_provider_runs(provider="openai", model="o3-mini", api_key=os.environ["OPENAI_API_KEY"], num_runs=1) -#multiple_provider_runs(provider="openai", model="o1-preview", api_key=os.environ["OPENAI_API_KEY"], num_runs=1) + #multiple_provider_runs(provider="anthropic", model="claude-3-opus-20240229", num_runs=1, api_key=os.environ["ANTHROPIC_API_KEY"]) -# Azure -multiple_provider_runs(provider="azure", model="gpt-4o-mini", num_runs=1, api_key=os.environ["AZURE_API_KEY"], api_version=os.environ["AZURE_API_VERSION"], api_endpoint=os.environ["AZURE_API_ENDPOINT"]) -#multiple_provider_runs(provider="azure", model="gpt-4o", num_runs=1, api_key=os.environ["AZURE_API_KEY"], api_version=os.environ["AZURE_API_VERSION"], api_endpoint=os.environ["AZURE_API_ENDPOINT"]) -#multiple_provider_runs(provider="azure", model="o1-mini", num_runs=1, api_key=os.environ["AZURE_API_KEY"], api_version=os.environ["AZURE_API_VERSION"], api_endpoint=os.environ["AZURE_API_ENDPOINT"]) -#multiple_provider_runs(provider="azure", model="o1-preview", num_runs=1, api_key=os.environ["AZURE_API_KEY"], api_version=os.environ["AZURE_API_VERSION"], api_endpoint=os.environ["AZURE_API_ENDPOINT"]) + #multiple_provider_runs(provider="azure", model="o1-preview", num_runs=1, api_key=os.environ["AZURE_API_KEY"], api_version=os.environ["AZURE_API_VERSION"], api_endpoint=os.environ["AZURE_API_ENDPOINT"]) + #multiple_provider_runs(provider="azure", model="o1-mini", num_runs=1, api_key=os.environ["AZURE_API_KEY"], api_version=os.environ["AZURE_API_VERSION"], api_endpoint=os.environ["AZURE_API_ENDPOINT"]) -#multiple_provider_runs(provider="anthropic", model="claude-3-opus-20240229", num_runs=1, api_key=os.environ["ANTHROPIC_API_KEY"]) + multiple_provider_runs(provider="vertexai", model="gemini-1.5-flash", num_runs=1, api_key=os.environ["GOOGLE_API_KEY"]) -#multiple_provider_runs(provider="azure", model="o1-preview", num_runs=1, api_key=os.environ["AZURE_API_KEY"], api_version=os.environ["AZURE_API_VERSION"], api_endpoint=os.environ["AZURE_API_ENDPOINT"]) -#multiple_provider_runs(provider="azure", model="o1-mini", num_runs=1, api_key=os.environ["AZURE_API_KEY"], api_version=os.environ["AZURE_API_VERSION"], api_endpoint=os.environ["AZURE_API_ENDPOINT"]) + # Bedrock + multiple_provider_runs(provider="bedrock", model="us.amazon.nova-lite-v1:0", num_runs=1, api_key=None, region=os.environ["BEDROCK_REGION"], secret_key=os.environ["BEDROCK_SECRET_KEY"], access_key=os.environ["BEDROCK_ACCESS_KEY"]) + #multiple_provider_runs(provider="bedrock", model="anthropic.claude-3-5-sonnet-20241022-v2:0", num_runs=1, api_key=None, region=os.environ["BEDROCK_REGION"], secret_key=os.environ["BEDROCK_SECRET_KEY"], access_key=os.environ["BEDROCK_ACCESS_KEY"]) +run_chat_all_providers() -multiple_provider_runs(provider="vertexai", model="gemini-1.5-flash", num_runs=1, api_key=os.environ["GOOGLE_API_KEY"]) -# Bedrock -multiple_provider_runs(provider="bedrock", model="us.amazon.nova-lite-v1:0", num_runs=1, api_key=None, region=os.environ["BEDROCK_REGION"], secret_key=os.environ["BEDROCK_SECRET_KEY"], access_key=os.environ["BEDROCK_ACCESS_KEY"]) -#multiple_provider_runs(provider="bedrock", model="anthropic.claude-3-5-sonnet-20241022-v2:0", num_runs=1, api_key=None, region=os.environ["BEDROCK_REGION"], secret_key=os.environ["BEDROCK_SECRET_KEY"], access_key=os.environ["BEDROCK_ACCESS_KEY"]) +import base64 + +def messages(provider, img_path): + """ + Creates a message payload with both text and image. + Adapts format based on the provider. + """ + + with open(img_path, "rb") as f: + image_bytes = f.read() + + if provider == "bedrock": + return [ + { + "role": "user", + "content": [ + {"text": "What's in this image?"}, + {"image": {"format": "jpeg", "source": {"bytes": image_bytes}}}, + ], + } + ] + else: # Default format - OpenAI - requires an image URL (Base64 encoded) + base64_image = base64.b64encode(image_bytes).decode("utf-8") + return [ + { + "role": "user", + "content": [ + {"type": "text", "text": "What's in this image?"}, + { + "type": "image_url", + "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}, + }, #TODO pass all to using this format and also allow data:image/bytes + ], + } + ] + +def run_send_imgs(): + provider="bedrock" + model="us.amazon.nova-lite-v1:0" + chat_input=messages(provider=provider, img_path="./libs/llmstudio/tests/integration_tests/test_data/llmstudio-logo.jpeg") + chat_request = build_chat_request(model=model, chat_input=chat_input, is_stream=False) + llm = LLMCore(provider=provider, api_key=None, region=os.environ["BEDROCK_REGION"], secret_key=os.environ["BEDROCK_SECRET_KEY"], access_key=os.environ["BEDROCK_ACCESS_KEY"]) + response_sync = llm.chat(**chat_request) + print(response_sync.chat_output) + +run_send_imgs() \ No newline at end of file From 2c7f5c7d0ab0803bfad9e7de9e1990f55b7c3eda Mon Sep 17 00:00:00 2001 From: Miguel Neves Date: Wed, 19 Feb 2025 18:07:38 +0000 Subject: [PATCH 06/11] feat: bedrock image input is now same contract as openai --- examples/core.py | 52 +++++----- .../providers/bedrock_converse.py | 92 +++++++++++++++++- .../test_data/tensorops-logo.png | Bin 0 -> 16111 bytes .../tests/integration_tests/test_send_imgs.py | 43 +++----- 4 files changed, 128 insertions(+), 59 deletions(-) create mode 100644 libs/llmstudio/tests/integration_tests/test_data/tensorops-logo.png diff --git a/examples/core.py b/examples/core.py index 9ff09ef1..fd98f9de 100644 --- a/examples/core.py +++ b/examples/core.py @@ -164,49 +164,43 @@ def run_chat_all_providers(): multiple_provider_runs(provider="bedrock", model="us.amazon.nova-lite-v1:0", num_runs=1, api_key=None, region=os.environ["BEDROCK_REGION"], secret_key=os.environ["BEDROCK_SECRET_KEY"], access_key=os.environ["BEDROCK_ACCESS_KEY"]) #multiple_provider_runs(provider="bedrock", model="anthropic.claude-3-5-sonnet-20241022-v2:0", num_runs=1, api_key=None, region=os.environ["BEDROCK_REGION"], secret_key=os.environ["BEDROCK_SECRET_KEY"], access_key=os.environ["BEDROCK_ACCESS_KEY"]) -run_chat_all_providers() +#run_chat_all_providers() import base64 -def messages(provider, img_path): +def messages(img_path): """ Creates a message payload with both text and image. Adapts format based on the provider. """ - with open(img_path, "rb") as f: image_bytes = f.read() - - if provider == "bedrock": - return [ - { - "role": "user", - "content": [ - {"text": "What's in this image?"}, - {"image": {"format": "jpeg", "source": {"bytes": image_bytes}}}, - ], - } - ] - else: # Default format - OpenAI - requires an image URL (Base64 encoded) - base64_image = base64.b64encode(image_bytes).decode("utf-8") - return [ - { - "role": "user", - "content": [ - {"type": "text", "text": "What's in this image?"}, - { - "type": "image_url", - "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}, - }, #TODO pass all to using this format and also allow data:image/bytes - ], - } - ] + + base64_image = base64.b64encode(image_bytes).decode("utf-8") + return [ + { + "role": "user", + "content": [ + {"type": "text", "text": "What's in this image?"}, + { + "type": "image_url", + "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}, + #"image_url": {"url": "https://d7umqicpi7263.cloudfront.net/img/product/0b77c3a2-e006-4740-816f-7654faee73a7.com/c79d819a22b2f6810f787adb851798ab"}, + }, + { + "type": "image_url", + #"image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}, + "image_url": {"url": "https://awsmp-logos.s3.amazonaws.com/seller-zx4pk43qpmxoa/53d235806f343cec94aac3c577d81c13.png"}, + }, + ], + } + ] def run_send_imgs(): provider="bedrock" model="us.amazon.nova-lite-v1:0" - chat_input=messages(provider=provider, img_path="./libs/llmstudio/tests/integration_tests/test_data/llmstudio-logo.jpeg") + chat_input=messages(img_path="./libs/llmstudio/tests/integration_tests/test_data/llmstudio-logo.jpeg") chat_request = build_chat_request(model=model, chat_input=chat_input, is_stream=False) llm = LLMCore(provider=provider, api_key=None, region=os.environ["BEDROCK_REGION"], secret_key=os.environ["BEDROCK_SECRET_KEY"], access_key=os.environ["BEDROCK_ACCESS_KEY"]) response_sync = llm.chat(**chat_request) diff --git a/libs/core/llmstudio_core/providers/bedrock_converse.py b/libs/core/llmstudio_core/providers/bedrock_converse.py index 630c47ba..2263b3c9 100644 --- a/libs/core/llmstudio_core/providers/bedrock_converse.py +++ b/libs/core/llmstudio_core/providers/bedrock_converse.py @@ -1,5 +1,7 @@ +import base64 import json import os +import re import time import uuid from typing import ( @@ -14,6 +16,7 @@ ) import boto3 +import requests from llmstudio_core.exceptions import ProviderError from llmstudio_core.providers.provider import ChatRequest, ProviderCore, provider from llmstudio_core.utils import OpenAIToolFunction @@ -277,10 +280,34 @@ def _process_messages( ) messages.append(tool_use) elif isinstance(message.get("content"), list): + converse_content_list = [] + for content in message.get("content"): + converse_content = {} + if content.get("type") == "text": + converse_content["text"] = content.get("text") + elif content.get("type") == "image_url": + image_url = content.get("image_url")["url"] + b64_image = BedrockConverseProvider.get_base64_image( + image_url + ) + bytes_image = BedrockConverseProvider.base64_to_bytes( + b64_image + ) + format = ( + BedrockConverseProvider.get_img_format_from_bytes( + bytes_image + ) + ) + converse_content["image"] = { + "format": format, + "source": {"bytes": bytes_image}, + } + converse_content_list.append(converse_content) + messages.append( { "role": message.get("role"), - "content": message.get("content"), + "content": converse_content_list, } ) else: @@ -310,6 +337,69 @@ def _process_messages( return messages, system_prompt + @staticmethod + def base64_to_bytes(image_url: str) -> bytes: + """ + Extracts and decodes Base64 image data from a 'data:image/...;base64,...' URL. + Returns the raw image bytes. + """ + if not image_url.startswith("data:image/"): + raise ValueError("Invalid Base64 image URL") + + base64_data = re.sub(r"^data:image/[^;]+;base64,", "", image_url) + + return base64.b64decode(base64_data) + + @staticmethod + def get_img_format_from_bytes(image_bytes: bytes) -> str: + """ + Determines the image format from raw image bytes using file signatures (magic numbers). + """ + if image_bytes.startswith(b"\xFF\xD8\xFF"): + return "jpeg" + elif image_bytes.startswith(b"\x89PNG\r\n\x1A\n"): + return "png" + elif image_bytes.startswith(b"GIF87a") or image_bytes.startswith(b"GIF89a"): + return "gif" + elif ( + image_bytes.startswith(b"\x52\x49\x46\x46") and image_bytes[8:12] == b"WEBP" + ): + return "webp" + elif image_bytes.startswith(b"\x49\x49\x2A\x00") or image_bytes.startswith( + b"\x4D\x4D\x00\x2A" + ): + return "tiff" + else: + raise ValueError("Unknown image format") + + @staticmethod + def get_base64_image(image_url: str) -> str: + """ + Converts an image URL to a Base64-encoded string. + - If already in 'data:image/...;base64,...' format, it returns as-is. + - If it's a normal URL, downloads and encodes the image in Base64. + """ + if image_url.startswith("data:image/"): # already in base64 + return image_url + + elif image_url.startswith(("http://", "https://")): + response = requests.get(image_url) + if response.status_code != 200: + raise ValueError(f"Failed to download image: {response.status_code}") + + base64_image = base64.b64encode(response.content).decode("utf-8") + + content_type = response.headers.get("Content-Type", "image/jpeg") + image_format = ( + content_type.split("/")[-1] + if content_type.startswith("image/") + else "jpeg" + ) + + return f"data:image/{image_format};base64,{base64_image}" + else: + raise ValueError("Invalid image URL format") + @staticmethod def _process_tools(parameters: dict) -> Optional[Dict]: if parameters.get("tools") is None and parameters.get("functions") is None: diff --git a/libs/llmstudio/tests/integration_tests/test_data/tensorops-logo.png b/libs/llmstudio/tests/integration_tests/test_data/tensorops-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a8d5e58e49ca9c8c1c78b9909e725d5dcc6eda21 GIT binary patch literal 16111 zcmeHuby$__+oc`YieQ3)B2vgO-J8S zm(1p9ZiRQRStBUoXr-fPO13?wOExsN5Mmt5Eo3}qtS`i<$|HMD*6K3Z$oPu0HTk-; zoRXfisUE*Rqlhq-prZgTU{1ExIp%0?W?>`XD8%^px&ru`_%=Hu-ej$BAfPBF@vpbw zl@Ozmt*w;+JG+B}1DgXEo29iOI|n~MKl?dOc1})Kyo1%o$--90k=4THB(6Yp?C&+i z$ToV`##Xk*mKMi|YwGA)+Sv**GEyD;*QGDn+FBdy{`=|{Hf%b7zhg)I3L74pT}R)B zorCQhaa+fZ3I6kbflK-}#LIs^{p%u^t;ssJWPM@IbDZ3)9OqcM&Iz*r4?iM4<3D~u+|gD_Uzp?H@A~KUe|?XH zF5be!$-~LZ!_UFZ!N<>Y{y#4J_lN)W{YsX0dPc;33UmJZy8rRLzwZ@fCzj64_@5{K z`{G}Z{O{lRXFdLT<9}N7|NVW?*ZcP#SlL;d{oP-EJ$AAg*_>=)OY8v0zji=hPr%mL z){Oig>wn42_P?$_3QNFD$HGvE(UDc3Y@lOjX3Hq7M7FT8w3fHBIc8>QXnBnF7}oKB zdai$6N|60OeaipEQ(66|!X--U@A)B$3O~RjasBI&@Jis4ovo3jwXmd){xMOqg|&{k zAn~UE{%w@=-<$nET3ejAe=qKTxeG@ftN&Emc$>iAlC-o|va~c4zN}+muXF5-BH2Qp zY)!Ui5@i1$-|@e^tAB13hZo0~{ojWjFa8Y|xS$ZDHNarPd9C`IH3C9XVwaR0Lqq-1;dqnkFGr2ef8M0d(-;4bVKcduh(5dZYCI!{Q2On3*F}Qg&asaG|}u-OAQh%#R`dM6{p3|79nq z?3OXFi0;u*pWNI(`QMT*9!ojS@Fj?U>hLw{jp7O)YzOw%#mF0$`W!uf;X+-mgC%~; z`1_kn4fk0$NLQ77e|xzl$BtQ`!^1gVBJ%m;eTQcG(BRzu+@s5s;?GxFnMsGQ*{)9%5 z9`@Xi_lc{xxZG7Mdrh@4rrX1}>&t+qg2E+nad8T*W=vg+*ekh_+R;|ZkWbyl4I94a zyEqIF54*>-x3HPGJtGIErE$uIoG%*f$mMsMWXQ7UC@v~m>*3+inqhqT&+N!nDk^;A zN2a@c(dy1QrIdQF{YQ_=>gt|2%xm^N=bk{Q&-}dOy7lWRKTQwqNH7;0_x*kKj92lU z^_vd}Idk{*^*Ov?&<*ZTHH9X=$8#zSO7zm13>eq{4&JA3~0Ue%49~afsJpc4?m(A2K+4QNe zX);z;=NRQex)*1LRHj}$dv-CH*Zh6o4~uh$yoWn-U*S`)sjJ6zn2L*U6j@#3`ts$= z6+baY$MZW5^Kvu4`tad=r}Gf&k)uZ~T|#qu>*`CdH%(``ymRm$&9beie-Mo#qSbV~ z!(O1i3jZFWS+$40FhZ3fvD3J-Uxkj)9-Qg(VU1r=z1IMe$MSSViI& z_*hl1S6rtYkS)Akrxwj8B&m_)!d^>?=BNtpb6A7TLjgz*Z4w^;xPECWe3gNhS0!EM ziI-P%hVj0irM~@G>??ksyH;lT3g&yZp?(s>+NLj5aHjLF(It5(G0QIlFLoyu(l|7D zC{W+;>Crtc8}u2+ibA!Fb2_#1XN=3}`!O7lXAEVPuTEBQE-Wm_gbRn#dn_qjX!`Pm z)@gaB323l(`OjQaEh#sNrNV$crBx%Z>GzB?*Tf5Qpr7B~bk~6y=aEyK;>$M`6pG6H z8TnE4*kHUx^zvon#)O04zI|&TP1e>bvS}4OjX2ZX(z0jo-n&?gz`($pd5+J^%dfh+ zxjpvrNebvx5dlG4N=msxK%I7$?e3&)_lm#-FM)?6$OPo z4|ma@W@eT)-Ebq*>~VN_xcXe@wB}lz^wPNNF<+~zC1dJ-jE%|Pym@5p+O-CAO!tP8 zi!`=1I&`^}HYVPvB4ypkvY4omq_2sQr@yJ85g)a7ex^yQCDZ%{PvQ5(8(C_px*KuI z8kTPIX#AOz$j^-W*&g&#M_|&}w3S5}rR6?!L%`!s+end+zV= z$smQjOL1MW7G9axTjMW#Ftw8fu3Ijt=8I}N9nTG`t-jw;(p zq3t}Pm^S%^hRUj|AM|7RF*tbj%9SmV65c16n55>vt?0H>jQw7{dRSwWa9XgXr3FYE zZ(QHCW0Pk?mt2^j)U8__nwpxtLzk~n-@p8DCx>vCCuro- zMAjIoxJN}r=^GmQhlPDBzQ66DfNg9bImda%1g)21abT&`PqA*at1x_e+E&wJ*)F}i zYiY@q?dFHuEEP&BDt!YWZM{``SE+K2;Od79%|3#a?UR(=`MWqXp5_> zD?Tytv^_1mW-nlC!{*Ja#{=r~#oQE>ExSH5)Sy8u6bc+CmeOt=(4o^}?J7n-5YcbSU@Z+gkBn&vcRP+nfH zmSf8#GQAxt+ASBW-Qf0b0NHC>H&Qw#ULhC zHq}C<7sm1~8yhoecls4B&$fO3{P|j;yBq7StbOctdM1Zt|3s3$;=(B|a~42=(a})? z7TlK?jh!x7b*~}r1wh-^TjuYIlSOQ|iW^H!O%01yL5M+B&~d4~r%s(BS^`nvK!Ke{ z&VL-Ji!lZs`!U?=E8kB=MTMi1l5$Sdsc(OKN5^w=ph_Z%!=(O7kP8kw)dRL}*`ocU`2O|-=PpkD2oPYQ8gPq{uU)%F`O`FDyRgBamXfd{T7O0@;N-N){j{_MyFqz1HPOn;%ZG%95?~8>Fl$b^gDSN~4Np!^ zf>oNgWpdd5zV=|p;pnZZ%ZoF&tgPPPGkH{&y1TngB8|txY5vS5*_ssC4>!M6-wV7( zMVb^GUW3c--MjZZ4%8;kI~}EbvE!%IxX&NO8>3|cMGM`Rw`|+?sjV$|KeI}Ae}BvZx!$5TOvr`% zl1I;DM#uRd4^y+Un#x&tc>{>TIwIu!g1{DyoX^isN><*z-5@9_F3xeQM=T;T()5U6 z_A8uYF1?cNXu%n#1GWO2b{@GxA{`2Mo!p9P0Q}D%So-P}Em|JhJ!;`=Wu<;&f;z*g zQ#C0%m-F)S)H00r2n!37__r1<4q4sU#>~k05TwuQSLH!bQPJOBg@p#o=g*)29xZ#A zlx4Bw^)3#25%-Xd+i0xj$91-ET93~7>!qsZTc@dCj!sU`LqaN>Q}xOKZsR{bv8bio zM$1$H?Es-~$#>y%&JT-?JtN^uSA`#|=Q*Y-7b)iYryEvBr=`^nAAnL7=DuhQuo@+2 zD_`C}@bu~Skwp-0l;fM$R16WV;|t!0`Ocg<12S1Qd=srO$fKP4dY5mJ_M40hYV<0W ziqEB`bre%oUh`HlG#Prg={>89O@&*wY&ix>iuqu1ZcIK#E|mMuSvIy`wNcWo{a9e5 zfR}N4LY$l!oX!!5QDao^Y96p*!-np$F-yC15p3;csqdBPj~>-vrTzpW3(%MVKUY*z z64TLnds;0uHFbKV?G@T9@wo4m=-4LcJpSLKf$#;DrU-(MQU zWBS3m&x<$ZS!ifgf!m+?#i8Vb+(x_84XTQpnpD-)J@%MTQVRZzUI0^y*{TMFZOb(O z8Ejc_oS#3NQj-Y5aXl+o7K=6RS9cM6MGb$64gGn4zS;gOLlQtxJZ*K6r1G8JFBKh)IK?W3os zPj^XUsk?A%{=vO_ISoLq6VCVdp&4v5 z8hdO)LND%HB{2lu-0R5`N;R08LoY3OlZc4O$kf7AKe}U4X=&;E)lsZ4XvGPsy`bri z&dwyEQT(bwxNKQ$>HkTa5?br#%Sg^ znkq}XtIS@-cm#g?;RBm@9(iNgRj{32IHZ)`BLw5fw-EkMcqF2$V;m!f&$pK!noL{; zz5SY2329=WGyj5|oSZ@94QJ<^#tuq)`bhzSMW3)c3{n{u9VAn+Z(%|eSzYcGziT3^ zbc@k7o07HqpRgAY03hWTt5qnB$%2Qf4V1&EF(I&J4xDwkJ=-7i6`Dmwg|yAKn+2|c zpl`LcwMI1&8$UhRq1XNK&Wjf>tiU0o{rl0Hm`-P`ZcKSEFu1M$ z&879}jhf533Xu{#1={xZ_M{gnrv}diwtC(0`hnIb<}j!{0RHMO|M_YF*`PYC>Zh;BHxzN1$m)XpRcYy4 zw{8_xSNo!4-&$RsGc{JKs4FdfxS7uJB6A%nv)v?*x< zJPw-Q!9-zY5PNW~M2BNid$(@gimF>T-sv*N;W)01>z4x0zLu94x3nC@oQ{(!Au4(| zu))IgIPYpzee&6(YI!X#|k5Am0EqJRV*H3z$2dMzj0Jr>3~JO~x~IHLly^ zVOei_>h$T!@0WL_-ufwl>#L_|uf^2&7F`z;64Zv6jq1@j`o&i4Nvj{%?;5Y->$;|> zSX|5QWH^kF|XdSs=|Fo~-)p})bufgvQwzm49vt})6_pv~eQ&Uc$TML8n$&VgA zI);{bQqso?Lt2#~aAf|%q0iSUP74Z#fJ1PQ%c*gqzm}E#@aF5(F7rFJVbdl>6%`2; z6&j2hr2NNTUOo3|HDhmaX4e?$qYkDA8=l;|w*fOI|E-=40|Nsnv9$y#Bi#4eh6cRwB7x5CwBOE7V1 z^ezb*neCX3c&09urJ3=nN*~R38q1%XFBMrS!X(I(ep7+C}#-1S8ro#Vg~jCFp2fpJG;eq~`}i00MYtQPO>%OHi> z1)A4xUdzses!!ZPa&B}c2|)}}wj-^?T*B$G;tCK(uhkjr%s1#`klM>i%ILOuPLW~ORZ}}a=yLcR%<@5rpWn!x%64BC0KvmBZn6>tIGjYCS%H#ra&oFsO!nhQ zo#Nwrh5vE5%$gB>0MiAQ9Q%D-O1WkdESBJ5kU+uaZaFx_#Ku1A4|DN}l=M}ZvXt`s z{NdJ5N9nN^gFTkk)%nw~ zl8h97zn^FFx*H$QjL8RN^x?yY>gw^$ZEbb$r1l943DpeEwD#Cz1po1)C_z2lsQm+n zmfOsJ^a4m^Py=pRTSq{pu*E#Mb>HdNUs%@?Us@I}2lxsvK0>P?o)l9-#+8}ZuMdPd z{W`cZn^hS2GKN8_K3>%qw*Zad`Sa&IC0bD8{QdXsJ1x_VhW)c^b%hV@vCjT#?SSov zoSePX)SuVy68!k}`N^%jc4g(*K40YL=6-?6lMBmcKiVF*&?6`)_{iIvJlvc*{k!H< zrD%G3x?b_Ut&nQR$2?YpZTi1G4-c0|EA#R3nO|5Sz>>>pQa`;!eZ2qr&q>Z`ts7Ju zl+;z?RT6tBO`1QU%n@>Ws-EPp>Tr3;50zr_0c6nGiU3wU47((5drIY%y`dKzenE(1 zJbU(P{CpaVzrX*dk9XEriJq$G29pKYa~apZJETQjw>q{-JT8b%w^alCSXxz8HQXLe z^O&WA=ra|s*sqgFUXar;D|4IFU)d+blXyt=rN4iqTmR6IDX&0O*c4!uM2ACORlKoV zq+)_l-JnMuui!+}->`8b^f+A}?$6V74RM#FogghG+b5qTN{NQXL_@~X(lY+KC5z|t zii(PC*9A^6EaK?274aB-zYSR=aBDb80)?BmvN%*3dVw}nP7;N#o@H?q-wY9QQ3+-k z9T}0;*Jl7M^4Rz5s}q7QxHqP!ScqAmySHzz!N8w!@bFpD4=b)FBYR1IZnzn{FZ9u( zU0yXXh^A>Ma9?&N=8%oUN>ikmy0=Y32YJm7Kw2`uZmT56H4O#wnjhle;Be@>nYBIr zLlbnyKy~Fo3d=^N{U&yg5AYbsx+$=3=2QZC#2ETr_=Zaj3u|tW4+^+Ow|dapyiSnM ztoeIFO)AYQ*|`e+MA;Y`}pcX~YeXvMwh#5mnAQGSWy<9Ew8e^UlPv z^)bxbWDk{9yUY$Bzi^=~p@AFXcXO)eT;V)wdt3OUwH)nGa|ka z@4e~0Qz~zUd1CxJBjJN~Qm7TLugaLuX)id)4vfy;&&&vtDJ*Pz zP|m42Vt;|QqiUII#dVaFf;q~{)|UHlpC7|kSQ+MlyXvTnO=@pk-m#8*$J&&ct5b$q z-?R2b=S0Uz=j8TTRGTK6js3dmF}+OXe%OIWg;`4ZB5Qg+PXgV^7<{LI+c$UJs(gGG$R{%tm*cFg-td*IfnHUqhmRbQ!N4*;G4Z25?m84Dlc{0= zl`)X%?c29#CSC-EL_I$b2#6ku)_v^j>zm1tJiwa$;luZILwTqh;!&BmEcmQh!^S*B zR5nU4musIJ_gJ0tAmsVp@|Vnj>dB?4>bhhtk*YY0))7V4gPuhnC;KX#Mkr0_;T%Jq zEkH;>GU0ca3kOAO_npG$pxv~K)nFa6G9X)JD$^={Mit52VfldV>x>RS|*4{ zjYI_8(GkU;hZD{yoBGSYK8L=y(+X;g{a9z!RJBMox^$)3Rqv~+bt4cGG4q&Ah(<>= zf?IYv^&iE!P_?9mezcuVu-QyWcBBV_B!^{Z-l13A9NyPdRL!obn#US5Y2LZ0?V`4y zMOmBIqFs&E_Bgr?k7;AQV=)wasCQRYR05Pe6oF|~Jqb#efaoWVAAd_y$}urs2DLEQ zR@K2)Qc}B_5!P-v>CctMS)1#H$y*ze$vdR{GQ4*sd}&j=;U^(Z3EHr(XqAnJjeY%V zbCoxw%b@2NK+{Y1!Razh|0TOo3gUWCPcdNpja!WUk9ygw*RNlXXJwBJi-e%qaH1qp zT_L)$NsDz}3BD+=2{j8a2(}%7`;>sdApjV};y__H0U_t`zhunIv@6at&m0O13v+aF`T6sw zr?2lWNI?zvuEU{bvkO{sU7R+CeQ*ix6cmJ{t44bdkkr&3p_8<{BcTYuW3R}{iu=89 zG#PBmN}hFr5J|Y45D1P4*gl#WY6>>r*!5nS8KOR6n)nLM9spb>XccO+&PhLBFOM(%gF%6PKNtw<*@Q z2dDU07t%+QqjQ#3BPELNuD0Kcn`-B7o&o{NgJMXKK*H&Q(!Dr65LsodO8v#mb3K%f z8l&F%iJvm4F0ef~w-Me9SN+5;UR(odWcwlRM;||41mQs20ysqa3ST9WNR(nbE357X zRV{MuJ1Ld1pK|LZW!GP0UA7DG*OSeS9lY1(BE)IT`lxAo)x}$Y>rzZzhw_<6#_CG} z7TLzxD|>D{=rCm&dQK@iKI2iB{mi4pEofG4rTpX&rBQ;X&g2Wv{`iQ96Q|`uzDm-& zeFocXNh5E=CjR;}R>(Kh$WJh*c8G`{O_TFWd_`8SKsyPH)KH)<@ujc6w{;)1kA~>^ z*oA8j!l_F!0zZ{gQ7eL8+mkA(v&Rpm|ex zm!9n;)}xhXypT4H#RhDhFeV`F*p^Cfs7RB6NA!e-6*B+6kCwrjFCo+8+?#fg`;#99 ztzvuAA?c8YKEqx*4;hd?=3plOk`f(*?XydFrQn zG{*?tjh)x(?T^Am`1XyEg@Uv@*a`#i^Hj$PUDzbXJnVM)hRP`gi-XMOy$kjWg&LY; z?-B+Vx0?z`C{W`T34tYJjMbNknOP5e^jE?5`_?#VGSZsG{4giv(+i{y(ye}onvbmH z1lVazDO^|YDof8B`aZ_2nxu5YLu0wqh?}&33nB_&!J9nawp#iz?4hMK%v6~V&o008 zaOcr8OiVSrkD)#Tjb=wXp2)@2*-NWP$;#r$lb)0$j}$e|=J$E3fQjbK_dFpqWxlrT z?96fqw_3Lz|%#p2{k8-69S?MW{#Wa%C4-bxk@Cij03_B z$k)_LOcQ;%``*KcKSxI`4D8=)WW!J>gi8AT`?a2)9(a#B7z}^g3J^XCkmCS{?gl(u z1l;<~n>Sy*di6YXda!U2pv}dGBb8e23-`wgSHnP`2m|c*+lNM-dD)Of7C32XXwuyN z*n`qa!J2}#5u=){dGG#x9YaG&clQE=3CIJ)th$??ULKks8q23opFEFWez5z%fv<#7 z3BoUi7K7s+g{gfFA!>jn?m2j{3LWP9Jn$C%ZC#Kf!k86o2!+y#AQ6@}p zpaSg0)o~CKgxP_5@JERw3RulBZSsN8W>WnjEzPg8Qij*8`6K-NyW!#V`OY&vsPW`X z!3+jv)^fOI0wCm8c6MZxFf}zbalasxaax51$`5ZriX-9_i6lx-&zC1=ZJ9fu@IBam zP!w-oz-6SQrB9we|61qM1F+hNzE#LLW*s>%v0h-0zZ(+|kF-*_ZdfnCr7~;Hz}zQ? zbc`Gvz2D8Lk+XC-{yx_b_vi*b66PjaYi+E;NmdUiUdSw9VG(U8uBg}s?H+CMih;pt z*iyck~O-3F&i>O3CwR~JV53iz!C9#{W_M_AW6bYEF8+_e1w#;?tfe0^c&bJ!27LAEuR z$%E4Y(B_0^3Ki57!2%2hg!KRs;CXPcDUSwBWa zYZO6^irU_!>evdYgKh{#MLEK$Qt__K8;0WMk8QEokjc+A zw`oX91t1ZM=c7F*o6`+PF{j$a(ty zHjhPn^I+!a?CdNItgeB?dS_pJO+XM7IUB?z_U_xq?>K%8Cl^xRCN%lk;g-utHt}2c zZt-IvP8_xPac1Tx**5*0&`>3Ojy#6a0T;w|X`+IRILh|*%gfN?Ae1JMC|7T+CICQzv$X|oF1ot92?1|$ z!oh-N0y#G#69SO|XNO>Qf;gklW4ItcA%|88yqlPriHeB03nIc{_zkS{_eKBHvI${X z@PmnGg5iVW1Vz@y*ox2cLJ6yz2a?sJv6WBhMd-kz!A=hfyMD-QNywpD=Ie63Y+=C$ zaub6%2SH@8F`M!=tBF3wXK@6>c{ExOMjKAl7_4FHayZ{P4f`NUx;H$Y*Ex2Kz%+XDP9DLFZb+&^G(zHZQ1nP@%Q_|7oyh$od5`;fGPFZA!LFfri`4Iqd_v0} zQ8(~mb>$E4ssw!$Mk-`aqMt+SS8-@77-D;Ss6O!Z>no72XG5LufTo}|mti(TUh^j& z;vLrJiekek8~SK(Tuhi~0NGsXkd)tRAs1e>kYxLOsIFt!nG^}e@%+xK5LQ78pjDqd zb?QEW{7@3$(A`0}2@=L|Tb3_a@e63Uj{&ZD=QD=KI5@{DIH9K1Cmg?x_B)yEvHS$o zD>$(uDS!-PVxe&Lj|fz7SoMd|-4QwXP%=t+@?;yzE$Ge0O`Cdv{g_iSjjK_A`*San4q-Yj$vMdR7K zXU`o^Pfy-8rz$v)A3tt8*4bfp3uBoi$l>_(v=|1-X4Cpu1q!I^=+%^je8IC`ihUuP zz-Pd?06+!7RKmu>AT4$EYVA6iMAj%*tOq)1hD}_6IC2D4ncRgMVeZVpRB>krTqwF2 zhp|ow-FyFLC*I*;<}D7!L&FPz*^j!RA1T0WA_4Zuo;QA1y&~=mal~FAmRgYv1rmuD zB4VizBy~ksCxlwVFeiy8=IIY2&NQ&FS8!4SHdX3XLhD0hE}8ckY)7y^-I@q-R8S}? zY!buc9%^bau!TgD`&ko~fB_!mw6rv6)tk5sDnCMd9G-*Cw;hSCrT96rz=1awv$qE8 znYM4bocQM&$>&hKQ^qf|mEV!RL|hFH!*LiXfXC;4ei2(Ax3W@g-=1*mSy@KbEk+J= z6O!r4k$F&hE;N>jOFh+`>*l+4hWK94_GvEUVzT;qoI)i;Gx(t znqF5^yMmDp0klZ)b&>!qW5g{3FF06G^0%FeGocr$8;V6=;WTgMhTlXqb9_SI7g{X_ z78V&(#94qUc7usWHtzM zka{BupE~Mn2;+$p5seZ(7DEXXTj(i>SaRup-r_trsxjh#SRdl31iir^E%;|Roq!QM zIv1V-bOT>K%1K2dK zV!1Q+(2Fblu8-U2$B>EuCIWC;-YgUG1h zL5a{U2FU~7C5PrN!tlHvBlkQsG%?XF(__`0$N=DcjFm-a-~P3GZgR5rkgAJ|3xY!# z*4uXMIEBm^2=`McC5g9$5v2toF;FSX7geA}850xGP*bv`0`(zoqlLSz?F|%OcBxoy2Zyuo-3~DE_d~gqrKjLpdd6tAA*+Rk0fA)wPf2c z0{Zem05GEkCaT0oSAYGgjlMuA$p|~6R3%~RL1xX;Sd3*O1IMwW!0}K_6FuM-u!WkD zQn+A0e2kl0DfqhxtX@sm32~53DclAE3&h+CKF$SS95ytiT8RS= zurYOTqk?noHq&EW^s1_=7&bmQ&zuD}X`J0$RbCzehJlRHIBb8yGe+>qyHC&Ao0u<9 z%E)1ULHwDRr$B;8Vy@6Gp%&@)etk}Ka9ClU=wm6^2&!${C^ltjH_ZoPgCxpjr>uy8 zI~W`~SdzCuYZa2Y4;tFLHkveHR|&%d?eJld_C-I2s--aur-@U=DoHoXFl_MXTw~V8 zfg8Y|XwcW5y0@Ca4QAeI@fmvO>tElM$Le6l;$)jv2*vjy!6ylIncscsJbvZmg$u!$ ztvC=NL2~4M$3sMwz*2~L0?oX(u5Rm&9b}Y=n7H`cx&iL4I|9xsh);oi{Tf%+BIaHr z_al@gtT$9yE(jZ6U=U#nA+nKj;li@8wTZ+g8=Ksa1;T%I;Ma+!sMRybFJgVbuf>Pf zHE^F$y?OI5BT_ggz17z&NiKtUo&bC?BWzci_oX{9Xj-W;W3f5?SH)Y54)~*lAH%~5_g}R`@>$cKWA_9$w)tD>Sg*L+p&3H7Vq|1Qr4af!VmWvc zYqVG7aOC0GgA5ZEFD5gB>q<-i1eCQt(!_Hn%Bjc0%Y*EJh3+06e){m?=3T<`Z!)Lr zFd7jf@Y4JQw{h(TAT@C@OdgOpX_3l@PsgGEbvGm*;$UNyT9=V7X*47EfKs<+Stg6q zTx<}f!j#c8>4>BwDbq{}-6?)B*xI-1=!`9fd{-EJE?;Idgt(+_3tn%ln>#PqXU3dSR`{vCsb=qm#1Z(TF5x2>NS#+s-!6P1i zCew1_d5Psj^ygx7lOFdW%AUrcZ;5A={hJvvhQn1+%eIcnjFXhDPR(>xV~#{V)>a_2 z@nuS$A>{}?{=Ni%mr#tfO&p~?z^;5!cr-dertZDd_3&^?|C>(FoZ-2VBg1x10fYJV zwz~%H8m`gXeJ@SZY)}dxRFsSEzjoNl)K1(xko#z2a>a7T&Wg29Tv|_Ye}O9jaY)UE zs*$(YkobF*_p&1jf9gE~#wvp7qfW2h>w9uqN|Bq5%1MVzhV-Z*~MBR@AvM|VNTN%dIHX7>g*;tqa80^F6NTI zKBWl0pS#v1K&ngUW({uZYnsk!9K38k6PMJd@9Yy)E9LiYWXOuKPm7l2%S70=08;m0 zO1g1~oH=`t7kNY8fYYjx#awLzkGaO=$_=07Z6?_czrWuBjWK2aG2)8;a|Z&H75Ebb z4jIH)O^*J^ucMunBhq{mNa6(E-?K#XBZ1k$Mc%<>C6_64l7v)lJTVR|(LQ&qB2E2OkFUi=ncUMRPj-69T|PZOwfpXj$lX4@q$d?cw*?rCq`urBzL*?ksRRhy2ht-JHlVE5fq|Nq7R!5YkaFdT{ecKrym R81X0RQsQ!ANut_!{~JUnow5J` literal 0 HcmV?d00001 diff --git a/libs/llmstudio/tests/integration_tests/test_send_imgs.py b/libs/llmstudio/tests/integration_tests/test_send_imgs.py index 7267754d..16dd3cc4 100644 --- a/libs/llmstudio/tests/integration_tests/test_send_imgs.py +++ b/libs/llmstudio/tests/integration_tests/test_send_imgs.py @@ -62,37 +62,23 @@ def image_bytes(): @pytest.fixture(scope="module") -def messages(provider_model, image_bytes): +def messages(image_bytes): """ Creates a message payload with both text and image. - Adapts format based on the provider. """ - provider, _ = provider_model - - if provider == "bedrock": - return [ - { - "role": "user", - "content": [ - {"text": "What's in this image?"}, - {"image": {"format": "jpeg", "source": {"bytes": image_bytes}}}, - ], - } - ] - else: # Default format - OpenAI - requires an image URL (Base64 encoded) - base64_image = base64.b64encode(image_bytes).decode("utf-8") - return [ - { - "role": "user", - "content": [ - {"type": "text", "text": "What's in this image?"}, - { - "type": "image_url", - "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}, - }, - ], - } - ] + base64_image = base64.b64encode(image_bytes).decode("utf-8") + return [ + { + "role": "user", + "content": [ + {"type": "text", "text": "What's in this image?"}, + { + "type": "image_url", + "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}, + }, + ], + } + ] @pytest.fixture(scope="module") @@ -134,7 +120,6 @@ def llm(provider_model, **kwargs): params=[ ("openai", "gpt-4o-mini"), ("bedrock", "us.amazon.nova-lite-v1:0"), - ("bedrock", "anthropic.claude-3-5-sonnet-20241022-v2:0"), ], ) def provider_model(request): From 68ef0bc5ca628de389d75a9592eac9fc2131d80f Mon Sep 17 00:00:00 2001 From: Miguel Neves Date: Wed, 19 Feb 2025 18:34:56 +0000 Subject: [PATCH 07/11] chore: ChatCompletionLLMstudio print now hides large image bytes for readability --- examples/core.py | 21 +++++----- .../providers/data_structures.py | 37 ++++++++++++++++++ .../test_data/tensorops-logo.png | Bin 16111 -> 0 bytes .../tests/integration_tests/test_send_imgs.py | 6 +++ 4 files changed, 52 insertions(+), 12 deletions(-) delete mode 100644 libs/llmstudio/tests/integration_tests/test_data/tensorops-logo.png diff --git a/examples/core.py b/examples/core.py index fd98f9de..caa3c56d 100644 --- a/examples/core.py +++ b/examples/core.py @@ -15,9 +15,9 @@ def run_provider(provider, model, api_key=None, **kwargs): latencies = {} print("\nAsync Non-Stream") - chat_request = build_chat_request(model, chat_input="Hello, my name is Jason Json", is_stream=False) + chat_request = build_chat_request(model, chat_input="Hello, my name is Jason", is_stream=False) string = """ -What is Lorem Ipsum? json +What is Lorem Ipsum? Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. Why do we use it? @@ -27,7 +27,7 @@ def run_provider(provider, model, api_key=None, **kwargs): Where does it come from? Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32. -What is Lorem Ipsum? json +What is Lorem Ipsum? Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. Why do we use it? @@ -37,7 +37,7 @@ def run_provider(provider, model, api_key=None, **kwargs): Where does it come from? Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32. -What is Lorem Ipsum? json +What is Lorem Ipsum? Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. Why do we use it? @@ -58,7 +58,7 @@ def run_provider(provider, model, api_key=None, **kwargs): print("\nAsync Stream") async def async_stream(): - chat_request = build_chat_request(model, chat_input="Hello, my name is Tom Json", is_stream=True) + chat_request = build_chat_request(model, chat_input="Hello, my name is Tom", is_stream=True) response_async = await llm.achat(**chat_request) async for p in response_async: @@ -74,7 +74,7 @@ async def async_stream(): print("\nSync Non-Stream") - chat_request = build_chat_request(model, chat_input="Hello, my name is Alice Json", is_stream=False) + chat_request = build_chat_request(model, chat_input="Hello, my name is Alice", is_stream=False) response_sync = llm.chat(**chat_request) pprint(response_sync) @@ -82,7 +82,7 @@ async def async_stream(): print("\nSync Stream") - chat_request = build_chat_request(model, chat_input="Hello, my name is Mary Json", is_stream=True) + chat_request = build_chat_request(model, chat_input="Hello, my name is Mary", is_stream=True) response_sync_stream = llm.chat(**chat_request) for p in response_sync_stream: @@ -126,7 +126,6 @@ def build_chat_request(model: str, chat_input: str, is_stream: bool, max_tokens: "parameters": { "temperature": 0, "max_tokens": max_tokens, - "response_format": {"type": "json_object"}, "functions": None, } } @@ -186,11 +185,9 @@ def messages(img_path): { "type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}, - #"image_url": {"url": "https://d7umqicpi7263.cloudfront.net/img/product/0b77c3a2-e006-4740-816f-7654faee73a7.com/c79d819a22b2f6810f787adb851798ab"}, }, { "type": "image_url", - #"image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}, "image_url": {"url": "https://awsmp-logos.s3.amazonaws.com/seller-zx4pk43qpmxoa/53d235806f343cec94aac3c577d81c13.png"}, }, ], @@ -202,8 +199,8 @@ def run_send_imgs(): model="us.amazon.nova-lite-v1:0" chat_input=messages(img_path="./libs/llmstudio/tests/integration_tests/test_data/llmstudio-logo.jpeg") chat_request = build_chat_request(model=model, chat_input=chat_input, is_stream=False) - llm = LLMCore(provider=provider, api_key=None, region=os.environ["BEDROCK_REGION"], secret_key=os.environ["BEDROCK_SECRET_KEY"], access_key=os.environ["BEDROCK_ACCESS_KEY"]) + llm = LLMCore(provider=provider, api_key=os.environ["OPENAI_API_KEY"], region=os.environ["BEDROCK_REGION"], secret_key=os.environ["BEDROCK_SECRET_KEY"], access_key=os.environ["BEDROCK_ACCESS_KEY"]) response_sync = llm.chat(**chat_request) - print(response_sync.chat_output) + print(response_sync) run_send_imgs() \ No newline at end of file diff --git a/libs/core/llmstudio_core/providers/data_structures.py b/libs/core/llmstudio_core/providers/data_structures.py index 45ca5d70..8b53b1cb 100644 --- a/libs/core/llmstudio_core/providers/data_structures.py +++ b/libs/core/llmstudio_core/providers/data_structures.py @@ -1,3 +1,4 @@ +import json from typing import Any, List, Optional, Union from openai.types.chat import ChatCompletion, ChatCompletionChunk @@ -118,6 +119,42 @@ class ChatCompletionLLMstudio(ChatCompletion): metrics: Optional[Metrics] """Performance and usage metrics calculated for the response.""" + def __repr__(self): + """ + Custom representation of the class to prevent large fields from bloating the output. + """ + data = self.model_dump() + + def clean_large_fields(d): + for key, value in d.items(): + if isinstance(value, list): + for item in value: + if isinstance(item, dict) and "content" in item: + for content_item in item["content"]: + if ( + isinstance(content_item, dict) + and "image_url" in content_item + ): + if "url" in content_item["image_url"]: + content_item["image_url"][ + "url" + ] = "