From 3a96b9cb6f94e6b70e651704cb6a2100e9be470b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C3=BAl=20Ibarra=20Corretg=C3=A9?= Date: Tue, 24 Sep 2024 13:04:45 +0200 Subject: [PATCH] Support private brand checks Fixes: https://github.com/quickjs-ng/quickjs/issues/541 Ref: https://github.com/bellard/quickjs/commit/3ab1c2b3148d1c70181607002aac23ecdd2ad482 --- gen/function_source.c | Bin 3214 -> 3214 bytes gen/hello.c | Bin 1353 -> 1353 bytes gen/hello_module.c | Bin 4027 -> 4027 bytes gen/repl.c | Bin 142597 -> 142597 bytes gen/test_fib.c | Bin 2791 -> 2791 bytes quickjs-opcode.h | 2 + quickjs.c | 224 +++++++++++++++++++++++++++++------------- test262.conf | 2 +- test262_errors.txt | 2 + 9 files changed, 159 insertions(+), 71 deletions(-) diff --git a/gen/function_source.c b/gen/function_source.c index 0ec70f67a74983e3cfe2dbf9ecee79df31b547da..0488f43484ce93c30e5922c44a759f3425f12caf 100644 GIT binary patch delta 132 zcmeB^?30|Zo5|2%(;J4?c6bveoOmu)`qB)36O$3n!#vl?RZe#&srx=1oOu-rw zlR+F5rKTVesL~V+4VI~34QXHrgfxFek{L({CcQa?IgLdM;sS_GNnkAo24L-mldrJv g0Xlv2B#wJbjER#Axxes&U19*%lA5-;h{ux|01>)A0{{R3 delta 226 zcmdljzgvF7Mka%_jhls;>J4-B+s~Ujb5Y1fn1l| z7g4l?LW2UXxFSKFxPrMFjVne`(I9BzZgljji5tFeo$vYms0MuZecnGk-M^|jb@p@W zRQ+l$dadZ9*NPV2l*pu4-?HV(^325Q^f?`!{WLR1T zWV@u3G%Eq}BrUVGHTc%FFf7+;pI-9biGpHV1kTf)mLFN7$F2d0`Zf=O(nhz8*UNz74Yb|f*v)#KC|A}btFa-~y5mL2rFp?i^B`Rou`MXjD_ zOeQQQ)dHw3k2ChCzpLsbcATFYDd5QTHcGNf0C5IB0yq2&!Ujr-l;M#lY!z_TRAqFhXkKTlf1an?^{Nr}l@&Fn#m%iSLruo^!0UcS--x%wp^4xEAZ%}>RaubSB$hTUw@uRu+Gi9$t1x^VKS{;u&S3a zkmk}GYE7ek^oEql+Ko4Ov6Uo!=guZO^2Yxv6xy=&_T3wsO@~|Yxfx;`Z>q-EN58<= zpWjsNw#+vLYZl)0E7L7{7WyPrD!QzgUI1^R-U>eIzC_#UnL0ZJT{g6ej5~Iv zbgLgQ`kZV4P(ca9+l5WJ4twVYUmvumU)?fNcGmWw#w=b`_4RZxSI9Mq}s>8tt$<>JU+E)sp0JoluRPqzZpCZSLof znMyb1X*0&H`WCSVs_d$#nO*GqI|^F`sT>7N6QFy{iZ12^P*woZ6*daatU zuDEOb{@Wqzr&BHBd^<3MTvZlo*s|Z>RqGYRWZfrMnxV>?1kCyPRW(z0oI-i_gZz+5 zqlwl$yy~Dtq0pMm+0x(FRfyRjetXVRgBt4Xo3GU+DRy`Gk4?&5y}}H%KYzK>Jr6Ho za&Gl^W@u5&k}bcV?6a0-D@@X^+aTJ5KJzDF;DmEw5I)H%B9ToE?(nza5H4R+VaLB- zVz0S>NFifF&d)S-S3!qDqSu8B6|I*B4VrGwaVFJYZ3gYGce5GnZvEB_w`bVCcFsM8 zQ-wr^M$Sx2qV{zX82t?&<-}Q#iEz$teVG|t3O6ilk?x)KZuwqjL__SGMHfZS7`Zw` zfOHaFd`{kX+RA&Uz->Oda)ev>v?;Xb-aCpiKpb6uZ}VVbb;M4YGE+a%j=s0fU3NM= zM)iHm_M&=fK@Xe>uiL)3#w~aj zteo(l1MIv%7u(*Ck~Y1x$d*31cQunOsywYbCyZl?-<5NZ)|eVM?<)+y=D|Cle_r)H z%u4T}``a@fI-SXNuFY=UINp{%{F_!a8R@!1T**jyfLy#R7>LwgcG+QTN5P#Aa6fw+ zCiKh=1IoxKRbJSgd;Tpm1iAknFIC#Z9$CVfcJ%A<9Da((ru}@%Bdi0~)H7fr}SX?dX*$d%>2tq7hh ziQ|PI%G{cv?g!@;$#@O1>mRPNlUDY_T>b3I`^p-&W1?q6{!B85sA(?BVCHYFv5OvE zFpR|RjKg;6^ObhiA5-4_7DYkJZTZNgj`|-66oG)iU|O*rVzraG*lOo*Dz_8X4)qiE zi{mr0tRXw6P?#Rg<+(@-seTzde`~q@=(;ld+y6R!FniH$P#ZwEJ^U|2{VLL?A3ME5 z9cx|}JNKzt`^sY<57WjSJVZwWW>Gsy{OK~7;uU{tW&*3uIkE+ho>&T>XC(JJhq4YO z9`V_m7M*9TMxNZXppeblx+kU=lH6vy{>eJ9ti=7}BU4r!0?Q%Ks(=}l+0UL>zMqh` z9rHcRj3n8L3T=rtP53k$`Hmpj{Y0(l@=7qWfg@t;10*#*nFz>>_=N#VdZRG(^gl0~ zC|%f{Z6V#THW|v9+ui6_ObQ98pWuf^Hg0`)0_=gx^j)1SHn0 z9)37IvnA?hn{?8Jr0_e+H3R0f2}6)`$ACIp?Br+a+4$Jx1V9Gq)z79pT;v`1$|nZ#0Az6RFqwI<@2@n@{I-dA7AZqaO`J13as&jW7PhH zWm@|YU#aZl8Yc!^jZlF6#HVtw@a`D)HqaDPR9}%`6T)Vm5ExZG*RY(LOBEG9zo<$D)9 z>B>{+r>#iUq0+8<@u!jOJ>XGx-L?Jg(Jw7Hnd4OOf#z~_lnaTU5gvkVp6Kly1fDbs zX3Et75K=ThAlGgW*^siun`(s@#Uk>^oW&08Zm*Xjw;f!eQxKGPv4dVu+1`yw$$ji) z_m8%hZA_L%<7Ec1njyZEefzaid)mt>uaSw4CVT12wUwf@c_76})@B%e!6s=LW;??X(EN(*|B;z=RRyM*` zI!`vxA%rPNgV3ByhYI-U?^E0SO{u&5-%PTv$5d97;9a5jMYUc(6P>N_LPKoofnwME zHrBVx?=Q8}-cQ<@pA@-ouS8mm-mIZ=>Ri3u>wy|O?zNk}e=P;lB6sDao%hVH-jH2c zp-CnXA^pn1IeFC@AJ@T3vwC2lA``J@(gALDACoG}ic-XO z-QQhysTt~~J!$$DN(;cex1|=Tb@7{34WgZKUyrj8$pFzLlI1cE(ZJ6H=D5p?&0zcB zZKZb3LuK~LH!rEChoOwgy)c${`85Oud%|0%!`A_f5+qKfgYLa6<3^X8F}Cn;zu^u- z2rp07=o18NjeYfRm&Dx_LBMAaAufQAC)==arGLW`XVu?-RvacDUE(F|fp6bm89a{5 z+klX1aeF^yQa1h0QMwc)74W}Ty>qGi`9(08>)uJ)pD(VoGu}O|VrT0uv7b-gU8BXm z$lt~s$&-X|2bqqLMK_Y?Q^jS|S%{!?@kC|)p?FNm+R^Vm)NO7N8ZR|k!E@#42nvi9t%Q=eKnqF)~9wQddKE`j{3pWd1#rRL8|R;<&CDo zEkD;372^>r%W0G)+?ESb(75F-Q)w^%tkA9d!Xz16v$-ojneOTFR$noSPB=&iSmj{2 zhR2!r$&bDH?9P-mD<(_6fDn(xc9eJ|v+j(~F>le5GS~eJM0%;_R@(i0N3xn*ZqM$m zk!r5JuJ>qu`MUQYxBPQcP(eq4$~+)3t?J0x*`E%rr0b+#k?+ldb!(gb^wZQ-`ivMe z3}&566DZ-T*12eKTBu>MyxGlt2N-YtG_|uTxVv_;8R>e@GsS{yDMg!Rr4MEBt&fj% zcb^88zU;Fi;dHsko|I7bNZ3|=Rwu(t@-@SiUT;#nGw5;UzLSL_&7N9T-|7osscvey zs2oTY#TOUbC6h-rW?`cUne`cl$1ciFtw08_L9u0?Ey89}-K8ZqVVC&51J2P%8}!oA zf|K8KgcRBX)e3j!7$uR84E(%V*wPQ>2|oawI_&crH>xgC&=0yODwebJKd;fv&lWrX z-jqA06Sa`%J|Bjf*!-=d))aklRbnq;2zf-L)zpM~HL|c)u4_0QW?%bfS{50@gdJ3C z5G0JHQ8wDTf2FyZNEy;ylIl?P@)u)-C!ag%s`WLQN2`FM1Zy9}$C&*d^bNI7nF3 zNu=m?cij4EpcV(6bbt(wyl#U%5fS@RlI0%ObPa5*HNkDXFZ12}~ zy7(*I#Sc&;lR$tha@sew-0DiV`f{$lvcUdl~6$rPNd z3)(0t^6=Z_2aPezCBpdFBuIB~tw*ogNrsBfpaFpRJaQ9u=C_A-lg%PNCObMxm4&R> zVg67jG?37al&O(HVovoT0iZaZfHph)yOOcOSJZyC?=85s(F{84?V;Zxy4X{{t1VQq z+a=#M59f+ONX1lv{F)}(!=4yDIISCiGNw^_H=)eFk*g(CZ>Man9ViOM#*RgE6P0e+ zZKlAU|7hi!8@E1@h*K&cNa?9N=1w9PH3Zr%N&q2wL}=7ujL#3fp5WM<3FgdPL}Drj z;Q={@Er)F!(&d?S4W!Y14ma585y*SGO2G3|u;j{FV^Mpsfq-Ho@&f|kNcsc=b`>iR zhk1J&;6Z6Gw>n``6t3p}6s7teYNybb>vSLczPfZ4?NK`r&E(=heO|Qm%omXHEk}OzVOtX8jz_4=HN?8fpRCOpS z6##{}y)K@UX?62n!v^0GNi)h_J_Bb5Gy#zQp>pQh+}tBgrPPq3Kfi6MqWn0&7orvXCZ5A{%8f7Kr z3l&fkF2S!}K4WY5IH`uQfm*X|x^u8{K%Z?cIOU0?(~?=!jAAWrML$#Pj$391x_|!J z3`%r%xWD%UPg`8(8Klas{Y|mybO-b|^H^|iZ*cREH|1_ie>hJ2&LB6T9P8|o0p=RF zzB-XSJY4&7l23*HvZ?W%7!1LrC4r-QACyzV5;I%r0*84badJ%gkOS!g*w89&lIMwG1-T!NPfi zOqFSO%LbW|*v)@<5HM_${clu*+{c5UtnEk+%I&C63S942Q{d9Om>KAD-Y({+?wM(( z$nE~58Gzk~N2i$~i}y3ho?Xh#o(8aHR+t)-k@G(-GB+7Rl9lgTv=Y(tOdNGdeY9&o z2W!u}zl2Pef1T9CnC_jN5tdP#ls|L~&2&_u?nds`vsGG~Mb1FSGlVe0SXnRgFy0cW zQkpl|?ni(+%LPh_xwag{+-YLbUyKLP-SHIYW z2+OfnUcYo`C5=_4%5QZa4>8esNU?ieH%DX$i$up`I%2w6!BaAXEg(bK!s!I1P$IEF zJcx*07y!z4WLR{(sejMIDf6n)REa|4oZ-rb0CrRhh}UC8Ea)V{x#-_?^ICjaD@|E_ z2$A%*KRoi3f%oHCGU&*pVP@!9;deNNa)$aBN!Xn_%%mp@xlDz%7lXTSI_gUOY!UNz zn}?Y~?!m{yJYjkOL6C~Z-7;{vF{on~k1)-93f%h8)rBbT$S|Cz^!$REx!E`2@Yb>s zCV6-y&;J`M$zm;ga)5e8L4ld1o+`l^KDeKTXzPd_gxBh5L{l{_6NFUzI^EQfCJo={ zF^R%}`_)J@QZtlJw_>E(*EYOV>x!z(rg6fUkm9^^Nm#RzSl3>I!_apx>+ALyg>@$O z&f63d!Ht+;gHKo<2)a#lJRfP-J<8ObC@xg}gTO!q%a7K@R@h9>B}o&-NyCb_hCGf9 z>?Bbrn{&x(gxj|+!CL+J-hmC!2$77m<|E_B@(>T15FJ)?^8lebzybvf4?`Eb(g4NY zI0lsHc7hlXj538 zPYF=UO79kGRA*DqwKZl+((A;YQPqp;E#8>RjIfTQm5!*7NG9vvxW|mNy^k09twlGz z&YT6D9;q|4irJ68GV7`*m|C7)=DFN-#$CPwnd?s{m|;Mn!kuyp;@7eXrm~R!y+L*d z-OCfq>DWOvz2&aA4k^S*6R|xCl-+`fX04Cz*y46)Bu%o2Tx`qQ75AldCn71Y0j$~G zoLx?Pp^p>BbTqlidm!h?xa0RQH=69?NysqtphSQ7%Sp)9?>NB}4HUr%N2DN*RBE{? z@7XZP{Hu`kw220HHn`VXOpBi4b-T5iYAN$p;~=eP{SNlZaFxrtQ(Mgx-*rG%JBhC( zHS|4DC69$hbWs^vQm7tO0UExp%fo<>69lkqIO#{=`lL3X=T8~ibZ>Gt=Z(@vnj+&Q zWk`YSY+hlGG{h5o)enLm2>e5vnOqUokkv2wUVblqh^yMu6qac8QwM~D!Zm$Rd2yrP zMrr@FJxwch0w-G@?MV$IYdFbvQ@ydLnXJInIb>ylG<>@;!cO5c@H_TLW-{cq_(x_| zy%3+L=sOc%-tdu=%|1|^q1ByaF^!zYC;ZFEXEy8HWLdFgHY5Bj?{5m-)2YNjd(E8# z6TqTsihwC{Kbv9(jrsvl_0)~5TQbGWLiYRd6w}-<;x^BA+Wo#6B`LR0oIm=r&kS*< z)X#9uUZzGps+K%NavHiQ>TP*}N)bmnKiLZk>V2|1V>UK9GVY+Mri$jR?jh^Wo@#!9 zmJg?z<7C0TKlP1EDjw3H2y`}~4XoucMwjnrChtOG$pmTWbXV+Sc9n96 zE85@e>V0+*=}0%a*&kw6eArg3+N$@3Q=hZH>5ua{AP9o;IQ$Tb+*Q|9Bjc9tZ_?aT z!J!8~4x&Hg0O0${Nv1#i0G?!63Wfv*93adoa7P?q4)=_xRvi`RPMGwBSb_*6+^4r- z**9l~=^N=F0JgEZs{J!Ac_5Zi1)I&FVk$Vxpbc*HPe5YVfo4~@mP-#rZl{Guv0xNn zp29P-P2bm2woN-0b5>6`gUGv<>41=NCr&q$Js^zPQaJ69v;4CSa6)y0Gxd?2gHeeis_`yVltydiNz7kpotZ$yQF1K0wgbP*`*Hb#|NWL=kFu_wSCE1DV zzV9A{xJOE<8tu}aYj-UNn~~Vo6qLmPS*#+;)O{`~xqYRn0(rnixlSVJ)A#X7I2dI4 z8Aw-H!IR=vw-%_w5vowcGd^1CVMt`wVx&w;S*u%)NEU+=4<2(FgEPuZv2U6d`0o0g zg%cxQAFF=?eZ1>BldPa1NDue#kfkl3X(oq7TrO>4&|l7^L&K3JH|`KqmAAJQh?Esp zg(qgC>n)n{&I+!;ti%-Rb9*?k1dQ-Es_LuMXnk! zLr)#D3)1nZgxiG7TtcPn5bfjXY+277yKRxU4edOqDRe3f8b>HkZUCxr2odyW(9O>d z)o5?m-B{>m9tIE5y@grH5i}#AO+!*RO&(L}<^(jWR-poBqG5Ph_ee9ioBNJ@)kO7} zSrj#x%wau24}K75PQv^<61Z?v;A_`Vb)}Q4uFN1OCEVYxg3on_Lk$;}CJGtfB6hjQ z4u|XYI|BobK+^2JSdqG(de?e{sp3u(T@1H`war@FJ8wY{tW4l9=G zjvFJIP~*lK1g}6vd>b_5et(o1uPY-$Cw7^7Y@XNnTr25@9&PG<%6+t{Lr=iT?>N!U ze`2Uxcp_fK8FgRMt@gdQ#rynZv%pO_#{9;+uhMv1$j;+0YL#7Yv;~{Rh_ju|N~pm0WtFnLLW|Rz8^_Xx!30Ub}EnY8)GwM(EBLBN6-R zVz|p6%5Wv`L`%6Ycg}3T?TPZs-LuU@JZVK{0f=x;@MUlaPdLTZ)R?>Z14M@5k>+SQ z?v;i7(kz?U$_(zqlT7ir?Q$OUhr9K-P)VY}ZtjT0h_XCGLkG8hZ!@|tL=nHg<0f2a z2KHP#$CQ@on~r&VvvX1G^yj~d$Y6N5t^U!vzKJBPc>KR1@$p3(ck;iPv858zNWFij zZ1F5JLI#)dG=&}{M77gpW|`q`ZQn#8&;Ga7yTg6~k(ZrmMq!IBeWt0?qH@-?pUL7= zQm@F!;7pplp6@Q3kVqEM7=YJb&oniOY}#R!zfU}P#xLS(OLWA{A8FIKrSyme6{y9f zfp0(T;(AuWd-ndqj4xthg3`q3v!nzw`z&m&@|AdZ`&mZci7$7X&w>*cP86PP#?=ShS)cuakI^a605reu}(KLStSh$=H0K zpTP@ip@2CRLXNoZS3YQ|0R?eScVEx$Gjh;rIfLh1#z^ z$4ovs^!xde_M8c~!{Z$=5vkCoK2LH)_01wujnIOyUWfoI-2GIl<+%bgufv;W>(=&_)4M#Y z-0rrX7a%XXq}4xn>iIZxAD!`ar<`wUvF+n~Xo|*qlUM+)oJ*`Ya-e6lA{Pqsa{6$v zXf-JQ2d3c5aV=8z9~-_77ADnUaKN}(zcRIjB4<>SQTH#>7iY6>*{{rPVJ0z@$5?Wyncb1X7tTO(R+@LmqEg3CC5*Ph3kRy)a!T0 zvhxjsE|&K)Lc$N%3v393TsVaeU|AsA1M(AvoZ4=%pTTD(-QMH+zKvoYp*_(&^rd4} zUM4Mcg5)g+6IV%+)Bu&g0og>Ehjkb{kTtlyHsk!v_nUBV{ML^L?&RQktGjQ$sVfy- zp&Nxo^mo%7wkisKZ5ABOM4kpMG^knA+?kVcvs*P(aE-By+0Gd4f%`{I?w|#*{k<-Q zd`ter9AXX*cL}|zp%*i&FqLV}t5JKt;&7(#$)s7;3a@u=M(ybG&yvIFG~-tm&{eT) zb{}4--e7ljqAJ9?>JbRjRy_=ob8nXU8lHc<1nKj(Dh_SclFEjY)VsjOf;vMsPMizL6WtU*DrQVtc zD$9Wn-9n7?wmZV?`WFj(ru@eIE5Su8^-5Pfv{bTyCP!~aQQ_4BK+bizQ-5n}c_s*# z1K<&pITf+!H137*G*e7@I}#!+&FUj%_B|;$Efk3?Lk*15dC@vSV>r0%rwIL{`pp(M z;ZhS_RKcl2=j1m3J2b&vYRVh*=!yVT-y=AY6dg*YsQYS`GaSQrI?$t&&iM_I6pm@& z2LZ%@eS1`75w?kEVW-X(ck}{N#pQ79F+B`AA^Ftjp?uVSnSBc#>hQ%y#r0+phT`O2 zU0{AGv1i-KdpCa>JdZE+%x0-as|KvJXd$1NP~!Y9tO@H}O?0J9dc(>CnShl+-6GRG zmQh|*fvnc8*l>i3tXTT;N;Vu9KId|CQ#YL>xkuvvHYKVYSl#3hedcg{;v$ zYsNDsI=9x;nWuHS8CRH*V?}^IyMf@f8{385kzaHRt}s=6JB|4^y+T-Ujh~243Yj6v zF$$Q6t~VB+DZ7Y-zAeFb6nk(crCTVwOwg`A{#eHYrT$KmYx)PUNB%mRfGl{ z13GsQi)u`>``}8`%w0jPf#qp9rxPyeB?R^EV2hJ*q9lC%A?5~X(?wdIVhge%iTYij z#+>nk)k|?w(f%Le(!s=Evlx{PT?u)>tWdC|vMMCHHLa+McHy@} zOCm{l!1Z0e--si&6RU6HxfW(Vp{dcKiv_%(-%?JU@T!7A5 zuu@RMaKgao;Y&;v^PLtE9=BTJt{##iMKz#`dZ`YNr0Qc%sLj||ldG(@V{sp_*uHSj zV9%>+UbVCxC6lfWDDgAvk%0d3P?f5#5mn zimH&$ahm1{mgh`z>gBt>R>*`z->_pu7ydF!(|4lCYmIH<<+MTg>zRpV1QQQ!5W_`- zh)r}=8$!#YZ{wtlk~%;h=>Y1!OvK8AKBuSVfJ~;_OH5m+>Kq}T`ds*>II*Ov4Ky_l z5d8Ex{kcvd2x^147wQmCgm>_is=gVZBLqW+9cGBQJYeclJ(aL~Mu0G-VcLh1uVlsnu$2E6@*^BEb%{_tj^y^FwZzgGG zIMZ%qW(4fF*O^+?Mrq)@T-xdY5tLSlHIHp_ZvuJ+Jzk^eRn*xHT_$g{Oj(9^GJM+R zPFiM$@!JKKGA{BP;BH!BhUuP~XkWI=J+lJk)m*yg(-mg_1hyJl zZiH_SYhbkMoKQ_<$uvEHCB_R}y<8hx+=xv$-MajfzH(FPV1*-NxxPV9x8yAx4EC2- zet)AWJes~LP#%>JO;&@f{Lq!RXjtezX}D}fxK>QCPTht{-kS-!2}BNx8ZhqTCJKK! zh!!d2a*#H4RP-z4nNZWh{8~oyAXns$*frzE-E8V`giP)b5*l@ZD8mshJesUiXxtK5 z;Rcn)6au7gjzg&*OrH^;rmH-8u7~cuZO(-4hTM$#8&e7OP42~!lU@+ zC3pHQP;kE^n?Ph-b&L5W>Q1LVijuh;GF(5?4CtA?(tK!`q@(zL*ljpH*yV1%4a{kC zFWhF%<=bII5V^%Mx0_kz6u021>$EPn4h`B@960)pxg&an_ymsN(S>)I*YRo^He82d znqS_D+2lpF6n?$SUswUFIj~@YY@CP}9{@zshtN*ubK@F$_lv?>5Kl zYaaA!4CTV`rWU_TH!_iJau=*Nvv_cP{T)fyyV_q8Qj+Dc}Ztvrb+->1@Ux`BR zWs7l~ZT5>P=Xv9AqJ5P+CApkiutwsrY>16<->)&}$6WjMJ!U%g%6Pi2NG-44eQ=Mt z4R^qSawxy(lZca!1s4sKJ&1D4?GNEV*NJ@+16}pKI2ZQqz2*eHv~0&Q%4``~=ldrY z--c?)@~^O{>b)0d<|Yk=hkN2ab9{91uCRnIf`jA9pZbG2*FDr@GL;dA9#7GQ>Vv@4 zSWNgh;r*zo_80iXYxdT>S)eq{%(`5~&{(k}P**}|oa0#Zj1SU;+M~CGi z<|}dRV*jV~B?jDQos`2Js6f8?lo?Y*LK_-f?^igAv;LOB{uFJ3t&>4=)zjw2$fuOK zEl=b4M$Yg0`yo_y}MsBwfl-$F=63G9gE2N$|ysKNC{di_=+8b zaj!uxu)>{TF1-P|)b83hV1F_FN8C;itS{bRnyVQ;HLDevS{kG=@*ZXP*#?9FoZ}j; zJNV4nLVUFF&>mlJ>)Kz&OC}lj`b%KmiJMGe-eDbvJ5W0N6_Xw%X$i|IWR*geOg7iq zbLT7OFr%l@rBjyT>mJ##;WJm*9=|(V7SS-k2m zQ^EVid8!0B4|)%>^LLT)h(YOlrnOWk=DNo(%-m_`o6$j^|9H=wOxh04r_D=6-=1Ux z1)}a#SgY%Q)-gmOAR%Eh78&p3d}NC|?R`{3{A=d!#`jJ6II>?TpYVY>4R~Uge|s6M{lJ{5mqA96?t~A`o#W{KgH=PQK46IGRo0)l8*T4?GwF{0 z$kb0{Rz^b$LnITI5JDQSpg%cXkAgF3k~dmGlDHNvNX4mXgZNLDmUPELSjTf*(EwqT z4iMwk0Ya2M_h}!_@skopS#1%$(h)RNP9bKY19nSG)*V8-%TZG{ZO0 z+L$P@fo#j# zx(bGKk=RyuaIZ=46;+Oa7IzKelRn~Qq_0-3Wi)*tH^5OAKkqg*AZ+Hm-7Ck@Mto|T zOVq(J)j;)pF+AhtAK<^2M8{-!Cn|-2W%#ui1Q7U_F6HiBywEH5*sZraG1uXtnLLe( zQnwg+#ZK!EG#oRfyJ!FcfZbX$Ko|pclBq;nEh$G-Q&x9edis~ z(M*Br+O+t;)sT;-PUymwMkd}sF(46wD=W_`2Np0xdh;i63!)juMl*Q4>Hovh7vI~0 zw>u5nv=uN_kG>XR1=)=IWM4CM8dX6zOlUXasfg9~%#o=8NZ)B`!gj!+U*c83d7sNc zMEsu~6)3LT!6V_|a2CY1MkFSt#ZZ6m%C{+A(S-w!2Y+EE_kj-CQ8x{C%fE<@Ha5#U z!Ur*w?TC%7!M)%0TdRI)O9zNR{Xx+LMlL| z1lJd=?{t&C#ChzjyYinT%H>TVS z6v}zGSDSs|7UUpv5vYIuty#er=E+^=D$Sj4kiSD>>!U%Rs?ZXLqIgb$9YKR66-)y;LZ0XVO&+A7k>vpnpr!J;@Jt8L*f|3g zs-sJ`3+Y+4L72u7$bDi)=^ggk5Qw5N5QV0T3Mmi;eTY66o++SinzOcu@oEe0l~e?x zfUyTS1)|XV200)Qh5nxqogol~yk94YA>_>ea;8&|k!giC0JI zfIt-SrJI-yOGF*ejbBZIvyKpeL>9p{);fhbTw4Q3EgbnA$~EO;JFpNFDgsX`k9 zQSjCweIAN}XHc~v5JmGgtH2$Yu`EDXb07-7Yfmb8XDuP&9i?qlU#{M1lXJ;^nUmfmy)q1ycl~Xb7x=2V)ecP!!F9_n_a?83OMCuO~Cm|F#6~gMN=A zaHxM9b)hJDooaxkK-#SVXPZK4^WQ1zfFK;T1{}w2lmSiw$D1YwhSwT!9OfL15SF7J|M7GI)l6u;Q7?Fw25AucOG>!{1FMI_rBbE=$bm>l6B9 z&qo!B|1QEi$6H1wBK7b%;CpKEj~rV5s;thDetEb(nA` z4-m7%;E}t$Dj~;2lKXSv64ontye#htt(#e)qD%7-$>OS<&#Mx?Trp}?qE6F4dR=Yz z7L#}PwzMJ$dCJ2@3XgAvb2IS7ef)rM(~dN2vMIC8)<+`zJYMlGix`xLMB@*!q`wL~ z@gF%y%WOBc8bXv8$7fY1#=1$nC6aD_b;4g(atoU9=P%WX@&1MSq{H=Uaup2TKpu_0 zGU_P*O-B7XZoMOJeFfhDV(VyuG=5A3>6kGQq+gGTAl(^%do}*nrzV0vsYY;`RU?q* z)kKh1;W;tc==%yzeQTp{lj3j3#osQ%H{f(ftw4IEHiDGgHG-7hH5z|>{O#iS+v@n+ zU-1o)`ivDwdyI`Boj5jvbjjEV|26TmP4TmS*4%|5-Lh=V)Mp|jxKlTZUEKf&fP6B9w^?3UmX1+Mq}UO>)jGR#-IJhC#K`i zg7Na}75=KOlV2y-N!uF!`i{R2m>_KnCrI1I35j-%&kV7QcCBKwVX22j54!K|o_iDE tB5Jz^JZ}+K#^*E&EY17?F6^Yz+E4%67ij+D#036H9sGBsuUdD1-+8{z`!Wag-uwCeb8<58%rnpa zJoC)VdoFr0|DqT37hRV~_TF;CjwQpA4b{o{Jw5)j)vdeV)Y*PJ%B1X5w!(DUzuPW+ zPPn4Wq}&;$rotYzHm4@j>3b(z{b#C0#y2+<;GdRu|4*jL&Rtq*H(xO-j~z4kzubO& z#aMv7@0t>~p}-W_^wJW0$Wm*1?2Ajg0loV~Q(})=cFB;G0Bmb0a62kZo%_etreMx{s8s+00hn&>4P+$#lUE)`K~~Pyk=?XZsPnhXC`1;hme;MK;y`? zZZ>twh-UUBPQ9e5IYL@`WML;rP%WB-Sy5Lz;y)_(Cw<+X2R&KT3s;f?PRS%SS*)<9 z{72QCCf`+oQsbm2x!g%vQJ|cGO&}k`NOzMAAgLLGOUulF>P1#>7c9%Md#spklJ>L} z?IqH^Nsy*4q?7jdE0Sza%G0?0^A*Wb>DkyqVgw-!n7T4KmR++3c&w5_MqApN<>j_& zWv>10$~Bn!@KtSNqQ0VB3d#@ZNjJF7Wu|O2JHSLdoU9J^u~qjZk`4Cs6?Jyw>Jk4U zJ)4AF?I@~6PG&L!p^@rM0z`SVYaj-6#a!s=r_4mO2GiT*C!_57Hx}3<))d+y*B0gA zSvtAt)HP$xVWPpA4i6#KBM{U~rAfaF%#e^_^RI5Gi>Uy}W3$Ly#p`CMH;dWDpePwZ_eeUY>M9B4S!F47V+!Q|2)X6Xz zgV|PGQ)imtv&!N3a_!64Oe!Vo`APPrT5RRDf6Nmi(~b6xYunsWoo1-}?T2QVZMm-6 z|Ci$)_{i*G|Mj|R)4A!=>n<>T!t>BisYvL?V%ov7R^d!qWT-ApWJqt7>K5$zphJv4 z70OL03Be_0hMM^yKm{et?-t;hZoBS=F8id-9jzWx9YI)=dl85Tu3HEtjFx}_J#>?5d|ha8KTx*CEqnC}#RBI?=RXOkC5HmEhVUcz3kHz$R>SKH#49oAd6W3Rn7CU|YIJf2oQ)qv-zJ!6fr^PN_ zKT#0vq%MO!es=PQ;W2d1WTo;=v@6|fzg}ObmXvY>OH8?PBmujgy`fg1YZy`U2|L8NE)i345B>T#-;{ab6dT;Y#!V~_3f+o z=R>9t{7$A$Z^G<%%O?D@a{yp&c(@1gl*$}YU4 zc8HJ)ou^$F(I6-%DwX}@o{BxyovBk1DaK*IUH%l(?ZfUo)6QL1=N3K&eop%JP`lvI zg?8YbT$@~xZ;S6bpqhS>5U9Hu;T|*k-i*7i*3`NMpJMn`cio&zCkBw>iVN)Nch4)N z_K?p>yZ@cFw)mc3bqbSdwN#ogh%`!shDv!MGU_N1nFjmymMVD8p>&Hxb2l@l%09+@_l4pbvl7hk7x7~Qj+k7cFG?r>^{heWWC}RU1Q?a2|bEH zQ%4jz13%Y9``gV6JLpeC%g7>Sw(V=#Mw+&9dr;;~*t>_^ z40#DEOYJ+WhTBX2IL}`Gx7=b87_o-n3+$|?E9{~LLu~T?d8H9k#cirG*)txlv(MlE z?r43;X8ELl>uItVd^O5vFaIjd`r;Y7&_ok++j4NKaF+B z)0!0D26s{a(DXt|G~!y{Lv<$UcD!RM^CN(E-TmHxhT9JwT0=Lw3)el!MghYiS+-4X z2^q z^O1(fkWy{7>(Tl=akZ%yx1~H$ZukCcvAyb!GR*?8WVq$g%EL&xXi5}b6phuA5WNSj33;uDwa?}~eCFbgpJV9A zeyom+(^4E!wMD>&0EwMZ+mvUUB9i;ZhS5`PiV|AXuk8*aS_9Pgc(auapuz(k7k%8 zYHE}s3?v?<&zw0%Sl3HNHHkK8@u)=#6IFK0Gp9siW$ZfcFAIN6p!7eXLej*djL0*w zMOX$dc}jP23jQ(eMLt77SO|)Sb=o7JEw_6jmHoPZcqzwci8weesUH@}nO1(&y?bxLyv&(5T(|Ii_yY zJI{?#C!iFFxhiw`U1Jmf5sr|{Spxzu6j>w((9E(8#`BJ7iTZxulZLh|4HOU9@F*p7ytkmX;4si=xF=UEnUe6fShy zpUjX1%2aRes6!pS@Rh1&!94Efk!2Dq?XBWXS$M?qNqC=WaF-XFk@l{eitXIHhubBu zME;6$4&7=`i!0tNY5H*c!&m2x6y;G8#2R~$AG_h3O_gL?d4Ky=b);Wj%%WauBuvZ* zaID?3vcSIZw~OQ6iWvs6ABXld#nZduzhObM;Xi*=7)+4KxD9g<1rL4gj!{8#=<*xe z-2o4qa+`ep*dY`h(3gU}z4rB=d)0Zv6=g4}++}xQ9X9jM5%#?|Hfh<8A)C&K`Vpji zT0EuqWJrlTnfG{Hduv!1mc%j8ll^T$m4Ix`Th)bBJW+_IR{K<6iG6c%*`}YpwR$ko zqeNmiBr41JCS1`FLmd|=u@lDpn$W4`1dp@X=qVvpP$xfwl-k{m*P2qd=3FT7`Ktv56^YbuJaB8XpVMns}vmK^uNsT7rFI3f;$qI=fHuM_MdOro# zUI)0vRf&o|;RB}dk5dAVcu>7`Sts08{A7SyLzq6b1)4)eq{_5W$F#&Q3KC=mrSn;2 zWXNF+zsH%|U|eff=J*85j{Us2Zzpn874k&!6*bh7Y4}|bQp!V2n;B0?6tU*_NS}ol zB3c(&Q|KASW{^n=^U3|Ts*bfLg>!5TgYH(MGd-%Ta$z-RSXC(>{vfxe*GEC=T2+hEcq2_NXr_O}9Pu%ep-6WS4*0#s#46$7Rjj+F)lsR5LP3 z&T;Y<3F573d*9YQ6PXS>1=YRFx8~%ry=UneiBWF#O(tj4C134Gpe}mzOBJl}a;+i* z%Wd%^IfttzQgy@do*i_>wTR6`xq+~svWqm{J#iS~fUdEG4Ov{Jo&}Ouc9JoymS&j{ zy9RuY&B^Of2%Cjrc|1<*uA!hKoW;&lNq0-alv7%o#?y1DkD=Q z&cX~X6{1~KH))WmJBfC&oBV-pU|7smMfh?m*|}L8gsoDd?7B zPYRAe=Y=t%9JJtO`Oaug+4r>CGj1&J)NC{oDMqU_=wW17uZog-&1G?~JAJUJW9p@5 zM*(qCk-92VgoekdQPc$mm`4Yj+ReL^CAEv}tZA(_+ZsIi}8J+!;CM z7^c1IFD0ua5Hmu>Dre) zPA2LMrkc!^{|CKfR~ioj%75 z8R|!KeGTP)6K@t7?LYb# zZDF8pbiKpPQA}N%ntbA3;x;~D2D`i7G<&%1*rs!D4>$W4357_^1aPlwA7Q40eG5hy z?0vh{BTOX@>)kT~7)tVAmOzR7-4RgQPJgz~j(so34Sa~Ao~5vAC;?9Mk89bp-VoKRsXl5|q^@Du}W*mcjxa&+Uz zCdaP%ELT%ydS~gtV_-~h$u`YV+QfgUk7ie4H@zOk+a~h?9nUAi2xDlI%){)6dS9&d z94;ilwWkikVUrCXnF6mNK>z*P%i}!bQO7tg13l< z=o*xsHb9@e%No!u!<4lG^&3g?GYBoC=f|`}O}bi0+0$>V@MpkAiD8pr8Z3m7SU^3w zqC(fEf_nB-_ih=oM@p2ID4Ie>B036>sQW@?$RpP6lnj9lGK4JxkFGKlNk~P^E(|Ev zH9b+oa%|oGEa&&%Q*K_+O0zlvPN&5(>NC+3azj2sv>q8EK(7&pd$jXRp>9%(0_y%W zor>b;XBZPX&nV1dG*5{^KPHbh72{>@a0+D#buU87ojMx3i0A#u46V`Uq6fW#f7FQ_ zZx5ChZFMG;R9{+$LQlO1BWX-K~c?0s0iU zIoIJd*6KY?WWS8<-^N6?YoU`W$XRK$%rw;n2~z5@0~ds+o~H1WiI~iotSGCCPwHTg zn_6j-@SJ{Nw2*PXs5F&%j2As_Z6&gTwC!G2>+-A2wh8nwfxcv&Mq-2q{jR$f<)DqL z2fKa8nv$@ppy%{xDby_Tk(})m>eNrtMRdBpv8Mhc#mJ`(x@O?M1vx=qOKvelYq>$- z(Zb@LArGUOj!q~^r(JF}PLLn4seEdr2fh!KMKoVJW#i-@lhwpKI-lki08n*+YgBk* zo*@sQ?OVs0v3{>&kn*Y~(bMA!YfSyfaH#4G*;#Mzez3r;UuCdW(t<7hTKC%;bCuh? z*5n*UMUJTiZp@{r?U+NfU4$NHP2Whsj`vM%O~_8I(rAG!pr963cruRZe=F8`0u5XPg z>3?>z`6RDU=;~yS(BxihH|?g|-S-hv`Mo<#^56t8R6k@LHio3eWBg>X zv`+Yr>EbrPRo^kQ5Tx)h%S66O+*uGRyUc<9Fj$>$<)IgKa-uJEA*{8fQ_gkC`mk|3 z;@X-5*hp~BFh;6sia8L<+dYL>Zbt78uSs+c@Rm<8#~{&ucM29fukL}Q{G?Z<_K7BrrzW7BSM6_VAqGK}6OOf{>7BI28Kc{$`5UH5M>=K<%)p zriz|Hg_?3_Pc=Wqleedu6K92)T1IAI;gQ~guyszxUi#K#rr44d8=*9~mLQSN)cFvGq*m1*IuFZh%avugTS<&0M6TD z8#k7Z3>_dmmwyab6Y1*^J8)yJYd!=jaQZ$FQ{(qcM;6UYxab&EWiswb(5x6sxFYwU z5xZbK@IBLxIw7W1cgV1#Ib_NmFvHZMD43Z6`C`DFkOwR=1ykkH!H@`NU^@#p)Q z+Nq&tkrO(C+~#BEory(Ak`>&A(OG%CFh&=? zLQ~9SKY*nJokWPG8)XZvkAs1&A3y@Ll3}mVee-u8p=w4vv-XrF?rTX^n8&mOg`u59 zkUPXCW;YPf^0H{ZS|SAC2AzdNEnZ8je_%$9j=1IpLlE3~M9#S82-EcqRcWrqA*_#& zFm;82Hm2I$gdWUxZDX*QXFXj$x$Z1{j z%ABeFMLEbNg+T)i1JpGiea8+qOJQN68gC}%G)ujree$8Qq33yF1d%xOy$Afz&|E*Od~?A z6>g~3l0nhoGI#MTGZ7a>1Qi(=amd|23v_3k`Mx@`eDyw!uH*ZrN-HdMVKUb)gbGCU zDby!da~l>rI}S0qQ^Wjg7xx05gx*D&sP_m-bBp^=Acc#h?!B32WWH)ut2=V0skC3a zJom=QW<)XlPQ>O`ze_U8{okX_WFL8Q+`UI*--DT4=944$7h@?dp#)wH*w?)U7N=$y}kA z*0m5rX3EW7XUc0ryx2D$;l%_0alqvW$4?$(hC|Y?9OESo-V_r@xI*6x<}mhH)YX%2 z%CWeIJol#DYSE$COYf94acE7s1*;)xAN_{F+xh2632r?Wnx;!BQAlFf*n~~|TA!ok zx{BklF@og%I8)E7tVAU0*kCVssKPBe30E9^GIWdYy)*1*r>Qw^((&e3VW5sT#RQ*r z_t^0;BH=G@AVYuo#B1v=E>hSa?peYZB@y}aRyXSi)5b+0{O?arFkQ6XY{w|jv%(0y ztz=lNYO1_MhVaP3SW)>b(erV}4L#9xp%_yo*V)`pPBfGJ3TO=G_5*cI##CF#Y;JQ; zErSibdLpFRy=*r2`mr^iPY=|XcIG{Ap15J=URs9yY~^gzQA8Dp!;N1mRf{T+OOEdml2=0O6L`Wi?ar1Eq8?32tznf!z&*Na^4j>4tnB;Zyne3B8Jw9-Z-=mDryL{;)@_x8!AP_BxOiA~lcK@pR;SZbWHXJSve!#W5L z+>-~G8aMY*vzMFn?`By4%DJX^xZbYJ+PxRAuzR&XE)ZfK%^Q1~-P@;|>0!wu&OSXl zyfUJv5UBJ*5XNQB!1i#bTXBY|XO$0Y$j8n=9ulw-{_86=aZ3{`y@~&ZVAAP&|IO4F zi%ODEeooFnj4tQ=3TjI@ALW)Dn2g&G>0tozZ(petfOo#?nI|M6KN= zfwNnGqRC6ZI}ZF5H*+=or(DfhP~~|maK-*dXPJhbm+jqe&oVo2+ZVg-XJMVt=?0yR zWruJ?7mu{=l$&<8nS$r%<9UqZhOj_Vy6G{MVBv}C4Kk}! z_p&jjtS@fz0Cn45;v#{wm>PHTeMBHx7&J<%m(@v-4KYCS<7dd~gn8WB4pXXe2gnN& zz3zfbP1&JgS52@(vZ(q0zyS5T z_Wi$&a?{R3#Sib#$b$%B!3A#36f;H+{|+H#p3!3?Mu(`PZsmoFX|j$2`$NxpnDndj z0(3<|#M_|zsXsU4{DEO~I_2kPA~uLbImjwWm>DO?R4#C0?~WPO-_f6C<n90xO_%mkE~5ba2Y_4$fyy(2&d2ix~vxDndviJXt2p1j2Zegi>Gi}!bPCy9+{!HkHh?y zgoW#+7Qv6A(}OIkOxd%7Mjq_;8I9}QjvVIeZ74SX=G|fOarJh0`vp*MdFjdUF(!8~ zbiBY#bJ#-3xzH@6sjGbkyi@DdgjoEGX7Iwn7^|4gR5uSiZX(4v3qR>nGpfJn|Cl4q z;aP`z=qQ-sgjq!!O(7r_M>YXgFEp$Aq)w)oV5fohP zay)L~5?W7%q}?mSktWW)$P5jS)6pAfIZy0G!R@}7gV`Rj03fii$aSYZf-@vferWRe zx*s(e+HdwMMif(s4R57~iBU{AFbCa!fT|(O5(>{B$t$r7*5_78k6;${6&*WC#Oa|W zzclrQfm`k5PWU^&G*^rjzU`h%Gg5%g)fbzC+>VE_pnTyLyov?;qQhzXG1`1nn0@S- zg8nJLGM^-L4_WBcWriS#?}Du$LKS3G!yN?Bndx??USjI<#b0$aHn>NP}MYnrRGy*xP%Seow`B4Fmaz;Xv*YVwjKZ>yXb=8u@_!y zDx1Sc>RDt0#gs$H0(DMUQQ_joXpw1{@xu%~i;@}HvzYLWfPIIkhT-{^Y z08;8-Uv948^#ONq{2|0=#cUBO~An&*hPxy+5-7!i+~y15=VW3j2k z@mP;8lOXLTmc+~}@`7&RVpGL?YRrLY`C;8MZV~#0&XDF9g&2caetrPYvS}w#EB!83 zPwu$-C8h|wDxFKr4`i2Q7Q;x`lkz4Xm4l*k6bNwilZCkGcfq%%-M;c{iTmdgGqHj4 zWdPPJl)jx0ghzba3U*l!w>bSKSko|KUU=S0p(1V(?l4=3rr3#*K#lq02WROgt9%@` z8;=er>6(_PWMqWaRsu)PMWd3=g)&WDeO|Yldcfynm-AQ(3f44r08Nnt1V3%3 zBhx7aL46>UQos4?)E=H;)k_3ALNH`Z;!`V3A86wYW$9Kjce``{xQ%TSV8v-kt5Ps>4?yzGDVsakUd9j|*yHn6TuNSB{uU zL4W;#G@YXOzell%X>^mDjZ=d-7b2%<*(uZv44@} z*Vmf7;{^Rsv(%N)&Y7ezfD^**wE|kTy7j2`?iYJIG0D2hpgDuERaZzfrKEpPpBw%Q zRHx)!BAsz{+;dy>ml<-qI3$kc;jGB z>g3%^I7-`86s^pB4@A!mH<)vLJ$R+KN#y$>mZoF;to2s5;Q&W+}6!!#e|^O-l{ zgkZ*9e-o;Y9qy@{%(?mw2{Jb0j{mJWrbLJ*&vbQ%7yICW_NA?6+_;C#j zqN0Wk(F#m+&N|E{_utC#-y8f7ONugg^m@~YriJUx576P&_2wv(>2KO#dJIfq=|&90 z;lYh&w%!gAU8SN?dadn#2dy%ZZgJ<|Vvg~9adpC;r{EFYq-=nY3HD2|IhbVO8b6-ei6rbL+z2;ldNo4JYt|gGJ9E zq5S-J=E_mRE#M>S6!_PSTYR^flMH}Ni%&@d)< z*-d7cTk|PaVgt9~@Z02yM2>stb~77b{B-03^8p1w=6f)uZrkt8Demrm(-_a{$B3C_ z^-j8Bzc))Ji7j#$9qStp{~H!KqVhtTz+e8q0o~=Eyu-}uHorpIy=6V2tM5pkoD(aU)Xbvqj9M9{AW$>KJ-j_WLtp=iXk-&ba>U7p1{s? zgHMDoes-fN?qBlMEI(wz!`>fP?%!?(qkZMhUxGQf|#dNC-|p&g6^=94&)A^EJE@FZm$O z3{Z_T{ii-?CV4k=%EXT0X?!U$^Tj zx5IM`TxxI`X6O4Z-9?X@Uva+$!W;cerE7f5H1QN^Myjy=c(?4QgY-THy_;rnuDS$w zG46iKoQ?MgEWAT5+7!{PL=|qAe%kzT7&V;=ZAa`V_3tdxH^ot#g z^2Sbg$1`TY4dD7s0(QFbFOagz)YUw1#*K!~de!ABDh!s*?v_FD&E{1cusPsa*{<$> z)>Lscif_Ms76-<~T#&QuG#4#G3bq-!2V3SocosXy%ke6)F$mwjtGz+3= z4R0I(jG!on6D|drPY_H5-%Z|%!}nBQT1=BWaVxGBbh=er%|thRDK0l5M|fhZIZ$7A zpc$z5TMCQmB0Ya2P8&aO%KVt4UIb{tBD!Jb&P9_+_h0#5$Z<97K==0Lt#N9%()ele>I$1i5SVsZ<}UvD+M@KL?ZjGsW4w>#Fd(xJWh z)slPSRZ})rx-l`+6}xo9Cb8!!P97hGSR3E81(zP%Cd?Y~vcapMr4xMz=jsX-AvhdO+xRjVfRgyja3~V^lWD(<$C3p1r~UbtN!!hlF84LW{>9tPSrbGh2r(9) z$0U-U=NHsNiWK&N{*o5QF+@F`SMsEKsaZFn9#q6?M{cDL*>&tnJFi}u@; zv6+D6h|d`Iif8jsqdKSC{t8Tf>8r?R7LAO58$r+52EbunN4#pv!3{qeemn;+63s!{c}bUa5j0}# zF(`{y@>I=NlN(VFUbOcvxa&33fUEe!$nRcSm^m` zAw1b)2d*ynd;7!e`gil<69dAto$%z+R-0oeGj zjrRM8zG=FOWlrv-`3%6F_H&$a(gOi~Z<^DD#KW^m^m-Isw&Y4$1f(aNguPlZ2$T~N z^Jx3U##=c1*5*!o%k$E$e#=x$Aphl)+hV&**{{vT`V*-(_YudA|GPQUuW;-U@0Icg ze_|NzjD}iqsE1CyDrlgK;%><14xDxOYqwUQHojxZn&S zh-b}GMG*>aq2cw*P@p2a`ndu-^Y+|6dN6uz@<}UCf<&}hl^OJbz}5nZFh<+OxT67r zj6Ps8B*R#?(sr*&IBZW%r_0eNEVyulEEcp~SfT^Iu|x+s(jDjku1U2@#+9%zg6Sb3 z&F~|r3_>uYJ$Cv%W3~89JUBX}MTT)(#N*`7TaCRZU;XLteb<~}@G6uS-a~fZR|}KM z8^G~ARDp1YQ4B~IWKUFm2S* z_|?CDj@^;clcb8&vi~y4lj!Woaa{=u=3&K(dqT_;c}|NA#{@!);IB3*st`%VEyNUh ztR|WQhyigwZucp;O|DZ2mb(3+afcp99#GLk5UM=X6fUO(@yYXhSP7PKv1WQa1Se%9 z&&0N(z;@KfSV%4S5bm}u2B7gVCy^E)Oa}%rXVa-w{9HxA`pyp{$ zxx+ugsYhsIt{r#X9&XJ?rkXdC+h$TGG;u0>L=;AOdUomn&n_-IZ+Y>o%(Fq#jC^Lqk-H`{iUVh>BWwaaY zHCDBZfrSXFOJ);Sa4dI_RFSK`C{>inAH$a^f`tgFiD_E$Po&@8uk_Jk>9V6UbBwl} zNxo}JK~7PFgsIRVnMgYAPAZ`)MS@J0csmCS6z!0=}*2eYq+o^KbifsrQ8U-%)(!}bX{MXCimdi zNSdm05(QW`$n2uUP3{2Pu!xJA`7XH*$#yF3lDFbqZ;N~HOLNdL!BgjTcw<4iyZ0ox z?vuX4Nz};?;vo0MUzw@?H6-)CgzMh%wHazM`g>kE(QQ!OM`&4Ep17!p&Pn|NRz)Zz z;pb5DZhIzi(IEeeW4U_GRkQ&|&A$0qcD?@QoydjW56ezZ8{ImKZ`7ag>^@x#78HYX z5_P^}GPF;FFclmj5-^&DKl*@(uwA&J?RqPO4}>ax5JX=dXx4VBiq0Ue&Oh)wg;WMY z5)0H3>Qwk3%xO`kpxgraCwQOHg)kG*pWgk1C`Bz>chJ_tk+Zxf+wYaj~TL-Izb z0|HSr1y<1-h@wf)|LKU>EO59Y5Cx8Y@5Ct-1>ee~$OfWl4Md@}T%92hh2&_G+j}Yk zv%s%X22=#1(AVsVi1-d9ojMc+54-AvKoo5{ zEMCOBbB1>D9_oLa0}q8e0XwM+MZse%I=4ueQ?v&vi?ja06d^wZKOL}>9ewlhORm9) zKsV{$bVR@oxVKl6WJVa_`T zaQj3d1%`(+w=rW|RoL{u9f1bYo;d{%jwz&2+8u!g(w=odz;V1NGr(yl%jeUaIiRK^ z;5f`V7$Gc23IBm%i8fp-sJ7* zs>B$<kw^)_#@280=zJ1`R-2n*-db2w2SKS0lQMCkYydV;7^b@GJy z`t!ylot$Z6oY~oHJ}+QrVM&h^HqmKoR+e<*t3jh&0zanO%hO*6Ux05=`y22Gf1a*R z_?Lct5qF$a6LmZ`{&qq9?dJH~^Z15=U)2bhiQ@#!(c_}|E*uwuSr>nMA^tX~HhQ`* zz5&cJwE|{At$?`+{}I`(amT@R(U8gUw-e)U7vUSg+*~JMp05)yX0HfLa<6Fc?D*R+ z<8Qab-(JEufEhGi!0bC-z#NbNh|R_0BQUqd-?qiy@+U-3oAC``PMjcME}9@GnMha;u diff --git a/gen/test_fib.c b/gen/test_fib.c index e350b1d13a7d387e16632d2b74e7772aac0a76ff..9fc57d650a97b6a946d61dacae85988943e93ff9 100644 GIT binary patch delta 104 zcmaDZ`doCvS|&q-jq4XNGbT value, emitted in phase 1, removed in phase 2 */ def(scope_get_private_field2, 7, 1, 2, atom_u16) /* obj -> obj value, emitted in phase 1, removed in phase 2 */ def(scope_put_private_field, 7, 2, 0, atom_u16) /* obj value ->, emitted in phase 1, removed in phase 2 */ +def(scope_in_private_field, 7, 1, 1, atom_u16) /* obj -> res emitted in phase 1, removed in phase 2 */ def(get_field_opt_chain, 5, 1, 1, atom) /* emitted in phase 1, removed in phase 2 */ def(get_array_el_opt_chain, 1, 2, 1, none) /* emitted in phase 1, removed in phase 2 */ def( set_class_name, 5, 1, 1, u32) /* emitted in phase 1, removed in phase 2 */ diff --git a/quickjs.c b/quickjs.c index 872d7d4..3b08749 100644 --- a/quickjs.c +++ b/quickjs.c @@ -7496,6 +7496,8 @@ static int JS_SetPrivateField(JSContext *ctx, JSValue obj, return 0; } +/* add a private brand field to 'home_obj' if not already present and + if obj is != null add a private brand to it */ static int JS_AddBrand(JSContext *ctx, JSValue obj, JSValue home_obj) { JSObject *p, *p1; @@ -7511,10 +7513,10 @@ static int JS_AddBrand(JSContext *ctx, JSValue obj, JSValue home_obj) p = JS_VALUE_GET_OBJ(home_obj); prs = find_own_property(&pr, p, JS_ATOM_Private_brand); if (!prs) { + /* if the brand is not present, add it */ brand = JS_NewSymbolFromAtom(ctx, JS_ATOM_brand, JS_ATOM_TYPE_PRIVATE); if (JS_IsException(brand)) return -1; - /* if the brand is not present, add it */ pr = add_property(ctx, p, JS_ATOM_Private_brand, JS_PROP_C_W_E); if (!pr) { JS_FreeValue(ctx, brand); @@ -7526,26 +7528,28 @@ static int JS_AddBrand(JSContext *ctx, JSValue obj, JSValue home_obj) } brand_atom = js_symbol_to_atom(ctx, brand); - if (unlikely(JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT)) { - JS_ThrowTypeErrorNotAnObject(ctx); + if (JS_IsObject(obj)) { + p1 = JS_VALUE_GET_OBJ(obj); + prs = find_own_property(&pr, p1, brand_atom); + if (unlikely(prs)) { + JS_FreeAtom(ctx, brand_atom); + JS_ThrowTypeError(ctx, "private method is already present"); + return -1; + } + pr = add_property(ctx, p1, brand_atom, JS_PROP_C_W_E); JS_FreeAtom(ctx, brand_atom); - return -1; - } - p1 = JS_VALUE_GET_OBJ(obj); - prs = find_own_property(&pr, p1, brand_atom); - if (unlikely(prs)) { + if (!pr) + return -1; + pr->u.value = JS_UNDEFINED; + } else { JS_FreeAtom(ctx, brand_atom); - JS_ThrowTypeError(ctx, "private method is already present"); - return -1; } - pr = add_property(ctx, p1, brand_atom, JS_PROP_C_W_E); - JS_FreeAtom(ctx, brand_atom); - if (!pr) - return -1; - pr->u.value = JS_UNDEFINED; + return 0; } +/* return a boolean telling if the brand of the home object of 'func' + is present on 'obj' or -1 in case of exception */ static int JS_CheckBrand(JSContext *ctx, JSValue obj, JSValue func) { JSObject *p, *p1, *home_obj; @@ -7554,11 +7558,8 @@ static int JS_CheckBrand(JSContext *ctx, JSValue obj, JSValue func) JSValue brand; /* get the home object of 'func' */ - if (unlikely(JS_VALUE_GET_TAG(func) != JS_TAG_OBJECT)) { - not_obj: - JS_ThrowTypeErrorNotAnObject(ctx); - return -1; - } + if (unlikely(JS_VALUE_GET_TAG(func) != JS_TAG_OBJECT)) + goto not_obj; p1 = JS_VALUE_GET_OBJ(func); if (!js_class_has_bytecode(p1->class_id)) goto not_obj; @@ -7576,15 +7577,14 @@ static int JS_CheckBrand(JSContext *ctx, JSValue obj, JSValue func) goto not_obj; /* get the brand array of 'obj' */ - if (unlikely(JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT)) - goto not_obj; - p = JS_VALUE_GET_OBJ(obj); - prs = find_own_property(&pr, p, js_symbol_to_atom(ctx, brand)); - if (!prs) { - JS_ThrowTypeError(ctx, "invalid brand on object"); + if (unlikely(JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT)) { + not_obj: + JS_ThrowTypeErrorNotAnObject(ctx); return -1; } - return 0; + p = JS_VALUE_GET_OBJ(obj); + prs = find_own_property(&pr, p, js_symbol_to_atom(ctx, brand)); + return (prs != NULL); } static uint32_t js_string_obj_get_length(JSContext *ctx, @@ -13217,6 +13217,41 @@ static __exception int js_operator_in(JSContext *ctx, JSValue *sp) return 0; } +static __exception int js_operator_private_in(JSContext *ctx, JSValue *sp) +{ + JSValue op1, op2; + int ret; + op1 = sp[-2]; /* object */ + op2 = sp[-1]; /* field name or method function */ + if (JS_VALUE_GET_TAG(op1) != JS_TAG_OBJECT) { + JS_ThrowTypeError(ctx, "invalid 'in' operand"); + return -1; + } + if (JS_IsObject(op2)) { + /* method: use the brand */ + ret = JS_CheckBrand(ctx, op1, op2); + if (ret < 0) + return -1; + } else { + JSAtom atom; + JSObject *p; + JSShapeProperty *prs; + JSProperty *pr; + /* field */ + atom = JS_ValueToAtom(ctx, op2); + if (unlikely(atom == JS_ATOM_NULL)) + return -1; + p = JS_VALUE_GET_OBJ(op1); + prs = find_own_property(&pr, p, atom); + JS_FreeAtom(ctx, atom); + ret = (prs != NULL); + } + JS_FreeValue(ctx, op1); + JS_FreeValue(ctx, op2); + sp[-2] = JS_NewBool(ctx, ret); + return 0; +} + static __exception int js_has_unscopable(JSContext *ctx, JSValue obj, JSAtom atom) { @@ -15222,8 +15257,15 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj, } BREAK; CASE(OP_check_brand): - if (JS_CheckBrand(ctx, sp[-2], sp[-1]) < 0) - goto exception; + { + int ret = JS_CheckBrand(ctx, sp[-2], sp[-1]); + if (ret < 0) + goto exception; + if (!ret) { + JS_ThrowTypeError(ctx, "invalid brand on object"); + goto exception; + } + } BREAK; CASE(OP_add_brand): if (JS_AddBrand(ctx, sp[-2], sp[-1]) < 0) @@ -16939,6 +16981,11 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj, goto exception; sp--; BREAK; + CASE(OP_private_in): + if (js_operator_private_in(ctx, sp)) + goto exception; + sp--; + BREAK; CASE(OP_instanceof): sf->cur_pc = pc; if (js_operator_instanceof(ctx, sp)) @@ -21513,8 +21560,9 @@ static JSAtom get_private_setter_name(JSContext *ctx, JSAtom name) typedef struct { JSFunctionDef *fields_init_fd; int computed_fields_count; - BOOL has_brand; + BOOL need_brand; int brand_push_pos; + BOOL is_static; } ClassFieldsDef; static __exception int emit_class_init_start(JSParseState *s, @@ -21528,41 +21576,27 @@ static __exception int emit_class_init_start(JSParseState *s, s->cur_func = cf->fields_init_fd; - /* XXX: would be better to add the code only if needed, maybe in a - later pass */ - emit_op(s, OP_push_false); /* will be patched later */ - cf->brand_push_pos = cf->fields_init_fd->last_opcode_pos; - label_add_brand = emit_goto(s, OP_if_false, -1); + if (!cf->is_static) { + /* add the brand to the newly created instance */ + /* XXX: would be better to add the code only if needed, maybe in a + later pass */ + emit_op(s, OP_push_false); /* will be patched later */ + cf->brand_push_pos = cf->fields_init_fd->last_opcode_pos; + label_add_brand = emit_goto(s, OP_if_false, -1); - emit_op(s, OP_scope_get_var); - emit_atom(s, JS_ATOM_this); - emit_u16(s, 0); + emit_op(s, OP_scope_get_var); + emit_atom(s, JS_ATOM_this); + emit_u16(s, 0); - emit_op(s, OP_scope_get_var); - emit_atom(s, JS_ATOM_home_object); - emit_u16(s, 0); + emit_op(s, OP_scope_get_var); + emit_atom(s, JS_ATOM_home_object); + emit_u16(s, 0); - emit_op(s, OP_add_brand); + emit_op(s, OP_add_brand); - emit_label(s, label_add_brand); - - s->cur_func = s->cur_func->parent; - return 0; -} - -static __exception int add_brand(JSParseState *s, ClassFieldsDef *cf) -{ - if (!cf->has_brand) { - /* define the brand field in 'this' of the initializer */ - if (!cf->fields_init_fd) { - if (emit_class_init_start(s, cf)) - return -1; - } - /* patch the start of the function to enable the OP_add_brand code */ - cf->fields_init_fd->byte_code.buf[cf->brand_push_pos] = OP_push_true; - - cf->has_brand = TRUE; + emit_label(s, label_add_brand); } + s->cur_func = s->cur_func->parent; return 0; } @@ -21764,7 +21798,8 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr, ClassFieldsDef *cf = &class_fields[i]; cf->fields_init_fd = NULL; cf->computed_fields_count = 0; - cf->has_brand = FALSE; + cf->need_brand = FALSE; + cf->is_static = i; } ctor_fd = NULL; @@ -21873,8 +21908,7 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr, JS_VAR_PRIVATE_GETTER + is_set, is_static) < 0) goto fail; } - if (add_brand(s, &class_fields[is_static]) < 0) - goto fail; + class_fields[is_static].need_brand = TRUE; } if (js_parse_function_decl2(s, JS_PARSE_FUNC_GETTER + is_set, @@ -22031,8 +22065,7 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr, func_type = JS_PARSE_FUNC_CLASS_CONSTRUCTOR; } if (is_private) { - if (add_brand(s, &class_fields[is_static]) < 0) - goto fail; + class_fields[is_static].need_brand = TRUE; } if (js_parse_function_decl2(s, func_type, func_kind, JS_ATOM_NULL, start_ptr, @@ -22099,12 +22132,29 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr, if (next_token(s)) goto fail; - /* store the function to initialize the fields to that it can be - referenced by the constructor */ { ClassFieldsDef *cf = &class_fields[0]; int var_idx; + if (cf->need_brand) { + /* add a private brand to the prototype */ + emit_op(s, OP_dup); + emit_op(s, OP_null); + emit_op(s, OP_swap); + emit_op(s, OP_add_brand); + + /* define the brand field in 'this' of the initializer */ + if (!cf->fields_init_fd) { + if (emit_class_init_start(s, cf)) + goto fail; + } + /* patch the start of the function to enable the + OP_add_brand_instance code */ + cf->fields_init_fd->byte_code.buf[cf->brand_push_pos] = OP_push_true; + } + + /* store the function to initialize the fields to that it can be + referenced by the constructor */ var_idx = define_var(s, fd, JS_ATOM_class_fields_init, JS_VAR_DEF_CONST); if (var_idx < 0) @@ -22122,6 +22172,13 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr, /* drop the prototype */ emit_op(s, OP_drop); + if (class_fields[1].need_brand) { + /* add a private brand to the class */ + emit_op(s, OP_dup); + emit_op(s, OP_dup); + emit_op(s, OP_add_brand); + } + /* initialize the static fields */ if (class_fields[1].fields_init_fd != NULL) { ClassFieldsDef *cf = &class_fields[1]; @@ -23969,9 +24026,31 @@ static __exception int js_parse_expr_binary(JSParseState *s, int level, if (level == 0) { return js_parse_unary(s, PF_POW_ALLOWED); + } else if (s->token.val == TOK_PRIVATE_NAME && + (parse_flags & PF_IN_ACCEPTED) && level == 4 && + peek_token(s, FALSE) == TOK_IN) { + JSAtom atom; + atom = JS_DupAtom(s->ctx, s->token.u.ident.atom); + if (next_token(s)) + goto fail_private_in; + if (s->token.val != TOK_IN) + goto fail_private_in; + if (next_token(s)) + goto fail_private_in; + if (js_parse_expr_binary(s, level - 1, parse_flags)) { + fail_private_in: + JS_FreeAtom(s->ctx, atom); + return -1; + } + emit_op(s, OP_scope_in_private_field); + emit_atom(s, atom); + emit_u16(s, s->cur_func->scope_level); + JS_FreeAtom(s->ctx, atom); + return 0; + } else { + if (js_parse_expr_binary(s, level - 1, parse_flags)) + return -1; } - if (js_parse_expr_binary(s, level - 1, parse_flags)) - return -1; for(;;) { op = s->token.val; switch(level) { @@ -29577,6 +29656,10 @@ static int resolve_scope_private_field(JSContext *ctx, JSFunctionDef *s, abort(); } break; + case OP_scope_in_private_field: + get_loc_or_ref(bc, is_ref, idx); + dbuf_putc(bc, OP_private_in); + break; default: abort(); } @@ -30285,6 +30368,7 @@ static __exception int resolve_variables(JSContext *ctx, JSFunctionDef *s) case OP_scope_get_private_field: case OP_scope_get_private_field2: case OP_scope_put_private_field: + case OP_scope_in_private_field: { int ret; var_name = get_u32(bc_buf + pos + 1); @@ -33331,7 +33415,7 @@ typedef enum BCTagEnum { BC_TAG_SYMBOL, } BCTagEnum; -#define BC_VERSION 15 +#define BC_VERSION 16 typedef struct BCWriterState { JSContext *ctx; diff --git a/test262.conf b/test262.conf index 72dbf3e..64f338b 100644 --- a/test262.conf +++ b/test262.conf @@ -76,7 +76,7 @@ caller change-array-by-copy class class-fields-private -class-fields-private-in=skip +class-fields-private-in class-fields-public class-methods-private class-static-block diff --git a/test262_errors.txt b/test262_errors.txt index 8193447..b45e807 100644 --- a/test262_errors.txt +++ b/test262_errors.txt @@ -88,6 +88,8 @@ test262/test/language/expressions/function/static-init-await-binding.js:16: Synt test262/test/language/expressions/function/static-init-await-binding.js:16: strict mode: SyntaxError: 'await' is a reserved identifier test262/test/language/expressions/generators/static-init-await-binding.js:16: SyntaxError: 'await' is a reserved identifier test262/test/language/expressions/generators/static-init-await-binding.js:16: strict mode: SyntaxError: 'await' is a reserved identifier +test262/test/language/expressions/in/private-field-invalid-assignment-target.js:23: unexpected error type: Test262: This statement should not be evaluated. +test262/test/language/expressions/in/private-field-invalid-assignment-target.js:23: strict mode: unexpected error type: Test262: This statement should not be evaluated. test262/test/language/expressions/member-expression/computed-reference-null-or-undefined.js:28: Test262Error: Expected a TypeError but got a Test262Error test262/test/language/expressions/member-expression/computed-reference-null-or-undefined.js:28: strict mode: Test262Error: Expected a TypeError but got a Test262Error test262/test/language/module-code/top-level-await/async-module-does-not-block-sibling-modules.js:13: SyntaxError: Could not find export 'check' in module 'test262/test/language/module-code/top-level-await/async-module-sync_FIXTURE.js'