&Aa7XvRHIjl=Z=D5vooi$?ZO^L
z63a9yD}>*HDdo+*w*aqgU5fU?kQ`8rcAiVFG%T~PC!5MFaT#zK*bh=s<*j+C7OSl7
zj-NA8&^s+KL+`G#OYRb5qR!g+x|Fh{;-U94&7ih~{19%A#
zaPk{NIHex^wSw`*>`PUm?$2hr$5?Z5jLA~fvL1{SF;VdfvNOyIEpbN6Y)RiQM(pzK
zeg#kZJ5H-o5(tZQNQ#OuO^C#~nCQUGeLwh45EV4py>}Kwhf93j-xYg!@U-@Wc+1{L
zac7elZ~GrG>+v&QG{K0m_qDCNCyu>q_hw1RHo5V;U+
z&i8%E>H=fO6);AFOV=+7=F*I`d=Wo=NA{t1#F12SJZv3k9-L@~iFns`!iw&gjHedR
zvK+2sC#A+(NV8LR3i3nQJ=v9Ma*a?11Y^J;QLWmw*Z{&(_Eb|p4_LNW%|`b!{xK~
z(>uR^O&KVqIA<4!Mz|$%&0)BNZI{6asGs$6eLI@zkL1-R`+fgDU_sl%URM4KlQh9q
z-)LqPvmkoT{c2bwe`M>$g&hSWkM0tPa;++^&x4Gz3Ol0i@mPVuhEFMP6Myz%S%_8y
zIA&5Aqnm5MWyU7S#b~cU;ubLaTR;_*!Za6>Bau@?Z_eWdyWGI{V?y&(I;5jbsA)OKf><$p!Rr)@o)XB?y_AhgHnXtC$NLg>o#Z0kOG
zuOs`55a`aWKvMlcX4B$X8+2J&kBK3K@
zavn+PO}=`dZ_(D8amL~g{jK#k5p3eMYhHSlgo(h=R+@Bx&saxo#(YJ!1qUoLsRa$A
zwAv_$*DdObT{J-4MP)S5&ZO!qV{C`=hG@p`0Ts$+B!mo3lVb73pF6c%N5AgLF_0{F9oH72baynt)Ppf_@AF_7S4f6Q)E&oPO
zdf>9Swrev$ew^ff^&-se&3L(YT6yHocvo?Lz$Lwm#p(
zTGLg)Iug#>{TZ!8k;RsBIz^Msq6aOF=l{<2*v{&{_@(Dw^8$5NR)PAjgVS=y({bGN
z>~)(MI&Jh-m?FbZEV~sq6|E2#QP;Unt3`iiBMuKfek*<7O-pG55ow4?D|H^EDpxsP
z(u(O#3
z$jY70+{(tzQJj9iwvnFB&QhFSM?i&J#aYJ6)=t64)k?!hRnx);WFcZnFDZeK0|bkL
z9h@Dk+|B5~4sRXZM8V?pfA=nms{gf_i=OUpi91M~Uh1!5>2y_I)5$owTG0t`3UXNR
z@bS_KiE#1=i0}&Yv(xc%^9XWr^K`qVm6%Iyn4A;qPwU+|{lAv&;W&$8MV5
z&Q@INR&Gunt`=4(Im2I#oke9_t;|q2HfTCIy+s|A|D9VN{%)tDBC6=<=5FR_VWs#|
zoF3H^r=6Xp=u19s89^RyK4D=Q5gr~{VG%xVVHqJQIaxkA5dk3{{(rT7>15&IVCCrk
zueO%|Y0LjVw*Bi!VPgYPW1&WWY2|9?X=N$r>f}K8xA~%W|MULv{EvP9v#sU-yg$7E
zV_UBO?9e|jTD>%Lx03kllNJtcAr4+%O`d;#`U2$oH|l?AfLwn$$A58_zrFD9jVL!n
zt)N=`>m`6%`yHThk@(KL?r{APfj<)8dDk7TKO*o);ydrU!}Ui5{z!c1U3a+th`=9-@4V{{*B=r1
zBk`Sg-QoHp0)HgF^R7Ewe?;Jq#CP6xhwG0B{E_(1yY6uP5rIDv-+9*^u0JC1N8&s0
zy2JHH1pY{T=UsQW{)oUIiSNAY4%Z(M_#^S1cirLoBLaUUzVog-Tz^F1kHmN0_5V4p
z|9p+c%F$As#fwE!;_u8#==bjZwV(3$o&a;FJl)|f}Xm%Sueu
zlfn+?r}&l&;pt)}W7#^aOL9;T+`!VG0lX89WC}0gQ;L8mAx#Fk}hZ+K=AO{lY;*
zvs^inuGon^s%O1{0Hh>
zIsMHe%CZ?<>tS(BCt_jGQcKxU-2(pS$LC^0%lAo`01lGh$h0NW;4AX9t@zB+0zKVH
zJA0Z#MP~94Nq26l0B}=>n!Qty1U(qqk@Of2RL~TNk;k-tA>SwA$QS~t^Okz~3E^oqJ#e8tB6jC|c1S~~3wdn5qap^N-u{7C}
zD85z;sz_Vv(VZUH48DNJoo;=@6l
z2`-s(8G6X`pUyI-w2e{m$K39TnOlp1m?kRTrh-olNT90ugcJk
zUO
zR<^U=S=8kHm6Qj5VV2vX$wSHDx|K_sl(pWv+Zi|#5`nso_k7usXn
zzDaPxPwbEs%HCUEasxcPI=Lc+mdxifEuit~Uv}
zUP%wf!(W%xaJTx>KS-~WMt9@^2rfGV&S+tNn3rOH=A)>*BDVnA%`u7RaF$Q46d$6>
zPor~RwC<#IVS7+HohfX?qmu0}aXaSAyh5*N5$ZSaH(_K~k~SW1**SKb)hY~L0ff|h
zz(kq8E>Zp7WHSx!=h+?4RgDkhjK{RM=d+9mLFnIP9;WGacgD@SZ2Irr?1~;sG+R!cfW-$(jfvm!bYvbSy?
zk8-%XS;n_E&6`KR3F&{&+}ZWJzDeNREDfo)OdATcS-u54+?-0?Y@iziZg^blkDZFW
zxEJusC8$H{fitm>&ZOmBPv)a?4hH6ezIlJr-u3E3kqd;b+2sP2!nQ7Q%xR8
z=)^8lWB=ZBYlpnMX+zP$%xd4qoZC?T*}RC#0fB$+Oesd)@32z*lw9|$r$S2Nq{1nr
zKprPY{f3x5DR#Vmu5iC1SVWb9(B#p!CTQySuJ1U!JT|O1ZRA3=uJ<$wQ5kweeMO4k
z3iV^dKxN+%TzhGEpiT0d;uQ^9_B!=89JDHld^Z2_1fOuh;|J{P00u=x7Inci3*se7
zg54>T{Hh7ZyNq3g=4N@VL9$9j!HFM-Qhl_<^KnVLqHxKFeq6bB6v<)x<^K1VsO;&f
zC785AlOi_Bo@H(K>mg+>#jdoFF+Vdi7B&s!4_4c5Os3OEA-&`t!ki5F)fE@Z<)&aa
zW#mWNmifoC8wbXES7J=G+TV7qig{~f>#HTwpnc-G
zJybgj$=Z~B@9ujGAVdnu!97&ol-Em-jS1U~P?^pMzs9{0s5haz1vHD)=`E?)G&k@L
z3FMuhDC6U57=S2qX48QoM?|_OueB7YD|N<4&pibLTg_RNRCgtke3Em_*w|$sj4F+9
z4E$&if=nmjA(@u8Bk^V@?DZQ;ohTIfwQcV)BVsTomW2yxo1q79U|1bAf=Y
zf$G&yZULyoBV@9lA?CTf@+8rhR(?uIt~Brz2cO{qIifQnMPa5BRKt#b_DGL-we)%r
zy9oU{&MZ#;I-ftm0n}>o(m|UoiXg^?h}K;3^|zkjm50LQYYkbraf>Vg9$AV<&nolg
zhfJKJj>r-r&yz&?&D1$L75QW5ia=MtQ)#EXPD7C&5iIRbObGXwMhocbewdY(!%^Re
zHYL#FV_+c%_%BE6xI;-GBewuzAU5i~N)_>ed(sxJg5Um?Xj(=B>9z(-5e@eO!X=0{
zoHuSLk?RMUXB`ZSYeg3MxTj;}r+kxX4|@otOf}IDZvj5lPVXdXfszNwi&*Wjd$$1f
zn!1`XvdkdI&t1dDd}$rOxh2$H)7MEhdlE&gPV9LcIR($0+;?3*{d=nuK_@d_fz#1b!w+V
zNNDbrz;%)zTiUiWrOK<0Gd_dLxleuOiw1+c3=Abj*0q%ey?Q@go0+7;H5cB=35&!0
zX!xSH1;mqEy+972V~J(#ffFA;)M-0rzkUZ?1Z#YI3;2+94}m%MDI1xnlCA%xGy_&U
z!~Rw@#R|jmwBH$Za1YeEf`;wc@G7Q8>r;e5ouy2uJZ7)m!q%aSlQ)>~eJ&5&TfpP(
zaUa*x8UHWhVVB4b}lkIAsO9a_g*UH^uN-xOtXJxdmEMR
ziu(l1QQqNZ^tjB~`_-mus@s<^9q0jJLP1!6iZ=1?gCoH&l(%lGnmimeRoIvVG!OI+Y(HyeuP7zbn(%51QvN&lhgJ}9%
zh~e^i&dxEpQ^V;Xw`3xqOV*XZfkgQdOtW%=zt*!VN@HJ87)QLD4kGXaVX?Fxe1n6O
zQzJrVA`19dV@ypr1*2A?O3Sr0Et3dWO|WmqlPd&ah|*?3W0Hecaf1{6&Mc$WHK8pu
z0+%K4d|(q6HycF;T)lY~_Hsjhaihmaz`9oMwD%b-telo*MkWpfA*XKFSvM?KuGiW8
zNSiukD4uxwQGd#`T!Tt|6`8hm$I@k(tD1IGr_$w3BfG@Cn-T3sG(TF*xF88Cl|p3j
z*0N}337yxawBsWEGi(5!srvwMe2d^y_74mB;s$O-`|;QEA^~P0k*>j0ts^#An?}`Z
zv=d{h#3N6CO&fUJ0zyQ1_4mpNAz8pP-%ZFTcvrm%24sfz$zC1hFT%I3)!IMFI
zQVNIgHA!Ce{$fGVb^DWD6SwWD)yQCX(5`_-wX(QG&y%DjZ^E9?G{)qXMotMn$RG_q
z5_b8*0KC^KJHj%&SOSv5c>l6e1F%h%!q{Jmj#vpdtb+RcLh)FV&MEM8>!+&IdyXhWY0)w)G44;)(_e
zKt$!?!2@r4VuB2_8F!WgxOoh}4k8CSDq|JR7O9=viPanjH&5Nn70AzkW)%x~E@77n
zZ~XT5hSVMGE6NKtvu3m0R@Ot6z6|xKhpEXs>_gj6<_+FLeqG^@rz3=#=kMD`i*H~h>o546Vm6mA
zqin#^+@8yg0*8`q9H3So!e*|}2D*dT@?16VOgkQ1p3SMx)12Q}K0l#*$5(HOm3Ul~
z2YDvVDM5{d;s2U_Z^1^Ud$7PNe9gAVfo;-h@~g2ufeqK``I-rfW_d+bw8wQHk0@zO
z$lSAgpVMyvo(-SaGBapAkJVw9_TyKN+xwmiXFb?kX7d_?{)pte4)w!L1J5ttMA{YT
zbwaJOCKa=p%F>>}>CSNp79Jquf`i!h9x*}0h2GHZvn~^^q{VJ1}`>F*@pzrhL@;krhA4y1V#6#b6ye;dO(H)}It`FX_
zpl(=otsMb4x0zBAOcs)!k|StJ78<97!HSGgJ6u8iu_-o``=9zkd5&HH@kq8eO-xMu
z8q13UBeMdSZvjK2i?@K%>*RM0cy={K?UIkTB~8ccv)vhD
zo={0s-l;~)YHAe{zgDMiWHcSO>eRHG6A}Yw9#A=77a4G-@@TR>Z^9s5(Tj`)wEALpJnUk!
zj*#V(r1k!XIl`KcyJO;lM%H^yKl)q(^aTzzZw|T?0S{la`+%!1pOe{+`eYSlu^k%g
z8+08xlZaPvk%+R%m7Ua_9F5)BcTPy+TKh(ZK&Zb+=l5ID_I)5Rs|+Sv#&AQ9YZ+#>
z)M}O@-4?qn%D=Qf=>ZxjaSvTpPsv*t89^L$kY6f2As-2YXeDpPzxbJ;-iu6BBNty4
zx2z^^aS)eeEWX0eBe)TFi|{dT;6vIRFjF%$H9oAfLfERLhvwTDi7C~M;OUUY1t}gS
z3HT2jJ-iQQOd?>LfQUi5CCMe&{4B>#YN3w|rc6-2A+9
zYyYrOW{Ho}3zZ`6>yH%o>h!Pv>T@?ns$9)CbO#a92kY%)K5K!@c}u&pW|6WD*3%@R
z_>r}C|6gO(&iN5Jb)w=X{l`{EA>gX7DS
zJ}p_tqh@sIOT;iV-7-(!U3uZ_MWVyj=`4W@i%VfJuFPm1u1(QaBer`Z8Ym9XcFH`f
zOcpFyL1ra2Ah#a2``dmfO{JsEFpW96Ew*B}zQG{LQC6wIj&=B}`BK3_?bP+L4x~tC
z!jEN1*@O%XdNt1eMYC*#V|b0}2aW>CJ38K^;JUoi2BeffB5ffvCvB5$4fLe2a?Hi$
za`Lex9ZQO-0?o;;!Y2w0S)4F#5;*`#;BpbQZ8H892Xu++;e2P7o%WmWO!2B&Lz*7e
z;sC1ntF0hKcoD@{?VOFubJ|qxES#@aI7M>hl9D&f)G|$t#YG?LSeKP?ciGzFrqZZI
z+sEx-4AId2kj$|Se_7YYQi%+N;C2hezz4_^r24bHlio-+Eks7M1@$k7rZ-n~*&Kt9
z+=kPTqq$cvuXDzYktt82nIc=E1Z^$tPE17a$t1;6lN+Bl&B&v_pDJ!3zS2b|T(VEw
zL72+nj0w%gPa}7Ure^Prc^Oq=8C!gYUNjdCKUGq1QNoQG{hHw7r0TGHXe3yDKC}JI
zBJEAi^EY8(U-S=mp>h}d4w1vj?)P-z8U$714
zt#M5jolcfs|E#kS3YJ_Xtr>Q*CH_PE`j!`N6fR
zj*ffs?DBvGQ?vnK{Dtk3+4Z-K=bw^(OU_j)+yWAI{I**ME>$vA4%w71>t?OChd3`j
z-%RMx0-VZoj+04Ry;vf$6na$_6D$PNC~`2hN)8XjxPP;)6HcnNN#G-)mkQ6pkuMuB
znfj6^FSt(I05f{8_EH7E3!{ZD3oiq8hH1-5L*#enmo_1yU{wRJF#&Q0csVtL`X^N4
z-WlN-U9+g*p}`{)Hoqr`pn*2%RBLPe{-<3=ghWP;J-tq4+3NsStcz;yy0?*m;ipA1
zT#*tcVuFi37u%2=Hrobh&bsxZa6TNRZp}4q_|BPAW7oA~u4qMN)`no_x_V;;e7BRv
zVI+^@#&UEEnQ*#yoeW{R(nVND=7Ami{bYXXO?_+pHN0p6w&I9p9-|YK6QK&%X*bQ*
zXdBbq>X(wpzofGA`R2o$qe|f5E)Rzu)YoA$m5;U=GnUtsS9HZMjndeDjY#uh#kfQ_
zVZ9kh!mdUJU7CU8mb^kxGcc^C*B>!Rg|v&_a;3X#O6YUbveK1YM4T+s5Fm9f-}s4?
zUa|z0{qU78#YiqSP{EF5$(d5b7~7e9a$S59O!|0WiEjHaNQk@r77!7Rb5R4v(X~?N
z2er;?*T$*6tUOQVV{ZY+scID;)fw%ijgL0MHI9eF&f`u+kZK5nrpD>`&bEPvvqs(7
zsZ147E?%d}jDgV%f(qK=f{`8drAw7#M@`eAT#Sk^s|i52T|EudXcn6
z_U9B69;%Hc8Jtjok&9e`A4*CE3RT_`A>x;EU}#eVJyIjL6Y((UV76j9hfHNvfm*}}
zHtwXWQdKzhWPhpa4@y;vmgO>;#Eg
zEFQ_;lqVMA<6X2iUPj~+iA
z4Snm5!AcABR@;fbWRy9Ol&Wn&80tF~E!B3eftQaSjXk{2Al*97nCRA-;ZKsXtqoxu
zdMjWgVIt9Tfl(b`NYo(oy2sg@ifAkwIp6BEOo+8j!RU3g>1r}9UR75v{N+(AW!zld
z6gYQeqwcw1iQ|6b$%+qO%TSKKaBLA{e&qLCfUOgnpWYbIAlKd)ADNZ~wrG|#U4Es=
z01M3Z+dlK2ky;1Zko2S8@VxBFA&nlZi0Q&imo)?_mkscGK=7@A+Vv->|Ue9|Z|F6Ltg
zxAccQrB3K?ky3nkqKz;y1e6-4D=~g1c%MKne3n=C#)R7QOd=l@gnuFLf-@t<_zF#r
zIA?~JTTWD`n-^T$1T7tiD6Hc$TU4yeo4o1I-xeAYO7>W{3<^!6;HgdY`-!JBuC
z-GDoJr8Trr9U(w*6Q6&|#Xv;)i2Kcfh(^B;nP~BcndkGdM#(d`fFg}(B2{%I&E3A*
z8cBz#z$p|dgT*+R&kuNAJpIUoX5LzTf7_~LE10f
zcS+Nq`ZZ^3MfUTD;pZ1N-EX3skGqNlMkLL9i%3;G=ke?8(viQ0?{~um$R&ESr8+!C
zqq@%)Tui)oZO1dy!u(3L%f_RJ&b_m;to_)Fk>MOV>{Q-A_rX2|>ZsGhk^B&>K-Uj{
zj1d`y&{#4~SSoNGP!<)0Wo;Cv@<+waMpHb}n^!GI&s+;(zS+IG
zKe#;2BfKQRzRO|98P{PqJni1AEP)1|&Mcs=9>Pv>Nt|7Gu89y0xFcQM5^cD95rJM}
zT`YxR>eh`cI(sglNqE1j;9$7fv`9o-Bf4U2v;0ea1klipsyWv=b&+ItAF?~Oo&Xt;
zL`MZxk%!Z&FqOvOvNHpi&1E7u#*83_giUfw{$s>ySB~
zV5;a&ETD^t6y*2(y=A2MVm0mSFVynwr2P$->IxO4=zH1J@2CavL}RCaV1@Lbh2v~5!x
zXx(=1RTYu@F&!j-G8@_By5h^&qWCdd+TzGuA;V^+fbLCxaWgDBmyzSA9mD^F
zwQL^)JL;`PwMDj}DD$d$Jqg(g`i^~l$gWfYGHia)b{HsRUy7^|id|EYUTMX^CvS`G
zLasS3su}8JQPD6b)VZIZyFuh}+XmxH$5+>T&l9n(9w#r-q%6$RcGRrZrm1C_7;e$G
zOc-})zabX;^#ZsMM|IX&?*HAGX`vBD!#rB&fM9qv#t##vW@|>o@#+2U7wG2sPV68q
zp~bLmcoqn?D|$EsW+r@stZa>k1TD@=?{(*U@YnUx4}0U#@+W=i43C0G8IkpX6Ro_p
zzvy^w&)UZM6a3|sqC6>Bsg0@wCMs%ad8mlCZPDbI+7!i6ORP^wC^Ni{Bh#?F|K>Xe
zRA6)2mLrK9jrM>+Hx^pXG~wZX8krAmq)u+$T$s$~pE!8{l(F&xldn#%hB}N{(VWjlwp76{
zjT{in35%zLQ6B!%`1EUY43fQ!UN(;w&UkLh7S%}ALrTMH8U-%q&6IR~Jp9v>Dk`^p
zY;7mXW4-8pF_``3Jb&Es
zx>MiyHos|p^5QDA>w*F``B1se1#8O&|Hj2w~+wy08F_EwDRLv
ztmWX;CIfwqbng?#O|0BD^lH5YL{emhLm0P{2$N;Prq)~Eba~XqcuwRi9s)l@4m>EU
zH;uhOm*(5s3kAN$^#^0gXbut_7P2N~m2s!?i841|=UWzjbUKmsJK%A0v=4oPt8iu3
zLX%Uz<}FsoC^{8Z>^3xxWsM%|eDHgTTwQ{qBh{K*TeCKNB1)D(C2yU^R>u`X7+lwk
z)qV@BgS+yIugnp!`F8msjw>c7mJt4v2z+yd}s
zgmn{?)w}Tn2a&shT;cr5#K!s?ujQG8GG}Mi&}XQ7`E~9y%8@N9OtoFc53M4DPNB4d
zjr`IbZ+w+6enF!pzUNZ>4$1~b$1Tpc&4h0Co^q#13=HPkgNZApoNFeV8PW!$&PS-A
z{r1#)%PzAKi*#`<0v2AA4wL=ZP0rmnAl4NQK8zWM6l7O*S6Fv0gUt?FCht4B;tH}}t#@d!TP%n2JBF)m|S9uMv3nTTs#h9@!LYh^Kc)>RBi
z#=`v9hj}_m=u@A)eDf}s8<3^b523p*;V3f_k{`8z7dRgKYv_-Zg*v5G_gNaW8H?~m
zL^QD;7i>z1gCis#gQ=m#JJ3biG5TMTuU+^kLmfF|WoW;O@}iUf_CBxL)CCeewI7Gn
z!*0qIclIlnT%l#1Et0V0M|BJ`f(uL
zGOw7C&{VLR;>?)7RZYt;McA;Awp+wbTXIL8jplW>$EF17CdKc_#cdIwY(D5rpSqxa
zwE4-Wq*wv+9N=(aZwp?uski#(
zO-;;7#|JWZug0oAETMWBCK%uk8fS?59-*RUFx;WJvhr!LN7Hn*Z!8NnpT6HffSgu3
z7!T*DGZBC*W*gKAzRAqAbnoSRNGr*_B)_iPKyn>-^@dm1WJ@jGmSXg4>ekfWKwpyS
zL}v^ePiyuyXshrzX66WI{A)~{&=pTW3;dUw0hMHHW1ul9(!NMAE@L_~gO5Mjgsk&h
z-#S+rDrtN46+_rw4xy4GD8Pf|&5_FN51z2FGOf=Sta)?6`TH3?67D9Gk;W0UVfua$
zy5h=Ti1Nj1p#xMlC*Ffi?;52;mrQI+_V~X8N{cYmt5z3B2p?eu@^0Vv_jaxVAB$hM+99tc;{@70DZG
zb5nAjylfs{Uc3;mDoVo^gHrJ6c2XM{i0=-$4?*rXYGrt2K|8hmPBJ0AUKgscQ!=3Z
zqkJF1j11{KhY#U~eT>prsc7NaswJ0XFqvjARvy
zLJ;AiEb(W1Aggan=I37J|<;G}keeO!GN({ZoZ
zzQLJxetH&%pDWy27{0^yjlUEc#({i!vW59xH?&p5Nn?wPy<`P%Vl{
z$Q-pd8dR+hW1{zmJiJT~+>N&@b>J53KV(j|lGWi?luj;1=`d7$o1}M%zJrG8;|ix~
z2Y9RQQuE-Z{~|dKp`lha%0CXTv-2DWIahozlC3%-h9!!k!M8y3*LDH$~7s
zs8-taMR_B`n!&)NPFqC-2HcN26P(+ACE@_(pEs*3=?Z3!GA8{vzNTmX-18`~YOPk>
zcL9H|xF*{OEawDNv?&a+b!|5N$iS1V-p-foa~iLvlw+}7Z*WDbsmP%j3+V|@VX9phSdMqvam$wsaw-#7Ya9F3OdZq^X=+{}
zravqe#Yf&O$yXtW=oC27BH`}T$?_ttukoC4ZB>scti2ISQbCk1N|Y`)V(WsTtvWuc
z32CX~^>g2$HVxPeR%qlni)rAlnRGAUxY%OjyCm*|`EdTc&?`qrcgEoRqb~=ey>j|V
zDnI8j*iaJAi60rC$v#`!YN6@ZpE@>Dig}=9xDVC#+h2&BOw&D(3
z(Q-**dD^qVpBod<(GLX)M0Vr559W8AxPtb9E*_wz2jLAYLo3B!Dg7`Le_QFP0mC1r
zdu^MjUZ{^XPLaV(1aFMJuKLCZ!Y;+2F^vrC{x+u&L{Vt^0dq+nI9hSEPIhrud;3kS
z*tDRpprVd_JH@&)QN)L&)B-=#>+kzFY**6oE1g>aw&v8!DXThcRIc~$p*_DsJU>Gp
z(wX9%ZLzX@fV-7A`%O}}_L>)26@|;|YZ~Gi)~FdyMXHDXuK>9LM*jR!uIusmnHv89
zTGMqa8`JiD2YZQ(k-uNy;Cte_&xij20Cleq_)o`n+UJO&)HUA~LLidj*4)PhxJW#d
z+N9+1f^vG-xlu&%_=<|smu`!up$r`wZt+(6zNgRH5A5Tt_-DkQ3iVrUV@|$r2k8=N
zHxb_3G4qx2nPMRPjxpEJpIXZB_w2XgZ8yTcCGef^i>>Z_Gk50;8$oP>k-9$v7tr
zz&62-Fe~Y5DgA!GSNJaN{%!r>uyj_-@qLo~l0InhSL}BeiM%f-ht8{QYo(1xQ@?`V
zD_kT$X+p88fzx3*X*1)459vNo=jR;C#m??6=~Ze*)TQ_P!+3jrNh^OO1C+noD=`*(P^qiea3b
zd4~mk1w#+)hpOrKz8Dt1Be!dPKH9=7i-{p&Iz6mrH@;kNh2Z$~;q*&wG import("@/views/error/403.vue"),
- meta: {
- title: "403"
- }
- },
- {
- path: "/error/404",
- name: "404",
- component: () => import("@/views/error/404.vue"),
- meta: {
- title: "404"
- }
- },
- {
- path: "/error/500",
- name: "500",
- component: () => import("@/views/error/500.vue"),
- meta: {
- title: "500"
- }
- }
- ]
-} as RouteConfigsTable;
diff --git a/src/router/modules/qa.ts b/src/router/modules/qa.ts
new file mode 100644
index 0000000..d9d4432
--- /dev/null
+++ b/src/router/modules/qa.ts
@@ -0,0 +1,29 @@
+export default {
+ path: "/qa",
+ redirect: "/qa/chat",
+ component: () => import("@/views/qa/index.vue"),
+ meta: {
+ icon: "lollipop",
+ title: "问答系统",
+ // showLink: false,
+ rank: 10
+ },
+ children: [
+ {
+ path: "/qa/chat",
+ name: "chat",
+ component: () => import("@/views/qa/chat/index.vue"),
+ meta: {
+ title: "对话"
+ }
+ },
+ {
+ path: "/qa/triad",
+ name: "triad",
+ component: () => import("@/views/qa/triad/index.vue"),
+ meta: {
+ title: "三元组"
+ }
+ }
+ ]
+} as RouteConfigsTable;
diff --git a/src/router/utils.ts b/src/router/utils.ts
index 2436e2b..4f956eb 100644
--- a/src/router/utils.ts
+++ b/src/router/utils.ts
@@ -16,7 +16,7 @@ import {
storageSession,
isIncludeAllChildren
} from "@pureadmin/utils";
-import { getConfig } from "@/config";
+// import { getConfig } from "@/config";
import { menuType } from "@/layout/types";
import { buildHierarchyTree } from "@/utils/tree";
import { sessionKey, type DataInfo } from "@/utils/auth";
@@ -27,7 +27,7 @@ const IFrame = () => import("@/layout/frameView.vue");
const modulesRoutes = import.meta.glob("/src/views/**/*.{vue,tsx}");
// 动态路由
-import { getAsyncRoutes } from "@/api/routes";
+// import { getAsyncRoutes } from "@/api/routes";
function handRank(routeInfo: any) {
const { name, path, parentId, meta } = routeInfo;
@@ -181,34 +181,44 @@ function handleAsyncRoutes(routeList) {
addPathMatch();
}
+/** 初始化路由(`new Promise` 写法防止在异步请求中造成无限循环)*/
+// function initRouter() {
+// if (getConfig()?.CachingAsyncRoutes) {
+// // 开启动态路由缓存本地sessionStorage
+// const key = "async-routes";
+// const asyncRouteList = storageSession().getItem(key) as any;
+// if (asyncRouteList && asyncRouteList?.length > 0) {
+// return new Promise(resolve => {
+// handleAsyncRoutes(asyncRouteList);
+// resolve(router);
+// });
+// } else {
+// return new Promise(resolve => {
+// getAsyncRoutes().then(({ data }) => {
+// handleAsyncRoutes(cloneDeep(data));
+// storageSession().setItem(key, data);
+// resolve(router);
+// });
+// });
+// }
+// } else {
+// return new Promise(resolve => {
+// getAsyncRoutes().then(({ data }) => {
+// handleAsyncRoutes(cloneDeep(data));
+// resolve(router);
+// });
+// });
+// }
+// }
+
/** 初始化路由(`new Promise` 写法防止在异步请求中造成无限循环)*/
function initRouter() {
- if (getConfig()?.CachingAsyncRoutes) {
- // 开启动态路由缓存本地sessionStorage
- const key = "async-routes";
- const asyncRouteList = storageSession().getItem(key) as any;
- if (asyncRouteList && asyncRouteList?.length > 0) {
- return new Promise(resolve => {
- handleAsyncRoutes(asyncRouteList);
- resolve(router);
- });
- } else {
- return new Promise(resolve => {
- getAsyncRoutes().then(({ data }) => {
- handleAsyncRoutes(cloneDeep(data));
- storageSession().setItem(key, data);
- resolve(router);
- });
- });
- }
- } else {
- return new Promise(resolve => {
- getAsyncRoutes().then(({ data }) => {
- handleAsyncRoutes(cloneDeep(data));
- resolve(router);
- });
- });
- }
+ return new Promise(resolve => {
+ // 假设有静态路由配置
+ const staticRoutes = [];
+ handleAsyncRoutes(staticRoutes);
+ resolve(router);
+ });
}
/**
diff --git a/src/views/error/403.vue b/src/views/error/403.vue
deleted file mode 100644
index 83b0838..0000000
--- a/src/views/error/403.vue
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
-
-
-
- 403
-
-
- 抱歉,你无权访问该页面
-
-
- 返回首页
-
-
-
-
diff --git a/src/views/error/404.vue b/src/views/error/404.vue
deleted file mode 100644
index fbf01d0..0000000
--- a/src/views/error/404.vue
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
-
-
-
- 404
-
-
- 抱歉,你访问的页面不存在
-
-
- 返回首页
-
-
-
-
diff --git a/src/views/error/500.vue b/src/views/error/500.vue
deleted file mode 100644
index da672b4..0000000
--- a/src/views/error/500.vue
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
-
-
-
- 500
-
-
- 抱歉,服务器出错了
-
-
- 返回首页
-
-
-
-
diff --git a/src/views/login/index.vue b/src/views/login/index.vue
index d6da675..8ccaf77 100644
--- a/src/views/login/index.vue
+++ b/src/views/login/index.vue
@@ -8,7 +8,7 @@ import type { FormInstance } from "element-plus";
import { useLayout } from "@/layout/hooks/useLayout";
import { useUserStoreHook } from "@/store/modules/user";
import { initRouter, getTopMenu } from "@/router/utils";
-import { bg, avatar, illustration } from "./utils/static";
+import { bg, illustration } from "./utils/static";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
import { ref, reactive, toRaw, onMounted, onBeforeUnmount } from "vue";
import { useDataThemeChange } from "@/layout/hooks/useDataThemeChange";
@@ -33,8 +33,10 @@ dataThemeChange();
const { title } = useNav();
const ruleForm = reactive({
- username: "admin",
- password: "admin123"
+ // username: "admin",
+ // password: "admin123"
+ username: "",
+ password: ""
});
const onLogin = async (formEl: FormInstance | undefined) => {
@@ -43,7 +45,10 @@ const onLogin = async (formEl: FormInstance | undefined) => {
await formEl.validate((valid, fields) => {
if (valid) {
useUserStoreHook()
- .loginByUsername({ username: ruleForm.username, password: "admin123" })
+ .loginByUsername({
+ username: ruleForm.username,
+ password: ruleForm.password
+ })
.then(res => {
if (res.success) {
// 获取后端路由
@@ -51,6 +56,12 @@ const onLogin = async (formEl: FormInstance | undefined) => {
router.push(getTopMenu(true).path);
message("登录成功", { type: "success" });
});
+ } else {
+ // TODO: 下面这个不能正确运行
+ // 弹窗显示 "登录失败",并重新返回到登录界面
+ alert("登录失败");
+ loading.value = false;
+ formEl.resetFields(); // 重置表单字段
}
});
} else {
@@ -95,7 +106,8 @@ onBeforeUnmount(() => {