From 2efb870a16feb9c238d82ba5f89c9e856d1f2766 Mon Sep 17 00:00:00 2001 From: zhangxuelin <959231531@qq.com> Date: Thu, 12 Sep 2024 10:51:12 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/login/components/Register.vue | 14 +++++++------- .../src/views/login/components/forgotPassword.vue | 0 src/renderer/src/views/login/index.vue | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) delete mode 100644 src/renderer/src/views/login/components/forgotPassword.vue diff --git a/src/renderer/src/views/login/components/Register.vue b/src/renderer/src/views/login/components/Register.vue index 2937f36..60431fe 100644 --- a/src/renderer/src/views/login/components/Register.vue +++ b/src/renderer/src/views/login/components/Register.vue @@ -19,23 +19,23 @@ ref="ruleFormRef" > - + - + - + - - 发送验证码 + + 发送验证码 - + - + -- 2.44.0.windows.1 From 0fa3c84f5e8d3d027b62ef7b6e16bf00f4dba44b Mon Sep 17 00:00:00 2001 From: zhangxuelin <959231531@qq.com> Date: Thu, 12 Sep 2024 11:09:51 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B3=A8=E5=86=8Cbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/login/components/Register.vue | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/renderer/src/views/login/components/Register.vue b/src/renderer/src/views/login/components/Register.vue index 60431fe..f61a870 100644 --- a/src/renderer/src/views/login/components/Register.vue +++ b/src/renderer/src/views/login/components/Register.vue @@ -54,7 +54,7 @@ :data="gradeTree" multiple :render-after-expand="false" - style="width: 100%" + style="width: 100%;-webkit-app-region: no-drag;" /> @@ -235,6 +235,20 @@ const OpenModel = v =>{ } // 关闭弹窗 const handleClose = () => { + var restValue={ + name: '', + idNumber:'', + phoneNumber: '', + Code:'', + password:'', + confirmPassword:'', + class:[], + discipline:[], + school:[], + } + Object.assign(ruleForm, restValue); + schoolSubject.value=[] + gradeTree.value=[] if (ruleFormRef.value) ruleFormRef.value.resetFields() removeToken(); activeIndex.value=1 @@ -337,6 +351,8 @@ const submitForm = async (formEl) => { discipline:[], school:[], } + schoolSubject.value=[] + gradeTree.value=[] Object.assign(ruleForm, restValue); activeIndex.value=1 dialogVisible.value=false -- 2.44.0.windows.1 From 741e7336f30389e1d18d13a357f70fcf20c6c538 Mon Sep 17 00:00:00 2001 From: zdg Date: Sat, 14 Sep 2024 16:39:31 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=B8=8A=E8=AF=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + src/main/index.js | 2 +- src/renderer/public/img/logo.png | Bin 0 -> 49518 bytes src/renderer/src/api/teaching/classcourse.js | 89 +++++ src/renderer/src/components/common/cForm.vue | 209 ++++++++++ src/renderer/src/components/common/index.js | 64 ++++ src/renderer/src/main.js | 5 +- src/renderer/src/plugins/imChat/index.js | 1 + src/renderer/src/utils/comm.js | 312 +++++++++++++++ src/renderer/src/utils/linkConfig.js | 6 +- src/renderer/src/utils/tool.js | 19 +- .../views/desktop/container/class-start.vue | 361 ++++++++++++++++++ .../views/desktop/container/work-trend.vue | 11 +- .../src/views/tool/components/imChat.vue | 12 +- src/renderer/src/views/tool/sphere.vue | 2 +- 15 files changed, 1080 insertions(+), 14 deletions(-) create mode 100644 src/renderer/public/img/logo.png create mode 100644 src/renderer/src/api/teaching/classcourse.js create mode 100644 src/renderer/src/components/common/cForm.vue create mode 100644 src/renderer/src/components/common/index.js create mode 100644 src/renderer/src/utils/comm.js create mode 100644 src/renderer/src/views/desktop/container/class-start.vue diff --git a/package.json b/package.json index 80f69fc..6b2d3aa 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "pinia": "^2.1.7", "pinia-plugin-persistedstate": "^3.2.1", "spark-md5": "^3.0.2", + "vue-qr": "^4.0.9", "vue-router": "^4.4.0", "xgplayer": "^3.0.19", "xlsx": "^0.18.5" diff --git a/src/main/index.js b/src/main/index.js index a4875ac..9603296 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -133,7 +133,7 @@ async function createLinkWin(data) { contextIsolation: true } }) - linkWin[data.key].type = 'link' // 唯一标识 + linkWin[data.key].type = 'link'+data.key // 唯一标识 let cookieDetails = { ...data.cookieData } await linkWin[data.key].webContents.session.cookies diff --git a/src/renderer/public/img/logo.png b/src/renderer/public/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..45f6e654015b494c1de46702a20e4845e10d4dd0 GIT binary patch literal 49518 zcmXV01yoee+g=)^d+AV0y1PpxB}8B;>27J35~Nj18dN~KI~GAe8bLt1yK~9i@ACV9 zhjZBFGIwU)m}j0hVsx}r@t;sX0f9jHYA=*@K_FD%D=G*Z6Zp9B`+Ey~Fj~FP)dYb8 zSV5rBND%1pQRof`-RgoQA!QA^@Z^x)#_mFk1*7KZ!X9wN_Im5q5N~}#-_l24(1LY>`4+U8@5zou9 zBxGhAem-mrxs0wOFPt;`M%22}U(ss!DS?O3j}V4X{?$DL&e$r`POdllL=_92+g+MF zjviv*FJ`)LbY%P$DkuoP2BKANhG30DDT|rd1?(=kcI~oNlE2q zwf4K*hGvk7e-oX|IU}QaG9|AuRfr&eqElb*dyDaDypp>OE*#w9 zFrUubfjrfQ-j%`T*&b&IQUJapZ@$mXWg^?Xj}Dx+H1c#^jcj!=&4|#Mq6w|*-UVzU z6uI|(4-hVjJvGRESw!8kEUKS?1T(0QoD+6lY$JOEhniLIcm0G4y1ecE#z{HK`}q|y zy8Q3FswU@sDewB5nD<`Ah)ZAOBy#@paveGT{2Mc>MfqFA^=^7PZ?>S*`~6nr(b;C) zCbKyax+VIx^1zEMr@GQgirN{oWqv=w~xQ07GQ@KoVy{f+}J8}+cvg1NXwwD zexv1j20xC!rQqc;Vt0#QVqeryy3MsjE2<_TSM4N4I?rVh2V;qY>@lFsQ zQQuH{6=|2Gpa2E~BM%m!KR76~?~e@#gOBt6HEuP>f4~ma^IMy0LJsZOsMBYN)Y#U> zM*(}f=@0wXPXKLnT~AJ0@*jeJ{6mD&1-&_~qHnp}Q%6p&%?jG(UJQ}^<;4znN4O8> zb~?b9I^2SwPz{YX4vD=ZeGkKlY zhJcvB?t>H|beK{g@`5nvkQRzFF zF>Kcy`KJfo$x0u3{=ta>vD!|V=fB5W)p9=p%Y_)cV%9SSMvGqaM6c)jLOQ~oG~m0P4yyu_98RsdwAjZfMa&=W>@25?I$(B&f9pAW3v7m zl?-tpa1z-l@59Lh8w1R__p?dDQJ!uo90wTw@H{lxIdZ+H*h!?*=khWsDEeQc2r+0q z5{Xzh=jz-oMh^E>LS_m?rr`?*@?f)A)uDG{m6o4^1+N`v(&q*oMUa=KXev?{}BX8{)N3o^HmA zYC(46i+o^H_Ju%C4byo{_1XFW@Q@cXWL`PH%<}C(Akxbad9Z8CZNEFFK2xF<=HUh!jO&|53oY(!_n{A`l#e?&JXz2aw9wTw@Yl2%$a_6(cD<^4-0q<-1+t6DlR*x` zJA)sDVO+dCDOUffQDgxmr>+`rxP&}}BTqWrWC4#M-a1WRzK3-};dD?^0!*#=HZW8k zfET>%{0Dcw{IrogukH9=&U?e$z}u&%pm?IO_De((ee-6kEGo|V<2L&8MOU89UmVQC zZcZbb%#i)epr`?L7~&+OtrE5umdmfwj(GGY@Dz%)$lfL#3O`sBg*@Z~;86fW{AA-@ z3K_BSjr~ugzAS9N^`^Yefc}Q`Wwd5y5T@n*^6la_?~>;x%iH@$$MN7q1#Xl$L${8- z34RXLzVEMsx7T^in|IF);Q!N0UmLa`Jh{rO{U$cah!JeU7fXt99$?2{wYoFVGT|aulb~1MJW~};Az(a&~UkWx@5Ot*x zE)%qM<-|k!-yGTL%qzejZTpXpRnWWCr0%Axpg}YEpZC~+C9;>9S1M^L16F36LLSy@ zPIR{0Nmi_QVK-3epngp#&wmDQ1}TLa^EvgMIm8)WSLLq9hHdME?l)S}VRsRMN7u{$ z6Bkzvohw7~Zg0*%jVM#L5Q5U4?+IG zKtWWQOZzVRb_N3|lRcFl_~?4_N^+xQx1pKR!Fz>;liR^pOJ%%AvTo>IdH0*ptefA5 zq8;W&#X&A}0Pcqhc>ZheovjYUb&3{iklC zTS^q4$zrnq9)ngrctJ~u#cilZZ)`6m+I1)I{}0OVS23%3d)n)UJUWMo%`f}Dt^y&> zwL@A?mP}mzL@cNo;g1r9kHc_RzWarimJV|EB-^#$uVz&VCrA=@#naGNv_G6p<&j09 zvW1BFcRUW}t0n-k<6$&EJ|Avg{WDm1t85oR*l7$O6y{7{;yBiQ)Ob{%8_W#3*HD%g z9Jt^I3OPF{gF!b%`^@(qfYbAx-*&yV5-*Z5UNb0^(~zg*oNcW0_Rek{S49eQB~}$_ zeFVEfppB(cP`nt-V~l^*DV4IhZEmM#O>3Lt0B&WCV8*tJgE%t&m{{xP6siAiE?e)f zIrIYh^FyuWT_wz1!1pR|u#Ggb#{b9lUiFA}XVhT@W}$p^+qSj8h1$m#T_0D8Bl!pW z=-QC0U;TZM&cgv9#Of}k8|>XB3v%dh1Ej(-})|CW+8o(&51lvQiDtJ>EZ5y zLztgHPs-a5n8Lpt*s!e}X1AOjEMNT@#5t#^g5DKw`zEOoc16*(!Fe+Tov7CyXHk|~ zKkFmN+HTqvD$?M>7fLnxk%%SFJw#4gw*Y%#_s$^HYnlT>6e;5a$`?6W@LKuWQdgWL zPS_>r)`3i)F|A!2tz+T>xPina9f7u+r=Lx_y!za;ahLl*iqfL4Q=i0l90U!sV6ndx zYLHOIcqTGAAAh5P?9}v<^xTj&Un>>ReHrq`kQA|!i)D7qbNv)Bf~A*Y8k=bA{n1CY z1(9lRu?O2qRrKagtzd|qTUp$;b%uU9v5*gyk~~;ZBUdNTKm>BDZGL|>Q?nW}{o%zu zjUfc?Y$?X>rb5(*Cj*;JUOn!-xY_ujJUGQ)A7<*6iE29O@FL3ZU0bh}lOXN>@83F4 zy1`%hXg8ub4P~WSr9jZjb!foJo$umR)kXt$_dmuA4}V*|w0@C2+L)|-A#b13Q@Hjy zDErzsl~Xm-6OX`~J<-RuB+*ZwZ0Gk#E@M2ttyZqsY@GlWT;0tlBKx`D))6rFJsVu(E!-%TDbk%+{eghw?5;1tx5)dQT&Yu zj8HVr+;u{$FPj6ELZ^dSi0bgK z8nyV^rd;;6_!R~H( zn(N^o@NI;q4PT;Gh3BI-KH@L5Xr!RnEHrUw;j_@PNokE^>0ewxrjc!$Mnv3{Iwj)p zhd+q^IvvV?xyAWf_LZ3~t$aHYSnovq@7CF*FoD~Fu$oxQ9U?ga`NDfum+e7szmvrN zC6%+2_jqs?NAHu#kNWcRVr*HUA4<;~+6{0!t1pMNB~^OR@;m=kAGT5QX28{{pz>l^ zWlL})-@jWKBQpCm__VNNGT0}_9{=0z02#4dZ5zIx!#X?hCN&%5IyGjeRq_`Jc7xZOKeZS=An! z%cK|?ZhlJlj$(Hn{(9BzwOb*X!_10BabM@_=nqGH75Z2#9w^~_nfit)yXus~V)qB6 zFoTtU5{;Bda!1GfhMw-G~Zs(2Hwz9BG)yW)o+5yF0~{>zdlw#|0A zJ*K#*y1a5kDjAxR@LTn*QRrkFue{{{T>73`yZRD-GRIKFk@;ZAM*xf(;Q3llwd=@|dHQ|+p&l;VAoab7K z9bPRCKcRAz7rXmc*&iKP*IsRE<(uX4_4{$j*~$WLXmVcfDdShWmS)zWrmcOh65&^w zLO7(6e=N=`J4WKRhf8Ta2)m#U16I(Wv4oigHbpLMyS&l*AzTw@vwuY%--iw+uan3L zy9SUI9M#e}QO$j;@1jGu1WMj0&OGA*>?dNdS@=oru)c_JDahyWLjVX+Q=RK+c80pm z2aMGN&mSXOvm-n(N#~E%_!l9q*Ed!xMt6Zc%UD54neI_pb`lE`Ghex$mxPDAH_q03 z9pAEe*>ThG6Lt|I&!7tzD-|*#?Q+MW@sld*fuBOAjv;;+L5%z1TW#e(v`$anCfFoLyuh)P z7YlS=4qTx;x6?#ESO$VRFMFV}$CWfy_haw>ya>Z91GaaFlU^(`Csj9<&t&;_*YTJ7 zZ7wHqK1gvWl}LtuM*QE=+iN4oCuC^_F`|I-P>tqGmS$|)+ng4QM|wy=$o(oL6wZ}n z4iCjE0cOLRqs?8gKEIMl9(DG`T|Vz(%|$%5e-fnmjk}_zxR))rwj^He)r-fuRK9fE zf6xEHSbJE~AHr|Jx6;Mwh6r-H{XRF}x6h$O)W;)}MO}OEoX~TJRZcn*^cVc{oMuUT zX3X}RcVeMJd+q#MO@oMJlFcWQ?r^>{C%4BpzsN3A*J78~{>7FfH+?km_Q#ZSK$8C{(*3vnO{0ZOa2ntcsae7H;*|DFtYzZWaI=$Te zwY?nt&|8EEISwV4NaM|cjzq?iP`#1|Gp#wKQ#MJoS8IL~wj$vRXgV>-mZcYkB_))w z@pPTyce?(yzh&-uFjcF}qhqA~xEB`AN22kA-STGQW(H(}b%^rjArNNhK2n=Hrd3jr zwjwJJMoFxnmug&EEzDuXnPL2q#{hp&lrFqTA#xq~;_P(s;(Og+rQleF|2FvZ=dD$o zZ`*7h-E1|JSwb?Oc*z}T|IR{Ku2N#ilLp6e zy2l4vd8%Bz{N5(36uac7D9i*fzWqAHV1rPyf(teO~Yr;`LHf$YxT5U}Kcd8#@$Zp&1)A;xw zj2kgF89!-w+L{ejm(7ar)ze2!m|BgA&IAo4sa!l&j)}H;cmGa1 z4R*7z{p~3Qk3`xAJnvF-_;1%Z`TTsu{rU{Oo3r{S4LfC9oNlTwvR(n)WrlgWvv9KA zdp79l@sV+j#S&ppLH>bN_&8w>N4jB?jlXSKA7T{rk^`^eSg)Kl)EPPbh^> z__a)S9uHTA$G2coWj$n7(~@{?~A=Ex&vijA&Bi&3;ORhuo;fMh)!Q72m^ z&IGD#KluE)c7mh@m5Arfo+Mq!g-zOaBTc=H2A-zc&OfoQvagCb#)XxslamrLZ{~R+ zo&WNFHTKdlLcXM=rs%-Jw`H@t~bYSyve`JH+Z>;_Zo8)>;0_Squ+&ey5jHE@ZlfnhYZ5oaYq zmqA8YqzmDf4z&aeSajbcRZ{4+aeaqwOD=P^TW=~OJ#>9+lvI?(mNkD)TZtsOdEe}O zRGStJpn|U6E9YDti@Sw>WpSx)>h1AyaeNZgo%R8=dS6siI8v)OkVl=q>|XN<0}PfOeF84Tx!H4)!Y_!kI;(i0inZBCZ= z7@Lpp7rd=`(?X0b9IbTuWSe84e27NU*=)AJL+DS=ny;~b9vFc;Lo?WB%|1d%l?XL$jLGr_Jnodzt;-?2 zYn<^gBPd8{7>Q6=PpEKkRt0$QHp6P@z|zx%)Va>5(S@k_?q;s1kHqG(n5XJUBt{%F zEyS@lJ>{I7*!_%lhZrTZsHRQuSJDiXR40$3D)Z9_mTcbxNl(AjRsSU^swb;K-RD6v z|FSkSxT}j76&$G3L{4yYi1^37xbr!&GshjU{4Art^5?D|-SGINQrNF?laHncPh{Ec zw905kDTtYWC^TJKayTE<%87~$D=IO&c?frBC9~N5c%~sE_WcjhnEQ4%9w(bPSyY68 zTz9kT%%y`$mw=-Ud*t~l-pu&!*`P=k{EEukTGPA2H&|5s2KUAfMa%i~%hg*@M#gdfObD{mYnB$|!DB zEtOB_&p0&yxMKMQ!sLSuGw&$BzY!nks{LN@kq?0#h4xt?gO?sHrqa!s4^l^)nK7CKZ`m8Bxi#1}hp43C*f4#!4dttp0@?C8M}~)m;=Siv z`nT+Oe)c+@kdVrI4%3!_BP85iWSkrwUs+G0%c-s4Y3l0St_Ot{c7*L92xmQ9hmVL4 z6{Q6ASv>DF5TdV%BsKJF>Lwx|ii|l=*=uFJLGwOM#^KHu{pwjkEE~s6zXP}mfqBp`;L?lU+=3yqz5CmH$JVoov-Rg9+Pk48EexL=>w^+ z0%nTH&`&|w-8i3(lD0+d{H>a_)aT?1ZrhL3V>siLdAmxMKzXQ>wmvSI^LBS!U%)DA zrTL7gazp`>U@t$ZNU9x%QN8zi;N_O*qpO3UMpE4nbb2dpctBZl>xJk)*EK2}ny zZD4gVnANl~Y)RV#U?<&v-^ZrALv>@n+nsEl^11Bdjl_tF4x{J+*B>#c`+Zks5tp{> z#dYn^XNNCCVD5<6(8&&zScqald2wB#uu`D$H^H2Z#vA(gpBPCf8RIEDF@Rck?)K@d zd{(h&&$KP6=FG26UI;kL#e5&-L@G~rXzMJ7!!=`5u$VP`f&~bhQ5dsT>)Gg*mUd5W zT@!92V=6Z~&54Lt?ppMJ=C4-QGxsLw36|$l_11<1H-M3HB`EUMs$AK~xe2X|g!4qI zFyC$SF=Y>L_VI;3OTMQeszd+EejhfSL&B&=`2L>MSIga}j32P%!2LlUd_7(!7GCO= zxvcIB1%Pd0mcca^Q@EN#W;5yiCBcz-^DY6Q|;yyE}YiLDsai`Ej70p@7Im zQH+SUtFGkGNY5!^$ygiQ#h_~@aA^%Iq&2TeGna1{l9nLjetm4f);M zCXLjYkOj_Z-XDGL1bDXP1u)u=p6rVVXBo+Y*>;`%Tkzt?%5Xr?Rj%<=Pk-0A5vMkv zxryQ>_)|bLDy9H>e93%F2R4ljdQQbNq5#pwncN--+usYw$<*M}!=&v$T?&QYmfSqN zJ$X#k1n{C@>`?#f9PLZv<90~4GQ~N{K7Iuu`h-II3yl#EI&b9rYpZ00em~Kq+5Syt z_7#R@xgY9E7D;zu7}t!Zmgf*xZ+t1Xz2_*Y5(rz7|DkgXE3me`8vk9BiQk3mDkmwB zrRxCg7{%ohzLFjq%*30~ZZHzyP!fA)h^pYGME&Gp0+1xQc!X0@I8&F^*ta_GO_01; ze|I|rQ~vKuk{8Vsc~egHMLvoB>k!fTV!r1_c^7s5Uq#BLidT?})kco%c zqsW6z6y$u6-0L*Xu7B*coqpA-9evr>GiLWd=~nZ4JW-QPDfpKFeY!B3v!>VSU;Yy2@Op|)zE7N?xY?SQM!5?cHI09|&xM8XQ=oe)%-G#x z3k!EQK4W8raEdPklm<4qSMc-nWx1)D3MOxx`|KDN^%LSOB^M7=mblQu$4{fXy0tl@D7N&ei8{h1cf z6IhkjwaMSLZpe**`WfxFncznw5)qG6(y#c-6ryAeIg&2CD*htP6f2eh*w2bSuZqCN z-y>_Rb)B`b%F6!p8XL9(BD@QWmQW#TXfPICbj1CQ5Wk!y;PQZ8`<_*%w;e+r+TKEo z!>a1_!XGwlaKrh)#47<74)k?#x)5oW5%NjA(wA}8)qoRP#rXAYPPvHi9{zRE%Gi10 z&B6w>bwsg(v}n14#!pLPtefju2k5+nSPdwKLLV1Ez04uduJpY=v`lW!89Gj1lL0Es zDcHX;uy2*{qd6VdrRslK>-vLBC?DY`+S&2<*)=9Wvbd#$T8=5vSIa+y(z}HgKzK@D zxWj4F<5;7xF4(lH8)Qr}H6cO{tDHc;4>^kT6q*lYE7i8y%{5BB zSd~v>_bJ~raE3g>w*!Mby8w8suIf?XDB0%4?%r90Goh0$|H5!~#QC)J)n3ipV>2FP zqpYj&2Dmi2fHUECT#qSXR@S3)sOVv5^Pu8kR2KbPq+;w){gbQZd5D)@ zV(>~XU7jZ5H+dI$TPLdr*Mv?+%mOF_4FGDkbOtAdge;zWwdvMuR)1&itq?SQ4TQ3` z|DC=wo5!-A$nE0=5@4J+611_26V5mNOHP{sMbUrw`Ae_<;b)?w++Fpk0&lFaTTsEt z*X=O2A-ycJJ4tSx()3e+F95~3*%~c!)F+QXl0Zkt)Y`}?A&BFevF_bOK>?ur1@os< zzrf;=x_Pn$HB!Z+I}CYnaV}`bfg8^z49`&WrPriJUMtS~7p3{Yk$qOT1oraxZ|ji^ z#G9*=Xnj|Dnoh}r-R(z)B3%;xs>fE@AamY!mMiZy_RH+?Z4#;n{_eze5nea=^}!GM z1wa@;!Qp&n%3(!}M_+>G^6keQy=~r>XOcXlB^Uz5fSTR45ex@F;^XyWxPC+3ihc(O z?dn_KNysbB+;xR7BJ5PpN~ZeO!L`(@gey%3bzAAn0C`u-(|y18W|pD4d2izh)-8w2 z``#1WaCaGhlz@|$I7STS}eZumNXbb6yid&5lrQzwhv-@$-0 zQbvMyX4jo5pWtN~2m}0Wx7u14U0oML8I(QdEbDqcA(B3pnE4DsrwGu{aQ85r(A?nB zbEf>3M{7LP3#Du0>bxdPMWMlXhH0UHYUK5AYe178a75b24i5K%gOCn*Yi@HWKr1`A zmF!*@OXsZh8Rh&Erntma&8<#B+s zhtJz`?y)}NXQ+pk`oe0%AwkvQw1Zkk%UuZ070>~+W3c-7v}*!Fk;>v{fl{7LD@O%T zR#Xex+RHbObR@`U_}S(Tcw$%;fWUZWP*9Pw-hz>x*OXAg1hX1B8491)$?45n{s?JS z(7Q(J=FSj+5#zNoVk@|zj7RLFb&h?15#_|n)?ynq`nMGIdt^0sD8J_O{nIRIk*Y)e zgIysM79b>M#Eu{WEgvM)18AvUs<$9SN}&<^633DlWR*M}*`sbkyR=w5nI*!@VA$v6%a4SGK*WL6|#h=F;+?LY+;5Z3Z zcA8sD4gh`^NiX)6a#%7KSo+AqF_>uJoKI zuYQ>(HzZ(Qno_$Akoocm@Zs@0-7w>%Dz5DJ7$NTZ=^5yse0=BC8?4XZ3Z2z?f67CE zZpr0`ayzF@o?qY|l%RMDVxYsHm`eqi9E$suy|({-P|jH27O1FFOZ?{U?e%*P_lf8Q z=~6akIWfX<@_Zo@BbLBpMq={;q7D1LA>p%KoU3Ftws__B+S8i zK-K%29ekZ&4Zo=h+f))9PSh3WQcZk?ThTfl5j9IGm)u-JOVZNI*DujTRBKs;ico{! z6_G`rGNT58HsO19%y{t-6uevSO{<;!UuU>h*B8rqr=mVzsO>ijT5u4(j>#s)-a7QZ zSFSu*7z0cA(v-V)VI&j5-lw1sSS#hvSus#dwGiFcb6lnjcq4XcQ(eB4w-6~`0T5x@ z_dgG>&1B!av|{}*FWqlLL*AFbmLDicutTp)^a8!hNO{JSM}LeGNR2#9!nV<$PtT339+Ec0n;p5 z`y6IL(-U5S>-reR@z}q{sSjmcj}E>q9UKaH=#=C8m7~tdkyL+z_{n7=slGc*ZNHZ# z**&RV`=t9#G73|V>P)XM3!pdGdTB!t5ES=SpZcOqhQ2gzE^3TuOEb_hhWtIYdlSYu z!&PdjViPagBzmrQ=hTBIrcbx25l&m znzOH>0snq?Q@KYF!RA63SCn>M%qd)%HLjq{7q{i$!Q;0m+&QnrPW zVYbveHuLW6PYrWzZd8euOEhlHk1>4%Pemd@q{}Q4sClB;n z`i={UFJgZS+=CC~+;Yw!N=w9NKQ9o^}5b=TG_-B2t|Fg6|_d zkC&TgMUv7-_ie*@)>Gm=y;YfYRCHk4cpf%EV$ioRj;w5Vf_PYo6a{62`}~Da`bbWw zC1%vUv|DA>HiL{~Arq-(Unc?eI{nNT_xGZ5_Tw>jPM)MA-w^OHbM z1ndJbw`BiL^bt@TOxY>(GozfP{z)q`c8?%EMcCsQHAh^JmH+Rz#C0HB#L>sw`C+nP z@B;<9{n)Q-ckL*v7_wz^l+?nTxX>5Ry1C=HiqiW0Tns5;GP-holQs1ST#A7S;!(^@ z+F{^~l<8$M#$U912A`0pU|NQz^7R%1VMSIIJ;N$Nf-7g!I#+rJ8O^tJ}kv(XU z$-G(DSrggFO9pNInmmwt69*DX_D>%AVx0T+tyOmVyXX&+6j3}*%HWEI_3b01O?M1P zZ2m=y+Nv{kNFGEdr^rG<>?b+7rj(}#`Kr6$?~uspN<6nC!jpe9JX*Cm{wy4}`siPD zNWM4Lhp#cV*S4f`Ym#0wYPYX>bWPep-9~S8 zK8HU?weZ$*+sopHi11l97bEG{&24R)8(Tl!rIYI#8B1O8p3p7LZk|p0P+a0fFmwNO zNj7frnyN=hfD&@r8G5wui{-TS(C*gyJ?My!>=J|=e-*LSW@km-T1xnk4qe;z;;<^c zZTDyFKGi2G{EI`(J&V%);)8?cjV^``KuYp2m9hspRKVYBWP{hwK&H{gf_<056;gg4 znBBNs`wWd3V}# z^_kJESNhSE6_H!uF^g3*Qm+=+NW6c|=0@i}J5Szs*Vz z4KU6+1HYwbeuku7QM0T3;dtELHIM3?%hKHD`DjS;R=k!x5o-%pGt_~&_dQ0$ZS#v~ z!`xnzv@s258KzpE6fTgX*>lY%=dvO`@cC&N6ZYVQk&cF3HyQB@-oU?%x7rP+uMB3V$ z@nvM+PGksUXXpLmA!ZLiv7?i`AR?BWLqMI za+`tn2Ne)bau;*W$=}dtY41Pv{s&adES0LCVFUNOeSX=IF^J7S+j^4ZO#A`908ckI z;;C|81yZLz$xh(b{RtbZjvmr1G8$@bXKgh6aMx^;qP}LAS!jS+mti8qU1a` zEw5+9zYJoZo-*Tgou^$N6C)RXcTM6-E zb*R7O4sAYyjl)RwEyjg2@ysYEqig@o)N5rgiO_<4X{(c^Pb3qr@qv`Tev~EPIZBpr zacrz^I>e%ywzv0hT1dqgk+rfKp?0tQIpO!gk3k^jx8@;)Ko>-`0sCW?$s5m^H;>+qlR3$X7Y#t%;?Mwq)u(M0(1`!=IXtva0Pmwo2%oPo$q?;73YPJNv_U z!U@Q}MitN6pF#@Xv3Nn@%szN91P1rZL!>i;b~2-xG>w0u@jWk91B_&j9tuW=cnlQY zOhxG~NYzBpY@wG_u+#O4-X6Gk_&ImeKS3?g~3ArO_R2vrg_m@P;q2;R#eeAaw z5bweC&Tvt)l~(uw`Ko+OPV5@HFVA0&xbJ=;YzNMSYfg?`B;9LNM2x=NPWH?=%AokD zIsHZaFzapN_2nUrZ3yD!&tDdluqMXd%k!7=3;}$($ALk?zgABZWPoFZXKLx#@(&e@ zFE~qGJ;`IaG;9ysFUVtj>(a%DmGVMlFwLf*#bIfQ@~y7J=dA6CZNdGhflZ%Yx%lDN z|0by-U41)rW3S44%L2(NcDV?LwRH?>Z25K*3UofuY|*4d>fJkj8%mqzYaEQBn_YU} zIh}>dHKNSq15yIT$IhXvCku4Fz1J4~D;@y>hn9qi9A)Ng&Ap$(+b-hHedlM_)Z;ZT zwAY6EMnx<1c0&t+0^#A2>OQWh1m}n64<)K38N$)opX_OH9-BNHE)!svpk3KL#LQhB zXz=t56z_Ok<;m2fNaxk6=%J(mI=P?fv5ig0-m^ zm4xl@2l+_7&|_9qIH>*nlP)YCKOm>8E7-Qu}nYitzpHjOD6Ra5@pD$8XbW zGY|vUNII(v0CHFzl555yv?!iGLpsCv+@qWv=bC*IdpGt5SDhW49o+ri#SP6_v2qx) z_J``5Zv=#8kq*OntcAQSzfC>y(h0q=`?&SI#;LIP0PpUS!Xz))8f11Fti zp^5aqmMq)5C4khIGa8P0t65LBHyZx=LXhn~wJlr>^SzNvi2ap5 zS%UjrP{M@!=b5W(X9t`WUvnHhZ)P$cP!DuMmU~1s00o~OCyVwoNC*6Kz}1V%KloO> zt#vW|BWaJ?QSS8Mw;|jw5L1zIm%|}N5m~eK)7e*XDaCo8DUZEXm&SOVH;-Cm1X*8S zAk}hv0t17W=G{K~Sm^$>?Tru1bFr*Y^ZCWJ-hGvb8q%@6;;vV|ylk#Zw3;T)+B7<- zYi&Ewy37?vU$Bt!*kc76b3PRxPob^PNQ_ck;A0ykq_8tGO6}4oNSuKezj)X6z67<~ zwo)XH5q0GN7bIHVf+a0Gb*yHjg{?ogEuJ z*%p)cHrhgtN-b^W+2A7swe6MfESNn0t#9UFx=_)PMrZudVtq}R9iwAt@_W!2OWohw z+NaZ%V>P0K-t^QO1_fAux9Pd}(H9reaoU6A_`0I5@q)=lzd&eczexAbG_saFYa&#Q zrZ*xLACc<<3G;T(IQZzCXZn*d{C-v`YK9dCGT#G7aU!3CZ=-uRT;d@wUX^Er_w6kg z=kAK6mt@QC*XL1Q-=;r#`nlGP@J>6?e#ihX?)tC=Qqx)l2>pDhYi+hZ>Uuzl?cJe^C^(k;=4K`Ys*w|**10M!7} zY3GGxrBLQ=oa*4@WjdVGnY^1IAI6ydxrh+bDHdXc#rpv?FH((ITMuc5e%W(L($Ve9 zT`LEf%wIP6)G;XF!TgeioMd-Ps*vA{us}J7uC3a^cdnVcbry4x1zEJqRwmzu)aRvS zWF3io@lg9p^0scpOJszZGV%Anf&qw!RQr}A;WqRo&(ir)n zYRFyHFmtGQE`<^k%ZDN+QgNXU^t_v6X=%T@Lioese#aihk4dfA?wfrKzJ?=AmvA5| za|Nd;>?iukv^>ps4_Uuy=?frLbf_$GST{NE(N7^Kyg8?x*_@0Z7;`glb`d#Ejq*3{ zY*RgwWJ6D05bQ{xN!KTAcAjkP*UO?^T5`%4!Y^cWyyhx-v6&NVXhinb)gfF{la*se zNw1ohVr}GsNJy_dx8xiA+(?+k@+g~>&7t`EyVoueRa*Vli2ZCgBE zhZ{{rR8hJI=ZyaPDpYmw;%wj#qr=!v6FA=bN%r!WR^E9aFZrin+e}X+85gU6jH)W* zy_##z!YDVcdJSp;6Vyy%|7_GXE8W+gHa^2XSigN=4PN%dy1BCGeHLYEguvZ{#>|K? zc7Rus7SQNgpAFA%?XufVxo;z&jv83-{E_hQ;85s~uzPUAp^N;|?6xj>f}Utiy*X@P zIFoProt{v!fV2ICPSm@>8?*gUBKuKv|LxGe8o#JJ%Az;=H0az&ZZ%OZ3JoE4d^Qfk zVj#r(*cd-m)==%98wd*W%;oXljcBqFKvx6{;a`x>*YO=mORznhUr3yH5;o>ZW{vX3 zcrC{h96??SbFDLs1>8GEjEsqbY2%G{US1Ab9^nXZ3At4Mu;0opEJTk$6P`W2-U#i9 zn-`Xtzp>ehZt}*(A?296&d)C-bI$^^|C=F0 z*yM79d#*o7h&UKP`6;w~Ydvv7JQ(!~T|fv><2~|J_Mwr5WN+N|PUT1Ki46&#-`tJW zNx>HL1)VG|YCJB%$Pc?7YDT1R2w7pig#}t?#h=Za!*QaqVAkjGdlvb0BMeirD9o9F z=C6ER?Yhx#CkIkRj&k8RGb_HTPurX3f7S@1B_4fNV+v_ruyd5hoH^u1B@-uJDX6Ou z{w-Vi$1m6Dj0D(XYAYoUuQ1-8ZG83fF4m?Oev?mN}S=h z&0q$P<0iCjX)VfWqxhon103LySH50*^rMGHGFYZc)MGqw5e{FuB@(i*allQ2kbS?! z^T5);r{!PDC@NI#NjZw{@!g2te+DC9FmkQaY?f<2?77~uA3MTzOj?O9|s&hxGiY%JOe*SaK=nS0J8 zV^>)!QNP{U;};K4+8JwSBg^<&C`8fDpbrDpGCUYQO>c){5tF8?A^=_cM}%B~t(lZ) z(-nJ4pR5->5%)1JzVyw*a>9=G!e99T0q^}30cfUumB;>Ul6N8vv*4oAi>V85a|G()@f#j zxq>U4>Pz>}WP*(d{=o1)Y5nE6oq~d&y1HH954o`RktK>wZ<-x%gyOG56kWN12A_wS z{(XP=j2k!jqBT6z#-AH&kFXEoWrcD3iJ2t%!d{kN@Xz>O87u!IKdX{<=ZP)FCn8<` z&YCRLy`>p>%7yJ;qb-89-J7e=D5uh32VsaWfwIU@JQ{sc-{yNEFJ8l%!leSx{+0&= z^fi;gP*E~W!!6CGTru$M-=|cpgd_8`6#-}-e`4Q-w|8f?D{@P*TB)U*C(}VX$D-}jmEP6u{0P8-P?)Xu|?RyLkEc)W? zV5h`CxR1iy-6+|ND@0=jrqtSNa-=IPY;61piSKx3vYSVh4+ZBDyUQuoI6MTwi!8hO z=r0|fk4xjeGQ6_L1b$>5??E#Ht&(5f8%_pMt3>L>&62D-1ki6awvCk){!2?NzG;eFSkgr@Cebt>mUP6*F8iasPjPe8mPB?H(5s3}jroWlv^b@;Z+lo0@{GAG< zy&ON{fcRAkml~+0kND##OjfdQ6h%A>ayfS#oNe)5ja~f@xaq`RvJ+1(`xP=epV2$) z-oTL-lioch1q|h}{dcKQj988T!Z^FyHOe4rVvb=L)1QP2L;Tyn7evx=3;#4UZPsDd zkZ&qw9trR(Kk8thq~1&gWavTbWr}xY|NL_Z(KT0^26z6XkwjFoWS`w0Nlg>%r%Q-& z4mvL*J~?Iet`*BQnUc;}?QW4EKV2oU%_}H;H(Yv-z%df6vZYd)|JIMy7c=x0({U<` z(D5U@_%=>cYcn)RD*bo44#e3g5rAufD^F)?x5yUz>{J<4j;oWN_rtcTx}npqX@-w2561w%_|r}E zv58i~=i7&%Xngn4tFWNQSOLZeB#3=p?1x^RM|_Tf{7&YT6&TDHD)2~f!j#dvSER|q z#6I{ND_V;i*?T}n>7Crgav)*!foN5ENj$fp{*c@nnRL*oK zPP0DSzKz=#)Fwqmhu!0RBbUpo#d+ha9f=&pSmM<(3&hs>A5)kNq46t11qlMl>OXmE zzAP^rUnNxg`~hW@5Lc-vyo#!^kL@Oqf0&HGCF`D50d%8GGx>yYSkA+0gzmYq%F5D z%eUUf>J~~Zf`tXk&lQfyCalMp9JsS=Pu{2VnDM=<_cW}{r{!<{ASpii*8LMlX$<}S zuKB_uWsgWDe!T}`|9tvqEWq*y&mLh}GWL0qy}#qX!%5@axu){eAkL@o?^>My@H?Zn zFUHw`$DRrMuiQW3!~5G?Ou$gnq+qrEC%DfLle{!#@JCz2tkFsBnr(n0@oTnbNbbni zCH^oY8YWRBSh`tKsF3_iz`jf4q@>?nA$sKk?>D}}#>dwxdfeRIH zb*i3=X!wGEuE;VfAPa=H7M%j2tldpIHkDxnOqqD*gxUIhd=xyvR@QEffdEsXZTwF` zhmxY`CN`^&hz5;lKq;~^LyQg*M49fE<8A7vLdK)vNl9#UxXs_FiSm;i-i!vO>8EpG zInva0eiK%woXm?)z?Ep zra#|O2#+a0Kk^oH6)|^cKN=(RRNnZAR{${QvXn_r z{ph!CKse|$UC49VS?ZtP)5GOEZ-2W4_zX(8ZEw69C$1KY-p7WUV>A{aTbPl{<`a%E zSgHou3g*BU+zPqO@gM_cJ4qAC%cvZoM!~_}NKmp`(WK*p?VfWTJUc$`@XpA?TM>im zt0O(|R@o@Ed_(_nI^!+$s@d&(=DXjoU&ZeunZ6C2W1(89#%kNx=^Gvk1_R1GrwwVsDoP zA<~n-Kpg*GItR|&eky#Ds=;-UsC(Mh0KiqPh3t@|l8YuG#y{kC8B@tk7q3r-$yAlf$7c=f|9%pcABh>gDGpsq z6Uf`Ch_QC0?V6n?NP189hvh^y#nkp8WfEz5UIh4CjKK@2(e6 zX;ks1zq!~+h7-}+c5LS6lT!50Z)x}ynj(2$PoTAzxHF6@(9!%f5ICXX1f)!`r>l%B z0Xa-`&uZ64952~8yYEwu%44num|YL)ld&CJ9{*0Ub!w;VT9CP5_p@N??IyV&C;UD$ zu=Lc`S{!Z12>eDf3H<-BC2f7%BplhzjkCJ%9#?~dtSS}QvIxo9uk8vob**db=EUyp z*#6|l<~#$hJ=ozRYdp~n1!$bh13RS zU97)3QnQVEqKIauv6)(C&FL04HG(My?`{A3gty#<88Gsamt##qXB-H0HhFp!!b;!@ z!z%z+RoiXEMI!XJoUN}Pp1bEP3$~8s(j{Tsj4*6951df(2(kUP-0KjhFQOB-cv5Li z2N2tR=iK_`yPVBda;gu6EX<1RC4UTE_BxCl`czBNmmzl%zEOVA);f?SRI{xey4BmR zMZPRt@TS?+%3nltkE@k8Fvo(13R#n%QQksNC5)mPqz}Zr+C$a2WmIgfrf!?P1F(lI?Y$brJ4&uw*8R72fL9 zfc>}8`De8NstIAGG@zNE6sxHBw0 z-(Yp>oX@0E=n4yk5xj|6^3oI@GFG!qZn}jT!-HmDAC=KTddfMNmxp#?NK?98I%Lgb z)tt?yq=i|SiZ-J)O6@sR11c(n^mz&-#xOYI%AeCtWb%sF+-bfrHyVf5$j8xeHwWl3 zzQ$PPHxe=DP=S~c`&)tkn}d@n6R%=mH)S50PzQQ?(guhYn3RW4&pUJIKcfRX#0wF1RM#>C#@R|!u^Z4^Er zO>#JpR(6}I2-9m!M z2Q_g42p=})^FD_5>wfx9R%{X8&%8(C?`XjA&C(bQ31^6ST_N*Z4$Q@tmDTn%%pRLc zn-xno&5};BXlib2mn@(&F=XT}?N=1~8A_D$`D#D^Da!BT(Pcq3`Py;{*GsXR`B|tW z8={%AXS&XwW-hXX&vA-eO|$9Oh;1(l@^!%i0> z1wJYrR(Jofeubb5oj@%hfn>V0G~|+-<*i3%$F~F*j}Z{C0;Q(mL(t)S+3c{yH46rpfGU{}R>t#$S2;so`|0Wb0Lgq5t(8L%V2%wY4_H%Msqp z0<-RDz(Ih`I+kCs9eM8a-r+qes@BHj4Ygs{Ru3Vi_6DcLWm>Ql@FQLFgu367-2L;r zJd?fCLAI1BHd zI-vVj>DIHnbe~_AT4lrb@?{HQ9RB6=nK~XWVA4}XRbV*7(jn&SJ#!}$RS6^s*3%Vv zKQCuddjDKjG4kj|uD@Eguxw;#xs-e6PCUPR(g~yY%hNgxy73a14Ebs6B4(z5tt~3WPT<(fabOkB?Byrp_Wbvgwohsuidkf# zKt<&KH&m$?U99T=`9|EsJE1>WjKV+R7OJPN+9f25?&+Z)≶~LVk_% z$tE~&lIENR>pu&fVPcXBwEtw}qsVfzFWXkT(uk9qD|0Lh7T|^uZjkT2)pY*53HT|+_Nm4GGiWWwxv{0`@f6dq z2F1fQ%@-|9#?$Q~)u1$Ih>))XFAQ~Ltf9qM{7QyljvG~Kh zRHt4Ax}px*A%izQ7dJ`t;2Am@VpCVd!5yqG4lqY)cKgDF`#aj=51&nB(l1BV+jf`r zbta41xPKzMb+xn@z(HM#0jGD*U|Py@Sa0##&(J)3u$Xz-iux( zMdfFW68!ye&42G@n8wb$Fe>BdK|oxt zCu||rRlCbR`y-Tf&8nO}1&$e**5ztvV581aVLRo-Wsgt9(^L<|h`)hs25H_Ss!y~P{DQo2Os(F8a6qJf5*sQM;~fJS{5Z=mR8(A{R_6Go=6m& zre(8j(P9bRcUeT~i09$9u&&{L z3;&Z<`v@@JrqtH&fBko+hMtVy)LKsGECQ7oC-C{>(t?`r6qV9VG7v z!reKjq^CNSPmsMMPYrMg6M$u`@N)skN#r)xNzf|Z{B(Ss$E!n7Nt2}w{{mV^)~$tV z3W4*wxH3@1kIz^lKu5xxxWe^}7?}kmMXl;EN#f+h)D&b~HFDy=!qI@AydoYohj%X{ z)G4(KQ-#1=ZwD4&^@u!B`|HISn@#Ne?AHU{)uIp!$t6!0-w0XQ9_%KzNY}Tef3vrj zkntq((9xIDWXpX(WClrPMH!}|ugm*qy~xgC5fsUd#bX_l5vUM5-ICO`=@FJwA&)!r zPM4GBheVzlIhHf54TEDml?g1J8)?}y!JDQH(ANbFIYAHG9kL@-R8Oo}bOXW(&4^Xuh$5@OK9$3Nux zEN{8j%3Od?h&i@VWRue5_Fs&PBPhF-jFQpTIagC*AT$@AtM_EZAZ23;f_L>J1Rz(! zv9JNI2^bHRp@^_izMb)A`>4p-WaZ5Ql$M-rgtfD@z1zPQ^8Q}of5 zRFTP7lI*%8BbAGxg?N7DTG!H&bCK%y6_ykr&tBL#e{u^{jWQ<7lV3SV=Ti?CqW8?a+SnX-&Me> zK|V3Ae8)%Z=Zeg81(&HfLK-$>(t&e9V&d$w@_D}fss0XK`BgLBj&EN-{1 zCO0k80zdY5xcWP82)MZS&mIW1rN`33Vc_-}+Xb18lq@4qb9tIr`!LD}5iSDbgJ1)1 z_z|6_wO?vsLgXW_ilO1_EF$0xid>%~nuwEk@~KNmQlUY*$}CVb>l19Kh}^2Q^`1}~ z?a(Bi*Z2;yMC$X$ECMP&Lb%lg1@pCEimx3xTy-IP^=%cwt$WQCsmfUCeEU!rq1f0P zpb12F`=jFz3=QmE9ywo%;W5yc@5d2Bi@2;We=Gt42D1O<$Q4Xyb39aVY``us^>6Ld zaZh#*N$7)-Coled)#QBN)wE}N|H#c#WnpaTlesZYjpPC(HW6J3Z-0B4M%9o1pN6Z-c9}{3?o^D;`LZtn>C|xz!)X$C)5%K_Qvnh}<^%upBRFMOVhe=ge;@uay`| z;2otHL6l>&gx}i#8XEgvkB+z0H1A z3I=~$MO{(`QF8Q=nKo%{v;9xwue{MmF#BduTY}Q9%_#8D)~EE<$`WeE=-u=^;Ke z5%BDtBR^o{3t8J96GD+*-fwDIGX%WSy=?(*r)d(dqeMNB)Vs#u!}fpOVAIY1j62DG3#p4)`?OW_7C`%AQkf@Oj4hW8a!r^bDWwG)T#JLA?|ALZ<_cY#T@ z6D{s&>$lT`5{Duu_lxKQxawmBy?Rf}vN#R!PWcvNEQ|C;+|IKYq)U_riW%L}29FL% zsoDKNBuyn#*7gPQdU}S@&EKuIH3Ma%#ATukIhL4<<2jZL0U0STe*SkBiJ!hl_z;^g zh_TPGVu9#juUwPU9~u`fo2w3qU%g$!f~P-*nm%Q;ko!J00(uD6;dVdM?eh!R53B#q znsgMq>0-Z!WyD;4ubl<^55HjJq=j{TcvT3)x3+A~-bv!$3_k$D@5-iozapD(QRr_M~3DC87~R0s zqO)W%d+jWX8g! zg&Ai&3XssEc;`o<^CvhIL%Pnu#LI=uukuWfcRhOX`hDr6uIkcI(KG_%s-Qh=WX35{ z09MR5m6XSX_m{l?*|v(PE&n~i&SItTdm7+lJ&ZzrxEl{>!u+K4yQIBUv+K@u8xIje zSw_c!5jQTV^H3QMNDJ*JM=d>dfIP@EmSpa%{Ip~EAz+(ni1!foubNigSQDVI-#QBA zK(W1!tvhS#;U4(!TPg8ToV$H-#^jx!1JFmiHkcn>X(`qgHZNCr0J$O$tNZTuI!dU_ zmy3pCML=Nu8sqmRoA6AsgNIc;fRbX>b!6XCIQc<$?jh5!EBR~yxn$NK6mg};&s8P` zWSlK7<{Lde)U+``e)Ec3YnQMdd?y+HuH&*7-wikUOI$Bpo<3nyN{(UspuG-ph8m_0 z-R#ncxQQCtY!)}Mh{&B6w{@hhmb#W=9IQaka^h0>m{7!R66g9juG{?UmYixLX&{0$ z)N_{5sel!j#%F~&NxGMBUUkFE1hD;P)`s}-jAm#HA$gtxNeY{bW0X`BJYkFcA;wDZ zZqJ){hQ#cjm-=Zi>MGLp#5%g&Z2yad{0}VUowPLPg-+v{;Kas0%hczKmgEi)e4xH`2MUi=;ZWAZATu zo(jCSH~^=fWxcn$+S;d2Car>K-n$YELtk^@Lv~E zDl-4DX{AtPPL9Jd26;)Bjr&}VIrm2!9AWVvdh)!d3|!3>S+;Kr^b&1tw@-S-0hExK zou%8w_dY?CY3MKM_#K*9Vh*|p?4eUsJ?C)y)8ML+muPg-MmBg1s2&Za`qv%xgjX_l z?K{pFXH4@{?YI4k8DBfHt6?MnA12Q4;b51(TYq_00c#PCwXgBCjr}q_EBWnL^XmND zNQ~uXvzTB`1fm6m?<{G=J4qs$jKyr32Y+LT8zK7j{pNOWt0XN28Vux1;+Tr@I82KhJYTI%$9i znHXKBRm3d9;_=+Wd#3ra1id^t6rqgCe3r!g)}1I)Y`?BKiKr#pDl2(=0WtxVTGlGIe4jT9$8GX2j zhqb%HTk>o+)(jVsB<1M0xMLFfTALuFc_oxM#s#kN_67%58(dvF+k278ggqv zT$t#(ap|y&db>gh6J{McPUmXEMM>3G>vAV_&%=dHn?Tfiih1geN=G>E8_I%$$O-@| z%B)_tra~~lG-+tpd4%ar!{uR>+gtaqtGXXnqkQlW;kHQLJy$kkk8#hcSju4nh0utBIIrarTy!N)OX%)|txZA_+oVf6lu(Z{CIM z&Fgm37>j>0)uWOYIl4^eL3yt7!h)pqrbYMN5uiyW_G-y=ZMDC*h>k9--5IF)yw45q zPS5V2;OA5n0kBZzc%Nm*V|dG>JW`VFl9B1-sI}{Ox{`#gbU<1Wnr~yDk)L2h(JeMM z`DrG_qgRaw;P}s^K_me^>+)@27`|kc9+!M+jN6zSvK4HrixOoQ+*h=c1)>FJH=~76 zPQYC5N%<0X1y1d{wy$N~Jd~*kJ6kPFU)pm&;h5du{}2~jIj)C54I_L1J(0|ZM*Qlv zRat7b{L#pgpTLe4=tX1-mMhe977Y44SoPD#6VWL+0I&kJL2y8!@7|4F*Vm1URcn$(JIHH753o%=D8LQkUeMboOv~=RmN;T;YthSTlIbp8#_W0CD`z;9gZq z;w|L2Zf5^`z&S%mm@gmC9aGN7fnt+4kjcIE>Zv4n3F59E@SA97dG?HK`!%7_p>&!$ z_jVjYDf3_yd-178u&UH%Z<%PfsoTI(jtS?ovIS{u2=mc6Pxoi#d(xT&asM*0VQx=n z98K-?N5cEWZ-JiSJxg^6zBLti&MKL)WFHFk3Jh@B@ezN!4!kP@9_1K<_`!Zld647K z=(~V!@1TfrGuNV^XhQwv?fUk9fU32X~|OYC49fmlgR}9ilp?v*MJ9z_4YmE#1yS^S980 zt9$s2oQgo7Ec)U+36|o8BZd16gN1He=gKzpZrxN%mK^dOAl|N|$@HLx)y4MiL#reb ztx%x*O-9fti~DHsmZk436N3if#r~Fp%RBFdw{$0mV&zhN6IUeZigWW?^V$IWdocXR zxvv5t0wdqkr)P>}H)vEnqLMg=GIAmlEx^y02u{W*=ZQqxR z_;lUmDM6jY&B&TY|7n4or*esOIJeK2umSCjIp(jtC{}BPzCr&wr&IrHH-w2T-Ltq;k=RTkyH&;W28{%1L9uKGVRgitsn)&y&dX3$@owY6%K$Npb> zZ4B$9*Dh~uMvy#gKYMhH31M)36T6=^Nd2z$xBY6lww+B_SY34Pq!rUe7&=n|xgyJ3HYDTZYK1kp1*;QHknAEk<+hsTAZC z8R>IIAv(Y9>t=bq<32uv?VREGglr%r0U=Z~f1Gw#oRqd6MDPfL;ZF_rCnu6NN4802 z9_gw4YS@ma#r><80KhJLxhl@F?&(DaYjyDKqqVs$TC7!;hc6KoH@>mg(k~UHM|^}1 ze&xA4QH@_Wa(r2f*r(a+(g;LW0IHinhR`3-LE%6d+YpmqmZG zi59ozT(0oEn-Gvs`Q%awO~Hb&`Odu!c)sMQ`A>P%@wC)0UcQ6*(Jm|H?AmvZuHJ`+ zfS(@mmC=(m=si7tim7>qv!s8Cu~hr{^VDK-c@MWK`iuJ^*}l*Lsi|OAyKO{NmeG$| zNm|RD>$1K{>I535rItESu{^mVSzLs7`!|1p=d)DMnHlh|*_LBeO)XBFFHs{zP9s;? zT4Y+{ukSy;OMrAZod%BA4U<|zE$ z{rm#~RO6FXz!7}5D97xChJ1+!UxfVLN=%wRo@XF|Ud#T@OVohiEjKdue@iJInic40 z`+^X19N2%&Gb9tBq>U&Q`K^56V) zS<_#}+{W)hT|-BPW1OKM5+Df-Tnhnhw$dpnO)YKp8U=i|xghQe)25%pk0_X$nls~p z&Qle{s@a{;mI59CZLDuy?U@KAI$2L4>bo^E28~4H2|!F0idYhjl*qB1rdeV`*g|7t zh}*SMaopvJN&ng=xZm81hIkPcGO-RqQ%BQOho5~hs^t7rmw?+Q@JC%Y9}kaoo|M2sf1OSzpk{h z_g;8}R8|^+oIM!krV$ajoB`TeHY=c=ul!gwzBpKNZ2L|#u^A00FN?v^Y}RMHDAzS53|1>Wt&cs`1v_~|0!UM}6!WMkdOYv}A`O;HqAX}1z z!VHXYWl!%{&82}BF}PIXp&F|0WM!CA|q51k2iTa`H!ND+5$}&bJfWHwNDq1`9CslCds#I!~I% z)_o7^^Co*{W^;A0awhK*Fjz7u>~=f&NC5TwTSP(>Eh%0Eb=r7cwO$-B<(RzfeFwja zY{r>A{u3K(U7CaG@E!IZ5uA=PzPZGg_?T}YCS`DLB9%WvnUQ`(tn)I)Fvw%Oe)Jaj zBLA0;xMr|K%Tded7he%}2wn+?*+klynP^l>v%fxqAyB{}0XZO(eI|Yx11%_7JG^h< z7|8fFzWlw^dTY1Q0pXcvEf>f7IJI5^8QBDO3{;;^fu(lR?=fK?PydN_Cg{awq zCgi@@H;$#_LbZ5u2Q58$R6_eDFh+;;&ZB?&hbKzyHuYE!3=Ty*X8F&X?X^FE|+aKK@C zqP6c>vuYt9s4z9xGNK%lHSKG_KvTV(nv818##9A+9O=~s)m#1Q1ADuD77(nR+->)v zry!w_Kl0ipmf3CVi1M2_*8B~@KHThF>r87%a-XlpdffrK6Qv`AnK}ack z>%L4YqB$z&yvZaDLgM$obtsapm`m}L%3CwZnz`d`?~z#|7YXS5K1#40O~!NnC<0}7 zq?B^h4P3wRABqDpGccjk)a``?kgG^^EyVOC_-v8FJZ5doSb7DfN!IEG{?r_bII0?`BbQ8VBUOxt|h5o{3-c z{h?TRtssu&{)%LcDxaq1cMO2(NQM)#V^#oYQTeW&RZB~jeOP8mWz1mz4U}n;h%~Xk8 z&;RWybl9+c*gkyzvnRX=7aRP{rh%?mwFI;}fd?hGlMKEUlO}~AEURds%E8?}-A%F# z6fEMe0t|W(!4BM;J_Jpl8Dc8%HWjC#=a3_%*5BM{Ke3Xr*v=au#w~bihH3Y!wXrHqb44<7KF)v z+`b*-K_Jt^s zU=7$LZrt|^Ihm|_v?4y-uhffyzoe!GGjT5BW1$^=>zkMk9+qrcYHXJlINZNKc<8bykwb!IVw7{$;Jq_3{q2NK($T)qdL51u6wQmAY9xe`K9Z88l z+ihykYV$($(&Pt$m-JGbU_sk1YreM8=8NK&tMp6b~B=r zNq>ssPtN0N|2COi<9y&HLxpQn^zarQtO!gVsk6qFNaR$$za1TMArcoG{rE?kHi29* zy-?TZ8zQ2jpLvm!-_a;3`7!5#9KWVMQ4%uB56ZHDIHg~n1f;>*M0zACf1<)yCD{x3 z2fVTr$A9w`Q1@P<#Hw=(=uAg{~``4jn4EWkSDJh>XR?Xg*56hyuU)np~?Y8J3jUTr{UUNIW4~$h*FkhPf zzY$M|f~v`cj_XfuiR;~{*L^Na<~hh75{KyWh%6K>HbA2)4u)F(oyyWx(+DHry^`j` z$9CRE2)uMatv+?q0#ugrocu2^enL?u=|2SU4l(y&doqNzm-7zulF<8*?3gc@Ff0jGk`6C{Tgt|(nObjkg)LLnpcyDB}Fju@exjZYJ%6ByFr}qN5 zKTstLEI*DH$l@i!NbuNe%Y!5<6kJ&Qbwbg@1k z7>(@>UrP8oI0g;Zb(6dT%YR>l^vhVZu%LjMBnWK+8us5&T@D&x zZ(6g+IQp$b!P=cQUC#-D`)%A&>Y`Fxy6;Ob?k zSaM2XdM#Q217i&86A~7w*e4f<&wb#l^$+V5X*XM>W!ZB99W77d}9hXX= z!^3(PGbww5qj7L+_9TR?%-YMH6zy$q_TLw5eipiMS-!_Y(`Q}a&vt{%g73rq4XL}H(5dS5 zKrUcf-Fgis{l4=^((8A1GPv$8Hv@9oCL~{d1Il}ViQCt1I9V%v+^q&Wa^slbli$vJ zzGt{_#d|6m@kWbCS^j22q{Ilo*f$EyOL&_7oA;j@39u6CGezPTeeF*9=l*Sa(}a z6MzJH^IH;rqY`?JK+2%C5?AfcIHGK7fJhXp5C5ME!NZ zRP{sQwj=Xi)08q63!pl5G@t)=g$LiwzOJ8dbeJXBDyy7>Zc^G2cr0<5hJ{>J%}b0k z-2yEX!h^jaQ^=LGjBn!s#7WXcD6-zS&u*7D-HeX&{6&@%mdGgOrwN^(5_|`xFuT|- zW0t*rzfEROLd(&Ggowv(yXSK!jy7IMDxZcL@z9V_Rf5M&Oxnjpd`~XK+ok)DR(sqF z3DphyMcgk%#&6kJ3u+A6f4T_k0J}zjC0xbk7?nA2;(kH>i`UdP_bZw{QD;>jKd>ad z^hdv8jI|1C#C%+)PM%fvPN);e6u6m&xhl%}PgCGIG_RT)^Gd7brDzqTx}n6G*W9s!ORP3K5<_VzO-Ogs z&|ggj^Q%6?fUz*ge9sk$8`(~qI|3C#$VgiqW~7yioQm;(=`)(Tx^{cv!r(EKP0sf*5<;(II0Rv?4{NZnbx3k4C)Md zXHc+(?bmp8rNf`_MMrn8s?RRV^Zg8!S5a=I`ncMfdUZc!ob)`#P z>_vnFO22^URMw9;wuz^KK7e8AJ2uzY54)UQhpUK#zy(6@m;v&&g@cPz{jC1PxKxef!?9m4huy%iny*+1Avd zH-IxYc>ea@<}7OK2TjWClz{`aZk(zMnxc@dw>_(z5{7{ zm{gBE{P{2i>?X-s&Hn7Ok5eVND zQOQMt0-vue&d<@7E}?uFrBU8iC>a>ODtY^ij@tTL4Bh3t9NXPyz5W%A@-laEn2%Tz zR1{l3f3eHRsZ^O^s1Qbck(hd3$GZ^Wi{GgN+v+x%*0ckgf2E8TOl9Im^4u~W*brw1 zC1Y~dq$k8D6YF?qHdXQ&Qnl^kHNq;V(!S&7kA_XZy#jPVkEmnUE>UQu>pVuOB1+j= z4HI|#Ome#C8{+7xp0^|PmPl>Hk|q(FJWXyhS{`oep<$aq{`Sbqp{TD0YXD$GnL*4Y zp8Qwep*sm@*5LS9!Q<;NHuI&uF6!j+2AI~l?H`}9JE=W4)C2llROggoJjwRjf$a*! zYAd&7+5X1#ZjnDaq%eF|Qu%`)QqJP7Gw$o|myBilCg6TE9eelW8Aa z(<>{x@pc0q)A7X8G+w~YGG~PFttLj4%Lt?t71_#R$r?53+dY&RqzMS z^wxgRD$JCKG$F`gO~s7Q%OlgSf@}{I{#Vym2F2Ah;hx1^f?IG6!QEYgyF0;Uae^-H zo}fX3hu{$0JvhPLf)g~j-R1qNZq@y9f9>w<^hnFh(>>?(RDRWhe9YEs%hFD4O|^lm z*EU{1t)a*7KG&@JLBLIQG(YhXMve@c6#px#Ib&AU5qCUo#2!f1|LeU!ynqN!+%`0E zOSWuPrU(-3;dCb0J0J#{>dKw?jm*iv#~0_*(cXfVajusfx6_LDdTQhvYB3729%clR zkaMRl9vi*?wQmVwbx*MedEXTic&1bt~f zB?WbIA(Kh5)l7E(q8#Pu6jq|k?|0&;pVW5os||d4*kTpZg?doZ)?fmq^4KjkasQ;1 zGNhkyBZ2tv@MdvA6tHZnx4~-1LL=Y-RulKpQWZ`$=q1gSKT4}}dUTiynmok$)m20a z3L4b(J(E)QNU&V!`clqeu)dHHP;c&Vi82$Mnu;~QJa-VWLTts=8ap6I(LV%xQ#EcXb&W~QvLmUEw%5T?U+phzO;hg(S=pp?CKV#=rferdhe;?vL5f1 z-WarKDvZ?M4x-0M;-~9OMt+%PSvV+vNgOc$x!J-9lLIDXB~O|pu7Tb)TG0n+fl2K= zsPbGxxye%}uo$&=U^}8$zWLeHfZ&X zF&jf7n+;89lMp)cE3o97EN%iV1ve3ZS||korn1iqSbB#^!W_ZkJS53>)@`P>g^o6`0BSkhr}3K zX(=M_GH`$2vOMVL!rEiF-S&#C@FIc>&0*4G%g&`4z&?};;%$M$L8Uou#9=>O3`a#>qg6_aOJyMHMd7olpcJ&s9EMjY>||4Rkx*I+b392U;Y!76}b&a{2}F{=YpH^;V-~I01!a}=&-cU7m31Ir`Z4_o`?PbhHj!2k*Sb~${Zv* zJ@o)I<)2dLgA?54&dAkO2P>3mG>A3o*eg%jM!oL`6& zjhXRpZ%wpd2Lh!-=bO*A0i)SM$yV6CSkkHN6><@xrTGnC#Al0QQm=IJb4c(U?qY)50ay8*ZIV! zFcL#7vz~BE(;4PByP43vnA3qXT%C`h@kZ8Mk4`0B#Txjbt$L>u0~C`^#)OI1aps$m z2rDM<%^rvT^>uz%>PPj}Y;%#4vF}6btz~w)jfv^(3p&RjKgrnY=jN3CeQZW(p+)m~ zsn-VGhHraM)gz~#P=&5D#06&({|i{eMx0^4H=UG>#W$L+%c|Q(2Tl=v(@!kecu6P!cWMT8?b!<>%-d8lJ z^n#)Qsp@Ss*=(JIbHWX2X&3XY16KL^d~E7ueWM5UE7C;0X1p z@sZp+`Kw0=X&^$h!Td#PiVVsX_f%7O#83CXKdq!+#c*{5=#K)p(b_9K9mqGMB*?q=km zB4)7=d{u%n`38OCn;mBH=Vp!Q4|qGxF6$2P%Jx`4ZaBF@%M;(If2<3g82j*GRw#mT z^yZqoRh2wZ6{>vD<;zcJVk$Oxg>=O&BX+9U@%EAu4^iI@3y=Ay22stUs5<~b>jK8f zz`xANvN^|W*_6>^ajl`b8j!rk$zjiCMs(k{b!0i+C~30?oLcu}%?iutYXb~o=22+LMp8%qb;v7=X8VeLu_i=QzA zHG}(ntHpXsd-E*|(2m%G@kJkge@X-AF-HN-%rGfM0)D=g;eu6ivXAiN^)hFFN?=G1 zacvS!f92oOuksPJuGPe2X)D?F@e<${Gd{z#PDq`NI0|@v)ylI}d&F604P}3r(8+JA zDF?l?CI~Lkij5>x?%g~-cPcN7H8)pAf?yc^bBN_ML%_w5dox&xK%jk^Qu9}i)15oH z_EWP@VLqk(h=szirtWI*}@;q>1U@JpMaW-M9KwJ+~2yqy89ZVUfwT?|DLZN7kr;CHht;~-Yz&xIrSi#EPOhspL+;ISdP^2{vMl9V@3 zSZVkLv?*V0P#?|?&GP2#L&m*3M?e43t%R(`DTi`{Ocp}yOLipWzXbp(xP}IsFdO|# z+c1dwWRw3Y4>~!GQVHa9_UU5_7uVCb%*qZy0VRV7 zCy}~}Iw0qXcSwsd_A-WD*>$LFu2SMvg=4nc)$%YM0na^0H3b3N#~?$U-;m`p6tka; z8su2+WF+J}ZE0*EQtS!bxbg7E3P zT39r!mf;wZYi1TnhGqVkh0R95WFek@tu7eY4kuRdnfX}-XBiD7f(RMP@sW9&e?%g? zf9@fx;@Y~t;9;(MyI8_i=k!jtQftGIgoOz;aSTxpXCS=ud>lAobnYJGR4}b67P(9) z6EOY}wKc&_iY`vnM&2)42CFPR_>1RZq2A} z9Dkzwj+(bt(2axtw`yK$a1XVhTL!N|_YErc!^3Scj}dPGKKo!21K(HVeF0dD9;~PZ z(V?&6NZbBIoFcr1#7Em0@Pr35iQD^~{v_Hz;CZzH?DwIf$LIx&<_ejaEmh&=mp8l} zRdTcZ@ei)myVdX&Ak33&YEzYOGGYDZy-J)kfB4&O10M)GY-%Ot7QfS^&uDUN8($X{ zT)3_@{agyKfj54A_67sK-I(Is4NmaKN>DJ z<>QN^y2ZN0?+V!22wX~lr{3TfY4oN}{ezD)MQI3P1l~u9;a>6Vpng6_y2(X7c5aZw6MADQ~uR_jvAR*vbWBn((72=MZJ)#5*Lc_9@njvrHu){E&gO_6@c%Xq(;5Ys7*Fd(>8 z?P|`MI?ke?@HkOl=3OMyD>!Hg=Rw5N9O#PM*AI1rVifdUUeMO6w$?>%ktwjgP^8xc z5ShrxKdjM~+6mcB9#r`X?G>SP5lv}4gN=}8d@R3Wx-JyaoM!*2gQniYT3x~Qbnzup zsNjbY%d$hN77~kTSFGJQVS>~#7_VS*Ni!$DQS72^DVmr9oY2^9ko3+5TzG@+NVK(m z*nOmwQD8aoNJ;7 z1M-~}?XjGDFerE+8d$b!x-M_HtzZ7pg*?nmLNQuyC~ReXZd=ssAk=wIruOvfln^I@YqN>Y<&`pMzCzoqDP`_4nrlj>7Ez7e`tW9_O7bd#+!h!WHSkL}8Vhy~L%v~S&Q?I^8`86DXg?Jw zgS9V(nYhb*oz_INyVXM(uE4R$Umul8X6M_Uq#`v6u(o8r8zr&H{oCnQy55k2r*I3(Xs&4b7>qfu^`$6@QDp-h5^n8fzo6z!bDMOp z_NWEYrO6Xm57C0oGJz<4OQgj~DkNDc^kFuIF7}u?ZeKDVs0niLrKc`9Fc-^pZygIS zN+~##?zzp2?C`stkjU&db|FN9YN9@}Xx&5Tz1_ z$U|2G*c3(_3U;zB4gtt#X_4A}e#EvtAbmChA;k+=!d{hFxNOPeP zCHFPvYYXL;>Dw!%1{1ZKh=y_eF?V6_o4kDB>geKS4sEI6JikV7H3~wg-=|(rdIciq zF~!DtPP-Yn+<3W5HCr zpnLKQy1D7qY#koZ5*kfLw>^o#6;S=~%^w1=gnx1LOffKJ?}69d(RGx_(`HrN^aZTk z{MliC&5h9_8LF*>c6LZe=&2pTlpP81kS1(ptfJ8i;p={>G%0h45#19DTaFN%`=2dpfd z!g-*O0Vsiw?cFJ`Krm(Gyow$@<~7#~*R}biLY|*Unohb0e0U!-i(=GHl^$@Yr7`5g zv|wuWzU28?igf%%Gd*p#`A`&z%mL^X*h%4D#^A-0XFTbZQ1x3|m!~Bt>kL+M7JNNj zc|`E@uMDoufBd{YLGru$8H`)?_D|`}yK2U#EPeHus29sLf_L-{=I8%7(A-@WCzP7e|JzK%SYPH`2Ag?4YWz3-V6vHE4h^oa{cE0g|^~*w-AN20E`bPuHf~L z0Zq&zZCXb%{*!W({Ye22g7bnk@&e`RfsXNsHaHYeH!S>SId8jxogo>5bwIzg|Cm<> ze60;{Znk!LaS$9RVt$6<-plv)Z0xGM#NYOF;XTS*WcpBuLXE5cWj)-N&ex^C-aVet z>W-x*w2+_fE*z!%w@qh;{@cKwbmSi$?4yKPAI=-@dB(swh#7PvkU8mwG$X771!<}9MD@Q@n|pnd(f3{gH9^VP>N&3^0MYR*iJ zZ3#r8VTSP#RfB^PmweCXO&w;MYyL2I)D<#Rv^|?N*myf(g7X$pvcCG|jo8_llbOCz z-E`_5Mt-lWtB1gu1DE2K+%p^CwXd@kVLM59Fb1 z9mAeGW@y!^itNAc-2i;a=S8!tS}78dY93NXN$ixomD4wrs8KKuALS0Rb{3gwfA{ z^!f0z0@Y&h5y>9uoy_cZ&^uZ2h6SIy11g@nk9ye8Cw=5->HBuQMmuj;RI`<(dxCHc z#dy_xV^M-b+*FmzefSuJAcY%C-|w*U;ioJ}BcT2i+)>&zi22(6OvF94P`9Q~Jy`mB zqnWrMnL?clB!RSm=fvk3j0PlaX7x|y1PU!WZN&6(7SDdv7S;a3yEzVT@!;3$0r=qW zny=!~nxhdO+4TONQfgux%a?*>Y{&!<+``p=h58Gm-)pEdH#zBxXton=Qlky}VQin) zIl%PM=9IX9+#F{7q*|z5UO5HL`oo;u-AX6ea_b}I@Ra)>_hT(mEZ~ED2)Vb2E{6Y( z>FPnn%wNC>{-JkVGk)A%{yJ~MQ@h?;HT0&dT6G9x$gYTsRVAe=Fgd*{Wu1>|ie~F* z&J}~)9fJGIcQc7e~LQz6|$6 zRoZ(5rvW>jX7dmqbvlH4Qg9WbPJeU}C#q?Z!Py0NkcF{z+UnI}6pZB|*~d}Fi4di0 zioI&YC$5P1MhgC@VpcHPQKay* z`gvkm$0p7~81fEfu#+9oj-dG$kt=ytj6}TqMV)38Q#v{beo~Lt2eGrnhp@v;2B0U` z&{LFgOA3#JXO=zqDctD9EI+0x%Lia|aI~VM+?W~}VX%aj8y(6FDMp0hegwy9&A^A) z+9As+Lf;ZI^qbD;31S*#^m}1?H;{&JDeWJN1RQOv{ywKyd+dg|!~;&blhIj-HMfKC znq5LWkSi{$FbSk|*1hqKT&)k$@VpbuUD3$Kv2F-?{W;5uCbT14&nbp!I9?O3rgz?$ z9~{kWd?YNRh;VQ-kg=fV&5R!MVbo)g_rV4zPwrCmC3~A)lGj$w_9J&a?b8RZ=BI7h zr_==7t}!j?V&#jJVA+u3!D|qkTYW?kHawPpYro$8T1It;tFt1+q5F3k%!=@@2>BC; z8NRgLg#00_k0&bqPRrM(*5M!nI&anENJ1h3i$>XCjEn;c1Wep&B1HrU@=)@5J@P;v za@PR&sB2D7ubV^ZS5-T^%iq$E@Dw9mG&&@y@wTtan=0;69rhO!^v{2rkq!Ef7utIHw$e-gtuIazVhJb z+i4WXgY>~$Dq{m2fYh9fTa0DsCO7DhoEkGz`5>&D5ut`YS1F4$4ul3Y?dsQLUyG^0 zq=0ZWDymlPzRJ)=uULyn@tzhN!j=SU3UFnMlS$wx(CLAD|M?+tZO&46O(~=Uh4ygw z2S|36%WpxvPZ)>h-j&J;&TerqDxrRy3M2sV=g-S<||28 zRkqeCoeo6SjrvRy#va|CntYQ9bhI$y|8+2$uyX1x=_A+#7YVVEkPwdHIazll;^IT6 z==f12--mOK6v3`t*+$OTmXi#p>)xeVO5LHUMqQ$kI@BwnbkaQ;7s^-d$!@c$cHMoE z2xk*cV$X;=a#5o~Zt|lO=*i-h0b>-1uLrM8<~d-G|RlproLbIG1-wOoB9{LHOlV>bg{ z^$&hqfaZp23~bqcE>kd(JE)ZKi(u&`HxyHi3abL?ChV?V@U%vnW)8;X!#8F-G~|_K zq?udfr_`MIk_z0yv1O>!(f}cWsibf-sSbE`#&4(`*_jk?Vfs%n6Cw1ncLWS~48(B; zR0<-%TrMloz29V4Ov{P$B#XGGjj@RE5DF~e-63g!)WZr|qWVgD7a?anTY8yjL{zC9 zN@XQ;@W>KM0I;yQ5z6FEfRh-FO@RdE?*M#J$(KKUL5w-yz}n)d+FGFzVYgXMs`wCu zplT*{SDLTL+ZgPZk!Y}NesrlE(Br`#NBbbRKoXwZ1O4bmxAjQnU5)8q_^+z~TEP(+ z@$XL?X4wdoco0eKbd#CrR;HfPOx@^Bb(&CiH%pkoeM*3DgWq6 zwBfA?i(`ie=kYLcy{rG0qdI2(u0Y=Rnf?X5HtWDRO#A!+iTXI#VyXsQNN}T7maeKT z;LyU5gJhG}pF;bXchDrazAvT zBG|&`yh>blMe3&Rx#`vxaIIjfWU(C}(+EQT*xy@`mgl8kH|{=mcn>CJ*U(E+%k$IKnQ~w)R{+&N@{eWQXlWM8yZs9f`C;|L;Y9kabT}&kK#{YC3fr=E@ z#)&hFfofruP&t;}bAq$<49glD`L?H6kAHD2u^&!Bi&H*%-UI~uU2Fy5>lL5^sO985-H7u(NQxUk7#>rZ>LM&W}0PM*vImCHzM9-c-o zc-pE65eqVAHF%MM7W=8XGJezMM}>b%VU1;v4JH6pkD+AH1~O+Lkm3r>$hF0Ml4*eQ zV@%l}E?g)L{ZnPPpvC)Pm&vr%KHUnQ6*jF1EMpsDaGwRQqUI>P+}HcaSIZ&P;tVy3 zshCh6N8e0kN7vOBeiI!gQ4cp|()1N$MZZ7E;%0mCscTc)cknG)@GAv=P$W~H9jO^8 zw&B+01((&S{H+h(6OuVwo-Q<=-x4bnf%)Q`5HB2uaZ4>`pj$9b2?bCYq2FlHLfw(; zP?yhCi^z49-qD@YM}pq=>?sdP2Carzdp=BIL2q$A!ohi!2`bnoxL{>5*jYOa`qr#1 zGmF?@Jd%0d*j?Xm!xhmwJQKqWhT$S%QmN>5Qc9Z%hAB>%uF4b;+|yg;vce2e@$?fS zJYpdb9*=bJn1q|)D_*CBGT)AvnPU)Kx(~hH9m+ilq+p6jN<^g{=qJ*vp+iftdV2tG zzW@PFiT{2eB}`PgC3MF9?@u&(*bV3D9WY;h@C67emACTl|&wj{PlB^Si1>Lh}4g+xbP8DH+}!&3Ix#DTC{c zAr?b9Xs=B`q71_9(MFztNBG7^c6rN@0Qnci(h(v1w)J)uk$cbrd4X6`A0Z!aWmq=@ z)0gx?kuunC3>0077PD%HSl|WR`(SLTaHI(8GE%g#UVtGb0x#4A#%0NFkT+e|!&C92Qa#TFTIEuH?uqo;>TZeG;nZMGCJW06NmH>vam*NOzDX$5*f*vumulc zb*u6*H%d!_faV!8xGAqtKtc`r#?mkVTiz}f6FC;j4VdAX*68`FD=AZE`#wIh9Qh@t zd5o@j03S5FsMrgW>)7*AxZo|}xZ-V+VS6O(Uyx|-77F8H;aT$r0^{*Mn*%+_sEJdd zrLtQ`Tf0FNk)u=i=Qj zNeAW~z#f+&nIq-fE+LQei;5YEV`XHuWPa>jlAeNmE}lfgSmaX^!|Iz1cME`|B@ne{ zzqSTa;y*Bfw!H`ke=>Y7=HZekX{;)R0W`D^(UbtA zxb1e<8A98Wl`WDu8g_?}zkXZ2Sx6sm=gs$}tt)QzG%P8rN%M^3QL#26p?+E*Dr=;z zj~d8B0>mw2wW~VKE`4*$9-HUaQ4u6I^$*_!59JxNU)ICR`J-od`*HV-&E&$d<06Ij z{G4ciHcl)E(80=FP%x6f%E)ldazq9kz$$t2kH}QLHs-8{Uhw>Y8vmyr!5M0}B%&Jb zX-0@QRko%IC|%9ogKT%{vm92)*YsUf3_$I@YjjH}1xNl%ac0fH^no2C3rKFoj|FlW z!%P1LZi;s+a{^@gw^&7LwHe_MFL)@_wA&#ANV;GbF9!qMye^}AlZhI%N>9bECgd*~rf`;2jSVE)U@83><@$>AqwIe<>x6T_W z6SGLX4R*B@K8m6ymTtwg-Yy0OW(7+nBr2Q*=HctKz^mIuPgsCLQ!~9WtRsq{Ku$O$)3H`b0e~{JTw7u6wbB|30)=Yhk%PRNh$9?Lq)2|I0}cftg}MXw z0kb%o(Fc^vM#MwU?7!v!u#r8M%cDVnEwx_!W7JZD$z4pz1zBu%tZ{8T(HJg-BJxl9 z!vf!P+6>^Z(rm3`5fiZsz)d0k+&aI%8kKVVaE=RM8P)rghCmy2Sd-v7uNrvq*mt&RO!4PYS^2L9ZGb_WcA z_`iT!^r$Rr98<$b4I>z~ZOvs}m^?ygdDzpS-4O|<^Oc7)05~lBn<5I^!A<#k8~#+J z_$ub76j<#HQz#4_n1Phya!R~bR9oZD^tvq76qW~(_&??1(8W0bkkVjQ?fT^K68sB+ zReTT!DSuvyYHHHgK;+3k0b!$}Q``5 z$7&}u;|Mp^iUr9~6cez15Zq%kr8`hf4h-HW%k@{=zFYL_P)n-?0T7%L5^arnY^i%r zZ6iPet$BW228akx`S7~7%slXY56uG!6P|pJF}-_EX&-u1 z9?i&dr|%M&iEJU%jC3&3hmb!0!UcOgd9hsx4H0sDVdzb&fIq(X1rLp}^`2mi5>mkNY_;Qi9_c$aQZrN0@e zq~)kLs}jLR>`xPV3mJC_S-+Q{nxJ4#=&or_U9c(^-z#In5-f)!pZx4`ME<;?unYiQ z;~!iCf5g(InB5A`h%dV!>Lvs#8XD=dQk%}7+}<6QNo zdncI*J{*s$oc=94lUYZ`Rq1@5dUSJ)$gkjR=&ehIh@r3R>dbQLYEWjToL8ss!Pk%6 z+(}CsSI$?*xc@;oLYpmpBj2*;3Wcb^2?U^PnziHZJmV6*o+$AZ>mh)w$9ZQ&pSH5d zOYHDj$dLH-9~5^AkxfdRXkY2w+%^`X)>U$a&Pjxyj6Zx-$nksrqO%lCiI-Pq2!)1l zW;|OxE(LPY6kG`^b{TO zIQoaTq`r1Psvw}BJ-7P|tzleRmd+L2lKx+De@E{iaaoBni}KaYCjsXU$D8ND?=i2_ z?(r-9F=b1By6$#XYAo#WrU?F(04b&VW|E!Ve(6s=-IdTP=66B=YlE5D{|5Nhr(o=0 z;?E#!jep09?P;#uV@ zzwbqfitvr6^LpVtg6Wg<%hPQ!S*|Fa7u6r&b&~nypGA2d*6X(~OXgm#*As3SLnrM& zeE90ihV_s3XmKHfD1Bme*~p6l#u-FYejh7g`QJiA{i>5O$oJ0ZXRZJFlP=&+AFF@ zp4Zvv4|@1^ptQn&y}H=K0p1~I<*RKTQ|C9@CPQScKZeV20Jk>F@h?|#txmp-S-JD%cE`83b;9HdN}H>AIow=o(VqPNzxK2rG3V!gcGNpP>D0Y{e)@=6XYdKu~&8z zR6KM(KMxFc2JF38xtX`VX@nVZc3x@-Sj>M{>D(yf{sJ|Q$W4L22~TZKm-OV!CVo5W zz@aKPR7wrUOTOUE<1&<%CumE3VC$n3|A?wg4Po@BHX#u)oU?;eR*a`2TN&x*7?@Y~ z^?}iWV^O~qQMbcri9EXB>*yP>ZmZl$n2nCD9W}G4gbyGa4GO44*o8i?PYTT~9QH>n zHyDXxZHYn{USnGf|-K!T&cyUj@{_keVmt5rWN%rlEh$?y#LM_3X z&rVT0PT5|R-gL2HNc?tCJ?ZOg(d5q)>{rN50v`s~n|%9IU>6BBBL8MKuKU`}){=D0 zHix_#j(KU+i^9=b;QiVTuL#d1I!D}O$Nfn-fzDdfALIX&uTK^4WqxhBX?HxUvKgA> zm*dM&$KB?xj&u8U*%wQgS5^N;_iQh^bg|?(|Gs6K8J#n`tK;dsK_~5fN3i0nyUuRe z7r0uiVr&p_^~EdmyGt?d{8g5S|J|XIpxEj{kT3UHjg5+Swea~Uz$dA3KLtBkXc{vhA64=-ERAWC- zsQvVCe*O6z_Fd}pUsIcUE?u9St2E zokm`*=VQc#x8x24?4{C|f0dTkOd9s1kG6S3|Km)OBUE3;TE=qys{PKt@S@G3Zid{k zyqW;IbH~d$D^=!OUQTzp*Jg*>4oQ}%fa=KN?Xert=YCWCKvOIhkh|5`q4he62K4cn zX|vW!2GI#|1sLdjrHZda@h_|+?2a;DF1mLkPE1@bSrH$k{xNj^27 z+-(nkkWIS9fszn~g1UCIeMNll@8;89{yeO&2wAe&4XJ8w20YAKzj$u0j0Ai>s%{YE z<$!zbp#>UM_Vk7^b6CB*Q%PIDJL~**UhOQ`ocV2FBKO|^YD@v&xx6y{v+RF{v|n+1 zD(qK&l^vIr`uJpFvMxBo;<_JgKK?Hl{q*Ia`N!^TDO#(p*Q50Elj>uDox%;rIQ^GbCP_~`JGW+`&WcWJHjVm>$X3+JF!89KVYMYnyMzt^k2FS|7l zr_UqcW-D91)s04D-@CK%-80lrp4Q;e(j|n)8LFeB60b61{7E zxonjUyh-VN@#DMdubyp_4Sd|L@mj4uz9Ydm4w$9wAc0P%4{P@2ron0bes|#g&C9*4 zXgNuIHv4h^iM7hpdC<W~j!(*?HkQCD8l$n<)C8GG$Us z&3&AQr~#k#94wAZ0;xj#>$>od&*lF3S4Hdfhlv6S*c8AdZ(Q2)xRjXlvRDqYw1?>=TM6HvITEMJ3*t&vEXzOMyb5fw0Gg^oxuh zJe2teIhGdZYm%~RUiT{n2AC&$FV5>vC$@*Q96-C(!SBw7wdb>|bputSyWX;BdFoPG z=(t7)UvZ(xs_(`*Z_d+3)YZ|8O8RR*GIxv96aEjWKdSr+{f=A` zy_9xNdKWKluinlmIG5jDy*zdsyz<~ayV>hStAC>7VMA$qc-YCc#c)K1fIzhb+LdL{ zG(qOn?oHK?A60=j%BAYEP+wT#SCiIST?`Mg^<$pv(wbdAqO;Y1C2n` zecD^|fx0ADF_N-gLf2ou2!f=(>kI+u$s^>Co}17`Sn`GdvGcLJX^OhT=Wg_%dFCBd zO}<|)5^(3d`kFe5gfHal_i2OvxxzO`bcc8xKnVKtw23fhak;}E(TN@Y=0B3OW8U&@s|5^*@4{zqRmv$fQA#CRU(rH-oS5*3jverPDA=q(lWsngi2@t6CXg31h0*3*_|H-}~? zo%5gqdZ+NdGBTc{zBbbN$nydj_ExQLIaE+Yj~rUS_o>*}`TU+3_8a&;S52eqMW~mM z$V(We*9nT_LPx>XtjY5u8ZbO03q5RD5PtXFRp@r8y+InacqE32B?U&G@AUS2%B6=< z)n^*p;906P{=e}sS-qLtnhqGPV|G9F-@8_h{Bm1mQ8tpplHw2&={z}aJlF(Fp@;Wu zHrOy=p@gmbO-({{IA}Fx(hW0*3$FgS)NcM>lsfNAUlj=7j)v3Q7aWODjuNN|*-! EAMNADN&o-= literal 0 HcmV?d00001 diff --git a/src/renderer/src/api/teaching/classcourse.js b/src/renderer/src/api/teaching/classcourse.js new file mode 100644 index 0000000..665489c --- /dev/null +++ b/src/renderer/src/api/teaching/classcourse.js @@ -0,0 +1,89 @@ +import request from '@/utils/request' + +// 查询classcourse列表 +export function listClasscourse(query) { + return request({ + url: '/education/classcourse/list', + method: 'get', + params: query + }) +} + +// 查询classcourse详细 +export function getClasscourse(id) { + return request({ + url: '/education/classcourse/' + id, + method: 'get' + }) +} + +// 新增classcourse +export function addClasscourse(data) { + return request({ + url: '/education/classcourse', + method: 'post', + data: data + }) +} + +// 新增classcourse +export function addClasscourseReturnId(data) { + return request({ + url: '/education/classcourse/saveReturnId', + method: 'post', + data: data + }) +} + +// 修改classcourse +export function updateClasscourse(data) { + return request({ + url: '/education/classcourse', + method: 'put', + data: data + }) +} + +// 删除classcourse +export function delClasscourse(id) { + return request({ + url: '/education/classcourse/' + id, + method: 'delete' + }) +} + + +// 删除classcourse +export function delClasscourseWithData(id) { + return request({ + url: '/education/classcourse/removeData/' + id, + method: 'delete' + }) +} + + +// classcourse开始上课 +export function startCourseTeaching(id) { + return request({ + url: '/education/classcourse/startCourseTeaching/'+id, + method: 'post', + }) +} + +// 老师学生发送新的消息 +export function sendCourseTeachingMsg(data) { + return request({ + url: '/education/classcourse/sendCourseTeachingMsg', + method: 'post', + data: data + }) +} + +// 老师学生获取新的交互消息 +export function getCourseTeachingMsg(id) { + return request({ + url: '/education/classcourse/getCourseTeachingMsg/'+id, + method: 'post', + }) +} + diff --git a/src/renderer/src/components/common/cForm.vue b/src/renderer/src/components/common/cForm.vue new file mode 100644 index 0000000..c84dbcb --- /dev/null +++ b/src/renderer/src/components/common/cForm.vue @@ -0,0 +1,209 @@ + + + diff --git a/src/renderer/src/components/common/index.js b/src/renderer/src/components/common/index.js new file mode 100644 index 0000000..d31d868 --- /dev/null +++ b/src/renderer/src/components/common/index.js @@ -0,0 +1,64 @@ + +/** + * 使用-批量导入--方式 + */ + +// 导入 import.meta.glob 用于获取所有符合要求的 .vue 文件 +const files = import.meta.glob('./!(index).vue', { eager: true }); + +export default { + install(Vue, options) { + Object.entries(files).forEach(([path, file]) => { + const fileName = path.split('/').pop().replace(/\.\w+$/, '') + // fileName == 'cDialog' && initDialog(Vue, file) // 弹窗--组件化 + Vue.component(fileName, file.default) + }); + } +} + +// 弹窗--函数化 +function initDialog(Vue, dialog) { + // 全局绑定 + Vue.prototype.$cDialog = (props) => { + // props.dialog = Object.assign({ isOpen: true }, props.dialog) // 默认配置 propsData: option + props.dialog.isOpen == null && (props.dialog.isOpen = true) // 默认打开 + props.isRemove == null && (props.isRemove = true) // 默认关闭后移除 + const Constructor = Vue.extend(dialog) + const Instance = new Constructor({ propsData: props }) + props.slots && (Instance.$slots = props.slots) // 插槽内容 + props.scopedSlots && (Instance.$scopedSlots = props.scopedSlots) // 作用域插槽内容 + props.content && (Instance.$slots.default = props.content) // 插槽内容 + document.body.appendChild(Instance.$mount().$el) + return Instance.showBox().then(v => { + props.callback && props.callback(v) + return Promise.resolve(v) + }).catch(v => { + props.callback && props.callback(v) + // 移除弹窗 + props.isRemove && document.body.removeChild(Instance.$mount().$el) + return Promise.reject(v) + }) + } + // 全局绑定2 + Vue.prototype.$cDialog2 = (props) => { + // props.dialog = Object.assign({ isOpen: true }, props.dialog) // 默认配置 propsData: option + props.dialog.isOpen == null && (props.dialog.isOpen = true) // 默认打开 + props.isRemove == null && (props.isRemove = true) // 默认关闭后移除 + const Constructor = Vue.extend(dialog) + const Instance = new Constructor({ propsData: props }) + props.slots && (Instance.$slots = props.slots) // 插槽内容 + props.scopedSlots && (Instance.$scopedSlots = props.scopedSlots) // 作用域插槽内容 + props.content && (Instance.$slots.default = props.content) // 插槽内容 + document.body.appendChild(Instance.$mount().$el) + Instance.showBox().then(v => { + props.callback && props.callback(v) + return Promise.resolve(v) + }).catch(v => { + props.callback && props.callback(v) + // 移除弹窗 + props.isRemove && document.body.removeChild(Instance.$mount().$el) + return Promise.reject(v) + }) + return Instance + } +} diff --git a/src/renderer/src/main.js b/src/renderer/src/main.js index b5fb488..be69725 100644 --- a/src/renderer/src/main.js +++ b/src/renderer/src/main.js @@ -14,6 +14,7 @@ import { store } from '@/store' import App from './App.vue' import router from './router' import log from 'electron-log/renderer' // 渲染进程日志-文件记录 +import customComponent from '@/components/common' // 自定义组件 if(process.env.NODE_ENV != 'development') { // 非开发环境,将日志打印到日志文件 Object.assign(console, log.functions) // 渲染进程日志-控制台替换 @@ -37,4 +38,6 @@ app.config.globalProperties.$requestGetJYW = (url,config)=>{ app.use(router) .use(store) - .use(ElementPlus, { locale: zhLocale }).mount('#app') \ No newline at end of file + .use(ElementPlus, { locale: zhLocale }) + .use(customComponent) // 自定义组件 + .mount('#app') \ No newline at end of file diff --git a/src/renderer/src/plugins/imChat/index.js b/src/renderer/src/plugins/imChat/index.js index dda4bfa..6cf8934 100644 --- a/src/renderer/src/plugins/imChat/index.js +++ b/src/renderer/src/plugins/imChat/index.js @@ -173,6 +173,7 @@ export class ImChat { return this.timChat.TIMLogout().then(res => { this.setConsole('%cim-chat: logout', '登出成功') this.status.isLogin = false + this.status.isConnect = false this.timChat.TIMUninit() // 反初始化 return res }).catch(error => { diff --git a/src/renderer/src/utils/comm.js b/src/renderer/src/utils/comm.js new file mode 100644 index 0000000..29e7a48 --- /dev/null +++ b/src/renderer/src/utils/comm.js @@ -0,0 +1,312 @@ + +/** + * @description 公共工具类 + * @author zdg + * @date 2024-4-26 + */ + +// ============= 文件工具--相关 =================== +/** + * 获取上传文件 + */ +export function getFiles() { + const cb = resolve => { + const fileDom = document.createElement('input') + fileDom.type = 'file' + fileDom.onchange = e => { + resolve(e.target.files) + return fileDom.remove() + } + fileDom.click() + } + return new Promise(cb) +} + +// ============= 数学公式--相关 =================== +/** + * @description 计算两点直线距离 (获取直径) + * (欧几里得距离公式): [ \text{distance} = \sqrt{(x2 - x1)^2 + (y2 - y1)^2} ] + * @param {*} x1 + * @param {*} y1 + * @param {*} x2 + * @param {*} y2 + */ +export function getDistance(x1,y1,x2,y2) { + return Math.sqrt(Math.pow((x2 - x1), 2) + Math.pow((y2 - y1), 2)) +} +// 获取半径 +export function getRadius(x1,y1,x2,y2) { return getDistance(x1,y1,x2,y2) / 2 } + +/** + * 计算某个值在总数中所占的百分比。 + * + * 此函数用于根据给定的值和总数,计算该值占总数的百分比。它还支持指定百分比的小数位数。 + * 如果计算结果小于0,则返回0;如果大于100,则返回100,以确保百分比的合理范围。 + * + * @param {number} v - 待计算的值。 + * @param {number} total - 总数。 + * @param {number} [step=2] - 百分比的小数位数,默认为2。 + * @returns {number} - 返回计算后的百分比,保证在0到100之间。 + */ +export function getPercent(v, total, step=2) { + !v && (v = 0) + !total && (total = 1) + // 计算百分比,保留指定的小数位,并转换为数字类型 + let res = (v / total * 100).toFixed(step)-0 + + // 确保百分比在0到100之间 + return res < 0 ? 0 : res > 100 ? 100 : res +} + +// ============= 格式化--相关 =================== + +/** + * @description 手机号隐藏中间几位 + * @param {*} phone 手机号 + * @param {*} start 前面保留几位 默认 3位 + * @param {*} end 后面保留几位 默认 3位 + * @param {*} rstr 替换字符 默认 **** + * @returns + */ +export function phoneHideFormat(phone, start = 3, end = 4, rstr = '****') { + // const reg = /^(\d{3})\d*(\d{4})$/ + if (!phone) return '' + const reg = new RegExp(`(\\d\{${start}\})\\d*(\\d\{${end}\})`) + return phone.replace(reg, `$1${rstr}$2`) +} + +// ============= 习题工具--相关 =================== +/** + * @description 将字符串转换为数组 + * @param {*} str + * @returns + */ +export function quizStrToList(str = '') { + if (!str) return [] + let resList = [] + if (isJson(str, true)) resList = JSON.parse(str) // 数组对象 + else if (str.includes('#&')) resList = str.split('#&') // 字符串数组 #& + else if (str.includes(',')) resList = str.split(',') // 字符串数组 , + else resList = [str] + return resList +} + +// ============= 常用工具--相关 =================== + +export function isJson(str, isArray = false) { + if(typeof str == 'string'){ + try { + const res = JSON.parse(str) + let isBool = typeof res == 'object' && res + if(isBool && isArray) isBool = Array.isArray(res) + return isBool + } catch (error) {} + } + return false +} + +//获取临时唯一ID +export const generateUniqueID = ()=> { + const date = new Date(); + const timestamp = date.getTime().toString(36); // 使用36进制转换时间戳 + const random = Math.random().toString(36).substring(2, 9); // 获取随机数的一部分并转换为36进制 + return timestamp + random; +} + +// 清理参数中的undefined、null +export const removePropertyOf = function(obj){ + Object.keys(obj).forEach(item=>{ + if(obj[item] === undefined || obj[item] === null) delete obj[item] + }) + return obj; +} + +/** + * 移除children 为空 -- tree + */ +export function removeTree(list) { + var this_ = this + for (var i in list) { + if (list[i].children.length == 0) { + list[i].children = undefined + } else { + this_.removeTree(list[i].children) + } + } + return list +} + +// ============= 校验工具--相关 =================== + +// url校验 +export const validateUrl = (url) => { + const regex = /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/; + if (!regex.test(url.trim())) { + return false; + } else { + return true; + } +} + +// ============= 时间工具--相关 =================== + +/** + * @description 时间 秒 转化 时分秒 + * @param {*} seconds + * @returns + */ +export function formatTime(seconds) { + seconds = parseInt(seconds) // 转换整数 + const h = (Math.floor(seconds / 3600)+'').padStart(2,'0') + const m = (Math.floor((seconds % 3600) / 60)+'').padStart(2,'0') + const s = ((seconds % 60)+'').padStart(2,'0') + return `${h}:${m}:${s}` +} + +/** + * @description 时间格式化 + * @param {*} time + * @param {*} fmt + * @returns + */ +export function formatDate(time, fmt = 'yyyy-MM-dd') { + let date + if (time) { + if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { + time = parseInt(time) + } + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + } else { + date = new Date() + } + if (/(y+)/.test(fmt)) { + fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) + } + const o = { + 'M+': date.getMonth() + 1, + 'd+': date.getDate(), + 'h+': date.getHours(), + 'm+': date.getMinutes(), + 's+': date.getSeconds(), + 'a': date.getDay() + } + for (const k in o) { + if (new RegExp(`(${k})`).test(fmt)) { + if (k === 'a') { + const str = ['日', '一', '二', '三', '四', '五', '六'][o[k]] + fmt = fmt.replace(RegExp.$1, str) + continue + } + const str = o[k] + '' + // fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str)) + fmt = fmt.replace(RegExp.$1, str.padStart(2, '0')) + } + } + return fmt +} +/** + * 快速获取日期 + * num: 1 今日 2 昨日 3 本周 4 上周 5 本月 + * bool: true 有时分秒 false | null 不要时分秒 + */ +export function getDateStr(num, bool) { + let now = new Date() // 当前日期 + let nowDayOfWeek = now.getDay() // 今天本周的第几天 + let nowDay = now.getDate() // 当前日 + let nowMonth = now.getMonth() // 当前月 + let nowYear = now.getYear() // 当前年 + nowYear += (nowYear < 2000) ? 1900 : 0 // + let monthStartDate = new Date(nowYear, nowMonth, 1) + let monthEndDate = new Date(nowYear, nowMonth + 1, 1) + let days = (monthEndDate - monthStartDate) / (1000 * 60 * 60 * 24) + + let fmt = 'yyyy-MM-dd' + let startTime = '' + let endTime = '' + + if (num == 1) { // 今日 + startTime = formatDate(now, fmt) + endTime = startTime + } + if (num == 2) { // 昨日 + now.setDate(nowDay - 1) + startTime = formatDate(now, fmt) + endTime = startTime + } + if (num == 3) { // 本周 + startTime = formatDate(new Date(nowYear, nowMonth, nowDay - nowDayOfWeek), fmt) + endTime = formatDate(new Date(nowYear, nowMonth, nowDay + (6 - nowDayOfWeek)), fmt) + } + if (num == 4) { // 上周 + startTime = formatDate(new Date(nowYear, nowMonth, nowDay - nowDayOfWeek - 7), fmt) + endTime = formatDate(new Date(nowYear, nowMonth, nowDay - nowDayOfWeek - 1), fmt) + } + if (num == 5) { // 本月 + startTime = formatDate(new Date(nowYear, nowMonth, 1), fmt) + endTime = formatDate(new Date(nowYear, nowMonth, days), fmt) + } + if (num == 6) { // 本年 + startTime = formatDate(new Date(nowYear, 0, 1), fmt) + endTime = formatDate(new Date(nowYear, 11, 31), fmt) + } + if (bool) { + startTime += ' 00:00:00' + endTime += ' 23:59:59' + } + return [startTime, endTime] +} +/** + * 获取 昨天 今天 明天 一周前 一月前 1-5 + */ +export function getDateStr1(num, fmt = 'yyyy-MM-dd hh:mm:ss') { + const now = new Date() // 当前日期 + const curr = Date.now() // 当前时间戳 + if (num == 1) return formatDate(new Date(curr-(24*60*60*1000)),fmt) // 昨天 + else if (num == 2) return formatDate(now,fmt) // 今天 + else if (num == 3) return formatDate(new Date(curr+(24*60*60*1000)),fmt) // 明天 + else if (num == 4) return formatDate(new Date(curr-(7*24*60*60*1000)),fmt) // 一周前 + else if (num == 5) return formatDate(new Date(curr-(30*24*60*60*1000)),fmt) // 一月前 + return '' +} +/** + * 获取当前 0:0:0:0 时间 + * @param {*} [fmt] 格式 'yyyy-MM-dd hh:mm:ss' + */ +export function getDateNow(fmt) { + const date = new Date() + date.setHours(0, 0, 0, 0) + if (fmt) return formatDate(date, fmt) + return date +} +/** 默认加上-时分秒 */ +export function toTimeStr(arr = ['','']) { + return [`${arr[0]} 00:00:00`, `${arr[1]} 23:59:59`] +} + +/** + * 秒转时分 + */ +export function timeToStr(time,str = '时分秒', isPad = false) { + let s = parseInt(time) + let h = 0, m = 0 // 初始化时|分 + if (s >= 60) { + // 如果秒数大于60,将秒数转换成整数 + m = parseInt(s / 60) // 获取分钟,除以60取整数,得到整数分钟 + s = parseInt(s % 60) // 获取秒数,秒数取佘,得到整数秒数 + if (m >= 60) { // 如果分钟大于60,将分钟转换成小时 + h = parseInt(m / 60) // 获取小时,获取分钟除以60,得到整数小时 + m = parseInt(m % 60) // 获取小时后取佘的分,获取分钟除以60取佘的分 + } + } + const toStr = v => v.toString().padStart(2, '0') // 转换字符 + const arr = str.split('') + if (isPad) return `${h?toStr(h)+arr[0]:''}${m?toStr(m)+arr[1]:''}${toStr(s)}${arr[2]||''}` + return `${h?h+arr[0]:''}${m?m+arr[1]:''}${s?s+arr[2]||'':''}` +} diff --git a/src/renderer/src/utils/linkConfig.js b/src/renderer/src/utils/linkConfig.js index f03f3e9..e5da707 100644 --- a/src/renderer/src/utils/linkConfig.js +++ b/src/renderer/src/utils/linkConfig.js @@ -1,6 +1,6 @@ import useUserStore from '@/store/modules/user' -const baseConfig = () => { - const userStore = useUserStore() +export const baseConfig = (token) => { + const userStore = token ? {} : useUserStore() return { // Electron 设置cookie url: import.meta.env.VITE_APP_BUILD_BASE_PATH, @@ -8,7 +8,7 @@ const baseConfig = () => { //cookie 名称 这里为 token name: 'Admin-Token', //cookie 值 - value: userStore.token, + value: token ? '' : userStore.token, // 域名 domain: import.meta.env.VITE_APP_DOMAIN } diff --git a/src/renderer/src/utils/tool.js b/src/renderer/src/utils/tool.js index e7fcf86..a4160d4 100644 --- a/src/renderer/src/utils/tool.js +++ b/src/renderer/src/utils/tool.js @@ -12,8 +12,8 @@ const Remote = isNode?require('@electron/remote'):{} const { ipcRenderer } = isNode?require('electron'):window.electron || {} const API = isNode?window.api:{} // preload-api import { useToolState } from '@/store/modules/tool' // 获取store状态 -// const Store = isNode?require('electron-store'):null // 持久化存储 import store from './store' +import { baseConfig } from './linkConfig' // 外部连接-配置 // 常用变量 const BaseUrl = isNode?process.env['ELECTRON_RENDERER_URL']+'/#':'' const isDev = isNode?process.env.NODE_ENV !== 'production':'' @@ -297,6 +297,23 @@ const eventHandles = (type, win) => { } } +/** + * @description 外部跳转-web网页 + * @param {*} path + * @param {*} params + */ +export const toLinkWeb = (path) => { + const config = baseConfig() + console.log(config) + const fullPath = config.url + path + // 通知主进程 + ipcRenderer.send('openWindow', { + key: `win-${Date.now()}`, + fullPath: fullPath, + cookieData: { ...config } + }) +} + // const taskHandles = () => { // // 设置任务栏上下文菜单 // const contextMenu = new Remote.Menu() diff --git a/src/renderer/src/views/desktop/container/class-start.vue b/src/renderer/src/views/desktop/container/class-start.vue new file mode 100644 index 0000000..84b792c --- /dev/null +++ b/src/renderer/src/views/desktop/container/class-start.vue @@ -0,0 +1,361 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/views/desktop/container/work-trend.vue b/src/renderer/src/views/desktop/container/work-trend.vue index e4ca636..6ae0969 100644 --- a/src/renderer/src/views/desktop/container/work-trend.vue +++ b/src/renderer/src/views/desktop/container/work-trend.vue @@ -10,6 +10,7 @@
+ 上课
  • @@ -24,19 +25,23 @@
- 上课 + 上课
+ +