From 238e54df7f9920e41c4315a17b78b2ec9f902f53 Mon Sep 17 00:00:00 2001 From: yangzhengze <1403014932@qq.com> Date: Wed, 6 Jun 2018 13:23:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=89=B9=E9=87=8F=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=94=A8=E6=88=B7=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/UserController.java | 5 +- .../system/user/service/UserServiceImpl.java | 84 ++++++++++-------- src/main/resources/i18n/messages.properties | 61 +++++++------ .../static/template/用户导入模板.xlsx | Bin 10519 -> 10017 bytes 4 files changed, 83 insertions(+), 67 deletions(-) diff --git a/src/main/java/com/ruoyi/project/system/user/controller/UserController.java b/src/main/java/com/ruoyi/project/system/user/controller/UserController.java index e6374787..ed2c7809 100644 --- a/src/main/java/com/ruoyi/project/system/user/controller/UserController.java +++ b/src/main/java/com/ruoyi/project/system/user/controller/UserController.java @@ -1,5 +1,6 @@ package com.ruoyi.project.system.user.controller; +import com.ruoyi.common.exception.user.UserException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.web.controller.BaseController; @@ -186,8 +187,8 @@ public class UserController extends BaseController return Message.success(String.valueOf(rows)); } return Message.error(); - }catch (Exception e){ - log.error("批量添加用户失败 !", e); + }catch (UserException e){ + log.error("批量添加用户失败 !---{}", e.getMessage()); return Message.error(e.getMessage()); } } diff --git a/src/main/java/com/ruoyi/project/system/user/service/UserServiceImpl.java b/src/main/java/com/ruoyi/project/system/user/service/UserServiceImpl.java index 4027d5c6..f2adfd88 100644 --- a/src/main/java/com/ruoyi/project/system/user/service/UserServiceImpl.java +++ b/src/main/java/com/ruoyi/project/system/user/service/UserServiceImpl.java @@ -210,23 +210,26 @@ public class UserServiceImpl implements IUserService Workbook workbook=null; //获取文件名 String filename=myFile.getOriginalFilename(); - log.info("【ExeclfileName】{}",filename); - //根据文件名判断文件是2003版本还是2007版本 - if(ExcelImportUtils.isExcel2003(filename)){ - try { - workbook=new HSSFWorkbook(myFile.getInputStream());//2003版本 - }catch (IOException e){ - log.error("获取Excel2003流错误"+e.getMessage()); + log.info("【ExeclfileName】={}",filename); + if(StringUtils.isNotEmpty(filename)){ + //根据文件名判断文件是2003版本还是2007版本 + if(ExcelImportUtils.isExcel2003(filename)){ + try { + workbook=new HSSFWorkbook(myFile.getInputStream());//2003版本 + }catch (IOException e){ + throw new UserException("user.import.excel.fileinput.error",null); + } + }else if(ExcelImportUtils.isExcel2007(filename)){ + try { + workbook=new XSSFWorkbook(myFile.getInputStream());//2007以上版本 + }catch (IOException e){ + throw new UserException("user.import.excel.fileinputx.error",null); + } + }else{ + throw new UserException("user.import.excel.filetype.error",null); } - }else if(ExcelImportUtils.isExcel2007(filename)){ - try { - workbook=new XSSFWorkbook(myFile.getInputStream());//2007以上版本 - }catch (IOException e){ - log.error("获取Excel2007以上版本流错误"+e.getMessage()); - } - }else{ - - throw new UserException("1000",new Object[]{"文件不是Excel格式"}); + }else { + throw new UserException("user.import.excel.file.error",null); } //得到第一个sheet Sheet sheet = workbook.getSheetAt(0); @@ -236,9 +239,9 @@ public class UserServiceImpl implements IUserService //新建用户list List users=new ArrayList(); - List depts; - List roles; - List posts; + List depts=new ArrayList(); + List roles=new ArrayList(); + List posts=new ArrayList(); //如果行数为空 /** @@ -247,14 +250,16 @@ public class UserServiceImpl implements IUserService * 获取有记录的行数,即:最后有数据的行是第n行,前面有m行是空行没数据,则返回n-m; */ if((totalRows==0)&&(sheet.getPhysicalNumberOfRows()==0)){ - throw new UserException("1001",new Object[]{"数据为空 请填写数据"}); - }else{ + throw new UserException("user.import.excel.null",null); + }else if((totalRows==0)&&(sheet.getPhysicalNumberOfRows()==1)){ + throw new UserException("user.import.excel.data.null",null); + } else{ //获取全部部门信息 - depts=deptService.selectDeptAll(); + depts=deptService.selectDeptAll(); //获取全部角色信息 - roles=roleMapper.selectRolesAll(); + roles=roleMapper.selectRolesAll(); //获取全部岗位信息 - posts=postMapper.selectPostAll(); + posts=postMapper.selectPostAll(); } for(int i=1;i<=totalRows;i++){ @@ -270,7 +275,7 @@ public class UserServiceImpl implements IUserService if(checkLoginNameUnique(userName).equals(UserConstants.USER_NAME_UNIQUE)){ user.setLoginName(userName); }else { - log.error("【rows】{}行用户名已经存在",i+1); + log.error("【rows】{}行用户名{}已经存在",i+1,userName); continue; } } @@ -290,8 +295,13 @@ public class UserServiceImpl implements IUserService } //密码 String passWord=ExcelImportUtils.getCellValue(row.getCell(3)); - user.randomSalt(); - user.setPassword(passwordService.encryptPassword(userName, passWord, user.getSalt())); + if(passWord.isEmpty()){ + continue; + }else{ + user.randomSalt(); + user.setPassword(passwordService.encryptPassword(userName, passWord, user.getSalt())); + } + //部门 String dept=ExcelImportUtils.getCellValue(row.getCell(4)); if(StringUtils.isNotEmpty(dept)){ @@ -308,7 +318,7 @@ public class UserServiceImpl implements IUserService if(StringUtils.isNotEmpty(userRolesExcel)){ //Set可以去掉重复的值, Set sets=new HashSet(); - //判断是否有"," 号 + //判断是否有英文的"," 号 if(userRolesExcel.contains(",")){ List results= Arrays.asList(userRolesExcel.split(",")); for(String s:results){ @@ -330,9 +340,9 @@ public class UserServiceImpl implements IUserService } for(Long longTes:sets){ - log.info("username={},longTes={}",userName,longTes); + log.info("用户名={},角色ID={}",userName,longTes); } - user.setRoleIds((Long[]) sets.toArray(new Long[sets.size()])); + user.setRoleIds(sets.toArray(new Long[sets.size()])); } //岗位--多个岗位以","分割 @@ -340,7 +350,7 @@ public class UserServiceImpl implements IUserService if(StringUtils.isNotEmpty(userPostExcel)){ //去掉重复的值, Set setPosts=new HashSet(); - //判断是否有"," 号 + //判断是否有英文的"," 号 if(userPostExcel.contains(",")){ List resultsp= Arrays.asList(userPostExcel.split(",")); for(String p:resultsp){ @@ -363,9 +373,9 @@ public class UserServiceImpl implements IUserService } for(Long longTest:setPosts){ - log.info("username={},longTest={}",userName,longTest); + log.info("用户名={},岗位ID={}",userName,longTest); } - user.setPostIds((Long[]) setPosts.toArray(new Long[setPosts.size()])); + user.setPostIds(setPosts.toArray(new Long[setPosts.size()])); } //手机号 @@ -394,7 +404,7 @@ public class UserServiceImpl implements IUserService //批量插入用户 realRow=userMapper.batchAddUser(users); } - System.out.println(realRow); + log.info("成功导入用户共{}个",realRow); if(realRow>0){ //用户和角色关联 List userRoles=new ArrayList(); @@ -407,7 +417,6 @@ public class UserServiceImpl implements IUserService userRole.setUserId(test.getUserId()); userRole.setRoleId(test.getRoleIds()[q]); userRoles.add(userRole); - } for(int r=0;rYWG?z4zWrLiFea5#6eb)vaElE@Xvmh)IG^&`t7%`*bK$}br7SZ3_{Jiy4(h!_+bBT(DzGRt=z5ngi!BT!M94(>{K1qD68UJGN z`Vb{LU2=qY&YUxppk>i6;goZoB1YZ#dm&&1g$Jk|K)~evyRavJiaW zUkv-9Jq8@Fsz(=S@5!!Lp;=jz2lIRii!;PqWC}vme>xjn#%u^Vd=68TDl;4^5#Up9 zY#-JO3LFqG;yCfIZ9El&NTmt?N%Q<*$J6*E+j^ODirA`*4!2FhRTE;!47nJz%UEc6 z&%N@%Fkr+QCy@Fs{W|pk#*^Xf?C3QLOm^gn3o`&VGHoQYg@`=<#_&pXcxNpD1ck!r z&9;!{pL;`TE2cW85eyxRt05^ix>hdx6uy@-lHWS)28Q#P!5=SMXS7tZnfJCB@K0{$d)@V)<`dc`5YNZT_uDb6i44 zl4=PI)hSE?^&VL0eI7)E$4FVQl=_r5!LypzPli^qIh-x7KU-pf9^dV z3lOX2z00WU{uMsApeO6A2txh5A;?s8&7RXrd6&l%sle6kVb z5#8%j;F-amB|*8XP?GX^_(S@=MZ?W!shhK>dt$Ke#17Q(ZT9yc zz72qY;3$9GhyJX1DexV4(swPVY{E>RY46~rQ~ePFeUx( z^<=3ipc4PxSCWUa#6Ya3QSqmR&4q6>D=2){+D^YF0tN4h$j&!Aw3alh7Y{DI{<$7a zYs8os5KBuH%S>DV;2Q$~Kmh;%0^Eh(I6Hbc{`V>@7~tW4WHIi^@QkdBW?zadSdV`x z-JUKDODk(@-rH_b6UJCY)iN5_VVRl%T7!KvFP5Kf9zw`ZYmus~00^cqb&3XEV4^rb z2|?+6E<6T}g|z$D?q9Onn4O^K=iWn*&X66?-YFLH^qW|>||bNsSVc6jZ$eg9i<+m8w!4bCYV@v|hgLwx*&;GpY$oJA9;Y8WuT$J#^K z1#_{S)B2yYDQ+*Vhi+1sx4V7b}F?!$=G^PvHWopJTH0bZpm0L z>*`ul%g-1Ci4{>2%_Pnpg<3`OHw7NSn{EJWzMWGZ!jHD;R?k(6DqRigIIc)&JOIw% zK3Ii%(vuk!OSv}%mz9Ed_>%%30xZOiVMjA2%O7AKf5~2 zCha=ib|imTAuW=={pBl1cHoBmvu7=Pb3a_RM=BS3wuVI-Vubc2UoRm@+n1D3yp@h< zp+mK0!Ry3V5_J=+AR<^O@Cq9eVTTtG8l6kJ0IoatBq*k4K0P>1wm($hhr)tHPx|Ar zR(A@Xww+4as2%bKw25f5b^8eOZ(Rz@UVQi5nj`RV%fYBr9GST7qN6~K$v}-_*wP=x zT!_em`$dk$5Xsj5F5GS3LSsCQ=Dy4wrjr~?#)}p<>rli&Mu(ih(aUG!KLqB`W32}Q zKKraC;K%2*8!Thq+a}V+;%D(k=x8cX7;(*_)3+Y=XcbE>-nci)v}(0XX*19Epy9u$ zBfFv^#y{I`IF|LR5USwG<}N(mQ~5^CENWli@G{?po~Ds`2&0@^HQ4eR-LYCrb`RPL zpN-k3G;)-p)S(b4UzVr#n=AHysWkEB*UKb@U;wK&l@^&Bw3l zdlN63AsfdMVT{zZH_0g$3XZdn3TVkuN6QFvMmz zzQ8h{szbZS2~W!yp3j`X^{Jw)XoXu@aZ`e&VX^z-r8cn&~I(ms22-Zr$@ z1CGSpgU7f9UB!pZf~rfGXzZAK^?}G#nPLujC>K88UT`+mu#W;~8R728Sl${(Y_y*! zUfn^bjJ$9;(iUETOXMl`uzC`R zVGNcce%t@CIgtD$mhK8H0N_0#06_fT66X6R(B0AZAMxrp9Zg;lqgAa0G7w3EaaII5HJuUhZ*w(4SJ?o`CDDGAx9)&R$Vw07Qp6VXH-9%coml1y#bkM>HsY1BML93RLRyEvJl1){cp6Ec4Ru*kElkIc{ zDTYg2P^VX+p_st5d!P8MT0)G0k>E@B7-NUNh=ZOK^}yawa6L4GDeuzob8A2W-(g-R zv3Q8-1v~W(VD-awo)qN5~%1RRjz@1`q1WZouTn5LC6 z_rriNiqD(v9QbfHE8KM zBg2V$ZRXpmKlr!$Y>i$p)$aFCh(Obnt1kFZqCTejBHBBi=P5D~N#Q@YZKq3Qw>Mg) z0Ac=c$rIIbkL&5?_a)b>u~cCyANC2%=VQ?=8qTtWV@m@=85U5v&%wWc7j-MJF|9_6 z1rL_UpWqYPn8pf^aR%Ckxt1|N@WF>KN^47vQtthOlw3W8JcO9@HV$&Hmof^CBV1ce(xUgD_ME_o)55H3%@F3wAZBz7z?PH2{- zeMM)g2X#Ya%za(iFfvZ@{D|dZzkrCMs;Hr;*UB*^IxhyDob& z{VNi`puM#~%0S(oD?Xc#D_JnR#w0Bu!vFe}Pxn>iN=zq?Ley!Q3Tl(26iQ1h+fBdl zL^}7gsLtd~56-gD4~@s?N?i$|lRS!({-t!eQs)-5QYuGyH5Sd5C>7~VCb^`JllHC+ z>rJBTfD#KO35rTeDUSI!R6f9p2is`j0o7hmea^MqKYo-Dj!n(b^7p&)6c-*#&jiUZ z`P;c*$~ChCIq>DS8snbr0G$rJV!YJw>vwyd$H~)+@)7Ltuu!4JWIF_C+#NHzuRYth zZ6V=yuR>L=f;gKM%dQrQ-!dRkQIqK$v)W-&^46Hg$XBw zE95Ym%~$gi5!ae4X@jXK8jLj8AY?$TPST{AM9M$nHUlAiBG*$^1() zAM*@G2^$F5xE^#zxbRkct;rwLlfF)jejet)XSyKqQm3b9Ll#$?MLr<@waiJG$7fsX zr@ZDGBrW%xdPQ^_X4JjOQNrrzj3L;09vvaI{Ju?w)%=Oia%F5M}aST z+#mH%OXpV59_KVN{16u|#e>*8p4arf(H20x-wr>UJLc+f7t0-Nde$I6BTGU1Fz{0` zWN5A^x=|{(+$%-yySdGg`HV{{dl`4ULVNZP()sJF$Cqbn3VF#~^=)B`H=E-xDYUYH z0($r`BKBvnw)CW?>xVmRHqd2H#69`x$QK4FL8pXMeA3vraijv6j7SJrRjHqlEW6XW zt+h)AL`u%=MgEDn3cC_EWu?(po_&ZyG}yyhyLP@h@~w+R zj3O_hp-#Dw$O)%Yc_@?8YSM4gDoy5A@!}mY%GLBH9TVmE!p{KU%a_R~`mm3P@%e5> z^~M-iRRzPrRMX{F1toerbfmzdLOGjqM~aPyLhS0dbvf>uYj`}}r0%E(uxlT*Y}FNk z3%!S)djU7HdbRqj|KPxD%0XNh5Z%?sWYCk$fY>4bd5h&z*Bx3DAXTjC zhi0JvLazG<$xn`?)1F0$Y^KxzEZxt<>e9GyW&Wk!s@B|VweIfRM)4(4F*g>@ZL6LN zc!49jSt#iR&5_Tq<5S@1BVIG!LlC7qFurgoiqwugG&~O1P?cJc>Vqng$OOEu#K1)n z@{tYkv(Z4^#nRW>M76JKVS!lun_6Jlm~9kVlbf_}B9%C~iTYuo`2xAEWme+>w&Cf5 z+9a8(8;vllsuhLAEG?-+P#nM9IQ+SI}zsuJuU>O9nM7NOAwvg>Qos}F%U!F=N1m1;>* zwcCp!>9buCk@tfWHfXSI(QC&kMdW*G-Yuywv%;?@AEQacN9h5v&rl)v{TDNG>%JS< zJD=E(N>2vwHM4DZ^r(7A#eOH)S=8WjfNWZitrQAoS<8;KcUyeixUGZM3D=G(>Y=29 zl|@|FsDcT}YJxvEnL8r?yfoNzD}shiZ@{7$kT-B)rIm=0cZ~SDlpBgZ3pn|5?9-kb z>&k0Ch;(cY8Lw^=UDhI0SW9Bii_*s><9!px4_TyFHxFtd#fqKeJ z{DO^MYqfiyZYAQ-uwSvKH&?D^IWtEhXoI`(212Mok}#=lO5oXnt2^C;-BUCj3-ALN z^0)`H5A?W&jl3{5GDZFNIFAV|4#lP1M|;29xte77!UJh3G2_(b=$jsVR=B0R6iK?Z zFB>31zw&8(Igpucck&Fid))$Y<@IajBYDq@UAc+@95lgs_i}5Cez%YFM*x?CG-Fv9 zf-`{GKRjIB4j|bt!*_CysywDQStBvx^(op-5MXJRD_R>$_#-%_uV2~o@aWueS%J-4 z^@KWOjI&?FW+?QUpxU}=inRdie-ppAoFa_>Lzw;&1j@hG>)-K}5Z(Z!hOcn)V$u@B z4~aS8{9I%V|DQJen@wEsr`?iy*~3H0>vA6#UN z|1@CUUo1)X*A$ZdpQHi?I6XJ(f9emH=cdMVXM&q^%V2JT;o00qm@ir2N8B8^k(Qwp=}@|)yFoxeVgM;=n4!Bvx?4aRK^kF(9BCw_>-m3o zt#{wOXRUL-oc-yXeb)Y+U7(SsRmXvi19J|&)Ib3MDA1wLvB@CCI%{v>0)#<%O;3Gi z{!uv*O|R972&cGQwAm;nnUQUA@|KD%v!$=@kHKZdbXL#EVv-vJ?I2ex3BDg!=gEw4 ztxEK$N;%M23flOJjcl$LSJVaiMkGpc^c>g(yU57%e)I%oxHkC(&D>G}gBz&$a-3!a znz~3u8aX z6?DD>1C7Uq2<$~^Q5vF`>l0(+G zo}PJ$T@g{=hV$Aa?kB(kcB8=iiEHu}bDbzQCvG3iYAJEFKvG4`%^x4w>1MvVWAp{& zLNIY!o$s>u zulWk~N3xZ*Y77s?TBEu@;Uy?M2|Spum>00R*my9W&-kMgU5}bs)^*?J-+v9{9~`28 zk4!7~Ppq8E!c%;)+=AXr~a(Loehop4MB&S>Z=-+buiPMPs(S>YP_#S(BoZ1 zFNyDIyv8+V-Xjjs^dU;e?9v!gEnD%?B+m}yxgVJB_cBm+!#%b!S}x;Z$}P4q>gWTW z&+?%dln9>;J5ZZ63;VCVNT7!}bdYgJxGd=k#qBf8h0kn;8g((nvU2z-K|)R`0^qEnkwZzJ1cU|gj#$fQHvpaLN+tqv|>m3&4t&mHN>?w#)< zY4qVC4LH~r&l`eGXM$0ZVrZlt4c8yLZv)6cuovYUXp}E;y%^C|FDGc&OCV}Q^-)H> zRy-Xgm2(&7yHmvRjKpH)y`D(lKYDGc=U#PVUzZmIFtkXr}pf8m#6_U9r=CG_uX=x(Yi~ zGdbxAYv-+QlNz1(JE}bp-w%*w?&L&<>Jo-LQ^S_NAu>zVj}O+zm}WAZGwX*-0(A5g zV<-3KE#4=?QKm7YKQ58hcc2IIvQx|;K^3I;qj%OZb}Nb(A!qX5`bv}7t%>VV?O=zY zRV5Z|E&6(Tc&w5HOJq+=f{#EzQ|TZCecxNXvzpg_Ms5F)jTqNVYBz2=I9$4)mBd~zW9feO=+|9ZSBUbx-?EH`s98xTe=qI&ipVO> z1Fq3${Z5T03Z2nCll>RAUZ>Lw);xJg$jIyX-)Cw9^{9i=$uXm8S=CyV^OYiUwS2IP z!Ai~PSn&Cl)0{R_gbrH$+;6i+B76!UpB8vp>n*O}kT-p0k|U+Z%| zUl->?BjYzTiljlcb58=xS7}(xB+S=hx)JE`^jOPPxnrD<1TJud~ zswI{Df#u5zD#dz^w{|L-TXq|KzuWbOuJzqu1z4)e9r z*sRgpo_9Ee%5tkE4m!B5&BkfuD6C`}o$05rxlmwIU-Q=0T4!{cjv8@juyl%Q8~K2W zjjE84U>MxMbel?f!!RKRjk}F>T1|glZau3mV@b;)h`mo3|7|phdFTAWbYeb*%>DKL z_^`~HKbB12*;@r@NWKn4IgrKLQeTykprG%=)i^a1Wju)Amj-VHW_pAvAYA3eqfnFo%mpo(aR6p z=H_lBSPkaskqD`s)2EK}!*r7+myro^GcnArZSzHqrc%G+m|8BV)|(7O+w*AI4(A61 z6u`a>gQ6ldy&Q<7aw{F`Q`e>Vi~v)z5oGE~)Yiq3a#-6K8WN$K02}cwVpo{0YV{25 z{lXgAc}3wMk_{4y>vgFI;&63PPsBr?(BW+ZzWapoYvSB(RT2{YcfR*}TAF@1PN0_* z?|91D+9Isk5auH8dE7^?$$X6r^1mHCP|UkMZHRi>f=BWP-3~kpyQi*w+Om5S6nOb- z3z=XV_%MQMM%1Pq*6Q$zb(uBNK9ZwO)QVEybB4&S2x32+EJ&lL22$*)aKtiBW_S&RqIwg-nM7!$}y%MKuhj*AEN^ zrP+KinRzxdwL;2R`o$eTe1=J9@&XTd#UI!s9JjsiFlbo$v_Kul$oBXb{LK0{K`cYc z+w&Qv9z=H`h)BXg`z&sTfKQ!Ng|&Up#B=tKAaI!Yk#svDqA;mwMqKs}wCCjdOk%@T zn!w;0iCKyv(PwP~{rrf#!lKoL>?u=@unjo`8`{ckZ_&#fyZDJ=m9?mX$|@o=^OauL zs{I3)QmC4cP)6y2js#PuDzmhFUR+;&zfiA3=%Daq*19)`mxbGT>I^UW5k*KAsgX<+ zgrZinh4lo4=Hp4d_?r^knc9>3=u3w+3@ICZJ~H0jxXm_|C^Rc;A=B)#oc;o32sk@L zT75Uhn<#$70No9oPrT^%k`i+mb`5qNad=Oh*;9?QAf@%KLROf1Nw(O4S5MWx@Hh?M zW;?V&EPNWH@AgDP@NF8rOoYWKCe%+Ld2X(yTW9jBp3^h$nuL4O>b@42Q29KcT94(B zv|WX&(OvxkS#>)0j&ulyi$FpNv~f=jl+ybb!2nDOY-jt#^?kX@%@s;J z0a~uC4I5U^g{0S1X#zrmtrNm2v`80>B2tA{wnK*Vv;0mnpXV`-m*Jj+oI6pFxM?my z=v+bmi;4B7{_UEsth$DI$I2x{NlKh!sg--Gs8NIH>C|meN#8`0$VMDhpTDSqAHD6Q zkxzQjOaGPm53SPF9r7{K`V^y-tJt0ld){wu%bl}@V^cnd?|T0h}=U9I{vv zwARNH`Yrw~Hq9jmdn5K@y%@!Vg<(WSXY<`aXpTf8c7Tr4#1u~Apx zz>l|AJ5Hl)5P^dBZLJjj=d?HP-i1)(QCM;~n}c!5Jj-7hs(nihMy1jQGa9X% z6Vc1P?E_ZaaF2vMI(bf>K?EG|NmQEUSXe=aid^Jj&T@u=(>^GT?|Xa9uF=Io|&3j?tU457MF;KbGlZeRNeJW2VJg zpxf|j^Xbm3j9f<@g4KrlJdZEUWKNcYjq}=W%~Z5+d)tdc)3GYBAQn^hMrJ4PvyNq5 z8w;yz2Za$ z_vGkct52St&<9tG;e|nsMJq?8Wh7@Myl5jP)+6>tEN=7b+mlIp@sDH#U+&bD{qX`R z;)~XKztQ{1of+>?qt0x}{KIFE<-a^X19}tja8be@ zid`^ahtox^K}2!BDO@%f4b)+ruWwZ7%uHIL^`{2G+`9VlQ0~uyCtqL|#;%o@(r7B; zP_$Dc*pWg|p5W`vo$bgU8+{=!MQc^`A3Von&4e4_AkH=0g)2y_lfP|&o`tC;yZC4o zszY_!&7xUJwS>U?MwZu1!Rs!zzhREs@w4P$E##$&aM(8$HtRUDfU)XX(d6}p`7Fon z>lzxcNGW2UXxsagG?99|^=^po^@_Q?7);Y!z<|6m=H?481+g1t`m!Gr-`kzR8O5Bi zr(fkGRRP6cO2Z+f)#YPRPgDX@ zFp}9uAT$3EGdx~j)XG3+wa98X!G9Wias>{l1{`tP=b(^y(IPQh9q4Y#8w-pf7+osw zNmDByR$iIiemufe&PkFFb%x!3{ z9`k71j{4(rVV`0)EkTPYJ0PnvloOFf3+6Wk7a-;vYUwF~9x35oF9MT>vZ|!Jus?d6 zpLP_X`0)_U^fDSI)!nh-nOWV1H(Q)6DJc7@9V>fgY}CGPVOmqoXHCVv+~T$!&hg*~ zV4F7KkgM0uV}ZoCBd&p~iw?covG1WmvJ?mpta!X{^tDe@*V;|={wOq|qdy|$O}zUd z&aKZbrJUy+#QN305p>AoPwYIeTF12vr!dc;d^HDQuXv&QopV4b&CoW`_v!I?4HBXt z8HVk0340kLok-ft)A@WNv+E?#xrj!I@wahdMWI!~gIITn5!`8ZJaW4=px_D5hC??$ zt7&PUl1^Kmgzb&ywX9T}=v&j|cz`0Z$DY1b77iqOd&_4|DTB?;r5t{xwvtOOyiCi%NBS=F;y2Xi5;fgm?N&?ow)f$%J;^I@U(_iI&+(o`{K|Bf=MCMv!Kix; zMBacuee7A{tn&34%xm8pcSqp9u)Em&-0>8`Y*@3}cUlnZ27-g!EOLiS<|DGApwO}$c&FDjPKxaxGsIyo4v z?L9GbVKLKm^q2bMHC?_1BSe399tZQgz+6;l*f1hxzIv`_qn;ng=@!y0DvU@BY7$xw zII#<9x@p~CjPE-}C)GDi+H*SPZnB77e>}aM2;jdc;uLSi!fICbu&7qS`fCv~kr17( zh$P6n{b(cKc^XUDw(vQ$G8wPmU5$&&5kW{Ch%L9>ZXUq7)Uw&^!kC#h7y496IOf$9 zZ4&yWJP1+A&CZP;)eH)k`Up}WQ#}%Ep7S#4?|3#HCFnJELf7l|Gvo9r&#)40c4h>D zASxuNZ^EeE5odn`|B9T_uW{00^{!PDsNb0*wnnnw=>S=A= z!@HL>?TXibc87wHgOVhK7Oh;xez}`jp!Ng-!|#EQ0VDx#xfe+#2biYsZD0J15_rGY zo_aQoeY{ai7&U}TnWNbRl$18d4v!EwkAmac#&30A2GdzOG zxYu*?q|>3Z7?h90SiyYl7Kw%C5|qAtP&V21&s-ah_*${_)OPZ=xVv$mK-u^l>rDy7b}Ca25~S%QpT4%9KGT0I_^$~3uk%@ zzb}3XnoZ+BDP1VcVWdc2&7%`7sskf{f2wtAwgVnjaZ_fy$=q+;v2-Yd?b=~2{toTW z5UyleIvx*Y9!mt(j`HGExiAxCDM{<*C#YE1wXK$`Xk+H! z4uke=R#FC8C-2S%jtwn#OTZxtZVHh1Lq(b`Q!7TG0;}sF>K1 zVceg{XIdQ#n0tVdbf{N&s7Jw#RX}%N&+m(G)cCtka_`tdtt=J{fzOZls=tkyafOw+ z(31}~=n<(%^ajE2LfcB^72p})owh{ZN?&x5cfd*3@EG1{{9wO{%$}5}#D2U_*<$(M z8!FxlGinT?7Y0IXt*jziP*bE{5LSVD!hgBqib9kMS9-b~z)qNQZT#&!zkJ^CaV{v% zv#zao33t3^9oIz3q+z<~d0l(KZc;FSS&Hry8$q1YTjcHSukEhd?s0M$i%!9M&6?a) zhDhBd3@xGb4+0DZkkd&-gOQ}Tr@NOw1s_K*gYEo!25=xKBs>BLpf;Fznu_x}s>!To z4;X4?FB?KY4~<=yaRZdy&*OFrdT>!`i1zH!`izkW5Gr0xk5B(>aaowWqkJyYcMLB} zd#tFKTd5JxuO!TVkI6%+Pv-kED#j`O8N3adgXRH=zD>zp4@3Y_m_Gw|39t11vScI| zXmq^6YFy`?FrEX+vcNzu7XBljkcbG0XOC%0dJdQ-bJj1dCTvMI`OQZHZ?G#F{yDhD zW5!6-|KIlpvkKAvUq6Qd0FeIWzkd%HF7yLA~UprT^mJ*1$xQOhLOqkkLG^>H)Qsn