From 2ab8f84b955f46840df5f8f48e4f9c1993828129 Mon Sep 17 00:00:00 2001 From: xuchi Date: Sat, 18 Mar 2023 10:02:29 +0800 Subject: [PATCH] =?UTF-8?q?windows=E7=B3=BB=E7=BB=9F=E6=94=AF=E6=8C=81ipv6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine2.0/Depends/include/TcpServer.hpp | 15 +++++++++----- engine2.0/engine2.0/Doc/Record.txt | 9 ++++++++- .../engine2.0/EasyServer/EasyServer.vcxproj | 1 + .../EasyServer/EasyServer.vcxproj.filters | 3 +++ engine2.0/engine2.0/EasyServer/server.cpp | 19 ++++++++++++------ engine2.0/engine2.0/engine2.0.sdf | Bin 36241408 -> 36241408 bytes engine2.0/engine2.0/engine2.0.v12.suo | Bin 45056 -> 52224 bytes 7 files changed, 35 insertions(+), 12 deletions(-) diff --git a/engine2.0/engine2.0/Depends/include/TcpServer.hpp b/engine2.0/engine2.0/Depends/include/TcpServer.hpp index 3488e3f..774c064 100644 --- a/engine2.0/engine2.0/Depends/include/TcpServer.hpp +++ b/engine2.0/engine2.0/Depends/include/TcpServer.hpp @@ -193,15 +193,18 @@ namespace doyou { } else { + NetWork::make_reuseaddr(cSock); // 处理程序关闭及时释放socket资源,可立即重用 //CELLLog_Info("accept cSock<%d>", cSock); // 客户端链接上限校验 if (_clientAccept < _nMaxClient) { _clientAccept++; // 连接的新客户端被分配给Server,计数+1 - NetWork::make_reuseaddr(cSock); // 将新客户端分配给客户数量最少的cellServer addClientToCELLServer(new Client(cSock, _nSendBuffSize, _nRecvBuffSize)); - // 获取IP地址 inet_ntoa(clientAddr.sin_addr) + // 获取IP地址, 从para2中获取IPV6地址,存储到para3 + char strIp[64] = {}; + inet_ntop(AF_INET6, &clientAddr.sin6_addr, strIp, 64); + printf("Accept_Ipv6 : %s\n", strIp); // tmplog } else { // 获取IP地址 inet_ntoa(clientAddr.sin_addr) @@ -221,7 +224,7 @@ namespace doyou { // 接受客户端连接-ipv4 SOCKET Accept_Ipv4() { - sockaddr_in clientAddr = {}; + sockaddr_in clientAddr = {}; // 存储新连接客户端信息结构体对象 int nAddrLen = sizeof(sockaddr_in); SOCKET cSock = INVALID_SOCKET; #ifdef _WIN32 @@ -237,15 +240,17 @@ namespace doyou { } else { + NetWork::make_reuseaddr(cSock); //CELLLog_Info("accept cSock<%d>", cSock); // 客户端链接上限校验 if (_clientAccept < _nMaxClient) { _clientAccept++; // 连接的新客户端被分配给Server,计数+1 - NetWork::make_reuseaddr(cSock); // 将新客户端分配给客户数量最少的cellServer addClientToCELLServer(new Client(cSock, _nSendBuffSize, _nRecvBuffSize)); - // 获取IP地址 inet_ntoa(clientAddr.sin_addr) + // 获取IP地址 + char* strIp = inet_ntoa(clientAddr.sin_addr); + printf("Accept_Ipv4 : %s \n", strIp); // tmplog } else { // 获取IP地址 inet_ntoa(clientAddr.sin_addr) diff --git a/engine2.0/engine2.0/Doc/Record.txt b/engine2.0/engine2.0/Doc/Record.txt index 9bb412d..93a83c4 100644 --- a/engine2.0/engine2.0/Doc/Record.txt +++ b/engine2.0/engine2.0/Doc/Record.txt @@ -1,7 +1,7 @@ // 高性能网络通信服务器2.0关键技术点总结DOC // 开始时间[2023-3-8 to 至今] -// 欲速则不达 +// 欲速则不达 qzfull 工欲善其事必先利其器 // 请按照规范进行标准注释 1.消息缓冲区设置大小应该依据消息size来加以考虑。 @@ -13,7 +13,14 @@ 4.新写函数不能识别,可能是没有添加头文件,可以F1按键,跳转到MSDN进行查看。 5.服务端和客户端要么同时用ipv4, 要么同时用ipv6, 混搭是不行的,比如ipv4客户端是不能链接ipv6服务端。 +总之,客户端和服务端采用的ip协议版本必须保持一致,才能正常进行网络通信。 6.编码建议:函数太长了就要封装更小的函数,以避免代码冗余。建议函数上限30行。 +7.理论上讲,服务器每接收一个新的客户端连接,都应该把对应ip地址信息,存储在对应的客户端对象中, +并对Ip地址进行安全性分析,采用白名单或黑名单等,去除恶意IP. + +8.代码有相同的部分,可以封装成独立函数调用,以避免代码冗余。 + + diff --git a/engine2.0/engine2.0/EasyServer/EasyServer.vcxproj b/engine2.0/engine2.0/EasyServer/EasyServer.vcxproj index 113b7f4..29a0e33 100644 --- a/engine2.0/engine2.0/EasyServer/EasyServer.vcxproj +++ b/engine2.0/engine2.0/EasyServer/EasyServer.vcxproj @@ -77,6 +77,7 @@ + diff --git a/engine2.0/engine2.0/EasyServer/EasyServer.vcxproj.filters b/engine2.0/engine2.0/EasyServer/EasyServer.vcxproj.filters index 3c77bcd..21b4913 100644 --- a/engine2.0/engine2.0/EasyServer/EasyServer.vcxproj.filters +++ b/engine2.0/engine2.0/EasyServer/EasyServer.vcxproj.filters @@ -23,5 +23,8 @@ 头文件 + + 头文件 + \ No newline at end of file diff --git a/engine2.0/engine2.0/EasyServer/server.cpp b/engine2.0/engine2.0/EasyServer/server.cpp index ee3ff0e..947896c 100644 --- a/engine2.0/engine2.0/EasyServer/server.cpp +++ b/engine2.0/engine2.0/EasyServer/server.cpp @@ -1,9 +1,9 @@ // ܷɲõͨģѡһselect/epoll/iocp/ -//#include "TcpSelectServer.hpp" // using select, both linux and windows. +#include "TcpSelectServer.hpp" // using select, both linux and windows. //#include "TcpEpollServer.hpp" // using epoll, only linux. -#include "TcpIocpServer.hpp" // using iocp, only windows. +//#include "TcpIocpServer.hpp" // using iocp, only windows. #include "MsgStream.hpp" #include "Config.hpp" @@ -11,7 +11,7 @@ using namespace doyou::io; // ʹƿռ // ʹ÷ģ(ѡһ)1-TcpSelectServer 2-TcpEpollServer 3-TcpIocpServer -class MyServer : public TcpIocpServer +class MyServer : public TcpSelectServer { public: MyServer() @@ -168,9 +168,10 @@ int argToInt(int argc, char* args[], int index, int def, const char* argName) return def; } +// ͨmainķʽȡϢ int main(int argc, char* args[]) { - //־ + // ־ Log::Instance().setLogPath("serverLog", "w", false); Config::Instance().Init(argc, args); @@ -188,8 +189,14 @@ int main(int argc, char* args[]) strIP = nullptr; } - MyServer server; - server.InitSocket(); + MyServer server; // ջռʵ + if (Config::Instance().hasKey("-ipv6")) { + server.InitSocket(AF_INET6); + } + else { + server.InitSocket(); + } + server.Bind(strIP, nPort); //server.Bind(strIP, nPort); // ͬһʱܼͻ߷ӿͻ˵Ч diff --git a/engine2.0/engine2.0/engine2.0.sdf b/engine2.0/engine2.0/engine2.0.sdf index a733de6351f1d3846042c1330b6255e1cb37f589..8a764ba1847bb98ab2c87294de7d8ebf7070a842 100644 GIT binary patch delta 8146 zcmZ{p3wRS%`v1>+lBS)Owh6tawKVCKt0bZnq|gcXdmFATls2*4p)ge`D3>N&P6daO zP+>$ald@VD7HSGB!BtGUt`}4wb=NycD!O7&(^p9*ppzs1p&{h&J}1y`Rj}Sy9YGtTIZNQ`rF+yiQtjik z^v8JaU)eSNGcnTcMy}*mBz>-@?Dt5GChO#gGi8*#d)#Tgt~&md^&=IY$q~)7l;>tN z?mKG4U?2K85BwOD}uQ+%oWL8QOw0L zS2T0QFjo)eie;|2W>>t6`@80;L1WcC*&%VA^g1mVELr2<9jF9Wzz+A1R>Epb4uc~0D@2%r`--23qZutj3--~$@qFF%C z0%ks>EfRMSrU$1pYIc@^)A{hXt3y4*=NA^Cluq;M`C+*#Nb%h_ zYFN9*r=2)#k}6SdIuP7X_M7(E_PU<2Jkzzuu%|?__m4^duVnp>>LcB*z>dxagVa8J zd`f(1t8=UOiBP?^zKzu|k7V9|I3>d7)Hz$_9rN@wSAOVBDi!JimG(+qWm`q(Jomgn zdFNci-1a$SPHUOH%vEYB?U=2d-8QRcmT^|e%&r-R870#l)4bMDiMFJzxTe@x+&@>nRJg?h74pXN|s*MR1wU8Tpd6FWb>s}pUrXiw~UWgFm`L2vdxAt2r7 z$jkQ4apWC~fWdkB~%#Xnho(V00gNmPE{n2Xeoz8$$NHse-Px>t23ZTe)ZKd zh?e_aTLpvhm^1Spip7ezfJUy}@d}va4c82mmjf>(gIWr{usc!y?BW$LM7BW<7@@ts zyRIM79~pq$iws0eh#9#L8HC)AJb(;F3VhvlLsVL>PuW|akIb}@gMQ9oREDN!2=feO zo(G#f!@S(Zsr7#vgWfDZ=Tf}Qwn76J?_K!i^F|w)c8bfQevK+BI75C%lSMPYE#JWX z2f+CQky&&y_CBISnNSyV3#+cEJ0Oe?==(j0PqY zF@a}-g$W~>Fp3GInJ|V4W0^3H3FDbCfe90vg-P1zP5Zu^@p%qUwp{c@yM}yEV_%yR zI5e#6V~E2hHI3J5Gkm=phr9^fq23?7Sb)bPrJDUijEy~3@AmEAHKYpD)TCzDWInoh z>iGjvxjgZxe9?}=-jVUq7(lI@IGI?e;kzTGZ)B`WQ zUtc&YjSvHlSmFRRF%lBRs|gUG1P}Pe{B&s!1uA)dxpWU`rBlCL8Vv~&y?$v8L`iF} zU&@bi5TZ>q@zK)Z>zD4wh!>Szs+4%+(nK&yl{YTwf%+c1aj9O#LX%l&3JXnTp<)&) zVIeCEO=F?yEHs0KX0p&M7MjgMr7Tp&LUUMXE(?{j&^#8ZV4+GDvayi8IrNZ=i?7|4 z5tC~pW*-;49H-GlxU4iPL(2N#@&Og+Df6B9;PS`n=$@h3l;gO7PmtPUY7?Y?op~@z z`f8aqSql8glqGGPT-#SFIp0?;9TO|Eq=(9@=F6e-nb1?}Tz4`trEOE^#-@!yr_*V6 zb~xM)i=(TqsV*ql*XI`j=Azh$Oljx#alIm(OT9}%KIetYb(A@(m}5S3EMSg>%&~|$ z7Bj~Z=2*%c%a~(1b5t|O3g%eJ90GIHG&>#+=}(Mr*%FIa(i*8(Zr9B%Fq@wB=|kPi zG`?;B>>d~)b$;8ekzV??`%rr4arbfa@%Cdi$8^V9Tdl2KUbolmwY>l@G)e0VDX=D-L}gv{r1Y9q4J0eI^a3j(6rvNzGIzMa$e~_Tva1@d~MqY z#)B`oqSl0u?juZilnJYtP|JkXOjyH&$C&Uq6V@_e9TV0wVFMHDnBZW7lL;G}g-ssr z((tY=I=qIl_-4r&ruI$PoO2SC`{2JYGn+o3mRF?#)XO$hi~k1d5Wt7TTwXP|Py5cA zow}W^ZmYY?<#t(IT|3-6%sV<7oDIf?w(T|Bb=zA-s|aGN)G>T~rZoDBIZfZ@tWh$% z!|nh_Q=PRA>Y6rKH{f+i<^eP}#=Y9Ix}(-vYp(5(t@Gk(hGaWBDJsIf(!8=ma!!%c zr&yMDEO9O|FX>q9UTj(1wWw*4Wl_gM_d@f+_60QybPL+%*UUH0Z?AGznXB3#s(DEF zP@COu*V$WbR$Eu4yV6qGRpG7(%!Nm-2X4uILjm+>AGwfo9-OUC`n9t};E z4XtaAr16?aDn~?8^OqXhrjDdmq(c=+AO5$7a*Y~#@L>%dx>G~Xv}rJr5gk-?Y3OAk zl0F{91D;6Ac!}{(Gky=_pJDu7#_wbNe#ReQyv%qHr(2f)B!b_L~nv zy4t4NX!}&MyjGa#>lY~Oic@ktNQRY#hMU&tm4&ac&^yhccLRyf{Y{*Vb8b>oeY3Vn zZBY9Xy`Ln;-z?kzTHeiCa>>eXptT;nXOOeVIV6a*Bkv)9NB)7lk9>f9hN3pqIDxX{~I>A3Jkgm!sw&YihPb#RVvD7!E*B309wN4c;lhDwp3 z&*3xqoIO-B;7GC_JqD|E<|^AmE_=Y%S!t*&sc_8mN?liK%wUssy~<#KR1!C;Cxm3{ zh*xpc+2oFjI>?Y*6`?FV*uFta`$?wEszmA0ix01nLdA2Uz$Q5>$L321uFx zrAJpxQ;anRVp^qhFYHdbIf;q7HHjhhzgB*Ne2Sb$E+C&F7m*Osfqaf!LcT!0ME;3f zj!}_{ypyMD?yG_-*d!0=rve)|{SCN(Sj~j5nD8|dzG1?*O!$ro zSD0{>3D=m=$%HN@{EG?yX2SPO_<;%kVZx70_=yQWGvOB|TxY@!CUi65S0?jH5rM@5yg%rgCu_ExeVFWnM%{;^^271W5b0eqUwlZ>&aNzi=OgC<%nWy$s)N6J#!P*g*|ns zF+{PoWSwmGX1s7pLt+PJHZ|!HE}+;+q=U$^RUmbodBEhsdxJlTg+tj+zy0OdY z#z|wlR8;*rrTn6a1XMnHdUT-4E ze8UxJkOCDs_r^F2yn{mzXdmG37vv?CMv%l*5cMFYftU{BJs@U)*bBr=5Dg$2LCk_9 z*}&^d-xxG*opNtp&ItGSZSnf`S}lAN)dS~{w@#UsNyblqNyX2tH4#2}s>==yCD}+0 zk_#;*d0^nyez~o{ky}EB_&IGde$O>H^00sMk={rjh=1hTrqi3Sz=N~H?cKFP(%|X~ z4X%Dje`El1FSNJ@f{8o-&C;(nW1T`j$16cwf&;k;bZeQYzQ|F_ZT7FThfN z=us!}Pj^X866|i>)z#S4Xl;bX)}8j9?QW;r?6U9B?PzOg-|pPrB|4vM-`26UW=qW` zqqC!~V_nl@<~8nGORaU4?&0+sfL&Y|x6$$i2=`+$;ue4nn~eVcmg@@?5B1IY;LJ<08f=7f%(Zmla;7vqRB zN40ALYA>}@9nP&91QWh(%*cJnAmo1J0c0>zfDA!~A`c?NkV0fQG6E?=c*KH?L`ET_ zkuk_ve1naH5Vu}`@ijO0cbkt3bdTgD>*;QTwEA>+HB?Izp)S2$(w81tW8f+7w#WoSV zDWyH$`^!`K&eSR|CEQGE%-jyM{OOQ9+E0$XnoIAILm#by2zlI6IG>wF#^DHkm_ z!ASXNlb(Jq`xP(uATFFL8_3q5=RiW7vN-wEbEUTrT0UF@sa*5#zt4s8X=*rFl$89J zPxNvT#*LC+>lY7+yUv!!-CD}5h>$$j@@x%;Nzh=Jj7&kMBE?7vVnwDQ(~%j-Ok@@^ z8!1J~kU7X)q#Rld^T3mmmrJE*@RH|VxH%m0yTcmo+2v31YT@}P_)PX=(jCKvS414Y zJy<5U4@;uSlB4Zvl30$vEfu)mvm7n0Ns$vi($hyVO|Qkh z9+KoIa9@~uCu7pG2eIATdOH>USzTAs(7D~UJs{SIo+m9&c5O3kYunoSgyD&jdI$4v z32oMH<~Io&Jr+3D_8}`O5@6s6bB*b%iPNXOYKWt_|aUY+74uWvIeg;hh)qFZoPQCG5w=$P#2JvJ6>{R3j^pl?curgEh#**x!$UP2c~G zsO|f(zo*@L@^5$eGQU2gr)5;u{+vt4%U8aRqw#U2*waxvZ@n3b|JTp;^aoYH|LW@7 zPPqO4G)CRk`Lbno9wcPqi{^HwFRl6C8ibR3Ue?o}GVi>#Xz6qRTM9De=&$rNGxN^t zjFvY4pHg{pA1w9c@c+8G|EE+qhmhY-S^0@~|Mz0P__w>qDF1@&q2oGt3T}tX)zE}% z73L=`+pJsL>qA>QH<686hhc+h9shXA8e6UKsN-Rm;922a9$0Ew(zeL5ux-Ajs?FYR zvsT(GI?B7`W!LnySmo~9B%eC>I*e-IAB6^f6;g|=h8BJexb*thj?a+s=G6Yr&B^xb zO=+|;Lf-H|8qH0((@_L6!}rJ_^DkrP#NN3z1dMVe9y7>Suujok-G&pNJH11~`4n!Y zQ#D?5fod>5bR|`ehrIR>K63o6^^lr*x_NEoHRZNu^)_{<5y>!UOM={&{buEOSuyjnYD?Ber_5qEF{(hZvU}lVTF27MDb-r21 z$)%V)abXTk|E7a_dVos&*~0n$BNe%HChP#)V~RYk$XZ3#DY9OX4T{t$;!wn?$VNpr zDY99SEs8Kj>J@oHk*(kd+cx;^9QWS)Ki5SP1G#dF)4|uObXOr^nWR3`@e^##B-=8* zKjFlNY|pe65r3>&2iaPb!*g>?GIp5#W)l4QC#i>x$~6uQPp)*AU#y2VI#8Ut5} zCV@OT%EO~|pryM~ z{KaUrMl|qG;v*>{+mQxj2jW89$WEjYc?#Ku>_#vT@lWF;ya$3@cSL8l20JvykN-Hq zMW73*{~Nm=J_EX(`roe7LoeW}X~|fUl16;~uK9Y%S4VGEd0v9O>Ev~lKWm8|N;N7+ zA(7Xw)WfC*!!!5>+Y27ma@X;+r781>$KC-v;p=5Z?vy42WkzJO^SB#C8zh z1M%-5{sYAKLHq#34?+A0#E(Jz1jJ84JP+ap5I+O)B8VXnJ3#y##7iK40pgb+{u9K@ zAbthn*C2ia;qK>Qbo{|51U5PtyiKOp`HB95h>LHq^8>mc3$ zu^Yr+LHrG#pdwI_Qc*=kH5DVMsG(vc6{D!gQ8Ai|F;wh9#aJrFQ8Av1S}N+O*prG0 zR7|8|5*3rFm_o%=D(b12M#Xe0-b2L-p9LYl1Vz}OhS&yIYUm4goG>H>2Tj9+&4W5H>e%F70m>-Kq$gQ#8$4J zAO^W&!m*?7$|N3$a+s*=tvgwdWmS&2DC&Z~zh8o(-sjzCpLgFseBOcYr|VNS-Ccd8 zYf=-JYp>M>k*A)SGFgIGdbONJm8gc?w@Lo+ZIZO1k0ebDlBBNCHt*5FQsLc_loT}> z-`ZXtYwBoQ49lXe`7|zY!vu?TLC-H6pIEI<{QvQP$T~}{g*1j-sR(UJ4ak#j8+A0K zcnz_QnM0+~kR!8c`vIj9Nm6c;q>D!%nDM?T?tfHA5h+QMjLYABNNm5`k;zdk;jkk> zmFDQOha?iWH^W0dj+9FydtW&ds7eW5SuE8d#e*OJ|@JXx1Jpoqtmd! zF2re6hW~}w2DW%AJ^7wiquQw1U9!7oSIMrLoh3WT&XOHuN6B`wz2Pb6Qw>j&Crk92 zC)&0ZZ7X@4JYKXl?=ibx{z+zPOw%T^sbr)5(aY-_nfnp-;k<{WbqJtutJAkyeE?EQezo3ofhOvW5vDE#eikln z$ck>8P&A=>e9`!}aW&&g#*uLiW1TwrH9JP{>KkGYt{&Dpw0daKP~A1zlrXKSpuE6Q z(9)muZ|>{q)6%;&-Y3wPxGkM_3nqS@T-v(K&?ZN~g?9U{?@Fg8%KVwkpT+#y%-^ln-`y==+O%c4 zNwQ0y`{c$%x}F;Dw^PX;U+-5E>A5iG>cLz+nJb66a+#|abLBBtK6CYEu0G7wm$~{e zSAXUzsC5mnggmAmf9S92inRX|Z-}e*odDz0fHe9~?+1@e$PQti0n9Uyc?Q*b2G_^! zc>bX==ir^2-i&WQh@1dFSth;WjdMTUFHHZ)G9mh3-CRRy)VKP=g{BvEyAkNGRfpK+ zQ~!7%IXFX+dc(b)Mz2Q3EsTA0`F5!I?&FR-H#MNRS73dyFRtD~EP?v0irU|ANUT=J zcG>f|nZCc(OxLJpy1O)pN-i^Ho*~RLwAM4MQPy4ttWO^5Z|6KdTP6*=wI=>r~$ zSEUHAtd4z8P9vTjV#gx2V?i6wd+Extc{G?po7pp*dIzl@d(y=G z6PbS!^G{~}Da>EY{3XmkmHDSJ|8(Y`!Td9se-`u4X8t+MKbQIEG5>t#U%>nenST-U ztIY4L^_RNkBH6U}FpLH#j>|CgGgldNEoQDI%(axcmND0I=32pAE17E*bFF5sTbS!s z=DLl!H0CO=b*=HsNA_L+X^*T*RmbHlJUO>B?GC2h$+Wweb~n@RVcNY+yN_x2Gi@!? z9$?yoOsim;i)ociTUV<+AATnr2RzY;Wq3KGy5aV&X|2Yvu|MbN11&ivu|Q{ z&g`3+y^7hlFuR-CtC{^VX5Y%}k2Cu=W`CmAu3O}krZ<}9FnBO~<@#*cn4&Y~Nv1r- zlIOgY4q!%V4T z%5zMqXG#N8jxgmYQ;sp^I8*+>6faYrXUYpqd66l9WXhkI@)A={FvZ7|My50|RVX-+pPW_R{t)m|1+z9kJZ1=>OZKh|Ii~JPxWnm%%V!YymE6coF(-mrhd%S zPnh~CQ$J(sUzqA=YAaL!%GA%9`UO+JWa?K;{hMvY#DP7SRh4{sAvd3G+9)y!2EP0P zb57{x>2y?i1dRxRe~yR;Bc3883O<0PG)|HN#kweXd0%}Z|K|XsWqlMGXS}^JicIu| z?aZHU%C)}HbV@t!I8t(0t8J-Kc9uU`y{&0$`4%g8uCH9D-QRSVR9>?>e?|Q==Q8V3 zy~@a6!?g2E`#aOVX4*GQ`<7`Jn0AqAmzZ{$X>CmVj%oj3+7+gK&$J(yc9m&AGVLd( z{mis~GVL1Et~2cyrv186BUKuKP>2Z<011ScNu3r%>gDX9@O5UB91@|IAKIAY-TTDwerCOO*YIK9%ES9TJA2t)4!%zBU;I=)>S$;hTl&E0 zm8LufzZ(g!r9PXINP7f_&2rCzCn2`b*~X;vHX2v)oBr5QfR^71*Qsl2=es+b&7IA& zg^m66TP^vm@ZNF{+@?47)!E#+@%QF*tR20sJ$+3ssOQF$W&M62GKJF-ty>#^!%MaSBXI*zs+Ax9b-oDI5XUSMoo)1mT1 zH3v%$l7l4&$bp9a&ixI~w(hIe^OLqjhgCma^mN;vqCIUjMK!wR%v-VH9l!My?P%Lx zv%SS@%^7itR=K;ADt8Y^Pe=|Vm(;m?k-WHp_xJC)A4c?kpLTRKFF=xRY4#fhcVy8X zhPt+f1p6%ISv23|i|B5ni2+9ao;Vt4oIQ>$8}G@Y@c~B4Cz*7(QFtbr1{(!G$55N0 zwwK>|AdAj4PCz-_*R45=K0`XTXy6uOeG|_`(*cA^7UR}lk>tL*=3c}dw|>jey$7&E z{{P;gC%=Ub`OdXu(R)MnvtMQg8|L$uh)utU#h8mB)TT#%1;uXuOJtC-$~u7z_kH$x z7ClT1Tq&h}Z)4IoihIEul3u$An6qg_^r^RKG?|Wzo4Xv_IAXWB>kV%lqkSUO2NC{*rWEx~T zWCmm=WENyLWDaC5WFBNbsk1L2o(k`%1+F@HWK~p>j{69Cc`ofgb#D7KPpo}z=QG0` z2O`HKY={IzA|eTqj7UMGBJ2nUqAMZ|k&ehfWFoTcMnV5XT0vyP2TKE%%L+P{kpnuG z-W$tB13NruP{;DQ8_QXP6KU^?5(Tz46)_Dl9Wetj6EO=h8!-nl7cmbp9{>-$_Lq49 z)+|IULZ}EQq7+evSd3VLSc+JNSPrO=S731^VijUFLQ(+)K@lcI03r}!Mg$>(5i%kK z5sC;ygd-vlk$}#QTCm27h(biGb1SIa1&c9=SVSBm9$`ZyAQBNth-5?xA{AjrI1pVC zX^3=01|k!Yg~ Lv%;0nj5K|G; z5YrJe5Hk_85VH|;5OWdp5cAv5{{k#7L@Yw62q&TxQHEHISb|uJScX`RSb(5i%kK5sC;ygd-vl zkq8UIiiko)Bf5C-{Kr7Cv!}6GABTuX*boVbL_`uI8IgiWMc5GzL{~%_A{~)|$V6lz zvJu@7-4Q(yE-9kp3Es}UKlqLEPaU)eap}&r>4ikni^BR88V@FglU!Y$-!sZMk+hS< z>&-(=+3+4~?*3%Gd9AIhF)aKl2{ZVGBcw0X*X+u{bxRhN7aG6ZQU@*99w;Ku>h2Q* zbA6uA;;BlinioJ8LKZ>Losd#U8DueJ31lg$YhFe!SBx)w`?Kd@qI#bVPEQI?9bOqAuKtPo|TD62$SEl7n~vdp{L1tJO+#Ux6AD1oAwMF|om zSQPm;!Rv1h`OQ#5MF|rnT$Bh=B1N%?VihGyl<0P8zyDybUBspsQDQ}j6D3|0n@?RL`fGVLzGNWDzZe&7Nwgg-9_mkN>5R8M9CGU zmneCi0_WeH-)SJdMd>3-Us3vr(qEJUQ3i-IP?SL((sBLGgTM;Nc;6Smx@hgqAV6=i6~1&StiPI zQC5huQj}FFo#W4Hu}QLv&ty@kC?-(?LY zC>Bwyg3K^S31*HKrHd#rqQr_4CrW&~7>;+7Y0v-lq*R9Y*2(V2;6v$h$O_0x$STNc z$SsgtA-6%`8-nI?$Qt}JOFtR zQUP&6Dk1A24?!M=JOW{m^^gsaM@gN!ku=NiHSO>gCaKa%uWTv9le!5`CWmZ>R6({t z+>mMrTs37YPlJvSX1 zWUuVUhUOh`U3WruL3Tq7hzC*w*#mhRvKR6Uq!zLd@+@RO{N+#~hG zF6)k$)*VSvrGD@&@@?>iP6Odb2tP{rF~W}%{s+Rngg;OC3xvN&_#X-X6X7oreu8ix z;f;hh5&kmauMqw!;ja;XlJM6FKSlT(guhAnX~NGCewOfagug|2GvO_SzfJf%guhGp zp9z1D@b?M-fbb6q|A_F93IBxfPYM5w@V^l5C%l#LzY_jA;a?E`CE;HY{x`zU6aII? zzb5<}!oMZ_0^t`4zeM{1XP@YM77UkLWzW_dka9{uc diff --git a/engine2.0/engine2.0/engine2.0.v12.suo b/engine2.0/engine2.0/engine2.0.v12.suo index 6ba521c9e0488a50fede6c8e80c9cae9963e7007..1d80e5480eb34bc755957fe0a4f25959f935ed8e 100644 GIT binary patch delta 3021 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