From 2b7a351347215dd479c2fc620a8bdb4aa024458b Mon Sep 17 00:00:00 2001 From: Daisy <> Date: Tue, 23 Jan 2024 18:12:51 +0800 Subject: [PATCH] =?UTF-8?q?1=EF=BC=8C=E6=96=B0=E5=A2=9E=E4=BA=BA=E8=84=B8?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9B=B8=E5=85=B3=E5=9B=BE=E7=89=87=E5=8F=8A?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=88=E6=9C=AA=E5=AE=8C=E6=88=90=EF=BC=89?= =?UTF-8?q?=202=EF=BC=8C=E6=96=B0=E5=A2=9E=E4=BA=BA=E8=84=B8=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3=EF=BC=88=E6=9C=AA=E5=AE=8C=E6=88=90?= =?UTF-8?q?=EF=BC=89=E4=BA=BA=E8=84=B8=E5=88=97=E8=A1=A8=E3=80=81=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=BA=BA=E8=84=B8=E3=80=81=E6=A0=A1=E9=AA=8C=E4=BA=BA?= =?UTF-8?q?=E8=84=B8=E5=90=8D=E7=A7=B0=E6=98=AF=E5=90=A6=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E3=80=81=E6=9B=B4=E6=96=B0=E4=BA=BA=E8=84=B8=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=203=EF=BC=8C=E6=96=B0=E5=A2=9E=E4=BA=BA?= =?UTF-8?q?=E8=84=B8=E7=9B=B8=E5=85=B3=E5=8D=8F=E8=AE=AE=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=EF=BC=88=E6=9C=AA=E5=AE=8C=E5=96=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/images/main/icon_addFace_step1.png | Bin 0 -> 81420 bytes star_lock/images/main/icon_addFace_step2.png | Bin 0 -> 97731 bytes star_lock/images/main/icon_main_addFace.png | Bin 24895 -> 0 bytes star_lock/lib/appRouters.dart | 10 +- .../lib/blue/io_protocol/io_addFace.dart | 153 +++ .../io_protocol/io_queryingFaceStatus.dart | 118 +++ star_lock/lib/blue/reciver_data.dart | 131 ++- star_lock/lib/blue/sender_manage.dart | 875 ++++++++++-------- .../face/addFace/addFace_entity.dart | 0 .../face/addFace/addFace_logic.dart | 294 ++++++ .../lockDetail/face/addFace/addFace_page.dart | 61 +- .../face/addFace/addFace_state.dart | 35 + .../face/addFaceType/addFaceType_logic.dart | 96 +- .../face/addFaceType/addFaceType_page.dart | 18 +- .../face/addFaceType/addFaceType_state.dart | 27 +- .../face/faceDetail/faceDetail_logic.dart | 193 ++++ .../face/faceDetail/faceDetail_page.dart | 374 ++++++++ .../face/faceDetail/faceDetail_state.dart | 38 + .../face/faceList/faceListData_entity.dart | 131 +++ .../face/faceList/faceList_logic.dart | 425 ++++++++- .../face/faceList/faceList_page.dart | 181 ++-- .../face/faceList/faceList_state.dart | 24 +- star_lock/lib/network/api.dart | 5 + star_lock/lib/network/api_provider.dart | 216 +++-- star_lock/lib/network/api_repository.dart | 182 ++-- .../lib/network/response_interceptor_log.dart | 3 +- star_lock/lib/tools/xs_aliyunPush.dart | 16 +- 27 files changed, 2855 insertions(+), 751 deletions(-) create mode 100644 star_lock/images/main/icon_addFace_step1.png create mode 100644 star_lock/images/main/icon_addFace_step2.png delete mode 100644 star_lock/images/main/icon_main_addFace.png create mode 100644 star_lock/lib/blue/io_protocol/io_addFace.dart create mode 100644 star_lock/lib/blue/io_protocol/io_queryingFaceStatus.dart create mode 100644 star_lock/lib/main/lockDetail/face/addFace/addFace_entity.dart create mode 100644 star_lock/lib/main/lockDetail/face/addFace/addFace_logic.dart create mode 100644 star_lock/lib/main/lockDetail/face/addFace/addFace_state.dart create mode 100644 star_lock/lib/main/lockDetail/face/faceDetail/faceDetail_logic.dart create mode 100644 star_lock/lib/main/lockDetail/face/faceDetail/faceDetail_state.dart create mode 100644 star_lock/lib/main/lockDetail/face/faceList/faceListData_entity.dart diff --git a/star_lock/images/main/icon_addFace_step1.png b/star_lock/images/main/icon_addFace_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..7affaf462dfe858724706526bc54a883ab7ff4cf GIT binary patch literal 81420 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

ojXJA-WRVO7xt6hMKOt2}SJcK)L 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 literal 0 HcmV?d00001 diff --git a/star_lock/images/main/icon_addFace_step2.png b/star_lock/images/main/icon_addFace_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..81f03981d4ee3321f4f719386aedf61e6112e7b2 GIT binary patch literal 97731 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

jBlBKsmZVu8n0O zgtsAN-R1WG{AHAt$ICNwt3CVNeQWoaD*UcAK7-j=p?)6Aw{Q@|2@7CVRbJJNJVVxR zyoL~y!kfP?wQ~`TyCtHask#t=ay$5B&-y2zE)+=t(-KQ$(nSp>&mzlVmlYq*oVZs+ zi<1b%4$WHB{Gu1`j`9A3ksxY+Mv+4dis!3zz<0~?MO?`iz@X8AypEF6Zw`c9$Cjp` z+#v76B9%>Re^npd?y6Xgp$4CSL5u2&UHST7+@G2C7sEL7*+BxWm5B9u%H1*&0^?b; zVjRv&ir4K{l5r3J%~PD^eb(L2AkX`ciaa$P>65_ zl#*60pL&2gVlbDh(Tu-{yRnX4EOf~B;<)ilk9@gifF8nxx>#xQbaPL;LlAe4!^3v8 zX2cjal|Vz_Ys#iev~jTz?bkkmkl0>;@LNPiAt3k$HQzvF`BiRW7d_n^4O5v}e;h{X z+1k+=bbOGOIM-)KR{sIesv3{E#{UJ#%l|Jxo|tQ_5++&Ah}Aeberzcn!R7XfR{%>du9VwULHh#sB;WV%dI;1*tUIV znmh^-v;5|!I+5;55~mfKKv6Lq$xo@}-WBQR%|zDJ#<0q7UQw3hyIZ@0Dx?8Cn<7(h zVdo=P!B9O_AK)@dx@u8OYe=hUzE%>MOBbG-fh zP3mzo7_~vGVxN3>;I&TFvKBH0qJRWP;X=>ID!%dMQ^P!p)O;ZR_|3v_Rk>dWfT#UClQY0w`}dJM&^FcAJ{UF;g!&NX+D33r15_ zxfL9yfcfDr3RI3LcAcxI&Lgq=XJJdAdBl7R?6BYpjeBm3+l%FmY%UZ5bhY88U)7l~f&@>;> z)pIXLdTqlwz7AUqG@^-psY`$krT4QEkRoINhBIys_n?u2c^Ww<0PfT+2{|+xC-A%M z0$mY1a-kjAw`@)v``Wj*kYL?iN7XrcR=cy`pwwC3M-cThVYD$~iC<(X%# zx?3pBa~Keq0c@uar!6}O#9a=v=q^t9h(k2tyAF5gNe-Kbo0i-TcC#dszx*1^DRy^G z^77=jA5no)aLNqvuuSoqUU<{0x@A&mUmJRbXd}?Hupz(FRt68LBvyd`gOQ?ibKxQH z3=apaCRe?E-PM%4w6+y!93m5FkdmP^76BckrIMMvQ}O~YH+fmiu^a$*y|rr&H$LZ0 zw`~Dvrb}I~Gt#OPRn1*vVo-(nA0Q?XuPBM?IxTi@kddnEuU08|iARODvXw)Aqk)oO zNvAtfh^QMctb)eEhNA87JWZc(YseV2CjKC9MV;0vk3-ghWtQH|Hdb6TbmMSqcE!f> z@-qI1$IxlFt6%*mc2xea*l}m#t)to3=vFxnU&tP<=UQ!Ckla!%1E~a&?XAF%hP;|z zfUfyk1pdXKpl?!8AZ;CXG#Mitbs-K{eCaf4z5QI=YcE;^P`WnTjODQ18W0V zU7nxJ%DC|_!7$&nQg;6j!C?Mh1j7>M{z=J3cAW<8&V|D-$7DUEme*mE!I4}7d40Q;5uWS4t;<+y!HZ?Fv z^^7*TuX2SnF((maMM0nh z*>^Zd4z@MM!E$kvvdDW4%g*3{yd1;NL76Nng^vv=_}8a(VO4*TwjFq1=xj~iW@PQU z2VErnB2KnTdfcwu3*%8JC<(XiBK0vi`O1PmSq8;R3d*o=-zj@Yh^J%c5U`FGHSIDx zO-^5Z21{*MERPnk(GvG7MLaf%9PSEEtfxM+mo$@$4=dNoB$BSEJ!t)ifg2+A!-+6M zRQT6G)bnP}XOOD)2it?+NmT{PymR!Deow&zTDcb*T$}!eh6>#PoSxQgBI{b9v^n1Q zJ2xGYgo)&2D%A9rrU%ZFBD}@@IjBcE!9J9*@ee4#p`sPigskI+LA3=R-(Jev6&4R#W*5dMs89-F%<8n)S|3ybBpd6}Zi zY^Cd8q1`k59ZEHK2X&vA9GR8gm@op`VgHA{ml1^M6j|Ht_@oEhT0wort=NN2JroP- zva?L|QK2=c=YIxZ7K2wvw?Y@aOuuKDNscZYyu|Qc^wOtWk>FWfhq{=JFZO8F$LIGq ziz1HYetvElLK#nxsZ@vtqsomWx+^2?rnB$94t2Uu_I4{1cnJGiHTJsfe5;>XNgbz$ zGJI~-D^~APJ3XPG=(an3q{s$L6(oZz7u8X0Xom`3Nabpj?tI9r?`vjr%)U6Y3y-7+nHp~u;KJsI` zy8X|#Ys}puayY_Eto~eD@L-{5udZjj2Z4b8%F!bJ@`YzDvL$VOEp-E@-a}VGzho?^ zHfeV}ewypdSmj6e-BSkW_Rl%Nr%6mdApLfkUX{+1L&YLmZ-8a4Rs+mPTuq;P_pi_+ z0g~@X9uviY%<2BsV#dC4~OSzJc2W)=_4l@La%>k6RG3my0i zB%Y*NLW8^T87xm|JU%-hc}y*1iflRAX;MvU6)3p)wXvo3%GG6J)YAB0-tW({YX<0V z=CEgT`TpScbw>rDsoHw&c8^Vz$nv?Wdi0i?8ro+d^YrNPbI(AowodZruHJ-hJ1*-NaVefDi}RV- z+J=!-o#tluG2&-T|FVv|<+$YYgX=0Jz;}Vxo(awK_|J2xujvOdl2-x-Bgo-#jEi}P zY@Oiun-?_#o>y92a3v%rEmC|Riq0hvH&-2e z4(({n#;)*Kg6OtB-?LrK1jPgMO|cb5OsebVbu5G#MILT*EiO&vY*IAORvGV6P;L_n z(yAgPEz%rcoPa5qJXQ1Qx1=ps<|RO%zRR)0@x*op10~~y9*pzSzOr1inbimyGo6D# zHNOB^`A~ETHV3frgs@8}dOUcBu}AN_lTwT6(9QU8q?2vbw|GrYbdE&eoGN?FkKFG- zZQZQ<*+z{2Q4)?67Ns0HZoZ0+&5ySq>`;{t64^Cx@p28cRfD0cClC%wkt>IXFpZ*H zv0653wNx74P$5Os(_4DB>S9gvg`fOFT}aO;0`Pswx|;0lzv?n@_Nxj#LGHci9}$n; z_*VWRHpkbI0tlbDl9WNn%HCF;QD9Vzqm$UDZayt=eEA6+10(-dE!wg+HNcb}t=w{r ztLu32Qi_2-{A#d5z7?%r#7!-!Y7V(0qXY zBLVzHn9{`IrgT)8F&0$)s&Hxh+Qz5zY3}M@@|5GT37;^Sx(e|A~eCu>TXUOrr5iRJyf}nxOX~}0%E!Ro2Yto z(CG7dD)VZ)?s}(pai)NWUe&J4;}BP@u!^m8HVAD}^HSwo#=%CTerwSEwo|D7p`0%f zcF80S80=Y2h!kPZL)i^7@YB(<%<5r?sd=>+wUSe~LLPN-?W~l+VeBd%?E-&$2TApx zV)jZZfbmdoly9QVow3bIeA3FT47siel_9oeaY3gGBeB3~_2BR1>U>j0Ma1@hNnBvn z3d6r($NFEeGlhcq=b)0yZTlgMYpYx@F2J~3jTG@~Ae<~OZl*kBSwU1^X()7ltj0Gn zT;n+%Ss9*NhqhkfLD;N{`YSVn-u|2>smZ&;V&dd_C1Hl@PA9Fdhdpc1PI#Q_Ad`-k zOXFF4_CWY`bH7G<^Kg(ko$Q$&B~Ep@!k7vwi4?8R103FDx+Pr~PD`&z1AsefMN>e# z%Kzdi+M{*%H~@;Qm-*3#LFRY^TYhrAm(~W5;6K!Lsq(YRa1b>2t+39zQ;kih|nq0mIW z%S#SbK=*CnN@B$PcYh28#VJzExthvgU@;836#a@$!(I9B-ch0TPlHj&zjqJmf)G%M zmYyPWzuG(ECd0vr$xDh(@P<_ZJeAGy8G>*FgTYniB~RJNQK?z0_@uEB{`^D0K6I`@ zv_KUa??Bj@t=jU&``np8eJjnAn;rv5pv_74#zL+earBjl z=Ep{rvxgd;>Gh%4H<3u&s7K50P8`cnWb!HMd@V9XhTz>!#x(CNu#g>h8%t*&bBw<@ z7HL>F;V&44FxfR)UghK&BvR;s`ySBOv-|7hY>hEvDx0>)xET1&sR5!t@&iTE<9|ao zXzn?G!?EZS^Po6Y={w2OBmTpLk%B^g1bK`|K=G)7Ui6~=fRo*j-rT|vyu*D&DA$Xt z%e(vaQ%R!zF5HiDC$F0lfdA9yrS&zs=Y4+AS+C+_ue*?Dwg5k)@cV*&O0mq`cQHQ= za`2*Jmz6SD3>_^hkpn9~Rd5K{37M_Tgdm8>>LYkM1eyxR-FXckVu6zyXK5ByeFXfD zu~kuNAKjn%Z9fc(>hRDnkl^xRsz1|ETMV?x>bob%1oaknX)FFvC#qGBI^^^{d^uSS zgkSIM6kKVr3Na>Kt_YTD8sIbhu&@-Thn9}l6!X@Rejj>$4x5LXWlIl?+BeD6IvfW= z$APiABYAyEHtf@<03EL}TS3=`8Z^jn2!zK;L(3!Rl=&(R%bTP5uwEKlrI`(Y-8Z{d z^2NJL%f|%axBd=L^~-AaQ&}ecq#+wTi0Md{%P#h!AnMnrOW<_7(`y=MmRyPG?~dwqDSQj6{6%CBZvb z;1P%+c$Lcg4{T;qo4q%BnNu@JsQ047_4reWfaA~$uk{Ht)_d-7?U38qM!o+@in(Xp z!k`x|_(RU^X5M=HCx2 zM|$q1z!)D(#c1jueoJAie{zj7x^>jDN(-q`h30kcKQ9@F)KCh-wj0n03AfYvKcT*g z@bY_VbY0zU&`489lN`+_KK#;`nCk9e>&RH(aexZ&dF3HTw}ALf)*?k5$svI0B#9Nz zSTXp}imcvC-{i5IyCnw&{R^KQLyF%^Wdr0h3L4D^ISj4QxfAf0@aQWjEd1 ze-PoxU!pQ&t``5BJ^I;vHu-S^Y|faIR4Tr4d|z*TGe=9NL+R-NP`_c&}Dc4{)BAqW#3jUYk9wvg+NCEzd@dHky1 z$7y1fFf@3Gb*`wwxQ0HO1B;I1DBb{^>2$ik)f;R3OZ2WRHaV1Cu_Up(&gC$NmH;!x z+n_gtK%LCu7Hv5Kzj>zw%}Sma(T2}XRXSD1t&Hg`iLI-8!9P*F(dU2SEmB%MkgoT= z8&8qCfuyWe8Q|aj`XuY*N*uTqb9&&0{p(O3=>oXT2VUopTuMB>0idp1i%n(NDN z;i1Xj(o~$lzO1=_RmZzF)$GueE$Ul{6;FhSoL-6;isa~^S#M|Pt}eb!JC0)+Xffs)fIn?hn`$?P^gnSNI7HY;_PS!0 zIzEKd-W|Y&;OaQ0i(3mhSkp40)laes1E>vmZ{iDd>`*(3|K<*V^L(XS!|#p0ThA?)I2AU>Ac>vVy9=|c8hvO@ z({N!;3f4^Nq@7M>f;? zC8Wuq3qD8)qv>mIE(+`&1!|3@4s(c-?pOW4G4&@-ZdABxUh|ILuNBxN##^m+I6yFx zEVJyEiiYZvBYaE+?hIL|wVlc$9wlT7S9yglv=VrEr3`F(Qi9R}wwjRd#h1tTx5*7A z>A1MD`_4Bj&mD*6)rIChP_`T||D3+Mw2t#4E&r1nkK&VvCdkm|_|~appKkr}j2e_b zJPhK`5nvz|^ihj-;XfHYEDS~gHxg^pEBz%Enjw;oop_^bt;U=h4@e zCjVr$yV-jt&L9_A!)OGDg_cnLav_OwN}Y1g`X!sMW@XWDxBKl^Q)URPOZl_0M?D3%Mbkdn-sIYSWwl zXPfbB;G;iH`dIH$q`5Q)KfiraaA($4tlj8q*VGy_vCmbm&;4Bf)#Xkxs5ddui3&2V zT5({M)2o57iG?!clO=9G)R??_;L41?ywA^D+1|ck1s<``ZnBa?mTc(J&XF02Knu;g zCtnq!GMSv80HiCr4WtM5e-3=H&6dA9YA2qVKxK!?Q z+f?uNwx?9`jXhbz?R25G>F@o_*J$*K0;yi1PgNfYA=UEh&79M@Lv@GSyIt%17BwiN z`!UdhX*|L%(U%0)$A`%PBH+yB>KY3U8_=5J)fK$Y3y^Pk_^ksS*rT{QsXLjol3$Cp zw%8vUD^kqx0?eHPKTG8I=0kQ#ab$)8=J(Xa7=Co2rQ`A zDT)dBba83rmTs5yvoL`Qk~rS&-2@6fzKk@TItjT2r}jAO{23A?{1W%B=lPE74@Aj= zy}EKG=CKmA+~*p6H0f_rv(!^Yxw{|Rv%Vi^S1=|75GC~UE6o*3VFJ1H^%*r zBCL$dv>1!PMsT!l=y3+{JY4gshth7=n7x3j^~5v1@Suhpjxn){0iNS*(GG@nhGHS& z4E2K;Vg&GvTh=%uNA}tEs7a2ba|6TBBb5k|v=e}$rjq>?y~j8YSql&z(3FO+rTIII znMvje^hz7D8DMZhY*dm#rftdPpCr_9IVc@{6RJpA$y{Y~qO_ITLR3*xyEji0ZAg_q zss5h-%$Vtf$Su0o-~uk@q(ZQb;ErmW?Ctcn(TKTFKHA6?AZ(rk*xWVpybC%c5>BJu z|81_?ERoyth3huy?y$A!*KUdM{SiGV5Gd7j^OV4^x$?7&k4Z^FnuJfYhv!e?vfoY~RADN!gauh*sJK!6Q=yx^)A{R$@oX-a&{ zn#L3coz~$QT`%5fyjF|36;c-d4o?ZPe38~_MevY`cZK!G0uU}j@c4N$zVDn}N!O-; zpweP>dN{oy!b09h>W&xk7NZ#2zD%>D1&1T^i5sjfXG;_paT%%U9qHFlJ(3aID)2(i ziSWcS^bGQt?*=m%L5i!&l+KXl+YlwSZ^o6|F-lpVjiRomuY;4XND4&r;6Ym)g%`JQ zpP!^URots&W%g>ESwtR4xN8ww$Q~#ouI3P(CWR|0jqOk?Nih3Cgqsb`V+Qt-L-G3H z8y>@Mugv{w%Z8cpf}H!jICMbrUb7k~lc=b(SEFYj=u{Yvu8pb5@g0mb6L*GldGk&W zS<{3LF)Q8@YGBQHrGLAP>I&r=!7i7xxA6Biq=?#Q%gFIRv>n9(8!GK_NrHsARkw5jt5G5F728&^ z*oD`poN?gI-$iJvkYsAWtjk5p`T~i*MSn-v+@p#Bs^OBYMIPUztkAZL%BB^^#bJ<@ zQ7OvxAWkIgwrFm?A3v;zY|3N=)v^K|IaW_6Xm;fZN!V;a<^L-_iB* z^m@^BO^dsIimM$|-=3Bux>vqDMDDWo^YW^AAcbPF(GVHw5q2oaa?xAfN!3jcF zHLb77+3(`o5{?=eTI0}m9aFJC;=t{T_rtL$nfhaeoO8eFUTK*s}v8X_CzTaN++5h2kRgND}S;Qv}Rz@q^8fFcq2w zM|`l@r(r$R>1JQ}G(R#T2*y?k>xRVmS=V(64q0Ai>NJUAH?-=s60&p2^&{1tdcD57 ze&5C&>-N20yL#9`9pitp+8_q5*lzfp8hBn`+b4g$Ktf8+7oEdv&;*yu8L$4LdHBkEz@nG%kNiVOMVm(%5%6HFvnR7@i#g*90L# z08i^@exCa=n&b9@-XsQ<)-pu-aNTGLrgF;4v4X2?$JKA2`Vx9kG#er$SORjO9qdlc zWFy-Q^-99wcQn@8lt$-wj}J?WSb>ACh(7i@0R{@q)t$Q9xY^6?Cbg$9eopr-6?$P|<(PcL?s!q?sujn`wjyV6%~=+S>0!lw-t>3tgt zc0^!UX@k~8?u~*ajlxA|Gg+c@M?t}+X&ReLoV$`Sgz`}j+^*y{V7Bk_(n4|lvmhA5 zbw*?%8|7`S#A#NDK8gCid7o>az=>)Y&OF0^m5O`y46>&%nq~b~wGHu91pG_}n z#KH_x98Pc(g&`-~ur2H)IRNjTrZLluNgQTbsrvnAPSw_0e$3N>YO~PlLkMyZyobq% zV)TEL;~HejL&1J_Wd6M_3tPoxmkW-gszOKOIag9VuB0k5jY*5B?iNIEzL?cAC=k48 zlkN`M$|B;;X<(ffVe&@{EY0=mw7cy2jAq6N@k^AYe6=GQ z_~2Or`Z3{zp`}E>8o~3XW-`yguA{`9$%jOUv1wR&eCrlW>&ro5MqU4ZBTY+W%3@ug z0wEDC5bA_W;UZ2MdVC=VNG;cBAzD0*Uz+)TUT8A}C}&3Xa?VaH*sdE9#15W>1w?V; z@FaY~SPaX6Tn1uT8P%tUOY3re#VQpx8Y_|Fk*kf-7bOlj&FXY|zil3W{j>h# z+DGMW)&FXLO!!gPUsY93X?%a(Q*|;E_O2j~6M<=sl3DV{^~7KbP|~Mx>Sw5hTO*U> z=gs(J-BjwUDFiB~*$VLs!AngJ?8a*JL3(`c6S>{IqjoRK(Uh}q%kzK~+~V7aCCH__ zSi5~eK0d}`1Td&?Qg{Uq**y91vE^rxeNwN}TVRweR(0BL-%~k}g;VnmS$WccDw!9< zsftaCWhe2*(22jj3Ro@Uo0k0t(~1?xUtiejRyM9n52JJRhi%9H_A{JGHgz%h{98(> z+(X{yc&ezyI>Ry-ft`{_9pVLtP1)~p_$@FU8^7zj&YS2IFT=}G)IS`Q3)hmR3`w9Q z`DL_;1Hxm|2~}*&0{uw_eoBD0j>uE?(}A=I8y@EgzYSyz9qr_Nt5R}fZ!a+$gooo@ z!OP0MUnjsi@(6ov<_1V$pVYkZmKhY5*$M%!d7_u$e4iBDoyijDDPFzZ^K8fRvuDe? z#IdBb5L186{){Na{AcX)?6k3*J8#x?sm2;*W3}X^=J{ckCcgT`TbZwKx2aqdMTcJq z^gS|k9`cMG-KNiBCHI&&vC#Z!n@)H<(VI^N-s8y6G%GT#`7G6s{u-aTRG817EW%93 z9;y7Q!!0Bl@)J<@nK3l7hL01%GMqej5{*A~Kz#_s*`9J2=!0-aJ<$E=+Kc`E6{-o| zbs_!yw+QMbWPjRXg4BkD7W7=kdQ9e!+r!#R?oks|!eYi5$}b<}fcFri-UKDd0*iZ< zNbIrvrFICK;c%9jGprFJUtq+NQ)6DGNuFItO%C2@Lj|%ay%8Lr+5@B1u3Z;T2mQn#aP?f`MElA0YpQluwK>uiX z{1fl8XGJ2H^W>PT&flIOyH4o7;Lzj3m6>$t9jhP2X4IhU*uGC-ay%oz(J!zBEcPH? z2cj2^LNhhYv@#*e8)npTTgk#RIsJm@=mi(AGSdvc<pUfQa8v+hiRG44QX z9ZP>D_s^CwCQ7Qxum~iY2!Iv8Ynz#1pC8mmkb;bpIuXo(hI)p0^XKc`M=H%%{Kibd z1@CeqK@Fp&`MJH0W7)3&=dIc(5s64fT-0bTm*KO}q5+O&hy3qCIiHM=B6>E34+Ro! zb)oP_FB_5wddO0_j&p10DXc%7!QdO>eC#N|!%gMN*hQ54Puxr>M3|TDyk;7jU%aiJ z{!g2{;P4fTC0t+g1A?YH=-UM7c`(G0wgyHx%grXJ?G%y|0^!pd4F@2LP4X0!t5cFby=Jvn^x{F+jiJWmc^=xXUjT)buQew$6GY1iIpgv2rujM5W; zR}>u^o1J9ubG&x7HH>;gLc#|1hj=RSxQiAVj)|+}k`8UHSds-j%N`uq8i6ZH ziiAY>+5ScQ+K8eD9d6UvvD*l!72GhY&SfMHU!nsNHa9acf|HTO_lXgj2IpZY0p2*O z4WgU6gp58l?lnlCDk=7c*`a;ZR%W4pFP@Dy$|ufdBCahr1;_<8*peWni(8}6S&3E$ zz3ygotGF>Kj#U*Ey;OwW_2FLgWm7awAfX?Cvx$@B@1M*xZdS)*ArAHY277M_Ojf(%Z5l~dU<6NPY{@I<`bHYn}N*F*5`dS zWvpQgHiwtT&J14D-Wv3Nvd|M!-kT}qh)n&+IDV}P@f&6+MemL4etCI?%pLYOLB zP>dW5H_=!FqK_N+s2T`Hy^*p4JY=AEo$l*J`JS9?|<=vnxG=s&e!z93E{x#t+g| zbzACe{}P_eCj6@_l^30Pp=m<3@F$y-%Thq66w>`oz@~nsZHuI_oofL( zRMN$lcOxmqpe8l|CT5_9!Esb}#2~Ir0NILgX^%wk2=|U5Lij7`kWFM9?%;bN3Rx+8 z_3rnwi1Ld<4oIC}hcGvA{Z2ED1=>I%p~s6(r;qk5MAVjH3x%K2;u77rI2I$)yVIM1v)p~3;64rgDC!C$A$K@O;g&`*PHPIgu1ruD? zoD^PSTzSPuuWlq^mLe~g`gF3wXEBX%++Y_-&>X;*pO^{rniGSVWVPgatBup{D0)~z zw~uuJ;W9$(QIDoL-iS}R9f@waAl0AYg=S5FPdJT4z|DiMXPc~yUKyG+{DhGO7FF{J zJ-^L5Md~#Qq9`TGE>;c3;7DI7Zv8#QW&zM`VWA*=8Y2P?Q54Vtrf^}}HO4=PE>#3X zgStm_01Zf5-NXWkJ>HC^Tl57Vf1kFGbjDY;d%2FJ02Mq)w?m6UxwH;a^bE4U=Wnd; z7ltXhtelm0V>~>SSErm}LTA9{q}XOj3&1OqTrWde6B2Q{v%L41F6;}pExE$zBx{Ug*6ILl`t!C%pQjMMTBv4B2$6Ac{V3lCNm zuC%})65iIgd3H=>xw$XHzhq4%2aUell9=!#Y*&`g0|;QC!*UCY=<<^F$B|{)94XUE zg?A%u&*@I%P6&RfLZhYT>?2D$-`(V2?FPI1reX;2xHnVr zGrh}8)Of373+T2QRNE_mYofFBO?Ixblxyy=6PlaNX5*!ND*PlVy3X~hf3}j4I$J*`z~ws zq@Ixw=FD1B!+;6Y;3V(Dpb~JtZu!AQNBp%&0z@l>9i)TCCcY9-GzcM7{Ify6;ramOU3# zFzzfuA5ZsC3YA_-0SNOpKRacd7D_QhhiKJb$cX2s5c=l7JUnQD2W!?3-+YSNZ9o); zfE{`!SN_qoS_ScU{qp~cl3e~9QIfBVqu=ynpSEhGDLxbVnyt$oefJQl@liU!zat8> zN^+D;)lL$_Bk4!d9NV~*MQ~@Y&UFc8+o(7WL_E4qU}@N9r62;KIifJ4+$LHwW*@hl0lQ-THE06O>3vyaQ z@JT$0%hR$X+f2kM7cM_MjTSw??V47*s2I=kAv4HUN9i{2o6#fX$r8n;2thd#J@bEqDG2kN|ni{L~%2Nzi?+ULiD zbM`8;{j-?9SS5{bYs~>V#Fh`%p}Cu7WGVfTAn<=Edzo_*656m@EIO9-7a<0wS}VL* zK_RUM%y9O179ia(fJY?B-;Jx$v8<{ZiH9rCVjm>T6{%TRAP`kiTzd7$Bv>PsZw5o* zmITYucw>Py-a+ji2)%~@w@_C! z%N+@hfoClNbQ+;Kdl7xUBA5T8g8#GDk#{x!j7!TONi3Rc?6SJ(%WA0ura<9RO~hM4 zOr5jJ>AaQ^mTN*q1Svb)r2U`=H{8y!kz^YC#jUm8HEQIX5m~8VDM}1?`a{1s3f})J zt@NVy-;cwKXsp@i$DN%~v3PwBIJB9v2g9>qaWLd^a!vM-8|U^vnO%EGbXffYS+g*d z;IV(>avK#V%qWJh>ZQNOm6(X&UUrMeDE?4gns7~j|8xF7ud|JH!~LI}e6^k5+Kr)a z2vbh%W~%@MpWphp!6T4PAm8(Iw&&p_sEwK5HtbUa-uXFB|LUAs9=pA)~zK#Q$PC2#yr}+l?=Nn5&j2b!d(a?6)r6p z@(9X4)VuChM6o?U1P`qaICdS-s?RTAI&Si#{^|s78;93x8LmNMELeu*!j##4m)YEa zM2hP&E)^?;%TgdrirOm>u-1dBh-4rJK~yw*8mj-f-_rzj>jNmHt&!V|=q}x9YVEB? z4JX=K;Lgm;5qy*?^y=+$M#qISf?qT6quKQlI0ntytHy3E;B78Y$>1UTG<*#<-y?l z1tP*z_7>uFXr+V?g0VItx(!X`-Ab3g)$mwl1%6{0QY0IflxwKwLWCb-d+3i6;ZgTZY_A1YIJ6?>xY4_(DdmWm0KAwwY`wCXJ! z(&r?n>O^-4qTHPD02IY#mHGq$-X}v%8c0N`QFLrE!CzRpvr)ZT4yyo36|bPzU{WF^ zB*0`TmH0@}c64`G;D6ECES;At63jGMjCiQ-{R@yE>ihsiEp1t)x@n0_vBG_guSKT> z8!la@vEnww8&{v5&0CEl`FHV98Yp#LxIQa=EZPnvA{3ze(gfZAPrRG37gy_g`wJSd{NOtS>W6!1M6oaNQhAa0_CH?e$JKW>tG5f4<2pmOJ0Cr=&21+>A=;eR z!S!&I33$j{CM(i{e7%4DIQZjdVJ=Uk)~M{d1&eI8o;p69@OPi|^@ z-p>5}A04*`4hollJYo7x|8hWU)^7b-DB%j3WQR|LcF=Jv57qvemuHh8=NwC6EAZAa zD-G#$5uArAa|3PAZL$47QAel5(v?x>tC=y<6D7il-xYJ!r+Hm;`@jSy2qlGG-W#Hj zJ-|u&6XZ1XD;07lD7=B2?)lNO3~&5m?C~xfPNjt~ z9|TU$g%;m^c3-EZstKr<|25VLGzO0DBPK+C`o-bMu&5T)qFz-J!pWMmWmGabxIc<^ z=5_%I;D4B#irg4>}uk3Y={R5o_b9pi_!oE-}v9n;={EUym);p zdeef(vs!iqIZ$O-!x9n6O;ky0?v-jYGGV2K;;@ZK_aq6$IyIw!t~<48^7o?96l%u_ z7Ne12&?$nF^(wh|0bYw9F&-?@@k!e8%U`e&QvyPg5bq$2x6v&#{BuRT-)3imzBssoNj zaUSh#_^jpX@z?wx4LiS%@DD$2>tBWx-@Ek=h3~%kC96wOk=E34QTLds4`=R>Rg92* zu6F8t3pC-DtZgl21Akqum7rPg!!;QL&Xeu$OGfh!0^oeDzT#$Qi~G8#Mz0Q8*QUCbl#V2gSC%ks<5`|$nCxbwZW{$%Oo+6Kp2`PU_#--hzElW6G1b*ICgRH%TkSs$xd{sS)hUU))3Rg7dx2OS2JVmcbSA4N zB_SfQAlL1Os(ibX2Hq?3EbXZSyPq7t=yLUzMh%Cw9E^~=EuV-R>F}4lTYR#D0&B3- zmf<0Cck=J|w9h3Q0R^x7+qBi%Ud*; zby5nMmUane#L(T_^VgiqSFDi!bRuz@Qr{E&;i<3D647|_`hctN; ztlkz*q(y~fC)T&h%Rn52*cA-n3Qtb}t`Mrz3$QlFZffpk+s;JNEVUuq-ArB{Sk)T+ zwzG*v4pXbPF=xBtnP<&vv;?Cdy#gbnmok;)4?(vqh_i$e_JN0C{dg|LfjO!h#fTn1 z(`?s(!fy8+`4v-Rz;YrI_y&p5O-{@3vE~0a-|<`?f18_n+GT(6;Vn*iZf4fbR0}o) z#)7Cus;`Bcg5&vZNe;&W531X_5eye!+d=4OBCPjAv6pG7{@n zCeS4>{PYaI@U#4@g* zK{KxMJqRYuk>hcNP0827LRwvPSq|U=)AK7OW)jRJS#d+->!_BQ&W?r4yWTk?-rV3i zKmGxO^VWgxJ7u6EAHUh{s{G_mf5kd50t$`f=6V%njg&Z%FTsaO;$^=84yG^LEW!;O zu7s99qwx-26nM6-dTih>ucESPY+3c6e86qKBKdQgPL8yD!)i_ev3#p;UqQPvqxWlI1w6YxO5>Lfd@hn+Z7Di@5B-yJ!1|) zC-5^73)jd^Lg6SV;3uf2Bd-)Gb49>eEXmRWJ(0KHiEAaTB<(QGW~+cT`c*4+IINqu z*6IxT){n1mYv@GOQ7{2WQ5HEbO+w8B{DP)x)AM}>e&+ff9*EtZzaH&rFqwd>cxxA0d+grc^1dSBZPCy zGBS+s&D{#sRIU}Ke-f?cu(~3R1_^Q0>Utf8HCXbh^jZey_mCDDS);L-N zbi~S*x$6I%{~qj@sVo<4+cL7`eYk}Y=*+(M8q3rP@i9bGhm4hXpWY?&#}}9`)355- z2q!RqZR`etk+O)C-6d5UM+#GIqS>r~{lQ!r4sB~;07?VRoo7#kfSAq7GG~9P&46^K zGQXr0G(ceHnVr+mdlBd^m1m>rJRC@BA(Cs?`LxS!NKBt?WpKL|w(KHf>fQz=&1b zbjfiandt|$Pv4hUGi^)^XanCL-a(CaxvC&5a{`x?PmJc;i~hY-=p32%dzHTX#|*I2 z3YG=6zk#}Jtl?GOaeQ;>uk-8deDs#}NMvqDF`XpuTw9#Hq1Q7&X|@eA+a=a^5>ZC0 z@jo~bxl=ikvu^>vjuSTTX=U#SxH88|T^_#qzX1UTwkwmg)fqGrX#h3{L&Vm4k zN&RycgQ((lL&XR2y!!A3g--pE!y;6eNAM7wl3L->N|A8x((wez4&>9&pX1;>%3z7& zb@`8y)Z7FO81Zf*KQ|g+&dvi@xgOIeVs|?%#ABs65r}!-{r$Q}gtC}|pf6eEHSa9=fLa;5 zsO@6(2^OL2)_Fp$?yRQu!}|t2?;IO*5m%B#=nojYlV>>?OcW*xSEU(W7VwD8obsNN zS>%W4JWj;;AF~d)bPT1B4~wd)5CxY9^wJ1d-%-mOnR0ff|1x4?E?3NmQrx`?25(;} z%$_xvIQ0>c=$|dtJ)?J)KjBcEro%*%?N8FTa7762fFAq-94#(bcmd+>Es`E$Zge6h zBH>Ll6AU_KsJWw{si|R!Rs}Q2G;SfMMM*!D z*#cTyB{>S1g4|ynyKJhF z3*#pc^t6AajOpnM({tf0Aq8O}>?}T2E6aZwU&!5@YN{W(uq=P;M?WsW?l7yz*|f7i ztL@Tuqk1hm+?Q{mwWV0Pu%dP|YniY5?9R(`xv$~={j6Ky?%^i(IasL0U8E@9UN}^> z&$5+Yw(hOV;?Iv3?u7I7^D1oK1Z+oHC2=D`L?U)r<{%&Bsw6r|W6lEKRGfoW9z_G_ z0b18j;?JNpieb}MQ!;x1KTWv>$bJJXWc^~8YS7d=iMmy0R9cdSx@4ii%+@Uy!6@zu z_R}bAwNL)3C_RXk27cHHoxu7YB-UQM1d51nHVG&t?5hgMuEmKSFizezqi5~ggO*-I zK?YZ?`heibafKAP?Q+|d7h?%FJh%PPB!Un}@jwdI8v^eeE6?|jtwhrKBi>rApGLp%*8g-Bz7>#*?288b zC1d{L1_C0+ON;2vU=VTIas>&lL5c#<)WR~nN%C^JQABxcwCKVwV$kxyWHkv@(Uz*h zA>fZadj{sjW(Nn0z4SYO}hdce{@~sZNTP0V$MEvYyU)|7X0QAo*6;hH3a{kNUHQf4`5JC_mVilhtua4tHs zI;vmT@}atZsd6#?Bw_AvF~{$7FW8fD=`-y(-PsX0fP2U&=m|HEENv{WRV7G8{+E0~ z!YKids6A}Bw1!rdKFHs^F!_6+iUpG?B1cqEXJ$p>i*hmta6dnnV@+5Fl$u-eUS$3dY4^XWxt0b)J>5L)G{^sq zp8EE9P4AzkyK(ra0rq?n;Dp>MevDP@$1Pr*b!@arqZA^;7JPL%JE#N=y2i+%0PDu= z69K0=qjTqsVz_&&>L?afn1u}Wd-6CfC!!#9HgoO;jDOgAgXz$kuvH;>#L6f&V`%ns z%3$NJJ6Pd4#h{vMAnT*{h?%~QKamkGJT+-Z3aHwpG;_FH>SDD$#yS^Rm~JTePqC7! z5Z2X-gb89LUdEROi+ei#mHQr!zhayGpABDkumcPE-wrwmdZ?r(?Q2cQs8c7?tJPv8 zEPZ_p1(%3HqW>y!lbLv-%81j(?7(ksCge|PvPebfBw>>hmoE`Rxy%y^8L_oJ zwBQI3ju+51tP(mkhLRza+9ant%^48O-#gErzifncI+HZFPheb4@sU`xiwMCSq{Z>D zr}~V8(zvb8<4SD?@LpX;13Hu}#3-0T!0qul^4?UyU+b6=$i@pay&UEq zZKa*gz#1b4@gUyMwbEi8^vDzB80}sb>f$^&yH+)BR(D+Mi#GQs9ANo{G;UO;n{gP* z*eynABAr>k{NBD}g7uzOy0&TyhL{pZEmdFN5>IRJQPYwZW$fa2`XBqhn%9prBGvd5 z9e#igaJWcQJC>_Tq0RjZ)4c9gZ%}Tg_f}hSDvgrwfLOsSBBa&^_J@0xyHg|T0WdE@P^Xk5?})bRO$0Ne|{1H zmCwH|o{YT#q~~t#O5Lm>J36rW?SPRTwO?}#Uw*+#LS=vs9zHc;!6ibqPt6WHvRUC6 z0wW5UqlCP%9nE$2koD!#>yEo|(Feb`w8~ohc)qr_2Q2+s+bDycCi}{G)5vdli&bRl zWfjd2%8SzM{ZQ`z0@%wlItEbf9*v*$0M-jco~sEJdABe7Ox;9$V^gLT;AET;B6J0) z#+%KQ4K~$lPJ(GW^i`4rFcX3Tm}|jiN#_PMN*k~IWMG7*JAoopGE1-&{c3z-b1?2h zB6AVqTo&-a@F014aQlv9rcE$pm>r` zY#!Xl4^;VC{1sgFFC4;q)9K!w+PzadCMd%Udmr*uxC8CoTX;UwN@R|kA-b}*`t|~$ zCIsrV?|HK!CiQ;~1M4LBN6!HGRp+^Lch&v*TaY>46a6!%j}ro5D_n(3DQcUC5{pX?ol_;LtBk4yges1`0CV zbGaSW6JTx_$4kS~dahv?2zA_@u`!x{v8~A`mwFgeA>Vo+VE1V{a$;JSP-Tedimb50Pk^L(#{I;-{lSA~^Hw3P$6o8L{?YJ& ztKDAys|j+00scFXw_%y~?BUJa9ctPDv^Vg3KdO)EFb2*MLw z?bGKke;ot2+vJ?rjA3z!~dOvQ-v1_d28oV$-Mo!_> zBYKnxZmh_Ma={)vlnw*P8Ly(V2fu6ZR0pe7o!8h3>&!|cseb>tGe6ozVYeDN`;*Tc zQgD@p(BvZ-%76~xkc2hYS{P@7sx;nv68fL1Y!_T9-#FYVK7(X7RzL(lyVZq zmAtLS;{LyI?e?9D8AWCiO3sS$MEfej-(CC&AqR$Z9RW)} zyl5H5!%ZiaJ2V_9z_s@*q9uX?QI;`>h(~-!Qq3>RY$hyK=vs5G5Lw5WB1!;|8 zD`zy2?Nq$uxnbJYGGzrBjt0N2hl<8y@RO3AA7HLb zuU4pCHY@8Q6mvy5Ei8-R(EwL#s_T#FZy;Z%%0=hBA(`-t~$VYbm{_Tk-}lwpA&eohw@md~@gzP42h ziPY77YAhVq7^gqxLOPzFG8QR^)t#^wWJo;m%fg8mx@ibKnKj2=xDAAD?jC{Z#D?j= zfncfa{v?dN?fylDGE>Osa}g#t(vomTN%k6Nr>*9I#zIzK2a zjZWY4i*v=Q)Ks(mdjfqcHjVFcW*xiu_MdWg{r@UwMOO}W2?aUy%$~4q{ri#hH(BHw zj}BJ}F@{7G1MsQ@t+lre_-DfDl}I?n@WwSp6!|((mhq_%O2NUaJJZ_`h)H07O{C=& z#xWS%@J2_~N89buNs(<8a9-%b|KXZf&8jMMA?>eopoAL)%aS0;q1eaSd(-NjL@B+a zZ>(9;ou3LV3{k!O3UiC_>~Z? z8{Iu!Z81kW2K4d!eMB3c7WVh^7KYy;VpV87`#@yzYT77CV(1&^OzP~1y@HDQr2jiZ znRDgm_b(+GdV_3gjIVVcU%R(KrxKKjLzvMY88E=U|&}~jwaJbbw#Bo>eZ+W#I*76S%{{@BkiQS!|wt`DEVBr^5V>tJ?5_K zf=0NQH)A8=NPFW2izNcFUUshT`Gon?ewBr`ko&q^5DM2cru|?XT@@47emE4a+i$>z zI-Y58MO-i9A??68$2bS*g#A1t-$6P(Et?|`eTD9tmCR=Y&8--CS=0<*#Z2ZV`U@D3 z+B!g6S?F=yQ=}3xO(}`R7kTl~D%p<;SI*$|^7ErZ5@I7}G8zMZu8(kq8e>5C7%=Q8 z%dFc2g$6lk_8^BG<>>2r!h_v976V5RctZh(3JTUGC$NdltP$6WY>h;?>N9=$n=QA3 zjBokp)!AgAA95H-Q#JIzC+)vpir=x*V~%OO$6hPYE+Rq^p&zoqZ@dyO;GL5sG{daI z;MBgZW0yTIXPWRgmo|@aRD7S&+J)SuQl~_Qpy7`Sa0n66egv$J6nT?hHeBG;DVbT! zZ-mK}L&zK^-4^O1jbEo=#aQYm%Cx`C#!-A~^+la&G-G?mZ+?cATEj~Y25WF4hSPn& zPNAxRe$wL7!rp zmEm*wsEH2VG2it?Exc&y_!$+YF*M8)Ur#0EQvr11uC$l3m(DyQp%w4JXCN-5 zcNndJRwMM`+HJGT*O_6btJ4W>Rc~)-Q~4aw%Z<^-q!|eheyXv~?^>5+LprC1?wlgg zC62>Mx33!23K8v=59MV~s{DbFVzwe@AO!k8bKx;|YtfN_MpWVj)I;}QoS?0g-1hNV z(i??#W&xL~O@c#wR0}U3<4+NEoV(THeyH|aa6%5*fdd8}I+(5)_)OeM#-t}`XXUe36S4HRqCz4WYzK|#AjG!MHYm8dDqIixGxHNIoVhjMWPfk z&SKq`Rl*-NkEOT!^rgda6otiU#O0I#C;4W8f`ET6NCl$3ZLi3iCUGGh(#4539v=0F z%gL{F)qZ1?{u%0$0~dzkdtpXh z8p!`2HT^u|)#eUz}QrELj%u%XAknNj1BH^oAS@&nB6zA>4F8Se|ticPST8NSmwB8{;R} zE~g@ey`YhSK`%8=zESF&!IJXDlzyWBszoek?A|=Yd0Br_Xb9JqT8nznSJ+R4U!*k9I1$ zfn|XwyAcWqFg;&wrq&ruZl@tEtGnb!a@B-?OSml(HUb2zaOU7wrMBAoVgDD6Z*CXh z1T{x=z(hYbqF=E;ZrM#fGMjbI2L?&vPQIQj1Pu!YDP&N4+n;)5EkKQcX#6i3Wo(pC zo!6fwfVHbYEEvKO?}XA!nyxI)gV?_FQe-8wMk@&PD2T=nT&za}frUdH62E^V?A2P?65D@9DZgh!i4 zvCV+@gHtslD~s(a#@3{7?jcr|nZfI&ZSYC%uJW2HaiD%OD^8-gV`1}MK`PCX+K|r5 zDUB3F5ty1XzoW?Ptdf?4+u6m#!Gn+_S}QT1wsQG4JLMrKJn8E_rb%m1oh-_bWShO{ zRe@MkvMB>)ulHE|1w1v#78})|eZ5m(Q5xhYw6w_Yelwl%fh%1M!x0dvP9TzA@qB?q zDiD2r9)h9$K*oNz(1by-9dLIXmDCl-Z4R1~#`@eh6OHkwO>%eHhN)PMV&C+u_ zVPnhyF|Igaj^;QSEDS4?*`~k0@%@p|WlwNXf8cLnv+#6u1qg-6tphuwovk_Q7#@J2 zw=ZL$^8#e3r|PA1C|WDG*|4e5lC$lh0V;Uxsbb}ZNU~*%_tdB-BCNaf&-=!C)TO!4#*0)pu(OjeQx9SHIW46sB%-76T zw}5X7!Lz@BgBNXls_!uqp66q|iA(5;?=)W;Zug32K8PM6gH>unI9JNuA zB8lvik76mHttFydl8U5*(ClFVj6o1lkXZd-vAx&RhZ~Nc0ew1a2AjV>b1OG<*)zif z-KXoj>FC+N70Bi$2Lr;p0m%_w5xzS5#=>*-+2u99dICzUuF!Jq zJq83)RD=jc*NLd#l=OY*#;z2xheap5&Xy?-6MRp8b~rzP2hn&`(>1nM*iJtNAE*O` z{+D64wafxDVXvqr2upWns~v;fLrmUMHxvPOe7HewC&mmPC+8HS*!`rCMMk1>^)<^& z4=m|V##0uUGua!YKudqBQBHg{US|Ousp!^_*T)HHNvNQB-~5L}87#U`7)lfyq5eF| zb!u=ws(IF3N5)I`ZXv8}Y zLkyqsVq?#?*_k|ICM@oR7N*PT=;hUE{zv%LkFOPCk8G*#0Ca+_p8oRb>IVj@x;gG= z(-D--QQCJOztLnG3H^AojbOjX$h=HXV|MXLdO)U8l8c;?cXl?>cx6P1mAC;0(U3-l zIZOs8|Kwk?j7QiNgTs7+>&)~`$M)8_-EdCZc00+*MQh&ZyaeQr@in2ww(P0*gidvRmY#<}{D~X8a@==Ux-O zOymSI1iI>PlfJw6s*GWOpd0Z8>Y!N7F+_X+DMyE3vSc_}9xFs?vz^&ubH8i_h+T~` z?HL;-G?@%l9E@e~X$6e%$2004;IN=sn>Ic<;~X8qNBM=928<|@#&G47XSRZ5p0z_) zo$7UZ0aY;h=#!=xJLrd&Y^AaClMLD{&BI-io9KpH0*zlh7q7Btq33535ej*}TLX!` z3_K-oH2E(z9wUrr#ye@g*b6$b6{b=X;?^mMx`}4KikNV&927Ce+%cx>q0ae69M%meKdEE3Z6xh#{lx^s9V&aL` zFpV%_^|!C|0V#5Zlv_kvYtU54vfD0GziX^Nzi9$X_p4i*mkx%%&#)oKR;F5|v>!R{ z6#wMRIQ&9@sPzI5UsPRI`8wQC}{e-vKDN0)_tBjp?{56wHd$Hd!Kt9 z-MT$nh?o8mYTRX^uL9VU_E=G;p^ob=Fpab<>crZqpq(C{)HbKe^RDwghhsM{kA>E5 ztMYr_=3Aq5t(}zpBEji_EM#l6rOAxb=>wBbM=~Z|` zOmlXz?*5^j>ZfbyTV+y(j;Kdy{qpBJtpPEHXg)da=<`YOd3Xwci`LU;ipeNaLy7!) z_@L*{q~fe!b9qBL$H)1$4o7WM&WKsovx!&R+~{Mce%(?Ua-|bN-UV09&IFD&p@hbH z8pV~)4v#4ga9VV2m!&`jOGsta%dMYxHOO3u2hj(o#QG8yj9V%QlKFurWibC@AR;DM z750m|;JJThMhi|GY)HOmTcmwRZtzhM0)2(20HFu+^Ow<^JMFc}_wM>+zfD4`E)4tZ z#v~WlRA{VOadmIPHY7G5+ccy7mmJZ>WZ+xn`}xbVyY{m8>fNzt&Y<_vyu3ct6aV?z z{oKd#AZXLwI`}ku=V4t91aX>b$9V(y!%lb;9aLDfJA)uy&;(nI6J2bTkp03Hb%m&cn2>NgJ> zlF1w6gyDfjH^czHeZUL|a@FJoNcC^!kb?Bp)@R4Ky8J_SAw4ldDnU!en5JH^R%BBS zqJ_|*On_&@FOBswwVPML%iPq6hZa#%e;Go^{B@=;+QCQnK5%NWHP{K5(;D_?CTDqn z*8)bL6S{(qkvV0KgB^{l#LLV`5700txQ@<{SOf9Ga!@r!q@|WZwY9E;EniK*6Ask^ z?^n8f>jQuP^**GZ=dML~P)LJnzR-tc`2Z3C3pM#K9f{q$yLCm}FHf&VumgL#-R?a+ zPe&iG*7dI49Je=5+gc=GTycKrYWkLxcKz@v&h4#4D(PNDj^_Z&X1eMoQfC#X%Or9Y`3!qS7Zf!e z0Rhw{R{EbRsbDRdX)pmzWL>ygxGhWWjz4(a1ibKTDTEO@5_N#PPr+!dX^!OxLrApn z3KbDOuOSRI6cx;*p%(%9R}))FcLP$CW3M{zgk!smQvObaeSp|39F(J#fd#$jdZGIG zQ9jFbFab@kv8ix+fJps*RKo!dqmx3C_~4;ooGSqCXZW|r$T?;Ma!6v3J{iu4Ce=5e zJLs(kgp#$gIpk`Up*c%%FIaP^+^^hQjBgSr?@to8K3T4p+VnMdZ=FDa;A`yf<$s6I zziIJjh3gPPwjgIh*l=X|79-O=+Blz`_kUfD1@4x2QwzOXGt;c4nRU1xD|+4^)m}yP z@r);(JmPb=7>s*(YW2p;L1z>4*fR8L%nYGBnZ_wJW!-E&IkcC5SgbVR<>}sWylXC| zd_c7CQ3m7{R)0r!egw|49eGh+4Bh0E$7exC3QsAf{&?JmH+UawnalL*iKu{631m{qw^cZHQnwCMvB=%#-pCre8y*UB*emiu> zNs|ZpiINHH8GS`ZIXoVGV8$2Qad(idEucY6T23eJtV-ZFZ8r_qtL9NM_by3gJP;!KV4ajj{&qvOvmQJ)TKng*)@$&{G3`|}$^RWc z!mKX~E&E*ZcD+Sb9VN)edouBYx?ByL?=Yo_?24f)s#@Kb#*j-iU@X zXnmDn#5OsJM3VYrU>t+$1cJc2CbPq0PU=B&$}pZWcff+tnh}`?F-Br~Zru@HxDP=_ zr5v4Xdt3lh?d`-8R)EI!^(4-R{>;vyeTYW_IP2^(B83XJGaQ5i3(fuZG3L3LfcKco zMkJBV5BZbkt{SuGOF9#vU1iRLL%T?iO!VSspkQ2W0PK|E7Ws>>Akk(&E2IJ16s;)A z)ckwJW_#v319o9((WSW44h#EUOzeLkv+n8_P?c21IyeoJ-Gp-IW9%0rii0eeI2t@P1v_c8XpV&jJmod5j5Uk`QjCa&;C<3)*)m8QyEOKJ;4z zge|YxM=Phux{_07cwa31(CZZ>A?=(@Rb;$yTRRC#Q%><`BFfp`pCK8Ez=M2D&Lf6J zwWke8#qX~U#v{&NoDqQ2Sbm_vi73h-N^AGZ@O$RMz)l;r9f22&!e9XUQz24>n9X7& zO=@iLg#0*(yL>6XJDuZE#I)w=pKqSUWlO-N*Y|_tuA;F3uuV>Y5Tq@*|BScfp`=mv z7?v#otb((<@}#E8>4i$8Nd)%^fm1~d?to#+Yt@Zc_ch(5Bx*;)KWT@#C>(L{9y|hU za}G2o4q-x>6678s)l(3>F#pp1j-ax45)Y&e1QN$I>fc+$@&4Xkw0J~#0a^I$GbHQz zG=FYX`jYp&ml9mCcQ8ncuYvD7_x)YgxWU<)=>-jL*;vPM$M5{^;rVs7d1dun(p~0_ zx|_EqOecPWLdZcnLz$Km?8Jt7xRI^iC|f+u|%-wb_-c#m!TqmGLfGE(((cqI{6+` zU;fPZ8@VEyBF^RSrDsD3B?YPhy9+(c4-6YW?C5cVQISEK1|!Y98I9#t%D9S^&RfFO zK@CzPAX~T>>fc;^wvd48iFS4>2|_na3AY5r%ChTf$s!4jIA~l zr(-kEC12fPDEge71PgCU3Z6}k${<9u1Tt8gNAtDtfKwjOLBz&T>a9{z9_+xY%w)R& z`mJ$;c~k=2X->^Wuq>YWv7J&yG?v30O_i~3lh|>V4m(ilCi+z?l+0>S{J^qrYDa4J zm6z_s4UsEVwxu>i`;b5I+;90tJu622Tbz#w5}vL+SMmb7e2>rr%e(y^vm%OGD5C&h z>W&Wer{Hp{xT$OEcO@sdvkS&nHb%axbAMMix45RJ^td;R`$cXTZ!GhdK6QMk&GP+g zlqH4UJ2D;wf2HbSX)2nn+En?xvNDN7x5yDto6caY#Bn9awL%XV&ROJ@k2?5^pT^2T2SYmg3uX&Fu~`D zqbS+!xAah6dC}rq2CMIK2-78qN`EFHp$$!1NnTAV@`9LC65^EFMWGBrhM*60h!sUX z9b!mh;K3TjBBc-I$m%~sKjF%%{9-r;1*O}^XWi|>{YkK4yVt{H9BptsGm_DeB{FrV z%RAGc4Ki>p@^MzJYkcDb8kLfvXgh3ml}6v%ZtfaT zO>?3-Rd}w?Idcx36y~^7YohP=_1;I?NlYIj&1&`pi@uQ@Rs_0l>3@U*SjWmETJI4q z4HuoK^k%!0y4dV5mXze3?z_ML!d`e?A)7VZlk8zznrRt5>pyBJoBxuGJ{1*u$(mj~gOX!tlf z+|XuYBy+Sod5m(<+yKma;mR9f%xMr(D3Lr&0~nxO9{4WUGFbs)XV;&Y5wgpdU%`AM zmG#x8kVk%`W+l(TmV@DYN(T&AHsqpHG8I~lZEd(^!q}N4eiXwd4gX-SS)BE7vs}pK zZoTyMyBLN{GHpT=*-jPid;NQT3xx08aAS8WyrHCI`)Llae$f6XsPfe;H}%cK0~P?dZCLQIl4dU_ zGJq;MDA6IFp|DP#qhT;<19%tEJt?U2i@f?kitLy9vM_QE-$pg@jRYT= zbl_h0uGSyYcbJMUpPs;GJtJ{73|}JTIY(NI5MLTftYfg5s-j7snx|X8(Lr?t?G>pP z&5ge>z%XdJV^7Q&QUGZ>bi~OMXPLTPQ!ytjD-pxv#KgI+7-zZ2B%g?xNTU>g+a-82 z3_I|smcQYdq;bY;`CwI}jJmZv!q^jqbe5=j2Q>=W*&s}zjhq-~XHleprNu`@U?Y$? z`t|D-vIHZgybr_+u7X1cYbvSBRKBR+-G&F_iC^Y0BUVPxTorH+rsf=#+^!#*^7Htk zKwbteS`l0l8J^4E1*;rr5I23JFKja)Qv~W6WwBMv%f2?XF;W=75NM!j<%LDPjxjf+aS{?BWtYZ85Rr`&VyYMl>##M_(bHOr4ch*gn@EnVVW8@` zx0Snpl^#*q)@l#4%~sy-T+_IV-u5@wH{dY6CTFyGE*@DQI4g@dlF0`A2-{x4yZF!R z(wl$RMUBOL&xPJEn$PkKQ@{$PZJaT}Mc0(+x{6eS!*5q^cW7Nj#pHPAwz%$)O8*yM z?-X8Fphb-~wi;WF?H#AFZQD*`+qP}nwynmtt@iGobMMRlpYOi!m$}y36Jw4s2U$R) z{_#0N%{_Wg5pi`8pv}d(9fQntF4PybF2xGvmqZCxk>?J)ie8*Ssz7 z(DLkdT{VjIDr?KUn=^kT>C^(R+{~Zu#&SC#pX`|axd{RKl{SCNOeB0CkR_Gc+VQgO zt@aeax76e;5p(G1s_{DId1=uTcoez@k9b(6)!~Q}n}{(zrs#@t0Vtys9SHNi`}?N= ze}tpwF8aDzZ6}$zyt48)?#WM@kZT$xK1g2q3E5#PUw)FcD&QC?jzcF}ld*3#dUM3c=ziLqWL_?ezOp^(GlW9ZR( zZ2g4bqF4}P%0Rx2_Ro+6uXNX0m!S5czxFo6G z@0w`jN9wP}!DMIa%tyQZ(9M@YOjMM#b;Kb~b(A9b#F)eQW(0{uC&IZ1hciK7h*aGN z#mqHdQT+9BQ-`IK3vLFe;L(c2ky}>a6{GfgPIr_Gbce$8hrbd|=C-qah_=JwhnL#3 z?>mt40>_C0Bzbpt))yO;dviv9ytE?hBz);@wV%rk)=aj@ogS5`oX~B0>S%W*EepTy z^PUka)6(Um*B&pcX;UBkd_2Rl^w?+n)cbq!xAdcs|8wzrW5-=$P|!=Z?E3h6lYfpQ$h9-p z_Z|XhCM2YAZLo{4F6ep3>VYBIF-SbK$(dRqoFoBz(xs zaTZX;>ch@@ejWmII z;aK%I4z|6-w6ui3L0;713&A?01nY1MF zdS8<2sEJF>!`h7CI5H>}V4ASY&?_ZWhJ=0i=zaO{FgSssn)Tm?=DqTHTx4+3`}@9H z%z6%!#H=pjPh!vxFOzRfAf}SFjFahz*JsbJg#&gJsh9b#v)FMBXO(+yySaXyr)%eQ7M^BG7M>0Xa@QD zbA}wqWA8PgR&S3RaX{^3nDd#I+ZS%B0K-Nj_KmrYzP0*Gu$sfV}` zewIKo5`t`;DasW*r2E*pdr^pZp_PssDNw7A7WxO>siqzB$xgH)Fog&G^R8?;z$w6j^l>ZRgM0zs4gsLF~;g0w@ zZaBjLlQ*iB_j9s^Fe%#={^Q_npE2YF&tkh(fWo=%tI7(Ht}FUT$%s^;W{iU#^LXm0#C1$naT_&E0wc3wjx}{lnfs}l@;wc8hccb&VVz;IZIRUKCTa*?rO_di(RNzK&b0j>sLk6{0rlc zwC1H$HN0kf@%ICn{XJJ269(QRp}s7 zFek!R+nw|4^CLc06{a1Bs|l5E^)k`I*X*Y-RoOzGy4d^h@Qc^9cxuIFf>)*$pR)zi z7u?>vi>=8z`c}k;Cnm2!Ru|=Sz2q7d~jF0v=(3c-5AjU*p{c0c*sofQQ zAT)SMvMGa@*6#ptogu3pFi9O#{}e~h3R-I-%`gX~5(D@P2FHLDd-^Ghp z)R==Gk4i%@vk^o&WN-e7v7Lfc^PD}A>R?6msP5;Fe#fv9AkX$4wJtx7u zvp(9=D&!GGz9B_*EWN@~!wlKRY(EIugl_1~lR!3}5nInWp+#DNK*+_kYlqNPfK+xL zER8v3?2Xkf&$iEpPBi)E%WYF_xG3q6)BrG-k4J-Ss&Sd^b`f@EMAMK_m)uuA90N(! z$hEzHJYIgk^xmw%5@wV__><(>cdqs!LSpy3s+#lm*f_8#br=z_9`fs>v-8av7_FwjZ)>VW(Y5KBaZc zlV~K+DC2X7@6&%ZK}t}^IQrBB=X(2${b?HR6<#Rg)C&AzRuFbB!$@I( zGOf(zK;CVw4zk$#gjrt?ju&S8Kz-5F+6t<4OUtf%%cgSg#LmBxPrq&b0UIah9`k(( zdI+Sx?MNWEBKU8}G5_-;nE=80W;4;1B?(W?`apc>!gtNPlCHc;-^EWZ1OmPN_p9E& zFP(P2AKd4P+l}`M1|#5WjXvgY(AXfC-BO6U}m*{A-cfkA>E`&08&TUD0P;A4uQk)yvMWM>wxCMf!oV`He&l zlE~d0EjW@2f$XOOi?u&7nFpk_o>R}ucK7wQ=S>HN|MW@Lamg{;8iDQCg6PY3wrlf% ze{Y6p}B{V+~99k0=A^StBg*9Agw3XHaICzq(-u){pGH_av)m6I`d=o?=yGr zqW9i|@5&eV-|O06wLUla%_O=Pwx_5ua(r*bFB7hMOfdTeKfEf_pk(nh1py%ic}>z2 z%}1Q*KPblYiIHAAaiB~j=w||#G0kaQP1m=mqJ3u_%-@s&uzLsKWt|^;_+!1x;?U5Uym56Z>69y(1163c}F{`5fsU-uTHg*K{wDjeUo=2JV(Y zKx|e3Lly5lJ4t#?{4@8S_DGeU_Kt|~AV!JzgIaM>bvO7F?Z#g30q(co?f$U|I*x6> z3}(ck#s%I!3XIEonL~~KkM%lCebLwVL)RPXs4d9CVSY3G6XTb zq_2mD?GRCP`Y>Ci!D-xp!GmVCUK*Zx{2SM5qNi^uA8E7JqZS-Tc}5JKv?e z{A_$XVu5Urr38^SksYCRfFj4oSE(xI4pXzy2D#65q2IRg?#*1`F8<0x6HSf>YX~x! zixQh_?~h3e%Q@gxK;bVULf)V_E*2h~S34Ast-!1|FMy`~nU}46u8&K0M>*Q(=tA-) zy0VY5@1E5r6-+WYmtILT9+m7eLIkF=XJ&2oLE@d-KeP>&?Z z-OXT+SzF*r)~s&KW1l~roVm)C%2Ah5szd95B3Fs>ax?j-ty1}s%W5-8B?Qyi)R$fI zSZ(NWON=+V*625B%VjBWM=r$#FXHaArz&e8CM3hHDLM(2*}}$OUt?fm&+dMq)g3B? zprvOjD6pX~!aeJ{ zFSYj*oim&p$FO6G_hG8>ce!$3A9nS$J*b_m}FPqxkL!ypVm(1&~AM zcv&pBbaFxyX)po*G_={zvZdml-J%j9<$c@wNqBoT07wgG>5INt{;y{ezjcYzOI6em z!%6`R`0_DK0a$3TizloiB0NhonTbH&M54B6A zt~>LYXBl{_09Dtc^YR_W7cVn!CKazE){4x#Hc>tACzWOrR*R$ZbtPY{oCqJgmpsoS z?w!PYbLL5@4CNzUadM};$ef)p!Vzu1UI1G*;j=q-lzEtFd zG)lzME$;dlV9yaWH0Xg~dEl5kv}ogi#hhTl3n{_1CR{H79{LS+NSg7R+IG>hbMOv*a zsr7n2jPl18bLBG#Ivj{&21c4JaHsI@LF8N`I?KBXs+Jpt)!_Vnd<2o7gO-%KQzo8q zRvDRV3tHPJd0y)a z2=3mrQmDxa$|Nc-lGD2j8_x(+X8tipZnCTGMr_6SFbcXPLIefxFhCz+r z%EWzl=f!?(o`#$jRC6p3%RN+9?Y%|$#nL)>wHcuZt}4lIwMwGY6AC`I)HCR=RKBDy z{85|=FJm@i&c2#yy$P?q-7oHS<_xdQI9V*!HE~lrVx+Ga?T7Qe8_=Vms5^3x{^E6s zT)VoqAf676gvxnn%V&7^ejnAn?0LwxbB~NSqRZ1z!!{s&XtiWR;q%plucp~znUjQY z!x%9n=(^Y;5rvpXJv7N?Qwf`!ivXU3+8-0ZA=@($izG{`ue}XUTLmMase}d~KcE>L z%Pr=6s zi$u|maI#q#ug3}S-UNh2t|70JH=Wk#ik-qE-6G>4{;-(5%u?UrT5I>E?T`S4F!@zD zjKsR4>ysqEy=^#sXvs`z@R5Gb=glwJY?xzJSW{RBI9c!HH^PSlW&-RLHp0ddCZNGK z@+bcs{a9gV|AOdo?v8D)Y*;f+Y8}RQzU9Vd7PgK__2g(K16l;@_2Bh(x^l2(k(K#W zr4`gaO}O@Kb>ET_-fVmE;>15StH(L2%LJ{u7Dkv=c7aZd0t?j8e+!i8-!p@`-(&ZH z6UoxUK_OYJ$37=!9)|?GYUEu3C|LwKoY=yY?J0lqrDvo-I2Ym73__YbaTaisHs0`e zLPG1X0q0MO8Nw;x+AYX3ma~JWZiCoz)M>LZ!(xN|+JZTLJ9~)%dAty7p_YM8)hg+t z_|ci>DB3z{{LY=NNCV2(#v3#th14a_wznah1IB#sL<#Gx;B)BSJGvZ9x&30j9vT8n zlqWD!SUH~jH@NDeeIuE5EbogeSDvA#J2@Xgh9_MViS67!-|;o3EuwBljnXF~x_rWb z4%zbKCt|UF^;4Jre!08|Gk_4TUHEOE6PxPQmDWI!$$K5$LoMh9_t!yJGfz3fC=}79 z_Zr7WFE-1l6Hd75VwpCQm<@R}IZaeKxIrHqeT9*{7ULv&zbuRguz+$z;{CuyEXS15 z1islxrqHaR>4!KcRqJq@9FcoJp6mXPM1!c@rok<50sq3woQl|}hFNjrb|*@+qv^d| z3R+yUK?vDm?giZSQ{Ln@ik_!98>BWEYk`pfnSI7OUc8XmjH;3aioe_5SE7|DkjI!< zwjD*1f8L`nwuK)fTxx=m7%p|jVF|cs2acFwYM8g&62HnnqY?O=1=ty|Mc-Okd7hS( z~(GX=nfhcOLmL&yr`IQM63!KaMzD4 zb!4QiZdOvnZn-l&>HEB|jsS;(8a%HUy3>F#tb}K4Y&bv2eQk4T*}nXP+5Mx-F@-()Q%kvWcCfRlK~L#KUqkiZWRO#`2chTg>0Et(;XJ@*U&0)d2K%tHJWQnsf%XxkioCn&@q#;#y5nZ~ zWh0x5y8n#azf_z&Cub-g)@PG$X5iXhFtzwfwo2`g;e>mR)zVv)dq9aovpyf@X)}n0 zS6Lq$;=oZd%AA^q_Ek|rkmNXqByH9nYsn|;0KllaC?I8x`7>(P(N>WUq;6sNdneA0 z%~q*)4V}Qtd{sWAj7VAG77wG`213Cao2VSk+;@6Y{qX-(R-f7B`}_H@m1);aHN2AA zo%E;31B=%6o#VG;b~5(vk1HVUZT$KuRj;KX)X1@2TI}ss1j$pV;&R+1!ecCY zdsN>^u*SJjZly1P88ZC@3do+}4QoNSOOb02J?I*SdzCkdN>?i%cC46UDV#h?zs=Ik z&3ywunMycj#yo>kskn#KXSATi{es62mYeU_g`wGYGQ<`o9++$>UDZ1+YjZ%`xarPE zfNeF2tmj$T0JEIA2{^{H$MFiyG$=)V;##{G18dKKTXLmmm2afb^jqD-{= z&3Jh!VHN#@@rQ`UJYA{7*c8m_X`#h}0TGV;Dtgv|=(lT|Y(P_0ma)>}Y}cz%hJG*S z1Qf*}aE1qxeesa=L9--U_GKi1Y(3xYtDGuKbN%i5POHEE2cw=kLW6OgnE ziFl)roMz0u8F8!$(F%0eQOkJOrLi56{z8_jB2Dz-DiU~)ZD6s$|v70z#Ht=oPvYy zvZ}h{MZmjP3gIGXj~xA(lkuS8w%FBpRb+7%hzg;dRk%l?N@BNRJ(^tgtofwE^ZB?5cYVV37thU+00Oj z=dHW2=HZ>rF#)gmH5n*9gOQhS$^o4L4@hkLa=L=V(wlSFNY%mEqGJ4rlU=R-1v7yS z9`*$dg?Eo5;Tc3%_lK(rBI&ntgx6?O*y~YdFXORpW(Y(F9r@M<(sUwVx(U2u`@8eVaO+iOc0zXLY1eaw&|{@Q*~{7 z3TefarQUBY&PLe}!bpe&B|6+5pTL*MB9ov1+X3}e^l)2v?l6b_dmdP;PG+n!q|8d`b`jq_NSNN(Nx_0+zZwh_KmEwZ_(5aMHY9=Fpz#z>DzMi%{6*iW&kEOuW)~j^Tx~_Jw?xSVuGLA+m_e#0x`(rYaVQ# z!)gd_bU-SA6QWJ(RD1Bl>#cMzzxAVDkQGh6I5vLC7&~q+eI7ebq`qOpODeCUk@BPY8OF`G3$sP zS6;Eec^{=}`bRo(wW)5Zc5^bxf~r!#B}ObZe`^{&0RPL23LC{iXI!P z0FojM>{Ac_+o!IuJcFGO-wQFRr-)%qtVZ$yp-S82fW?Y@t;vzVA^w;4*>uFCAgGui zLXgk|SqPu>neE|eTn^r!h*v$TIwCJF?ovb2&RE7$V@S`N)N(Z2o6AiLE&J2S4g__o z?wWTqLL;0x)%Q*N-MP$lh4|h^o?1JZ?T%NXu2P5x0oFq;KX8lHWNC6I(%VIS6_nU< zx}8$EMzEEggWHap?Vo42gER&EZJN~4jAHY+{2-6txoBF< z0g&IF1B}S7gztFPTBXqcw%46oOl>8D3Q=ha(&$dZWxT7M$Q{J z4cz@v7Qyz@Th=OUwcB|v)$P4cu61+O8d2U8<0IAraEcA26TaP+w%+{*^^mCE@d3iD zx4PY%N}MMPNl$>_f8ib1R3`%~S54G|-#?C#D*^M&opo|4dTnzQDFPGz)wMH6Q}$@e zcHW5TCpHMvZsw*7fg@H68z;w{<&utZk$_amQUwKnNQAMIhTNnzBfd#+HwhXH zM9m;iw!EhPYC|8Fx`54oLRn)s?>S^%t6iFl0pH_ zFw{PSSZ{rIo5SwAW8AIhmKNO>hafzvod%}`hDqP0+yBIQXb0p{Wzrn*=>L0}*`ZNR zJX%KS{;6!UI}$Lb5_#kDOg$!syH{BeR1) zD|(E+XGCm@+HTNLo&Ob|YyoPr;#udC#RYUhqC2sE?=Q}#=e~e^i1JN>=pji!&;kBj zz)9pd=*k4e0%wEVea>?YE4PSjhQb6fkXNS7AxQ*oBs9gbGx+m83jKT@rdI#`Ij}u3 z0z_XfKQ>yv+dD%M{KoGy=z2N6cpn)ycp18)=uUc;$3pF^>T;}lR#%$yDg-s*?rh};X!RfY_R!$mzvBY$c>*3ks$O<=N5Viqyjfd zd{h87rSE{7*~AC@&rDc50{J>N-=G5}Dfu$oYWt$4o8@&48Wy^Pl=*O_yNO8d36~v? zTo&Ns=LK=0Us3rj%PuW6j2xFea}Mkou>yWyH$28!2kZa-Z-EnQ-L7I*MIG12iP9c=33QC`ML9vo@XuS5 zVeNuFlQOdb)uZ)l8x>bE?NN#jFQQoJ>_#$GW#|3Mw`;_wYuOVJEMQWObOIo8x&Cdc za~Y88e?b}svJ7kw!;tvK9Zp4rj1NVGy5<``nsIXWZD)e2w9Ohs^HjS~;=e0cC^?M& zBL$$AGDuAb$@u}@E(DVcCbjsj?U|?F3Pu#%!IJq67>4AYzTi#*NrSPP$o@9MCEQR28( z(ERVFuhbs6!!ya_+974u4Qu&-5n>^U8VrpX8_xU-0AX2KH$Py6XzKHKOX1n*O=ggl zV?>_mGRZUd%1@D;>rawvz%=4Fv~@}f5`lR`+EzS!YN91%dKmcdHON{y8!` zLsWmOcC|ClfUW#{RqkVe(Z+vOz{KQsd>O2}tF>l(Sj6V6UzW?##TlxhRma75MVm;7 z=aG>;nNaJU@v=}ib67LS8E z-$BVqhf|k6^#7JPhZOR#4u9t3i7`POVoiRxs5m+GhOQrA)3yl7f0Yt#ixdzF+4axT zh*5B$9X92SGNCw76mS;Tl51ygmI9BK9Z;7I^a6q}NH6>Ku^KjWXjGtsiafWc3V8tK z+k94_$~5o2KeGt{ngpBi8Yw0A6Q<9Lz73}In_a>RSX2vF)pZ~6HWbjnVT=35vPq0# zS$Cn8_7K@RvLTSSdwIGvF`Z#8ZgBUD$^&Z(sFZ17M%)+zeGAU!S|Fq@B%uZs@`@n{ zmZ;x|;47a}fjKE}6+#l}WYShC8$ zV;1ijTF_kKJBK|&eT4cB(p0ZF!?*@nLBhTVh%uWzRxpS`OONE5i)QUvh2taeBfsi$ znvj<6-tK3twH#K}IpUaYWsg$EhF(!jD%@2qHIfMtFcR?E{hHx(Jt`%=n-o?|@pJ|5 zCxMc(Q0`jSTo1#-k4H1U?H65b64t18Q~7rR$f2|=>VHrA1HZ2X@%ho#LK>}MJ*uQSa@t5`!>N0cp`ncpfX(gh8uKY6btfihI$^&n1DbFrR)Ly&55=5) z9w@;7Zx4s(Jnn}$H!Mt??~3#jDGd1zBEetFvYobA{e z^tRY9zK*u*S?d0J^IiMeKhgbl@nceXaY$!N-Yz~e^z9LPlC;`wl9OjM>pvfTk=6e! zkCl^vXQ)_KH3#=eQzKyE=gt^hTd7-0>G9liO{cfq-}vZJD8HcixWv^O_VcDrc2M3L zMw9Yib6z@Sgw8wZQgKv$^wzOup^pmAi2jLPax`STb-)-{ecae;+<8~K?%DoI{@e6%k^Aw| ziMjo*_yYXdsf9xOF6xIO@id+uoCdz8J@ung?0-|a{r^nmx;l{0P6d$Ys2gj3t{Eye zU9F9k;Wt;;6&{3LrTsp3tW!LjlZUM~S~Aau2Q5NaMph)dFMlnu3D9QlRwcnY7%mDj*rOnk_ph7ZO(d^jKx9}@lF0N| zJ|1{LxwTPlP zZV`TcR($=t_x0;~K<@s0fH?q!V58*(mKs$Cv63@-9Kjtg@vYCP z{o?sqx3zY>T}}5bhF^9zM_#&btK&(yd`;-5NAZ#fC%rwqiq7ftO6@PqZTD3>UxE$X zQ$s0Q>w5NJ<3WTi8+v8^m4uJYPAQa_sT-| zwy``|1Kzq46tDuD0z0ujdH3wvk+_k{+K3````X9*yPf`MM>!H!$e>*}Bri4~LG8GD zrjq-1&;`nE@*_zOY78-E=>Sj%cGd*(u7V^s%&nwwH=(s=5VSaU-f?&~QiSi=@--f^ z7{bi3NUEe7P{A*a z-0A_!%vVD`F#2MYGy%m4I`c#G&QkHeJ;96Hg!u5r%1f8iqM#;3DjV^MD@V}a0+&8# z?fip~p0@2OuY*@Fx9Y6%&G@W~+P1fZWoc>>{pRJ0@8|IKIK$k4U~2?Ma-u=O@p}E`y(4d4TTeArJYza%+F4Pb{GGQ zw@1+aqRiRSQ}$g0m_2U9B~HL}61D=h?mPk_d?|lY?y&kMwUofS@u+L!hl+jp^gTu> zn7WjT1Y>E*fQ>WnrZ(uJ^+ukj`0OM3wt614{`s(diTyKsJ+Rf<`PBQB`|I!U^40Z| z9FG~Pz@7q86othe>QQJzf-Z(-h6y0{`}V)Mvo8PloSft^6`IhLigu&7i_C7KrJEi$ zG3hcvwf(9aiC^eHthHeuhMX3-)y}MzGOcmaq)-<>>w+E*0&^(%t$XLC4xGrePemT5 zjkn`Kzi*=u?j6q>zPX+v84vt{^}YII+IiZkZF}yiG8JOF!L#Mu;?O&na}~*%yc4Q< z{|P)o;J@?#$;~kYQU;q7&yri;?n7SUPD5z6S0R}9Z*NPR&d$$H-`bBqv41wUzE1eI zz4v2%YCTUD6kNYnQZ(`FD+(AgzZWZm)97mY5lx>H&P;xnvXZg9L~ z23kbKuJE9QbO(jZj8GQiTTNcp0L2f-enW6R1Oa+bGjXJde2ephL{yoWO8Af}`m;nh zs8C|>34@X4f32adC_eD)Ly(D^LjA1Mu0c_PKyQ?ooK6xX8xal-?qi%nz;{DiQZxvk zU3i@{c^ov#3B@3e{$jse_kF{c^wz%x++N)IHtVMu8yN@TR45F zS*AWv_F5Z6EFFuG5=EsaXsn>_**qhrPMZz_($J@5+_CaB^N(M7DSd^N2neWy1M*lu z_qBR>)SCkyZwr@^dBJH63>HR3P^+P+kRDZk&DUDsf_vjU5Bv^sn7Dv4qk^zlh}}heQ{T*v2Zkx8Sh!M;;sCnmI%`qYjK;pzIO#*m%ARr8PSb`ykX zw!hzpBHI4z_GSD2*CfMoXUtKRW?1;MLM=q!A}s%-X}`RBwMjX78kz}GBgo(o6_hlu z*cLJGq0U*IY25np2Tc;lWGrnwYz@dwyiUr*GPY;&{pbpV<&qz|uDn7By%0%G*(x$` z0%?DNKa3hq)BtTanPea5JE`I(n7xJHdDo>+bx3KO6^lRYKRT9-yGd}?iNznvE6Lo^ z>|}nVrbocsHwaBsz72~Z3awHkUh?^<6++9m4;s;OYl!@g^1j2sTvQX@M6&pdm+whp zu>Xzj^?yazcx$fH*p;&F3cjAI-v-Hz=%3!(XK)zgW*7n%AACyaq3~O@PW2D|Qemj` zn!>k_f*@q~5?XMs@o$Md$YXLT^Wr>wTuIW7c$y?q*C@y?pvyf8^_b@{e+>4NkUd$Kt0nQ1s7d_TN%Np}R1jDL}mR@oRUl0KP9) z<7ct(g1u}p^;r7Wf1@VnxYqv|(@gJ- z2`PU6iaXDtUSIi6PU>msAW{mgcGSF&t~QN2U!=8z`|ibZ#>MEsx}C$r#Song(79UiY9poEK_bKa-gcG z@SLg%JMJO^_O-7!+l_wz!aFQ&$V|28`zqwm5Lu@V_#pa-<0Oyur1$PwNpdwlQj~KHxa)gCXx({j(wb-vuWjHQI z(hI(2^5)Kz8V_l`Y8!5NRSEwf&NCk6LdZ778U{Swex&dA)PEr6FOy8n6!rV7f0)Wu z>{4mpugf0I6|63nx1tDH0b-v}Z)3;{)rr|EcR^7x4Q~vdnvKgsbhzyUQaN>C5uU zg$6^6Stg8?_-DM25M=EjB>VDUcl`-j4QkWr5*>)_(7-9+8cS9MHu-ONMaXQ!n7`dY z;o+c)aLQK3c~4Kz*>@Eo3EuTU_=npZ^S&n0XypjWAw|s9#yL6w5JUDT2iK*LfXC2^ zTSbu=bDyyR#?AZ7)|cQz{IfttY7W4?#Za{=U;M7_EnzL0&ZdHV)PT$%d$k`am<9)= zR!!Hv*z>%+l&5zOXm6VZ^jq|<-k=jwqEsQ=#JpCTUX|wj|3P-3CISa{w@9+9|H9wN zV`DC}c3%pDss5RiL^tNesOlvtF8yBf1RrL+31N7-IG>E z2&27eV0cYPQgI?K-yvqHvqv5Pbpo+Mdz9EUrjL8-M+D(19{x7-a=%96cRlG-E)F%Z zYf9*emR1b}IDtFri%x~%M#pM_#(x+$)4!=!uha^-fN>Dl{LE>h&ln#pQK@%f+g6o9 zm(Ji38Z4!DK>jC4GAfX}@A|x-ObP$=zDo~D0y~n{Rm$Sp3Q#)8b?y33hIIeGGi2jo z{=&heC-9&L18r(_MCVcyGcq?MQ%J14MHqzxz$^>P!Meg%DpPZXu@faN4!6!Qk%~|w z-Ktf|{3jx;8_O=5$v4+xnG)FI$0jqEfVMo8(?KCTK|p-c_33Vz5yG-bby-K%jW=U$ zf6gzlQ2P^J6ueLm5=}Y_vjVQb;o-Heo7joL`o|ZrpX3H?rA+O_gvEz>aUKiB6!uli zXfR@Dit}wXhKM~wmn{L233;rX3Xt$n#>MC^_l@V&v8oIIP?rNQD036SbFw8k)~ZWd zV^Vfhd}!t<-Cn6;n6#AEKx?RO3Yg$>fN@X!J~Fxsg#52M?ENIRnbON42Tlm$`37m) z>QPceT&Auv;B7?4#GUClrMSBeydS1Pdjd2542ZfNRk|Zz_()1Wuk8G^c^)^Rc&WKn zlCM08k4ad3Q-w5GfIC1_+ld2sNs$xjN@7iD<@>62)kr})xFlL%Z7FJ#9DgQS2qZiR z9%!w19Bew|TYH?L!Yq4^a`AO--6E3nxT!ZTjV7fIEZJ5nZD@CL`cbA!?nz&2uMdXdaVvxx!VMu zHVemy+0=j21tFN^&Vve1KmimA_ynfFahU#pw*XL0R5KO)zyX>;1)Od?hccStSLnk%$WKGNsFWVJAHv!QYh?Vi@DV16iEH(H(%T1k(E6J zxMgasmeMR2^&Yb{1w^1LrY>V0Ry$yfKuRw5pb14 zISghFQ|-papf*5h|F-PD=oZWJogz#4csPyD$s1lSSji9R4f{O2<5I_%;N-VMT#bc- zeD7`32uDz}as58rb;DdlYt$cu!GBAj%*5LNYY8UpF3X1IT!z8cOvKP;`Bhm^5fNE4 z66vtuloj3`bZb7@d5p-tcY4$m@^i8mN#U_6Jz6KMH#>k)5d-ykfJE%p&-YlQehGwF zHWpEo=(x-YXl*uQ+=bk=FSQyV)ECd_TVF!fSlZxwi`ZQC8lW1fv)xhkhTwfI;6!wZ zzIiQ2t3s%XT``dW(ItRGQJK0v|oBXRxv*kgke&2|#Oe{TYWs|_;x zy{9*vM2&JRgO2A61XyE9!W_zkrdNHU%SLCuN6ai_4~t{GQv6gI0e=LO;S=9Rt3hYD zyKn-+UAogBJO}^TiRZ6&kXpDjIjZl)@Sk_)@1=$L zmO4(jOtd3vJV=O#fF<)HSAUj6AsaDAJl6X)%fs7S$5yAC9?Z#G=G$R5?;#nfNRA`G z^Oh7!ehYdyWLeD$2MG3v!8ylhd*zam6O>@PV3s+EFq|0>jaEh!L+;!x=|D)8e_@3* zA5#2j4PRV$8I2WE5|U%JEW*@Bm8jwY+?>7P&&fwocXemmQ~)id)tCHdLS&`v%5|$3 zDH-h2NOnm z)a1kM#y%K%y@b1nW=6w_^t+RRksfNiKUYj*?7{U`H zL9nY{Umz7xRocXMN(%>?afGb&Nc7VN;x4)jgDl`Iklf?v0+?Ht z&^lU&uEGGPMYN*uX<3?i8joW?OAI-RO3bi4(U1?}`Q# zx>?x1cz_C{?W^)-`-^Zbk#T0+ALYghGlxv_F-FclIQUI~V(C%DynU@?{$u7MOCPXD zD9nE=O}lH!|6`+MG@U4M19Y6GKi9%M^(`ayz!Box^$_e@s?lI7oP1&{t7!Hf;xTXx zPk^YwfK4G$6kYWnki;G@l*& zZI>T-e`CKK|+lGPb7p_?(8_8nwz}$Z44O^EV$^ts6k}p z)qs>KZNJGOKuUQtf3T;7$hlk^+j9wWGmo(yn?-7U2(n_~HetyKwAIeZji5D97R>aQ2^g=?njlIx+ANl)A(k zUrA+0_SmQ=FOrI0y)&Knk_X>kP*4mylrYf#xJ>L3O?S?~aqE<`%O_O8*loHI^8e8F z7H(B`!Pl^KcQ;6PcS?hFNVf=w?(XhRIdpf3bazNM5{K>vY59&mZ~T0(>-!V#z4tw{ zX00_dARBtq-!QCWY~wj1()~}E^po(@<^<*gF$F+8OsQE@qBXqjm_V~-dUYx`8Je(N z52NU|fcpyUE$On~haF?rV+)n*lfMiUBdj@qa*q6{pNws*tT_zsA}*3)TvZGED@xhH z3tZk~+sd*=f8SO-s%E28d{n$Sabb{219w#;XD6^V$&1yGnl;4NxG`l%+X)IaR0(DE zCP{2l`2z~sIkO)>j>xoFYzd8Zq`ZDG2m4{J0RK;QdRfHnTV|py2(8(=1({+(Dd&wC zt~yS*Vj{(;kXqL9NlkbQ%!FoH@lpX;3Ep;rJG#6^agbEJ#gz6#L*uTw2&n1^Uo!KJ9tK zIF+b>WH6Rf8FHW@>R890Kw1V?BXx)HEb+@}ViC@&cxK!+`)@hc=HNXH9(CS|o98>J zm$tpNOUpd<(K_Dmd$owde=)sA63}PCZWZ3l{T6&mK&9H z1WIN=nmPoJjX%=9Kii9bHwiyJCLFx0|Lw1MkJa=)AM5?JdCKGppd||Vd<1h+oacko zNtA#WBGO*rh(ZdTdb8rOO}gRt6#mp6Myh{%sGW!4or)U zh_~KN=li3_56B5kemcBXDcqZ)`5asyf+1O6=63z=`UPpqy|(*Tn;r!Mn4^?--x-=X z&vxHnS53RCCwtU(f7@tsVK97>le$jtDT=TN-F3vBEd22|Oe_8Rhb)swS8el?WQEFh zFO0N8>0D&L6FH-=(2fr1YJ=qR0--gS5NJ%O@;li|uojDDbC;Z4KqRm5;g3^DhOmpq z^%7|h1m$`Y3?Z!*1wzW9k4PQ&6g6QXa7H;7GWC9>FZmT{^O~}Uqseutvph@ z;~SzRMf-Ma8xf%S{>q8$^%PVM`2+DQ@tEmUX7^pQU*WUSTlywX?vLksJflC3@ZZw+ zXm7ou9GwWoUfsW}-@q$a{GVWaVSg!2;SqW~6GwcEXXg7DIYm+Uw~oa4r;bEZm*&|q zFv#^8PbWqTgf8hQN2nj7r%hxx`3~F4#YoE(I!T?2h9GR4fwxU@ z0YW#`J>Ob-iO7O&}Y zni3?0mf<};dAbhevx!`AlXP)?ml9jiw-bpg{DTqEJEB-eZl6hF3M6th40~b1f)Rx{ zUD)Nai_r0$q@bn%HE^a^C#*rpNw8R3UON187Rb*-CUtMvJM-a$ZmV_K!9BiPB&f&1 z)=T!wfSyC`4;F9{xAM7W~_Ts{Bk$_1l3@6U#LP5M1kw(5bNfx(M0Dp zBO}EmuhBfKY$Y1%bMw=Sk@%-l9&Fe&Vu{w7Ky)koRv-1_R|0A1Ae5MI4tY!YbxaSv z7=&YYI^k@}r*ppXIbY~(=@ujfplRbI5OxVnJ(K*iYxz78`Lqoe&Ac((>S3Z$5EFZU zmW{`GK4(oJvjSR~`~6F=S)aWm)+9Fe8$2RN7vB58cq&|oeOik+Kmc@KE6cOKv?AoC zQU@a>upbiZ*3@-&o^fLNt)T3+gL>3wV)ObZC*xu#zG$SdFYr5lIslLDni6!V@=dB5 z=*S2`<%}0AKC@zDP~aje4G<~JO_Yfi1R`Bi$2{<kbkPbAPvUi78O7qj9aq6e9s>EAFT#iAsC)#NdmpA6ry{ zXChV&TMeWlu>hH|$khwfp7->3LK&h)i<~I4h<&frJ#Ji-Yr~LCrMEr3BmALO-5M14 zQr{&&Y30UoZ81|wC6f(fA5|b0+6K#-2Q7$D3n}|teaYqmvpl#NUbCydaf*PH3E-)8gN;2&0Y>_y(X z@5zmk<8HbS#Mx6=gr5i7PCoo69S%{R!&QXah*Es!A(M!{tvXY%1S}I^OE)$tQ0hVo z!S_V`L^uRGTBJ$z@o@_EtaOX(?Mx2#`U1uOxT>6&7Uh3N@oEiu{xy_&<8xe_P&a$c zxK}KzCF@p3*@cGDOJwHX4`{Y=2&GhbEIy7XrC}(@N<=l@ejQWqB)BgB0fXT2**WC~ zUEyscaEkB&R&6?j_yaldRk8lQ0iQagIdo0Eba)6+DMNo~Slzzahtnv@IH7$+uCc%z zWxmaJZ<$>0^>Y@0^{x7Z`TO{bel~;js2BmhZt6CT?58puv4} ze?*zb{Ng0hyej@RjRbsCafAYB7et>=YBNRbLIL9MjvAkfjeZZFkH76Rl1>RNkkdSn zJuf4zPyIgaUUze*e zLy4+hA1jy5<vQ?%)b>S9(HGAJx9Fb8pJ3r#OtbV@TEYp_EbJWQ>0(X~`KuTQ!8fiFSes7P|!x zM(CmL-0O5TuWa`|KrOH=p2t~f9;#>7ieUf}*8-AW)TYbWHg@WqLzfgTg}(;Yip5`% zM5I4^oEI-q=)~VCg7iNLMkqy7UWzLUDto;ScR#wfRjz80d6h@ZcnaP=#tR#TwI=lg z?pt%;TF=W%bLmgok%&3wXf}>J+Mv+hP+J@e+~LYBUnR6Eqiie_+tExFStvhARZ1w9 zm#XRnY2r~;cB(_TOJ!Oqexcxy@8zZY7^*dJz%b)Ld>I|pI=^?V1&B;Brg-8EYWYk8 z#9B$4QeDvxQgfoZj0miwL*N5X7h(HO7`MzrBzS&taae7SqM7Pm1F7y}Mcm*uJ8zos z!r||g)4oAJ$?&SZ7N`ODUFbGIb6Ib zeav7&UGWC3;i>IeXefAzV1)7t`@OZ2k5X$FT#1Bv6X|mJ>vYCq#WI|pZ!Bq{x-&Cg z6oc&O)9|QR8+!8}%7T;9b3)@M8UK_3@fPpBpeeHSjF8bZ&Ef_SkZCb`h5<$5#ZYx> z@-n|cx!?(92AwcpTY%u+?&tN3*Nbj@d^k(c6|MjEBY1Y%?dO;AyL`8d@WQ}|ZImSNb;w4z^MBI?a=nB=KNfbk%K11W<)1$OGt1W+ds zuOkmHTjHJEpx$;Al_B|U03?q~9;w7m5+$$WcG6SI=L-Tj`}%-r|FJ?t<92kKe$N|k zXEXKAs6smnt@fYC2FT-6AUvO2&2A)J$>8Ch^C?8Ih`@QSWT2B9xG(=y_0rm587j*S zpl?ZK3&&w&gg{gUcXy|XVq4+YTn}52vvTR6A||@%m|j<>!VrTZvu-1^j&|!$fe+)? zWZeI8=#T$kAF@xz&}@XH{(RW#3%3AX+}2_X`9;p zwj-v-w6IzjaYo*FA9IAThlPN=@=+GCFsJmoAZQ7Zy7zf3r|$_mWc%m@nG{2rUq3`8 zjLUA0uOt}OFYw^nH6K~kVEz|H)+uMP2}2i>Us?L+N zOQpjdfE&YbGnOGI)g0z)EVxN4^1mi65|1G4&J?TWh}^D|f}`iATc0Wz-Ok77@w&P*o5g82arzv&%EzG*VJggEiOxWe#YD zy`rKFUzE7Te?Nh5U6qoAiMS-+M`JfOx#w5@KnM8~p-6nbp*Av%eL5O17;UZa9s}S( z<^Q=1Adxg^hBWzp;qk-YV4U3ePpxF~*@a*^A~gdl6}%OMWPVCDo*#mOiiIv{`IEw_ z{sGdLHRyYQ1O>7P3)g5_1tsIL${4~+P_+U-;;2>KI4;Z^pt*0vJB>P%*2gzCh!9UK zgtT@$&_np^SZ|o44KfjB@r?s|)20(QB!}dnd;g=z!`=k*1+$dBnamB5-V;7nuJ;{- zJc?QNVGikWHtNQKY^HjNP^}lCCoRoEl?E*+^fMU$PNNBt2}QX{AL7`+!ihXOID49c z#ra^X0bK-OkN=I{+jrW2BR}xso}FZ6k(Jlxw{?5hx0|=y`xgUL4$uwR>)D&i`bz&f zIB^+aMd%Gc=k*FBFOxL+4S9 ziK7EA#*dzvMiR_~tpsA$cMRJt`$d{&+nuXBo7A6kO&9$v1-ZOK68Zp=g6;TP^ypIh;+ z`_2o%_Va=vy~?rTcge%Rx-AoYNO_n1_QJdMC3}4|%4v4&$Yz;-bp4S(g3W;=oPNCg zln)CG-MM@N!_-~jEcaJyrFXue278~NmlurnOel3m)dv#rZktd*8f&9)k}yA|^I*h= z%Tp7SmK{*F5|4706A>hgAwx;x*tbqaIpwz;OuaUxus}?R#<}!qo0v+0`+iqzW=+Hg2K=tP$C&I*}CV9uBev|${9uD z@JKsqA|s5CQLyW_xZA92EZ?H}hB8g-$S_3yGv{Gdo%r)kj^R33DC>}34!^eajl77ZYcJ;iM% z{Ouic8fKg?{@L$L6#eK0uaQIe*Rb<)(}athwHZTD2tVQk!DI!IzVyt07r-FktIYUb zh5kXMRkev9R|l#1T3e^JW@D(taNF!Ws0aEXvFU@TM!eZhLs+>FR!U&$ZD-jSn-np) zmGV!Cr^CKf*ZQZ#!~IX)P=$REno@zDyH3DSNdsC&`|MLMPt3L!1388%)-JlP4Vw9` zpNXc~umCI8VnCJ@&C z!KQQ^6@ktlNDlH9)?|wcIZ*V_siNlSO%c*(OFE0hsLwv*lzMTco(3akq>P_&LPFsC zv*hwghB-z#*~UX+k-O9JMSjFE78Jb^L&n`VqRuv{Pf6ZO*o4!(W8PbXWCI zg-7kXNhMTVo-PZL!iizl{q^0{$~ODL_EM3w2^XQ6OD_&l|Bmaay$kO)R@ z?ZQLy5E3vqR+=)v0Stl}mDbzHVxpW<5g@O8AI5kd?WF4ng`_K26pZ*Xvh#J@E7k4l zGEgoNWu=#0wG}p2WH)Owom+B{p_URw`KoU-ai7WE{dQ1fUvQV}&=KQW7g&Z`nIrAW zd2IP{5Wx>DK?xq^O>A;?E8Uz%8>c781RwN}q>^ zCs+z^Qc1AR0PYUH#Ppn-5@=47UTQ$SluQjHg|EPsKeLU$Q^Qsw2S#E;xTxn@;t8#V zsLRoA32piO`o{We5*AoclPfaM1qVnbG@gWhHN1VMQbHl|YMrF7u@F_zqR=T8N za{=;SrHT-Sj$p=0Fu18_dTy~~2`_jPrSq`5Yccd^4{Od>x?8Pkx&6IsDP1R43^WUes!w>WG?t3n z-=g0-c8Wu}H}#tB-QRw7-`Km7`CJxmr@gSWbzd+2wz{uSL*+8!n=9l;mIv8hB7MMPv65*}{3|%?kwZrczE* z)1oTnN7JQ{QK{Q~VT(b9)FDPy%}EE%1g?ri93hFF%(%vf8%1a#9i<+52?z<$I^32b z^34p_cp&Bis#bYJI<`7|&Rxr*c?HZR_J+TI*ly&8+1s+T$6X`~-s%OmNgS~%lyz(+ z**40oa;x&T6;hu4T!a#x${Eyp&C7ogb0>=@J$eR3%xv91{1`biXNoL_ttp3nVJYfE zYM%;!-X_)CKWt)iOA^O~8LDV$#PQa@p*Ih$sf&aES)!ePE_SL-U+1$Y|269>h_sFz z#S7>@Mpw_x!A$8w2Lo}44onDzn&SKDjqSoDw%qnQOVlgV!8@bs?|n9{`S=UWSP)Uj)vgq&_Nc9zP8@+gNk0!o6Bu0vfkbuoLAAr#y5G58!}o2?+#bWe{NB zgK0Z42^5=~isQYpPvZ8qtNoUJ;KkY5^9PZ`WYIzt(%%$fWN1$#Yx7qLr6kk*tygqd zUiiMhZX2$33b-Nl?!ayZ_3wXhnbMGearINb!=3LR4*e_cVh*Nq4h=Mp*|=r{ zygLRQ3^QjH`+N{YWx0*bQv3LvQLpj6PQS&~Ud7_J!?jdz1$%>q0dF_{Zu*iM9DZdjXQSB*WX?HjD8NeB?+k+p01g{4Hu5Hc%MP?we9; z`pR%wb)v$3Wa+D56H8cGy3$t6pkc1PGK+1#Dq}7mE-KpcPz=ms=}5sQMu+aAx`z;Z z_*euZEiYP2w6O1v1E+FDZhqS9Ei$AZmACz-J$j*_0exKg)bW+g|1jpH;n4-3z?`1- zEKrC94!ow0xq0oH^tH~8An9D_IxcDknneCu-fxuBY-~$L20L5wFyVn9YbHt^X%cbv zd%%C!((pg8rL!rnLD;{&c+F@>A(6z5EGIcotglYVX6=(M(2~!X|071|9pWfoWQHQu z!_%rH63ZM<6&71)axZn5W8u)MR9XU+I)u0?VPfJM0`7*|Y8_&`1#~WGAsA9?q&E`U zl|7}j(U{LWDvkNp`l&)NRx)t#WP~=Qg)^&g?HPt``P~U^-VG zPZJ!rWSum}K2fP4M9fAuZy@7c8H{2{ye2~GmOAA`Hh4Fq&^?3UTN+a)lu+WRM;RW3(}tO}BN zFjaIzO_R1%V{M0{v7@+v#$QLp74c}FRYy-QwzpKpU9@|7d*c+bWf8hBPY6|5wp5eO zxc4XJbtvA;Bbq)nya+!5Xh#vd1G?XlQPl)5zx`mZw3*8?%$YSQgUbJQNzuYbM`A0? zg`bBvUb>Y zt8R3yJKTQJ@zeLR7fyHg_f9$A4J7;o+G{AQ+vcp+>-ls_L^4e$c&=mK-Ze{u{PR`Cc;cUp46rR&xXdPd#x)QlGeF>Y|T&gv5@XeSyKGnZ@elTWgsj7 z9t4~s#fnFB3diDy&?|4cFSEV2m}`eZWt9VSv(29+r>jdYzn^`wZ|vg3LVb$(6*L1o zw^)PznO2H|Y33RTejytp`Y#?PDs&l2Ik_ohnNG$zNwa9mx^FqsV@OdHCsOxQzgI4f z5H9Z9NIH+Mcj86e90@-W%1s&hyd8AkXZdjpxU>DVnPChZY78lcT{M7NLoj=MU?r0> zUak5j?m$GB!=u06(eK=VOt zO8y8+MiQEoBQ$4lRJ{(wlkH8mZR*&2N~v!0sa75#YNJtJ4=kMgp|@|sfU6*PwcV%g z%LpV5FRyu!A4RzE^+?Vw8Vz0PCAGbeewfw-3rL+Bp_7l!e z6Mn2m7SU;0#Q(qx4eN~YX9}j%c=1|c_O6jSoT$UqP_}iVm#N zmoL+kr!&f8BpbW$$!(q03qyXt>Wt0phqncYa)E3QxsL?b^SzMb`9g4Q^^x{iJ>UCi z%Z09BZd?-fyo=hx?ca(cGwW?RQqVr=Nn&FIvBGs9`)oGowccV=RKTG{Ym%} z2C9F`9AJ!Vk1iMvw4;(Z26Xj@>(rn5Bv&421mF=Vwhs%pG0I+8VgrlcUDDYO6#=me z%%KBiSVDOWUl`(Oip?TjgYsr|E?xTF##de%3}BQayh_fS6KtHYJQ5JsExxc z6};agbxNwY#pd8ztOU#I!Gt#QzZ57dJaF%@8O&r%DyJ65+Q41Tc*C4t1u@e8`6)Q~-#| zN1@mAJsaYA(0(=B!d-_%T{4C$aYZK^W8m2({(4)JDV4j?$2sNkim;j8~0l(C}1Ugk7! zKIgJsMC_;FH$QO=sCjWDFdd=`fxBLg3TGeY4oC((&`v4PqFod8$a!qv*THsfLH*9c z{&S&O?SGY_|C2091WZM=(H&dZR%5RD?jSH_`}(I;O^ZZI@?-+D;^6B^3mWBMJ>pHn zAP$HN6Ci4pR_0wf6za8q9fe@fDh>@*3ShGRs5F+=4WYheVE>9v(hUdau*x`<{=kp4 z^~~t=^kP!uOoR3^kmIIeXD#t#5QfZbw$zBb&3N1|hNEau!vQ>@l29i)nJ;?}+J_z- zxv6jC$I2;CU6dlaK&;-Z?ywmsmEL>f8%4Z zZ~LMc{B(AL1KavsbCAu0R_8|`s=Daevxq5PY5MncpNDd7Wm~$F3>j_ab(%5S$>3J z+un%Y77NinWr0EGzSC7G+DG%}O1kW-tr=V_N z9zGFcWw0g1d`e?<{SSpvvYr^MbLu-!_)*5W1;K|;fr{`r1cob<3`$pS$$_VB9 z`nC=Xf|!L?(;~e4-y0A(xuFu25^oROWQQxn_#}PNi4|3B1}Oj*GwuJvlcj&)39|t1 zfn8=%boluu6{Fd}k!daguury^d5EyM2U-KVyFQ*ZCOI+zncd6r0gHE|AbB+630~z9wyY%VT{s*fVpqX(oLe{Yb1G5T&SY5-am2TW)Pt~Fec46`PWl? zgt(>h-=#&GaSPD0)7|K-#ON!J-Lf}A=X?907eLpAu`oml_yP(Mt|2Q$;gGTutEDcM z<*3i70yyl`5CC4*z#xHWB>PdB3f93Tr=k9UL9IH$7^Tp<<7V*hRg?3m{_F6j7z%94 z%$tr6!_fHeE??%a%uIif+G1D2hEImrTN<-Lj|F1==pU+9c;7-bCOXz!Ww+J7rHJf)%#qCU#z1Uzbpy5d|)5ksM2K9rkPx{ z+n5g?4Z8_9i`UDbB1`XCniC$xVkE<+QY+le_X+a3a?#idsLp$UqiMjI<{ZBPb zH@v$2#hMM^*e+MX7+sVjvQigQLg~ycjWiU#03j!U@6N|N6VQM%fHbBC zwWI>YV-Dmj(aJQ+@MzgKL>A-DK&)o1z-k@hHIn&CXF2pELY9dr za5h%|j?;5c5DlKQLkh~E8JnO?tjMSVuPSLroNhRA7A&$w+EsWUW*pm2|ETB4&t;A#4->=1`Z64GG1aGe9!M5lZV&uyY8y5SF{@2h|`pIoU%I{ z6Y3EBK4(S5zN4OtkmY0^bS40R27DH0vXS7E6Fd-Ta_e@p9JdpAk)xTUv&=ts%=bK5 zk)QevZ0}i<2oH2lO!r9bP*59yPvL3+zUgV4&zEgeY633&3E-;IuO4N<5pl#_9WpOySK~Er8~Kj?=;r0{4^=wf)RD zl`DGIb)Rit4#j_3i^o4##}uM$T{QOd!>32hQE;It;=c@L8vp`fGr@AjLg(c0t?wrL zeLb}jg=|hkQ|JJtPNTtk>9p}8EY;`oKvI6pNI?kyFDrl9E|#MI$uJnC$F=Bv4qMA7 z@d!@_=5KkZI7B&m3~~S!Wpkvdi>RtVlAuK4U`hnj04T#~Ki5#sO#|v8n6n2%vNb?r(PR`8zgDY~ zC1P3P;<)=%!mln1FHUgY!*xLn#us(r8fK@3URH1%f8NlUuWNPrPq)cPi@zSsXb>Jq z-oy_;Rx@Xcx*=E+bU%MsXV-@BaCX-mqfa|-SS7d7NOcVoMFG_%r1gdg1gGx}IQtx5 zD+{jw4P(Fm4P&m2>st>Fn++Y~`#J;VJx%e23Mh~?W?TVuwxZ;L2QoA%$oGVfLMF^i zxbO_0X$M7NfAg1X>{4ipLzWh)6F^ks(iSJr*1fwkEwd1oG7 zPhb#B6WdVrkXl4l|9;T{?--T3-<>Humo?fi`nJ5f`irPRJq|y%4+J9( zqQ0S72*_=&6KBV4@qKn{uH@C&SnHVxeI%r{V!(b^cQjs6RK4^IC6a{UOssj&ahia< zR)D3R@d-XocV#O;x_yjCS_BI7@YXWP#+lm95dJcPM0xK$VvN?fDi7jl_ki8-ezhHB zm-s&6k&tXVmg*0|GNs%3`^=^}ubzL0wTzBC9L<(C zk;q1?ImXY+D>ydhKWC^Ri?Jv5_xJy?)*jidw=D?!y~vV%@|y9z$$B$#&&#J~rPx6o z3OgA>m*#S}1+1+kaO}s02*x4vC|t=y!LkCdEdG3)7K*VuyH@<1xdn)P)J;}|FcQh? zSs|+=Pf7WVx2m1Zk*dT-bC5sFI)|nYvx+Csl!kgD-&og!j?6zu^^~Isw);>GR*sV1 zv-dmlVPF>POAtWcOd-;9Ddm!`a!Fu0Wt{H#@tcLn z=tM)0ZT3U`!)l^^qS0QU1_ID4;}cauNjdi^11Z?Ny3=_VZ5am z0G;UDjp*j<>C|tVd%^A-K|-BV_vdGyz{;B@{(Yuqd*pjXo(fYL$;%*_>mT@;nKfpc z6DbXZlclDdXlE7ELEoa>NdDu{U2Oh1`~NQ(-vPlzzxMI3(f<-&D4k56^dUQ_?rOcY zTRH0kE{MF;8F!|ckccO04BH|>ibGN^G<+1IL6Pyg6q=U!#p9zcJhPY2#%vuZeQ8Kq=uk&e2@#4~G|(kp9bNOm@_ zP|Eg+%Sk8gigZ%>%i~)pl$Q_+2*<5NweSh zP0B_0Th{?~Gfy+O1p#Gjk%f^PtQtO~(_C2t)6RUPkCJNfRfr=jngEJJEg~ypH~90- z|3ZnQ<$s`ry37ycR`Y9_DkD4hWhT^F2p129!yn%oL)rE~L=MCj6d`JI?(cf*-G84W zUoL6}u>4dAGV9F0#A5@GwxqR{%a?S4tb;a06z(j(o<^zYAf>=rGnCi^R4zgcf!ZiX zz>NT%u&+hlPp4wGK-(umz+voihl#1o<`UnWCDktWw($&@oRl`gNynNa`^_OO26nrE zyH*NWvPyzQ(=fR1&(}}Q83^i0)d6Zws{a^))6!|+oe9FK?|gLBLHfB zS#?yIEbFW1hYIi)Gfuh=Oh9cC81BA8a#*8j-~`W!no0H}zhWMKC)TS|th9GXwGz={ zEJ+)-TCB(PqG6~#ZL|;fRVCr+`kY?)NBBc99^8i9_iu$-1jn(>cpc61m)c|Szvl#` zSo=6;BfMH%atQaRLm({&vt}i<$mXsEay@z;z6=eM`LFpt|J-bXQ2TXzL-xAZxCF9o_$%J2;u2 z;jnEFwXQdFTCTM9em~7JO%sPlov;1N)}wdA+EM>>Qz}&SvS&$$O}|MeNQ2n7F}im} zV(!H3{Vs0cr((-@3LH8Ozxo=kQ|hvi8mLA|ht$1ajMg);) ztnst0dXyNTZ}?XW6~=L`dSztR#niT~X)6q0hQR^^^e9qz)+@D{%s-;&gA;~3z-cgX zp-Bg+ul~TOXYPugMQDwnNaBaK5@uVDw1c2xVlTybk8D+t4}C?pZHaocq!MW-6z)5M zPJzfWzFRtyu&vjJKK?O&d`~g52Js!s22(@)Z}e*G;ckk;GaB<@c0A3(%!8$cnK`qS zPQ~!6#bLPY0?c#jg~#|7y2MP_;0D}#t|u^_X>}P%pg4pZEH7nOIvQ1%R**>=f>b{L z9H0#Ka0z6DS|ocPky>`S)&sHUA{{HWx`!f1*`8A|;+vzO$Dk5iGQ9 zTNvLy_gUE4b_RoZLd0cTm|-0iYl6`(?7MWijX<6u)m4gyAQ3iweU+`j#Fxa6ATJV` z`EBFavB6WLN`(GXL(m9b0zP1wzY0fvo52^q*d>}%=T-z$q@f=^f5mSr&;PNP z?0<+ObTG-vm|Lhr`Lp5Z z3nigRw{7Z!hLffO9HWpOv`JoE-_ll+;)IfrtDoK`yr}TO!l3|<^OYV+L=&jswD<&9 z*yPj`vI)4^L)Zh`7x3Vy>L4Wf9S6JfW>`doKkf0bR@-_=N2F6>>>HC~Dc>%AdxcNj zmq2Fj%L;CEzeLVBZYRoiRQIS_mx^Y^=FA?MCP4nZiCw4sR+&^nM-(w772i$~CTgB4 zoh?en41n=B<71El!B@@0VrZdP&6wxUC``+*dvuAeSW<^H2y*Hfz){+c>G_l|B}}<( z#^KbP3wh4`S{B{~rNgE6$%m=xrbk@Is~&}O91xp;tz~b{V{RpxxUGc!*yaPT@OO`1 zv5-Mss(14e?;oqa*2q73ye)_|7p46HPa&NL>)+3`$bpsFrVGRlzlBz8;tzjQ00Czz zy<73A_8T*?Cw;P~gd!t#C)7iS(=z1JnW*Hk%Ic{SE0Q-BGj3FGf11hTP!j(0RG)EerdabbMana` zWIYBx1tTV5oMt!h!C{3OaVKl&jJd&>-R& z6qRgeYqI=j5(Qlg#StzAkw)K0dvBd(jaYa;Dzhm_Xka)<;KinHNG5D1eGXh8)~XD>Zmd0r4NfO8_I=e9UX4#*92|O?&2AUXopUQR>sWS=HR545RSZY%VWWT<4#MEui2Ym~2VFvvz98>;pPmhRb-#684IEF(o@U_tAEwD=tO=>!HU+ByzfXA7E8iURI3B5V(-X=4bUvSe(RtY@azj=t$o)bpw8Ia%~E zOaM*z8+*PCX+B{zj4^+=CwIb7%GbM#QC1|6s~ywNCYHM^(!-XJvbF=4a^B4! zWhYTQ25i`5BqZ)eZ$sf;iZhgt@%*h2dW&42mL`ZaFuQH+Kc`9+2TI2{hCn2hQbwe) z>C0b}@5_3zaiFX<;xO?;zhGaFhZM|;7!3UrWwLEmq?`|q{C$6F@lb5npRdV&DpE;*P#gq?!j4jeWM)T8~o5WO*!xH7tak zl`DR|s|x!v9W1Ni=Ly~1uMp8;d5x5=i+EXcURfjYsM^&CU`wS2 zdMzUVENwye)t&#!>lWE>=X&JFpI@5@Yki?FgbqenZ$7@jE{YL)6ZUx=%!cMx$^tdO zQ({eAy?TxmXIel%Nbbs@NyOt#i$`t#a2zryBa$n`RF$0f<8Dk3#zXj>o98G$coml$ z&+E)i7zH8rTmZzr@ZOV6=Irnq=$e;|B^&CohaY|<^|+U+xxYi;S>n4}nwf(YdJd3O z?0j0>m#k9M?hcZDZHd#!vE?#TLEj1YjjiQI7EN|s^?hsKJn_39f1A&Z+E~=HN6lHrZH8V>w2z9{~svN)|k;#u7;W;&s?z*Wt-=}YOreV3P zIK#fCC}0mrML>rZ;?DQ+BuU@HhExh)pph&%21K@#p@y_#3ZBE+L= za0y)0xqrBtJJ0odbZ@666FvWBe+qEvT?L~a{VANK_R}0fzd~Lf9Gb*MOi>#;B5D(I ziPl)jPpL=--vh6Tyi&qV5+{X(!9o7TEXRnM>CmRhlJT!-~ zN{y#?T5Osw@bZh!re)Xmd3qaTV#MOcv{xtcog{#j@(`rd9u)`mxI#lm0JE!V2*GKP zCLNX(l=ZHe{#NDikx>wiSD78Tnta+sO^IGr4pN9ZI)Ih$uKn=6ZyC(R+rhoRk-ECk zh281qv^)29yZ_2LE$|1W^0>Ii;()^1TL7mycNut|2$TV->xw2|ydg0F=k{@-tLUSz z!};hYY_(u**OuaETEhuS!T5ks)gX&!mfOf~1|@_4KUd>YL7|*<$Gj0?b_w}EQ2k8;G*2;Ee{m7k45I<8AI^=bgGc$UGy|6 zj%XK-GZc$o#5m#X?yH04y;?yyaZ<=jNlQD3Y*XSAU%w+-MpgA$6)Rovpd!?zAopDYji9k{c#M>@ZE!S+wLN?qU!Ldu<@q_su z_jzfe-Cq^*;QxsUUIXM={ijwdYjh^18C-M99gvh~xWnVmsfP?a9eQPr1OiAmYF!G{ zIO%%Q@AF+pFm|?ESPhWI$g^5Pyi7X6)0_^jF4(YK4 za~!i}V6dh@3G6F<1oQc*U!Tgx4bz&KE56$tat{$W{C|{vWmJ>_+a}#99YY96NP~1p zcY`#N(j7y0cZx`dq@;9r_aNQfIdr(A?)#nBJ!kiv{m+l*nPKj@>OMa2=?p(A>iS`1 zX!yl^g@{mfKT)&)T}Lt;<7kFk(qus+X~Vi+p$>V$Zz`Nu;opUE-$J`B)2PL$WBwMt za>!^b&?%#^^$j`BW@x15r*p=sLIdb=Q^CyMDlvwPTC_&sl8ewbQX7tDbA!Vc{s@cZ z{^R?v^@urvQu=rTY@cl5sXz78MLD(j{20c_+tYm&VGTfS=|v{no+P~)G#rI8CY6^X z&nC6nc;sLCb&vV$_VoC?acQY7*Z3zbU8%qA&y@u(66;A?S2d?spA-5EMA=&o2SzTV zbuV5Co9rJ_ZInUQgEt4SQWK;Ir3le?I2lN=LoItEBzLH3YO5H)lGDUJqrUBvoE6k#DHtClS@0lqZs%n@;a0Vyi7%3149@<$A9dZa|ov-x04JBw( z;MU9SlosgUmnnYzF=go}MnV8qNC{MN$*qSYf8ekguy^Sg{|f#6It7sjf?xzVv& zR9tP14lVNOB{|7S#9?NX-jKgz<>fzHl?4YaQB;3SFNzNCJLW8DWL&CGTnD>1t5F3* zqnkyD6{)16H&PDtj#xt0x*4c(jJ;6>lqHD?aQ_ZYTgWwTqa;RayPucWKs7)50)OMY zwQwl~(~AE>;f|#3<2Q7}zEw6jMaQmMoD7aVJ|3xD(X|@c_I^}2qh8YFrWrodFq{(x zY8m?E*4|HW>pE{P2Z%A|&u@-{4kH~(OG@mYI{YAgL3i!o=Ee@}+K+o1>fKowdjdGL zD_dgHwMVqunqe1wR}rVe3^+pKNwVxKldW|sW|B%uly?Z-XuOS!B^X&%Y!KHi1Dw6py9v2 z&f8|bY0LSGA^-dFo}rE0Px*~Ri-&Gt$0`8Rrd=uMoKyXPvC4H({MQP)jXLWwL0b`G zK2GJc%z_Prhfe|v7xQ9?91Bh8oLOjUy-J=cUWn*}Oajc?`KL&=m-s)An#PrURXDsQqO#OC3!qfL86))D#!Qu{QTT5 z=1=C$7v9#^mc!&}#KT3Fatm~1XgQ3Sni0GndNK$65f}gk|G~8QTm)`$-;UtxbPDpE zkBwIFMd+`L9w(ncQoeBc^Ohw|Hwc>oPwH!l1ek^RY!_}ANu`Zh4fb)7IZ)_Wyk|tm zhCI5E3V0u&ID(V0=%?5)C6s3fbmv5~-*3Xul3f%^@9YMDk;WsfV5%BfY~SdY_-^-R z;wSw%g6`oY2^`nYjnb|6u^&Qf2`e6!etPyt@R_=johtV_{j_h3=6s48&z^4Fl|!_6 zyZXK>ZYWNW)OFz-CqmupPS~RC*7s2fz14m$>sl)M7_l2PH!B(E?Bndwp*^+TF@-q& zE_=<114&H1HL=QuoGGu4lFf`?GBkq5=3Je6EiTW z)vt2n;k)PiL?Hj#g%>Wg?Ws?T9g^60Xsy58R(WsgGiHUls{|)@3Acr)5@%iI1by>i zHZhn711G4s)nktiW^~<_cUR*aSHkN}E)+3XELpp6ku(Tq)5pEI@}kWhJD>Asu8$boGzX>$4lF^K+ncNJ|4Nd1TLeH~?7eTg z`fMe*(>0fw#}^kAM6j|klu!tEYbIHI*T-D(BTB6UWG$D^T@k>y^i3}lAyZ*LYTFSa zMjW`lklekys4C|hea`9RX>{h{Es-RC0~VAT>ux0E&fP_f#t7+`ae!rAJ#4|GVlMjQ zFZuHIGA7RUBOt6kJnQUuSn*wo>h3Z`!@e6HsGC!@N2uMX=SI>}VnI@4PWoNnw)#Gi zWen=omg#Ce3xHi*)q@hQww8S75MPprhNvvtiA1q|$R1ZsYv^!99R-M z_NXKP$CY@%6U$bro^d4U#BJrue4<$wcs9~`Wssh@&pFRT7(hrTwLqjHNwc8c_`axf zdf^w(wsec03=oww?^WK(|gyo(*o)`&{EK{;np0@L}*yYL6%P21(#Hh$o2{aT&NEQ*6nV4m_Q+|;OhUiFC zU#=OdB>>!8|!&J#!C0y?p4?hoLQO0NRB6m9(O zvf(dpK>LN~mhE_zg+YZvhY0Q6OFsegA46Y@N<# zw)n!q@SBf8`E)mJ#_dqQtAmNQ-J5?LOK-??R>m=06$)CyQ2f9;%ehX;4qqhABaWen zk|Eh>sP@4kT-HC;a+tSss7N{Zy|Z+)%J<84Y}@!F*{s@Y`E*I53YH}XPgNh{(RJ`3491~lG&9Yb4-HO%&&${Gorde)xf&T} zQTt9X{YMi~|4)l?buks(IzA7#o7;_FiQo)RS)$!sbO zdp3a&t(lH*6{qdHgP5A{UTI6)iJ<+*-6Nk5Qm9*yPmS0CN%!)@^X$miQ0vDrp%ALn zDMOx}PEiYrr+HFnT0o`7dY2&PP<6Jzuo;FxUQ)?bfwjp{4ada_qnY<%ifa-?ge`dYqjIUcl>#3VTo07{9lGB7v^ zjuo}cV(O-6zlQNYV1z;KoN~`_Wmly+lf+Rd3LV&VI=gMtxMt)W_Q3u#VOoPn6N~7>jmC`M#20q>DiA9W+ zubi$fow?Bx>kH3Re_K%pp055pB^Nv&xFXS+G)vGFgpcXv=JH&S2Igv7SR5OhAMf#T zrjp;h9T@bh_Svkp_P$>){mBJWr}qXUMRgNxIr|Dx9_UOH{!Q%ih(5!iOr0OrjG8t4 zGTOk9u-ZY{R9_Gdrn(a~JsHA<>74Isqv>;VdkM4-B(GE)9=+#Ir9E`HpG5#1?zP|b zoo>-iB<>Ux8N&0SSp4d2TBy#(N@=Re%o5_}n87S_0OADhf zoQxeYKN9io*v#;B$>cU(F}-sbd*^Tm&Mo|0yB@=#(MrR=3%^RThqw}DFL*Kz_NA6= zNBkNjJSp8X;b_s7G1b$5Q^A)c$UkKJ?X30D;PwU6k0Pv?gn?HPi1zhswWhpqS*UVD z(TkJAEaxkJ7s|MF!#MoN(lP%qoG@|PNd-k1rylw!tjzaS-@@|=R7`KF_bo_e0#b=S z^UO<>z@ykncB^h`Vcyu5`H)*%1=1eaTP3^QuKHYUUB5o(6XH4cJs$9DU21WaT0{L6 z$^SX)gc{-tRAML?-;LAh*`0<^rnY<=ey&d`xWZr6;H zj-R$5af0C8{W1=z87$CsxD4NSE zBEd^VA8Sfa8^3&su5O}S{HcGHW*58N+kC|YC|Y!M&2h!@_zAm_nSJQGE+xFY;&*22 zO83ZaT<%Po0el476I2ez;AD8s+0bV+_S-=0T&Lkls4gh}HCvC{ao7%TAWB^tg}tl`NS#~? zxAF%;kCA^SGp@oa2p$hpi7< zG@asSe7$W3{Z)7@{kOuyKtqaj0oZ;)yV5nVmYQiPo>PKTs9qmwJFwEs2e+fGUca@? zi{?tR$o-9oa7Dp7GE#BpN&bjPsRQJ5=l8sI+C?C|Z@278(R^|`>%*(aO+F>Dnb^$y zxje{%bh`1%!YzP&n9i0duqbicq5m|V!JD?6Ble?6>k3ABPze=Pw*>`sI zeq!zUvy|=w9z>Qib!;+4CYk;$W)QTw+hv$&&J4tfkVJV=%`tu7vsfid#-nTJaZdq! zW8U18mtoI!LBoMo(vcLOOSvF!@J2 z@%NO|f3y>tQx|%b7z-#p>4 zvIV}kgj%bgCHq*i1Wtusu7po+)*ifXSCyVM)pXS0t1&qJbi2mAtL~p}i=V=k_mYh^Uah=XgxL>a~Tm?CX-tdf8)sdgW2%% z{WYU#u=|^+d&CcP;apzt25Ahnveu%IZ}m(n)~_DLx}Cc1Eq&atAMYp(!ImfLK}(YF zQCMxCqc@Y(bCi9+>&xbA{NrUn{m08tS-M4ZCe>}Z(u`OCJpr0Ohjn#TWZ0oROcJNJ z-m)3vtVJV?GHkFpL#!IOujC$8Muq_%!PuBvVr@L%mPgXL>tAxVzKzZgn+@OLoD>@g za(@XU7sCiyFPo+=xJYrSXJLh1qQ;85>gFcTo(vFIjc?edU=EL_J}rh_U1=)1yaPk$ zHw}0y@Nr-ZU#JP66dfyhOr*XDO&>`ThTMTrN~~3A^UWv)tTz>6y?QWdoHHrWS+6{h zx7)_5xanj!F}@*OP{ebsxk_=LxzaYA0TIn7TGBDE^LiAs1A_Ag6?j|ozTWDbSWi6t zX0D{r*C!P{idhiQofZ$F9ID*fH|9-V%Z?|qqY>}*3t?mw+wiTu!{h9p!X4$mP8}olSGn^0Zt8n`^0d{ArNs{f5MpBLKH6=!ojg z-2=)p#YGUy4#8ftMfr|a?1T!8J^~-Co2;e$ZtS{Nel%6v$<1d;{OreE^6A+fpYmr` z1=sDmm;p?3*R$5ESp05HAo>VcefCs70|><-L8biGKp`1}_qX9QYmdAThIzadW1EdP zJ^ni`B&2ybPi@ErSiJ&RbDzvST?5H&2))w(9#JrAiAJ8qsNl{7Wd6N1w)}OSJM;a+ zKWa`TC~h6gFZG%I(2XYDCa@hj#p+EM@3AI?E}~s8IoASVy*aYYNl+)kticZIswhqW z3c3ZYCFAX`7gB%{;Vt-77yw5&lANc?hA1HcY@(s8?eD^Zw1KtTu?qLy565~>z!$7 zb>_8pZ_v=uu=ac&_cEAb>z$SrS=#P0&L1lWkMsWRYVfEc>7qd4j;k*NY!Qnp;_#P9 zSyHqqDon=0bua>RJbE1#4#0~1=?5fzJW7AXasTu+!rT_(ZH^3CZlzWcOkG}*3+i~V zY58Bhak0jAQl=a_O#Q$mD5(8?s=zYdj3qlse!(5uj+{ap6UjV_aJ{`d-+PoZ3 z%QE&>ju~^GmYY3vPsBeKMlS(Js?kv8EnNsXqea>kc*Yw2^%3nfCy~RMDe%28KcB9C zuNz7VqbnTCV_^tSILqA`mM~u|Rp=?Mcsqm5=tsqcxI7(&@|;UkEO;{D9muCXm1#+f zM{e%C z`!c`2K7{=WGf8OSr#fg1api(Z0nx?^X=Emaq{r}!2%eJ`+JL0mr_W=3OgzpmM}faN zP3|J|f7Uq-fD(9|-V+Mn)&!bVaoeMn<#_xEp~jgHC8f~>s|HP%%FbY|62^vIJMgI$7n3I>0G3{6tc^4co!zr1=jtv?R$%iac6-|duSUhzY4+vg3O+q%r3zMU_PO_=I$LAosbyK_*R{!K7k4*M_Y*#M)n%2;ukqHrNw}xN`D% z+dSd-g1Vw62olk_WSlKs^SrhS3t=hZE=O2K+MeGNeHlcPTA-ZPwT~msL~-YO-Nk*K zGqIpBW@**ySb7~3g)UT0Bq@p5wNJwr8Gt}y@Ed(74#2U!ulHG8!NaN7L@Vow8=ed4 z`LO7V=QUotdk>rRBkLl^JVEdZqfGa9?Gil!(~3~fPFJqQa66%i#;vkdGOlV<%dXx}|CJF?{{vVuH*IcMMU zA>{wi_gOeAZ4hG2l$_niRL;m0tIkZ=C5+-nHyHc?Q^on(IM9eae(&qrvWM@Y>wwO> zuV(=aAEI_DiItJ^YYWyYshE9SMPIqJ!8(Ouq*T^8}^1tc9i}X?+@Me zS~l+%;opntf1)j$sc5I_lEbilK_mPGqwe#l?71HJ25x*KdV>QbjuMlAs!-5XcRW}j z6jU@FuRjd~<&2foOe*jR^gVibP?vk4_R&$7t1iuYub{9t4%~cya*4t6plQc-3$Ar< zhf}p-4(a-#$DjjcZ;U?4>U8ot#%*7`yLPk8$4sc#4IfIohL^%1m1hR7Rac*yLFpet$3% zA0mP`D9y|lsR@`IVMm=@3}C1g{h1#$a0qA3X@ePVjayXj?-J~{fZyW$5b(t;euEA`>2v7QSKh0gr?y0+h2M)!E=Cv$s?J* z9b0i$^MwT!T+`P$Vj{!iPsI6DDC?}a4z@jeNw4bch8J6<7+mu zTQkQwJ%mz?#rV^jgv_w^;uJkP-bNjBu3L7&~pja5+>c*T1Rd5PvzU)h8Vod ztHavmytk7?ICs|1C*PP17JvMI8RRrvM$I{^gtpJaK(`%N4jLu=;Z-8Kr8dbxH4p2G zVRTS@S~>|nhG)Ju)fs zVDyz#%v8+=JdH=Z8U{sR7aviayhA~-ameI5j~s5x#nXuT`OD6HqjriE)}$rr@byn~WfVK4yXpdhIsmto)>p5C8jQ#{lqVl`33vp zLZbU$+=t*-^z+nuGeX|wDm6FvK!pUcpII;_Le53qLHQ@p#%55ZSc2CR(kmp}@LHPo zrIEjDSE(h&2JuBsMMCT;a3oikmfE03Jz9HCI5DIkbXXB>Vr_)zaE$IM=x>uqa!8!a zyRK~PwxC%YU!~@@0ly0Vnmw)-%OL5rXKAs}`rlwk3&Oao=4dP5nKFvzP^Na^!Z z$~1Ed;K-|G3*&ojk%b-JVF}X-U-I;BrpOy)hQcCH_rM9qK#@?54WxE1`CaaP&GVeL zZM{>5_ilj7MI5Cyr-YP#dhOw!wfA(mVe?7&r28BS!t+7hqqDzb#03ZHzC+XDO%4< zp*N*0`Y9O|CiA5BQIC4kBQm?SYh7n6EqCKy}%GX|YuhxuNQ)@Z*mmT57m_}VEE3t!cg=V@`ElaZK8o)gDYO{CVq#YC9+UT}@We|JuZ(<)3 zyNvR2t#+SMa1F5a){8#{$2lxew~u}kivC*?vP>w!BSI*^-sVuw6?hFmze_G5$PL$Y zjC2Dtpy2b-`qBD0dC9Q;5P|bDe*u*_kSgp%3mIQk)b>U?O+Onb@@o z_^~tz(;&RYSXDVCJtGzwm)@J)uAPM-HP^%%4Z9~xFmG-EYiU{{O>9T(bTa929xH$d zfJfCUa8^$e2uI{g1N7(ih^a2g*hjvB=0*>HUQVmHXF7n0>sk;ZPwoq~Zw6s~yd~I4 z+fZ!7c-rqsG6<}(4owBjAu}`n6I=5oVKC*9`*noePZZ2;2rBc>n3BJ*q}aak(pEx2SHrF-6*%Y{ct z+#bgVW*O-(Pi1$;+q>Gw+JpDzjaY%~i}+@O>yfB#{NF9aBzfgNg~zz`Y8m7u0VBu31SrGZU z7YW*g{-8dZjzSjA$obvRbehLgv>PXT9&yL4dAN}fvjHO#r>Ia#2zd$gcwU)fON+kB%RYY1+ZP_ ziWFVRSP~MS{EzQTpi|f+*-MG8n)bF%`+m@VEfqRhZFf|&N8WVZmtfg=Eb**%6f9tm zJkashr*8-^h2RXW6)`f+zjA5ME$jb>{2}&|(Hj()-Ut=DxoQtj<39%Dsa@gK>|&Yv{P|9C8De@=P#%%_Re zj2$tWcbFCJBi@;Ap#@)9E;9`rN^QOhqv~zQE#99j{wg+61sqqV@LhkxNQV&(r5QZ((?)9}VR=bWx z-+R|ENHGhMRObsU^6=LjP9Y63D`11f0QUE@B8=@q9BjtFl%KSAibo0$*2#CfH@R4- zM_t2u6#(G}jATOI^KFpZt9{|!JghLMop-DX+Vu_|t!Icyk@k*vSJkh8#VlSI+jK5x zey2X51iLAZQq5iABc7uJGfzkw&fmjC|FJJ-t4m#(G03_R{`#sl4Xk<=`1)nT26UQ& z8_A02RSO+aShsF;Tk8I6)|Tn!a0^oOI4OCCs17@}tG%Ey6fm84*ejzievEnsQWE*F zqGmpkI}D?93A0X3e3zG8{GzCge;4ZH(}|qNLSHnn!;n87zYzn~th19X_$0js@~td14eThR*CthXWFRXMTTV{5%($#X6uT5ns81k`zmg7?*lD_2PFOLGV17giv^~d zHWKi7YJ42lY~NH2i0jy!)jtOfk_os^`rNjxod`Xhi}}&OMX zX<7W5I)L8h8DP$Cw>Gx0Gg_jv%XKeEx#h}aH~{*7u6TT`laf&5{T89u8PRiT*)^w^iY5c zB_nb@g57)-KHy7#$Q#jQOpon!!9F@xbY?{6z4Df3G6DhOEZ7~s!6-yOmB1c?FT*PC zPg7D^S&N=Il}?|TMi;|BK@dT`@QF2?iV~bE0Vt&&NMvMr0ypcguDE9{;LYtX?lm@6 z*}G<;u|eyYrXKg(6`&wqpNsnHyGcs#4b+eOm2j|zU=hTGO!3_Vo_)F;$~W1FjSCTm zc7r6*4dxxxpNShk6L+pSV%qG5dG#y|F;`o6-1KKDNY|K4V*2(qjijg$?UslFaXpDV zfsa|MHg97)_ieh(!qV|jsYTYY!{+V=RVjGPZxs_@OlL#HE&9W4WW+?@D^BQ|QA)u3 zz)<5tz0DL#){xFx-$$}!0KT>m)3oR`3Z`t_pO?6i=8hr$?CRBgv9z!;)Y3^ zZ>cs0TVV!Qv!H>h`wzxI5?C8nDpo<=CgUM99Yz>F3fd~v&m0lC?D6dWN{iiF#Ci;* z4U~8R*|fT2hmiajsJ|`a(szfS?@4DQ-w; zZ6;7~bWoMtz(6*n6#}O3{+ra;_K#pEGS=-&4I62_6n248!FUjMJ%6ZiYG0&&ELCu5 z=WCYCaRr}6SKVy)YtRnv=gUr%rTQqwo2ir(G4`J()1qhT9$#>qw-KS~pl7xD zq61w9>2tA{iRyk#Z^VaiUK3pmMI|SGk8|y4-U=0{*TsF?D;fP zwf&dl38CZP`GnIeGw6Pn*7kmtk9&T1c>L}T3n#(Ow4LN%b|xF4OeV}+4(%}v>7J%u zR{_!OyRPJx;G*X1cQxr7_M>fJ8tqm8XfjV1|BwEP-A;9Lc5h1z7pZG)o}>0y;8 zV+Kj@tLC&ZvKHK$)jhj7nO=Rdo$J2jgXc1M5!K3q4@p^y%Bx+O_Ju*Ewbn>19z@C# zRF2S*viJ}}%;FG9X4?Hjm!$-|x^uEX?Q97+b$fpWVdSog^nnmQ61QdLhg4ik8^7nE z3V;RV7hQvNinEdC4|VJLarQ0N=LE@;V#{RVL0qA+-&lr7`fo)=kQnVbYR5UMkW~=$ z+0Yj4ir+)oFKv72I>n)m*d$;~DkP8U+tr5jR#Q3l*oqg>%cR_Lce?CuV#AmCPY~g* z%b!~a|7j(arTJ&uJ2QmZHg*>hybz`D^OEk;K}ZjHKPa8}dFKr}Uz~!^tm`i!;GEcF z&8quKH_}%m7jo>tq-m(mol{{{blIu_uvfLqU$`i2% zNY3kGgk)T!!*w|pKal33t2p2w&cozPa^UR7? z9&PnLHad03k~S1T3+xlx_8GDM<_UI4?u)<~N@A1b1$iXxaol_v(G+o9ltBX60rdFr znpD5JAPqXp@~91WMzGV!5;hY!bomQ{Q4*M3wqaZRW7vO&(C5eF^ko=9j(TYo`S9XI z#>ZjIB)@>Wr+Ww{!0*?VRuoQ}moFc`-PPnCUW%?c|I{rnp_vU~FNpO}s90*P5HH;{ z^DHfmwq$?nh?2bvAu%C$9UxA3xsNnK*D-!)YrlXkzfL=z&z{Baz=}pWfRXPza|g-7 zoz16LAMdU?Na`tAOkg9&DlnWt58luBtw5TOW*Ib<40zSuH>a+DuA@{Wq`xTySP z3~@gB)IGLzT-<_7F@0PRtW^z@J24mn&oW?+NtMR4GJ1<)1nN%$M>t6A+pcq#m?kWq zcKmkCn>+53gs0-z6C2VD9Ig6V0{iOl|6=WW|6uKS0LSThawS*it)v?Fgg2{f04~L4 zdzN^nAW%9deH+8p=iN(f&OMx>XyrsqKIH9jDD_itkM5>7e9p4}x@Glt6dI}JCUz0% zUG70He)cet+GoxJ1+}{XP35jULX|>9MRrSlV!Bz@8RA1|$qLFkleV_97N4WSS(hpn0U`BtR$r}w+*y0>X&5XZ+5?Du-EYP54-@n74|%6lN@b1f4I)PT)Dg<^R{r>j zD4=+>@_o^BWAZqSch>t%GTHr`GePA&WdWOu*nlWq4La`_7HPvz(ehQY=B9!E@4r$W z`M)wDR{FM&7d^r!myi}*Vl#yJD5|&r>YaAp$HFaR?EIlRlr{Fg$H24iN4s(9og8ho z@rveBnFs<}Zc|G|%?fSVv9}&HN*46DKNw{1(+EvJJf)oUuutzptXG3%zJHRn(^W

UDefAnIt??XQH+L$)^W&1t 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 z z5vpPR6WQ#8{(LMBOzL9`UM9?&NV0kFOCnoe;YkyNfuoTfstjO5`U>}UBr!<%Ce%=% z-PJAyHY4&a-%7(A0KI-jI{L&E%1G41i{Cp^UEY4{)v_zF1MbD;W$nW=CmX#!=B!Gl zR1T~CX%4RrMpLjhsZ2e=9m94XP3ez42ad;q3BDF6b;I8$RTiXmMSVR3YS4>r-s<6s zFxXKqcJ!2VeO;gCG|FZ6l!^j686ZUMXg~}GlLGy$q_rL>3G57l-J$a73z6(kIe%u+ zK<8VrfE`tcc>}Ks+O$bQMm(w*y1Z83un{2(Ogui>QWm7d`z9RE53F}8x`iRBijDq6uj!) zu{i(`!*m#6-`m~*yT(7Dw{W#O9zgd~RW?txx}gcD*2frvQZv|Gmx(Bnc~9oaJ%N6E zYg>|E--=N@?`gGdk%nb*}HYr{x|!Qyl-h0qrSo}zd^4vss?^Lg`q_XBjtI@%GVv4c(PqO zcLr$LMx9A5s?4kggYzh!Wd&QC8)a?nPT9QmPTAeijt2pGTXS~xkji%x*RS!Qx~a=| z602DevX{20%zh$EfAsFy9AFYVDZp+DTL5WSD#wjWua}jlJ|>AD(iNB)^hkHWuYrP^ z!ZH8=Ix!Ql1Ivl++gTlV_-bvU>A|2FP@|^w#TEqsW6K_lJ;m z_QYCou8Kh<$oqj<9Z)*aB)0=^FX_dE-aQ-#rWaQtgMcK(rM&a<4+_fy>;lJ)mmuoU z9@}NJmPUE3hcg+LV-W1u;_oU`*N{>fMpV7xOUj4y$r4|XWDhrDa zw;6-jCAD`LK<2uZJW>JF)|borUYYL-wYynNHyKG*}J z@vw^t$|8<#GI_5_$qBNjw zi^nu7RR>wl&v*gs0u$x<4c40M0Cer0|<^Kn5!72dQUwE?s0000 const MsgNotificationPage()), - GetPage(name: Routers.addFaceTipPage, page: () => const AddFaceTipPage()), + GetPage(name: Routers.addFacePage, page: () => const AddFacePage()), GetPage( name: Routers.nDaysUnopenedPage, page: () => const NDaysUnopenedPage()), GetPage( @@ -1013,6 +1016,7 @@ abstract class AppRouters { name: Routers.catEyeCustomModePage, page: () => const CatEyeCustomModePage()), GetPage(name: Routers.videoSlotPage, page: (() => const VideoSlotPage())), - GetPage(name: Routers.liveVideoPage, page: (() => const LiveVideoPage())) + GetPage(name: Routers.liveVideoPage, page: (() => const LiveVideoPage())), + GetPage(name: Routers.faceDetailPage, page: (() => const FaceDetailPage())), ]; } diff --git a/star_lock/lib/blue/io_protocol/io_addFace.dart b/star_lock/lib/blue/io_protocol/io_addFace.dart new file mode 100644 index 00000000..6ce9f1fd --- /dev/null +++ b/star_lock/lib/blue/io_protocol/io_addFace.dart @@ -0,0 +1,153 @@ +import 'dart:convert'; + +import '../io_tool/io_tool.dart'; +import '../sm4Encipher/sm4.dart'; +import '../io_reply.dart'; +import '../io_sender.dart'; +import '../io_type.dart'; +import 'package:crypto/crypto.dart' as crypto; + +///TODO:添加人脸 +/* +备注: +删除单个人脸规则:UseCountLimit 设置为 0。删除全部指纹规则: UseCountLimit 设置为 0,FingerNo 设置为 255,userId 设置为“Delete All !@#”,只有门锁管理员才有权限 +**/ +class SenderAddFaceCommand extends SenderProtocol { + String? keyID; + String? userID; + int? faceNo; + int? useCountLimit; + List? token; + int? startTime; + int? endTime; + int? needAuthor; + List? publicKey; + List? privateKey; + + SenderAddFaceCommand({ + this.keyID, + this.userID, + this.faceNo, + this.useCountLimit, + this.token, + this.startTime, + this.endTime, + this.needAuthor, + this.publicKey, + this.privateKey, + }) : super(CommandType.generalExtendedCommond); + + @override + List messageDetail() { + List data = []; + List subData = []; + List ebcData = []; + + // 指令类型 + int type = commandType!.typeValue; + double typeDouble = type / 256; + int type1 = typeDouble.toInt(); + int type2 = type % 256; + data.add(type1); + data.add(type2); + + // 子命令类型--注册人脸开始 + data.add(81); + + // keyID 40 + int keyIDLength = utf8.encode(keyID!).length; + // print("${commandType!.typeValue}LockIDLength:$lockIDLength utf8.encode(lockID!)${utf8.encode(lockID!)}"); + subData.addAll(utf8.encode(keyID!)); + subData = getFixedLengthList(subData, 40 - keyIDLength); + + //userID 20 + int userIDLength = utf8.encode(userID!).length; + // print("${commandType!.typeValue}IDLength:$authUserIDLength utf8.encode(authUserID!)${utf8.encode(authUserID!)}"); + subData.addAll(utf8.encode(userID!)); + subData = getFixedLengthList(subData, 20 - userIDLength); + + // PwdNo + subData.add(faceNo!); + + // UseCountLimit + subData.add(useCountLimit!); + + // token + subData.addAll(token!); + + // startTime 4 + subData.add((startTime! & 0xff000000) >> 24); + subData.add((startTime! & 0xff0000) >> 16); + subData.add((startTime! & 0xff00) >> 8); + subData.add((startTime! & 0xff)); + + // endTime 4 + subData.add((endTime! & 0xff000000) >> 24); + subData.add((endTime! & 0xff0000) >> 16); + subData.add((endTime! & 0xff00) >> 8); + subData.add((endTime! & 0xff)); + + if (needAuthor == 0) { + //AuthCodeLen 1 + subData.add(0); + } else { + List authCodeData = []; + + //authUserID + authCodeData.addAll(utf8.encode(userID!)); + + //KeyID + authCodeData.addAll(utf8.encode(keyID!)); + + //token 4 首次请求 Token 填 0,如果锁需要鉴权操作者身份,则会分配动态口令并在应答消息中返回,二次请求时带上。 + authCodeData.addAll(token!); + + authCodeData.addAll(publicKey!); + + print("${commandType!.typeValue}-authCodeData:$authCodeData"); + + // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode + var authCode = crypto.md5.convert(authCodeData); + + subData.add(authCode.bytes.length); + subData.addAll(authCode.bytes); + } + + data.add(subData.length); + data.addAll(subData); + + if ((data.length % 16) != 0) { + int add = (16 - data.length % 16); + for (int i = 0; i < add; i++) { + data.add(0); + } + } + print("${commandType!.typeName} SM4Data:$data"); + // 拿到数据之后通过LockId进行SM4 ECB加密 key:544d485f633335373034383064613864 + ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); + return ebcData; + } +} + +class SenderAddFaceReply extends Reply { + SenderAddFaceReply.parseData(CommandType commandType, List dataDetail) + : super.parseData(commandType, dataDetail) { + data = dataDetail; + } +} + +class SenderAddFaceProcessReply extends Reply { + SenderAddFaceProcessReply.parseData( + CommandType commandType, List dataDetail) + : super.parseData(commandType, dataDetail) { + data = dataDetail; + } +} + +class SenderAddFaceConfirmationReply extends Reply { + SenderAddFaceConfirmationReply.parseData( + CommandType commandType, List dataDetail) + : super.parseData(commandType, dataDetail) { + data = dataDetail; + } +} diff --git a/star_lock/lib/blue/io_protocol/io_queryingFaceStatus.dart b/star_lock/lib/blue/io_protocol/io_queryingFaceStatus.dart new file mode 100644 index 00000000..6f72416d --- /dev/null +++ b/star_lock/lib/blue/io_protocol/io_queryingFaceStatus.dart @@ -0,0 +1,118 @@ +//TODO:查询指纹状态 +import 'dart:convert'; + +import '../io_reply.dart'; +import '../io_sender.dart'; +import '../io_tool/io_tool.dart'; +import '../io_type.dart'; +import '../sm4Encipher/sm4.dart'; +import 'package:crypto/crypto.dart' as crypto; + +class SenderQueryingFaceStatusCommand extends SenderProtocol { + String? keyID; + String? userID; + int? role; + int? fingerCount; + int? fingerNo; + List? token; + int? needAuthor; + List? publicKey; + List? privateKey; + + SenderQueryingFaceStatusCommand({ + this.keyID, + this.userID, + this.role, + this.fingerCount, + this.fingerNo, + this.token, + this.needAuthor, + this.publicKey, + this.privateKey, + }) : super(CommandType.generalExtendedCommond); + + @override + List messageDetail() { + List data = []; + List subData = []; + List ebcData = []; + + // 指令类型 + int type = commandType!.typeValue; + double typeDouble = type / 256; + int type1 = typeDouble.toInt(); + int type2 = type % 256; + data.add(type1); + data.add(type2); + + // 子命令类型--查询人脸状态 + data.add(80); + + // keyID 40 + int keyIDLength = utf8.encode(keyID!).length; + subData.addAll(utf8.encode(keyID!)); + subData = getFixedLengthList(subData, 40 - keyIDLength); + + //userID 20 + int userIDLength = utf8.encode(userID!).length; + subData.addAll(utf8.encode(userID!)); + subData = getFixedLengthList(subData, 20 - userIDLength); + + // role + subData.add(role!); + + // fingerCount + subData.add(fingerCount!); + + // FingerNo + subData.add(fingerNo!); + + if (needAuthor == 0) { + //AuthCodeLen 1 + subData.add(0); + } else { + List authCodeData = []; + + //authUserID + authCodeData.addAll(utf8.encode(userID!)); + + //KeyID + authCodeData.addAll(utf8.encode(keyID!)); + + //token 4 首次请求 Token 填 0,如果锁需要鉴权操作者身份,则会分配动态口令并在应答消息中返回,二次请求时带上。 + authCodeData.addAll(token!); + + authCodeData.addAll(publicKey!); + + print("${commandType!.typeValue}-authCodeData:$authCodeData"); + + // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode + var authCode = crypto.md5.convert(authCodeData); + + subData.add(authCode.bytes.length); + subData.addAll(authCode.bytes); + } + + data.add(subData.length); + data.addAll(subData); + + if ((data.length % 16) != 0) { + int add = (16 - data.length % 16); + for (int i = 0; i < add; i++) { + data.add(0); + } + } + print("${commandType!.typeName} SM4Data:$data"); + // 拿到数据之后通过LockId进行SM4 ECB加密 key:544d485f633335373034383064613864 + ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); + return ebcData; + } +} + +class SenderQueryingFaceStatusReply extends Reply { + SenderQueryingFaceStatusReply.parseData( + CommandType commandType, List dataDetail) + : super.parseData(commandType, dataDetail) { + data = dataDetail; + } +} diff --git a/star_lock/lib/blue/reciver_data.dart b/star_lock/lib/blue/reciver_data.dart index 1a87e517..7665d9d8 100644 --- a/star_lock/lib/blue/reciver_data.dart +++ b/star_lock/lib/blue/reciver_data.dart @@ -1,14 +1,14 @@ - - import 'dart:convert'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:star_lock/blue/blue_manage.dart'; +import 'package:star_lock/blue/io_protocol/io_addFace.dart'; import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.dart'; import 'package:star_lock/blue/io_protocol/io_deletUser.dart'; import 'package:star_lock/blue/io_protocol/io_editUser.dart'; import 'package:star_lock/blue/io_protocol/io_factoryDataReset.dart'; import 'package:star_lock/blue/io_protocol/io_getLockStatu.dart'; +import 'package:star_lock/blue/io_protocol/io_queryingFaceStatus.dart'; import 'package:star_lock/blue/io_protocol/io_readAdminPassword.dart'; import 'package:star_lock/blue/io_protocol/io_readSupportFunctionsNoParameters.dart'; import 'package:star_lock/blue/io_protocol/io_readSupportFunctionsWithParameters.dart'; @@ -44,29 +44,31 @@ import 'io_tool/manager_event_bus.dart'; import 'sm4Encipher/sm4.dart'; class CommandReciverManager { - static void appDataReceive(List data) async { ///解析数据 - if(data.isEmpty){ + if (data.isEmpty) { return; } int dataSize = data.length; // 当小于包头加起来13个字节 - if(dataSize < 13){ + if (dataSize < 13) { return; } - print("appDataReceiveData:$data"); // &&(data[4] == 0x11) - if((data[0] == 0xEF)&&(data[1] == 0x01)&&(data[2] == 0xEE)&&(data[3] == 0x02)){ - var tmpType = (data[7] & 0x0f);// 包标识 + print("appDataReceiveData:$data"); // &&(data[4] == 0x11) + if ((data[0] == 0xEF) && + (data[1] == 0x01) && + (data[2] == 0xEE) && + (data[3] == 0x02)) { + var tmpType = (data[7] & 0x0f); // 包标识 // print("temType:$tmpType"); - var dataLen = data[8] * 256 + data[9];// 高16位用来指示后面数据块内容的长度 - var oriLen = data[10] * 256 + data[11];// 低16位用来指示数据加密前的原长度 + var dataLen = data[8] * 256 + data[9]; // 高16位用来指示后面数据块内容的长度 + var oriLen = data[10] * 256 + data[11]; // 低16位用来指示数据加密前的原长度 // print("dataLen:$dataLen oriLen:$oriLen"); // List dataList = []; List oriDataList = []; - switch(tmpType){ + switch (tmpType) { case 0: //不加密 // for (var i = 0; i < oriLen ; i++) { // oriDataList.add(data[12 + i]); @@ -84,7 +86,9 @@ class CommandReciverManager { // 解密 // String key = SM4.createHexKey(key: IoManager().getCurrentDeviceLockId); - oriDataList = SM4.decrypt(getDataList, key: utf8.encode(BlueManage().connectDeviceName), mode: SM4CryptoMode.ECB); + oriDataList = SM4.decrypt(getDataList, + key: utf8.encode(BlueManage().connectDeviceName), + mode: SM4CryptoMode.ECB); oriDataList = oriDataList.sublist(0, oriLen); // print("SM4 oriDataList:$oriDataList"); break; @@ -98,11 +102,11 @@ class CommandReciverManager { // print("getPrivateKeyList$getPrivateKeyList"); // 解密 - oriDataList = SM4.decrypt(getDataList, key: getPrivateKeyList, mode: SM4CryptoMode.ECB); + oriDataList = SM4.decrypt(getDataList, + key: getPrivateKeyList, mode: SM4CryptoMode.ECB); oriDataList = oriDataList.sublist(0, oriLen); print("SM4 oriDataList:$oriDataList"); break; - } parseData(oriDataList).then((value) { EasyLoading.dismiss(); @@ -113,14 +117,14 @@ class CommandReciverManager { } static Future parseData(List data) async { - if(data.isNotEmpty){ + if (data.isNotEmpty) { var cmd = data[0] * 256 + data[1]; - CommandType commandType = ExtensionCommandType.getCommandType(cmd); + CommandType commandType = ExtensionCommandType.getCommandType(cmd); await IoManager().increaseCommandIndex(); // data.removeRange(0, 2); // print("111111data cmd:$cmd commandType:$commandType data:$data"); var reply; - switch(commandType) { + switch (commandType) { case CommandType.getLockPublicKey: { reply = GetPublicKeyReply.parseData(commandType, data); @@ -180,17 +184,19 @@ class CommandReciverManager { { // 子命令类型 int subType = data[3]; - switch(subType){ + switch (subType) { case 2: { // 修改管理员密码 - reply = ChangeAdministratorPasswordReply.parseData(commandType, data); + reply = ChangeAdministratorPasswordReply.parseData( + commandType, data); } break; case 3: { // 设置开锁密码 - reply = SenderCustomPasswordsReply.parseData(commandType, data); + reply = + SenderCustomPasswordsReply.parseData(commandType, data); } break; case 4: @@ -202,13 +208,15 @@ class CommandReciverManager { case 15: { // 查询用户、指纹、密码、卡片数量(用于判断是否同步) - reply = SenderCheckingUserInfoCountReply.parseData(commandType, data); + reply = SenderCheckingUserInfoCountReply.parseData( + commandType, data); } break; case 20: { // 查询卡片状态 - reply = SenderCheckingCardStatusReply.parseData(commandType, data); + reply = SenderCheckingCardStatusReply.parseData( + commandType, data); } break; case 21: @@ -220,43 +228,50 @@ class CommandReciverManager { case 22: { // 注册卡片确认 - reply = SenderAddICCardConfirmationReply.parseData(commandType, data); + reply = SenderAddICCardConfirmationReply.parseData( + commandType, data); } break; case 30: { // 查询指纹状态 - reply = SenderQueryingFingerprintStatusReply.parseData(commandType, data); + reply = SenderQueryingFingerprintStatusReply.parseData( + commandType, data); } break; case 31: { // 注册指纹开始 - reply = SenderAddFingerprintReply.parseData(commandType, data); + reply = + SenderAddFingerprintReply.parseData(commandType, data); } break; case 32: { // 注册指纹确认 - reply = SenderAddFingerprintConfirmationReply.parseData(commandType, data); + reply = SenderAddFingerprintConfirmationReply.parseData( + commandType, data); } break; case 33: { // 注册指纹过程 - reply = SenderAddFingerprintProcessReply.parseData(commandType, data); + reply = SenderAddFingerprintProcessReply.parseData( + commandType, data); } break; case 40: { // 事件查询记录 - reply = SenderReferEventRecordNumberReply.parseData(commandType, data); + reply = SenderReferEventRecordNumberReply.parseData( + commandType, data); } break; case 41: { // 事件查询记录 - reply = SenderReferEventRecordTimeReply.parseData(commandType, data); + reply = SenderReferEventRecordTimeReply.parseData( + commandType, data); } break; // case 50: @@ -268,55 +283,92 @@ class CommandReciverManager { case 51: { // wifi配网结果 - reply = SenderConfiguringWifiReply.parseData(commandType, data); + reply = + SenderConfiguringWifiReply.parseData(commandType, data); } break; case 60: { // 注册胁迫密码 - reply = SenderAddStressPasswordReply.parseData(commandType, data); + reply = + SenderAddStressPasswordReply.parseData(commandType, data); } break; case 61: { // 注册胁迫卡片 - reply = SenderAddStressICCardReply.parseData(commandType, data); + reply = + SenderAddStressICCardReply.parseData(commandType, data); } break; case 62: { // 注册胁迫指纹 - reply = SenderAddStressFingerprintReply.parseData(commandType, data); + reply = SenderAddStressFingerprintReply.parseData( + commandType, data); } break; case 70: { // 设置支持功能(不带参数)启用/禁用 - reply = SetSupportFunctionsNoParametersReply.parseData(commandType, data); + reply = SetSupportFunctionsNoParametersReply.parseData( + commandType, data); } break; case 71: { // 读取支持功能(不带参数)启用/禁用状态 - reply = ReadSupportFunctionsNoParametersReply.parseData(commandType, data); + reply = ReadSupportFunctionsNoParametersReply.parseData( + commandType, data); } break; case 72: { // 设置支持功能(带参数) - reply = SetSupportFunctionsWithParametersReply.parseData(commandType, data); + reply = SetSupportFunctionsWithParametersReply.parseData( + commandType, data); } break; case 73: { // 读取支持功能(带参数)参数 - reply = ReadSupportFunctionsWithParametersReply.parseData(commandType, data); + reply = ReadSupportFunctionsWithParametersReply.parseData( + commandType, data); } break; case 74: { // 读取管理员密码 - reply = SenderReadAdminPasswordReply.parseData(commandType, data); + reply = + SenderReadAdminPasswordReply.parseData(commandType, data); + } + break; + case 80: + { + // 查询人脸状态 + reply = SenderQueryingFaceStatusReply.parseData( + commandType, data); + } + break; + case 81: + { + // 注册人脸开始 + reply = SenderAddFaceReply.parseData(commandType, data); + } + break; + case 82: + { + // 注册人脸确认 + reply = SenderAddFaceConfirmationReply.parseData( + commandType, data); + } + break; + + case 83: + { + // 注册人脸过程 + reply = + SenderAddFaceProcessReply.parseData(commandType, data); } break; } @@ -326,5 +378,4 @@ class CommandReciverManager { return reply; } } - -} \ No newline at end of file +} diff --git a/star_lock/lib/blue/sender_manage.dart b/star_lock/lib/blue/sender_manage.dart index 32cc168c..50021afa 100644 --- a/star_lock/lib/blue/sender_manage.dart +++ b/star_lock/lib/blue/sender_manage.dart @@ -1,9 +1,10 @@ - +import 'package:star_lock/blue/io_protocol/io_addFace.dart'; import 'package:star_lock/blue/io_protocol/io_addICCard.dart'; import 'package:star_lock/blue/io_protocol/io_addStressICCard.dart'; import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.dart'; import 'package:star_lock/blue/io_protocol/io_deletUser.dart'; import 'package:star_lock/blue/io_protocol/io_getLockStatu.dart'; +import 'package:star_lock/blue/io_protocol/io_queryingFaceStatus.dart'; import 'package:star_lock/blue/io_protocol/io_readAdminPassword.dart'; import 'io_protocol/io_addFingerprint.dart'; @@ -33,50 +34,53 @@ import 'io_protocol/io_transferPermissions.dart'; import 'sender_data.dart'; class IoSenderManage { - //todo:获取公钥 - static void getPublicKey({String? lockId ,CommandSendCallBack? callBack}) { - CommandSenderManager().managerSendData(command: GetPublicKeyCommand( + static void getPublicKey({String? lockId, CommandSendCallBack? callBack}) { + CommandSenderManager().managerSendData( + command: GetPublicKeyCommand( lockID: lockId, - ), callBack:callBack); + ), + callBack: callBack); } //todo:获取私钥 - static void getPrivateKey({ - String? lockId, - String? keyID, // 钥匙ID - String? authUserID,// 钥匙授权人ID - int? nowTime, - List? publicKeyData, - int? needAuthor, - CommandSendCallBack? callBack}) { - CommandSenderManager().managerSendData(command: GetPrivateKeyCommand( - lockID: lockId, - keyID: keyID, - authUserID: authUserID, - nowTime: nowTime, - publicKeyData:publicKeyData, - needAuthor: needAuthor, - ), callBack:callBack); + static void getPrivateKey( + {String? lockId, + String? keyID, // 钥匙ID + String? authUserID, // 钥匙授权人ID + int? nowTime, + List? publicKeyData, + int? needAuthor, + CommandSendCallBack? callBack}) { + CommandSenderManager().managerSendData( + command: GetPrivateKeyCommand( + lockID: lockId, + keyID: keyID, + authUserID: authUserID, + nowTime: nowTime, + publicKeyData: publicKeyData, + needAuthor: needAuthor, + ), + callBack: callBack); } //todo:添加用户 - static void senderAddUser({ - String? lockID, - String? authUserID, - String? keyID, - String? userID, - int? openMode, - int? keyType, - int? startDate, - int? expireDate, - int? role, - String? password, - int? needAuthor, - List? publicKey, - List? privateKey, - List? token, - CommandSendCallBack? callBack}) { + static void senderAddUser( + {String? lockID, + String? authUserID, + String? keyID, + String? userID, + int? openMode, + int? keyType, + int? startDate, + int? expireDate, + int? role, + String? password, + int? needAuthor, + List? publicKey, + List? privateKey, + List? token, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: AddUserCommand( lockID: lockID, @@ -92,27 +96,27 @@ class IoSenderManage { needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - token: token - ), callBack:callBack); + token: token), + callBack: callBack); } //todo:修改用户 - static void senderEditUser({ - String? lockID, - String? authUserID, - String? keyID, - String? userID, - int? openMode, - int? keyType, - int? startDate, - int? expireDate, - int? role, - String? password, - int? needAuthor, - List? publicKey, - List? privateKey, - List? token, - CommandSendCallBack? callBack}) { + static void senderEditUser( + {String? lockID, + String? authUserID, + String? keyID, + String? userID, + int? openMode, + int? keyType, + int? startDate, + int? expireDate, + int? role, + String? password, + int? needAuthor, + List? publicKey, + List? privateKey, + List? token, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: EditUserCommand( lockID: lockID, @@ -128,46 +132,46 @@ class IoSenderManage { needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - token: token - ), callBack:callBack); + token: token), + callBack: callBack); } //todo:删除 - static void deletUser({ - String? lockID, - String? authUserID, - String? keyID, - String? delUserID, - int? needAuthor, - List? publicKey, - List? privateKey, - List? token, - CommandSendCallBack? callBack}) { + static void deletUser( + {String? lockID, + String? authUserID, + String? keyID, + String? delUserID, + int? needAuthor, + List? publicKey, + List? privateKey, + List? token, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: DeletUserCommand( lockID: lockID, authUserID: authUserID, keyID: keyID, - delUserID:delUserID, + delUserID: delUserID, needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - token: token - ), callBack:callBack); + token: token), + callBack: callBack); } //todo:开锁 - static void senderOpenLock({ - String? keyID, - String? userID, - int? openMode, - int? openTime, - String? onlineToken, - List? token, - int? needAuthor, - List? signKey, - List? privateKey, - CommandSendCallBack? callBack}) { + static void senderOpenLock( + {String? keyID, + String? userID, + int? openMode, + int? openTime, + String? onlineToken, + List? token, + int? needAuthor, + List? signKey, + List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: OpenLockCommand( keyID: keyID, @@ -179,49 +183,52 @@ class IoSenderManage { needAuthor: needAuthor, signKey: signKey, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); } //todo:获取锁状态 - static void senderGetLockStatu({ - String? lockID, - String? userID, - List? privateKey, - CommandSendCallBack? callBack}) { + static void senderGetLockStatu( + {String? lockID, + String? userID, + List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: GetLockStatuCommand( lockID: lockID, userID: userID, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); } //todo:获取星锁状态信息 - static void senderGetStarLockStatuInfo({ - String? lockID, - String? userID, - List? privateKey, - CommandSendCallBack? callBack}) { + static void senderGetStarLockStatuInfo( + {String? lockID, + String? userID, + List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: GetStarLockStatuInfoCommand( lockID: lockID, userID: userID, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); } //todo:转移权限 - static void senderTransferPermissions({ - required String? lockID, - required String? authUserID, - required String? keyID, - required String? oldUserID, - required String? newUserID, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - required List? token, - CommandSendCallBack? callBack}) { + static void senderTransferPermissions( + {required String? lockID, + required String? authUserID, + required String? keyID, + required String? oldUserID, + required String? newUserID, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + required List? token, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: TransferPermissionsCommand( lockID: lockID, @@ -232,20 +239,20 @@ class IoSenderManage { needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - token: token - ), callBack:callBack); + token: token), + callBack: callBack); } //todo:恢复出厂设置 - static void senderFactoryDataReset({ - required String? lockID, - required String? userID, - required String? keyID, - required List? publicKey, - required List? privateKey, - required List? token, - required int? needAuthor, - CommandSendCallBack? callBack}) { + static void senderFactoryDataReset( + {required String? lockID, + required String? userID, + required String? keyID, + required List? publicKey, + required List? privateKey, + required List? token, + required int? needAuthor, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: FactoryDataResetCommand( lockID: lockID, @@ -254,60 +261,30 @@ class IoSenderManage { needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - token: token - ), callBack:callBack); + token: token), + callBack: callBack); } //todo:设置开锁密码 - static void senderCustomPasswordsCommand({ - required String? keyID, - required String? userID, - required int? pwdNo, - required String? pwd, - required int? useCountLimit, - required List? token, - required int? startTime, - required int? endTime, - required int? needAuthor, - required List? signKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + static void senderCustomPasswordsCommand( + {required String? keyID, + required String? userID, + required int? pwdNo, + required String? pwd, + required int? useCountLimit, + required List? token, + required int? startTime, + required int? endTime, + required int? needAuthor, + required List? signKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderCustomPasswordsCommand( - keyID: keyID, - userID: userID, - pwdNo: pwdNo, - pwd:pwd, - useCountLimit: useCountLimit, - token: token, - startTime: startTime, - endTime: endTime, - needAuthor: needAuthor, - signKey: signKey, - privateKey: privateKey, - ), callBack:callBack); - } - - //todo:修改管理员密码 - static void changeAdministratorPasswordCommand({ - required String? keyID, - required String? userID, - required int? pwdNo, - required String? pwd, - required int? useCountLimit, - required List? token, - required int? startTime, - required int? endTime, - required int? needAuthor, - required List? signKey, - required List? privateKey, - CommandSendCallBack? callBack}) { - CommandSenderManager().managerSendData( - command: ChangeAdministratorPasswordCommand( keyID: keyID, userID: userID, pwdNo: pwdNo, - pwd:pwd, + pwd: pwd, useCountLimit: useCountLimit, token: token, startTime: startTime, @@ -315,22 +292,54 @@ class IoSenderManage { needAuthor: needAuthor, signKey: signKey, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); + } + + //todo:修改管理员密码 + static void changeAdministratorPasswordCommand( + {required String? keyID, + required String? userID, + required int? pwdNo, + required String? pwd, + required int? useCountLimit, + required List? token, + required int? startTime, + required int? endTime, + required int? needAuthor, + required List? signKey, + required List? privateKey, + CommandSendCallBack? callBack}) { + CommandSenderManager().managerSendData( + command: ChangeAdministratorPasswordCommand( + keyID: keyID, + userID: userID, + pwdNo: pwdNo, + pwd: pwd, + useCountLimit: useCountLimit, + token: token, + startTime: startTime, + endTime: endTime, + needAuthor: needAuthor, + signKey: signKey, + privateKey: privateKey, + ), + callBack: callBack); } //todo:添加指纹开始 - static void senderAddFingerprintCommand({ - required String? keyID, - required String? userID, - required int? fingerNo, - required int? useCountLimit, - required List? token, - required int? startTime, - required int? endTime, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + static void senderAddFingerprintCommand( + {required String? keyID, + required String? userID, + required int? fingerNo, + required int? useCountLimit, + required List? token, + required int? startTime, + required int? endTime, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderAddFingerprintCommand( keyID: keyID, @@ -343,22 +352,23 @@ class IoSenderManage { needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); } //todo:添加卡开始 - static void senderAddICCardCommand({ - required String? keyID, - required String? userID, - required int? cardNo, - required int? useCountLimit, - required List? token, - required int? startTime, - required int? endTime, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + static void senderAddICCardCommand( + {required String? keyID, + required String? userID, + required int? cardNo, + required int? useCountLimit, + required List? token, + required int? startTime, + required int? endTime, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderAddICCardCommand( keyID: keyID, @@ -371,19 +381,49 @@ class IoSenderManage { needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); + } + + //todo:添加人脸开始 + static void senderAddFaceCommand( + {required String? keyID, + required String? userID, + required int? faceNo, + required int? useCountLimit, + required List? token, + required int? startTime, + required int? endTime, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + CommandSendCallBack? callBack}) { + CommandSenderManager().managerSendData( + command: SenderAddFaceCommand( + keyID: keyID, + userID: userID, + faceNo: faceNo, + useCountLimit: useCountLimit, + token: token, + startTime: startTime, + endTime: endTime, + needAuthor: needAuthor, + publicKey: publicKey, + privateKey: privateKey, + ), + callBack: callBack); } //todo:校验时间 - static void senderTimingCommand({ - required String? lockID, - required String? userID, - required int? nowTime, - required List? token, - required int? needAuthor, - required List? signKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + static void senderTimingCommand( + {required String? lockID, + required String? userID, + required int? nowTime, + required List? token, + required int? needAuthor, + required List? signKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: TimingCommand( lockID: lockID, @@ -393,7 +433,8 @@ class IoSenderManage { needAuthor: needAuthor, signKey: signKey, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); } //todo:自动落锁 - 废弃 @@ -419,16 +460,16 @@ class IoSenderManage { // } //todo:事件记录(页数查询) - static void senderReferEventRecordNumberCommand({ - required String? keyID, - required String? userID, - required int? logsCount, - required int? logsNo, - required List? token, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + static void senderReferEventRecordNumberCommand( + {required String? keyID, + required String? userID, + required int? logsCount, + required int? logsNo, + required List? token, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderReferEventRecordNumberCommand( keyID: keyID, @@ -439,20 +480,21 @@ class IoSenderManage { needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); } //todo:事件记录(时间查询) - static void senderReferEventRecordTimeCommand({ - required String? keyID, - required String? userID, - required int? logsCount, - required int? time, - required List? token, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + static void senderReferEventRecordTimeCommand( + {required String? keyID, + required String? userID, + required int? logsCount, + required int? time, + required List? token, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderReferEventRecordTimeCommand( keyID: keyID, @@ -463,21 +505,22 @@ class IoSenderManage { needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); } //todo:查询指纹状态 - static void senderQueryingFingerprintStatusCommand({ - required String? keyID, - required String? userID, - required int? role, - required int? fingerCount, - required int? fingerNo, - required List? token, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + static void senderQueryingFingerprintStatusCommand( + {required String? keyID, + required String? userID, + required int? role, + required int? fingerCount, + required int? fingerNo, + required List? token, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderQueryingFingerprintStatusCommand( keyID: keyID, @@ -489,21 +532,22 @@ class IoSenderManage { needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); } //todo:查询卡片状态 - static void senderCheckingCardStatusCommand({ - required String? keyID, - required String? userID, - required int? role, - required int? cardCount, - required int? cardNo, - required List? token, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + static void senderCheckingCardStatusCommand( + {required String? keyID, + required String? userID, + required int? role, + required int? cardCount, + required int? cardNo, + required List? token, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderCheckingCardStatusCommand( keyID: keyID, @@ -515,20 +559,48 @@ class IoSenderManage { needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); + } + + //todo:查询人脸状态 + static void senderQueryingFaceStatusCommand( + {required String? keyID, + required String? userID, + required int? role, + required int? fingerCount, + required int? fingerNo, + required List? token, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + CommandSendCallBack? callBack}) { + CommandSenderManager().managerSendData( + command: SenderQueryingFaceStatusCommand( + keyID: keyID, + userID: userID, + role: role, + fingerCount: fingerCount, + fingerNo: fingerNo, + token: token, + needAuthor: needAuthor, + publicKey: publicKey, + privateKey: privateKey, + ), + callBack: callBack); } //todo:查询用户、指纹、密码、卡片数量(用于判断是否同步) - static void senderCheckingUserInfoCountCommand({ - required String? keyID, - required String? userID, - required int? role, - required int? nowTime, - required List? token, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + static void senderCheckingUserInfoCountCommand( + {required String? keyID, + required String? userID, + required int? role, + required int? nowTime, + required List? token, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderCheckingUserInfoCountCommand( keyID: keyID, @@ -539,24 +611,25 @@ class IoSenderManage { needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); } //todo:配置wifi - static void senderConfiguringWifiCommand({ - required String? keyID, - required String? userID, - required String? ssid, - required String? password, - required int? numberOfServers, - required List? listOfServers, - required int? numberOfPhone, - required List? listOfPhone, - required List? token, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + static void senderConfiguringWifiCommand( + {required String? keyID, + required String? userID, + required String? ssid, + required String? password, + required int? numberOfServers, + required List? listOfServers, + required int? numberOfPhone, + required List? listOfPhone, + required List? token, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderConfiguringWifiCommand( keyID: keyID, @@ -571,86 +644,87 @@ class IoSenderManage { needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); } //todo:添加胁迫指纹 - static void senderAddStressFingerprintCommand({ - required String? keyID, - required String? userID, - required int? fingerNo, - required int? fingerType, - required int? useCountLimit, - required List? token, - required int? startTime, - required int? endTime, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - required List? signKey, - CommandSendCallBack? callBack}) { + static void senderAddStressFingerprintCommand( + {required String? keyID, + required String? userID, + required int? fingerNo, + required int? fingerType, + required int? useCountLimit, + required List? token, + required int? startTime, + required int? endTime, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + required List? signKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderAddStressFingerprintCommand( - keyID: keyID, - userID: userID, - fingerNo: fingerNo, - fingerType: fingerType, - useCountLimit: useCountLimit, - token: token, - startTime: startTime, - endTime: endTime, - needAuthor: needAuthor, - publicKey: publicKey, - privateKey: privateKey, - signKey: signKey - ), callBack:callBack); + keyID: keyID, + userID: userID, + fingerNo: fingerNo, + fingerType: fingerType, + useCountLimit: useCountLimit, + token: token, + startTime: startTime, + endTime: endTime, + needAuthor: needAuthor, + publicKey: publicKey, + privateKey: privateKey, + signKey: signKey), + callBack: callBack); } //todo:添加胁迫卡片 - static void senderAddStressICCardCommand({ - required String? keyID, - required String? userID, - required int? icCardNo, - required int? cardType, - required int? useCountLimit, - required List? token, - required int? startTime, - required int? endTime, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - required List? signKey, - CommandSendCallBack? callBack}) { + static void senderAddStressICCardCommand( + {required String? keyID, + required String? userID, + required int? icCardNo, + required int? cardType, + required int? useCountLimit, + required List? token, + required int? startTime, + required int? endTime, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + required List? signKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderAddStressICCardCommand( - keyID: keyID, - userID: userID, - icCardNo: icCardNo, - cardType: cardType, - useCountLimit: useCountLimit, - token: token, - startTime: startTime, - endTime: endTime, - needAuthor: needAuthor, - publicKey: publicKey, - privateKey: privateKey, - signKey: signKey - ), callBack:callBack); + keyID: keyID, + userID: userID, + icCardNo: icCardNo, + cardType: cardType, + useCountLimit: useCountLimit, + token: token, + startTime: startTime, + endTime: endTime, + needAuthor: needAuthor, + publicKey: publicKey, + privateKey: privateKey, + signKey: signKey), + callBack: callBack); } //todo:添加胁迫密码 - static void senderAddStressPasswordCommand({ - required String? keyID, - required String? userID, - required int? passwordNo, - required int? useCountLimit, - required List? token, - required int? startTime, - required int? endTime, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + static void senderAddStressPasswordCommand( + {required String? keyID, + required String? userID, + required int? passwordNo, + required int? useCountLimit, + required List? token, + required int? startTime, + required int? endTime, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderAddStressPasswordCommand( keyID: keyID, @@ -663,19 +737,20 @@ class IoSenderManage { needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); } //todo:读取支持功能(不带参数)启用/禁用 - static void readSupportFunctionsNoParametersCommand({ - required String? keyID, - required String? userID, - required int? featureBit, - required List? token, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + static void readSupportFunctionsNoParametersCommand( + {required String? keyID, + required String? userID, + required int? featureBit, + required List? token, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: ReadSupportFunctionsNoParametersCommand( keyID: keyID, @@ -685,43 +760,45 @@ class IoSenderManage { needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); } //todo:设置支持功能(不带参数)启用/禁用 - static void setSupportFunctionsNoParametersCommand({ - required String? keyID, - required String? userID, - required int? featureBit, - required int? featureEnable, - required List? token, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + static void setSupportFunctionsNoParametersCommand( + {required String? keyID, + required String? userID, + required int? featureBit, + required int? featureEnable, + required List? token, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SetSupportFunctionsNoParametersCommand( keyID: keyID, userID: userID, featureBit: featureBit, - featureEnable:featureEnable, + featureEnable: featureEnable, token: token, needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); } //todo:读取支持功能(带参数)启用/禁用 - static void readSupportFunctionsWithParametersCommand({ - required String? keyID, - required String? userID, - required int? featureBit, - required List? token, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + static void readSupportFunctionsWithParametersCommand( + {required String? keyID, + required String? userID, + required int? featureBit, + required List? token, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: ReadSupportFunctionsWithParametersCommand( keyID: keyID, @@ -731,47 +808,49 @@ class IoSenderManage { needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); } //todo:设置支持功能(带参数)启用/禁用 - static void setSupportFunctionsWithParametersCommand({ - required String? keyID, - required String? userID, - required int? featureBit, - required int? featureParaLength, - required List? featureData, - required List? token, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + static void setSupportFunctionsWithParametersCommand( + {required String? keyID, + required String? userID, + required int? featureBit, + required int? featureParaLength, + required List? featureData, + required List? token, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SetSupportFunctionsWithParametersCommand( keyID: keyID, userID: userID, featureBit: featureBit, - featureParaLength:featureParaLength, - featureData:featureData, + featureParaLength: featureParaLength, + featureData: featureData, token: token, needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); } //todo:读取管理员密码 - static void senderReadAdminPasswordCommand({ - required String? keyID, - required String? userID, - required int? role, - required int? pwdNum, - required int? pwdNo, - required List? token, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + static void senderReadAdminPasswordCommand( + {required String? keyID, + required String? userID, + required int? role, + required int? pwdNum, + required int? pwdNo, + required List? token, + required int? needAuthor, + required List? publicKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderReadAdminPasswordCommand( keyID: keyID, @@ -783,7 +862,7 @@ class IoSenderManage { needAuthor: needAuthor, publicKey: publicKey, privateKey: privateKey, - ), callBack:callBack); + ), + callBack: callBack); } - -} \ No newline at end of file +} diff --git a/star_lock/lib/main/lockDetail/face/addFace/addFace_entity.dart b/star_lock/lib/main/lockDetail/face/addFace/addFace_entity.dart new file mode 100644 index 00000000..e69de29b diff --git a/star_lock/lib/main/lockDetail/face/addFace/addFace_logic.dart b/star_lock/lib/main/lockDetail/face/addFace/addFace_logic.dart new file mode 100644 index 00000000..a991f631 --- /dev/null +++ b/star_lock/lib/main/lockDetail/face/addFace/addFace_logic.dart @@ -0,0 +1,294 @@ +import 'dart:async'; + +import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/blue/io_protocol/io_addFace.dart'; +import 'package:star_lock/blue/io_type.dart'; +import 'package:star_lock/main/lockDetail/face/addFace/addFace_state.dart'; +import 'package:star_lock/tools/eventBusEventManage.dart'; + +import '../../../../../blue/blue_manage.dart'; +import '../../../../../blue/io_reply.dart'; +import '../../../../../blue/io_tool/io_tool.dart'; +import '../../../../../blue/io_tool/manager_event_bus.dart'; +import '../../../../../blue/sender_manage.dart'; +import '../../../../../network/api_repository.dart'; +import '../../../../../tools/baseGetXController.dart'; +import '../../../../../tools/storage.dart'; + +class AddFaceLogic extends BaseGetXController { + final AddFaceState state = AddFaceState(); + + // 监听设备返回的数据 + late StreamSubscription _replySubscription; + void _initReplySubscription() { + _replySubscription = + EventBusManager().eventBus!.on().listen((reply) async { + // 添加指纹开始 + if (reply is SenderAddFaceReply) { + _replyAddFaceBegin(reply); + } + + // 添加指纹过程 + if (reply is SenderAddFaceProcessReply) { + _replyAddFaceProcess(reply); + } + + // 添加指纹确认 + if (reply is SenderAddFaceConfirmationReply) { + _replyAddFaceConfirmation(reply); + } + }); + } + + Future _replyAddFaceBegin(Reply reply) async { + int status = reply.data[2]; + print("status:$status"); + + switch (status) { + case 0x00: + //成功 + print("${reply.commandType!.typeValue} 人脸开始数据解析成功"); + state.ifConnectScuess.value = true; + + // 最大图片数 + state.maxRegCount.value = reply.data[10]; + print("人脸开始state.maxRegCount.value:${state.maxRegCount.value}"); + // state.fingerprintNumber.value = reply.data.last.toString(); + break; + case 0x06: + //无权限 + print("${reply.commandType!.typeValue} 需要鉴权"); + var privateKey = await Storage.getStringList(saveBluePrivateKey); + List getPrivateKeyList = changeStringListToIntList(privateKey!); + + var publicKey = await Storage.getStringList(saveBluePublicKey); + List publicKeyDataList = changeStringListToIntList(publicKey!); + + var token = reply.data.sublist(5, 9); + var saveStrList = changeIntListToStringList(token); + print("_replyAddFaceReplyToken:$token"); + Storage.setStringList(saveBlueToken, saveStrList); + + IoSenderManage.senderAddFaceCommand( + keyID: "1", + userID: await Storage.getUid(), + faceNo: 1, + useCountLimit: 0xff, + // startTime:0x11223344, + // endTime:0x11223344, + startTime: state.startDate.value ~/ 1000, + endTime: state.endDate.value ~/ 1000, + needAuthor: 1, + publicKey: publicKeyDataList, + privateKey: getPrivateKeyList, + token: token, + ); + break; + case 0x07: + //无权限 + print("${reply.commandType!.typeValue} 用户无权限"); + + break; + case 0x09: + // 权限校验错误 + print("${reply.commandType!.typeValue} 权限校验错误"); + + break; + default: + //失败 + print("${reply.commandType!.typeValue} 失败"); + + break; + } + } + + Future _replyAddFaceProcess(Reply reply) async { + int status = reply.data[2]; + print("33 status:$status"); + + switch (status) { + case 0x00: + //成功 + print("${reply.commandType!.typeValue} 注册人脸过程数据解析成功"); + if (reply.data[5] == 255) { + // 注册指纹失败 + print("${reply.commandType!.typeValue} 注册人脸过程失败"); + showToast("添加失败"); + Get.close(2); + } else { + // state.addFaceProcessNumber.value++; + + // 当前注册数 + state.regIndex.value = reply.data[6]; + print("state.regIndex.value:${state.regIndex.value}"); + } + break; + case 0x06: + //需要权限 + + break; + case 0x07: + //无权限 + print("${reply.commandType!.typeValue} 用户无权限"); + + break; + case 0x09: + // 权限校验错误 + print("${reply.commandType!.typeValue} 权限校验错误"); + + break; + default: + //失败 + print("${reply.commandType!.typeValue} 注册人脸过程default失败"); + + break; + } + } + + Future _replyAddFaceConfirmation(Reply reply) async { + int status = reply.data[2]; + print("status:$status"); + + switch (status) { + case 0x00: + //成功 + print("${reply.commandType!.typeValue} 人脸确认数据解析成功"); + // print("添加人脸确认成功,调用添加指纹接口"); + if (state.faceNumber.value == (reply.data[6]).toString()) { + return; + } else { + state.faceNumber.value = (reply.data[6]).toString(); + } + addFaceData(); + break; + case 0x06: + //需要权限 + + break; + case 0x07: + //无权限 + print("${reply.commandType!.typeValue} 用户无权限"); + + break; + case 0x09: + // 权限校验错误 + print("${reply.commandType!.typeValue} 权限校验错误"); + + break; + default: + //失败 + print("${reply.commandType!.typeValue} 人脸确认default失败"); + + break; + } + } + + // 添加人脸开始 + Future senderAddFace() async { + showBlueConnetctToastTimer(action: () { + Get.close(1); + }); + BlueManage().bludSendData(BlueManage().connectDeviceName, + (DeviceConnectionState deviceConnectionState) async { + if (deviceConnectionState == DeviceConnectionState.connected) { + cancelBlueConnetctToastTimer(); + var publicKey = await Storage.getStringList(saveBluePublicKey); + List publicKeyDataList = changeStringListToIntList(publicKey!); + + var privateKey = await Storage.getStringList(saveBluePrivateKey); + List getPrivateKeyList = changeStringListToIntList(privateKey!); + + var token = await Storage.getStringList(saveBlueToken); + List getTokenList = changeStringListToIntList(token!); + print( + "openDoorTokenPubToken:$getTokenList state.startDate.value:${state.startDate.value}"); + + IoSenderManage.senderAddFaceCommand( + keyID: "1", + userID: await Storage.getUid(), + faceNo: 1, + useCountLimit: 0xff, + // startTime:0x11223344, + // endTime:0x11223344, + startTime: state.startDate.value ~/ 1000, + endTime: state.endDate.value ~/ 1000, + needAuthor: 1, + publicKey: publicKeyDataList, + privateKey: getPrivateKeyList, + token: getTokenList, + ); + } else if (deviceConnectionState == DeviceConnectionState.disconnected) { + if (state.ifCurrentScreen.value == true) { + showBlueConnetctToast(); + } + cancelBlueConnetctToastTimer(); + Get.close(1); + } + }); + } + + // 添加人脸 + void addFaceData() async { + var entity = await ApiRepository.to.addFaceData( + lockId: state.lockId.value, + faceName: state.faceName.value, + faceNumber: state.faceNumber.value, + faceType: state.faceType.value, + startDate: state.startDate.value, + endDate: state.endDate.value, + featureData: state.featureData.value, + addType: state.addType.value, + cyclicConfig: state.cyclicConfig.value, + ); + + if (entity.errorCode!.codeIsSuccessful) { + // Toast.show(msg: "添加成功"); + updateFaceUserNoLoadData(entity.data!.fingerprintId.toString()); + } + } + + // 更新人脸用户账号 + void updateFaceUserNoLoadData(String faceId) async { + var entity = await ApiRepository.to.updateFaceUserNoLoadData( + faceId: faceId, + lockId: state.lockId.value.toString(), + faceUserNo: state.faceNumber.value, + ); + if (entity.errorCode!.codeIsSuccessful) { + showToast("添加成功"); + if (state.fromType.value == 2) { + // 回调人脸号 + eventBus + .fire(ChickInAddStaffCardAndFingerprintBlockNumberEvent(faceId)); + } else if (state.fromType.value == 1) { + eventBus.fire(OtherTypeRefreshListEvent()); + } + Get.close(2); + } + } + + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + + _initReplySubscription(); + } + + @override + void onInit() { + // TODO: implement onInit + super.onInit(); +//开始添加后发送指令 + // senderAddFace(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + + _replySubscription.cancel(); + } +} diff --git a/star_lock/lib/main/lockDetail/face/addFace/addFace_page.dart b/star_lock/lib/main/lockDetail/face/addFace/addFace_page.dart index a6a390e9..c0e363d5 100644 --- a/star_lock/lib/main/lockDetail/face/addFace/addFace_page.dart +++ b/star_lock/lib/main/lockDetail/face/addFace/addFace_page.dart @@ -1,39 +1,40 @@ import 'package:flutter/material.dart'; -import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/face/addFace/addFace_logic.dart'; -import '../../../../../appRouters.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; import '../../../../../translations/trans_lib.dart'; -class AddFaceTipPage extends StatefulWidget { - const AddFaceTipPage({Key? key}) : super(key: key); +class AddFacePage extends StatefulWidget { + const AddFacePage({Key? key}) : super(key: key); @override - State createState() => _AddFaceTipPageState(); + State createState() => _AddFacePageState(); } -class _AddFaceTipPageState extends State { +class _AddFacePageState extends State { + final logic = Get.put(AddFaceLogic()); + final state = Get.find().state; + @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: "${TranslationLoader.lanKeys!.addTip!.tr}${TranslationLoader.lanKeys!.face!.tr}", + barTitle: + "${TranslationLoader.lanKeys!.addTip!.tr}${TranslationLoader.lanKeys!.face!.tr}", haveBack: true, backgroundColor: AppColors.mainColor), body: ListView( - // mainAxisAlignment: MainAxisAlignment.center, - // crossAxisAlignment: CrossAxisAlignment.center, children: [ SizedBox( height: 50.h, ), Image.asset( - 'images/main/icon_main_addFace.png', + 'images/main/icon_addFace_step1.png', width: 100.w, height: 457.h, fit: BoxFit.fitHeight, @@ -48,9 +49,8 @@ class _AddFaceTipPageState extends State { children: [ Expanded( child: Text( - "请单人正对门锁,距离一个成年人手臂长度(约0.6米).\n保持脸部无遮挡,露出五官", - // TranslationLoader.lanKeys!.lightTouchScreenTip!.tr, - textAlign: TextAlign.center, + "请单人正对门锁,距离一个成年人手臂长度\n(约0.6米)。\n保持脸部无遮挡,露出五官。", + textAlign: TextAlign.left, maxLines: null, style: TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600), @@ -62,15 +62,32 @@ class _AddFaceTipPageState extends State { SizedBox( height: 120.h, ), - Container( - padding: EdgeInsets.only(left: 20.w, right: 20.w), - child: SubmitBtn( - btnName: "开始添加", //TranslationLoader.lanKeys!.next!.tr, - borderRadius: 20.w, - onClick: () { - EasyLoading.showToast("请确保在设备附近,设备未被连接,设备已打开", duration: 2000.milliseconds); - }), - ), + Obx( + () => state.isClickAddFace.value == false + ? Container( + padding: EdgeInsets.only(left: 20.w, right: 20.w), + child: SubmitBtn( + btnName: + "准备好了,开始添加", //TranslationLoader.lanKeys!.next!.tr, + borderRadius: 20.w, + onClick: () { + state.isClickAddFace.value = true; + logic.senderAddFace(); + }), + ) + : Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + '正在录入中...', + style: TextStyle( + color: AppColors.darkGrayTextColor, + fontSize: 22.sp), + textAlign: TextAlign.center, + ) + ], + ), + ) ], ), ); diff --git a/star_lock/lib/main/lockDetail/face/addFace/addFace_state.dart b/star_lock/lib/main/lockDetail/face/addFace/addFace_state.dart new file mode 100644 index 00000000..37d0b763 --- /dev/null +++ b/star_lock/lib/main/lockDetail/face/addFace/addFace_state.dart @@ -0,0 +1,35 @@ +import 'package:get/get.dart'; + +class AddFaceState { + var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + + var ifConnectScuess = false.obs; + var maxRegCount = 0.obs; // 最大注册次数 + var regIndex = 0.obs; // 当前注册次数 + + var faceNumber = "".obs; + + final lockId = 0.obs; + final endDate = 0.obs; + final addType = "".obs; + final faceName = "".obs; + final faceType = 0.obs; + final startDate = 0.obs; + final cyclicConfig = [].obs; + final fromType = 1.obs; + final featureData = ''.obs; + final isClickAddFace = false.obs; + + AddFaceState() { + Map map = Get.arguments; + lockId.value = map["lockId"]; + endDate.value = map["endDate"]; + addType.value = map["addType"]; + faceName.value = map["faceName"]; + faceType.value = map["faceType"]; + startDate.value = map["startDate"]; + lockId.value = map["lockId"]; + cyclicConfig.value = map["cyclicConfig"]; + fromType.value = map["fromType"]; + } +} diff --git a/star_lock/lib/main/lockDetail/face/addFaceType/addFaceType_logic.dart b/star_lock/lib/main/lockDetail/face/addFaceType/addFaceType_logic.dart index cb0d1ffd..3f4536e3 100644 --- a/star_lock/lib/main/lockDetail/face/addFaceType/addFaceType_logic.dart +++ b/star_lock/lib/main/lockDetail/face/addFaceType/addFaceType_logic.dart @@ -1,8 +1,96 @@ - +import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/face/addFaceType/addFaceType_state.dart'; import 'package:star_lock/tools/baseGetXController.dart'; -import 'addFaceType_state.dart'; +import '../../../../appRouters.dart'; +import '../../../../network/api_repository.dart'; -class AddFaceTypeLogic extends BaseGetXController{ +class AddFaceTypeLogic extends BaseGetXController { AddFaceTypeState state = AddFaceTypeState(); -} \ No newline at end of file + // 添加指纹 + void addFaceData() async { + var faceType = 0; // 永久:1;限时2,单次3,循环:4 + var startDate = ""; + var endDate = ""; + if (state.seletType.value == "0") { + faceType = 1; + startDate = "0"; + endDate = "0"; + } else if (state.seletType.value == "1") { + faceType = 2; + if (state.beginTimeTimestamp.value.isEmpty) { + showToast("请选择开始时间"); + return; + } + if (state.endTimeTimestamp.value.isEmpty) { + showToast("请选择结束时间"); + return; + } + + // if(DateTime.now().millisecondsSinceEpoch > int.parse(state.beginTimeTimestamp.value)){ + // Toast.show(msg: "生效时间要大于当前时间"); + // return; + // } + + if (int.parse(state.beginTimeTimestamp.value) >= + int.parse(state.endTimeTimestamp.value)) { + showToast("失效时间要大于生效时间"); + return; + } + + startDate = state.beginTimeTimestamp.value; + endDate = state.endTimeTimestamp.value; + } else if (state.seletType.value == "2") { + if (state.effectiveDateTime.value <= 0) { + showToast("请选择生效时间"); + return; + } + if (state.failureDateTime.value <= 0) { + showToast("请选择失效时间"); + return; + } + + if (state.weekdaysList.value.isEmpty) { + showToast("请选择有效日"); + return; + } + + // if(DateTime.now().millisecondsSinceEpoch >= state.effectiveDateTime.value){ + // Toast.show(msg: "生效时间要大于当前时间"); + // return; + // } + + if (state.effectiveDateTime.value >= state.failureDateTime.value) { + showToast("失效时间要大于生效时间"); + return; + } + startDate = state.effectiveDateTime.value.toString(); + endDate = state.failureDateTime.value.toString(); + faceType = 4; + } + + // 人脸 + Get.toNamed(Routers.addFacePage, arguments: { + "lockId": state.lockId.value, + "endDate": int.parse(endDate), + "addType": "1", + "faceName": state.nameController.text, + "faceNumber": "123456", + "faceType": faceType, + "startDate": int.parse(startDate), + "cyclicConfig": state.weekdaysList.value, + "fromType": state.fromType.value, + }); + } + + // 校验指纹名字是否重复 + void checkFaceNameDuplicated(String faceName) async { + var entity = await ApiRepository.to.checkFaceNameDuplicatedData( + lockId: state.lockId.value.toString(), + faceName: faceName, + ); + if (entity.errorCode!.codeIsSuccessful) { + addFaceData(); + } + } +} diff --git a/star_lock/lib/main/lockDetail/face/addFaceType/addFaceType_page.dart b/star_lock/lib/main/lockDetail/face/addFaceType/addFaceType_page.dart index 6a16b593..e6b1e4fd 100644 --- a/star_lock/lib/main/lockDetail/face/addFaceType/addFaceType_page.dart +++ b/star_lock/lib/main/lockDetail/face/addFaceType/addFaceType_page.dart @@ -181,8 +181,7 @@ class _AddFaceTypePageState extends State { logic.showToast("请输入姓名"); return; } - - Get.toNamed(Routers.addFaceTipPage); + logic.checkFaceNameDuplicated(state.nameController.text); } else { // Get.toNamed(Routers.seletLockTypePage); logic.showToast("演示模式"); @@ -293,19 +292,4 @@ class _AddFaceTypePageState extends State { ), ); } - - //isStressFingerprint false:不是胁迫指纹 ture:胁迫指纹 - CupertinoSwitch _isStressFingerprint() { - return CupertinoSwitch( - activeColor: CupertinoColors.activeBlue, - trackColor: CupertinoColors.systemGrey5, - thumbColor: CupertinoColors.white, - value: true, - onChanged: (value) { - setState(() { - // state.isStressFingerprint.value = value; - }); - }, - ); - } } diff --git a/star_lock/lib/main/lockDetail/face/addFaceType/addFaceType_state.dart b/star_lock/lib/main/lockDetail/face/addFaceType/addFaceType_state.dart index ea1ddc6c..b2b59331 100644 --- a/star_lock/lib/main/lockDetail/face/addFaceType/addFaceType_state.dart +++ b/star_lock/lib/main/lockDetail/face/addFaceType/addFaceType_state.dart @@ -1,16 +1,25 @@ - import 'package:flutter/material.dart'; import 'package:get/get.dart'; -class AddFaceTypeState{ - var beginTime = "".obs;// 开始时间 - var endTime = "".obs;// 结束时间 - var beginTimeTimestamp = "".obs;// 开始时间时间戳 - var endTimeTimestamp = "".obs;// 结束时间时间戳 +class AddFaceTypeState { + final lockId = 0.obs; + final seletType = "0".obs; // 0永久 1显示 2循环 + final fromType = 1.obs; // // 1从添加钥匙列表进入 2从考勤添加员工入口进入 + final isStressFingerprint = false.obs; - var effectiveDateTime = 0.obs;// 生效时间 - var failureDateTime = 0.obs;// 失效时间 + var beginTime = "".obs; // 开始时间 + var endTime = "".obs; // 结束时间 + var beginTimeTimestamp = "".obs; // 开始时间时间戳 + var endTimeTimestamp = "".obs; // 结束时间时间戳 + + var effectiveDateTime = 0.obs; // 生效时间 + var failureDateTime = 0.obs; // 失效时间 var weekdaysList = [].obs; final TextEditingController nameController = TextEditingController(); -} \ No newline at end of file + AddFaceTypeState() { + Map map = Get.arguments; + lockId.value = map["lockId"]; + fromType.value = map["fromType"]; + } +} diff --git a/star_lock/lib/main/lockDetail/face/faceDetail/faceDetail_logic.dart b/star_lock/lib/main/lockDetail/face/faceDetail/faceDetail_logic.dart new file mode 100644 index 00000000..709887f5 --- /dev/null +++ b/star_lock/lib/main/lockDetail/face/faceDetail/faceDetail_logic.dart @@ -0,0 +1,193 @@ +import 'dart:async'; + +import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/blue/io_type.dart'; +import 'package:star_lock/main/lockDetail/face/faceDetail/faceDetail_state.dart'; +import 'package:star_lock/tools/baseGetXController.dart'; +import '../../../../blue/blue_manage.dart'; +import '../../../../blue/io_protocol/io_addFingerprint.dart'; +import '../../../../blue/io_reply.dart'; +import '../../../../blue/io_tool/io_tool.dart'; +import '../../../../blue/io_tool/manager_event_bus.dart'; +import '../../../../blue/sender_manage.dart'; +import '../../../../network/api_repository.dart'; +import '../../../../tools/storage.dart'; + +class FaceDetailLogic extends BaseGetXController { + FaceDetailState state = FaceDetailState(); + + // 获取解析后的数据 + late StreamSubscription _replySubscription; + void _initReplySubscription() { + _replySubscription = + EventBusManager().eventBus!.on().listen((reply) { + // 添加指纹开始(此处用作删除指纹) + if ((reply is SenderAddFingerprintReply)) { + _replyAddFingerprintBegin(reply); + } + }); + } + + // 添加指纹开始 + Future _replyAddFingerprintBegin(Reply reply) async { + int status = reply.data[2]; + print("status:$status"); + + switch (status) { + case 0x00: + //成功 + print("${reply.commandType!.typeValue} 数据解析成功"); + state.sureBtnState.value = 0; + cancelBlueConnetctToastTimer(); + dismissEasyLoading(); + deletFingerprintsData(); + break; + case 0x06: + //无权限 + print("${reply.commandType!.typeValue} 需要鉴权"); + var privateKey = await Storage.getStringList(saveBluePrivateKey); + List getPrivateKeyList = changeStringListToIntList(privateKey!); + + var publicKey = await Storage.getStringList(saveBluePublicKey); + List publicKeyDataList = changeStringListToIntList(publicKey!); + + var token = await Storage.getStringList(saveBlueToken); + List getTokenList = changeStringListToIntList(token!); + + String? userID = await Storage.getUid(); + IoSenderManage.senderAddFingerprintCommand( + keyID: state.keyId.value.toString(), + userID: userID, + fingerNo: int.parse(state.typeNumber.value), + useCountLimit: 0, + startTime: state.effectiveDateTime.value, + endTime: state.failureDateTime.value, + needAuthor: 1, + publicKey: publicKeyDataList, + privateKey: getPrivateKeyList, + token: getTokenList, + ); + break; + case 0x07: + //无权限 + print("${reply.commandType!.typeValue} 用户无权限"); + + break; + case 0x09: + // 权限校验错误 + print("${reply.commandType!.typeValue} 权限校验错误"); + + break; + default: + //失败 + print("${reply.commandType!.typeValue} 失败"); + + break; + } + } + + // 删除指纹 + Future senderAddFingerprint() async { + if (state.sureBtnState.value == 1) { + return; + } + state.sureBtnState.value = 1; + + showEasyLoading(); + showBlueConnetctToastTimer(action: () { + dismissEasyLoading(); + state.sureBtnState.value = 0; + }); + BlueManage().bludSendData(BlueManage().connectDeviceName, + (DeviceConnectionState deviceConnectionState) async { + if (deviceConnectionState == DeviceConnectionState.connected) { + var publicKey = await Storage.getStringList(saveBluePublicKey); + List publicKeyDataList = changeStringListToIntList(publicKey!); + + var privateKey = await Storage.getStringList(saveBluePrivateKey); + List getPrivateKeyList = changeStringListToIntList(privateKey!); + + var token = await Storage.getStringList(saveBlueToken); + List getTokenList = changeStringListToIntList(token!); + + String? userID = await Storage.getUid(); + + IoSenderManage.senderAddFingerprintCommand( + keyID: state.keyId.value.toString(), + userID: userID, + fingerNo: int.parse(state.typeNumber.value), + useCountLimit: 0, + startTime: state.effectiveDateTime.value, + endTime: state.failureDateTime.value, + needAuthor: 1, + publicKey: publicKeyDataList, + privateKey: getPrivateKeyList, + token: getTokenList, + ); + } else if (deviceConnectionState == DeviceConnectionState.disconnected) { + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + state.sureBtnState.value = 0; + if (state.ifCurrentScreen.value == true) { + showBlueConnetctToast(); + } + } + }); + } + + // 删除指纹 + void deletFingerprintsData() async { + var entity = await ApiRepository.to.deletFingerprintsData( + fingerprintId: state.faceItemData.value.faceId.toString(), + lockId: state.faceItemData.value.lockId.toString(), + type: "0", + deleteType: "1"); + if (entity.errorCode!.codeIsSuccessful) { + showToast("删除成功", something: () { + Get.back(result: "addScuess"); + }); + } + } + + // 编辑指纹 + void editFingerprintsData() async { + var entity = await ApiRepository.to.editFingerprintsData( + fingerprintId: state.keyId.value.toString(), + lockId: state.faceItemData.value.lockId.toString(), + weekDay: state.weekDay.value, + startDate: state.effectiveDateTime.value.toString(), + endDate: state.failureDateTime.value.toString(), + isCoerced: state.isStressFingerprint.value ? "2" : "1", + fingerprintName: state.changeNameController.text, + changeType: "1", + ); + if (entity.errorCode!.codeIsSuccessful) { + showToast("修改成功", something: () { + Get.back(result: "addScuess"); + }); + } + } + + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + + _initReplySubscription(); + } + + @override + void onInit() { + // TODO: implement onInit + super.onInit(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + + _replySubscription.cancel(); + } +} diff --git a/star_lock/lib/main/lockDetail/face/faceDetail/faceDetail_page.dart b/star_lock/lib/main/lockDetail/face/faceDetail/faceDetail_page.dart index e69de29b..26023d6a 100644 --- a/star_lock/lib/main/lockDetail/face/faceDetail/faceDetail_page.dart +++ b/star_lock/lib/main/lockDetail/face/faceDetail/faceDetail_page.dart @@ -0,0 +1,374 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/face/faceDetail/faceDetail_logic.dart'; + +import '../../../../appRouters.dart'; +import '../../../../app_settings/app_colors.dart'; +import '../../../../blue/blue_manage.dart'; +import '../../../../tools/appRouteObserver.dart'; +import '../../../../tools/commonItem.dart'; +import '../../../../tools/dateTool.dart'; +import '../../../../tools/showIosTipView.dart'; +import '../../../../tools/showTFView.dart'; +import '../../../../tools/submitBtn.dart'; +import '../../../../tools/titleAppBar.dart'; +import '../../../../translations/trans_lib.dart'; + +class FaceDetailPage extends StatefulWidget { + const FaceDetailPage({Key? key}) : super(key: key); + + @override + State createState() => _FingerprintDetailPageState(); +} + +class _FingerprintDetailPageState extends State + with RouteAware { + final logic = Get.put(FaceDetailLogic()); + final state = Get.find().state; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.mainBackgroundColor, + appBar: TitleAppBar( + barTitle: "指纹详情", + haveBack: true, + backgroundColor: AppColors.mainColor, + // actionsList: [ + // TextButton( + // child: Text(TranslationLoader.lanKeys!.share!.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp),), + // onPressed: () { + // + // }, + // ), + // ], + ), + body: Column( + children: [ + Obx(() => CommonItem( + leftTitel: + "${TranslationLoader.lanKeys!.fingerprint!.tr}${TranslationLoader.lanKeys!.number!.tr}", + rightTitle: state.typeNumber.value, + isHaveDirection: false, + isHaveLine: true)), + Obx(() => CommonItem( + leftTitel: TranslationLoader.lanKeys!.name!.tr, + rightTitle: state.typeName.value, + isHaveDirection: true, + isHaveLine: true, + action: () { + showCupertinoAlertDialog(context); + })), + Obx(() => Visibility( + visible: (state.keyType.value == 4 || state.keyType.value == 2) + ? true + : false, + child: CommonItem( + leftTitel: TranslationLoader.lanKeys!.periodValidity!.tr, + allHeight: 70.h, + // rightTitle:"2023.09.19 11:27\n2023.09.25 11:27", + rightTitle: state.keyType.value == 1 + ? "永久" + : "${DateTool().dateToYMDHNString(state.effectiveDateTime.value.toString())}\n${DateTool().dateToYMDHNString(state.failureDateTime.value.toString())}", + isHaveDirection: true, + isHaveLine: true, + action: () async { + // switch(state.type.value){ + // case 0: + // // 卡 + // + // break; + // case 1: + // 当是指纹的时候 + if (state.keyType.value == 2) { + // 限时 + var data = await Get.toNamed( + Routers.otherTypeKeyChangeDatePage, + arguments: { + "fingerprintItemData": state.faceItemData.value, + "pushType": 1, + }); + if (data != null) { + setState(() { + state.effectiveDateTime.value = + data["beginTimeTimestamp"]; + state.failureDateTime.value = + data["endTimeTimestamp"]; + }); + } + } else if (state.keyType.value == 4) { + // 循环 + var data = await Get.toNamed( + Routers.otherTypeKeyChangeValidityDatePage, + arguments: { + "fingerprintItemData": state.faceItemData.value, + }); + if (data != null) { + setState(() { + state.effectiveDateTime.value = + data["beginTimeTimestamp"]; + state.failureDateTime.value = + data["endTimeTimestamp"]; + state.weekDay.value = data["weekDay"]; + }); + } + } + }))), + Obx(() => Visibility( + visible: state.keyType.value == 4 ? true : false, + child: Obx(() => CommonItem( + leftTitel: TranslationLoader.lanKeys!.effectiveDay!.tr, + rightTitle: state.weekDay.value.join(','), + isHaveDirection: true, + action: () async { + // 当是指纹的时候 + var data = await Get.toNamed( + Routers.otherTypeKeyChangeValidityDatePage, + arguments: { + "fingerprintItemData": state.faceItemData.value, + }); + if (data != null) { + setState(() { + state.effectiveDateTime.value = + data["beginTimeTimestamp"]; + state.failureDateTime.value = data["endTimeTimestamp"]; + state.weekDay.value = data["weekDay"]; + }); + } + })))), + Container(height: 10.h), + Obx(() => CommonItem( + leftTitel: TranslationLoader.lanKeys!.additive!.tr, + rightTitle: state.adder.value, + isHaveLine: true, + action: () {})), + Obx(() => CommonItem( + leftTitel: TranslationLoader.lanKeys!.addTime!.tr, + rightTitle: + DateTool().dateToYMDHNString(state.addTime.value.toString()), + action: () {})), + SizedBox(height: 10.h), + + Container(height: 10.h), + CommonItem( + leftTitel: TranslationLoader.lanKeys!.operatingRecord!.tr, + rightTitle: "", + isHaveDirection: true, + action: () { + // 人脸 + Get.toNamed(Routers.keyOperationRecordPage, arguments: { + 'lockId': state.faceItemData.value.lockId.toString(), + 'faceId': state.faceItemData.value.faceId.toString() + }); + }), + // SizedBox(height: 40.h), + // addControlsBtn(type), + SizedBox(height: 30.h), + SubmitBtn( + btnName: TranslationLoader.lanKeys!.delete!.tr, + isDelete: true, + borderRadius: 20.w, + margin: EdgeInsets.only( + left: 30.w, right: 30.w, top: 30.w, bottom: 30.w), + padding: EdgeInsets.only(top: 25.w, bottom: 25.w), + onClick: () { + showIosTipViewDialog(context); + }), + ], + ), + ); + } + + // Widget addControlsBtn(int type) { + // List widgetList = []; + // List> routerList = []; + // //卡详情 + // if (type == 0) { + // routerList.add({ + // 'btnTitle': '设置密码', + // 'routerName': Routers.passwordKeyDetailPage, + // 'type': 9 + // }); + // routerList.add({ + // 'btnTitle': '设置指纹', + // 'routerName': Routers.otherTypeKeyManagePage, + // 'type': 1 + // }); + // routerList.add({ + // 'btnTitle': '设置遥控', + // 'routerName': Routers.otherTypeKeyManagePage, + // 'type': 2 + // }); + // } else if (type == 1) { + // //指纹详情 + // routerList.add({ + // 'btnTitle': '设置密码', + // 'routerName': Routers.passwordKeyDetailPage, + // 'type': 9 + // }); + // routerList.add({ + // 'btnTitle': '设置卡', + // 'routerName': Routers.otherTypeKeyManagePage, + // 'type': 0 + // }); + // routerList.add({ + // 'btnTitle': '设置遥控', + // 'routerName': Routers.otherTypeKeyManagePage, + // 'type': 2 + // }); + // } else if (type == 2) { + // //遥控详情 + // routerList.add({ + // 'btnTitle': '设置密码', + // 'routerName': Routers.passwordKeyDetailPage, + // 'type': 9 + // }); + // routerList.add({ + // 'btnTitle': '设置卡', + // 'routerName': Routers.otherTypeKeyManagePage, + // 'type': 0 + // }); + // routerList.add({ + // 'btnTitle': '设置指纹', + // 'routerName': Routers.otherTypeKeyManagePage, + // 'type': 1 + // }); + // } + // + // for (int i = 0; i < routerList.length; i++) { + // widgetList.add(SizedBox( + // width: ScreenUtil().screenWidth - 40.w, + // height: 60.h, + // child: OutlinedButton( + // style: OutlinedButton.styleFrom( + // // backgroundColor: Colors.white, + // side: BorderSide(width: 1, color: AppColors.mainColor)), + // onPressed: () { + // if (routerList[i]['type'] == 9) { + // Navigator.pushNamed(context, Routers.passwordKeyManagePage); + // } else { + // Navigator.pushNamed(context, Routers.otherTypeKeyManagePage, + // arguments: routerList[i]['type']); + // } + // }, + // child: Text( + // routerList[i]['btnTitle'], + // style: TextStyle(color: AppColors.mainColor, fontSize: 24.sp), + // )), + // )); + // + // widgetList.add( + // SizedBox( + // height: 10.h, + // ), + // ); + // } + // + // return Column( + // children: widgetList, + // ); + // } + + void showCupertinoAlertDialog(BuildContext context) { + showDialog( + context: context, + builder: (BuildContext context) { + return ShowTFView( + title: + "${TranslationLoader.lanKeys!.amend!.tr}${TranslationLoader.lanKeys!.name!.tr}", + tipTitle: "", + controller: state.changeNameController, + sureClick: () { + if (state.changeNameController.text.isEmpty) { + logic.showToast("请输入姓名"); + return; + } + Get.back(); + // 指纹 + logic.editFingerprintsData(); + }, + cancelClick: () { + Get.back(); + }, + ); + }); + } + + void showIosTipViewDialog(BuildContext context) { + showDialog( + context: context, + builder: (BuildContext context) { + return ShowIosTipView( + title: "提示", + tipTitle: "确定要删除吗?", + sureClick: () { + Get.back(); + // 指纹 + logic.senderAddFingerprint(); + }, + cancelClick: () { + Get.back(); + }, + ); + }); + } + + @override + void didChangeDependencies() { + // TODO: implement didChangeDependencies + super.didChangeDependencies(); + + /// 路由订阅 + AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!); + } + + @override + void dispose() { + // TODO: implement dispose + /// 取消路由订阅 + AppRouteObserver().routeObserver.unsubscribe(this); + super.dispose(); + } + + /// 从上级界面进入 当前界面即将出现 + @override + void didPush() { + super.didPush(); + print("lockSet===didPush"); + state.ifCurrentScreen.value = true; + } + + /// 返回上一个界面 当前界面即将消失 + @override + void didPop() { + super.didPop(); + print("lockSet===didPop"); + logic.cancelBlueConnetctToastTimer(); + if (EasyLoading.isShow) EasyLoading.dismiss(animation: true); + BlueManage().stopScan(); + state.ifCurrentScreen.value = false; + state.sureBtnState.value = 0; + } + + /// 从下级返回 当前界面即将出现 + @override + void didPopNext() { + super.didPopNext(); + print("lockSet===didPopNext"); + state.ifCurrentScreen.value = true; + } + + /// 进入下级界面 当前界面即将消失 + @override + void didPushNext() { + super.didPushNext(); + print("lockSet===didPushNext"); + logic.cancelBlueConnetctToastTimer(); + if (EasyLoading.isShow) EasyLoading.dismiss(animation: true); + BlueManage().stopScan(); + state.ifCurrentScreen.value = false; + state.sureBtnState.value = 0; + } +} diff --git a/star_lock/lib/main/lockDetail/face/faceDetail/faceDetail_state.dart b/star_lock/lib/main/lockDetail/face/faceDetail/faceDetail_state.dart new file mode 100644 index 00000000..d631d6db --- /dev/null +++ b/star_lock/lib/main/lockDetail/face/faceDetail/faceDetail_state.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/face/faceList/faceListData_entity.dart'; + +class FaceDetailState { + final faceItemData = FaceItemData().obs; + + final TextEditingController changeNameController = TextEditingController(); + + final typeNumber = "".obs; // 指纹号 + final typeName = "".obs; // 指纹名字 + var effectiveDateTime = 0.obs; // 生效时间 + var failureDateTime = 0.obs; // 失效时间 + final keyType = 0.obs; // 永久:1;限时2,单次3,循环:4 + var weekDay = [].obs; // 有效日 + var adder = "".obs; // 添加者 + var addTime = 0.obs; // 添加时间 + var keyId = 0.obs; + + var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + var sureBtnState = 0.obs; // 0普通状态(可用) 1连接中(不可用) + + final isStressFingerprint = false.obs; + FaceDetailState() { + Map map = Get.arguments; + faceItemData.value = map["faceItemData"]; + keyId.value = faceItemData.value.faceId!; + typeNumber.value = faceItemData.value.faceNumber!; + typeName.value = faceItemData.value.faceName!; + changeNameController.text = typeName.value; + effectiveDateTime.value = faceItemData.value.startDate!; + failureDateTime.value = faceItemData.value.endDate!; + keyType.value = faceItemData.value.faceType!; + adder.value = faceItemData.value.senderUsername!; + addTime.value = faceItemData.value.createDate!; + weekDay.value = faceItemData.value.cyclicConfig!; + } +} diff --git a/star_lock/lib/main/lockDetail/face/faceList/faceListData_entity.dart b/star_lock/lib/main/lockDetail/face/faceList/faceListData_entity.dart new file mode 100644 index 00000000..942f823c --- /dev/null +++ b/star_lock/lib/main/lockDetail/face/faceList/faceListData_entity.dart @@ -0,0 +1,131 @@ +class FaceListDataEntity { + int? errorCode; + String? description; + String? errorMsg; + Data? data; + + FaceListDataEntity( + {this.errorCode, this.description, this.errorMsg, this.data}); + + FaceListDataEntity.fromJson(Map json) { + errorCode = json['errorCode']; + description = json['description']; + errorMsg = json['errorMsg']; + data = json['data'] != null ? Data.fromJson(json['data']) : null; + } + + Map toJson() { + final Map data = {}; + data['errorCode'] = errorCode; + data['description'] = description; + data['errorMsg'] = errorMsg; + if (this.data != null) { + data['data'] = this.data!.toJson(); + } + return data; + } +} + +class Data { + List? list; + int? pageNo; + int? pageSize; + int? pages; + int? total; + + Data({this.list, this.pageNo, this.pageSize, this.pages, this.total}); + + Data.fromJson(Map json) { + if (json['list'] != null) { + list = []; + json['list'].forEach((v) { + list!.add(FaceItemData.fromJson(v)); + }); + } + pageNo = json['pageNo']; + pageSize = json['pageSize']; + pages = json['pages']; + total = json['total']; + } + + Map toJson() { + final Map data = {}; + if (list != null) { + data['list'] = list!.map((v) => v.toJson()).toList(); + } + data['pageNo'] = pageNo; + data['pageSize'] = pageSize; + data['pages'] = pages; + data['total'] = total; + return data; + } +} + +class FaceItemData { + int? lockId; + int? faceId; + String? faceName; + String? faceNumber; + int? startDate; + int? endDate; + int? status; + int? addType; + int? faceType; + List? cyclicConfig; + String? featureData; + int? createDate; + String? senderUsername; + String? validTimeStr; + + FaceItemData( + {this.lockId, + this.faceId, + this.faceName, + this.faceNumber, + this.startDate, + this.endDate, + this.status, + this.addType, + this.faceType, + this.cyclicConfig, + this.featureData, + this.createDate, + this.senderUsername, + this.validTimeStr}); + + FaceItemData.fromJson(Map json) { + lockId = json['lockId']; + faceId = json['faceId']; + faceName = json['faceName']; + faceNumber = json['faceNumber']; + startDate = json['startDate']; + endDate = json['endDate']; + status = json['status']; + addType = json['addType']; + faceType = json['faceType']; + cyclicConfig = json['cyclicConfig']; + featureData = json['featureData']; + createDate = json['createDate']; + senderUsername = json['senderUsername']; + validTimeStr = json['validTimeStr']; + } + + Map toJson() { + final Map data = {}; + data['lockId'] = lockId; + data['faceId'] = faceId; + data['faceName'] = faceName; + data['faceNumber'] = faceNumber; + data['startDate'] = startDate; + data['endDate'] = endDate; + data['status'] = status; + data['addType'] = addType; + data['faceType'] = faceType; + data['cyclicConfig'] = cyclicConfig; + data['featureData'] = featureData; + data['createDate'] = createDate; + data['senderUsername'] = senderUsername; + data['validTimeStr'] = validTimeStr; + return data; + } +} diff --git a/star_lock/lib/main/lockDetail/face/faceList/faceList_logic.dart b/star_lock/lib/main/lockDetail/face/faceList/faceList_logic.dart index 00cff678..6d04677c 100644 --- a/star_lock/lib/main/lockDetail/face/faceList/faceList_logic.dart +++ b/star_lock/lib/main/lockDetail/face/faceList/faceList_logic.dart @@ -1,8 +1,427 @@ +import 'dart:async'; +import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; +import 'package:star_lock/blue/io_protocol/io_addFace.dart'; +import 'package:star_lock/blue/io_protocol/io_queryingFaceStatus.dart'; +import 'package:star_lock/blue/io_type.dart'; +import 'package:star_lock/main/lockDetail/face/faceList/faceList_state.dart'; import 'package:star_lock/tools/baseGetXController.dart'; -import 'faceList_state.dart'; +import '../../../../blue/blue_manage.dart'; +import '../../../../blue/io_protocol/io_checkingUserInfoCount.dart'; +import '../../../../blue/io_reply.dart'; +import '../../../../blue/io_tool/io_tool.dart'; +import '../../../../blue/io_tool/manager_event_bus.dart'; +import '../../../../blue/sender_manage.dart'; +import '../../../../network/api_repository.dart'; +import '../../../../tools/eventBusEventManage.dart'; +import '../../../../tools/storage.dart'; -class FaceListLogic extends BaseGetXController{ +class FaceListLogic extends BaseGetXController { FaceListState state = FaceListState(); -} \ No newline at end of file + // 获取解析后的数据 + late StreamSubscription _replySubscription; + void _initReplySubscription() { + _replySubscription = + EventBusManager().eventBus!.on().listen((reply) { + // 添加人脸开始(此处用作删除人脸) + if ((reply is SenderAddFaceReply) && (state.isDeletFaceData == true)) { + _replyAddFaceBegin(reply); + } + + if (reply is SenderQueryingFaceStatusReply) { + // 获取人脸状态 + _replyQueryingFaceStatus(reply); + } + + if (reply is SenderCheckingUserInfoCountReply) { + _replyCheckingUserInfoCount(reply); + } + }); + } + + // 添加人脸开始---这里用作删除人脸 + Future _replyAddFaceBegin(Reply reply) async { + int status = reply.data[2]; + print("status:$status"); + + switch (status) { + case 0x00: + //成功 + print("${reply.commandType!.typeValue} list人脸数据解析成功"); + state.isDeletFaceData = false; + cancelBlueConnetctToastTimer(); + dismissEasyLoading(); + deletAllFacesData(); + break; + case 0x06: + //无权限 + print("${reply.commandType!.typeValue} 需要鉴权"); + var privateKey = await Storage.getStringList(saveBluePrivateKey); + List getPrivateKeyList = changeStringListToIntList(privateKey!); + + var publicKey = await Storage.getStringList(saveBluePublicKey); + List publicKeyDataList = changeStringListToIntList(publicKey!); + + var token = await Storage.getStringList(saveBlueToken); + List getTokenList = changeStringListToIntList(token!); + + IoSenderManage.senderAddFaceCommand( + keyID: state.deletKeyID, + userID: state.deletUserID, + faceNo: state.deletFaceNo, + useCountLimit: 0, + startTime: 0x11223344, + endTime: 0x11223344, + needAuthor: 1, + publicKey: publicKeyDataList, + privateKey: getPrivateKeyList, + token: getTokenList, + ); + break; + case 0x07: + //无权限 + print("${reply.commandType!.typeValue} 用户无权限"); + + break; + case 0x09: + // 权限校验错误 + print("${reply.commandType!.typeValue} 权限校验错误"); + + break; + default: + //失败 + print("${reply.commandType!.typeValue} list人脸失败"); + + break; + } + } + + // 获取人脸状态 + Future _replyQueryingFaceStatus(Reply reply) async { + int status = reply.data[2]; + + switch (status) { + case 0x00: + //成功 + print("${reply.commandType}数据解析成功"); + // _getLockStatus(); + break; + case 0x06: + //无权限 + print("${reply.commandType}需要鉴权"); + + break; + case 0x07: + //无权限 + print("${reply.commandType}用户无权限"); + + break; + case 0x09: + // 权限校验错误 + print("${reply.commandType}权限校验错误"); + + break; + default: + //失败 + print("${reply.commandType}失败"); + + break; + } + } + + // 获取卡片状态 + Future _replyReferEventRecordNumber(Reply reply) async { + int status = reply.data[2]; + switch (status) { + case 0x00: + //成功 + print("${reply.commandType}数据解析成功"); + // _getLockStatus(); + break; + case 0x06: + //无权限 + print("${reply.commandType}需要鉴权"); + + break; + case 0x07: + //无权限 + print("${reply.commandType}用户无权限"); + + break; + case 0x09: + // 权限校验错误 + print("${reply.commandType}权限校验错误"); + + break; + default: + //失败 + print("${reply.commandType}失败"); + + break; + } + } + + // 查询用户、指纹、密码、卡片数量(用于判断是否同步) + Future _replyCheckingUserInfoCount(Reply reply) async { + int status = reply.data[2]; + + // 用户数量 + int userNum = reply.data[5]; + // print("userNum:$userNum"); + + // 指纹数量 + int fingerNum = reply.data[6]; + // print("fingerNum:$fingerNum"); + + // 密码数量 + int pwdNum = reply.data[7]; + + // 卡片数量 + int cardNum = reply.data[8]; + + // 记录数量 + int logsNum = reply.data[9]; + + // 版本 + int verNo = reply.data[10]; + + // 最大管理员指纹数量 + int maxAdminFingerNum = reply.data[11]; + + // 最大用户指纹数量 + int maxUserFingerNum = reply.data[12]; + + // 最大管理员密码数量 + int maxAdminPassNum = reply.data[13]; + + // 最大用户密码数量 + int maxUserPassNum = reply.data[14]; + + // 最大管理员卡片数量 + int maxAdminCardNum = reply.data[15]; + + // 最大用户卡片数量 + int maxUserCardNum = reply.data[16]; + + // 序列号 + var serialNo = reply.data.sublist(17, 21); + print("serialNo:$serialNo"); + + switch (status) { + case 0x00: + //成功 + print("${reply.commandType}数据解析成功"); + // _getLockStatus(); + break; + case 0x06: + //无权限 + print("${reply.commandType}需要鉴权"); + + break; + case 0x07: + //无权限 + print("${reply.commandType}用户无权限"); + + break; + case 0x09: + // 权限校验错误 + print("${reply.commandType}权限校验错误"); + + break; + default: + //失败 + print("${reply.commandType}失败"); + + break; + } + } + + // 获取人脸状态 + Future senderQueryingFaceStatus() async { + BlueManage().bludSendData(BlueManage().connectDeviceName, + (DeviceConnectionState state) async { + if (state == DeviceConnectionState.connected) { + var privateKey = await Storage.getStringList(saveBluePrivateKey); + List getPrivateKeyList = changeStringListToIntList(privateKey!); + + var token = await Storage.getStringList(saveBlueToken); + List getTokenList = changeStringListToIntList(token!); + + var publicKey = await Storage.getStringList(saveBluePublicKey); + List getPublicKeyList = changeStringListToIntList(publicKey!); + + IoSenderManage.senderQueryingFaceStatusCommand( + keyID: BlueManage().connectDeviceName, + userID: await Storage.getUid(), + role: 0xff, + fingerCount: 20, + fingerNo: 1, + token: getTokenList, + needAuthor: 1, + publicKey: getPublicKeyList, + privateKey: getPrivateKeyList, + ); + } + }); + } + + // 查询用户、指纹、密码、卡片数量(用于判断是否同步) + Future senderCheckingUserInfoCount() async { + BlueManage().bludSendData(BlueManage().connectDeviceName, + (DeviceConnectionState state) async { + if (state == DeviceConnectionState.connected) { + var privateKey = await Storage.getStringList(saveBluePrivateKey); + List getPrivateKeyList = changeStringListToIntList(privateKey!); + + var token = await Storage.getStringList(saveBlueToken); + List getTokenList = changeStringListToIntList(token!); + + var publicKey = await Storage.getStringList(saveBluePublicKey); + List getPublicKeyList = changeStringListToIntList(publicKey!); + + IoSenderManage.senderCheckingUserInfoCountCommand( + keyID: BlueManage().connectDeviceName, + userID: await Storage.getUid(), + role: 0xff, + nowTime: DateTime.now().millisecondsSinceEpoch ~/ 1000, + token: getTokenList, + needAuthor: 1, + publicKey: getPublicKeyList, + privateKey: getPrivateKeyList, + ); + } + }); + } + + // 删除人脸 + Future senderAddFace() async { + showEasyLoading(); + showBlueConnetctToastTimer(action: () { + dismissEasyLoading(); + }); + BlueManage().bludSendData(BlueManage().connectDeviceName, + (DeviceConnectionState deviceConnectionState) async { + if (deviceConnectionState == DeviceConnectionState.connected) { + var publicKey = await Storage.getStringList(saveBluePublicKey); + List publicKeyDataList = changeStringListToIntList(publicKey!); + + var privateKey = await Storage.getStringList(saveBluePrivateKey); + List getPrivateKeyList = changeStringListToIntList(privateKey!); + + var token = await Storage.getStringList(saveBlueToken); + List getTokenList = changeStringListToIntList(token!); + + IoSenderManage.senderAddFaceCommand( + keyID: state.deletKeyID, + userID: state.deletUserID, + faceNo: state.deletFaceNo, + useCountLimit: 0, + startTime: 0x11223344, + endTime: 0x11223344, + needAuthor: 1, + publicKey: publicKeyDataList, + privateKey: getPrivateKeyList, + token: getTokenList, + ); + } else if (deviceConnectionState == DeviceConnectionState.disconnected) { + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + if (state.ifCurrentScreen.value == true) { + showBlueConnetctToast(); + } + } + }); + } + + // 获取人脸列表 + void getFaceListData() async { + var entity = await ApiRepository.to.getFaceListData( + lockId: state.lockId.value.toString(), + pageNo: '1', + pageSize: '20', + searchStr: state.searchController.text, + ); + if (entity.errorCode!.codeIsSuccessful) { + state.faceItemListData.value = entity.data!.list!; + } + } + + // 重置所有的人脸 + void deletAllFacesData() async { + var fingerprintId = ""; + var type = "1"; + if (state.isDeletAll == false) { + fingerprintId = state.deletKeyID; + type = "0"; + } + print("delet fingerprintId $fingerprintId"); + var entity = await ApiRepository.to.deletFingerprintsData( + fingerprintId: fingerprintId, + lockId: state.lockId.value.toString(), + type: type, + deleteType: "1"); + if (entity.errorCode!.codeIsSuccessful) { + if (state.isDeletAll == false) { + showToast("删除成功"); + } else { + showToast("重置成功"); + } + + state.isDeletFaceData = false; + getFaceListData(); + } + } + + // 监听修改完详情之后刷新列表 + late StreamSubscription _teamEvent; + void _initRefreshAction() { + _teamEvent = eventBus.on().listen((event) { + getFaceListData(); + }); + } + + @override + Future onReady() async { + // TODO: implement onReady + super.onReady(); + print("onReady()"); + + // 获取是否是演示模式 演示模式不获取接口 + var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); + // print("aaaaaaa:$isDemoMode"); + if (isDemoMode == false) { + _initReplySubscription(); + + _initRefreshAction(); + + getFaceListData(); + } + } + + @override + Future onInit() async { + // TODO: implement onInit + super.onInit(); + print("onInit()"); + var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); + if (isDemoMode == false) { + // senderQueryingFingerprintStatus(); + // senderCheckingCardStatus(); + + // senderCheckingUserInfoCount(); + } + } + + @override + Future onClose() async { + // TODO: implement onClose + super.onClose(); + + var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); + if (isDemoMode == false) { + _replySubscription.cancel(); + _teamEvent.cancel(); + } + } +} diff --git a/star_lock/lib/main/lockDetail/face/faceList/faceList_page.dart b/star_lock/lib/main/lockDetail/face/faceList/faceList_page.dart index be012428..f516c027 100644 --- a/star_lock/lib/main/lockDetail/face/faceList/faceList_page.dart +++ b/star_lock/lib/main/lockDetail/face/faceList/faceList_page.dart @@ -1,8 +1,10 @@ - import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/face/faceList/faceListData_entity.dart'; +import 'package:star_lock/tools/keySearchWidget.dart'; +import 'package:star_lock/tools/left_slide_actions.dart'; import '../../../../appRouters.dart'; import '../../../../app_settings/app_colors.dart'; @@ -53,86 +55,99 @@ class _FaceListState extends State { ), body: Column( children: [ - _searchWidget(), + KeySearchWidget( + editingController: state.searchController, + onSubmittedAction: () { + logic.getFaceListData(); + }, + ), SizedBox( height: 20.h, ), Expanded(child: _buildMainUI()), AddBottomWhiteBtn( btnName: - '${TranslationLoader.lanKeys!.add!.tr}${TranslationLoader.lanKeys!.face!.tr}', + '${TranslationLoader.lanKeys!.add!.tr}${TranslationLoader.lanKeys!.face!.tr}', onClick: () async { var data = - await Get.toNamed(Routers.addFaceTypeManagePage); + await Get.toNamed(Routers.addFaceTypeManagePage, arguments: { + "lockId": state.lockId.value, + "fromType": 1 // 1从添加钥匙列表进入 2从考勤添加员工入口进入 + }); if (data != null) { - // 遥控添加 - + logic.getFaceListData(); } }, ), - SizedBox( - height: 64.h, - ) + SizedBox(height: 64.h) ], ), ); } - Widget _searchWidget() { - return Container( - height: 60.h, - margin: EdgeInsets.only(top: 20.w, left: 20.w, right: 10.w), - decoration: BoxDecoration( - color: Colors.white, borderRadius: BorderRadius.circular(5)), - child: TextField( - //输入框一行 - maxLines: 1, - controller: state.searchController, - autofocus: false, - onChanged: (value) { - print("onChanged:$value"); - }, - onEditingComplete: () { - print("onEditingComplete:"); - }, - onSubmitted: (value) { - // 调用遥控列表 - - }, - decoration: InputDecoration( - //输入里面输入文字内边距设置 - contentPadding: const EdgeInsets.only( - top: 12.0, left: -19.0, right: -15.0, bottom: 8.0), - hintText: TranslationLoader.lanKeys!.pleaseEnter!.tr, - hintStyle: TextStyle(fontSize: 22.sp, height: 3.0), - //不需要输入框下划线 - border: InputBorder.none, - //左边图标设置 - icon: Padding( - padding: EdgeInsets.only( - top: 20.h, bottom: 20.h, right: 20.w, left: 10.w), - child: Image.asset( - 'images/main/icon_main_search.png', - width: 40.w, - height: 40.w, - ), - ), - ), - ), - ); - } - Widget _buildMainUI() { - String typeImgName = 'images/icon_card.png'; - - return const NoData(); + { + return Obx(() => state.faceItemListData.value.isNotEmpty + ? ListView.separated( + itemCount: state.faceItemListData.value.length, + itemBuilder: (c, index) { + FaceItemData getFaceItemData = + state.faceItemListData.value[index]; + // 人脸 + if (index < state.faceItemListData.value.length) { + return LeftSlideActions( + key: Key(getFaceItemData.faceName!), + actionsWidth: 60, + actions: [ + _buildDeleteBtn(getFaceItemData), + ], + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(1)), + ), + child: _keyItem( + 'images/icon_fingerprint.png', + getFaceItemData.faceName!, + (getFaceItemData.faceType! != 1) + ? (getFaceItemData.endDate! < + DateTime.now().millisecondsSinceEpoch + ? "已失效" + : "") + : "", + getFaceItemData.validTimeStr!, + // fingerprintItemData.fingerprintType! == 1 + // ? "永久" + // : "${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())}", + () async { + var data = + await Get.toNamed(Routers.faceDetailPage, arguments: { + "faceItemData": getFaceItemData, + }); + if (data != null) { + logic.getFaceListData(); + } + }), + ); + } + return const SizedBox.shrink(); + }, + separatorBuilder: (BuildContext context, int index) { + return const Divider( + height: 1, + color: AppColors.greyLineColor, + ); + }, + ) + : const NoData()); + } } - Widget _buildDeleteBtn(String idStr) { + Widget _buildDeleteBtn(FaceItemData faceItemData) { return GestureDetector( onTap: () { // 省略: 弹出是否删除的确认对话框。 - showIosTipViewDialog(context, idStr); + state.deletKeyID = faceItemData.faceId.toString(); + state.deletFaceNo = int.parse(faceItemData.faceNumber!); + showIosTipViewDialog(context); }, child: Container( width: 60, @@ -151,7 +166,7 @@ class _FaceListState extends State { ); } - void showIosTipViewDialog(BuildContext context, String keyId) { + void showIosTipViewDialog(BuildContext context) { showDialog( context: context, builder: (BuildContext context) { @@ -159,8 +174,11 @@ class _FaceListState extends State { title: "提示", tipTitle: "确定要删除吗?", sureClick: () async { - // 遥控删除 - + Get.back(); + state.isDeletFaceData = true; + state.isDeletAll = false; + state.deletUserID = (await Storage.getUid())!; + logic.senderAddFace(); }, cancelClick: () { Get.back(); @@ -170,8 +188,8 @@ class _FaceListState extends State { ); } - Widget _keyItem(String lockTypeIcon, String lockTypeTitle, String showTime, - Function() action) { + Widget _keyItem(String lockTypeIcon, String lockTypeTitle, + String ifInvalidation, String showTime, Function() action) { return GestureDetector( onTap: action, child: Container( @@ -192,24 +210,26 @@ class _FaceListState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Row( - mainAxisAlignment: MainAxisAlignment.start, + // mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(lockTypeTitle, style: TextStyle( fontSize: 24.sp, color: AppColors.blackColor)), + Expanded(child: Container()), + Text(ifInvalidation, + style: TextStyle(fontSize: 22.sp, color: Colors.red)), + SizedBox(width: 10.w), ], ), SizedBox(height: 5.h), - Container( - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text(showTime, - style: TextStyle( - fontSize: 18.sp, - color: AppColors.placeholderTextColor)), - ], - ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text(showTime, + style: TextStyle( + fontSize: 18.sp, + color: AppColors.placeholderTextColor)), + ], ), SizedBox(width: 20.h), ], @@ -222,13 +242,13 @@ class _FaceListState extends State { ); } - void showDeletAlertDialog(BuildContext context,) { + void showDeletAlertDialog(BuildContext context) { showCupertinoDialog( context: context, builder: (context) { return CupertinoAlertDialog( title: const Text("提示"), - content: const Text('重置后信息都会清除哦,确认要重置吗?'), + content: const Text('重置后,该锁的人脸都将被删除哦,确认要重置吗?'), actions: [ CupertinoDialogAction( child: Text(TranslationLoader.lanKeys!.cancel!.tr), @@ -239,8 +259,13 @@ class _FaceListState extends State { CupertinoDialogAction( child: Text(TranslationLoader.lanKeys!.sure!.tr), onPressed: () { - // 遥控重置 - + Navigator.pop(context); + state.isDeletFaceData = true; + state.isDeletAll = true; + state.deletKeyID = "1"; + state.deletUserID = "DeleteAll!@#"; + state.deletFaceNo = 255; + logic.senderAddFace(); }, ), ], diff --git a/star_lock/lib/main/lockDetail/face/faceList/faceList_state.dart b/star_lock/lib/main/lockDetail/face/faceList/faceList_state.dart index be495903..4f3f072e 100644 --- a/star_lock/lib/main/lockDetail/face/faceList/faceList_state.dart +++ b/star_lock/lib/main/lockDetail/face/faceList/faceList_state.dart @@ -1,6 +1,24 @@ - import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/face/faceList/faceListData_entity.dart'; -class FaceListState{ +class FaceListState { final TextEditingController searchController = TextEditingController(); -} \ No newline at end of file + final lockId = 0.obs; + + // 因为删除跟添加人脸用的同一个协议 所以这里用做判断 + var isDeletFaceData = false; + var isDeletAll = false; + var deletKeyID = ""; + var deletUserID = "DeleteAll!@#"; + var deletFaceNo = 0; + + final faceItemListData = [].obs; + + var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + + FaceListState() { + Map map = Get.arguments; + lockId.value = map["lockId"]; + } +} diff --git a/star_lock/lib/network/api.dart b/star_lock/lib/network/api.dart index 68145668..1276b0d9 100644 --- a/star_lock/lib/network/api.dart +++ b/star_lock/lib/network/api.dart @@ -105,6 +105,11 @@ abstract class Api { final String checkFingerprintNameURL = '/fingerprint/checkFingerprintName'; // 校验指纹名字是否存在 + final String getFaceListURL = '/face/list'; // 人脸列表 + final String addFaceURL = '/face/add'; // 添加人脸 + final String checkFaceNameURL = '/face/checkFaceName'; // 校验人脸名称是否重复 + final String updateFaceUserNoURL = '/face/updateFaceUserNo'; // 更新人脸用户序号 + final String getICCardListURL = '/identityCard/list'; // IC卡列表 final String addICCardURL = '/identityCard/add'; // 添加IC卡 final String editICCardURL = '/identityCard/update'; // 编辑IC卡 diff --git a/star_lock/lib/network/api_provider.dart b/star_lock/lib/network/api_provider.dart index 7cdd771f..5877e0a9 100644 --- a/star_lock/lib/network/api_provider.dart +++ b/star_lock/lib/network/api_provider.dart @@ -169,9 +169,9 @@ class ApiProvider extends BaseProvider { })); Future modifyKeyName( - String keyId, - String lockId, - String keyName, + String keyId, + String lockId, + String keyName, ) => post( modifyKeyNameURL.toUrl, @@ -261,7 +261,7 @@ class ApiProvider extends BaseProvider { 'lockId': lockId, 'records': records, }), - isUnShowLoading:true); + isUnShowLoading: true); // 查询锁记录最后时间 Future getLockRecordLastUploadDataTime(String lockId) => post( @@ -346,10 +346,7 @@ class ApiProvider extends BaseProvider { // 删除拥有的当前钥匙 Future deletOwnerKeyInfo(String lockId, String keyId) => post( deleteElectronicKeyURL.toUrl, - jsonEncode({ - 'lockId': lockId, - 'keyId': keyId - })); + jsonEncode({'lockId': lockId, 'keyId': keyId})); // 检查账户密码 Future checkLoginPassword(String password) => post( @@ -477,9 +474,9 @@ class ApiProvider extends BaseProvider { // 删除组 Future deleteGroup(int groupId) => post( lockDeletGroupURL.toUrl, - jsonEncode({ - 'groupId': groupId, - })); + jsonEncode({ + 'groupId': groupId, + })); // 锁分组里面添加锁 Future lockGroupAddLock(List lockIds, int groupId) => post( @@ -555,7 +552,8 @@ class ApiProvider extends BaseProvider { /// 锁设置模块 // 自动闭锁 - Future setAutoUnlockLoadData(int lockId, int autoLock, int autoLockSecond) => + Future setAutoUnlockLoadData( + int lockId, int autoLock, int autoLockSecond) => post( updateLockSettingUrl.toUrl, jsonEncode({ @@ -565,7 +563,8 @@ class ApiProvider extends BaseProvider { })); // 锁声音 - Future setLockSoundData(int lockId, int lockSound, int lockSoundVolume) => + Future setLockSoundData( + int lockId, int lockSound, int lockSoundVolume) => post( updateLockSettingUrl.toUrl, jsonEncode({ @@ -575,18 +574,16 @@ class ApiProvider extends BaseProvider { })); // 防撬报警 - Future setBurglarAlarmData( - int lockId, int antiPrySwitch) => - post( - updateLockSettingUrl.toUrl, - jsonEncode({ - 'lockId': lockId, - 'antiPrySwitch': antiPrySwitch, - })); + Future setBurglarAlarmData(int lockId, int antiPrySwitch) => post( + updateLockSettingUrl.toUrl, + jsonEncode({ + 'lockId': lockId, + 'antiPrySwitch': antiPrySwitch, + })); // 开门方向 Future setOpenDoorDirectionData( - int lockId, int openDirectionValue) => + int lockId, int openDirectionValue) => post( updateLockSettingUrl.toUrl, jsonEncode({ @@ -595,7 +592,8 @@ class ApiProvider extends BaseProvider { })); // 远程开锁 - Future remoteUnlockingOpenOrCloseLoadData(int lockId, int remoteUnlock) => + Future remoteUnlockingOpenOrCloseLoadData( + int lockId, int remoteUnlock) => post( updateLockSettingUrl.toUrl, jsonEncode({ @@ -604,22 +602,20 @@ class ApiProvider extends BaseProvider { })); // 重置键 - Future setResetButtonData(int lockId, int resetSwitch) => - post( - updateLockSettingUrl.toUrl, - jsonEncode({ - 'lockId': lockId, - 'resetSwitch': resetSwitch, - })); + Future setResetButtonData(int lockId, int resetSwitch) => post( + updateLockSettingUrl.toUrl, + jsonEncode({ + 'lockId': lockId, + 'resetSwitch': resetSwitch, + })); // 设置考勤 - Future setCheckInData(int lockId, int resetSwitch) => - post( - updateLockSettingUrl.toUrl, - jsonEncode({ - 'lockId': lockId, - 'attendance': resetSwitch, - })); + Future setCheckInData(int lockId, int resetSwitch) => post( + updateLockSettingUrl.toUrl, + jsonEncode({ + 'lockId': lockId, + 'attendance': resetSwitch, + })); // 设置开锁时是否需联网 Future setOpenLockNeedOnlineData(int lockId, int appUnlockOnline) => @@ -631,16 +627,16 @@ class ApiProvider extends BaseProvider { })); // 设置标记房态 - Future setRoomStatusData(int lockId, int roomStatus) => - post( - setRoomStatusURL.toUrl, - jsonEncode({ - 'lockId': lockId, - 'roomStatus': roomStatus, - })); + Future setRoomStatusData(int lockId, int roomStatus) => post( + setRoomStatusURL.toUrl, + jsonEncode({ + 'lockId': lockId, + 'roomStatus': roomStatus, + })); // 设置常开模式 - Future setNormallyModeData(int lockId, int passageMode, List passageModeConfig) => + Future setNormallyModeData( + int lockId, int passageMode, List passageModeConfig) => post( updateLockSettingUrl.toUrl, jsonEncode({ @@ -657,13 +653,12 @@ class ApiProvider extends BaseProvider { })); // 设置管理员开锁密码 - Future setAdminPasswordData(int lockId, String adminPwd) => - post( - updateLockSettingUrl.toUrl, - jsonEncode({ - 'lockId': lockId, - 'adminPwd': adminPwd, - })); + Future setAdminPasswordData(int lockId, String adminPwd) => post( + updateLockSettingUrl.toUrl, + jsonEncode({ + 'lockId': lockId, + 'adminPwd': adminPwd, + })); // 获取服务器当前时间 Future getServerDatetimeLoadData(String lockId) => post( @@ -703,9 +698,9 @@ class ApiProvider extends BaseProvider { })); Future updateLockName( - String lockId, - String lockName, - ) => + String lockId, + String lockName, + ) => post( updateLockNameURL.toUrl, jsonEncode({ @@ -741,8 +736,10 @@ class ApiProvider extends BaseProvider { })); // 获取开锁提醒 - Future setLockPickingReminderData(int lockId, int unlockReminderPush) => - post(updateLockSettingUrl.toUrl, + Future setLockPickingReminderData( + int lockId, int unlockReminderPush) => + post( + updateLockSettingUrl.toUrl, jsonEncode({ 'lockId': lockId, 'unlockReminderPush': unlockReminderPush, @@ -1015,15 +1012,62 @@ class ApiProvider extends BaseProvider { // 校验指纹名字是否重复 Future checkFingerprintNameDuplicatedData( - String lockId, - String fingerprintName) => + String lockId, String fingerprintName) => + post(checkFingerprintNameURL.toUrl, + jsonEncode({'lockId': lockId, 'fingerprintName': fingerprintName})); + + // 获取人脸列表 + Future getFaceListData( + String lockId, String pageNo, String pageSize, String searchStr) => post( - checkFingerprintNameURL.toUrl, + getFaceListURL.toUrl, jsonEncode({ 'lockId': lockId, - 'fingerprintName': fingerprintName + 'pageNo': pageNo, + 'pageSize': pageSize, + 'searchStr': searchStr, })); + // 添加人脸 + Future addFaceData( + int lockId, + String faceName, + String faceNumber, + int faceType, + int startDate, + int endDate, + String featureData, + String addType, + List cyclicConfig, + ) => + post( + addFaceURL.toUrl, + jsonEncode({ + 'lockId': lockId, + 'faceName': faceName, + 'faceNumber': faceNumber, + 'faceType': faceType, + 'startDate': startDate, + 'endDate': endDate, + 'featureData': featureData, + 'addType': addType, + 'cyclicConfig': cyclicConfig, + })); + + // 校验人脸名字是否重复 + Future checkFaceNameDuplicatedData( + String lockId, String faceName) => + post(checkFaceNameURL.toUrl, + jsonEncode({'lockId': lockId, 'faceName': faceName})); + + // 更新人脸用户序号 + Future updateFaceUserNoLoadData( + String faceId, String lockId, String faceUserNo) => + post( + updateFaceUserNoURL.toUrl, + jsonEncode( + {'faceId': faceId, 'lockId': lockId, 'faceUserNo': faceUserNo})); + // 获取IC卡列表 Future getICCardListData( String lockId, String pageNo, String pageSize, String searchStr) => @@ -1063,8 +1107,15 @@ class ApiProvider extends BaseProvider { })); // 编辑ICCard - Future editICCardData(String lockId, String cardId, String cardName, - String startDate, String endDate, String isCoerced, List weekDay, String changeType) => + Future editICCardData( + String lockId, + String cardId, + String cardName, + String startDate, + String endDate, + String isCoerced, + List weekDay, + String changeType) => post( editICCardURL.toUrl, jsonEncode({ @@ -1100,14 +1151,9 @@ class ApiProvider extends BaseProvider { // 校验卡名字是否重复 Future checkCardNameDuplicatedData( - String lockId, - String cardName) => - post( - checkCardNameURL.toUrl, - jsonEncode({ - 'lockId': lockId, - 'cardName': cardName - })); + String lockId, String cardName) => + post(checkCardNameURL.toUrl, + jsonEncode({'lockId': lockId, 'cardName': cardName})); // 获取转移锁锁列表 Future getTransferLockListData() => @@ -1179,12 +1225,11 @@ class ApiProvider extends BaseProvider { 'searchStr': searchStr })); - Future deletLockUser(int uid) => - post( - deletLockUserURL.toUrl, - jsonEncode({ - 'uid': uid, - })); + Future deletLockUser(int uid) => post( + deletLockUserURL.toUrl, + jsonEncode({ + 'uid': uid, + })); Future keyListByUser(String pageNo, String pageSize, String uid) => post(keyListByUserURL.toUrl, @@ -1227,14 +1272,9 @@ class ApiProvider extends BaseProvider { Future userSettingsInfo() => post(userSettingsInfoURL.toUrl, jsonEncode({})); - Future canSendKey( - String endDate, List lockIdList) => - post( - canSendKeyURL.toUrl, - jsonEncode({ - 'endDate': endDate, - 'lockIdList': lockIdList - })); + Future canSendKey(String endDate, List lockIdList) => post( + canSendKeyURL.toUrl, + jsonEncode({'endDate': endDate, 'lockIdList': lockIdList})); Future batchSendKey( String endDate, @@ -1381,7 +1421,8 @@ class ApiProvider extends BaseProvider { jsonEncode({"questionAndAnswerList": questionAndAnswerList})); // 获取上传文件的upToken 再调用updateUserInfo - Future getUpToken(String module, String typeKey, String type, String filename, int size) => + Future getUpToken(String module, String typeKey, String type, + String filename, int size) => post( getUpTokenURL.toUrl, jsonEncode({ @@ -1392,7 +1433,8 @@ class ApiProvider extends BaseProvider { })); // 文件上传 - Future uploadFile(String url, dynamic boay) => post(url, boay, isUnUploadFile: false, contentType:'multipart/form-data'); + Future uploadFile(String url, dynamic boay) => post(url, boay, + isUnUploadFile: false, contentType: 'multipart/form-data'); //获取解绑手机号Token Future unbindPhoneToken(String verificationCode) => post( diff --git a/star_lock/lib/network/api_repository.dart b/star_lock/lib/network/api_repository.dart index c5c3a563..bc9eba53 100644 --- a/star_lock/lib/network/api_repository.dart +++ b/star_lock/lib/network/api_repository.dart @@ -4,6 +4,7 @@ import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyO import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/lockUserList/lockUserListEntity.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupListEntity.dart'; +import 'package:star_lock/main/lockDetail/face/faceList/faceListData_entity.dart'; import 'package:star_lock/main/lockDetail/lcokSet/basicInformation/basicInformation/KeyDetailEntity.dart'; import 'package:star_lock/main/lockDetail/passwordKey/passwordKeyList/passwordKeyListEntity.dart'; import 'package:star_lock/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKeyEntity.dart'; @@ -217,7 +218,8 @@ class ApiRepository { } //操作记录上传 - Future lockRecordUploadData({required String lockId, required List records}) async { + Future lockRecordUploadData( + {required String lockId, required List records}) async { final res = await apiProvider.lockRecordUploadData(lockId, records); return KeyOperationRecordEntity.fromJson(res.body); } @@ -236,22 +238,23 @@ class ApiRepository { } // 更新锁用户NO - Future updateLockUserNo({required String keyId, required String lockUserNo}) async { + Future updateLockUserNo( + {required String keyId, required String lockUserNo}) async { final res = await apiProvider.updateLockUserNo(keyId, lockUserNo); return LockNetTokenEntity.fromJson(res.body); } // 绑定蓝牙管理员 Future bindingBlueAdmin( - { required String lockAlias, - required Map position, - required Map bluetooth, - required Map lockInfo, - required String lockUserNo, - required String pwdTimestamp, - required String featureValue, - required String featureSettingValue, - required List featureSettingParams}) async { + {required String lockAlias, + required Map position, + required Map bluetooth, + required Map lockInfo, + required String lockUserNo, + required String pwdTimestamp, + required String featureValue, + required String featureSettingValue, + required List featureSettingParams}) async { final res = await apiProvider.bindingBlueAdmin( lockAlias, position, @@ -275,24 +278,17 @@ class ApiRepository { //锁名称修改 Future modifyKeyName( - { - required String keyId, - required String lockId, - required String keyName - }) async { - final res = - await apiProvider.modifyKeyName(keyId, lockId, keyName); + {required String keyId, + required String lockId, + required String keyName}) async { + final res = await apiProvider.modifyKeyName(keyId, lockId, keyName); return KeyOperationRecordEntity.fromJson(res.body); } //修改锁名(新) Future updateLockName( - { - required String lockId, - required String lockName - }) async { - final res = - await apiProvider.updateLockName(lockId, lockName); + {required String lockId, required String lockName}) async { + final res = await apiProvider.updateLockName(lockId, lockName); return KeyOperationRecordEntity.fromJson(res.body); } @@ -373,7 +369,8 @@ class ApiRepository { } // 检查账户密码 - Future checkLoginPassword({required String password}) async { + Future checkLoginPassword( + {required String password}) async { final res = await apiProvider.checkLoginPassword(password); return LockListInfoEntity.fromJson(res.body); } @@ -463,10 +460,8 @@ class ApiRepository { } // 编辑锁名字 - Future editLockGroupRequest({ - required int groupId, - required String groupName - }) async { + Future editLockGroupRequest( + {required int groupId, required String groupName}) async { final res = await apiProvider.editLockGroupRequest(groupId, groupName); return MassSendLockGroupListEntity.fromJson(res.body); } @@ -486,29 +481,21 @@ class ApiRepository { //删除锁分组 Future deleteGroup(int groupId) async { - final res = - await apiProvider.deleteGroup(groupId); + final res = await apiProvider.deleteGroup(groupId); return MassSendLockGroupListEntity.fromJson(res.body); } //锁分组里面添加锁 Future lockGroupAddLock( - { - required List lockIds, - required int groupId - }) async { - final res = - await apiProvider.lockGroupAddLock(lockIds, groupId); + {required List lockIds, required int groupId}) async { + final res = await apiProvider.lockGroupAddLock(lockIds, groupId); return MassSendLockGroupListEntity.fromJson(res.body); } //锁分组里面删除锁 Future lockGroupDeletLock( - { - required List lockIds - }) async { - final res = - await apiProvider.lockGroupDeletLock(lockIds); + {required List lockIds}) async { + final res = await apiProvider.lockGroupDeletLock(lockIds); return MassSendLockGroupListEntity.fromJson(res.body); } @@ -590,8 +577,8 @@ class ApiRepository { required int autoLock, required int autoLockSecond, }) async { - final res = - await apiProvider.setAutoUnlockLoadData(lockId, autoLock, autoLockSecond); + final res = await apiProvider.setAutoUnlockLoadData( + lockId, autoLock, autoLockSecond); return LoginEntity.fromJson(res.body); } @@ -602,7 +589,7 @@ class ApiRepository { required int lockSoundVolume, }) async { final res = - await apiProvider.setLockSoundData(lockId, lockSound, lockSoundVolume); + await apiProvider.setLockSoundData(lockId, lockSound, lockSoundVolume); return LoginEntity.fromJson(res.body); } @@ -611,8 +598,7 @@ class ApiRepository { required int lockId, required int antiPrySwitch, }) async { - final res = - await apiProvider.setBurglarAlarmData(lockId, antiPrySwitch); + final res = await apiProvider.setBurglarAlarmData(lockId, antiPrySwitch); return LoginEntity.fromJson(res.body); } @@ -649,7 +635,8 @@ class ApiRepository { required int lockId, required int appUnlockOnline, }) async { - final res = await apiProvider.setOpenLockNeedOnlineData(lockId, appUnlockOnline); + final res = + await apiProvider.setOpenLockNeedOnlineData(lockId, appUnlockOnline); return LoginEntity.fromJson(res.body); } @@ -659,7 +646,7 @@ class ApiRepository { required int openDirectionValue, }) async { final res = - await apiProvider.setOpenDoorDirectionData(lockId, openDirectionValue); + await apiProvider.setOpenDoorDirectionData(lockId, openDirectionValue); return LoginEntity.fromJson(res.body); } @@ -678,8 +665,8 @@ class ApiRepository { required int passageMode, required List passageModeConfig, }) async { - final res = - await apiProvider.setNormallyModeData(lockId, passageMode, passageModeConfig); + final res = await apiProvider.setNormallyModeData( + lockId, passageMode, passageModeConfig); return LoginEntity.fromJson(res.body); } @@ -785,10 +772,8 @@ class ApiRepository { } //群发电子钥匙检查 - Future canSendKey( - String endDate, List lockIdList) async { - final res = - await apiProvider.canSendKey(endDate, lockIdList); + Future canSendKey(String endDate, List lockIdList) async { + final res = await apiProvider.canSendKey(endDate, lockIdList); return KeyDetailEntity.fromJson(res.body); } @@ -928,7 +913,8 @@ class ApiRepository { required int lockId, required int unlockReminderPush, }) async { - final res = await apiProvider.setLockPickingReminderData(lockId, unlockReminderPush); + final res = await apiProvider.setLockPickingReminderData( + lockId, unlockReminderPush); return LoginEntity.fromJson(res.body); } @@ -1168,13 +1154,58 @@ class ApiRepository { // 校验指纹名字是否重复 Future checkFingerprintNameDuplicatedData( - {required String lockId, - required String fingerprintName}) async { + {required String lockId, required String fingerprintName}) async { final res = await apiProvider.checkFingerprintNameDuplicatedData( lockId, fingerprintName); return LoginEntity.fromJson(res.body); } + // 获取人脸列表 + Future getFaceListData({ + required String lockId, + required String pageNo, + required String pageSize, + required String searchStr, + }) async { + final res = + await apiProvider.getFaceListData(lockId, pageNo, pageSize, searchStr); + return FaceListDataEntity.fromJson(res.body); + } + + // 添加人脸 + Future addFaceData({ + required int lockId, + required String faceName, + required String faceNumber, + required int faceType, + required int startDate, + required int endDate, + required String featureData, + required String addType, + required List cyclicConfig, + }) async { + final res = await apiProvider.addFaceData(lockId, faceName, faceNumber, + faceType, startDate, endDate, featureData, addType, cyclicConfig); + return AddFingerprintEntity.fromJson(res.body); + } + + // 校验人脸名字是否重复 + Future checkFaceNameDuplicatedData( + {required String lockId, required String faceName}) async { + final res = await apiProvider.checkFaceNameDuplicatedData(lockId, faceName); + return LoginEntity.fromJson(res.body); + } + + // 更新人脸用户序号 + Future updateFaceUserNoLoadData( + {required String faceId, + required String lockId, + required String faceUserNo}) async { + final res = + await apiProvider.updateFaceUserNoLoadData(faceId, lockId, faceUserNo); + return LoginEntity.fromJson(res.body); + } + // 获取Ic卡列表 Future getICCardListData({ required String lockId, @@ -1214,8 +1245,8 @@ class ApiRepository { required String isCoerced, required List weekDay, required String changeType}) async { - final res = await apiProvider.editICCardData( - lockId, cardId, cardName, startDate, endDate, isCoerced, weekDay, changeType); + final res = await apiProvider.editICCardData(lockId, cardId, cardName, + startDate, endDate, isCoerced, weekDay, changeType); return LoginEntity.fromJson(res.body); } @@ -1242,10 +1273,8 @@ class ApiRepository { // 校验卡名字是否重复 Future checkCardNameDuplicatedData( - {required String lockId, - required String cardName}) async { - final res = await apiProvider.checkCardNameDuplicatedData( - lockId, cardName); + {required String lockId, required String cardName}) async { + final res = await apiProvider.checkCardNameDuplicatedData(lockId, cardName); return LoginEntity.fromJson(res.body); } @@ -1391,24 +1420,21 @@ class ApiRepository { //上传头像 先获取upToken 再调用updateUserInfo Future getUpToken( - { - required String module, - required String typeKey, - required String type, - required String filename, - required int size - } - ) async { - final res = await apiProvider.getUpToken(module, typeKey, type, filename, size); + {required String module, + required String typeKey, + required String type, + required String filename, + required int size}) async { + final res = + await apiProvider.getUpToken(module, typeKey, type, filename, size); return MinePersonGetUploadFileInfoEntity.fromJson(res.body); } // 文件上传 - Future uploadFile( - { - required String url, - required dynamic body, - }) async { + Future uploadFile({ + required String url, + required dynamic body, + }) async { final res = await apiProvider.uploadFile(url, body); return LoginEntity.fromJson(res.body); } diff --git a/star_lock/lib/network/response_interceptor_log.dart b/star_lock/lib/network/response_interceptor_log.dart index 6b7a5e43..58552bea 100644 --- a/star_lock/lib/network/response_interceptor_log.dart +++ b/star_lock/lib/network/response_interceptor_log.dart @@ -4,7 +4,8 @@ import 'package:get/get.dart'; import 'package:get/get_connect/http/src/request/request.dart'; FutureOr responseLogInterceptor(Request request, Response response) { - Get.log('HTTP request:${request.url}\n RESPONSE => stataCode:${response.statusCode} ${response.body} ${response.headers}'); + Get.log( + 'HTTP request:${request.url}\n RESPONSE => stataCode:${response.statusCode} ${response.bodyString} ${response.headers}'); EasyLoading.dismiss(animation: true); return response; } diff --git a/star_lock/lib/tools/xs_aliyunPush.dart b/star_lock/lib/tools/xs_aliyunPush.dart index 4114ab5c..c2675a61 100644 --- a/star_lock/lib/tools/xs_aliyunPush.dart +++ b/star_lock/lib/tools/xs_aliyunPush.dart @@ -16,29 +16,29 @@ class XSAliyunPushProvider { } Future _onNotification(Map message) async { - print('onNotification: $message'); + // print('onNotification: $message'); } Future _onAndroidNotificationReceivedInApp( Map message) async { - print('onAndroidNotificationReceivedInApp: $message'); + // print('onAndroidNotificationReceivedInApp: $message'); } Future _onMessage(Map message) async { - print('onMessage: $message'); + // print('onMessage: $message'); } Future _onNotificationOpened(Map message) async { - print('onNotificationOpened: $message'); + // print('onNotificationOpened: $message'); } Future _onNotificationRemoved(Map message) async { - print('onNotificationRemoved: $message'); + // print('onNotificationRemoved: $message'); } Future _onAndroidNotificationClickedWithNoAction( Map message) async { - print('onAndroidNotificationClickedWithNoAction: $message'); + // print('onAndroidNotificationClickedWithNoAction: $message'); } Future _onIOSChannelOpened(Map message) async {} @@ -86,7 +86,7 @@ class XSAliyunPushProvider { // Toast.show(msg: "初始化推送成功"); } else { String errorMsg = initResult['errorMsg']; - print('初始化推送失败,原因为:$errorMsg'); + // print('初始化推送失败,原因为:$errorMsg'); // Toast.show(msg: '初始化推送失败, errorMsg: $errorMsg.}'); } }); @@ -106,7 +106,7 @@ class XSAliyunPushProvider { } else { String errorMsg = initResult['errorMsg']; // Toast.show(msg: '初始化辅助通道成功, errorMsg: $errorMsg'); - print("初始化辅助通道失败,原因为:$errorMsg"); + // print("初始化辅助通道失败,原因为:$errorMsg"); } });