From 2ec360c27207f48574ce1d6bc0f0cc46a6256469 Mon Sep 17 00:00:00 2001 From: sunmodza Date: Tue, 29 Sep 2026 15:01:22 +0700 Subject: [PATCH] docs: make Aiython easier to try and share --- README.md | 35 +++++++++++++++++++++++-------- aiython.toml | 1 - assets/readme/social-preview.png | Bin 0 -> 45499 bytes tests/test_config.py | 7 +++++++ 4 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 assets/readme/social-preview.png diff --git a/README.md b/README.md index 081f2d9..a199e32 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@

Aiython

- When Python doesn’t know what to do, Aiython does. + Put AI at the exact line where your Python program needs it.

- Run ordinary Python with inline AI instructions and AI-assisted recovery. + Keep Python in control of the loop. Use typed, inline AI requests where you need judgment.

@@ -25,28 +25,40 @@ >

-Aiython runs Python normally. When Python cannot parse an inline instruction -or cannot continue through an eligible error, Aiython can hand that part to AI -using the live program state, validate the result, and let Python continue. +Aiython runs ordinary Python. At an inline instruction or eligible runtime +error, it can ask a configured model using live program state, check the +result, and resume execution. ```python kind: Literal["bug", "billing"] = classify this ticket ``` -That is not normal Python syntax. With Aiython, it can become part of a running -Python program. +That is not valid Python syntax on its own. Aiython resolves it at runtime; +Python still controls the loop and uses the checked `Literal` value. ## Quick start +Use Python 3.11 or newer. To inspect the included example **without an API key +or a model call**, clone the repo and run: + +```bash +git clone https://github.com/sunmodza/aiython.git +cd aiython +uv run --locked aiython --explain examples/recipes/03_loop.py +``` + +`--explain` shows the detected AI instructions and recovery checkpoints. It +does not run the script. For an actual model-backed run: + ### 1. Install -With `uv`: +For a standalone command with `uv`: ```bash uv tool install aiython ``` -Or with `pip`: +Or in your project's Python environment: ```bash pip install aiython @@ -58,12 +70,17 @@ pip install aiython aiython setup ``` +Choose a tool-calling model. Calls can incur provider charges; review the +[permissions and data exposure](#security) before running unfamiliar scripts. + ### 3. Run your Python script with Aiython ```bash aiython app.py ``` +You can inspect your own script first with `aiython --explain app.py`. + Modules work the same way: ```bash diff --git a/aiython.toml b/aiython.toml index c473458..ab64db5 100644 --- a/aiython.toml +++ b/aiython.toml @@ -1,6 +1,5 @@ version = 3 model = "openrouter/openai/gpt-6-luna" -env_file = ".aiython/credentials.env" api_key_env = "OPENROUTER_API_KEY" # Optional capability routes: diff --git a/assets/readme/social-preview.png b/assets/readme/social-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..ef8183bff4d3ab442351fd6dd020688d6f6a9400 GIT binary patch literal 45499 zcmdSBcT`hb-!6)MTM&^dh-^`53P_jkRsj(KDWO9UL`vu_^w>cVP^xq#)P&GGgn-hk z^cq6%B=k^|J8|##obS8i9ru3k`R_OwE?mi)YnI>qmFIb;AD^i!)1G5HM?*tHtMd4f z77fiQ@ayqce;fywr(Ygy)6nFAL4p&d|vm)k;$jE~@9#HGWfhiuNM?pV!Z>y@1bA@^8^LI|Q;PlY8c>3q%VG zMXlZ)5~W;2C#N}h!HZ~UdfnK9e*bcx=Je6^70rd;|2)R}`*Qs5@5@QE-wg0@s|Gl+;M)BWo()>OAS5Gp~Dl!q5;YBF>@IsAC zJXeketaB&3~jq- zjvjnK`~RBF9~(7C_g^hueFZZ$zj@;Kd>-4;Z4P>2cJ#qNeRB#vH6CZ8_T<*@$N!mq zUUuoAnx_!(XG2YgQBjle-0ye1V>8R52)t9{j%ZG`6=SnM#ulOkfkZSvx@~>b;w9Tx zX>oc7w#A0@A44i5zkG=`BA^4m>hyJV^p}Q)N!`?D`g>I4w(<=3ti>qI;`{oCXwu8c3%zYwtzi*u~rpBY?>aQCe$ zVpBwSSr@U1Vsw#xylf$pQ&a8-bjR~-hc->wrr=wxGwr7lr;+kjwHIM6?j-zRpeJy12H*n ziH?R@!XjbR`O7pxKJSruD(VBHCIphN$%N&XHu9M}pRZR<^-2$%cjHdfb(8M0ZT}v} zaQ4VpP}23yGI>Fc=1)eu*iVz9x^<{1wvfv#@N(C%zZMp*NGHxVY-OQ%+3Hi-3hVNV z`!S^r!uPw%t&1dr`jyaqv5)NRH$&KWrDXz3D^K>ul>GH%=_MDJ64E+o*Wyje=-t#j zu&FX`9K9=&GjY_g567+8rFOVb`gKrWsB>5esmU}$=txr3frzn*-x6=_u*!Z*daSw3 zh%rSLY8P#@VK6CuOT}yvTxT@mK5=V8G#T^z&;lo>`|_WR)P(=NiC+CWY1m@3O!!*1 zAo{YhqKx%Z!>B~(>=^`;qKYcEA4yJBGaQYL^?(T9%1Xb`7nv3((oT*2WDsQQmdC)N z>|DSS5~%bA+c?uv+B-Ay2%RP%cGTfZuhLMmhx>TC9`h-|1^Z3zo-M)LHmrQ`^z;jv z%HBB9l^J-_rg~>v7jH@?Did^$UK4CnF%&QAu}5f`RP*79I)a{^n>jir1_#k-3{<+& z=lm&k+ukVGSaxnX-!FbZfZfH1dTyuAV!zZx8ZJgwNK|i4`vbfiSe2#zq0fYQo1-Yj z#o1Yc^}>J*LL!!`+{N46JV0cV>+SC-He%1nd#RpfV-UppNc^L%mKt?CIt`UV-`u84 z@Yf&n(b-+}qF1!DzsUzVv@b{Trs#UmjFsC!#_YTnM!PbSJySo=n3yD3smHVR7nEbM zCig9^5iTVL5nl$yXiC&Cc%bUYip>5J+)h zpTgY~2k#GmX+A~Sis&&0^K+%}as}}QU1rGrs#ES{Abh3Xj8TT&lI$!T_sA&g*06My z<*b(cBcV6mDTjWNWOSZ-Vr{Cj_xWmWg#=7fwBt!v5(hWEQ}#LuC7*Bp8AkO_%FW+ z7=)1?A{O-GMNsXZQATHFU3SLbFg$#7{6w5s$#ygYkNPcc?wM*a)=&F%O40tRjEXi) zW0QR>$p(eKe=$&%jBSo=0Zhd6J{%OWzcJIgCXMZIllzVuXoQHwJ(ZByYvlB+k;Pl< zByzZ0oW7Uw(z;mMM>A?k;~aba3mphDg;ktwYt^P%I1pp%Cf(ekyVTEY#4a2+-7pct zAF7_gA>FjjP<10)?|4Rf8vbzH!iUV!*3|S#+I{b%m8mqnJ1Wv>z2&@yGI40LGi69f zcH_~;=Rea5o}4`DnL`$hT@FRghxp@@fvd5JD;klj(1k{^DVBSz4BO)?iyQ}rt;Ik% za1|h$_}QBjT3OxX(56)}7vW9O7Tab^4Cz-AGW4^pkdXWNHBOLk;d1g#L(KZ%-I={t zPoj`MF&)KnvN=|sQyq98S1Vd}*}Tt^L_FN7CQs(@_|MACD!;V?rZhr$PNK}T!*8eZ z#}tj~DP5}nZhP3;Sv@(dEbVFJ*Ph(W6zewXl~3tBoQTIcdVj#gg1W3T3E!R*BtGH} z{9`goahg{d6AP6{>4olko5U^l_uHh=#(GSDeOW^G)sO(RNP1Ye{G+GoEmzNZ*5y%A zUK&Z#g|NxThSQ%7$3(kmF7;v=l-q0emFt^q>8$=Rdn=|??C zgc1yCy_v$xt(~627OtJ+zBF9ym`jv89ideITsBGhnwM{Xg5`&7&j>zch*}C;;UmbS z&_sx6r5tI-5dpAQp>%RgHCpI^e5sn{Sk4T=UUicYCk+JI}gL zlk>V)whyOWO`){ZYr7v9-RoVNH_lDOsNTRN#&>117UW#%u`t&lUUgE|fOIVupQgtE zPZFq$7LR?pGW-F)GWvWf-M*uvgF8ay(TyPR5wE6Igi@H-`WD$v!Pn1Bx8$#kK3o1` zDKBa@_9_R53p7U`>(N@0m}O(59vV8!_wWp@C+V#QL{-j>V+7ZZ#|w}x@eSXVkT$Iq zGa-kEEdKOyp2p-XseFOMt<&VjiTKm^WMt|aObjcZ_rwqmF2NT>N{>>7qiDLk08JEJ ztXnfcw4Z0&e66>GEfF+L3H;iIHTd`!lV*L|!s`3E7yEPRN#BQGW9mAM9@SYhBD-E# zAid^a=fegZ`>n-Ld(doV`ZGR0JZIV)IT1QIl^7l+8TJrV`L(iwPgf=GIpTDUN>{&0ClHy{&xsVu6R-YK%eW*J&B;?+` z!GSGIPbt|xw`!-2o%A%W(#&~+)7HX5bgNZkpS%(!llJ`W9vvP|{&vhSAoQBgUYiv0 z;?bP^IvcH%@!?kkDO~`CpPT!Dh4v16&Aed!bVaHm`|87z+RqkuEw5a-A|+)b)nGT( zY;D;>SmfYDGx%$VnOwr?+S!SnMoL?o5yop?#>N^LVstgdf>L;clt8RPp(gcPiKF|_ zT$w9qYccMKtZt7UJRYN5+EFevkQ3I_+)V$43Ee+qVz={oB)Ga`2rOlW)pT|Ck`WJK zr{-{fvv+|K{H^e1=k2v^1i3H6tH&{in-VhSw-HsPy}Z24e6Th0lT3(^Je-|coIGe} ziAeUdHJ;$ytMzf5R>PH7$-)qO6P2TEV5l@8WlLU!LXdq)(mq~R+w-3_r@qxc#ER5^*gDqob8C50&25ewFcCt?~D|0h`E4OKpP| z-6Tc6KJ=dR^YWp}mm_$fss`2O?d2ORvqFXFqOUV9DgMgso2x!3TI zrhnAWe;q9IE&M=xZG3SuVc%svwREKDTx;e1moHyVf3e`vNNyge*x!mtZnaOc@4~}B zi6N}*M$>!?E8G@;HRT?IALaJ1XpBvGgE9-r-Y-Y?Zx1OcqP36meh5Zg5}!iLtEfj3q@+tPJ|@Vfmt@v8V8(kLe)_8Mz{{=ln=L`U|)bXSsz&-RSeK}&qD zJhW--)~#D~xDAR#qEA3EX|0K&a|T`8$x`^Y7f16(@UvkO!eSr+Me5#2l|xBl(C%NR z5npv6kor`9ZiuE@N}P@`A4>D-Y2oR>Os!VUZqezf*p?NcE87XVGM;9n-c=(Q3`dP+#ZH@=&;Y{%*n4iFn6UuMz4kI{}F~-{Ky1$e|uMzT> za8@7UPm4KB5}FR+q$Iq(y}hf|p_GrmjmN}Kjf`pegsN4NrBNxVMW)mtQQ8G7q2Juo zwN1qC6XJF>m6XzVXMkx0a3cCgw@2>CX1~wP)ws@C;l8iFK~Rm(HLjHBA{j#o(xV*z zn18VRH>NKNlB!xLlqO?DS1KDVsyP#t688v1h0{oo2C1QJwIC6JDs2dma)xkmgSPmO8tKOTh${pt8ArkLwlA z$(j#-tIBt(U)=JVoAtTiX+|BBkdV+?e=`b+onkGLgB|I04{VY7a* zBbDxB2|`@B1Bu%NZ$XplaLN4O$DYBn{qk;G6|`PZ;t+iG1D(6mIPqvSpm_7$fhZ!s zlsz&iF>=onzVaz0ziWYG(~v!ppDn^#2cw?fb=w;Y7MM4vY0K<@gy2SIatp`RnO!<# z6!JFY=8InV`Tc&(p?SvVuobp3M^9hK6*#q^N_nfdeh#kC|4z z_3ElP&xelPL9+x;l0l`%*g{69;e6)qkNU4wLa>2t-pPR3C72xB=ohz`GrSe`bapN0}-%oGFLD>H zHDW`l(Qfx9-(qsnpxlD#fa9>}X69psG* zz6yGNzx_fDH-xcX%qn>HAng-u1X`UpIq|6sYlwY2)}`u5$|-d38j@aG!57vG7g<(T zesJgL(@dnMZ%>^``<_t;jY_!MWve5c#oc#sH9s&;(&RQOg(*Z=jIC?_5fZ}K#fwVO zqvdN%v@1wgOOA+)%z-+#X2rn1+shKbOp#FLj>$T-L#*S?VuUoFHZfX)#&hyhs$`MZPzbH zMSSM#WBL$9v}R91k*MCSnPu;LGj(=}*ns|iNS8IEX8Q>iz7%WmxKEp#K18o#0Cylxdy*GF;#4;F;t#KYpxJ;qaYlt|ZRx8E&joJ7e1ZIM#dRLu9Xx zpbHojjrd)f_@}6p%=40#oW|=Z^6oMH-$Q`|4pQox7iYt!bnyiN$cOEM5+`S}j4~Yq zJyu;f%lvN8+eBFreFIs8jW+B0F{R7l^=6k6b;aTkJtSPd-i;LA+2>J@AdrV8=8h2@ zg)$p$zL2@)c{6fPu4s36x1-_N?8vQE9M@&gac}Pr^|z=7VM}^3j2r}orNYcX0fT{QF&g&Ie zw9sIc!%&AB`iJ4W*^ZWu4$6EXpYg=eIBj3j^jr5{jo6+e;d(OcwCu2q!u&zHUDnin zs3Nj&QCq9$4DI~X(vrnpRx!2^u9UvO=9{OHy&e&I4gA3hJ)bz!dR=sLxzSk*D3wP@ z`Vb{I!!BFJx>b_C3c$mx;~6+(3$|1=)lmEwFK&Zqlq~A_C50DYCg<2QvWhmn55K)W zba-5j?l&~@#5bsURlef7q_?5 zMwjMH<36+3&+PrF(hf>tw*5Jd^DQq#a468?WLrL(KK=YC}NupFzZ&6W|wuB?zdBVJ?{yltoSk!(mc_x3L zc|gm7Q=S_dO!PH3pHw1jtp32oIC~up<};hrg>WTgCd!xklTJEBg%O(~9E9RWDKUWr z0u`8vQbMMtrn*@VRG5tDa!2qHK1)#>%m8>N99#Dj(s1z^_z^S?zhTwK&}D0!!p$dc zH4_(Qkkw^7+?BACnBH5M;(8gAh+=CGqex3j6GsqEYu!;ur3(_%tVPoHQY)k;_R3eo zmDKU5op%qSso-gOxk}Zfxd6W^EO0G?lZ|QVX&6G8ms67ToWe^Mi31YMQEjx?iZCdQ zeDn6WNkZZ$B@5pleN8`=RdG`TT3QWqTR$Ql{mWdZ^DeF!N@hYk>+5fc-WHXYe@=bf z)VCx-!M^Yct*t4h1>^q{G3mN~F?%xp>t%SaA^FETbSqagqeszhNc5nCCn1poz?6af zU_y4O)We79uDV8^12Ok?IXG=+b92|ixmGHQpSuSalDtu3d`-lyE+`6(A01T-!lV>K z>Ru!vgZR1FLbz|;O7k0$fawX|h4&gi=Iro-O7EY9%pk|d&2WfDB|R3aa#MzpDz$-> zu!8ePTj&A9d;!~~$B+DzB#a=CkQ4v}D>Bk6GKTQ7fxo+WpMdOns=@!E0||+;tzCqk zFRnGzj6{qmvR?>~vJ}aRJ9EwVXbUA26@vys!_&7KQVCMu=|3 z{D8eee*yU<)Zf2qdckbB5t`w;b~M;OY4q+v9!+Q1xb}#O6d7Uyr8aCCy8<)IAF^J# za9UC_1~_@$Nn;dmP?s4fWLTxloot`Pf$a{^Q5WiftZrVHHGl$53mv9H6Mc#d?Zq)C z9foA52PyVTx_3saJQli7A*L~uLt+3FX<=UOdGyjtuWm~m#DPo;V2Psz2nkSjUkOQH z(pcq3Wum^qY?v^*5#e$D`z0M}Z2MP2ltR+q$>dlw(qHi*TayhPPQSfQ@Ki$Wkxqsv zMMOm%0%w~lUCIxK!_S{Rcfq>*9%(bNlI$-rW0Z3gqG?W!2ffr%<8s*^txuhXd1Flh z1ha$=;+^%+d!!SRq6yi0?W4@n9iiK`7uU}k((sC#B3I$AqN38bu*tlH1ZZM0fHT%3 zcLl^}-G+)R_vPqh)j3;_n*O6EN@VYg5~S~?+M%3nIS&uC$6Aalhzn&-JhfCY|FtYh zPTHL`JT^J6T%Q8!T2!a};n(KW^t3eo0Zu9a0Tsm+M6*%0-dYbbLOCAQxnZ>`_9~*o z3xJ`lb>h4m2Lp1`Qk{m5-gW82U*RpRr<)UOs0LTohDWHC;h%X?fnO=@S*T{&JG^{kkR;#`JtLgx8IJL{xiXu!-{1}m2$HO?tuZYw(B^4B<9Eu*e z`}nAB01RE8qCp=)nOfRC>Pgj3epg&ebx9D#8(5f74q0;W-VWcvpZZ;Y)BMBLffzop z%>1JW@teQ-=VqxsO-@!{st)ycL&wTytrWY3j@krZoBY3iJ8F%F*8&h|X6~cJ$TH*u z{O|AFxAmrV+G_ut3O)M5pELspH&ynI7*U$4t;7HCi})X`SKb3< zdL3;)@2#)9OFF@Y^6~2{8BpJc^v8_h%OU_ld3NG&-q7|Hy4snJK&Fi3vRJA>AU!>z z0NzPWPj4`(aG78I^6-l?NE{eA7+Uj>kQbWcPVL`$gOJF#;3p7%Kcc}z27WhVvfT)N zAZ1mXa;p^pN<6>q?+>+aFk61&aQRO-)W5)YBKfb^YUtjQT~D774pHyDPD1r+8$&`O z&A?Gb|Bh{3gucIEchPc#({H^Tp__vly+2mq^*Gs7Zf|q3i%U#jlaXG^d0otkr^fxL zC&!&)yO!J({5NpIWQ7v1rR^Z9o1;*t9@IA--boxYO-cyo^q~$`8cNXdO^1ZZ-ra6>^nV74a{ayE!BA|KA$@?aY~O>K zQm?~(4~F#K-&rsixp6P=3eRsc0#y8x5zU+R1KQMt!f&4~E8G{F&i*5l}S_ z*Tz3!u1ozG?Hl9@qnOa2r|IlC#tKa3phiX`083Jh$+a7)hSe{+19+BqNE&Z!;=MiJ zU!vyu_*vne`%*=D`S9>C>jhA5^a7s`9Ha*ckMmw>2<{TLtd_a{*Xy4jE-VjLt4%5S zcL;U>4s&hoYyekSwrQzz^LiAhgqfbDMwRVD9$mS13d{$^&!^aq{_<#cR#;eRaA6_f zYISuzv|L=C+Kt8*&fN&RiZ3MBRG&CQdwNR1AOAj}c%HCdQeyvueOEkthM3-GJH?R0 zZLB8izSs64#HinXlo7t*5+(5YT%|4l+PWP*o2*?^4dDDF9j51&mlNWmJ!V>>M6Eh= z^|20MlxNTC?RFfaxu2$;P;~;0R|@mlsU{Qr@srtE3TmzU7o7g8l*n~>hD)k9I8QO% z+dQAUGE~vgIMTZALtbVVnOJHv=DbjtD;mK;d+dV?n!WofNwIo(R`xU!843$hpoh2p8`lZju)Aw_2W;JqN z8_W$;&%iGH0MORKVr6o_6NgYIk3GQ2P7(c^euv@1AFY`fMB)vvakOMsJVc z5#wXR5j=qZj%1YS#ED$jU$hE6}<)8jhfhhnO01~SQu0J0a=;=OePeU}rk7O`{jI8V_ao^cv3O?6t!qxrF zAA1GoFX=KkzRugZK6vQPE@9x~ShjUyZg!T<{MH|*B+dgmiuty?HgiTUA+LNg>(=<}9?3N)nE50s`)_t%zw^yCIwi^a(((~eX-*Jn;V zL_N0A8B{~Mkkql>Zbti^Zyt2#2F`Eou_XJsv={8AQSbfs1E;YawrEmzwjF(}xKDL) z^*3=gwN9eR%uDxE%o&Y5H?zYAjh|Nz;T&_bp#Ff7(2mRE*a8-l>sT<0y!Dy?BaH(aCJH)%Sqc7jbPQ336bt++LI6UY+IztnJ?)(e-&1UNX3vI?QcL4yL-GY)qSOI!0~ zTiwZ+!#k6UlXjT03J>D5CaYo?gP>y0v5vO3(Gm;zDbDxJ5o3TwPMO6Ufdzz34~&z_ zMHly&D;5&0u~wutoX6QAUjM z#mW-p4(C#O_nA8S>UT>yan4S8LPU1XD)>`Cx(9DXgKCjbgtexRA`@BG|1j4Np4C0> z)cAulTi{;TP;;~S6^F5s!axq)s6Ng4KI90;je!295!E46I6xr^(+|fdG*z<|*5Z?r zG@Dv*Ul05(i%T$h@k(ig#D-DfAMJf%p1K8M-M>-RCZzPwCP{R7~;ESB&`FY12%WvTUQ2D=X; zNZz(!aM-bdwKa!jl3r8ByHY#N)hkW2-)otT0&+?zmt3Sc-k%|r4u=>6l14**|B3$o zHFx#^iF3AnfTlRpD0het!zJOI@`v&EPY`&l=!7Ngj5IelaiTHV{+C#`<}>uHeTDx{ zGfQl2>?xLw)y%DKR}DxDQ4eg(Zj!poRNe;Qeuk=DJ3+@Kv0|n^3kKB)kN{tJtK$#Y zF?mn;gX^?kL7WMe_Ii>7ACU5)r0_J#y>M47lsC3y6D3zDi~Gq4SJy-Gu{>}0 zrB589!;?lOq|w6b=E0+@fi7#Ocgk5gHrC(42OLN3{8NVtOB#W6s~n5q%r}LWj+4^D zadP(P?{ClO`>4KrIXegSmplxUQc-DMchpb}1vrJ*;mlliU(l$ycby*L(2aQTe)3xF zV3}%e)!Nu%F?(C3_Q=nvw{V^d>>|&yb>EfnAKGXit4vNx%6BD?b#ROXzdwEIyH?wF zCzrXSBMaN*Dr(L5Dh4C5(gT{+ija8zbzb1O1f#cg9$n;+mv-A6EGpVuD!+9@PHqoy zXEV14s>rn&i83XKiP%O}S6=jh`+(TDH7uO)+<6y7OFA}ZxbK4p#4viO|Nc~M(+vcL zVo^)DM`V>+{;5&@xH?+vi{!|;N*kTT%80nunR)WWXG)RtcQE$aAiXi{EQA-3k&TW(Pa>TgKrUJs6Iy`3!i>5}MDr&s@Rr{p9& zkKch;?E=WXm@C}@4YR>=NInH0-c;Bq(JkIq^c_g@gZj!9*X{f7J~S8wc2Kk?>GV-68pyRo>Mop9yVO0uhk6@|ub;n;ZLT!+!p8+1bGo6?w!VrCrRo7&WH<~F0>E{7!= zapYEJTr0eqaN+b6QbRr_-hU(ML2yhC@7L2DSC^H;Soby@MQ^V+7y-A-?*hO4MTHYV z+3IDdoGSMgUjuV~4`e)g$%q##Cct^e?o3$uo(Fl1^>Gt64cWc%G*{(zs)?-oeAAdf z@Lap^R=w3Z4ID@&42wLy#`wUV$nTeWW>!cO3|s0!2h{7P$CucJg;eU)&aC#=g{}La z?>yW-*o`3=_ypsi5BYw*D=6KP-Z<;1(Lz2H(d%v2c2qkU9A*!oy{7*dI?9Yaq)fkA zF;nC2QBGE;MK(EsO5#^?TpUeNP=b;%?6hLO&uFclFNcGBI~E=_Z@vgDEtt3A+frgKGi? zCEb(RAgM9%HGcLeAtCWxzq=8;!`!3ZtRG}pEkRYt_!IMO?0(TXM}tj#`Q_w1>t>PQ z!fnn^cfLxxNXf`VrL*3)Bhzup`QMWND`=I~322k5-5oq9oq@lUq^$wYIpmPt;E$T6 z8~i)G#;PhzOB&}D_QtWdSR2xx;8j|tE0)HJwa0jJHun5x?O@5(K+b{sTyQibE;tXp z7eVXoH{%|E>cec07SFx%Mlu4~jv3;W;%p`A`^+HBR0@H1Q20)XZ&wbn`?l>{|!-xfqs#xYk%Z#PnE7k%g zaOcIzte?tZ1|g>E>S?}_`Q{!_NS|+KqT%@(lS((<)#bge-Xbx+yV=3epQqm=I)Mac z%s4@*-qMBfGD8F?a zufD?#_K8VRQK0kYt%T3gC9QgjJ;mB*f*)GnG0Lx4{r;roC*X7+%o-j<+r5NY+>n&m zE}@uEXWuq5cdr#AkRL3IWt?LKjp8j`r-+Ptip1(--Cxglk2}5QG`M(G+7~3kKa@|D z3{t#+*yPHUSSDY_r`$ayE0yOAG(eWyDep~M9cx$6NbJtg3rh*hGGdDCa|b@v+BqND zsKJ=Dq@^XGmseR?3DLifkosf{wlhGN}_dH<~j0Zq}_n+7<*3l`j zdo=pJ56d&hFcl>xnhdbR&hF{kQ>!v3$vLZL5np00{Zcd8P5ZYn7WT~+jYx-zD^?wb zD`r{Il|BY5>eq2Xkp*)0ibTo>HKRK(cz(o0Iz`UA3mWcZt0Hi%hl7nGw{@-X=S`- z5<$CYl%wt@v~{-}vU+5V8Lo4JjA`~&#Rh_DK2HIDf9aJYaXz0R7b~7`SxF>NR)d>g zR4n{p?oq6*gRNza1MP*th=(qrpg=-D5TLgGpNo07G`Y<4&-aH5XQi{{?Snc?Kv!kK zZTQ!C&5}Uu3B1Eo5s*i82(y;h5ez(4bz0@j><4u|SVA_Dc{Z)v<>#4MoS#FX$tooE z!J?NcrGgxei9R}4OgYv`7K0t)q;yR%?TWkEMaSv*BKs@=dUl`nG~e|J+tHcU0nW|v zPoF*k1hl!i8AzA6i3)i>o&GQ^t%2xNrxfOgk^bURT0oPJmNo9z2D4zfO+!vgw)pjq zwmaQTnNm_xT167c%hiF|gt8%XEn3GR-_Gh2=2?fXb+h(d1r~D-5zUb#J^}zw9UO8% z5C^oq+KF}eEx_9u?Ys@1S$wZYaB+7gj_j9k2@*g#G9>DswAztc_3%oc*|w$06sFJC zcI>y|C{4AKR=wG=`kdKc9j_nFw5nyt8yq2VQ{_sIQ&;#53Af>0YwG3e=lAA#{53g` z2PiFSr)8_zUHyY-gC;WxFDdDJI!n2JOjY~rToMZVz4!7dtWE;#jm=oOs8%UMnSV49n|Moy?pVQLca@6-8G z8KFk6-n6&ndw!uZ9`WMXk@6lL2Z(trnJ9Bd{`5f~T%o+Yyre|TVY-S-VP4--v9ZCx z=W5PJ1oA|{MHb37cL=*dy!)E@g-W4QN-aYL?#eiMx%2+fg%R41oeF*NpB%?3Zj=(T zF)|*ZK0ETw1iI)MngolxcEeRBsD=~gBjhOug?xl<(uiwsUaedOyld%P<&8e{l8+Ht z5Z#}hJ8|ruaC75`>YdFIH~&SAo+o)fntnF^v+@p-OJ;3dUDpYN_;4$+^s+M5gY$rt zIaby(gt#lR-jwgF_Ea&|-BXoExpAZd&NpZ(+-Rns=V@RgUlb|F8uJlgFL(MmgC3(- znE|sB>v+Ma{P~6O8xU%l-T^Tel$3XAKAI+uDqaJa<#-TjgYJL#|59f8QtCOb^ry|1gm*5gMQ|X3D9YA1wP;lYS~= zX{&-@MX85qrxDfr8?syau&O*Tp1$TDt8)v%pz{EmOB1>MdM+@n#KV5%9h}tN{2+WN zkMFx1##bPe-?(;r8Eo_Z&m(6TDW+KUflhBBWf>1**4`QHBph+rAi$gva8mO2U`x#b zO`d_4R>7|GW|f`2{fT&qv)0}E>k2eiuS1H@R02WMSlU3%gAY#%^u-N7pnkZQx{^)v zwT=-7@{Z}LMODabEsqtit~DrMV1HrXUws&`Q_6G{VVJ}b6I#J+I_NxX;RP_LQz`jTVtsPJT5@DffEE(@=g)xi{=mFr;G8iL@@>lK-UcrZWFyuN{ zuNBcT{_Uk#Mgq=Bm~g4z2)@j})3BPyd@4D>xb%6U&Vp&=Cr2!~3!qr7Lf>@PmK+*8 z@cl34+z5CO2N#LcM50G>+L;$^0G**_`!z5;iWxz#{poe&17Kw^KEB`>4DUUxyJss1 zkgBi!)pVILQM1J`-AbC3U)5?HoTL`~(guqlanQ0@WO|9}_riIVXJerHY_7cHN=P9k zPEX*XciM7w{gd$ucRx9pPhiv{w9tM;;H24xMU7XzNrmsue0~eR7FCH>;c(SNFDCwi zDjH?`qYphZ0CQl%5x19RSd-1Xib?`FS&i~Uoq~Y}Qcv3Spslt=b>MA&-0o!Y{Z*3? zg4lBiD&Fn{s#k>2VaB){L0X=(irf$y7{#J-?NiWbxpl{M=Sz4dj8TJ2^djAHNvwBxna(lNXYQjir<-#L+gl?Ey8P|H*);~uG{Pr-fBek!^nt8>biILe zqQ`8mHm8@FUF~;_i#Vu&h8kiRFOKFT{S)lE0{+vl^ZjYr=eN9pz&>mTV;%SR0OPEf>Sg`dTWN12x5}W_ z=diP-7^HCpgKb8SY<)a^DQk6M1jJJBLg7c1W``U>pe#Oz;37_S;;N#x?3E~)J9t8s zyH9BC=UmZgUkhp`s={mJBHt>_3aE(zg!APA`vpA*nht?dIKg*jX0A~PTF!00(J!}u z(YV6x)(z1@aPH>@?gL0A*kxW86~A`U!{DFo(Pr)q;ENUt8x+>^>JwgCS&@OFR91$P z4^Va~r}@=1)fhmuCL|`xjp83ZI4)D{7@u40`?v8l185{zg9l6AMrWue($nKU(2nBq zslP%A)rS)Uz6=0S_fL|pH{TBghT}MrU&(gp2BOZfvJYR^=0-m{Vs&>!tU41*`vXE0 zjY^1l+lr$JzWiu5o`FIkHT_ca@4$y&XTLId=Nm8Du=4sODDxn>Z%u0}lcS@nVPtt2 zVWIsZr<_B6a4}{CK6Aci7m%SL@g+K6-nawmSI)d?p8jDFB^p47916|_Pvx;eP`FC- zfT^FwWT`f{kx@-+;r5{gX%dyC1?K^a%atSnklm8;9tsfg2&RUWcHQ`JL=IhwyRVlg zwLz`68JR7wze*vO@+;&V;kKOK%dsF|)XL!juD&tJyUVag+e2aCLtwm4x5IEj`{bs5 z^j>WXj6`{BxqiVutqfFs^#d)--}_Mre7jLu+1}|SfN`Uy@HPa>TV{4gma(5+UStGN zEFWWKzRArk0L@RgJF)r&*%-VZ9mJCFH6lkRZyHx?QA!#WUC-G^FMNvuNrR+)n(^u} zvqFIphwiN9;jMVoLRw6C+}|uipC(y=5jjwR=!GqgGMq z&C_93b5E*f&@$$&+w))b^M@(c^i;}mK+NQvJc6d~X`v%C_w;h$&7v=Q0F0(4(F+1DRTucCpxsHkf{bfaSX+Gdv()G&K3)0E$i41wUwY|zE! zmE>!@gI?K;(yZaeq+3h(Et4Od{rC|*;J|CnxxjVVeR0!O2-k%q{QB`08(DNa+twL> zcremdVzPGt4gj>ZwWZu~6o~~)3bjsDD6AYYigE4JnZz%E>Xhggz$hY^zuOoH=T^IR zR7f0@L`6kyHAQsZf)@TdKalLod>{_Lel)UY+>AV=`%k{>SMRSg1fLKEdorMeXuh@- z%;*)_3w9EG@mI+g=tH=q9!5PTI@*82e6#jpK+GLz`E_&EKCf5(IL)79a+RfL>0sTd zUvk63A|jBw==PSD>bS3-lm~9pUyvj4WkBU?~wflP+5Rk$h!yI%O2v6_{jB}wL9)qtcQ-? zuXL>9(yfR{)U*#+`pwiGU&SoN@^Es9`v#h3v?g{}+b<~=W=O8X%$#>g{yW8iQ}=&A z&mSDh#hasM7fN)GX zdWr^|8fD`H!3pefyRBhb#^0I%of}6-bJISD#iLvEu9w0|!&wIR88{t||NkeTkA3AjdgNcv{O3gVzdh}&!yp~>?a4w9 zy0HzKVVJNr6zQmNILRKA83}ZSImRLbli5HKi<6x&3H<};Vu=MQycR@O=S~ykn>g{l zC3hCVhHT?PBAVp?ApO!eU_#O3^zVS`cvwqKG1}<@+?%wSWo>D$ozh zNrd&e;Jn4Zh|+vE*U|K@-kTJ~`gmkWIe6{3ZodHs#S9XdfIigs!SSOffn9bmv0Y_l z94rdNVlHy@CjX>kJi?rSSS)DM$n=;e@y*Z%GgHDf4u<_7Xh%)?qhXry>5}za9$GBa zUiGJe1OS~;)y|%FC$_?3APFcFk1!ak4!`}MLULy=;8-~x?t+IvUE&IqW)snS&+yf* z0OZjIA=|eHl*EoeLkps@)L9xG4uAwCl{yK}fCqp|nVwxphr7DtGOggr^zMB5y730xq4Kn;WF!mLuCHw{>$z3hb5hb!QeQN7Esmpa=z3 zm)eQAUKdwaclZ4KVik3D^`}qd!C}MD#7aqfd_F+=3-Iqhf2(=^@U({=A>H|gf)&f$ z=H{oJop(TD0U9iOvD=cJojsY8r)a$jPBx8{!g>Y?oj}YaBQw`MbDITep_^@3={Xd1 zdo60{ql2e@Fa_%f8{w|{0{sa*Gk~?_CqPk9r=8JhH&_PFuc-lSEynD^*ndLZW4s(< zV7q!ZEd4Q>slN}}#5#}&jkUGa( zZd5SP`0NF1J#_L zw+G7?ybl?%*4Hb(bmJV<{$C7yc4xZp{sIdjFwl`B8RX4qXmZl7OBp)Y)dGP7(+G^V zCl|X*8K$LIyc3bf{GC+2YYW8N>*~ErTa*yCqmzyp)kgT3=Ps5`{&0qDz=Wtey}fj} zzA^RoZQM+}X=7t$Xc*kuY5dn;CjhWGdMa3fvfK(VvXtyXzmfjj>K(U?iz{swtFtrX zW+d=q)R>`$zUx{T_%Ggln-r+OFpyWP#^SU0Q8~$f@=KLAz+F$iD?vxPR#vs*5*TNO zvo>KEZzeu4o4rlkzxwwOrhA?I^dB`I59Y&i>rZ{4E61B}qYFMWpByea7r!+^7crLjt;a^S@VvcIKrS?&mmszm}FC1Nj9;&}aC+u;ZkxzuEB@_OAg3XK1hDvW%n~+i$0GtMWD2 zQeX`l0GHEx=YYlS9U$W`E*}6D5^i@mSg~!I9EOGUuAXC~@PEsv##wIo5c)Cmj`_vK zhqJ+9oIcb3u=Buq3dPCcho^{rhF6kCX7ngp_y$Fx5m*Qp2!SWZ`JV&LI`h)qu;hEO zBRVcaL47Ecp|8*TTPa$$fNG8xk{9&0-CEoB-m1@NwNU*)2e^@ZxXQntzPC(JfnCEu8PXzimYPxv+iAFIbDD!{kCygJIXp z_d7JVw>@U^g&9n}#wH&Qy!Tlh6Q*VF73w#VE`r%(@-2bcOG5p=pS#9)=FGl9kN@gw zrltKc0C65M%xu+P52~%~!+aThw&pz=o4$*$OX!r$c}PWpr7QW@(m@mftOyezM~@9I zdu2uG{>l;TsJHFaV>14)eDbZOt40pX+13CvLVaN7 zcB8j~9i3g>%fTW|I+P^h5g%vPqjpl3-voYQm2NUG?vB(@0Li7mbO?|ZeNhfw8LL!~ z|NdYf;cxY$6%@XAI)Xla^x0XnVi%)@G4`Uo;&V9t*A;<|xwc+b))u=ts=a%o{Sa=n zU)OY_G0As3DsNkEQR1RK_^#UA7+t8(9zd7m5EJIbl_{zShZyZ$Jt0fa-(CxdG%FVK zba^~xmv?U{hs~X@an$f^p8RnmfX=kqMXh*{07Oti8lLdOhW1%zd{VI-H)6G8<#0c6 z%P{d2La11R{A&WKpb@`D?na1+tRt+jPQu=R$BemSRP556;O*{rz8XIG`87_Riac3) zi5FPGn3EhOM zepxa(=e{sFHvHFBX>U72!;0Os+RtB-uK9r?VLb{qwm;qjb}w$VZ7OXDNkUNC+xyxN z;MfZHhR`ea&iN}cWV^t@aQGAFGXs1Pu9XQbxH$fZf9)C617z0)PM1o??|XWWKvC!f zpeGQu-kc||^!=Tjb^<4g8z%RZT@e(t$A8FR5Q|dWVZ%uk?r?LNojUfh9u)O z??hyTKyFAlvWxk)9pL=wXfNIwu-NRipfmD~?lZe9zc=lAYAFTK`c<9_L4d%2{8}jk z5Uz*2rLnUyfRgSvJP-uToa7;M5fCy1VizU>PD6MFKns{(!B>XJK#O<#a8xj3JvX#v z(Gd9P}nC}%1P326t>8BL*7i?1Q8&R!?O=7CDUYDIto zPGYH3rx8%9IQ;pK76>Htij( ztcvsDJ=_%WadjQ;Igi~agu4#+zc#tnRwXVd^dk_NJ)_so9}0Z_Hnl~MD)_&NRigS4 zvHE1U9BfU!$ti)3_4RC%Y>3H64gI1QvGoRkAz*G(C{J)44F>vrOo$I72ZPL1m{fni z>-uIaIO`fs5MDguNUena=157ySa`Djl{yH;M_s1)^PB{y-|84w=>J3Adqy?6M%|*Q zTiJ@hMkxvcTNDtas7P-Xnj)Yey(vX{?_Fg}6%di$RHTN4PUsP(x6nc-0VK4L1VRa+ zB==$O{oV7O`+eu$bN}2i?ih@LLlWNbywAJVTyxDepR;CFNIdB#&9Sf)CKs0@_fS%k(To8_xrt{HIV@yJ|qz?=WiEl&rk{O#M_CKp5E)Ff7C&*G@Y{=`{7 z){u!zP5_21DTea4KL3Oj|1)(lbwDcObZwJWccjsoQnH*AI%5@cNy=u9tb8P(Uv~gG z?shgffNrOrzn==@+IS;0D3$$7>(%@HoD@lKFE7yrf%-a`)OoQs^9E-ZgBFjHAEr|9 z+QkCVX$DM0*ERKC;-z;HMxo#LRyHrbgG=c=((>{1yD0$(UuXVxbcfBZS zz2C2Nu+sd9*whj@+X0?6=ydsNfjM=o$*b|O2QeiC`S+oIQG5rV8)@RCUGIccaw3}S zCt&GB_<$S=)^nong?hhqUw<{H2ec+mpVbyjcXBu=VxNyvQo(VVbi*Dcc zz#Q%2-YYMgI4PT5L*hL}X>0la=T?CH2IRV82K#!Oq*CsnCHJ#qlYDn&K35=Wq=qG* z0IDFjP`hFb;hKM|SU||9e@p9T>U%Xk3jS?ma_s{D63~dkJ%b2u+sAT(ke%b>cA(MS zp%{z-loL1L&_q4uZ;q479>x3vWbc7{CwxiPxx775_Hpr=-#dK)PN^b<<7$&|a%gOO zKdRjXn%Zqs(#BW?A2xp)?NB3a_C>sDf2>3j7fanevxDo;+1v^z$JML4+F{M9@IU|E z&%$Jy*_xU8)~Rw37>LRtdK&ZtpfL%=6Ht>XYGiI$*b$W6IipMf>K)-429xZ8$9_*A zv$PCOr(hy3$H)qMdf3|8VQ4FReu5#oUEdL>d0lDt3#QU8^5zns{3w{W$N1rx8Sn;* z9DrLNQJ%+va;V-8^M*6Hs}n8RGqu-@lXBi)IXhpO`U0*0T{> z6eg#By%X3l$QKX@0i8>lz3pjFfd(&bv`Wg;DQ|yQWG|%sR0u;1DnQvAxWg*9Z)6d966YrHMkV8msWG%ULfRZf|?j%n&}NXy?^SD`n#O{QD3kVPXi`CpK#MTEZV5B$(JLCunkUF zio{LJI*>TV(6*v31}S@gLBQ3GvQU+(_VXv|%%{h&@Rvgs9_&uzJAt!A37YU$Lht`W z6Rq^dSURJCe>21{_C%7Y)M ze;Z@q29(!636Qp_k-FihT2e|XYyB54mdGBKMIAPK2iW7pR1e)~ZytK$eBJ@{o@vB$ zrOPpn%$*mZU(-AhHn>&+ghA>WPe0ex15*q*n471#On|bJfnqO2rpElI-WEIQZe4rI zX|__&UWD4$e{Sp@S(ypu_3`Pc8DL()7NSopHF0to18yyV*>_yrtd;V84#Z%faelf` zded!tC7f&kt_swfSLOHcpSocwXU@5f2(QN(THY9EoUS6i2!8Ok-I!VVR;|-AlWw&V zT0kdI9;5OFVhVz=Yxx4e18WYPG_ho5^2Ui|BqdA*<-C7C7)ITImp>L_Z6~hV=>)`CO*u zf`68@gTaBZvX`ftEr<*2Gr;AF*mAhoD6TwYf9cpouM3JkYjE`^4fGfkB}Jht5MXe$ z2AF(M*~VZE2E#e1&817+L@UNKRVYPvF#Y+73)?gVfE1j1ODS zO?EmK;j9j0x8I+)v$JFNBY*htT^m1*_I59u;^6`1c26%d!4e?qwk2rLE_a>x>SMK6 zuSEUeU_^qRd0pDK&)zBd5HjX^;|L9=HvjIIgWBn2obgd8W%IH8W)vTBR>L z4`wI~fYY;|_}tQ74|+TRs04b`)dEo1$=jmb_t?eG)eK0Tp0#qNd+qy<9dZ7XX| z19ugS@-A#R_^-UYpP;97j&fT=ByPj3%Z<0a(iX?$bizmltQpoI*Wexn0^RVDJkKYC_Hv9;|%Buql6e#q+n|7EWaj4 zj3js2-&F!b#93Kagna2u60yxLfYgHNS|0xq!J9RAf{J!P18Pr8|0a#|b5>0CMoxEc zBgXT%l7y|PB~+VWYXGHGrNwJc_2)~-V; z(W6SL1+Y4Jdp~*UWxa62myXUIcLw<4oOpNMZ40^P!*5jBZDUgND!is15D?>KhVUhB z5@?Xncf=ur`CD$Rk_q&@@aH>N~)0eHCePqqQ~?g6>L4Ku$`DbiVN4 ztbt?vm&5s7O_e}{$hPt_NS%zAJeSAt^1Z%9iy*HB&|uJ~TrcCpS|)u`PgHZB1T>=) zUes$z{OiOCy6;e~*ThS*)gS6_#?a`>CqW5R+ONxMtHKEVP04598PS@@fK&ydNus>} zHadhJvezPVWT!ul4maeO`l$!3Ab^hd?soiv@ZJ|fZdm4It!8d+Xm(C|x{&ID>MJt( zNJn9dly=aG%}oA~RtE<7opC=mmM;E}UQv-=VQ(-(cVsx?eZw+Rmf`(7DMlIp6?be7 zm#q=?Mgkw`%LFcVFMlk{XU*DK&N>Z->NVb+qI-R(P$qz0_Z<9~9cHQzxd+Ir;HGBK zh`n=10tw=k6S)O|ZNf}5JP@z>qU!biQ~SQS;UVBonQG^v`fTAMj7QnS^JjtR7Q2Yh zH)zmlcTey2i7zhW+T1^WW(19v==aX{x3>dPq@bvxsH`k@odQJGIkJ}mY(mUfxtK(r2D;DB_sx05#p&tkO-(cV`bxpv5Rf%L6Vy@Xk!|obR|!}|zdhuVydvxD z4sj>U3$^C$;IPUerUo*gKbRWg;;S{{k|@qdQSQmp!0nF(xE@+JyW*Dc*yNO) z(2c=)z}<^m)V_TH+6(^>v2@>-{NDcEu=v+#^xv7j*K|)l|IY^w z;n$&YdU#VWWT)cJ=r0{*y)uiVS$V%j?WT~GK|9OfZdAV_Y3@zWY*R@Uzka`{(H;H? z+t@CRIT_MM#{HS-ZDHo4vChiVJ%BQIJykvWWSFa{vO?E`3T3=uI4nc7_!B{P? z;(}k*n)4%lFNTyS`qS8wa>aV`8#6ExD=N9O@Q&eNcYU%!h)-TVGxqp4fj-0oXCt`O z&6`d~8Is975+wsE?(ZkCjvl{*N$psOle_(jA{j#?MDn7bmbrhwM|algbua4UJBCyd zGk=K7qj4TZ6Sxc9ZXBk?HD;K2>RFe7ezx`VRl$e0+;ze}zoWwrpzB};2k_{dySok} zFmp()i(+$APS7frj1Img$)Eqqj0LqoLge>=nf>1-zZVrm#9d(tIuz#ly>wD81o(u9nX)!2d_&aBUFlj*my&fIv>16Qc z^c_UcLrs}E<@(?j%{Nm4OEd)mLVO+N>8UB|-YmSa)(uIn?|=K&A~56uS|5wz6DbYp z)Q&rK(#*{4{F#Tq@nNW|D=bCKfrZDSRI3MW5@#^|MXzwoWm?L9WqENO#2@Z3?Bm7O za3@1(Q%aWE{>6e1KUi^b58Qa=woN=qnn(p;ForfhqG#j`=*(Vqa6l?jR9cKdPAR_s zGlF5c-@L`&qt#rj=S^?#bY~$AAO7~?Lvu58AcKzQR%)^t`l0FJVe1Kv?mCsAFja2~ zUtC;FWmwOP0uwMp%e1W`^Prs=HZN+Lz5$2EJTNWk<8{d!$56h9n>YCBXljOd9QwyL z`^JS)-=)mY)9>Qt%iY{$*_;D%)5kuMNE|Hc>V?|ojkUisLrlwB!owdL7>rS>?4)6) zjX}%W-CHYeEWJ=OW;r^#@1j#@4eVo65|odsp-||M{itJ&D}ewmZc%I~VCtXD)Z)nkV89@~J!&=UFl{8q_2@4bS71>OYmy?SNS}UF# ze7dEXG*mQ#3*o*Jj2lxd53{V065+Q@Pz zu|>Wv%#y-ZPy>|%)>Qb1kqvbXV^BllLR@Ukc?J#^diBnTIL>Uv5IMhw@I33IGmI*W zgQ2~7>+FzE4>F{~7FO+?@#}p-%WG>>EqaCQFJC4pr#v6zPqvpiR{H6__PaAaAI(_3AAdnOib-)P;7iWkko$8l&mKDDa%Y z`R_bAHJyr-#rcPk>;u_c99-7KId@Yc`lnjFr;k_TR!$JmP4u2Ks)A%rYnJJ_d-y1Z z5oTtTskfBlC$4{9oh8p2!b6V)b3=A#&z9K%@d-JluD&r7LFJi%yR~LbR@}Y~nj#ix zG`F1JfQAl7Vm}L)w7N5EA`(IEXh-dorAv%KEnGG)y5RAI2D|kFMqH}c{=pjRuM2MV zpw5piLs%g0p9*g+2amHT3(KY<>;|V+cm!jkH_r7gXKc$O3b-DE)R75;!Nxx(arEaR z+{m!e(dVY}jUNUF6a8jZvA?z!tB~5Ev?GZ^on*b2CSG8xeEP&{XSe+M!(h{iiJ_rx z#G{M)`fRFana*}|y*?HGmR0r9<0sYZXJafL|Gh+#)QQAv3`+yi(ebr@?khu8;~PVH zc;u+4&N#Unfy&Hfkn|_xleL2q7q8uCYirrK76O}~X*l>6ER;UZZ z>`OZ3XwmuwF#8A7jmvWpp>a&=YN50p zLywBvd><2YT7owh7(pD==-n^?y;8RFrAA^i5-h!^*^D6X6FJ}QsBW7(=}!dXc@Ici zNYBbDr=UPz!Wi`A?(I^2r{*{X**= zE9q2RS^gt1vTC)>y|jIREzA|mkS6wEdrL|(-gi_L>L3qYrlPGoA2)%EHzH9eN$gY& z;6MCEB6f<4i}^k#r`P+D2|#DZ#54Hx*ojc3Iveo!FO!kVr=i;<@VOscOwZMI4&D2uUn#U?9!{3_E&h#vP)zkMm z7!&2m|-_AAO+u!DW0eg^8r*sLK(x0hvz0}7kTifu@TrgPVVp^LP zBT?Wn#PIhM)w4)K_Vnz}gO(i?L*rxS>FViwuD|nxvZaUE2PQ>AF~bGs2UccZu)%|X z!*Ly=bH2lAhs;PP-fz?5l1j^5M!8LtH;tQ3k4Q9Waj~RR4&02>(*roPn*x0R6kQ?~ zu$3p6WE-fk#;G+M|C-MPsJeAVHs35dsmcqUqo`^_S!h3vJFEF~q_@}X+tw?Zez}9a zqvKlBWLUJuDP?8Qx`+|)dw4*O)wox6&n1T`y$_#jShfeI;{~)bGp36(PM@KV?fP=+ zpm)ymRys99_8LZN`PI-qBWDWg>O^foRg_F)-Cc%r4V#5Ye}D%A%mL06w)L)_e8$?| zI&}M%%w9!d2gZXu%XcAQ<2!*{-cwpfU!R^na;BF2s>U(kx4SMWWdXjI*_}^kfz;5A z4ZD8l4*a|qe_Lm+5>R6V<4~dtfx>ezAX#*eJu|npJiyN{u#|b}V#v^;=wLglrfK}j zg(}*&ejhaou|%BQ9hxaIC>&ATSjpREV#=qqfn1zgfczF#_0+z| zqRddgCJLGnD|X{LaL5U7eOfLqR&^?fytKF&r7`mA4Vz_JBs2Hj%W)tM#by4sI2Idm z*DX|3ma_5Xp`A|d*sAvlt<0XC6o`^faGct&#ICO4)V_CH%jbO4STA0*M$6mT2?{l~ z`XjUC`1vS~r>A|^uk$tf5xTm%ZWJ;sX7YyZJM6#b4a=osM~Rlf_#G+ybZl4a(Lw0m zQs&Hhs{hVf;?G3B;ewDzF6pxHuQv*{bKb{A3xNsi*AgQccbX0v8Ztio$+x?!YVLA+ zh7D|>#j)TsG8Nwq)mUzG#sLkNudgo{r3d?`bKFqn$`$UgJ-nY2#Pf!#psp(Bqu#S; znNrRxQ+etK@!1)0`+AqHB}Uv>M|(%g+(mKAhUfbaM?SxN2)y^BA8BfePKOipIt^8< ztiSdf|FD`ji;snvB3jg462J!9-ri0U%*&8sIDd|@p1NZFIy~>!QdHd1nc+B2X{K{$ zB?ZynKfhp!mh({9>WHblkRxn(QMC5YTf}S_YihXBr4T=_ypA~28V3oded5wm8?fDM z@^NCBti1hzwEfrfP!0`k?SbN=A`p)Vv&}ax`_2VV{z(keRgOSbM5a?yl{-1N%J zHnyasV?jaJNc%wMXxwrjM^@2)!d=>rY;m-|vp!88d~+1mpA~>5VXZ=}42=J}tu83Y zA|#XYWK~v1CQ3ssQ0;23jm@j5C@9oCpLOZW(Lv_%Vw^n+q6V`#u&|5q(Ub8P6MsfB zG4UuV$XvH+i82eLn=qjvbq~i#?Q-uPTaWMJ{m@Z&Fg_(f?0touD zyQw3mNz`dKTRYp>A~2pSG!8R1#kb5hj*N_OU%B$Yq*|ujuPkbB3~GwFA6{B2;)JTo z7oUicm4FHzVTo%?QcLI{u)LY%UtqC7>k0~W8H$CRBpe^70VmwjNba3UTm?y9u!ZtU zey z9{cJOF-nr)m>kUS5`ZRt{64cb6}6 zXaB)lHsqLj=5#<{0A+Mj(RZ<2mM!f`0cdW6DH4$z6TQ=oDUs?Af`dJHA3^#0%wN8P zJ3xmV0W8RXJ3D~(kt_PSs@MkrTlj`6^>2C|%=>c7FX3_;`t%pmjh9lx;M1;K+oYbp zzO22mOazUzl@b*N9_L5V(Iq8oKKpB-$9w#@7oQln2J=7=X#LU;nX2Vh^6mmgAa1h_ z0SE23m2VoqH479KdQ|EyaOKj4EVrJa<8o?jtk$Q|SK8dGLTXiG@g=D6Dk^H1QeM6c z47HiKCvr0~)>c+n zuUr^z&@#=|<_Orh=c%j9R)23GOOB1}qP3kJ$JAHbU$0+J<>Y|7`!$|d9Pt+VNusJ$ zER5EnrLs8MUDSJ8?z_`O(X$Heu9Dz?|DvAmi-LU^4r0?X;cdM}-q8DcGWzk1LQ=O4 z6|-JiIumVt`7+Zg z)p+FW3Dlk$wv8{RR72?M+UQ|fz{F)%z83h$;-s#MnnZOi#c@GKPgnZr{S^fsBA9t( zyl1m^-Ql^~%7MPh`a?EV6;SDsvnWwRn(I`z(Dy{@C07#vHi2YI@sr*zf!IM#AOkxCb}{$f@fqNI^9Iw zl?Nal0BBkoHRv>Jfn;YqPk;BoE@^Xfi;QrmX4O9{GS;=S+HQ{puhYtq>hJEB4g6LV zem!;Xd$RS9nI>bEj5BAXT!*h?rzE}B%j7t^0785spyzI1)V?%{eRhm%Q!v;tQrlUt zgZSHIv=fg{cRR{waPTGgfErJ{y(@a4Yk%jzmER!isyqs}tf#6g$QYtt;Q*jzMETBy z-!B}&9+?=Q0EKhV4sIM`seGIv>+u)Fvy@Yb4CE>Oo2GCO0oD&Y8i~NcF79j7-u4~{ zOJA$W7FC|A#Ly!yigc*gf(oepj!pHllma}vzp5fzwsl*udE#biAaLj?ZI#ACa1->r zR}SXF!9^jc48+Z4X#7orKzn<~Au*}@_$8nsI$~D#r2R}-6x{+Mqg0t%T7+J&Xio>l@UU|>hP$jQ1V%e>H=6< zlzR7RG>3+#?l7pvKmb`?Tn~1qDLECY08|AEZmb_gz0`8N*l9d)2S;8Xf!pP_)Za9| zWfvc5=YnbQi3Qtl@p$_InzV%RS<-1-}EhtG&(; z0GSb#%-S$!4S5_K18T%?M#pdbPWN;K3~+!hwbR`UFS`K|i@G@to9oB#1Lhnc6@bq? zc$WS6`+tzS|NErvzrJptBZjABPz9_p_Uqw5tN9}qpkJ5i%KFkVSwe9kPuPBX;LaKm zU7uIE3(>9pqHu02Mfl$F1^?%Rq`r$jR%fBZesfCTflk*>S2>M?%Dwl%{P>lBalZIm zd7evF_*;NivxVUaBKZ8rfB5mw{`FM@x_8)*E8N*~KKLmp(Mr`G{6hI&$M> zy~4S+u$GaM;=8^v&mYTf5fgi}PMeD>GbiMr)?s|0cUm2S5@_q>ok4_w!W6)@WKS+q zp!-anws}KL*S2L?|AB&Ig;MjAa}q?4^KP?&Aey!8teMvbQ}E*!qOAr2qp;aVOT^sZ zQjUd1Nr`|Uf41D^8mq}lKvnfI1aFNXK>$_`CF5cE>8)nC@zX&-v;2{`oEvyYl3%q{ zp)CmWka@Y~iWf1&n$V0q^ozzwlH%n-?9NF^*OUUwT(J$P=x~6#0C`^>^*fY}v(0}n|ZiO&&M4AHS z2gQpY9nl10fUP!SYq@VAGch_6_ToTmoeqI4Z*5 z-(N;Xj%Nnpc9c=`OfcTg&K3o+q*2v*99G8dzt6SG*Sf?-#}ClhkyF2Nf=QqT1ufLL z*tiNm_d2K_@#Qu3`iA=10Hh+AiL^yOhAvx#wxiKX)Sl$}u%pWXbN4`oFHAKAam9}~ zDIqFavoh^qZN0UCD+9>r`-@wpW-ZQ|Dk_J-VoD8EeLux!8%J6UdsG9Gbq z$G<-WeAa@MwaWEtiXnh`;TnUnC8o?n!63zTokqQ&po2Dup>ob18nh=WtEyBNLH3pi z%dGXEKMDBouWrjxLw;#V%c;4c4fg0Jz*c}6;yawk93{mqxPxFkcQ5=MxD}M$UZJJ! zoWvX|a+n`y0KJe1YHLGj_zXX>g{%ZtqSwPCH~7{npo77|dNy~mWkT0`k;=W@12FvR zB;fKtx`Zz}h=(ALn4`KtK3YOjZxTzbLIN+d7Z|&1tW;c6FQDx^p|?#-q34`XCT`YA zN!dp~r7b&E)FCAqfPbRS)XRn)R=D)02!}4YO*TDJ0ZDmml|*wzwdjG8tkzbug>$x` z|K!CB7X)-Nytg-AhPQq$aom2#fC-hwes2lk8x9-%Gl)LY6ngvsfR4F#yowqDU2zT5 z2I{pDL7kW=x8{b^7;u^Z;KPd16Z_sH5sXVq1v^|)pKy{X;Hg)!Y0Z*7J$**pv`I$j zc108yz&$fiI~^9|7XQtPJayNGCZObWT6!OBT1N@=8rx^2&i(+we%@s&s;dtZ)(gs~ zM)w62M84KdA~FdqikaK(gNeODNzVQpb9uWb2a^A;$}2I|XY761Np4mZwT~eqF;QQK zipDbe42`Fy+zj+lfF_6EZ!`ww14xO+&NLA|iO?f{L3w#1ki#w?-qzID2de#)m-BFw z<1Gc;buOA|Y5c(w6cqWkY9LqM@Rn=4isjv~5I+weNu9Ijm;iP5;@0|P&4^V@t%0q{ zQ-Fm3W~*+vSgJ09Kz6$E7f@#3cKcGbg-Fi7`lTNn4yU6jAG&Sdn%t(=8Ku#@zoS{p z$hWYH-RWZxpPHDs60fkmHCjwr&;mKsEdV0WyAHnS`3Hhw;$7q;2J8Nslw=?&5_1#!l zlC+)*{KrGM*5osDH&OLW%6+EfS6dJ zPEOW7Huc!m`DFY4_8pPFrV8j>o0SU+@I-(-^~Mk7fu>r&Y4uEPz*dBh(=RJ)NUsCJ zXQbf6;L=N|38-;qPL0B>1uJxqfM$Z?>OxCEiWl4%7|;D!)i>lCneKq`nkU7H(JRB zw{TEEEk$bj;U^NO6ZN~5o7c}t7`7DD^G^t~0QOtl4w=QH;9Qs47*rN|6u65ITKP@| zkxba&>X6)tUL$0D103!5mt+MZxa|6ZHz12#MC9m2Vrr8<^ykfzPy8#S6 z0t-n%H)jA2mxUcIa$^sIRFWVEWyu>Qs#R>fzUOLH$_hYJqpveD)D&5ZpUOPt4yZ;I z8{|NCdP*qwjlZg5tD?T;7bIK%N36{s#Me$MG&g~cm0-)x5)pCO#Lu_z{P}ZTD`12j znBDT}rjEAu1r~8$w^)3U>T&lsX8)dNQ`G3@4mexWw(ejFod6oqu@`>EG&7d$PwOai z1M2_TC-ofv9||z%Xl1bdtIqdccT>Xr7s^Lr;~rsVJ?jcfgdd?>EFdb3;ir=43Ar&b7g*%w8v)wGRxqmN zd4SvkQj7)Qt|{wYlwG({u0_N<;|N>bK~UoLDQbd)WHP67M{2%Z?;fG}TD-a1s%lwZ z&s?!U{atsj@qbCN!0X%r%_{1viz;z31q~X)BVFzPz;x=*RNAnCNX2?N?=>^Hg`yCi zPBXGkr!T(cz!d=7U`ESMrHvOuNqy-fz!(cq+I}-33F`PM+ZwWt z`$~bf5ufLJ7t2=H1oruHECM>%YKKlUNol}$_W$GnhImYza_ay_f&QBqwukY|&##m% zm2aR24u(te9A10|p7gBkNDOT<)q?3fQ?1N{_mcmG5BZy6S@j0}c|zDC3r#@larwKF zlK+OKQE6)(sxa@2chlMb42tZ0OvJagHlf_mk2xtzb8{Ory=DHCy-#x^y|uS`OP=gA zUGg7SwC0j_uo64hY{5JAwSDg8PgNTt%)I_cIo*^M^qdtBNSXjz2*rFI$4&dLY#c($ z*seGh{jrS9V~CP}uU4sf?$u$mz=yk%u3jlBji}~=l>kgc>fLaTwhhT6R z`fB|2DT^Un$ovm5XB0q6w*&HmPNls$P)XmtbRHB1R~*h2*W5G%m`b8Riz|qB1PBcU z>h{P|kprPwmQ4S4*zKY7lRjy^7XNwFxS5%`r9T!0>`0}V^~_5D-bj!;9=^T=R2i7y zK2o_(USvsRSVm&C!VABC9V;~(YP6)OQR6UKGD9|Zg*oFu2Sq2xtkQm{O1$}b8>4BX zqb;u1B|9q{<4;xu_~h9qj$9tVTblIv@eA?;wzMdqH${73fSyd$)P8&chyN*VQFqIx zEeep+Tybh!Zh!E7Oi!mA8Cqf)wrow`gMPa7w$pV!pxf~Q{EKT1SW7V9dbZ&(`;gl9 z=3zv&>{&H?tIDLoG-i!3$Hp{A4fL9!axbZ5}Isjwa{pgW8-!;&P z6Ojf*GBblp8)V|db zdEhC4@N+YEc{sZH3s|x3PwX9cn-LppkR(B^JJJqfV}+?NU#2`t|Gy=7Fm;_(cKvdG zOU`5qMZijxjX0LIwc{sheNZH9d!RREG5X?vp?-{bQ;Up@H;-udUmW}b`g|zT#zdVfH`y4h<8zk3 zXXWXhi{s^dgSVpv^#S# zRqflyegl9)82zmU^cGy$Z}5T6*SEiq#yxrKsdf5+sgn2HJ;I;ISs&=#eBPd(sbp34 z@bo1}Z|ol5?(-3pD%#g4$3F&d82Jn2VIU3Y-nkuQceHB?$W7McD*&#-F#~8Q!SOF~ zYF>oCbU;sCiGKg>@AtjDbp814bbo1=|NZ@6b>06y5%aI^?mrlu|IgKPH!henPDFk$ z-@T%7{0H1H?A#?55gI=Oh2+Pe<5j1VR61)oPM0Npl%sgDUFeuBpu_f*J-g?F{EoUq zw_ITP_3!f&ojKL7r4m30r>G3S{2M)IE%74B7}Jv6Str9FE1MC z=PnyP%tapmy4R*xOC3snxgEzTa4Sq0nZN)2uhB)iz7fRnKmSxX`{e(6bot*e`ESh( z{uM12vC75J-RPRGss%0`adApOj_GF=7^t?M-^N!rjY1DB>_@hgrpHd$$v6Qv;i za^Xk*%~)!Oi7N~kZYY51^EJlI-e3rU^R_>!u`F66Gv^_!P4IcmgPY?aWtVUqv{mBx zpTtj*Iia@r4pFwPRWJ(aTV^W4SJrZ{X~~e{J|Z-&E4+9pvhN|jd0F=qjOmkFV`7+G z9ol{AipkOAAMZrC`J&YB@Y=L_Ro~=_wHz_1A9B z`Wnhig$WwKKi`Df0;hi7pT+Ewh)MFQkg6&_m{Zr|;?08r-;;FUMEdcSK>P>bUFjM7 z?t3PoF)#e63==HOhZx9c^u%`v*D=5uFI!Wu$=sUDl|`@}#igekzZ>rcBBW(%BAHlX zaPpr|^e!t`RhhuA^iUW(@U)HeV#|x}bGwQ(<-bf^BBkcJr~W$dN422N2};Q0 zFnfvF*<`ocsvk}I=SRCssy0-Z*ssS5&D5y_Ur=j&&lLGFChzg&fUxI#x_d<@VCPh5ws zV033Y*zQqOzKI=y^cqJB-`s5*p13G2>*m6(fHz-@)#w|dbY#6Zb;L|+AA1I#FpB3J zhs@rosv=SQeGNKw7fMfgPRbr+&@>*&+y@*tICz1xARa!xi(*h+tSSpT+%LrRUnKHM zcrM_?7fma@XwQHv#+Ei1BA2ajYL1$bAk>3LMMp8vGD(dwPEBud=$9pJ`(R&ddNIP_ zVNcQ3Q-nq*n-PJyYEG@iiXxqs!_X zyjnDWaeS>HLx1=i!=#U1mQxceymdj_gD0A~q#f;@tS|bl_H;nyTaE(u->uLL4(3h8 zF%p4k6ym8w^~jkc4I&{sH;gp@{dLEgJP%syHQqyFW_V;mI>+z!>+rzVCwbjAw=U`G z>gwb+mOD(tjJ?>Gjs}JGIsC?>T6Gle*4|gdyzeW$)|p35Ba=Zi0H_IxAFBUJ)Klh2 zY_;YYm{n(?{3;Zehr3mUkXz(=IoNa$R_iK!! z4b_E+=k>SjVHPq~4!_jiiTvS5d3=EW={T&+$ipZ%e)iJh`ekQpOHKVaup6U?}B^CHjZ@%kWX@CEedjfGWT-ko2xC&HQ#J`;v`-={f?gUDfKU^m2D#$JCve_tOz6&)+u`AcM zNd1hfvfU%Z+S2Wt(^O8euk1C!Ge^@*h{Z1IL>>URmoH_`}lXbV14+e7P{ zB6J*nnAmOo??dwmxh>}z7zeT!Ogn@6x~_)r?=;!Xc+vAEum{Ilh6idL9)+fn615?0 zEZN%QUtIRy6A>$N?%Oq=p0jLjlAg1w7NXXwP2^2YkyAW)(?~^6Vm7n#)*2y%{^s2& zTf60>>4hKtCl7fWmg8q~eojTe?YYojtur@LF_fa;c(aLSjyyB#k+hJFodiU3s650$ zD4BF9f`H`x<`+>CeAkU7MvZF}4{hT9^JYv(Yt5T*r&GDFrnYc^d zu5j`1-TXxucf2dExMNQkpZV~;V2N0#o{$^7)0_ajr|0o_%FHk3xMpkrtJA)uKI1Lk zLS$B1`AMOk7GC9mhL^DedHCnVV;4aQd3my1EJMPjQCdPkSQxqY{e-6B+QC@Bul&uBK<|3%z0b)wz8Lwp@iktn z^Fc)6BVU6fU136v@us1A`po5$siELiDDyfVf6n+%dHKSQ!@N0;-OsY--vlkAWaX3< zDOqZE#Ak>ko$vRcX!J-~(Aksjjt@p#laV(~n$@iH;65I^=XYIa)ZK6wJg2|mz0@<` z(`L&!;bA5q4y1cpB^-s|dlIwyu7jiJ^M)LDm?GAzn{XogABWVJ)Oji7Cg_N_dzBc# zJH8!^%TO=;_pyhe-SA0D0SGP&sMu-M>-#Gw;d0O`vq$F5ri+Xl1fMDUon1apN?(Ij zvX05ZDkH*IO1(wQ+Av0AbeD#8t&+5$hAezd$yMG6G6;NYn!WLXhlq2|=Bf$3>qaNm z)4~B)=(SFWY01u4P{#c>BgWT}wcSJyd(>Fize?_z+(|{2O1vtR4ft)8x!KfhnR5c) zZ_dyWQ^YT?cD(gG0Ys~F>a69v6ErkDtWpqryTVWD&>OIrQO;AfV2TIZ(x`TZ{>;Sm zq^-@Xn69p?N2+c1cNF($oR-uOL$^HuVDs3T9GRIlgF<(4yrHqp-o|Ak{l?X$`|OpF z*e#IDRBWb7>xtSqRylPZxcE3zKapHT(a#l@Mq4jp^Dg?~M+v*~Ja;d}@sYsBNBcW8 zX+xkyoOMp-hcwm-A3MU2u)c!>h%c1Wg~smLwT_9a=Hdmg9CQC>nt#!ssR@@ED(^&ac1bc4jQZg1jT z@a&p{kMGU{KrXMLib6Dbr8)2PkNiTqGJWhc76ydpK6x`xVX3I09Z1T-p zd@1gyoz(y$jTX(#fMi_E^Hb$D9W2KlY1f>rmTR0jW$2x3l*8s5I_4lZ(d=r<5)Hr& z*^VO{TIKhhj-}q;hR}_tQMp1S13OW%@>AzCmsXaR7ud{h)3XA=j?IroSdPcL;Knvr zXY(|3dCXN7hm-fp!uFtdab`84Nfde5!zAzbC*$l)|?eAwVB!W!e#FlnEOtbcPWuwMM!mv%Rsto@KrM2!UmIw$!5|r2oq?J39|P&;hzTHU({18-ARNIo{m0 z&eGPbab<;I+4wTyb-cJ)9NGgv{3WZ@iGAE)n?IJ1pPE)5s-xnF!VP{UF7s8|ZT=M6 z>^vt{nsL6OljGo>^5UxBbT_wNUqXm*Oh?{*I|_W?5c)dYM>5b3&D`@Ot`YrtyyCYL zbodh#Uga(oVhpmb`ra$bEix4tL+m!y8jW7X=w8E3Z33k;+ZDMTnK&DJz56VN9+Rh`!?j=8a!{pHM+e#f4HA$jXzk*On$^( z-Q8P=c*$&E9SBmY_?7*iGf`6==!Yt>EOSBru(cgbnBI1+tF-yVhh$G{F>(Dh;9Mdy z#*^GhnFN|9MpG&|yYoYKpgk%!ps}RVXAhhlt!V15G} zp?PBuT3z=<`oM2|h9Q2)UU(1{r3;N6%FRNB128#A{ZChhS|a??r1C_XvY! zDXBjl^kyJcQ}gF!p78`8lYWzMM^F56YOq#gjyVLYe1pNjE%00Jd{)%Qu zg|Q|Yh(6>P*t-uIYC4$mvgQdWFjL-k)YT0S1l*4Qa;62uV264F<$nY}<;7leLv9K4 z%Hb5jf3B;->UqgGI~ya#C>;eGH#@)mnRk)7q1f$7THx>UK`*LmFsx6;B_iT1ELX8h zD=#o#wCbYP#Rtj$EqFg4j~3N|e5+(#kCq0uojSvw%bvI^{cC*i%b=1n3MAEkZQ_^K zwy#b>W<|_1gHXBJ&A~U`^fBiUb5zp#FjG}zrtC>U7O43^%w%QZIxvALy$pTHEZ1-# z?I_TXTa3o1& zT2Z)_65#!-O|#G-CMwp@9&%s#Moht@$YrL(ttYKM1dHu^;K36PeNXrK(_Q!;m8kef zy)#OVWpxy`^BS$#vs1;Fko8BRFVrN%soL{qSfCI7`GgLu2|oMU8Gwn>;^JByQ(l78 zr|WZSK^_@PnXICHsQ>Cuk}qR>@5OHodv8KQW;Crz-z_q}D!H~f?!*$FVL-}Dj``ZO zLy`cK|0N{@lmiT*Uw4GY?N;^Z8e)bYx4(av!QM;&L^tb-Pme#ZbT;b_d|30mYZ-_O zm*?fN>!R7I~VPLdUOt~+02sSkdoh2F-k z5A|8?Cm$Xum^XXAnr*-4)z3URB^!_$+FkkaQkA?SC~bQ690BYsZ32+Rf z*-74zO>@k2!`jZiv?V7ZbflKVC2u!WnQTqGR4|SUqdJnfl9UvKMS2cs_*uVutad*- zH|>lA**=J=I{*H)=+7vzw?#(QjL{ickHqTJEC|Em{VI9U8D^vTXFzG7 z%FiFftOnl+Vu+0~&(1E;Iv*!xYlfp#r&!JXWYTiR_i%>1C z{@l%i@*6m{_@um}UtvMzrC<4kWKo0nFe7=iilo9{^0emGGiUa}8PjTN5$K##>`Hf( zRit!(uLzt?V1&0Ng=*>-m+b89paXUSBqWlmw;}ONzBw-qFr}?Q>~gSs8@o z!8Q-o#z#N8lCMln-@?)o0$yyj3gh``Vrglpzq@SXFeN_eu;yllo*Ji7a>Vi=J(Yj` zp^u$}XWfNp*|KAzh^u^6-rL-FT^%f@-mH~eCh1rdy6cQ;GV9ik*hWN(Ls0~V5wOrynlw?W zpn!BK0hA`a1Y{tDSST_y1p?Bg*97S`0YrKY5JC$Ol-_F~gm4dj-~BOn-Sw^cb=SIU zpbyHd<##k>`fFSjzJqD z!VB;`LxV&9Wt*Lq7WTUfOZPDl#8L1__x`I_1KBx9N-*ODCFi9()m(P>FuJ#%dqHZj zYtU2iy_4emLedst!ZiP4gW~%mcx7Wxi*4ih$dF;I_R-<U5Y2M{Zd-M2^)j)pg4DDX7saUBdU1F2&wGBeO(ZeGVb#nEzn}zx0?KHr zxYjwnaN1r&+#g#fl_VsHoNEZ3_|pf+DM}x%)_QcXLP1)f*{&2-?oWCv)O}gUakBx3 zGcAhJ6jK(K3}e(x=`p zymNWOuD9AFUzO{1kp;DV;MIrXz|gg@@++kx*V)ZOC6*RQ^LGYtR+hYyYvNVqNn~`I;tKnYA=$cj{S)D8IO(|Ip_i#%g zCzVzceE1XsA4m}?NfANN5~HrxmZ3-*2XF%RzN}T`=%DJ#d@4geh|mzBO)ty$_6;_U zz*h0lNvT_UlYRX*>zYTZ?6%y_EU#rt!huP}@2uZO_vrd%Jt5dLxvjk>(^t#YAEOEC z7TdFDQ?HC{}f8XqC&rS9sB8a{m%W7LU5K)-nORh<`$`AiG5yk- z06sel*a=F+?@0FJ@xp>dkLnYAglJvb^{aIr5~aAWskF7R7uD3X1H0{4&^%rJ=Bu*% zjhmu?FKKsTf2=O1(+VhuGApy&t%;FFFQKxq zCVyR2z66bK@#!p&|Q+{$}@+c zbPbFL^NI`?2PwCuxFxm6l!dwqjl(K<6{JlgrQAkyU7CnLjKRb8xH;?7YZO++_OKVScrffu}X;;)U= z$cf}THj4faNgH}|SMJw+h@k=!fYhta+Gd|Qb7piIx5+qBgP>UZ*pE!%F1gNeDp*if zx7#n>EiF;gPEd-h(F0d{o{OmqYqDh|!siBNwprVcchq>`yR3`5tGsxzsKqM;{H-Mi z1Fv#CQBv+vPypOv0hGFgu8ybJy)- zl@36b7wqMoU*y`BVXuLpfkLwwWM$1KP_||f6)x+(C|QqdZ!|ymaonI1fxC=a5F376 zN}gWTH$~;53_X`19~Q6dGW^-z-wp(;yDh8pd7!Y<5w*ud^jMKdUtiw@(Hqz#5BAev z8J{T7+%C)U2oUF=`FnpQpwzTlafLIxmqP6+3eiSsK1C&H~{bqG;&bbybQE}ih z@fCk$?C|2n_6c`>YM%KSK;G|qa7@KD5D08~ZNIPxrc!CcI zkq0XgP5QMqCx*HjzF8i(oS(i~RI|XRNt8Gt)zNVLPrattHGRG7SxcB5mA&Wx#mTs-=zQQGf?{GacQ^NNRjcLK*x1?)ju`c(wy^I1_iC{=CWXiI528KLV6D zjimF-o!FhJ_dZ?!ouJSoV(;e`eX>if22%3(aUav z$HmzhLn$~SlK9rKBW-Q- zJKhtZC`>=;-C6q0EmH`gchVxUSq9D?6$N6KuK3IQi?23CD#VL>nLr7lTkJyT&R;go zdTOSwiJ6J^M~U>26kEatg>F2OgBf$sbzN6kzP zJIf^zK7m|>q?p9gK;_yS3^T+nv{u%^v9=5k@i;|nl6WGFqXUStmKWThznxdRH^*i=!PZ*ECnQkz&nl~M=NAcm=P0eI+{<(A3mLH>vbO-SfPjo_zGFFqcn7lLeyK zr@CfB;w|5>)X^nJL-_ZhF?s9pd%OYRsFi%Lr9dXZIAQz+P(R_Vz>@?gP}BP9Qzjov z#9*2d10qTz%L-iXI3zkI8Xx|l3_^#@o@|5Vy4R`}I^pfNu5MB}X=cg=rm7P4x zb_;%E`z=WpDszL+noxn#$SNU0>FD0wNwbRN3D>)EOC_f}B+Df^h`Eg=#5zXkrKj5$ zfQ6*X1(FY`sZuUgf70rh6t%To`^)SBc?qEkJ32eGT3cO-)XtDhIybCFze8EQJuNg%JfCL0nK7M|1nNqW4ucl>L5 z?&m2GPhL|~!`PL2wCh+jV?Fs&-)oCj@foi6!S@{b5(4&Yt3YADcaDHIKYTHBzMC<4 zpQ43byRVjGZg5`ZYjtToZClS+jJ$99@}Y3#P*&)~+E_iJt!l$|cGjq0SIVzm^7?`5 z)Jx;xn417)aesdw=Di}v#!hfxm@H{FCC(Tg=pIOx;Nh<2rN-ptYR?(r6r~ZYO(#gr z31FH~3JTCVw?xc|)W6l;-7`@Nom<$8Mh)rGJKFCSufi?@0FF~r=rvKkb*ZyQ<<;uOBbt71Qo{O)Kw)b6#FBnw49(G&UXqdl<+hRZ?<=jZ=!ZFfR15 zlcy&H0(tauo_abmCJvb_`OhP?FfTGP0&^KJa!DZ?ukHKzEQSKR#I)v9I8XT?!SPU`L!V->(-+i%qb zw|Ex}5jHxUJ4Trym;=@lDSb8GXC(p9Nn_ggBnTu{)VSX*ZCp{X_dH`NIPTk|w%j(Q zp&@xXo4e3Z?w|Cqv%O8*r*Mj((EuIBKJR9%p<(n|qPe-r=*UWXPSFuyW-`({f61~$ zCq%ulw~_E_2`ibcCqFZDI*9mPIQ*)_sNL|FPq|IFkHH5F9Jgg&hQU&?JlF%Rat(Yo z+u-KQWErb${aeIRXmB`+SoP&goH@)3q5SPf-oVA>@Z7vShF=-r%k6WdCZUm};V=ZsPI&Bje(VjCZ@s$MDvfk6YF@*b z9>RF9E0`4D^;CQYW!JW9iGa_4RBPt3dMyP~7#FRzyh9rA-yf2Pao>0Qj1tVwrpBhk zvdQoYE%vSTs%r2>xj(-onxatT!#g(862`SO$MeOmH3F50&_S?3_r6eqzueTLY%h`b z|6*lOiYP@}Sgey<&mQdYQST%a2Ocv6Gp(BKrUZ#aell1)khbhl4CKx$AddWZ@`LhT zzsN|RfYfD{j`2J7TidY{S|)3MWX#68l9@9PkE}5Vvz$m)R>k+%bb?DuOKby!J6lev zaSu=a++n;_pX(kXT-Qf^uWld8{pb2&i2^h`!;816!Yrejq#8$q|g zE=U&S{nUH%;F+4wxeP3v}<&DIx{-8PPA>NMXhf+{w~y` zL;@i!j2x4`caAqxHxEcjYRLC+Tjv|tr%E1k z2DLxCwCmgwzqj}G?c0q@*9B5!1p_|aw$~lnSz;IUBr>pZadG9CV|r3#valIm1C5^x z93AbhFE0-^(M!Z9COQsufWT|mVj%m(zS~CNw}4#0(695AnG{CoJJ`7*C_ma&xeBXt zt27VrL$7c+Tyd%QJuV(Z;^f#Ob0&t9;Ocw+b9Q!i?&r_JSy{Wn!`T@ITSVOA$Cm19 zsd6V3pX!gr?wt~Toood20=o+ zhlit3@zvFJRhfAI;Z2i-8l3di<0MfPLj9S%kLl@OL+5%UIix*Whb)9qg=a2Yts)() zmESByqqVjOlp0D_+gjd%c(tBfeYVBW9rt2|(fYT_$7c+CIYwOpTS3F^KrfM^ ze)$?Y<+NH?2?ZW5@!2#r9$}GN8d@3}_q;2rzPM4ArGc_g;7FvKb32YO##%)vtI6+- zZ=qc;m>CzGZ^7YULXIah-{h zxizR64ONODC49>5ZwVx0s;bO zf`WXcs~MzU^-b}z$@`X>Jw~CuT$7F^(A35CWL;BJn7E|mQvoqCu>n6&Y@h|{Y3#OM zxW2wwvRO75qY45d%b;VDy$>fCfoxZ*`?}9JxaLiZ3J7ae>Pw@x*2|yMf z&uoq-CEW`A+A%6~+@I9ZBzvlqT=HI|UCM$&gH=0hjg^&kLf(t>s*DI}c_jVo7%{W$ z@Srs~5I;1esxtA$+i7)g$B0q8XrG?#!uFZ|f%x#iI9D2R)?K?&X zd}g+cjM3+1maM2qd3Q#bLar~rx!+{NlPc%G476o99Aoj|0q`|#4Bz8b?re4$EAi?3 zzzgb_>3aT1>vAM4FLPNpTJ?Nubv!c9-7W8|=uQNuM&Y3Uu}<(sNG}zbh*D(m9=k5B z%$_p${f7=o$`WMVK~O^=R$4oitr>YH4ZFmOCs{)G^jIyLuy9;1_OS@RMOPM zID$*zp^mYSeYGJ}^kzYREPSsq^QIpB@DLuvScFDn6F$-a3Pp-6G@EGpC+{8i?N6Vd z`(ssuQ~|6K$R~k$uhpc)k4WrnZMB4FZAw~%7KlzGM#?sJr9S88-lqNd)dpFj>B_Qt z10?cv-ltk_mK^}}7@(Qm`0X#p%a;jv?*=e=RQqkf*0fS3#>QG(5!RMI#>Or#JtP4u z@5Hq~aY{i9oYE$S#yal&!p{3q&GvbDD7M7ZxXR^sDy3g}&c&Qo4*-U@qZiG8O~5Ij z8tE8O1YE8kvttxwsc*o-u!Qg(YK*cA8g4HTCPjY-Hqwgf@=^Cw28Q~DW)(tyw7TN& zE%?DfGdTpURQtXU40kr1?Z9S0KonFhYme4^qPgV(MNCwYrm%2l=f<9UCZ@ThSrfBP z$m+AvWmrM7b4$_zUaFW~j#gz$0@pa*IJWz)SRuY=M)|OX>E_-zQ3MHTWP-|K8(PF3 zGu%E+^<&#N22)a6d9?mrTM}h4xy_LNvJxS87*<-aG**PsFc@!IxjWZ*wn;$SXJH|y zqq8&5)R&f=&ws4XKe&D78LVW=5~<-Ot9Ln#nVvrMxxfGDB)y81GdrVpZ`AaQeo^_O zo*|aw;eM~8E9AGb`rh1W^o>UW>rOPe!qGP||M?C*H^Ogim1ycu`8ayw=RY~w|(+X>YDMIy!p0PO2`Q6kgwAJjczR5S3&GYzjz?vlq6vFH0`_+RlnZaJl`wY+B;D zRyoI|9CypZ!nEUrk)1PTB7JYcS^3e-5ANq(!a~Y$xVg(J&;iM6$~Rp7mo79M%k*>H zZ+==*AKd=uP$K`y^!HC}hX3!9Wd3f?{J(qs2Im7rv-jd;z$w3X$A(;W6)k17qUGEF E0%G3w=l}o! literal 0 HcmV?d00001 diff --git a/tests/test_config.py b/tests/test_config.py index 162a564..bf2eccc 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -36,6 +36,13 @@ def test_default_and_capability_routes(self): self.assertEqual(config.profiles['fast'].routes['reranking'][0]['model'], 'cohere/rerank') self.assertNotIn('secret', str(describe(config))) + def test_checked_in_config_loads_in_a_clean_checkout(self): + source = Path(__file__).resolve().parents[1] / "aiython.toml" + self.path.write_text(source.read_text(encoding="utf-8"), encoding="utf-8") + selected = resolve(self.root / "examples" / "recipes" / "03_loop.py") + self.assertEqual(selected.path, self.path) + self.assertEqual(selected.profiles["default"].model, "openrouter/openai/gpt-6-luna") + def test_project_scoped_credentials_and_process_override(self): self.path.write_text('version=3\nmodel="openai/test"\nenv_file=".aiython/credentials.env"\napi_key_env="TEST_AI_KEY"\n') (self.root / '.aiython').mkdir()