From dcd7a808e00a4e6ac1a7f9ea3dfca575969bd318 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sat, 17 Apr 2021 09:02:46 -0500 Subject: [PATCH] added 'close' semantics to iterators --- bin/onyx | Bin 358480 -> 358512 bytes core/list.onyx | 1 - include/onyxwasm.h | 18 ++++++++++-- src/onyxwasm.c | 70 ++++++++++++++++++++++++++++++++++++++------- 4 files changed, 76 insertions(+), 13 deletions(-) diff --git a/bin/onyx b/bin/onyx index 58a3ef31605799b64bc4f284df68e8388f04c70c..017ab498207acb1864d030761249f541d72d47d4 100755 GIT binary patch delta 45966 zcmce<2UHZ-7eBr`Z$+>zC@3oGsvE@)RiL~KdWM58f@SfaC5>_nEG|L4xkQYOj&_dn-%&fjy^JM+2sy?5Vz_ubcK zhTQys{QQ87V144!Cf6!Nf5~+8FZ#>nRrM_^=&s3kI^DHhz4blyKD#R__q&&`5q|P- z_sfj67e0IR{=o;^c-GhD8a@kKdV1F^Hgk|ZVtK*PewET^FrCGA&0>4FKX})GVG|6( z8z1gEG;#_PA{XpxF~(-_nZ6tnj>^)q)FW@rKk}A7>&RQeqA=lT81K75XoJhFk2VNr zn2_Bz>-A3rX5@2s39SX6$9&H&Ayn}Co#!4FYI6Nr3zX!hfR%Vf8tQV!zMGlD^962a*V2sT*$YQ%_ zaReOL$H(muUNhf(S|nLg?|WMuT>|&$k^4!DJ=$AJG)akpQlf8Ywy4kHU+)ltg&{@! z*BwH0;oW__+)m+B!EEPW?G&==o;|A99asZ9S{&^v?nD-jF21|;IiPzAhwF6v$p0*>Ee`*=_V*0wFN|sP#_DwT?t$Sajq_&mVGo7Z^eegbp%751o60z9 zoY$6T0ug$RRPFRo*jzQo#JyAyPO$TuJ!HV?R@bUy#o8wY z_Dz3~RL|p`Sr%MTb5> z$w}Q}6W%Vk7oI_8GelS%QO87koFO*+?zAR$UyI%1-C4;t${yh>?mMH?sW~FER8eoE zEUhP~*v{7_iJB+aVnfr*EqZz=UoxEqc!%uwMS-H7_kSjI@LT&tg0sSRtq}cF^#6u` z{0x1t>KfkviBO&ASy)B>;F;i~Z^>Ui6N0PkdQS4_StK3LTRcbaowK?`xK1Q8kFv#k zJ3oFbNilY7V2u3((*e22#A$p?R~C@9>$&iqUO$;neF^8)J>~qR&_W1Y#Y0^}eXnUq z@BETKcqz0Lj;>U&3531DqY8k%qhg=y^g3rDUrSgu1q$NVj{)W1b{4ZIwb?+czuP!$E5Nm*>s?UgYaZf) zu3h<1x*JS)4ZOyYz#aarOQ@ya#m~5eX8QU3g$uEDSB6{^k1awoMexBz$abiLc@2rk zK;;uDhkAEcCbJeo2LZS^>T0 zQ`+PFXA-<>SL)J=u*tls04zImnp%eg>ok4`%!`k zcldUfP*Z4glb>(Ps_{__MfaB_s`GOVS#5rpF>n1(Jcl9a9h*}Ab4r@b>l%P%C>Wn& zK!xh_X$IEC`?pA_;pnoJA26_5{$bPH7@|&?$eTl`BL_Oa;Uc9yxj@Np6XiFAcPj^M zih}Wsa;%)7`-}5(&?rz9>_LL)RU~+HzLHoZ486(=*gGm_BTJ%J5mrsX{HK%L=9{Gr zbe~_>GZS^H@~{s&Re2_Ns`9LX*JBb#ry>ZQilDbCS9B^sLRPv`x}C((sl0*3D;VGC z4O5^~5$2=H?ISsKD#CWADQQObUP;7;&Tq`bOO=A27}efyD|lE+nqV(3~GfelqK zuTE4Tx)x!26}w2-GH$2@?5nwovNI^ZPJB3F0~DG+{$|*Q&r06^t*bivFU%%vV)Kf2pYo+Q|xE@%torY=)9JnGz4+J*okl zq++iT=Hed{=C5K$3Hyvc2B!axoBW~e>)hfGiSZvQIXOt;CErMxQNeh=KiVggzaVU1 zvLbh#SY*nF>BIflq<+PsvT^+jb;peNP^F~mCJ$YOWK%*3B6-hnfpA%GGfw~a1 zn!5oB+o#E8@_vD+QY0S~2yB>wd8JZrclkEL1Qq)qrCrWhO<-G-l&TvE>&)LIY@mwm zCG0Q01DL*u=hcK^7jy4gkl6CRk}91fI`Gki^;0muy%w~{<9i7!cu$f0k>qT=a&2In zRBRn-)|!tatha*2^d-5gKWZj2v5s-(K(SN5B24_=4^w7jF}Ckx>|U~0FFQl>J-ro% z3|X_>wb@R+zB%7fhne-+{8Am1a(RlZP314Cl()}OyOcZ4+ty`aLgEx|0y+ELl}a2Jz(#sSR`Qx=7d#Kuz&}IZH9&=Q>4Nk#Zx2` zOp0iZVVR~#Cba&0B#&rL5TZFj)d)f~r@=dGvQqq6!Vt~t1B+KMzOgHe6}w3orbvVtRBQ<~5T-~Cp$eu*4OwHMYmPDsS2(VW!t)!# zOu_F^zVayCP``!eLtZ%iwo=wNly5)Y%M5ISiX~IN1$+Zxz6!=4nW6h8{+zJ=6P2{# zl(sjIeGS-H6}v;&Q~oJo6;*5t<+qN%B5d~rCGB{U!?4qc)e`)&`MZr+Q~h6jbtCjp zKShK;Y=nTnffqDFvc2P#WLcC9akVk9(F(>h8$-2xzJ)MvRcHz4?RZN`+k~+0 zd|)uJH&yIBVfXk}!kB^utRZz*94+k;gM0JGzL>d%HerqZyMR?T?tc==e=uUzmDYqs z3N^+l(SIwy*8~l7oKJ1a8u))j1r5wDo#`{aqdDdbnD#e?mlg3fO(7m2i+imkaWoYm z;qX{R|DJ@QshRW)loQlV_gcg_~v;;O(!Mtd# zM>7P%^a@r!fzmEJsJQK@EX8fxw8F48i;ro=I_h8Xb*)fxRl2Le^9zNFUfU?mr~D~! z;owM54Uu;&?;QecoQf?Yx#xTnVUM)$hDl9ZV4tfPr))8)AuLY8__u8_c3Ybn!id7?yw*_lxKtA)iu_KU;1LS;od`B2FWV>Qa7oXb^#;hgtRAbgeresVE^OSD; z8%nxq$h@X!UPpdBb_kJcLuh#zoL6b!Z6GeHc-VrAPmENXT-`K zUn)H$uQLMsPjQq;U0y|W!SV`YRTrduOJ>yfT0ki=SP@o5#hMa^(TcFFesZaSV+gZs z(+un4*F3%}n;-=AQz9Bh*se%)^mRqm6iS256{o*2c<0tV() zQ7F7-jG|=(CB=k03R)hsC|Fg(FyW2{Hc7$ChY;r4tT^c@z9$+}-F5tWGzQXBz2syS zYCuGu>JH+OJ)s;*?1{O8`%}ewXErL<%jt>Y#h#R=I7QU*dw2uQX83#j{TS4|eH3lLnfR#~=4*{zFG-=LOSo>I0 ztnH3yuB+_#Uc~;avNTIJiH~Z_U|I{r1&e(^uyc8)N1G`7`@xZiXj{*@f1{GM%aiqJ zIqNj46!w-MiNSTH^73Z#u1ucao7LlS&xI;N{~kQ_9=2px@*TaIxfUN!{xrap+7a8i z&yb}hbr!a#jcM)qqu#8E{sgbtheZo>y7MtftR`k>z17WoXI;In z^sfDwmdd7yGZE65pF{WVl(-4ZOY2N*r2Hnju*fgoRq=I3LsYiB_;WptgwS7t_;7h zuBK)a3d``XYWY>+N1pscuwi^qD-c4aDONys>Ke5bH+soi_GPVUO4FA$ugKTH^ywF- z?G#_*tNXH`&S6kZWZL|K;Y>L~18S^(NI|~35uJq2CThFTL7L$|@duvYmj(36s-vk* zFC-Q>Y0-(OqiENng(%(v&xmnYE#gQX_d09tb&^!-M49_{dBb9lppzi%#C=+uyh}Y0 z8r2N0g}t~iWm6qHbIyd-k`!mLM|$7;N$h4QlEl0G=hxZ02uYFsm_w-2mFM(9)RU3 z07vCyzA28?ZV*xv$4q^i{6m{K6l1Zy6m=8$pK+{KleQDcjE`u&8Y1$MvQ3S9^Tl(M z(T`7;98$P={r+r)(6}=XeS@_(O!OA-^T+*JS6XJh!8!`>b>i0tvT&h8C*FTB>rkG8 zf%tbvy6G$&lxYY4<^Wbnn6BPzq?^!=O0pN>axz|TAiy2UP5DWb$NS-OiRDmYSU3r{ zHzazCSlbUosmH?PWM0(w#WX%_5bG*Lhf#tMetHnAtoM@T^k;e8U>4>jE9Ic;F8Y2l zRK7B$^y|QXfS&rFd4(ZtEbVR&VM~O(c06x5GHN-L`3Rr2l|K zPaVYq^zHflQS7ZAxs}TFy&OCqOM$^o3&`i?}0AntwtliWF9@5g~ayK%Jjh& zpctw}lh0ECuk2GDr>>2?sXMf5QeHlF9p!`WFy^UC5?%Z#GOlsEqDI3{5d6hl{$Mn# zVT}(!2EWoc=V*7zOU|G^@)32E!CGy~?RSteU5oZX>=mbI(Jag;#bH`>14Wh|#b{;u z96Q(fmRpt;3E}~wG-s3>;RnXLJ&S9VzwP?j1K#yoq_i3PCYSEy@ z6g-z};a`sfoy{Z0K*I@I=8&Jj?5{-+V$2XbY0-Ju2M}M=qSbZ*HEL0>b3p(0(bO?$ z0~zF|7H)MCC`JU*FiXoE4Sx|gY0(}SSwy=Qok2F7rbWw>4M%IyS7gH&En4UHXMo#i z;aVqv*74z+#xj3vc`bJU8S$~Vrn1#A@{3os=uR@?_gZu?8Sz^!+M0~GMvDebJ^(mX z3ulp?-sN!#Fyas`a}&9Aq!zuh5@<6m8h8q5fENAx8=z8oO&$AR2I|zJL9?h+{H%qO zE&%;*)i@~lxt6!;ckq^K(JwKf6K87Cnm+)2ON;toeJ}RYqBnj68m>j_EW(^eY^a52 z{Q|UddA?&DTKT1yrmm@ffO}nwhEiuft3?yZx%Oz${@a0W)S`>YhBhr4^b1xj;`>@S zk!(1U$G-(5_R=!_$%vs^R8O6`wica=-Egs-79Fz(=%aF)num}PuV~Srw$z!AYvC`* zh+lKx@z9WKndeEvxmtAE3ZRp;=x&M%gS6<%uYq>cqCIgMA~w;YL4lh9SJT2{X+$gH z*`(neO!i7Wmz3+QaS6=xS~U7&pa-?+p0hwd)1sg41iD0vwjr~8s71YMP&i27Z%$yX z+BK|#5v_?bB=(SKVC#~p$A~ub9!9k4+N3V*=ZZQ5KRkg2)wsbl)u>60evUt$zygNt z)iR$f0W(vJ22*n`)S?%t-zRC&a>syT#yb(izlBem$lj`PL(r&D4J#v30W!n(YMFaz zsLIr$eJGGF)S`@HeUcWfpsMgTTG66qMo@@otwozH0~(}7kIoazYDNr9tBxZhVIYv{m1pGkP^734;&MUd+3g-kJF-=6i?BH$le;JWqw5N*+7eq zqLHwY7F~A{=nI#oPCnEyd0O;C3V&y`XwcgfbarcDCykmLc)cmG*#a#ym1bG*Y0=R% z5{}?wkYrd-Epw?I%n&V_`yJ3)T670RI)fHnM>c!Ne0a0M+|j$-YzzcqFGm0ImjevLFbrDaZ~u(wl-7Shaq9k2f$G@7SnwxGV3s6{7J z-+NPw_NBfTr9~H#jau?0$i79OmN}jJo}fkFpuTsXpC^qj6=-T$L{o!oE&48Xwy(74 zNa|}VwCF6d(H!3GeP}dM%lw9H^oADwl=@m{KKFe#Q*Yu$?_+ysHjhtY1BHE^`Q9WJ zr=QNtPh*{HeE6b_x|f_TH&X86Z%$(o`Wt-hG}czA9LUd4V?BgZHMq0@r`yfSu``yx9kAo>1`_-}M1DU(WI;AK(n3Z#b`?%tC5R!UjUADd8n&M=Inq zJ~5e%peNFjk;6m&D49*tH{ioR#OcWap86px#15c!1`EZ;%#InXi6B(t`N^z4FPedK z#?id)OcqZPGqL+sud2er)03enz3MC$CCu|vun%XkK|&Qjo;!<$kiN5#)lOf9*LOCn zfhU~an#~SkXR`hr)_#Uk>8rb`s(exwUsp!>P_IItth=) z6(zT9D@wn|pIF&AVP0irlYVLn4B3qDOksodle2v0vL$+beAb$e*cU?NObn)F>~i*H z>5XG?xR&3$EWZ=~C><58?oGwl026Q-bH4IeXz6UeE$W{pU3=zUi%x#muuw)LuuM! zna}#0W}bD?_ST^XI^BUhq{Z%3+iUWSBnt%df*tdjMW4!F&1bbL?Ze)=dj65lO$*Sv z7kStM);;h^Fl}uc%=bqX${@PYIM_-*kXU$y{lca6Ijupa(1Z{5kJ0=_0j*28|~at4p@WRi5G!i%drL(N|K83%4e) z$iar=>B?b?S*NPv5J`%%Ib&_F@N^b(6hGiw7PAKWXZ-YH77UMnvY3snv;cD_`FJSS z=H_$1Vg5X63G0bodvFOGAXMqXeKS}+9R7!7;4z-=e0T;+z)tLu3}&uz+7HGu9>{BB zOdTuHhCAK@c!@~!Dg&DB<&BrJP5OcS^itNNdVD)-E6;I)6Yrx)8RA;rU>O@#%{4%h zsJ11Fe#MtBV=XEj0z=L8IzP9JbjSjTR)ybH#( z7O+?9kr4bZ7}KZYz(&^M4``uL!jno?BG&dqT!S&)VwW}ZMm_hC<$2yTJht`?XBBt~ zPT+k8$}*(uY0m04oc*~Q`aH@u`Y{_0kf{==cMgm6)V`9LXU|}PfltKz=Pp?k2X?TR zN0ghUBN)8CnpLz8f1MhxS0J6EDI#$u@pfCPdODe0uE)Fzs7G8uIx0F7m!;d%m^O+K zw5M|rU8o)>CWMn5{L_h^L)J?}X7mox6qChnok&NI@i@@4;(xr%wW>J^bj-HM@$ncj zeZ^(if`z>)BvMoF>MKc+sn(Ek#`%BN#~X3>ULiP8yndAmH+*E#=OWU>wPRAP!E!gr zMrj^@O=?b0{!zJNbCe|Cpfo(EZ55lBEoS`_@Kdc3ILB{Vk6ug~f;Z1(1=>J?1LY`J z<(^f?J^Hoh{%L@0NqUf$OznsZ6cZbj$>DKqDQ~6dW~xZ-RI{qbDa4>>ic@CuL2Fr? z>ashl9xVQhd711eJR^&RHKqDl>@(oq@4>qx^s%-Z;v9&OW2h>q9fMlCdN65@hK`UG z8}u3_{+E7p-$(YGicdsexwz8(BXBsCX-u1pIf!D<*%QTXO-kzIe1m2u85TPyK~FzH z6fmaw)}eNKufSq^3>RrF;q|n|A7iU8k~);5%ZI=5fKOSlFvXj9`;^tT8q>&KED5~} z5G`iSc@HoC`J!LokrKGcI;GnsO^#X|ZKqothL~7K^XHI2o14GK6kNL32#WOf zjYO9{at%^LrnO|>A7%MUuqVYH-&3CHspTF z0vfl+(BTOro*)wCh}0{AB>8daKw_-~9inXSc{`mnAbI@WVxLdFDc13Mai=;BlW2m& z{y>sJLspjalw+Pn8E{a=2wQK&GdYan?pWvr3Z=~6zaYlmFOZtuk`v);MGiWnpUxI% zu-GgJ4%7ulLlw_MJBX5`0$d?1^fY=ma9RD<5yKy%hfuRA)1K(iTjE|nN-`Rc9$dZ`MfmLUG;1{T`jSn3UzCH#C+1I!!XT;27yS3`%C zHnMt^6?@2WZa{7Mb;^LdV%9@XPokPox69!DuOMjtxRC|at=$W?NVQHxXUI1wu2S5r zy#nPts^1lRAP@ADiE`6W4yYSN_O_J@A1GZ}M#g8dFu!c@#GR$#>j#C#^(?lb-Z{D| z#7qK{ET`nAC@uGFYeleOPiHfj8oe(euE28ih5-@L5`Ns6isy>Zu4KlS@_z1-M~A=u z(-K}_OvAGn#hgoMUV4Q^vArCCEsp+yqPuRX>QTtp7o}Q`GHAAQS3{)9! zBWwIKG{Dc~(D27yK6eeP-8$bRY($}$D3wfgY(ivewi29Zg2C@9waw?ok68=mOmB0kE2dN?2p8_g{6WkSy_z4qgCs% zx<$caZLN6a7Z5Lg#!D1G0 z-T1sIl7*3mAGyJ5S!+?tVAX@x_bkuMwb6L?z7yf0v9_PYm31k!A%S!2BUxjNQU%WD z7(I(kTqgORhD!2#M~eB=CQ=dc_Q8Sno{03Z=0tl}8faSvU<8PA7|KW5F2wAoCei7< zbg#h3C^M!tA+$+u>Rm%$pHsHM=xkADll+?b$?7mtB>e9~Oh%^W*QVKs#WBL1D0gXk zPO)BQDTQ5{T`u}x+~nG-R7%ga}5=mmup zYfJQocbVve0LfHC3Ro7)KDwmpS{lL~2@4jll&2ukEBLSg4h`NZMD2K1bjl%m@NBmN zV6MWe4C_?R4;2ODvh&_&DxUpH|y<==gb95%kA|bskT(hrj%uw`P3Jx*0 z$UsX1q$6`8eIpeBjU;z`K&D;<a260NwWM_hw3>it@cjEJTwFL#s2{xs%Q$1_2{iL{GU($-eFtrNXH zQwqg+;yhW1nihK=SUj&nH>ZKi(OXZ$i;ZR^u^7DdxvI6HmslSw2?VsmFuUB~cqPAA zu-udr4p37fToDJ~6p$Z3qIUaV|CPkSbGebW6XIjsgkG>6jk4vvd>o~}-sF7xg(ze6 zb=*hWuBYZ1(bk=lFipIkACr0%Q;SnkP4Wnnt18!YaW%Q7wdHEjHqO^K)#}FDF%iL# zcT4v1RuC}yndl1wIXd)SojATk5a~$JPSd#=ViX!Mf}cMl)C*FQpb2#3KVmIUlHzRZ zE7|7g-XZ?)*Z`AFO?-KpvfIq#uCRdm#YLM*?lY`ZQ2&xzbgf#_Udf(JWW5`r07YqX zy_^V|&FaMV9vQike98b8Tvyg4P^lcH5FcGvwSl=K_^h3*Wi`mCRr$)ploL}YH~Jy* zB+7kq8QusFk5rd4ZtCGHj)=-$^|<%ZJeucVUJP&Pj2y`tA*FPhQc(%CiE`up>MK{9 zd{X=#n{~47$U97E3d~^e;R#E^QHzqP;_6DgvDlKmjpSSdzSsTVePJX=Wgxfcvd#lf&oS< zL*6e6L<9Wmei51tLy4j%4P5Dg$Xs+D)HYR=PH8NfJl*?))){>|LekETry4;A% z)NG8}1I_V~7&V-|o|hW=Y3^a~^6YDRq*I*;Iojo=U;sD_qhaQT@eM&~qB!+iw`7Ir z8C5hJT*Oiuyu`uaf%UD*lH1PFZZoku$*e=>)eslIDI&RP6Xh|W^PD8}0U9Uiqdfg# zoX)e1=`BFzWtmcZc`DvvSY@wkj|+74X)e*EV_ZKhTiD_P^=ECDo8-p&n;9_1FwIo z+7CI9s?9)URh1OQs>TJ9k`A0kKtpCRK*=WOEk0+dcT7}9u!a@sJ3-X~#+fI|9hDa0 zA752^8{UV#CN$=GZ!)hcv>+2l|AXOO2@g1%i(yP;T35k7gHF8l8|8sw_?X2kFv=Iv zN*!+NQ_W~tYejYP!kxOWRFCed71Vnp?&U1x81}Od_2a;bH^jH(tOp|Nh%Zo_2`R+a ziZNN`#8XVx?Cup$O%PK;s=Q93+ln#MZhYngiy%Xb2yZGEYpSr4a3a$BQYjy6sTA;K zJ;HrtgVk2%PpZwHi0$NDm01=yeZ{&2V9tAkB87PKvZ_R^eHO2OUkK)Tcxb&+vbXrD zhocx8TC0YhSj-^3R~={Ne45G-88q}P3o*{XiuHzg58L*Nm9G~H0sMol%)hoA&t!Ey z@$7S13cAVhEL7o@#IuQ>c-B{zTVy5yIiA4}sk5xw#+sCyD4u!g<}J6e+F_rT^SE2W zg&2qbQuXstI&2=PpND#mX2nv>(+6zb1H})JdhRw>BP`+HQ|~|$HT9N~)YJ_qb+DS+ z+VI~~k1a_(L`{vz8jqw-*8_?%5jyeduCf8ox$_R~+M#P$5}w#DSkN^bLD*9BkFgxR z$*`SvQQl6gQoQuQj26MzqQ9)}7^mJtFSlT)EyCCCE3QPjvEetTU3RX$E3a*G$ftDT zY;Cck%#P6EXan0*lCh#%fZRV+-xpt?FO=G2y^MR>lC7okoh@kSEw#jNZ%~%_K^Ms* zXdhweUKUpE>M!zk&IKiz!l3P(21Y+$#nshO6I04Cd53f>sv+mht7NgJJ`<6FavPb& zUh|=N8jHh_d_Dy`2tGAsu4kn5$p+VAqucXYteW-nJk|2ccW5lXPbABWGqw03YLSxV z>ToT8%dIl}PFjA*jZ%EPbX8j`aOtYND)KDP+iWkpJnwXbz6sHHqP#T!6Yb;~HcKt@ zsJA%pV%;2i!D+uq&EVOKjubFykt2e5?1D?GP(01@<&~DRn$~3RQnGqyTkNTzlVD>c z%F)(0#(3ai8@lc6i}S}vZ7eoy;^98ZVJ6;v;@Nr{^ts@Q;9?Q#{2LnDlMRj`7=8>6 zLj{Y^ap${O@ncAG3@FBENO3-YE?LXqo^i^VgfUn-Uef9laqq2Vg59^g{9N^3u0f!TB@psZ}f%NAXlvra(|8}J zpnrU$ssHgp7_)bQvln*U#3NenaO~YEtI*A0#bTNjQhM&|?065UY{jWC{g%Ig*a$5o zzF!Qh=p|G{9H~XyIDz)kqVJ=dh@o2aAOan!6CqXyi`0oIqmFe9)v@qvO&zmIoxikb z1MJU;KWR~Ks*%r15z6ov+$#=3+Z@i10q67#B&R_4abo^a z`u0%S+tYLohoDj=jpTLoIZ2#0KVRN$GaewuX|l~=rfJge;HAFOPkSpGX9Mxkw(J<& z4>7h|F__Kwb_D55PBg$yz@cFA-fc|k_xQFS?df)x52LpJNFmc;ei~_<5}j{JNGxy+ z#-iXhre6g{KSM}t_`PWdEVgKbS!hj0m*6in z^!F@PN?(*xdJnx9Z=^4Q2eC~|cEyoB^(#L6} zj2skWD^iR!01u8}kgHYdARa2qr|_^1nT`&=>nQO9(GTMcy+{1pFI2{GY*$~UuO=36 zn~uQ>2j+V-Mm-d_%BSK6Iz>fx_qusBE%W)rvZv$7US914!^PB`%bbo=@!R~BDk?@U zW8;dYY%I1dzsx1i4S3vlcm(5DzTrF8$S02ma{FYnH_trDf&)IE?Ur!hMpeap7CV2~ zgnG#TILYuWopUaJeK>2y>0Lv1=d60yDhDqLZad3AIm|4=*t7ipVLYBy_bd-Nf>-@+ zoZ;V{VjXBsCu}~$Lyxk${L~TV+u+%~($nE<;w`$TDTF+BUlV`1$6p;`!K~>SxtK8a z=(K#%j@~iceVTIZEKEPm3s14GwcU(H@#2Ar{8Aa1>YSz`TUDO?6q9RgY6W6bE0Di? z6i=J&J;hgp){j9fQB)JM z@#)nwcuH+&FA94o&-9F3w4Nt@= zG9$wD7b1k+5*YrYao%sZbbP3{B?rEUj?ho567Dw6JIOnpVD$sP1PiTeDf9RS*0enF z1Ri<9%a12mUHuroAZl;@`-C!4Hz{d(*Q2b#Xv-scQfES>_T>4TVK=`X0+wh;R%OC> zS2c_&QB0hq<@Z2KmGon=&nNum_pDKs-Y zPvUDOpu2b+x{fUD>8w)>^2*V0LtLKC51!U~_#})aic-ZMeu_NYBs9*Jz54PIRk!s= z6t5n2q@?PmBZ^mFKV0n9HTj0Ktb&kv_+Pxbx)3YF5vC_4K7Hq3eEMfT>KqHINn_(b zd^!cL#+RI9wd?)`=S)3@Ib!n~m;qv%_@K?by2T?E&pyXGS(jpP*2J&$@5t4?*J?a$ z?|-_wBd@fp|3t2S=Hvfx_462hWqX!#b*t&lKV1EXLQK1A!KppRU*d3NS;pl<%es80 zfAGt?d~Gd%A*OF~m%vFR{?SaX93U~_Hu^-@xk{gy%sc$ZVkQSsK(xPaqNj1_JBC3& zQ8fmjW6Ec%j{W2%1Mp0YeA^Nuj65?{@7=#s>H%R01!az8r(;fLNu3!1-^DPL^tQ5v zz*DZWn&s|_?GC#5<78}Q{&<6V@y0)~s^&e=v-FWJrKhA6eleV4?Ad{~pN>=i?+@^) zKe1@5J6~xV9MSm8LsVeNj3NQP6RgfCN@9bmb2LWKvU#WX!+b%kyjs%?7FwmsD`>9a zWMd-^Z$VqjOd-Z+JT=yR6*)M@=2kx4{fs`{J>Vc609kBT@Q_~|yt>qkBF$_8fJuez z&Qr@)i>)oH(IwDMk7cy0Nd)_a-UmXEJV!Y>H7S>L4kfiEmA9>;#%lN1LcMOk0bD%K zaUIwAs2}35xM2;QpFE1S;j7v)w!g$tAM>NRtdY=YKX>M`pb_5t;mS0b#3w88iFDe1 z%*9>gK7L(GSwuPiGNn%r`hyY z-G16jfIx~Wu$=_9Dgxsu14XxX@hX2G@$JNS;NWY2ijuk`aqR(}K*Twx6sECuf%hExbIE8K9KMWo8zp%++O<@)&Lz~PVP4L93E#SQ{eD~-eI=B4fCN{ZEsi{F!AB%mCNnCW1cfW{7 zrCak!Ai{^cx%Cojz_TvmqfVQ0_#YS9P~q1*yu&3{NB)!ensdi=GBNjamWcI~3mnEvd;7$mIav`YWpwIARe!VLiHrKQ|^k$Cx^kSGbIq7GBvY(snju1+!4> zD`%6mG{#Qp)e;@);W9nSF-@gYEORG=$cmq55rx94m!b4GyzOqca*NNZ|Oe|W& zYyQUS)_ixGDnn1L1xB7Ucu^i=qmOyqZ!Az)w4cB88*5VcC_0|}Jf7#VWqPjajO_Db zyKni9-&nh5KW-?JoL4YODW2hw*YvfIH^D$+cDx%s`A($md-1h+?sJv3Z(KP=wrv%V zD0(CXU+p-U3{_yPoBv=Gu9q$a_*8Ra`@!aLJFbiWf(%`t)~WMCRFm%FS1pZE#%Gr zU`-lMK!R9%C3BfXA?SVMGsYV)8O&nOg*@*T^Y8Q>6cU?hv&R$)Uy#tEeXzkq(+6}D zUvWq}&-sJ3F)c&=%eHqpc`c>1_=&B&)}L(1>oZ|x#~cZVsWSqbCVa)OUSlD(2GDsuo|gN_68_}uj9g575SG!N!?q z8qE{0v-fUTr2$vxJAq90eD0z%wA1mT}s^qg%B$lGOi5e0U2bZX`U&=V3STO2-zQ z;wU=VW&a2f+pdCM-H@$Xt0)`#N2@fK6lFJ<)&6!oA6v4h37*)o4iyEYz&XoMWddS9 zNRttCU~jR>c648C0+1B#BjC)-Qf$3*D^X6+*K!M|5HIzp-VvpjY`qO~hj6Cw$2hLC zzQSTi)?s{V867ZZ_oyiL0jo^k4lEN8#AY%doz4?5CLofC0oqi0>gUo&W%8wrSzSC`R`8P33Qa}!4m`|Jx$PpjWnVgJb+kJ)n@E=}bKsWG-d1+zXelwk zVk^X6DV9G{QaQ0VoY3MpcnV62?yux)k*=S}*E22RmAwSc3>I^1$yW#EUV8$e7|F=y z!<|`Q^AG;Qdj`v<(P*{JoC1_q8F;EHVBR#I{THj*VR@!YS>i#nFQFxkF;g~`U`thO zI57FqEE1^lDfhk2@b_;rdE?uxf!_cqYafUQsqied?WAbf#NWKl+K*oJ36z1G(6lol zOe})eKq_99`UWKv7q|GUF^>YA)bVeD^Oq z3H!6j1@x?GZ6!xfZO(1v%kHoq!8!1cQtBroJ@o-PfsmgEwjGPL{V0yv$cyf3V=8je9$gmOrERF$q@84PS`8l++#-3O4ZZB5UqfL50=29^9bR^#iJkTGy-V zQCA90RM)PVN?ktyh`N#km8t7P(E+b5RjIBUxXHxG?jzBF z#BiD;IxKm_4-_en+XPcx5)P?vF1!$js+p)d`G76qIl0zPSe@G6ldNi(CMfwZhGW?< zi#8~R`5v1?FihS*4RbZ6jA0h7;}`C-_C|kHwb(7oZ{RiV;Zv;hzvsQ~VO-p^p1*yM z)%6Qd)2b?+Tq~Q&`VlnnXmcBrP_Pfvf>n$mHH&S9HN0Z0k04{g+%(L7kVY7Iw}pc5 zTC1!Xwy)*R7Asd_7xnl9-uRE~w;EBvxd1nq5YxcBns6R|pVhIh8Y?$|B>@j*VWuj! zS8~H&Y?5=kLuJCF1M!L+ARMGz1Y+Ea7Zq_UE}$wT%rg61>}}2Bt2t#f*-B|4)B~l{ ze0vhs03@79!m*Ann?~t$!^D%tiRAwJ0TM|`=42Ryi03DEqiUh)sMJs833%BmZp5jP zIwVnjC!fRIZ z?;o;vg!M;x=p$zK>!q@hErqQD&c{Du4JPkityG)p6o@fR?X@)fN?(nEr`Vq2-I*Ta z%XVB#1K_{dF+t6c?3jc7qr(`4uNn zDS0bYI!y^MO3O8zMG3l>O(1?)wrxos!?`RUOY->eSZRg!m6d;+IAZ-(yyyuF^qZetrV+zd@J3HrQ@_}< zaM5x;<|)RF`YNne{GJfbO3$$9OYQ?b-Y=o>G@D764p-{;Ge0KS9d zRDA=Wkh3+O(ul;vtH!Jf&zV>G-G=x{)=%)L#u@w` z<2UjD^5<`%=S)|9rYkkf9`2c1pzleDX z9h&NvhVt-t4fFLl347Pj%$n(TOB>g@rTj14QsEM}WZv$UCa-c!>pyWzw`^`HdY4<` zYjAY&8T7&S(-&LaQqXd@^!Y}&?CU@M*e$ugcS}*9LlCbS z6gb?{%TsR2@U>f7`JG!zUV((i-4fg6mOjpMOCO<%^qYevZ5(zVqjTNT4)E?^t8XXL zY&+?e8sR;JrN6qRetX=~$a5%bE#!W7OHWWnVYbyRZCUJ=mR!b~cpqx_qg(oNgIl`s zi(7hyT0BEx|6AskZeD^FcDkj{PNO!ch4Z{y>IjSUK&>8Po2@Yvc!nDBpWM=*Ot+K) z1qN?}QmD)sSgRuxcnVAEQQ2rzl3#F3tG2-M)+27IH)&rzhSZGsNtKiKm-aH4hsx|1%86n z{y>cjcDp4PD$pAicnC$;!UERKFnd2(z>WeR!=yu@;Ty2PG8FJBEU+FHr~wN+M1~PN z-BKnLSOyF9hox?!9q*%AI4p1rre6;We1-OQ!#6%fMWn4z3hn(qED(VL*TDj>LxG2D z+>#d*?Y0H&Z-E7#E<$_cpp9XHNYwZR95Mqn>jeuO%y3KN@Vm7gHOH?#YJY8&TM9w# zufR#?gLZ-iqLBWFZ_#w{gKcPn<#5O~aOyi~_xi9vA1Klv3OzzIuR{}jjHX-q8QT9L zYPAVX@HyJ*YqVJ(m~k_j-~|+WfHvw4v%QTbcm&0sL!ln9(k&>_6*X@M3oJvkIH5pK zC=-F2#i91!!(stY^6*Od6)F>r3T|G4rp0fkQIdaO5VhjJ4JzPa{Ghq_;2wJX|G@Xi z{TJPj^oM|x&4;1-l-!GKtov@S#g;IPaJO&=|uu$4e z1wAU1@<8)JpMm=37fRlE%_Raf2s9ov1T+IQ3N#mVC}=+DWKh%NLMa6_0(1pvJm?po zDWHcyGePMcn_SRapn0GLl`%z5d|D`l;RSiqvqEVcXb5OBXeQ`(P~G!F=`yG<=zY*c zP&1Abw}VE2W`hm{^?gw&O$1E@oduc)ngP1~B`OFSQUC=&Q$StB2lci3g7G&L08Ipq z2h9at0GbE74%GCjP@*I6M9^PAGePfz=7JjNCA&gc2s8w=EodBQENCWZGN{RgihyQ- zilDhgkgEzs+=Y@g5f|CGSOjX4U^37+&_kf{I+v6Onxc0}2E4BsAz-!%8du&Wtp?2l z{RPzI?UL?;>U><1w?EQ>wgvUA;F97%b3rE)t>}_6K~0rh(jm~qN-nE(85fzAT~eh0 z&?+t|gs9Oa4Ft{bbs<6_A?P+xou5lO1)2g{02*Hvb631O98nDlf#!prBI*x?@dkWe zO_wwjG`<${0nG&625PG9l1y;w#M;=Ju;3yy$R(WsjjQ95d~2ehy4ZOG4KX1hsHr|I z0qWZT3gYeTjD{|07HA%52B^vGk~V{G2i*r6*9Z!rS8NA0fyOsRIYfh9QZ{Hds0bQj zZGr;PJ>r|Xq%hF9W-ciSG!rxf)YKdrgKh`?q7DiKJprm~;gT+chO|OKb#dPb3WIL% z;*u7ChIBU`JmaL5&d1#@1QB5hWg-xnn3eFEugwLT+%quOwbh2_yK5Z!Uwq|7ib7*U<2eg z7;+8J|F>iPu>yc@C~63rIUE*fi2D&J7&H^~9MMszff)slc1hbox5vZjKr_d~H97z z7t}Nj-rN*&Sh1yn=3}LK3p5i;`lx156h0K#90jC79yH&9CTf9nICj1T>bnFMY6&?k z8~1_6uYtu|p()n8B%L(`f}cP`P~T7CM4;P2FN4NyMz07(%|3%^K|?-=g+MbwFM~#G zg+*E;{Whcn&E16>wn6$maMHG*d*MT%5m{&g(7b&v$-f=)Ip~shgJv9aq5ro>2DxZk zqSs);4)D%AWDJ@QnhffD-6bso4FSyrjRV~c8u1ru5C;BT^mEXVN9cy2Df#Gzpt>h6 zDIe4XY6ypgK!ZRtKtn+Bfgr0ChYQnFm>e_(G#NA(bP?!w2__{zK6-o~G!x$#Y2Fb9 z;WIH4LE}JYfu?}22F(WD2AT(&4VsUy16JyUeDEiMLO`=YqdmMbdVnjf$k-LGv3INv1BaNK<4C zn%4}9fciFvB7}pApt+sF?~00a10OWriftbkE_|c$Ig4({sArM105sDA1&H=7lFSjP z!3Zb@nmGyV4_PQ9|gLs zNZJjW0eTA58o#1Q@{Wdy*A+>NKr=E?Ku?%>Q;{?RGtQ~p&xJqGq5Oe-%k#eWAc@ym17YAr?t1 zK(n2wA*kstng}!#&(DOs4#n?7VNet3(ATN|<6<&^IM5W(4A2#z*`Qy5=7Amp)jcSZ zazR5tZ-K^v7Jw##R_X_NP!nh#Xj{;bhiFpJIM5NG8K8-vzK>8L&=Gdtt`|G!HcJ4HV?< zmJ&hpK~I2Y__!tA05m0N5NJpRER_f1A`=%2KqD$5BhdWHZpn8bYUGQBA80P5+RPC-J@Owbje z`E#)R8HXBTtrz$fpOJ28RI}h(q0|aVby4MgiJ0+2*w@AL{pp6r_$vd~(+xFhMw}~@ zbOP~}e?cIN@Jr@?^9=R$fjo4cp@)72pEl3XNxy*am}jWg<=Krw$zPSHtOx4x-_1g) zekp7supnT5rLbARg1LS^vWNn!O)1u9uo8gnUUy%s@aBKNbQ z65}9(=qCRo)^4yefuVa8W2b=K2R5b@_B${OAA>B)8N@;fe+Yb=!Jj*DuOG@c*`WC> zz;I3ZA2t0516BLF4NafVeHMav^H7k02xp;GSrrTf6(QJ}zq`;-TOZGDAT?J&g0j$A zs`w5^Ey(I&<#f7j{JVv4p%Y-sZ3OlRl|2#c-}wWuYdr(IhMKw$*qBr4R)g(w^160I z({iS}q4nwm#W-Q>glT@E7d3s@Eg(}{W6-ja(B=_<9iy=9JcUf#`qYvg&l{=7XJae(Z zTc5$dB+erK$6{zPk?WU$MDf>_7&_G{zyhrUWh}eHR4Aa6RVeTwkD0v$8HeySOAM{_ zDg5*jLqEMQubBao$=}W}v?^!9I!(uq?m|)9GYn?^Eq*b>FaWYmmcm@8_?V^0;69(d z)G)gGh+`#fN-a0Jl1^73@Fzlst zqu`E_IwFsu|S49U{KGI5_(Xry1T=8U48$FmXJ3_(K0hZ?PO)aBxEQmD5O>%q10og1%)jY zFN2r7rGYmzH6bslcmeZT+5@Fubw2e#Wyd_weE+rIwLQl7J`ZkY{nlFVb*=Z^duA}B zZ>@Lq{Z`sXa5Fh7`8IkJxmF-5%b_xaRmM1iIQ4L1zX|L^=_`=fyHoB8b0u$Ep?7Pa z;jH!cWM#A0NoKFjb%T72$$|=2c3{5Vu6-Uf^Y3eBAUYoR z_S!HyldreMD*ibiOKUzwuGISmw2Z{v3)`a{$IoxAu)Wfpm3o=&5gN8i?}hx8&X-fP zYL)(hZ2UTW)vxu)M51Lj^jSJA1>(r$HuO6mR1^PtZ ztN3!B0@j+sfon0Wizs_7+H#Xluhl1^!pLQ#3N|;Ms(pPs@bR$ru&^uc!#PD`ES+_VKc7SjF?dMs=WIp3D51?;^|x(Tsn4hS;|(+L7VhRo zX1j`4eTp3cbrx+yJkKWEc0B=gy0>G1-=rnmF@{Iz#&&&8!wh_&>e)tgyIc>Zt)J;j zq2(%s&3MY?iw{*5V&EoFpCY|okF?FWbu_0?h1+G^_r3`k=F%*P740TuizvMa_2UQe=14@q9dfSUWXZ+(KSl2WPqurwth+S}D_jiGso~XTl*x)7Iv@eH1?k;ro zDqY)!(8hr8=4ieC|D%#X8SeQ3k;GwZy~@Lzou zBi3(ysW+y_4kIsn=()rC(16r8aPP}~L*Z%aJqU*)DmsjfBNq45PdqR`v=ynoyIfkg{ zO;e9ypfNMY^w9xv%j&!zo9)2a6xU@gK2^2<3W~o`@>f_e)%kVzPkC|B=#G>>fVO>w zl!?Q~alJ*CBdh*9kldT~&?tedt@vfxUh;>kaSG@-#pBn3zd@tZ0~)^p`K_+=wtGP4 zGZc%np6p@Bx>EtWhy}8ui7SZ(ii6DBC0RBevI&q`tBGZ)kS(JccCjAl!IMWGP$gs! zwqg@xHzDi)K+6t5hWvE`8D;*O|8|5^)^#8cWLBzTtKRsjg?tlbpV0f-@2;U8C-e~B zT~1&v&8GO1`bc~2I$C{Fe+k=5-APP$90itPqK;5ge-h6WL5%JSgIJYgLic@f~m~NfIvN%s&PGh0?71wz`Qiu5T)5vPGDfcwu z?lM)K#)^NHg3p+N5_v{HjFt4q8T|z#?@*oBPU*+sH}$MO0cXb(XQ7)#jmu$~MbDMv z6%LgAsv2L&!@e0yyDQMzMO0ORwx?2`b68}lSFome7*IIUnj&RxqTF+^-b5AWQ13Xp zaSmbp1OtW6J;&u0@u`s`@^Y*dh#SrSSL2pAJeyx9Om`_G1 zB?{kW{f_OYYbNRA}O8J7jjc@d!_Ui5QE15>xi)zG;wr?#N}uMjUf)7SYLjws%d{i6kW&X z5%_nurDwj?n|F+{m)FyG`D#x=WdQW=UZ;iM>OC=3Mc?YJnh*DdoY`Wq*|+}m_M|J{ zV#$ss+f}_)izgU!Rab$>-@&I)?9}tB-Y#~rtzH!)eK}_NaZc}l|LGmr0566+{NA?@ zbF^8~V2C4VG52O6dgFY%;b@EszKc%P#d=HL#S{4lmXF-Shc)~;2|i36_Un!4#8tih zfH@C27TKS6|hOCB9xS9{E_e6{Gp6itpuVm0)_);!f8PxDMvr zyoaILrY$}Hoj#;-5`K?q>-8Et-NV{7EcUyh|J2AH^+)l&oBE$Y_=WC0WDK`0Dt0-H zLyoZilH{9VKloh3?+?**FWN6U=A&4pry1+IUXt!Srt#^Zh(CCmI5 zAxy3gsI7HV)%c*J%4~+X>q_a2hYF5Ue^5)?uAFGkQUT*>mi0Mh-J0hZWgb;9UM4u^ zg2Engj=y5j5%{R!#Q#w^V2QH6K%u}RZUgi96=tgOBrkT+Q`7DvgWGa1Mbzqc&dT<%g8~ructN`Jo?!4F3_?mT`$vI*Ewl zk|Xk*6H4Aw4slT1#E|Y(utAz`e}rY@wCU`70hop^Qs$%&==%QE|%3`ga_;8NUSU<`_-q zAF3m=%(ZEh3vA>v{;0^_!nT!4S^o>skDDYN6Mq+|hVc!-iK%Km z;U`LN9d|lVJY%Qe>ha3@BbnOal+AdY;H0rXOpc9@C;yot+iJ2Z#9K6vP9paP{t(I)%ao@m)T;yncR#I3ocoroMW+= zrJQmZS6cW-CC(G)zfvjV#+U={N_C#XBh^I+-5UhE zDV}kL;J7PF&fi4j@-AgFUJC55;jkT`mR*nuHEjbGF)kMCm=qW&MMRqY4@@b`&FIBZ87h|X3@>f*%o#HEo(iuN(Sr;hzJ;BdY0pppL^%UimZ?n0~ zrwYc)1*ct5Vw?}mQbe}y$md5b>m{o0hox!PMDBM<#a=CDip$R;cdk&1NlL8!hum-% z=s=?6o+kcN$ydsR22(EMCoL>J?IhOEQYqtfV1KQhHvT0w=90LyRH|XTK&;b#R&5%E zfabEEf_ngeCOBx4suVM1mID;exXiM?sKmcYPrs*Z#`gsKNz;(w&Ei8vjQRgo;Eq*J zQ{s5R9jS_Oh+vNd9g?M4V#vQI@F>ASb5*5$CgqYqF2w2r)ES+7;jUlz0-X?Wpd@N)(vFK}EaftOhV?OUX~&ejP*tN%rBYzyjr;D1YFK}d z=*P$`TD>Ww;NHMjrM4h{Rhtzn|Dt%te0#`^DQW)KsKwv=W*pdBHKzJ~)e5^>NLoKC zV*G^Q!ZOuX>n?a4RWVMsaJIq`($ksb-v@ZH;PSglK2IO%;qgw^99$k!)4jP?`57TL^G0u(^6=fprq+FH$Ju zG{I?as3r0bb@auI`Ys6i_ zg|b*(;;T`hYN2ze>i)|j4-|P;d)21ZBJV`;eNmfJaM~gzx3=9ul+AdYV81TPx>Bqs zQxW4if~{lZbip4{6|k|9vANXulfM)CWe{+F+B8;8t(Bju$OSy&7jaj8LiypFaxMmT z5gz?&+3xYuEGg5x9)_7wac z)c_kSfP>5_*-XKa(BCKensh8x^uMBb#^(iR6)Sm`;9IIOS_d_#mGuU-85Oa02Vm}s zCTr80Z@dA@I9_ncN#)fg&J)Q0QQ&EUbKX@kW^L=QlZ){}!HKf?`ib>YN@vU;z2v%s z<|w&CMtL6Yn`#(03Q~3CpA`Hd6*2xyaHZr&YmV@6 zh4DpT4!WRvx$6e`M*~-jwO@_$Y6XgyT#S8#Wt8Wu1@Mv5(%Mowyv+oi1^=Bw8RrO&t5Wj$f<5GByj^hh zR@L$+1Rthc#^(elHdXk9P4R0~3LJV1m}hKuy+o&XQsYs6MyWf+YfJNtZR5tESPV`&jXuNQZHnusDt`Eu`V2^tga(^xy)C1wQ1c>%c|G3?Nr6i$7BEC zmU{%pDPugE@gD&EmE~N{(!P=qE|QD!KLwY}vzvBqvBulyz_xajI}jHq6|nLU%n0|x zW0QO?-5f&|jNQN-p;;0va)QPK2pgOPz9~2;Q`KP|Ro|gd#>*}1bcH3%wJqdkTq?LQ zOjRleAG~qNEe!lla3!gJ{2)#HlS&!;KBAgdS*4u!mTtDC8sHHjz}zvdUd#*>v+}PS zm{+0y86~y7N7;;*3Qlw>Gb@vAq$0+9Eo%vX zE546V72|TjK^v6USaJRx`40xJ6Q@}UM)B=LE(?3p?fHlafx8R1T|GmF3a_))>y zIwhC0wl<9XhX9Wk?95ZRzgQ=ei}7s1iK~>{+8gi@1jc!SV`N`)i}eO7V7%LM{<@O4 zlu`SVDi~k3u=KmTSpQ76p}_yK@OmZxm*BP(%D6k!c}l8pD|uTr?OG(c8OIBD$~`|e zShKu9xs1~U7s>+#NmF>+xs>q-mi1y~byciARKs|O;H;BMK2UHe1;+xP1LpXSk;G-? z$R8;lc*O6PwH)9=#M*|1VkR`%ubPRxmB_0%C_%Q!yHOF>_NZV#xi^(2YeT6D*obFr z9z~MLe;D*LMPHMEA0+PHA{Vgj6MAl#vBw@2MgGH$U|Te~M;op5sEDvg8a3Ql8qzOJ zdpR>DH6vx(%!HI_DH$p5)RfnglR}~*!o#$g8Saeago)Err_Y!PNkqS5zsHTp#$BSF zPHl4L)U zF*qzbQcIqif>ynvt}mxfpEyOFgiM@1ZDvN=jOl41PHmQZS_XQ9X8t(VcocuO+jJd` z_7q2rGopg*ch=L43?rn8^`r)GiEYU+7UKQX&`hJR|Dpvd4_VjQ#p#*GVEaS-%?&O% jq~gGOaF)@l@uFddDf*mhW*Pk&51FoBcB9Z4M#ujHg$wy^ delta 44845 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 z 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 diff --git a/core/list.onyx b/core/list.onyx index bcfc1664..81c14727 100644 --- a/core/list.onyx +++ b/core/list.onyx @@ -86,7 +86,6 @@ get_iterator :: (list: ^List($T)) -> Iterator(T) { return .{ data = ^list.first, next = #solidify iterator_impl { T = T }, - close = null_proc, }; } diff --git a/include/onyxwasm.h b/include/onyxwasm.h index 872f002e..7598a204 100644 --- a/include/onyxwasm.h +++ b/include/onyxwasm.h @@ -492,9 +492,22 @@ typedef struct WasmDatum { ptr data; } WasmDatum; +typedef enum DeferredStmtType { + Deferred_Stmt_Node, + Deferred_Stmt_Code, +} DeferredStmtType; + typedef struct DeferredStmt { - u64 depth; - AstNode *stmt; + DeferredStmtType type; + u32 depth; + + union { + AstNode *stmt; + struct { + WasmInstruction* instructions; + u32 instruction_count; + }; + }; } DeferredStmt; typedef struct AllocatedSpace { @@ -564,6 +577,7 @@ typedef struct OnyxWasmModule { i32 *stack_top_ptr; u64 stack_base_idx; CallingConvention curr_cc; + i32 null_proc_func_idx; b32 has_stack_locals : 1; } OnyxWasmModule; diff --git a/src/onyxwasm.c b/src/onyxwasm.c index 7e44ac33..582f6aed 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -236,7 +236,9 @@ EMIT_FUNC(while, AstIfWhile* while_node); EMIT_FUNC(for, AstFor* for_node); EMIT_FUNC(switch, AstSwitch* switch_node); EMIT_FUNC(defer, AstDefer* defer); -EMIT_FUNC(deferred_stmts, AstNode* node); +EMIT_FUNC(defer_code, WasmInstruction* deferred_code, u32 code_count); +EMIT_FUNC(deferred_stmt, DeferredStmt deferred_stmt); +EMIT_FUNC_NO_ARGS(deferred_stmts); EMIT_FUNC(binop, AstBinaryOp* binop); EMIT_FUNC(unaryop, AstUnaryOp* unop); EMIT_FUNC(call, AstCall* call); @@ -282,7 +284,7 @@ EMIT_FUNC(block, AstBlock* block, b32 generate_block_headers) { emit_statement(mod, &code, stmt); } - emit_deferred_stmts(mod, &code, (AstNode *) block); + emit_deferred_stmts(mod, &code); emit_free_local_allocations(mod, &code); if (generate_block_headers) @@ -361,7 +363,7 @@ EMIT_FUNC(structured_jump, AstJump* jump) { if (bh_arr_length(mod->deferred_stmts) != 0) { i32 i = bh_arr_length(mod->deferred_stmts) - 1; while (i >= 0 && mod->deferred_stmts[i].depth >= labelidx) { - emit_statement(mod, &code, mod->deferred_stmts[i].stmt); + emit_deferred_stmt(mod, &code, mod->deferred_stmts[i]); i--; } } @@ -941,6 +943,23 @@ EMIT_FUNC(for_iterator, AstFor* for_node, u64 iter_local) { u64 offset = 0; // Enter a deferred statement for the auto-close + emit_enter_structured_block(mod, &code, SBT_Basic_Block); + + TypeWithOffset close_func_type; + type_linear_member_lookup(for_node->iter->type, 2, &close_func_type); + i32 close_type_idx = generate_type_idx(mod, close_func_type.type); + + WasmInstruction* close_instructions = bh_alloc_array(global_heap_allocator, WasmInstruction, 8); + close_instructions[0] = (WasmInstruction) { WI_LOCAL_GET, { .l = iterator_close_func } }; + close_instructions[1] = (WasmInstruction) { WI_I32_CONST, { .l = mod->null_proc_func_idx } }; + close_instructions[2] = (WasmInstruction) { WI_I32_NE, { .l = 0x00 } }; + close_instructions[3] = (WasmInstruction) { WI_IF_START, { .l = 0x40 } }; + close_instructions[4] = (WasmInstruction) { WI_LOCAL_GET, { .l = iterator_data_ptr } }; + close_instructions[5] = (WasmInstruction) { WI_LOCAL_GET, { .l = iterator_close_func } }; + close_instructions[6] = (WasmInstruction) { WI_CALL_INDIRECT, { .l = close_type_idx } }; + close_instructions[7] = (WasmInstruction) { WI_IF_END, { .l = 0x00 } }; + + emit_defer_code(mod, &code, close_instructions, 8); emit_enter_structured_block(mod, &code, SBT_Breakable_Block); emit_enter_structured_block(mod, &code, SBT_Continue_Loop); @@ -997,6 +1016,9 @@ EMIT_FUNC(for_iterator, AstFor* for_node, u64 iter_local) { emit_leave_structured_block(mod, &code); emit_leave_structured_block(mod, &code); + emit_deferred_stmts(mod, &code); + emit_leave_structured_block(mod, &code); + // Flush deferred statements local_raw_free(mod->local_alloc, WASM_TYPE_PTR); @@ -1118,24 +1140,46 @@ EMIT_FUNC(switch, AstSwitch* switch_node) { EMIT_FUNC(defer, AstDefer* defer) { bh_arr_push(mod->deferred_stmts, ((DeferredStmt) { + .type = Deferred_Stmt_Node, .depth = bh_arr_length(mod->structured_jump_target), .stmt = defer->stmt, })); } -EMIT_FUNC(deferred_stmts, AstNode* node) { - if (bh_arr_length(mod->deferred_stmts) == 0) return; +EMIT_FUNC(defer_code, WasmInstruction* deferred_code, u32 code_count) { + bh_arr_push(mod->deferred_stmts, ((DeferredStmt) { + .type = Deferred_Stmt_Code, + .depth = bh_arr_length(mod->structured_jump_target), + .instructions = deferred_code, + .instruction_count = code_count, + })); +} +EMIT_FUNC(deferred_stmt, DeferredStmt deferred_stmt) { bh_arr(WasmInstruction) code = *pcode; + switch (deferred_stmt.type) { + case Deferred_Stmt_Node: emit_statement(mod, &code, deferred_stmt.stmt); break; + case Deferred_Stmt_Code: { + fori (i, 0, deferred_stmt.instruction_count) { + bh_arr_push(code, deferred_stmt.instructions[i]); + } + break; + } + } + + *pcode = code; +} + +EMIT_FUNC_NO_ARGS(deferred_stmts) { + if (bh_arr_length(mod->deferred_stmts) == 0) return; + u64 depth = bh_arr_length(mod->structured_jump_target); while (bh_arr_length(mod->deferred_stmts) > 0 && bh_arr_last(mod->deferred_stmts).depth == depth) { - emit_statement(mod, &code, bh_arr_last(mod->deferred_stmts).stmt); + emit_deferred_stmt(mod, pcode, bh_arr_last(mod->deferred_stmts)); bh_arr_pop(mod->deferred_stmts); } - - *pcode = code; } // NOTE: These need to be in the same order as @@ -2508,12 +2552,12 @@ EMIT_FUNC(return, AstReturn* ret) { } } - emit_deferred_stmts(mod, &code, (AstNode *) ret); + emit_deferred_stmts(mod, &code); if (bh_arr_length(mod->deferred_stmts) != 0) { i32 i = bh_arr_length(mod->deferred_stmts) - 1; while (i >= 0) { - emit_statement(mod, &code, mod->deferred_stmts[i].stmt); + emit_deferred_stmt(mod, &code, mod->deferred_stmts[i]); i--; } } @@ -3126,6 +3170,8 @@ OnyxWasmModule onyx_wasm_module_create(bh_allocator alloc) { .foreign_function_count = 0, .foreign_global_count = 0, + + .null_proc_func_idx = -1, }; bh_arena* eid = bh_alloc(global_heap_allocator, sizeof(bh_arena)); @@ -3204,6 +3250,10 @@ void emit_entity(Entity* ent) { } bh_imap_put(&module->index_map, (u64) ent->function, module->next_func_idx++); + + if (ent->function->flags & Ast_Flag_Proc_Is_Null) { + if (module->null_proc_func_idx == -1) module->null_proc_func_idx = get_element_idx(module, ent->function); + } break; case Entity_Type_Foreign_Global_Header: -- 2.25.1