From 86c38fbc84675e008f414f41087cb55a04fed4cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <1@72wo.cn> Date: Sat, 5 Jul 2025 22:32:44 +0800 Subject: [PATCH] =?UTF-8?q?refactor(login):=20=E4=BF=AE=E6=94=B9=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E6=9C=8D=E5=8A=A1=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改端口配置:将 .vscode/launch.json 中的端口从 27777 改为 27000 - 优化会话管理:更新 session 包中的 GetSession 和 SaveSession 函数,使用新的 sessionprx 变量 - 调整登录逻辑:修改 login 控制器中的 Login 函数,优化会话验证流程 - 扩展服务器信息结构:在 CommendSvrInfo 结构中添加好友和黑名单信息字段 - 修复 GetSessionId 函数:改进错误处理,确保返回值的一致性 - 更新服务器配置:修改 ServerR.xml 中的 EmailLogin URL 为本地地址 - 其他 minor changes:删除了一些不必要的注释和打印语句 --- .vscode/launch.json | 2 +- common/data/session/session.go | 9 +++++---- logic/controller/login.go | 2 +- logic/service/login/CommendSvrInfo.go | 19 +++++++++++++++++-- logic/service/login/LoginSidInfo.go | 8 ++++---- login/main.go | 5 +---- modules/blazing/controller/admin/login.go | 6 +++++- modules/blazing/service/login.go | 6 +++--- public/config/ServerR.xml | 2 +- public/login/Login.swf | Bin 536673 -> 536701 bytes 10 files changed, 38 insertions(+), 21 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index f4adc5762..ee8175dc4 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -19,7 +19,7 @@ "request": "launch", "mode": "auto", "cwd": "${workspaceFolder}", - "args": ["-port=27777"], + "args": ["-port=27000"], "program": "${workspaceFolder}/logic" } diff --git a/common/data/session/session.go b/common/data/session/session.go index caace8751..82fe700b7 100644 --- a/common/data/session/session.go +++ b/common/data/session/session.go @@ -3,13 +3,14 @@ package session import ( "blazing/cool" "context" + "fmt" "strings" "time" "github.com/gogf/gf/v2/os/gctx" ) -var session = "blazing:session:" +var sessionprx = "blazing:session:" // GetSession 通过给定的键从缓存中获取会话数据。 // 该函数主要执行以下操作: @@ -24,18 +25,18 @@ func GetSession(t1 string) (userid uint32, err error) { // 从缓存中获取与键 t2 关联的数据。这里假设 cool.CacheManager 已经初始化,并且 Get 方法可用。 // 此处不处理 err,可能是因为上层调用者期望处理这个错误,或者在特定上下文中,错误被视为可接受。 - t, err := cool.CacheManager.Get(context.Background(), session+t2) + t, err := cool.CacheManager.Get(context.Background(), sessionprx+t2) userid = t.Uint32() return } func SaveSession(session string, userid string) error { - err := cool.CacheManager.Set(gctx.New(), session+strings.Trim(session, " "), userid, time.Hour*24) + err := cool.CacheManager.Set(gctx.New(), sessionprx+strings.Trim(session, " "), userid, time.Hour*24) // gsvc.SetRegistry(etcd.New(`127.0.0.1:2379`)) //t, err := cool.CacheManager.Contains(context.Background(), strings.Trim(session, " ")) - // //fmt.Println("前端获取", session, t, err) + fmt.Println("前端获取", session, err) // if t { // return nil // } diff --git a/logic/controller/login.go b/logic/controller/login.go index ba85870ff..e72efb009 100644 --- a/logic/controller/login.go +++ b/logic/controller/login.go @@ -13,7 +13,7 @@ import ( // 处理命令: 1001 func (h Controller) Login(data login.LoginSidInfo, c gnet.Conn) []byte { //这个时候player应该是空的 - fmt.Println(data.CheakSession()) //检查结构体 + //fmt.Println(data.CheakSession()) //检查结构体 if tt := data.CheakSession(); tt { //说明sid正确 diff --git a/logic/service/login/CommendSvrInfo.go b/logic/service/login/CommendSvrInfo.go index bc2e674ea..8e97345e2 100644 --- a/logic/service/login/CommendSvrInfo.go +++ b/logic/service/login/CommendSvrInfo.go @@ -7,7 +7,10 @@ type CommendSvrInfo struct { IsVip uint32 // 建议为0 ServerInfoLen uint32 `struc:"sizeof=ServerList"` // 服务器信息长度 ServerInfo ServerList []ServerInfo // 服务器具体信息 - Reversed uint32 // 保留字段 + FriendInfoLen uint32 `struc:"sizeof=FriendInfo"` + FriendInfo []FriendInfo // 好友id + BlackInfoLen uint32 `struc:"sizeof=BlackInfo"` + BlackInfo []BlackInfo // 黑名单id } func NewCommendSvrInfo() *CommendSvrInfo { @@ -17,7 +20,9 @@ func NewCommendSvrInfo() *CommendSvrInfo { IsVip: 0, ServerInfoLen: 0, ServerList: make([]ServerInfo, 0), - Reversed: 0, + FriendInfo: make([]FriendInfo, 0), + BlackInfo: make([]BlackInfo, 0), + //Reversed: 0, } } @@ -39,3 +44,13 @@ type ServerInfo struct { func NewServerInfo() *ServerInfo { return &ServerInfo{} } + +type FriendInfo struct { + BlackInfo + TimePoke uint32 +} + +type BlackInfo struct { + Userid uint32 + //TimePoke uint32 +} diff --git a/logic/service/login/LoginSidInfo.go b/logic/service/login/LoginSidInfo.go index f86ec6cc3..b4c5b5596 100644 --- a/logic/service/login/LoginSidInfo.go +++ b/logic/service/login/LoginSidInfo.go @@ -22,10 +22,10 @@ func (l *LoginSidInfo) CheakSession() bool { t1 := hex.EncodeToString(l.Sid) t, err := session.GetSession(t1) - fmt.Println("后端获取", string(l.Sid), t, err) - if t == l.Head.UserID { - return true + if err != nil { + return false } + fmt.Println("后端获取", t1, t, err) - return false + return t == l.Head.UserID } diff --git a/login/main.go b/login/main.go index dfebbdba0..994287162 100644 --- a/login/main.go +++ b/login/main.go @@ -1,9 +1,6 @@ package main import ( - "encoding/hex" - "fmt" - _ "github.com/gogf/gf/contrib/nosql/redis/v2" "github.com/panjf2000/gnet/v2" @@ -59,7 +56,7 @@ func recv(c gnet.Conn, data handler.TomeeHeader) { ret.ServerList = append(ret.ServerList, *lofin) tt := core.Pack(data, ret) - fmt.Println(hex.EncodeToString(tt)) + //fmt.Println(hex.EncodeToString(tt)) c.Write(tt) } diff --git a/modules/blazing/controller/admin/login.go b/modules/blazing/controller/admin/login.go index ae5fd1ae7..ce94e31f5 100644 --- a/modules/blazing/controller/admin/login.go +++ b/modules/blazing/controller/admin/login.go @@ -62,7 +62,11 @@ func (c *BlazingController) GetSession(ctx context.Context, req *SessionReq) (re res.Code = 400 res.Msg = err.Error() } - + if res1 == nil { + res.Code = 400 + res.Msg = err.Error() + return + } accountID := res1.ID retsid, sid, err := biazing_service.GetSessionId(accountID) if err != nil { diff --git a/modules/blazing/service/login.go b/modules/blazing/service/login.go index 55e855896..bc6c0791c 100644 --- a/modules/blazing/service/login.go +++ b/modules/blazing/service/login.go @@ -41,12 +41,12 @@ func (s *LoginService) GetSessionId(accountID uint) (string, string, error) { binary.BigEndian.PutUint32(buf2, uint32(accountID)) //fmt.Printf("小端序: %v (十六进制: %x)\n", buf2, buf2) // 输出: [252 255 255 255] (0xFCFFFFFF) - + ttid, _ := hex.DecodeString(tt) //fmt.Println(bytes, "随机字节") - ret := append(bytes, hex.EncodeToString([]byte(tt))...) + ret := append(buf2, ttid...) ret = append(ret, bytes...) - return string(ret), tt, nil + return hex.EncodeToString(ret), tt, nil // /t1. // 以上过程只需全局一次,且应在生成ID之前完成。 } diff --git a/public/config/ServerR.xml b/public/config/ServerR.xml index a35c96508..66019d475 100644 --- a/public/config/ServerR.xml +++ b/public/config/ServerR.xml @@ -9,7 +9,7 @@ - + diff --git a/public/login/Login.swf b/public/login/Login.swf index 57ab4b5fe4004fbe08002ac5cb09e4abdfbcf6b0..1ddc3ccf3fbad81f8ecf11364627d6b108ca113f 100644 GIT binary patch delta 12780 zcmV z0n4{}_Xm{+f6QYLt^|}p`YoEq5%N|)90!kzQ>iqF(B)qy!*P}09YWbb-=aYQ2F_-8 zCCC#Qog|7s9Ao}j^0z;{GlS7Z2JK-~6kv76NFr6`La3{30P`QU{h5F$X$nfFqLeZ^ z|I|<$YKjs#{%7{T{84bKIynvUNhAKqRHG^lQQ`DZf1V0z=U6)(Id%7xYy6g^(jB9a z^V2!;6r4>}8a1x@zjs|uNbRbd_2OdL;JJmN=I>sgZyJCxU_59@NG;27Hy$JDHFOx+sCdW^&|4I3QO?61dE!+H_6Xz@lNiI0y)RgFQ+Y=>joV}Xaq zf8khfEj?xrOi#le!~Vj?W7q`D0hMrsg=MjvFw7Zq!7x{BB97@#!m+*_9P8(XWBuK6 zY=8%j8F=E@Krb8{;^f3Or> zK8L9|Y6|^cs1ddZM^lM@^>Yc1EhT@X6I+g>-J1sP3LIOBqu;W_R^zDT8q!6-h_(*L z&~>-478`(ArD9XEK)y{yKfn-# zerF*V>@X|@{dmB%ZQx8t_xaDrD+MQX2RPiF;Dql2Cn67=$b4{k1-Jpz5aVOJ@j(nD zERMPd`ca5uMK~Jum$L#0B7f_s`*vmbypY&f+d+c4b@>{Tpm zD7=PgHSEB27`%?@aCigL8h8_^ciy7kXN8?WT@(ZQ1B|5J(GUmfr_RNmi?E0C6RLZY zD&3_ztWm)!l{V2Q;D4|i)A6te(+RMb{wfl@jp;;qxQF{1r5*_4NFVt>A?*Llqu3sCo%QRVZnw>g_Vf z*)|%$=J0V`uz$I{8O~=f@)T0$@$o3=CEkQ^J>QM#e7*TCx|r|7 zbP2D4uAa-#^142YkwHf`8Ph48O~uDF&Zgs|E1SW|BR$8-2I>^$c~0t|spzv5eYQ$p zz{1zT98A~4Tue8>i<~TY9;Tb%B~E5s&&i7Cb28!un161Ag_v%KMVu^oF{ZD<5=?i% zQcPcmWthGJwOGw7*-prRnUgInR~1-+X&1JVlRjuAu!^(QT&ZdeKGt&f3i8Ha9j0+u zk7)un@M6y|$*R3B&#%~SkQ+H^coQuk*k;bz9@v8EUbK@Q?yJ#^-CH@C-8PkOSLv%N zeNCl1RDb%qO5afFVr0AqZCk#{GvoU$1@Ba~-hdhUpnZF+S26V}u3jY+oa7m!-=!#x zJmVxbA^Wv77*f2e=QReGXH24|iX77+Srfs>bgt_ya}%P{AK5`hKe(3jRdFUAlU1z<8r{Q%J)9>LMOn-oHISsL6m>!4kFg*d^V|o&Pz_b~D#54`Z zF|Fb!FdfQIVp`3cF&)NNVaxil5nQBIO{xT?Lxpl8qKErNHi~04dbn?5V>nnnxChYy zdw+uG4--_k;VN^DN=K-)R;43VI!dLZRr1}8 zKB>})Dt$_&Ppfp2N}o~bvnrjeBz%D#dNX^P7feyashCa^Y`P#LpCQyV`r8tU_XIwptX4U#=GIom(7mtmlUw&cF(q9{5v*`EA(Sg8gD5n4i80^3@ z3Z=m5@^vJk4etW+hN}LXSV#eTi+>c-sufO!JBhkkK#U6CDgfs_oYrs(LnY(%^d+#b zK*kkoLa|<3B)*0uR_iEwem0V`$2l8^vnXdzaq_6Wion3-WM?>6GAMx}$#^fgO)_x_ z{9ZD7C3KX`=mVW3b6pSjNtRa*4@&0#HT0FtV?qbX^8X9wfMl)ihPn7CxPK4o@zMGr zn2(P(e}_JjwH*U+wPaq5w>nE!h;i1#k`-YzH6A3i!;q;8v$mfLIEPBsVGZDXBw0sv z>tpbJCk!QO5bvA>^v9BQNdfv(30>dDb+v?UILXgL@;M&>EXHT|{rDQ6=Np%jX=IT=g8z^x|3*MfDp6cNsaFv$UoTAfp?*>kuCWI!MDtmQ z3g{5%z#`qeofTslGU_*|Fl;iZ%zKaXE@pl!%wxj*PGG^If~5JqC@%mXwEu;YSW0}y zAbXIoDTj>(m%7@V)Pl~wN zEX=ehKPjNX)|OT?Lq&*Nxig=llbB=QD_ONa$8VSo6-E%8M=e1Yn%lK!F6UoC^* z2pV`E;weDGEDin)v;P}q&nMbBNHfa{-Bh{X2Y$~YWvZ+)T~;fy=pc%$k>w*KtMW9) zRe#|CyfALoN*}{6DP4XiillWuuR!aDc85)lJ@x*rH^jCsE_(I35p9kw8 zd8`;~Qyl4r!>JgD6ArFo99$^0tpHE{@3j8TSNd~CO>Y|4*`sEE?x@+HJ8B3mj+~GG zdg8xQ6z(O3-9R3o<*qK-3`#rQd>7l==|Ha4IB~+=ewZ$eo4_a;KQF zEHavU-h9mb5Hj#5791)H6tT!TG4q^~16EPz`0lWaI!AYF5l6pu0b20mGF;p{d>DF% zN6OyeG5BvR{_BeW_h;SJe^CSTw<9+vV!aV;FY`V5O@jJlF6co%PFBj|Do>^1V}mPQ z=zsKLAy2@=qF4G@WuEsgV4l!i2+YNihb%Gk%0%!930@qRo18)S@(uhQ*<3U^l*#Z6w?#NrwQZ&yr(#<;ft`-LFkrMOhM z-Q8YEr^U#0`l)ofKAlD+UXf=`kl2`n?SGLIq^g8@nSX*znor6)|3q0AnJ5$HOOQ05 zk^~Yx@-#gs$;c#`D2qHJ6Qz-7WoR7cdl8DmlchOD2F6LDR8)bIrpn+n3BPBSwkq98 zbGodq^pKD9RCp@fJyC%bMrekta0O;aAVpp3aTk7oHtlh{D`bTcd`<#Ms*}OzC4VHe z$^4Q`W>a289x0~7*yeOBR1blAV9_gL<`pI1a%Bovl#CbHJOnh`FVvhwrg4QfjSggU z?XA&4V?zx&J#0I2;mN<0rtfAEo(r|AI}_&9GIAL{PzjgEg1=%poMjegC%`dh8Bk~2 z_GX^h_CVX-xtPBT1r_-iR5YL~Y=58u+?59K%{a!$(5?<#&7xPu%&XLdYCW~JUu6xf ztISpQz`D^Ig;$wdZAw57wQf|wd~$|Y1u+&y$~giXyNJhn`ymy++HBIzj zzljy%f}kJeX&_1d7o;vPL(+V6viR(R{d2RkugT8-Vs7?zK$RhAE%@h=Fv3_vd1$C}71NJ=dKP+FO1YoP{* zFhlFVU0J`6wL$(+VTHTGGk>vswuJIRcpzorHrkX(w#T7dAt#{Bgb(U0)IiioOtcUe zBCbtpIMHC3l}_WhA#h^*R;Y^wvat-^QZHgVo!pKDXmXxIuE;AyB-}SnDy+!ESnpgK zCq2+$$m=RoH@lT8XMBBeyF60v_4EcCbRJC!WjLa;m4!10MyM1~y?=l#zX{HfJQfU+ z-4&B1wkAuw0i)OQxsqXN=aY>8KpELQFCq`c%8?slrIG6>f1~iR_CLj5YruG?0VAkB zu|OY)T!Z?yCW>qHD7hvxO0LlZzXuiZOH~90&f!+(Jj{Qqt|(Dl=1WMq8?PNq4%p~rN<`bSL9cCh_@o&=cSjcWo0W$3jAwiWotWI zn~F9StyQ)*RvBw$Wn25Dx58Ue1xR%o7f+&rxGM50+`)x1uYVs+C8(kZRweP8`r+A2=kW$2x+;+G9je#bIYm4%a=(OydAKgZ&nQvlcbdTPK zJQrnLvR^=ctA8R@c4#?{)R_5);BrZB@nX*NTTxJkQC5tiETsL!&TZbIooIjUL@&Xj zXn7Y}ai-??!2kQp?pg)EN1omp75tP`a9g$t!ulD}&p&FF4Af6Eqnd%IsOFEPnpiv< zMZuRk3W=gZ{>{M#BK9)}GZFi_gZ&Y)%N#6>*yRouL4WKD2dhBrN?XY*wUUkQ(T-U1 zFEXwBC4sb5Tt!R8UvXU5(yX=$*LD++qY4jvxSc7GorztA-+W?C!M91vP7f@=k-MelB;3~AgzqMS6*i^V|6SwHX#5`{96vxKVk;%+ez1_^VE^gk)htx~Nv%|~-+Dt@7AmgZE`&T}2Hl@eQS z9t#?holQ%sb{f22L3#({4#u!@navAQ{(m5F7Q}?8J&a3KSymPF^l~>J2rJ;qvkFHzlu0h2Fxz%Uk}Iu9OF*%K@}8l1{0Fw{8Aw)vP`7YXsY3L zBA8S&kKh#5qTkZn>&ZP2$<)}YhLvVjQz5h$mVdEX3_9Mo z_e%bqgWBoA`uRcG>=5t!PqDH81F07nM6IDMP9KoT_&=07$46FLSrB>1}*JztReo3 zVC;g=Q!MUrUH!-jE0@)%$qFGG#F!e5EHoYh<5AQTNPhxK-WSTNB9sQ2b!es`RBdqK z8a`QM)#Nj)CI}r=kkhB7^ryhXMycA*(Pdul_1hgyIqG{ASt~`&Qh%nFa5fL^0bxh| zk%q^Gr}mTDp2FJfkt|a+D{A`>&^@iK@joT@^t*yAV*(UmxDgAF0rNEx849_|LYcG^ znLB1_4Up}mQyHVZh_Qs_nYDhmN`+siTf0>vXM#qI_qSQiCcoY?AGSD)=R7ByqPLI* z*F>9nWTfqRGoDaw{C_LQq@X0)rws0u!lFx?PR+VK-e)ZYYSBhUpyozE$!g0+Mu4wZ#zaOa6VdBL@;cry_G$LQ>N#bX z4(S~vJ#UdVaPuuu)YZw4_!}yHQv~-(PP?J{&AZZkPg07WVt=0s;6vmot|agKf2kx2 z7(koKw>ry0r>>b*;8(~w6KENjWsG%pYxJQ3DK`9pG(VKMmZC`JPh`L)IR;$Ug47pP zE5Z!&^T~=M82=P>qVOk$;ZL0AN&mO9PZ-A-=7W!LVsxsCf;5g0x${&t`gmQ&6 zEuYMumQ6d5-GAmlHeUy_9Wei$99KQKfE=(v_+J*$4S&@2QCt$q&!vi0yoYec^?xT* z-rG3>-^*0E2uJfu;k}OVAMnMM1pJ6VZvu`ZP)5KB1kNSkBmx}>XhxubfHVSvfGQ(} z`oQ>MsG;Kr?;${XwUP3ENWd@z_JFQIjDX>WQ-ckJ*JSX;gpbJJb%fWVgl7mCiNH7l zMj=o`z<+22{)T{3D>n5$VDYAsQDsTJW!)86$!Lv%w*axnHO9TojFpVhnD8D!Y^=tl z_d~?SY0U8MLhK2RxxCvD8?UiEZv$czH0JicgxHfB^LVErHc?~w-f@UMrLk7tD#Vg) zEv&$MKVnbkTUcxFpAp;jQFB_qZbM$YWac!m(0{hxzLZ-_@_H{rY?8(bX_LO>8I2Xu zCVk1X8f)il(zjQe^zGfE+pEp#_Me?he|<8|o71fjX-;=PFKJF+(VV`vIsJ#` zbVYOeFU{$}&FSII>8G00vzyZkn$s(q)9ahl$Zv0YGIp1}I9AKk|DwflA)4{WdU4#U zdw+BeW&2BJK|3gCL3=kXXfH;NPtLlaEwC4~b4l7g0C{dp+P(Uu*phZ1-5>U$v;(I} z^Wp#fTU$cvNyvZG5NeM@XtVII6p_thz!sr)m+{^Gf(v`YJ%L?H7TyxL*Y3TRdKVGgCn`VsD}|S9_E;VGYEs4M`#>%1$0#h<~gL z?N$FW(98ZuDR{n%BB%vmURU(*6zabWnRs9caxHPD+9f$t?UL-NmIP3pF3ZAot;h*4 z06iD~mF9svvi$f`e7n^4S2S>l)4zI_O(^%`nVw#@yf$|UQs z>Zt>*Q$o|f3F*mS0FImtn;%l%5`Wv@4oc#kUel=5yNYQaN_o`ZOc*Ese}!Dl_fgI!AHsyOQ`dpyg*b%qn1bhQ~hbvv?Y8o_}n8TRb&DQDa

%yO*n)%Vskfwb&gJu+74Af7qxSVK-&xRcbak^>q%FdcWcLvo@LZ`aSZ7_S>q$Dws`Xlj{0gb=an)1kz4G|AlD*erAFfX->gFib zR;Df7TV{<;hkw0&$1``^Muk{g9D0-L=einm{ufQ~77>%36`AMi?i~a6g!RLjCoHd? zu&zdiv5+~78i%gul+(rpXdsDz&s+YZgy=4!9YS>y2{J05=+ znV!v(HyP*{vz>G3*(qke3;NV^3JO=po}p&xLTKNgYF>u7Z|~`djH%%d0+QW-aoI3zKk^fksZb!(lhP{HsPQq zyl)devws8KnP4w|s*JO>y}jM`Dr);IU?7xhpG*9l^mzn|`*(g_+RdizhUo+5k) zMSpat5jRH}=4hiPrME6uk`Mdd+SuB_6aEIH{BZ+k6LX9aQ9GHT0*44lr1j~WSn_cw zGM&B6jBfXzuG>>@sSL9!6zWtQ=me3YsO_UDI&v?aCVBPR<|q^gyh5!=JDzE8wIBU` zTGHUa|EEf{<{dShsRx#;(uy4;%WZXE|9@(G)w}{+F2nUEoFV7Gq#wO}KZ4b&;k1Dp zDxfp3ujr-~9T=u8oyf=uwVw_)PJM6fZH8Rd?q+5$q5%x#xX#&((5+G1w12zw zCdBz@fNImWQ!N@p%SM2rRw<`|V_w}ZL9eh{Ie`{#{ERj9jh{8-+9Y}2agJ*|4E;Nz z6C6$N*8-j7w~F;1utWIrqdREV=v&F6li4kgl8rieBPoKvsm_P6P^GqMq5i$|M;1bSb zy;6iVC6bX@TwO3fyK?%`*TPi5AFKlCT~-l}e0=1TFyVhw!bUJ~eX@l z8Xhxea*V+X&LJ;8lUGP{u7Tww%qDcKgqoKZEBbORzDr(4?>)K$od zK0bRUeeDuAkI_ADG&4nZm@K$<(YA*?$v}w~@S;vpC(r zj?-Q2xVEEu)#3F0L7WV46Mg%!Lv-koPFq%@ghb}iMfXi=y?2YcTRy&wJp(nn^$$Nlz-t5P!g&-GT#WJBFsHN-H*Ut1*pM$S8%yNH&=Zj^TgLW7_6{ydiSSYGEiRw+pQO)hkY3p$}(4@S;XxmZo?=h@1 z{H(qU8*$wg@zZ*uH08}>>{3G(PC?ZgZkZ_Tp#lu+^QxG+P))WDA(>QDA{oSX}QbB%E4+N#b?VI!%lmprX{Sj?;7+y=0E;Wf1v zb&EF8cX(;WZI@=;wgS;p(WDib^)I-m9T-nqr@WcwEX{3vJmEC{b)a*~UZ>{HX?zUZ z8Nqpxd^)nc0rmwJy+!_}S{7sc5L$SqrApWSo%J%MhJR-0w;;2VyHly*RZufC`p&Rn z&KGnD8>$w8YQd_iMPuA|%=vOp?Sm_46br58fweeMuc1v$?z>63Rs{Ytv**7?`PKoi zD=>nO&?+8Sg**+kmCE%lumaSTy#_tEH*m8`=%KdGp0kmd=F#Pf(;O8iWx{RW&Zm%AJ)(&8oKo=HSfpuBI z?cjhT?so((J*&WTZGjs|;Kx}4 zKYz&;c)$_3?5qOMvjuJMltLdFPM zaw%|h1{|INYcpVt9!Us}QlN^mcXPc-eNZ`w?P`IX$z2**ZnRXa4;*B4HZnXLsm(@4 zWr`n$GLX2(#hZ6rk;Uw>v9 z-QirLJK`AK>a!Z%`L@wbA%S0I8Qs@lfAJlsYy3wYG(qS$Kqs`#dSw?n!~=)WCJ&-b z9<<&2L7q9}JIM8=?1S8VLPQT>z5_h#bnF1vr(<8)ULP}#7tv2KG@#NRe|@L#c@>Leaff-<`5E#;Ip0sJ-XJ`{`+7B7pQ#S3#4DD%~c05CyWYbP$XwTTRlNs8xHm%vBg=@ilT|~d6 z9{U#bH&?0&Rxo=+2dR!84rh+u}^tuH%Q}O3PhxzHB>YX<4`W1aK>&3#~H(>kL-4 z&PXLLHX_^jfP}zjLXbFf8#mV*iO2?8ft_rT#idzXEwMDW$dad7@>*g^x5(nwEbf+A zsyMOub6Mybu;L-01*W0ArE)yF98XIu)h)8*YnJ?$ScbL4qAnUB3x7UaU>VNsSJ4<9nI&*kuE5cbz|ChB=(7b@Q{47= zmcTK&0>?T6x13dAi7jv~)o@&vz$bDAj&}rZJ*&V{Ti_lNI3Y{mleq#XIs&(yRbZJd z@DK@nif3k~r#X3;&wsdmEowThFQ$pWG{K@%=`yI$6OaP*1TY2%Jn2TG?YnS)2eOJny40fKmBHYEi7O`xz4|gd~3U$YZvVS-xA5-XyB05Fbyw=qE zys%~zi)Kv~b(%KCo?>QMSL$X-KOI9oXaC&EB(8soBcs7m)F2&Cp8lrHdh;x|?=ny3 zbeZ|Ktjo+fUkeSgE2XChqR=eiZPQInLi>$A&nmZnO5yz&f6bt4&^rwJK4^-niJA_k zi|p0kR4!V$*?&D-{J*c9Pjgy0o#$Z-8^CU&j}4}l(L zJ6>$(S-seWwila5j{61TGR~o&gmAbX&392_x$` z^Idg}_J6)gKQMyt8C1o&X#1|bHV#ibvWte`i%Qg3Ao^DZyVg0CO=2%54SmL!GAt*6 z1bwvDl%ZG$YZgHr$GZIMY4_^{)cH3MFd2c3nFHFIMq&&7DB`Cb)y53_sFv;o=efhX zjNq3B5tb1{$A!!*NOHSHhv6Fon1A*kRW9pe&|(@~#WggfeC%#R!LEVo zQ$@^@m)pesr!{f^sZCUbgrNdm9I!N4^5}r~fKg80K-$h?4S8y846dYcoIP#Ocq-p0 zz^YHk`ik>2i-*38EL4Pp2K}l7)l%m;WaV(tko0dg>U$OHPb-a*SE0V>Li*muI@OKi z*ng!@DqZFKFi55kDaX?}Pu!q`Ub+Q}K4Y8FXQ}cTUOK(#ouCgaoAd{k^m3Vc+1)Mr z!D3j-S8)2iGVfzG>ZjnS7i=ny`eHT>N4;Rv4Q3Rw83uC+HrZf#F7`4vWM1A(u)E_J zcE@4(&fr5Ktks+_j~KyEFjTj-9By)O(toi=Ln5A0YLnI}c6k_8`l&(Z=1DptuW`}2 z`Pa_5xkCgbTIc4OG+h1Gi&F*7EU$I&Dv=-?Fd|=&iH($x!~Ck#!bNr|I7tbejGH%G_%NKg=p5k@TJG z!zE?#N5e%|W0VdqaddDhE7dReAbD*78?|-RlUGzQm zFjuJBMW0kxyLkC97vz3cU9CT>-jVxR^$IS*mDj?RsYuKq}9xfAilhI(4d>{G4Evn_tPKvWf!BkhX&q% zYvi7RgC2Q=)vyO54@Hn+prWupvGTj_e_-&fkvj)s8K1KI2i_U{3qph7fkAgYFqjQz ymG|C#-@Ome+X%bsp6l*JAWhkRbC)Gy5{nEPc>iDvVNCsvM}}(*_60wG8zbzXJkAIJ delta 12733 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 D$7|q;