Ma&1acm7(y`gj_O$5C?!cc#cz6IzBH{2_zF~ zR_Hr8FY%g$Dt7@p)rsXm$Xb|h2=+emBw3Os;HwYsH~udu2lp^;h4omLPFR-X@t`8W zPFmJ-U{|nG-1!RhFF686$0btB5d<7^4`2-vrNbtCEHDo0Cn$>z($JrSyD|hb8|!&Y b-QMw34^v1SwiG|tt?2?j6CWi?(qZEd6ORFZ literal 0 HcmV?d00001 diff --git a/Student/dao/__pycache__/UserDao.cpython-312.pyc b/Student/dao/__pycache__/UserDao.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02c562283183d497654bef4844ef82b853468cf0 GIT binary patch literal 1432 zcmah}PiP!f82{eP&So~5?3k_48rXK4G^rEQfD{Bpg_3Mlv|DHtX;>JxJFj-PyE~gV zZ%8&IQc6H`u)$NnQ_)K$9(pXAgPsa{>0o4F$e|!1_T;vUDD~p^W_LDe1pQ#XfA9Og z_rCZ2-uyH;*bhjLy!-a&62Py*h$+!k+NV(202^#lg&LV71SEJ1Y-ts2c@wh)%}LFK zsXP*@Ny32(O?SRJ?bNT9KPm}dOxOEU&%4Q<$ z`@p4ars$MNTn(jyUmt$$ACYZ93OLFRRpQNJ2g-_wKSay0OyV{OG+`8YG7dQf?3ERX zr()YC%hD3AZg$T=4(=CSWgOX&mBD9iVa06`xQv&&B7H11yK;dnz@mH^7Kkb3y&;U< z{p8!dTX%Q2ZtmW@_xsitW3Ji9Wb}v0lE++!g?)69mOM_wRBo|E8@%k)L#4sWbskFg zl~83)wR)vkx^Bv$j3Wt?jUp@7+)$#6t|(*}#vd=EoPMn!uGcO6cK6G@TWfpkpA}}P zd!0Lt!Yub}TIU73=tMC%f~iI`9Pk=;kyFdVw5226*-Ra9im|wPWH+FdNTkMhw4;G` z+}Dl=+PJTc-*)eu|3y3d*N%Sd2}ojj=s{-ej^t-1wzZcqcs;+C542HV8x6EEUmN?o zrC``o_jxRN(-?)XQs+kGZzj)W zj1S+=UCJ3^ELOc(qsAMCfK8ZSw80|qFwqhdr)A=Jh$W|1EAvpjN_pv;Q>UgBrh55I z9K#h|8U}k##P`p8lr=kp&%}e@_vs@39b`A)VfxjrneSit?xLT5_fvUCJrbzHzB(MJ zBfdIv`|P%Q8hz{OwRE6neKotSp4icc1O240pA7T~U!V9{pM0QBwy_xG&19%rQA?H; z_FGoXvArrqU9+rtuUHk$3d`k1UM|%rzvkFXJR)`!+1J3130-u+#9ts{LUCV2wh9lG zp~sS cGFQbG=dZtk|Nr<5TtZ&T-#l bCvZWa$IT#X$%K$yIQ?f*Cug1jvMA>tRt_!b literal 0 HcmV?d00001 diff --git a/Student/dao/__pycache__/__init__.cpython-310.pyc b/Student/dao/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9558e5ae1fe75179f85bb47ccdeeb42f8c085850 GIT binary patch literal 193 zcmd1j<>g`k0y(eaDIoeWh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o1Ty$aS%bF*Ydt*u;=C6MKJ}HB^mj7PuDJcK4t!s{R^Kpu7AF6;qwV?&o}RWzI%R5a7k%OYF>$F zURr)pZemGhex7e)USfJ`E>JMIvbZEQHzp-9KPEmtGcU6wK3=b&@)n0pZhlH>PO2Tq L_F^U=!NLFlv4uPX literal 0 HcmV?d00001 diff --git a/Student/dao/__pycache__/__init__.cpython-312.pyc b/Student/dao/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a97b2f52b94edc52b6a6abca2a5dfeaa34057892 GIT binary patch literal 150 zcmX@j%ge<81ae--Q$X}%5P=Rpvj9b=GgLBYGWxA#C}INgK7-VJH3AaORxzQ)sYS&x zFE%WC-q-oOzc Kq% TZlX-=wL W5i8IDMj$Q*F+MUgGBOr116cs|r6s5U literal 0 HcmV?d00001 diff --git a/Student/main.py b/Student/main.py new file mode 100644 index 0000000..1cc90b0 --- /dev/null +++ b/Student/main.py @@ -0,0 +1,6 @@ +from dao.MysqlConfig import MysqlConfig +from ui.StudentUI import * + +if __name__ == '__main__': + MysqlConfig.create_mysql() + StudentUI.init_login() diff --git a/Student/service/StudentService.py b/Student/service/StudentService.py new file mode 100644 index 0000000..bf9caeb --- /dev/null +++ b/Student/service/StudentService.py @@ -0,0 +1,95 @@ +from tkinter import END, INSERT +from tkinter.messagebox import * + +from dao.StudentDao import StudentDao +from utils.ExcelUtils import ExcelUtils + + +class StudentService: + + @staticmethod + def add_student(list_entry): + sno = list_entry[0].get() + if sno == '': + showwarning(title="警告", message="学号不能为空!\n加入失败!") + return + result = StudentDao.query_student(sno) # 根据学号查询学生 + if result is not None: + showwarning(title="警告", message="学号重复!\n加入失败!") + return + sql = "INSERT INTO t_student(sno,sname,sex,age,phone,dormNo) VALUES(%s,%s,%s,%s,%s,%s)" + StudentDao.update_student(sql, list_entry[0].get(), list_entry[1].get(), list_entry[2].get(), + list_entry[3].get(), list_entry[4].get(), list_entry[5].get()) + showinfo(title="提示", message="加入成功!") + return True + + @staticmethod + def delete_student(sno): + result = StudentDao.query_student(sno) # 根据学号查询学生 + if result is None: + showerror(title="错误", message="不存在该学生!") + return + sql = "DELETE FROM t_student WHERE sno = %s" + StudentDao.update_student(sql, sno) + showinfo(title="提示", message="删除成功!") + return True + + @staticmethod + def query_student(sno, list_entry): + result = StudentDao.query_student(sno) # 根据学号查询学生 + if result is None: + showwarning(title="警告", message="未查询到相关学生信息!") + return + list_entry[0].insert(INSERT, result[2]) + list_entry[1].insert(INSERT, result[3]) + list_entry[2].insert(INSERT, result[4]) + list_entry[3].insert(INSERT, result[5]) + list_entry[4].insert(INSERT, result[6]) + + @staticmethod + def update_student(sno, list_entry): + result = StudentDao.query_student(sno) # 根据学号查询学生 + if result is None: + showerror(title="错误", message="不存在该学生!") + return + sql = "UPDATE t_student SET sname = %s,sex = %s,age = %s,phone = %s,dormNo = %s WHERE sno = %s" + StudentDao.update_student(sql, list_entry[0].get(), list_entry[1].get(), list_entry[2].get(), + list_entry[3].get(), list_entry[4].get(), sno) + showinfo(title="提示", message="修改成功!") + return True + + @staticmethod + def query_all(lb): + result = StudentDao.query_all() + for row in result: + lb.insert(END, + "ID:%s 学号:%s 姓名:%s 性别:%s 年龄:%s 电话:%s 宿舍号:%s" % ( + row[0], row[1], row[2], row[3], row[4], row[5], row[6])) + + @staticmethod + def to_excel(): + data = {} + list_Id = [] + list_sno = [] + list_name = [] + list_sex = [] + list_age = [] + list_phone = [] + list_dormNo = [] + for row in StudentDao.query_all(): + list_Id.append(row[0]) + list_sno.append(row[1]) + list_name.append(row[2]) + list_sex.append(row[3]) + list_age.append(row[4]) + list_phone.append(row[5]) + list_dormNo.append(row[6]) + data['ID'] = list_Id + data['学号'] = list_sno + data['姓名'] = list_name + data['性别'] = list_sex + data['年龄'] = list_age + data['电话'] = list_phone + data['宿舍'] = list_dormNo + ExcelUtils.to_excel(data) + showinfo(title="提示", message="导出成功!") diff --git a/Student/service/UserService.py b/Student/service/UserService.py new file mode 100644 index 0000000..77c409e --- /dev/null +++ b/Student/service/UserService.py @@ -0,0 +1,29 @@ +from tkinter.messagebox import * + +from dao.UserDao import UserDao + + +class UserService: + + @staticmethod + def login_dispose(user_name, password): + user = UserDao.query_user(user_name) + if user is None: + showwarning(title="警告", message="不存在当前用户!\n请先注册!") + return + if password != user[2]: + showwarning(title="警告", message="密码错误!") + return + showinfo(title="提示", message="登录成功!") + return True + + @staticmethod + def register_dispose(user_name, password): + user = UserDao.query_user(user_name) + if user is not None: + showwarning(title="警告", message="该用户名已使用!") + return + sql = "INSERT INTO t_user(user_name,user_password) VALUES (%s,%s);" + UserDao.update_user(sql, user_name, password) + showinfo(title="提示", message="注册成功!") + return True diff --git a/Student/service/__init__.py b/Student/service/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Student/service/__pycache__/StudentService.cpython-310.pyc b/Student/service/__pycache__/StudentService.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62cb528be6ba8b87d10359bc0314b2de630123ca GIT binary patch literal 3476 zcmai1-)|d59-rA=uh)*_rlFLUqu@JQQCCr<9uf~#LB|opMQUBBQ;@8jER)$53;#%F z*KHFy(xH|kR2NZ1AFfbT2em-&j^<8qx>5># k{t87=I`6y?vFcA^ asi+EN{4`;KDf1&hfkj-V~PNBjA-9 z7`MSkg`>u!;A0}LcnAEDNGLughM{OONQT OKO%-jGTeC^&NGsgbbx?8u+go3^?B>V3-x_qTVOx<*S%ZIYv;bd zck6cN#_jue-ify^G+XapZ(aMx+BerB-!OuRU-HXt5UseLS3Kp`pX#sezPH@Ew!Fov zg=5;ksmbirv6Nr%w0rk^)!LX>Emqty&pkVa&BkWms#V=FQInNyEuDJ(#Um#&x&8aR zv5kM}E*+t35TOX@k{h}a5Ot{b2NyfnZr8U#*6O#HF19XQg}_J1|eVelX;{RXcO0 zD66IFDM<^1;kmji=X i{?z^Sv+3D+ALoOiJD0BBySvhUXSH*4rE~F*ov**^ ze0TNeeD1X)o%fg8SN=8~hTJ4RC@V$3RI45>R$-tDzM7l&e77>~>2T~#4Wn~>c0L#? z3ei)Xg3}{~5{APQ+~RSrdyDVoPjc&F!m#+l;~PVKd|-nO;ZDXTTdQyh zf}Pcw-0mBce8TJnyRa4w%rYAW<{<%mB!aNR_X-KJ%4yw8m)BNTA3Tap5reI-{@l9q z<=X0XZ7jG>(n%KfPGpW`rZTCQj~_d_9!RM-ewR6(Nx>DV=TrMUIf|*;{Y%a6{gb=nB5 SwK`zjr>l)q3~q!BFn` zNWqK59m3==5lTZzCX(Ahx`aCE0XN7U7zpfA74hs#GDXh^yTEHlZ1jQh9wC-Te(o85 z2iLz{eBp^rrr(g+8!S(;Ovh7}_rd&s%Ojpm70-ZhvV7B8A&ZjbHAlA999dLz1lPo| z5R&7#WORlkVB_JeBoLJ;A}Y+^IPvPliwN^RRHky7Da1FRQbjo7rDlK$no-E9Sq-0x z-<%nQo7yePLF>Nhr_8;(H`|xK9Y`5_J!K?Cflii3h*KG3>5N(T))r}_)*QqVkG$P; z89~s_9t3U9myP)QGZdoGQeJx%40%moxD)L6PvKf+O~XeKfZQ;4Gf-1eWQ@)hQ1}ZJ zz5<1xPDXdCn4hy%)W@>**Rk*9#G!p&Dy476`*%K8!WSR4F5;3?Li-P2w3hzbd-Lr# z-5<_}Lg&&y*H%C6y}5aJZD|>|tCDqssNC4(1WFM3G)UUgmr_iJZn0dJd+8maM%oOF z@|!9#0#nw`Y(gkWnejZDf+YvAWOIWbfSK)w*29HeTjmBnFoPxihjOBiNdJLQVvFn) zN*Xi+%|x@%B4{>RRC@r{e|FJn@TSpls0>=+KpR6z@Pm>}CBYv`vXlhBC@G>OLNi)t zD+zv5QdCKVYIrxdqk&sTIES%26+`H$P>Q3s&<~-HpiiK;(GR1KqE8-XzKNnr?SaB* zn-~$>d-qg&R2N2DW=G#KfiXEzCkWFqp;;9Xiq-L;M^!W^R>y)KRgo}oL9O0ty?48x zZ7TcIVaAao1G_jo>sE!NZw8KEE4Wk)>&%M<7HX7YKC0@GNs)IHLlsF(afBDWLHBIP z0WtErf>Dr>A5v2_X2@sonau%p0Am?6@7Ev}%7wvSf+q)lBPcEge{nv-7arRba=k-j z)A7J56iCTJA&3_Wm71uRiBA*?bM<05e3S5eR6sKo7sZp1Pm+eeB0`tA1|zbRBsB+A zS9b >;JJR$EmHi(k*Zf>qEal!0ZwBk1*6{MuLx;{{xq1 Bi6{U7 literal 0 HcmV?d00001 diff --git a/Student/service/__pycache__/StudentService.cpython-312.pyc b/Student/service/__pycache__/StudentService.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca7538effbd3d2e7c175d0bf7ae8e22ce3b443b0 GIT binary patch literal 5584 zcmcIoZBP`+8SdHHk6CtDSWx@|T|mH12zSOLUOetnMlfRG5(GbvV769fRB&N&X7&^c zs=SI YGoRj zRzrh}Y*O6}bz@T90(BT}ygvtZb5h-k2d~<-5!Q*)+s#d46O%MB zJee%qPwqhL1=Iyowg###$u^p~{+4d0ixCXRHz6e172KCx0*vgYNuM?bbs)v0KWj1T zDDl6G8PeX-ZRj$*lj_Nw>PfJ4vq|2#gcluku`e@nu;G^bI E7L7uimB)+p6j_=Kac(RY@i5W3}ElCrbo}s{pdH-qjzR+ z-1*|}J87}A1F?6n$F6-k_xW|G-!P~qrCITbs-;zwW$#fjup!=e{=IXtYv-QRtFwki zg0sq9U*l9fG7W@Ha+|+YZu7Q^rLuUc6r7c|AM>|~rGj5-b^Be;{oAYeRn~1Pl1o$n zT=SR_^Y}aFF|X!vJkMhmk&l|`?VG)JCy)VkI{cYnU+nCMFtB=;S!IukifWUO`A?qo zN^Q+;M <2xwz2_P$MESVlZ*SCMtq~sMVAJbb?3J~5 zs5Y-4=mY3nn;M&CNzZU-%41NRMi1?)Lyn%-heiEF5=~1 %b;z_XOD~E-S+2hq?TL!hz0_ z{HxuOlGnl|uZ@>%8{K{X#O*zi@;%}5J>%syW3@jRYdjRL{b8i`aJcsHc&!jEC>^Z5 z`n5>GmT >fLC@DF<;)rZ2>hsLWt|701fmzm}= z`%aCywoP)cM>DdYz&D{36~dECR44@C0#f4Y)1vDp?xI~?D6Sl!M5pZuWe`A@ZnDW5 zBpAC5N#35PLk94ty#->-s=q}r3FZ`EprmfX!};_5bHl?=SAr#kRqR$Mc6o4a_&NmI z?0L*aDIK14Zmg)RuB@+g?%Z3mClMRY1G_5sRyu)Q&NrMzvV@&bMh6Gx`>!Q2+C=y( ztp)?tidia3l3$XrTu5u7aIsP@#(B6{4~2{;5C|&a$W`rv=o1q}@621ov((4fp}Y%< z(`fox4h7$w;#Y=tjg?hS@;eEIzL82Hd4l`uRLT-d`QWT6dGT- DSm zUSimcj6_5=p@jFuFD1TJbQuH_wn{8D^fSLyKg%=yh^Ln2-bc2Yl=l%&%l0GNPf9sP z`3e+EQjsWL-6UU+smNvZZSF~raJgYF_wxRM{e#=DzBR$U@_%ig #OXhVt>nHZ+NPkqvroYLh0|Qe>BRrMsm< z_!em+E{L`s*!TU4?Vzpkl*3t9Sr4KLDF=~NoOe(F$p-}_1EG+nAp|d$V=P#d_#^}p z?2qg8^u14J&fiYbX>&rSCCpu_&^Z_pnKn|Hj>iMlY8)z{)l{rWmuD0@HB;FP9psBp zEEyK53Vk$Hp}*u!eh1#xYZq bkQ3>{z WH z`TTFs;6^-0TI1~bU(O9*!HrmK18}; }bN0 z@Mm7aju1V`pJfR e)5o7|y6J!RIPLKtV z9U~>4nzY0duK3!*ZwiUAC7oe2gv^_cM5sZSWzjS2a|IYj1fjobsHzBH0iY2`A&ENz zX|&N+5@Q6?$fB(zo{|#p;k&W-?!*P1Y%nfO)N#P5W^a4D*d|E$8&yv6dqn&T4;6Q- zYJ}sYSGAC%W0jzC1mMG?l_0z&>5bwk4Z)_Q9X83Xq}qrn-Ik;>c#Vv=P1qgiMG|`H z>(JD>YEkg&qp8H5vS4N5sF>jh8lzb&f|h9Z${-hAkrT91M5-%S1=FHAtAn J zNjSS?JlpjcS*#^Ey0d%TJ?_w!(24$UP4ER#enoFhPfcjY0Moy7f-j8nD z4LJJuPw*R`wOHIEC&K52`MglmKz{#`3BD-GuZr;N!~FV?Jg~X{?Mc3PAp>5%kco2g zg2rHdPg- ;ckZxM>ghl481&kKf1A1iO;%$HyR**KU=~c}R&_a&ZruVgi z9c?q2>KM%s!v#CBTw^LHjgJg~=& TYs z7rp*6ja=|UCf#8&1NdjmvcxZ%BnHTLO5efm@^OKWoB!d;>5RT9RX`O>jEoPap#2Q< aH?(02Ib*2kuc+i-<^v2<{utqsbpJ1krva1z literal 0 HcmV?d00001 diff --git a/Student/service/__pycache__/UserService.cpython-310.pyc b/Student/service/__pycache__/UserService.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..626446441e9aba98f76945958c4f1b357076cdda GIT binary patch literal 1272 zcmZWp(Q6Y;5Z}GKv}e**ts)A7ebA3aq)-GOR79~N1&wH`4 e}MV@SnRuFNmxE&4h~&!^aEZ%Kh-pOf 6!ZZf^rSPE}XH{ULV zQ}^KfN>eG{@k?B_m${Vo2w%s-gUtY8V=8(&xjy%3t rAGrUs#XBKP#JmE8ymBQ>$oGz#Dn8r@v^$wgl5aN%UqciTgov{ zFlC_f6*L3Fe3bwLhl>aM`}+?SoArC^Po5PkRsX8zhKnzwx%t)i_2y(FdQ*>Pr=qvZ z(enJ+YX1D0=+1QW@#|vV4;Xj-LC7Y`w(ofES=)uzl|h-WN}rdDkPC?_CP?e6R8?om z8*yBVIkMtOZbB8Z8z8Njw1XP3TWHYnUCEoj-1>!lBt8W@CVv2g-^izblFy6@9lZ3K zUV}lX>y-EgO9APv@n{Fi&78oX!A^j+#)}rg;p|Mf^zZ7*dpH6m0*7M!$Y3si>cUXZ zU~cGKk00~W`=k2@VrhecY|o_=XD*(~_w??Q2lmPA5rN-d%yw&H5^SepwnYXUL +oCnPf}8rVE(~k#n5@~|+1xv8 zx@7|m#Ih~MZZVQn1cRugq+vxLQmVm6AACvG&@kjdFq7SgVCqr?pFC$~w(JI9ybou- zbH8)Xx%Zy$&W~+vtpvvJGe6KjBtm{er#?I`s0{*GB$QAgMb< j$`d zd)``GvOZa{Ha@hj%vTmx_KNF&emC1%Ew5Ye75Bbbu`a(4{!P*J8c8Finf|oKd174K z$3x{pV65`x%JS^~!i{RV454<3y=$e)=XY$na^qWT H8^mKw{l9_Q+MkkqhTUR8r1!*;tNNc8?O>jP~GirKplH*l}!{G Ep?aN|QXRbM0a; zrm53SlniC~t6(mX-B8cH(DA#W z1BY2$!$-jUrwld&eQvj3-U^PO4%$bG(vBRuC->cz`<6~G_pZG3i~LNp2v`r~izq%* zR&A-Ps@bZlX`SX$8sMO+PUR9Qd<5umBVi=R(wZ@$Q}zg~WRHQlN$f24nHcugHV8Pr z^EvXX_sD&*#oJwzh_CYi(LoQO`=ad5*~m$P%Odcr>og{l8MvB3_szehUoZnSp%3B> z!9UgMfL-kvmc(<|JNQRFVpN`{J4 g`kf@6~or-10kAOaaM0yz#qT+9L_QW%06G#UL?G8BP?5yV$FAlJnz#@Nu% z&@ATJ!k(9N7sUjZl%}NSm3Zc* _I|p@<2{`wUX^)eJ~DTg8MHrxq2* zyx6eld0*%A{@xgu)Z*-t{DPR^lG2paypkB8bXjI{YD|25W?p7Ve7s&k 8B?~es5n!OALp`!NFFneYE3F7(#OoBdRRBZbz>b= zyk?IkXpcnqF`WI3##EQ0YB5lDR9169^+eQ+&Qw%04yrdQ^OHQAz9ZTZec0gL#l9Xh zrxIbwdX%R)Cs|9NWg==>OEMMqO1;$6vl{UvoyEXJ8k@cF;;F_b&o4ax^x`Wg7XO8e z#is#2PhBbwTq>^Q|Du7M&qxjyj=w!W^Fia;V_WC+!1BEV{%0{{H%=a2s6VlF(FTqJ zV@OD9GH1vhyaKDbxAJ(PE#g!)Nnp+hOo=R~P$^A}l^5yI7cGDZVgWUy4(>p%MxFN| zo!bCF+!5}FE{sEbUb6;PWp=U^s C5`W9N|ljfIVXzM z@k-ST%n{F@!*n4+WnUi5Z4N@@TKP>>|EvUX=hi)2HgDd1{hs+*+QU8L2mQU3a^syh z7mmMn=Jf3R6DJqmon3hL@WOki7EZmk^Wg3u?^rlGGyn1*_JpFay*ylzV|l+=Deuge z^CR9E2HSnG>U(2*CW=w52exk-KN!TfmGWalB7e(9jC_tZxnG;Sp(#_Fisho8<27vB zR;m>8rRps}RFma7ST*fxkf}}#jiKStgzs0%L4tdcm5R@+loz9p!oE$|B>j*oK!1(~5(P;C}JbUKj*E?o}+@{#d3qX9CT+0hlL0-hQloWT%@IWI$ zmfxT%B(f_p^PQCc9e~N3mh4s3&vMaOo)Zd_B+-yRAh6nacTnMFG+y>=k0&ojeOB0K zPakjm_En`ML!psZP>*m=G ^StnS8qXy?lCFl+9{ zQ?H$!{v>MzHY>Zpg5{b}I{k$sXHNZ9Rr>JV##3|5y7M2LYCKg})5;o> U{G%{~^vjvkuQcBI&6y8BzUx52E3xiqJo(<4kAEfaq6x2M1M=mv z;M#YyVM&&}VZUi)$Y6woJzmNeJlEQZmAI+A5V=CWTF497A|k5FdkwmTSMq$XMNf>2 zd^;VAOz60~alexDXx4$9AF53FL1O=e2ZthGDoK*UY@)T>@ U6vZ7(Z-H5vPAyu~ltYk3KdRp(-zX9_>#v={GL8-g>OX_j_y7bAur9ux& zTp$%5J*47IBo=s5EH$mJ&1!dQk2q6$O|R?3j{D(}`^Kob&y?%&w(9WHmH$aTs8ZUF z+okMxVQ;Y{q*r!h!mIkSa!?)Uz34kgmSCZC?1cq3y9mT~>?ODkY%(0RrF%h2aUW8Z zOjX(-v)M(y%G%b-+I)=;Wk&0?k$7#?kFWVUtz%lB*0I9W6tAkLou}0iX$fN%;=Vs7 zOn9Ky0Lw~XdSx+~wF6t`%Oh|lOI}&6=SS!-a1;X}z|)IMCLV+?5HD7ua+UOIuh9?N zzkKpst7Gz1yE*w!L9~ZbBM4DX=$O9g<7mR=Y(zN4x`o20^AKV|{~5l++6F-tD6?ja z#-L4Y;jm^inTjb2_2TtJ&7`nue|H#^Aea K(d)<*R0W)nnSZ!yO|UA z%z;YRK-N)V#yf8|p7~&_!ryw1!Vt#ifALmh=J#R#NAE9wdPw05$NzHn SUakgq#YvD$L)%Gbeh3)i(^aAlGipNa5uX6q zXBI)QVtPyNM7|_hZE-~#BeX>N5>z>a#NK{do4m2bzHJ(5xj(WzXHL2M%0t;jBl9RN zz$%2sn?|aVuV-lv`JDfmyzFa^%6 YnyxHc|wzKE$^2 zAp)&Qb?(FwYD#^?wQNe&C;6235Evxz0D&bgj}p23_&8*e{hzE8Bv_-A5oXArP!qC7 zfvtq@X3DsQKx-bnIdonJkg690q>VWAW-qjg`o(nzPI=rS*lVoo5Z1P%>evz!{gA-Y zyZSOfyRbq?$>4+6AcD}Zqn0r7gFwRcD`$WO@+jRjP+2T2(?*?oY)0dI4t19iKcWrm zERt~+Nj<#PXctMNrlS{VG1Uu1o~W?TP!#3En4=P*mf*C6X>}2zqwPaFN1{fH bj2J6Y1 z!$$M|(AakK?0TBB)5Cm(2~ESvGgkBI7y&bH%WXHHeFMr7XY={x=8r4RzxKx2lP5Zk z3Ma)!#iAHVFe#^&6t89oBMCki*-j oSKjd#@mH zzr*C%M@nk2RbPDGCfl8E`Ep5Kp3@P=w@lFr!=8wSjgy>zG1(^NUp4HPNO`nfRq`9K zRq)ryz2vJ+b%jDYAgjv<@lvwC!rb1V!W>n!rAzov3G5;82!WpwND^4l-=RIHqn3LC zR=RtMW+} IJ8}=Mx1GqeJDzXR% z3z3^uEh410hKr@rVg<8Yycj^<4gk*1(yOP BIp zYae{9=soV*2k50d2y%$CrkljgE{3^1FAuii2VA2x)Mjb $2?H;e=!oP!o(1ybuo>4alpEZy$i7ogj5#Zj9{E4dpyz gCtuuF2xk=PI-cVq;#liZ31Di8y^6 zq8t6T-EA#n0JZ;##9E@;m|W9xEchNJ+aJVpIdbB2xgeR#ja9@%iSTqTw|^pEQYEf2 zxKCY=a+pBuBuSKmbk)aqmx9_(btifq6>cQJ?h;#o`-o%@leHV2y9%OcdMnPGL@ r1tI>_+jeGB+da&TJJUg3k$aP A1ONa4 literal 0 HcmV?d00001 diff --git a/Student/ui/__pycache__/StudentUI.cpython-312.pyc b/Student/ui/__pycache__/StudentUI.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47cecd539935e3a8ba9ca5f7c718cde6191cb221 GIT binary patch literal 17496 zcmeHPeN+@zmappW>MrPRp`rN@zfb{fR20D^YF5RMC~ENAM8+J_Pz^RVG*&kgVVVrt znAkWbcs68WX3U0UlL;J2#F$-8OjhU2?3v7N&RJ?{r%4TaPWG&b?Abp^FlTq?uf6wG zRd;n$KyQ+n%sJ~jaO-`4-1q9<`+o0L|C804Oo990KMvQvxQwFy9RrFp$exL<;CY4O zD310}@9Jpu={$6Uu2S;T9=#l^_ZS+ON`|I%)OLz9oT519qE4!%(%52jn8q;Rphdb6 zi0P2e#cy?b!D~kE0T=&6ca5t?Dj-q0G&S)%2){zPs7jinDs?)_rN1cWt2A(QB?JG) zI;zs-VmaL@Dw382VZADx3}NV3B;5>QMisU|*r*CyA#75GXF-@%g;OA$qzb1(I9V08 zLD;Mcr$N}F3a7Ww4y%}Sz~9Wd8vTdLD`G}(gdytTf8ryUi__-QmRBghJZg%n$CNmy zN>yf0mE$5U1!#3G8u{u?szS1tqobucT^q&e+vw?At52F-i^BId-3(>T)0EY7h5!|y z1G)g!3agi6S|N8pAE2Y5T0<-FuFWt*E7r-a1Psw}`cstj>FeQ)eI{j{w=oHqVpXM# zep`ZVCG{mMZJjYEUWzmKSuV;e=8PrbK3Y|MG<~B|Y=EgxSH>27a qz7G+Q8H z^wsMlpS(Q!^4YQ1-W(f-h_SOk{$S4MPUdsV$ln+W{I5|bjdu0i30@sJ_rkhfS~U1w zC;eZeSQ@$X{Al+x>&6)HLxQfF<8f8@>UdmaqQQ5}`; &2BF&slP3RkH|HQ b2}H9WSgJBkY1cl2)mo1-swjCQ_obgRpE-0y8VDr>T%&2Ghe zsJy7D !ya#q)8pF!9x31Cm;z|omkZ>-+o`Ty zVfzZfzM`k@((&Ho7aOiUcH;*h{^0r(gZ5qR)CA )Jusl(hh^88ELxZ!CBa83Om7bC3&pND9Kg~5Bmy@rm<(&;K(Tp9eddl6%!O~^? zZokJR+8|i#t@73IE?47IZq9#9OjAc4bGhq|`9-$QNd*tS)>M`GuWb44k?ZK+^w!EXi+qI zurXXOl4rHzDN#J7A}h@SWKw*q`NhB%J`b6R$~ZUbHf gCS-Ih? oV`iN-ZYrKIcOb9&+XpU^FaUZn`?y99iNs7C65l} zukJrA Y3Z<>w{;f>Eg?4lyABVh&%WRY=d2WR zR`wseN73c5*x_NX!O^SJK1&Mks1kNmh0>o4vO{cYr?ta+eqnc6&>CV3;=`)BLcZN% zmy*{fMnI$7Mk#*ZC HExmtO#*S4`bhUN(3XYnNY$T+%iK*T)$fO4-SV>ExKLP_1GeqN%z{u&?URx;p3b zoGbHgnto&crTJIZL3>5JWF5+;D!&vvgGHz4kt5+AZNc_&Y+x#@tkVkO=Y+i+F;8n1 z^OP@ytYnLJ_eR&q&;MH57Ri<=zZ`qC0!a~)l}J`0DMqpyNePltBx{h6F+7OAhk#6B z+3^oRT5Hx6W5P!7TXj*3@%yssYKc`>7iZNqe&!BWR0|c=q4b*X*s43lAkeGYOrw~K zbE;I7VsTCd;6+mEHS*nuIgvd81}6w}DtwJ{zlv2D{4MH;z{Jsd>rvCix%vpi7EK6H zoRNUPbQGqH0k=_4#<}V00Vo+(A3)1;y?v|#(Lt@KUx`!oQ)5*rTmm3CQX;@`D%iHo z2#}}-WX72TMgVDLJ67FdTzS(J<*flzLgf*X)oOoMfK`_V7*#7*ifa5h3QwZX7`Rru z2Aiq|v{2$)0yU(mYM38a9D*@5m^4R`?$1@q)uaB8b1^lrnl;!}eaMR|4#Aij7*$@4 zHN#~*3?)=~(0Ge;%1$q4eIvFM=QQ(av{~ =tPDfN1~y@)z~ZnWIsK9`}*HWnXbJza;BG Z8ar?%5ce*~5BhZSzedD!}chBFx_R+SJH7*Y^jz^xma{Hqf z`90X-41&f@Z}W)EBLt;O_PA>O5yTGBH#xvGd7L#a(eNmYL^L}&uByiAt8sDw>|wws zo%V^dIG4xecSXa^O`KC5mTe>XU{qxN-YOUNT4bEn-e$j;bfVb>Ag$Bm;nCW1Bt^N+ zuZIX8mlgjPNN{kX5m^iHoAg{QKTCWlf+NVAgoWbjXibkd&H$C%2?@RxF!u?eZ3B55 zLhQ!x1#VlA_tuec{yHIl-Qa@tXOlwg+~M5(x7^`^^+Lh=!Q6*2Y90Zc<_hfGFuO=# z7xiTH+j?hTdtiWF6k<24&?rO>d-D4i_B#5Vy(?}SKg}Q5f8e){0d{eSJvf|_-c=s9 zI|RF9Fr_ePxNXZg$90#5Yz0B%5Nipu*#et={$x+>0Gl0R*9?EF TwAc8 +pZ#eITz;0jge|DrZv! z(pKsTP~~lOfYv(oR&vqQS-Syh@<+s7J??$u+;MnS_ywvw5hEs=vECf@E52weEpVnK z?JJGqED3_IIp+3oysJ?(aW0>q_qIr4 FlRW^kSCR7+ks&BQ3OfntHv+5<2QK6o zA~#oh^>FLcnh|~VR0jjcA<0(`q@DUAb51z3P{=GC%v}BzMJLS*J~CuU>#XRgxMi6O zXmrxNFU+aRviujbW7v`rw&V(y+_0rUuoT>~EFITVmcq&SDp)|$#GD5YSmKds@kcCi z74tM0tXM$G6DBVoCU1sm2~cQkXk8lMXigWkiq0-EP%V0gp@JwAQSWNx4muc-;hl|j zaC+r&HA<}Kpf=GcNmx)hwA+URkytFshb?4ICbODE^N`!O5eUdRTV|Kalo-ift_&)g~>s)1gMBW~`I6Uya1x`<2WFp`ON96Xz^kq4H zpFx?vHhn->AK7lG>ZduT_0;Woz Eu+{=*N({{EEYAMN_vyO&;DM-Jpi-n(%(_yQJ}(8wqd3Cmap z9dXCQKLVsi&3I%BPR7J;ATup^I7(Mr!Wt}9mdWI!betX1(2fKeN=%3ykR`o=uY@}J z$B^JF#&bY=CHzixdb~C&wpEtiWPosT%qghPhx}`&-f9dNY!V7K{d#t|?2u4)Xt3aL zyL^r;9coKR;S<=6lSptIpz6eu1UvC86!Xmk(oXd`!i8l*VcF;N4-d~@5}scy%rBl` zbjwQQh6zGQjO9Dmo&yUzW`1%03EL4yoN0a)H7YX}b_;}^jZpMk4dygd;6u?O4Q8WI zxN)$sOzytJEVV+Q%>CF@JrY!>@c+PjM_8uFP^!cK)dwSZw1%SaX zq(j{ci_g1%Ues^HgWVGOU^g0fi!GT(6B=O&oz~B^bf%ZIQOT~-fxu$PX#s#7t bG?QZP6M zPT0c@?x~eK4bTfwV^IaO8k;OdQi2543g3nVPskhw3Ac(U4{3sNRe=WCB+W6-e{1$s zT>c59`fdUNo<^=4;k74OhYY7?bh)J+V*l(=>Uy~E#9BL(JCe_x=(YuuL+oNzj-C^t z)MAYscy&rbN66KwZ6UT$zW5_4hzUx!gI;)#(%Bb*hA_rx2w{6|D7|im)1g~z!8B?? z2MjrFn(1Bs3WZhHR1 z2LOh+Eh_U(=8l}sXpAOc;AWvviW|96Yvhr VDKTRHz>Y;fqWmLEU+tna!R}-Df z6f&2oF>^^LT-wapVz#VPtb(Y?5S=|u9%-(QX-da%4NQWx3h4}hY+k3|e3FcJUVr=U zr8i@=2ZCBeUngcBsHO^Ka-36)hp9KBSco)t3_Rb~Jn-Yjg1CAOs506K36f-p@gQ2I zqXD0E)IiLL=)P53p{vY^*n^14#>3>8zkv?=96(UT7ln7$3Oj2D>OA4PCZVoru#O+D zYYNx>NT~Y}+&tMux6$pAeGzl@h3o-mvNdMv+MC#sMN&tUUG1+O;mwZ;n;)Cd(OaPH z3B7LF(@GD>&UUi75t+fIP!-M~m~as!6ryCO#wG!e&`YQ!?}lUt&3oXX&1;q2G1GwF zhDv;PAi&vAoBuiR+rYrlCkCp(_;4vqWcU-<5|6}(1lKR$j086le?Hdo_w_pPN01F@ zOaD<{g3Hi=a_tI1oGn7ZmYdstQ~t~HU+oI*s|@dR3Hw}w1&YzgCuCgDv_AT=Q9J~P z^`R{I-_NhrgmGeIq7KRsA@vPln}jUtnR 0}NWC@VT7!5I@OEA3@2^!8S+=jy- zTGS3U-k5$GlL%6S06zJ=Kr*mVeo7FHVr1jOP#f8?ef}Aw`u+;u`vi>a>`>~uATzU3 zJ;@B0Zp+ICH6Sie(+Iiz7?71X%w=%9E0kV4gGCLu>P36SWca8U;G@hr7s|tPR|#`h z^|#!#T@HjYw+6SXWA}wJ9}I3EvZQzJ?$~{PU$^bmLp{a8-66{gt+;p?$#l!I3Sp$; zI2dVSY8WYQlOW+mJ;g%K^8S4YBs~}dBt;T#u@6q(HZU+*dibBngO&ZK-Zc0ls=1F= zRC3H|40KF#T1b>XSxHruhHFUm5ra=jhif8ui-9sl}3+SRPfMIE>fRjO^mv;k{3um$hpBt`d7;4=f&zKiVj^zU3cL4!i zz6>8W)h_=4M8KEZHN4m3sdmCQREM|iKUlt{Y`2)aW6%Eb$~_ea!Eb1C)*Kg^{pH(t z92Dsz@B!AIg9rCKD$bTY9B6nkZBTTfce$eHX;{9u0n$E5|B8wK>0{2WB!Gf@PbldLFvbj zhcX@sCJ(D(Dnl7Ng2_W{T4zc}%7sIHwqQz#U8aN&_btTm@?opJ>qt1GP{=6kUwo}P zWZe?f4YA3crVi8DB*+|QXAA7??nUn`ePihWJ6oz@a^!6`GtA}+Y;JejEjCYj%~4e; z4*ldcUj&|4;HL)QcvDV$hJ_HVgz(c-`JkR)KQO~Ad>MDl%i$MjvQPT1QDNUws7QS! zIp*8Je}F_{h_zGyW={Xfx&iaT&n@;BcH%kuqRHY2ElAQ&T#+D- {*_*?S>Za~=>^pMieCuE<6K7}V{1wjMj}^-{t+U{y=+_#spn1(IQIRH-7o23yU12m z;bBKrm6%*r)!^ltJ?OVoRh?*ddgK({!Q;}UaNJSx_%aZTOSJg>PQSZGVy|=)94~tF zxHpilRS`2E4@Y={a1zrD*R6D_h24!G0)f_$ppf-_4dfK{d7AyDy!Kr~wv6_jLur}l zOK;!#1!MbCH-~Xd=qY2`IQqudfloVbek33G#y8O &gYPbR}N(a~tF%U`edS y0;KTCt~B)<`1hewT)qUug^LX|JxpbcPz#2synm&Z{g-j8o<2Z-MUe;T g`k0 dt*u;=C6MKQr8r75X-C7yX{`9-;jC7JnozKMB>>8ZIu!Qjf`lGNOo(#)9n_{_Y_ clK6PNg34PQHo5sJr8%i~Ak&MPfCLKz0MNlFE&u=k literal 0 HcmV?d00001 diff --git a/Student/ui/__pycache__/__init__.cpython-312.pyc b/Student/ui/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1289d7e1f71624c5c7751739b16273c0bfbbfb10 GIT binary patch literal 149 zcmX@j%ge<81YBi@Q$X}%5P=Rpvj9b=GgLBYGWxA#C}INgK7-VJH3SmQRxzQ)sYS&x zFE%WC-q-oOzc Kq% PO4oI VD^Ncp5Ep|OADI~$8H<>KECAL$C1n5r literal 0 HcmV?d00001 diff --git a/Student/utils/ExcelUtils.py b/Student/utils/ExcelUtils.py new file mode 100644 index 0000000..69ba5e0 --- /dev/null +++ b/Student/utils/ExcelUtils.py @@ -0,0 +1,23 @@ +import os + +import pandas as pd + + +class ExcelUtils: + file_path = 'output.xlsx' + + @staticmethod + def red_excel(): + if not os.path.exists(ExcelUtils.file_path): + return + # 从Excel文件中读取数据 + data = pd.read_excel('output.xlsx') + return data + + @staticmethod + def to_excel(data): + # 将数据转换为DataFrame + df = pd.DataFrame(data) + # 导出到Excel文件 + df.to_excel(ExcelUtils.file_path, index=False) + print("导出成功!") diff --git a/Student/utils/__init__.py b/Student/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Student/utils/__pycache__/ExcelUtils.cpython-310.pyc b/Student/utils/__pycache__/ExcelUtils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f85518ee3aa8aafc919181e30efe6d6dd3372750 GIT binary patch literal 849 zcmY*WO^Xvj5bf%jOeVA0_45aa2idtS1i^zWBDh98m`m_71co8iaVN}2?Cyc=5)ZNq ziYWL8#KfB?@3Kda;t!asWMNO9ym+#D#_Yz1dea{@_3FLKH#a>->&N$RxXl^+X%6el zqQiX(b&~)YLc)Uj3ju$`kfU|X&^qFQh0tfdeMWh#H#E4u&g*Q`tzZEl3phex3A?Uw z1VMxLHa3nK?HzQeTC?;XPKP3Ss^dic*~kk$DfG@XQPckjfNC0o2NdcCfo5Zvb8U_7 z1*jIXKGTi4gRp=XY(^)a_oVrO2zahadlKpW(h<{GX(h=9R<=fQBEssPPcZPLh%gkU z7avL+BOQHa(pdMqOR#r$aJ$p#+!>rM-kyE X(|etu*;NOoiUhQMOk+Yusi?vTDE>WVn?{bD0gC sd%&ApP^s{3Y1|8(Nt9uvD$TXLs=@`BTBW;NcXiK9pi<;AmtVF10#7Hz)c^nh literal 0 HcmV?d00001 diff --git a/Student/utils/__pycache__/ExcelUtils.cpython-312.pyc b/Student/utils/__pycache__/ExcelUtils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55934e976ce5825d1cbabcecd0c3b8d51a73a8b1 GIT binary patch literal 1177 zcmb7DO=uHQ5T3W$-ERJxri~|Qn}UZdV$ljch Y-3;^<*`Q(39`&PZGh44>I%3H~VJh%}id0!vSFD z?VDFPApq=g!#ko2nh6G$0Ru*PNI4p%1OYAs7M1|}R@qH{Qobru#jhMDGhBMd^+WSC zW0t{y6vB`aFiQChk;hndzf4KY_I22DRa7M_aH*0p@{=^1Cr80znU>0QxRNK8zmoV^ z4E}50vy)IaBtXtf-(naibr>$Bvd85V54H6waxg(vph1t%g*?>O7 R~AU9~Sl%AkvY!qm^%sZ8CH*L67wfv^x#+;3Hcv`HVg(kyH zEW)Qqv@uhkX)M$i9_O|PMm7dUwjyVDLcQEEU!PyOwi!8D6L%tgwP2IofQ;K4j)A|( zp2KYhmVvf>|C+-bw0ec+(Em>bqvwLReyC$EY$@Hm2&$lp$#K?6DO @D4yN6D@jx)NQ@klxE)O^A0XAV9Ya*T;XA42E@`1hdiw;V-7KY$7Q F+8^Vz_~HNn literal 0 HcmV?d00001 diff --git a/Student/utils/__pycache__/__init__.cpython-310.pyc b/Student/utils/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c09f033c4029b7294ba14fd269ea9363c6bee02 GIT binary patch literal 164 zcmd1j<>g`k0^g%YQb6=$5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!>?kn3U zXcqHqVb9CCi(-OHN>ftvN<8z@@{4j4OEUBGd=v8$(^GSSg29!=C8@bFr6rj;#WC^m fnR%Hd@$q^EmA5!-a`RJ4b5iX<78El92^Izbv>YiH literal 0 HcmV?d00001 diff --git a/Student/utils/__pycache__/__init__.cpython-312.pyc b/Student/utils/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d840e18aca166f05b5f1d90ae31598450df0e81 GIT binary patch literal 152 zcmX@j%ge<81inX)q=4whAOanHW&w&!XQ*V*Wb|9fP{ah}eFmxdY62vjtztrpQ;UjY zUTj$Oysz_le{YOSYH@Z+enCudNoh)IUP(-8NoG!QOniK1US>&ryk0@&FAkgB{FKt1 YRJ$Tppb?BfTnu7-WM*V!EMf+-0JwoCP5=M^ literal 0 HcmV?d00001 diff --git a/pythonProject100/.idea/modules.xml b/pythonProject100/.idea/modules.xml deleted file mode 100644 index 5c58315..0000000 --- a/pythonProject100/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - \ No newline at end of file diff --git a/pythonProject100/__pycache__/pymysql.cpython-312.pyc b/pythonProject100/__pycache__/pymysql.cpython-312.pyc deleted file mode 100644 index 3877040043b71eba8eab0e20aa52aef9f6f6b460..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmX@j%ge<81Vwj3(>Q?iV-N=&d}aZPOlPQM&}8&m$xy@u- -- -- JmtkIamWj77{q765`gD);~Z diff --git a/pythonProject100/main.py b/pythonProject100/main.py deleted file mode 100644 index 07bcc46..0000000 --- a/pythonProject100/main.py +++ /dev/null @@ -1,532 +0,0 @@ -import pymysql -from tkinter import ttk -import tkinter as tk -import tkinter.font as tkFont -from tkinter import * # 图形界面库 -import tkinter.messagebox as messagebox # 弹窗 - - -class StartPage: - def __init__(self, parent_window): - parent_window.destroy() # 销毁子界面 - - self.window = tk.Tk() # 初始框的声明 - self.window.title('学生信息管理系统') - self.window.geometry('300x470') # 这里的乘是小x - - label = Label(self.window, text="学生信息管理系统", font=("Verdana", 20)) - label.pack(pady=100) # pady=100 界面的长度 - - Button(self.window, text="管理员登陆", font=tkFont.Font(size=16), command=lambda: AdminPage(self.window), - width=30, height=2, - fg='white', bg='gray', activebackground='black', activeforeground='white').pack() - Button(self.window, text="学生登陆", font=tkFont.Font(size=16), command=lambda: StudentPage(self.window), - width=30, - height=2, fg='white', bg='gray', activebackground='black', activeforeground='white').pack() - Button(self.window, text="关于", font=tkFont.Font(size=16), command=lambda: AboutPage(self.window), width=30, - height=2, - fg='white', bg='gray', activebackground='black', activeforeground='white').pack() - Button(self.window, text='退出系统', height=2, font=tkFont.Font(size=16), width=30, command=self.window.destroy, - fg='white', bg='gray', activebackground='black', activeforeground='white').pack() - - self.window.mainloop() # 主消息循环 - - -# 管理员登陆页面 -class AdminPage: - def __init__(self, parent_window): - parent_window.destroy() # 销毁主界面 - - self.window = tk.Tk() # 初始框的声明 - self.window.title('管理员登陆页面') - self.window.geometry('300x450') # 这里的乘是小x - - label = tk.Label(self.window, text='管理员登陆', bg='green', font=('Verdana', 20), width=30, height=2) - label.pack() - - Label(self.window, text='管理员账号:', font=tkFont.Font(size=14)).pack(pady=25) - self.admin_username = tk.Entry(self.window, width=30, font=tkFont.Font(size=14), bg='Ivory') - self.admin_username.pack() - - Label(self.window, text='管理员密码:', font=tkFont.Font(size=14)).pack(pady=25) - self.admin_pass = tk.Entry(self.window, width=30, font=tkFont.Font(size=14), bg='Ivory', show='*') - self.admin_pass.pack() - - Button(self.window, text="登陆", width=8, font=tkFont.Font(size=12), command=self.login).pack(pady=40) - Button(self.window, text="返回首页", width=8, font=tkFont.Font(size=12), command=self.back).pack() - - self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击 - self.window.mainloop() # 进入消息循环 - - def login(self): - print(str(self.admin_username.get())) - print(str(self.admin_pass.get())) - admin_pass = None - - # 数据库操作 查询管理员表 - db = pymysql.connect("localhost", "root", "123456", "student") # 打开数据库连接 - cursor = db.cursor() # 使用cursor()方法获取操作游标 - sql = "SELECT * FROM admin_login_k WHERE admin_id = '%s'" % (self.admin_username.get()) # SQL 查询语句 - try: - # 执行SQL语句 - cursor.execute(sql) - # 获取所有记录列表 - results = cursor.fetchall() - for row in results: - admin_id = row[0] - admin_pass = row[1] - # 打印结果 - print("admin_id=%s,admin_pass=%s" % (admin_id, admin_pass)) - except: - print("Error: unable to fecth data") - messagebox.showinfo('警告!', '用户名或密码不正确!') - db.close() # 关闭数据库连接 - - print("正在登陆管理员管理界面") - print("self", self.admin_pass) - print("local", admin_pass) - - if self.admin_pass.get() == admin_pass: - AdminManage(self.window) # 进入管理员操作界面 - else: - messagebox.showinfo('警告!', '用户名或密码不正确!') - - def back(self): - StartPage(self.window) # 显示主窗口 销毁本窗口 - - -# 学生登陆页面 -class StudentPage: - def __init__(self, parent_window): - parent_window.destroy() # 销毁主界面 - - self.window = tk.Tk() # 初始框的声明 - self.window.title('学生登陆') - self.window.geometry('300x450') # 这里的乘是小x - - label = tk.Label(self.window, text='学生登陆', bg='green', font=('Verdana', 20), width=30, height=2) - label.pack() - - Label(self.window, text='学生账号:', font=tkFont.Font(size=14)).pack(pady=25) - self.student_id = tk.Entry(self.window, width=30, font=tkFont.Font(size=14), bg='Ivory') - self.student_id.pack() - - Label(self.window, text='学生密码:', font=tkFont.Font(size=14)).pack(pady=25) - self.student_pass = tk.Entry(self.window, width=30, font=tkFont.Font(size=14), bg='Ivory', show='*') - self.student_pass.pack() - - Button(self.window, text="登陆", width=8, font=tkFont.Font(size=12), command=self.login).pack(pady=40) - Button(self.window, text="返回首页", width=8, font=tkFont.Font(size=12), command=self.back).pack() - - self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击 - self.window.mainloop() # 进入消息循环 - - def login(self): - print(str(self.student_id.get())) - print(str(self.student_pass.get())) - stu_pass = None - - # 数据库操作 查询管理员表 - db = pymysql.connect("localhost", "root", "123456", "student") # 打开数据库连接 - cursor = db.cursor() # 使用cursor()方法获取操作游标 - sql = "SELECT * FROM stu_login_k WHERE stu_id = '%s'" % (self.student_id.get()) # SQL 查询语句 - try: - # 执行SQL语句 - cursor.execute(sql) - # 获取所有记录列表 - results = cursor.fetchall() - for row in results: - stu_id = row[0] - stu_pass = row[1] - # 打印结果 - print("stu_id=%s,stu_pass=%s" % (stu_id, stu_pass)) - except: - print("Error: unable to fecth data") - messagebox.showinfo('警告!', '用户名或密码不正确!') - db.close() # 关闭数据库连接 - - print("正在登陆学生信息查看界面") - print("self", self.student_pass.get()) - print("local", stu_pass) - - if self.student_pass.get() == stu_pass: - StudentView(self.window, self.student_id.get()) # 进入学生信息查看界面 - else: - messagebox.showinfo('警告!', '用户名或密码不正确!') - - def back(self): - StartPage(self.window) # 显示主窗口 销毁本窗口 - - -# 管理员操作界面 -class AdminManage: - def __init__(self, parent_window): - parent_window.destroy() # 销毁主界面 - - self.window = Tk() # 初始框的声明 - self.window.title('管理员操作界面') - - self.frame_left_top = tk.Frame(width=300, height=200) - self.frame_right_top = tk.Frame(width=200, height=200) - self.frame_center = tk.Frame(width=500, height=400) - self.frame_bottom = tk.Frame(width=650, height=50) - - # 定义下方中心列表区域 - self.columns = ("学号", "姓名", "性别", "年龄") - self.tree = ttk.Treeview(self.frame_center, show="headings", height=18, columns=self.columns) - self.vbar = ttk.Scrollbar(self.frame_center, orient=VERTICAL, command=self.tree.yview) - # 定义树形结构与滚动条 - self.tree.configure(yscrollcommand=self.vbar.set) - - # 表格的标题 - self.tree.column("学号", width=150, anchor='center') # 表示列,不显示 - self.tree.column("姓名", width=150, anchor='center') - self.tree.column("性别", width=100, anchor='center') - self.tree.column("年龄", width=100, anchor='center') - - # 调用方法获取表格内容插入 - self.tree.grid(row=0, column=0, sticky=NSEW) - self.vbar.grid(row=0, column=1, sticky=NS) - - self.id = [] - self.name = [] - self.gender = [] - self.age = [] - # 打开数据库连接 - db = pymysql.connect("localhost", "root", "root", "student") - cursor = db.cursor() # 使用cursor()方法获取操作游标 - sql = "SELECT * FROM student_k" # SQL 查询语句 - try: - # 执行SQL语句 - cursor.execute(sql) - # 获取所有记录列表 - results = cursor.fetchall() - for row in results: - self.id.append(row[0]) - self.name.append(row[1]) - self.gender.append(row[2]) - self.age.append(row[3]) - # print(self.id) - # print(self.name) - # print(self.gender) - # print(self.age) - except: - print("Error: unable to fetch data") - messagebox.showinfo('警告!', '数据库连接失败!') - db.close() # 关闭数据库连接 - - print("test***********************") - for i in range(min(len(self.id), len(self.name), len(self.gender), len(self.age))): # 写入数据 - self.tree.insert('', i, values=(self.id[i], self.name[i], self.gender[i], self.age[i])) - - for col in self.columns: # 绑定函数,使表头可排序 - self.tree.heading(col, text=col, - command=lambda _col=col: self.tree_sort_column(self.tree, _col, False)) - - # 定义顶部区域 - # 定义左上方区域 - self.top_title = Label(self.frame_left_top, text="学生信息:", font=('Verdana', 20)) - self.top_title.grid(row=0, column=0, columnspan=2, sticky=NSEW, padx=50, pady=10) - - self.left_top_frame = tk.Frame(self.frame_left_top) - self.var_id = StringVar() # 声明学号 - self.var_name = StringVar() # 声明姓名 - self.var_gender = StringVar() # 声明性别 - self.var_age = StringVar() # 声明年龄 - # 学号 - self.right_top_id_label = Label(self.frame_left_top, text="学号:", font=('Verdana', 15)) - self.right_top_id_entry = Entry(self.frame_left_top, textvariable=self.var_id, font=('Verdana', 15)) - self.right_top_id_label.grid(row=1, column=0) # 位置设置 - self.right_top_id_entry.grid(row=1, column=1) - # 姓名 - self.right_top_name_label = Label(self.frame_left_top, text="姓名:", font=('Verdana', 15)) - self.right_top_name_entry = Entry(self.frame_left_top, textvariable=self.var_name, font=('Verdana', 15)) - self.right_top_name_label.grid(row=2, column=0) # 位置设置 - self.right_top_name_entry.grid(row=2, column=1) - # 性别 - self.right_top_gender_label = Label(self.frame_left_top, text="性别:", font=('Verdana', 15)) - self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_gender, - font=('Verdana', 15)) - self.right_top_gender_label.grid(row=3, column=0) # 位置设置 - self.right_top_gender_entry.grid(row=3, column=1) - # 年龄 - self.right_top_gender_label = Label(self.frame_left_top, text="年龄:", font=('Verdana', 15)) - self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_age, - font=('Verdana', 15)) - self.right_top_gender_label.grid(row=4, column=0) # 位置设置 - self.right_top_gender_entry.grid(row=4, column=1) - - # 定义右上方区域 - self.right_top_title = Label(self.frame_right_top, text="操作:", font=('Verdana', 20)) - - self.tree.bind(' ', self.click) # 左键获取位置 - self.right_top_button1 = ttk.Button(self.frame_right_top, text='新建学生信息', width=20, command=self.new_row) - self.right_top_button2 = ttk.Button(self.frame_right_top, text='更新选中学生信息', width=20, - command=self.updata_row) - self.right_top_button3 = ttk.Button(self.frame_right_top, text='删除选中学生信息', width=20, - command=self.del_row) - - # 位置设置 - self.right_top_title.grid(row=1, column=0, pady=10) - self.right_top_button1.grid(row=2, column=0, padx=20, pady=10) - self.right_top_button2.grid(row=3, column=0, padx=20, pady=10) - self.right_top_button3.grid(row=4, column=0, padx=20, pady=10) - - # 整体区域定位 - self.frame_left_top.grid(row=0, column=0, padx=2, pady=5) - self.frame_right_top.grid(row=0, column=1, padx=30, pady=30) - self.frame_center.grid(row=1, column=0, columnspan=2, padx=4, pady=5) - self.frame_bottom.grid(row=2, column=0, columnspan=2) - - self.frame_left_top.grid_propagate(0) - self.frame_right_top.grid_propagate(0) - self.frame_center.grid_propagate(0) - self.frame_bottom.grid_propagate(0) - - self.frame_left_top.tkraise() # 开始显示主菜单 - self.frame_right_top.tkraise() # 开始显示主菜单 - self.frame_center.tkraise() # 开始显示主菜单 - self.frame_bottom.tkraise() # 开始显示主菜单 - - self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击 - self.window.mainloop() # 进入消息循环 - - def back(self): - StartPage(self.window) # 显示主窗口 销毁本窗口 - - def click(self, event): - self.col = self.tree.identify_column(event.x) # 列 - self.row = self.tree.identify_row(event.y) # 行 - - print(self.col) - print(self.row) - self.row_info = self.tree.item(self.row, "values") - self.var_id.set(self.row_info[0]) - self.var_name.set(self.row_info[1]) - self.var_gender.set(self.row_info[2]) - self.var_age.set(self.row_info[3]) - self.right_top_id_entry = Entry(self.frame_left_top, state='disabled', textvariable=self.var_id, - font=('Verdana', 15)) - - print('') - - def tree_sort_column(self, tv, col, reverse): # Treeview、列名、排列方式 - l = [(tv.set(k, col), k) for k in tv.get_children('')] - l.sort(reverse=reverse) # 排序方式 - # rearrange items in sorted positions - for index, (val, k) in enumerate(l): # 根据排序后索引移动 - tv.move(k, '', index) - tv.heading(col, command=lambda: self.tree_sort_column(tv, col, not reverse)) # 重写标题,使之成为再点倒序的标题 - - def new_row(self): - print('123') - print(self.var_id.get()) - print(self.id) - if str(self.var_id.get()) in self.id: - messagebox.showinfo('警告!', '该学生已存在!') - else: - if self.var_id.get() != '' and self.var_name.get() != '' and self.var_gender.get() != '' and self.var_age.get() != '': - # 打开数据库连接 - db = pymysql.connect("localhost", "root", "root", "student") - cursor = db.cursor() # 使用cursor()方法获取操作游标 - sql = "INSERT INTO student_k(id, name, gender, age) \ - VALUES ('%s', '%s', '%s', '%s')" % \ - (self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get()) # SQL 插入语句 - try: - cursor.execute(sql) # 执行sql语句 - db.commit() # 提交到数据库执行 - except: - db.rollback() # 发生错误时回滚 - messagebox.showinfo('警告!', '数据库连接失败!') - db.close() # 关闭数据库连接 - - self.id.append(self.var_id.get()) - self.name.append(self.var_name.get()) - self.gender.append(self.var_gender.get()) - self.age.append(self.var_age.get()) - self.tree.insert('', len(self.id) - 1, values=( - self.id[len(self.id) - 1], self.name[len(self.id) - 1], self.gender[len(self.id) - 1], - self.age[len(self.id) - 1])) - self.tree.update() - messagebox.showinfo('提示!', '插入成功!') - else: - messagebox.showinfo('警告!', '请填写学生数据') - - def updata_row(self): - res = messagebox.askyesnocancel('警告!', '是否更新所填数据?') - if res == True: - if self.var_id.get() == self.row_info[0]: # 如果所填学号 与 所选学号一致 - # 打开数据库连接 - db = pymysql.connect("localhost", "root", "root", "student") - cursor = db.cursor() # 使用cursor()方法获取操作游标 - sql = "UPDATE student_k SET name = '%s', gender = '%s', age = '%s' \ - WHERE id = '%s'" % ( - self.var_name.get(), self.var_gender.get(), self.var_age.get(), self.var_id.get()) # SQL 插入语句 - try: - cursor.execute(sql) # 执行sql语句 - db.commit() # 提交到数据库执行 - messagebox.showinfo('提示!', '更新成功!') - except: - db.rollback() # 发生错误时回滚 - messagebox.showinfo('警告!', '更新失败,数据库连接失败!') - db.close() # 关闭数据库连接 - - id_index = self.id.index(self.row_info[0]) - self.name[id_index] = self.var_name.get() - self.gender[id_index] = self.var_gender.get() - self.age[id_index] = self.var_age.get() - - self.tree.item(self.tree.selection()[0], values=( - self.var_id.get(), self.var_name.get(), self.var_gender.get(), - self.var_age.get())) # 修改对于行信息 - else: - messagebox.showinfo('警告!', '不能修改学生学号!') - - def del_row(self): - res = messagebox.askyesnocancel('警告!', '是否删除所选数据?') - if res == True: - print(self.row_info[0]) # 鼠标选中的学号 - print(self.tree.selection()[0]) # 行号 - print(self.tree.get_children()) # 所有行 - # 打开数据库连接 - db = pymysql.connect("localhost", "root", "root", "student") - cursor = db.cursor() # 使用cursor()方法获取操作游标 - sql = "DELETE FROM student_k WHERE id = '%s'" % (self.row_info[0]) # SQL 插入语句 - try: - cursor.execute(sql) # 执行sql语句 - db.commit() # 提交到数据库执行 - messagebox.showinfo('提示!', '删除成功!') - except: - db.rollback() # 发生错误时回滚 - messagebox.showinfo('警告!', '删除失败,数据库连接失败!') - db.close() # 关闭数据库连接 - - id_index = self.id.index(self.row_info[0]) - print(id_index) - del self.id[id_index] - del self.name[id_index] - del self.gender[id_index] - del self.age[id_index] - print(self.id) - self.tree.delete(self.tree.selection()[0]) # 删除所选行 - print(self.tree.get_children()) - - -# 学生查看信息界面 -class StudentView: - def __init__(self, parent_window, student_id): - parent_window.destroy() # 销毁主界面 - - self.window = tk.Tk() # 初始框的声明 - self.window.title('关于') - self.window.geometry('300x450') # 这里的乘是小x - - label = tk.Label(self.window, text='学生信息查看', bg='green', font=('Verdana', 20), width=30, height=2) - label.pack(pady=20) - - self.id = '学号:' + '' - self.name = '姓名:' + '' - self.gender = '性别:' + '' - self.age = '年龄:' + '' - # 打开数据库连接 - db = pymysql.connect("localhost", "root", "root", "student") - cursor = db.cursor() # 使用cursor()方法获取操作游标 - sql = "SELECT * FROM student_k WHERE id = '%s'" % (student_id) # SQL 查询语句 - try: - # 执行SQL语句 - cursor.execute(sql) - # 获取所有记录列表 - results = cursor.fetchall() - for row in results: - self.id = '学号:' + row[0] - self.name = '姓名:' + row[1] - self.gender = '性别:' + row[2] - self.age = '年龄:' + row[3] - except: - print("Error: unable to fetch data") - db.close() # 关闭数据库连接 - - Label(self.window, text=self.id, font=('Verdana', 18)).pack(pady=5) - Label(self.window, text=self.name, font=('Verdana', 18)).pack(pady=5) - Label(self.window, text=self.gender, font=('Verdana', 18)).pack(pady=5) - Label(self.window, text=self.age, font=('Verdana', 18)).pack(pady=5) - - Button(self.window, text="返回首页", width=8, font=tkFont.Font(size=16), command=self.back).pack(pady=25) - - self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击 - self.window.mainloop() # 进入消息循环 - - def back(self): - StartPage(self.window) # 显示主窗口 销毁本窗口 - - -# About页面 -class AboutPage: - def __init__(self, parent_window): - parent_window.destroy() # 销毁主界面 - - self.window = tk.Tk() # 初始框的声明 - self.window.title('关于') - self.window.geometry('300x450') # 这里的乘是小x - - label = tk.Label(self.window, text='学生信息管理系统', bg='green', font=('Verdana', 20), width=30, height=2) - label.pack() - - Label(self.window, text='作者:清晨的光明', font=('Verdana', 18)).pack(pady=30) - Label(self.window, text='blog.csdn.net/kdongyi', font=('Verdana', 18)).pack(pady=5) - - Button(self.window, text="返回首页", width=8, font=tkFont.Font(size=12), command=self.back).pack(pady=100) - - self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击 - self.window.mainloop() # 进入消息循环 - - def back(self): - StartPage(self.window) # 显示主窗口 销毁本窗口 - - -if __name__ == '__main__': - try: - # 打开数据库连接 连接测试 - db = pymysql.connect("localhost", "root", "root", "student") - # 使用cursor()方法获取操作游标 - cursor = db.cursor() - # 如果数据表不存在则创建表 若存在则跳过 - # 设置主键唯一 - sql = """CREATE TABLE IF NOT EXISTS student_k( - id char(20) NOT NULL, - name char(20) default NULL, - gender char(5) default NULL, - age char(5) default NULL, - PRIMARY KEY (id) - - ) ENGINE = InnoDB - DEFAULT CHARSET = utf8 - """ - cursor.execute(sql) - # 如果数据表不存在则创建表 若存在则跳过 - sql = """CREATE TABLE IF NOT EXISTS admin_login_k( - admin_id char(20) NOT NULL, - admin_pass char(20) default NULL, - PRIMARY KEY (admin_id) - ) ENGINE = InnoDB - DEFAULT CHARSET = utf8 - """ - cursor.execute(sql) - # 如果数据表不存在则创建表 若存在则跳过 - sql = """CREATE TABLE IF NOT EXISTS stu_login_k( - stu_id char(20) NOT NULL, - stu_pass char(20) default NULL, - PRIMARY KEY (stu_id) - ) ENGINE = InnoDB - DEFAULT CHARSET = utf8 - """ - cursor.execute(sql) - - # 关闭数据库连接 - db.close() - - # 实例化Application - window = tk.Tk() - StartPage(window) - except: - messagebox.showinfo('错误!', '连接数据库失败!') diff --git a/pythonProject100/pymysql.py b/pythonProject100/pymysql.py deleted file mode 100644 index fd40910..0000000 --- a/pythonProject100/pymysql.py +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/课程设计报告/python程序设计课程设计报告模板 2024年.doc b/python程序设计课程设计报告模板 2024年.doc similarity index 83% rename from 课程设计报告/python程序设计课程设计报告模板 2024年.doc rename to python程序设计课程设计报告模板 2024年.doc index 781bd694fb8b68c4a981b4fa88ffc496db8e8ae3..b0fbd1cf2d6b29768a1607356a4f73cbff21a138 100644 GIT binary patch delta 14273 zcmb_@2|Sct`~QqxV{JhwsUE3>iYD38CWJ)xB`svhKK60 S*Ztm&d*OrY<%8D11OTmFn|L>_*Q3%n_e2#U1d0baCE!fFV#RC-U#6I? zY_}itT!3$m(&iETwSBMIANhQYa^*3D3xRYYuAeuW{Xu#yc?Kl&Mrrd3a?56Jr2ojy z>%q0~hm0WM@x%27t>-9q %;X5&?!*E?zevqsA1*QQ zpbcp4hrJE>gGZg@z8!M}?kyw+>f8lrtz!|ObFzQ5A>`o^IQHQYCKqnFYg9_18kXr4 zQ#BlOTNZwXbqgqF+j=!{aSY`olRjKv<7qDjrN#uY?gsB!qkQ=MSoeUtt(c|LOsQKl zLBUx+D%u1pT4OY%@C*~S@C@@sZp`h&px`x*gg4rs3$mu0ZM2_tFG$zM_{hSwShs^) zk&W6UHtH7L_`n><-gPrLmZr~a4c}@Eo=gC(v9(sydTlP3nXxXHSst2~mayz%;^zdd zSbNU}uH1m`Vh@+HIKw&Yz`Z>nOeU7)JVyYyTmO0y%Yt3RvT~Tmykz0RJWyl0$+izP zh82eO6=3safxpC1gxMg(Fp&8MHShuy!2b{-6Sa$bGv>7j+i|8A9qh6Q+pB!0Glwxn z&1}N#0sEc^@-yc~&FmJ(xYV<;aQlOgUb1YO<^b0%7?u_`eYgU~xP@)cRS#JhjE&8^ z(IW1SV#2U{aed )^6UfP}asJFDFatEf zr&JC$kP^gS;Echyu*pF(?={Y-8F*WM$E)2G?X4DLjPTV#lxP!{t9jBLx0U%m*my%z zXNyB+N1lc;7xS5%F^Q-ZlHxKU>Xsla-_MEQZ^WPdP=`1wG^5lPUREDi$*&|NQqf>x zCt&hm-cX!nzCi!-A(R;9QAOH;N;CS>$<}#06gHv~%FcIA(7y~}Pb9Rx8y>!TvwmjA z^=VvOj#(?ovoa;GTK(376=5#D+^Neyv3fjfNeLB|LH4m%(ZzFRjLq4UkFB1iLx2_g zJDXv!lcz3%u|LlNID~PkaRLb!mju1Emjx^vx9=u{5qiiM4c=}3b7tu8a}R&|`0=9# zTIBYAN)n@GRWN|j1ZA6jNF=P*tV*x6uQCWkf!D35oX&}ODQW3Xtu{Nv#6rr;%PYF8 zoUkH&M87VZRf@86Ea_b9_=KP37WC@mg687)9()DscRT3$r`++m+=FxT%DS!N78$GQ zga4@Af8XqX)+5j#x@3Upabh3k7A(CB(?SR)1mN=kpY2WscWWl;Sx)c)^BWgU&CPS; zT2H8`@VL9XqjG%kPRNpOYGx~g aE@7_A ze-O3oOx*FOv4Z}^V9Abn_Kes25_%JPOQ%9;X6z`^g(*ggXHWggim%Yp-j10WDz@%R z4mp^zM6>R)GEv|#qmHYSZ4WW}$J}djR Mnrl0-e*)r7*e@h6uH(FROR>v4~BcRbO<+6s7ry55VUlfWR!$dU|6ogP-eIHUi zXi0*&R;GOSUwU^XDOie5mn2k*M^2dS48aUdPfvUF`p7Nnd=J2GhZc;Ig1%1Go${V{ zly@xP)Pjv{j)vLb>r$tWustUGnsqcZqEPBP{5|Wv;=Jl}>Jz4~jt<0lr))ZrQ((FE z -A^-2Q FZL 8k1aIfXFgJL4P%&+x_tsVknn$7!9%WqtXJF=IM+)Bdwh zdqu20NPW#8)0)Jqq!{66`ACuKIKAxJ2Ty~$o=gwVqqCWfWM2Q&5;TN>sc~K@<&H=; zuYU9Kk;-VvE7{{6&}NKV*IsHLdXH|yT-f)OLXV8Wn_||&eT5V5MmzLEJ9#k6%vZVe zZzu-WpCYugsbi&+Y`g^qhaD)|c#+MYeQR@ egh;mfs$ZS{Tk-gouxy}_9^4khGGheE5cG>lPSCwBUa 7N^@y8;9%NlRNy<0C@D@#^dBy{{T%^Q!1-Dm!zUNzdm( z`xm|@V^2aguZT?2T}71Q0joK4)yHWw{As3yn{7*JWC-`IlSD3zQh0!* |wGGecH?(&?*pfkL_?S94UVJI(%5$z@9Mt*R;H{B0ing>*8L#kK4y@|O3szq+ zp+#25Z=6eQmX%$(&Vwt?%d7f^VCwN0 ^ogR+#)Io8NThr8i2iuKfBvp{yYqlR7uG>6X)?b{}a>9h`if3xc~N8=Z_Ap@LV z`s<%gA8=*4F)crGSoO4yDPJTcd_)*Utm99!-;RQP_fJ}WL6^*! 5YC=w$}B(Prz6dLbE@AeiZpP1nTMJZr7hl054c`Sbw`X~->zu|@RE zjn4-I^|{n3H=AoudGqO-%I=kFXv)y<(XlxGybF8XDmg pJ6Dh z2r{~xHjWa`V(K YII$%W2 zSm*?5%F^2~xTb`R))ynFNLncdrxW`ObHt;f>S{yi#riLqWuuc>UT;0XR5#+C(r1hQ z`I@T#H^g?=lC)SxsmP#HNa6AqJ!4~^t)9?AXyJU-GyUt-bQx*qL1htE5%-cjQM^gO zmYo7>_TwKl-}{Vr56MK#H(ZO(9;wRiybXCDTlBk@lznuJVo_i})OJ2Yj{VDnWR{a@ ztBc96z8B6<4+b@1&Akth5jtZRr3Ecp_N`WRZrM2>5q^UEr-MW98ZV)q2fDYLA^NpM zpdpVh`*kctJaaoZ^vP`j(5U0`Rheim#qx&2EU$*mgur3tf>Vahce9-PEFXC;7>UIP zC1h5$b>+Btxhv$74av18(m9Eh0>i!3$NV`#enUeYy|ju_oNywy66|(Yo=%4Q%d#?K zWE{%hUvzA2jA%Glfp@x@L)MF<_fV@KyL=J(Bmiu*=jp}$2Zyj$JKRsvVl(AQOG>0> zC3L&~oKMe04gVUBd6So#ni{oy45m-?@~S!f{Ea%ldNgC1fx !^WZz^>^|-b>K66bNfDGMQKnDa=b7>OCl;o3;t?0 =?F_6Px zm*U@G *z5oEDTj_($v&s?c|j2Bwx_~J-Bpv=c`@_-5xhqu|17U@SoFOTpCXz z2~20Lv_gax?Zt73F%HB4RkKPb*OPh*NS}O==>D-25 @gepD1?uaeB)ts;Xi< zyu74O-d);2DL@lrYj}QB3%u~vRtxz2u{nuyrwcfs#r;QpKvI|2lE4P3+$pGDKCm+1 zsf$9uo_bdIJ4^KFRlMGtRIqwvIgy%GAphlr=JyZODqV}Yo)o9qb&1G|8_MtZ0{JR5 z@ AqgKJI+ZfJ^NR)%;%6E)cz3R%e z7XaD}%Q-NplnrI5%B~ BjN`LJL+MV2pUWtg>tS& BYZGS;y}}Iplr;%&$qAuXE1cjiTb2Tnl#xp`x?x7Ag2}H+1oS5@qTQD;BKBn4 zgrgnpD3u!9W3!q!zA+26{qX+fD|uw AQZsm^wzBS3_ut z>5z1dk5D2$C+S4;@={^X_R_D01F(}vr h3SkXZ{c^s(&=iOXu?)Y2^MWSBrGd0KGD#d(j^EmdB#%JI{!eV#Lgvx))J zjJa}q`6?nhvc?q3Ba X!|2&p@YmdXC2NoK z2-F3JQ?2tv#SfhNFl$pr%Qj9~2udEDUKycL>;3s34>mo4h!0=gR3Iqy9z+G0@Wjz5 zTVS^hqY3ZE%A@$AuZSWL)@dB4LJFpWTSs5 C11UQEnowmL6CP}#_iU2o7kN1ST9=dfGm!NJfY&${t zN~Ru>JoN9>eOnxPCenV{@Wthu_xIU-E~iQlSPgPv+C$AYiTJhGg^a!`v?yQ+6Xa}x zj1qK_qX#>Vsk%c2V3j8LuI+SSlPT$GEn!bP+U>v1sVB{z!& z?A(c~+LDMVm{A(&&DlA3y_WJCo-AMK97g_5thi@{`rsp0hi?yIOAGXZobP7t-y>Oj zIl9N>p6!dUrd 1f5B4}6v zc2dzZXXu54sEh~SAg-5J%PY9?1<{t5%&Dn==Hi`$W*pR=!G-1ViJBhB+=5#e@qI`( z4`1#y@7uQ9^Mgg-ngkbl?}qLTyHc?)3s_<1owbJE0eCyFN lR;oQ|5-z-zTlfTWzg ;lxagz`Q>MMZ)u&VmHDu+U(U9i-09;xZ9nQc>ah1k24BKq z9o|G_D@hYz#q~|T(-Mgspa1fpd7}2`j^?msp%*z)I^vsPvhx4d4hHbYf7~ViVl^8$ z0e)G|_3Cq#m4v(NCZhLu)@M&OWPyd1-S@9)PmEik2mD8S*!l!%4)rL7O6bpMeytA0 ztDok4mJ _XL2@f3sK|zvDaYSTf{lI`Z z-X5~V_H*B&DBBmW77tQY1LmYA={_}1tud?ns(4ow2lC8{N1SV_L>NOMHNZ4E_vbB1 ziCzGy78A(D_Dj54Lm@rwq)&?y NOx6;lggP1zcH_}lBn24#|AE;ux<@bDnOUsX2v~ChmL~vyhP~eFR@;jxE9`ZV zZjM1}5-eOwcl@!Me_IRmAFZSR6#4xQ?Ej}B`US==a#Sx4hphqXF6a;pCh_s_w4{Fk z{x)pF+J6iC{v^=Qe<}X|n$tIH3|u0x{Q*n@yug y}==p&PCN^><|Yd-gP-eYkjg8)Mm)0!7=J_c}*cTN$`xfGi 2J*7{~P}QVqyO=(tZ-?nFhfjj8#CE*#{N*rsG|R zsB_v(#lydXK V1X-VgyB`}rR-yM}@sL=;{nL50F_MsAJgT<0NZX#Uy4YG=NFAqF$d@y2ELsh% z21EK-iOyNEm^$8qq@FyR%%!TZ<*7TxM2T^I3ZB)r+dpE>FHxltKxX|(&CW5ZkGi%F zt}lt^>LTQ{*!Idy@}0*O@0JYEg3(>SW#5p}k`vG8#URE==k%N^LmwY|p;MOofUwtr zE~zQh;pbiPCPI2gE*C4@y3jrOYz$X5vS6WoZ2Wg?k$thvbCc{PSD@s^(UV4Fo#iEa zU2e6Nkw>NSFLar?+lWhMVa7_9EOq7@TguQzQLT1!ILAMI1pQatb$|9wG39$B8sPA- zarwQLN@N*7;0xhO9gIDSprl*IUZZz$$@hxNbIPS~Y2LEn# gPn=$qQ=Ia7) zTR!$*uVsH;%KQ(on+-8m=!HOs84~6JzLX^ja5}w4aca6ebGzoL{Geh9(sRl+pIyXL zmOj)dZ%J~8-hOhMV&vi}S`gBxNaWKvyJ~UfN-o(sXmX#yr#AnYXI#>_9tCfz#NBYr z(8p8VZF(|t BVxW3zOe#&}h^U;ifGG+YDyy}M|m;hgbOE=qG@3nDuBvWX3 zcvBp$A^dw`jMHVRiO)-Zpz ~?rspHyxp`%jc_E(4WJ}W43g=Dnk3}5!;sjEcN8agrTiGEY^n}|XB&!%@^MvWu; z9Zo|6n85=RgY}ix?mn{LCV{Ud)Lx1#wlJ`?_e_??6#)*-_b<}IA>8#;`Mcdlfg&$& zBnu0B#?&=hl8dy4hH!%}C;6X;=G~!p8+Esba>qCt9ype4<#e}j$$|_=4C$fNakYga z)%{f>mOG~I3LY#U3Jxr!_*Z_ThJC1^>&y+mZD$Yz3qR!CFDnvOB|T@dq_C$L75OeZ z3^T1k%*rCew!|6;TeKBXRE6tQegDGpn}T5V$fdk6L!+=|6Vp&E8|kH`WwhAJshQ0( z&8GMO%kbbv6n;+8HNl&q(0!yVUkWh7cH!j3&`uZ|)zLy@z@_}=ruRQx*mK3P(z$-2 zqyFNpElrQoUp>e1FEr;pdNTd|a~X$ϱZWSyQJ1{*6NhfaZZ*WK$jA&Wfe;BxB zPE$7Hnzpt8RWXV&PLUx_+Yhr@@!!`8i8^6Tnz1P}V x?b+Pn zG~C0jNF}2Bd`McY?~ZCLvWBZSP6X)`YMOhlbUDWD%pU6ULZ77u*BeS}^Z3w5omXA~ z;QzDVVtTAE((U|#Dti9FNiLe$@|_N~Z(Ge$AuX>C!HY8SJ+wrBQA?hs+~JDx!o_zZ zUuiG<4)@Y_S`ZHPMH23Y$k2MsQZGimc6@p}*+7^1bJ*#H$d=@nv(KFyj0eQ_ZH_m4 zX6VjwPIj@urF5@#qa0JC>$G%LZ)8*Me0qOgaJP6 LxObm8-kxjIX4AUESu& z=KlI5Xl9n8u{4X8CbmqcP1SQWqGci@B8X-Hv)eq+S)k8SGqZz+lFnB6qi5&sW_%j! zCJHdaHM%YB)xLSzjhApuU9BnSNG*juG9<_3WZKGNiTB_))RWFP1Sk6rh-ecHU87h+ zPz6s`pKe$?cG-VfHP}gS%g0DvQajN1Dj4@)xqga>RHi>*CrZitQ96!hk>d0o^izul zn-+U5rt!w_@-o;+h4#Gp#myBHIL3#*czo=iH@elYdo)K^h}Fu4-TtIvWz*4}MJay7 z9Ed;VI3-QgS~Hl`GWPbuo~PWdWINRBmEL!v+3gYm7i{;r-=lWV(TjceM087jTg a{Q;Qss*#xBr_}pNZF(I^GhCQ z{J+^6Xx}H&Z;sa5e}?Ar2OJ2B)^DbD4RMg{n-Anh#*OmWVTH%FM+Xxk&fUn;_%cSD z*C$UYOSSWON-u8JdUkl&Rg4mf?JN79_h8@t>rc g=o=+>b+*lN*Li$$8iUg zTc?(opSACgboLXiYpH0I8F={i!hYPBli!MTPMxwFJ Y@w{`$DIJm-LHl9J>hDWy#^%};!a zu1+TPTjjd+l!k5d@_9Icq7GUmD|Op*Sv-5<`O@GZvCL@Ek(qdf XghVULmLro)*AzUCH}Wdxzb%ohVE%f6hDU~a0uzA$DfdnZdp#2`0m zP$iSlzx>|X)xhph)h3xvcqSt6?!E@Li3L-onD4#i7t<}Da vH=UlS>Jm#Sslpe5$0+e3WAP;I;@& zPdZj;QI^H(iXWXzyLvl2LuRY>&B+NSL5dI8y7{t~rjNh+RF8D%)474SXnx%{7ZVMs z8s7#Y{nY%}<(p`h(LL`?7}HXsDiibFS}Q)NlL1*?>6I_j2k(ZAnzRpJOAJwL_}*Sa z>K@{-n%3a9y6-E}`;C-gzk{zwTo*cl(w_gsOsTN1S$z;PQ~fgjDs8eHml5AhFsU4< zmO}D0Ee>?GgdhFnWwX?qkbhr#tL-(e{J?CA@l0(G>S=C|uP;j39xR?;((UG8*#~!A zFxmOG*9&&j?X|rR-_5Bro6wPA>>5T*q3P`Ug3?MiD|CA?Ej-QS?cZO2V%&f}tK}<< zRAY+0Uys}*>#eG_%y{Mo4z7a5;wZ2W-AKK}Q1ZIsQDxyjh}r33AvE!2QtQI>&mW=; zk*TX9?xcrvNe-ypA;ZP1MP>wOVZa{Wz3OFEaFp1SnW)%k>s3!mvwh4vi+f*&79*iW zC*}(5C!a?ttSrjq=LF~WEJNX@4o5FV-THJvPD@@@8aS?iB5ppn#dSxTz4Ir3V?y61 zYR|Bp``qct(Zd(~c v5eu_xAlPDRafFs_k_)Yw(1HY^f8E5n5)n+Tp52HJVSomOUdX z!;>ID2+AN7z>2ROxpS%9x_s-@K+Z80%Upvd1VyZDNt!M8Dk+8Q7y)gmn$NH -Z@+J`CcCQ6|CkcLxkLg}o7AHFV6(- G;&+ksZP6l z5&AhV)rgMFBl8c!M-6goWd%r%-x@V>KU+wjm9_HqCU=BCnt%V0S!?^0yU{C|n8y6k zGajaUTq`~nqE7h~_4%r6EEU`1OIOCMmljJTvZH#rD$l!W t;m;L6lcYUH$!l-YG3CEDK^MfMIs##v4M-|RfA`Y{#UN) zgW3~vcT7YRo!qk 4c~Gr-`T!uRU6NKaCLv_v*eY0|J2MaR9jgMx6YX z)=RCCS_I(FScRl|R?a+-Y_M~;^-JMtJ~$+EOKJN+pqOr|$nfP!!RDi14&5q9(9zwW z!OAr`Q;_chWjJFE T8G%#;Vvd30Dy@{LLrj}E^ zD%uHx@ve-amy-?JpG@trG-&-;AUz-yc&6%vw@hwy(-!W@y1a8qz-rfYk4x0qW4X-3 z*=1 ?sgylJ1wgXe<@D~g3 z;u_&Zyr19{v`>U}X7{@Wfz!r1Q%P2Yyd-mzzR!x4(=JXvuS`{Av%oSdXTSN&CFDU# zfWy>Z((pE)t HU-I1wry9J+|d|enW_O8}Y zQuB}$KI`Biws~t*M-5ljcE4-3cQ vIw1c4^QTkwR@F!;Im#d_ rxYjUUk%b7Ez4ausS@LI>+);C&!|(q2=UVb-N++M^^&opsbB*@Eg8$&yfHx zY8==?0-NCS(h)nAd9CFgL#VveI-MDAz6}28rk^aX+wGa81f_W&2?194ajVP~v=>_< z?XbV6-%l$PI;o;TRxE8$b0+s*%aFE(^9^ltfn+1AggBytWMab1EpL~_-RAR|kv9a0 z+Bmr;XgO=U{YwS=%{R{gznEQ14FkJcUEQ51mK1=VMPoNmSv8~DjG$O81~$cVwBMUi z5?ME&5tnZ>Kt00trL+X7&X;M7!^FJDUHy@|VHMuKv)8&$WYFk6`>;ug^pf0HFXCK+G5f<8QD(G6VQ9bRVPhfoo T_Vd(z8u9jQ zv_%gEfKU;|obyVV71{OpX-~zw-Rx)c@{~3y`ZWYM&du%HH6)?GF3ay@; g(=-hsg%O`w?~c0kG%3r|gohI#qrJyg6#!n6VZX z8o%#vta*R70Q^k^EO3!QAl`G`pmS?IBDDdvF2*;=x~MSgH5*dOV3(GAZc=QDL|m%G z&l1r;0yPfiXXehw9iH;@`6a5Qcs;6RO(U?t$!Gk&BQEtIQ-!c(Amz8JF@N6Zq5qrL z`A^o||Cav~C!jTF26F0GpLJQpuf7bSb2xe1jamBZB(3|+QoYT{z;L-$h>BDCB^K6X zEf)6j+GNZhjO}dnQ?Ns&TE=#c`6+BDEMD@x@y7@)#~dVL(_+Oi)#I;vS0NBXqGqT0 zfM(e?+ hFLu18ei?Ewv^Yd28W#8c$!f%!wqIP*LT9b%cRG&y z|2(GcPS~^VV*pVg>kbxRBlS80_MY2!`P248)@LT%((~jp!m|t(w1iW{{Je< z=2xH4FQG^ aJj)c0H^;;k^TSmzk%qMi~q`>^_x3u8Mp>fsXs!P zvf?&8ghZR;z^l+A|7#%jv48CUdwrXa0ZlXM$8or%N@8*Y*|*1Zu_ &uwtpWn)FJPF440grfT=w8xj?!Gt2Gy8J&Sqw+C=7GB zo=q@HmW2myhMAk>+{c|D127hl^;W>=g(z_r5#jAf7;FU`f!L-3gK>c~1L7xPFb=S` z)~iLSaZ6)DzjIz>osb4rVQ>aUiw&_8oGs#u;^#iVx*rsEX{`v>{c12+EO>3p?*^LF z1qw3&S3mH6H%RrvxRE(a;L})FBvTk1G=>9PF~fOoQ#yn5cFYQAG+YAnWQ9` j0W(;%|aRig3fw+P}Xdq0nMQ0IKaOOLw|MFs09pM0HPCdKv0t>!4$i)0c{YSo4 zEkp*h@rB=irKpXFWFFP{k$+Vi5iKGZ^1Z )?Ej04CcGafrDYW`pgs zLu_K&%Ljuci@{(ifHrc&*Pqw!*V5O1$1og@h<+9$&Nw0Lh$G?@6W^atuwdn#5lwt* zKZ9Pl11J#CLqKZ>c!I$-1kk-7&!ONN2Iv8xa6l1&A_1-CWngE{!?WQSzDrC3SUQA| z
xMn420#H;{2j*-2G*p4BA9N0bg5dm;a zYB)j&E{jPFMIbRVp@>VEqA>8G%sud-Nf=@$HYyAu2gf{GD~R?0lnaU!#vBeuh{EMC zg<**8SgmkG5mWj@#HOeZPAr&LB+jE)t7L>aoE3~COc1m41>!1ZG6}H-i;F{Kz*)f{ z{z%1w)CxE&7`#6uFuhU7h`c~}Vs}1A(BMp?8d&h;%Ct6)#VLhIc+?lBUDzF&h!^nx E2h4r{UH||9 delta 49169 zcmce;2_RH$8#iu=5~Wi1Eo+N4+1EmnwGs^mWecIPjAd|INwyF}wuEHQSO#OLl)+fC z@04xAAT%`A?+n%RF3 Usp2d~=;-h)J{F)+R_8KsG! zrjyzWon y>lvdk cZc+i55i&9!_JM&Q{&+9u?*!>B{?Dh927QqwDkew?uuwb4gutT%y zhxowW+5{W@9LyyNOeMEby+N^>bkfwvkfbxzM*9weCl7-O33H%jiRC|Vj42WPHpU3v z2fpIvsD0Tfo%S01&Hy%=l9wQOECi;Ir*hQjr*brR4#Z1QYsG5ONzt)__ZT4kq^R}w z9Rd%Jfa!O})a*#_3p7{vu>9Rg0VL@H4M4{Mo}@!7YSG}RV>J$F#9yRIK1wO~Iyf6B zW#)n9 eX)-Z-KOT;ZOBnD2g=C&E{{GJy#AF1(qD$!f2S9J zR*X_d_P@PwFAw;Qo{9>+Zbo~9dZ*a^KbuM^+7hfn$Q=kR`VM5zQ%kT|CS>>p8kIei zD*sWK1$dR61#;~IjXxbP_zNA9EJcl==0kc*gT2fNp5gx6>*@HxZ+p<>vOS_ShbawZ z1WRNB(*ZEy(9#uq+^P3D|EvY_b>*Im`vSplL0}5`QMm{Gqmpi)W$fJpcgxRG-=&T} zL+wR>9LzDB8tu 8{J?CCajoZgXXimf~3LHn?siWU>AOO4xwP*jgec uQ}d@wFmu0(XR_{rddWTE4tF>6w}O zDtL@4<^<}~5vh(Rld-q(CS4CpaZluI#MszUE#enU->2GYD({mYbUTE=9NwU 2XAA`cd+Y9DnWCF%k;^g@5eWkSYf_xF_l;Ctm(7x`9K(yeEzoPf6)H_qkk zOhBpb2}I92aEM9rXDL)C1*R#3M|u4Z4y(HE^pW&aQc@b5o5P1M_11+jPd3G!2H>Zm zka!Dw2wb)hW;V`^0Q*vjFT$TC0;QADs>4<0zuZpf$y^}|V(4s+#syWLNJHG{bo;2O z%;(xMKo$bKd?r94vX|1LSmTxa)ouQZRV#1bak(br3t!8BdA-~YzIU!F)y ~ z9%mvbT;5KQji>$m=DKr-X{4SM8pchAm9-6sQ&CABbZ~GW4&35!?vTynR|)uGTxeN& z6WtMKUwJLw-fW!HN4B*%n@H)1*YZF6;&Pt+^XB8z`+@NCpvbEOVCVI;ik_p)lR8-S z1+eFn9- $<81KE&F(yu5|$sfZKnr?v%VTfcBe16D$Teju67tHc8tfnS5-c& zL9a!MJ&f;+2m$y&`T9bBr!ikG0P<87w ~Q^2~1G<>6P}>-2C{nkjm3# zq?aX7*ofooVp+efVoxt1+jhFizh%`t a($`E~4uV-5xoxeIuStZd>ImhYo(g3q^huvf4z8P9IRz z>#4yZw{Lbzq8#&p;zk`K?`}W$=VIPgMQ=P#5HJFGk@Q&+2|ZC4xA!I0!et3qx4k$0 zu_K52;UnW;E?Kl$7p>lQtWiw(E`c|dF_pVFEBugFugy*ZTt5$;&+b(2h5MYUGD32| zr4wffJeQnP)$o?aDrQ&>_6qj+ZB3 Io>a99(#N7p;iJ2m+%08}8S@N4h}g_ny7R)z54uN7Ttb`0OCNZ&g< zyW^x5EiKsQR0i~jU+DDTcZ>K1YVNP7 $uhfiS`dN+l$ znYKg|(}g1K6$M}iz_NNbi?F&olPORNx$IJO)!-9dOziP6<*jV1s-Rmj`2Z=!z|$#c z6#05qArp5j=f|0ZcaSwr c|0+i6vesJq#k&ccYS_vr^Pmh zti~iN`W7{=UG(S _nrf+=Wrfj<*`lR47ay+k@QXBklZZLx_ 2Pep^` zGf#t^*D;m$sS$aRc(h%wM+ji86YW@XXqI#*$2>XtH7`5Q+OxXn&Br;#=UU+C5Fa|c z+ME02RER;(a|ZlIqM1zLe6(capjtbm!ZgYr%&o!-F=?Qv=&QMZdvS1LHcDb=ThZ_s zx&0$OO!wO(qpx=H4jqy&k+&_1npU!A@9cp|EHh8f Z+`X7}l*IP+|M@ zy(dY)dMj=8DPCR7qno^BvKicv6 >OW!J4}iw}g^^IE2y!ka}|zp(%}3Y)IsTELpJ*Y$k#`$3YQ zOxuuGf4cp3`v=_5d2w#Zx;L3ic3O!kJ3AXL9>~nA^2TKvj~Y6KN9DmHFr0+GtAC^T zfII!`?j+H)t;f(Ls#Q1HS5pgTTZs-g*EVu2A`ozy0myjkhKcP~ kFo;^!OIAD_D!Gt)3~XUPfs$-QQ~UhgJs{SH(Rs%g-IAD{4zD zd79ThDGa$J`$fs1`>!j=kCXrz%WW8GrY%>re$93In|X`3>Q!~t6b+pS83yLcX?rMY z8#8W^6I6s;k2Ix{wxY%h&;VzI s7{9J#fzayp`ZBPe5ci%!t+?yoF9 zt`jF~9n~(VxESG>%L1)LlFcS *_=-t6^|nkSBtB_Y+vjCYBtZgi1%tZzGk3#G9%zbsrCh{A2exaJ z;d#oDxyT_VAnCe(2 _)4Y3M!a?l#z^ zzfwd2ZugBB$J4gIGf&LcuD=S{>c>rd4_r7@sbypaR)g~TiXY@-sa*Ol?B`o{9PsMy zub3Dy+>zFlU)L7P^_FUwYYl1^W04a8!l?90fe`ek?e)TFVXYC}2>f_)@U#u4QfWuH zQtr}7+d}tBG@?19`o-CFf0tCZI(mrgxcv^&Zdh0lS@=gje4{_EMrW+U>q2&99wm$K zUwmqgFAWG{zG(ig%n`u<$Hj>(brcu%?|b?01($5ht_zHA$wZ@T4JKftOY=T4zm??= zTVqk7L*#4G+g||5rPV qWqU8 z(x2ZaA a)voV(qq*|jN_z{df{IZ)`a@0F2}fxDJ6$xc7N zc8FIk;DlMBWwFI{)8EPt;GcvCm%$X+o(mT0xRZ0B`Q$=~eL>N&zbIHyj4Xrm{UsyY z4{UsY8Os+B{~nFMI%IJoy}jGqUSCOk;?EKZnnB=u#|%m;^#^|2L61~?v$^qUjmg93 zd7u6NF^JC2P)t|XXEPh$zn3Pbr41I0?AQmTmvfhOFT20ou@mob7f}oc5g?riS=c@& zRZW>8lvn2C-xKEl#Ub!t7Wef^-Hl!uZ#Z1UNR{+#m}1S;56ZNu2ujv&peSG8zWKeY z{3{Cz_(u~8>^%k0Y|gY#OHGYmUiQRvbM1%-xl7(^CwF=l9KQdZO}R7w|L@wOJHz@{ zMF9Va75sO0E0xq%YTydQZ}B4=WwlXByay2gD3`dVL6yU?hyPOO{*t*Dund4sN>qF) zv9q(&BPhrX?VmBCl|gL3kkcxv{S)B$ziYVult2I4TBY>h)0cV&LZEG3{r!o}&CPuU zUaEg)kV_N;^Ob~&ETk36VyE9N^O=DkbxZFVCHo3S>J?Ydjfnh$B4P?v?|cI;a1l^> zrA_Lps^SC!0gjh#B?a$@2vA4hh3DhWflv?l?$3z0l43L OXT5LpOo@W9>aP As8ah@=y5;QYBMs1_MSwFXXflQZXN{&_h{ zIQ5gmFEN9<---Ve e|E@kq%*airVq9M#f;zblFr0L$W2BR3i~W#~i^ z 4+#lgI7Z`QTUKnjzA10FyHAqH!Q=Kbiq`G_gqvKI2ih2^b zwEd)^C`2O&mQTCyB?twFpHj=X+YZb5@@6(sNm;qXMI(qvBsREjuejrJYAe!yTV%pq z0o79QPDOy-MnBR8_iEeT3wYz$LI~ZLe*``+nQuj@p+(Bt`1-{^z#ugOQ4_RqM%eFd zGRwtskkk9}+yPvm3is@ykYWvvEF;%upKb6s3Vu9QVU7mpQYwa5Z?!k;O1k4$v>agg zvCh#X0ILRM-`ZU`Zp-xNI?6)weMVmMQ2oXe?F8}ua)quDRj*fq$9bJDT}i9|nX$&e zSl3AqpoGK&yO89P6@i?5e!#!`BnZ1@fSBcA^*O0m6oZrU`m4PZ_ pjjq~Ef<9UPL`BuhAuloz55|28n>>9 zTS2bf@*}w?aZOG+t*#appPZAVYnq>dk7`#aU5hW`t+helX_uI(;Cq p z A?x4{Vx^wIIo>wpI1Lu9m*~n4oI@@AkM}Uq>wCr-_CmiAOSHi%=n5T2~ zZ-wJ=d*-ZEa%$>8*>_dnZ*L2;B=H`3V)(+C`0d7Q^_#uHM53W>kaG=;& 5hefRyy6Wi+Dy+qHWy7|@TRi)(y0TR9;LvW0X)edn zvt!(Bm>alUPbrd0@B`d4)q@Dh%eVoXQD&0`I1cSqJ@Nz4d3-e+)R65VTQCXC%aMn8 zL<(R3LSf<^by}qwz2|LaMZ@!39ES|kSho7*LjPDK0A-a_Q(e%!p si?^8)EMC!I Al1<;MO2|24 zc(T{lhD|2lD#kyVl^-sDRW-wHVaUL$Z#gBy=if|mlMM&o z8#6Qr6B16if}pUO^K7d$mx7f`3C<%w4M>{uEIu(SJ6h~pAy8Xm&zIfiZB;kqh9Q@# zxev>wlZW24T^Fn_xFrsa+&o&tccMm+iYnL;@nLOXy$3}sU0XYBy1%jw^22R^=Kajm z67dU~Z<8yC;%H8P)ypoaR9{2xZ`;|N({FvByD)TUb$Vp8^=2#oM%$ufiYQC>pg(Z4 z;>6@9Eu#-dDjXD+H1V~4Li%9_>`5%5*nkfP4P8EREql|qRq1Re)LK E55;<&s>Vv{d_ceWvYJb3P0?yv3i^> zhO=H(A`ImPwHEwgYXm8Oj)NEsamNA%N9p2wgx}6H>wm=39^r0CnaN%5FTmYhhCr?> zdZ{6_;#+i+*J&ReJbW{fj=)~v^!{7$CXrLxDL~ygKnDcX(>1>t7$E})m3b& )0N9%~N1D zKPgpXWSk>uui{wHmt?u|V{mSaTzlo*kV_ M@+BcbcY^7Y9v}PV$)vRh_ZM&`1}C1o zqJ1LN&-KM04R6Pz;@)=kE~VUp3yG^ f>{-#jxp4hkKO z5l0+r@M|H5mqmGc2hs1LEAn`3{&ix1CI|-9CnKg`=DRbWr4E_?c(WHcFvsDj{zd@# zG&VlSzu1IiZjTtt5ltCzF)a0Yisef%u|kpFZZ(go*W6dFYA#=LvnaqfrSs;EM4k0N zS!*b9=**tG60W*2ij}NAskfHu$TD%-22lfh@>f@r$IV$zS=h^e$z_=+B^{E|e9evb zSY9X ~RG z&Kt>w(=N!U87>$*!k8mW+ZM|8#*@@ve_td!9Ld7^$D(U2&Sw4C)L7&Jb*jfR&PwC1 z2p+Cx+`URpz-543?OE%>>}7S}1+A`G_+wL=mx0CO0=Z8oa>-?GZ_~zd_u^1BfmgjA zUo=8nQzz+NQiVd{FQoz{{ohYx;Zb^fvFJk4dv50m*B#I)>($Bwh7JC4)a*AddskLg zG`9K33z<96F3%&mshsuF`Ky;1ck^|3dW8i0=82$5yDR%;Nz}^4o96 zfXM=lws`9AonhMDJ_qf}dqxu?*YvU?y`2m%h3Va#T3z%N&5>@R3NI~W;DWx7mHQI2 z>Qyj0>{HV;bNxvTZGPdnE+6^G$>G}1Rp l^^xX5G^Q!Udr>pahnUT}E*>yk*-w#aW^Z=RcJpjuJUhN+o;do~;AUa0#NiwFe z!gwU>00`qh4+i!nWcm47YDq#oI}WJ@TeRUt#w_=9RHzuKQ-L_Xx{#&>^`gTSbduYc zgX9LXksWyuz6CYgoOms}sAHV3Cw`B?L>(51;-9mBH40}NjO36%JR8IS2L|JN*oM}o ziyMYy{h6pzQ`M78{T)`0kSZPbsM~h-;8tlr`s|_7xYFHC3(@Z?<{v2gbXr!aDCS#m zxw-Rt+(C`ni&bOiryDg8bqf|lZYSDBonURPYpkl%7v4A~>+&YWim8U8M72ow#b!Pz z9v8i~_G3yh(O~JJu-m{W@Eyo{kdphd&ZzZKEB&7E^cx2yjgwuC`b?PZjG|P1q jxbg)n3~S58wVd zH=>qI_p9HXCS3f6ab1p$1(P29J9qT#|0nVe`a QU_O}%NGl?N6 O z+3vSuA80Qt`E$=I6mjVs3vH-`FWh)FZWQxWn-|nq5KN@@ q^8LJ& z;AJE?CYJe@z^nCy+-o37Y1X}eLZ7gh$ _tC@?#zCj6yGKwr+Vwn7v9X)*>1bdJ`v9{oYS{r+HqwX zDt_&i5QP#ip3ZJavkzh3%-XwSp>cZa(_VcgaOV@>ihVMPjZA$1pxM4^Wc-01GPJb0 zV>wfJtr94}N6-19T8v(yhAbtku#QTp=%JC453L$vBZxPuljeLek-Xz&iM&d34(1}u z_i~Zv&EVuWANpqf16IweM_e3kQLSG2{K@t_i&PCkd_ggar25J7=A=sPGA0*6MDxyA zEmeytNgMFzSX4;peKbY91nSg}BUb{ttpe~kH^Aua>kraWJvW&o4{^_A$nJ?o?jw;T z+$C<*F)HYNlNnL&nG
sV^N627OL?JyTFjto@?J{}p)ywm;fSZAV?9_st-_a^yyhjzo;RVl@ zR+k-ZDBX8b@0YdLrk7-+rjs&`7lWxAwMZjLF!c)9dgP&OLy%N~M{SH-!nLss$W pwe0%Qe+3Jk0-VTY#b0QdAb3=2go{OnL@xGAh0gQe zhKLi(({csxC*!i_@soT6)ae<6it1iJFza$F? ygzo$0={}mVNFIZ2%Nl$U5 z8+?Io2F_{fD2vDADIQ{gi07Z<6+oa0a`Kp;kh&}SkZ|LoYHM1tpM GP!ctBf=A#-b&$| zfy}26o>>@(lkRfmC>UxvBe27l+d&q8k*F#%?FllcR6)p*g5rS8Gj^*TYy @N;KXql@@@q3nnR`8{~4gJhGCa}LrA|NoC5?a~;g5A6Q?HCjD-FW3zh6(Ts$Q^sO zT?ry3NGtzFx8u!G8x2tnJ~hicm`By*Zz1YplGWet4?mG(NV^O{`#s>F9;g!vupzmC z&{M}Lb=_XOT@u)ZbfOTn^LHtt)6aQ#JV60hcA9CPytIrJ3#7D+eZ2zrR;Y^%{HG24 zw>|JD7lh}#2aI!}Dl7Xfp8*yNdzZp(ZB%waQ*itRXJyjJ;Q?!%X$K7yrsw?CpE`2W zj)(q4pV%R3Aj~-tAwTlQV(vQ}%hw pM_z{a=-dC49#+2M-iN!SD4`pf0X z?v%DMAv)Qfp##Tf4f-ofF(}a2GylZ1rIt2SH@|)XLUh6H$Lgn_@oqF>VOob-U0(n! z g#a-* z5wq*upa_|q_MK$E)p&*#Hmm;+WKiIL$_D+ }!z6H8(%FOcME*{Wd9F+tiZd&n-JKRIRXe$58p(s)O%W*i# zN$>~dDCoVBW3Xpd?iqivBZq#vw_MqF -Ddzx>cpO`Yes 0~vY-{4d+hoAY7UPN8NIDcALYw%Za?mL$x& zhY93pL1K4z% 9L{m@*^sjz)Eras#N)mGUFH3H5x{q4XGzHqB>U~Vo9la zNx0c7%DqCf#bPcg!!Sfi{0cI85UqbxjtTen)~|I@Z+c@=s#+(lglIa1JKF1l4H2UX zE H$=oAhmy4Tz>FR#Eq=uKa$3RKyNXD>Ic z?So$e{rOV7Wa5OFLv>S=+aTcT&@SPxEq|k{x |-wLeISk1-IY_fP%HySd{K^ddD(I&ueEP3%!cn zD;`Enb=SpRjPoA_eIe)TGxHb3E>7Et-weR#<{P><-JUZZs(j!zxDnmu;9d**JtTY7 zT+mXw9g6frN~exRW3hrh`nK5~Gv8?NV}(gNii1fdWuJ84NUX6NXLxW^{MTiNGjw}z zD5wIeWiHc*Z=df$^{nG3O(F5n-DMr*?A%mX7XGKo6DU76dF6+V3Ce!3S34pC(&eeX zvn5sJ 4Wmdc7m> z!FK7~lqvWZ%HS_8< @9NS9<~X`E2A?#i`BSFjZKqsmTWR z(GQR?tGy#baz15_I;yYtf3oY!R^N2;RHx5|b@|edS7WgT$szowwyF++o9XABMRC_8 zVCHICjQogiom*MwASs9`k}}W0ptmu8%A&d3wNdZB5o}o#0Q9?6daaN1ZC4DR=RBMG zPN8<3XMw*}^9U<2qew;dO>p<}fH9V|r#ex*{h${aSc*+6wYd18UWT2}YYn6*Fza65 z$RU7~o2Z>7er0lj?&3l%anE=@He6bz%M)a&9@rU<%%)Msrz1c=Lp=n+Ve9)Eya#x} zwPUhgOzGYENuZT23~ck=6TeM@#Kc69wB`TfTe@YX$49rU)4RU3df9nr%bWj(HW6>% zzrCcRE>XMs(H0X|fL{VFExtDv{U FS =Rlz_(<1y9{G26C9PS-wr!ry9B|8_e>5&cvyUz}CV;_w+u z2D4XlU*`{71w&oH>;b&(dQa3F1v?G|=uEDYP{wKK#TP%ea76uwEVFiF(GLF|y6-<) zPlA#o>Z_LXBETnI?i&A%`@@_EK9I*IUHQT-HlhJ*zuTj0@1zwg73j?`d{L+XwznD# zGiAFnXBAq< )YHsCe8;0pAT+! +JS*G(U?q^+7dk-4p89{76)Q}M40!-f|lJ4X)c1lOgKt?xmhNM zH#-QV0bH34NQU22;uF6P## t6{=$ZNa%CdFA##9N%w5zw5r7^WGJ8fcpRHN0J4PmnuPX!=E^|(;6rlVj zU#hjKz )?-rN!GtwhZiSf=g)9malFO*0KaGEZ9 zDZZ-*bp3wP1fyeYxGn!Y2(F|MsW&b8!>JK9)MULPCiLHpMb*w~?#{Fd$|R+Bgd>Q+ znQkAubBL;emLH`$#Q2Ip^I_>5vgc+=9^GH)nqTj^`~+04ETiuahYRAXVzpD+ETC;; zo8g+uqX*^!D7&567BhMxYjo2GK6|tJYUE^_U8@^3yhD<0(o^#GfVf$FF~K)Nj)(%j zSIXuDs*y!~o?rOFZVW7HdM+8MuL2xkbl B=GlwBt Q)}ZU!y# z=1FMItIIx|BMz33o)oc}fRP!0)&)oI0kYdILLF$NTuWYBT@Q3lo>c)UHM*~t&%vVZ zfggX6Nbg+Uf7;` ^n{0q1k%1;fJchV5>S06U$3 z<91~VG1oRHG|}<&+i=?1AwIe2p7slkA}&aKqe#09yI3?7M+x-R;M}#-Gd|zaydO+Z2|kxc}RNSr&l#4hlXh@ zsxB?qfEX$zE@Ou@*IZ~n+wYhb$7US>w7VTYIfmqx){9JtU|TV(dh7_kJ@`(kN)}-U zW|zJ%di+9IBZ5D`dNN0rQis2$qXvbG&5 ;Y^Db%1I+CD^-ZS?FPbVrVl{cF&|rL-cXR}o^7|9Cp#SH^ zPt07z6pR@>iq&oKYL}*NUO_2m-d(7Pi5$FBdR({!dkRZ0sW5P&pD^RX(|DnARUVv; zg}Ww%)R$8Qp$%hVW!@(T9N|~N*+?KN0qNjuT;CXe5(rNAhSR&SyoecS1h%0w^J5eH zc?*VFWtQ#&tK5!dH6=D~@>m uCN`uy$FChOY1ig4Lasbn!Wog#p^j&|jHnWyw0Cxc#Lq0n z==cWH!DX5{#)L`ZmrCzxsO~PxujrZ?d ;F8Q0nv6Le@K z+m>Uou5N-38DUDPg`*oSqe7`CUj`jaQ cAg#VbAEKa+VonEQQ)N!-|+*OZbSFp^}`WAgms!@1Rcg7ZN?SWZlbs4fJObo zB+rH!WskaM?xWRW=7^<&rrgAPsuMMjc*x>OkDV<{^IG;?n;28^5%8=KxyN%PDpJ@g z2IG<}Dq9cZCh=OmIGSLfhja5r6uN~bIeW)`o@-;|vU&^Yqx7+ ubb zu*dWYPJIi8dE|E1@Pj1B&3JA=noE*c ;JcU{Dn7Ne4mR8c`5H)$- z(LuiC&0dKlHOpvgbm)oYok-5|RX&+29j7Q5;pO6!qGOJu@AJv+ULJWi)i2`