From c9111d1bfcb63312ab650c9241211502d65fe231 Mon Sep 17 00:00:00 2001 From: hrz <1710360675@qq.com> Date: Sun, 4 May 2025 13:15:49 +0800 Subject: [PATCH 1/2] =?UTF-8?q?update:=E4=BC=98=E5=8C=96websocket=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/xiaozhi/modules/sys/utils/WebSocketValidator.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/utils/WebSocketValidator.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/utils/WebSocketValidator.java index d9ff280b..39bbe01f 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/utils/WebSocketValidator.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/utils/WebSocketValidator.java @@ -8,6 +8,7 @@ import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.web.socket.WebSocketHttpHeaders; import org.springframework.web.socket.client.WebSocketClient; import org.springframework.web.socket.client.standard.StandardWebSocketClient; @@ -45,8 +46,9 @@ public class WebSocketValidator { try { WebSocketClient client = new StandardWebSocketClient(); CompletableFuture future = new CompletableFuture<>(); + WebSocketHttpHeaders headers = new WebSocketHttpHeaders(); - client.doHandshake(new WebSocketTestHandler(future), null, URI.create(url)); + client.execute(new WebSocketTestHandler(future), headers, URI.create(url)); // 等待最多5秒获取连接结果 return future.get(5, TimeUnit.SECONDS); From 0732b72e8f50e5e98819bd98844a01743721025c Mon Sep 17 00:00:00 2001 From: hrz <1710360675@qq.com> Date: Sun, 4 May 2025 15:43:28 +0800 Subject: [PATCH 2/2] =?UTF-8?q?update:=E8=81=8A=E5=A4=A9=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E9=9F=B3=E9=A2=91=E6=92=AD=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent/controller/AgentController.java | 19 ++++ .../agent/service/AgentChatAudioService.java | 8 ++ .../impl/AgentChatAudioServiceImpl.java | 6 ++ .../modules/security/config/ShiroConfig.java | 11 ++- main/manager-web/src/assets/user-avatar1.png | Bin 0 -> 10906 bytes main/manager-web/src/assets/user-avatar2.png | Bin 0 -> 10720 bytes main/manager-web/src/assets/user-avatar3.png | Bin 0 -> 11231 bytes main/manager-web/src/assets/user-avatar4.png | Bin 0 -> 10297 bytes .../{user-avatar.png => user-avatar5.png} | Bin .../src/components/ChatHistoryDialog.vue | 86 +++++++++++++++++- 10 files changed, 120 insertions(+), 10 deletions(-) create mode 100644 main/manager-web/src/assets/user-avatar1.png create mode 100644 main/manager-web/src/assets/user-avatar2.png create mode 100644 main/manager-web/src/assets/user-avatar3.png create mode 100644 main/manager-web/src/assets/user-avatar4.png rename main/manager-web/src/assets/{user-avatar.png => user-avatar5.png} (100%) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java index 7b717a3f..cfbb107f 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java @@ -5,6 +5,9 @@ import java.util.List; import java.util.Map; import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -35,6 +38,7 @@ import xiaozhi.modules.agent.dto.AgentDTO; import xiaozhi.modules.agent.dto.AgentUpdateDTO; import xiaozhi.modules.agent.entity.AgentEntity; import xiaozhi.modules.agent.entity.AgentTemplateEntity; +import xiaozhi.modules.agent.service.AgentChatAudioService; import xiaozhi.modules.agent.service.AgentChatHistoryService; import xiaozhi.modules.agent.service.AgentService; import xiaozhi.modules.agent.service.AgentTemplateService; @@ -50,6 +54,7 @@ public class AgentController { private final AgentTemplateService agentTemplateService; private final DeviceService deviceService; private final AgentChatHistoryService agentChatHistoryService; + private final AgentChatAudioService agentChatAudioService; @GetMapping("/list") @Operation(summary = "获取用户智能体列表") @@ -229,4 +234,18 @@ public class AgentController { List result = agentChatHistoryService.getChatHistoryBySessionId(id, sessionId); return new Result>().ok(result); } + + @GetMapping("/audio/{audioId}") + @Operation(summary = "下载音频") + @RequiresPermissions("sys:role:normal") + public ResponseEntity downloadAudio(@PathVariable("audioId") String audioId) { + byte[] audioData = agentChatAudioService.getAudio(audioId); + if (audioData == null) { + return ResponseEntity.notFound().build(); + } + return ResponseEntity.ok() + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"play.wav\"") + .body(audioData); + } } \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentChatAudioService.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentChatAudioService.java index fdd0e1f6..e284b69f 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentChatAudioService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentChatAudioService.java @@ -19,4 +19,12 @@ public interface AgentChatAudioService extends IService { * @return 音频ID */ String saveAudio(byte[] audioData); + + /** + * 获取音频数据 + * + * @param audioId 音频ID + * @return 音频数据 + */ + byte[] getAudio(String audioId); } \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatAudioServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatAudioServiceImpl.java index c222abe4..cf804678 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatAudioServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatAudioServiceImpl.java @@ -25,4 +25,10 @@ public class AgentChatAudioServiceImpl extends ServiceImplPyA07*naRCr$PeF=C}<+=a+o-;F{#Ra)4inYaxyRAzGwXL=G z-dpX}-oML5TW_nqcGuhXDoNB1c`7wl+<+P0mIHG!0UnNdO#c=p$K)G6SV{4Y6MyhqOiWOAj7S$0g0_GMUW8j zE2{BM1b{1$p(_C3dH|4~4vGAc2(p?)EC+z{B?XqoM0Q4L+fxJ?1mWU+zJ(x)Un7Ya z0CSZNLOkUYz-9y}2Zs67IobSqJZ;gU?i4{zMWwiwyAlx=5#k~snx@5IDQ*+uUL;yY z1go6+){TnmO8^B)O_0}JJu_Hj7Xi>BAh;|6;-#L62o(UhN+4m?gAV&H^%QGMQ_>OS z?OM;+0E2fB!A$_LKwII^tTk&8VWml=_r8^HJE~bL6)-Gm2qG=E5ygiH;UNUfQ2o5CwQNb zUR>g^ZB11F5|SXVR5jV{#`GtMNSaQi)*0F!eE~##u_xI5(hsJNlG5}O>XUE;DRy(; zl8AwTGZG5vBsZ3Tc1c8W=2_oPBq$PwAVm!gW(efGi~x@$62K{22O>ZKuY&2s<4baL zeTjfgLJ*|5#xt7`Uq*y~Nd!<+HV%yd5tJg)ZNjHO%tTJmU|JT*SD#Uei0ye$(e7}?B10o2~tw;%OhU+6##xi zzat~%*;feAM`&OlE4)y9d0m<#NQujT3xPxqkdC^hKFNbXBLe$ap(E`BExD{If-G}! zk1_zi*AhS}Thv8B1o+_t4(lJ()p~AinjuJWt>@+FN!bxc1c+X6=G&f*qXnl` zYl0v}wVu}z@c}IWlCnV?2oTY-CHXe#3{PA?aVJQL%li=leLb!yq?BtC0R;TG&|!(| zi<-C+q}attX9s3!GCC=vw1U76r^9-2yo`w(K}uZQQ34nfFUM1Q69)kVI9BMej*W-K zaUn>ti=%iro6?!s2sj;9)yJ#q3X5G{7XT%C`Od^1X^Ct7A*aK7zMAH%N{|vaw~`1J zsp()!m%b2?%A^)LtXHb#m1+bjc5%|~_>a_bETu=k2q3`U3LVzF)$mXif)u&DKS7|M ztKm>eM{*#52)`}Nv;Mo%-YQOz5*POY$X;lH>^d*y*rJhw5biC_<2v=Q+gBQYq`Q$15dpFa!`q zAXw;hSk}l5kRk*rc6nB%4m-&ms+7DT5kT0ER?EV|@z^RSQnC{ybxc;y@T6o#f&d~e zE6lUVngJ{;K~5D|NceJ-kpv~xR$B-lGXGkbXO`{Iooob=O7j4NpQfshXluYEoi&I) zmSEw14$B5Pe3ykFy+z&pIiIHLR>={Pl#G}WK&TKz%fbiqu{%~-@({$uy^^YU7;7j} z{bfY}@sG|t%lBiI88bnoTDd^**H{fn^-m!nI|2ybjaeJR9qGx3AB_$$-fFcMW;!g|nEYC(OJZggUUS0!Omb#xK za_9{d@K~s;H61!TtwKAOF17`1&?R&++0DTD8GE25%g@*_z@{@^)@Jk@?50-3n9-bZ zL|l%YM(&}edISh)UbL6^L`{(5T5fsjW~a~t!AQRD9Pv>77@@9nG+%GZp!Nv>;yDMp z*y`s*5v=Es+!bUjjh)7k9fz$`4F}U_P4Y77qe5GeVc9H#{ea7r?`z2dD z1awAoXJW(zk#3VU7)={e7iJC|Vy8(V)McBcTwpPa^3S5kcN`1!f4q?~Fu&UfW*4@7OZS|E0kU zJ+c-xlZhawVec@FDXYv{oZXsso;1}<`VR|+nfEzNyTSz`B7&p}F93`c>h{d`f7+8l zt(S)jawP49_Fz5n;)Rj)3EdWbM=X;!Z_mE1fJ-gvf9-Tw9}A7y$rfP~q@>DwJ{f2S z0E`G%xSraXMXqgL;JrOLLZfo`BocV}7QaO)+z8mi^%5g9f?ifTR2Ama1k2-RDg{NR>NGXtwfv%o95@FkIU3$20aO5^8a?b|oz+-q$y zou99?E-lI@qGy-n+kP63ZDA2aN-41$({~Wjq;Q1lsm(n9-`7px_gt-pPZSit6gq;} zs-g?AwJPJqO@(N!HJ-jLe>C@k0$t_(sYROyy4Q4fP)s7B&)akIj63U)13BqjwfJ;IN)64f0 zguUA?_kEbj05Q|#ooi2*_N%|1V4*--2R%?t@2!o;{h@?W`JhZSqXH!bpb?Nsyvi&!>oZgAxNm zYcj70e7G(*xKow&##z3Lw1saCg#1NQ8nedqi`Q+=x;;J^DDB)C@`>oPCHc0m4W)KS zf)u&DS0T`PmFn8A3aT^%K2^$0tAD1WBnSdX%OS}!1+st zIKMt5L6T)-Fy7<y*c?IL|v6Cg&tbQH}T8$k1QH0WwkB zWDAWo3wPoCOuOD^)?qk+`#WycwwKJCfB;q|w3M_-xRX8U> zifg&|03oVFCb1Z+R$sf=cI0O6_gR1t@Av=5gl1nR0iNrSlv#nTLlUpukTlEXZ)53F)9ukdj*NNkaIAO8Bd;=Ih=+l?@k<$93J& z=d{=rtQ7sC=I8lMX}PP{j`_~@ss~FYg-Gy|!hGwCVG*Rr#Z@4{T$OB7Rn3$@S^2Es z8f`3y3AXYr{)EX;*phYY=MCv|7OEOBm6Q>{<|Pj6Wg!Vt?CMznz97yDW8|zUR&g!& zYd}!^azteu99rr^-?H`D!Xa(U_XVot+X9-OTAhh#b6V~@Uyk{XDmTokK1K+B}aFJ5-m6D5q?W@N=va{7R z?i!_Z#7iy$R2Dj{1E#zK2=Zo~Z;~L0`{HGwl6vp*{Jh2hfw=E^^!ligysK#O?lk6n z{OP!V`+BtfwcL+onaTG}GS~IlIDjA}F7HDG^nY4*AR61G$|KVQYc=uKs+S*Ke68pg z5_(^uEa(1>M=beQMiUP$_d&q#6gn)g4N8z=m!|{(@7J;e(b#qe_sd--;$}qCSMEL} zQiaeO(9BdXTK_zT;pMBw|A#i-21e_|p#A6#r^8lw4uWv|0YK4n*RuK&hOqqL=1sE$ zpK2zJgZD58fb&iW!*tCzDbKlg`ytB|S<4=2!0863!+OD41bJ(pe+n-ORT?l*RugXH zUfyP=9@S6j4dw)uRm6aRZQ+Y+;@0xfcM_{ODMt^5Gu+|a6ffb*L?bQi?2n_)}AB}sg zt=pJ&UbHdNVm}1zoeDnv(?C=lMQ}_-ZuZXtmE>+>3h+r8PWF)J>r~f``?oUadW>0(oce-fdbrJ z+|T2CLXS1?W^%qana~hcF>2w&#uehR(!~)4Q6r6|{H%8-zR){o*UbmvH_klkk4{ao zJRbw#je2ozlyI=-dS6le@~#McO!lpAO3RICze8-^QYIYvauR?zI?-aWX6(bY`YMJ^ zpEw=1ub(0aCnaaed?!WxLOeBCwsB@)P2BQ?(0*|#WL^_;YBeZA-lqM*hULu==t!so zYdc4Lt=yF{Ur(tg^-hO%6242sa&9jlzu_#u=6~`3ZQXdjHa?3+6Fa>zDgU3vCh31e?KE?V;}27JTqFAz!S-B#Dj=bPMbH>Xn^et`|cHet?# zvb~WKyX$ug2R{lxutyWw07H!r>8iKS#{N(<8Pjr%Wd_+PSmg37M!*l`5U3RycXL16 z&ysLD;Y<~~WF|*{o5drm*9*Oa!&xlS=Ah3 zkQ?`|_jsOD*9Ha2(dP&T+71RAKRiI(F-;~1ihw8HoA^SGy1*-}jo?X%ATI*K6AG(R zRlKSMQGpx-o+d3jHVa3;Ob5}gxxxv5oA}?V##wP?1TSHUi+hCt9#LGGiV9RCh)fIe zh@m0D&mUa5i8^X01Bv4z?ypb>y%7WfUd198_XYyorx0dw5vvM8tkX+z`1R4f%9RTh z!PhPxTf19m-7^j}kd&!6f)K!)SnT5d4gd+8<}lb;Q5+hTzt2d9QOPH0(p$tmBwDUz2Z;1|>>+)i$xC z+5?_LS;YIMszGS|5dWfMDfjfl`(oIB)C2J_FDAsi@C5FB71;r(;6}T>dSyJ zq{(Qes-h^+*+d=H2ZZ(-0$=lZAmOaDDX|!Yh@E1_l zZTCUZa}*)iWd+`wMI?*|07C>g1<`1)2K)K#hVeIC&9m0+?{wI7RpEpH4oFk1768bK z02s|Ty(N>|WJB?E$_M)PSBYG8GX#!XNa!AeAfDgPi2xwe1ZZqW>Qn*>Z+ zy5=2~*+2|-9u>V!&ERY57QD>^^79yEKs4G}#+YFQV}_Z@m^2NLIZdb@k=eAO%PL!% zjm)k^E3Q={h#vq<(Mr%_zw7PZjX4G(=7d2l`leNzPVnr;)jbxyVIII@m)8qG@xF#k z*0^78^;KMG;&t=lK~``S5?1FoZmIC5>FZP>pig>&90veh<dNdjkf_D$|ut3DTBv4Wsnu`CJ-EYyVI_#@}nm~!`0FhOPBYd-;wFrnT9k|@zIe|06Kle3qY_Oi)%fv z0pf#ti}P%AU~Pdp5c6)j-f&UEpY1-=`f8s^8+Sj-=^)YT(i-G{0N`;sdL7; zX9)gHdW&^G0F~&`!Qrgv`bIkE(4%i!@#!C(*2XSkbh_t+g;-MSxtS1GXa#V&?MO|t zd49sJ?{(S++$*k}HuWVV(PAvB>Ao5ncCGsA)zLW5>R&U_6kMQ=w&c=MA7H=S z#96M@tJfq7*I-dY`!Ecowd>W%(FS4fb#||A4uokbPM>#Ms+$B>bLEHR!iY@%;eExc z8~%92uHf1nhoez-=;>IveVhzv>V5M6&RwglEsNek#NXGq1U zRr^irw|jM%cXbAaBx3H80*h48-499QJ@a!-%lsat~1*v=@?pWSs zO9t#ZoDS<(_oVj{#LcY*0$tq@G}su(H3loMwD~oEAx#wHSMe?zJ!zE*-f`Yjg}kjp0X?h>FPElrP~%{B3ZwMInZsg2K zhY1qiSD0^kYfyr`vFo@^G-vcA8$l$0zmdUJ4rfIDzrqY7xa}fS`B9fODY0ODUH1ED zjP?vlkdx~W@5caiV;DHaopb7XQjgX~CQH=vyeC>iou)72dR@^u70u71G0ndA2_dNsu>ob&nFw z?1@ld>iPR|Mq$l0Hg8g$LR{;ytT_^7lgj5a$1vj)a_*mz-ZUgZl6{)h2aW})@up1f zunF|N;~oGkTiIzH?s;dIenGe2df%MEKXjJnQez>^CSu{;#$p*NCS5kt)$^`%5f=FC1wBU0s#! z@|(Wc>NV-gr&z{ckOCKcCx6&kM?TJZC22Ch%^D2oQLIoi#}a5AVGt5JVXuv6%PPI5 ztR{g?vJJqY=rj2A>YP(7>5J4fYj8lv8u&f4Ey1o#HnHwN>=f9I+q}k%qrBmwSbk~s z*!Nu1t04*U);?}LFM^b?rK=loxP<*fP!}4ogEZE;&qoV)h;hFdg+l z{E0sA)eL^6>f??);4%4ov2qJYVc6mww@ctCi;Ukd2h({b|{_y#RfW^XqqBp;K zMc93iH+fw?!}us6s($* z76c1J*$hxN0%Syk7b129MQZaA(^Tg-f-7L08YD=MMpmj1fJnIDfqcuCF%d-ST;k?d z62YPrsIeo!AOtdu*qXsoR)&Fm87!T!Gt`yNQozg*iv&EwU^5{!1H-hqIcEMbAI#|z zu(c~lSt5Zcb}Ld65Mfneo;76N*^q0HJ{XH?xjPWy-4v|hBQVjQ>JwR-`UramDBPK&R9y#Fal|ck|F3GpP7fN7Q1nFIi zxVds5xIC1=Wc_}WnW;H1ooyaxWtj{kjAalmP!kK0V1HK-jvnCz@ldyr-Q*Kf8-eEv z0Kz6`p7n}w;uAJOifTO%BjW#tBQzP>SPgJuoXv1xtQEQQY-}EbFjh-`iv&m8{9=7W zw`e%%5hi+qG)7DI#nTod`u>u9TUbXr!Y0VOhseTlzMTM+7fNV9iKksoC& zugGGzn~mV<9bk?zk5rhAIhQ4ZpFO_)o9dfNdZ)($vTbe^FYz}A=Uzd`7!tvLS#2bG z+L>>AAzYae5#+Th8euT{)&r5A?}a#xoe_GPN3(0IhZ}3hA@P&?gPLK$le7;~)PJjCe4DJrG;OMd7)l-9D&klFMBy>B(Dn4kQ|Ik!y3)hc`2y*f%;=Kou zPFH;hS5YFhLl6Sv+0QqPFz&t(NF0AI+oz2EQALlxV?y1rPu$Zc+&$f59Nt^-INl$B zu(R8J>|=LM=Cny^CgYyQ=C{wCfsD-Iw&3*o!@|PL30QrD2I zZ|(C>;RSvJAdZMsp;p^xu{$b8v!!MOdc)3oE!|UG*4A@)zVy7Y-j3^Ea^;%Ll< zhQOUud9do?NASl^hxO%%065h+YJ!|3iT4WtO4v#mBiO2~W7&^0S>z*LZ0|p@tzy^y zPlo)J&COX*`t7S$%rUZ7TQtE5)h8%$p1*EbT-k79&5-v6UOZ{hmI>K2BTmN`$lyLI ze7&c{C?pV7kWPh_U zy=u{%Kl-MffA?%TaoBtCoo%ZsA2$1f-67v7UO4)a(&@Q3M1ARIhgh)gKyYzLU*+^q zK3U>*PKQ0}WZResa%!q2O|zuwRziF%%(1$O?D7s1(-YH%*{9onyVV=$4*Qq2VEp2B zcU}3uEQ9QC8*f`zb9hDAva&NLmd=}UZ`1^l0vizRm5svf!@S~{v!-zx4*bhbhxNy? z*cUTF5@~NF(@?*20{i|51R>^|ZdYu2p^1P-MFPInoW0|=xo;XT9DRLM2de6iuipFq z=KF%2uQ{T`M5}q&<{M@`8uNOHfIWCXxUH>|zcB0<8Ij;4YuhOHJO_hH2^%u&km&AISN zr1Cd0?LLpNUs!S1yyc^EGN%uj^?Rao_x`_?-QLvJQy=wfSM|+D;s5{&NJ&INRF*N+ ze{=3nWW5BZF?icf&60%Rcg}q4zsWJEWO;%}h7b``vd{Mk5G|C$Fu7#NO%BPfF0Q$8 z&8|PiT&j~n_Qd?DPwl&U>VFNoIk&Frxw7?DFH9CmIO|n%B={iW@x_-tCHoa>8YRgp zrz7-1sBrOG~N0qEEf zb2fZ?-imy?WlZl=smFV)`LAV*Ymc^7Mzl9G1U8;qE`M5)SIzF=gLPhUloDfD>E}E6id46@wFdb zz2lX0X8A@EfKzRS{PFWYE;w&~ZxMm|{TSSlB3J4cbM?Cy1obC+3v7f)6N$ z`OrAvpPdfN_vFH=zZ}H~@@^H`IfJ)b38ROSd4cim(sZUVqF1Pq+8E%y?H_G@S(Yh< z(O}+j-OPv2GaKy#k{f-2?yfbv{=7fHho3w-lpjhHMAF?YPAuIY{Fb8FpXnnJ99WWX zjroPixv*1=AiYnK8qaKCurksC7;XD;#xF`oGFuf75P`_A*!15qpT-+AJnys1^6$K1 zD1W!Qm#;hAS{wGR`MG4NK@drIi+D-tk>GWT$Dq$oh81$|pEU4RsA$K}VEq&&NH0lh zJx>GTPvtavFj;17-k)cBJp+MMNi+YT;)P})ifS)}0p`G^j$0eYjK~jbARX_h+q1dm z-3$@L2~pvQ*nG=nPeo;Gr1}W3#T|IC%SYMDS9K9+k#maeqeyLxq`l$<=_QGqTMGm+ z{|XM}n8WzmMl;i_+F_-YTVAT>g+RowdNZse%NERdII6k&nq7Y^>*87>?rUI8)i+)G zM8vj6GLZVW^@-UVUBQPGjRlGH+>!#@(r9fAx1TBmQJN&9*i9S97}hBokTU`OeETaE z9)ElIyW0falgD4ab=vt0t_?RhgSD$ZxNg1caM>)t@Jo)`(uP+oy!Z#<+Zv03r}`e_ zuin@sT&_q=5O8Us!}6RAW`-1@8bOpIi2-_Arlh^vjUdQUwJ;=Nry7)1zg61Y8Q#kP zv&pvY$|?8SGA!A$R9x@oS`U@gywT(fc*07dmm`}uTwMCv5wH!_{zuYz82IubQaNX~ zSCbr)ZdC~)DJ*e$KO!L6F2$T|`b()54~8|Dk2N^``_~=aT)yYP>X6m>#*T2To$I*c z8aZ|M$=d9CZ|%`GS4i0xO}M^%(%88nZI#|;*)%l;BugO_ma)wVwPt*RbzV#q^Xq4dRr9C0H^FG*y$cVx1$c!QOZf7dxw zu=>9LV&@;ryS*)E{W6b8AGdzqlzV2gj7gFFr!(#2#h`Cv^;=uox{u61^SgA*$nxuE zKCJrFqt6bnn7z>*fFC)WA$H8 zUy8{fo^Xu6%AG%czFbL$5kXUXc>M;~;SG8H3rSo#<=cBkWnK{1i#ub<`i&5&@z;Uf^F%q`V{N5Xnx zfdqFH=3AGCFI~Boab1I)=~huq_tnU-zXdq=#g|6xYMNqtMOyr-vH(^N`s9=B4m#_- z;+P?(pwz*pS*P4L5szsF9ZeBL0_F8uN;jalm;i1a45V>})f-2$m5S`pY9%OowWC9r zQg(p9dGJ&j#MRC`i>8iiYif#h=AbBXbH5;hC(r!*G}CXYS@f!wSESd$8V|n&FxKt$ z|9FstRrGVG!}kB;VN)obntOuuH+Wescl$r@`g@~qU1EgJ15?sojV_}#6cVZLRY9OO z_}zVeF>7+4GDPO4!aVaTRg_1eMAHP3{CTa~JHfz;D*$lj1jC0LhOyOg*<*+T+f0D6W1A}Zt@3s|YX zkt2WrI{@&fGbcX(LFB#T-y>lOB0;y7mKrh}`R5VwKjRN&%7QZyAflglPBc7w4KC#q z6`h18$myrap{19CC_YL=_a$l|^kg?8z6lKThneRs-IC~j>4G4AL8#pS^g;&lQAFr1 zz?S-`ivSU<6p8*Y=YpSouC8X~wCRckF< zzo#LqWHCjT1nEO&SK~7ei3HyTgs`tllLgge5kjz)LHP5Gi9dZ!uP*DFApM>wg$VQ@ z5u|qEWf;kbuz>(ypEcq65*fs4T0~M1q%Q*78=kov8F&B)uGe%_v}zo}Y7$}D#koIy zN2?~vZC6qe`#S@lRhu24ct&*A`{lmGV@u@4M)N2B`2?%1YX!bv+B(n*^ue2Vax|o_HK=(hVjN1@!n@F&Y7lg7)C%tee zCZS2zIYkf|0>1O`(mXLJ&h8@(5R65HF=`Q~mk0#M0O4pK85kq8ZRYr;ZW-K5Y7r@d zC>Z|UvnzJ%7z*-Z379c};#dYzx&dn#5De@6Kj1I`I`!|~ze%5tlmB4{0G<3dp8T6g w)B?mDMG%jn(QvePyA07*naRCr$PeFu0P*LCiHX11e~U@u_rG$m1rWEI=8BrIf0uCg7!M79$v%|%#H zd9w4xc3e^|l0hcChn(`smNN_muzKf9K9E=Md6QLJ;6zeoBnw&07(Zv62WY1R2vol*!ClM4ZV? zSs>0NDE}X_K*)shuksLj!RRAGFN6EQ)JMd0e0+ zab$`Mr77k&HZ35EtsoXw09e7mO66YwOD8QnJ^`lz)Dcjt{L3WQG27}q-p%LZ z6O(Q|9Dy`J;v5e>uWnjl7v=W>xR1g25m8>8B9hvinL7#e27ouBlCVAd!<*}pYCwuB zOA};*0ES-oEdufF1iGDp`#^(lhtz#|@GbKOgR8()<-Xs4E_IzryyaD@D5<(lq-@F& zgexAOJAmk?Se73I(LE-Lg?UY3-b#Y-vJ>`SQQ=b;&1TJ+1PO21v_h8n5dwb^z%=U*w_Qj#F8Z+$5=!<~xWUoE))Xck|?K8KjBdtq0f&?pk zpH+xKz=l)Y# z8;n(2y`BgV+9C5}?xM06^c1VNEK?ICSnhjLS-#cV>9joaAfPMfTRVR5rK08(I#hM=}TrZ z&Qt^mmKT48h`w(ofYP=k7XfDes;8*z2g%hswl>ocBoy%dBY?j*3ovOr3`O9d++P1T z47K2ja#Ii_6!1L{;LptfNZJO|An;?i*RR~+G4wH_DFm9_UjJMp zEH;E7p@5H#a5k+owGnW8{Yf9MNmm%E@YRA-Jbh1p5^ef51llCN)AmKpC z%M2xZVfslUpbY^6z2fqgKB%pC{JoM!kYJ#AGl5FtH!Es|l_%nB*|0ju3mN0@`IhFgHL>Zozn?_&=0fFcfi8=+G5P}Te=aA$; z`p9~E5GM(Nb0iAhMBFDy2th*SzE{$hosu*((rPXvzL=vblgKMGz&+dS=A2Go46U@6e{@>4AWfFuTtY zxpOjE#XVNm#2qXjn!uQ;T{%>iOt(hQ7@ft~@o$2}<8laca#}T2O zqqZ(YgrGcNi!!*M>~b&n_K0$rvmwAKIs}33unSId2-(6Ma#8wdM3L{*TEs^) zLBfHOU#BZOO&l$b2?K4Cd zO&1plE=t#YpCAlMr7M@W^r4BPHL`^!f+#fs0Z!NnN-d6Ud zC3lM!QVf?QceNknaQFsI<5xtTI74i*FS0KYGH8J&85ZrN6c!zjaaX+6cjG2VxT55V zbgAV(j3T+$epqVF=#j(XoqCL|NfG1^284ucs&=e&kuENr<#}lWx z2-08fyGbCJzA8{W0BCJ1bvyS-t)2)+g!gKdF{HL(@~`XCA$ z)m+h4MUY^iy0lLY zhc+ftr=p7-ROPzKIh`^nsd;ac?dNs+Iv``C`+onq@$8tGAXBU~TI_t*HmS#vlquEq zfstA-wnLVUsRvJJaIAD(w9QN28`EHdDC#FH^)@a+xZ?4-A&%@PU`m|#iPmRV%6<0t z8xlBKdPiz)O32c2JpPCaY}=hH61P$pk1dIA%Rq~p95+$nQ%bFxQJ--M60RsIW@dk) z4K;)O$eHXN9J1eKlr7xXvqSFdF--q(zr~rhZO-*}L*Amv#-E6MuENqXO#}&*7jFU4 zJ;^pY+4>B9b6j?|H`dw|B3YW5Y~RPyH)Tk|ywzP)Hs*5om~W82@=Y5=k`J0CV2QFL z*6gX2F1d}FR$XyQj>f9^QuFPJ@=>c?`*K^AeWBfSc4_rztbP&;H)IxVJ~Z0j$0SH7 z;8SXrE49ll`^bIvqtW{8bw)cV_jd2*{$5?rbm`@j^JYh#m?N&xOP)#Pe8cVa|5JPf zsVLbE=A`WbBpWzopCfWIw;^7e4w%QfBxS6LL>Jw6xNPKvX{LX=146XN zU06Em57ek{kYI)H4q_OqF1Y9& z*BvgySJ>3psa;n9E-{bXPQ;B&5K|&S2YA{kRa1${w z*5TYEHD#J+RgSwlj>zF)N?wC?Zg3nH^F_lKI3|jD+c?pPh-ta2sPxp(->xA@sKWOM z82_oKLNmyUU2;`P%^9ZI5th3)GXO0%>p<6H zmy(_*)|hDyasZHn{q@|_Y4{Gl7A&vt<5=q0Xyo-$~W z;g;xV05gBpQ&jeYYX}mq@V&^4Pw1$}a8a=fncJkUi2|KUe;+uJcNiu(kVqMs zZ)be$Pi`HKU99f-$^MsrzC4xi9L-j;(P6j6KGqrN@_7AuR|ygfY+68&8&W-3!|msY z*cdsPo6tmWD)EZA?|HCJoIQ8M*|x|#J5GdlRHXb{#C40~l#nehQ;A1PG-C)0J>Jdd z2fsl=6_4Hn7Ph2>E*XC)(YA2uHrHMEj(NX37;iWkj#RaO)TtxzC70L#Z$ktreRtkvsRN1w$EF(_FHty~@!`)n zC@Wi4^0|TC+kP9a+WIkLjn=50(CGP~+YHlLjSh_L_U`w%-{tj}T%KYDe6InxUpMJS z3kr*;22ST1Iwy9%_wH)@k`-~i!6N&2?+k4#Uj~-PtYK(0v}5Uazt?r1JeI0z^}5^Z z|IiRYl*3ti*Q78kmV?>Yn>~ij>mAEhZFAiEeoc9$q_*ZW{lEL~Htz1cX4T6uFjXqH zue85ypKnVknAmtZlME=|hE_yj`9LK0WFAcqs6j zZIPn~G?C1RAX#xg#MOPlMgwp7R?9L5x7DrkL{8@I*1I&C8f=8@oZX%W|5&#-SM1b@ zL&1vQ${aHPtwSM4-0r&BVUDZJYJ#PrjUZqR^#^<(6M&agv`?8Pk(z0zSf-?YgXm3; z;b4bee{oyn_<`G%JnUu-0@<dy)wg7822-z^FdSBuFyIF&xKW z#qTPkNA@be)LBO1JC z_%{qn*<%i)5jBwnA)Bqvb=wDe#e$`#xuqywYO5cpdh=}Tbj@OxB*ShiT8$tCeo1+Q zya9rx$^j>eAj*`=ea{0c$nBY7$~R~%8Vv8Q+!r}qoz3CkhGg4lHG+V#g+hVi-2hE^ zpf1^9Yu0DWz`!Aw=I*0*6m2IRE7vtUZoJhTN#|5}7ddfwU+lz@{@8{3=^PHNRncYA zO)N(c@E!^Wd`H+yd3Z$^Vjb(=k{Zt{rHv=|h(f(>$*Oa%jqkk;qRlxuVaD~Ad%9X< zCyvxdYLBqg-Z~$$G*?$^hK@qC!UIadFv6Cn49F1l}mXvz$*9>|BB4oFpqWoE%_JXAzalztc;r?c9N}-<$~?2r)`e0YyAeS>ut9*l)km3Fyh*A}U% z(o(CT1PUuttY!eSRH2X}jfCkp9S|23rB2yBp}gR*srH2hbPez#}D^iu3M$ zOPKLTliy8G32%)xQf_N3C4FPiIFM0+t!!tC(&B>q|F92OQHR-Bc)c`LB9+$;ae08 z6hBI!GP41%hdsjlqH;0+rXoFLrDcqcfYiRfTy8A4B*qLbrcinD=Rl;?CbZlmcxKg# zE55kWa*mnEA*t^9S~=KaO^lg8PXpy8AC-xJYa+~bH6=aG(iP5Ygjsre1wdf>7=>Q< zeEd+qYpp|c#zJ~kyWDwft5p9x>tZY8Zt8mFZ}OaWXNO5J*WC;u zv*4(>>`z7%uhCu66ci|(`q@#ruimoQh8@ToN?u(Lz*0%ShL2aD13o$bI!m zx$B-}->$6i;ZTQJlWUU#uz^a%xgXpv%)HG~Df*KQr`)<{yL9nQ>tiTmvHO1i zxj}*`PblCE!UX9n6CH5dy5a+5%Shig)BrTc`VYj8mRTM<0=ito>!e>Mh{Y1fjWGa( zymfoUf{&Q9gn))Yo6Ig!{qOh6oky*Y9buch&_8%OdH5UT-vRtpG66SAmu=;r?Iib{ zJB`wxih4QJv@=%wUsD3Jp$fOx5X6eL(#IT#qBCS$^QE&Sy4R%QU`@8oEQOB8jz7B? z(tx!JfQ$vCj6ZYV@Bhg)1PQ+8yMsjROg8w2>2uF+wy*et4J254HD=QIvfLi6`$-I; z=9DWrUl`j<}2oi$Sm zBe&Oo_0!|(|G2V}wH-jpWH8rbEQqu3su5=2wOS8ZR+Aw&@2HWQcT6d42$y%zhhljR zL4twe5&~_uTA(NLM_l-kqr$XxmOXSgk^iIpUG6w~RBHJB)Wc-h_s2C;tid=U5yLakQ^GcI=s{i2>18cVX!@`Gv2UVktNdyy5$MS;jxcfvKgM3JV{2 zS)BGB%bsi=FIZB?;g{uxSEi)z3NFkj@f7*}!!a63kS$+bBTM2jOO5(Coe{H_Z55V$ z+PXL8M!`cq^UJMLWp^9UHOoWB~EAX9ysbrl?Y);asCzi5Q$vi9z=6y6y<@t^Y% z?Vak$zPG!*{t-v`N4!C<5ab`;{rB5({_t9|xoz3!UZc$UAF`rz+}HS8?9>aE^eygq zG5@{0sO+Dw?>8zz`d=@;MG)wnxRqG6gKhqOTPXh)OBILV_UbLM#y2eG(`1I<@ZIwX zr&#G})<~#Hxwbps+fAr&Q zw{EX(-rYpDtc`I8!oUt3>)jW-@D^h#99NGQXX1Zw7nY5hes@fQ^jDPJEHGEct81#X zr&+h}5@+5%jYNm3k7BSCsgYW%I=H23?4qVqC1_*#DHGk2QCPZnv_FqYkioY|h3^G0 z9-iX(jqN@Ol5PHdJ1Osmr4U4OWjB|lM(#X#I@b8conSeg&1I}85`O9~^nY&bKaVr| zLjm6h-#xszHBFES5O8F+*=F2&0@=$PP%n+uN%U>6?*! zBT`P|J#Mf6O-%$*It9ypzazp&QqFCo3?@Mm@>U-c^413_V}3pa$FhW)B1cYfe`CAc zdBh`k)~rpxE!3mUjNf~T{2v{!$GB6hL4v&g=*LMAexqJ(y5%(pIP#ip`5R6nca2T3 zXXZ1BGXTogf)WvRu{6-Zv0xjzj>lr{hn6DJIb|*~X~Ar~J}k?h@ZA5*OOqnVm2Z)^ z!1#dP22M$Nf*29p`Ip!;Yr5dd3&T0Bg^Ia6WSmM?Q-+m?~{7! zZ>C_&B{|eS9kS$@lDO&Z^svMXlP5@^JSjJ=bsX0u4@wWmdePOodcUY zA0+7WA=u_q^QS)GIeuWy@{H*MTLg)h*Wq z&Gns_`GBXWOjX%9)dUF#d|zeY8C@*2fDrQJLzuat+BWx=2t4_VLBd=!xkW%b_qWzc zE&ExzcwiBS+VpvQnaN3wwh-{B%j^HXn(nFz!aE<&3in420GLu2_^$^s;-a%IXTgB| zJr8%om6sA1%jD3d>e%5I3i{;pEg5}SuV!FaxXo!-hT}%M^C?vcN>meM@MAqt{0)G< zXJPQhbS;>TBklPJx%)9Nqvdj93;TOMw@sLJgQ*uUq?Ut~vBNJ69^-DCi#Ng^`nmt90S*KN`X#;>4-OB^dmeC&sCaUbN(1!a_$F z3-rXytg?tu6A_|!W#9Y5OKNS5iy)WZB2!~Ut0SLx_Dsh#S)i-g7exvC3+gc9xpx3skW_tXnN9@dFAMt*oj|Xk}gz_n~|hp z8QzZB$Ie)aK?bK<G zs19cEZ2-B(v(Md+$~g@a|H6`cT9f0(zdDPI8Oga^)!$YXIq;*!9O{@e5xz|Ys0?`~ z_CfhEn0+3r#TZgQcQMm<-9@F!HS)M0%>=pl@?UzUIXpWUBc~#9TVYU#P$nH|nahwx zbxWTaeb_eZy!s_p}I15{O785G%vumV5T}B1R1q6E^;uVH+46N z3E1Be3EnmL!T(SSM8*ARCdlP)k&;gn@h{@mYJv{!Gq9s4e~{c6YRz#6Q8}l6;$Pq4 z^29ke?X|7`Ob$f*aQ3%mYVj*l>zbMB5V)4p}K?`1F_sr+BLnIRg+Ma z{Yh%XOrP--m1?fPIVpk+PPJ0(Qk62LYAV3KuuJ_Q8H%Md#5?Dmqqx%mku$f&w(&1d z2^q6>xz#84H}8t>`_Xa?bkB@;oLyLqo#TCHjU~?+!j3r&e4`*!X1qELYd^tdC^dFX znjiz^C2N_mgTZ-f6dKuPz=fKog@~!0QeAJWJ%Zf}PUF2=eXyy9Ak!&N&a8Ge}C!c~d_G>LkWp&Z5#uB|)4tK`u|V zioZrgPna380T-$-E~Xp?uh43z7{%U#Q;2IybG-EdAPqIOC!U$awUeo2jf$1;RD8~55*J(LNXbMz^T6gd&C`Bk6Xv~N;xt>Ms~U5$$j z=yLLSb|Vg&kR-Jv(uZ94mY&gLNa;op#hAW8@qHqwLJ!0AkP*tH15FE9w>vD#v5dtv z(6x{y+1%Z>8y`6&ah?#FgdfDA^_`lE75Euk-&wS-m*9J zz)F#!D?u(#wTl0WnUs>!hCVSnx*C=tS8pQ{|YHAK&L=ab17D4-X60N} zmTn*ABUF02Q91i!e7ou6+1;Cioo#amcl58_8)5X$ZbY@G4@&YrU7nVCyt6+${*6wx z%CovqIm3X{z%pZQMv=cst)20-OBg{0-y#*hJBXp2`c2Bym5<#WGqi8ysWDQFVPC;X z?fVGBbVQp9us7rx-(F8IzcIU!lqKFtCt#>wjw6yypJnQ?u$taNRXH7;oI{#Q*)+nP zo8XGR(mQQGM0%av@Q5`^%_SLKb7awd|NV&48 zZVDyDaCH889-sblnRqJQM z338bvzJw>9(|X28El|VT&ANd789mxgF}KaeuHHOoI+Hc69k1uM;eIVP_vYYW+uX!_ ze_U^mGmM?{&W?SrMvMI;`lw9&Hd$RsAxNT0(wUE)oih>~kYPw?^kCbp3+j%H4|S78 zG+tOlZ9^a8S_9_{;mx@Xw47v)>mGT_JZ$UFj?ZSTHY)w{+ORXPJwY)^5;+E6Qj-B8 z-oA-=lO$_uHQd*DkDPQ(KkOps9?bND+1!aK!3eceK~li zbuO-^wNdM|9__L_QJLR7_Hu79i;lO>WtIi3)kEJ{GDHcxXPrl;D>U}%RQqgH_T=fe zG#!sW(=XzkobJiTh=E^wy#7zcqg#)*h7jcPo5ZIi4j!|zj~eG1meV^i8yi9pF^0Vb zCr3Z}-Z2|Hy7C4SBj|SKX*@g#6wc}3s%b5w@0rvu$6m=cxnufj;xSqqotDL4aC`lq z*J{IL`WZ$L#prOr_bdZ{qs0Lu-yTEudit?#cEcY&d}DTQZdyQRqt3+c#f*iQV*uM{ zH}DEujIP!UX_=2L{aG-y+;e^lS7mpQro9mY{>|m}e@V+2(W8%{1Q{erMajQ1^JDQk zW8~XoxUEAQV?DWeyJI%ZlqoUiv{d86IGx{&_Uta)+C7b{F3r+5FjebQ(NIYxR8SZH zu_GdS+ErNkw<=U5tcl?S8JupF`@RdpH`RJ+hPQ`WThr|>BM|qpFXMaeBER8jrA$GP zL6TJX9sv)QSD5g=g<0Mn>A|la0g~zX;@XLCG7_PWC4AL=zuy!En@mHHL6W@g`v3_j zV_Z%YJ=zm;<4Dt@#GWToANF+1co3Lzk@sbFk9S;#s$^02W!zg<9go~Zwlx(&6i1ah zBm=?7PnhwE(Hw7`i;BJ+6ebdswCuzn;0$8dy!z4igb4Ui7i^Es_Wo;sVzg_MYC3`p zxe=}?d4icoT!1;Z5{G4B>^F=y7}C9xf&g>#k`sSeVH?uP;9`%r%#_v3OiK_2ykNlh z5CJa?eV0V+IM%ohSihZ1$sNiV-mPmm!;LxGb2IJ-)I zkZI&AS}!otauSaK0hbmZ=U=&t$~0{dC*HzqHKYtd6tj=j7k`S0HdBHxMI}23Q$`j* zO+!f`6Mvi8m~&5N383liAUYsJ`ri5l&%9)MTSqZ4WeKAA^4445w#{7D{mo?Dc~8aQ z8g4V=U)C(l{T9);V}{$J(SVdD$kn$=qwl>kV-tAtcT6(8J91Fu|Dn*-4FT0+cbZmxzCwDZ77KQ1C=&0#ukzW_i=Wm)2v*Drde%4~zx z2z$~583py4hGMS_;e7xrbp!7-A}~qQ$-EVUu!~u)TDPz)kTkt1q9{#}2?BNGOz|wy zCfp6e2bo!^(=mR!QPT&Wjx)G|z;D@XwyKqLpKdq3$p#vjCPfQ2anlOO^2TALSpvpF z9Ym`aL1-YxnISSj5caK}zqwAmfON~z5J(dwLF0n?+qM%IdX~t{ONgRr9jXr1FW`1cg8svHt^AY&~X~ S5UZ5{0000PyA07*naRCr$PeF=12N0s(>U+=G5i!Cp)-A)|avK?oSlaLUHEDnSu-Ey2T24-SA zOkh}s8HV})6PW)8hGB*Q!axW!49m|9Bry13z{YBs5KM?=wYruawJq_e8(LFqCfmgK=EJ2NAntW+X(kFrJpYl?lonq;e)rQDbzNVu}{!ysA# z;Bm7IV3zyw2AE&ZGMh z)k{m$ex@ZzYh~s2Hs%$QBrRuPwrNK&haDr}s1V|{IMJ))D=Hdus7l6~HXT92fxzv3 zX4DEWkIxu#1;OtiK-3E0)n4<<@84r4XiP(pj#aD1+hqAg!TdQh4N$)IMI!n}yu16Q zlBG*k(&YVT3W9{Is?`0(izc|`&ie_~+X12j0ABL=e6Qwvhw_>rU6qyhfar4!Je%(W zVMhH4_zjr9;jXCIp0EAOOM<8;Q*K#)kuRH5_Iw3@jOZOBqHlC{cfXX6Cti6+kiNSN zl^C~=kqKs&ZthW6lYF~F$s2+k|H)6BlO|657Bhd!EHh>-_Je>Q$U?kGix;bp!VLfA z1wp#1suo;&iT5o4>Kly0m*)r&utg$z(Uk|TD~2aXI1pHV=}D?ejtO}_FAC}pK!AuM z1iUEweE)7_U<^%=a3JuF-s9WCXIcb^=)YyB^F?~>u@)nC(vSp+tXnrHA;h-@=cKtPq-@Av0gp_~&WTv@5^H$IzdAPVgp4*>!;yZ!!m=Tftr5~M2- z2r%HwB>;uC4Ua&*$M4T-l*)mKMmX&)2Ls7_O>13+5@QK~pGQK%f_ateaa|B}llkawmxHEDUx5fpihb_UTsE z2oeqi)&Y1jU0@3J3J6?5Ad8oYSs_R`5cn?ue_0sf0s^`r!2A!Mii)r6CT|!)87D}n zs_I{e`Tu6RBL(?m4*>@LrpWLAk4*MFqXY@9UHfU0q=NfMCP#3r%Vz$Fr=sGgnSvo> z1nKq41y*ND@q*j}0{sX`z%#Pnza|riWP~8S?>Q9Zje^U1CWfpa^BM%0PgpIM$DL0- zrF(k0j1VLo2vijwI~68!mJv`hWa;j+-vSzQUz7hoap z!%Y_ETwWuv!sGY9rdJPiBS>Fpp5GUukLWct1vzOVaFK}K@Amn2q*;GZHC+gz26dY_ zVS-AILfk4nMx`J_D+1Nc7caj5#*cg?qE(PC1nH`(`d%U8q1K@&)YlUMBKl9a&-d3_ zWojl!U##3;XjP<8zkq=52r&P-)>y!r2%<(=mtC%4A&|80Lt7B24+49-dwLdXi7Ky& zAYD~eUt#7i>eH8klmY_!BS1v|?DqM-l&<8o38E&iVIp<)DCFlz5q+|DpR(Axn_&xg zS!@wyQ1x)k#tOyz|33j6u_$pd7mWwY(*z_}ip`Dn;xS@gm~IlE^a&CO{JN0YY4o{g zb++u5oE;sKz1|!F=c|N*<>xUTvJGxIe3a$+|6~iqEk`H+Wmm0 z$rn{Nh|c)KX~|&egb?FSCX|_z1((cAONLo15gkyvyB|z7`)8`5!dLh;FJG01I zbTVi!I`4)Q*XOOh7J>|z+{~`631zxalzq%uUuueK+2{LwD)mw#NH`Es^8)Tp zr2(^+m0TBhI!cd$Eb+T^?W0Zv>DP&1-4{#D3>AoS84+S$;I63Hne3RQMv$tiZ-aSE zhY2NX&sqEUBS$Uv&i5n>aw_FSS0ae+#KKhSBvV#hQR4AAPQeq$bn??wZ`hM2NNZ)~ z^>#_x1?KU|42T)aSc^~8*o)811bAAe`X^eW4N!PyrsOk^ua3rVy#s7Z>F^*^`s6@v zjENQ$`F#75X*+3xgx0S8B1zI$k`ZdQG8RY2e%rYEF3B3bH^Y5v70r>1{{S&t4=0rJ zc14-?t_=6bkm4D5rO5C9yJVD0iXf^>iQDDc#lV<5b9a;-+F)^AR3nUM{z6pYZK5^f zB)l>&)YT*wyW?ISW0#KvgcV6zP@KdQ-J}Q-3IzU|fQ*J$NruhYEJK!9vt#1kBa*cz zYvK1rM5#t7p4BG<4BPH_{4QCDqOlf8{F@%Xf7ArANf9I*2y6pzPc|oLF59xYTKCw; zA9jG0?A|4W65B;2k$s#Q=M`n%iMZlT`hqf-Xd_4h&*>!*Q4UeeXLvT-6a* zkj|>A2PNi>skfVdHTpK=xtkc>N{#4>KWGHx#u7;+;O}I=|CO`|5*{NLgE=P$5E3oX z9tfUf1cInKFuONJWA|t6fFf7@X5h^tzyGn6336)HD%Ut!K5)rvcSf$1&qlj8)yZ(& z;k&cZ*060Pc#~+08g4Q&JGVt+3p0K9lT+yX8o$Hi_wN}>kzq}&a3JvK0RG1a+Gk1! zi?e;NW5PbwB|WE~2qiWnk}#xGq3FFUxy#fWcVhm6yQ1Q&DG{VA5cm}XX+1K@>1<1~ zamf~{cTRr01jyZ~QJ<>kL~}%S`;e1VJ?q61iJ8HKGE;Z|u&j4vm<9>h;`aN8{DB&B z1?gP9dX8kX9ROf4N+4 z{~wYi$QBTp(vi*LYN~UT)f;0%3TzcEk-WiKh-n*Q@tbmY6rKc;H5A$B@%yjYk6yEa zgad&^0RE_&q+lumidwlg5*CL<^*I%As=6^7iL4~-ASqOsc#Gf&9*!A6G0?{Sac z|A&FHuO*0y?>-!5`>HLjc0-s}5WGdSMDxz~iDBCnjXtE$^WqH6^0dV=f5%f%G3Y_y zwFIfGG^KfEvA6AaOxmwH9~$D|L3GBqAgbgYLDb0?S7y{GiP?s@^-r4&LsTT9I=9a^ z$XRp{LE6@=nPIb9kL%f}QDiwM*KLt(5o1h9!J9;j@h%3F9V<1|P&E38AAb%%MT)mSuY1|MW;8}N=_K&rkXqBJ2|T88|)$38K6@+)2<@SA9Gh!{CG%$ zbOi$c!GPwF@j8uxZerxAn-4%z=IbUnps@rM`aG%qxZ;V!9>ySuN~EXV)?;>ygRk}%y3`|(RD+^z)8xME`U-JYui zG1cdsw7W*KhmEnJv`?<#(#2)G|GUOm%`}cQ!@eULeUD*&d^C3FN_CsXatTW#vbi=>O@}h!NzFCD!DcvfT#oxLoT)L`}+s=M~t-PeF6-pKx}=qq){ekM?8n z+jk2w(Nr;k8TgwbzrQyI!xe&rtEzqp=B0XoW)vCrl7@}eqO*qZa}x3$L6k0f$KmhD zk899h5-|zxF#0AH}Cr~5CS4v?e_Ve9ZZlwpcO#Qe`z(0)iqU}*KOY}S)zxRAhp-Alh5Fk(0bL?^{i-GnczrU9Yy(>t|Z+|=8 zVX-vkQYpRLCMnV8n!3fEm3UU8D9_`3JJ~gN=wsbIUuy=$M7{f;O?ipLjlqO6%T(_0 zQAN4F?CGaZ^%BI4{#Ul5Q=4ohCv$)I;kcn%lzm`i_m(|hRWnN2vN@^sY|D&h7J$b* ze*c@j1nH`(`Xn>|r=FnYT9)&=owb^Cb!hE`#j{;Z{`lx7o``qSzHf$^IZw?LsUZ@5 zG-L6EwGKl%^)DT&e9GqY#A*nb0 zln5Oc`@h#sP;SlzURv9X#ov8O2zk0zIfkiE^c|1S_t}0E>vsU2FpP2<6(LLXylcw# zVe|ZH6rWUeQS#nxaNm|vzyt1SI)r1dB}j?hl2juGDilx5s#TO5^WH;X0Hm*b{Qf6< z2@(nfjuJ4-KzM6XMNOP(pKvf|XY;~2zZ&D8NYAZaiH6Yd^WEq^pI1kx%;Tz~u?6Y% zS<`4|rZNM^iv0fB#H&_Wx?HYAW}3;3RC{q_jkUNjHxtZORx2hxul<+w^zW7>YP%yMY3f1?T60f7>Ep?uMSev z=4oK%#>^n5hg6D1qKh)0Lq!i&lawKVB@_+>)Eo)lNU}~|6qBcJ*$XL=y?4_YB*zuN z6Wy)cSh<%%#|&$BMPm!kGCTA1sCvk${W+B&Dmg|?B$5}*=u=Xjwy7Q@vg5*$4RQ(CH?SIsV5tSccU zlD(C36g|yG5H%yNx`Mn0U|AYtWY{XQx3(GJjQTeT*KO4p_uibFJKVBs8#QlH5N*}% za3I}*H5)+y{EWH+fz=EwNf#6&)|0)#E&!^dqW&LQ>$&v(A$H9*)I%W-H6EmQ?fr1Lcgxqbgs z7V+%t!}=698$r|niWCY2HWOfsa5$P~#^uW7biy@3@4%4OBf@>>d6c{-HnO@n)bAx2Rr zC0zI1wwuXyhZNql5#c=^i0;&4P!XMnbKW6Q`sf`XXQ@tV8AnXC?L1oQ>d|$YDBdYU z=_zBOcmY_GSCX1oo^qHb-t9!`t@j`iZjJ5U&}cG(oKy*N5kOh;z!<-z^RC%jU@g01 zHcIhxhY;Fv9!ir7@z4YyG0-tH21pl)tnG@mv=#Dv3!L+Bg2iP%VvI6$6z@2To~CAw zG={!|-36On}|GZR5#>P2A>Gdm5Ae@f~(=i9czb64Kv-AJi( zMlIa%vtX>X%xxxu5K%;3LCyo1Y*gIS(Mz7wwo8=0-%P(`>A;ZHI=ufoZ^wJ)C}tuE zfD7s|?_n}oxKVlLq2pr03Ilt-W_9jnr?I!cb|DeJ{Y*kBOYJ};JKCky3Ip}(P5M>_ z^5DHe@_m%2*G72C--7{DnU2XLkb{zYzKU4l&Yi+U1R-D>g{!Lm0Ot4R0Md*#DSLy= zQ$O3tkW6)aoiV^P3Z`gtBOm(F^|9EUI|Z9(1p(1|)x`Q0nJgc=>4mMZmgd}n zPvhLnkLoRTTX6b~`^-iV27XQ9%E}*u=!N_kiR84Drv()h-Mv*5KU6sCO%5_`r4IdY z3!)eAOT_Qmkr3kz<;1C}W6b}ho?`vmrNActOOqgjRhFj(6RjenUu5R5m}%r>Z%rH^o0$Ap+h8d&)d7Uj#);bAew!Nux2bxW zjUYtyC3O$-w*K=J@E4okjUdqN|ckK{t z9utd!&!{HWasaR91l$ZYDo+naz;MD^dRk0+L3P3_d>KN3_I~X&3(nl$sV)47{gebk+ zNIGiKg_xgKO{|9rcuR{Qqt%tY!EOMus+TBzyc+T?Ie$BDG>ml7=fp2-&~fyN32Qcj zFz^VqS5=L(GOO98O!EzTlWzAO6cavZ%B1(X9x&eb%|oQb=Jo4gHi9IG#`i~eKM5f7 zVREuGqOvy_2H@#$PE2}XbK%lZXYiZ1ZN}O4gDzrYvAgR8o5sXy^!WWZTuz`92vjoQ z*BQc`iIcsxod6eKQNVHieo^*k>MxxoXG)o=VHOJQ|MnqPqJwgo#NzjC7ox-z0jvoK zxc&Z$euDfn179%97|PyY2Y`}+{Sjr)RKsy&VK1V?Aai3?HMQ-z21}C>42RfM9AJ?JAlDYW+nGUG5KTNAd6{C$((>4z1WCDKav5SaCQ4;A_xny zv}o~S)lU)VT)ldZWV0R43E&xMbhz|uqU52CaNli+yy+R}c6LM_eRU(cP7jG;G=9%^ zHi?NP;_|(Kdw+SvbgKJNZ$M5gGCb&WnGX;>7rv+O;Lq}>6uK9Hs_k?LKv(lL7X;M{8{N9RMd7mdAZ8*~19Pxt3YA4HJOwQC=cBq>8tpEEgn*UFZ?!3(2CYO!5+ zL`?W_DM&JIAnNSGHgs!=@NqiuA5muI%8mJOYQ^IBZ56_k_u-a=5DSYJFRmR#kfv3u zJhICbGQyZ>)j^&fJP*dGdD4Y^^LCWJ-xL>HS}_~8{(+Zk5bsXv$$(i1(%sWjG->Hl z)f?lTJxJe4mg=;a{p_$hkFM+uo&zu?8L@?<-w{wc^n(DRElGP=#A5et6`c1gNR7wu zzjBOyWs|PL)KyjWDQ5m&G84|FdAIi)L=dx>S?=kzr6M6}iI^9|Df8iJU?%#yvq#&q5HMe!pW;kj#Ux}%(2U5ECA zY5zc&fFNIR`+Q#=_``Y)K_Y9{&Q3_ukyL+ujZ|Lt)}917?Wl@upT3_bEFI*^ZKVEX zLKi;xy+aghAN44Aq_(5c`?oOicLiaK<>sO%pFA)kLCj!g$=;xvHEV{ZiDYp%iwV!2 zG`q<~k>(~o@{=Bjc-lWG{W#|{L54D~hTMbn5~Q;7e}m|onkHBdE6d*C@k^0fbcyaR z%AT!;V}>c;k?_SG`=v8)Oy_}*%QTEzEcWirg5|sn_j<{c`m)>a|EH_Fe~pRNOOUl| zZ-XT5(STJ>tIFPB0|4E!x|;E>gwMQDOBd@N&~u>jnjp;gx+^NSCq)poP*)&O!$4j- z^trvkqYTW}bMSljB_)eGV9W2LVCp!ulh6Dyj(CUeE+Ns_1Dly$dAEWLXI>3!V)YUv zk3*8m-k^HOP_8FI`emu^@>KjFvBi^DL7FLid_SN0V>=>Ex~>`nF^)zb*v!a7f(&C` zjYyF8wQKLTO42n;P9`Ru-ZEuxupSxCnk78<*0Sea<4Lj`I;0RqE*$04zdt+ND?mN5 zkHr>l670;o%hrSt_mnPPTsIUJL+(NP3x)%M*8nWj6U1!DlD$Fo`S9F~x5ZFI>7pRq zx6T4A#tLy7Yd_1Ue}6;@HQdc$cgC^k4LzEd1o@fA?^na`4*88pkWgjiqeS#(Ho(=h z4S8Dd5D1#i^i$Hu;%lAk!87C#W7ckhG$@WH)oo@tTpt8vCUp!KuMqEMEik*SL5(!wH zE6~$vSM~1dY96L##2@GixKqJ1)8}`>s^mK5nqnW$TT%^`L z5pE2^Ar?aK|AeCVJkd>Fo)Kh& z$M1h+w9b#Zg7gxks%iz8e>$2lqx@Z-9^4DYtvT1nJ@Yt9=5|89f#AB%4aqS}7oFl= zyU}{29qq>*+}<#eL#K7U^GR37XzamS&X*O0=y{LNH)>v-qzKYWlFG`RAj*q)QnI)9 zZGd~zf@STKryoGc{BtP2$qL8BSs*F9rVoqL=xRD9n)fBRdG8eJY|OfenKuMs-sP#N zNXn%@X@YcDRsD@%{%+PLoQ8&EZ%}oUxm|;Z(W^>!pyZZ4m~ek5MQMbjii<$K?6Oz#`%`&pLW;Z~0 zq*;CBYDIGzF!|9CUQ6;F`az+{u)}s+*j)*)3IbKK_T}A?1A%l$P?)w#GZ!-?-Bz zqPi$yc!Cfe6tUQY#m_v`l5B@lB1rFMJr7Q_+}>av18F}URr`6^esA>-%c2f zw5;5zP@X5@*?2DYhZAA(zWxb9;GP@9J5Jo)w(cgoh$K62hAfu{1WD@TYGCJ5CWu-& zR9X3JB6?O6ni;GtPYc$8(j&-esk}1id}c-r&TCG=mX$l>1laUeJt2V2O^K$)a3Zem z3%zd1cK>AiM7yMSOF;h$a ze^XRZ@qtvOq(zXfb?feCA=EIXj#L}WMtRvARK1W>ikR3fmHug+&lv#i`1 zr401>t+VltQ(elSj9AlTOXs3#wzO{CN5XhGg1ob$h{%H0b*=M4o05+!)>k{gc4+IM)or-G z8a7blZM8jhI};`SR^qwY z&ag!9q?gu1S5?Nk#%NPZln14281JBF-}MgN-PKbeNPqukgm)i%pk>u80*~0`SnQFF zf-Q!MDaOnnEUKtTJO8F8f~aU2@lloRt=SCFkmvji!khNL2*ZCyE&u=vjY&j7RGziY zO8LD0x!KN6iAK(mkq&9vqKpmaqUS^L%Ms~|Y`E~y6#L}y4*hrO=@3NKsW{PcM|1Hs;bX{`RiH~(X+1Xt*HfQ@VkUb4;_q8dVh3fLnLh%l;>tU zTO}GgIjElcXHr(WD@dPCi50V~+xSR;#Ho$ftk99jBO5^mF|mj~@A3J*p%qJA2-0V2 zy#e6L1(a6BwA7cqLG=jwiU~!fx7G6vAD$Ceuv-g3{$iG+#UfFe7Tt1Px8{88jpHGa za^&`Yy_c6eRcqlv9A2~eYLdjFk5&svIS;Z&!0+6C|5JKktsgEhd&KYsDN_keM(4_*_Mj zNOVy(KshA{Gat4|(vwb~PYoWZ`O}RceXGcyUy4WdKbp1DC_wfGHv)JMN^aVX8Ov?} zsCR#)ogmH&7Q$qW>gBY$RugM^xl_GkdS`z(fFwpB2!wc_XYu0odV#DfLHbDYH2|O2 zOTl#HxV^R2?3r;RX8qOm1MBNRkaHH&e}#-FjOw%TLroDe3B=MQhvoc3Q*HB{7Tt$u zSXYxIaZW5RcdED1gO1R}!C!C1nc8>dnjpmd33o-s50mUmQpNNify+m~RRDCc0h8** zRfXI)?5N>ezI2UGkXC|xc((J5jZ({8m5l!D&%}?N>sAK6vza1Wj=gu9P4~AqT1~9J z6=blN0w)@I+bgl2=DBA;IWw_d^7#FqO9t;$%4CEfeJhEY#%j5ag7Np!<7}*N*hG0)t~|5p&zJIWFCg&UGM&x`JHeDNUR>+EcrwO>}gmoReJMY|JnL2gIgq&Il@}XIdM!Q71lYZr~ z$c4BVytlDQX#Vglr|t&=I_yE-9?rc;ghI8EjT^Hb_NONnn>z8?XVuKcx_=oXNZ%^* z7XW^)yVk=9w9cJdW1l^HSa)k32y((Mk+#G}$9Dfb)a9ab?Vd| z_B-z!@fD$Vf;b!Ol74wd`gK=5oDQ`o8X7u9hyj{aEP3XYT4!craCEo_88skAY}c+G ziL+;QdC@td`9t&-x6hZBmu|B2F%x5OP21r>K#lMFXtGMBQ%-*T@q@5hM|=t#S9tfz zhG^Qh>W5}IkJ=@D^Nys`S1omP*n{i^Mu|D5DD^#Wy)}-bQQb|%0e!Fb`288rZJ!l_ z^sOYT30R_KaEGgFpFe-2^~M`V^&(9$cKzaLB<)}hADZc`w_A|WSi70PXP`{2Cf4$D zr@F5kHNmOq=%|SVgPD0<$h_54QIVB&(^(^kI!IlCz<)FF5j`gX+3oGFMT^=XNu%Z@ z)Jl*K-sm{&uu|sJD(DH&RkCy-h?<-zsh}MhGPSmQ{QjgL!)b*ws|4xYxK~!b45Gi& zs(63>kxs3yZbLIcW;zZ!ER@vb(5ruX%h7=#$CAyx!m-%Sp7rZ>dr(J2wQip;SPO9O$E3R$UP4rjD#LeTZ+dX%(p=$Dr}Q%_ybb!q% zL9~!We(bT=;cz^WN~aTyoxeC5(ak1KrEQaxRh<=214!+%G|g4y(uL&OqKb;AbBSHf z36c&;tmWlF`BMcU7O68 zFbqL@SCT;BVFF$OFk+l4`KhPWeLzvF@Wd7DT-i`Cu~NltKzY@~x&Wl-@*k z!=8Ws8qz(4fIvKv_-yHtCF(tkVLrnVq#v1ZRn^zQ ze9Z$G*P=yx$mvWgdsKlSn&+Lmf~ctj(tCC+#L4d0U%wJ9zh4_8nN(LJWLSdqnOq+r z;I%9J5~7RplTS`acbF559ltml$+(wky87ioJ(VDB0Md3sjPBlDr<^%+#R8CkXN+W0 zkT)geJfiah;|D0tsrTKJ`%01)sfAc)%PMh5{bkI zjb>8i9YOjP4g~@~azF9JVo1`U7`CYld7QChWnl$L1+uHlsw;?kK$7-FBbb}J)~#Dp zR8jG9EsA8TuAxn=t3hDq4>9x0z~vaWseW+Kh$ zI-h>?*{_**1nGyUJHa1tNc=?_<<4XvqzQq#UmT01bwr%~p)q8ODnZmlhMp9(JEJDB zu~;lWN}-NnismgrR0Mxm$F^m+i+^)kD5*E^1%havcPc?*0Fp`~#LTZrlJt*6bV75> zITDc91nI}DBNBhS$Zq)zfDxS+;{tUn3oD40siqPn0l+zmkQyR-g@}Hmr7Q*)sOe_r(PbG+&#l$|0jKh7z_`ZfV3{}-s1nEasVg8I7 zrxn1wfoR7SQMa-oR@j52KLu5Ss8Ncp&N9`e5(B_@iAcRjG|gv9g7lA0S6ul&E(^T? zT#jW`Ac*#PyS&_~0JxG|l$pOTNs?+#Wj%_f_TG#x!PErl?|w|-Pg{upK@m9fi(`>o z#Eu<(B=V$0-wHws^S4AI@!t-I<3OIMo|c+pf*}3Koa~Ih^wzo9WPp~Zg;t?b!-r-% ze&w)A-y)*su>i-IB1r#$zIw2;j4ifLLh#2xxrsoZPm_xo)dc+K^Yi4i(<$due+TM1 zCJE9H05j98^^r#b{wOX-eRSmOKxRPi9)SKwNYcxHS#EAKY9#E&G(iRe^ONIkrHDJ0 z5%VX3{0mG{*P1Q}uoUp?G?FF;Q)^Wz{~lkPb0NByb} zF!38Cq+cbJ*qQ<<27^-|$SAY@zYcMcm3kf%Opg<>8oX@O7{GZzpn3r7iFv(Ck>6Z; zGlla&=bWfmAV`X^|KxCV9!T6rqBn`mJs_y*6h@82l43LZ6=!sVupi*JnNX)Bq}M+> z-=(IW*Qh%K*>4vjV3>ZzpE?50Rrt7#CwsD z_I_l(Q;o)6_|in6K#(+nOQzb-k8rV)h+aolo}vhzLcP&Icp_LD2jWtIN&zmt6zXUk z1Er$`L+I*#4g)k1qY1=KV4Ne8jPyA07*naRCr$PT?cqnRoZ^fy;IT)2@qoFArp#p$b_b#C+MW9&(h!-0-Auwc!8a2KFuvP}5Mil^#3jnNIP+AJAE(Jv? zDyz$ID!sx@7JAhJ@DfDsVbEhpFjN{HAm~7d4nQn`P5=S{1T^~XBT=;#prrsQ1yBY+ z{CxqSW`I~gi3Qd=3l63pmnhHM%mxI!1hE0EE1Jd(2?tce0ipw;y87SsKU5@x>puh) zpwv=N8o*LdAc5b911Wo4Z;axf!11rUGeEv^rN zf;1B3fnpUXw+fb&R0Ub)HdERzL3)pv1VIpIin{@Xx-9~VRZKU6l2uTXRme6JDAr6T z8`ic6(r08B)L9?B_z2bC$=G^|_%rp7Uqo1m{U)QQI3?AOwn32SxIW;BNQ_4Sw37;s zx7{@e`~XUq!(v+BRcRHyq%u%(_TX46Wi>vFRK&m>4p{7oPt zF>t?|@%41|832}}wstuVr5Agmvz|qeUizECk(mI!(-VWGV4n_yVg)M5d{5hi^bCT; z#9s$O{|aE1f(KDsFio6M=EH3K!Bd=NpCCH@lK@0=boZ2?cz_=(!Ey7kKV={5zOYM> z-Xq395MBas8|y*vQ2UEPumHK8=L0`lS@n@Uf<%vQ55DfN0DX~F(A$*V6h?r|hsE#< zi+;03keImXAl$2fm|pJvu!R8m3U%Za985XKlHH6DWGau?;|oABhb3^mwqAt*#cmM# z0?elEtYD*jg2cuR0p%6|bQ~+7dhKixff`Wq0xX6lEa0SUg6QHO1Ly*8dI$?c$z~gu zqMXc8`o4)W2@)0W3qQI51T$@h-P?g71V|EKodff(G^HA?Jc7iIhzAwKS!0w^LG#)r zD*^=|n1fv7a#^LyBurTZiHZ9o2w8Tq`iD#|dc`n;z&x0ZuPMz|axTOI3v%3NC>Q^)ZCtx;qcBh5z zAxLceT2MO4osN5TGlM`S%tk+VS?hX&#OT+6V6wX$_UdI4ffAUF!S1l!wFHTcTMkMd zbcdr}os1(uX*MjTey;Yybp(mkF9OB$u6EF?&!Z670JCwTD?M@zL1N=y0j2+NrDI-Q z9*TgtUzTf};VSQ(Pmoys!=U)Ls~qy`X#)rlEJCjF1y^|LT!O^L-2zJ1c#F2VB9v`R z2O;kv*YJw7y>=c!V&ks|rN08`=4>at^4ll^guabj(_CkI?<9iMACcVvikqEjyjQjt z0T4Xw%v5>j5JVTh7@)Jg;qxNk0t5;G;Z|oIx{{wDvHB-K@wp3t@v875a1jBLgmT>K zjN`lV5+pW$1Ss9;J@Dimxo$wfDQ8LKBZzoExJJFP{?beD$BTeF5TN8)xvQnfM-W}y zmjHRx9k_UPdJ(vYKn*}A$XRzw9)iT^=YU|LH%wjx+>U@)oX*NkkgI~D;{?&^M*`UC zc3`{)coDda0Qm}L!((y)A_qal&A{8`Fvcsxi-2qhP%=f1g4vD{Bu4)Ph<8a>wxD_i z$%lYgRo>Ehl%rQK*iVo?!y+K?NuY?9&nx9iYUi&i3J+43b_~{(h5DF zg0zA29f3Z4`2(Xn?!9F|Xw}HrkdW{Im82p9l+yf?O6%E-LuF_GV>qW-n{grfbYV?| zT!Us%N1FFYf9uH+kpkB>ga(Fc5y5k4Rz9V)^jsy$HJ;!KHyz=8w;kc4atlaXxRI+E z95>35o3895h%Rm{K(@&haHYwaG&n5tg~^?ZM#l#A;yDs2hkeDBb$fryD7f(P#*>{4 zmJ*xpHxUVOm(F@-QV)uO9fTe{2ZwDcsX_LpL;U$qcXREx9p(DU;iE!jtc2M(-Co=5 zCCCPV+-k23VUvHDykm zRols*I@O*_WO;NwKdiKd_&d{gH_4u6@5Q3F6C@_?84$w6-40TN@y0#fc0NBjDkRvK zcj=jDN>RLZZ;|<_FD+dUo~^u0ls87!?R+uL8WyNQZ>c`W(XO%&M4i^#AlN))zO^5mG-D!ucx+&g*#rUSJGHoM>F79=JyltxzCANR=bXA&;DVTBz-+Y12WbS+jSK{= z;_T7O1x`3kg=O(@V|0YC-f0RP6s%N&TyksHW|iUNbUxleH{INwPKVjFQmPTs2oj@z z9%88#hCe4i)u%gq`PNZ*lui)QKjuk7um!os@ls>eIzgf*YQYtygHUESllCtfmZFRF zbNfnFYe8XwARa*yv2eP@w7#`?h<|ULAdK&O%$wFd>6Iy6MoR(1-ECMQh=|jZ8+p@b zyH%{79{mAk<1{JpZjB%Wy0{F0C}!zVic^=`+!GhR`^V?|4zi_>JKM5EkQytF4fslp z+zT9=dtw}o$9|Kzr`O`AWrD=SO$Q+>S`(tgzYppbn3w+EV5TySSt5uSb8$nl$5IWO zvxs=@U#?+hYh$-%g6QIZ1n9l32~pbL!vfTW2R<5pBE(*^l(=Wt`s4$585Z7v`z5=8W6#s;-%*&dF) znS^2nEXEdZS8jnIakBxkSOOCj)#TX;k%o^R?#1Ll1K}6?PX7dTt*D&~~MY-Xyq@*@G zt2g`t+_-Bt}6)LW(K#VK%;O zD?#1@C2vTPu9P-DYOX5(%Mr)?G(2kox(p%91QDIse}Sa*S*B6^hU^t%mLLyYNnhmT z)HL~})#L!z#qDNo@8h!>F*}|Z*NN%WY}N@Pj-}~q)oCmDaYL2z#VN@SLheJZ;X7#r z=^Zy70@)-5p+ay#SN zRV)UpmHhMJUOQ$^h-7;95Ci841QGqX{U>$i+B}Y}g%T_6j6Bncs|nN;L5!?bXg~e= zi1dy@YMb)>?fQy$awktANY*)S=YX%&qnr$vyy6MH7rCZYEfXYG-whOp<<;z5X|dP& z9m`objLm$YtDx}|f{1S2@Qr4F;&I~Aq7#mdH2OZwroXmAkofyR={Jrka&7NrGh%i; z#`w$mCB!_5Agj$>!riOY45gruB$y4?oHV`i5i2%+2`GKWwL{!7Z7gpLUh{3Gu%Zo) zM5e5Um;)DSY$}lFh&~zm)}XXD6sOWF8q2zpAUeGn05kgtUBb0zjx5p3R?<@jkR1}? zNi&ED#FSO)J--~_*f}a8&|7f8w7F@5#14-E6@5Q^%2`0S4d0@TN? zw#cabrS1H#1t!&S8AUo*l$8udo?-VTB@K^QJ%@FMia+LD&GJg0FtA`jV-3B7C+e{J(~sPl#5A(|-R_`5m>aB-UFEtwk}~-xmJ%4Rtee$9keK+JKy~Jk zDVzb|9hi-;Upa&5^iKi!mmGk&O2+2b`tP`@Unn~(B#nX5b~g!OQ+fcT*?PC6Fvra8 zdYQml&CIfUQ?VB)&hzuNEY{q5+J?4-AIr-Xo^M-epIu7S>H%uB$TM26Bft{eqSLmaR(!$rE4I zT{XBJ)uZA`UClRRRF2AVNq=orq7X7M7JN_#hx8r!*}&&4>j4POUfJf5d?$8(ev8Vm zIE|sA*LBt|IGB1|goFT7dFYPUIT0V(MRy2N7o7QA;Y+-#@MLSyjUmLRtE9&%DIjr0 zW(zVGTp)}+a;@CQCrn?{Ir1}F~jcy;Z`eU@Jq2{ zOz+_R33CT3>#PAEViW@7dHD4iCdCJb+tid6^LyXljk6}jznkP&Vo&>zv`+iNa2U&L z1klAWo1SkVh)ypa5}7Z*66Z<0N8di<$LIPCcAf@lk_jQ_sit!d4UBJ3HBo(}^^&(0 zSGadS_AkpPMP|j8J1VU~PS7H)Tkx?H?cZQF-gb!~A~~)(NoA*Cmvnpjmg|g59*uTi zVF04ZhF_n28mR9>Ie$g0@hh1qRdqP%`+=63MIcb@hQ(O_1uV`W;s&9(QOL~a?LTx& zdhKo(7l;!{q3wR2`uA^7wOwR;@s=BOktoEn{2YpMJHuMrLvH!@$g@(MRL$42RB`4Q z%*Oh6T#+FE2jBsF9Cufr&mNE2@x;w8sDZ`#?t!LDk*2cS@pQF`N_$VgkTUzP^|fGpJqGx|eK7 zb@%U^AOufP{Bo$wgVJtsq^78Vl%G0ht*xkq+E2}?{4`Mc`9S6CLwO%Rt|03G+4VQc zmlIKnVs5@R*lvT|(vc2;*_0&`MBF4))}BHufOK!KJ$3M7eWYaE0tW98g2u9$`77B; z*EQtIjvgh6GbGQpR*F-q`C94ma-AzJXrkj_HfUSb= zBwLmKY{0_hP3y|a_)YitiRZhd=&r8AK_8ZudF!3xrox=^lX#15;s0)u3X$TdlG;>% zGv<_OX+i+pQM#68a5@9YI}H8wGg{Nld%)OWoi~`N+f+jt<57_ zZvRPhvyAGUFN$IgEXEH-f*bJJ3q-#vGoo}$wROhRuJgoQvu4{fPNw3noOEZX7W!&DW< z+?RkdsL-?(yy-8AxR52Os-^BT&0$L+VGDmjn2ZCv)`>6a8vt^vl7rEdZ4sfG^QS(I zmy{?-BW9eTT%gC)@Kr*rq#gsNKneGrmbpiG2+-qz(Ih@%iPs(6rv%V#wV`swm^`h9 zw0dYrh8dv|cs;O>E~ zo`Vn~=U4&4+)ABnKsiB>RDyh$!)?FsSM^vYnBZKI8dW>&-B~CSgN!$;!vHpm#NRV4W=>~_yxv{g9_YfiSxf+1ixY10HQ!Ql%*>F_7b>ep% zQ%5N-25KkF#`I>}q}_H`+uyQ2@?V$@^@j*Wf^-KsaW|dWPvKW1vxEIq%_qZ!Ps@%=3l~We7u1m(Q!fGiI|VY>}TQh zo{7&-YW}W5A>`Iw@axCap)jQfgE!9k1_jyoH)rQTZI6S|Z=GbPlF5~hEP&bgQUgK6 zk4|3#;EJoKlpdhQ_J#WM#pjldEa$mq(%%E)l7zrft?rkweNe%j};UR-xN@sI(mXJRq*YJ5`f+PTtegete(P={en!of*m^7rBiq{K!A zx~52zxDB_b5uv8(9KML2AkUppq}|et;)lVUoc23GV)ctaQD172)z6@AfqCig4(bll z#E!WpGEoTslcdBtR{eLi-Te9qB>=s4h9IQ;V7tLp(SO;;=oNC}CgDUi@TSmc28nwB zAYy$irayb;4^8gh)qmtQPKc#^IzG-~M2erwJ?kI-Kx-qnPD#Nf|I3 zFYo+cx?!q6Kr)pX4e3@*)wj?1zNwnMoO-_yF^j3f6wBH+Br8ML95jJA;YJ`g#c(Y_ zV)Y+`VkRp=YRS&!Psi?$p3O=c8H(q_vu~}xm5`Nlb0Yegp6N* z;2XhRAr!FoE+E|`s1EaqH#2N55!#MPgjGT^5O5s%&&vFnQ`b-(YP6K$r@ zX{NWbiKEduwmzBP_t6zAg|jxRwtSq?47K_Ki#4*E zi@EWgK}o}-gD$>Ik_y^s7NtaW`HEjh$4Xo5&+mM48%hpeew0c(L)H!ZS~JNbu%PrA zSWM!5IhQ}b6GZ$konG8MWbE`;^P%Y#;d?x1(J(d7k@|uSH0<8JRNIy9RTejoME7c@LxQREL_p*EzR=5BXLsB$_NfcNQ&oP@HL2*T{~+m>)ncw<1~m_8w5 zs!0*;IHQ*Gfs)DvDJOQyu!J|fkbuH{^*L=bH>B%Oa)8J5Xn#Wye;ueoXMszT(Os1_Ru=@6Sj&_ zc>4!nHi{*%uJ~L@5b;ks_O4`;0(^+Ss-)n{kwGAu9HG;*EL}+~#XYCD;r6_jL{4oV zoq8I}hcDN9)MGe+0yNaYDrlV`G5W_ru*~U*yFtO&z9HFLUmws{2)W4!zk!mz5A<=#Kbzb zs*bxD>O)B%=f=Fc*^{r1X!h}{d4hBs7y_-289)aY$HS%S{`Szc&2K+;e~YDSTxyWQ zlvP$&rw5Lo>M*l;ewYENK@Mc>3t7uL^y&TJO?tBZ%Mr_jfsO|NA>n z$E3x_tCk589jyf)ESz7N|uL)iIJADlSO@YO5Nv3AL%(}2l5csPB?BeOmI(MrUx z#mB3b2~z)?r+vpx=_IpQ1&Sl5p+di= zHU}FUd+k0*B~X_!TR1>h+eo2}u2tsl)xx?#}uZLSJqX+`DU&bwh9ZW`TY5*qg(J)U^|^k>?PzaUtIT%)9G$66;y8=OT% zmlw~Tv2*4T?u!+@=hBfM?EDzh1n>1;Yk`n+Sn}8OUob5>J#AOL(mC?6w`L?bA`Tx z%ejF=!-XC?1}}sG$dNoVNl!jQvNL^9U8SwG3O*xupH=Oyw6=PUwv=yLX4()s6uG8! zsrE`INE@0(!d1vW-#@s?+Oy!e(+F#SnD!l9N5|e4OM^ocn~pGOJ{;)WO1hJBqJiF+O68AJPfZ#%7T(ZRq9|~(zryZ^sCX-s_i=lKhEGC;uTiHgC zHZ+Tf(car9AgiAbFYS>^}6T@oiykTbV(=huQc?TXDCIAZ=_G5#22s5Og@0C$^--ThSq67acQ!2%~Ot$qPQW zW0Qew`Bj6`V#(0QI#M zT&mILVo3a1;nuri5fWB^F}<80ZsY2mWXHxJRFq4b<$hOQJ<42mIJw;F$>%&8L;Wkv z#yjo7-gbht!C9n%B*EfEr@{7s3_=QN_vpQJ{9U26cYnurt7~g3xphCL62rC*sIIna zfUhg6OPGA9yp1gHQUQb;hg`!BdtzrFL3)iC10rk#0dJ2|R{PWq3O>ve2Tvddho)JF zjS?{Np26UG$>o(uS!n@T`~6;$meLt@wLR>`u+T~~qxP2etPp5`y)qc<_ZrN`dG^|D zA3;QIG4Zc}(0|ygnALt&1A{ZP9OQVhEvH?3>_Ml_b?^@)@DJqS@2{qQftstaAsNX< zBr`1rg5Xf~bPAM>J5ZjNP+G_K9UjsL&jy%{6Qwu5wx#_9sV9kk4G1PXVgQSMiv|R3 z3+4%PcVWDJx@z;>)75R|h;bPxHx8DRR7b{`V+4tg9|WFm1<+Pfq%UKAu7A*`_9}9V zBjCHTZ&G>P#xdsdD=+qNr2($iMezbG#zl^*b&Mblk6O=w&?Sx9HnQja=j1a_DiKAoV1P`xbTorO zS~-H@EE#zfl+OLdkLDdw%kl2yEHmYjdmbD&4*OH~$stf4f<%w#30~L+pxLwrIgC|; zjP9LlEl=HFSQyizmbrV^^9%W1D^>+pC+_m~hDJJ{^ATpjsO4$=Sf6CR2F8V zSoBb~k9-6XP140J1;`b5yvb&%n*`mcuSoyn9i`TY@VejcJ9LvRa;vSaL*C9bzvEwg z7c#WGlCWNj`53I+IOL@qloKa;2@*ZJJ@{JjQH%Ne$h$<=9(i#_;mIzMwH}|ZR8`I8 zELk2>xiigIaxRyggHRS(gxrT*!*{aCY9vHnf;2p8-33Bd%WbGDwjWvmYr+ z7#m+MzGwKk(F{eXrW8fLY!1j;{!_5BE1lSJLeN%#okx&{$F0vmsG@Hq>e;ns|J>OZ zs)7Q9YmTJa3Z|#EKYCKV^X2*N<0`9&T6wY1UhENQPajI|hQ;8rRZ`axBr4t){#3kX*T)`Qe;pC^ukxqw}I0BGJw^Bhy|auJCKs@+snCHu9i+V!EA7Oy1r`(QvW^@Hw2WVxfWa? zI6x>{zUZ{FUNl_|f{gl}eWT;y<7ZU1RC{qm`zn}?_c|iL-oCCUh-hhV{a^@?T>jBs z=Nk9>;geG*G-?_phb*rQz$%c#_s#0$S6xG7uhw!EzDr>?KIJaV-9r%3+kSB!QA@;S zI?06#>;-A*ytDfv+Sf6kA7-!r&gz$6$gh9=r3f)K#W|a+guabj(_ClSFGa5V2qIe7 z@Zz2!K6ptn)}A(hpOc?*eQb4`y*0`n%xvkCdr-6b<@xQW*wRN*TS}gV#o+dns_rGo zC8T2F)`E~pl7O?J(Ue=uc0P1ZvB%%>VFM&iY5MP>9yb4tTRc?1y=iqSs-g3s*)tM1<)oJkH1vff~4e{VNC5va4`_|va<3_O>w3Xv>= z(07q*`kUnTE^eqyf;5n18VKeCuqmzKk*P($-Z{Qpk=es8j;&kNWtp|=+Iw5cjetN=HT%tu)yGe( zny-XU=n4qj-(WGElv}^t@{~=GOWwxl9|yr(09q{GeBT|#oBlAl%==<4_b9PZUUHg` z@%_)kn!Y@Ul9{j=m^qHk20_FCiHVMabv`JXy+-Ssk4|Oy`_i^hJ>)PgZR&wTv zmm@+7i@C;`+nJzb1}uhMuC>N7ZR`-_lApTx#{l{+fcA}DziWKij)$ifdtb~Q8xOMe z-mt?zdFeMH4JDJr0v@@BnX(CYp&<4MB7)O-hY~RRnWXT<)kF8aLF^<~6K0z)b zusW&B5Ka(gP!L6z8FDmWO6^YwvIR;%oN~j7FO_PeJ$88vK`uG(C5k=6z=1vlr>K=K z3kcMFIDY6M@g`u8`gj~cyhL%)_`FCAU!MPL!kD9{U8L3JYCM)8UZOZ@EVU70Ttd&| z3F0M+JVdE~$FS0$JblKv8m%@%kSmB{rFVj05``@Hoy#)x9-j{N7uPRAqzUZ1i30oKm5=~qv=pGiI9tAA#irx zC%26g0-UE5>p;o6U~p^4jy+Q4He(d3*h`QW0<+#29aK|YH5nkI0oorR{QAyHQ66ESG>lU5H^Kp{00000 LNkvXXu0mjfH1GIh literal 0 HcmV?d00001 diff --git a/main/manager-web/src/assets/user-avatar.png b/main/manager-web/src/assets/user-avatar5.png similarity index 100% rename from main/manager-web/src/assets/user-avatar.png rename to main/manager-web/src/assets/user-avatar5.png diff --git a/main/manager-web/src/components/ChatHistoryDialog.vue b/main/manager-web/src/components/ChatHistoryDialog.vue index 646164b9..4c5421cd 100644 --- a/main/manager-web/src/components/ChatHistoryDialog.vue +++ b/main/manager-web/src/components/ChatHistoryDialog.vue @@ -5,7 +5,7 @@
- +
{{ formatTime(session.createdAt) }}
{{ session.chatCount > 99 ? '99' : session.chatCount }}
@@ -21,9 +21,13 @@ {{ message.content }}
- -
{{ message.content }}
+
+ {{ message.content }} + +
@@ -66,7 +70,9 @@ export default { loading: false, hasMore: true, scrollTimer: null, - isFirstLoad: true + isFirstLoad: true, + playingAudioId: null, + audioElement: null }; }, watch: { @@ -207,6 +213,54 @@ export default { const day = date.getDate().toString().padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}`; } + }, + getAudioIconClass(message) { + if (this.playingAudioId === message.audioId) { + return 'el-icon-loading'; + } + return 'el-icon-video-play'; + }, + playAudio(message) { + if (this.playingAudioId === message.audioId) { + // 如果正在播放当前音频,则停止播放 + if (this.audioElement) { + this.audioElement.pause(); + this.audioElement = null; + } + this.playingAudioId = null; + return; + } + + // 停止当前正在播放的音频 + if (this.audioElement) { + this.audioElement.pause(); + this.audioElement = null; + } + + // 播放新音频 + this.playingAudioId = message.audioId; + this.audioElement = new Audio(Api.getServiceUrl() + `/agent/audio/${message.audioId}`); + + this.audioElement.onended = () => { + this.playingAudioId = null; + this.audioElement = null; + }; + + this.audioElement.play(); + }, + getUserAvatar(sessionId) { + // 从 sessionId 中提取所有数字 + const numbers = sessionId.match(/\d+/g); + if (!numbers) return require('@/assets/user-avatar1.png'); + + // 将所有数字相加 + const sum = numbers.reduce((acc, num) => acc + parseInt(num), 0); + + // 计算模5并加1,得到1-5之间的数字 + const avatarIndex = (sum % 5) + 1; + + // 返回对应的头像图片 + return require(`@/assets/user-avatar${avatarIndex}.png`); } } }; @@ -269,7 +323,7 @@ export default { .message-count { font-size: 14px; color: #fff; - background-color: #1890ff; + background-color: #b4b4b4; border-radius: 20px; float: left; width: 20px; @@ -302,11 +356,26 @@ export default { margin: 0 10px; text-align: left; line-height: 20px; + position: relative; + display: flex; + align-items: center; +} + +.audio-icon { + font-size: 20px; + cursor: pointer; + margin: 0 5px; + color: #1890ff; } .user-message .message-content { background-color: #1890ff; color: white; + flex-direction: row-reverse; +} + +.user-message .audio-icon { + color: white; } .loading, @@ -355,6 +424,13 @@ export default { transform: translate(-50%, -50%); height: 80vh; max-width: 85vw; + border-radius: 12px; + overflow: hidden; +} + +.chat-history-dialog .el-dialog__header { + background-color: #e6f7ff; + padding: 15px 20px; } .chat-history-dialog .el-dialog__body {