From d93940835ec4097c3edc6018f8651e4067a42571 Mon Sep 17 00:00:00 2001 From: sin365 <353374337@qq.com> Date: Fri, 2 Jun 2023 18:30:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=AB=AF=E6=96=B0=E5=BC=80?= =?UTF-8?q?=E4=B8=80=E4=B8=AATCP=E6=89=93=E6=B4=9E=E7=9A=84=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/HaoYueTunnel/DesignTimeBuild/.dtbcache.v2 | Bin 124668 -> 124668 bytes ...74ef9a83-47c0-4c94-bc53-97852d1c488c.vsidx | Bin 0 -> 52392 bytes ...810b85e7-530a-466e-a571-647e20d64794.vsidx | Bin 0 -> 54888 bytes ...8cf87acb-c50f-48bf-a078-36be13ef7520.vsidx | Bin 0 -> 55606 bytes ...f206be68-8809-4859-a92e-8deb5f741e0d.vsidx | Bin 0 -> 62804 bytes .vs/HaoYueTunnel/v17/.suo | Bin 118784 -> 116736 bytes NetLib/HaoYueNet.ClientNetwork.dll | Bin 16384 -> 16384 bytes NetLib/HaoYueNet.ServerNetwork.dll | Bin 24064 -> 24064 bytes Protobuf/ProtobufAuth.cs | 31 +- Protobuf/ProtobufTcpTunnel.cs | 920 ++++++++++++++++++ ProtobufCore/out/ProtobufAuth.cs | 31 +- ProtobufCore/out/ProtobufTcpTunnel.cs | 920 ++++++++++++++++++ ProtobufCore/proto/protobuf_Auth.proto | 6 +- ProtobufCore/proto/protobuf_TcpTunnel.proto | 32 + Server/Program.cs | 2 +- ServerCore/Manager/ServerManager.cs | 11 +- ServerCore/Manager/TcpTunnelClientManager.cs | 146 +++ ServerCore/NetWork/IOCPNetWork.cs | 14 +- 18 files changed, 2078 insertions(+), 35 deletions(-) create mode 100644 .vs/HaoYueTunnel/FileContentIndex/74ef9a83-47c0-4c94-bc53-97852d1c488c.vsidx create mode 100644 .vs/HaoYueTunnel/FileContentIndex/810b85e7-530a-466e-a571-647e20d64794.vsidx create mode 100644 .vs/HaoYueTunnel/FileContentIndex/8cf87acb-c50f-48bf-a078-36be13ef7520.vsidx create mode 100644 .vs/HaoYueTunnel/FileContentIndex/f206be68-8809-4859-a92e-8deb5f741e0d.vsidx create mode 100644 Protobuf/ProtobufTcpTunnel.cs create mode 100644 ProtobufCore/out/ProtobufTcpTunnel.cs create mode 100644 ProtobufCore/proto/protobuf_TcpTunnel.proto create mode 100644 ServerCore/Manager/TcpTunnelClientManager.cs diff --git a/.vs/HaoYueTunnel/DesignTimeBuild/.dtbcache.v2 b/.vs/HaoYueTunnel/DesignTimeBuild/.dtbcache.v2 index 1cd3c8ff9732111c9ce6c9d37f4a317b6ca6d318..701d70fa8858535995706337765233bcbfca6995 100644 GIT binary patch delta 16742 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 delta 3243 zcmb7E3viUx75-0d-U*S1h7Cz1**rE6N%r~guBG@dA&|&ZK?RJ+zyJOlkdVY=(K6FE z&RA=utt9(1-cF&AO$Z{O71z3`MV$^U&UE68j+IWIGDD|~echXs*OZy|+<$jT(3ILt zzH`oh&OP_ubH01_`gqRu@f>(>2-YZ?>esZO?C_{Qr`_Z6IsCdBmVH{#8P@z>r_-Z5 zLLOhp80NrK z8qr(2)c$^2Tm_9g=dM<})lR*y16Q_eQzK&aylK8wJ)PUTh4YTI6Fn(YxaX#>+<|(j z+OG?rWtvZv)24Uz>U|iYNFLwWo|ENwcS!kDPAOBk>B$d{l6xFzgtDnm+zzFT5uW{V?$J{g~MsSX4&B0wEc(;%IDm4e{p8~Yaw3^7 z%etz1(dYB}JTAAcg=Dwp4h6lM*X<2@Wm)rSsxK_z%=n~b=~1Z?5C1{&yshF^;)w@n zpbA#f(JJuJe^r5Hws?vU;d4trMS5E`e3HE9`~<$2YJfGg*M^+jZiC$|vdiUhJ9OFZ z^@PK2PtX^3`@EV?RHs`GdEG8G=<`V#UZ-Rggcj4mCdi}mBKSe#!Xk*0!h-hxmHO_ryCS{2B6ODn zK1i%{!V}>C7LlZKNs^vH{cXgvi0>etL+n9(7x6vB_Yuz{_96xmL-cJoR1N$PO|iv( z!~w*Q5C;*55W@)kmkbmXA^hSyhGGOUn)*JBTExc?voU@I^@|8`xLSejR;cv!5WuW!^xD%amYD)GcbBUawf2K%7FP zYkm`Lvu@N;gxF^vq3^q)c;NFz1Md44#*0vkLjFe)GuDuWxo=~x`1{BzNlbd00n1>7 zWwI=meRUqoiAsYkHwr^dEHA+FSpk}?aOtG^$7Zo2c3aX$$qH|nll0UXSOFiu@N;OS z9~^|D#6B4oXSfyiH--IOVgHE2AY(%CDC}bs%S8I5DgSB8OQyUWh3iM?Y(Ffdub+j= z0ts3<0GEIjCXU4*ltq2x(6}T9%kd%;JO+FOgd7Ea82A|QBfwvTN#QyQ{3YPWfFB2b z0`O%1GRh(T3eea%RKOVh**MhRd9_{Cz)t~x6Z75xvm*YMsoB-U`Ee*MDgSAzW$&k3 z#w~;qUP4$FUqEALpm=rk%QT6Xl2j*o8DT}doS4U%Hz=L5Q_cJ(HnVO)gTfjWc9+5y zDXd9h%?h(C%%Si*N#c+U=V5>^Bnq!UR1$^#N@1TU?3}`Wt#B)T|3+cIRoL$o_Iri> zL1BMX*ry6Rukb2dUybpHir7?D`b&_41Wc2u1Xs}Ep ziZ_r}-bhekxl^pw4@CK0WF>+xB0?f(O@ucSZYSJ9CWXsMxQlQ%5uAAla*WqNgUhDG z1TPUJ`v~`A0tRL#d62&lPr&)L|$J5R+Piz=)FFg`13g2QBrm~#p$Iqr(z8F z-Gb7un3UH1AMgGgQib&{CW&WdxQ3j375lpc8~gFil-zR*N)(J;P}rXo9>ChFDs-#*yMcxs11OA9wo#C?$s}i0lue{Z=`fPZH&2ZZo47Gm_!E_0^)L?HEq}YjxY-Er zxWVBg*yk;X&(GDP*z{Y?)z&08>Wth3lVoT~6-p|7ikdMV#_{PSJTpw#1RXsK&Y6i3 z^Rx};X&d3&iIB+3W9B^VAiN8ki>~SOw9}+9Ncc{|yG@A+JtmF4gg=f67?_#HFEdYx KXU@Qr*8cz|@g98u diff --git a/.vs/HaoYueTunnel/FileContentIndex/74ef9a83-47c0-4c94-bc53-97852d1c488c.vsidx b/.vs/HaoYueTunnel/FileContentIndex/74ef9a83-47c0-4c94-bc53-97852d1c488c.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..286130e652d3da421ef36350e8f7336139a69147 GIT binary patch literal 52392 zcmce<2bd&BdH;V(Ab|i0Bt(|fBJ{v&c4otAcV}NQcQMy}dr&b%fwlqj9R2oSN9Dmbqcf8AiuwG>nEE_ZxR|j63B< zvuP|gjg57~attdrtf66z4ST_`7Y*AoY{zighT|Dd&u~J+i43PQT+48k;d+MKGu)w} zGNaozyu|2PMo$^N((n@_2#jE8gq9I{M(7)1VnjV7@{L#-v2P@Sk;F!78L4BWnUUs3 zri|P(^1#RoBQK47XcUQ242^QZC>M>=HcHnheM4GNSw=N7#tX(cHpW9^JTfM>F^P;x zW=uw>sqi!vpXPT@OS985WuBUtr4l~rnSN~gsp;otXqjPRM#_wGGgfBon{jC- zwwV-WQktn{rnZ@8rnDjt%sesk!YmqQVVOnGEE2QG%wlYou37qKnVXemPBU|wo6}ON z)j;Yrno+~C8jc*3hRPaIekUinQ(nxO{#>IoXOHL7Y%WuC)BN;y=X57I-BYK>>hwZ2 zoBNur^=5l_bD`N>pKn@D({h_u+;ps_(`!0m(}|i+(sZ(>lQ&(}bp56qHr1f1vZkt< z-K5#gnx1NU)21Ic`$;pjnxSfjeltv(k=2Y;Gs>H>YQ}yu37SdVOs!^`G}Ek^sb=mr zb2%o>ylCcSv#^>{rJ~m?l4j{POTSs>&0*Hu7dQ8%&3$=uTFxU`^YiZfd@(;S;&9#y z=B;wxRr5W6-jC+}Vm?;$aXFuq^QkqTX7ibv&&&D3nlF<1(w!e>En}|L=(JkxR(r0s z&~7a(wRX2#t6^(>zGc}hd!c1dTJET&tX8+*@~oC0wEVEu@3jKE6*gL7+6o7)!AdLZ zwz6I;8@2L5tMFRoVr$fHjYq9X)|ynU{hfBJ(QeI20qxdWdtt7lX>MU@ZDDs~VfWg?N@HQQy|7v=^xF$z zxe!+iS-6n<3q`n4Bn#ETLZud}a-kY8j9LqmXkjv1*xy-fE-Xqg8U726#f7!Sg?w?T zvADFhxU#h9R*U`CV&7dHj2E-sVpc8g?<|>(C9_;=be48EmUhoAozYmbhD(976sV;^ zYbp1a@^C3Hmd4)F{?2mCTW)326U(+*cD!XZURIOkZn+#d%i(A_vX@h1IUO(OljTw^ zmy_knS>E5--DvD?bauBFb}yN`m-5~FJ7+XHXEa-9?C-2JIx9=NSC-CLal94ZSn>NS zfxQwqD+6OCcUE$DWo)fXjMbL>u~*x3t8IJLc2`xl+RImcW7T(8`}S(TTn*J~Y^|oo z>cC#jv(!$L`wv{Mwqew&tv@b=TIswKacjt-rPwt*s?%Yw6lr zwzih9t(9wQ!!>KP<|J!ff6Y^CUb5!fYksuW&(|WgmSk(GwU%aUnOe)oYh}DP%+}|v z_4(fVyuUslug@pz^XdA$DD(CCV%;j&UA69o>pg$nkJkNo-7nVTay=>6Q)@lV)-$!9 zC+m5+UTmxv)_R%mF&cY}<{o2lkKybw+&zZcV|aUv-X0^`W2AeGe9sysez?(tLs~yX?YFH>sX$$yvXum%eO4wv;5fVJ66!K0?P{I#I*v? z3VbWbt#Hi>Z7X!FP+6gGg`pKjRv25Mm`W=gT9Ii*O)J{4B4tIM73EfJS+Qfqt|e`Z zJu4ntiEkx+D~YURY^6ObO|5}v4H7G}tjx1A-^yYu%d9N7vck&7R&Ge^t=zV9$I4wR zS61#>dC$rND-W$axAMZu$5vrlMbj!eR$*C%V-?COdRF0EMPwC;RTNfHTBUE5p;Z=E zrQ|lUhRfE_w}yRd7+J&E8Wz^bu|~c%imkC}Nym>pYwX*`oZaf$?Nz(ow-@A3XfI^; zLSZlV?ZwPqTf=3sY}<0AYowO8vt~P%?JCNiS3tmzhU<~c3p5QNc(LQ9j#oHd>3E_aIXx2tx#v1P z<@EYaFLZjb)2p1`$nh=5j~%~o0@Dc^PSAFORVV0R)CbB5LMMowAaeq77&+mpBR5Cr zJ7M62i4$f{SUSbp#ndT7r_7zoajME0CeFln_Bzg9<(_J|M#DAc zTw}vEP1m$t({WAZn!al$u9>@L;hIyo(Qq4cZlmKi9JjgdHs$EK&Cp$+ch^1FDqMTP zwJq27q+eVolzO|a>AK2wGb|yMERh+_~)*w zTs3mLzT3@QZ^iXiU9anUiR+cFSGm0klZWrPzU%s3*YCT2?E1Ou7j9snboC2rnu^Ep?RIeEv;m75oCK9vc{ zEfTjV-O6#R(j6|lL)RUS+~L?APTW!Cjxu+D)7{^3r}D>jr=dG7mC;bfoH90K4XR92 znGI#Om1$x0>BXWlePxESB9!HzG81K{O0WNvStzqq=2SK2RHLIBkzS?An3bMWvdmIV zUshMLsFD?xYNkrBqEvIJmQ%HRNv-zO`n+0C)q0`UOPTT2hN(6-)P|C&S*Bogyd~#- zWd$-b%G{@{L|K{4LCPwXOgDC^oQ86m%2}5iLq@G~Lggefn3Pk=aFLOr+>UZLlgLL8DQ`*1Gv8amOfPqyTzt=0 zUZ}iSdEzis-dOc4)l;e$DSt`%O8K$!D-{?j2$U>8Wu$~kg}w?y6{af8RG6!%siKaG zEEOpgc`8a&l&aWJaYMy(DsHN{qhd?N4n~>OG486^Q*o~1LdB(urz$b<*hy?9^F-2B zNvTpxrAnoR8W?KeszIU#rOHfMVykQpOW>@dvUQbNDsxn(ROYG7S6N?Wp~@na#VSiw zmZ>aPS)nq?Td8cS@`lPCl`EBZRqm@iRe7%RLgl5(_o~8Bg{g{$D&|ztRK*#p=%~WR zb6_F}pRV1p&RZ*&9sEV;FyQ&5%rjg%TCYE-DPsm3EU8LG)h?cJ~THR-nP?vmAAmEjO}Et&m` zu08H5zpJutS9QB#w69Cj0zScv#-5pa zX6Bi>XBM7WdX0wHXnKu~H#hZ~j@NX(rt+G;*9^U8>^0@xAn@9AvXu808s1XiE!*Bo z;H~7|%EVjsz17%Tl}EVT5VEY1<%p~^Wa&`IL*27|c_MmF&vSgw2|Oo~*%o(<>wC)d zR0Ho`s^iJpP`RG!%7FG%Dx=U-xu*(GRbIE{b#1S!ysqz|zeF?fJmvKguUC2gvgbRV zAA5e{`MK9uUf=hEt`~S-Xn3KE`!e*sF!I903roHJk~=l=;z||>UgCI(?yY!^ro3N&3i_pXUyRtEU(9nPOq8vHkz0%te|JbJu8v* zmMo`wR@HMBdd_msNqVl=b9+5^&~t})Xse*7!k)@{UA@5Z!=4}a{Jht%dO^?&%3e6= zML{nf_GGIg342M_OUJ#zu$QS`=Jm3omzTYw=#?Wp_N!s9n)HTcZ#3|YIlt}rOM$;^ z`^(B-uKX2Q6vzTf$tqTsp|XbaZQr+JS^fC-KHq8jPRDl~S$z18?>m942ISH1JGnf$ zCI;Q1soQ?@oOc$PDPKSY{Akm44UsyF;vtF;;xJioO^7 zy}<89BKUsn_dUN~`hn*Mi63NsF!n>o50xMKewh0**G8!ym40ks>mqLW@tnNV`|+9| zcl>xmmfKj}$dgtkC_)MvO(hK4L`U1T+R!>IMpvqSws1S@(bTDa=$43V(gcWUwVFJ z_?0D(0>2vh6UUz@e-ieMxqhS3Z*=5cz2Bbn7bbn%>)VmM9Q0jTs5%(bs@L!4{chR! zoW7UzdrsfC`hB|}*!^(QkF37DOeB6kwfpI$KUnBzc0U{S^Q2!G{le`RUSC$eWzesT ze&zP7vOiwvkL~_g^(R$eGy-ETFg60S9hg>N`a#1C8l7OS5zJ*l(+%2buoMKVd9Ydr zdyHTs4yIQJFpi5y9%6E;Isor1x`0`g20Ia zCkb2?s5nqXpvpj1ff@(hcF#Ihs} z-BUx?4E0h{R*iVDyIonag?hObx_RizbMAC(DXH~PZQy+lD-svae=Hh$7{4l($8D%& zj<7;6k=GF{t7Ykj+anJBJoJkY1H}&e6X~EZG{dkFhI3)q3Bz@~9fmfR5@8aCRT!x- z>fvQEw!>sDOynplbeaF+Fv+ppNXu~Ggaa=ejIi{`icmKBa#@1}VPS;DT3A?Nk%y&$ zcg@lbOBI%7SdPMS5>}INn1!QuI39(QR%Duy*@#SAwhJROip(T3)5y#svy9BCY`sNI zH){G(GmM&X)GVSEKU&G7m2tG%idIv3laDMvvf{`}BP){^$jBN+c001I$X1cJ1~`iF_4diixAZkf9j`Dhm5i7)Fs5MM)$}?<9_rEJ~^=Z`%e3ZLU?nN>om0?syQPqvAQB+N$;ht#Jjz(!T z9z~NpnpDx$j;2mDjiPB9O|#f&#Kv4~Hexf4%{(@XxG@(uI`NztH{H1D#m!LmALC{o zw~V;u#VtQ>6>)16x5l#X7O&^=9wXi`W6O@Q%OFD_k~e&L-;V7u_6B6-h!;Y6-wWk^ zEOyG+HDkAdJp;8(^SM}dUh__zZ^U^J=SiFwabd)T85fPXn2U>MTr9@L?zrg0g%uZ0 zT)0>Z7hO!@MHm-RT*Psa#6=nxSzP3CF^-FAT=wEJjLRr4^SE;3O2t(aS8-hB@z9CK z&3F>V(@s3i5@Rkg8;KbwW|Ej`VrH_PotS0PXe5ofq|r&{OxcW1n(`--O<~#dN;b^I z3T2Zeu||n)C3Zit^TaL_dz?6PiDO~K;q($GNSq{b(gbh9g}l%vu1Z`#ag)TYlCF_- zO{^2Ue$p)x&rG~#;&o(+gZtQvWTlc|QBo$oLDI_-`KH2m6F*M;GV!aVZzO#?>8qqa zNcx#P1CoA)uQGzUBv4rF1bGsgN$4h_k|`qzW4UjW$i^Zl>Lrn%VCbhwR3)(~d)`Uh zN#gY+-jl=@UghN-6axYy0F#PbOk5u6=rV~bETfVzNy;QuNtz{To@8c{HIuA^J%G$j zGL>Y0k_AZ?;>OC7Bom(^$;L^xH_4_+ZX~%%@+8TNr08Lo6iHH)N!d%vI4RSl%#t!s z$|9+hjG$yxCS&QF z7s~+^qpd2F7a@7m!0Movq<)x&RvM}_^wTg&W0fX;nj~qGrAeNm22PrWX=bIFN;6+~ z)moaXG%wP;l9x6tF^VKD?X)b?a+Ho2(s7(lqIB9B7<00NKUi2DtPBR0J+QKYE&E5F z?7R$IYoNS=>J5~S4L?r?L3faNG86_$GAI`Yr8O8X4@SMgs2Yro!Pv@-MrN9sDaQr8 z9hzBY=2@eYH7)t#Bx|~v{+c9f`dPD|HN&hKWz9I#--2Y#JZlzNv&@>)Y}t|R;|%+` zWo9{8I9pL>4Kl09tYK!2Wrq$gnocjn4v~xnBXb*>+sxcf=326Kl3~YWDqkhZw=0?I z$csI;i)4EPuisv#BFqrdTWXN0JX1xcs!Z+6x~o~&&bnFFEi$j2c?+56WS)!HSufAL zD(e|p&&8IfZ)5Yxmved3^<=?^ktlud7nxsW{v_+mz%;VJlyy%Qbh2P03!E%)@roAo zvS6BpE?$m9FAIG=e&x9(&lo?8@+|IPOBEBPFLPWL=kiu3cd6W;aua4rkR@T3L|GEc zU6CbOmWV?kLpd85*`Ula1KY8ggBR}17c*YFb00THUSx%l6=qg6vZ9$4ovd)PqMH?d zRz$dUig8vn+>d zx#i{7Ft@$jkv~c9WVtiUT|0NZ+zn)}Dwi)#>{X0b}@1# zKGI^@3#jt0pLa8PJI%dD?#<<1GxyeVuakSOycXtOSKjn;FU-9p_lg{^Rh_&iZyhUm zKlA0;E9-b!yHD^vZP3VrIqYEvDi6AOkYh7D^zv|=M}u6pA?3|G3GsN5IVCmow2`OH zJl&A#AWz*q&GLbjXH}lh<#{vD+t>)thxq!pkgqx$`0B6dp`Q^d~Pq8S#=2+!4KQZ&UXV@=vO zELwT7Few%nirq`a8O>tdE#zAk%P6cyVa?%dPpe(vs}ZlTd_0Qrje>MWQP@^t4`uhc zaC(Ik7EV%Nv(+nPuTvR?YT)})wOXi7p*HYM0`}=#Y!S&8h`c|kuuzd~JfTxnAsavi zws`gyYJZ_*v%|+7;H?%tL*AwFy=!j+-$lsYQqM2sMOVI*@NMiOkWLLP7O6q5N^?l!rq;{s2M zL}qH4nv1LB zsIp=h7Q;k#6pC?LjHksUD<-32f3ui2im4nsvIUO&+n6icmVDV+E@tJDOysgcFH3u& zw7nAFZG?J=IkMMZI=#}7ZC@pu#j@=yTe_uclxnV29oZ+9?LyhAE7hp%8fEwN5*uEf z65CtdvfC@WvFtsS-F>CrPAa`->8)ZH%JWL>p`>L`-ou^JcjaZf^wTmhO1v4$HdR%I z2EO?TRT+k5SjcOGya|-iTp8JA0uu`UME?3IKY7yI@Wu+#SnpWMi@?^8ds(h#N{mKt2Kdt&%6%MM%ucEMu zhE+7GqHz_ss(4VvWhG0rG^w)XD(hCcTjga{7*)}zin&U@Q!3o55Y2x1W~nNbbZAv( zRXMCGRSlhLII2eNY7|#vqZ-RGuf|0+E~|-AO%|$&TTN6o@v6zFnoO#xUrp2D>CUhn z4wq!6X$_avaJf5N4u;F&a5)+-r^3P<=m2XbZlXo@A@-i6q~b&`=#T;BR?AX@yH*H`U|6e zchv8X`oX9ljr#GZpN{&)s4uUe@+viu_n%SR9>w7(E=Ngsl-i@z84a9~yr*W#sOXGj zbE|5NDrZ!MqbirK8BMyQNjRFMV`FY?HsmkFVB5H9jTctO3-NfN7|Y)$Sog;p-SI|m zY}sSWm+wc%)_80$j$M1KWM|VKd*Rs2#@=MybH;vq>?h;C?D<*apeL_exHzdA=fyZ5 zj*Eq{>`WKZC5z)yjmzG+Eaak%hwbqw9*?r|s2YzZ<7qT88WUq~(#j@nd$JHtY-?gy z6K8Sa^d|C!jWQ>yF;Sg~TF2Ir3MVR?=xt)z9iDjBq~}ijW%+V!;s=w^n1rj7(3xQG zU^IzVCea@GPI3}Wq}`Luo8;D{T9rXOsk}+$PpWKEjV429G8|5ZlZpH_kWqg!ilwte z*xTB_x4nPw!v4LB`}Z#G-@Ckj@9zD3&)C1$iT0{$uNUr3?Y;Xq_U=D_pO@_GS^HwO zFU@54eSg#1-*omj{r$~s|3+ilkUyPi)0#G&X;V${H*bbhtDM@_)Gnt^Pc~_$PBL}X z6x(p=G)$(EHI0&KVo#G`np)E|nWmYn5vO@FEy`&rUs%P{GC#i zFRQM3fB4id9rjo9r{|sXpmXm2;Ct=+^GQ7~0zBzn<1a;jL;hL4B#JJ5*RDUl^W?{U z{Aqu+{QS)G9&+Y+y8iK*4;r3x-u?E;j%CVo3A1>?J%94!zbU`ujUIUKKiA;5&$|1y z%)ecgdLKN)x$I5-zux{?CiLFD&%4|G|6C~B4*cvVUw_si`k(n{sF(Za5c__aUpSHS zZ+owq=IB2gNc{c7KYuV>aE`x+hy+4+6nS0p7$MS5M4n@{bw=dBA?0gBlz$`oABylh zPCkf#WAX$c5(xW=5F~++Zwf(DozR~oAMj@KLH%zjAH==2e31SYBF=5(1D-4&q&o5U zK2Ouy8R2(Z%KsZ8&h6v_@~@K~lJL8Oe30sd-jom6An!=tiJTK6)d~O8we~LweN#T* zJnbOlmVD693zQehCF*xmK7(8lBGrjFt6KYiL&RH?57;5sg-9Uud*p+0vPn8Z=v`8g zUD6|aq)+yRNIMbn0{MU;8IiFNsZRJMT00~9bs!(;GwMO;3;94_$_ELAT*(La5#_NE z2}FDML6G#f5OMd*2fT}X5a(``?@r!>yr&Qeg#Vc&rY_X$ALN4s!hRoe_N3ai3xxiD zgRnn=e4-HcC(8#3g#1(pl0fvwCGvs(ndGyD&_7o` zi1$45`9dTR`WKKd6vF>f@})x5|CRDVsuShBN--Yo10Qo`kL*$3aj|h?PD#{-tKTdu^ zh;lwneohGgFUSY+zes*b2*0n&2dPf@eN8^#*U77eNFemzkPp%~nRz33DupcuM?_G>Oq`Zly@RbHvJsZB^B8fB7r#d$R6pFeHbOx z2~|Knh|`cVh|`FSsRwbIkSX>58zRJjaq5IBlLMHO1q4YTPD`>PhvbMHlM^B4p}SC? z3NbI0b1^H~A0bePEOX;`F}c{iwe-gzH(%cYo$P6yb6< z{m-HQPK4=P+7CszJU|ZMdE^7h2ayjZA3{D#FVdTTfN08@}k0dW3A4OhB9w09w zFD4&NK8Ad(5DCQTMYw!l z4k-7BLgfFk5c;3U0p_xM@Xe1 zW8V%uN{IFxP5Bt1{MmJV%EwZ^A(WCpoE}FRM4aQv8^G<1Ey!C6(cdRiK1C>hb{RO3$afm;x1}D$>Fp_l@Vf)$LlJ%^{XobK@{ZJlIGv;Z zbm~F)H_3UjMLP(4TL{&n9Ih)|qrL;BBoNnYLkQI-X$z6xAzc_H9g2wK(Z5Ikod{E3 z4j4ZP{XmqLQU)Op$V`a%CFP173Xwqgk0^ui-%I^IazA+&Arc6`yHN&ldJj1u-aVGv@5;q(Jxe*}5H z5T*;r3n56V6aELNzcz&bMdA-$%zSl1|7hADLq3*%bwc%c+MghV{3Oaxh9GGtBK}k8 z|1|o6&_A8>wITd3VZLWD-?bs~J(KyKCB*oB9`l132QQ@kMby`c{4b`yPUtUXzJC=?Vi2FM7_0;b~_`QLC|4hG~i1xjSb`bLALa5$KeVvH= zHqnD`C;ydv2mR}W-#e)XA-{`!H}!SG{vO(|Ag`ofov7#gY5zANTs|NN=s!&TN1&8c zC*psU_N&N`kslW#|EDN_T8IQ9-)DqSeUAD%VgEe!e-DxW3z8rFBKalq%Zv-c{uT18 z)Yl37*Qf^}f1NUj=i#@g|2Fv@@;`(~Ao6{eGKkafQ~v|m z>Osg&$~zJEd9kBk+Vrav_66!e$cy9>xlHaBB7yKbgEENttCT_5*C>OKJCs4l>*O9G z^52>ELlJ%!^V!VjQdZ0lB7T?jsNadWP67QwA>zlB6EdYf6C#0#pOXbyk`*}=B7ulI zrhY>1CHIm0$-4-V4n@SfEB)_A-krP$c~7DI*>!Kq|3KbHh<4wfe1H%MM7z!-A4on( zD1UZ66bBN152Fl1emMCE@_gDs*dIw=Ks^Zkql9SB0qQ~MFCs4{A5A`ne5?@p9xp@! zk?#qVcOvXhq~DXsC(|E<{VC*Asjn0Er_ug&@)G*h3BPC1{!H>&l{u5dJHacOuGN6+5^_KM-<+Js?Efi>ZIK5DA3;V<>}=A4@(?hT{_O_LorqQpztUUrD}7D1UanP7cWbdh!iWN~#m_ zE)zZYCi=aZd<*^SM7+zXuM?`bGvB|G?;zg^qa+aJyqo&>P`;9UANB7SBJD)1{3-oF*ndX;ocu5H7vz7F zza)P}{+j#^`CIaLLiE!gDPKeWiNwt=r@M~CO;4g8M~Mtxhk6ix*P~n~{H{+u2>Dpb z*M{)F0rTCE`RYW!9!LF7ME>KM|HkA^$Pp6ybL(`t3y6 zZ_RkOq2Hkh|C8x|3VAANFn^u!KaKX=lDDHD2>b0R??l+|KtGdg(7#Uj-I4Y?k#qC| zVLzR0lJjIshy=o~O)gNs6XCZ=za=5A`)qMOMs0SfGM2L6~B_Ae4{znLr{x?M2 z^BJd3=pRY_PDJ^SVm%Jf@7fS?FA{(7V&(%e?>v?=2>av6$J72K%1_e=GgoM!sDL{kw#S_a5r6Ag`qUeU#r%{u}x42k^B<*W%4URq&ngMRq8>s z>+AHtn*0X&O(FX6KPZ1!i1dF!g!-WzQ2vj}p9)dGp9zl^{)YPB36biA-|y-F2iifz zyGDrh2 zaZ~C~q8>#3Z!X01^c31pB@H32$L%TKL5Q>y5&w?#yAwG_e-Py~DTAo*Jmor}Z_(bS zy-wH{sIL>35b_3P5b~WV??l))X$K)<IWg z+!UM&_78Czb6ZE{hmsDov=TRdJyu{ z$xFy*kk1q%f$)14`E2t4ky_kdgvj?=A=>kL z%5M-NfzV$@xlZWcME^IFZy_%y|3!#?d%F+#@&`i1{UPNa36VhPe?t9FsRt3~XXMX?X!kEE|4N7i!tdAQZ>R^M z|1J4D^7phKipci|`hk%DNM1w!iNqj){V*ZgaRhl328SdN_Ull8H05K+>yg(dk0oy) zMB0fM2glLxcp>ByD4!@qJx&rLfhhlG)Zc>ood~~M(*IWEt;ySvCkv74M7~p~2O*zI z8H8+51|gqD8H9XW@^(Vh{|=N*Arc6`h7j$Y6Jk8HsBa6AK=>_?i$b|nyH;rjVP6v> z{|5CS^misVsRyCANSkzM2NB1k48p%hxlZVP+WTZchC-}229z@)(*Fg~p9SNAs7Faw z)E|oQAJT6p!aicWF*zaklKaU0LZmv8|1Q-3EkwR4^X){~?@Bue`EKOhsRyCI2YFBG zLFmtri{pC>R%^B0+Ijq@qx?zApCUg^eun%k z`8o3QqLLvoc3Fgx1`@r zg#WGScN_9#@)YI+G44*I{%BNk^jNegO~@-rwqdHk(5Em7m$yl9)$iv%5_42K=df*F+z-+$J74_VFE%`d~_2e6b zNFd_=GkF>HAoOn}-y}qRFQ>gu=-);?i1xmdGKe_uBHvBEhrB|FbSNVKmGnCl;rCv~ zeINZn=-*Eng#2$p)bm4>KTJCa`$x!+l2_4QC$9Uas0Wen)09ETpCLah#QpVo+IJ%S zzd-*l3em4$5n^0_llegSeT)1y^&s@$5u%*$QvRM0asHF~9|@5_`2U#v3H2cKKP7)g z{k0+T{ha+J8xVov{Ck`Z}TiHT59m-%$QrhUB{EndgNZRW}{_E0yG;fyj4L@+9g(=x;{eoV*2jOCiSjDMF+}5phnX-%f+tUw(d`BVrd5(Gz z<+iC`6e9l;^{bTEgh(Ll9U?0xKPAKoCyr1%2gy`413y}^*#JdOmK*;wb&m`|fJBYaV zrT%{8S>*l6v&nOWsOJMHpGQ8Be2@@nC!(B((OxI&_i*Y#_+21`{!x@K7UFt6p7N7v ze~J)kCnEn->Gw1t>U|02XOPb%pG7{K{D0(ggh(LbJ(qkQ`Fz?z*k3@tka`gM7YR}S zmr{Ni`EnuZ^-9YBBt)tc_xi?8@?Xh!kna>CfoR9ODT9dj9`Xv>-%ER)@OvNibwdAs(PKP(Pzd=$^s5u)euVlu z;r~(ULC9B;AEUlbT%S)(xTk|C`i* zONa!*@7v^esIL?D|De83=)Ws^#Qi?=|A72Y`X7qO|3mu!i2O166Y{4*JVJjhL;_LX zZ)yJ>^&sN?p8Ny(NAeo-PePgnV=ImgKF4h;tkAWbzd9R3XZ}EqMp(O(EjlQHTUW zo}>MAA@a2-w}nU`%3B~8sjn0Hc2mC-QO*kObt3L6KlbfVP+N49e zq!J<>iiqE(zeoQ%QEy-LU_d*Fd?DpJp^vBskuRZKC;U>{Gup2W5wD;>h&Ux#kwe-+ z*hfN)>wVON(C;VjBE)=gPs(Qsk?Ms1y=cF;5b^Fu`7HAO9 ze2@_Bdx#M6A3^>3)L$S(+KKSLi2fJT|1tCjQQl+8$B~a0qP!R&>>Oo;LSO4|R4d=>d>A=>$RAySiK5!av}Wwg?uadHuCL4_`gGl1R~D6Dc6a5yq9_qao!@|Qxi?^l$6BSZqB|1D(@^6$vsQ(q_Se-J&& zxkiZc55K+~4kG-H5IyYIC9f|;z8eT(zo8ImC&GRs`W;6ePu`fk33&o}B6(9GQk{r* z674smeJ7$HZ%Myf(XUR_|2DLrEJXWGqkLQPcI55JJCG*X5F&vnZ;o=E(9cs3qMSt` z%3r1)gnR~N5bazcS84B1UMKemk#-{TZ_o}R{wDKT)PwM|Nr!q6dYAH{2tP&tt`PHm zC`7vx>Qf;S2>*c)^~ot0Lii7bNIMbvM)V((6CwKZF67;*zlRVBM811c22t+4sJ}P$ z*M`VM?QdY&Z8bgc@HEXL_U~&h!Ckx_&-$ii2rc%eEL6<{viA=pbSEO6y<9} z_+LnW5b^=aAmocEgOD#KA5A`nb`aO=@zg(od?NWIAyS=)_hj0iLOzvz8vQ}^!zDtD zqvz26T-rgzc^>6!L-;?R`CdT2koiH_Uqrc1=wD1d2>DX-AIX;p(GM@D{0bq`|Ar{% zm5g&J!tbA0?yKluC+x4L9)$cF^0m~1(7%o{2>JDt{~jX$8yM%G$;%iIg#C?_LC9~S z{Pz&~-^~0VDU+Dj`yxDCc9ef1Gv@`cIIbq<$yD?^Cqb3H_&;|1-4LiGKPV?Vl&V zKtB-qzbJ&?mnnaR{HhS?P(=Q((f{l8uM_sGsRto{gE9#Do0LJw-y**)M7{ol_MHg- z@6rxJ{vP>#>Ots#K>1LF-+$5%g#1IwAmkrWJ`~~iWBP%Re?tD0{2A?a!tdwQgOLA= z@=k>P7h=bA^w;zQq5lo#LlJ(zrT_29-wV<2e-vW8|HXgwKpFZYj-8crq!0;&{<@Uw zL^(&({}|dq=&wf^gnWJSSn>w6*9pHHQvbIQ`EJCx#|hES8#B(|Ld3ZV^VJFc3DnmK z{fVLnZ%Up-KM?wxkvFIQP=x<2=m$c+CFMGyzZLZ$W2_ozS05eVx#s!hENa z26-BJTk>|~?a4ckCfN`ofrxuY${^%Bk#jqu;sXurd7+_pYpt4RC+ z+N{pE!`TaP=;L5-8FYnCfp|0y_$T(W-{sVe)(89y$*uy{i*T5=e5=k0tcPuN#4MW@ zwTtcpWW!&k-gVrT-y31jg+CwGn`$f0?ur9`L15Qm`hX~x;0(X=vFk(~6wVez9pHfW z!{JCAbdT#w;@|)8Qi!*SY&w8$2Yz5+miH7G@cXa3{)mIF{e?KgZ^BWhi^O3Tbj$Bg z&|S3EqFKwgtXJSn_wy-Qha$JTX{xj7$l3sxBXB|W@X<5I$ezm zk?kmC(+&KsE={Ce7S5)yo`5s_9lBZ2*+7C$S6q+3S&Kxqt5zgjPS~oI9`YAK)MxrK z&aTW>6Rw1HQ%8pGc-<_B`iFURK?mi~LrM>2{GGo4F^Y9OL~#)%){%8kk!Cebb?0aU zoKt;x8ZQ`~+PFbeqs^m%Duj z=)bJ)!lia;A?hf4AnA*&b8K!^Qb$J2U9|zXL&bIN--v8_SZsHDEgP)*3Tl__`A^>| z2kCUY1IVF+zE?*^t98}1vz{n)cV1_!+=t=pWjI({XF7)tg&+Ez_4A`~rVaY~>N8y= ze)CiRfb6dOpfr7l>eB8C!%sRv%E1>D)&pB@ z)BhevPt7`j4zGhARFJmnj?iZ>K@@#ewWzDR3ElQgsDF`kThyJcMf{ZLt}Fl2Syz19 zc{?wD$9fj@Qk-o^c_Bm_hn+$}UmyJF2p75&x9%hSOB&9O2i-?o&b7M-9j2cy9-{mm z_YrEOr<(!J-iIi)@F;Q4c=I3AOrE?56|IM!A+ z3pw;GphvqNQu+yDApqR!QvoWz{h*pnJX=N1Rx)~WL$=!71aY=P*$P@~rJi4K*hKi* ziUMb|A&T(28nwQH?gX6;XPXF`%4hapfLMCIhfX)(U(!@I9x~3)xZHi&Z&Q?Z8mw#9?>x9x?Hh!v+H@|69}q*M)yfL(}RBn zXUA-bvl{{dbk+3pS3hAt3m5$$on11BDg5+vU;A0m>6>`_wz_nyl6orDw~)484QG81 z{sAttfxc6(!J5KZj}rVy`)o0*=gwKxbTxFppuM_F^w>BIIv97&u90@ZL3ih&i`326 zGmWk;e&mTORRqwDIe@z8-Z(|q4~6S;bvFI1&}%|H+I753b%k^`oIM+7y2CEgK~aXT zmCmvKDA!FmcsS}Jw+~xa`UvRo+my4a>AL8VbB%U}L5sRO^?124bldH9;dcNBomW3e zbUS8aO-I2&_pWxi65?!FAe0WOjNDv)Y){c^jOn1xOl5H9i=wR(BAFa zw6;J)4Ys?^+6tf>tq=N#)@GH2^9l0N{~6Wn7qMp39PVlDJbO-~etMwmJ3u#DAM|ad zTYe=9Ivjr6h3i{))-QT&z^bzyjdHh#s4i&s^n(jN_4!^m0Xg*jrU!_wy$+?jcy`n2 zpm5gDs1#?j$hfUGUI*s>O>o}6 z=DNsJpxYj6`b?LGf6qF*#cNkY3&+T!jMJ^gTU$xNa4BIIIVcFchvE=;>j&vy6<%*^+8unx9vkZJen~0%d4d~wzRX}Y1^K!bYy+?b>t_a z;;ww^FDr~SR zw632i+kLQoQLaW_{6OfeYI?#uT$iS=2kNZD&pI1^I*J}wdhK}SmhMvI(9a6pVLI}x zAl)|j&H8W4ulTEt)-}+z(r3DoTRMHO)@q<%AGB3h7uobR*M&a=2K>VI?4R2oyjFo# z*ZJAVrnm3(jlF$KZWr`PUB=d7b^(xW)Yy6Lj!+_rhpDo%p5qb9PMk{AGlO7h@pyT08 zKfCpq)YoXXjRx!XGv!Yr)!$rUoo!p|+Uro-WotpIJM1_d^?jrVs~+BZdeD1^`U>iU zzR0yZK;IPzs&5j#jizVngXb$WRnJ3u5Egm}=(^yb<6VWbi*eYV(sb|YC!Ma4-g(j! z_p{;mK^$g}9h~XN2XJjsxAaJVZDI$jHBdj0npoarUI&a1DbKGSWR>2S4lk8i?RUzC^NOut^IIMarQ!B5}a z+C}HkXZqsl!zpmqoukK zhV4N226WrC(siDdfgE~7;OCiVXDOVu^?;llyoAuT(mk|YNqzNo^DjmeZJqi3wE)|_ zq2Kp)-ycAW^zuV*t?382-dfv4l-gnu^}Fp>i)N3QE%9jGay_z9m)TW?Rd@ELoYbcv z7-ny6FwEwctqz-A9*DX{+s)d(7Y^5vb&&{Adzse;9L~i-_qguZ1Bf@f6kC0@eLZxa z>Vov3IcCd6cjq+-wcYKyetO=hm5Ututwa0i#n`5(4(>la%#Pn0L$%)BE)r+@HqZ~q z7i@KeE?4UwhYI08I^i|P*(K0@5{Fmda5WBkIy~sPZ^57|nQon3j5FOE`k-gMQ=rp_ z130VoI7HnqT6ZZLvnii?Q&FL#U^sZ;ioCPujJ|j{oCxRHgmO?QbOe5exVFmB&bkkN zfxNmMx=(dby{Wh<`ud2_QFNVAkiO~ge_`;AdCQ=Ko(l0PIOv%{H(!qk-ChNQe(-5= z_RP}(P?zoDqo)i#1YFVA7lB*O`nj)P$n{EEKRPzyTpJPE`7dj)Uu5-lo81*?hZgmv z(7oXzoBr{cgBRs6=y#k=oN4Em;Y_zuiw7Xy7zg~XT(fT1bGE*5w*Ah9RTp{6PD2^B z(yt2op}sw%>q%z&NunnneIL~ty%n#v&e^JqZnUoCCUm;a`ts<4{vY~kd&5PStDj8T zSsyM&HXT6MUh8H(3B&eP)%~oO8mGXZ8>9VZ%OmJ)9Ppoz&2BY4fOSw^D;-(ieziGb z>xS4wtGBn`b?696q{5 zx^16DJe{pJeL>dGt=W_TQQx)te%ro`x({qvw{^NtXIDn_2iIk`#QDpMGP?kXqO)0g z%0R7Nh=bPYn(9ULL619KgY9n8*JHZ|TGZE4S6q)>Jp^=hkKGz2)>efq6nQlcI z(VP9JK&KCzTh@o-OjmMN##R&XKP<3IaJJKOUx(5cPuFGEHVhTr8~87eX4zbnvHd*K zbA;aa)>EWz%xs7vhu&?}lcnCu(N9SoPaE_Vd;;Pv;qVm)RE-x-`^TcZ80t zr&m3B95hi}56-jRKu@~zsn5V@%xu{MzwK|nYg5ox0R0@C4I1bUpa!#+Z*|FR{K1gI zMPFoncJyBx1zeZl9n}CD9()zH8 zy68vm!S^%_`tI5O0&2Uux=;0HlI}WPdwo~bUS$wK&!@8sfO7SltM;o6R@D9gta?7c z?~2ZrGuzvmI)Gk}>+aM)U90CheM6jx0KKgXrMpST)2~K)*y@hheu2@IJQ35#|5w-j zyVy}haR3)Z5DAE&wXcYh!a}gJo44#@QUqRLQwshG0l`joToi1SfUy!Rl1gk-$B2!8 zKpGL*(n16q8w+v1pYynPc6Q#vyL*3}dw!pDf6VN@a;YHTyEezDQF{eqSVO3yHe%6z zZAjPbmKoQZL^K3dIY>Ayh60lBr<}bi<%SgF-BnP7!24Xq74u{+0i6+T67FOG`Xi%! z1J5a53-MBzWJqL_8zCZ;!mySC0`bwcVVfdfy&I5CinA03O0jJKFQ299DD6UW zOjGe7HF?O!nud^s#l9(jUQaXF* z2L$BGRKh6M4;LEwZ@MKV*F&u*g%5(SQc&k$>bjy0qme@poU2 z^qt3@Bn6AjNlNcuorD)jntfT7Y<5N!5N+CQb)k~RU)SW(gzkzQVRDx6nsVgb<(WN5 zYt;x{iY*m~WCd~X-A6pdX8J4--y2v`oTtdQ>Q-3YPVM^?U#4*9CbN6<$0=yYoxViN6gaha zEPnr7u*P^0J4eZ;qQDFa+K_p>Gud8rObJ6}mb(_EM}6-G^~2Xnz( z`5;=;XWD3>xysYjUJVEhc^|W0os4XhE&O2qv6`~;?N9(`8soWII}8`#@~h0KtP);o zc}kziBMfg^ijP_&$wq@_u-s3r%WH|QQ6SL)ue;UQ?dkB(X>k9-RZtCS)@f05%@i4+ z9MA5G5D`M{2^R>+Q^Zr`>)L8t@vFW#^%nXx2_purA8Tuc-PbY@k!<|UvfhMqJ-G#V zEs;qc46wsrSi9dOqN`o{#*F@+;(CgkDX5(eHfh#2G=!GyW|YUi*=lFJGla@>Qakwg zhi`cQWe8k3Yq;Wn>;XL{g`cLR>NVI$q3a|^B3a-!yaXRB{L`9DF--l-OCk?O@B%%_ z)o!erBKQO+7wyxe@NdJtzIyI_Nc?BGY6d`U8{oQv%c$K=zXoSU#V6*bkpIq+45!2N z*~=DG{pv5@MX}!%n41}_&r7JCs|aF;N9(V?+KjC!B1miN9Hf#U)mgyL(r1yo2rmXu zbMUMSgT#yhgt{i(g-d<%ZobiT4;Q3>jmm%5XswCm*wWV?9>KZFn*v-(KRQ6XZ;yHt z2pS8Y1PqRbJm>7x&=@h9f_XNVYvuweDKqLXT8L%g!|pZ%;Al;)G{kA9!3xtiAV^`f zHim1~Y9RgC*YnGkii5f24KSbVz_V+D0Mk7khy^+r=`_Xb5U`9QeJ72p1uA;3^&`Nd zw)C87XxJe$3MuId$-mo-KSGkZyKnT&V44#P%$AOuVd!}J?C&>%O3W1Zh^OzgYom#E zw~ZFNfkPaVB}|)kZ%y(b7^csa-5kv3rUq%PB%txtl0lv!xXzdFinF0Os{Fb?9)Zr|^oFQL^Qt?KP^3DMJR_|e|%*D?% zNm?8+RE0+Lw@4Y~oh=0o^nzLh6i4<$yc3o(6dD1pOM4T2>v&;X_}_J)B94}w5G+itlHV&u?>U^ zuq9O2n(=D2Pt!4%$5sTixeV&Uv=rMs@!;7Hoa9@65LC~@7eWsfZXu4cf?;j8!ghsa z?ybg91=GSeNYwhq04rQkQzxzz2w6>g#LJGwc;=dRFE!3@jo-D1KMo-S2X|yl%SF!{ zDOrj76#zDFui7!GZfuS(=<_Zxx55|w*yRQx;jtOC^(*@7&8E*YpB-%k0Ky&1SHYF zQ)~S-`wYx7VVafZTJ+dpaDJvx;DA^p5)~hYq&~$>3Tt`ja}2e@o`#-f`E47xNR5Y8 o7#L_u{H4LsxS~*n@%$u5y`nb#Gl2c?kKU@v*^T=B!&mkDe<7IjjsO4v literal 0 HcmV?d00001 diff --git a/.vs/HaoYueTunnel/FileContentIndex/810b85e7-530a-466e-a571-647e20d64794.vsidx b/.vs/HaoYueTunnel/FileContentIndex/810b85e7-530a-466e-a571-647e20d64794.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..08e7240294097c272ec430946ba381f5eaa73ca4 GIT binary patch literal 54888 zcmdqK37q6cdH=mOHkjKsHaFOo4VG}Prn_f$y)!*KY)L8|t+S<)`WO$50b>qh8;9E% zmir8t`$)olB#@AV0O1Tb{7DGmzHbQNfCGg4^!xm(pX{{#Zzj72-Z!7OJ|lhg9Q9PG zR4SE9ZLjME$L!j*YyH!-ql9Cmqi8$xEPc4^I)u{<>$D(0ZD^l1^$f!@jFw^a49hYs z+HV=QZFIWE#=0R~Lu7`i45w>2!f;%}@eL<6oT1?^8*X5@q2VTmn;LFzc*5|c;RS{l z8s5;5r6C)`9~gl!Li&?NSQ}Ap#IX?%jYJqpZlsZs$3`KH!ZnK0C@N#nHA-nzu~8|b zstwgKRA8voP`OcuMjaWAFq+U9ca3poOdMkp8V-1beWwV`KK4<>7_iw z*gVtfnWs%n!!V7GX$aGBOv5z|&orcIgr*UhMq(PdX%wbWnZ~AhhGCkPX$sSHO*1l0 zWm=YLwM>e0r^-C*EOU3qY`4q~{k6?b*X-;yJNwMes@ZLs-M!{=%Utf7%PZze%iL#~ z!Zk%{I=ShLO;?z1WV(sz=B6i1Pnyy;CG8tij!a*eL1Kor8Kq{FnNeXT!b~DF$<0)n zX=P@@%%qvsX6~4|Z|2I(YqJn$;h05fmeQio#mW$ zmO9H3XDQi=vR0MvrnF(~4&?4e*!DSg+qT>5cE_;Smu%tM!m~wYi`sUC?Uc4FY&W#s z#CB8L&25)7mF)@JleQPxGO=Z9%gmOgEgM^oY`?SvX$Mm~tnEnJQD#Sl9aVN;*!|q@ zS9T)oMA}JYC%K&pJC$}uf03Q#b{^Y#W*5RPa=R$)Qrcy0SDsx-yUOjVuq$O(wXKA$ zq^&|*MYhUqHMDEbt|NOG+QZTwrS>_lJq_(?Wl!s+-Mg2T=#P@Sv{WoDsU=Y_x%pC* zE=6i7tC#Y6spu{hVyP&XO1V_#OI5g3)k{h&sl08p+E%Y^ZME%o+wQd6tu_)JbldG- zyJNLGt#(JYyH>l~X?IuJdpqsbq`kh>7Easgww+1a8?~iq`~9|Gx5G}mAGQ;#o#gGL zXs6?LrrLvUd$6xv`t34omr1)EwW~o}1?_sdJ!-c{MSIk=$7Op=`%!x`YH#&AMyq3O zb=nrygG%kR*E-!+r+ap%yRWlnwX@gi>|N{ZvpW0MI;&@QR^863>TH-DG442F$H_X5 z>Nw+$+v&KYju&*~s1q8U$m{fzPF!`8PABm?snbaZopjvEl1?K#<3VTA=}e-|BTcF_i?CZvyJga?jBaIiE2~@C-D;y-MO`Jj zD(N<|+tl5y-m=kJwtCCf)^fXxJGg5tch{D?)$)q9yt1~uZ)JJIT;8yjy=J-ZE%%e< zGF&d3<)&J0>J_84Vp=PvS~2SttG8lpt?ac{Hq4a`YefuKVs|B$D}(k*6|GdsN~KoD z!Jc-xr#+zt-s8wUZm>rhd*pbJob2)IJ+Zqd@%E&~o@%nEmV2$<-cEP#in({CI@@la z-EQr(diz%P?u(s$vAb_z?5o^;mA9`}`zFR}oBo{DPHVN}te)Lob-Yz~yei98IbQYa z)v#KPjMd0njmp({vYN=%Osp2hYEi9Lqg7?BDrZ%dtF^OQtJS7l9UH6T$=aG&TXWXd z+_g1-Z7o<^3)j}7wYC1*TDrEDudNkpYt`CXy|y-76Qea}yyoU>ezX?IwIE*$>$S*P zi_*1zwU)}Yyj&~9T2Zc5$eJNUB%GQ_i^`&Bcsa#*G)|b?}sMpqWU<%Jni|ujo&$SM|E;tgDT6CH5QEe#72x zxcd!nzajS<>3*ZyZ`AvZ>HfC0zhmw1(qDW3vbBH3+P`7!KVWPaXKk3~hG|g;-!PpG zQ*M~$hUIRoFKuj?8*Z{8vkf`g@S}||-^k>ht?Ymy4j9e>!#!Yl2Ml?@2oD(10V6qJ z10!suv5l9iFBFID-iAabj5K$)ju83Df+!HY!cp{b}4n!P@xDv^lNF0&4B9S7A zM3RUk6-g!%GSwm(iqsbAhDfDI1Cd4|EkrsHnGl&PGEZcI$i^a%MBW#9Eb>(3naGDC zAB&<8MJb9(3<5F8MJYrXh%ypoCQ1@ZQC6ZuBa1HSE5#;5u%ZziRkVW!#!e12YoS2#V`}Y zffy<=ip1CyVN>7)+|Y3g$CHjXa%AAh(2=F%FFXE<IAtH22MC|!V=d!3Y;i$qST2p zC(50^L@$UVCy`DPI0+r}ouqWq(#Zx+Ryuj^lxt2YoicYS<*3G~eWwnbS~*Sa3_H%y zcgBu04xDl2jFmGv_`iQqLxgP@w^-yw= zz9$1uhMr73nR$}@D^Dsq|uVb2E8gs z^9*U4(zK-6k)}Wg*E4u&`qB)g8A&stX*x~NrI|~!keHDxY1YylN^>eLOIj^y+0yDs zE0xxkywj4j9o!|D{z{tWN;{-EE=^}8Ph<<4v(ju;+C$k6<=z#!uac|2Tn**=5pJ=o;_w%p&5`@3@gvfRHS_wSec5747aZfxM@+mQ5Jq2~v#u%P2UjqEgz(_k${ zE=5UWr4%)dhSI5}GnTH9ZbWwx-80fnrJGAvNw=Z?O1)Ehmh^1tElIB@y$$IJ>ABLA z(u<^*6Qm5J45iGZ97tJ8*+^eVUrIlcej@!``la+M8LUW}^#uFyu%fYndK~2oA{ity z$YekcLm7-@FqWY}yfBhsUxv91D;d@@T9J{IkuRf6M!Ad)8GAAgWgO!*f*#a~kco>f zoJg63GKpl8$Rw3XA(KibN+wg8nt0(zdop!oDrFkTG?Hm9(?Vv3%q+Z%WIdS)nYp+X z=$tZNW`WEqnJJmoGHYZul{Dbxp3Hq&2wB9kP;y|%fhPyGEKPcml4T3;G-Xeg>#`KG zbkQ(nAj?peku3YNOk|nLGLvO4%R-i=EGtH22io65Ic z-}Zc4`gY{oiEkIaUHW$Iw>`f-_B)Q>@%&}OU!gzYuS$P4@>gqrwedybi_91F{PXFV zhl!6%S0(gi>HE_6L*GyQQ2Jqw&KM{Z%eFQrV*G{V73FZ6PVq=Tn@~An5>yjU?zc?24)eMWnfl; zsRGLiEIY7z!R{uo-N5z&TLyL%*jZq!z^;Q%E9gW)Ck?t*&}{|FR~ zzBt%d1^Xt!Y80$y!G?+Z4^u#zy3r(z=2eR3A2e48Tsv@szzqX83fwsGMBqh%Gy`ej zrChED(hHdJwv0;#B%1b#d4W#A72pN=O%AcG(efR2xAR1yzjsg$e^T4(jEgu7Y|TG~J*{gQgCeaWIU7 zkspk*U>paNVX(OsOx<9b1k*B@R>5UPXjq}qq9v8kF6g~C?4;qo8Z#6coJ1UoEEGA- zM?;}P(S%MXbh|Xa3EePs^Uw=IFATjQrZX6fQo8L!-wFLR^lME0LMM#EFp9${38O0P zM`6DS`@=Ao? z`oyD~bX-Nh++0`XcHNqS%Y#GD_Sikx>#w zNfM=Ql*%YAqRhbZSZ2}s6BdNBUX*Rn>kDRuG|Ql;LFS`>Wl@x+QIi_U;1pFNs^X~1qpFOm zDymeZPK%UD^Uz4iNJWvVB2`Cf9MwV87*Qjl#)%p?8phEmiN;AZ5z$0OlO)=*qAj~` zwE7*R-^F76D!>W6MW5;SS*N27i;?k7e+ar;TqPe%P@ z($9^49`*AH&4v3#-5<33gKmG|_6M>*$oqpqzjXTLs9)v%O7&IHZ;XB;`i<8gy8U6< zA9wp>r$3hcNfR4ZY_wuyBQ`s+WyY2jTfNv$V>^pGNxTxrdy;sS{;GJt5pS6BMiz^9 zEIP4RiA5ZXBo=8b>ey+=PA7KTu`6RYj@=}7)7Y(JcZlb+7sp-_dn%Ug7?0{KmULXl zavb|BvERgj6Neo<#zQ|2!#FbH$ftIXqb8=NL_I{D(O(v4d7L%zU>KJoE|a+G#g&Y! zAg<^*jjK9VQCtt=M#aNC9yReKh$m&dWyM=|VpxgMO3WxRo5ZpbtCiSJVta{Q(SlU6 z>LjZ&S&fp_B3W&cwY6k})?(>BJWoWCh$;~ZZ^JZob;86MC+;%6!z6B;xJlw>G~-Xa z(-O?lY4+h`VAJ#3#LE+}N<5WFgJz0}Y+>b6t|xK>Z`GJ=(Oj5jD>M*>==Cy9WJc41 zMA9%M^b}?tFEKP(#=S&?WtK!$5-I9i)FG07k@P1CuGT0?%p|drq?IH+ysRe<<~~W5 zBzcl3OoGw?ukV>dYw)zdoa9!Lw`dJD$v2Xml=P}3X(UeaEXk`RpJLKf)X89!lzWmg zNJ^Ddrk+L_iLw&4mZ)B$M56LURf%en+DK|Isbx~vN!=t34P$vSER*3R8MTuM{iVs& zOQvBmEmNbFnr3QRsp+IQJ)5yG^*0X zPHCV@`e_oUshy@GP4krAZ1OD4RhlaJrcRqlI%=mQT2hVDagmPebUexoD>GV|v6h)u zW)_)QWv0rkR%Z1w%gt;rvxCe|GCQMX@ys4&Z6j-|tUabR+-zNC8}x<2$%KywFBW%F zT7sd~kjxol6^G`(cu}YK@PyutGtbOCEAv`d-SJ#Zjq#3`WL}YZW#(0xN0Uo>7qYM( zFWpS~nM^X7WwM|-F3meLIn3lJlT(b=ex3zp7Fb!(%7WcAkD+-9X4yfN1u6?Rv&hXN zkB0IrQd!@~`VQUybf?h`kR@f7G+8pHYfsU$tjuyJ%d;$}gDT5amJhR{&IY|~K>Kl4 z%B=LWGRZ1Ct9n_rkyRm{3{{*}c~+@R8JRLOWo4?BDLYfkncADFUZ&PFb>~cpOgWiy zGv(n8K>3*p@l;VsrqWDhnaVR&W~$26I8&2MZDwkU7lk^+lc!FyI?d`Tt5w!G87(|C z9^N6EG;6Y~sj_C04c%;PXOkqGjIwDjo0hp@g1`!hm`nVDx6eay+TwLI(P**caFbuY{_nd{zzfhx=C`cdoWS)FGMW{7!`=PJ+Z zypVZO=0%kkDlg5vwDYou1)kE&ONl8!8Run^mnnKpndfDhmsMVpbDfu)c{$B1Bd^@N zl6jTqRh3sNS0Yz3SAMQS^fD?()igEB>m;wUye{&(%xjf5G9McG(8`B)KI~Cv%!h+~ zSmi^NkE(oJ=aW&sxs}sZo>qln6-KKtt-|yQvnWheSXN=R3af`1ik%g9QFM!9gTDK@ zh42cI6{4gC&_bxfF$!m`z*1vUI3+%)Vp%OL+`RBa;mN{Ng)|Cj(Xv7zdxhL6q+3WI zQy!V2h4AJ{uapydB`ZQ%L`e}xMIwuY_Bq|RSP9FcBF~DvEb^*AZQPLfJH#q9!j?U8r$UJ4GGSW2C56QICpow-{%%ic?I(VpL?RhpgB?3U(o zX|9x}i`REEDlMzDdZjJsgJo%Zc$L@RCQCak?WnZ-rJa;^TIvstrCpV_D($+or)4`S zJ8rqhE!Wn{^{}MR6~e`l_WrNR?4jMw7Cim;JJg%`&#jxL3v-csY*4GI7hq!`em?;Py%;^mx|m96c=X<4F+V zhRZ4%XlOK{afF79GLOqVDf1LJBJNwd8_7Y@?NsJN>Um{RmV-e#7?q__mKMGelrEM` z%1Gb1c3JhXe1bdJER|KNR;lb#^-8tBR9>l~QjN>n#o|g$)BLQgM`b-J8>4IlmRp*r zZ2Dz0rnz%DUN6TR<>pp7^~z~TBSAT>D#NObR%Ke1xw|sM%FHXXps(!oS-rBX%4$_s zud)T!iD^C34k|mOkJj|Ly0Y`iE-I>^ttxv+AC;@FTWy%t#(K3upK6>+1eM4uC#YQd zqamlP++pQ8mFHJpPgZ@E?2!$+0St-`ztn<^Yuk%PBqygSir z(geTDh^;E#sA8vz-71!N?~JP|-lA!7l?-ga9=_*PAzrhpA$|s;=tm7!rCRu6uX^~(r|5$Z zt$WdXSW>C7Qgx-qmD;T8m8y2C+NJ4#RVP)QR`sB2jA|HF!@Q!8;UiIvt77RWl)4}RKEvnIbo|z~!#k>GNyeQDE@JoxSvMhz) zO!Vky6Igq*Qe|x^YpU*K;bWBTD%->2kR2$yuk1wGDdrS*j-ipdBz}dUlwB)(sO+g~ zSE|!e`V+hAq^jFe-3`@s)pAQMch&NSTG>#0SJc_IT6fjDhn84ZYQt0;mb$Y=Um5Yc z4?zbl{H{Ut=qsoaz7l~F5vJ!N#r#DS^hFI#h;L(40xD&7QpCL7)z@(W2MOvEnm`AqP(l?kk9V$Mg;U78#1RyqCbVjbTAb4Te}4%Ry{n~7*% zqVg1zHB1pOEl~QQuJS28oK$Ji2(HQ=4bU{0(lDn=QZ}j_t8z-WuBv+Y$b*|LSCvxL zSkbp2oNc63snl52j;cc}3DlXYOZ3o2s3ugyTn!sFa@B}d3wpF1MGr^_oZ>uhwx^$4#9Wb+U?Ys)<)8vQGMSlGKT+Q?pK;I!$r^ z(d$YU*I9;9mRcff>SCiFjOxL-F5MbWqpU6mb!F6*RabUh_3Fx{@vE+UtkP9sT}5@3 z)YY_B7TqVc>eR}sm8?}zqnFSmi!NAID^;suU8i*u*3Gyc4(gGpM^R00PNSwCi+bYJ z6IoBfdO`~!R%5i9wrJXeM*k+J>567mHmiQKLBEqq@Ei~ou9z4$4*iYk!(`)z4Sg)c zSFT|r%|^Bwd>08C8Da`AX|6|4kGheQ#ve3(+0b$%Rs)kJa+@e``hL?NHpu{s=xNlX zNt3E39X08=$?7JjN9mrX^qb0Ss=84|qpU`?8v2T>NZg`tx%B0#sU@|0QfW4Q(;BqoJJ)JK=Dp8t!Qi_sHQM zf4Cfdbm$F+eogC@!!V*nx?z+IBQ@-IhO~}D@57lt%=*KO-s!zz z9?&Y|Fz*lZl7?9H?tC;HwDA>vFc_B6uxy4EzNimXG;G?#5&bp8aWte$H1UVDNI5Bo zn_DAWjoPdDfY9#a)wZ3D@av^|)Em#2QI*U={jG}N9 z(TZ3;>JLW!@rYJH(qxnlM)ca8wMSWJlqDm2o67xBQI5(Eed`;Q{-_K`Wil#h8Xk^R zk4C7GqMky%AsIE*h}v%GjwZ#}XpK#ae!Yk97-mI3q#K*lu`R~<5mGkpHsf_UUXRA> z$#}gQZ}{Vla4ej$i0CH^V=*2(%VWnKyXjbpaS)AzavV&?QGXm2<5-N77}u?k<02mq zoN*b9>79TcX7t%a(QCaN*Z#Ox<9alvE;!1@qjF3aeA0}k>BO)m?Q+s_Cf#HroQY5q zM@*b%;x13ZVgSpLzlxk-TW?k?gy&u~e&BiPffrtQ-Ua8l7u@^23m>qX zmgMFR?YsZU#g|-kADwq@_rCx7$~k8~?Q=){&!LJ-E;|2`bMHrS=CaQpzUCoU{?DP@ zi!M3u9QUI8-S46c&k4`F;NtTxSs3t%5B>C8|EF5bhoZ_o;3DUN_x!&@zVWAbyyAPm zJ5+Yw1Co2+?VRAEi_X8`JX?pk+XL@u-{XP{=1*;QY##jd&wu&B&;G8q;!v|oL4rNI z4s`V3i!QnE)k9wIw8!1|4*z4VwnJ6tUGkvwE?F4r$?ts7)()Zm`;^Z4?*sg7;dfla z^4y31`{#dmt!9;&Z}$JYx&OP>9`o_5etqSUg!@x8W9PE-he=9p3tAJ zwO1$fXR!X-5c%)G`9a8cqz!%EV);%?{AU`lw`e<-whnDbiwM82wjLgFT~^rtNQiRw zaK1%E+_Txfh{(T>Hu$a42DwKY(%}&P>)Lxp#Mz(?`a3fZ5Rne({fw{+mO-?)$1(`J zWEq6)vkan~kT&Qe+K@oVeI_Od@Jne!0%6aXIT7{&%O$fSB7yK%w85`odC2mZh%`_5 zPiO--X+r`bp96u?JfYvB4d;JX+K}!_8_K&IZAkNk|J`W=??D^tmGDE&S} zoO|ggS10uMW<3ZQQ!4PjOiUag-;a4A5ebC;A_$arBK$7aUNb_zKW*S8v|X3BhtP)e ze;94hUrHMi2>oTWLH`KakQNd4N74o!qz&mHZIB;D+cC5~j^)P_k>-i(_9WWi|76;b zK*&#lKnaBWR0x#jiF!VbHrSueyqt)*&!P?X=g@`(LVg|uO7lei=hFthfHvg+bLNYQ z(7%NFQs&E;FK51jhy=p_m9!zwU($whU&H)sBJ6)d8?M7Y(1rv;{|4IN|0ddyK*(=~ zKnaB3TOd#ZA-|RRHX_nIaUI^NwKKy1U9^GkX1<4r1VaB_=KGlMXMTYBLFWHqeu#*A z{tL?=CL)0-|D&`a?#GxPCnAB!_eltpK=^%%`Dx~7n4cvg9S#xabJ}}G$e(8!g!~1T zLC9ZZ8HD^L=9gK2Bt-tNaK8V|L_NPs8~8QakPe6N|2l2pH)ulwA%7DBrJacD{w?h_ zBl3NlWf1arSYAZfuVDKk!u}s@|3eV*zDpbUJ&p@PzLI4S@_(`nLjFF>I}v_AU_TJ@ z4_V%c@cS?JTSVA@#P&Y~5%0$w4}|;^mgfomPuc!6w*N7Ra(>S77ZLVfu>DAge81#; zM?&QL73W(-*ndqM`u}ffgM1ZjNb`hV8?Qm=kJ84)gz0FugE+hn%ZmupF>L>15TTEy z9e7>Z;kkHymTy2rJKTtQ6V~69c{~wm5n(!k{Z3@RMTF^Q>~|9TfhhOpEbm0P+=Bh) z3DqrW2i}V9M?z$|HRl6ycpK(znYUx!9!5&@gz6O5gE%~uc^cDzk`jo+)0t;5@4&nx z^Gv46w3v5do<&3gaoA$+X4=dp7%71`Y%@E|E_0c=!rVhd0&%#Pc{Xz&l$1amt}@q{ zJ?1(Q*LQ=6{w9c+he)>j%z%ir6X6oFABe+<*=NSggqadiZb3vnO4e6QMMMHouMx{2 z{3k@HHks!zx0rWfPMLRQo=ZdmadSWULi`EG*@^D!So*R%W&EWeS6xNl~@jfiwOgzMYcAH?B1SUwUW%RkW$ z^>{bu2XXiwmO<42eXM^!^8-YTbN|fpzYvi?9DbN(5cxmC`hR17l=UAcB7xTqO+cg7qN$zDtDad#s-)R9Dgte&1(1h{GQ+f5`g7Azc59^ZkhP z%@e90(+=hRl=*Y^19A8ZmXCzU@=MMK;_z22FCt98W;=+(->|%hF#VSOu42DyL!A{T zk2FW%+B!~VYy5oa&Q z*@^HwoBS}|Zm>Uy=etXU-D66o&kTt4w=2T#e<0%Y**_sdPKoIM10u>F5mD|I%l9B6 zEh6%t$952h=QHn3g#A9u`@%>Gg#H5N{aC*f;eR3dVLW*N=X)UYLCgm;AHsYn5osqP z?!(w`C&KSi_M0d44`=-%!hRXq!AG#)JfVLi+Yb`q@@SSH1A!6G>?b zfaO1flG08@oIfW&obOB6f1a?vl=UFwm$3{&emV0M%vZAg+7R(x#c^IuM5w=F`8CYf z67hU}9m{{q{5v8Nh&X@Gd_D6Ym~S8=%@h7_Wc?z-{wB`ie_H4**fDkARl>yQAKW1(ci@4765kgvx)j(L5ygRtL# zWf1Xh#Jmafc((r`i1JRLc;Jc5n{j*)=XDE~=ZSjViv4fRybb$-u-}dd)v2tXC+r66 zcOvR_I{Se*yd&)}U)at1YeU4fIX?(_iP>g$m|Y^$JmJ60_7&zH_M0cp^K82O&Ew9}eN~az2mqT^k~6!1<4aC_m(UAmoUM_KR6g zm?<+O(%-HD%Ow%>$RQE=#xOD=Z?X)ce^1%(T-MJM<=>6w0e>BHo*c$p2O%5{UD78}seVcd#9V{hx?Xy_@Ct zFyG63AB>ddiG1&8JqY;&%nuS#j}Ni@&n$nK<$q;|bGd5n=x-+d;@*V}70WiwM7OuzjA;f0Oh7I}tA5VfhLO zlok=!^Gf#nPxjl1DChg^H&5t)zQNWShmlTLhU+^^&sM1pLqk;gV5iQ z<(-J~Zp?m*h&VUlcsFGp&pd(iEh6%r$bL6tzj@+3ZqD{wFmK7c75mQ<@ovrb+pryk z{&*Sk4I=uhAkyD1$$Fpl5zBod+BIjnAR-+OQI7%p9}ZF9ipx=)?{J9o7_vWz za!1TD>p|!zM3i$5>p|$ZSOy{Ah2@=ya?fSI!y(GOJNttu=N`=SSPw#fPv-f|dok}# zMB0fc=f3Rs#~|u=0oUh#Tn-5Rg)D=RFJgHSVZWH|zYh`T{#@QA9Pdbo{C~pvb|T&n zAI5$l+WFx`|Kr*3e*;nPCvbh{ z3H=jE4?ctDk9dBXlu_InxILFix3d#Q7Nee}e5G&g0WWwCfjGzZ2o|751Aa;(wL(^Mw9u zq(^+iz)BO&tNmGYq;=Q8icygSDOasKDC45A+QAtK*>nHMnc z$Gnh;1fraanU^phzw9NYzJX~HOnC4|0T=wg#NGC{u<_MiOBytBFcX~ z>;Hj>G*9Gz1KZ!o_MHg-H?bcG`5&2YX1;}p^50HGnkV${WIc%d?_$22`5v~<6X)>( z(qo?e5w?TK|8FcWBJ3X}JFeTu*>9e(e}eTO+)l^gYf?e^QWv|MEL!T z?em2G=bZl+%wMwKPDH+6ksr?cH|!5W|67)KBK)pmKM=D1*z^Y?;vGdVm*CMv)bkkT zb&2SoH(~otiAeKAzT-)cDxS>tdBT2k&VLK$Et$7s-kOLsPvpA|=~18Cu^oi|_RLd= zxXuR4rxW3S2bS;1Jd=ntPxx7^pC|6i-K2+oi3oX_{pN{!tgzo+BI>cqejw~?EQ7G` zXL+9R+h9Ei`OYlQ6Z!*e7i^y=><-&qwl5<5Jhp>4PoMJztOwy2vJ66wi13ezIG>F5 zIqL^Rq(wyjlIV@`=dvDz{%$OTsPB2KzbEVG z3IFrielH@*xq$sZM;PWPcEG4zj$6us@3Ji-_}m4BJ7-k0T=Ao9%U&DG3`qvV19<2=A3(GqZes5*}w-Isv@8oiHg)LHNIyWf1cFSOy`#pNRLP4-?V; zA7TB!F+WN~0^$ELmO=P`f@Ki)PclEn_Rp~VS?1@6sP~sx{xT5>#PjeQM8y4fwttI= z^SXlhJ=R}Igx~jxNFd7p0m~rdAF@18#QQPZf5QAJ^Jhe~$8TA_iimQKA|>J-&Ablt z80N7=qw z%ZEewpUe5~Mnrk{Afn#)Vf}rHNb^L#3s?^#--Yad5$i$3c_7R4g#UwCzlezc5VC_0 zWj>5~Ddz)We>ltYg#I$tFCy%ZVEd5}`5wvnt__j@Ams-i#e6i!nu`JIM z`p2<;C&KUX?6(u)_XPI4Hbnj>QhxAB90$bpehTZK%6brff69Cs>p}Qm&hk9r{|xqj zCfh;yKb!T>VLq4nJR;H}BHr`a4nlqb%OK?I7$gBVzn~ z73+5*{9ny}heO;~f5YXxjtKb;oPQBfzc-N`d^6{J3(Id~`Rzm`5PtteMBMkW{r$`j z5RvAI`hSq^|A+Y@_WMH;^OKKoToC2{8_SCb`$yS6Pv}2JdR(7Rahy*xKSRXz{yY&0 zM0QCL2>Xv%1|k2L`4iTIIM1K6{ue})_bZlv&HN1!?RpeF+!5z!Jmi^>ufsA3`55N0 ztOudLE)nsMWBK}Q2VuVf^M_1P$yD!JPfO$Xm+lk0`A^E}eLF^Ag|6rC6 zhwy(0=X)p-^}Lkx9}bcK;hg_6<|CMoWF90Ufr$TT=409ZIOgMt^tbD2*j4x*gbGyj442DUFE{NKoS5b~Rt|HynZ+Yg7x{}#^oR?fE* z;r}-Fe>?LXoDanLy_@y#VZN7$c6mP$2}GO^una=}AQ65aVm%1`KeG%%{uh=($RB3@ zE9*h%KSD&jk1{{b{3H!Xwz;eRyA;B}bCupPvCUyt?25%Ju*G221dk7wSD zd2_adu-}S^^Sm7q<=md_Amme6o+tFDvVJGR?=-8f{^zp) zJYl~(+wZ|Vk9kk_2T_mnSq35Bi+OJ%;@p?z3z+v~UPwd&k?$fR{O?c1d+mc+{}3Y5 zJmLRP)`O5A#=MmEAoLF>;y!s4%a3OJBEtVM?Dtsq1EGH$%ZrG1eInZrhluwij{9WJ z2SWc8BF_IAEI*U&Anea#KAZU*wu7)gm*sgv|2)=%ke|=;;Sl~WV1E$u3yJ9WFJk>X zVSh2{(Jn7z|CbYSeP7A)tB6P-{9n!Xzhe0{EdMpje?vstiHP$$_WxV<2ciEvmO;pW z&oYR5zJZAPy@~Z8{Qi-M^L!i2Z)ZCQ`#Xrp_fFP>(7%gi5c0cO1|h$P`Cit8xb7cf z{Xet*aEN&S!v2ehN6#nNK2PNPB$xLo=BL>Yg#9xt&lCF3k{;*%dG`AP^NZ|%ZHTyE z;{1yU`LMTGr7*bYMeF3TX~ z@3A~j=&xiwh;i({*#AeYUqs~lG27<}{ZCjALjEc9XRHUI|2gv)tOue0CG%ITpC|64 z-?AQr|5Yr5kayhxJ4!ncen+u=C&KS&@&m8K{vhOISYAZfk7fI{A@X0B%efvA{p9)_ z?~g&0cLR<;Pv~#RdJyuBSO!tAo3K1j=#OXr6W9(S|B1|-v3{PgpTzn_#Pz=g+ZPe} zZ^`y~qCU4KJ?yt(I|%u#C}IYm{m=L!8P=`qf4u-~28Z=UcwKzclnJZ8v#^Mqf- z`fEev?{ofnLLamK+7R{5IX{Sa1rg&%#rk=|u2>I3u37#=5^)=jKO~|)6P7o*yx)h2 ze-6hv5+dIg*W)hCDaV;7{O-zn5c0V!gOKmWG6?zZ%zH4;WBcI{`R~d8AmsB|o+tG8 zV*9<>{)ZsOiTiRq5anFJG6?y8%nO+pv3;J1bAQ&)6ZtRUe1F1x0Q-TkKalw#=7Wid z_fR4d2)~ChFJ(Ol{ll4;F(1KvBoPUO-$9l^$d6+AzxkvUc+bWT*pJ6z$_L?eloqi& z2D($V2!nul0&TmFf$jiwHFVnVfOgg{Fkrqgo0Mti<8>5L=^uXSUrp@#1YC5s6Orv} z*nJy2e0!c%2>-YFSrlC>?RO-ci_n94`9*>8B@xCnMA`*bQJf24!gRWH{@f7vpHw zusG7c1Hnhz*)LjtguHr8ItfJ{g(wB06mYo;yLTR{>G7zGzEJp;#IElnudaa(pf8X9 z-*@X4*B3?i?qj!4>rf7@6DUYPr|Yb%3l(2q9Bntd3qM_}+oEtSo{Sd4iqo#+kx$o8 zyI_>oOHSM*B+Yt>Zu@~gH@N6V)Ms?m)i1@*VbvE@;PgG@xEMM;uIuyF{qF#>&Dupb z6I|wcgf56wvrr1oN1+k*wR|R=>+QzT&WNHL;y1AB))jOx3m~D>U0JuwG28KAI0@o0 z2!9QOuF$NeXr=>)F5~r(O*fb>Qs2WhYM`4$|I zFzz}YI|R|sd%ihQPz~J)h%#$1h`Ls~LORN?;HUHI7Q)9gzCWNmpm(T?uAkoNZZ;E1 zKWkVW>QwmY+xfWdY}-fMk>RHYfP*;Fd38{|yZIsAwn1Nj?YiiZZo470-#d^^pTf); zqJ!NJw@)A9*A7)kXS>OQY{y?c#}DChQ`-2}xcYglABuN0{B+Q};z&n1fa{}my1@>@ z@Dl9wk!}Nh()!4Q;Vanv7CZgB8~iv!|B_?&vse6PW7i4TU5uR`E%Z){*U0;ExLDXd z0K1Q3cRlQOjYY{zfky71GN`&1n1duHwd1f3pBblYQQvFoJmyb$M#JXE0rq@Vq> z$NHkgDEALSNJ?DSJj_p4J6iTdYBPuIN;rOlp9u*5iwQpy{7j=`wUY9a(pu zQxHIRkc)9NH)KH6E?>oww(5lf9aLXr@w-m?X1ZaKP2USAqhp;6@u04~wj%F#ljtX+ zK7|6-nKN?e>$_c~J}spqBf$29{+H0{51k%L(|42}Hg%}W5mXN&x`plx=UE%zlFcp! zsy6FpT8GQHeT_be00pughuy4o;U~Ax1LaCsb-CNmcs;i`8S(T4Lsv+<==PhnfzF2A z_E@K{%yo3dwE?^JLpyy}=qbc@8ytjHcTs(%9fYcu4riWbgqV0C!`ufiGY@F8b zthl~V4?!sXPm|1g7~1cek7LwcJI~JdP=$0Qb^T6-i_Rv|Lc0C7FS72edUuMxJP5FX zoqo<-(YouSj^#nstPW0`vJ-^bORbT1ZOaXakg(I>K zx_xWt*0^Q>RB|?r+U}=^@*W`LY$%;gKVZPdPq6JAhpIc9hQeibUmj`$J&o5r_GsOl zFz7p3xA<)SjL`a|brc;yi?it^tY6jf^lf$MW}4k9{&BCSq*ee58?!8Zxe_73b^QadghB?OwMu~JmjJ~jV@Oo>3(%I>byN#=!t{A zc+k&!j=uf$`Oe;`5DyEOvzFAYq07~etdn7V1a|mM?rh-MzAJV^r^D+TTR$+)(~WcW z4)RF&=^2Igb0O-7gPt63KVk8nIh+3K`st^$9vu(DpeNv3hu^2pdiLx+Pm71zRR4P6 zz@e_9$EMl%vfYu8Ltkz^Wa!aMKU4JS>k0TZvdu0J<(iEVi@LYI#XqV~0pTykk?!(~ zX6D#2(#Rdjg$@-tT-om4bq}?;o(AaJUk7D;0y{n7!|#k| zy=l9fz4y>{JB5t1+P@cmy36Y?soQO(`;flHb-U>M_axL$mo_&HBY>{`@w#yiiMnUc zE;7p1^QKt`)_&OOGtzH{vvP4-+xPz0;4&NFbq=)4HQ$f6o1KiaetI&FPQp&tK%d~Z z4+YrntY3gm55uV5!cqQ2T&UU5jMLInY(0h5vys^x7zQlX%u4&jp(cK$E)rIK^>q{L zk6*L?e5jced2mgyJ~rtKpq+Iy&8B{bF1#M~^kDP=6eM&L9}23i`X*+tReb>!{(L03Tc6_h(`KiyWi9(sL4KeDvT&)|GAtk;;m7I5C4C*Bx- z9(H>4(e0x9n(kb>>*+gh)&q%xc3ZWz#M?Y}&oBH-cQ@4RW%h_rV^6EC#uQw-P z4x+n-9`JN&x(2%Y=vwK^eRG`+JKZO>^+bsJMMqadcaYh858C7!FEx6U(vSS@hL{cT z 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 Dn~4sS literal 0 HcmV?d00001 diff --git a/.vs/HaoYueTunnel/FileContentIndex/8cf87acb-c50f-48bf-a078-36be13ef7520.vsidx b/.vs/HaoYueTunnel/FileContentIndex/8cf87acb-c50f-48bf-a078-36be13ef7520.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..ec7466d75bacd46ddbd2df7700e0a1fe6a5b9213 GIT binary patch literal 55606 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 LfB*D{_5c3^i;I2X literal 0 HcmV?d00001 diff --git a/.vs/HaoYueTunnel/FileContentIndex/f206be68-8809-4859-a92e-8deb5f741e0d.vsidx b/.vs/HaoYueTunnel/FileContentIndex/f206be68-8809-4859-a92e-8deb5f741e0d.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..0be093122207cc72bb5af0705cc8cd7a3827d159 GIT binary patch literal 62804 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
^u~X`K^iQ*u8g9u2d;4lWc@srX;kq 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 YKKml9Q-?|i?{GoFX#fBK diff --git a/NetLib/HaoYueNet.ClientNetwork.dll b/NetLib/HaoYueNet.ClientNetwork.dll index e0a73627625c35ec70c8e028d29495ad088fee28..3e5d2f5ec00825c0c469048f58989889f5a64211 100644 GIT binary patch delta 1395 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 delta 7193 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 Nw1%etO*9v}{uiHIA(a3C diff --git a/Protobuf/ProtobufAuth.cs b/Protobuf/ProtobufAuth.cs index cfbdef9..b2b5cad 100644 --- a/Protobuf/ProtobufAuth.cs +++ b/Protobuf/ProtobufAuth.cs @@ -33,17 +33,18 @@ namespace AxibugProtobuf { "dHVzGAQgASgOMiEuQXhpYnVnUHJvdG9idWYuTG9naW5SZXN1bHRTdGF0dXMi", "IwoQUHJvdG9idWZfQ2hhdE1zZxIPCgdDaGF0TXNnGAEgASgJIkgKFVByb3Rv", "YnVmX0NoYXRNc2dfUkVTUBIQCghOaWNrTmFtZRgBIAEoCRIPCgdDaGF0TXNn", - "GAIgASgJEgwKBERhdGUYAyABKAMqnAEKCUNvbW1hbmRJRBIOCgpDTURfREVG", + "GAIgASgJEgwKBERhdGUYAyABKAMqzQEKCUNvbW1hbmRJRBIOCgpDTURfREVG", "QVVMEAASDgoJQ01EX0xPR0lOENAPEhAKC0NNRF9DSEFUTVNHEKAfEhgKE0NN", "RF9VU0VSX09OTElORUxJU1QQiCcSEgoNQ01EX1VTRVJfSk9JThCnJxITCg5D", - "TURfVVNFUl9MRUFWRRCoJxIaChVDTURfVVNFUl9TVEFURV9VUERBVEUQqScq", - "KwoJRXJyb3JDb2RlEhAKDEVSUk9SX0RFRkFVTBAAEgwKCEVSUk9SX09LEAEq", - "PgoJTG9naW5UeXBlEg8KC0Jhc2VEZWZhdWx0EAASDgoKSGFvWXVlQXV0aBAB", - "EgcKA0JGMxADEgcKA0JGNBAEKksKCkRldmljZVR5cGUSFgoSRGV2aWNlVHlw", - "ZV9EZWZhdWx0EAASBgoCUEMQARILCgdBbmRyb2lkEAISBwoDSU9TEAMSBwoD", - "UFNWEAQqTgoRTG9naW5SZXN1bHRTdGF0dXMSIQodTG9naW5SZXN1bHRTdGF0", - "dXNfQmFzZURlZmF1bHQQABIGCgJPSxABEg4KCkFjY291bnRFcnIQAkICSAFi", - "BnByb3RvMw==")); + "TURfVVNFUl9MRUFWRRCoJxIaChVDTURfVVNFUl9TVEFURV9VUERBVEUQqScS", + "GAoTQ01EX1RDUFRVTk5FTF9IRUxMTxCJJxIVChBDTURfVENQVFVOTkVMX0RP", + "EIonKj4KCUVycm9yQ29kZRIQCgxFUlJPUl9ERUZBVUwQABIMCghFUlJPUl9P", + "SxABEhEKDUVSUk9SX05PVEZBTkQQZCo+CglMb2dpblR5cGUSDwoLQmFzZURl", + "ZmF1bHQQABIOCgpIYW9ZdWVBdXRoEAESBwoDQkYzEAMSBwoDQkY0EAQqSwoK", + "RGV2aWNlVHlwZRIWChJEZXZpY2VUeXBlX0RlZmF1bHQQABIGCgJQQxABEgsK", + "B0FuZHJvaWQQAhIHCgNJT1MQAxIHCgNQU1YQBCpOChFMb2dpblJlc3VsdFN0", + "YXR1cxIhCh1Mb2dpblJlc3VsdFN0YXR1c19CYXNlRGVmYXVsdBAAEgYKAk9L", + "EAESDgoKQWNjb3VudEVychACQgJIAWIGcHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::AxibugProtobuf.CommandID), typeof(global::AxibugProtobuf.ErrorCode), typeof(global::AxibugProtobuf.LoginType), typeof(global::AxibugProtobuf.DeviceType), typeof(global::AxibugProtobuf.LoginResultStatus), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -86,6 +87,14 @@ namespace AxibugProtobuf { ///更新在线用户状态 下行 对应 Protobuf_UserState_RESP /// [pbr::OriginalName("CMD_USER_STATE_UPDATE")] CmdUserStateUpdate = 5033, + /// + ///TCP打洞请求 上行 | 下行 对应 Protobuf_TcpTunnel_HellToSev | Protobuf_TcpTunnel_HellToSev_RESP + /// + [pbr::OriginalName("CMD_TCPTUNNEL_HELLO")] CmdTcptunnelHello = 5001, + /// + ///TCP打洞请求 下行 对应 Protobuf_TcpTunnel_DoTunnel | Protobuf_TcpTunnel_DoTunnel_RESP + /// + [pbr::OriginalName("CMD_TCPTUNNEL_DO")] CmdTcptunnelDo = 5002, } public enum ErrorCode { @@ -97,6 +106,10 @@ namespace AxibugProtobuf { ///成功 /// [pbr::OriginalName("ERROR_OK")] ErrorOk = 1, + /// + ///用户不存在 + /// + [pbr::OriginalName("ERROR_NOTFAND")] ErrorNotfand = 100, } public enum LoginType { diff --git a/Protobuf/ProtobufTcpTunnel.cs b/Protobuf/ProtobufTcpTunnel.cs new file mode 100644 index 0000000..3c26d84 --- /dev/null +++ b/Protobuf/ProtobufTcpTunnel.cs @@ -0,0 +1,920 @@ +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: protobuf_TcpTunnel.proto +// +#pragma warning disable 1591, 0612, 3021 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace AxibugProtobuf { + + /// Holder for reflection information generated from protobuf_TcpTunnel.proto + public static partial class ProtobufTcpTunnelReflection { + + #region Descriptor + /// File descriptor for protobuf_TcpTunnel.proto + public static pbr::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static ProtobufTcpTunnelReflection() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "Chhwcm90b2J1Zl9UY3BUdW5uZWwucHJvdG8SDkF4aWJ1Z1Byb3RvYnVmIisK", + "HFByb3RvYnVmX1RjcFR1bm5lbF9IZWxsVG9TZXYSCwoDVUlEGAEgASgDIiMK", + "IVByb3RvYnVmX1RjcFR1bm5lbF9IZWxsVG9TZXZfUkVTUCI9ChtQcm90b2J1", + "Zl9UY3BUdW5uZWxfRG9UdW5uZWwSCwoDVUlEGAEgASgDEhEKCXRhcmdldFVJ", + "RBgCIAEoAyJ3CiBQcm90b2J1Zl9UY3BUdW5uZWxfRG9UdW5uZWxfUkVTUBIR", + "Cgl0YXJnZXRVSUQYASABKAMSDAoEbXlJUBgCIAEoCRIOCgZteVBvcnQYAyAB", + "KAUSDwoHb3RoZXJJUBgEIAEoCRIRCglvdGhlclBvcnQYBSABKAVCAkgBYgZw", + "cm90bzM=")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { }, + new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_TcpTunnel_HellToSev), global::AxibugProtobuf.Protobuf_TcpTunnel_HellToSev.Parser, new[]{ "UID" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_TcpTunnel_HellToSev_RESP), global::AxibugProtobuf.Protobuf_TcpTunnel_HellToSev_RESP.Parser, null, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_TcpTunnel_DoTunnel), global::AxibugProtobuf.Protobuf_TcpTunnel_DoTunnel.Parser, new[]{ "UID", "TargetUID" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_TcpTunnel_DoTunnel_RESP), global::AxibugProtobuf.Protobuf_TcpTunnel_DoTunnel_RESP.Parser, new[]{ "TargetUID", "MyIP", "MyPort", "OtherIP", "OtherPort" }, null, null, null, null) + })); + } + #endregion + + } + #region Messages + /// + ///Tcp打洞请求 + /// + public sealed partial class Protobuf_TcpTunnel_HellToSev : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_TcpTunnel_HellToSev()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTcpTunnelReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_HellToSev() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_HellToSev(Protobuf_TcpTunnel_HellToSev other) : this() { + uID_ = other.uID_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_HellToSev Clone() { + return new Protobuf_TcpTunnel_HellToSev(this); + } + + /// Field number for the "UID" field. + public const int UIDFieldNumber = 1; + private long uID_; + /// + ///自己的UID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long UID { + get { return uID_; } + set { + uID_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_TcpTunnel_HellToSev); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_TcpTunnel_HellToSev other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UID != other.UID) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UID != 0L) hash ^= UID.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(UID); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_TcpTunnel_HellToSev other) { + if (other == null) { + return; + } + if (other.UID != 0L) { + UID = other.UID; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + } + #endif + + } + + /// + ///Tcp打洞请求 下行 + /// + public sealed partial class Protobuf_TcpTunnel_HellToSev_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_TcpTunnel_HellToSev_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTcpTunnelReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_HellToSev_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_HellToSev_RESP(Protobuf_TcpTunnel_HellToSev_RESP other) : this() { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_HellToSev_RESP Clone() { + return new Protobuf_TcpTunnel_HellToSev_RESP(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_TcpTunnel_HellToSev_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_TcpTunnel_HellToSev_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_TcpTunnel_HellToSev_RESP other) { + if (other == null) { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } + #endif + + } + + /// + ///Tcp打洞请求 + /// + public sealed partial class Protobuf_TcpTunnel_DoTunnel : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_TcpTunnel_DoTunnel()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTcpTunnelReflection.Descriptor.MessageTypes[2]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_DoTunnel() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_DoTunnel(Protobuf_TcpTunnel_DoTunnel other) : this() { + uID_ = other.uID_; + targetUID_ = other.targetUID_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_DoTunnel Clone() { + return new Protobuf_TcpTunnel_DoTunnel(this); + } + + /// Field number for the "UID" field. + public const int UIDFieldNumber = 1; + private long uID_; + /// + ///自己的UID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long UID { + get { return uID_; } + set { + uID_ = value; + } + } + + /// Field number for the "targetUID" field. + public const int TargetUIDFieldNumber = 2; + private long targetUID_; + /// + ///目标的UID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long TargetUID { + get { return targetUID_; } + set { + targetUID_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_TcpTunnel_DoTunnel); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_TcpTunnel_DoTunnel other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UID != other.UID) return false; + if (TargetUID != other.TargetUID) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UID != 0L) hash ^= UID.GetHashCode(); + if (TargetUID != 0L) hash ^= TargetUID.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (TargetUID != 0L) { + output.WriteRawTag(16); + output.WriteInt64(TargetUID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (TargetUID != 0L) { + output.WriteRawTag(16); + output.WriteInt64(TargetUID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(UID); + } + if (TargetUID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(TargetUID); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_TcpTunnel_DoTunnel other) { + if (other == null) { + return; + } + if (other.UID != 0L) { + UID = other.UID; + } + if (other.TargetUID != 0L) { + TargetUID = other.TargetUID; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + case 16: { + TargetUID = input.ReadInt64(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + case 16: { + TargetUID = input.ReadInt64(); + break; + } + } + } + } + #endif + + } + + /// + ///双方信息 下行 + /// + public sealed partial class Protobuf_TcpTunnel_DoTunnel_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_TcpTunnel_DoTunnel_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTcpTunnelReflection.Descriptor.MessageTypes[3]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_DoTunnel_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_DoTunnel_RESP(Protobuf_TcpTunnel_DoTunnel_RESP other) : this() { + targetUID_ = other.targetUID_; + myIP_ = other.myIP_; + myPort_ = other.myPort_; + otherIP_ = other.otherIP_; + otherPort_ = other.otherPort_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_DoTunnel_RESP Clone() { + return new Protobuf_TcpTunnel_DoTunnel_RESP(this); + } + + /// Field number for the "targetUID" field. + public const int TargetUIDFieldNumber = 1; + private long targetUID_; + /// + ///目标的UID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long TargetUID { + get { return targetUID_; } + set { + targetUID_ = value; + } + } + + /// Field number for the "myIP" field. + public const int MyIPFieldNumber = 2; + private string myIP_ = ""; + /// + ///自己的IP + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string MyIP { + get { return myIP_; } + set { + myIP_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "myPort" field. + public const int MyPortFieldNumber = 3; + private int myPort_; + /// + ///自己的Port + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int MyPort { + get { return myPort_; } + set { + myPort_ = value; + } + } + + /// Field number for the "otherIP" field. + public const int OtherIPFieldNumber = 4; + private string otherIP_ = ""; + /// + ///对方的IP + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string OtherIP { + get { return otherIP_; } + set { + otherIP_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "otherPort" field. + public const int OtherPortFieldNumber = 5; + private int otherPort_; + /// + ///对方的Port + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int OtherPort { + get { return otherPort_; } + set { + otherPort_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_TcpTunnel_DoTunnel_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_TcpTunnel_DoTunnel_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (TargetUID != other.TargetUID) return false; + if (MyIP != other.MyIP) return false; + if (MyPort != other.MyPort) return false; + if (OtherIP != other.OtherIP) return false; + if (OtherPort != other.OtherPort) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (TargetUID != 0L) hash ^= TargetUID.GetHashCode(); + if (MyIP.Length != 0) hash ^= MyIP.GetHashCode(); + if (MyPort != 0) hash ^= MyPort.GetHashCode(); + if (OtherIP.Length != 0) hash ^= OtherIP.GetHashCode(); + if (OtherPort != 0) hash ^= OtherPort.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (TargetUID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(TargetUID); + } + if (MyIP.Length != 0) { + output.WriteRawTag(18); + output.WriteString(MyIP); + } + if (MyPort != 0) { + output.WriteRawTag(24); + output.WriteInt32(MyPort); + } + if (OtherIP.Length != 0) { + output.WriteRawTag(34); + output.WriteString(OtherIP); + } + if (OtherPort != 0) { + output.WriteRawTag(40); + output.WriteInt32(OtherPort); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (TargetUID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(TargetUID); + } + if (MyIP.Length != 0) { + output.WriteRawTag(18); + output.WriteString(MyIP); + } + if (MyPort != 0) { + output.WriteRawTag(24); + output.WriteInt32(MyPort); + } + if (OtherIP.Length != 0) { + output.WriteRawTag(34); + output.WriteString(OtherIP); + } + if (OtherPort != 0) { + output.WriteRawTag(40); + output.WriteInt32(OtherPort); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (TargetUID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(TargetUID); + } + if (MyIP.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(MyIP); + } + if (MyPort != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(MyPort); + } + if (OtherIP.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(OtherIP); + } + if (OtherPort != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(OtherPort); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_TcpTunnel_DoTunnel_RESP other) { + if (other == null) { + return; + } + if (other.TargetUID != 0L) { + TargetUID = other.TargetUID; + } + if (other.MyIP.Length != 0) { + MyIP = other.MyIP; + } + if (other.MyPort != 0) { + MyPort = other.MyPort; + } + if (other.OtherIP.Length != 0) { + OtherIP = other.OtherIP; + } + if (other.OtherPort != 0) { + OtherPort = other.OtherPort; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + TargetUID = input.ReadInt64(); + break; + } + case 18: { + MyIP = input.ReadString(); + break; + } + case 24: { + MyPort = input.ReadInt32(); + break; + } + case 34: { + OtherIP = input.ReadString(); + break; + } + case 40: { + OtherPort = input.ReadInt32(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + TargetUID = input.ReadInt64(); + break; + } + case 18: { + MyIP = input.ReadString(); + break; + } + case 24: { + MyPort = input.ReadInt32(); + break; + } + case 34: { + OtherIP = input.ReadString(); + break; + } + case 40: { + OtherPort = input.ReadInt32(); + break; + } + } + } + } + #endif + + } + + #endregion + +} + +#endregion Designer generated code diff --git a/ProtobufCore/out/ProtobufAuth.cs b/ProtobufCore/out/ProtobufAuth.cs index cfbdef9..b2b5cad 100644 --- a/ProtobufCore/out/ProtobufAuth.cs +++ b/ProtobufCore/out/ProtobufAuth.cs @@ -33,17 +33,18 @@ namespace AxibugProtobuf { "dHVzGAQgASgOMiEuQXhpYnVnUHJvdG9idWYuTG9naW5SZXN1bHRTdGF0dXMi", "IwoQUHJvdG9idWZfQ2hhdE1zZxIPCgdDaGF0TXNnGAEgASgJIkgKFVByb3Rv", "YnVmX0NoYXRNc2dfUkVTUBIQCghOaWNrTmFtZRgBIAEoCRIPCgdDaGF0TXNn", - "GAIgASgJEgwKBERhdGUYAyABKAMqnAEKCUNvbW1hbmRJRBIOCgpDTURfREVG", + "GAIgASgJEgwKBERhdGUYAyABKAMqzQEKCUNvbW1hbmRJRBIOCgpDTURfREVG", "QVVMEAASDgoJQ01EX0xPR0lOENAPEhAKC0NNRF9DSEFUTVNHEKAfEhgKE0NN", "RF9VU0VSX09OTElORUxJU1QQiCcSEgoNQ01EX1VTRVJfSk9JThCnJxITCg5D", - "TURfVVNFUl9MRUFWRRCoJxIaChVDTURfVVNFUl9TVEFURV9VUERBVEUQqScq", - "KwoJRXJyb3JDb2RlEhAKDEVSUk9SX0RFRkFVTBAAEgwKCEVSUk9SX09LEAEq", - "PgoJTG9naW5UeXBlEg8KC0Jhc2VEZWZhdWx0EAASDgoKSGFvWXVlQXV0aBAB", - "EgcKA0JGMxADEgcKA0JGNBAEKksKCkRldmljZVR5cGUSFgoSRGV2aWNlVHlw", - "ZV9EZWZhdWx0EAASBgoCUEMQARILCgdBbmRyb2lkEAISBwoDSU9TEAMSBwoD", - "UFNWEAQqTgoRTG9naW5SZXN1bHRTdGF0dXMSIQodTG9naW5SZXN1bHRTdGF0", - "dXNfQmFzZURlZmF1bHQQABIGCgJPSxABEg4KCkFjY291bnRFcnIQAkICSAFi", - "BnByb3RvMw==")); + "TURfVVNFUl9MRUFWRRCoJxIaChVDTURfVVNFUl9TVEFURV9VUERBVEUQqScS", + "GAoTQ01EX1RDUFRVTk5FTF9IRUxMTxCJJxIVChBDTURfVENQVFVOTkVMX0RP", + "EIonKj4KCUVycm9yQ29kZRIQCgxFUlJPUl9ERUZBVUwQABIMCghFUlJPUl9P", + "SxABEhEKDUVSUk9SX05PVEZBTkQQZCo+CglMb2dpblR5cGUSDwoLQmFzZURl", + "ZmF1bHQQABIOCgpIYW9ZdWVBdXRoEAESBwoDQkYzEAMSBwoDQkY0EAQqSwoK", + "RGV2aWNlVHlwZRIWChJEZXZpY2VUeXBlX0RlZmF1bHQQABIGCgJQQxABEgsK", + "B0FuZHJvaWQQAhIHCgNJT1MQAxIHCgNQU1YQBCpOChFMb2dpblJlc3VsdFN0", + "YXR1cxIhCh1Mb2dpblJlc3VsdFN0YXR1c19CYXNlRGVmYXVsdBAAEgYKAk9L", + "EAESDgoKQWNjb3VudEVychACQgJIAWIGcHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::AxibugProtobuf.CommandID), typeof(global::AxibugProtobuf.ErrorCode), typeof(global::AxibugProtobuf.LoginType), typeof(global::AxibugProtobuf.DeviceType), typeof(global::AxibugProtobuf.LoginResultStatus), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -86,6 +87,14 @@ namespace AxibugProtobuf { ///更新在线用户状态 下行 对应 Protobuf_UserState_RESP /// [pbr::OriginalName("CMD_USER_STATE_UPDATE")] CmdUserStateUpdate = 5033, + /// + ///TCP打洞请求 上行 | 下行 对应 Protobuf_TcpTunnel_HellToSev | Protobuf_TcpTunnel_HellToSev_RESP + /// + [pbr::OriginalName("CMD_TCPTUNNEL_HELLO")] CmdTcptunnelHello = 5001, + /// + ///TCP打洞请求 下行 对应 Protobuf_TcpTunnel_DoTunnel | Protobuf_TcpTunnel_DoTunnel_RESP + /// + [pbr::OriginalName("CMD_TCPTUNNEL_DO")] CmdTcptunnelDo = 5002, } public enum ErrorCode { @@ -97,6 +106,10 @@ namespace AxibugProtobuf { ///成功 /// [pbr::OriginalName("ERROR_OK")] ErrorOk = 1, + /// + ///用户不存在 + /// + [pbr::OriginalName("ERROR_NOTFAND")] ErrorNotfand = 100, } public enum LoginType { diff --git a/ProtobufCore/out/ProtobufTcpTunnel.cs b/ProtobufCore/out/ProtobufTcpTunnel.cs new file mode 100644 index 0000000..3c26d84 --- /dev/null +++ b/ProtobufCore/out/ProtobufTcpTunnel.cs @@ -0,0 +1,920 @@ +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: protobuf_TcpTunnel.proto +// +#pragma warning disable 1591, 0612, 3021 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace AxibugProtobuf { + + /// Holder for reflection information generated from protobuf_TcpTunnel.proto + public static partial class ProtobufTcpTunnelReflection { + + #region Descriptor + /// File descriptor for protobuf_TcpTunnel.proto + public static pbr::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static ProtobufTcpTunnelReflection() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "Chhwcm90b2J1Zl9UY3BUdW5uZWwucHJvdG8SDkF4aWJ1Z1Byb3RvYnVmIisK", + "HFByb3RvYnVmX1RjcFR1bm5lbF9IZWxsVG9TZXYSCwoDVUlEGAEgASgDIiMK", + "IVByb3RvYnVmX1RjcFR1bm5lbF9IZWxsVG9TZXZfUkVTUCI9ChtQcm90b2J1", + "Zl9UY3BUdW5uZWxfRG9UdW5uZWwSCwoDVUlEGAEgASgDEhEKCXRhcmdldFVJ", + "RBgCIAEoAyJ3CiBQcm90b2J1Zl9UY3BUdW5uZWxfRG9UdW5uZWxfUkVTUBIR", + "Cgl0YXJnZXRVSUQYASABKAMSDAoEbXlJUBgCIAEoCRIOCgZteVBvcnQYAyAB", + "KAUSDwoHb3RoZXJJUBgEIAEoCRIRCglvdGhlclBvcnQYBSABKAVCAkgBYgZw", + "cm90bzM=")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { }, + new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_TcpTunnel_HellToSev), global::AxibugProtobuf.Protobuf_TcpTunnel_HellToSev.Parser, new[]{ "UID" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_TcpTunnel_HellToSev_RESP), global::AxibugProtobuf.Protobuf_TcpTunnel_HellToSev_RESP.Parser, null, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_TcpTunnel_DoTunnel), global::AxibugProtobuf.Protobuf_TcpTunnel_DoTunnel.Parser, new[]{ "UID", "TargetUID" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_TcpTunnel_DoTunnel_RESP), global::AxibugProtobuf.Protobuf_TcpTunnel_DoTunnel_RESP.Parser, new[]{ "TargetUID", "MyIP", "MyPort", "OtherIP", "OtherPort" }, null, null, null, null) + })); + } + #endregion + + } + #region Messages + /// + ///Tcp打洞请求 + /// + public sealed partial class Protobuf_TcpTunnel_HellToSev : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_TcpTunnel_HellToSev()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTcpTunnelReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_HellToSev() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_HellToSev(Protobuf_TcpTunnel_HellToSev other) : this() { + uID_ = other.uID_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_HellToSev Clone() { + return new Protobuf_TcpTunnel_HellToSev(this); + } + + /// Field number for the "UID" field. + public const int UIDFieldNumber = 1; + private long uID_; + /// + ///自己的UID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long UID { + get { return uID_; } + set { + uID_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_TcpTunnel_HellToSev); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_TcpTunnel_HellToSev other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UID != other.UID) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UID != 0L) hash ^= UID.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(UID); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_TcpTunnel_HellToSev other) { + if (other == null) { + return; + } + if (other.UID != 0L) { + UID = other.UID; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + } + #endif + + } + + /// + ///Tcp打洞请求 下行 + /// + public sealed partial class Protobuf_TcpTunnel_HellToSev_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_TcpTunnel_HellToSev_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTcpTunnelReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_HellToSev_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_HellToSev_RESP(Protobuf_TcpTunnel_HellToSev_RESP other) : this() { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_HellToSev_RESP Clone() { + return new Protobuf_TcpTunnel_HellToSev_RESP(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_TcpTunnel_HellToSev_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_TcpTunnel_HellToSev_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_TcpTunnel_HellToSev_RESP other) { + if (other == null) { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } + #endif + + } + + /// + ///Tcp打洞请求 + /// + public sealed partial class Protobuf_TcpTunnel_DoTunnel : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_TcpTunnel_DoTunnel()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTcpTunnelReflection.Descriptor.MessageTypes[2]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_DoTunnel() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_DoTunnel(Protobuf_TcpTunnel_DoTunnel other) : this() { + uID_ = other.uID_; + targetUID_ = other.targetUID_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_DoTunnel Clone() { + return new Protobuf_TcpTunnel_DoTunnel(this); + } + + /// Field number for the "UID" field. + public const int UIDFieldNumber = 1; + private long uID_; + /// + ///自己的UID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long UID { + get { return uID_; } + set { + uID_ = value; + } + } + + /// Field number for the "targetUID" field. + public const int TargetUIDFieldNumber = 2; + private long targetUID_; + /// + ///目标的UID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long TargetUID { + get { return targetUID_; } + set { + targetUID_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_TcpTunnel_DoTunnel); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_TcpTunnel_DoTunnel other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UID != other.UID) return false; + if (TargetUID != other.TargetUID) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UID != 0L) hash ^= UID.GetHashCode(); + if (TargetUID != 0L) hash ^= TargetUID.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (TargetUID != 0L) { + output.WriteRawTag(16); + output.WriteInt64(TargetUID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (TargetUID != 0L) { + output.WriteRawTag(16); + output.WriteInt64(TargetUID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(UID); + } + if (TargetUID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(TargetUID); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_TcpTunnel_DoTunnel other) { + if (other == null) { + return; + } + if (other.UID != 0L) { + UID = other.UID; + } + if (other.TargetUID != 0L) { + TargetUID = other.TargetUID; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + case 16: { + TargetUID = input.ReadInt64(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + case 16: { + TargetUID = input.ReadInt64(); + break; + } + } + } + } + #endif + + } + + /// + ///双方信息 下行 + /// + public sealed partial class Protobuf_TcpTunnel_DoTunnel_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_TcpTunnel_DoTunnel_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTcpTunnelReflection.Descriptor.MessageTypes[3]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_DoTunnel_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_DoTunnel_RESP(Protobuf_TcpTunnel_DoTunnel_RESP other) : this() { + targetUID_ = other.targetUID_; + myIP_ = other.myIP_; + myPort_ = other.myPort_; + otherIP_ = other.otherIP_; + otherPort_ = other.otherPort_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_TcpTunnel_DoTunnel_RESP Clone() { + return new Protobuf_TcpTunnel_DoTunnel_RESP(this); + } + + /// Field number for the "targetUID" field. + public const int TargetUIDFieldNumber = 1; + private long targetUID_; + /// + ///目标的UID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long TargetUID { + get { return targetUID_; } + set { + targetUID_ = value; + } + } + + /// Field number for the "myIP" field. + public const int MyIPFieldNumber = 2; + private string myIP_ = ""; + /// + ///自己的IP + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string MyIP { + get { return myIP_; } + set { + myIP_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "myPort" field. + public const int MyPortFieldNumber = 3; + private int myPort_; + /// + ///自己的Port + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int MyPort { + get { return myPort_; } + set { + myPort_ = value; + } + } + + /// Field number for the "otherIP" field. + public const int OtherIPFieldNumber = 4; + private string otherIP_ = ""; + /// + ///对方的IP + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string OtherIP { + get { return otherIP_; } + set { + otherIP_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "otherPort" field. + public const int OtherPortFieldNumber = 5; + private int otherPort_; + /// + ///对方的Port + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int OtherPort { + get { return otherPort_; } + set { + otherPort_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_TcpTunnel_DoTunnel_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_TcpTunnel_DoTunnel_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (TargetUID != other.TargetUID) return false; + if (MyIP != other.MyIP) return false; + if (MyPort != other.MyPort) return false; + if (OtherIP != other.OtherIP) return false; + if (OtherPort != other.OtherPort) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (TargetUID != 0L) hash ^= TargetUID.GetHashCode(); + if (MyIP.Length != 0) hash ^= MyIP.GetHashCode(); + if (MyPort != 0) hash ^= MyPort.GetHashCode(); + if (OtherIP.Length != 0) hash ^= OtherIP.GetHashCode(); + if (OtherPort != 0) hash ^= OtherPort.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (TargetUID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(TargetUID); + } + if (MyIP.Length != 0) { + output.WriteRawTag(18); + output.WriteString(MyIP); + } + if (MyPort != 0) { + output.WriteRawTag(24); + output.WriteInt32(MyPort); + } + if (OtherIP.Length != 0) { + output.WriteRawTag(34); + output.WriteString(OtherIP); + } + if (OtherPort != 0) { + output.WriteRawTag(40); + output.WriteInt32(OtherPort); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (TargetUID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(TargetUID); + } + if (MyIP.Length != 0) { + output.WriteRawTag(18); + output.WriteString(MyIP); + } + if (MyPort != 0) { + output.WriteRawTag(24); + output.WriteInt32(MyPort); + } + if (OtherIP.Length != 0) { + output.WriteRawTag(34); + output.WriteString(OtherIP); + } + if (OtherPort != 0) { + output.WriteRawTag(40); + output.WriteInt32(OtherPort); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (TargetUID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(TargetUID); + } + if (MyIP.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(MyIP); + } + if (MyPort != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(MyPort); + } + if (OtherIP.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(OtherIP); + } + if (OtherPort != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(OtherPort); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_TcpTunnel_DoTunnel_RESP other) { + if (other == null) { + return; + } + if (other.TargetUID != 0L) { + TargetUID = other.TargetUID; + } + if (other.MyIP.Length != 0) { + MyIP = other.MyIP; + } + if (other.MyPort != 0) { + MyPort = other.MyPort; + } + if (other.OtherIP.Length != 0) { + OtherIP = other.OtherIP; + } + if (other.OtherPort != 0) { + OtherPort = other.OtherPort; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + TargetUID = input.ReadInt64(); + break; + } + case 18: { + MyIP = input.ReadString(); + break; + } + case 24: { + MyPort = input.ReadInt32(); + break; + } + case 34: { + OtherIP = input.ReadString(); + break; + } + case 40: { + OtherPort = input.ReadInt32(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + TargetUID = input.ReadInt64(); + break; + } + case 18: { + MyIP = input.ReadString(); + break; + } + case 24: { + MyPort = input.ReadInt32(); + break; + } + case 34: { + OtherIP = input.ReadString(); + break; + } + case 40: { + OtherPort = input.ReadInt32(); + break; + } + } + } + } + #endif + + } + + #endregion + +} + +#endregion Designer generated code diff --git a/ProtobufCore/proto/protobuf_Auth.proto b/ProtobufCore/proto/protobuf_Auth.proto index 8eb9727..d9dda24 100644 --- a/ProtobufCore/proto/protobuf_Auth.proto +++ b/ProtobufCore/proto/protobuf_Auth.proto @@ -15,15 +15,15 @@ enum CommandID CMD_USER_LEAVE = 5032; //用户下线 下行 对应 Protobuf_UserOffline_RESP CMD_USER_STATE_UPDATE = 5033; //更新在线用户状态 下行 对应 Protobuf_UserState_RESP - //CMD_TUNNEL_UDPSERVER_INFO = 6000; //UDP服务器信息 上行 | 下行 对应 Protobuf_UDPServer_Info | Protobuf_UDPServer_Info_RESP - //CMD_TUNNEL_2Server_OK = 6001; //和服务器UDP建立连接 下行 对应 Protobuf_MakeTunnel_RESP - //CMD_TUNNEL_MAKE = 6002; //请求打洞 上行 | 下行 对应 Protobuf_MakeTunnel | Protobuf_MakeTunnel_RESP + CMD_TCPTUNNEL_HELLO = 5001; //TCP打洞请求 上行 | 下行 对应 Protobuf_TcpTunnel_HellToSev | Protobuf_TcpTunnel_HellToSev_RESP + CMD_TCPTUNNEL_DO = 5002; //TCP打洞请求 下行 对应 Protobuf_TcpTunnel_DoTunnel | Protobuf_TcpTunnel_DoTunnel_RESP } enum ErrorCode { ERROR_DEFAUL = 0;//缺省不使用 ERROR_OK = 1; //成功 + ERROR_NOTFIND = 100; //用户不存在 } enum LoginType diff --git a/ProtobufCore/proto/protobuf_TcpTunnel.proto b/ProtobufCore/proto/protobuf_TcpTunnel.proto new file mode 100644 index 0000000..bf0aff8 --- /dev/null +++ b/ProtobufCore/proto/protobuf_TcpTunnel.proto @@ -0,0 +1,32 @@ +syntax = "proto3"; +package AxibugProtobuf; +option optimize_for = SPEED; + +//Tcp打洞请求 +message Protobuf_TcpTunnel_HellToSev +{ + int64 UID = 1;//自己的UID +} + +//Tcp打洞请求 下行 +message Protobuf_TcpTunnel_HellToSev_RESP +{ +} + +//Tcp打洞请求 +message Protobuf_TcpTunnel_DoTunnel +{ + int64 UID = 1;//自己的UID + int64 targetUID = 2;//目标的UID +} + + +//双方信息 下行 +message Protobuf_TcpTunnel_DoTunnel_RESP +{ + int64 targetUID = 1;//目标的UID + string myIP = 2;//自己的IP + int32 myPort = 3;//自己的Port + string otherIP = 4;//对方的IP + int32 otherPort = 5;//对方的Port +} diff --git a/Server/Program.cs b/Server/Program.cs index 04c49ad..56b243f 100644 --- a/Server/Program.cs +++ b/Server/Program.cs @@ -1,6 +1,6 @@ using ServerCore.Manager; -ServerManager.InitServer(23846); +ServerManager.InitServer(23846, 23847); while (true) { diff --git a/ServerCore/Manager/ServerManager.cs b/ServerCore/Manager/ServerManager.cs index 2ef557b..a3183b6 100644 --- a/ServerCore/Manager/ServerManager.cs +++ b/ServerCore/Manager/ServerManager.cs @@ -11,19 +11,26 @@ namespace ServerCore.Manager public static LoginManager g_Login; public static ChatManager g_Chat; public static P2PUserManager g_P2PMgr; + public static TcpTunnelClientManager g_TcpTunnelMgr; public static IOCPNetWork g_SocketMgr; + public static IOCPNetWork g_SocketTcpTunnelMgr; - public static void InitServer(int port) + public static void InitServer(int port, int tcptunnelport) { g_ClientMgr = new ClientManager(); g_Log = new LogManager(); g_Login = new LoginManager(); g_Chat = new ChatManager(); g_P2PMgr = new P2PUserManager(); + g_TcpTunnelMgr = new TcpTunnelClientManager(); g_SocketMgr = new IOCPNetWork(1024, 1024); g_SocketMgr.Init(); - g_SocketMgr.Start(new IPEndPoint(IPAddress.Any.Address, port)); Console.WriteLine("监听:" + port); + g_SocketMgr.Start(new IPEndPoint(IPAddress.Any.Address, port)); + g_SocketTcpTunnelMgr = new IOCPNetWork(1024, 1024); + g_SocketTcpTunnelMgr.Init(); + g_SocketTcpTunnelMgr.Start(new IPEndPoint(IPAddress.Any.Address, tcptunnelport)); + Console.WriteLine("监听:" + tcptunnelport); Console.WriteLine("Succeed!"); } } diff --git a/ServerCore/Manager/TcpTunnelClientManager.cs b/ServerCore/Manager/TcpTunnelClientManager.cs new file mode 100644 index 0000000..7b97fbc --- /dev/null +++ b/ServerCore/Manager/TcpTunnelClientManager.cs @@ -0,0 +1,146 @@ +using AxibugProtobuf; +using ServerCore.Common; +using ServerCore.Event; +using ServerCore.NetWork; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; +using System.Timers; +using static System.Runtime.CompilerServices.RuntimeHelpers; +using static System.Runtime.InteropServices.JavaScript.JSType; + +namespace ServerCore.Manager +{ + public class TCPTunnelClientInfo + { + public long UID { get; set; } + public string IP { get; set; } + public int Port { get; set; } + public Socket _Socket { get; set; } + } + + + public class TcpTunnelClientManager + { + public TcpTunnelClientManager() + { + NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdTcptunnelHello, TcpTunnelHello); + NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdTcptunnelDo, TcptunnelDo); + } + + private Dictionary _DictUID2Client = new Dictionary(); + private Dictionary _DictScoket2Client = new Dictionary(); + + void AddClient(long UID,Socket _socket) + { + IPEndPoint ipEndPoint = (IPEndPoint)_socket.RemoteEndPoint; + if (!_DictUID2Client.ContainsKey(UID)) + { + TCPTunnelClientInfo cinfo = new TCPTunnelClientInfo() + { + UID = UID, + IP = ipEndPoint.Address.ToString(), + Port = ipEndPoint.Port, + _Socket = _socket + }; + _DictScoket2Client[_socket] = cinfo; + } + else + { + _DictUID2Client[UID].UID = UID; + _DictUID2Client[UID].IP = ipEndPoint.Address.ToString(); + _DictUID2Client[UID].Port = ipEndPoint.Port; + _DictUID2Client[UID]._Socket = _socket; + + _DictScoket2Client[_socket] = _DictUID2Client[UID]; + } + } + + void RemoveClient(long UID) + { + if (_DictUID2Client.ContainsKey(UID)) + { + _DictScoket2Client.Remove(_DictUID2Client[UID]._Socket); + _DictUID2Client.Remove(UID); + } + } + + void RemoveClientBySocket(Socket _socket) + { + if (_DictScoket2Client.ContainsKey(_socket)) + { + _DictUID2Client.Remove(_DictScoket2Client[_socket].UID); + _DictScoket2Client.Remove(_socket); + } + } + + TCPTunnelClientInfo GetClient(long UID) + { + if (_DictUID2Client.ContainsKey(UID)) + { + return _DictUID2Client[UID]; + } + else + return null; + } + + public void TcpTunnelHello(Socket _socket, byte[] reqData) + { + ServerManager.g_Log.Debug("收到TcpTunnel 打洞端口Hello"); + Protobuf_TcpTunnel_HellToSev msg = ProtoBufHelper.DeSerizlize(reqData); + AddClient(msg.UID, _socket); + Protobuf_TcpTunnel_HellToSev_RESP resp = new Protobuf_TcpTunnel_HellToSev_RESP(); + ClientSend(msg.UID, (int)CommandID.CmdTcptunnelHello, (int)ErrorCode.ErrorOk, ProtoBufHelper.Serizlize(resp)); + } + + public void TcptunnelDo(Socket _socket, byte[] reqData) + { + ServerManager.g_Log.Debug("收到TcpTunnel 打洞端口Hello"); + Protobuf_TcpTunnel_DoTunnel msg = ProtoBufHelper.DeSerizlize(reqData); + TCPTunnelClientInfo Other = GetClient(msg.TargetUID); + if (Other == null) + { + Protobuf_TcpTunnel_DoTunnel_RESP respToErr = new Protobuf_TcpTunnel_DoTunnel_RESP(); + ClientSend(msg.UID, (int)CommandID.CmdTcptunnelDo, (int)ErrorCode.ErrorNotfand, ProtoBufHelper.Serizlize(respToErr)); + return; + } + + TCPTunnelClientInfo mine = GetClient(msg.UID); + Protobuf_TcpTunnel_DoTunnel_RESP respToMine = new Protobuf_TcpTunnel_DoTunnel_RESP() + { + MyIP = mine.IP, + MyPort = mine.Port, + OtherIP = Other.IP, + OtherPort= Other.Port, + TargetUID = msg.TargetUID, + }; + ClientSend(msg.UID, (int)CommandID.CmdTcptunnelHello, (int)ErrorCode.ErrorOk, ProtoBufHelper.Serizlize(respToMine)); + + + Protobuf_TcpTunnel_DoTunnel_RESP respToOther = new Protobuf_TcpTunnel_DoTunnel_RESP() + { + MyIP = Other.IP, + MyPort = Other.Port, + OtherIP = mine.IP, + OtherPort = mine.Port, + TargetUID = msg.UID, + }; + ClientSend(msg.TargetUID, (int)CommandID.CmdTcptunnelHello, (int)ErrorCode.ErrorOk, ProtoBufHelper.Serizlize(respToOther)); + } + + /// + /// 错误 + /// + /// + /// + /// + /// + public void ClientSend(long UID, int CMDID, int ERRCODE, byte[] data) + { + if (_DictUID2Client.ContainsKey(UID)) + { + ServerManager.g_SocketTcpTunnelMgr.SendToSocket(_DictUID2Client[UID]._Socket, CMDID, ERRCODE, data); + } + } + } +} diff --git a/ServerCore/NetWork/IOCPNetWork.cs b/ServerCore/NetWork/IOCPNetWork.cs index ad84594..be41f65 100644 --- a/ServerCore/NetWork/IOCPNetWork.cs +++ b/ServerCore/NetWork/IOCPNetWork.cs @@ -60,19 +60,11 @@ namespace ServerCore.NetWork /// /// public override void OnClose(AsyncUserToken token) - { - OnCloseToOld(token.Socket); - } - - /// - /// 断开连接 - /// - /// - public void OnCloseToOld(Socket sk) { Console.WriteLine("断开连接"); - ServerManager.g_ClientMgr.SetClientOfflineForSocket(sk); + //TODO 要删除不同的 + ServerManager.g_ClientMgr.SetClientOfflineForSocket(token.Socket); + s } - } }