From b9856300aa91bf1b90ce18ead25b769ec11cf1fa Mon Sep 17 00:00:00 2001 From: Sheyiyuan <2125107118@qq.com> Date: Thu, 28 Nov 2024 15:20:29 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 ++ .idea/.gitignore | 8 +++ .idea/ProjectWIND.iml | 9 +++ .idea/modules.xml | 8 +++ .idea/vcs.xml | 7 ++ LICENSE | 8 +++ go.mod | 12 ++++ go.sum | 18 +++++ icon.png | Bin 0 -> 58404 bytes main.go | 17 +++++ protocol/api.go | 39 +++++++++++ protocol/events_handler.go | 71 ++++++++++++++++++++ protocol/web_socket.go | 122 ++++++++++++++++++++++++++++++++++ readme.md | 8 +++ typed/typed.go | 132 +++++++++++++++++++++++++++++++++++++ 15 files changed, 463 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/ProjectWIND.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 LICENSE create mode 100644 go.mod create mode 100644 go.sum create mode 100644 icon.png create mode 100644 main.go create mode 100644 protocol/api.go create mode 100644 protocol/events_handler.go create mode 100644 protocol/web_socket.go create mode 100644 readme.md create mode 100644 typed/typed.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..413b7d9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/main/tmp +/scripts +/main/.git +/main/.gitignore diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/ProjectWIND.iml b/.idea/ProjectWIND.iml new file mode 100644 index 0000000..5e764c4 --- /dev/null +++ b/.idea/ProjectWIND.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..061c876 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..a57048e --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0de2aaa --- /dev/null +++ b/LICENSE @@ -0,0 +1,8 @@ +Copyright (C) 2024 Sheyiyuan + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..5de8153 --- /dev/null +++ b/go.mod @@ -0,0 +1,12 @@ +module ProjectWIND + +go 1.23.2 + +require ( + github.com/dlclark/regexp2 v1.11.4 // indirect + github.com/dop251/goja v0.0.0-20241024094426-79f3a7efcdbd // indirect + github.com/go-sourcemap/sourcemap v2.1.4+incompatible // indirect + github.com/google/pprof v0.0.0-20241122213907-cbe949e5a41b // indirect + github.com/gorilla/websocket v1.5.3 // indirect + golang.org/x/text v0.20.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..bfcbb11 --- /dev/null +++ b/go.sum @@ -0,0 +1,18 @@ +github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo= +github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dop251/goja v0.0.0-20241024094426-79f3a7efcdbd h1:QMSNEh9uQkDjyPwu/J541GgSH+4hw+0skJDIj9HJ3mE= +github.com/dop251/goja v0.0.0-20241024094426-79f3a7efcdbd/go.mod h1:MxLav0peU43GgvwVgNbLAj1s/bSGboKkhuULvq/7hx4= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-sourcemap/sourcemap v2.1.4+incompatible h1:a+iTbH5auLKxaNwQFg0B+TCYl6lbukKPc7b5x0n1s6Q= +github.com/go-sourcemap/sourcemap v2.1.4+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/google/pprof v0.0.0-20230207041349-798e818bf904 h1:4/hN5RUoecvl+RmJRE2YxKWtnnQls6rQjjW5oV7qg2U= +github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= +github.com/google/pprof v0.0.0-20241122213907-cbe949e5a41b h1:SXO0REt4iu865upYCk8aKBBJQ4BqoE0ReP23ClMu60s= +github.com/google/pprof v0.0.0-20241122213907-cbe949e5a41b/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e3afd99f432d272881c8a2fc78dd2a4df376498d GIT binary patch literal 58404 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%0AQoKpm6dsq3VwpYa6*< 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�vXG<4CB{_OHmR^4Kq*bp4+`If#h3`*k~FMW%P$` zrH*}AJGeR8hV1_?A^(mr&1@9L<6DCVG31#du>)+Nq|h!q0p~Y*zOHoVG0pPa8Rrp1 zMxW=7cDW>k_H3|eZcIVvXq^;@-tpaQ0Q$;d3LAz|n>bZyZ;pidpeg7iy}mNonCf9| zXT}$rQ(Oc|_QuohWj`edHPo$6+HP*w6Zk$fpauv0K#MK%urtscW4Cu@iKuwmAF29u zF~V}w`LE?#JMbYYH!7k|oR1mrb^}QTb`CE)SuH5(eAX05k`o}frrVsj?BjWnQ#X&i z=6Up+5d&&tjXFVJ_?RZTX1ShQ01w&p>M>xt?uRcKzADh3>a30{QzWGCJEG;b4U?0g0C9%f5ELMq({F_Xu)FxO=jfH+o$Q6@ zK3_IU4q3Zp@RER@hx^Vqoc3Pk*L5YnSg~d28ibY5RS+6o@fmt*ZFf!K1kRTY@{9`{ zgI1ta*|7^eeOYZe7sV{q5@8q8EP?M4MxiL6N{6OdUDo!k1(1Bu;vyiHY4r8RVbCY0 z^pVZgWdm`sG$>ku9Ougmc?QEz#s98Bz~;*G!T#Noepw9@O!yag_!eb@qb1wxA>xw- zkR$$cB%qmB@37EuIabwRC&XIKR3tP<`sRijodZ5eqAyzwoLI1uH{qLA6;6e{AP5z1 zhS5DHI_We%S4oHa(8PT^8*phKhn+7sv-K0Jlpr&85HEx%vbEL-$0?F5;`g#{;I~$~ zJo7l8)Ygn(C>PZ*hR1XQrRk1qD3tOG#s`>IIQ4D)wEFtV5%ud`$=}r-_U|Jpc*&o; z-{ruy+8{3$$V|NyoVnS4c}h*F*`R}Y+->w^1oa5xh|7f4Tf zJ4gL96XO3VAaS(1K4LcNA@npTMlj>MtUWvq^_T9F%|wuYnK~KLA_3w`(9d=R8`^g} zKD{leS_qrXW!dLM+F-r5r5eg_kNvFhp}Oxuj`0wJJc|M$)IeqB(JQI)LiF|^dLCPhqm`=6Oq%4`AfLME^la74G@jwW|H7N? zxn=|niKZ4o7+0w-Zhko)jC@Hn;?49(xsv_BO`EPvIamFf`Y<-c?RfN`OK-(k;-z7s z(C4aLJ-Xm2TDXAa_Nc`1M+uwxYl0JrminTnnwEJ%&WHZ-Bb2LD+qkeh;q|=2fhg?& z3qB=(i^1rmAF(S`jY`)x$n1103K(tmWfIkFj#d}()mVD6k08*k@2DhUKT36~Zm2g8 zkk@3amf8@b4_a@i0!d2=ziAM#wwzS(RImOx%Emo$IQ-Cqu=y?ei!Y$))Wz+smklMx zXe%moU~bRJF+oVc@mUV}0J4)V^iluVSf97w&6h8~{p5uQF>X6iw)mR?pmUaV=0j8% zObY|<1gFgSA8(@xEi#zr#IdQCO{=zwH`;0M`F$Q`O7gJBJZFYl5u@AL>0&RT#%hQ4 zMMc;GKPXzibW$M7P(g6gja@ve4xYk1J!lDS>8~s=GWh&ZP!Bav*rN-4ac3?>#^B() zsGz(wtdb04%ZV^ELa(C}p*SDu#J|p^ZH}~b!{>bj_m)FNPcD^>0^j>S>g%rU{w^vBs zmAu9!XOGaWY_o$2C4Dlp=!boZ@&ps1>I3j$ zVkBgO31TuD8FySj^Wd2r#RRB*HoUFhykO@_B(~|vEd!UM1+6CEZ6!9RYlnrDR_4V+ zK+6BmCdl|6sBb>~oIO<-VB6ipzI8r&g#Z~j+~|kx$DMat8;W|bgA&6HOs}*n(OZAw zN4Cb;b!lV8>e*R|v{|l@31dvNF~r6=YB340neryRng*{;YSv777pll!8MG1ZffX?@ zK6h*)zpHFUQZq!2bAcQIm zLPn}Qv-y`1cqHt3gy~&5u9$BBMy>hipJXQSQp_LB-c=OGB0FqDeG zW1BCuhUUocX`vq=W814sPF*Ji#fzfoCK8PG*+aL6>imO?s5Bz<@hF|0gCW){e26@e zB5B8&{TrC*S$sMPMxSiX@bvWs@;gOQ+mstOg|8Eo{VUbmK?%s>?YR)mypA`gh$p2W z-oZB?=hneJ7aEmrUb0Dx$p;l!{Wd^E^WNWh+T2UG5d705{HBddXvTE?+a3Ia&5R^W zuMLqyh3@fpQR%!9GEmDdwq<$g%#2kldK}jm=(C>rh@ozZJC_XPPzZF%TL|Ah`m;7Z zD(RP|EH>`E3AXXsx+)AN!eCCrOq?JCo1c%jggW1tLV<1l^{5eFve z#`F0^x`i9{3G=(AasT8~Q8VCoimD{ecc(+)L=TmHJwtSs4Gs5dEF)u5M^`*nyO)cBs}infoziCSo@GxcO0to8g{(oOt0$u|hHgN&**d3SE4rXiVFw)L*&~ zh68%)MF?9)K-gle6nXkS(pbg<&!>Ak&-hGc&0A;R|LLDFDldj4#4Fm^mlX}je^%0+ ztA~g@*VsGaj=CBnc~PRwP?H)m@Wdfyx#b}SxoSB!;BQpSdCu)+46EIO3&gd7??y&0 zK+vQ&EZ9@i__~DKjajdhssrWK%8oE#x*(P3e$9CF+V8{8qA3n4{4%lj<-H- zWm18@yqWBqhM?Im4OM!!QI@#L=WK_(Pg;y()UkHbLI~}!uJPO_aJe=|t^4F7!F){t z(Vbt;DB=S(EDE8pdVn?eOe`Py!WJeQAgfulyf1xrUAn&G-DU+BE#C(cKvXBH_k_2EPf-b*iJo=4K0&Vm9#xeL+A#6Y-7Y#Bx zTXW3~Y2xVcZ%xCKVlD_y=>V& zWac}Tc(v#A*gZ;|jaJ4dcT}@t&;?RUid*?Cj)Z<8WppEwaqdjBWYDi1(`SF*OV0U5 zKM?}mr5$VR;d|nJBK7iAptJd#T3j^~QkI~SAK@0F$8G_&?&qQY;0)!uM?rK&)?czq z#>d~>D_WJ`SE9hAwH33&rjatv>HEXm@A$gbsG?qPNkbk_v36PLp(8NdOx%sq$&xI7TE1>Fd6yh_+h{yLF{;`QOl2`OGY@_RLWrj!J zi_Wo|!TETbg-A!e)BG5xd^nxL^V%R}RFjrMCG2oKBA$Eu*ApY*x7~hEiA6;X z)@>ZI7fA`-dK^Qr;6O5$P{w=>l#50z=zNtvTHLy^8Fze-)aMf%P~}U;?3Lq9SIjoI%ESc>pjy8P<6oq5 z-Jdr|>Q5->woduHX73Rnx!4sPNvJPfypr*Z0#hCZnMkkMFUQ!V@35alH&>~gEdG?` zTI~Qc%Z0vm+qz;Txo@Q&lBC594M5=E=Vvh#){oWcx(Tm7dGhllWWpSBiymK^f1={e z*8%#g(tIU`11$f->IazOEl4Sy#M#Tz^^~rU=)9E=ysR~TU_+z~4gzi`hiGOOw`U(O zc`Z!dIVn^}_Lv0op+Q$`*aSASTO*2V&*7m3;k`eFY$! z`zCh&5+NZ)Jiw%PLlDg`0wiBQKYO@>$hi05B;cqVvfl!NY(oX)b}O$8#hcT|TWE(! z#!keVKLE6mE)R^hWzl667qxJPmg|N4mh%gT!B?htL;lplA9g_2;H-XL*|8ojc*qQ9UM3i%&;i%-dz^Y#KD8R z9q1WNc!vPK^H$VeGQ2$4u+%O2-<-Rk`r-_P&g^LU)=zV7RK z&FAa+dfg)83XZ{bKF+}TmK@+fb_iAi!-nX#>fXsj+7?>vj3?Ao9gAzM${#7Ups~+I zRYRf1nfCl>bG*8B-1Fj{Yi%DtN$mEvzaJ$-o9|?OXuE%<*GWxfg_ODE6!oWdSJe=Q z$FL3OwWUT>Tqez$1mPE{oX`D^;Bg%i0*i{R03Ihtnm6yBvAHqved#y9zdOk?$+1y2 zFx{daiBLSCl*F{Tbr{~f_& zG)T<{m__Buh9E|veE4xJTIgb}vSmi0!Te(IKbx~ezIH*;%u0r?bgFDVA{rhM4c_rU zEh);IQLvvH+j)6K3TaBOQ1w2wxx8mt6 zQa`TgA1WSTlcMuAA>o5`2??;A0SRuL8I1p#Nb)zTl9pa#Q>iFMtIF=4O0eStEKs!S zye;Qk;#*fC@s7x?tdpu2x@;ktKNW}>B>6Z)?^rdd=j8ZwVfoy1BKabbCu4tqfD`8L zQ4F1fr&Jjyc%(J`F187t)Vfjy$^Z{PI3UwxQ;K=VXlEu@_k?F0BP{FcdA|Rt#RFKo z8^h)gG{k_`vzK92<*TISh({J}V=Nz|m=Q`$D#w3}#T0$0hncqT`Z2 zp*X)gG^%-!^wAv*1>y=*wJAC4%4b5Im}Lhd5{ueAr!tR2d!L{F?g!=t@ z0)jp4E_ht0aAHg{`n1-cCvE)0mm)udSV~X7t_+=g2m(rTlStlzJ+<>Ci?!KQ?W9M$ zKnEibDu8Qf5vJopa%+}IaW3EKp@1XDPn^Y85H5*-T%P%sOPr7{-eJJ)V4zeD*nuAp z8#hrlTYu_R)5M?16o>Parun#z~ zU9jm^>%U*mqVkQ8Lz(<1;@CTDCrG{E#f_3*8z#Z)X6-Y?i}u>8e`)qu6jJB(wwcxL z_<>EOWw{7aBM$`c3Zy0bu3axg_3Nij(w)kmAr8zy1G~_W7^oK5o~6H&<9Rh`I;fc^ zxmmHp9CU`lUI>R(M9%qz-2N4E;g$U8K`DzS3GcD#t6UT`B2umfJuRD$(^uW2)YmZ| zf84O~mJtJ?mQ-26@^Id0QSG;T)kzNw{^@V-6^^bfI?zZ4tEk*)=yCVEQZey>`PAyAm1q~oC3}e5`zq@vAey?= z91$UE3yeH_)A<>>WU7q+wCc!G2<*4o&^LaYYu=G`bg&`XsX_QwYAegyU24&Cuf^Xr zh65r$S8F8ej{=FbMGu<%be%gMQoCBS7ohuASmN)#wpc|neiy~)_;-i!-j}z6tpzd5 z4uw2I{XXc$T85mk)$)y~^FyMT7u=gyLY;Ob*v%>ORSwS@YLgNY!A+ z8TSOnCsm?Vo6U#=-PAMpb<+sn00wmoopjk|Ypo^wUCDBd$?errfPP5>j3S~II-93b zAzr;Hsm1b`_5?`Bb9Au#JijN2Iy@Nx%6jJ=UjQ?N<)t-SZ!Ev4CrZCgij#K>L=Z&z zcKIe62+0e{ZOskG0utKq<&O{>8zc$#3f|N((J$Xh_dC#NhwV~LZea9%l-G`{OL;_+nIkMBPCquC56esUkP+NxKv_FB5l^TE%d5SSWO z>?<}>h5M28DjoexB`@~gjb*ReP{W%QxX4Q@IdaZr!5rlGHNsN1Bsf;6&P?}&CT|X* zD&+b>5A*X6TP5vMbH=#2IGmd_aH|pUGG23D%&uB2KgeK%6)R#`zV+Fp!Aq1d>zH~S(k+^z5t0{2h-KcCEeVD4nq%Vg~iKb8x zBwP%6{!XKuf;SqC4<6sMvEq<~bhV#cB13*9%{$q#p{12@`R5JP5@MO+>P>kt(D62H zt8(u3^Ifm_r$tDfQr^eOAm^rRthXHxbvr`ewzr6QoHm0PRl@c@6eoy$e#^n4nk!jp zOzZTV2Ck5vz!C@0>!gXhy7j<19QAp$;FtA1nm7CCUF->zkk||KdaTMJpAPRtO4hjZ zM~C`^THQd7TTdvv)A7Elr@{3@LcyF>qTXdoMi#hhWqzqkOvIYm$^cT^586zt8F zKJFp9M!$?a%S#DriNa4G6a!ki6%*U)oJtR|-rN+7NqPt$dfn}}&WT@tNGJJIX89lG zwbTVNd*u$@iG_=|pSXVJO3Y+*06>Q(;VN=70eR%OT64Bz;^E(V3Fkj2_f^DxQaR3Zc9q+7*l||N}^5i;R zec(U;JRs5xO~1~KbC24sNWBIOddgY7Fj40sx5CpWR7R&bTQv!q2>1Q!m&d1oU2#S) z-&)TcA%5}{DbqxeF)1`EeOi5!S}v#@F{hq0)_yQw2#-hA)Qx+}(zG))H6D2;r+nJ* z={2FJ_pj$dX2cg_)H-}P>>EczxoPw z)cffyX^?5UZ8&a+cboH_K|3K)lDCIB!cN>(R!CDp<_znZM} z1tO&igE=?yD~e_B>Qb|~%C84Jej@?n10lCrA+Q`cW-Q%_>Af%F#CrdDE1tt+zJx0x zN|;5B(qjo15r>+u<_^rM0R0)>Xfk~5nbV1-eqE$IYc-#_>4(KJb3u?BJ!~1+6o1~5 z+4yl>p3BnLvUdd}${L80gL-qho1h*(NUAu#Q_Avgfmo85x<}uO@ziNl+@Hw*SQLmd zwm}-&pllz)v0UrK+2?0UPgU<0WK-MUdF;rElmHs&`O;-75<*H)Z=K$rnQQLK74kt< zQl*WERT)HyC=F`$Hex=`*@t)!fIdqsV@{{kQsBm5%Ype#m$k<&)ZwXV;X@QdLcrg> zx)>S=dJ#L3P5KASC^KSQph6iS=TPeYe0OVF@&Mb}t(E!P|6()n5rKMdx-CGw;$$bw zG1WHq#B4uMH~7WyrHIEkYb5{8ixvsj=wQs%ta%6XH2oHNY9W6Md>~P65JK3FVgZ zwi&gRf`P*%YB1qk6R@O)wy$4(9!bdbe>qqrzx|aJQ8?~K4;v-)nV%+JbH~k!l_Wy+ z{vJ0wBw_j}4O|@P2yZBEuB_cz>Ur2muYI2|Ki558n(6tPJW#CKRQ+_|d`}5G{Bl@X zuF1)^Q5m{NB5BwCxhMH;fq{Th3(tayE72y1p3L1})L`EQ;UvFQdE*Jc$+p*8_|KOv z)2lam7%;;L}abA>#8F71c7To0#s_TB$`X_TI;OBbp-m=U|A-R?1Uj^T+J-}#L% zqkfW{A1slDZt1W`$~=`B>|}*#kc?l>A=Z)Dbqt_P!BJr&axOV!y)9&YWV0=m7!)TB z;VUU3f4#dU7n$mJ&eA%4aAwDk-j;@(oEFE{yRTadTeYsXb;Susnq5pZ3b6=jt1@2# zyqh5*^v`=CZ#6uBHD8|=;6W8LCRMxtIwSgH^mjyit1o?)mPk6V(!B-Fyr0+Q3<3{I z`jp0HVKZ$G4Y$DN)FL^aI?}K*^v2}V8kz?&0&Z={lz#OrgfJuRUpqK+P6%a? z8AqJ(j#THpicB12<{nq5o44TU`k{eSF1s~^0j}z1n6aIrv?WDnA-L6dl%yPk){;!a-Bs{JjSQrYMtQ1T=)ePix#wj@d{+k zetTX$opM>BTx#^UVyhM~g-s}1`->fb7;lB9SkEIiQBTb^Q%?(Np^EAMZ44Ra=wrq( z7nY^Ntkpn$o&xXa|1+Gp@%x64!O!9X72PA!N~|mNWk$Gm$gP;_6dw+^fV3#tDbl#P z>Jd=TNr(7_(%f)Z6%N|6oKe2rZoRG?YfOuC=h>}rr2yi`x2#KNU9)@tR9D;YVreBh zu+$}ZsgfhLV5#fKFZu_bI;+aS>W|f#ps>tG@UBei)jU7 zj;|pt%zF~y0y&M;tlMx1;?dgKgi*6I!4*GVum- z=DyD(`nQHM|9umcdGAJ{gxK6&W6@zNL4KFiV!bDa`^!gFjxXBiro|ES z&vhtL2!O_0wQso~I6VGP?JjM*pl6YMyzhNzLKX zTf}xBs;t_|0Sq_&K^mF9Rn+e{o4Jhye7IxuN&T3B>LZfrQ(mN#CAY~FNWcoHvU zVWOu0v*UKd>0&9d!tEq-L=np0gSeC$S4V=C1H5K%Y_gPWN-Hx{Dth4zt{S`y`086% zPup-LC=JgzfK3UT_l`M({w*2B#Y`XN+pFpJb+4*;uJ~f!@Y@z)K`{U1xE^Flt$7)g zwk!!-_d}$=2|m2_Twf7|)_zH#_lqeQxAc2`H?wKmLz!)h0Y_IXRS#IN*^Zv`kLqty z2P?nwj5<`NF(ipB1h_fYC(A*A>WO?C7tE~jD|Mgz+{2#zd!lUFV2r2@-jzFe_O7U8 z@QekIqB!Q`1guqX>4`UO)^4f9Z}PlP)Z%vCtY1VF(9XNE(1TNJw;|UeEuf+kYFWO| zO25wWbn1ji%j+KmncTMqMm~yghc(sXQt(bB&lcM!K1`MJhU4I2sp(BJ_p7X?)%Gr} zALAZ>ueE#tGg1_;8zn@DR-Xs?4GUGP_s3GPermuOCkpGA8HU9JyF`ifvYD-M{cxW( z_;b5OorXho)c&ws7R+Gx%nSceQaV}|>~KJJXo_4(6-N=h@;>Z{&!(|JPO>(=4}SEu zY+8Sd`hA@EdZ%F_^E-g-G3cb)`rW6r9vS|PJq6zPBX$IMQ_ljuCA-lQ+Env$bv9gc zs)v&C?n?><@reqAp;eI!D*t-mK(7y-!h+f=aDutmm8mA*^3vGI_0Z;024SKpw~W9& zECXrY(vul(<&s-@Jyin{+RuBW=NFA}WH^JeeD9u<)0ewwB|SYZn@qg7&m?ScVY-g1 z&g3?+X9dI3gRn;Kr}tWV#j5mTPHhif44wq0kQ~33np<~M-MJv#dUvthOx+^rv7OH$ z6Znos)$Y;jwQVy|Vv!Lp%0JE$P9yYap~hDg zG=1xr-wGcY$Tru1f|f;D`VPLIesybsQz%?Rmg^I*?Q@`R-aj-%O$5z#O zjgTITv5VF%=L}YBMQ*R#jFA$q!T8zP(X6Me3x4i@C*5L6{ z)A$5as3w6H!A;_st?zIjj9sDh92hV0kETT)V@|5rDERfcd!N7)D3)n}*db8WiPGY- zZj!Y(mTugqJGf#(x2en_D^#h5R3w`)e5uWhKwW_eK^qLwAct;{D4R&G>k(7&`8=kq zNQHT(Oq#R_+&~bBV3sLa-YzZ`2TYEKcv8Xn{__W2j`>QMkJDZ>^}E0xPLPNeT9>{Exib79MoC^njt7h(YlM6d z<~A4xbqLQ!%F@l4+>vrgT3L6UoPH7p>JWyix zc{-T5`<<#HJ0;2wYz9{k6-&~CyG%o`~hIeozFZSsLQgWS}lUf;Da&~9yc&)MihyCQ`GKbDb@d?5yWx`7Qn(K-$t z=L5PQPv{SOb3W>^Sbc}%o+Vi_Wf)%@+--fHV(@NFUU0^}y0U1G{twzA0w5fAA>fAUnc zDvpte_NCE)eb%`zIkj{7A7ui6^oe8Y|LgyjXKr$p(umSLJUoL_h!m*%Nn|M4cQ$q< z$7Z2BbzkY(OBgy8@l9a2jZRt@qYish3riaHHt$-My zFtl9pnPlm>1GsE1_{k^xlbucH5=M4jNF411G0Z98JpyOT z0>6n#y>;`imA5{RKI}=sei9%``K)B_rTTj(F7bkU7BN)pTsk8tyiL!7D*($g<6T94 zLhLlWyVI4|t~1cDw_L*l(}L)i;v2tcye-+xo!)#(m!|EIRr430gOE3<#e84Ra&#Fq z|K3$zGX!9fHRMJHVkR~$E#oRzl|kTcb+*4Uvk=)I(h6)~QGY_4lHsr3yYJ$jhkS74 zp4$#t=Y~#_fQzBY3ZwMXv!3oT?Kz#h~YhLDu!cspc1=y`cym7YsF2#+{q4pe5nPt8f1X8?{_&JTWP4VPw*e}O> z{Nu!=UYvb(o%_;hB?9}vd1#;u8kPmQeJ>6BNvlg0oNfHk4tUD*q8nqY zJ%?Ysh}K192>dNN8P)@r`7CCpZ#mLbe9#NGzn40&QDqje<6Q8vM z5MjhFN`JoNRzsk}Mm&^U^`PVHzurKc%M!%5LgDp?Z(s^=nrlJ#;ek#y5`;0R#4LI* z?)Y*-x9*^;mV+>vdFBohx5EHS!Q$Z!jt+H;Ti4Siw!CSxQ$*^}Pt1i}INo_0R+lxf z|Mwg+B*RkOpx zp~MKkfId|(%Cp=}Al(q(HW9!|aed7fJiA>z(r4LbBIJk8=#OGfd1i z^O?VaZ44!=;SwspZeNDdMzBi_D1&`nZm+NJEG6Q^0!z#oqD?xK3}@L65V6|8EIV_a03ikl+jsN%9&U68 z$>@Qrvs1F9N^d|A$_u0QIgxYkn(IjZB=TVJBT|t8Z5q8ofnsD!V4bD;3>h+-KGfzL zdLPLS#&F@Twzt`Bi{EoEymINHw(t=I0B69i`>g`o=*B7=N7G=rdEQFHn1DqPT=XEKx|H-TqNprs_U+}*kz zk@8Ug8K}P=8j=M@tv8~8-z2Xrmk=azTHyY-Iv{|9qS^;=l-Y=sMa;jTO%^h+fwOmUC))Z1O7$eP5ut5%LSX(9;7bL#toRE7 z9#;{?cB=qE7_z_PXaO{W7u4tw7fjp|*fX)qXCN2#9GRxpxKlE;(8%05Fc9EDv;nvR z1p4n49Aligfs1EOo7OyzUOfVV)SwV_YeO#i(O|yainPKhU=CxA&zr)NLWU$jJhVX- zlUaleXHs8%-HbF8#c-9BjD2o!2FS=!FnI=md{-FQVu~2n*+7dBcxeb}MA3_iP)$Dd zQ3$;%gS(CSm~m3()302Ft;LW>AUmLo4yil^4`Hw{Pk`-_`SC1e+I&#+fFo*K^UFDF zy@X6e4kD|RX_p^h`8f9D0)Pb`NTZ*CeRbJXYumW8ehQa z&S~U)czx9}{RDXRcYvA;zj`Dxkdjw3Fc0n%x^Nt{Ugh3%9M(iV?slXS55HzW!Inmb z#n!wI`|k%qQ3!#ejAED#;;Dh_A*lnYLZ$V@(4y|sZ_5N)9Kb+bcG<1FqR4R9nX?hL zmKq(x*FaPcN;bMMy(z~8mx#=(To$t|BILVw4su=I`HVXYGUU+jM<5co?!MbQomUuEM;3TeDR43u5MRloKfbAOyN+Z$o$K08pUX%>mIHdJ z-OKC_0|6?~D9^-mmr>a^gI}p9x2)bw~(o;&?75^YU9E9|cp39MrGJ-F?V=^)L_^B=zON{bCj%)}Zuf zJ1X7JoCxqIY{PF2jtJ^D*Jg*>oG9m${^W;8v{Qs|_HqK&unhAd6{(`5Rm&qgNV}bS zWR-|{^T`O|Jh1P_AYM|i=W~YGvIWcRk&QjX%?}o1h^#|_0n$dHE>6gXj2_C^Frb90 z9OkNz^ki^(ii6qUZ@`^Gj$(jOXJ3i(*3ANxT?>RB)IO(O2jmoc2eow^d*?yt1q^-C zXzcL*)bjiYQXiBA*T6`4nGy@v1}AEuD5Sz=?8hjptYV$Z z0eeXwS8v7bT<=u+BCpi7Z`3`5fRv+U5@C(E~?c9(O94@IJU`D~F7Iv6mFNuPN~ zPDY8Pb9<_?Lx^u6yu-<`#FF8pEs$q~dUq)aPs{TtrQ*>chhqe@j6s5Q%Y{L77WwJd zbZxlSlWv+C{r~;r#J3~3Cedf~6XrpOTx(Br@IOuo?gFjjp3c^GT_o9EC6o%s{^v#+ zmxm#d68%P2>^@ED^&eb_$4}C3!3A|QR1G!Z$+;NEQKXD3_yi!Eac~epapQruE8!&# z2bTA4?lyZ;~ci^k=VVehD$gSn+J9$~T6Few3v(rLw(>)I}gE;L{En$*ZV zl4RN#QAx_#Rfd3JT5l&n>VAQlVuZ8&8{OTbho%UD>OXU-KTmlu<@cj{DE6}5XI9gR zl*AEt8^4dgOGzWuz-^D(wj74m%&}xx5oI!AUBdT7h~bsXp+X2~^3F;+O-tZfISa*F zqhS=N>E+(<^UXX`f$0&I<7PT~bX*90|o#7;E}MfI=RGfj;wd~akN zn*V8c@gS*>COj(_00~w$_5u%W79zSWJ6SG(x#q{~#IMaa+s+IIj1jZ;T{Lp|C(OfW z;rRTO+FjTJ@nzPKB7=`eEmr;+mXsBO&l#g7*h8GN6f|O<1Et)l6^mm$e#f(n9!188A(r|R=tP5$b$oqUr^EHR7d??=Bxf#;4Kq5k7{+(0m4Yb@6R=M23<(V;@%=$+1R zQpBV2GG9)7=;3*y#NT?;`@Xh8#0pI=VuBzIP7IHUx#ETlWRW`Qf7m;!OC|8_1`Y(~ zSKFWY2_;870wcF)>v+Vgmoqzl(vpy)x~16PPVRJnoks#7!b~+W|dz z5nn)iFOi$;lD83Ij~ep~%&e17)kJV3K!6~~L<@;WqI7D&T;hCI5|A-&sb1m+2Ocef z7;HWgJ#sUkj;hUto=x3W)B2!OFS~1oO#On{!9@}r2#RT;4_QxJ`XCBDZ5$Kj@@*Uw zb80RCN-R)T?#N|sTqS32@u!D``INo3b^CW7zso&TcJm#H17|>_@h77=%}I;v4Mk}u zLwbk4AN-jeWfgRccL|~0($~q}NcFySvB`Bkv>ntx{qDd+exj2sXXH#C49UvY8& z30P``vcA$~eWf+rTd+8oI&4QNGawAqL%wtnxfHS#q`cR991}7F2F4Idr`2;#0txSf zJb$tQZ~`D*1C(&y&LK&2>zS1RfXx!9)wh;R%$AT7N>Bn%OAc!?A+5^5y4rh@`~dCw z<|KUq9q^VwzE1<=tzaT{;qT-b{JxLX(VDe)Z|fl^XxRseh~ZzuI7)60Z(F(_1oyIT zgB;+p*gEwx1upoLCq2N~*X;ip;oK^k^|kZatH~wwaE&i31f-eN(di1R?Y7QlH;Ccy znHyF_$cC}?^!}GU`e(A-SyI`CEIG@*5kra;wbt)j450j~>zIqxvCIR&&iqlnSXUSy z$h!o>*lWGLz#W7N2|&nmw(2D=JfS;Eikpfe6gd~NwzG&!xnB)S0IteTYSytKFy49T)9U3bdMik5-%` z1sa2MO94?bNY}U?lVP1ykvRrgzLPc$bD7Er(?}c`u0N@&hK&+5BBQ79l*hS7A(oF} z56E(?ZLjGCe+rYHmJjtb%!Eubkq)0gxfUzq^b^DwfWgCSjTC(7F&0uEQfJ!jLJwl@ zjH{*`KIBQ&`eQW8sZfa$8J2|iww5flvNmuBTs|*Ot-R?8!xhlSbpOw5iZKIX(LkpP z2u;=bu`;~uGbSINDRa~mzxfm^Y_br&a&aJIqsmSg)YjCPJNWeR)y+eJT}sb;w$4Uy zdOy_m`J?z1Y}Hf( zS`UQdUvelzaX0Y%s~F?v>eV~sDnV=GNc}whJzxty;GifN1^UNTSpwp!!(ie-ttghC zF!tqA+%`Ij1o*+c3j%it(MXTk_qUq7)iY|fc&5(_(754C$rPLgorxk6k5bMa=(EI(C$4n$av8Y2@UCEK4y`b>_2P{ z^f1qYhiKqP8qxpHORRzfJF_9B{Mm0XXF@hej;?Vs_$xX5d><$jbYxAG5$+VWStexO z7^YJdvn!3Lgf;!_VdUZaH}c4aBo7|aXBN=+ieVXnJhQ*yx&_+_S*CP3p|iGMcT~nr zZcOhkQol?9U^tz0#?${WP;%mgfsjvcTD5pB5ZsgzpGUTbkJM3vGg@Q5ia3T=C=rfR zS!o$Ry;*Q(k!p>hnVo)C7hxuLe(DI$e26?b{!bXdMtY8A{P>&%oUCdmK-F5pMH!lA zp8{A35nqIk4bOKIxjiE}l#Wxlza-2qBqy+bjTfg(o|K@Ur967~8wtSX%NBZp0K@r= zCgSn|E5EWazpXirQJ{sOLpcuC2`%J;E40ZMr(caO>XryR!0F@5h5Qy)?9X+nwZ4A{ zDyvMYt+qdTK~U&+M)6Mp{k{%vhIp8+Vwffx0f(VpaUeDqKt3H# z9mduFuIwMhxC1l=+>jxNbGYC*N0eDG%1#Tr)c)Ogh!MBHnW157%rRgw?q z|H;Y&5xhdac^bUnsA<^vo8B7Ne@5paY*${ZyJ(WO-M(7K-u6K;_XP;cJ0ySRl^hfS z$bkmtB%?SK#K2VbTQs_0pft{5AZ~zn;v$&hU{>&Ze&!3SUE%q*uE&-vfMFP&fq8iW zr9L&!QV`(nJ9~;x8nC659B9Jm;4Ye1Eq~+3B$QSCBqJl^Crq?90POFJxn^n9dha${ zfYckCd(9Au${S=o*jvso7gd$e2tr_kC~+U)K>})J_!bb$>9!Lbz{a#ql`hc&U@N6u z@EM$-)oeABUi@?}XI5s=iyR8~m_wC(8L03ct2xF)^K$u4#5_ZcR1`WiNtsIx1{56s z0Tet}3Jr8kbRS|dq`t>&Fu+ae+-YAv zcBdcax}vD21lN~vOtTWQ5N7(?i2&fDhAcTwsPP^LuVth&aw_Vf8F8}_^0c4??Y4Bs z%1?+%g|w{6mt@>-X+wXy6`_3{Sf_P3xF)%fQxA+-d}`-Bi|5L_sIg}b;kW=~10A6; zW%k|BTO#ey=3YoAiXEyuf}B*~&uW5rr+Gw%x2NLL`C{GaW5R$tngc^vaO64KK2H(o zWAbss;)FzKzJzX=4}A|>B8gBPZaQVvuv5ykDGyz9(CDY*0A+fG>Ps$}+(!QH9n&Wt zXnS?A(eS8(Rj!9q{IQnORLgAG$SvJRI1P|C+Zst@wBHWIg=kbPZHH9#K@k($c2ub- zi4sZ0{oefYBGn%zl9=m!_EKqNID0s9Z>Q3%%OkaFAnmWDT%p&_2Dxm`^EnA(Ku8D) zE)mL`!ClSWMg3TqKd^qgRgg*1X~d7Q`) zIfV*acfc#h;BQ1{NF-u;Vj_qrkjf0WZijpm(h_rs7T&$2k zFckUZAWYI1j=VGn(VGdv=llT`@*dco`cuwvPKnGt(W?C(;wLC# ziTBD6^Fs`Wb#%R5RK8)8u_sI$X8?r})?|Pw`2%wtH5w5BaD`PT z_4M}XO}Sl%%hzG&DH{x(I#jSw&1PY^qI`KdWQl7vFnHU4^P zlz2KfLj>3!>i21I31$WP8!+!&c5O)FPs&VEo0ovv7vDx(|>s5 z&lGMYwP5hW^=llTn`;B@I^x;Y)d4Sq1_bv~H1lT^X`yik8tr`S(i$1_jC=$( z6O9znAIgBpwGf(GKv7<=4Hrs9(+iM>gmwgjg-^mgATOY3OaHEXEcVtwv-WNn8KHFr zLp@_DWN?}yiC!U>|5M!pK=}ExiwuYbWVjtB-c&mvGGX|jaKOe+jYLo~|J+9sY>QG2 ztJK=eE($Z@uJYjshR9J;srYE6kPJXl54t*jNGT6EqIg1DLMr#{E26W*>^(l=Idsey z_;z9Ds8)Ul+zoJ4j`5Pj#8X6;Dew}jr(?O1WTd`Fv(8#QdK%|D(A@E9X@MwH4p+MH zOcYkN&pnrx+7tGTJ91Y^anZQoFz}Yy%x{}yp=XBIjGDCiF*x<>f-47t~?qmUEq%*%#r@(u@1@GCs({gW3T}Z#ILdxMDP7|NK zmi*>kbI|XUfYMzj2?z5g2+h#j;|YM+%4b7hjwRE(_uuaPrEEA_xFLIKDD-roaFhv& z?saE{MPQeGY!k$qKOt-)5P>CmHi(vm z8qR4{@xW~n$?e`SYhxr)Czv9MMSI6uT9M3lhhml6W^A=o|KL;kdcb-nE0mYJS8S}F zC*P6D!+ptLLz`xOR%HOPeF%S7L%lcS`BTJ1@&hho-ZBSgDwa+Lzy##IztlA$fpdy_ zdT{OhNGB0zM)W&SIk+1`15mX!mt7^-asR${HT@w83@FaMiU1B<9kt-c&JJZ13`vtB zxtmeZNXmo=oHt%T4q3?hA(89h4`+EymOQ>vaml8iZF$OO0XTq>vn`kJqibH>++;O% zm>E5KQ+h60Zk+-9zbgXh<_@N!Re?12BWgk#xApj0B_J8kp5=fPi9F-4JKo1o!L--( z<&eY#CGU}i09E}4KzLDWv#p^6!mM0|8Gb^B6?m^Z84W-TIAOhQgl*){a`1Zcuz)Ap z3z)0!($`g_o~z>qZvj5y%@*f@#k<9s%sf6OPOH$cR0iU~esnmR8~8il&0sF45cnA2uNxS~uL3Dc!y055Q&%azU86a5x!vuBnw1ExT8hrVYiBD_!8yUWoQ z-z@CFpoDq0$lDPf+2Z+^rce%;DB4NMtBlz5{NKl>U1#1AkcpB7dm)PJ*gtPXSs& zL@Y)aXYLs5;VQ4+y}WP6cGw>geUjyKsw)0Z!_407-1^c^2P0qNI0i!t{MqPpU|BM4 z+kBpbNh(Q{oXissp~ozbE3Fwlt0=J~yea(RFRBmd{9xL6_9-a&Efv1PGG}r4TkedL zwr2WXkq~4V3gT2u>xL{dEo7iOAAbQv2{6R**n%)nO0tZ>u4$cnb?fD}j##Q)M_kAg z$!emdsoY2DW1h~}gS$xD6K%5Xj$DTF5q%yMaA`w#$$*4VDYatFGGPQI7HKU$rUb6+ z@l~-m0nqydu@^mHJHMK*%q$SE(J4Q(6!cu*NXRYHZ<;FNi<>0H@geRWd5%DvboT?u zCC}l0Dihd`PJzI$GAqI%W|5?n|Iv3Bke@$r8>{;mOymdVNqzt7=x!b`@P=INS`Rg( zh9u(x<8$-V3T}Y@m`(+|;C2_0(DZeSyO-oigslc4{BHUQG-DZAH1$ z8$<`riQ+eLgq#H3me1dYLzXMoCeFw`)Xol52nBgN2|+k%1u*>BgsK4pbVSK-}2q1PwnX{^-PAGxOGBHtiL?Smy7Q%MXNynIkFgQRwG=fs(1`a4O2DY#K z_l|D5H#UKgoGx6q$Wq;eBny4wNDG|uP~fiJ0+CgA1Ihr8^VgZ!aEX~*ViHRh#MoXS z77^rOsB zg(0g{7pgM8Xcokyb|qSX)5+c~m7xXRT9`O`&|~vB9(+79HDvzadl##dxp!PdKF=#Q zV60kk%0J`(oDy75bEgh%5N)gKLHqzImv^Js2j$trB?|RHBf@VdL2+Z`TITrfcu`No z;9}Uh0|45ouz8(0A2wI^tt-*u~os+ArWu{LkN)`Lo>pB;4mR!)G#7Y<;~pBKL`Y z?HI01^^LgnydWi61i+Na^|48@Z>!IZH?x*V9_s~T(PYht){;uwii zgx|MM73mcD13r1iqCx>h6pvK(oeD_On|O00-2I!p^{;FOyk64s%GfET*) zzWiJea!|Q(rbx8A-lZTcVs3#rCklFP4*P3@3C?h40+Yb;@f0Yfm8GcXK!rBh5nZO6 zyHzyo(6Mdm3A3%T0*kf_LcY(7>NA9p%uf5;%HdVZGYKovA!y*K?CbkKZ8 z7u^;He^9X7fat^y?daWyo5N`^S!=D$OR{s1As{r(>BBqD$eMo0@bks$khY`ltcMY^{HiyS6Yf0%U*nOnSEqCd)74VH9yZME<7a(=4#tZne^!So_w-Q7E3 zhJZDj#dm~H6;=diSrShPy9@xsKne(5gA-@#mjDoF_BUlU8)vAL7|_I%k|+5?r*QQyE2&DZ$1Os}ZY z1~GC5w312&#=)?0Fcy1*0>%N2?jDjltTci)777u(i2E*&_Ll-ilXm^z@qX*|*E$~e z*!1At&t>)SV zhrofF48ET%BS}6Q9~Vok=}Mjd$7@^X?tUHB~a*)Z_SF(u8%j+{!5V>K~|dOS?RRd~a=w(N-|2t1A)5U+}T;sRGIa1!aDa z0xh(VgMxcyH`4RXx3*7!Z#SK^@H_RuizijM+_Ndsdbqt5tCATZ78X%KnYG{ATqBaP zyBQE#7J?)#Ik5c2RU~w|LA~Xp?|}`;vl0+E-qM+SphkjC6u1HE`*;$RTjR6q-v<$H zRqS)oc?hX^!w40g97NW$LLVe3nLqxWPCvJB@Kkw09!*|-5UyazmcoRW_tDur)f_PO zWw(Ub%EZjEo6LM_)8Mh zPP1@ok2szo3^}>qjzJcgYbw5DX?t|H1(s(3eg30J$nK|?xvWkW?x6PQ{6Hfq8iWt3 zNEaS`66~2{2)JI#TH-X)iz;h0Ix!T}u$1Fz3O?vi(7eda0qwH8Up%vM_30u-Z|zZ~ z6|?&{S4%6bT5np}b{8!)Tkd{-sQlFK==RqcVt{NbCX@^WhV1C7Fd%qO;%wo1;(6h! z8z&J~H|Lh}zlNMq=y6ZoKEIR=XyN!W9~4vOikbAIQP4V&5EmlTPHU9Tq>!gYm8iJ& zX4lLnc)yXIrB?!T8$JxU?MN^B%NuYQnmW9Phf(8wg+q&xAeVjccz(2D{ufaWd~`Ep zWp|qjH`uv1%8VY?Q4uCy?rIM{#;DMI$=md?$ijZ2%g?t(f9gzP@Te3WzK!Q+53wz{ z^+RG}Qf9#j?DzMnt?1FsJz^yTh-ru=VNMWdT8h7O*3PM|!lu5Wz5Q*^>G9u2YJudW z03B)s=uiPqf4u*Th+9q%G}vgt3Cr@j(4Hm1iVDAmnIEhfM4tR}LL7*HrJ~m3M|@AF zoq^sz@fvoCS@6&NC7)Ov-jTK!fW4AfNy(Yan!Nq9E7L0I+ek=}-GVjd0zZb7_9ewr zFk}KJqs@&gMQukJg($e^qdP;?3#LkQ0J-4?-dpfm~ zAK1SzYx>29%cd#;B}`YMw+?JO1j z@|_5vS`<k9YwEMLDS1Ct8h>G{VO-|ZFb2Y%{FbXGa+L56+S(2>d znmzWDR#Rog@jXQ6JN;b1Ub**`t$^|uvx6eI5a84V+X)B&QOE({CvQ~(@bjhVKS;k8 z>!#+6VNKrO63w)hyN!Q5LVOZlx8MB9F9{_9ZuPnbARGaZ3XEpuWYvD-v&bchfBBoP zW~cPpHx>{3&mI)>Z|Wfh?q_GXlREw2TMfuy&qyzJ=9_D^kpn&Sz?0Zo8vVhqK?7Jj zNURht6A&LmS_Z&CfIgNlKeP}v(<)!=@xu&!o&ySBe8qh4uuQ-MVnI+zLI`9?~)5kW8kE*PHPr2a69MhO`g}&{->PGMfy0TON;YqvuhV;ZhNR>J} zw8CuB2nzVfS7us?BtC)ajvsXIGb=Qm_s>&a-qT~Q@bJZc!T^$~9`Ms_AXK)6_d zVR?%U_S3&b%Z>>P5^p3%=7SIE-M}L_puoiskKbwDkcWD1p50oL=&J8yHvL{)$HJPk-;?XiyV#rdS;wzz+>tG6rg=qm%Pt^DWNmT zTV`W>(6!KInt7`)Q7$H5lsI<;Ow53>VpGmPPzxyT-^MGO34p3wJv1ur3xU)eep|ZbbwaK+3f`l{rHk6D8%bdSJ-I2odO%PAO~iv6wArj|J3q?rZ68*4j=!mXVw`P=gh6}f-w}BG zWj9|D8#2(%u>;su*EUXC?|063aS(e;oY!eFAD;p9M*{)^sR#}cSx_l(qk+vI8Pm__ zh^&q2Ajq9lMhztMT_9!Cl<95TqVeBzlBMcY;BCpxN=2a9rlf(75u;)jQRagYit& zMAti!7#dofNc{eL;DDl7c44w9o&$2>jY19uKn0cu122eb?pFIeu@PKwbkT&Ird?gN z2VLmSCf^o_?9zJS&;IYZnA=95fgaoi-DZ9e?e=Jh^mS#Tqa&h|3T%Qosk(7thFREv z_$&_vg3ko7hmVoGU=I}0L3&^htgMIM3Q(h>Sq6lx@4h^Q=m#;26WgCdo-kJvwJbP< z0R6a{RNuL$GTnEk(d%T;^23WMrXP=EU{TZpS>TYV$iGDqK?lHC^%TgP>C0fJN;PrB zNVXifLPtFm6?zZ9Q#OSL2`|-E6)#W{$$r}e$F9A|F4N|N z#v62&Abz)#^p+N!_%&rC_^32(9tnm*#%n5sV z%cuV#%z?7d)(LFj+l?TQMiRFkynPRdaXHvm1%~No@`_FDSK%Z=n)~UWR?70yW8j7- zuQE1r2h~zW6K$t(Kmcm=5{!3yTG&=@p@2u7vm^Nov81-RzPiW{wf( zb_Dp?vKQw6B*j<;lwuQkR*gv$4cfYoBz@0oU8N2w4Tho#sM=o9%3F9pu2ep;DId6Z zRF8UYu5n+b^cc4t2Dnl*edUZZz{v8hXn~CoDsWNl&;#jOMnZ-A1Q%GSXxIrtopj^{ z98Tkj@-J`fH+gLG)}})~U_K`4>s6cS0WZAMcStn@)D9i=@-`cGToAMm%8*0C#A{af zAHc3p%=1x(_IbNvsr!`lEb_urr<9531+0i-6z4d(S=ReU^L9xy4oeXAlsh3h3kVY4H6t5u+do zu1BVk8P@L7sr-_?ssZSf-S2eG6qJ{1^moO-q?3UA9e_nYM=2|@XhlV;`sC~fh3wV$ z3Se`ugI1t7fhin+-WX;?IAb>A&S6=7*PGYc|b{;?5@jMTj4CqR~jbnUf#o?(~5=V#jM;>V{oU)M{nW?-t_XZz4M!- zAT!zv;iY#KwbM2D>W3j?wu%%;owDO|F5sA0xHX4PO{2G2Z%YOt?b`O~9~e+ZFMXG$ zJ%IVM-1p!OGJ=mmWFkSxrxm`H(6RaK^d^Z4aMicHW^xlSO_w+jxV+iw&OIQETc2=l zpkRUc=8(|yOK>EKej!%7Zk5rvYo|o8#xJC#k(r%i#-&lRMwh$Ed-%PQ;es0pAql8= zCMHE`@P)W#RIH)OkW`uAze}w>_#O0D*EERS5P`TawlM%9C`|qIGoYUuN|gzk-sR)7 z3!kC?y8Ate;@l@_OfIwD98=ms zwo{wls)9xAacE49&KfQ|Js(>(4#URm)d%Vc;c!3;h3U#%m0f)ln>5{KQ_k&lWtwEU zdCe-KbQ8$w@i^_F^9X3<8e|3w%K8HuUlr*x#7PSY3SXJ|E*gLpWx3O8FBUhEgSa#{)}t zNowl$#LibCj0S8#ScuCz>y7687O17_h%%|90ta%L04wD(1d^UavtCd0G;eHRAbb-k zu7ad4wW9BD@Y$#{5J|su6-z7Y*&2a3{(~dy^b79>>HKUr2oouGl*r|MSo4)I<X4Q6&cVd7~-SQYrTTV-(SRQncLSMSv$3PAb-OuPNgUOV>t)`2#O zan1~qy4U1D_oC*6nOqA-*7OXu;8Cy_ti+Bo1XfzGNXE1|R#iHtlI;WjH7pQ^s;ptE z18yw6=p%Cq7~V@>!z&$uGI_dl$G%qJtWH)dgImz#qJ|AE)Pc`+tcPn}*r|I^vZb<1 zLBJ`Knn2g#`m&G-F4rpke% zaK?wI&99?16#tO<~YFFqjlnz8_vd1wE<6Rz#V7XSeA+#fI}oO?gEAt z2l?LndAy+lDrGJO$ZrBVNZXauM?{4{PFHPFi`Xf$O`g!b=#s>LH+IwLtO& zBzQB4O0C`s9`s>yMTh4VjDnK5XsRW9-a^akqbmAjHWOnPnqn4RIW7dA3gXYM^8d)r z&-Rsq>UJL=O>oEX&vdybB$L5E|3k)TQtn22N23PRFbXMdH{+~?TUKyyF*Dx3!p;aJ zJ!>s$>vvxR>U<=eF1U3|xIqV{?J!rI_qoYEo(r0i3AWud$o@U;b1?1BtED>7^Pp`r z03=b$Oi_&ymRq5ECtV`+7Uy-DF;w>6a1O+BKA=D1Fn3Hr2A zD7=CraOJ^m&~#B}yD*tV&pHNm^;0=_gXkb@0nimZi0^-mMsb}uCJ4$~P0BaCggF_F zbaZw~yC`orq^5j(!2W8aUxRg^x-2UVQ#b$KwgXb#2IcUBe=OVtPRm4VbtRv-+zBNy za<@a?DY}r3^pexe37)Vm%0||&z$a)hc0w6Uh*K;_o`om$K{~ojiy2GWRhA<+@n5~* z0oWp(ZW0zt@X@G7oLQJ|j`4#P3<9s7^0dGVmrZSDRGN6rgJk2k`E0~t z*|;;*;R!H=(^DjVpQ|~;Z+JN!W#T-lLTeB?E+*k(F>BxSAZB4-4SoLT_ZE+749V7I z=DHz_wOdxP77dzAEp7@KZA`0ao{c$eUORi+xVl80pl*8!E(F7)zFLOlnn4!5Q5es$ zK3yckR@Y$Q@hy<~4NlVd^y+WQxiW0BLnS~L+wWK3eEyGEbPtc_xIgqXl=8f1&JjL! z7W{l;hf8X-#58L}=-?30L@(tIcCU9~z$XE-0jQP6S5!akn6L5bpNPlJ`5&oPm%4u< zqc8k+#*)GS*7Oq6E)PI}8n!+tWwbm=_za|5&76<~4b|g1B7Smyy-ouGzg5tyAJMGGuHPp^8vyv{LlMKqi64T38sdi}4(UQ0V{ zPrQA{^t4WBKUr(C^dhC1ZAc&7(`D;`lz5PY4+GfB+IMdWKO2U#svnq;+aRPvbK@*D z;5Y5tSXL4F_sW^0YM%~@rFhO~h{he5d)BA^VIgf>!zTxL!P{2>b$OpmDnb$&LQpM8 zp>5s~9-IVi&@zPUah|uQ2KUiOlVd#3o!!8K|W|BmpNXH^;| zAyBc)1um)DHh~naC97=Zc!0&^;AZPRS@yGvXliovYiAOqxZx64-B}tdf|8?k$N7Ni zQKm(NX4_Qzi!9v&(ouRYhiM`rad;PeH+1yxZ{ICp4HB%?Uo+J1cd*IXY@V+LJ$npE zOd9CZ6Znz~W?P_}`0uxGth3ox*)jzwImD`Ivt378)4GWP71=;^KoXG_KYx3)1Cu2tkUS+Xw7Vwb{W=mEG7zAfW&CEA+90PRRKk~}`O zUem@T9_S*{_j-VaN34hzVA6J#!fDj^{t2PISF+5`-VE;o?(p9Ao>p_@gPQ?(m%D$5 zdx9y9lpoy34IkhAza{25gQ}CoM17K#oq?R?OwKVz4>O;!&Kj!IcE8h~Q8Z}}|7$yF zec;fMVTZ0z;6^N!UJ8bjV%8 z5ezy5XO>3o=c#~$4a*de2rt^j5RznMRcKxPMpDW8#7V{3v}nlU7;t&V5L+LL{NM%2 zC~RMEtf5#q*ZcJ6TGQnrSHiYOJTI87h8T|hVvbyI8?Epzk~!*o$Y3~mD#_SL$Gh4P zk7QFi@ocIYq~0RacXh!bZQ(d3mlvSVsYX|Ki6vZV~JK`TBEdF~$YGeI(L^qU!*i=ZyVT!I=Ry_}uS;a#Xkiam_B~I9(le z<2;5YJ*bYoa=O%_W-Liw2Iz#@jutLFTu}Snc@NBIyL(n@BEV=Lar{${iAd=O2MEQ@ z0wj5tDesxI@L@$~J&u25?8Uv!J^pQfcnfe)c@Zmg5C;X$L-I z%LIye!AXKcS;xm+>LxeBdc-?BZ?sK3)F6yn`asY0J<_O){1r?nS5(nQGcehmwyz8kn0SBR9T4Yw_9RQ1eLlVVo|h5jP#V5nl^m zba7d20(S+HBHb%f0G%NrD3K>bxCVmwJE~QPJUWK+x-N+HU9rajO}SMAj)JQdS`(Dj zBQ!@79nxjP(Bqjaa`*3M~3IF%F1%@*t3a@^WQ{)MSKge>JCVnsD(&)}m z-1H1i8kGrO!l=I4hla1VZi9gR%2^gYDAJKXaz4eQ>JGm&mzQxvTqpl6ZS;`b1!<9~uB~pj zXrZf#Q@cYQSlr#`0kr;UkcgiN(6#o=_J0I6g8V?Xr553|v(N3dQLx% zLy4FLsvn3mU6oLJu1zyw>0w#>)3E57XpL5r;luRuZ#Vr5t9H_*y#P1gw7 z0FUfj$@*W}{j;8qy&rTtQ{k1hFW95QYH{GbUz4_Pe@%3fVG~D4lCv{0!<^g@v}2DJ z2skA{afSO$B%GA-}x-m#~o($g*C-&WSjj z$!Lh48gB|Z|K-D=>B{H9wjo%nP`8KdT0uG=>m7&{4~61JH}nfgA?@LtingPx*P1JYy$=%N zdvomMD3zjZLqiSfxo=Y7zM(siA;1gpd(>8P8SaPkmUVSa2;>68SL-JcIZFA{X1+0t zy1JCcMqKE|4HQ|GQ*hUcw#pOhPmcw4W+3?Mh`$rj$ZaN>wC!T*LPN|#PmDV?W+VPH zfK-(;N~NGh|DSlb=VI6R&Ckia&t{Y5x^D*UFtU2-mmmXW>_YnkB>G(~^4ng;-)6n2 z-xli8HMdW9hmpB8sS&!_?Zy;T1a~;Ik(XVG7p`#piFB-9XukCI#$zPncqcTOTztiO zT4^@T8_W?2=J-Cq7#_Zkb@8`ZqB^53m4-j?8XG)*25H>V_*a+Q=t#SIL0y6$l@-Nd zLf3;{Fc$yK@F|%gO^SMB`b`)$sk`@$1+_5)7Oup(*Bova#A22fc-cCQ#wu3^63-FM{>we1_ z{=a3B8NIcBuVTHCb%9x91rO22RgSj+glRbduq4Ab!#d#J-X zh;AG%J2M~L-Ix$Yc_Ru55f7NSGT+vG2U9Dt3TR4Nf7X>@J9*wGr;g82KzVq8$+jU! z+)xG%EDKKk%YL_BZG&p4Ow|_W262+%`(J{_3rXEq#@h*|CLiwtbU=4%*#m>yUGW~R z-wRE12kYY_^g4cX(MV$}2QnPE~>!Ijp#f+q|L#x=q1FWP}taB*e5A6T>tFKXpZbs&cC zYd#))-GEdp|;XFH>tuSmEp#%}XxX=Q0DDDHCnrR%3v&=hnMy zT|QX1W8J-GO}5m}Ud^~4%q4?~qST>moD(D1_!*jIdvX0V7Y;fYX~gxtstha49Qxss zd{00JBw$5TERGe)!N%?5zx-2wxS`nm7eL*MhvySxRD$E&+XxFi@J?t!44c2E*za(u ze;03m!M`qxLy~E8=BRxWbp+60?PD_Fr;I}COOW?&U&gem55I?^DN5O*Y%%?0a2s|8gBYnF2yulN?_@ zZDvvd1yll@=KP@mQShHqe~YXo$NSi$MzTYx8~w)?$9a-=U&wIpB%D>r6%6;^hxR)K z^4c#q@Cm;FZP)I1{AT&O-CCVmu5MHGk7F+8nEW#1NPa3qRrC3>`4?a=zjCiGy_H17 z6-oCyE6^s^D6BvwLxyfG8)uIP`{w>gOC?X1K}_jSce{hL{}#!vB)A?P4>3nIiyh{Q zadWGvWbG_exVgC@1I{*4T&w}4pn06<*OTHBS~hR5Hf|xtg%~ ziPAZtp5cxDmgzYrzWZw2J!3#L@?lvC`oE^&l+9ACKVoSx3MEHK4QKns^*G`#v+2_W&I^8eWO7ygSYuLR{t=BWBN`;Mr*0_xiW`i?$vho*~9t<%Lm zrucijb>3fR3NU(JeOruW6m$-G>XIa(MCKx2tQC!atky4%jU}q#sbvgVe=@aRw@rhc+UcVAP1)TySqazM7oqDh)hU-ZS(hCi%$x51fqDr()B|0$pmO zKfJer^2ie z6V;6Twej?>g4<_v$VtFhX976(hL#vHzn-6K1stqA;-*JNr!o3&O);8VK5l#l5wY+_kLLniJ!C#VoUK}TuG~QCt zC45`3>YVFoSHr}w6?*@}FbhLMC z7z+)cpRO~Oz#HK$LT{A1Tfzv1aFWBUoYa>wUcdnIB`EN&qdJX#PV4D6zKez+eLqxv zR&oJ6uQckOH*zlVQu4ji@i-JpzxhD(e_?PnJnQzJJ7)Z!y}UbaehPBi`NB-b>65Y7 zP>?8eMCx7${62E_-W+k7+Jrg>`NA1mjIqi zo_$c(-eR~TNi%mqgX1SiG=@K~;RE(Oz5esDL0I)jshDZ~NnTOSm|rP=rn2)vTcZXa z3d3qAV!hg_6?HK3Z-^rQNF}9)E6fUWyi5S{kVBb#L-6ZyC0xceNe5=KJX zs0EkGoUC_m=a){GNg@w*)9ZLth;|Hhjq^Q}=)%VL>oP8@SSay{s#5|R(mi+a` zJzApFYA*Y-3IS%;Wuu-Ktw#pSqyc>S*63$$a0BMfUC zQGv%uvpmU;mX2rE&9LEQhPXOhFi}&1W1Bnm^ddZ>as3D7h?s{?Ezsv(jpY?m|-Iu9GUd9bnS0?RiWir(61eiFsGq~6#03$Ij7 z^pBageHYGw7Av=rF7lVWFmTtTP9FMF{fOz+l2NxVP;w%_=s81(#?WL?KdEpQvRN1) z*!Y_k51odFDsj7fKRo5cH_-U8VI4o-j`U&$n_Xg4U$>2v#uH`}|p> zxB@x|WHIVwE4!tVwZ-H!QO&}+K8V=)4AG|3?1I3A-9F3=dP_z!E9*TF5V7h=$!ZPJ z56f;E9KdE}3mQ6=J(qpbbkf4c5Z(OZ#RG1qf1mJ3aP0EI9%Dk?9672iuxHO@H;vBg zIWG47_Kv@{(UbCL#|ru(9Ldpqti8Vn_Z4zcA`G)ZB)Qr43SQHb9(N2VB|k90uNMR_ z@*6jztqkZBtQNLzLr^cAHTSXPRF&C%V z*(n(u0=0YT=&)h2j+%mq&!?{l&_)SheTsTeM#RVt`TqW-8snK%g5Kc|f~PFgT2ntk zpC1KYvOt0-Py`U+5_)%C(1;sbzjrgE!6-1Pq;6NRyR>^*Q|rdr{KXPnfm?5c6&>ee zLw{)84lJ|^Ug)hL`DX}|i@WKWmPet44mv1*kaDf->n0tLn{kSXn(MS}d6{qh%UET+ z_6e5*8u^Bm32|vS79o%wm~eM#cLKrrMOBL#0cr~Qzh3N3^DMu@@a)uFDsJv8Zf=Ya zfWY5Gp%4tknBh#M&-WuQ_+W~FRbt;E7o{>r4i^N-&l=_a_=)j=FdfFV_io?8x!#GV zwlSeaw6F**0V-cSH=?wOV|rzg4?#-yLmkZ){Q~pBLm>Wm^NfJloPj@d^Q6Q9I;0r` z3h~y95BzXaQCyk{G%iFL{S$6$FjYEZKO^Qn9LBQ0vxd9{Wv`E{*(-qX8=c&R@JkUK z+O>ROd-jembe4HBrh1OwwC;3nI>4}nk8gq}m3;RuwS@`ocLIw*pOy61x&J2_ZWo1Q zog2*@ZM3$(=-GEy&3Qy*XmKWbDyB64c!;D97-Z1T@W;9a7|!rkX7et(l3pwNLtP({ z{?o4@#9KaY2p@FzL#d)5W^Ew zDN_#k9P(Xsk*W`NHyHSR``$l@ zt+LDE+y^O#AN7Km5xu!q+=2J8>ErB}Ngg{WheIGZ7!V@coEb2kpZf}*-eJv;!*~pI z9UeZIzYswB5La~R<4r==oOn8$HkW{e9vxlL<=!J%F^E|0cYzwqLU`g#7enK@-cN1& zF$JSeq{X|PPQybC(b)Hm7%^%|3M7q0ac)5aPLrj>+VGxbUzWjGG(L=7N@nNu_j+T( zP^Kh7=L8)gx?z^WYUeY^oT-6D)E=yG=2ZiKsh6)Z&^`y(lz(v*fvwfIh=oHjx>2)( z0SwV9j?Fp{NYe*{ZEnB$Uk3}1*A?4LejCogxm4`4rzjVHx|_BG77M_8;X*VL?)!s; zH!cEcx15^d&3YUV(|(=0k$>*{G2WQ*55fr}?v*%KKu3uHAcSuZYXcrsYdE${l7WOG z%Udn={@EksF`aU#vtRzm*}_{nsS7;wMa7u-YIh}0?y%Z4r+~yEaCW8nM=<(`S~oMv6_ID*oNMHwE)M1V zD^BPp+AoZ|S+njp8_Ber4~k_zDNuU=pl8mj$*%xCMX&5!nQR|8xyw5OI~!(4MK!%A zKXGgx+Xrz-9c4!49uPnbWY4)yG9${kCP*tV@e0L#UZeMuyj4|>H}#=rJ9ubSf%oXI z?(^`WX;THS`f@Ve&;}=ddQ`!Y8OY4G6-xRUnVgrb^3EZAmT%q^t}ad+RYDAiH^tzyyOD!U%{fY z=}*!5fHG1FS9B}=*+wAre6kPdj;APBcOS*2e8PdZrBr>2*m!^p%zzTiwU8UF-8FaJ za^N=a>zu)T&X_?LG5ylN6 za9s?Hay${9Zsz%)!=gE4uf39TZ4aEt()1ci>L+^ry5bd5ds~!}LRwgKBbij5Ss94-+GCRZWp5GpznEjy;KdW;rbRZZFAKZhrn+q?dDX$0k zk&u!m`}war@z3T{{6zG1VOv09l(x)kKm>krI=T5EVyn911ealTM6WBe*rw{msG#n} ztN|w;74x1%+~tjDH{t(-#}!du>Nzi%%zS>XX|w2E^9JX7?Y0t_6L5dwBruJ9iXH)SXbag)(xDKx z8=Pd9Ra%ifYyKsHHiy#eV*c5kvt>1^1KMp_;*IYdQee+(9a66cuNA|C!Cnxs>g-6o|hLSE4e%3|Tw9njw z-2eHg{f3nLgTIi(&o>7|+Xq_?&W`uxvmQJHBJ_3!%-gW8>S{&`vxhANjV85U82m6e zSyeMX_cEk4({46RRX^q(Ag4JE&HtQ`lZh2NUeFt(n^rK*T7_{PD+zfr<_w+K@lp&~ zZwRBo-L+N(7K!w~`;K~t(irI*MkTY#cn#!dg*+Kq9wB)g9ufb?h*G3DU!^`Eh6kzL9#p&8piK43-4a|hcGO!-comWHhtKPpUb;L=Bf3`vVF*K^ zJa+ffOV6wK8nVx`l7I?j+Pq%?A@T^v9?H5#W#dnvW~|Ix29LGGy>zdt;yW^n!Q{;> z>awexYmKgC(p@Oo0*%KKK!>ORU`*TrHYSUGu^j^}tSed{f0Ln4>SVPxV@CNVqV)To z#GjqxPj6Oj1Ij=VYWhg5SqO;lB{HK25`nxWwaW={A$qW&kvZ)s!kLk*RxJbmz8dUe zu8E`x(KA$vy^8nOfJ3a1eoxl^AOwCJShruwueByBu##DmUQdwNq{pH&oPV;r8%=-Z zcX3;&IMoae-@CI0=CrFYe`cw!CDRS{uAb+~5CeVI7LOF~af7N(Dt?P$g!BIT+l-5M zKGF2J0J;DcLGC|9a1+Z&{pWYuzV8CmW*?`uc@91{E~Joa6dQ{NTb%|RUK6s$XMG6H zZ;ouDL-GQgz7gemlZy!<#AGhJ#Bsqdin_Csy+3~ac9+LyjP&99FN4B|pXD;6NBFs+ zZh6?oVcN47-l*Xp8x24TKh~gUT^x29nXTmto6i4LlWP0(xx8D#xE7&l3r=%}^eWSg zOQ7~FP_$}p!q*(=iuTlwC@E1N7dCO?3?+s%dkd@k=W@q#v?g;3Qm}55FPyYCW z_>u5lDg5bwcDW?X7&fI`d08HGd6;J^uwCIsM~8!$rY}3HBZMD3l2#yeo$_O9>AjM@NGO%MzZbfoH`5c4Sy_AH%xG>5C{2Pw}6Ey~+lF6Zre=ZW$j z-ZOr+fx@%2AYPi#47yUWB19;7Nq|PD?wCr|T46PTu(-0pjAJ zIE?lJ;ME)Hxo@RdO>l}N#QchkdRYKgJN^I`Pxf2j$BK8aBAA|VZo6D!ohR9iBIq)j zAMTIzj7aW`aqyVF}&&+0qG{$+GW z{QcvGm7bp34D0fJio0^d@3`{b*xo-B-4^C zHTHHr!$a>bRcoesK^W=_Yla)R-MWi;_I9dBlzBS5{Ju4c2k2#3X&moOhHASP7U=IL zB@N9g=6Vi3wIH^>W&SDaFsx4PK8bUkx5Mr9I?Dh8Csf}H``xbc&sWw zt$$1`%}!zN`|0NV(PV>G>7(t8RtM%vJl;>hRt^Gx5Gb!)Hl?u}NS|x>*p`_04bx7& z1C4Ko}6OkCI-eS28*_eSbLrJdDz`B$y&ZdwQ0{>eFK zOdx5^<6CnBtj~M)kRv@v#{DNj(5L+cD6qj5?E{XmB>WxIhQGh#9*aVnk(F3Nm@j*x zj7PtYs!Ywk=H{ACJ@0h#_<~1R!6dyXr(%lTV_xOpw>h)4NCw!-J=#`ce{W^?78u`H zhh7hn^`&o^6nyi*7JP6cbPt6tvgz_|^SWMjEXaGYGH;A9qUIIygx^fhv=}qfJ4iX? ztbQ7{t#1O6|g$B-<#( zi-yL;%qxbZXYB1R!{tg@yHX_m6I;`Zh+g0Lb@2D$Xas%+wuFb}re886;_L>PV7nCk ztZ2miN%f8chx-DhhZ&_ZDyh>pmmyW@_oS;CIHJB;dGblyw$7}DxB}JvJFGNqI@9O- zy2AEJMO(Q*0ODWL6{zMV;r1q*aje1AO{GZj851F7DO(}b~_9OOb`d!$m1{s z9TsIxJLh=*r!G#$!a~oCq}mkK@nw6)JDVFMRY&mO8zuQFD-W5-#samBp=8zb(H%CM zNF85%&2@%LGPVcc^;R~VpV;ay(cy;TPd&hqq%4EjC*Ghgn#qi*uk1c4`>?mS|qzL zLIh20fJuXm#p1^msp$hQ1~~j_iNip8&H-3^Rr}iWFbiTrZrgF1$#ahTs$sYNfjI-x zzL?NfIOrOy0WA50M_o*}(_wjnPamayELRL&SVCC5M7*__+m5Q|0Lm#B#M9D%trcmA-i2zcbcD_~=V=5{D%BVzM9&0#g3lr#+$z_ z=R|BCws)qH_^s(WsLuuF*ePK&>;}?_u)4J0M-60iff?l lzkv4}(*MgC|38c|hcWK)Q70af3PgZE>c`Khq$-=-{2xp=0kHr8 literal 0 HcmV?d00001 diff --git a/main.go b/main.go new file mode 100644 index 0000000..a1909d3 --- /dev/null +++ b/main.go @@ -0,0 +1,17 @@ +package main + +import ( + "ProjectWIND/protocol" + "log" +) + +func init() { + +} + +func main() { + _, err := protocol.WebSocketHandler() + if err != nil { + log.Fatal(err) + } +} diff --git a/protocol/api.go b/protocol/api.go new file mode 100644 index 0000000..38948cb --- /dev/null +++ b/protocol/api.go @@ -0,0 +1,39 @@ +package protocol + +import ( + "ProjectWIND/typed" + "encoding/json" + "errors" +) + +func init() { + +} + +func SendMessage(messageType string, message string, targetId int64, autoEscape bool) (bool, error) { + // 构建发送消息的JSON数据 + var messageData typed.APIRequest + messageData.Action = "send_msg" + switch messageType { + case "private": + messageData.Params.UserId = targetId + break + case "group": + messageData.Params.GroupId = targetId + break + default: + return false, errors.New("invalid type") + } + messageData.Params.Message = message + messageData.Params.AutoEscape = autoEscape + messageJson, err := json.Marshal(messageData) + if err != nil { + return false, err + } + // 发送消息 + _, err = wsSendMessage(messageJson) + if err != nil { + return false, err + } + return true, nil +} diff --git a/protocol/events_handler.go b/protocol/events_handler.go new file mode 100644 index 0000000..5b454e9 --- /dev/null +++ b/protocol/events_handler.go @@ -0,0 +1,71 @@ +package protocol + +import ( + "ProjectWIND/typed" + "encoding/json" + "log" +) + +func HandleMessage(msgJson []byte) { + var msg typed.MessageEventInfo + err := json.Unmarshal(msgJson, &msg) + if err != nil { + log.Println("[ERROR] unmarshalling message: ", err) + } + // 处理消息 + log.Printf("[INFO] 收到消息:(来自:%v-%v:%v-%v)%v", msg.MessageType, msg.GroupId, msg.UserId, msg.Sender.Nickname, msg.RawMessage) + //一个简单的测试 + if msg.RawMessage == "wind test" { + log.Println("[INFO] 收到wind test") + switch msg.MessageType { + case "group": + { + _, err := SendMessage(msg.MessageType, "wind test success", msg.GroupId, false) + if err != nil { + log.Println("[ERROR] send message: ", err) + } + break + } + case "private": + { + _, err := SendMessage(msg.MessageType, "wind test success", msg.UserId, false) + if err != nil { + log.Println("[ERROR] send message: ", err) + } + break + } + default: + { + log.Println("[ERROR] 不支持的消息类型") + break + } + } + } +} + +func HandleNotice(msgJson []byte) { + var notice typed.NoticeEventInfo + err := json.Unmarshal(msgJson, ¬ice) + if err != nil { + log.Println("[ERROR] unmarshalling notice: ", err) + } + // 处理通知 +} + +func HandleRequest(msgJson []byte) { + var request typed.NoticeEventInfo + err := json.Unmarshal(msgJson, &request) + if err != nil { + log.Println("[ERROR] unmarshalling request: ", err) + } + // 处理请求 +} + +func HandleMetaEvent(msgJson []byte) { + var meta typed.NoticeEventInfo + err := json.Unmarshal(msgJson, &meta) + if err != nil { + log.Println("[ERROR] unmarshalling meta: ", err) + } + // 处理元事件 +} diff --git a/protocol/web_socket.go b/protocol/web_socket.go new file mode 100644 index 0000000..c4cd94b --- /dev/null +++ b/protocol/web_socket.go @@ -0,0 +1,122 @@ +package protocol + +import ( + "encoding/json" + "fmt" + "log" + "net/url" + + "github.com/gorilla/websocket" +) + +const ( + severURL = "ws://110.41.4.138:3001" +) + +func WebSocketHandler() (*websocket.Conn, error) { + u, err := url.Parse(severURL) + if err != nil { + log.Println("Parse URL error:", err) + return nil, err + } + + conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil) + if err != nil { + log.Println("[ERROR] Dial error:", err) + return nil, err + } + defer func(conn *websocket.Conn) { + err := conn.Close() + if err != nil { + log.Println("[ERROR] Close error:", err) + } + }(conn) + + for { + messageType, message, err := conn.ReadMessage() + if err != nil { + log.Println("[ERROR] Read error:", err) + break + } + + // 将接收到的消息交给另一个函数处理 + processMessage(messageType, message) + } + return conn, nil +} + +func processMessage(messageType int, message []byte) { + if messageType != websocket.TextMessage { + log.Println("[INFO] Invalid message type:", messageType) + return + } + //message json解析 + var messageMap map[string]interface{} + err := json.Unmarshal(message, &messageMap) + if err != nil { + log.Println("[ERROR] Unmarshal error:", err) + return + } + // 处理接收到的消息 + messageTypeStr := messageMap["post_type"] + switch messageTypeStr { + case "message": + { + // 处理message消息 + HandleMessage(message) + return + } + case "notice": + { + // 处理notice消息 + HandleNotice(message) + return + } + case "request": + { + // 处理request消息 + HandleRequest(message) + return + } + case "meta_event": + { + // 处理meta_event消息 + HandleMetaEvent(message) + return + } + default: + { + // 打印接收到的消息 + log.Printf("[WARN] Received message: %s", message) + } + } +} + +// wsSendMessage 向WebSocket服务器发送消息并返回发送状态 +func wsSendMessage(message []byte) (bool, error) { + // 解析连接URL + u, err := url.Parse(fmt.Sprintf("%v/api", severURL)) + if err != nil { + return false, fmt.Errorf("无效的URL: %v", err) + } + + // 建立连接 + conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil) + if err != nil { + return false, fmt.Errorf("连接失败: %v", err) + } + defer func(conn *websocket.Conn) { + err := conn.Close() + if err != nil { + log.Println("[ERROR] Close error:", err) + } + }(conn) + + // 发送消息 + err = conn.WriteMessage(websocket.TextMessage, message) + if err != nil { + return false, fmt.Errorf("发送消息失败: %v", err) + } + + return true, nil +} diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..64543bf --- /dev/null +++ b/readme.md @@ -0,0 +1,8 @@ +# ProjectWIND +骰子框架,自用 + +
ProjectWIND
+ +license: [MIT](./LICENSE) + +开发者很懒,什么都没有写。 \ No newline at end of file diff --git a/typed/typed.go b/typed/typed.go new file mode 100644 index 0000000..2554378 --- /dev/null +++ b/typed/typed.go @@ -0,0 +1,132 @@ +package typed + +type MessageEventInfo struct { + Time int64 `json:"time,omitempty"` + SelfId int64 `json:"self_id,omitempty"` + PostType string `json:"post_type,omitempty"` + MessageType string `json:"message_type,omitempty"` + SubType string `json:"sub_type,omitempty"` + MessageId int32 `json:"message_id,omitempty"` + GroupId int64 `json:"group_id,omitempty"` + UserId int64 `json:"user_id,omitempty"` + Anonymous AnonymousInfo `json:"anonymous"` + Message []MessageInfo `json:"message,omitempty"` + RawMessage string `json:"raw_message,omitempty"` + Font int32 `json:"font,omitempty"` + Sender SenderInfo `json:"sender"` +} + +type NoticeEventInfo struct { + Time int64 `json:"time,omitempty"` + SelfId int64 `json:"self_id,omitempty"` + PostType string `json:"post_type,omitempty"` + NoticeType string `json:"notice_type,omitempty"` + GroupId int64 `json:"group_id,omitempty"` + UserId int64 `json:"user_id,omitempty"` + File FileInfo `json:"file,omitempty"` + SubType string `json:"sub_type,omitempty"` + OperatorId int64 `json:"operator_id,omitempty"` + Duration int64 `json:"duration,omitempty"` + MessageId int64 `json:"message,omitempty"` + TargetId int64 `json:"target_id,omitempty"` + HonorType string `json:"honor_type,omitempty"` +} + +type RequestEventInfo struct { + Time int64 `json:"time,omitempty"` + SelfId int64 `json:"self_id,omitempty"` + PostType string `json:"post_type,omitempty"` + RequestType string `json:"request_type,omitempty"` + SubType string `json:"sub_type,omitempty"` + UserId int64 `json:"user_id,omitempty"` + Comment string `json:"comment,omitempty"` + Flag string `json:"flag,omitempty"` + GroupId int64 `json:"group_id,omitempty"` +} + +type MetaEventInfo struct { + Time int64 `json:"time,omitempty"` + SelfId int64 `json:"self_id,omitempty"` + PostType string `json:"post_type,omitempty"` + MetaEventType string `json:"meta_event_type,omitempty"` + SubType string `json:"sub_type,omitempty"` + Status string `json:"status,omitempty"` + Interval int64 `json:"interval,omitempty"` +} + +type FileInfo struct { + Id string `json:"id,omitempty"` + Name string `json:"name,omitempty"` + Size int64 `json:"size,omitempty"` + Busid int64 `json:"bucket,omitempty"` +} + +type SenderInfo struct { + UserId int64 `json:"user_id,omitempty"` + Nickname string `json:"nickname,omitempty"` + Card string `json:"card,omitempty"` + Sex string `json:"sex,omitempty"` + Age int32 `json:"age,omitempty"` + Area string `json:"area,omitempty"` + Level string `json:"level,omitempty"` + Role string `json:"role,omitempty"` + Title string `json:"title,omitempty"` +} + +type AnonymousInfo struct { + Id string `json:"id,omitempty"` + Name string `json:"name,omitempty"` + Flag string `json:"flag,omitempty"` +} + +type MessageInfo struct { + Type string `json:"type,omitempty"` + Data MessageDataInfo `json:"data"` +} + +type MessageDataInfo struct { + Type string `json:"type,omitempty"` + Text string `json:"text,omitempty"` + Id string `json:"id,omitempty"` + File string `json:"file,omitempty"` + Url string `json:"url,omitempty"` + Magic string `json:"magic,omitempty"` + Qq string `json:"qq,omitempty"` + Title string `json:"title,omitempty"` + Content string `json:"content,omitempty"` + Image string `json:"image,omitempty"` + Audio string `json:"audio,omitempty"` + Lat string `json:"lat,omitempty"` + Lon string `json:"lon,omitempty"` + Data string `json:"data,omitempty"` +} + +type APIRequest struct { + Action string `json:"action,omitempty"` + Params ParamsInfo `json:"params"` + Echo string `json:"echo,omitempty"` +} + +type ParamsInfo struct { + Message string `json:"message,omitempty"` + UserId int64 `json:"user_id,omitempty"` + GroupId int64 `json:"group_id,omitempty"` + AutoEscape bool `json:"auto_escape,omitempty"` + MessageId int32 `json:"message_id,omitempty"` + Id string `json:"id,omitempty"` + RejectAddRequest bool `json:"reject_add_request,omitempty"` + Duration int32 `json:"duration,omitempty"` + Enable bool `json:"enable,omitempty"` + Card string `json:"card,omitempty"` + GroupName string `json:"group_name,omitempty"` + IsDismiss bool `json:"is_dismiss,omitempty"` + SpecialTitle string `json:"special_title,omitempty"` + Flag string `json:"flag,omitempty"` + Approve bool `json:"approve,omitempty"` + Remark string `json:"remark,omitempty"` + Type string `json:"type,omitempty"` + SubType string `json:"sub_type,omitempty"` + Reason string `json:"reason,omitempty"` + NoCache bool `json:"no_cache,omitempty"` + File string `json:"file,omitempty"` +}