From ec520cb7851b5c0ff70f50a0e6b4605ac1ab2383 Mon Sep 17 00:00:00 2001 From: nisstyre56 Date: Fri, 17 Oct 2014 21:50:25 -0400 Subject: [PATCH] add helper function for invoking closures that only take one argument --- Makefile | 34 +++++++++++++++++----------------- RTS.c | 21 ++++++++++++++++++--- RTS.h | 4 ++++ RTS.o | Bin 0 -> 4296 bytes RTS.so | Bin 0 -> 8892 bytes rts_test | Bin 0 -> 9999 bytes tokenize.o | Bin 0 -> 7776 bytes tokenize.so | Bin 0 -> 11732 bytes tokenize_debug | Bin 0 -> 15527 bytes tokenize_test | Bin 0 -> 12821 bytes 10 files changed, 39 insertions(+), 20 deletions(-) create mode 100644 RTS.o create mode 100755 RTS.so create mode 100755 rts_test create mode 100644 tokenize.o create mode 100755 tokenize.so create mode 100755 tokenize_debug create mode 100755 tokenize_test diff --git a/Makefile b/Makefile index 77dad1b..7a5e23e 100644 --- a/Makefile +++ b/Makefile @@ -1,34 +1,34 @@ -default: tokenize.c closures.c tokenize.h RTS.h - $(CC) -DNDEBUG -Wall -Wextra -pedantic -Wpointer-arith -Wmissing-prototypes -Werror -std=c99 -O3 ./tokenize.c -lmaa; - $(CC) -DNDEBUG -Wall -Wextra -pedantic -Wpointer-arith -Wmissing-prototypes -Werror -std=c99 -O3 ./closures.c; +default: tokenize.c RTS.c tokenize.h RTS.h + $(CC) -DNDEBUG -Wall -Wextra -pedantic -Wpointer-arith -Wmissing-prototypes -Werror -std=c99 -O3 ./tokenize.c -lmaa -o tokenize_test; + $(CC) -DNDEBUG -Wall -Wextra -pedantic -Wpointer-arith -Wmissing-prototypes -Werror -std=c99 -O3 ./RTS.c -o rts_test; -unsafe: tokenize.c closures.c tokenize.h RTS.h +unsafe: tokenize.c RTS.c tokenize.h RTS.h $(CC) -DNDEBUG -std=c99 -O3 ./tokenize.c -lmaa; - $(CC) -DNDEBUG -std=c99 -O3 ./closures.c; + $(CC) -DNDEBUG -std=c99 -O3 ./RTS.c; -unsafelib: tokenize.c closures.c tokenize.h RTS.h +unsafelib: tokenize.c RTS.c tokenize.h RTS.h $(CC) -DLIB -DNDEBUG -c -fpic -std=c99 -O3 ./tokenize.c; $(CC) -shared -o tokenize.so tokenize.o -lmaa; - $(CC) -DLIB -DNDEBUG -c -fpic -std=c99 -O3 ./closures.c; - $(CC) -shared -o closures.so closures.o; + $(CC) -DLIB -DNDEBUG -c -fpic -std=c99 -O3 ./RTS.c; + $(CC) -shared -o RTS.so RTS.o; -lib: tokenize.c closures.c tokenize.h RTS.h +lib: tokenize.c RTS.c tokenize.h RTS.h $(CC) -DLIB -DNDEBUG -c -fpic -Wall -Wextra -pedantic -Wpointer-arith -Werror -std=c99 -O3 ./tokenize.c $(CC) -shared -o tokenize.so tokenize.o -lmaa; - $(CC) -DLIB -DNDEBUG -c -fpic -Wall -Wextra -pedantic -Wpointer-arith -Werror -std=c99 -O3 ./closures.c; - $(CC) -shared -o closures.so closures.o; + $(CC) -DLIB -DNDEBUG -c -fpic -Wall -Wextra -pedantic -Wpointer-arith -Werror -std=c99 -O3 ./RTS.c; + $(CC) -shared -o RTS.so RTS.o; -debug: tokenize.c closures.c tokenize.h RTS.h - $(CC) -Wall -Wextra -pedantic -Wpointer-arith -Wmissing-prototypes -Werror -std=c99 ./tokenize.c -lmaa; - $(CC) -Wall -Wextra -pedantic -Wpointer-arith -Wmissing-prototypes -Werror -std=c99 ./closures.c; +debug: tokenize.c RTS.c tokenize.h RTS.h + $(CC) -Wall -Wextra -pedantic -Wpointer-arith -Wmissing-prototypes -Werror -std=c99 ./tokenize.c -lmaa -o tokenize_debug; + $(CC) -Wall -Wextra -pedantic -Wpointer-arith -Wmissing-prototypes -Werror -std=c99 ./RTS.c; -debuglib: tokenize.c closures.c tokenize.h RTS.h +debuglib: tokenize.c RTS.c tokenize.h RTS.h $(CC) -g -c -fpic -Wall -Wextra -pedantic -Wpointer-arith -Wmissing-prototypes -Werror -std=c99 ./tokenize.c; $(CC) -shared -o tokenize.so tokenize.o -lmaa; - $(CC) -g -c -fpic -Wall -Wextra -pedantic -Wpointer-arith -Wmissing-prototypes -Werror -std=c99 ./closures.c; - $(CC) -shared -o closures.so closures.o; + $(CC) -g -c -fpic -Wall -Wextra -pedantic -Wpointer-arith -Wmissing-prototypes -Werror -std=c99 ./RTS.c; + $(CC) -shared -o RTS.so RTS.o; diff --git a/RTS.c b/RTS.c index e4328f7..356da7a 100644 --- a/RTS.c +++ b/RTS.c @@ -145,6 +145,21 @@ invoke(svalue_t *closure, svalue_t **arguments) { return closure->value.closure->func(arguments, closure->value.closure->fvars); } +/* Special case where there is only on argument + * this might end up only being used for testing + * since the code generator will construct singleton + * arrays most likely, anyway + */ +inline svalue_t* +invoke1(svalue_t *closure, svalue_t *arg) { + svalue_t **args = malloc(sizeof (svalue_t *)); + CHECK(args); + args[0] = arg; + svalue_t* result = invoke(closure, args); + free(args); + return result; +} + /* * The process for closure conversion basically involves finding all of the free variables * This will give the number of variables the environment must hold in total @@ -189,9 +204,9 @@ main(void) { /* Get the final closure */ svalue_t *closure1 = make_closure(make_doubleadder, env); /* Invoke the closure that the closure returns */ - svalue_t *c1 = invoke(closure1, &box_int(23)); - svalue_t *c2 = invoke(c1, &box_int(5)); - svalue_t *result = invoke(c2, &box_int(334)); + svalue_t *c1 = invoke1(closure1, box_int(23)); + svalue_t *c2 = invoke1(c1, box_int(5)); + svalue_t *result = invoke1(c2, box_int(334)); /* The final result */ printf("print 23 + 5 + 334 == %d\n", result->value.integer); svalue_t *a = box_int(123); diff --git a/RTS.h b/RTS.h index 6d7e2df..3121e5e 100644 --- a/RTS.h +++ b/RTS.h @@ -69,6 +69,10 @@ make_closure(svalue_t *(*func)(svalue_t**, svalue_t**), svalue_t * invoke(svalue_t*, svalue_t**); +svalue_t * +invoke1(svalue_t*, svalue_t*); + + svalue_t * box_int(int x); diff --git a/RTS.o b/RTS.o new file mode 100644 index 0000000000000000000000000000000000000000..abb0337cc04b4ad6e005dc3604dd2472cfc61e55 GIT binary patch literal 4296 zcmbtXUuauZ7(Yom7i*VfIw7s&pmNk>IKc;DW>q3(zCbzR2 z428^%OQ-bR7oWy(FM4?kr!j8CmA|7UT(jI#Z>{esh zIDUikltZs0jBHJt(Vp{Q0B@fRa5uU=6Yo+X?nYzObM~xc;xUXu&N1oI&A~`}!3+-8 z*DlsHi5_oE#=C=fVHNKV;)R_I;ssSa>Cz|P-PTGfCiA8GCdezHyb_#GpUkJRJk}-+ zuIJHFOI6gpN0aYW88|OeQA0BHj=1HXqGFCw9Z|;K<0spYPA_iI=?nA{adkAg#?%5m zdR-Qg-@o39yLTVT51Z1WMSuMK(z&DWx(|r--gVTkxs7CqtV@fBnciqtA^xb$Po___ zDTcTI7lw%Mj^+MpEmUc%i}f`M+gb(-#gaW`I2EH%Dpe*6j%}3fa;0`gh@pcA-!OWI z4j^BdXNn>v!xj%6rvCrtO*6f;HvI}*4H_`53>cH6}A}}8d?CjbaUZfq1$-cn0 zB5Q+mg4^#yrz5dO@K7XC>x{(Gk#PDcA#m1m>@xwKiKK!<=Y5mBZ=Zh9^m^;dTjW#r zc=bnOmk|3xC=)Rn9ob0gTxY}}fO6>f=83w!#bchq7$s)?OxY<+2(#|gJbg;FsO$yP zvF9COP8FPjFemDDApvu4wp5(4OJ{^BooW@&!PB5hnn__!R?202mWIz(9NVPT-BWi8 zlQTTXK9!%Y70R~C{Mq_$U_*hch--n~F3HFOFJE?;c?3cwZ4_U?iLlU6}al+`3 zV2?mvp$E7xjHvqoIFs;FcpZAbMh`gs?vFb@Nn=~h|8d6;@OYjk^*nJnAvI5h`)idV zgCB$Mcoc6T7Cj~Fhc)uo?>)kh|6cY}>JrC)UIDCC{gggIINCTHx?JY*IA6M`aY|zs zsje z40*K7gwR$MhCdfc5wi|GbenjFP;>U12ZTiDW}wM~727OZWmi>kvn?dJ=o*ZgKdsGI zedC^Gyvn}vJ4fwZ^!V>Mxa@C(zu5*)wZU;;AfHvzkO@zTVbZ`;yuk9iN!T&Qml&7d zLBeqE;4gm#Qd{94F+R@wPT@Fb@c)K!`TZm8BI5=xee)Z4BsXeK3Nw2!DJClO`O}5c zoGn{L`Y`2(vcvu9Y<_rfaC9J-&!zjb19?%FKTkw;&Z!G~zUWBz=~AWOwWca_6D5y> zK6J&|52bywRH@I^Jh)mY)`(@s&MUMyd%7}%xvHIj^l=Y9Soh={wISG{IAaR`79a`y zvAYz04Il~pvCazr0U!x*+zAR_qc+6P-^1(S=Z`b)=QlN6=U4ZepZ{_j{;L{~p8t0m zuJiw*;d*`Ux8aus-&}F zuk(Mc;X41ahU@${+u&h7Cot=Aw=wQt_vbWRkBeGDz=LO;9tg%m6s~?_s~b<@y`G!; zOf>!RdkBKLLzMsPUbp!_K;gL8AclNz_;Xj@duS{FDjUXFD}0svjt@`qK3nwRON@W- b!_|GZ=EKJkh@?x~w}8}rrsAl4)P43J9a^C3 literal 0 HcmV?d00001 diff --git a/RTS.so b/RTS.so new file mode 100755 index 0000000000000000000000000000000000000000..eb58ec687d1539ca9a5b09ddb26226632da157ea GIT binary patch literal 8892 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 literal 0 HcmV?d00001 diff --git a/rts_test b/rts_test new file mode 100755 index 0000000000000000000000000000000000000000..192a1c61d3ba67c0326acdfef94bd9d9a72c045a GIT binary patch literal 9999 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 BjTZm_ literal 0 HcmV?d00001 diff --git a/tokenize.so b/tokenize.so new file mode 100755 index 0000000000000000000000000000000000000000..5fdcd6cd7ca29c7136e69bc2a2d5e1567fd64d80 GIT binary patch literal 11732 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 U0bK^Xt@|}?(auP;QK_3+YW8=|yZ6m| zFEd-}etRKv?m73IbI(2J-gDo(@4c^t>R0%EKB0gp%BVlpBz83igp=6b04zXl(R1RqC7S4+0}R zNI)#--vVS`fY$J)*+TW$MHWNsq99ik+-s4Af=cds$dR3ATdE}E<+13-g$pi^wake{ z;iKk!5?6~Ls z)i-~C&*NmE%#rR(@K`(<*#rXfB1V1g2V*Fn&!T)jz z`X5TrXM?Wc&s%N-p;*8FQiA?y3HlR`V_C(xBnc<{q7{a)Ai?LSn zEsKRysYuEaFDl%YYBQqoR3vE%swN|5G8)+u5uM3MI2KDZi_T^XG9$VUn`mrJMk37L z3^ov`u_cl+lZmZlb~72hP((VTrsznU=-(haU|wrD8WZ4)MdBbfn_D{~#zuqsF$@xv zqi7FD<02LBNJiskt5{jTYUwg#9^9a6^8#1EYgGLF&q|V1FBDa$wMWH=*8PBLU7r_? zVyTpgF+Piyo*X@g^h^X!rFVK00nTk>xn}(gOmE`KX#7f6#s{Z2F(kU`lL<2lbd`&U zUhbef^L3Sj?#x%!4*F(8t(RAr?94&hZ8v^l=V;-9e|E zqe_E=UZIG9H#z7k2Grc-pgY%1n}dFyLr;f;PPtVTy}Q3$&yKusswVUuJ?6;V57DA` zzfgWyaaeHZiZNgrnmG=?l@|w5BfO0o^L;}oGyQ~9X!E^{e>4R+O{aVhS)ivl%UX$9_nInGzO4c3Axj)l@~9^bUX}&3J!f-1_gR%KtGhbM)w`jfBLa` zzO8Mn(pGsf>EZsnuKLYnO^Eb_MhNEOFl@t-k;g&ueQ=oKdoVYR47*08N1pl?_3KMQgIgv& zy#^N^&s>cW9q5{hZg$}(cQG7D9J@MvdbY6-Do*H`pFZ;-+MtTN&ixAdGNIGm+fEOe zW3!>t`u(KPlnU!?g%6X$<6tJv^rVBY0k<@41@RzF&|D?@qfTBtOaoY_XSVfb(r;u# zZ)9M5Hq;Bdb3Bf0V@}T;(lbBH9J_ggWbW>-){lnzphp}D^}*m!-vOG&H0a0R6IiZi zUQ%LMO4U*njtZiy6Nr*z3H88Z$Mo)PCq#PU!8ghBADvM~evuqVp2$LVXwa$#%TXUd zeGsD`fIEMEA>6qc-COP)A|1WZ0i^>XE!$&u`xvn2_EEc3QMu#0WP27$vG#mIKh!ru z&pa=CtI{*SpmD`Xf}GO5Ek~wSlbUmEQx94SVJi8np^DY*+RgenmJP@;G?E~i8VB`5 zza63P8b@qBz>nz}pPsp1vIu=w1348lplUxw>(u8yxvUjnI9`L}ZR^?5pZ~LRw9m30 z5w{%Oy={;@_cnPpV|#8j4S5TM^zQaSG7$V2&W;`xxsN_l3ilBgGtgkHsvL}(aoznj zG!?9oQMb^>4x;$>xn{(Jw%(h#cZ$HIr%#i0fA6;L1UNZD<{0jNNvLnjbe{XqfDyeM z(VwOYCh3qq?LEEw#nF1^*r|(T*A$x^$EN%3D&5zsXDMtDvlakma!p|-Yvj;O`edfD zFB>|U37t_>gPr^CpOi25!lv$RePr@PTKV5c|JGE!fgCy$&Dq8?Y_6}j@=0;!W#$Ao zVNQBPcj$~S8#;qka7xuNwp1Xug+`ne+11bh+kG!pK6$QQdEgb@hyT5mPl?K>dS>FD zQXou6paB^pJ(@jostl-mdRU`zjpGt~9B-f|$5Bq>IPMlKLLb=RwS~@Qy z*Kisf6y_)_I=G4r>BHh>O|RLS!sLRH! z98P1m2hyX+%crDwE@PK_hT`L)Pzo02NTlFXBiWV3yjWyTy#C*6PV64EeOXJsqzgjF zoS1-SSDYK%BdRg4aT8{nfm{qie|;usG!x9d9DtK*Cd{zo!Pbnkt>Jid!)!1V8>DNh z{P{yQyvHFSr^-b%ybElFJmu%HLRvEJQOq*Ousib)VnT2%c&_KZ3I4MjS=zI7W~Ixm zu_d3d9GVOL4a$@(7S2hYTW6HV+-oPZ?Mx;;h@A}k+Ugv4IC%S{r|W3!m)m1+r^&q# zPNEHfwwqn!{NTNeb~f5Ij$^Gn2J2LYyt98N{D3U86IT{pnQwmyNh`Cf6TjIVTo3gh zpsTNgbZe5^0L7F!4}by^N^XorI???cu?t)&48eqFR@xSQnJn7-M+ECRQcEd{Idq$Y zpJ2nH60D@q5c3LCQ~rBK3K935L;Mi|B=vZBEN975Lq4q$X#;D z)ucaT4F%54g!;4Nt8w+JXV0HRU{`35l|P<`Px9~JI(V4;Y_I$v5*_6KM8KB+D#dw_HSvR__&%smZrGa;G$|pmw?eym#LKM72 zTvaaN>4FK#!HwC$tcjd6CXHu>|xZ^iyUQPZ=lkC7v@ zPmoKY2V!rXAv%nw3ma;;T=6KgTb84F_W`;SqHgY>s5mYe3z0j9miz~}w9J0Hm~&Hu z4(I;eCw1UnJ*xo%v^m1)$t%nhL;qkhfOAi>MU~z)AR}$O?Fb*&P9Z z|2Y7i9OuGKQ(*-hK}-HU*gq`y&GP2HXAvgkzUK(ox$iELf1KrutsvSA?Ev0LY|1Zm zNp!a9>6?G}KLqeGJ2)J`3!rP*3i@}OhXeTjyJsE1l}^)C0M|m^3Sc=k7g<5mky(la zFb_eHIr(x5gIyfJrzo;TSI|hzpi}b;d1KfJ78W!)=?|fk=Y%biz z;Qn?Su3XXsXvNjb(Od*p@Li{Uy=SrTJ)yispI}>h6g5cV3dVIOIMA<#_q_r`Io&Ew zdirL%Dmr0D^cW3YD{!H=qq#oFOSRPp{&{kcot$+LiD?Oh9G3E>BOmTq=S6il*4mg zTgH>0i5ND_}h%w)LPl=|@SBO2di zw2_I)NGuXgAwc9I3ZidH*^)hgbl%;P9~$Zh-2V2^(6fMdU}Dp=i6vM*3jo^y*8~15 zpb0n?$>u)5#{ho>*p8g|2H+Cpv@?KrB7@Ph)>dpKR|4LStA$$te**X=!1=h`+Y5LD z;0u5Pr*QAu8*kJMs+D9i6$@eEt`iiTe2r+CPi9ZpGLeVxa7y#^7nv#9_GPKF8Ou#I37j&=h5B*zuNZc-DPDr zmfHg%J6{Fg*Klz(-KpnRi-p=xqy28QKjLinKV;iEk>(X{srWgQ^7jf$emP_opuHUJ z5t3h8QFX6>X+`zd%R&{}t`SQsYVH}SSJd7$O0QVdJ$g+=u%lv8T}5qOMa|L*4Se8V zT2apPl;(9U^Z*PiJ?8|Ownsw60Mog6A@56Q87JEx9v$SGdiHgCiiJ;-?drXWDH11_ zQkiT4(KoG$YveB~s{M~24KPudAt40&6tEh9RL-}6 z{fi~c<;3(RhRQeh%K@wPs`j~0F&CbZjtX*3(FaFbxUyUIhkJf53dd0!kLQ@=$K?;> z%DEUMKW7k5Lg_TtIeyOyP$S)?R>4KBZ)Tycq_rhL;#zS z8QutJCN0>eYS^$M$qo^~rX2~?EnPLo3~!Ryrg%EAF&)KQF3}bdAgnE%Y7>E$t#RnH zpqaEb zWEEyf7~y0xyw#FW^)EJq4cf!)(Png=fI|EPxED*~##BlKniK8q*m}L*``d9^w=_r9 z`VjsgFce8p>((L`uJ;s9xsle2lAr1i0>eHa2^wRCpAm&B*XH8aDSxFu$n-0v{0znl zKVJFeXu`o^LiOL|4}wB@g#qtJR2ylbcK(s5xDFM{B}%@_9|VSdP!a~^0;YUKRc{`+ z0W``rN?zr!PHCvhS770y@`1u{MTK&Ol2`fRerfQfl2O^O_!QiXcFH{pSNZ3d6j0Z( zUi(%5cc4P1DtVRf2Bo~pZ>oRq__urHRsO7!30&n{lBYezEB|%S$R{e_tNrF-niME% zAF;5)eTTv`s5s?&M+dp7SIT?+j}u=m3f>3IDX-pl9FT_k=_1upl$;_xfQnOI?T@GB zhN$)l#V@CYLd6~_ulz6M{g9ftU$h%65pVwwd*s#of$F`%y_T5$>+SzZk9-y0C7@Du zF$2NZ$X1nqRs0mG2bBu^+57FZCSZm4E4}<){AKV~;!nw|>xI5)q@^%lENnP_0uAJU zB~PzGP|2O8{C|O$=AM#Q`=xr%vyYUcsQIbvS8;d?ZO;DH`&7NtSW7K=k?v5a z7?QMFn_^Xz{45V$$tySk?W%7l>km}_icvOtP`1ajM3{3C-z4Gwaf~H+AwUR!YCI~h z(fTab|DMlUa-%76If}P`N7Jxs8CmBK7NPs?_kW#@Ww1o;e{T8+`#RZ8ABlY`=p=Ey z46{}3L(axB?6hisans9%+Be+vbA;Lt-1IT_b+Vg2R;c{#rjHXUFT3gE?f1*w^a`Q! zsGE*Vq4J}np$yOQRNixt;mrxiV?ig0>t%RzRo%BZ8_RGaq4JNLJ`wq($w}gR8SXk% zzHl~{i3{xaD&6!?3AMi6^lG8jt(!gx>#)g5;(FPzUC~;XBgA{O9EX)+bXo_+=(OGW za98OauLinbj2GHDLDUL`-cTialZUQL`W_FRu6KN*FfO&8+L=Dw|Fl1o{vMB>JY zRS0^#NA}RmJyet)x=v$zDl9sm&7gg+gTJ$%$Rfyw~pI*(NLiwG_ z?;^SDLm_+U%?m2y`4eGgY^v08xKf+ zZ(e$g`G@C?!=RrF|Ik~jR9GDFXOjM^oL77n2>KgLCr)?Cfv&kpjL})BhSL>qUaAD$ z`TnvJod$Xp_`Uh6hWUr*^FRqbOPM}iJU=Cp~I^1j=PHD#hY8i|OOV&T&EJ`-a6X=1Mxf22CZxzc?lZy$X4Ix2N9~l3(37 zNp`VX(wCeYWD=jXqILt*6;}ag(ol8hcph7VYDQSO|itraLi~i6UmejPIn3%Cw0UkW~3#s zaN)cwpt%T>K?hsbF_nR%Cp=EG4z^m-?d@A3;=u5&P1JO;s^?2E`}Ve|8A)}7oB4^5 zxGjxiI(jyQhh?p%(GgDKDONJNsZG_LkCF_dVQpyr`Y#wO8n0Wne$|@m3?nda@#1-S z9JN_KV1gyXdFI#FE-uk9mxfzRV%}W!kPGK*C0G_q7VCLgai#^fp2EYj5}b>qI{Bcj zIM)@6JkQ#Svwe1M38NR`JFB7tUQC`?v9@k?$Ov7xoW8N*38w0x(b-MV6;ceJbYq%FE5u zQFx#_>_aaPXW@A)7F%Il@pLRkYr*@qo6(X=7;WKr3w;Tkkbb4o`bI-ZwoO|xM=broCefODQc(v2vV6r&b4;W!dw~v#|f5y7M!%;z7 z!Q9NpzQg9Q+d!FspO3c?G;0zL2-On01)mGBgz8Q~aQe)OfOAcZNhmEONd1izpQxJf z<=G}GA!A-nAUU#izi8h-yNS~!>=$5w$PEZN35Q8BiiC1}G&cIp75e5n zeZUC!5nuuSKLWWgKx;U!xA1y}V5sn!6#;cYmQcz)1Ua(v+mu6cr z(H={6FYaEkeDU&S)ya7E5^g{7(Gb_H-^3-PKfJ)G?-}^fTvGe9FMaUmuI!ICr5B&S zZ~9Yj?f>z;zd1;<@`viTE3loz@afM7Opl^=P7T-KvgwEZP{^(h+5vwzV@J(~^25p=%n`)^67}3cghxkz_KO zG{wghZcDal?XhGup);x`qI#k|x;@Ie6VXUVN4%MJH=B?%qU(r`#@0kM%K4kY1_Cv< zM3Z_VzLU&uCZm_LXm`8Lx>7p&*P8X6T~Td|Mk+Opc!a^7k@gr%#<~*iF};KC=Sqq)|mgS0tE^{Ka z-LTND_Om;ixG3qE#B1iC+d`jgp_f_cQ!Mlf3*BR(do6V7Yih2t(913SH5R&ceW>YA z-0I#5(V1SR_73P1vU?$tJUuAk#e2&bvZ?c?}8gwvGddN_U;;pE0#7sqE4PE(L; z;`lVe$@RGgj!z<-T%PlB+(|gOI#((CtHwDs{o$2{#?Z-uGKi=rkM_?ZaIy=J z9@$EWeXh)7hc;j$HmQqM05yHXqZ;S8&!Gjw-Cw@>2sPw~TV)5E2V1EWIy_A6o77#G zxq_p&Tu`7ISJb1~2UW+A`ny~D%!0PbQXBe(9%WvDv7YbG$M{&Pd=mt-F<7;EXo3eM z$JIfa-y?_cK%k}{WT^=k|B~#LrhQ5R`O}+oPZl|V$B*$vcE+uI{t!8c$IghouMq7J zO*hn|fBz+64qPjMesYb18 zJmgl5QfRK=UHsW*|6~5mrarZAKP3ot?=#?Rtb~e7p`+(Z!p7z7OW)-4h-q~%$huE8 zR)J%id%f{;6=PTOYmFDG+NW6*10=rMJ#?~1y2;|(!ywf}aA z*1(|uPyCNaA6`97E8ln%Hnge6Q;iODd%ZTV8iC4+>^m?(?R}4s8uEsc z`3wuB?t=2u6M)9s!P-me$v~x-#KV1+OM}Y6m6gE^CdY?`958OIGcK<)KK2{OFNT$Q zJ?NCBk2%5*=#^fm!sM!ZpQ@|~8&^WZQDD3s?psN! z7X~vQDw+QR$=~yJm69n(AE+%-G7qAr8hT|JAHx%5^*e>|Ov(K_k0fIb7o6G8i-U1KP#u6z2g% znR0l_HeOZ)uz$GzBaI4 zO3d-6FZ_{z*E#AxU&mB2hZye4)oPKf|>V%#vpXO8>o9<**(a6KU-wcKbo|Q zcZ{r;@$DK^GS3iy?|_oo&IJd_?KNTJ*80AC=fGuU0Zg#luN(|A|4@*zJ%P$V_Fr%2 z^C9E7au7&hFWT4jeh7D#`S%2wlKBdWRt0rM=m>^E2`?X>e?v{5a#FCY5OqG&Ap@S7 z1pct`8R#_C>d|uu*T%{UQ@|NEwzvbvG0b?{gM2`KUT0h*{VJL2RgG>;BM+4-)XTX2 zs6hUBo4NMyGW|ZcdA-B(O zoGzN;-aBD}~?(dZ5eUReCp}iY0n+uDRaK@%KFe##@fMM zsBEx@w}ZmF!3=Mi$olY*GInf(Tg3K-+~Tiz-VgQdHuoJwGg+e=L!{EH9{s2!yAVdv z&SRV;T7{B{bfGA;(!6dT@1_e~9lUfiMOEcO%HMPhaQmMm0>i1cNNN z8xdGe?tVoEo;ts=@=;p+kE-*JiFkWQ$>hvI^gtUMI$Y4dz(b7~=Dg{THzC_S`S94y@+$y{BlN=G*OW=QICl*vRsYh*lpS z^0+e{Uz%HpBWy%y3&{=95~8@X_90dnGL$itJ$BXRo=M!`Fs;Q?VrAnwN<5X2vs4iY zW}vm82PAp!DRbjobjIKJv?H4{71O3^Zsx{iI1FA=v1DrpOkXVn6MUs)UWKQ{qB$2f zKFYp`20pyp%eDzFvcAM_eHeORD-x}YE|?oOR)mcvckU1^J0r_&U39vy+d-bm`YeXd zhd57w+|t?snp)G+pM54Qoo2K2Q#9oMlO7K&%dN;r4ID*z>{o~?Gmm}0nY=9`5Fw?M zuPn`#lbLnrmEG5{RUl#I(g>2#cJDFO!ohmy*fziYDYseQV)d+_?ENJ)9@#+A`Yd?N z$MXu(C!b&OESviorq+C3-&|n2N;Up27b?*HKs7&<)edA=6{xSFR(PJkD+;}>==btB z3_R$6H@gV!>fRq$9PXM3GcH~+F>a6fdNOGC^8s2+19w0|JO}XScOy@a@Zr7%*Iiz` z%=IlM_;AR$9x~3EDt0JZxMD8`lHSke~5;H9hE1>n^4) z&`X!)`N{IWcy$odMDO_EK$V}*td6vIL|eRi+{+J_aD?RTjCRHoJK2IH+mO<|@m5KA zIG##0N4@PyaL2tJk;K+0$>H3og)L%uky;f`b+mY6aeYKrG!{>7Z4(;2t?`6cZzHK~ z(U=#ryjrqfc=2OfHboWNbqjR_XE<4Q5l|= z_W)9vVFKoOawBtempSH4DRu92l$H^l&ivnlE%yi>0%P+tR*5#^-*eftnR&`qdn(o{ zlXtj#*n_hlxMykQT~a=PN)N^|iwFTv*+U*T*ZUYy75&X5y5EDBI%&%5e9-oBE0 zPt|i1{GOWKxA{FQ(xvM?{SMbL=OoVx&|o8Yz-yWokan~{pAVTRM4iBnw6m*V3E7dM zcK8|FYN3!%{|59&Ar~d;h#kR#9V*$Ok{ug7zOJ!s;N$!ddU~Kogh-(es`w`QIPMjY zBlv>|FLub!VbC%~wAYmSc#Yzm$_%ky?l4h&7i!|QIRbYJI9tF2qMhc8ifq4jD<3Dk z$?3!Y$hRrA#Kh(L>~Wen&JTE*EDR>!Q>ick<1r}e1f;L`i*r-y8-9X_cDXL(y1re= zo|@p}HAz1paA~*fj}8KaFTZ;7dqHG?I)iVyrs3vr~_30n`&FY?C#7QivwHST#0>XtlpSv{;X9 z71-8Ts(MSR9bf6%TUa$=ZINUft8UpDgFX}L3A1H;G?8qN$BGaQZLlFi0;1N{p|k4t z7`}N_>(Orfw*o<1yd|PXSaq~bYfVHtqgq=FWF=-wXpuxBveT51^&d5Z4ca4}?ak;q z4u$xu=DnC2wXdsb!rkv@`S{{iwdm`DL>cg z14iFxIbdEB6#nJDDhaiySmjqbeY|OQPNckS84;b>NAe<5lmhul(?d$##&?vV^d6}FVes98Q`#^2B;1B}$~6*~`KCt*$i2>Pzck=URLE2*FZ0_0Auscp?B72Aj7?tV z%Tq!?=2t>#53$QX4;uMI=6AWj)KE~M$bG}a#9ar802=sN5rJ+wrrIrSZ%D=`#|QL*G*VeehE3NqM5r4uR66N31iB?mfm=!6%&_zuw(jV`QKxldXf zU9d#%f5r5Y!gFykeFF9=pOwVxE<~%`hpde*?6h)!DW%=5+c z$xP<&V)_&&^KvnLDr*?yInafSBJ*f5zrtjGET&^Mio8`!FK05J71O5`-cyR{)0xaa z#q=4-CrwrouewZBWw$W8Vx4&mT4!XlKF1emMIeoPM zX@91E<$EhoUi$Ixz>O>UzG+e!qtA(Bjq7#LNso*-`F{8w*Q2muvG2;fenHR&Z1ih_ ze!xbjtDg?+WT$QP@%&8Bg$`EE`e*x~airYA>7)Hm9Ak}Z0e9fEQE|JR>lq!N4+?&} z-!^jo(eX*oZ`0s6x>`a-=GtyS-#5{u(=#-cU7T*#t^a+Xd#waf|9eg!9smD4j-DaV z%kY+MUl(t3{?U2k-#H!gKFh~@42gcvjiaA#3|Q|e33m4NIP__7$XNVyIDINRFv;v! z?vHnm!ygp<{lcI8ObnejfKKDJ=ZDRpmm}V;*y1e;x>p))fjaR!E11ugPj(4CGOx<# z!+oHSHLhQB`c&2>#>LOt(9f>~y%4Yqz?75wskv^15jD^R=*3;p~| z4vlYcy5t&x?+E?&c%ZLHq=zm+QIXqtR?>x^`57kKua2Xi4$-`%z*eS1;aL7z06O{E zZci=fUYia=|9Bidk8t|v{q(VM_*=%IGdh~6Zf4C1J*lT~Ku;Gj*RI;Ag+mWF;@;@U z?NUwe)SBsjX_Co1qZX2;wZyfp9q}!Z4y{FxCz4tu)y;4W(bW;vqb=3TmoK>=n#W+$ z=s?6g-q3Jlfzy8TK%^zr*|`%U77TY%+w~$=etO^jWE5t1M)YR7wTis44S%FljG)#4D0#uSYunR$n{nBTmrEAQ9Z+TPEUDj*KV_l1;3(Cdg(==SI hmT^IMuH^zKx^d0#LYtSSc~lfGNf+I79?`s%{SVivGot_i literal 0 HcmV?d00001