From 840e3d6a556e82f61af58da2660ab0f0a93414cd Mon Sep 17 00:00:00 2001 From: zguiy <1415466602@qq.com> Date: Mon, 18 May 2026 18:53:30 +0800 Subject: [PATCH] 1 --- ScreenShot_2026-05-18_175704_601.png | Bin 0 -> 121184 bytes examples/app-global.js | 18 +- examples/index.global.js | 37 +- index.html | 24 +- index.js | 51 +- src/babylonjs/AppDropZone.ts | 26 +- src/babylonjs/AppModel copy.ts | 748 +++++++++++++++++++++++++++ src/babylonjs/AppModel.ts | 25 +- src/babylonjs/AppRay.ts | 4 + src/babylonjs/GameManager.ts | 27 +- src/event/types.ts | 1 + src/kernel/Adapter.ts | 14 + 12 files changed, 907 insertions(+), 68 deletions(-) create mode 100644 ScreenShot_2026-05-18_175704_601.png create mode 100644 src/babylonjs/AppModel copy.ts diff --git a/ScreenShot_2026-05-18_175704_601.png b/ScreenShot_2026-05-18_175704_601.png new file mode 100644 index 0000000000000000000000000000000000000000..0ab964619b9a7b28b6472621744769d8f18ffccb GIT binary patch literal 121184 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­&MhMB49 zhWCZ9$v`z0~m^K}S3Je@E%#gl@~t^^U95hLzR_ zuw?c!Q0UTKXIX5#OU=)+bmT@wO`Us53wlFDB(;0Vvws53AP56LatuC^6S~lezfEf7 z<6OsmuHXCw$*)zMBI7en*08!RocWJ#(~0-3SdZ*++T}mq^Quv`fP=u@6VP2)i4n+{6;jx*NKj80a9;N6c%W@-gsxe<(?-5 z>F1DH1vfH)bW6VQB=NH}^|1c-Ist}MthrQ9IaOf_2YQqNja0$zc68>YsK_+JSukRxM&xf{u z?&Le=)YYS|z+?M0m2|9btx}S9dKT6hJQ`d!zn%`E6N^>VFjq=#IU1nXJ9vYNoySlW zFfD!7nAy;YNi`f}%V3O%$e(!p#_x6(9ea@#tGXt|;S-c?f(xer&o=zO4VKo^)uHdM zAYt}(WZd|Cx%ePIYS{b3O94eA!YRNQ$OPkL1?cW-T7!@YelB4q&5g3r(;e~V>;)J})g$er= z?G@*tgz=Dnvy4Zzr(1mM?By=3L>z;Gm&Q6j8jtSj#r*(Np{@hfEBR9np27|YxQx25lM2kKI6z7D^Buh7!tB$rP{`;#o46$ zf5wI0~o8cCtuf`M&2N5U5poMC5uWXx8qVu3KwZ32PQ8ZVvI%QEYHJnj%jUrjH?g{*kwT!qnluF{ z@p$U(N0B;FR(N`2L4y#cdbCBKYHa?7zvnw`^gS)PnRWvidV+|JFM>@z zASP-;oX@y0swY`TTF#YLNqz7_Oe0CICXIk+iuY!dT_JnkN&?&f&Zvu*eP`LN$6nGn zn-P~f_3Zf6g$tq7b!#+s3KY)s5( z#rmB2C~@i#IqvK0-EYQcw~-vks5R)6>wc1zl(;61@_$BpQMkRwh}E1w;R9K0pRDdu zkCC)pfA{z1MsbPP3f9}PDjmF= zD1o$-LnQg?iqTw(9OJHDG~x!y5XiT7>cqM0jEv#sQ)n)B>QdRu$hOZGKL~@B*yOf} z5RzlJ#>S&A0K&q8u@R6KObyg8Ibo-3j4Nzt^rs1T4(Ck)wP(jtg zIx|Krppd84`WqdyKAG}gArQ=rufJwtTY6gA^r?=tjMs>sbBYwQJoU1O$oVSq(z&eu zh@MvZAkg?{7v6GF@R1vXOTFVeyoks?Go#Fk3`+%BV*AifZdh3w6#+@X$PC>EDwx0e zKCj}(I+W42c(W5ErS2E~7QIE&^*6e1YXg(#b^R0We#<6NPI2OKi#y$ElG@%W-P;Sv z0s1NP*%OgZ+XvJqK4d3@#l;;iJfS&G&OFuWe~{)cAzuiRf~htjeP;dJGOIEElR>5;|id{_=$W6DumMX#R&Q)P!3U&455QVoLg z^2-`Ej0JD?GtKr})UK$JCha-K_PnI0uz~Gwz515N(IR-S<-ig_0UPi26+~>pIr!gU zK^2P?sT=#Wq$Gw4y@fX*d^c8K!752@3g#VRoWH!fy4Y^}9?90<<$XweDs}8XT3S{( zUso%nV9WTZzrN`<2nfLW@dIEC|CSnYZ1q^gNHd)wzsge4rXN|>ux z=?KgYt-K5=`==>;YM{$azuCC3D!^F-q8TAK;=4gwb=3qR{b+gqKyBjp_J!HSRvE@UX=>ldIJbzl z&cm1;it4h;x#M9NhOfhub&}pMJBtN}uq2V{>0HL4;1`x1y=oMCqDOmZZ;!T!RCi+F z06H^AziCpUL6yV8EK7{>7N9IlmYO=V<(wax*-p^zNZ6iu&tDfb6jN-Ybe_6Rx&hsA z2SxP^I9HighF0|{X`4E@k`SX|L~8V6eu750b!Etd44ge~(_U~Rxh?43yc!-$!ZQz= z6Mp}?Fwesr2b({nUxmn^ghp7ww> zbK9qbzdxJGclXR#rC~@MP9fa|=CAf86{0**|Km+-zkqXC_jo^KjsJx9{K&23qxvL| z0flhbEh!%Dq5k}tT?1~Yhdr_Jgv*FqwPT9NkCjf!+J1BLiz-=0p4ksG6+7U#K{`b#K)SbXXk7dapwK%U z&=XQjHj=r|HS+Lz2DYS5LD1i3)Kx(x~zef*r;cIY=W2DRc?va z_CmsTnaYsqmsN{Y3OCE-^eiV9j^gVpGbay`w>Sz zbR_7Iq<~Lda=D|FKDjne2|lm?7n9e^?r8e@5)(7`H->!7#t6|%6t-v^vX}PuvPdvt z$n~?4NREUYyS+fLQ5cXs&)y*l?VVfoUq#6H=;^xC(9Y)gn_~E_NONK&jONW7S9K(h z=^2eA%^A(>rX#oIYZ-mou@U4jQUo9%SxeqkPLNK#?e0&V9-!zuiRWG-Vp3_WD1Z@S z_6~WE(!z%})(X^?MQmzpS>;Rm+1@j=sAZHe99<&%JstA5{$*as0fUHJuKU{{HDY$`$)Esn;Pi zcI=a)ND*WAa@+1<0tUfuTKG#*Y7y|PUA&a0dP0cx2Et(2?e^Ifm_oMhM)u6plo8fL zGf=P{DeKXT{YjLHd>IPy&wCZ&I8L&NRackcwr_)&mzARsQZR={h4rodnT}&vDukw` zaC9#5@&+gAlqb+TFU10ue>nJOBmKpZ+{pRGCy>DzB5}%~RdlCJV-Zt&AkMekcVJ>Yj3^f%^E=HW72G#!**8*fPaAvvc=Y6*iRojlBD}U?gZhYnS+UalNiJ|1T zU5RHfMBMnd=-#=!#OMk>1Y%@RdI8Q&lhZ0Kts5)IKh8X_X6gnf`W_BG_N?bJ7(TZPFQ*r4BaB>;z`$?fU&@fbIFa^InT97p=f{L)0m)kE6 z79N2Ht(O`NK`Hk=PMaca+w|Lv>BTM+IAwu>bW?iqh9EpqyS;Lvt<>j7g&$*IQUYne3==~_U7EDzpD=%3hTadzn{!J7y6`Xtl) z0PQm8y_{0Lmw8XL+7rfZt&z`##*oRjE>U;6?(gx`Q5$%KxL}*^(z8>^wX%N!~A~lHY0i+7(U?@`TuNeR#}Q&O?1Fb7={wWX1g%{m#wp7QN)ic zfI`F#eomQ*=K+U-6%07eNUgfB^{Vp)&pz!WM4T`&RI^!I)(Xw36n4BWuD2VzZo}mx zM8Lp|Y*SOVl&*uX^-mW75C7YVL?$#qioy&1 z&!{7irR;h=9)QHezz-+ocN*QeP*ql8FSZdc0BQp~FPca~I*X@VltsMv>IjDyf7>Z4 z!hTG6?l2y(C54(gSy5nJwUa)8kcD-0_NO@t224hRQL**1lef3!X=+6%luU8L-$!6_wv?Z!1G)~_bs1# zi~Pcr{S96?w-iLnCW7o`llNT`XEA(|3NJ)PRum$R0|xOrU2c}G3{XYeuLL?nkJb2H zF2yY$e(6bB-XICt!D`{ARnsw&o$K^mGF`_T|8W6|CszVtpBPA_ng^l+Y#Xm!fVaLyBm0JQQC(_reVJS1#C=b3Ut`O9g-C!(1dGDeF^r*%_x_ zbGW*!jes~P@kko4lOV(eNM=j>*xY#ev5Y+6(*kSiMH9vVqi&N_`2%li!{? zew~Ub7&-FlXXAXNh{vte#=6fUfWcQDcQ>|8wDz9OTAZLaWz$%`_&|0yI0PBHA|3mk zdA7pT^f=4K_wwPW#>QD(5XM#>>$X_t`bXYwJ)8ptYu2i^ zdHIExa|aI?A)TDo8fmp%&DZ$@s=8G?MM1s2J+KzfPQLw-t;(8*0c)Tf{v-uvQPJYO zxcJnM2S~J)dF>^RK^Lccqpf?jl9T{JIYT2xjy;>NCr^{{0VlMWPQGOK142jN7lO># zOP8nQF{YfPZR1LTCE&FR=!1zD$xOPO#c_lc+&&0-y1tneO`Lyq-}@XZq4pKV^Oy5k zZsHW5=CG8b@+HTdUF#b5s^|94uQ#3HZZ4)SjeLBh9_^SjWkjiysSxO^?#p??ZfS0p zHkXay-lRUrEt#2BHf1%?e>x0|; zMOf#&&&`GdX922N)koptlL0kTn_B+b{<*?R}2odS`Ni{YLgcP7SW1v8h zhKFe>FS`5b*UqhkDKqx-c~4Sbpg5j0A(S8Pd#BoboJrcEsMML~yh)WI8L<(t0hgAQ ziRZVKkr}J;-Qc2>@Hp^`pr$^s&79bQ^G`Ij6s@&KykB?VA%>BdEgU$-goTI0Z}19L zVCltv1hdE_!7yc?b3k(wr`gf;JA{`PtyXI-gXVmp(U_I6>cBxQuBa$4HR)oFt+v&( z{c8Uf8(Y!ao2zmSg$2yc!otDME(|7#xY>*pA@w zgI0>(x19e#`PETgIA@}5Tk0Z16|G+4fTRbX+a$fbl`P>@SZdDcl8oTPg2v4rFSdsN zGGLDGeI6g@bGcHpaD8lP?81lXy%s+YFo^Q=yH=oSEf4aXN!~{R70UCHfyRY+urAZI zv)%FO%goK1K)`sMa$-=nyAhd8fX^WO8;Urtr3DnP0 zHSj9xcJ#VeM^EQk-+_Rm2rPe=G&tYbEKM*2vK_NiBLccwV7i)^_#PoD>uTh|wD0Xkw$kHb7Bnu~} zyqi>Xu1srQfDJf?1$wn_cvbh3jqr%{eyh7Yc_5-AE9@dmIpY&($oDdrG@iefDrL}Y z>6_%X2YHV5?`$Qa0czdd@3|8@x>v*Q@vyo&(-(R*j0~4I#TOe6JbOz$o0GtgiHi{d z)q-KM-6s2h7^yA=C{zBjs>HXbu)lf!BjN$7?&a!;7LzG!LOq&`)=tAm@Wx;&+H*W= zsvK!5#b&w9+2oSUyAN~;AW#jF;!&H+^uoBu=I0G0Qk@>xL!9SJVG}yx)L8hw_7a+` z2bwh3uUT1nbF5o@eJu?Qy_@+R59dEG1#OmHbG}4CNJRsbtq}CcgV3BgImd&1sdi_r`WkO)9Qdq4nM}VM6y?@XDi73W;EFrsK&8 z)JU?soC&{;!;K<1LksXqmfm+^s7Wc8gwsq9=L@4*#Ib=3QOuL$jr7UcN?U>7oApMpaU4mxX1% zP|Gk8)CMQ`6~FI!|JE7RtP+l~errpB;`;z$^x5^V+I-Fo1;)r4mAPTN&klb$*7dbq zh3Oirn>aY|#>!$3HKj*>(31zeIq`0(T3qfdaoUejhmD+^Kzv>9qzCTCn|T1~g1J}b z=L0KB{x&crt6O7J=flsRDJy3yny1KKtP_=#GbBl7`yOqriBn8Z+5gj~EDJU^KF<_G z({6BCxjZ6QEzy?iz!quGjG`b66IJDr{J4~E%$jg?)XV33V7~B;fiWOd^y5wQ>iq9g zPJv3D61eScW?G|SZ9}UbxBaa+Q~XYohxY3U$j^$3rV71X*|0eq`oeLBikY-;gc&1* zb){-mcBw%bJfz56nzl(Y#dH?GM58*Yrtzow24)Aj&BHs-3n`g2k^=8*Dt2b%S&~3YbWhuFLq#|ktguc4uu+xzM0iVTuaQG=`PKW$C#hz@{g8xUM~+zl zBAcHq&pfn;+S;a^t6EWC2MLZAa%pZNDk(ej65~}QKoZ~VcsIYWb_e1K#m`938%o;t z0CnZy45JG5CY^_2DLBBKqKwW9{$_6KS)$Xz#lCA7lOpKNDul$|&Wz4M9!Aj{;D^PG zVp#U$DCfn0@x*?JsNsa|Y^bQ=wAB}Ij5t-**D+MY{pgT1-0_N-cs>ACBX#Sy;=CED z@x3o)BqSjmtG^l@RVpGLV0;^HHWzSwx5CMNb3^J?I2X8PyF^mWg5YWCU_q7Aiy<#l zRl|(=Tks`HJHfb@=&^u^vNG-`3FWa{q>n@c-hLx@#}o6{w~_}{%|zdR`JU11p4ZYB z>onMB=T2Buv2$^m&#;e9oGmoQO6M@(Ii57j9QvWZ z$GJ}*@^6o9d1ysHK|k~GmRD;m^P(Op+5<|=4?onl0+Zi3ilPaac_ASm_w*CyT+Vm5 z`Xu2IK3={*h^+HJg06#nua5?+j96-&4(1`_)RjfqV4vIpr0%V=q^(euNg}jGC^iZc z>TG?H_uF6thFB%g@YX4>wmmL#gV8B%~Et^=hgj*U~b-3hhV0 zj1lWH`u&mEblCOuzPZMp=1^4Io39})wd{5~gIxpPDYk~!=<}3RuUxC1uZnW*I=E0_<;C9w#SkJYz^qsILHJR#+>H<25eFk>si{r$5Y?`{do~PpR z)vb-TOZaI%#bcF{gt%?Tx>*sMkdkdZqmo1K!EeO3(x+IS#T| zraTCcoBKvq=*sAkqC@X%Hb0@Hs93cQ?qo!Ao1G3`7n);kPJJPOu=sf+QJSLeRk>A%nZS%MjdM5(qGOaEIWogTo-fJ-EBO zI}ERrbAGp8z5Cujx9W9K#SHY+bobu-ll`r=zL!3u%Um8?ddTJCS?AN`nLqxc`DXk> z^CeRB`V+2iYj*i@;6&^OV8#CUTtR1 zc^9gLy+-qUI5_ma`V-{VRPFV{AIqj|$!uS*6kNy{s)J)B9`@#6=Hx&trWtX7z!wOu znQI+(FSHxxole?^fq5S-mBWNw8Hq_P1ah-k4YS|CH2TW_?N6i(7LJWOT;udLR$tKj zi3vUF4~M7f8n7n35+3KtYdSf(_J~Pt)iX6Si%(6E&SkqMUesD&52(i~vEOr?wusG^ zt1UY$=+NN9r)ya-P@gaW=PGU%z`?QOeJG#ANRv;?cb^1j9#pA{LKv!Xj z3N@*39aP14p)gXch7JR)=WzmcF5 zF@mORkynTc(0XbK6nE z=BPjbTJO<8`wvC~Y1S7*dGk@6lRFWLRfu7E%_7p3CyJ#gBuQnx_-^ES(;90|!1uu2PM8_=w1)UnE{0bjWc1_i4%i^7k~v@ zIfb642>|g_=k5p9#glplEns6UAdSdnW^8=o>OR<~AqiD)%W4(sckRv>;H(l52L3(Np#9&nvjHPG~Me`qa<9`~!q4)wXPf7h#pG?X&& zE5~y5*k9tHnUc+G06WOk#(ZrZiPo$@f8&;K13#~xUMpw}J(PCZe$EhPnBOKP7KeRRGQf|nc*uU=kG;HwfUcWS(;|8 z%fjlXr~PI|e{b>4PEKsq^|B-_rwV*E^ zjlmF)D3t<)YaC=e)=|qtD31ri87}5Frt2Xs{QQWdCFr86u2z|KOcF3>0`u~*q(zHc7n@n+mkZ7}w?r%1SeZ?{8N!W_Q_-B< zt1kCjgk||CwmK|hJ&$VJE<5TNg3@y#lx}pN4C<^`6*qd3B+Fn7JYNYa&zLZ#xA;nW zdYv(n=$uKa9UtCnqPoA+Au%UNh#QLUn7z<&tr{y8keOlQ(Zc@9! zLYgARRL{YU2LK?vSjQX)M@IY|jj#J`YpP=@g28^d6q+e(4g2szPO&=57H;3uC+GOiMt4!HX5A16sePo!K z*-G%x^T({^q@_cFr|62A&gL>rF8%PpYDfT+2N+is#$iMG;VP%gUvsFba`9q`EDfSy zvt)M&xkFB}H(mF9niz38afnOO)pcRO1D$Kg9X+pi0i_4>U5o+d@J|PT&U2+``$H@>her7v$z7Df?)Z!g_Ol@8siY%Luf-Ok*~(n2=P;i{d{IVC~9#^wjjY^{AyBB#yy)y&6n zaExQAg*^4!PDQnU)kEW;x0@eC&uHoklO(JvYtN!u_m-ooEQQ}CBF|NI-(92|l#iJX zVWzdaVl_``cSX_5oa^je&e!toxRhVN>sw?ub6J|n>c%ccl7C8Vur&sy+gGM=kFFR6 zMjxdF$B7>5Y{L;w{fI{CJDs7AA2-ay(gYQH*dQxXLw-qcgzBEI8}gB*{1eZ#@OEX% z)4EMw(!G<`fYLMW!#8(yk+1i+6JU6U{0{YnGlTGG$!EET3$<`&Tlb<3KPTv?H8Zm< zucq;W`{clz4Vo^|d-Qukx9G`w5=^Dq`2_g;iHuWb(&qfp<3ZL`Kr)&->J;fdbode% zC-9TEPjc+tiW)6IUrfGO?@BLE^38_x1C;K^nNj+7l@4z#kK@%qxSQ4ofFZ`$d&aHoI8hM`ta>7+{rMz2}~kCSL>!RHj)@UhmOz zzw^UeaXA#aJnnV-)Hhl2?I(Mc8$5CRC7b>izV>=;H}r_;NT_1S1)KQvar_SLDydtB zg%x!qJl=jEzmFFavm+R*L7?qaXLe)M*uLs?N@2;)`zzKYIU|Es=6C1_oGx2yxO6U- zgf<1UtKwdue71o;u#fS%)wQaKVLvNmy205~k^x7|HKk_zo1>bWj!XASV#{y6?^8Pz z^NxHtIBk<@e7GJp&Q7M?iyrN#HeDc45Y|F`_faV3MPSdbiu|#5(~s{&H}eT{FJ8mL z!r&*N#|;*63vQHIYG8y@(*vxBO%}U z(Iw)mBX|$cleqR+?~~SmO=C-(R|eRY2bz#Vi;d=&|L%dc!{?n})$Dgu##hlj6_GkU z>0&{7{RySUh1};Vm^ktVN2|eY=5XuJj+c^537e4S!|siourC z>?h_;KiP`NgV?fA61f1gtqvHw|yU%~)&i=gp>Ixkt*B z#?f-Ku<=&iv0ZzvmRooh)(k+R(Z0KncJQiyXG_{S%5#oZi$4zagQ}7#U`j$L&lj;s z)DWNL#0IhP=ipGGdwaBU|1h)FUQl)8xE7w6RH)w$16oNOZ5(!&FB(+Of_jk2=F)tk zqAo#Qt;TDzOU3BlLUQk_bE@Cg8_aR& zI5~m0UPjQo`IaYPMklyN06jl2FRYH~@3g{lH^+5NR(?9e>HMMead=x6`$wU&(26yEL9B9&bgA3iBCgjabLWqcMdk zzPZ-r+wPKSy^$<84T4!XL5J;pvun?aUO_#pzS!~Mhxe{cjp4x)M!EM@(Ap`Mx$0DV z*L;HM?3_64YOHSV9+~CoEU=Pd;T#)>1&HyXM{!D~h0TQjA z0lYe2{Ok3VF@(|A?s+v8qKt^9J0nRGC&&(h#0y?XyUd*IHMmQa(c$MTVt4yem6I^* zJGZ>F1jz-1E=frb5;^3Ss~7~%NTe(!SCGaKhJfPi&*5thJYT>>Xn|{MfwUZ+#hVjC zjY~<77VrAo?-FgN$ENfaU4m>K$?`V{HYF+tjp!w4>3c2L!k@+Exl*~aBn01hYb0aE znzW^JxlV*~{z_-YIdmwYhm73N`wQutdGxyZ$2RP}f-!|*ikQEg;w<;XQ4xhiD}#AI zwwlO5ZKoVx$#&vF`brhv5>Y9dyJpLIjS{{H$kXWCXjjvE2M8VFYg@;XV&uSF;$|xX zL*Mv#o5)aCaI$kB#{hdY09wP4@%{cUqvu9=)yth9dAkqTiN3;4U39feq!fPHCor=N zT>Ls=tjgOMoj6FHj3_jMGdbK0p1+(8iP z(H;%MVV;tiaYXHJydY23R>Vv#Degb`6NWu5hnu53AcZlb*ykm(i-v)(#`mhKr|ICW zQ%bK9x|Fh?F4%sSaPSjoCvg81ZoWim|S^!l*#% zxPdO9m1qlvygi<=CO+c~u2K8toJD76X03T;?8x?jl9x2yvWhmP)Hf8iUmZR*7nO#!hlfpU;{tjaFc>|<~Lj3LTi z?B1ZP@kdApzbX0h+lEm+7bkoft)J5BKhzV|>e+LDbj;a4OeDOEbpIfI317=|Ov}fQ zWV27}e|1?FO9_g+EqOLU$?G3Aq+C*>y@I&49GJ{-zP(=-=}K@b41?jersk6-gv^JM zOtgtDH?$>qh(lddCQaY=DulrdBtP4xOe&g;;zfXN@6x2!Ve5mW#kAwWQKg5K*KP)i zijr?|5OaY3S4wtKjtEYrRc`s1ahig%c|Hp^P6C-sz{e(3fy|rKmrT_H4=Z+l5qxaS zk#Ez}8yfWMe#R{Gqw?;0@+&H`8F=E!4x2`HSLXC34OnG-q$i)WV=8I7jeCujq~o4t zyn<+8c@Xj;Wf)TN*xC{E(Mq8qkw8ATtLyE4laPc~wU{QSkhoi?$jp>9zC0#xW@{x> zfOs<`9B|VKPTq`wtpsx6Bn0=Z6oJv@=~Jb!)nQ_!4JXSf%q(GHs)OvMW3`rE%d6i{ z$pxKjOQCuK_{p`l`X@Q#^CPx4X;3`*pSZ8L>jk^t)t{TI|BxYs6%Ylp=bjqoZr0_~TaSaX{hm&Fscj!igm5rs&+pDCDr+oUUpu}( zs5*pqUsWwAr{O4CLK~dnrF!%+)S##r)Bi$KQTRToNNdS`ro0u3%c+PIcey^gPhcMi z9b}u%lcfZ)qC+4)Z60d6(RaO<{;ZM&%SM66V`o%3kC>y$b|f&8_R7GTrk2-*p(YZ~ZhRGfwGhEZA`=ULx`BGvA|WRh6@o3(1$`FL z!P4(NSR)3or<0#+U<{Pl-|K{Xc`-GxSDgjwI5$m*L3}4*LQqT zEt0g7)X2#bMbOVj)sCvmbE>A2u#erTVr*{jbOEi z*UfheXT2a{0%JdzeRbLn{Z3qhcc_h_C{b&gqdES4p{s|05a^&fIe6RLOvs%ZpiH*!;8(tf3q6hsSu=txNB{|Z{ zb*60@e(p@2FfnGcVMPblyhz0(TpXZIkn(LndHnS+#h$*_P%OulGG>8((!NU)j(=`R z)bsP~q^+kc&O@8VrP{<7E%HXUvs_p|L5Lsb7p4kA+i7v=>PREPRvjP-N(FgC#yl}} zVZ_n3-WCQHR^Vhc-uIGbXEQ0?{$xUd-JWZbU3CmkqMBND7T-n;uI#&QXB}L~-YCrV z21*S;hgc?Woewf5;;SUH=ISlTrTUM3d^{0JUcK)Acp)B5`hG~_k9G+EB8n{ox` z=9IYVY6l*aY{bSjja47V-@oKaA;=K^1>(N?$SmQJ8AStHX-ut{{bV^+wU&p(c zbcwPA8!LTtAJd;SAXYX%0&}40*;lZ5*EhF^Jc2+r%-jmImym+*!%^37I@iOZ7J`&X zP&ZdTzbJ5R+5Vn*ADcL|3P+1*{jG$=W+U1lKEsd)^TnhpXs_@gFR<; zjjHQD^}~R(^@h6x(;RsSPWf;glD7I|`ElXI?`VG6KN#IYxPZMfFlqY;67SD@%Mx72!clJMQ_@j0v4RTnnvuVB_ zB7p&%{r`5n0w)(jC+6h zjW@FYA;LMYkBnyWM@15srpfk6ReRAdmy~)NvAZm2)2)j!;;6-EU=K0dq^{rtVFJO$ zWhuk^VXS?et_O#OhK>-P!4_LcH0*nzg;T3X^V9dxx1dj|Q|KIV5%=XWHq!Eev=KkD z*FV#TG4fwMsdK89vm@zG zlvtm;Vm$XcB}R4kHsmIf!KtICpRj1#ta%Xtf;9FSz5`W&(_9g*`|tLh*si07w{~tC zARu9*3IU2wf$29>-x8crebTd;#}Dt$@~C8>_A`MV!*ZZcpCWp-OJXcjVwjxlm|kbN zFe1g^#A`rJlYKM%yUJG<5k)>bqCTu(_SEh{ z+gsMi7mtoO?IG$NorsiT((U)j9|@W+-jIX3jXtsqa4~UzAk403tQh&dP??5kOifA# zs1@O;fl@i568jZgGd&TSCr6Qtc#4O#{jOPR{-)>n3Fd{11p~TY4-Zk{WTNJ?XeCy7 zc&{O=XgJoaxH#&4WP4)tTbe&e%qAr#|AyzqA)KW+_urmI3}kD|m|6*ZUR!V$RA*3e zy{hV6F}6ntZlm-4w4mqU#;2sWSGD{t`CE{i3RiP=f%!){7a1d!FA`;Z&ilpV(?_6` zHseLpA(|*gNzxjbms&E-`-c9O7Y;H3p&sQf>_wE_8te7VK(nP0ElOM%HDsiY+zafB z`+g=+FmvKYNv3E``6%<5f<$ASCJj!OT36M`DIpYxLfmxO`qdk zWNJ43ck{BOSKQG*lB-Wt%oS-T77uG2-4U-2wq*m({WmXp9kQM3W)GWh%Qho2KG$U4 zv&5)ryQ_AzvZlhm@AOWZF5lx^n?3kgIo@k9Wr{(1^mdq7EEDQC(=>G$b0b?jY^Ktk zv8e!VsM{*fW^l;uD}(Eq@kjDuu&EVUH9Lcil>FPa&htx|b37dR`)@Z^L)1*tg0HAp zCppY=?P}PQHvI_?F9wvI2nWyPu^=}~_e8D2xmQR?z^6t0>KVRqA7t!`yTabs5RRc2ln)=j#nD`Ljh2ZEci>srUZabR zPmO|=+7UubXUfc5k6qQ#XUKi{Cf#jk<~<8qHL&+ZL}`2>YbUkfne*iYjr!Nrf=L)y zTJ@GZquX?~TDHhenkROfk~HREB4un86sI`Kp6$x`K`~-^rRbFAE}yQKeXNg%NS^r) zcavbmNBy%jT`@Ee@_cL#OV*ruOVNz9zWA9T{qRrO;quC%P$NvIh?O@9&Fs1C4)HQd zTr#AwZIdHu7yVOWfyRyj;qHx8Jbbt~?pJFCGbN38lrPNJE2i}%jHQ1`it?{tzU)IA zkJ-$=P8-4p)4T0ztXT!Yx;NNUEUIQJhVug}t;JJi=_-UE^*LMvxDh`&@zz=Cgqe$x zeI?&TS2EGKcZv%iXDETID^yvYI2Xy+zOfKbKnAX}4A1SSmg3e7)84xIl~qbg!)k*OmB&Zj7BRrHDtA zS5}w4YT%y3ukV>|nIE!R*Dz0cl}b*Qie(Z=C*(mUVlz?6xsVB&#iMMKo6Yz7;Vu@*BnS`0s`CxNULhi5HVPAnUKK&8Prwo6~2J_YHn$d_)+dXV+gY2 zElUi3A&9-{mvP3h-j8mjU9I!$f5I=rzNC#>fIdTp1I;Hl0%1~BDf>E~!U7cXJ7x(N z$S(KHPZAv=bz5h@A!5{>BQteY{2Q^{FH^TAyuf8#)2FS;h>ZGz-ofDE>4a@Pp?8B+ zeULw;Bl4HT@SA+z)>`!MFn2AKk{$f$||G)r8<3q|k;rl$px2L8T zaO;Ol1*vB#CM}-rHA>^m!7sKb9`LOb(pRPB24(F1CY_$UXv22{fugGBW9mqi3;@fj z)a>Nc7UOxSl}7H`4G2!>oE$`%u>NB%v8<+Q=ct}{|arzl?I^*z!QCDT& zQ~?%SI^wm|pRgCh5XE+%HiV6{Z4sI)yOG^t&Ny(A|W|LX+nui%Ee`b47d<`+{9n`_fl$=Vwzm z`TMtt0J1FdDLz(hPI&|Ao~gvUinwW&VzFnQr{8?K3{1TM+MLuxwNq&e_sgcMdg#_n zD9c0l{@rcpzmFHjk!LT#fC-*Bu zQCwWvDcN9+_}#t{sQf@t*EZ-MTo}O!D=Mx&Vv7yVMEf+IAq?qu zhm3+P^)MK1+zY>(07XS&5Muc{(~1N~o_bG~3LlgauNxW2m!rThPL=;qeTcO50LQ)6 z5C=5HC^unt362Gw@jzoG_w30vh&;8Wz@w5isAhz)_&Wpc^f5Q(;R{{oOKFWS&$~{| zZ`w=PA-KkV6P7(DVMB~VA~#bKP@~MF?uWbg%|@D@CFG~0_$eOO+Mn8w@1B4*EO|0% zd+9CP+>zo(0Z*O?OCq&ZCuNdNecczU3YDs^bm{te|f1Y4TqhatT7)de|uH5S{0a0sLxRT!7C%lh|nw7#qUDVtBp;kN-bj+Cu1(ueKx zW66uGw34m0@RO3M8RF}C0SXip3k4pE1Zk0!us%9oz6mV83%ej8b=;>q*cjU(M&4-9 zipO6=Ned0B)YYX9T$;djSOq55JZrdUF zV*Ys@BCQh!>s}EU#gCM7>e}&24%4_LmJEYos6?swsY0O3Nd;gIPhy~Qi~?`W5S87r>$1)JaDTxMWeXVJgl z3t4VuDze)>rGhr!bvybt=6H63r3A;Ku=kvWPvAikm7}Kt)R5OFg`bfl%{C5Au{i*7r(nYneEl`E+l0wPOFyc}$_eC0>6C@7Z5-&h}Jm$R?)c7hAiDYL0K8ru9U z++stXcYdKRP06pw)WBS#`-^|NPyi=|cCGdpnVGp!lVZur$P5e&1qi(pj|>#U{_cHz zyU0D}Xj7W>M;=19n0`$Q<;e6ee!isFh}9bz_uy*cMokfvAeCc--^OeL&j-5FUzHoa ze?KsAn>crX=G$6^Yz00mp@{oJL3zS#e%BvJVMbs6L8k1{D=P!tA;EF{UVB?jp3*#I znu^+%@Yx~)bUXI1WRX%i$csa--_G|U)KM%%wRm0O-lv>i^A_NJ$A;>z5d|2mw=czg z9(#(%)r$$ad}{`lgoF&6dLCzAb)cK^NJBz&tUcE`N(vHT(MqgWgx;MRMJ0<5X)s#* zO($?=7TG89-1kE%#_#*s>hjfHx2=)pU~HRve>@hkKL>{O04-S$GI$1m*CtBS<>z?VHzh}HldN}uHNs{bWerUg52_^@* zoepqb*1s!rtW#rTW9=_1O6+4vZgtrE&c#>Mi<>!`A7sGesG)n%ONG0)bEtT6V}|H)-(-x_Et2 z2ZtiBosnIOSDmHOGBVnTiJD32C$-_j_F>ldvD;UHceta+c))9d%uN`r*#6~e=dQYp+v+<)}yK~}3o^$=k&?SE-N zsSZdS2wF9CbAGn?JI{o5+54*DtmSK&ck`)pQ*jQPr1z<=;hV+}1A|;%`K z8bJA@piDjSX*ry&k?pc7_&Q?&wkNGQ4Snpw<9X}s-C!CxRP#e3TRJD#sGq~7)A-4^ zJ%bjHol16od}Qn5dWQUJ`sc94E8v!i7&dPZ-X$HD$cLjt%hG23123!6S)i6F`|c04 zrVMq?>Qe9)u?PsUm6AL@>KCVu67+s}QaEn6c9f2=LT>?Mi;9XVhiV73AKNNNss*c) zlBr*1J~Zgz#S|790l4X|R(=Z_07umEcYTnT&0300ER~PgXG7_f_>xC8)@7iV+XvcT zhQq{i*&fzQA7;{6DeR8}@%Q5e7Ni+Z6DeeN`=TB|H9{&KDofy`O&pZ@LrKw@hV0#jni+^{Pe z7QwcIyulG050qEzsnYviY`Xt%ac55=^-guS?fkmZEbB&?R~2%tfeo2a@E6{ z?1P7$+0CT)zUp8qH)3*NT0LD3dwC`b1mvr00S{u3MI zX7h5ITsAFSGch|2COobZx(9a1i9@qKU+;6m3hSm7U8K3EaEFyPKrrRY{Lg-@+eK26 zJfpzTM!4-m51VR^FLb?59f9l`J$1{i5|C3(dXV+LAsjY6<88id$dyT*Y9|lRKe5|P zvTmw#n{I$qn!Mv> zVI?7Lof?lJ-;zD|lIJr1#6+$Lx7)elm@opQiE{CHuy*z?wCkt=RA2Sqb*7DvB?@7Q zO1p{Lygs~JI0S>iMe}wB1}DvT=iamD&mZ&oiHLR~_l6#VV95REYu}9xPxpD!ugXNJ z&|(z>q6sr&msBGEs%e-$S2)zQZaOk53p4EJ2WJ-2xH@-Hog@6>An&u*6Ll`%LG`dd zX2$99-`TF5E=L=MQ&?DdB59#wUI&L97H2Pw9Dp&Gwkww|AJ!jkCwUOaMdYEk-1hOF zqdiJ>Q~_-|1IFV6VQ8K@_k$e1u)<_Y zs~*08;N4Zg$XM2(4mGJM^x3j9; z?{xA1i%y=W2wK^iif>y!s>LaJwC4|y8(DcIAbh zp0X4T+BWA+d)$OvpAl2VFwTVQ6LoPm2}5|2LYJ?nhPgDC*UmVJM z+4`L-C8qJhgX4e_z!3J|W$nJP>3MqE)D}=*q_V41^K2q8ih=Nkt;JvPLh z7rnbHS1xzIL_O@`3!$mQfc?1tJF9^f1?Q{igz)LT1hz|ScS`Y_D8XBFL`nN%rUes& zC6^C?00euRy1EA1k}Qj-o3M`bvzxON63gQYgCcWs)mroDgK)#~@{_n>ky7mo?s4mW z6}m{C%uO+6ab=>|cd`1#Dzglw!pP%8w$GQ0f2muj|ISxdR#vy-LpO7CNpneiuXkRMz+v(gA%$~5lP>cdaVp7F6AMimgN6B+KzEb(9& z;UplgCM)>&c}oH9;-%4lNWH7S5l? zK1OLdz`1xs3&`Vg)dZAU>lLdY-~e~FFoE50Nt#C1RtFGp9rZYIV8Wef;O`vtoe7JD zZz_o!U^HI*;7Cx53WQmdHl|{}FBi%Dz0h;S_hoVItvcW%$^N=+Cs|ER^W`?qMVI{n zP906_Re~%QXFv0{l70J6M6VOVr<;-XP=H$5T`GY&Kc`gMu5050dCE`z`d*1K! zyTJSf!W70>WVYNU}DxJsxavFkzDco zUFT6&TOZ~SH9~&rq8{@|Z#yJJ6^$IqdxnGn5$3GWlB;;^)0DDF%x_(OGF>JRakXvt ze~#K&{&zA`sSV&dm$V*p0apJlia6wx5*_pvM!A~LkHRN7INNF>xa(3PtY}2bf8-Xc zAN>XSy7UrU`mh6h|I)Z6@p|ViUl*dJTVJ!e602tpJWJdA@0K zANVWq_2`}dKVg{v4}j8V?(@JU(ab7v)lEvHs1g2$^d|FFJUP)Qm`AiF=t&A~q za+^zL$hP(ks*A)@8^*t94w1$H?m}3e+F!{S%2sttqdcx9GqC=OE-CxfF&{vmgY#}a z|8GV7`9$jbNXp!ij98~(rf24brnafHy&1GgA&spq`=2OK^pgHQdf>dTP%-+Lh&78Q z)I6CkyX4f-T}Pf+{rH$0R^dStW9}p%m7K&a#>}sbAJ~wh*58zQio*MU!&2k+IDnHz z6@b=`_)izgO!nCP_0IrCO(`2%BPEoL*fy5}EIvrzQ`uoLR|iLF8Emyk|Mz~5q{OmW zuZ==Cxs%2l!RibKOK0H1giYt_*_?ucX$z*9-n}h#6up4|b)C6sls(rAKYjF=iQi<9 zl zlgR+>(M$KInJt9?znz!JE59I7A~^Y5+g&<}Z0!30a|wDbejeg}?1+V({QP3a1c^0+ zx~aXRb`J$=L{&j~c4w0t9>?#?ZRxcBM6DR7&no59&Q$6Qrrg%0)^nTXMFN&h1C&ba z?Bj8bB{Y$dXoJ!NH>>I(++MTY#CdS_k+Ty$7rqqXfgUq=G8TF%1CI;Zw8LrZ8^r~WdE-b7$hrRGxXJHYPxD!63zN7G_j z?noK(XqvU1=-+rKF|+<;ooClAy`bJmlfFEkzJe?vyRs z@UyLRJwf83Nt4nLI%#cu)V>K1Q`Y}?`1Eeq?uo_2-8u{jaduSf2_=a0VvXnbsHiT^ z>xD8bYdE;|#}PCJguN++mt#cWk~huq5|P(=v>k8AU!I7V{X9I4s5Sc{aOn}?OGV|e zxw1aI%-}gV8CGl|M6CXfHHO=%Fq($NB_9fE)gX~|a;}wTlxG4D-*!L*BBD2Mn&Lxt zNl^!rtsKiB5?cqkX`u@Uk2br9`c$#};ndVXuH%KzxeW#Te3EraHa7>Myy$o}U1mC_ z&IFK>9RGt&&ElD%ggk36JCCvE-`?q>*ALSTr$^wCTbZNgdO6`aluuu=#Ur9!V9}8I zSK~V>h3hKL4fFHWhBN}ySHyj5gvj3F3VB%i@hio&3FNV z57dn+YW$gkU&+MeE84NQ+imweq0DMYpO!{R8>%|YG3X>zTxy*j&xJ>JLvT;zx|C*n zPR!`yN{xNf`%RZkV*EHqBl_jy9UENO8{#bRF>j$r8slhg9n2I9qH@K7&$#pg^ z@0`|)s-R3vIkfr9tzRVuHzxeGk^&vUX_g6|2=^78#YfI#>Akk(Psjp=(N#aC>5QvDGHdk8?3Rq@5?D(M2WOkV?8hz|a&VPKP)ZOHDceiTC-_ zhE2mRUu*3&^Fs`xnZ|_T2z=;COo9z~NRKNA-nk-24}=v{^5ncbdJjh%8fr$0~P0m8(Mfk>z1o#|f(? z>-Y}n#Rs(<3X^iHj6ve;R6P8wJmk`V;-2yCt~uGY=06?fLBq5-!ffb>De(l1PFPWl z`zbEn>Vky3wF8(df3FZLg%yBr^S&MfYt!c0}vi{GysZ-Ok5C z^ZbO4%+s?5rySnvUed6$g)^S_a1#;^Nf&XRRiy<?VK{T|QKBqnRXib_J50w?3-T6i@53vQt~-^>8= zqt2sLQmj4*(`LaCKM*E9WhFMYl1Y_>j#NlN5_7DbgO`T&iTq(i{*>~J5g1fd8TwVN zN+^1qy#=SjbdQ^fmtPO%enD@mx_kb_f@*NbE2rmSuyU;z!K^S%6w&6e=xWP$sPkHT z+j?h*XkX*1;p(=uRc_l6yGKF<8$InZ$Tf{A#1G52)K5FE9oIWdrw|E14$`h8LoGOAd5QHUC*GPa)my`YGO z%{;d71i4K9&@I+hcPf3VECN{ks=?MD$qQ7uJ!`qB` zXFZP3F#;%*c6DCYNMc<$JtOqrl?Ze8u<1+dwmuo#%6n+{i;6*4<>Z){_A;kWy;NCE zBYl&~=X5-lNSsHGF@QTg?|yK~-D}E-29neUqlrL;lvK-SJOy^_a+&#EI5oyAzu`2i z0Ts5w;+g|j{s1;!3(}6L`+ZwP_T$EBwUr2`ug?J`f)P6tCva*k zn@Zud1-N`pWk8jkgJZueQ^D021V27Gsc^KY#i`H9PvnVwK6_^l5z(e;VUIsAoOAtuLW| z)ilYezut3uU38?&U9}WpRhE`U|~2@8XT8 zF-$4D<*^;jv$R)G3sY|nmMYcIQb9$H4c$Q3?3Af!3{ZIW2$^BtZRm8tsB;o}m z*+;pXMexRzV07Fbh8$QI>d=w?&Y(E-=3-*o@b?W)Id~;Z75P15;Mq5d$QX7US6RNz zpbKpTPh{eoH3m+txS#a)k(V}o>2s7R^?Wn7`3%hCqa^uSTT!&8(^*Ojc3G}oVx>OAI2pG<~s8GgR9AUh`D+7$I zY@ty)L-l3;$>yWssDjssdomzm_`rMAIOWGBbcE9D(i<{Z_@>7&6agrc>UqknPXv=+H;l+SpV* zUMEPS#x?PJASLYd*U#m*k z+;SPP^Bt3mt8F0B|5Sw+7%_e+)P|E&5vi^IF#13e~hMzff=wNYzKGCHC;g? zue_I1Q?HvaNqONNm-=55zb9Ed;~hnUK;_Wu0f=P$I!#<_QG zh@$+0^Lz^OCphxz`7w{nkB7Tkv!i7awrUmQ<$9l}E;f<9vtw^Q8WTAFMreiJ>VA@+ zIXTlnqnN%-VjVtLS-bm^eBn@CbR*aAcJ@#h*1j|ID-JTVI8XfHihXBlv3{}qpzQ@y zZh}yt3p=5)$m7x1+@vy~)^$Bpk8fY+jBqxgY)ck{s3qKz7+S90Z}aIYGRiXwo6grB zU7idL!at{wJuAgA98WhneA3^$PisF?=Kb!6^4&LeTys*8d|jVJtDIgU{X9B=GsGkT z_Uyu^=8}_R*}|#SeZ#qwN4dhB8uPRU-g=T4Wm=}>)E4n z@+VxuB4FnHP;Majky*Nr5r&_dj z6N9n63p%uG%kQ`FE;8$;g$gCo3OVHIr|^3zF+#qXGG!JTD@jAXaENC~Q8xJaRQTtGYc8O6T=7om z1b5A2SxTh?TgL#Q<%EBf8|dPsH%4ED#laMg)qLoKK4Zlii;q_-85!^?d9}RXSd5#N zL#QkdbNJ)KXo*9a2*U6=WG7*4*z)uQRQ0mYqh9YdnwMI;Hw{zZZrd$Q-0oAXl5uK% zNG`#Kwcn%C-||w6EO=8WE-GxU8#H|b3Y~`Rk&!dq2_DhRojXy41-MNMvxq0(l=yzn zl5gQBhg!;x@uHV1m~HKZcM=eM2`Vy$_`t6nY?Xf|{v%B=D2h|ne)$38|03-xqvBe+ zZ8>oWgy0ULad)=_8n@u??(P;sa0?zhNJDUUcX#*T?rz<0lbrYNcgMKn{kiprZn}H# z+GVR&t-0o$ZHeemOJR>kt*Ahm-~Z`IN*iOn*Di#!Fn0GPuD>B}El}ipbx6CHI}Q19&f_#nrm*tM@~b?nm)HvX0BuoBn>nPj>jc z)A&}~1Xf_^(U?mIkoZtj$wn|F_Mj>E!3eX-xlO^ikIW=xPTPz;#GfBuVT)sQk~HdP z9yIY`luiYy24Py>Mf1D+R~4bt<8MJhdDixa8Y*#;)~c0a_YiCpak4rUaYxeZ7=<%b z6gx7^;nsYQe8i}+jj2)f25u)s+&u#s+ABOZvDfBvQgWNPHmWw4NV4Fst*B8sl#-!N zT)h0ujB9VZ&hA_y*Wd9hhY&Ql)(Zk?;P*jd@kW^sA3vo@G8Ak2 z#lLxnh%9~6eyY?HIG0A`_~-uUrRs#rkqaYvq==gp;>av zt%mw91hc8IrWTvZ8=$!yU4#W}*dA|6&fl6~5`N!&QITtJvjlCTxv*fH(z#JxpHJ03 za;Vh|V#kZ>BYq_$hic(4Vg5!tvWX%V&zUYQ2rYPPDu7kfukNTX)G2l!Yu@M3-Dig9 zI4AxUX393#sr*7mcs2)7ray_|dPD#Smus7X&bEG_HY!+5jF_bhl{splevYIWV8E+~ z7|mH~J2_LhBIf0j2M4Hn-ZrkomGYF)X63sdZH}BT3LQx+&F~Oj29(hPbZeF6Wv!Ys z2rRFFoFeKS$X(+x%%T6YSYC1JG3PEFJ{{Xe=r#GTGycFBYUCd@E1|Nc;8z{ZHCu;pJ3`pjXaY>x2d*%#(0{-Q=PT0eHl{;E77894Zs!Ltr_caX{&H_JCt zJ{;L&9XhWkCnq!D3gh<>Qc!;v#fR{qy8wKaXr)Mb!?gOI%MAFkExf^^Z;s zJTJhqv76pgFxgCR^x_zG@Tgxi#fc)70LuyYp$AytkV%5&`}UBN({Q1`?Oi_W2^Zwn z-~ODj;CN;8uw(qGXK+L8elzW30LJ0b{MHtqb~2OgIY0*2b!pFwn%1|FmJl2?XiV~Q z!dX=B`-bhjDQBugE>=zy`hZ3nz0DXpR~CF`FEjXbnG+=rI{|kniO(b9CE31C?IEYd z=4y4nh|awR$FpE)TA7#0dG|QW5sycinZiQj{OXG*=grkIUhGFW>N;g|iR^&1Ckg^- zFRElOI1LD#e_?aSP3KO#YkS??e3appyeu%ISAq5t6+RJvbq+m|M)N!p^0fVUa_c)) z@hbqLB+G`PC)5Q*U)ZcBflLS>@ z?)85fE^h<6#NjSln{+*X@O-XnEEh>X=B$%4=3|Jw7@QjJ{MPN7s!2-QGQmIRT;8Z& ze;inK&_oD(VMYwXit6h{qk3E~Zx6ZWmAu{rHqU5?Uq6C_=iWq3ktfDWj4D1y5!du) zP-H85q5pO@DF;mslwr8#lE+o<2wO3A17$AK+s6n}uM-?ccDh}Uy)Bx0%LR}jWYmrA zvoD9|w6nldv!Kmck|S(fZ<2yCpCI;?g@jArJc^xPV@NK|oexF$i{|W%g*)mT!c%V5 z=MEESE@m?lUl2Cc3Z|=OjfurdkQ!3|B4LRS0_V#+o~nJ)bX|-~6btE9Qg&Yn)D2`( zOfkjvDdH*NImzNrnKC0e6YU6o;lI(CXWXZDq%Z0@#@J|Ew?Gw#acJTV9iKq)Wic7OvQ$OAx;JzLohqm%GC1Nw(<1Xbk22|SY zU3x>BCQ1k|k2KhSprPaekpALt1->ze?zB0i!M&|wv{AiDVzS10mDAPp*Fn8uneP>} z82Nq3aSd{U5|mZw0w=3Xl~Ae&a>R zj|xm2IF`mDzWl0K=NQq}_W@A2-W@psuauTB+!Vh2z>coS zmNR7|ITc9+joGgFb^4I5KPKHiU!&Tf43A`RXCVXrR3Csh)pX<*#!UA^O({6#*xDFTQx62zF`8R_WWm0AK1eqQ;R88wYUy)P^v`=%FBFkOLA}0 zxh=H_p()e>IA{YXaU_fMJgo}+BeP-w}=#~D&2T# zl4TkZl*DwbmqgGvl{avU0Mc2%>htP{Dk2otsoZlHa#6O6we`$jgFxe`zGB)v8hp;z z<4&8u6XPEcO2bMY&dMw-9@;__28T}a4t6au8Vn&UMf-m`ajjl8DG4_Rx(B<>N z54TZhO&*uyL8G>7h6+%!34`ZC#GvZIbH-G9qCMNXe+Ezunh}FN7Tr+P>EV%(q^awE z9{xkw93g3NR6W5K-*~~s&4>yDCG=EHYjO1MI*x-WdC4KYN(n17yc`EfK0$`4O+SX< zbd~s5vPs1ukf5JH_)Pb0aOQ`BkmCK_$_K_(b#6Kv^M(*6M3NAm`s(M-xOAfeZe6)k z_^fHv4k_IEVD9Z@E25fc%mI5*S@%Yo7WLVzqL)=#p_mlnsxm{yLR6`25?B!)5(&-& z5*V8!hU7jw12&2m%G(F2=qOQBW|mf^Y87K+t6Z=!=EQOI@Ss{RyQB}GU=EbL-B@y* zw>q5a*#i7Oqq64ZPtd%n@ib~xnEY%rmDMGDn0Jd;Z|mR}htg!DOO+WrTdt123x3_+ zDeGVSsCp!i=b!0EpZ>n0D^a}C^kUlZIzH`r&$Aw?+ zkPht&&N}_x<3cxjF4Ew+_9Y?b-g@zE)NlUDT9MfGliFE5os+9L!XmwrnD#8c$1E0v zGH~c=Mu%2+xYUbd&1ML@A{P}i`zQxyKc;0lZbtp)?^(#gbCqQ=HX@$i7@3btOC(gN z)X7_tIBY)K5ae9NmNjMbdb!LKz&Aq+WZZx?OrxIMEgFiOf#GYW*P;-h~wq* zoYU(2kCtp5Wuec%;SdC<1t+K@*EWho$hQ%>3=0PZ87&P*dwEC{_T4o2ApmIpcZPkN z>27q~*Lhixw<~>{iO^jRFI*hSdGoghm6b^!nBxi+!+XxOOB~Gh6;Fl*Yr9Ve7BquY zR2?qMSVXUBD_d1p=27b$X?9u`c3UJnaruy}WZg{Yn4ytYY6Zc`InNuOQJgmG;rcqclB8b!_R(&|;Ii>7@hj1(xr`|HT3XYFHQ$bVNlR zAp=SSrAk$rob8v5?pAgp&%2lG>&fT&Q3;RCh{*L{XiTk!iq0MpExswNTEESi;d9fj zonGdfb8spT3<|24=C{i+%18;mBs41;aenve-g-zj@&o7oNF{sywB@-d;l3s3eS6yJ z(f)O}iBQ&K#@KCFW&yOf@A=Wta5CY>pXDP~;J13j5a8d+<3kV!9G&NN%Il)+<(9T#`33*~Q!YbZny zvl=e7gKOwgf!*1-TQ6xh=IyG3qBh))0G4haopo(22JeHeNCB7_?wiuLWHEiPZDg3M zzW&-qFxu;Ptcy)E_n&$Kp?P^LH#*)!hVw`?C>C6lp^+cr#i1pv^j2+21+r-+ z(^dX1n9AS3VLX%UR`s~kFQOhmKp_dzKP8XPd7ExYt!Zdm#e2R+tfuS;Qhtv_i!!#G za7JN=p$SlCWpcTgPJh^Xw|FJd)xTX+C_Y8OpjdEztvzkoHZ^(G?(2V!3bv~m9Bof3 zh)65o29gn{;~3P0_bFyBDU}zm$FyfwgMtR7v9!(A^|+$$X9r5~HFker+hp%p^WJ-A z#Ye?0wyD%d(C}U>8(H7YQirFgEZ?0;($r)hEmG`HyP<#S5jGO`Pnk&s;YW1ppXT@D z<~kHTlTEOg8KQoE^2Te{&C1g9!2~w6oz8!aj>31jG52_X_4vpEBu#Bsoy(>#98Ft& zMdml9$i&j|v}?e7hL_u|zYFCLFmh5ddf|84NmW-OtHO-fvzuhh>lMJ@lo$NMg7RjJ z$8NKnceKV;L6ZC+9ZHK5RV?ar@;G?HXjjNP8flA!iGwJ}USJFab@q21MP@E9XG$Pj z8e&GW&t9vMfi6pZ>J3!i-6?#6 zX*y*!4AHzieu3HGSlC7ctRs-@vZn5W`f<5 zyjKmkw^KG9U)g63YO%zhCTfNp4O>8K9a_#1J}9Iy@@3uUUFapNjGS*{SfGE}LCxi8 zHRPRj?MlTPxayAc5x!)f^L?M|YX#rdk;g@>f@|d>Zwfe9%8m{a%+R_zx82;#=ix{q z2I7>g6-9^7C|ggyuAl2jtu*nuoEuvQpKeg)?doo5_{f6u_EXDdd=&3&eDZd*1?y%m zX{x*C=+TDa}W9 z_5z9M+N<}LIAqB(0~$+sv3l5P+hN_Qyz?9foYiPn@tOf-inD2YYy~~EbeKsfCTH;i z>r<1C?L@?pDj<-JspWqTH;0=jlS!s5bpUrB#g8!L??D)f4ZYaSO)eUunZ{&K2zA6^TkE>{5d& z+-avb#c^{!`~%?Dm^e5%czNZOx9k(Fx*SR17>}{Mp_0Oq570bC^I_A@9~Px}J9CA+ zti25bok{9^sSywBHCy!!kms*cbf7Q2==shsTOuBBE(ben*K-A0X3fwE9gG#kspE#H zO7imKrG_C~%I{r$x49yWfEbj0L9C^++Y1Lj`pH6KH9xD;AE=2-G%B~{DTYN4K^Smv z<-K!d49u#ST9QNib~W`T-}Y5ssfigKDH!>O-hAx=GxAW+-01wltXf9q<$Yx2d>p)W zAR{XnN<)H6W=NERo?H?E0v86Nk(MqRaO|Jhu?J;dOXrRlc8id}PUzTh>A37WPj4BR z8(URh%rHRjH5V~&Y+!)UQjfHitfh;`DoLAZ>`hp7QVf;@tI|+5)%lJ_^uSpd8OYu5 z*@5XFc%_GCgEvX?(9x0x8=AIJwKWK&k27stQGQ^~g7Hu5^B>8Quql-m03Hm5q~CLB z+uS;Hyw*kQeg2rePev!YkwMHCqc=qE_S0wY+MB}$O^cGjL_$L19pQ4fbGvAG+lM!= zh*OiZz7T6o%-H1)b(SLTl7@UG)qC~)3&Ec(2}?giX19uafD++0xx|MA&_61JELp== zytjSmob(Al&Z-|C*Oa85Z^d$_TA8q0jD8oT!wiL;ra$ZgQUfCo7qWbASA)(RCVs}o z?R7Yan3tEE%)CAD&ln21rt#noKDaVHhihf89dmLpr#=BTZx>}*qHJDJnu(K> zUO=(lBK>hNH<_Nr8n zQB^0_g#7C(xdtQwxIk^$!G@B5sIf`EB>1%=}BI@tqbRxm%7&zPLES6 zKAbEp3JMC3smGoSK2v=$JsPs9i_JOzSU%I5n6%~eIxc4CFmc;5kU!7pQhMqZc5FxJ zK>}xTICg+4W*?CCV~O$v6h7Gjbf93z7CIxwQzPD26J%s$3jlh4i2*khP*8e5*4w+& z+iMD?u4zDA#q|XL8dKvdpk1CcO1w}qVWezjtXO%JF?Re`F$c*pR*n|*xit|qihE=c z=s0=C6owlq3O!wrSEzVY5D-SpF?<2{h3-$b6CsLPe9IMw53mfLjZ^S@|18r3TI)o$ zbion^Ed4c0MR2u5(gv<+I@q>=wGGna>KVUD&S5c;HW@b0GaP%w4zTk)3I%tn6#>$N z-Zv!@jHZ@W2AuRYz8U2b+_oQX+wQ;SE?#ubiMmPv4~hM^(|Ru)0R;BVTqNIl|3G?B z*BW1qO+kKA%cl?TCs~V1N(7RJwivL4PsIlGwY| zgp0xKCjjZ}`P8q!QGm>>o5Phm>Ex;Y^M}dF$r;$yv5}f~^Bg2yv-u)s;8ya$`5yXs z58&8aLnI_qA&?*XuCFI1b_Z{;E!cO>)Dnz9{bAwd^1;Ps>bx@9B_ej=1Oe0#bTcnjtR zXh(^;1J$tMJLsyR4O!bE zN`ZxHsJ}~m{%LJmngL>F*=6PL%Pn`WB=wPB6)4MxR9udnE~4i#vb%|h20uzHjKf8y zO-VufU0CI-IMvx;bNH3I+Y_iDj@-ljsIxqV+ecR z+OQP5K${-%k=xa@tEs3OA2`?uEnNUG!vM^RF4tn-nd2XRLDj$4aC>SVxK{ce#%%LF zZuW0IFMF8kiz{eB?7+8YUp)06oNhu4*p8meftLRY4h5yBoVFu-Gwd5z(9?+t%Wnm8 z;426AWYNTlNeW8-LXdHTNCUMrlL<4f)L}sQ@(VqwQ z=;{Fx4`PQct;KszUz5#Bd_>_eGJSFQr&KRET{PY5Crt9}CgQ6$>zcvg?%b~|(T3l_ z9n%ntcMW9Bcq^Hy$L{YMgk^GTtYP)VxtmhlsZ8-f&JA6<@2ihgf#06oe0*BF;2P3N zaZ}z|1e1SAk_-;q8hNZ(VLorel$u3pa>1T1WZx@z;tOj5&`|U|`1+KKJc`gd6`@&Iqrlx_c zG}tlIQ5m`W!p8Xn>r=i$5AL7-nN?4?Q{oEMwQ`BBxPy2*HD~~n2Cg)9lnx#ETaDSR zw$SCMsRO)rJ$P#Ae~Yf4tFLJDD>!6}&}H$9sn@3e!;k`<&~`8)c5GPFL**`9j*Q2m zHx~*WrUF)JDBup%HsP}mnW1JQlc-uw*zSM_psj+;9$}^GYK>lWV4MkNTXND4&^k9hq&1C%#z=-Ev*%$W7LM1N2fks`J(0i!#(u-)dCULyCb(R>J`mj zu6!En1!u8j_J|^WDZOjXOW~65TTW3`X?FgZ67>S1^J3s}?{48wyIcHSD|q@C(${m> z?_8`4Q;=?rF9kd$xmH@e_OP*n_R&zh$n(&mTA2cARMQ~V>G8^2l2eM|0VYQ=;*Slv zH|I#2(CA7*pGWPh{*QLg#}WKd>q)=MWbZ2)>v6^l!fR3J2aSiMDF+2TV_E`XNENg* zZ&WislWeP{XLx%@4&p{Rq%pXf4I!y>O)^$+SI*j#?*?J8GDnZw$eKrgq{ArmO&_`E zjDHtfkv-8HroFFkq4m;Z!0-~Ninh(zQ(6t&;9pAmh9L-l)j}?W`A%Q)q95hxMw>l$ zwB=H7nusoq`9?qoJ*kOy;C+w0U*O|jLg(Tck2hWXbg(IT9)%GolX)N?ZFdQKCO>5` zH{$H^(_u?X-op{it1RE<`0uygL&m>(3`Q* ze)hWTxu#rq!m$HIsKD4#+N8Ct`Tf8wL+WaROPE!G(SmtsR=t?SO1(_sQ>$XcjSFVBR^9J#qrO%-dNq20JcJ zF*2RMaym~RkF=yHYiO99A!@m|CxeHl&8IC48Tn$jCI#*h`l)_`#SV3{t>suuag5jg zT1`u+IT09L=$+ahAnt> zo?ELJ;C-IXQpZ=~y3=i64gR2{L0za3$<1-^$Y(*hXhbe4uq!I?WbnTP{|jGu~IM0=YXgB5dM6fgx0oGU%!b(^iQOYW7iBGB6oF+HUp?fQg7+&F{!pb~0t} zXInZRjRI@E^qTsrCV2s}326JAHgyQbF{am_LSnzMc0_tLVkgGxRycS)KoN zm5QgfQkaHUB0WV#Y*U&yRtaq<9;PnBk2EU3b7`2w*j}TpVZLo*jydznq%R4lVq(k} zky!l(p%r>2s}>$lVG(-wY+mDf>v?k|f$lYTXzm}ej4!XdM)bO!;9O0C{e%4HF}oI} z`eH1)!Irw4>$4%a-y{WtgWpg?9S{dC0H}*}&x|{<&s_No$b{C`={C^{y^X{i2IQ_7#j2<0zHl?SklNs zEganm`cZ+2Z-#EtDnk~(8HSwhVHxHNNb*8?R)#hhU4O_Ig4tZfCwdS=F!t~z&M z$HgxytQ=h6o5B#@*`Ph zXX3F-O)k+tF=BtEu1q=LqDvX-NO!-bRb-&LqSFmsQ-faenA30E2?!XyA#)V}N&WhK z`R85LbwwS6SNLXO-$yfHWC|xxv@7|Hu%fDHT+6`V!!iXD35z;Cl}D8ZU#$t?JGg=c zR7N(pu(h&(-33T)?D5euv2rW$DkrItM%4MN0;dVj$f8UA+SxoeUwqL*UJ`uT39FpW z|1f44s2H@AknO!Ye?9kEFkM=%*m|IK0?NEaRFVfQNn&IkrpOCi`6zN#F-*aOj+)2F z=3v7p${FFwvVIe?++a88hZ*I8kY}5BnajyZ$A$B%!}tYj*3#x+M_0fCFPn6K$+XU} zXqfGc(@2b!;u|oA#lFzTMxdBMn8D>eP-!9Ef^MnGGbKJ5^H!mMEkS=C?zEAyXT@C= z)1g4hy5x)c&526?PBU9|kNh+m7M4_!dH?5&6G)o$nguQuuhPgt?#15^n<020S&FN2 zh%q_##7bjsv$G^$ZJ?LA5CPrH3f-iI0X_b2QeXGn%IjC5er573S^JgF#|2zQ{3e5a zhE9t0PgUS0{j>Kd^$>fOn!oBA|0=gimS7XGURipN4O(+CQ<~O(zCWRz-ud)K%`OUj z)d@>F-M~bN!7)E!EEl}asa%vfc)MQ0C54E>SC(#3u!$)mO9DC*y{tLTE4vtfZyaij zdM72nVqg#in6B6Q^-HzN%DLv}JZ|L?8uydHx=>=z44=4MtKs<>m`Q9*AtD)UG&9{D zcgL_&PH&#t*M22W6}80w*8-(kY*7+7=NYvjnW11kk7Mb|lt)!4| zDN275QQkIA%~`V@(lhkFUvF<;xd_)m$5K(6O?*fW<+-)T)6wWQRC3=>yMulg0gF=4 zO{=rNpXdh|?I zD^oh>;8g98I>g6PiU!U^A;w}3_t|r#^W;3-%bUuDfo^?`@ZJg8^xs&Ks6o392+y9} z$}g|~!Xccak2O_t(F%+|>e!3`ruw{Rw}mU?^0iaMm=OG9f4NcgtFu6{7+R+8TX z+EU7>waj}I2*w^ZRc~%U&Sl0fM!gUHcI2MVf;N7^CVH3EwG}c7u(PrbW2ho68eQ=! zZ67W{{H5|rd8u!-5*lYjQn-1)Hx-BXC&_j{@YLdIc>XE>-Szx$-rWD+i)x)_mh7~2 z!P5<81RI+*;5}WjwCLv0`suO<_S^e)9LMInh0RMyzC#pegSYMvs(>R1M+Co1YgAsJ z6Vp6L#ETQ48i2@4QiPuU=f+=(F8!5(_IqJKYQpj8@Xiu1Kx_l2Chk^{hF=zN6kFLR z93^_Wg%C%W5i4$&$Q?mi6l9W#h1Qrj)hBQ_5ES70)r%_pbi50lNuxftSWMyW;{Dp>$FG-@*P zls4;E?6ABy?DK!Qr>!z^eS3=}gEgG-%>G&MB>yjm`%9|CM6lbpmTTa3#G#q(qrHv4MpwzI{OhN^si6VYA*)hsyKMYr<^J*NJD0x z7>b@s;hT(qJRSXCbC+BOR$5v5cIhv6XZaX*zAlFDTyoSuEGz-g*QfF&GA(tIPBB7C zx~uPqt_HrqDzoc(bE&3$^-PsHIY{)u_r+X)Q^7IhJ8Ei5(ol4tQq`TzYFpvDJnC+9 zbA!U(D#_b_O5+j2k;1->gF7{N*XzqytBP;#uKMf?4mE;hq($N&3!cFhlV&I` zTE<1a<+Qm(AGQ=Tp?PX#KEb9gJhaiJ`-K0x`mT$IUu>m;A4$oCMZC-^7csQ7E&Se_ zEx3;6z0#>lS&SNW-+2anBJk@C8pTk9S+-FR3p*)Y%q%ihQX;eHTt3&Th25x?VqFpIY3=@D)ok{&ROT~nwd_gbe;hcS8p8P!qD%etpDM>0@9 zDF_7$ysp<$;$q7?xdM&1zw*cIajyB-qbGEz z&)Grf2zuxkW~+bR&L%nGFUyXCBJFvySEYnn*+0Rcgo;9T)a+#D?~Vg1XVvzEL1+v@zDD(hwc+t9W|dJ1QMB$i{~Z9H&LH1Z9H3q!OE$DsDoLy;Ck8f@lN; z!`ma%yu+usG-9F1r8`9~ZUt5+$gR}t)0N&>^k|K|H!W))&0j+rW^1ANjK`iBPZ zi>-2lY?!6HscRr9mP;9Z!N1|JC3chI-ylYWiA;bE8QrcqlvQV)N~ShX#9*z1)E2=T zy<*3@l+s|*xT%8zdVF-t!z!>kFC!-};ZQhLb#8U@xN@y_@a>~qo6;t;xt$K|r$E{& zpY&@hcpp}h*(=u~;eW);-96o99F=S73L*rn#oOD=rc@8L4%8A8zHVZNqspVktddUr-upOWts>s!jYiJ1!k;q!rp z4Ru~l!YHI^`x39+`b`mk7W8*qxq~v&-HM?N?NpoU5Qwp77MibXe9+$z;=#QW{|BF-70*G zRCj;`i}(i9Qt+MEKTC&Hh^(7^c*mOOeRpeL^TyiR{I*A?5|3NrGlddXTF{2y+kNfL zKiinx(e>$2*iN>r3y=Fa1G!>KRQ-gmN=I`~A?iMOKg_#yuy)iCPl6s>V z+jHkZ{q~+Z=aEnAQLv(j>gv<|Hz}}TH7oqqt_Mfpgz{#cgOmJn-d^+3Rq{V&TX{_y z+AUaDw?=*YWrfYcl&q3q2>lE>p%dEmZgC0Q?Oil9_=I>{zuq~0KpL!Gd;ECi5d}$v zBhL-+piyTaJhumf$9xM^jz!Syb2axuWof4esL*P78ic@v zS24LXm`CK1&MwPoPF0?b?c%Yx`<5+i7%B<#NB^eVDRwDO#@ivHP)WoG#f~mnr1}wa z9j6WoaIr6*Z1_K)_J0}WTb%q4gGbq*%dWERX(vTb?%H;m_B{2qWsAKPZQkzPg9!B0 zmnSYajlZ0=Ir*SvhOd`H4KI_(`EFdp_K)cVtSHHBoyj3M+v##ACb>-Dn}tP?)QwTJ zIWH!NS>=f7>hhlAYY(s6dNEZ@s*RHjRoD)n{gz=>BH4KRBLRtg)h*OQJaNzUSccQ0 z*otRj4Kr9wGOW?3F8A1vaKs@n1&qGi#6%ub2Yq0vBfhG-*(uU%_U7l&@F*f|@PHVw zitBHdIf&AP(VFGy%6jyifO|ANPlHr;%l2oY1rK*C0(nK`+2UvGaraM}W;<2$i-~O% zq2f9pDGZc``j;3v6hQA|yUs$U-en7mF2ig!jR%ola}>>N8Xx~b)y8({C8mIiw(Zfn zj+;E{7(RUk)|Wo=8nJAMCr5+9y+dEp+J3D&Mdq7`oCy=$6xv;N$L#gJqR~T_g}Utp zb0jckjpzYU8vLt^q<+m8g|DBpblMkUBE0&g4^1q1EmQ$^z9s}ljT5{J`^CSe`8QJ)nOBQ*@YBK;iV_J~q>EF*{~jo1t69; zx6^yK+UA87&4;dWwy-MnW|x7I@B1fnnv;Uy!n&NxFMi_&9d&-$^2||V8fA=bWEOe+ z7z_?!2Ix0n14Usj*Azia9K3ebX5M(ys&<7%R4P9)>O6RUeFuP0mVPm0 zAbnL0tA#mklHH6njXEt(UL)GwjMfW5k{rK@`nuv}X>-y>SGruG32=A$t-+fqD+Zqf z!$bXJ`LaFLrZ};8Qe^DgzN*;}a_dFxxZr+sKz|yvz514c-_5kFfO+4PU$rfo@C*wn zs%I`Kt99A_UIRHPvfk_U5>@^x2wC^EdIB%b-wS zm}SU_%ys|Y1#!sN=0^d7?2S=>s4G5(2Y5Wk)3-~;P0r_ov|&D1tv;--YDRvL=zDO% zFB<$AE!(=VY=09}Fjyo@EEabcN2YM{rE5`D|2GD3r}7a4Z9B6fn_@7ytgo*+_F6t=ph98^cc2`c4FRF8XEZ{qk&S4s z)JzEy7LJj3!AEy-6HTSSsCm-b@>I3Fyw?QJ$1-pTeCt^Ujkjm0T3dONXWFrEYv%&$ zf~^n2$g=*dsC;Su-z!ZQMYKqUKZ5gAFEU2BCm-+d1d?FacgWDoLkl!!aSSVpt@F(_ zAq$v*hYQh^a?%Ps)TIO#%x2i@t`*AL*6l;C=Ek z8R@rgqni@fM?}xm-iW_BeYY}lN@Sbvk$xZId3)9=dr#5ngqG^IJRDo98yVei|8fLM0igYo}7dEZ4x7|et7)2e69%kt|=|3*Q%mN zOhqB)$ngQqE2ep)iB;RYzeO~|)P=q*E>{{L%uGE7QbH-KS?@Q-T3wG*A;lUh&g`tS z+LMXh(=|M`_#jXby--J8Tqz)X!+t4aX9RiX*3qW>P0AdUHTKcEWQIl_UN&<8ja;Ze zyyy~vb=6r++6h0nSvX2DK70;>?j-J)jhM6$)!(yL zP=az9UrH_lLK^t|t-Qqkr-<#)(CKo5rCmG$O)ESvcK%i8NIvICq+JbqEo+ty#Uys? z4;Uy>wBpGK>`YTr`BoDSEX5A)Xi)=u-}AEbxes@PGG6-F*D9Ne*C<5mnO z{-n_@q;(5Cz8-vmp{(JZzbgo-lcJI4s}(>QZWPAcO>>U7 z_nQBAbe;JFEz+HKbi(>A2D) zo#@My>U^>4{6?uoCG51;=U~-fbt$2v$%GEcUkHq+krYgW0z$2%G{mB0>O{I-)f-QXmO9TMc>BRl)zna%}rtp=skPdQ^XHran}?i5^)gW<@lc zg|u7}_S;V{A=}LT@lNg0{isGD9bw$_xFb>5_w-?Cpvt0SRPOtne%7Gi>ieO6d7-X(gL_@PEX$%tlDu?c8W}Wp|P>P)OOTbI2&aCn_|z>dh~NLwnEg+xUj zA=Pupw3nLWRRn_@+hSE3vYURf$h^}?Uu+g2K{YTvmPiqMSF@n1Qb3Lnc9kP#gM&%6 zYv+EYZ`Pr9F%kq0=nhD*LKz6dphjRAR%-%j=xJI|_9RL}(66`;LRS-lHPl0P&W^5l zGq|FK=zT~d52c*gfQs%VT6IkDpDYSx^G{hW4;lQCoPvWBv)gI#7fBfjC;}3sNnZs~ zu3;a&wXf8h^n@uM&%54@ef}2oY{JV6P@>Doc??sN24}9%jXoftpcEBOjW=k11ZUec zF8<)YY985pA1pPsEApyymc6)mbLCRfGhm zMu#fvQ2F8UDWj(QSvK!uAsa6Xha$D_p4uZ1liyUYr!Qamwxh}3r@fqIayXyMQGl3J z?YNF{(4d;+v7uSXNo3pjRLyzVEI!^0^Vuk5rBRG=@G-TJG9|^+92#-CG=~B@8qDH` zrX@<-POs7I>*B0yM5)Xq6Nl``eusW*j$ZzmJS z))aM0{DQ;~=x+q03*Xz_Rg^f*U^Q!+6f6Krh7mMFfK_=;a&3K&n>_eT5(RcKY5Aq7 z#knBM^3e_#cEjVlHBIds?oXf)Q*5**rIo-jh+x5r)4P|N94;rUka_L8^!(si=#^bb^IWOq5Ehp~T|}dApJ>x! zT|mgQJ{A_{EzMzuqnR2P4mwYt_Q#E^NIs-X_cZXzV78OEKI>3P%GCDC)Snm>99#qu z*Y7N~<4qRurjqhOe+c{N*wyz{Che+lR?$V(D(?by9q*GV*^i-PwcxY{U=&Kx03 z_y0Ir-QB@vHn!_XOEHCd#=TbLpl>VzKZAaK(I^(ymf|et)osfDePBH;H74JJi@MTr zWkZDjkm!6U5^)d>g{iPQzhWI-6s!@8s^Ybob zZs4r-T&~A7(u=j(A)doobDx^4-CC!^|^4qPq6%A?|I}f_WT9 z`t*nLJT^5#``S4AWFdM!t(fRFcs7-lu@U}VJjX&E5sdW%mYq5HWPB2ZaYy`4Y@XuDm+r=%6CHdL zV8q-4E|-EBf(PXmnmmAWN0^6+&@t@YzU-3eJmgiF;Q8h|SQBxLLG}ofU?)OO{L#$N z+iQN@kt}Ad1w0!I!fQmXZEeJ16qKm^+VbaFwh|cJ!o>MQ9;!h=aC@L0->JkkP)8|o$MkjrlS;zU z$%yUNOjeuXv?`M_B=ceT_(6vM_0xHf?VE@Bl1E$sf>Ln>jlBVF?%&iPNy(1v?*6Ov~@nv4a?*$RXdlPkijke?p#BPrG1+09$7;m()B1t99Cl+wplVm)uHHbj5GS^>UsJ2j{K)FaX+|udaVDv zIP0q(c2)i7B6>~4Z<>TYPD;YdN?x}@eO06-$gCdag<_SUJ{{=iyU28gK|Lqn@!hYC z!l*dSF%uqEU+R2g$UAJb%PKO|xym!E^WNV|v>KjxI-V}Q23kolg2${+y<9#u=leSF z_JJLCrE6&>%$3+T&uwfbe0!yP@Duqt+;3NX?D>(?SLm6s>_G_?Fk^p7)k-=HuK+AF6jR9 z#v4Kde`(~I~@jS(^C8b6Q1(0Y_^l^Y0Kpg8?Ql?}e$bYQ2ZL7>_TC;0Rqr}!v2 zs{r30l}LFx#d--9IQWjub1!|7aqIs9+wk>hg~-gwQ6W>mKs2#72K!+ENH_rDEwHAL(3~hDuREA+`F# z&*$dk>X4_#y6JKmxk(6I_CpFxJ$3qEamS!ZqlWTh`_wNGN_g7#WF)g?AfQwl*!w*vsXtP@+OquZAEi`6G z(P!h$($8xOQF6ec2nZGH*WnN0Pl=w0uTGr9L@QuWCY0*-9Pn`K1V%#PzagkuhjP&C z_^+Y9ALqw!-S!`42`#nh#pUnkSVRCUxs=Gd!0lW*bfD#KuOl#0B(3EJtK}lp$jAto zwHz&%-WHOQMi45uj<~qEW1ok#%8oAq&6+9E9pP~lxV(BDRz8MtE*>ha-RbJr-?MIS zBGrwS0rU^z**`sW7iHpRYc{*-Tv{RxP`$T|>eKja#)USgU*u1Tl|mZ{pjT^McmoyH z)p<%5G&D3pfIxQKQyCh$TTd69@y^Z8rYQfc2fZP@zwt>x4D_Hu; z24PM)`J!FIptxDL%HH^A0IDljvfb185-+p#Qlj;mqsFucuqsmjMKurTz*};uaRjL+ z^|4i^iKa87&NgS_1sZ5n{IF01|=7vwnF0|H4b zlXykbNOyD14~d0jW;4j%y*obNngV+C;?2lu>+jS1s+Ja}3e0O@g0t85yn&W5GcqzW zpSm`;fB2!2cY1wG5~-d?Pdkx-88v0$F?-qz*To|sx$7gnFRxu`>8r4um%;=`Nm5{H zA_5GIH@~6ae55t;-irHNvBq&L{7O}&SYbto!>aCL7(Xs2Rx^AoYj@Uk1lzMjS+y-! zQ%=pSm+F3(T5;th!^1%%SQ4Q49-P;tZjrp^y|e0%9)fRZ#B%)ski$KC?-i%}0A*oc zE|E_07bahWZp>m}pkECjutH+?;KaekR!tmAzYs`EuZ`bxtYmk{_^_jc&@5JyfpBt8 zwO-q_o(JHvUexOkG7vFV_l)mR4lu{^bF^<_QSv-4B+S4m-nHxAu=;c1m+ z_lG^N-n=qmTOthgvZ0vP9J*U9gb~Xay$nvauRL_WAl0Q~iDL<+?_as>Y2o@D3}}hB z)c+{23-k__t}c;J1;S(|ZagVE#sEF@bej9I;Xd5wK3rITcj}OSbJHXlrlE&MACftS z)ziudta&CJy!p{&1+|S2W^R!RCanTV%Pih0`CoWc<8#rC+*pY-G3n0zT^_HRiwa<)>->aF3CF*{dXJi;*T~#Hh=);9+g2#WKmHGt9 zSc*VAALZj=zD!JSQTcrx3VZbib>-sz=_AmuAAiGrLAGDxKey-aCeAB!(#7rV&(+XX z&V8&+7hD>jA8&Fqsa;r_n4qU;gVs%-vSPh_&;dVxq8fEGGc%W#lmG$UtV>pBT|Yu) zrYDJR3u}1}+-0e{dW(#P)mZO05zHRmObk7HsDov4`3we3(*Va5UAI#Ij{oEpo5|sr zYe(%ZHz}}-tN3S2u}`WQPb#!~f7b)V_!+9#IW*(Ai4(e6uVA}vy*`Id!Oxj$ds^!x zAp;q|_x3ELJvhKOS9g9$=|{kDs;YiWUr~VQ9sPvfO{q^D!d(Mlb`}xd*K&tpiRaAp ztci40gARdf1^G>J{I3a6gnk3(kUyXXvy=^}xV@ z&n=fvV@1W!iv7v6GeFK?#Rwf|^$Ca)qis{8d$;9As-*pk1vvc^&ZVcoz=hYp;DktVgm>@UeeukXrv!AY8$WL2{15k1T}s=tZTyda!ulrp zDh>3j`=cL&m9Q#q;vkjWfPP{8uiZ&pTrSXk1$A2L>I;jDljDmjne^8krGIb(JFbU| zYqcI`CD`Z2)JKq$b7^+;cgImPBJciuMCi|U3vWN+yGK8CKW*zdVmoW9;#QM3(LRU77B{TVLiaP z*fLkm2k!k9CTqi{O#wxt{_mLAE2RQV0jKxUdKDEF(O2`^r#^r~-SOn4qiWnWuFvr{ zJxW0O_3p@h*F8f0p<}ntnf`P}-qVbnzKKyr_i%ShYdyb^i<6FXX0BjBek@Y~M%;#0 zFjO)$UYa_ygm7EZ1<^SG%47# z#3m$dmm4zC0@m+a!hZxDvQ%^?^ftM)E2f(HZU9=sf)}(iKc!9{6<2zDFheSY?+Qek zqLZUa9wG^sCf**VZcH55$ z=1_L)KCMoNGyNE=^tm;^Nz1TP-4~Tx zX{mKf4G6f|uwjfZ*swXj8NWZ3xu-ITnVyaZ{+0x1MJZ&ENAA~?3$?B99@Gr~((68f zlxR|Ut7bCbd_mRYjP>BP^jGq2{%523@ZVd79h{e-o~IowA(=#HiVu&7z`@5?!0F(# zWUN|NNYQA?y+toeC!2~!+m8t(^Z#~|c^-rPGWeya?4tn|l!F^m94xRH8Lf1oqF4v} zemC*=|D11#49FA>@Yhs258qdaLr@em@4kMUXF~hWIfqC!il%F!=%AzJrA7c573Nae z>;L`|D6%^8IzA+4YA2u@_D>Be+EaKS*)-D2qU%R8GM~voe;xUHUmk3qF`|f`bYDIO zW?Q0vbEU&+Wyx31QRD}2BjljqXoh)wsOd30#w3rN4vnV=@62OypSus`s-<0u9 zfRZV>SlzR)b8CZbZ4;joLEiE}MtL?lyD=pe&ru1xw)oEma(0T|3(JA z5?tD<$X>v;S{e0gg0|Jo}{BcObvX z@Dl{ItM9F9!9WM07VF)u7?#XDRp|*Jc!A*<5<&) z!zW}nsl#vMlIWfA?|)Mw>%L3ZP_gU(%K8T57EL|KF>Y(H+L8ikf4GYVo6v$y{pCVT zM=^zxr4jk?Z2j;#NCVAdo9bf|2AFO%sQ_kyA|gL$Tf>*8oob0z`rdvPmRj53R|rx0 zUR+>PGEF%}5u8aQ9^t(`{tdXTk?y}TWI!Ss?#h;D_y61?Te^zg1EUBS037mDSyXp) zN$&S7svz{g`4cX8j3h!cX)@(mBVg+tY9|1MWPZZ8MHzp zZ|~u1ntq5#rQnP$Blpw-7YUVN;q{0v%i*+Cs%-sYf5M`5q|&%r9|i{F$mInJPrM1( zP_>B2fp@DLxq4{ErfQF^S;o?>$01*t+$>l!<~Fjb!e-xKl)-?sAA5noD5x&Q(TAg>Eww|HynLJ|@ zBy{Frb|~mpsxrLq3mIkI{o0S5W`Ql1RqHd!-c2>CI!mqE;}m zvBZhFb}Nd(et^TF@dU)pA0b?qYt?w21sF%BC04vs$le#WoXlB(Ge>(sJ!~L1(H)%L;fr?8rT4CeBml_z~*MVZ4?HXQVT?Z5Xr15H9ui8)R zZ+Nf^ZR%(B@0ZQm)-R&U8E%Jb>elP0%zs!F=`f8DeXU23h6M((r?tA(J9{zK%zn7< zXH=$PFq78@)!~!$P8JXm30KsXYIt9|wAW%Ln^4k6HnTBk`Bntt-?i1P78*ZPuY%#l zzW(MFzH~6;esCw7O9YZ#@&oo`iJL~_LJ7>Xla!K%4jD&#igU!b``k8w!0#=x)p|_C zFN;t42SrR9&x`CE=p3Y^MYGCGmn(lJXok%<--Tw490b3p-hv!0XJawQzn+AAnhN@M zFKC}1!qd3Fs?mfsJ(Gu7TUMJnFPE$SfVb=*%6j&QiO*-!7r1o>ZZwVOQg_nRlbixG zA)SQdX_JGVZ}mh?bd__c?36M`4pF+kR9J{AMNa}23Sc~d}~{@~XLB%=2r{6fVj z&HKB#SU(bH2sDS#FyDQF&0Q6tMSY34K+W${`NRLKtR5@Ne0>w=;FeUNCRl3SYDiu_ zt=XIzdCobnJJ_PLh3~)l3<)|L77(G_= zlC1ZUN4$=YeG8c|C>yG!r51+6RG{vcB9t=6d7IuxIvU=Zyh0a)<6c<!DdjcJMJi8J(IF_*pIoXVWWzuKUQ@U9^CM|db0`#Gl^tB0 zY#S|-6gy{Tru}==Qt(1t^zcJI$e>PS8wJOfY2S4gds-x{RBf!(00vSV??O=ur&K8! zNYWmif#srslS^WBw{Fb7m&;8GW=Ap~v{|LlAlP`t^(d@C4H!eI;bl_(OEJ##rBY`+ zH*mBlJNglNqyWJ?uiWOapg&o+4q)>nn}LfQC-|%mnw4$Omm*M$1HldoB+L%y>LoSFPeb|`%H^CWCz#`l99DDVv$xcp zlV!*&05eqs=Ak^|w~@PQh8`JleI|ey*F!c_X-Qfsv)HbzR_`9Ejs| zX`Q#koV{wkXh@5^VuZW+8ReAeXt^9OCb~Wmox2CzdX(Fbw=2V!2-h0F-Om|mXII^J zZ}Jk851?T9iysQ$y~4<|X>qNe>U`5@0B^G`VwZr$RoGW zxg`jT#$akN5BHLXkJ+Eqvg4)dX{%lNyU;O)MJUo^Zki5b3|5T zJ2AO!<9~&@$4myxm`HZiZCz=^BX<26r$>PujGFkL`kw}PZOS$&Cd@f@=%U?%j+!nuzcU4eSV*xCD9Ql$d_yh~w!>xFjsJNxh-=4+?sg^@1CT9roUJi~R z$Ea0mEkQ(_fXnVR!Ya*#>w-PG;E45I7s006cErlv^ktxz=jJt6Y3=6iuOsnPLvC3} z(^ojsDr16;E{yYq(1|G>5sHQsvU#M>->EWxR87Ae5@Oqr#S`tRcAmIdFD-7J&84=p zrV=EA-o)&=yD5!OiFV=*H;=`+cFJw*!8rr z1LFU+7Nh`SQ7!Q@f*IF>4Ey`h3LtgyQGm6bmUeASyTCO%^__ZVq-on~$ZPDGRJjE! zCJ$Oh9-Xx<691I;w_o?QpJQOWc&vbxhM$JkXHM6vMyF||2d-(bGa@hgnG{cuX4YrD z!mX58lF@9j{@$LmT0C>J-u(Usv+Ljl6I;8W(s62$(jbt&i0vC&m9~*)e9%VO3hxoN zi+O*~pFN$pOh|S=Z-QCHxU|tp0dHzRkYQir0>@oafv_9|;F@<0Ef!oz@+93yW5!6- zis4nEin4rHDq^YH(cSm7Zay9WQMB!1O&sb*NvQ&XT62UWsOwN41=2@veMNcp$lFZrA@NiT%xWkt?}L z)nQb>Q z`E#rMvJlR2%apvdcQgtQ4qANY5$4FrxhvlzG{&_nvn;collzAcGsJltQ`>F6s=jma zx+F0u$WW$Ifdn<|a#>TFq>_P|?}xH>5!uT?QL@Y>*ic?j%XMNfezFTKL(YIo@Vk|= z53Y$p91SQ|hhTaGFdfsfW6XJj5?Gz3OtQ+mdhmymgfEcRBI~9#+7$-farsr0-*4D4fBm4|PFQDOakM)3 zV5uWQI~F2)0up`)o`cYhAMN0Je1YL#SzbKH;6ZMI%hHx>FX75D$K(&SE>jQaN!xRm zz0LU(*>mh^H>OpS#pksiSZI|s(oMa1Sl)A3PUba`Ghh{vB0UiR%Lap^Db1DJsd5{% zs;%6uyPf210PqblTbzn&o&Ygx)h`9KnU{>(>giD%wv0+*M$xu3%l(!PvgJ8@F#G5YqRb|YGp@fjbzFLU{QR zhP?%;;Asv!Hk^v5fB7+s1@k!qM?|Gu8?~oK)6~EGb9p^Zaph`2d=Z(2eD?KnAbb1c z_3LDS1hBH<*SqB;kqpXyz}er{P5D)05FP-H%%TLJpbO$TOC{ybl%`LW`sD5}_xN#` zI#?wI$CcLqImB_G{30SV=k5DBIT=+P490kobe@CVZC_E3dyBEQND|c__6)oh9+0~7 zK+XUp?sbqyCj$@#;hBe7(*1wm4ywX#j zS8S+Ah;IKNO~G4qSCx}o_BsDxZ&OQf>Gwsl45x{EJk7p+Hivt3N*X12e2=XMTk6Y= z`xEkoV(XK70oHL%`2(-FWOKxNbX;3(_qkQb#JIKU)JFNGhQaZkMI~J41a;)$ryVNy|f4B&+tu%j9%o1u1*G9Ruma{TxDO{LE@j*SNuF7M;7DR z@|=?Q!4R*Dj~Mxg8;oKOCQ;7$6r`g@h!NG0+wz&_Biv_A{_rDhV8?iTPUp-!0!_?3 zgv1kC+QESrZ&IeiW3W2|RkR5;7-9MOcUTHo--v2TT6Er5oC}@4&WCH&SmTOU2^N3a zuL|c`0>`PSA4#wD6k*kN$OIIGi>A@akdrPEI@+XsF_?Py@lCL+A8qMJSffhb?jrsZ z(KXp4zgRa)}A)O#X|SmX_K@M zSA)ng5%}7v+Pt0S){_C2^-A>`AFRp30BSPMIx@;TRqHWfB zZ8=MDzo~`tTCtOL5qHC^P(7AF3O{cgv)Gbnrn=*$ZEx zyv)erCpHt@b=zVICnqJRaKQbt9QJ29aQS9>ORMtjbyM1P{)_U%VmRt!f9kXgfmdZl zTU(WKdD2r#qsN&xY81mtFsk{?Sjm+;i^|L8I>d3R$8xT?fI_B?yP-D#&SF%bAFw~P z#7m#nH;(Qd)hir^qfu?x(=YvXnNe@Y`zg+s8S~^~v1V^AAxhFQJe;?K&2G!VYPS*F z+NtL>pFQ(8n8?3|Dddz&zxK4VLe?>(Vsn4EDhlqu5H5~aN0nX72Mk# z=2XFwOiPSn-L{W7zMMbMBe>ovDJ^f;DFOqSIUZ7dxL)g&UiS`P2>=EqaS>?on3)*W z$kn5dlU(r3Azx&i@7UKF zT%EY!po#SQ8;g_0Y8@x_ymR?h*q?QDoW1!Z1y$_Q8~#_7$}v&%gj`8qP^q1cN=nJR zmF^Pz>cv!-;5M}htTzq`$xWBkItqd}y+9R)l{|N7bs9) zn7vck<8zH$ReWqKr{%~?EOh|g_&S4O6Z?i;S-LK_E^k}R5M`@MbdO!U@{&w;k&{r}RBRagT#okr_OPrYrOn2ct`DaWTSsu)D zw%Yq0<971QXBA!eP_oET7Fo~YjiY zQ-$Bko(ttcmx^*hqJ2{mSek zi}wctBUrG-gcJ`Zb&e9D7B4hyGTG*3`UM)_mc+~<8T~gt=&m#|!3U!v8lrUFI8}GQ z2r`r8Tc?LT2^#C*gNfbB;Cd{q;;phO5;=4KMW=mQL6zIZkuiXPV?J1Zl%~(B7#kEc zE0VV0$qXnE1~H06fRb>V3!DDrrke;_H#EM{&tCF1mHYVk!1Phab+#tfMHu23(cHe3 z%*8f@_VvFIaJogx0HQ6CZK=mf?dLIn@<_7Mv}v%U9`;OHKoxbPHzyna4`$d^tx*>3 zfKOo-d1Ob<2E6;YiSCx5kiIZkL0U7iPf1={5sQ-cz4E(U^I#hvM6D0s$diZbd2X}T zJ9sO}J(yBQ<_-u@EIXz>zu6c!aohb%zd!m96zdVlejS}&Os9m@aCmn%X44U=YtZAo z{*I{?OzXb7NrLV*P@N?bM~mB=5vw7e>c-6;uzAX~RB^(HWSWZ`Ovj+=0UXP&7t_9d zfDJFs!{9MXExJW9n^(jaDNFtUkaEeAEWMaJu&`VV)ou1B*2P)rZ%qY))4^4b4xCfJ zje^*eFi1f0k1|&tbsnYvZG~;GZnnuMZZG(?w!WXhQ)ewqFzk ziyV>Iz^~e(d}r`LzE}*R2p;aQnXf|uSrQRXe7DPafOUR(v{E}~$tTG1@MSNP%DKap z*7RLeY8$iNXCMhJgGX;-E^S;`6JNf1=V=MndE&cH)l=J1>V00=`@r`0>v{Q{CG>Vr z-9ht>0X`^&X790*WN<%X%$@OXyjfO}!5}AyyPzVhIDViECYXLi554Y(m$ojCjVWqs z246pP(=XeQE<>Oxwze$GAFX6GqdC7=gKTxoU8yMOl)_XPSO*UyTXSF2zU(qq3gYmz zI0vjHzpiBZ=A&DieeMBD#7h%5QNp#VcAfYt>w&j6fe)TgZ3dM~u@;S=)cZx^O)6u- zY)?S?_;iZwQ8dNk*qU>)=x5X(_CXBWj?UeX$-E@dLcH#3HAKz!l>K7I3)Z z{#i5FTH$!H*km>DX*KZ8@|4iZ(<>Vg3Lxr!G=zPwu8%`SycaWI1tbf20-7a%=n%8n zP=lFwGxbYj(`>5Ao7%Z+kRXV~=TeTg_6 zd#;B`_ferTZ@+l3h7ZCZt_|FW)BIKBf?H@!)wR||5aYm0KK|&X;s@3Nv}DHn#>mn# z_?v(=PM}wh0A?rOb%um)SYm+D0$a@h$NU4PPguvBymT|VC}R$=@~l44dq#xGn$I{B zmRiw6Lw%BsZe8;M1FA1SMXSh0RFPHTUFsw-Zsu03rR<rci zkU@WYTplIKWTtiMl*?hHtHSbgf;!N@F_tsz)pe;9K!23MA0~iQXN6__@ywcYbcL0R z=tDsyC-T+yi?#!H)6Otp8~>H>VL7NA^n)zwH=un--xvA^##@@ecEIp(lQ^d-S=9y* z#c(=4M*_{7KGfE=pA{Nf8t<}DHDr%+4wU$7cA@M3%)zECfD08c2Lds&K@ny9FSMAh zwY-;v9P%Glz5aGIHT{U)<{#-tptm*;#c(fJx8MY(B?B*Q%P^U#>!}TUhk@~axbNVe zuL&Ee;jGc}tZqWq1S$gRUD$H8#BKZxb_Z4fACO-k_fPk)U++o(VPI@~q>p|B{O+F= zK?gMI-{khd1-U>~akcaC#J70083QE$IIJFcI1SZXJ~;lzY}{rr1J&~$4FuMmB*lXj zSj}u^JI4sm5TA}ge{%OT2T*32)k$n%=obs7W=(4o|K0L)P}z*J zzewiK*UD{dD58ym?<+*IX(+_ZISb5O1D5KZ{8fNrK)uns71m_*8(}u3lUqKqWx_*S zZJ;3T5r5iV5B@m*?F5W`5*nGnOxL9r09J>Mwqign%NFJv>7Cjp#pw&i8mWPLP8*TH>JkjUbPfh-I zEFSbj7*PqmT5S$DR!!WCe=P4IEUk^@qu<#VxZ<`& zU9z=@?nGeEGv6cyI1v<_^;BSsg#@j6Lwp0pt)G;4fiYMsR+Fst9%gsh%GdlyAfk7G zsW0ZSeBlx=-!@thThwT#LQLM7&?x0>*JBKua8wOqw?@hHi8^ zs(-22thjy)D&7)uX|L0!c4FJKr-#}%3P?+7Q%XRp_*WL#H#FjdfjesZ!QF3!q`;P? zb*y0E%pz)l7+QV4eBe@qIdEL?ZKrG`>|3LCv!Ppkn)oPYlz7Z89{I)gll9dqvD{E8 z^CD@d&+|clxm&3?9a>_iH_dX*aji1L8YVwD+Xluzeo_uh(Y7c*W1#O}^Zso+W)by{ z`jza-yVkE4YUFBGs5SmV%gSJ!5XHN+V+*izAUK6Zm}=SDO&of2@?et?$ftU#o{;%P zx83o4%y_csTO)LL3E&uZbADtZ&0pKHz8ak7-9u-}>yw4RQV8K*@UUqcyVn=-$ubwf zHqrpE)iK&@bku7n4CcR@69I!;j`y|;y6}3oXXQ`0zdm+uj0sW5`vNm4omh=7+4 zejHYEu-Ax6l-_Hh;Wg0p3~?#`grqhyY_}tc@u<$j(Kt#&M*Wf&IHs+_m|fh2cB&&H z8j>2Ol~qKoj5h6g(m$S36o{m$n=+WV-96>h=1amXEs&f8YX7V3eeN@W8X3#YTMOTP z4o`yi1A8fFMG~>+BFQJ)gSXdK7tddCid#|cK5KR^L}aq+Hc$oX#IRR>dX9mOlT4`1 zsP%4JN$hMWOo73eh7$9ZJu7DUx#Il$_KF0|zV|a5XP$2bqR<}($tKr%|RpSBdx)eFhs?z0Se^n2%fgvyB=5H6LG+ zr06Bi?j>at_Tv=}6;16qUH4YS&mM18CY&ri8N0#O!|sQn{=E6-o4Or<-|Uh|)#f9o+)ssSTr~cKc($?f~X;P%8bjzJ61ClCSGM5$)4~_rEYK-`iz2-)Hr_JKkho z2Mox4m0TrU<~2+?ZIicwBVL6Nx(HLF%q1Q^p5>F9@OQeNCViZ?rKa)}@#{Ql5g}-Z z!Lr=dDXw8W6~OPaxB>a_a)^nVYQYgei3Aohw>q_7u@MGy2OxLXvp3Y_NC>D!1xaRE zt#hQ|D&&zTnQF8SvS^5bm=z1=}^Ddfh(?+&lPkoGecS@jl1jdLXJV~V#K4T1l z1hCx(Ek<>Wp5JY*vy-Z@*FhRigXflQwD^Wc%{3%}ND`#{MCb`= z^-dO6p>3Uh$mHHqWHn#a#l!-=ybT#l9C`ZAHkTx#=)M<`r(3f%A_t5P9W`M@c!Pg{tBU`c@jiMJCVQI6RsnhRYWJiV>wlvm8eQ%Gn<1K$ z*6%GiWKh7ZX>bZ!KW~jmLsi-N?!miTqhi=USt~l}cGil?|4ULsGbua$hJC1K4&_9| zM%!SA!nTq#84%~quDpa~R;TC5R+JEky_vJE_>|@B>)!eRkC*3+>J8d*kLd$*Nd@rE z>H;Nhr?$`V;c^+~Eq95$_Gdn(z4Vh#P@A#wdCqq#z3pQP?ztTS5hISOUCciUEtbB;V4YWk{IT<#(Z4PEo!PYQ5}JvHf#xY2-4VHbYe(>9dph9^e%R?IS$} zln5fkz#p~sxKd0fOf3$(Ur47z|3l(~1f~R&SmgjN;MQ^^%>xgH)*yD>I=g!3;&l@3 z=|!)MfQ5!wPv!t3O#ETpaKH(r(_)V)eOlSrnztp!R)Yd_F#eoMrl_W-lAJZpWLnAm z@LD6Ncl2%=Nv7$PlpgTnbV^d87)A-VBHD(c1P6qw^T|Gz=`7FyV*(^lC`en|eo}>+ z#n#}A2Hy3_#6~K!N~TlQsbn_do{1w*SA^eX>uvE7I^wGT)JD%{0MVW&te+@3nq3o4 zKlTE$s?XA)w#z7gettoD?{OGptd&sMY}?(|TVmS5(H3YwaRT291pb5%}X$Rv>xp<}#|1Kg2&Na+Knrt})-V|m|OS5yb)G#DRvs4082 z2#ir!h0l+BomwPI=?4c*O{V8#1VJJ_2xmSUxN(l)RzM&rN$RJ^HgkX)EaV9Y(qL-& zFjP5sQ~v|r&vXcpxNxN`{%U=R=H z{zz?r{IfdD6EOZrVMHz~b;ayg)ngW`KSopk@}ussh*I}7e?JG%j=|X#98=ab0E7Q0 z;}wyhAj#LRnZE~rJ4(tczpqj1vpB^pp9&`=bjF^pn*0rsaYl4U^*f>-sM0dlSy+Ta z1{@~t&M89{HYw?9R7`gZ>ScbSscV?9n3&aeS1@4o8MHbr(;t>mVpQ_v^#$&@@b35B z=YGUxE7jF-xlZ{+vG6O%!MKykF1`dZQRdr$O;%Ho;Vrt~g^%*M>rabo|E8@gc4o*{ z{K3=E<3JO4SE_G^idtFhNzs>u6XwBY3JVrIM0);?PN*h*rLkdvA**WV+>*OSE^_Bt zQ@+Sst&@^%!!&=&@wln@U5zfdR-t4?V?q$h15eBRQcYssi~GltU$MG$bsz^7)f&s- z1=^l`l^kWMoIXj_xtIkb%LO==kU)K|$U* zSP-nUx!-iF1j+u+F=#zlL4NXunH>EFMS`VO_~sV)S~RgB?v&K^+?Z`}I`gA|{rOuD z?V*?{5&W+ObfCIYZ(j2IGO*Ac+=svVI`1R%5E@Ts2kBbO7Tu;7NDbzLP!nLH{@S}; zA*|eLjsrg~$cqYI4Lp|QNNG8Aej*IUEN5gd33glAHzU$CEVvICvRS{g)IOF)FeeY~~ zWl|$xciVpfO)p;3{)G3f)qOG)n(^Ur=YIFk=7X)xDINT;lXResP$ZCA0wTwG%;7u+ z|2i*jW1{sgecSoID^aE=pvIMOFEWS7r{yawvBdb1Sv7$zx3zd)tr@#Vn~feS<>u4w zKf++94)=DO3n@WJbffvzk}z-FGo8EmFnM()zKrS*km0z=H-bkc$>Zc=+U*s+D{#1RRU3nL?EkbW{Ia!1I zfh`$(upxjqdr~3Z7uEk>LTS*)`2eoc3vf-JQZ_Mz{J989c*bG zxHhx+=q*Wvxh+b#qbIkt0rL`3NunN=xkX<08vYei8u!P~?W}jnBeD0FGdWiirhTh! zQ1s+-Ek@zv**6&l1o{VjJbi9X(Z-mMP;H+*TTo`R5=!3tom-~maiE6=dfKx{ddH8c z=~dH25?Q(&St@uTyV4>6=S*E~*_LI@R?ew0|5#Z+a;8K+?*2zmlqN+s``2YQW?#|{ zVcGkyO-!9|uW}$58$prYk->nws`t(M(g!`ArOwJtL-q!WYu{zu(bydqW-&Xb$UeooI1Y?$Be`JdXUTDBiu3K{CyuKVA99u`d z0doffg2vOlLh4BLxAOtpg7|3@(#M;Dm+BMr_jNY6r;34a>S4y%msU=iA1($!MHiJ- z2aXDI-0z^BKaUAN34@yo+wu2PiVbY<6#PszRug|j>1zI7A>eg-4;!`7?T=UTK)Q0L zS+1J15-$HbQp+!P?fJsD`Q8%|r%aBXPRVi9Yb!|PcB5~)F>K~w{gI@3>D?Lx*&W?U zEz`^OV)%EFnl!_TPhGUu?RCp}vVsJZvciLr-vR15eOiYl@#hiq&tsJW6xy^8Pi@*} z%$RO0IZ2pDl9XtX)`Bj7b^JJF_(LAcb+g^t{Ab{gV>P&!><(Eo zIaw~}4(uGZ(PkF5=lQKMXu6E7Ot|-~*^t`~_tP#p%jMGcmD^W|e|g--n_m$`wESjZOE0bg@!L-1Aic%=v^yL_N`}9_ z)$4;0*Dt5X{nivyx69`+g@#Ke4)#e3A7;tmZP}5yji0?T6iZaXi^d~Z9v?57NSo5*R%=RNzJwh zB@>|jwIy~u1&864I7Np*u-g{M)?T2vKkDqj0F{Nw-}q{6tolJ5c)!O<@8vrfkhJdL zW>^a94A4JI1rZ`VZ1#+^aM|HP$|H z>C=68yZPR4um5;wbLzqKVQl83M^D)jH#bO9?)29gH;xe~lKq8q4Dv6mszvyhoW26_ z{vMLM&yV@F0um(aVZ3KhiI`!iSLNu*VP)Pb*miWtjpyP_PftXq^m;ekU)<*g&A?!GM`zBp5ncJjz9%T9bsX+a7PpA0(UFyz5@_;1vlX+zE85RiTPJQc z0N1(~o|@Rb#00=srg2?#Oe`Ax4O?&WOH!+Zh6L?G+ljd zb-5nN{aPq3J?QyeVrb28X|kr@R_2DzgXW_l<<;k3EWY|OVe5B=2VSO`c1`^n+?-R) z%Sno45?EAu8yHpv7sn!3;wHNB;xTG%Kt1#UBz+l7rPz=0iK`Z$1(#ahVUvbH9lVyqR&iPax^Tc z>}PJqG+y5nzam3xY)|cSm(3()o{Z2xDaVcwsSm=3rP6&fhegiX$&ZZ4R^ek8mbk4 zxT2lFmCj%(_y~k&`N=%_J@QldBz0|d*Y-g9X5-lAO}AL({mqf})2ATn5hT#|A};iD zr4eE50^3#e5>_hrvAv5)UT0R_RVAJN?pc&ngly_cyB_sztAS%aeoa$C2od7}Z*T4? z_shfZHM@{sF(YZoure}r>q>P<_fos<5fb4G^;vlY@-sS_P}oi>z2a`1a2O#8z-qVK zyixR?!Qy&g$4uFGN!4D4A0#b0 zv?2_19glo!Ihm?;>I88SZnVVOT0xJ>WL*Q7NZLHEyRVj;iyh65kH|oJb_^^`KY0+F z3Df@2w9d?dSK%%dX3nSzTGa`qh1E!&TXA1A@fVkKaqULo!r;7ig6AA@dRlolPz9fR z3JmQATq&h)%R`UP|rvBe0wTophB|TP#1{YOfsIl$+|KJ?co%>N8iEX|JKE)Z{OS-M_Q;WJFw4prvh0r&{V}7FjT& zUtD4RBO;T>DVr7CvqUEk3L6&OtGb|GoAZr7M=2li4Cn+!=Xkh${A_mUc9>5uq$*gI z_{g(E)aLsO9lEF@%^trc2|4cD_6tbt;PzafR;2t=AxT=e@^WCQ6J;tc{GZRt`|L&@ z{Vw$S{?8I>?wEhIClBZqhw7*B!Ku^zfPG;)B4vg<;Zm`0fA=B;Vnaed^W%xh>9Ww8 zs+Gd!I9JJtUqdh~BboRLhXROAFfJG^i6NHn!g#PkUKuI}vf-^4z-U=fxYvjRr-&R?Ntr9rBzS@D?2)Zxuz5nNvjs%LnCAG+U+Y&Ql z@2E%+I^_T6b&2bvnXKZftxtLuQ%}cCC({{QF>xFL+2K_}`9j@BB}v{E$GI`S*Fy|HuntmBRUjW#oT5J<|n~ z{(raz|3{nufAr(VMQSh`57Pe{@MWo@|5{hzy{PgLaPxuJ_lbi9)fOd)4Tg~4!^(2v zXUep`TKFcn!_d%4=)tRBJA@myB>d zy=-jm8~Vi(Tx5JXx!E^%IH2Lh{1I^=MCTBzor7|Xf~<#}jW<`Y;M<&?3EUS*TWvY@ z81UUtc3@O^p@>A+Tu;x6q|(U(Red4C1y#O9xe9bNjbt{C$!HJzlAx57Mpp;55T=2o zj@=87o6FNVSu~bp72m&Pkyo3nG?^;H6OZ7Zz26SZ+-adj`O<>Qm0`{;MyzK$Vmfa5 zR&&(WBTx6Z-q5#xIbm)DqH*P12j6uIZHiFEAamf3vg*X3{7{1l7vpJ%Qp;$a>`t8Q zPet9y4`7bLzpEBbX<<(lICB)gc0XZI+$}4c>#;rX%TTvJUiy|otHL21TjYGC&$3fN zl-fXlvZa>$xC+WL7CLsWq4xxo<*;Gc_Ww}#mQ8VXQIu%o?(Xg$+zA>865QQsEVy?k zKp+r2xVyW%1$TFMcem+xrfO#D{(yVy_Se((bU#P7th4so)9yq2@l~O}4kaA<+tN?O ze8ubA(~mjVxbR7BI;7QB<#C}Th!N4V>gp3?ScsY_ec01`*>NC7tvwE!+?O#iBsLzU zimU+WQ=JC@+tjD4fz9fg?5!l2EQU1^ty*&@02;{2YG|Cdy!)09r3W8hS~w97D#BT! z8n0iH-5iTHx&tyo*W3CD-~hAtuHG`%d&>w?^6cU(5%Ix*#E`~|1hozk? zvub>Cn&1W$dSBp(uq_#2w1Z_P0VlyexsRGS2gcu{u(bEPio3YBMqNVXKK>h<1CibD zFKSTW_iic#yD3T04UZ;Ri*bjE|IF|@l-$Dmj}+>#*yfEg>4gL+iR(X6FT=t90Ex^o z@8J^GjNeyKCQhO_V^aLh{q!PT>-}cMh&pXM<}h9B&vEIJ1HvSvfu9$WNr1!-3FF+z zE8!Dyh9!sB*}*RnsrhatJlj?7Mv~U=kR(T>%+kE+9%{1oWFjh-cghAcTeDOM zpz$e2XIolMf&6 z5DA4fr&<|Jim80{<;>zY}dpwt+{K3)u@CNqhUENoN z$V?%;o(ZWiUo&bO?zUAJ+8qAksg)EhIIx0?<#&wx->C#q;}tF|ovikaYePlQ)2Zv~ zKDDvmn*(Gy?xPG_amx}1XTz%R?uzi+rbTt7Okb9?+C_^t3DZ$8BP4H;XU*8-j%LL= z^~USmhYAFLBsiB>)f;}`J|GOh!_J!d3X%b`PUh^&tH0eiWF65%_S}@O5)X02uVquH zAKfM*LcLtXeXmCQvnXk?K<9sDjY_N+!FxIIx8D7J1F3O(LLQOuhs~2S`J(2|&(le{ zPl~0a=zTYIyP4uFipHrP6r;=fot^O^M&fQGPU1R>KEFZ+WS2=Y@b}KzKbc%bdSiI> znOvwn%Su<~O|2|%fq2m(K#+FeHm7bmmYl@Bf{GqbT3HWL*>28w1ALew_I_4}7~=*Q z4IcqKQ{mZnd1_7=$C>Fj+lxE@yV=9{~9uT60 z_ir|)Uc_I3#C0SE9S~qwzkiaeSFaU3cM$hC!EMZ>A>Q2A5-+723o(Tyj6RvJftgx} zBH_mtmur1&#QA<{#Qr+IoFK`_U(;Juv^j!Li|q|1X`+m=!CZ9K3}l7%B88s1nM;To z0LsqRL@PPZqu$s_~a5@QzL7b|-G zi4Hct#IN?`+}-OOcpeG*va~!e6$ZG(1ggBJ4kCtMPpaUZjL6L3V5d&3Pan|kbF=<= z-puvxum6r8SQ!h1PK9phemlF|;t#3TV`g@)*?D?M>OMKfNDLFo(#GZ>&wDoLp4v+I zE*Vwaw?Gr2Wu34IN6}gH+bDhZ!nrvmmDY`7GRu|`Ml)fB{clOml9gnI9R}E0ol(M!;oXFPnhsxJ&&iq6q>J@Hqg8@q(16xnqcjFs3d)t|5-$ehbm7`qpPmC=jSp5u4@CzlAoxbIrEfbo#GsY7{1 zjUK04JX@Kha2_N0a2e3NJOE|;U+AM;XKe3yraN4~X~B2~1GaD?UQmx#+%Hi5&?~-P z#%XqsT>{y@@AixSw`b-$>Iq0}@k&adF%^F-B_|&DFCS;7+%Y8LH@E`qA?Vl-y@Ur` zIPmUml{?lHNtTu51bLVD5NOy%MDT_3%X@L^+f{vpj@?HVylm;N*-5zk!N2-qbmJ=} z|LU^=zT6*z_@p@PDK27hXRFJbk6?JV2-Ih}kdWuJ{@LC$S=S%~H}A&TwmP*Bl`+T4 zGTw)}d2s>vHVVxDLXU^klb&*2Cz?1H)F`S3L+3xRf1S&M449j(2kiiVJUkoMd8Fgk zrWW!amK%g>aFFN|2kaEBF%l}{uPqmSD)ca=p(d*{$BO{82LOzl&~f?l*b&;;Y9Ci; zL#BAB;&p0`_yvNMn)|@-K@os|%D~)*Ka&(m9r%+Y#p&N@Gb(NF9?MeD*yPBxL!Kkq zID~%v!de+Rn*180B*?jA`EV#**(H1zQ(IsExmZ=%o+Je#qu-3{T}|Cc&_vYM4Tvr7 z{TK;Wq>tLEQ|NH#nT~t||ChtGFDUNszYZU!rq<&=pQ%Yl#t#o(*dq!7rq12m^?y{H z6SSbUR;2Ul24<{ySCg{XhP)Y^)W43`%2@8_BE1mFQ4gN6u47O*R!`VN|CJ>&$mH+J z70J1wc4BoP!)p(V?c2K(R-{WjVH7DnBlslzTTdO|NjmfHv8d;^1DiFY`fCPPIj+9` zN=4Kc!{zYAU-ZlCuvQnV_LEvNc3gV1*_JukWe?k?6REK=KUk-9$xsdE{C^y7=h~d) z`Ppm*AQp7(0dWQ@i-}SD=d&e*Bk_l!r2aFgy=oP1V%s%K4gkON4jX&p1zs}nE}BTRtgf zbt`L5PKifKQ~C(-c;(&6F+J^Lf8n!o{(=*n$96jf9B}|l0$XvJbj)DpkOr6#7_1aF zf9iW)z@8eEjnGr&UU)<%k1K^78?6ul41p6`o#LiV_J1jYLURE1^q$B+(#s{Y6*x!` zV}03n+`)V_`7B$badAd0d+;y57);c)`HhyG?{4KC#oK6~#FK9Z?uuCH#pvlyWLw zF*HCEok5PB?3MGd?@T(ErARClM;f+^j}PQqHuJ~qa4NhBTA*L7dAC$W=umb+?7J`h z<*$c0h~YRS)B3tM3@~X}gkn6dj>+SxUbiIzD3#XZQM9qA#E$XC^5*& z-?$bX00DKqWZ$l*%D>V2PBw>_96q2gO2=V6DGH?yS=9E`=mj2Tw1JxlnNqF*Iwly6Gx`x$nILs4Mu%(^*)bVK!%ph(nGL27C+bMcyDK6xt9i$6iZFBW|j z@(rM%J3`i;BuV`TzoqK@+O z`i%RO4Xg%Wl37M@U4)PqR^7y9_t6G^4E4R*WLq~6*5>JKOv41y4iRR@e2C$0qwqL@ zz9HS#sM!3KdP7&5Ezi@j)Q~rj?a4iHF+Hv15a#6wr*yJBx4=Y2u zoLd1w^%`ZLM;tiBG_5$I1R_1@*IvNzKILkvv`hk`C=#m7WcV@g9Fd>ZiPw6Gl;{I{ zPq;?DuL=5?+7FsSXX)gBgK++Gx>v0|(NG0|t-zS=?$0?HBUW1r;n&YNSJPv^-xGZc zLW}r)$}uq*eVmsb5z^x8Y9fwnmswCd)zg`tFFH{=eU=a22PyOF^&2bpa5NH?Mj{T9<15K@2% zOAY71#_JOEImyzsVQQ;U#ir9yiER5X<2d|c>dU4J1t?v}md=IHyRCTvoX1b~2w!#U z1A3^N3)qcGzvZYTn)eacsrelR4D*U{pU7G9w_+6S5koNT4l3)!n`AW?;d+eO;iE-I zsH!ITbfpl7lD2#4fZuNwQATs(BEFWZW`g#rR`<_=E!}&bLZk2!N+I*}*mP*%CC~2k zjYT%?hlY$qIJ`rCR~?v~n{Qv8oan<|BIY4=xotIM6A2_!A(YP*tiT{C=uU&9F;;H^5#zuE=Uj2)*I#@Epy|VkYsj>2H2PEW;D40CAIN1g>{N` z&A82T;);=l0(*DJSl( z4~7lo2b!@$5Wh%iSEguXI^}D0?GoSXf-UTY{btp@c_~)Tr&9;EsGA=>(7}fGNDDr+ zx_aE7!kz5vzN>Rs@4AWV-i#WMyP~)-H^&zjKS2Y+M|$69evb!sQx&s3Ap=7FJzCe& zrm63oVgs@BdrYJ38?sCJ4XW#Te*r15yG{5y?=Or$f2#H6&8dz11)m;sR|X#{3!(8E zBngZhQo!dc7S)u)RUN1z4M8(7zf)zTDNG31b9QIr>=~AuTTn4F% z&6DH*n7dd_`e?wJ+$&EAPwThFZ*iqUh;pPP-`iLD(EQQmGC$j-A$l_$q(9qw9(8#w z|Nd)or3A8AT4#QwKQ^cFvbJWKSipWs=_XDi6l}-B#=7g-y!W|TDybG1Aaz6R`j=1i zRl)hmFhO}wI)_)l)$nn|`28CH{;$z=fbLmsRXN?1e(wY&#HFi}MTHlUbnqVr_DTL9 z=#QN1|3aUzdjB^NoAdwYftc@|WgQR{jeCnl=GNni`wL{9G$4JLj(=UCJ#!MhuuenJ zPocE{-95-S{{Lg#q*|8|GF|`k^Z!1M{QoV8{n+3M4m}L~R*|DN$4l1o-ryM=Y6Q6_ zz%}`Vj8D!3i39)MZY!Z%aHnRz8ItawBB~z^3;^s|##IU`?g=>_}7R+~glI zGPVG^8IgYi$fdB__1z>Evb9u;kNIjTuel*L2OULrI+4H=Bty)s`Sn%V8%t4RS)SaD zneS5^qwvx+`hT(7cm9L$(<^`GghP9cO5a9eANK*_HF$Ax*Gx@YWTkJ#5YLXHdQ;G6 z$D1|EQ+?7J6DAjM>Q894{{cY8kei18K=pCeW@ISnINqEGuqy5>@vvr-l>F z{#cqX%A`;#Q7?P9H32DpH!Bo4hgy3+&RaBg3I!P;^4rE&W^0}hgXs6VrichFwUAtV ziK7L}r<{l2&(irN`hQ-(;b67*zE@Y!h5OvSuKZXYO+pFFJ-;_b3x^G-eLU-lr#j8M z%TLn!hBr4PQ$P+jt*9r{xtP72T?LH^O{`#p)mJUx6+B?n0) z1JFTst!E(-4F^WD{+ESnXXjf2aWVE(sW)&-FW~Ip<0W&0y?=fF{&(m)tl)EJa!xkw=4A z*t3wZSZKgSk@}fXW491QEpR)=ZRwDd*zWD|?=GA7#x5zU&C>d z?Z~~enTx5tx+zH@KzoYM>n$#7;01#rZvmgeJpkoag@65Pp#yvU)uC>`i0#XBOX1P^ zZvvEXq$Gw@P|LE2u2FL%VXgApND)C%p~jXDZ5taTw0&(93I;9_Y>Xn(z& z?|3?sp4t8H^;qCOUJtWscaVRBdn)dwj2`{8s>qbpZd*%R+`ptfxT%nSTJ}_3ZL=e^ z&xjS#flMqocHuq}Bn~56y6J@6=E)CavD&&x6z9pq_+6oOTbq%GC<*jfRa`NcN|fFz zwe4QDM6zj76Mc#I`y3mj9@nDQcK^_Jxx#cshoJ-slG5u)K{#wL4pys&?gl?e%ySHi z&PpM+Li?u(JdIF{R;h*tAuE0FiDR6uI!lVhF?O77yo+X>V!}OhULyIV$zlIOhxx$N z-eo&QM&U~#2OJ5G0v%kHvfq8Ht?!M?_6YtNZo;`(MCpD^lz1nv1$>r0hhHOMv+u&w z-2s6Yqn}lNeXA$`4JU&5^X+rh3~P>7Y-6UlUqkDYoByscyKl-m-u!Rj%n2T&Iu|~C zG>5W2Pl690?U$MKp?!&)$8Z#h=uzwCw56R-G`YL3%p!75zr76L0Wy&Un}P}iF2$^r z0wM_68g_3}YK>lv>{piu@jtCvFJCy=eWh)V4mLjOs;?hHGQ>9!>oRP-EB)WTSG}$0 zAWd&tgEB!y+bt_w2g9&kax@!Sl-~xSVTV31u%b`)0X5lf8(pdE1?5~t0#RA2hU%j%F8^WC23r0<5ZkHw>PuzZ z+W`KGu`eY@&ILy99Hr*E?q_ zjMR2Er+C)=Kk1+OH=*MtAisA&UDp>&bt|dWb%_QVeAwY< zt@VB{V`2N|Vp3w6h(=%Ad}BSlI!mZkuC4bap&?i%Y6Q9YuL9F0X_=PFAdx_Nq&;7{ zB9&Lu%#l4jrs4U$Kx~mPZ@wtIS=XIt$u%-zE>Ochz2sY&NkuE}Nu>EX?w^ zXoB<6u!d(VAFW9c^3luWK>=D^<^9@6Mv)y7k-n~IG4$J`m714>t4bEIRsY#6`zRO} z$Zw4rcp%94I2mo)(Y)TIZoa!Vwj4OzElzh9g4RB1s|n0r)?1;KhghOIsD{s1EKa`N zpQ+2lRWGk(wscghDCa=35SzrdmAS4pC@(Ed5o)6af-zTI8WnJd4UCIu3C<_{%bcU@ zKRCp4<5n>%NoV+t58va$Pej16n4(1!$HlVLy*g$dG;%a7t8nWZ!I!0`)=QTiKoWl} ztL)iI+lW;(@9~LOA9Pkz`Mq#&&u_)9mD``(Elt$$oZ^0U`Ri+2QrGJtul5ZoTYD`9 zyDd!0)#mMb(3_o*w&5Qp&!21zta}#Q@~>I^{Urd6O!25QvRMMOKX4oZ$}3UIAuA~< zO1~OBYAgX&kL=1SEh<7PVdDPemAclBJn^x6C{Htdt98x2>~khWO#;GOd=!2myXv-R zmyc~@;lA_(W!ZB!wBK1a#r5Rq5?7bkOCY^3g?YKR1aFGdwL)1d`;H9*)1OT?jet(b0)c60{^ z>TJrctr(yppO4#h@;$Ro=ovh>V#|!2btJFLq6;T}Yiw5K6Qpun{>k0JL1uw=%SxSQ z%s!_<)2>7*E@%ma3LMYV57S-R_Uy>TZ#9_QhY`cSt^&Q%HEy49tC-CRo(14zeB~oRhLy{dvCEyH%SOO(L8wkZ68# z$1|tfEWfs!r>pC8xcDfae}vA>PrXMSs+z6~N6BL?iH-DfqAThxgmt{f;p$+E7><#>%?>WZyI zM-m4hf?rv3yhn(e(}u_kcO*}pu)^9^fxQxneIePrIMOt&?~IEkRk@J!O6Y`4l$^n% z_Q{?+@J=o!K2($$QquXqxBxRLo40?SuFTxI{WZXeLwJDF6ZeyWLwBPl&;d4}TeZ9zETAh-F>5)UvN=CN3txmc`XC67H;=$=^;HlQ4+m+C#t zY@o~-pFqJl#i*d@`8%{o^LUhP+9-J9op_rw(@-b!#K|h;DA3yZ@q?4#MSps`+*&H% z4&C`7b9umjFXW<8Xsv&{XMVf;?7r43&X)EN9=D!a9^$!BMjk#LLA{g@Inn^;U518b zn|p7o{G7XViVSbal(id-aB;w(={eGzZUJZC7E+^fRuL7DYx^1M+U=23;Agl7z^t&z?7+aLUv+%DRm?)P~71#UcH9YgeF_Cs- zjzcWDDjZz#FY|TB@o=jr;iI-!PJg7&@^Kk{UgYJUG0e!Jy|X)&md?}F%IxFbiT1BE z4%hkYVHYG!hlbh==1f~x$0!n0!Ng(eLs)PVYcJ;QB3<|hvLMz(uQ>u(LkM9pQnNd~ zs4TtMvP_&}2<20b@VD1Hdy*P3RWA^;JK!v3iTJzRWT6 z8l++^AJ1Z&`rmNoaw5Nrkr8`*tn?aS-VVrU zxJz^mW;y$Bn(SygIOrR%gcL~OZapAsL+9uMvJ&s>5Wes7NJwNN)zWN#%XIdt93%5@ zo^4u)Hg58{b*?Mt^P4G2s7*0|vQ5QK+RHERVe0pw?~ zvHTx`Vv@^y{zB19eMP7z^D&CMyVy-Yl9Eaif2oAW!ty7)XK~8$S~B%UV<5SUZ%Zbl zht89@G$!F?)Du!umP&Hr(-t^#AP{~_g!wT3I-Dn$$?%>WbN)I%qcv>CNse*!cX8(t zgXqfTD}k+^BX_M%Q8NOn62o&)4;A-J*l##0?&Qs?hTh?O#%!y)LXjuD0%lrPg%A?HrUYBQxqWTKEp{ zm$Ub=UHqQTK{8fiPL=dG2JgoYA!{Z?tK6BR^dC3Hq)Uq}`xJ>L6wcwL`CbBfk!1Dz zBkZC&K=MIVXXB4!6{X+551akGEnKP6{`7Gz&kHm;98gr^n49NqAH!C`V&&x<0Fov_Wu2=pMfF#H^7D2nif zPtoJ~j|KO02Otxz2&p5fqqb0quiivcz5athN~Wtx+nFRr`6ye|f0gRXBnsDAp{PX9 zALAVOm5<()({-s-?bmcwx0 z!8@dd)oA;iMzxtwi}FW-9laZbY#CC0v|gb4Aw8DzqRO*g8}VWNIpX_I&nlm!LpV1= zg39F7pJR*m?%k%SMpLV4PKNS2rZ?P8eni?!{c`$+{w_cFzN1q+xi(hN`zic!h!o%e zr1;(ItRyEBSS_f)z4=_U6*X`YLANy{??&RXb2ZFVNR5%vKt_2i&ZBZf(2?vXXJiPe z6d{`9{}d4McQ~sFm<`TsAdqR2d&`W_ z3lom%JgehpE7AZIJzUU5TG|$@bduRCVUKoyjV$(EItahI&3mc+-U=o0xuaDxu>N9v z_xC_%{OwKrwW<6;mrm6LtcEH~^ossC$xo=nUPK9X^Q%sWIZB1hwOe<)K3nq6uS*5@24Ey<1uB|{7m!Z$s&h;uz)uR67^FjG68)v1T{9{bt2hY&9mp=)lMGLy3r zssdou5rg_V<4^HczYV<6!`A_|wGpQjrlU0-AYwKg2SQZH;F|X;`ahTCI^@D2HzBz1 zHj`*wr&mcaU(fJ18|UP>y?#6H97+`emy-u#wTPF3G^VsaJ>x+{v*y>EeH(HZ^c$;K zdu<4W3=uF7Dm|8?i5#&6yVjrl%Vcg4Sa=Wv@!#ah;j*q$RcA8#zHx2N5C!VPf~hJ4 zWC#FRdE$$K^9+9O*+!nfsEl*v&8Z41i;`L>$93QU;{j_0wjYZ#wPM{!d3cMfJ$Q|X zCN_jpQa*1XS>Gh_ngp3z;JSXEjQ7IF`nc&w*~zg4X=4P{XL3I)$aX^1<%h+P$+vEL zbtah=Pmh7NhF3@t1BMcL$e9n?;-n=x4)k}oV%W%Kd|RHm!XG`9CDK4PU-<`9~WKA>y+Jd?kH zuJbs2?>b}5rB&)euOEFaJlUY}oG>l?=q0rnG*P-SiugeAFvI!2-_q%By71~`cyl); zDTnaxUPF=pFUNo>2^OcycnT=?2ZnJW3{1?C^@}gR&z=Fpx5O?Zl?PM1RODqO zB@TF6b{*fi3*hn!>t_%gtPXHbU1*0@J0Bnah7*ak0Av+Md|jF^-thkg5;F)3!T%tK zmacu+wl+p%0KJMCJ2*TR<~8!o^V9e~p|_?PwKlG=hW>NC+F|0q?t=!qygo@*SlZH| zNR-YULq&MLk4!-OUc#o<=GUscx??%?x@MwI%(-kGOk_F^DcC&?T-48#pXnKH0)Kx+wc`rIhYfs;?RfH7|l>uQC>yIGlnW2O>C#Q`V z#doKKHfBy!SD~RFcElXL;`B_2v>iXvH0`i~5<0ut$ZH1~3+J2NHy836Y$R;=h>`8Bm~n+9kX%_cDaoM5>|NeMk{x5nL&W=qQHxgPEVhJ`(&9b)^y9X9RB_?8O?AHnKJ*Rha#lDnW~pfjj@w zl^N2F+I`Lr+5~{26c8Zu&8qS)ZKlvug@~Ntd=lLQksOf{#ted25{FCXtF1kFQ$bk>GiZ(bNn#xT@&D*V%Wx znty65t}2y+#;aJY`y0UPVakk6JHLHY?o6C3X~lW>Gf0~^Y$ z@xi;tLi}!Qq*twff_*m{W=+qB50C+A84W`6f^T9-`Yj$NCjVT&bYx?QkzpGwpbZra zVuR}+@i*O0{{|5*$vt!!Yc%%}3GjQ-U_+kq==reii$>}0&b>iuP|Mq=j>?<40y@Bz zIjTA<5M%22f^iQ7ZLth)pSKFF^VdKGa-wYA->nBr|ypac^JS#OG6a%*)aC!YN#S&AAlXG;gQ0Vv=0 zeEfNAB2IVk+5qG zm@%ag)I-yvC+Fa$OLx_Qii3&%_2L~Mvzoa_hWv}V48$;?fK*eezpX0!>fVd`vM6j? zd^H1(bT9!Od?E3}$8E?qE$shh=5k`nyjJGx+Bh8VR0IwTHhx-M9v6YlCg__@d9=#d zAWBH<>@poW9slB*6{aGJFE@d|Nrx6cukq&BVCkhC@>PiTsF8j@VYD}Z1Qz_-z1|#z zDTz2~YQ8s|?8(KV8DtnR<+Q3MGmG&^M}|vvRvbUQq8_4%3ILBAy&g%byNoqdNAu=X z%WhfZwOa0->UnGR-6%kv`CkaUylWcmfyek3-BXUCQsbfO{mg{BvCw#-)oa9GU!oMl z|3w(hzx znk{GMz;8FM#6WX%90i`HT9jsn!;J9+7n$DdV-wR9D~ZT{Tw!?oQ9~SzMjakjD%*f$ z7=XJBE8jep@%UL;29~koRuor%Ej7Bw3KKRRSpIDdaGBg#{r(IMVyvEkM~CH0!X>fM zr4-B~zx48Wa8pNqNVln>RY`!NtY%L^aMw;{ky5ezs2suWQQmKW2A?K~wG7_qa@GEp z`)bxdE-u0$NYs`0{&}kOcW_O@>*bGe*9}5$pX{^uUqGYJC~hoDLrm%Ik1` zOSCn2XG0OlxwvIvc*QJL`8rrIAMxV=70>^TNLDi;s;Moeoa1f1v9;Bwx5kBQLbJ&S z+L!;)FQ5z$IXS1K7uyDu0tIOD3qYx}r;k`~XJ1U#(37}E7^m#oyY;0jvNL7V#=YdH z>tGJ({FyH)=9B=1p~Ou&a0SaoE}_IHHlFI+dt!St!deCm(>m5e>_v@G*=U>K(*0_! zo;gO0K>03MoA|VMU5i1yAt)lovX8E4s}W~aQ(Sf-fj^Cp&{`CUk9$iH##nY9# z*lcl$aZZB;I`WNTX8u{pH`#nl7@@I-1x5~)0gh6>gHj9?nXR{TB=iXNqw4!b(yoaV z7b?-~(9bVrSJ4aDRXxZ>FC7O;xM*G8ez4JSB2@`8YQg?ri%=6IS@S?L^62|PjP1Lo zLvovDG$X0LY&HY1I^kw8RVC0$mJKicl%(S=!l0dK8UfB*7=RYvKfO2Oga#5~Y)M4# zT4@nhUCjP>*;9@sz0U>#TV@6IKcm?~+Z+o?ck3B+PuEcbcw?3nP`zZ2Gs+XX;N^Z^$l1r&-*t|W;KVVxvVQW?Sul3} z>dTW4|BKBdl`;Mg8-UL$5g>CMv{;hOvM?Od@F0!arMYw`jRR)n+{&Ow<+6d;ai+-&XyiV6H50dZKlywaa!Z{3)cwMj~`W}fxu*1{ke`ai44A}8C+Am-d+My#atW@OV zXG#5@%|-tZYU=K`t7On>zQx zp`ki~RmRYYI;5N#nort3i7EV!xJP)y*GJ19ur^Via9i`kz1mVut?!`pwf5Q%Rdo%5gK*f_)-22?{c)IbhR~opcWo~Y3<>-GBYV3^`2;6hONj}kEsGo6AW=Wb^2kP_ICVXh=$%rjUKLRkYPAV6dicc-iULecF@@(te>zp zb;FejE!s$E%tYjjZoIJ;Ns8PQ!`Am9%4AH0xMX*fpJ}bG=PRx#%(31S-6EVBa2W;4 zV>ciQeJo#ombJTDYB^aZSeWSecAeOx6wXTW)chOtFa5{+m&FC!sc>NF$WjfG;O)7M zFh?BsvSGXFk}N*!>e{uLb_)#pzgpd{sSBr}vJs9|C&j{|Vmv@!-_Q^(K;XI3AZ!t; zOWcL2?%Di#N*ib8!tf8J=*NsAzRTfsU#)E~&C4pfMJCJe(et%{)6;VQ~%VN|r<@*?IzjpfT`9Sv= z#aMl4>pKztC1x_+ZtXqs(Qu{EQUcaDwv$T>qC=DRmkwt#M13rdTtqKik0plly*?1f z<%y{C7si8sxzxU(B*FISc+yPf&Li<#X#)(FjlfHU-CfnoTyZ)^ z-qo@b=_!jW!diG-JxzULI_BL;HIvP1tbD6uFd8)t&&_CugBfCVvZKDIZX|D<`B&m) z7TUp%f7gp{1IJYlHE4ebH-5b`XLCDGt~qLVcoGNC8^GV!y>v)q`PaRsn$z7B;lSUc?Gnxuv&=xN)TGV@^fFW26?# z+3Q>Y-;+;SvAS>lr}{<42P7lpH-z1tl%_^8g-8^Bxtk4<;XEsPb#Cx3B3cxPbm?{f zPJsz^6i{tY!b;-@Zt z8N#ay#}mPTk>SXE_?_&{TL+VczGV%;H7P%O<`03iUhu$>Nc%KfKgDj}!*>8csu2Sj zrpw1nQ6aQAr%Bs>b(Y{4Y8P`v`oVN;l0Kd*W<;vwCiv7+Tft0-O>2QWHEx#n}ZaDhRK7eJwgBIhBw2j9D;*eZ(k$Ga-(j?}|rSCd? z85R-JDbHkf$%Vq*yy177T#aTQH=y^4w~?l7Z9#ypD!RpR`oD1x%Av5cCKUvuIkbRL zyVWAX*TplQhAs;k!MTCx;spfq3shSFJ$vmxkp!8?Z7+W$V$ZBWa-gj>venKC66k2W zJ;4iT$&8EHi|#ghp$uUjg&j|VAmpq#|MdtEgY<9HrbIMvy$$}K)^TQ^FiHdcMHqRh z;RSCvsk#d_oGDlP*hBKt`Tj1jc@>Q4hY+Bcd3Nx_o9Cy%0JgAyoeclMUaq&ydnV*9TBBSueArr z1v7n^Ysl}HkUlL0X!>HH`(_uOK0VHw$7oO9K{WdB`S|jE2*fjz2vkrFNE%KP4zC?L zqVeU?j!l- z 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 { return kernel.model.exists(modelId); } -//换棚子 -const executeEvent2 = async (result) => { +//一般是换棚子/换颜色/显示放置区域 + const executeEvent2 = async (result) => { const kernel = getKernel(); // 检查是否有模型更换事件 @@ -214,10 +214,10 @@ const executeEvent2 = async (result) => { let modelAlreadyExists = false; if (hasModelChange) { const firstModelEvent = result.data.events.find(e => e.event_type === 'change_model'); - if (firstModelEvent) { - const { category } = firstModelEvent.target_data; - modelAlreadyExists = isModelExists(category); - console.log(`检查模型 ${category} 是否存在:`, modelAlreadyExists); + if (firstModelEvent && firstModelEvent.target_data) { + const {name, category } = firstModelEvent.target_data; + modelAlreadyExists = kernel.model.exists(name+'_'+category); + console.log(`检查模型 ${name+'_'+category} 是否存在:`, modelAlreadyExists); } } @@ -241,12 +241,10 @@ const executeEvent2 = async (result) => { }; const { id, name, file_url, model_control_type, category, placement_zone } = target_data; - console.log('替换百叶模型:', event); - console.log('替换百叶模型类型:', category); // 如果模型已存在,跳过加载 if (modelAlreadyExists) { - console.log(`模型 ${category} 已存在,跳过加载`); + console.log(`模型 ${name+'_'+category} 已存在,跳过加载`); continue; } @@ -269,7 +267,7 @@ const executeEvent2 = async (result) => { modelControlType: model_control_type, }) - console.log(`百叶模型已放置为 ${name}`); + console.log(`模型已放置为 ${name}`); } } diff --git a/examples/index.global.js b/examples/index.global.js index 9710cc6..20800a2 100644 --- a/examples/index.global.js +++ b/examples/index.global.js @@ -355762,14 +355762,26 @@ clipPos=viewProjection*worldPos;previousClipPos=previousViewProjection*previousW const color = Color3.FromHexString(options.albedoColor); material.albedoColor.copyFrom(color); } - if (options.albedoTexture) { - material.albedoTexture = new Texture(options.albedoTexture); + if (options.albedoTexture !== void 0) { + if (options.albedoTexture) { + material.albedoTexture = new Texture(options.albedoTexture); + } else { + material.albedoTexture = null; + } } - if (options.normalMap) { - material.bumpTexture = new Texture(options.normalMap); + if (options.normalMap !== void 0) { + if (options.normalMap) { + material.bumpTexture = new Texture(options.normalMap); + } else { + material.bumpTexture = null; + } } - if (options.metallicTexture) { - material.metallicTexture = new Texture(options.metallicTexture); + if (options.metallicTexture !== void 0) { + if (options.metallicTexture) { + material.metallicTexture = new Texture(options.metallicTexture); + } else { + material.metallicTexture = null; + } } if (options.roughness !== void 0) { material.roughness = options.roughness; @@ -357185,6 +357197,19 @@ clipPos=viewProjection*worldPos;previousClipPos=previousViewProjection*previousW */ removeAll: () => { this.mainApp.appModel.removeAll(); + }, + /** + * 检查模型是否已加载 + * @param modelId 模型ID + * @returns 模型是否存在 + * @example + * // 检查模型是否已加载,避免重复加载 + * if (!kernel.model.exists('shed_001')) { + * await kernel.model.add({ modelId: 'shed_001', modelUrl: '...' }); + * } + */ + exists: (modelId) => { + return this.mainApp.appModel.exists(modelId); } }; /** 材质管理 */ diff --git a/index.html b/index.html index 6a3a60f..9c27841 100644 --- a/index.html +++ b/index.html @@ -302,8 +302,8 @@ - - + + @@ -333,11 +333,11 @@

- - + + - - + +
@@ -586,7 +586,7 @@ // 监听模型点击事件 window.addEventListener('model:click', (event) => { console.log('模型被点击:', event.detail); - const { meshName, materialName, modelControlType } = event.detail; + const { meshName, modelName, materialName, modelControlType } = event.detail; const clickInfoDiv = document.getElementById('click-info'); const clickInfoContent = document.getElementById('click-info-content'); @@ -596,8 +596,8 @@ 模型
- 网格名称: - ${meshName} + 模型名称: + ${modelName || meshName}
`; if (materialName) { @@ -866,6 +866,8 @@ // DOM 2D转3D 示例:点击模型时显示信息框 if (data.pickedMesh && data.pickedPoint) { const meshName = data.pickedMesh.name; + // 获取模型根节点名称(modelId) + const modelName = kernel.model.findModelNameByMesh(data.pickedMesh) || meshName; const position = data.pickedPoint; // 使用点击位置的坐标 currentMaterialName = data.materialName || ''; // 保存材质名 currentPickedMesh = data.pickedMesh; // 保存网格对象 @@ -873,7 +875,7 @@ // 获取已创建的DOM元素 const infoDiv = document.getElementById('model-info-box'); // 更新信息内容 - document.getElementById('info-name').textContent = `名称: ${meshName}`; + document.getElementById('info-name').textContent = `模型: ${modelName}`; document.getElementById('info-position').textContent = `坐标: [${position.x.toFixed(2)}, ${position.y.toFixed(2)}, ${position.z.toFixed(2)}]`; // 显示颜色按钮,隐藏旋转按钮 @@ -888,6 +890,8 @@ // 显示旋转控制UI if (data.pickedMesh && data.pickedPoint) { const meshName = data.pickedMesh.name; + // 获取模型根节点名称(modelId) + const modelName = kernel.model.findModelNameByMesh(data.pickedMesh) || meshName; const position = data.pickedPoint; currentPickedMesh = data.pickedMesh; // 保存网格对象 diff --git a/index.js b/index.js index 4340d96..fd8d3c8 100644 --- a/index.js +++ b/index.js @@ -37,9 +37,9 @@ export const init = async (customConfig = {}) => { modelUrlList: [], env: { envPath: 'https://sdk.zguiy.com/resurces/hdr/hdr.env', intensity: 1.2, rotationY: 0.3, background: true }, gizmo: { - position: true, - rotation: true, - scale: true + position: false, + rotation: false, + scale: false }, outline: { enable: true, @@ -67,7 +67,7 @@ export const getAutoLoadModelList = async () => { const models = data.data // 这就是模型列表 models.forEach(model => { - console.log(model.placement_zone); + if (model.placement_zone) { const { alpha, border_color, color, show_border, thickness, walls } = model.placement_zone kernel.dropZone.setData({ @@ -80,8 +80,9 @@ export const getAutoLoadModelList = async () => { walls: walls }); } - + kernel.model.add({ + modelName: model.name+'_'+model.category, modelId: model.category, modelUrl: model.file_url, modelControlType: model.model_control_type, @@ -148,18 +149,18 @@ export const executeEvent = async (dropzone_data, result) => { if (event.event_type === 'change_model') { console.log(event.target_data); - const { id, name, file_url, model_control_type, category } = event.target_data; - console.log('替换百叶模型:', event); - console.log('替换百叶模型类型:', category); + const { name, file_url, model_control_type, category } = event.target_data; + // 生成唯一的模型ID - const modelId = id + '_' + Date.now(); + const modelId = Date.now(); // 先记录模型放置(会自动处理替换逻辑) kernel.dropZone.recordModelPlacement(wallName, index, modelId); console.log(Math.abs(rotation.y - 90), Math.abs(rotation.y - 90) > 5 ? 'x' : 'z'); // 加载并放置模型 await kernel.model.add({ + modelName: name , modelId: modelId, modelUrl: file_url, modelControlType: model_control_type, @@ -174,7 +175,7 @@ export const executeEvent = async (dropzone_data, result) => { } }); - console.log(`百叶模型已放置为 ${name}`); + console.log(`百叶模型已放置为 ${name+'_'+category}`); } if (event.event_type === 'change_color') { @@ -202,12 +203,25 @@ export const executeEvent2 = async (result) => { // 检查是否有模型更换事件 const hasModelChange = result.data.events.some(e => e.event_type === 'change_model'); - const modelExists = await kernel.model.exists(modelId); - console.log(modelExists); - // 只有在需要更换模型时才清除 + + // 检查新模型是否已经存在 + let modelAlreadyExists = false; if (hasModelChange) { + const firstModelEvent = result.data.events.find(e => e.event_type === 'change_model'); + if (firstModelEvent && firstModelEvent.target_data) { + const {name, category } = firstModelEvent.target_data; + modelAlreadyExists = kernel.model.exists(category); + console.log(`检查模型 ${name+'_'+category} 是否存在:`, modelAlreadyExists); + } + } + + // 只有在需要更换模型且模型不存在时才清除 + if (hasModelChange && !modelAlreadyExists) { + console.log('模型不存在,执行清除操作'); kernel.dropZone.clearZones(); kernel.model.removeAll(); + } else if (modelAlreadyExists) { + console.log('模型已存在,跳过清除操作,仅更新材质'); } // 先处理所有 change_model 事件 @@ -221,7 +235,11 @@ export const executeEvent2 = async (result) => { }; const { id, name, file_url, model_control_type, category, placement_zone } = target_data; - + // 如果模型已存在,跳过加载 + if (modelAlreadyExists) { + console.log(`模型 ${name+'_'+category} 已存在,跳过加载`); + continue; + } if (placement_zone) { const { alpha, border_color, color, show_border, thickness, walls } = placement_zone @@ -237,12 +255,13 @@ export const executeEvent2 = async (result) => { // 加载并放置模型(使用 category 作为 modelId) await kernel.model.add({ - modelId: category, + modelName: name, + modelId: category, modelUrl: file_url, modelControlType: model_control_type, }) - console.log(`模型已放置为 ${name}`); + console.log(`模型已放置为 ${name+'_'+category}`); } } diff --git a/src/babylonjs/AppDropZone.ts b/src/babylonjs/AppDropZone.ts index 94b9d4b..52f0e47 100644 --- a/src/babylonjs/AppDropZone.ts +++ b/src/babylonjs/AppDropZone.ts @@ -145,18 +145,24 @@ export class AppDropZone { return null; }; - // 更新配置中的墙面分割数 - this.dropZoneConfig.walls = this.dropZoneConfig.walls.map(wall => { - const newDivisions = matchWallName(wall.name); - const finalDivisions = newDivisions !== null ? newDivisions : (wall.divisions || 1); + // 更新配置中的墙面分割数,只保留后端配置的墙面 + this.dropZoneConfig.walls = this.dropZoneConfig.walls + .map(wall => { + const newDivisions = matchWallName(wall.name); - console.log(`墙面 "${wall.name}" 匹配到分割数: ${finalDivisions}`); + // 如果后端没有配置这个墙面,返回 null 标记 + if (newDivisions === null) { + return null; + } - return { - ...wall, - divisions: finalDivisions - }; - }); + console.log(`墙面 "${wall.name}" 匹配到分割数: ${newDivisions}`); + + return { + ...wall, + divisions: newDivisions + }; + }) + .filter(wall => wall !== null) as typeof this.dropZoneConfig.walls; // 过滤掉未配置的墙面 // 清除旧的放置区域网格(不清除模型) this.clearZones(); diff --git a/src/babylonjs/AppModel copy.ts b/src/babylonjs/AppModel copy.ts new file mode 100644 index 0000000..a3ac236 --- /dev/null +++ b/src/babylonjs/AppModel copy.ts @@ -0,0 +1,748 @@ +import { ImportMeshAsync, ISceneLoaderProgressEvent } from '@babylonjs/core/Loading/sceneLoader'; +import '@babylonjs/loaders/glTF'; +import { AbstractMesh } from '@babylonjs/core/Meshes/abstractMesh'; +import { Mesh } from '@babylonjs/core/Meshes/mesh'; +import { Quaternion, Vector3 } from '@babylonjs/core/Maths/math.vector'; +import { Scene } from '@babylonjs/core/scene'; +import { Monobehiver } from '../base/Monobehiver'; +import { Dictionary } from '../utils/Dictionary'; +import { AppConfig } from './AppConfig'; +import { EventBridge } from '../event/bridge'; +import { DragConfig } from './AppModelDrag'; + +type LoadResult = { + success: boolean; + meshes?: AbstractMesh[]; + skeletons?: unknown[]; + error?: string; +}; + +type ModelConfig = { + name: string; + url: string; +}; + +type ModelControlType = 'rotation' | 'color'; + +type ModelTransform = { + position?: { x: number; y: number; z: number }; + rotation?: { x: number; y: number; z: number }; + scale?: { x: number; y: number; z: number }; +}; + +type ModelMetadata = { + modelName: string; + modelId: string; + modelUrl: string; + modelControlType?: ModelControlType; + drag?: DragConfig; + transform?: ModelTransform; +}; + +/** + * 模型管理类 - 负责加载、缓存和管理3D模型 + */ +export class AppModel extends Monobehiver { + private modelDic: Dictionary; + private modelMetadataDic: Dictionary; + private loadedMeshes: AbstractMesh[]; + private isLoading: boolean; + + constructor(mainApp: any) { + super(mainApp); + this.modelDic = new Dictionary(); + this.modelMetadataDic = new Dictionary(); + this.loadedMeshes = []; + this.isLoading = false; + } + + initManagers(): void { + // 预留接口 + } + + /** 加载配置中的所有模型 */ + async loadModel(): Promise { + if (!AppConfig.modelUrlList?.length || this.isLoading) return; + + this.isLoading = true; + try { + await this.loadMultipleModels(AppConfig.modelUrlList); + EventBridge.modelLoaded({ urls: AppConfig.modelUrlList }); + } finally { + this.isLoading = false; + } + } + + /** + * 批量加载模型(内部方法) + * @param urls 模型URL数组 + */ + private async loadMultipleModels(urls: string[]): Promise { + const total = urls.length; + EventBridge.modelLoadProgress({ loaded: 0, total, urls, progress: 0, percentage: 0 }); + + for (let i = 0; i < urls.length; i++) { + const url = urls[i]; + const result = await this.loadSingleModel(url, (event) => { + this.emitProgress(i, total, url, event); + }); + + this.emitProgress(i + 1, total, url, null, result.success); + + if (!result.success) { + EventBridge.modelLoadError({ url, error: result.error }); + } + } + } + + /** + * 发送加载进度事件 + */ + private emitProgress( + loaded: number, + total: number, + url: string, + event: ISceneLoaderProgressEvent | null, + success?: boolean + ): void { + const currentProgress = event?.lengthComputable && event.total > 0 + ? Math.min(1, event.loaded / event.total) + : 0; + const overallProgress = Math.min(1, (loaded + (event ? currentProgress : 0)) / total); + + EventBridge.modelLoadProgress({ + loaded: loaded + (event ? currentProgress : 0), + total, + url, + success, + progress: overallProgress, + percentage: Number((overallProgress * 100).toFixed(2)), + detail: event ? { + url, + lengthComputable: event.lengthComputable, + loadedBytes: event.loaded, + totalBytes: event.total + } : undefined + }); + } + + /** + * 加载单个模型文件 + * @param modelUrl 模型URL + * @param onProgress 进度回调 + */ + private async loadSingleModel( + modelUrl: string, + onProgress?: (event: ISceneLoaderProgressEvent) => void + ): Promise { + try { + const scene = this.mainApp.appScene.object; + if (!scene) return { success: false, error: '场景未初始化' }; + + const result = await ImportMeshAsync(modelUrl, scene, { onProgress }); + if (!result?.meshes?.length) return { success: false, error: '未找到网格' }; + + this.loadedMeshes.push(...result.meshes); + return { success: true, meshes: result.meshes, skeletons: result.skeletons }; + } catch (e: any) { + console.error(`模型加载失败: ${modelUrl}`, e); + return { success: false, error: e?.message }; + } + } + + /** + * 克隆模型材质,避免多个模型共享同名材质 + * @param meshes 网格数组 + * @param modelId 模型ID + */ + private cloneMaterials(meshes: AbstractMesh[], modelId: string): void { + const scene = this.mainApp.appScene.object; + const clonedMaterials = new Map(); + + meshes.forEach(mesh => { + if (mesh.material) { + const originalMaterial = mesh.material; + const originalName = originalMaterial.name; + + // 如果该材质还没有被克隆过,则克隆它 + if (!clonedMaterials.has(originalName)) { + const newName = `${originalName}_${modelId}`; + const clonedMaterial = originalMaterial.clone(newName); + clonedMaterials.set(originalName, clonedMaterial); + + } + + // 应用克隆的材质 + mesh.material = clonedMaterials.get(originalName); + } + }); + + + } + + /** 为网格设置阴影(投射和接收) */ + private createModelRoot(modelId: string, meshes: AbstractMesh[]): AbstractMesh[] { + const scene = this.mainApp.appScene.object; + const root = new Mesh(`${modelId}__root`, scene); + const meshSet = new Set(meshes); + root.position.copyFrom(this.getMeshesBoundingCenter(meshes)); + + meshes.forEach(mesh => { + if (!mesh.parent || !meshSet.has(mesh.parent as AbstractMesh)) { + mesh.setParent(root, true, true); + } + }); + + this.loadedMeshes.push(root); + return [root, ...meshes]; + } + + private getMeshesBoundingCenter(meshes: AbstractMesh[]): Vector3 { + const renderableMeshes = meshes.filter(mesh => !mesh.isDisposed() && mesh.getTotalVertices() > 0); + if (!renderableMeshes.length) return Vector3.Zero(); + + const min = new Vector3(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY); + const max = new Vector3(Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY); + + renderableMeshes.forEach(mesh => { + mesh.computeWorldMatrix(true); + const boundingBox = mesh.getBoundingInfo().boundingBox; + min.minimizeInPlace(boundingBox.minimumWorld); + max.maximizeInPlace(boundingBox.maximumWorld); + }); + + return min.add(max).scaleInPlace(0.5); + } + + + setupShadows(meshes: AbstractMesh[]): void { + const appLight = this.mainApp.appLight; + if (!appLight) return; + + meshes.forEach(mesh => { + if (mesh.getTotalVertices() > 0) { + appLight.addShadowCaster(mesh); + mesh.receiveShadows = true; + } + }); + } + + /** 获取缓存的网格 */ + getCachedMeshes(name: string): AbstractMesh[] | undefined { + return this.modelDic.Get(name); + } + + /** 清理所有资源 */ + clean(): void { + this.modelDic.Clear(); + this.loadedMeshes.forEach(m => m?.dispose()); + this.loadedMeshes = []; + this.isLoading = false; + } + + /** + * 添加模型到场景(支持单个或批量) + * @param modelConfig 模型配置对象 或 模型配置数组 + */ + async add( + modelConfig: ModelMetadata | ModelMetadata[] + ): Promise { + // 批量加载 + if (Array.isArray(modelConfig)) { + return await this.addMultiple(modelConfig); + } + + // 单个加载 + return await this.addSingle( + modelConfig.modelName, + modelConfig.modelId, + modelConfig.modelUrl, + modelConfig.modelControlType, + modelConfig.drag, + modelConfig.transform + ); + } + + /** + * 添加单个模型 + */ + private async addSingle(modelName: string, modelId: string, modelUrl: string, modelControlType?: ModelControlType, drag?: DragConfig, transform?: ModelTransform): Promise { + // 检查是否已存在 + const existingMeshes = this.modelDic.Get(modelName+'_'+modelId); + if (existingMeshes?.length && !existingMeshes[0].isDisposed()) { + console.log(`模型 ${modelName} 已存在,直接显示`); + this.showMeshes(existingMeshes); + return { success: true, meshes: existingMeshes }; + } + + // 加载模型 + const result = await this.loadSingleModel(modelUrl, (event) => { + this.emitSingleProgress(modelUrl, event); + }); + + if (result.success && result.meshes) { + // 克隆材质,确保每个模型有独立的材质 + this.cloneMaterials(result.meshes, modelId); + + result.meshes = this.createModelRoot(modelName+'_'+modelId, result.meshes); + this.modelDic.Set(modelName+'_'+modelId, result.meshes); + + // 存储元数据 + this.modelMetadataDic.Set(modelName+'_'+modelId, { + modelName: modelName, + modelId: modelId, + modelUrl: modelUrl, + modelControlType: modelControlType, + drag: drag, + transform: transform + }); + + // 应用 transform + if (transform) { + this.applyTransform(modelName+'_'+modelId, transform); + } + + // 配置拖拽功能 + if (drag) { + this.mainApp.appModelDrag?.configureDrag(modelName+'_'+modelId, drag); + } + + // 更新 GameManager 的字典 + this.mainApp.gameManager?.updateDictionaries(); + + EventBridge.modelLoaded({ urls: [modelUrl] }); + } else { + EventBridge.modelLoadError({ url: modelUrl, error: result.error }); + } + + return result; + } + + /** + * 批量添加模型 + */ + private async addMultiple(models: ModelMetadata[]): Promise<{ success: boolean; results: LoadResult[] }> { + const total = models.length; + const results: LoadResult[] = []; + + EventBridge.modelLoadProgress({ loaded: 0, total, progress: 0, percentage: 0 }); + + for (let i = 0; i < models.length; i++) { + const { modelName, modelId, modelUrl, modelControlType, drag, transform } = models[i]; + + const result = await this.loadSingleModel(modelUrl, (event) => { + this.emitProgress(i, total, modelUrl, event); + }); + + if (result.success && result.meshes) { + // 克隆材质,确保每个模型有独立的材质 + this.cloneMaterials(result.meshes, modelId); + + result.meshes = this.createModelRoot(modelId, result.meshes); + this.modelDic.Set(modelId, result.meshes); + + // 存储元数据 + this.modelMetadataDic.Set(modelId, { + modelName: modelName, + modelId: modelId, + modelUrl: modelUrl, + modelControlType: modelControlType, + drag: drag, + transform: transform + }); + + // 应用 transform + if (transform) { + this.applyTransform(modelId, transform); + } + + // 配置拖拽功能 + if (drag) { + this.mainApp.appModelDrag?.configureDrag(modelId, drag); + } + } + + results.push(result); + this.emitProgress(i + 1, total, modelUrl, null, result.success); + } + + // 批量加载完成后统一更新字典 + this.mainApp.gameManager?.updateDictionaries(); + + EventBridge.modelLoaded({ urls: models.map(m => m.modelUrl) }); + + return { + success: results.every(r => r.success), + results + }; + } + + /** + * 显示网格 + */ + private showMeshes(meshes: AbstractMesh[]): void { + meshes.forEach(mesh => { + mesh.setEnabled(true); + mesh.getChildMeshes().forEach(child => child.setEnabled(true)); + }); + } + + /** + * 发送单个模型加载进度 + */ + private emitSingleProgress(url: string, event: ISceneLoaderProgressEvent): void { + const progress = event.lengthComputable && event.total > 0 + ? Math.min(1, event.loaded / event.total) + : 0; + + EventBridge.modelLoadProgress({ + loaded: progress, + total: 1, + url, + progress, + percentage: Number((progress * 100).toFixed(2)), + detail: { + url, + lengthComputable: event.lengthComputable, + loadedBytes: event.loaded, + totalBytes: event.total + } + }); + } + + /** + * 根据 mesh 名称查找 mesh 对象 + * @param meshName mesh 名称 + * @returns mesh 对象,未找到返回 undefined + */ + private findMeshByName(meshName: string): AbstractMesh | undefined { + const keys = this.modelDic.Keys(); + for (const key of keys) { + const meshes = this.modelDic.Get(key); + const found = meshes?.find(m => m.name === meshName); + if (found) return found; + } + return undefined; + } + + /** + * 根据 mesh 查找所属的模型名称 + * @param mesh 网格对象 + * @returns 模型名称,未找到返回 undefined + */ + findModelNameByMesh(mesh: AbstractMesh): string | undefined { + + const keys = this.modelDic.Keys(); + for (const key of keys) { + const meshes = this.modelDic.Get(key); + meshes.forEach(mesh => { + console.log(mesh.uniqueId); + console.log(mesh.name); + + }); + if (meshes?.some(m => m === mesh || m.uniqueId === mesh.uniqueId)) { + + return key; + } + } + return undefined; + } + + /** + * 根据 mesh 或 mesh 名称移除所属的整个模型 + * @param meshOrName 网格对象或网格名称 + * @returns 是否成功移除 + */ + remove(meshOrName: AbstractMesh | string): boolean { + let mesh: AbstractMesh | undefined; + + + // 判断传入的是对象还是字符串 + if (typeof meshOrName === 'string') { + mesh = this.findMeshByName(meshOrName); + if (!mesh) { + console.warn(`未找到名为 ${meshOrName} 的网格`); + return false; + } + } else { + mesh = meshOrName; + } + + const modelName = this.findModelNameByMesh(mesh); + if (modelName) { + this.removeByName(modelName); + return true; + } + console.warn('未找到该 mesh 所属的模型'); + return false; + } + + /** + * 替换模型 + * @param modelConfig 模型配置对象 + */ + async replaceModel(modelConfig: ModelMetadata): Promise { + + + + this.removeByName(modelConfig.modelId); + return await this.addSingle( + modelConfig.modelName, + modelConfig.modelId, + modelConfig.modelUrl, + modelConfig.modelControlType, + modelConfig.drag, + modelConfig.transform + ); + } + + /** + * 销毁指定模型 + * @param modelName 模型名称 + */ + removeByName(modelName: string): void { + const meshes = this.modelDic.Get(modelName); + if (!meshes?.length) { + console.warn(`Model not found: ${modelName}`); + return; + } + + this.getModelTransformTargets(meshes).forEach(mesh => mesh.dispose(false, true)); + this.modelDic.Remove(modelName); + this.modelMetadataDic.Remove(modelName); + this.mainApp.gameManager?.updateDictionaries(); + + + } + + /** + * 清除所有已添加的模型并释放内存 + * 主要用于切换尺寸后清除不适用的配件 + */ + removeAll(): void { + const modelNames = this.modelDic.Keys(); + + + + modelNames.forEach(modelName => { + const meshes = this.modelDic.Get(modelName); + if (meshes?.length) { + this.getModelTransformTargets(meshes).forEach(mesh => mesh.dispose(false, true)); + } + }); + + this.modelDic.Clear(); + this.modelMetadataDic.Clear(); + this.mainApp.gameManager?.updateDictionaries(); + + console.log('所有模型已清除,内存已释放'); + } + + /** + * 获取模型元数据 + * @param modelName 模型名称 + */ + getModelMetadata(modelName: string): ModelMetadata | undefined { + return this.modelMetadataDic.Get(modelName); + } + + /** + * 根据网格查找模型元数据 + * @param mesh 网格对象 + */ + getMetadataByMesh(mesh: AbstractMesh): ModelMetadata | undefined { + const modelName = this.findModelNameByMesh(mesh); + if (modelName) { + return this.modelMetadataDic.Get(modelName); + } + return undefined; + } + + private getModelTransformTargets(meshes: AbstractMesh[]): AbstractMesh[] { + const meshSet = new Set(meshes); + const rootMeshes = meshes.filter(mesh => !mesh.parent || !meshSet.has(mesh.parent as AbstractMesh)); + + return rootMeshes.length ? rootMeshes : meshes.slice(0, 1); + } + + getModelTransformTargetByMesh(mesh: AbstractMesh): AbstractMesh | undefined { + const modelName = this.findModelNameByMesh(mesh); + if (!modelName) return mesh; + + const meshes = this.modelDic.Get(modelName); + if (!meshes?.length) return mesh; + + return this.getModelTransformTargets(meshes)[0] ?? mesh; + } + + getModelMeshesByMesh(mesh: AbstractMesh): AbstractMesh[] { + const modelName = this.findModelNameByMesh(mesh); + if (!modelName) return [mesh]; + + const meshes = this.modelDic.Get(modelName); + return meshes?.length ? meshes : [mesh]; + } + + /** + * 设置模型旋转 + * @param modelId 模型ID + * @param rotation 旋转向量 {x, y, z}(默认使用角度) + * @param useDegrees 是否使用角度(默认true) + */ + setRotation(modelId: string, rotation: { x: number; y: number; z: number }, useDegrees: boolean = true): void { + const meshes = this.modelDic.Get(modelId); + if (!meshes?.length) { + console.warn(`Model not found: ${modelId}`); + return; + } + + // 如果使用角度,转换为弧度 + const toRadians = (degrees: number) => degrees * Math.PI / 180; + const rotationValues = useDegrees ? { + x: toRadians(rotation.x), + y: toRadians(rotation.y), + z: toRadians(rotation.z) + } : rotation; + + this.getModelTransformTargets(meshes).forEach(mesh => { + if (mesh.rotationQuaternion) { + mesh.rotationQuaternion = Quaternion.FromEulerAngles( + rotationValues.x, + rotationValues.y, + rotationValues.z + ); + return; + } + + mesh.rotation.set(rotationValues.x, rotationValues.y, rotationValues.z); + }); + } + + /** + * 累加模型旋转 + * @param modelId 模型ID + * @param rotation 旋转向量 {x, y, z}(默认使用角度) + * @param useDegrees 是否使用角度(默认true) + */ + addRotation(modelId: string, rotation: { x: number; y: number; z: number }, useDegrees: boolean = true): void { + const meshes = this.modelDic.Get(modelId); + if (!meshes?.length) { + console.warn(`Model not found: ${modelId}`); + return; + } + + // 如果使用角度,转换为弧度 + const toRadians = (degrees: number) => degrees * Math.PI / 180; + const rotationValues = useDegrees ? { + x: toRadians(rotation.x), + y: toRadians(rotation.y), + z: toRadians(rotation.z) + } : rotation; + + this.getModelTransformTargets(meshes).forEach(mesh => { + mesh.addRotation(rotationValues.x, rotationValues.y, rotationValues.z); + }); + } + + /** + * 设置模型位置 + * @param modelId 模型ID + * @param position 位置向量 {x, y, z} + */ + setPosition(modelId: string, position: { x: number; y: number; z: number }): void { + const meshes = this.modelDic.Get(modelId); + if (!meshes?.length) { + console.warn(`Model not found: ${modelId}`); + return; + } + + this.getModelTransformTargets(meshes).forEach(mesh => { + mesh.position.x = position.x; + mesh.position.y = position.y; + mesh.position.z = position.z; + }); + } + + /** + * 设置模型缩放 + * @param modelId 模型ID + * @param scale 缩放向量 {x, y, z} + */ + setScale(modelId: string, scale: { x: number; y: number; z: number }): void { + const meshes = this.modelDic.Get(modelId); + if (!meshes?.length) { + console.warn(`Model not found: ${modelId}`); + return; + } + + this.getModelTransformTargets(meshes).forEach(mesh => { + mesh.scaling.x = scale.x; + mesh.scaling.y = scale.y; + mesh.scaling.z = scale.z; + }); + } + + /** + * 将模型放置到指定的放置区域 + * @param modelId 模型ID + * @param zoneInfo 放置区域信息 + * @param offsetDistance 距离墙面的偏移距离(默认0.1,正数向外) + */ + placeToZone(modelId: string, zoneInfo: any, offsetDistance: number = 0): void { + const meshes = this.modelDic.Get(modelId); + if (!meshes?.length) { + console.warn(`Model not found: ${modelId}`); + return; + } + + // 计算放置位置:中心点 + 法线方向的偏移 + const targetPosition = zoneInfo.center.add(zoneInfo.normal.scale(offsetDistance)); + + // 计算旋转角度:让模型面向墙面(法线的反方向) + const targetDirection = zoneInfo.normal.scale(-1); + const angle = Math.atan2(targetDirection.x, targetDirection.z); + + this.getModelTransformTargets(meshes).forEach(mesh => { + // 设置位置 + mesh.position.copyFrom(targetPosition); + + // 设置旋转(只旋转Y轴,让模型面向墙面) + if (mesh.rotationQuaternion) { + mesh.rotationQuaternion = Quaternion.FromEulerAngles(0, angle, 0); + } else { + mesh.rotation.set(0, angle, 0); + } + }); + } + + /** + * 检查模型是否存在 + * @param modelId 模型ID + * @returns 模型是否存在 + */ + exists(modelId: string): boolean { + return this.modelDic.Has(modelId); + } + + /** + * 应用 transform 到模型 + * @param modelId 模型ID + * @param transform 变换信息 + */ + private applyTransform(modelId: string, transform: ModelTransform): void { + // 应用位置 + if (transform.position) { + this.setPosition(modelId, transform.position); + } + + // 应用旋转(角度制) + if (transform.rotation) { + this.setRotation(modelId, transform.rotation, true); + } + + // 应用缩放 + if (transform.scale) { + this.setScale(modelId, transform.scale); + } + } +} diff --git a/src/babylonjs/AppModel.ts b/src/babylonjs/AppModel.ts index 66774c7..92c073f 100644 --- a/src/babylonjs/AppModel.ts +++ b/src/babylonjs/AppModel.ts @@ -31,6 +31,7 @@ type ModelTransform = { }; type ModelMetadata = { + modelName: string; modelId: string; modelUrl: string; modelControlType?: ModelControlType; @@ -253,6 +254,7 @@ export class AppModel extends Monobehiver { // 单个加载 return await this.addSingle( + modelConfig.modelName, modelConfig.modelId, modelConfig.modelUrl, modelConfig.modelControlType, @@ -264,9 +266,9 @@ export class AppModel extends Monobehiver { /** * 添加单个模型 */ - private async addSingle(modelName: string, modelUrl: string, modelControlType?: ModelControlType, drag?: DragConfig, transform?: ModelTransform): Promise { + private async addSingle(modelName: string, modelId: string, modelUrl: string, modelControlType?: ModelControlType, drag?: DragConfig, transform?: ModelTransform): Promise { // 检查是否已存在 - const existingMeshes = this.modelDic.Get(modelName); + const existingMeshes = this.modelDic.Get(modelId); if (existingMeshes?.length && !existingMeshes[0].isDisposed()) { console.log(`模型 ${modelName} 已存在,直接显示`); this.showMeshes(existingMeshes); @@ -280,14 +282,15 @@ export class AppModel extends Monobehiver { if (result.success && result.meshes) { // 克隆材质,确保每个模型有独立的材质 - this.cloneMaterials(result.meshes, modelName); + this.cloneMaterials(result.meshes, modelId); - result.meshes = this.createModelRoot(modelName, result.meshes); - this.modelDic.Set(modelName, result.meshes); + result.meshes = this.createModelRoot(modelId, result.meshes); + this.modelDic.Set(modelId, result.meshes); // 存储元数据 - this.modelMetadataDic.Set(modelName, { - modelId: modelName, + this.modelMetadataDic.Set(modelId, { + modelName: modelName, + modelId: modelId, modelUrl: modelUrl, modelControlType: modelControlType, drag: drag, @@ -296,12 +299,12 @@ export class AppModel extends Monobehiver { // 应用 transform if (transform) { - this.applyTransform(modelName, transform); + this.applyTransform(modelId, transform); } // 配置拖拽功能 if (drag) { - this.mainApp.appModelDrag?.configureDrag(modelName, drag); + this.mainApp.appModelDrag?.configureDrag(modelId, drag); } // 更新 GameManager 的字典 @@ -325,7 +328,7 @@ export class AppModel extends Monobehiver { EventBridge.modelLoadProgress({ loaded: 0, total, progress: 0, percentage: 0 }); for (let i = 0; i < models.length; i++) { - const { modelId, modelUrl, modelControlType, drag, transform } = models[i]; + const { modelName, modelId, modelUrl, modelControlType, drag, transform } = models[i]; const result = await this.loadSingleModel(modelUrl, (event) => { this.emitProgress(i, total, modelUrl, event); @@ -340,6 +343,7 @@ export class AppModel extends Monobehiver { // 存储元数据 this.modelMetadataDic.Set(modelId, { + modelName: modelName, modelId: modelId, modelUrl: modelUrl, modelControlType: modelControlType, @@ -483,6 +487,7 @@ export class AppModel extends Monobehiver { this.removeByName(modelConfig.modelId); return await this.addSingle( + modelConfig.modelName, modelConfig.modelId, modelConfig.modelUrl, modelConfig.modelControlType, diff --git a/src/babylonjs/AppRay.ts b/src/babylonjs/AppRay.ts index 31b22b7..ed9deb8 100644 --- a/src/babylonjs/AppRay.ts +++ b/src/babylonjs/AppRay.ts @@ -143,9 +143,13 @@ class AppRay extends Monobehiver { // 获取模型元数据 const modelMetadata = this.mainApp.appModel.getMetadataByMesh(pickInfo.pickedMesh); + // 获取模型名称(优先使用 modelName,如果没有则使用 modelId) + const modelName = this.mainApp.appModel.findModelNameByMesh(pickInfo.pickedMesh); +console.log(modelName); EventBridge.modelClick({ meshName: pickInfo.pickedMesh.name, + modelName: modelName, pickedMesh: pickInfo.pickedMesh, pickedPoint: pickInfo.pickedPoint, materialName: materialName, diff --git a/src/babylonjs/GameManager.ts b/src/babylonjs/GameManager.ts index e9fc898..6187538 100644 --- a/src/babylonjs/GameManager.ts +++ b/src/babylonjs/GameManager.ts @@ -786,18 +786,33 @@ export class GameManager extends Monobehiver { } // 应用反照率纹理(颜色贴图) - if (options.albedoTexture) { - material.albedoTexture = new Texture(options.albedoTexture); + if (options.albedoTexture !== undefined) { + if (options.albedoTexture) { + material.albedoTexture = new Texture(options.albedoTexture); + } else { + // 传入空字符串或 null 时清空贴图 + material.albedoTexture = null; + } } // 应用法线贴图 - if (options.normalMap) { - material.bumpTexture = new Texture(options.normalMap); + if (options.normalMap !== undefined) { + if (options.normalMap) { + material.bumpTexture = new Texture(options.normalMap); + } else { + // 传入空字符串或 null 时清空贴图 + material.bumpTexture = null; + } } // 应用金属度贴图 - if (options.metallicTexture) { - material.metallicTexture = new Texture(options.metallicTexture); + if (options.metallicTexture !== undefined) { + if (options.metallicTexture) { + material.metallicTexture = new Texture(options.metallicTexture); + } else { + // 传入空字符串或 null 时清空贴图 + material.metallicTexture = null; + } } // 应用粗糙度值 diff --git a/src/event/types.ts b/src/event/types.ts index fc9ff1b..194b203 100644 --- a/src/event/types.ts +++ b/src/event/types.ts @@ -30,6 +30,7 @@ export type ModelLoadedPayload = { export type ModelClickPayload = { meshName?: string; + modelName?: string; // 模型根节点名称(modelId) pickedMesh?: any; pickedPoint?: any; materialName?: string; diff --git a/src/kernel/Adapter.ts b/src/kernel/Adapter.ts index ad6ecf1..a84af8b 100644 --- a/src/kernel/Adapter.ts +++ b/src/kernel/Adapter.ts @@ -5,6 +5,7 @@ import type { HotspotInput } from '../types/hotspot'; type ModelControlType = 'rotation' | 'color'; type ModelInput = { + modelName: string; modelId: string; modelUrl: string; modelControlType?: ModelControlType; @@ -68,6 +69,19 @@ export class KernelAdapter { */ removeAll: (): void => { this.mainApp.appModel.removeAll(); + }, + /** + * 检查模型是否已加载 + * @param modelId 模型ID + * @returns 模型是否存在 + * @example + * // 检查模型是否已加载,避免重复加载 + * if (!kernel.model.exists('shed_001')) { + * await kernel.model.add({ modelId: 'shed_001', modelUrl: '...' }); + * } + */ + exists: (modelId: string): boolean => { + return this.mainApp.appModel.exists(modelId); } };