From 80e465724039a03131edb1593fdd3b67c7d98a0f Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Tue, 6 Feb 2024 14:38:55 +0700 Subject: [PATCH 1/6] add string utils --- lib/core/utils/string_utils.dart | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 lib/core/utils/string_utils.dart diff --git a/lib/core/utils/string_utils.dart b/lib/core/utils/string_utils.dart new file mode 100644 index 0000000..307fb19 --- /dev/null +++ b/lib/core/utils/string_utils.dart @@ -0,0 +1,16 @@ +class StringUtils { + static bool emailValidation(String email) { + return RegExp( + r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$') + .hasMatch(email); + } + + static bool phoneValidation(String phone) { + return RegExp(r'^(\+62|62|0)8[1-9][0-9]{6,10}$').hasMatch(phone); + } + + static bool passwordValidation(String password) { + return RegExp(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*?[\W_])(?=.{8,})') + .hasMatch(password); + } +} From 5d4bc47adf7ea9bc0176003e3c4b59ec082964df Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Tue, 6 Feb 2024 14:39:16 +0700 Subject: [PATCH 2/6] styling components --- lib/application/component/text_caption/text_caption.dart | 7 ++++++- lib/application/component/text_form/text_form_view.dart | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/application/component/text_caption/text_caption.dart b/lib/application/component/text_caption/text_caption.dart index 8a5d57b..3b7e67e 100644 --- a/lib/application/component/text_caption/text_caption.dart +++ b/lib/application/component/text_caption/text_caption.dart @@ -3,10 +3,14 @@ import 'package:flutter/material.dart'; class TextCaption extends StatelessWidget { final String title, subtitle; + final TextAlign? textAlignSubtitle; + final CrossAxisAlignment? crossAxisAlignment; const TextCaption({ Key? key, required this.title, this.subtitle = '', + this.textAlignSubtitle, + this.crossAxisAlignment, }) : super(key: key); @override @@ -14,7 +18,7 @@ class TextCaption extends StatelessWidget { return Padding( padding: const EdgeInsets.only(bottom: 32.0), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: crossAxisAlignment ?? CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( @@ -30,6 +34,7 @@ class TextCaption extends StatelessWidget { padding: const EdgeInsets.only(top: 8.0), child: Text( subtitle, + textAlign: textAlignSubtitle ?? TextAlign.start, style: const TextStyle( fontSize: 16, fontWeight: FontWeight.w500, diff --git a/lib/application/component/text_form/text_form_view.dart b/lib/application/component/text_form/text_form_view.dart index 8540251..ea26bb5 100644 --- a/lib/application/component/text_form/text_form_view.dart +++ b/lib/application/component/text_form/text_form_view.dart @@ -94,12 +94,12 @@ class TextFormView extends StatelessWidget { name, style: const TextStyle( fontSize: 16, - color: ColorPalette.greyLight, + // color: ColorPalette.greyLight, ), ), suffixLable ?? const Text( - " * ", + "", style: TextStyle( fontSize: 16, color: Colors.red, From dacf5461f3c782dca486cdd8da1f2c6a535bdbeb Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Tue, 6 Feb 2024 14:40:10 +0700 Subject: [PATCH 3/6] add registration password page --- assets/images/img-success-signup.png | Bin 0 -> 89732 bytes lib/application/assets/path_assets.dart | 1 + .../component/button/button_view.dart | 140 ++++++++-------- .../view/registration_password_view.dart | 151 ++++++++++++++++++ .../registration/view/registration_view.dart | 4 +- .../submission_data/submission_parent.dart | 98 +++++++----- .../viewmodel/registration_viewmodel.dart | 19 +++ 7 files changed, 299 insertions(+), 114 deletions(-) create mode 100644 assets/images/img-success-signup.png create mode 100644 lib/features/auth/registration/view/registration_password_view.dart create mode 100644 lib/features/auth/registration/viewmodel/registration_viewmodel.dart diff --git a/assets/images/img-success-signup.png b/assets/images/img-success-signup.png new file mode 100644 index 0000000000000000000000000000000000000000..a85648d70f604a4aa40ca33ac50d3e1094603f42 GIT binary patch literal 89732 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%0A@B{hgh&YkV_N(N2Ntns@Kb*(F=v zyB+TNuF;>{(+tLg9liJT~Nks^FszJZWpxSp-l*GO2`hOv{Re*_1EHfoTU#<^WxZ~YQ7SnBFe}Ty_yKed^dtJeq z%YRqi(2o&4HjPu72?Cg47+n1^VA=SGJZP+~?k$mnspFafqS!w9|s_ zxOL1HvD!w~Q^#C>;`lq-d2w3-t`z(JnW`zqArL26c%LFmH#u@K70n#RJcoGCy-b(5 z$*s0;J+i&}o@&y8v3G4j-v<8X{T5{}7j3Z_Bj$@+FX_uwAf_ks>dhngq;5vH2gXS{ zfhZ>HZP4JMbin*@PeANThE<^F!i5MiQxfwlpF^`nHpH3%qa1Eh3koaI?QgXJVV39B z;t%axjihOZ!sy}(oY;_pD!zMF7h0_ncF(4Wj?i?UJILo07?Zfs<5FKiSwJ1UdQUN> zy22~J3ZIhr?20dbMnA26K%JR_Gj-miGzX)Y6KLl5GZUyVXC8z9lsu3B=$3-K>}x#A zB<9o;eBI2#SvCQ?P;G|E{OIA%bC)vi1-P zcNX2;NIvui8k>hc@sC$kjq2*`mSldt26{*Cs{?8kCvWKMl==QdzIcaPrP(6O#_pNVQEwM`M`fi7pmDlf$`_iMlTBvUA*fXbSiw?rWVKZf@aAP zU-#E%<@2G*&8})EoBe-&L)f-N;sS-BH?mHb}>j#?=-vsbVqcrc|z1q?EXPj?8a z`Tt96#o%kPmiQM7&A%VRaZvJ-mn#$Zj9W;g2d}1jRdYb4YSiPN1Ncme+B z-Q2Z#pWfMK2LBsg!Tk-vCr0$|cnzOe9la>|1ElAQxb=xMiPB+bf4_ErI8ZwkQ3&hJ zhw>N%7dNd`X`9z=Q10hT&r|H`8C9k%0AvFZk^u|%oVRy1f;b;DZ}`E{i>2} z#^uFyaKm-JYv70RcwuMgdhvNxcu!)LDu?PGFYM=XK2UK8SeGCWhYmc(o>MiZPVX9x z3_a6}Y1G67r=IWBA~yf}Ssf9DAi6HsG}3e?=WZ4svwCJ5Ndp$%H6y6Zz1w(ew%OiA zr$bSuTC}jNTs}buO9zPYte@TR>gY48pv#|@lvq)fKEBl+*sc{@f390QBuAxR{Zfw& zf#IBCSt&OrWQcD6v;NmRW;$`bSX$r-MW>j^cL0R<{Il3XQ8NeJG1xxT#c=f(j)RqU zA5ejErz(8WG5zZd44Eb+R%?1>LJ;xr1$fV=s#+qi65W31gT#}~*|Olg$QNWaiSWk` zqo2{`{Bq5Hih9)a&>fO2d)l|&_3(iDJsgdFFexFVG4BR#qj9%CBAwa zA9~Kj+h0Y$vZVeU&Gfr`PcvThTzb8w5#vEOs_gcPftiP6|+Tbw|UoSUrNZlZe>0wys^YivEHc3*G>i8wI6D9n3 zwK{omwz=dG?IAt_0~MKmPce;_bMxtzE!z?uJU2M+h={{;kd%Qvc~>gK_Y50tP7d!w zRcT|xYjyg+)Eo3WA01u{6_orh1RPbhf0w$2$8SSF7>0rO%3*7PmF)mbA}>=5U-rG# z0DJt49BWEYsUUc(5Q7Vw3>qex-gmBFdt>)A#aQ49@ZS}JofPQb43~0!zkc925USDd zQkBs3u&P&Asm<#pswU}V)L8Q3z;oq75|b5L9fA@G_7BnI4!IJv-a^*r61EJxs>ed3rZrZ@Pro_ovG(`ey9$del)U8MPz zFn%O2XW>&usa9*M4(D?7|6d6{YFvzhWbFeQiRQm(siO%_94p!fx~{#g-8xOslUSOk z^e-Ys^y*J9xBF3o(!%=J_fYChQfvD<6Zk*AIAiAxdph zR^u~W7SBI}JU7HcC)?<(+D+DkiKdD6<55kGCeShKrY@?k(C$ySBSROmV@fX) zDbu^}&{;!V%EfsDd*i+QnfSfaOAZ2eVT*H+0qk^)k6CwF?5ywLObb6< z?8X1o+47CMmAq zwCB++SH?6KON2DzBFh4uuyLt2<3xDCcvMXH#I?**C+-pZ(EI6bB4tC< z_5eZ4x4&Z*hE6%{3qpjYenEsab$yahR9!J>hh7h zxyNBy!B(gBI?MLr6;d2#BT8fP%VWzRbE!^;9Ihkyw3DhZ`lK;|R8Q^L+Gw!%M^4+$ zMs!Dzu;)hzhg6yUu6DPBzMyaMGr0B14)AFn0-{3vA!(JuEkx zTq(7gXzys+^UbEV8+WG6%0C>uw z)ts+I?9v3u=eR@kR3tLS?WyC460)kyT0nqU;=()$=RDH_x zB>Az|h$-rKr+J?g8?f{0&R{G3>F%>3`ZlD7vN}P`afBDOvm=MkcaeEh*?HE)#-n=7 zx{Ys+=Qp>}Tc7f5-OX`SckofuQ>Xodg!Ld{*I!6PFE*c~Y?sZ-CD}ezG4uovLHpf3 zRT2BT4P5v`0oeL4j8vr2YkQTt#xYc=LljXLB`%Yo`$S zF{WVs-d&o_Yf>M4<6=8hkJx+sxQ1Anb978G?)HlNxZsP8dz&=BNgfwj4~d7rOjf^R z#1K$3r#nc7u;lBw=<=HzuxO)|l>PiYT`LrxSf@LUQ8B({A8MxAKQD@wVD=N0AXCUs zio{{($25H;7y1IY!oKGJZUvwFFBH=j9e==!fnj}6}gz~(*jZtp@@>KLUsd$0!Ha{$dY`8Fu zaV4-iqb=!4@7|@#PfOwu=M|>sKi8|LUpV3J?= z{tB^wYN0;0u!E{cd0Y!Bf$4Q!L6&q*UPU?dXPRiAwQ7GyPIYYIWRKk@EYwP4$oj$y zufOwTlUyF%#)bBw=u7iJlu4$Mf{X}+f(UU1p)qfxo##nM&03pWwwnxQjg-ILnB$?y z&3Q*h7#t?br%)ck;Y{{ii%2Q=3aH15Y1BBQ#5U-*dcs%La$iZ!z9bzhW7sC`p^ zJ%2S=72xIalHL^hdS1pTec0A-2Llq)<|HkPD}tsGn?846X2F^hY4 z1hgx9V?1Aq0_TsxD4|S zi7Bh+Li9_Y}#TVgE9E0@d zDpZoo@ln(aDoX-6q`2SCez;%NJo|H}m?zRgMRrTM;PL z8(s(ng^bllq8Cx!J~)AFm%swGwj?9_D&9F1mNBeR0d6nY6Ix66iFp~2m~=HTm@3sj zeZ`<>JN;IDPp?n1zvYKkk9}xFis8MY^f)i*`+Ky9di|2RzwuyY@C!PQ`As)Kt!UjFPU*T%|ZqHnv& z>a+vzJFAW)!Iw`Ky_2c|VA@HmE2%hY!^is6ldMAI-HvuA&OAeDeneaW*EaiJ5C@SM z-cYPSv^<1e5(LQTexDdV5%A+BD|gPehh2Z_U$VF~PI?oTQV`_-z)2|1l}Eb`FXDEo9Q{l}ZE^+%E1{%%j|=y-RxYlU{o9sgU*4 zf=_}bKl5i!&c10A%(+MH=TH*+n~_in`Qv+Sqh`%UU=OfW$4(xBn|U-m0pOz5qydeU zUD=CX2|v+hpJ~-qi5SE31V(1r=7d_;g7g)->6a#VoQ{H2c^8=jc4TFYO|IBmvPNy8ShGJD$ozmh&#&RJ`+P z20O@}Yd*RFNyM$+t06CYV^HFlV$eSJlmB1j1f%oEwMD@S2^YcZdI!{Fg%&@=&iZW6 zOaYV<;6Ne<$<)AljaPU7&&gnXS!e?ZTm-&6!~8F(2m|4lmx&KL)%EIlYWVh&P&~}U zJRU=vB*lb={TiBr%AEGAFF7VhI?i;2qngwLbtJG1b2(#i9Nbkrv-#CBwA(*U6$4RR_!-VD`w{rIj1+#atj3Ww%{YxlB$PB3K&M5~wY(SDGyYISTj zS1gIecU=2s5t~He)x^=ca*7YT4$(PZYOoHM#V#kcZ9@qD@7@(+8;sG2#Z-xiNtM(g z!|8GoZxvE`l7zz9&+0{bK?Qk3G=RvL}vuOm6E|uN-KqOeFP)?s7%-dq+Uu zwR&xB%tc#XxG1EP!w>FwYQD*QnyJ)o&iRC-qXNc7(jqM&ye-Bt_{Y|8JBPl6&fZ8oOW<64rP|A; zjLf&-dtEZXq(kR&WD8>ptS-xTR^1gD1XnSHxUaOoYVwTij{GuSZhcCLBzoqy(oP`e zMG||85oiv)!}9Mwi8>(&OxyC`%yLR75f&cpelMDiZrI)fDY^XWpJ7<-R*hHHwrBt| zpY*j@;}k*50%InRZmQaE6L|T$iNtd3Qyw_*AjzsVrD zDU*T@gO8tB4m6P;DQ;%W@%mSuryShNhob#{`T`l**;Lq%B9~CVOy3S&S8|9N}{MOfeOjpuM-qbZk8$J^gB2X@kcwNOolFCXe>7aL;eRTosFITUNflfr~}SE&jyzQ z1Q*G~Z{r-H}8~S$BTZil&1L6^^haM6rddfxo^6f#!QY4P7+A$o-?EklN zDNFLIouu*dN;$7Spxd-`Y+97NTk}&<8uqbPtu=n}OVyM>(T$WJC2ko);V-H-g`+)fSX|o^1BQ%DOINC zqjWoZtiHsS4;-{F@qVGMG*K2~Ch9*C=#9{iY- zHt_Yk%?UQyLYlip_ODq&@0Oe8G9lR>`>SZ4U^{sbB4=_s2Au0#Vq_tCZ4`X-bi_~q z>F?=5*dK$x5BdByjR{g!2YW#dFR2jIH}$J)};S43Q602u*6W{N2sR;Pep0$lQ8$hA;EqNpfa zVW;6A);{s(a8;HP$UfhlX1v28Az8{uCSBrtdJ68j2e_^?N0?_kldj`}Lx@N%U{l}C zFanbW--n$5ydVx(t?uwd!ZD%J=B+DbZMEf%gG}!=@5c2MSGxMacirf>%P$$fnKe+m z(e8v=6&Z0JSJj@T;6ml)SpG2V8M^JJ5zAK9W#DW3DH28_InJX1*K- zGM}jl14|D{Nh0-meQxZu)$6&F?8f-U%%g8VU)>Fti!>|P^CQy)& zt}WtJorDuwgXvexR-vxBds%nDDt?=Qub!G?e5u_DM)4T<3=zC@|2T!bIg%O{ka2Gv zYw@a>xoE}R^v;BMRX#V#H4mj+6ER4Pt170yL(Z&a6|j|0qq=1h6Qf+7(^2jWy}Q7B zDOccmW7Y8m?#Ipv$?pR3`IHn~hSe%)iVNRp!4vIXQh#3$^WX~rUkHgQo(J>mdba6R zq2!battETO{F#!NcItOi@R3n$8N_wbaLnCu(I9wsVw;SIj*8}i%9e>p7mE$EUrfh& zC@se2^8!zV_xs?>lbe6rH(i1JOfxtFHbZTZOu#SlTjBTH2UDur^Sz?NuX~k;$^}*Uo#a%dPud7G8*9pp zt`DO)&tgRtaAZH+0;5e}*?Zk?CIf*C5)tvMJ`keeGtl4-o|fRF?&%4weJ`im7?A8Iabp%1#Q#8OFVI)vtZEm%dM)J`b1V__ zAJR<~q}H4AgG27w31dYfA+4FGy?0)=Q@B<_x{YMW;Vt8%^F&+T7u8AgW$gYo#ZqO{ z4KIsJ39}vVQkn-rfiXCC$BWOMgS3w_c=cc(;}~See*dV_4rH1a1-D{+xtp8gneIco z^?QSwDW2PvL!^RwKt61JPTqN~y%y&5jsn8A79Ojx>4POZ7DJ$c4esfJ3?4qTyl9xK z?St|fZcb%(u9n`RgL_cQEip+<9En@LAmMy1Owgz&6m=*@vf7{5argSTMXRK? z^{7fP#Oxh}0TiMDG4vj|BI-^_zJg7Ed*wTEPiCA_TYe@jO;M+uh>zj3L*Y#uG%5I= zcOg2$5OO5Zc{AjZ54VBblf4JvE>Wu=MQt?0$H!I^Z4Zjl8YlwQw)KQ-U&;4#e?;8h z>GT#;+fCU4vOFE3)*JBj7cJ*S-nUN|=(O~vmIwE;L1by{4Cjk&pE`5rj>loDB7f(5 z6j|(Y#6I_P_5I~CBN+z19+oaKyUnMX@AnivtfcbALbBjaUZ#i|WXkX#9^ z|8ZyXu&oK!KUu_Bz%f)1N7kQ6Fl9mRU*ILck4nklgOc2Nf5}&wlP#J%F37prNlv?? z^=Cd{DUKX&$4M)Yd>9>bBoULyofAOamP_}8JLP%fsj-iJI?CjcnWng>=8OM+8NSKS zF%UdmjK{B4Bs`_=pz)zt9U~E;U!}X=`eCsJk*SEjHd1Ebd#>&SJrl=+zt#8~$OP~p zBufP#Oy0VUiNA4wHz&2z&eV4A?clx=YKdr@MWk7&28)55-VUP3T=US9+J{!QwOJgv zd~4(_n1pyPel@F89&GEQ--#WzO-7skOn7_a*kaPC@X1-!c9G4K`AkY>oNia^U(llw zX;i@Zrb0qFqnpr79+Y}_>^>ziJCna42B`fuH!qe~5i{(&qR^Y2V>&!RZ>b{3Z@xOC z!sI)+;WU)4k{!D;aiXgPo~f%VCr8-dQ#|5OeipfqxBI!Nso<3)^^qL1w}BtBKkWBY zf9Gm$@Xn>vKQThOuH<7hEwWMl@I~o(S)nx(`^y~qP*~4H2A7ATgN*a?yUl12PcGEG zYJBgpS5_FA_1b7jVS1LAA>Rc3Z_jl{s_kg?lMxA;5RM7#%=g#kFls%ftaZh1GjB@B z$@B9P6u%;Tk&fZyH%o-kE}K|x$Hqryc`n?iCEV%*>XeCF$L;^hsLf%vC$9o6s@e2GV0qaC+S`Zxb zh)E9FyI|WuKI9;YnhbbMwXp)0&yiJmu5?`{cri*&H_qq!eYFAl1<)evI}ZiLQzj6b zrd3p`mH?(H?0kJ$bc z(~Mp2YGVc%)zwV8q^$?lzP^BR6&uJ>yjWSw@(jmuV5gQj-(>X?rOUr_hZqVrHXD9m zdv*>+Cuod7x>MB9O(isruystX7inD-73wA)3wAL}$NI6X+v_bGkv<&`= zaLX9+3*XhdyG%b)Hi*s&5RTvDR(Dq^FSkLKz4-JZ_ehv9%Q@%XHbvIwr~O2b?x{q? zRnk%e=()@^onM9*P^YobNi^YHe;Bhnc-Tb)G`#Fu3ut+xru%&lA5`7zXAF-aokn8k zP$w61{DcKZ6KvkAEVq97qe?BRCq)BFFntmX%Xk(IE0*L;V{=h)eND8mu-^K|m2=s~ zER6%yHBY=QG;|<{zs@H%0iq+XnW(>8$_;4IMqDe;$=29E@;21#Cu5_G<8+Q>?crOi=p?Wh!O3^$0a~>8bkcb z?ez0i&0C!2DV}#a$PnJGXcD@wX(~_|0CD<3RkxtfO^5)gG{V7B@;m_||I6Yt1Y+pI zr+2X&HpiT3(%`l+F?$p-Y&==l?UJSm$yAgI&b0k3;eYuh>UcZ;uLaC<%QKd4LXCPy z?c%s}obJJl6Qb|&62 z7VAkMvcJCpgJqAAvzR5__k`ecd%cEK(EEJwIoI!Do~dQCQoirKfhZd(^eFT>RHb1M zx5TT?xRJ=cB7a+Ppz1be+Bcn@9n>%jcnlEFUm-l+K9AZYcgZbE{rVRO% zQ}*uO13bth3*bJ!#Bg3Q)5XrSt!TPVFiU7SNEUa{admJes_5QSr}#T&J1u3DC*j9i zv}Hj><|O$5R)7ksS>ouq#ejuAUd2%lhgm$n>Gx`b?u(s}n#F9Pf!7Al8VJ8D6hP#` z7G<&eP)F?i$I@FL6u>Ol5$x&4`eyS_9p~WsO~(aZ>@9e}NvT6I;-0gbF8`rNkHL*8 zjH`ZByGHwM#n{us?b?o=wTUmM(fCzy zacMl0e{2t_9ajU-acE@dUE(OUuJ<0YNfz>M5G`Wxva`?>=Y6f za>px9k3Z^yPgd8%2E9kW*|L_l2BDwe`}_6!Ti6ior`V$%r2s@UsYEPS6_G7DtEbH! z4aeK#gQR2obCftnph1-R6!BZSa>&+i8-rb1E=mm}B1-!YB(SEg1r`7I&@sxRMf!A& z^_g9x+-W&h*K+bIRORN?-A(;qdnbDlp&6uxpm}q1#FUu%i((f2W9(AOgqYZ4>RRtM zWe?H4?#d!7YlTjtC!Cw5Ft}P2=cYNuH5@i(U^$|cMh3B=*=1GP9n&S$D8EhM5?g@h z2s#raYTFfMD68g!ykg`0d;3Cw`Fq9YsfxkB&^RYiAYG7((pA|#50?1k6kwHkcucB( z^GX=q9o3H7hBNmBVImb#SZP}HKDTM3puP~ zg605D8?-s?t_IoNUsDBgApD9q#WE5~JLT_XDoYWg!*o zO4zKOABQ7fc2fQCt=hAKsgrKg$e0wkieVdYgz0LfVWM$XrtDFcjF-)%jxR5~733Dq z<7PivS0*jlJ>OopC&;m|OZXhk#>?n>xnx1k7uUAgrN;GJaWeG!Vk88<#H`mU&O|d3 zsCN->1Lvxi_s%URD;DU*f31%|!yCEZVmtoCY&c2Re0*~iaMUv$)(+h#=!EWXeV*~t z&b@NS$vXVqO|Ef!x5vG6tVXT1Qq0lciBPc^;}ub>nitzugo*cd6TbL(p8zID8S%Qz zqkMG)W?0#-qTMm~giGgPw9g&asX&qb1FXJ-u5Y$Ur6-lVxtr*F7Gs7Z0Rvrt8~j9K z(n<&*_4iCamwew9pRPMzUlReA?T)=}3b(QkjIF8F6KspjvG_y#W%Q}dOrX*&@71+e zR>If4cEk%xh@jzy?R-LC(dN_`v7csr!Kv~whHMnLB%h-WGa76IC1!CN|I$Wv7|X|; z{P3q4KdjW$%{&ztLE5l@(bHXQ%y~iD?yH?0L&+cXVzAq8cQryH+?jfpy4~bEHejR! zzklP=H%2BH-YLXj7AEd2ARqgGJkNDH3RyIp>!gC+xcj;{D8Hz{=OUC`BI)QF?c>1I zP^NMZ)g;3gA0Fw`XUEAsb9DFU2pb-ldYqpj$!5-Hw)wyk4|{loeid2{1Px zdJOERS^kb0O*fXsqXA!WyrM}zuUpzygfC0Z1n|x&04DH6!bgj*b@p_-|pnY zvjgn_RZ-!-pAvc6(uhjd{sWutKB2+PoudMuIaU>}Kxqv0BY-9RcrBo1TU|uGWKwc`b zc`liFy!EIh1T2F3j?W`MVF)}M1MY)?Y971F^zhaXhTT&^r(9j!Yd0a5I9f7rA7Hxh zT;lTC{xf2EXxV{0Rtj6kn)&&FPSx*uRdG+Fv(4nN*M~v zER|XWd_;3Fi}VTs*r~@4XvZ{1G#;LxfwYyHg!1FL;!4cv(!1&RU&a4qRnQ+7&~ow0 zhx7QOaO!efmq;EF)PfhWt3$(3k!UM)^lSR`w82lw%F^;hey)>G(|9KDoBrjak*kY! zl)w1V(b0!tCAP`LB;&G*c#Er!eZW(z!{_&cnf5R$cr79=`aJcA>ocoz+K>oi^&8$V zcgx;+&e7=Z13p*fpgmt32AvzV4KRW1)_>Lk$4?shZF^zE z<+G4PJLgdjPNvK>BdxWcwc#uC{#}*0qqI9lHsi|?53c79wY%a-E?qK{n8UD(h>3_M z60@@zlVt*~N4LG7x8B{gpL2A3mlOI7K|gZ^Lvm~|X>l96o}fjB5QLUn!*%vzt_v!# z#1k`-pDI;pPihIVdy{nT?dGrmmWM*+iFjE_C+2q!XzQl`T0p*AkUpCid4fcnAlLz- zl_`vIo%VYX4|jXk0+)t%NJLnlub-ayoUKu@a>Rw!S_%V&;DhT#Y%i~FAb^rIv6 zI=awOCwSVTwq-Z-ic1K}r(eR?e@{9q%FZfS?fvyS_&~vCqyqiM)=5)1nCrI2C2ik? zzhi?g-1E_>7Ro0~nBSSpZ0_HeyxYCumWNy0I7GId?=YAbSucC&`u{QYCH_!;Vf!e` z7KIeaQc+|l*|$>J%bqR!mVInvjgY;fY#|BR_jQaVd$JCLVaAeujInQn`5oW)eLtU{ ze_$TZbIyIP`?{|CIy-U3a$qE&W@ZeCGU?$t8RWCN_bAf%|<<`M*_YAuVS! z17Dcz{$BTeri|(8Qi0Vfu8t?%nT;bqJsl|U&j|`zlW@!{%_8~OqGcik+PR_%e?PAu z%yZqN0`!J}46}Y-7LxRMCt`b1PgXfrz!>qJ88hPM(oZM9SYJ{Xd_TvLBB!v;Pg&UC zw}yfvKFHbrKDr{uZmkyPYW||$nB!SO=HZO-NuW#BZ&MwZFWQ{0VC`m7uP&#yy@vkK z0XVJ_XV9kteg{gnkl(8LHCgrl?jEh>vw$O=M5N#TI$hQU&Y_ z8j&)=DA<&9uqr=uy7eA|_Gh2?SevHUj*d3!`zCQ+cvigo+a3)+b=pD&Pn{NXw9$%!?{hCIY)X5x)(f0l7wv4#y&ToVB9Y)Tf^CcSl-e4PBBlWg7|WqA@sq=Tunxz3Ut4kD!MDz~{%OV)%=r zqp1k5TWoI?t^vh{Or^c;zmsS_pjj*I?)CN3ESl8b!tkJg0)G{+%}lGz|nF zLD;6)7L`uZQIy6;BTu2U_kItKxKmJF#xA+KTi{5MvEX&z@lx5&%m`*SC}HGcwN&`z&@~?u)5fPx z|C9%;b~@PW`>UMD!^b8j?z5ujO84=%ee@qq%n1PY^$q>*F>{-M_VpCZ(-)w{dr)12 z^rq6bt%YyU1VUcv5?;a~2=Qg;$f~g>q&Fi1wh`{gvSH@GlUA)ZCiYX*HsjtkHc#{h zhzH?+r4d$yuPfMkLNA;UQa8JX#WG-TUTc12!gG=2qDsJ!+A~*&tLtPo9b)E8-`^V! zQ>wSqS0Na!DoAWB(Rk@w-C5P4ol5mv3~CJQx8pBLZJmI<{N_@V%j-TjTz|`R`35Ip zO=un4#H#YDhA3}@@K$#-&@}&M-_a4YOS5{FBrltv%9tq+)6{;fr>E!rRJjo^ALhn< zS%wxWt~=V-()9SQ{NdjBb58Pple}z>D%jayiw3e3e^Dnz-DgU;FHC0k<~3yHdlL|8 z``nufNfK+HCEWfJ-Y>e)nDFq+vmm(g$LTevfiK3cQs!wa3_QQseIbbfJ7+VtyWX)~ zoeX_d+^PSREp;_-@#u;%It`=5KzGj8lE(O16Yssgk{YyT%v>}!kQmV5pGmkBJ+VX6 zI>*5Lw_H#VF3d}G42Kgd-{GH?Iea9@@l62V-D?7if?w2sYy81kG+Caoi;8*NjZanN z_b(Wm&XsyMH}a7-4IvO#=1#4!y}0&DT>qU=28iSFBfbd@?-{H}C8z=%bYP~Ad;QAT zF?syd-wIAF@vMLhbM?VvgZd(!Kc<&7cjW|)Chp$=1wEa*=i}yv0L3d#{g}3 z6VViCKTQQq=xgM^qx;zUxqqCz1$iUOdS=5%qATf}HWt+cA}c9E=uk0EWWLm{e*HJ1 z!|C-PeVLzkNx*4K2A_HJ^1TPO=RiPQz6lxBXtk_3DR)%vMXT*kh!nl@$}=}+N#BUG z(M+ojqM7f_ZdmnV!{05;npdyBX#N87d9G8ak4yq(-%3i#QvKeed9vwf28)`j)U+Do zq2hegNP>J`>J?1rFf`)bKdSzlH}qUjJmz7MwiB<F8B@`79IH)w993;p;`7rfj~L=vY0>kc}cP+^!LyzI-U*v zAj|cyl$wWyuKG?*u{ffOd`S>78dp(%V#mSWZ&9C zIJwkjd&?m(96R#l24g(>19tr5D7x5)sc(?X2vZ z@mH*`Z@yM6_p|oj*J;V~3B_wl{W^wsT)!S%Z{nt_oCT=IJmia06qkJVygr-v1zZ(SVj# zG8a~J%;MvC@^mxka)wV{V6%X!PA8S0D{(-_V{p8*oJ_^_dT(c*m**JJTx3p9H2Ee1 z`HP~^DY3uNFJ2?)seSK=+V&pKf?Gjp)ll+wp0qxR_D6|P1aqFIm;V*L*7WL3&T+?x z7oTq8)0R>Po;sl;p*Fpi*UUIR>GshY)vn0sMOze(FA) zOU+?m_3A}y%;$eZO9hsQl#IL^G31vkN=nbreS#*uW+R&}jg*)a%ZMfxh^gC{)_OEa z2G^K2p*YtQXBCLTQrb#njE>nDO!?gUD>)h`%)%VA;!#YK`VSdZ)JtksV(-@TW;kuK zMbM$%X$D#-M+WRanSk=@b-Jaqtfs$sv=RoBwN!tTS$XzrzXCzi_B)z`fu_NaN3QR?;n zkzSlrH4% zGZGRKr8jUAx$_rrUYs1F%b6ImtGk)1?PbHfe?UQx5C4v6%7S^Pp6tSy`?e9D-(+Zb zORQ6>xDKNF?*84Xr^LL!jrlZM_ITr4^Ea2_Z<_0C3%|^yydi!2Yy)KyriS^0I#U=K zu1&M2PdgVbmQ_V}{_34`dT@OsZxyZKTcfg^Lw0U90*^vA2=HJlk6|T+b*mJ^4^I3f z+55l9@r>-j%G{j}Co}cUt}2*cOZ}@%^w7P8ld1U6{1$vv8K?}u!u+-kM$?~<9=yT_ z+&HafXj)47Cp1R+?wliuX1$$RoA|g{TrYII{?SF&9ZlIC{94KFv_hG60*+%^MOq-%^$DJA0BhP3{)hD#3iHYZTO+ zSZ^O^F-KNq8HAxD!Y%(g^QqT6MX6}1uX5`GmDUBKzU_{`z&axE%_*wL=U3U{H&0G` zS!Dtr;hThGeR{t~jm&RT!kCk-QJJx<7dQ>4r1mMng8Ud4Yw(ewRRT2Ju_?QoT#$7E zbpzr?;Um`zW@TVvF^UeV{1UA#?eil(JNq7tUI2{Zg}?tOkw)NpnDIC8q<35d+K{p& z=|zTLy@*E$E)2J%+toWEZkwH77U8m_jnblSsH7$*S(OrA(!*Eu8L#>i>f9SXo^Nhge z$f85zdZD+AMZTAgaCZr#>%2+X%a^zSjNwKWtQ&YYkKG4k^!{cNzcm6YN|)L1>&mTI zc+{e!KU?C+{ZZMuc)SblmaOB4Z+8`*zs0)k;i14SP#sp61aPn*Ix?XTDRHH*iyy5&;crMm zq2~KL?}th(%8!B5*vo-A1~dUWh*a;PTY_l|p38+^_C_BcQx;lS5^N1x);6ySmnaM# zHEN915IdZK)lWA66vj$Kj|u61QLLA?iq{<-xT>{Ec@dX*TSmwW(WN0x36wkqjyRP` z#D!qsX%Mjvhha;K_{c9up03Q6|T>V-N=z0j~eHbjie|kuNw@4zHuAPJjPWBq>fOIMxa!UDu4A-C1Kb9 z$r6sOai0DiWq<3Vrk~qTs3Cu>hPjoP)h~mTIyha^ebY-&o#ts!4Hnv-NocSQ+J%nm zuxxN=@bUTm5a8 zfw2i4H};kdlb$Xq)@oQU9h%$dkhcts>rc72G!&)zR(7&_tw{%L2afyd!sFDlq5z&m zblE`E?#+l?j&d%O4$D&7#mC3SKEKfsnNScq-Rj}Brs@^;+~n}l%OZN_%V`5qZ!?e? z@j<4Y&9$ZQBjzZ?&qTxWCE1MGz@;Oi8^#ckvTK8T9ibEnOXTv}v60zuQcsozcP^8J za73Zn%|lwATvSj&y>^n;_>==)2Q2uY7?IxTq?k6#pY*=d;@{cI-FV@gfx%BN7mFQ$ zlJTuYF|G1!oyz^dUDn=82IkV8ZhGj zw>drnDzn8hl(|P~^wx5uB$?}=v26T5@D_QweZ$&rv8O?$glE}2ZYNxky26~dGON*b z^-<&KxO?-Ynudl3Xf06%0Y8aa#okv|WKxYqWG#V?PSsmeEbRzG}tfBy}${3&re4w#{uzoN0XrXJ+D%HI3;ET;TM zIm(ag-2*cc5_-m*;guq?L;5?S3fH@SdZ^{bQqo()4y4+X^p+o9OA-_g=A%!JOjJ9)AB%W89$8f$M(Ypj4Z5Es<{j2R!-+ zpQto^+f3AD7}Yxa5gf*c84pzKjGdU2%{T9z{UECxLOR|GEb)ZIJn*O`A^k}gi9xT@ z_$Kpb@P#Wp4SQZSm|Xk-Av0X%R1b6kZf{)VUU$R#@7&J?R;L3FE*WRI3BP%4xu16i zhmY~hkq>Y}UBMV~ zl#GJ`96clTP4A{j++(EM7BEL^vPldUFj)&GzLBVX;=Wh2d{5nUs?OZAR0ar=4F~U- zbL-??Ed5tL#BKyxaxLunlBU0$qlvpjapE(70qoRw04)*EKezRV&5tw}k;rk_t!}<4 zDuY2GIXQt%dC|3R)yOCfQ5FezCvd^p+D);a{kj2eD_?~cW2;4Iy~Ri2t81RXgM6I$ zSi*=CZ-bZDIN!PP4rV29hs-dA_t0c0z}m% z-6<55gQXXo+Jp3Oj@<(IM$<(+9+p8V#;|L%aR%lF_fj$iv$dNDjEJoIZ=M*yu_$JN2jaEC15^a$&{jp-!2*i%|}ExE{M zM~Lt?Ha7M$)!?X$39VK4GtGxjM0t7g-1zJawUBDH)vjZ)M2Yxiq8FluX#Z!q->&Vo zD$Dv>$3`QqYkt5@!BDjCYurbWt|4EGI79tPnc_YY={6;Gl?9d(l1*u=5)wI}yf3uU zTfx1&;3T9YXWN?HTa~%}p|iqXKfDh=^vq^6WV;k5j}dhxqI8Wo9s7%;S|vU&5|2&6 zOkxukEb`2WxB+2n+A%Eu`sR(BE>dpX!F1nHi-&m2pKZM>CcMeOg!nNh(FcqKVzC7; zd2KVfkAxyK5_|eR)6f6+?sx&$lGlPE34q0r{2s}yxUew;U;llgl(st5W=zt!UR>wN zHQgUUQ4PKMSm^4Z<3y2SnOSjuoa3@ssiuRbo!(b?Kd`Gx#(R-H4iZVa=fsmFH4(=w z-;2HM2Q&Zt9DP!4&Vz8*0&aYO4uCJwChg_g%~^2Ao5Gcqxu-*nRlx>VH=%u*sKDj^ zY6jTNn{40ed!EdeW#fB>CDvO9ex=?MNs>}mB-~D6<&7REX;(OQ;r~gn7p2~ES(5RwUG#h|-M&zY%jpA6=X$6JGKJI9$) z%?15Yb(3|28w^%|sq}KJEV~5N(l=(xl}zE!XD|-tE|VkcVfCe_1JRLRk3<*2wpM4$ zYAkQcm#AxYpV*kxs8P^R-UFrz4ujywFh`oQmF1IoV>u2m$S_qfwd-^bRb|Ax)S^|% z#5Rq8j9fL90>COHD^7(kWi}jt{&}L+lZqKOx#(*f!9;T{|7Rr@Ha4b(!7HYT;jl3c zOR66)X&suiuAkl>|gtfcGDd9iZ9Uu z&yRV5J)+?4Q3^A$@#-2_l}r0ElE^H*6@TRFq~H=(%I)Fe&ex>5 zU6;m8w9+Nm>(p%Vo0G@q&3t~=j62si_N>F#B5O-_JGOV%3hfO2%;p+fNl8eynZ&!Z z=s8HvAIO0YUpp|ohfHLqoV7w<@&|6&5?;3i9=4_<(FC0O%CxxcYYRi%^g`L2@WwAv z4Ngz)GG)|OUy#JU5_X#GXklPKj^Ed~*qm6`;863d7I@BC-gG4y6H6l+Uw40We1|%B zYfGQ)&xelXPlK6?Z6G48ha4c&2L=oG73E#Cs?E&I<+)J@U*T^2I{%*eJa$wD^~QS4 zFCQTK5c8+^D$PPjK$E@w-EN0VrSmD-;Y96t#wqMrh+x8fSa~&0g}gyD!T8xu&_@492*CNatKbfh3t|VXrEKYoeX3uyp!y3 zwDyV}Xg#@h@z*w&1~M^hJ`wI9hLVcOt3NXmR_ngJ;M{kz?sQ>3-|LGesng00h9v;q zq#~3K)@xlcd|L7?I=6$@YTmz**vHT8jM1sp?(RYU)CcZFG0+cV>VD4u%ylsLInkcq z>@#RSO$j(~GEm!@-o{!|fXZc;w$x5`@w`jTch|}MaKj^pM6P;oPk`@@)YZ+Ej@ioG zNx?r#F4uT3cSRyvMz(G*S7_q(NACs>Ki^X?_$8oj?i659_$QYcDGM*sY2C_b+ED^G zJ{DQs*Bx|u``Vy={E!5xaRKGu41GF4Y}VZBY6l>{II+#kCTUjV6<7-`TkFsYAqkuVOVbzaM&h-Xqm(!4ZS=jj$0zz=T z8s?Qx?e!(-ta|w%4+u;F_5Qy7?=B#kn}c4gGkYJDfn2C6Vda6>@ZeyvkSKV`}YB!mzTxEs`0mJfs3jn+(}oQF)xjC zzu8x)t%%fGCgUuY?$UCkb!Z&{+Iqk2$5hOlF@l>Iwi*|d+4+5?TMWW$ zHm(SsC#U^c9&V0Je(4)#?Ag_osJ!m1fc`BHtrOd-YFE@#8-S9YR-=wj7r;MI72JKe zo=nthyz-NX{$Zj$81fyQOxvU9aMEjVlOf`21E9YqPmzkNk}D_oaN7s@_&>X33{4MG z970`vWR?4ilLT1`T#`bg8}nRQtFnqAmzuU9Pzf3^xfKq3-R(9w6MVnyjUE9~hktCZ zwd%dT{sL8y9;->^RKC90Q9jaY*nW06SRy$h*cIDRrUwj4-#wuRYjlFi#s*n}c1DU@ zrUyjimQ2ap`qi(O77zv{)%kv)%br`oU!DQ8EQ!xFw&RQiKMfjj3jVTF5CVt8ZJ`cB z*YmFr3|jbNpeCJmrk;DpG@l!CU1v)_V^X=q7OA4K_M%Hk6VL1OwEb_yy7HgZJcZwt zZ}^RX*j9KDfNM93EUKVHn~<625;G(I7?`{3D}Jr(TwyG`Gs`CR5Dc2K$=6T17azn# zz*KqC_UuM#B#2ydSm0BBTbHbi**8cQ?FWYRclFFG18;v_SO1<#s`#Xp+V_n~AyU6* z0zN9%ss*UEKKJ4_En)hNylhU_yIa96OCOk0Qr$_*^+k1&`2nKgSA2J}=dv{Y_V;OX z15%GsvqY-x^@!5E5$N+$G>qT!&8_T2r#HaN8pO@@bP_JmgY!o`v!9 zFS#pwT%-XU4zkLhj(rO39$Snz-(@KF)=>UTJOxK?KD7@I=C8JevYF2%{K;SL2S6H0 z+&)a4LQpj23;b*LiM+HiAU{fu3yGj~^Dl4}u%TSLgX}vTDj@NK4H=7AqW4-;AgIbGW7a z3RI;N%f`gZQo~afJF}ziH>7+GGSLq~E&3*f6gr5R@l)N-Cf)c`#mpo#G!`}AT`XjF zVZl1F2JvEL#dA;GP703AGrw~Xut(*uWSH;gPtf|d`vC-uuSujY!pvc5|2-D{|Myre z6UR^k&;v1&mi63e!Egd9`17t`o+P(QrCltH+n3MrZpK!&vZcy1+{f{vMhZl%=0ii# zsxs7vtRXMNN5SSw3$x2)7~s+Qij}JzJquV?!V8)j<|SL|3D}ntTGKSPXRXrnc)1|i zQ^4-xzNG}r3@#PqZ|jUL8Z@7FV{3zI(U86iAUA|v>e(6=5u63erFAHj;^IvpJ>JvV zsQjEBbMb!mauC?aLy>aKMZk<5AFnDoRo~!$+$xyHMN*c*H!>r>1<^BAAuT&yQi-2r z&Z*SoEo3PsR$-T=xIX5wirDTe29Ce8dXSZG zk>?p&r}F?s_YZ}hu@Xkya>-#GZ@@Un9c zytio>EZyMrBpJ6oy~E}`u)m|PAD-qX#J9_#s1Wtt$rz(5}O!xOtOq@5U!x2p!Ke~;M*AP z!Xjm-3=3!5?FjW1g<~I?N|b5tU)sY|RKYWIdN74vy5er-=8-?47V*eE; zy=xOD)YkL5D|M&Kf^zAq!qB+&`ud6(&O>^-->%Ty|Esh&MA`*G ziK*B~zE#&*$kddl(=FwG@`CSMGnPF#SxCIJhPEOIvuIZzL@m@*%cXR2;b4A=6u8=ovQM$iuE1JQobpZ+ZuFBx+zGI{T zW!Rlt1?htSy1gfW-^-=1a-Y-qxC)om;&1ck-dmPkK+=`xLu(r6KFb?(^9?+7F$ILj z<=8#v5@5t91#|#oYswS$LPjz(#)OEQEY=-_g<$>-4{^QtQ<%Kj4%BvxW(yKMK1k~N zG|nrp@RdZ}WaPeBA(Jkq_Bg;HHF*A~BJj)Ya|s@77eSW7?b}|U5f(Cc6@aCajC|-n zhp;CEzPIp{jPafH^w^?Ga!bo0c;k=YMZnZy+*lPP>j`Q7qlN7pUt5Z%S`1wsl@4x>1jCZxM~?W7M_98SOQS5hUW`=up>-nA3yb(0=}gKuPFC962V%A!$%*3 z)2cQ;UWG4{o?{lkXEI@p9Sf}bEO^|u#^pNccvsWFcS%Z;8k>&d%3W}ni`9jBACeJ&&KV;M=cFjKz! z`&>g~2haE(K~((#xhKV4{V#XT(Az+?_-HQwC%8I(Jje|Gv(V*36rI0bplRGgNt;r( z!?nHEH@?Z7;Jq@?2qS?)_Kf`UV=}Yv3SGI5&f&4>zDjY%v^_|`Z*kqZqWhdXD#V3+ivuxOoRG9pAjDT2<(H?I(gp~A6h;?W_y?}Nu z^O*!=m)dd=A+-?j_Q8@6ar zLB$R-$9@$4x@xr{$<<94UEoE#(QAcU&DatUc3h6~du#WH!|+1ip<79Fsp@Y{`7Xif z^4}YaV`a&@ie>uz_Vj*8YjkMl_brffw0GiC9jXaO<~kP?a?ZD7QeYdz60~dj0BFnk zUx+J9HQH+mZjbS;7ns4>N5bJGB;RF#&{%3;0*s-TL3>Ni$mDmQOQ|&`bl7cN7Eb7; z%et5Q9js5GwsZq=Wp&6~E}AhLTSaZ@aVqy^&E}azME9rYf`gfAvf0(VfPd}PLI-&6 z9QHB_cvj1jIst2o^UR1}#s=oJVLKLzQg!N`4CHU6{0g3^YZ)(XAL5Xh$~31h(nZBrIlav=W>kb{dnmOU9{??JDrt>9cTW^7m+ zp)`Euh0l2y)7Lf55it6Fg(iNc#=n>v#-_|>=4T9*Es>jac%`CGX}1OAgAS(mtRZT)EE#jw)iO*Q&SZAvkMn4T(gDk z?{UjC$qD9!UGoKe!Evr`vU&Yz=H;>0x1FnPbTvD<@TTO<8Lk=PYSFn-@f8h=p<{Uw zq75}%!gK{^y#Gf6Pb^umY}oTV=?a!NaO91!880=h^xd*7C@uZUF-&Qnp^wzWs2AP` zNXWO`gw_IxdW`QZ0Lr-I5lM3UXuFQx^A>h@W6b?DHJ5&$661QRbNp1t=;mt1N_E`D zgWyh(qUB(&qWm=Q{)rBqsi6M>?n~<4)wYgZtbBlbE`(i9;9RC)t%Dd_;4N<6xRt0> zUc^?c*8Jtlp4S(Bg}_D=zux(RDM-V7Je#yNrpZslXTxMmn)W|u;O&67I{Iv#KrFar zSQ;S&T8HR2>V^2Cj}^u#^Wn_XF=L}_bpZ;hfUl$V`~9cSks`7}@zWYNC0A9MC(04P zD=$k45s?9&}YwF3+&5*JEX+B zyeRN@@9yqyk2JpNAJ)Mv<8BK$sMFoci`abvoxeN;&Q4k+g0^OC-x<|?y53b9O1=#? zs@wlP;dd|rcf6MQDU!Cm{%MGey?B^6z6(*Z*~n3l^jii#73eEuWA51ecdp&?qR_0k zR{^T^%)y)+XA`GOni%kypv#>WV@V}X|Q<)$1>VlUae7bhAiN#vL!Qr!>bN_am z9{+c8VZQI{2XPF}o;XTRp~_6tWv za-q!-j5Vk2b*yI2K$>{bx)SF3T`ndjCQ2==*9qddsj!eYRnjx>v>LkJJHB3kutaQb z?~H$Y&~SsDJ-KcsXi9D?N71#wVWvFdoSwNSBbeB`peq(jG&d&*?o)DT5gN|B!}IkA zO!$m1jGgwrI%niyOLzpYaa;mJtg3KBep@%8i`4C(4GGhkzz5}Usmyze!a5qn$RyzY zta(-M=qY0+?&3qqsn?xa!kY?|CJqZpY0VR5+5A%vTal+ClOsag@19BYh9y9!Prqe* zu{L^K@wK|bF85Z@+@#*kqL-IdjDz??QvtTXur4*D`6U39p?$Ax?o&W$`>6Cs!!BOt z1T`Z?y`fLa#`hD65$gE3`R5o-u32%OSnF^UynNU(!cu*a9JqT&RVi@j{?Gd2D@sLE z#feviS+d3F@4Y)@qVf%dX8G6$slcc zG}@q)(DOv&3MZ(=&9#}Urtg_RDSmPedPO^9-a6nn&MB{M=b!>x?Qm!O=cQSu<%_^xn2(kF-@6&4UQtxl)RX3L&J^doZGZm~L@{j*|WrP)sU>J7XRO5(q7- zzijK5o!IxEiieF*V#+7$k3x#4HftHfvz%B|E_JS>EzFmd!-jzPVdzq$scLd+K4X>f z{qa^!(L3{i6^X00@fyvyIp03OVaEADRe39TyDwSu2#=~!)08_}2o*F(I8yu67k#10 zYOzh_dAA1WHM*R52nYxos zY`TAmb6;`mU$zI_kQp3S0_HI) zIs27xC3`S&+U!SkWvg?j2Q`pyaWuSBGU`W06H6?9V~v4?WR~u#@&+SEN0Z;*J0Zm> zdA+I1KWp|2`YGWsmUT=cihYcRH+GL^&}D^JQ(RdlW0viK^Ri>Cq=)+7_Oj?*A3v6j zE-c^>%^}A~v)?N9SmSdy7&@}a^hbR#F-X#P^SiGGPd$M7uD9x#q^IMK0RFTig0}Jd zE(Gc$_Ik^oR0&LK-hanbGDeqb=}q-9R1=ZYF$ei%^((JxTmy*)@l$Cmj@IWBJ?R)zrY>m24}N_$+n)x1 z-tz+?3!IcG%VylV4YOPxOm|n5PHG+M~+tbz6s-5q|J*LjGruN`gK51QPAzwA{lM0o=AJVnRX>&Cm9&DAmSX zj04}XZ8(NpZSmz*QRWE@(ouGQG+I;+ZmHXK8NObWD>8IX#Omwwa0$}+YNcE2U6JJ# z;Vus=W_Q5iB7<`Nr(Uj^AHXvTbidFS;mul4m$myk^lap`I@W3n%jBm8RK z_G?J{6%`i#Y;HF5$OW@zxj;y`&XqKPTrM-^2H)*1I`W$gDam)n;+8sgODOYV2>3Af z@_gsEPub-&=r6x!s4Cv{+8ZS!T|Cl^srowb#YQbXm;Sdt2rq@*%g@FR z6ZyJe1J|M$mx6~;6;6?j?HDf?XQ z=cykbR!x(r!TWs=-mmfU%6~f5AIzPWx5@j-KKG_e5si%>c^O!!CUt_5i|%}k`W58| z+Xq?Pe1k?Sy-BX%@7LN*h*ZS_0w$ajX4zb23cRqm$-8BeF5%(bC1u&!K2N$-8UA+X zIg0<%xQ@)Da`dt^lzNALW_Lo?{+{ zPC=Un?%#C{H2vc191vh4B`s~UHQ#9z*#wRd7nnu381O5!)Ng<8tlV#q1&Kx^+5r&! zkGB9<=ROkd^#Am|*rA@VWA2iqG_?889j;E%oNT0s9|PfSCf*hs3@%{e?HYG;dMV=L zL67&Ri0c6Vzd%B+8HSl;jEsdl+=0Kk3>e2C6qTNxCPhi(4ebm1w8o<6&hxi3?%F8x zNhbrQ4o7N_AaVXggEqK{Uw4U03Jt>frypSKCzMczP}|{$_NYbPV>h>zZ>3G|d$oEYwK( zf!NF?^lZg)cVzlm?Wr~(?od+A~veQ3|ZoRGf;Z_#xr>&OanE$Y8V)F`g-LBE4~}xm%-En zvO7J{tvNe{wCtSWx^U@A&&kn_DD(&n0a=%wSb7xZ?JaFILst&1A2>`jr-u(jH0I2WHe3ekN+B?JtUbOpxW}Q~`;L1!>m4@=sFp&78hORZOOT#=Dt#pvglhAw5@2b?t1P1 zprh1B2~IWVK6}&zRRBJ7tz#%lk~Pcj{_f$O8#|$z_`F7~P}{~$@5abIX0>9JLYY^z zSo#|S`Rk|k+}trv>j{0h6j=x9g>xZDJ6Xp3Df1vQ| zYtc~<)aSD~hzGPUdRM6VzWeKUhaN}4XVOCM85;eH0n6*Wd?BL+hyeSZB7Aq3!9L1- zDu_Bz+}bp-zhU32fXr96B8U0(tOfXv@-tS(5}yJ+#%mSDPCR_(zxrAP+-rNfaZ;7O zXa*#d@aw`0nxubd08zYP#teB8%`8Kpn4ZH zeTIq@(GtWhA8#$ZtU2tra6fD9hG~mBUh{n|L(Cs;s4ma-FAnuae^KvK4BezFzBxVL zpL~bgj1uzkP(l_tlAj)mziB%8ovWjhYZj%)u;QVZO9~-;74SPgVlx_J@a@n1+Oirz z@We46%dMUULt(@7e;}^ z8(s$NLB~O>gnaWXXiGgnV#b@dF*i!W9PI7gbj4T3H$(@eTYSQV;H;i&zq$WgDCegJ z;DTG9p1Dx04Rn{my$PMVr)IWaRUd?+ zb$55XCd1Wm1!I@Sn;wS$VBc{r68xB6Drpcp3ycnRWr^WU#w8&hW0U=_?0XAYKwVxo zRAo+DMc>GnH6@tj1Ew8+{(1qedH8o5nI>K59dF|Lp~8@!w^0|zL&W0&%6se%P+p7( zZSueu&|Co|vVEG>yp|$_0Fkpm{yB5;N;f%aCcj3JaMI`oR5C5Ozi20x+HNfju+aVM z+kC`^OCQ@TA8m7yp*6=JPQ~B`W?&os13M08v`6DWuxQReX*`wJYHS){3vl(%c}!a7 zVIXc#&yEMpoa)DiMvTQ}plR}z1&T7(CzGM?%Q^RPkqrU6ZwJIdx|@0KIXAYY7418| z7Shs4DL8TP<`nuldI-ZYBl>J8gq8yCOjUUMS?Rs_N z&c_Uo=EeoeF?cD;!vEA^lHB$-z@n0au7rrlZb z>q+qm9`Mv@XIBdSC4Ps1Pzy&>+*;{ z6d6OXgX|KWI*0O|5_UM3JfL7cag3~@y;w0{l}5}z<8n<2{>tL-(u<~C8Wmhj1Dh|# z=|B2g{kz|qtvYo`TY6>AB{l*hVd`HB8oem!d!9^eb#Md|)_QQRJ(A&!gkN9d{rGF< z{v=b=^XM?&@Kw`Rsa{T!fP#{mT7*!}0W}#w_Uz}xX6-9My}k$mb5GY_Gw3lsc{2p3 zV)b6!Z`ZPM`u|N2gxhMZgTOGs>A2x5uT5jW^26fi@$z@g)}&qjWNx_o{lmHY`E~z# zi@jBqK)09riUu%lgJ<>gvfHlV84(F}4LRMyY-RG#!dNyRjf$9qra2kReuFH;0O$WG zo0r#1$tMPbQw{rPlXD$YM?!#0!riDY+iC4l1_lxN>{3ZWUCKM%25M+MYYu1GAIN8k zTJ8QAspxii9>hCgGP{(bsXz?LvdvS)<*_lsOITF`p9-hlyuW0wj?P1Dj-MWl{7~O2 zotjvDY!=k@ma-5Ta*%R?WR?fyNiv*2NHJh$90g63IdD+y_hNsH2QGb-!RQFmi{|m*@;lEG6PL6Xe{7ygyvfuJV^<3%5 zveV_0ojv8sAnbEg^57SNSWm%T|M`ZxpEqh7uiv5Yf*OFVL%<%;AQtd83gBR$L4-Ty zIe4gugfyR?noGv>6yE%*O268%#awDWSMQw8RBvz3!ni@Hz}N+*qG|QcUj<%c9NfRu z7qH!quV5}(boBjOec?5&kN84=I0gLp*cB4@g0nts!>$C+hg%Z(i6+F~`}U2}qZMZT zG6*bNlGcmLv5~uY8&ZW<>Wgjlx@gDfTTB-t{tLSbz_n!YDb~)%P6AA16hAf3Tz+IE z{I$s9M<$291HDS4uQSLJd6AXRPH^@MSV!d(h(vTb+t894kMFoE>lY2_COR{(P>JRk zgLZVypqDBq2!2M(M}iZ|k42ns;~L2$U@#`BE^HIiI9q1o*ywarTrbjCqLyeLcP~aa zDW=TxcX^0^utQe`?GMhtM>cZ2`fAb?^SvdS=~GvGtCXg|9*=DGxa(!%d5t0)*sk>yso~yVK0vTs~sXvejogbnE@=>x8I>=T}>@iC+!Grh#)6ajULm z$}okB5jO)az`h#d#O{0JHf=WhB@&VzjnO37|NX9mQwdJ&@5(9J%o-R~o-*^%jES&; zN~q-fq8T9JK_9&39=WVuXGE6V)~KfFl{JU|7VbpV5L0BzZFN-2SgC#X8Vvy{LhfSL zaNOR<)_okP|G~xy@XV6&K%fQ|zx(ESH!@xp1Ux5s4B7?Ks-~JHO{`-~YjWmcKOYcj zmD*(j=nIE}u&+^~Rz`&2&@t-_$^k^kau_oURfv0dpbL%S?s3hQr_{|WM zwmurloSJ#-lgq`hVVeYtA(@!l0780P1vo6v=N)jfDA1>Rq_-x6$s=~i-dIF<#KWyb z2+PKydvr21;y2&^ZmIVlM>`z8HooVd;FaFNacM!8Ou5rPADZ5hr}{T`FKV05h3fh+ zJG&CgfpAu)L6FjFd6focQJKqD16Rm>T2J4SHkSH;>tlp=@j#xMUfJF7*DMGyB)JQ; zAToPDr!gp&=%Oor7>g8L-;i0UcLo6An*N5ye$e_H`j}$Qg_Fq%YH*>Kwk)AXc~J9W zJ*ye}7m1nMbxxPW9>%q-^m)H-+u-Kw3FxAN1|LO6%^G0AU?*rFnZJgNfik}K|s2sM(0M0bdH9N(H&9~ z#^62k`+NU@o#)wk&biNhuKT*LE63N1E;)R#HYt)4XBON8Xe%<2FxY{YVrL_=`}$63 zx<9B;EqqYsQbkSsT}-VBJ{dIE~fM7-5@P-vf@i0GOIXYr`Gjjr0~ zF$ucPtA(XMXdwZ+Rv-Qhd>ZYlJjcaHdMYVP3$+Cjju9BBOfIZ-h&kaCrQlYWdNp+Q zlG4O+&RNcPu$4Aoi&+2`7yrHfdqDrS(ZrkdE0Ho8caWcxPWT{(Q*ckmn?pe;Jj=+LZhI~9iqyW`^kM|ZxkZh2S@|>^ zRoZ}XSu+UYXdD)=LCVb*0Y6<0RF1{G@R^87bRNd-%<)}@RD6>*uO|keCHAb6n*zQD z$uz?GtkayxQ(7nChutGva5zaW+3t=&9RnTMOOLf!3hJvX*EGpQ1i{4Oe%kGXy>GT4 zTrOs>yLn)Fg3G_!?yxS|Am~>TL19nfeng1>6#qIFnf=3U#NSvIt07m$V1;=PE6iyw z27n1`&NACi|Dj5o{(}6gunVj?z+?v!o$!Ghb}^s=1SQ6_{Pg`}svonCdmB5?60^$z zG}c}k&oJ26F2v(Wvs8xnQK~2O$+Ey$vQvpM5sy$+uO_e!;=%IJ2i|=Vm!mzFWuvTjxtrndQR=i zcV==sqg=doK=;6_Qr2kF_xSH$vleQr4MgcNgIe{6-@6Dtlq<%W}=} zQGT2PUNi+H7@LN5qrsLUS2;a=Z0LYIb@5^&63Os1dO@tM;NZ&Er%%3hH6Z55L@xIu zVnxz#u|onDHrnipMmFNe$^h*#I9gBQ1K9p|6GOeNo2E?PGNIP~#T@s*Vja^Opu*Bu zhOSS*VXj24Vm!4PMMXD*?Yn)KFPB)hAK$jwO_;0iQD{qQzYU)whh~E>>4dhU1lqr~ zfUc@yr)Ixsw0;(ir}?A;wvsjq^F}f~n<3rI?^vMSVbl22jBDYCNN76|SFfu_AqPZwK(Q2~e~ z9}KOPq9T)aosT`kGu;PG+MQ)IZIk^y%IDLEWi?1LGB2MIpKV|50RpdWG)W$m$Xi}@ zA@*B|p_ycbwjJ)D^jl5wmm4CAmn7SiuFc)CKlywP()7`elFJ{A-cebp2feQmduDjG zIY#?O^Y1PAqEvGMcMp}mOs*&A(E&YQ4jFKU2l{}to$;EDAnlZTs1&NBjS{2*EX_wj zN3L9BU~8L5(AB2kWSo9^1s0}D%99B*0}hY$i(beA@TR$Ye%qm_p})?E|L#xb?jOxd zRX4Q|$8BBZ$qch&Z|vJ>LETP_L;tSep7qlP?8e3RW$QXVtOz(^q>#Vw7=x2cHu8X= z#Iki`a|w8Y+N_Y;W?o$!p$#B)V2j>=tA~Be3AK>ucW@CfLh}{5{NOQl{=E?lhTfRF zBhSZ=u|1j%>E-g;AyJZUvJ+fcxCeWjk{7?!XfsPYK4}MT;}PZ@^JNVbND0fCF{E zHgr7R)H88jdWz2sf4OXlQP4me$Y4W6-rG?&$$`nfKB$QOX^Z8#`+c$d2ZI(ialSP+ zNYjTD^;0l^tFD|^c9|8I7=5hR^0J?isj5jf!6g5#UZtQ5yR}^Nx|xa|xS?7Mx!ODj ztx`cGVi_>s@TvuUx6(J>Yt!n8L9n2R-SzqKPhw8z*<%{3wuHVLSeInnNSKbf*OP+z zs)!_p$AAEDEG@QYQg-$C(;yRXyP(_gj8pYCf>Spf@!g?C8O`+%=pg|w4JN9dHvkUb z#zh3_baYu?qscP(`4)l#>ZD)Oo%8CxDPmg;$~+O7VN&s@oh2mX8>DbvT?Y*T9qHJg z`y32274||3mCAdQDI1!JE93)Z*?oy|?{4%CY+ii8rgCLx?Tl%fW&xyy6tJRUL-pmS zrPp%2Zh@~_P5P?hgY9yDrOcJ=%$`qMF<`>9QBz$NIm)?PddZu#UN^wfRCcQD>4$et z&SIVPuGjFI0Nw^if9n0r8U~m^a1rzk=j-Bku0(d z8$i0oYYd%BA$Ko;h1nwrEvg%-GZNnUY>LJiRgIeEbdL_Zb3QSt(dhsiCPdjH9fP#k zn2Gqv;E6nxJC91>T{N?w<(&{RPFk5wUaoPNFGwJ=Z@`2N3yQv$q-Bsno+D_{s0gfS zniIG|c6>KHa*jiI*=O5-f&uc*OT_oNHZZ$dHFhD&-_LJ+e-~e5x|DC*vHvU5r_<=? zJ=RE4zvo@0&}$6!xs}I?WY0waTEG*J=xjHvTS{g)oe=ejk$TAKV$z2xZ~HMF(W|N8)YCH~40zDFs_bPYL|nd_tS|w;(eI+M^R~{ZtX+3eMCrEn(ec^)6jd-} zz-~r8GV^Vl>A5r#Lv?)8sGz#Utyj)NqgB*eqqQyqs$P3<=?WC?;F&{gxw!$(6{neB z?c?BjGJlwOUE=ap)?sV36biVMfCU@NWV&@~nvA6bR*b+fB)}!B9tpM&$vNp&*TRrQ zAHsW~iy?Vl8e5Ys$Bnwn+m<-zaN&iywZT_ac=N28wl^V+$uad(Mu5J%hqW;}y2i~# z786Fr(QdIejKu)x6mnPi#X3~I#WYPCysoqW_;6?t|2mR1ck1j}SLOsyu0Z$L;|h;H z9-?n-(fBv{bR1v9ppm`3uD9P|J>`(L8@dkR?Cqv6dk!w>yjK&|w>1jbTyA)I2yR@*zcRb$Rue|kb zqv1Qr-0cn)`PLr>qr{RxI+P(nOiA7PLc4Xxs@Jt;kBADVHiJA!NQ1H5RRrKFHBTHO z!u(lBQX_w{jpc;V4=Zhyl2=75dhOH4K21B;lZ?h^=gba<^p-n6#lDq%a;<*wo0mqA z$4-^N_thGQb#aiu+_AFAvl&>U22OgAE(%~a{s(Nh$D|GCI{h_@W;bJYE8D-S$JsbN zE}Wu`#nHETz6L-y{k%!b{TVswjEA-NE{Hn+q`g|$b~1zMBUmpziMaeQS>eU?8{P6X zjT=P74Xkbc#p&>lI04#6j~jf1fj3pa?yK)h4#EHTFaTJ2hubDfUED2OoBnl2by2>p zfXQnspOVfK$w2o>AAnp}{ZRcYo!Wqwu? zqj2t9D5K!p-B<)Wk7t;ezqmh+LvHEE5UnK@v?qrnVJu(3ShgQw_hB%PxOK&y0$F#= z-oB@Ld8dvy7EsFAHZi7HBliNxUBD`X*czT?HlW3O!zg5sTlu4fFY&NSNS$-e4 zX?EU)-b-L;z@AaWdTPm!t#to^-!1=}e zwfMBVe=0I6J~+$njd4P1$9YJwKEOx}@+tqG2ivWXq_{}R#@4ltGXo3nw^ z#I4pK>hO8Mb^dtpzoX;tInpCmRh?-07nrTUDe+(3f2%ZO#ZJ>z$O5Tt!kfj3-gDb; zn0DjF$hVc-{}AGmZ!e~m`v}a(*H2?wk&FK^6chf7A1xF|YMzh}j!GFIC?OX(P4mHI zWA8$IfoabJ&A4j4A}NsZGo_Z&~WxlLfxK~{@~4_m!sX!FW~0EQSI=9_5p^sRxfzL2X+gzi#O$hN^+Rx z`z=c?$NrUr-@PmC)G)F$kQ+wFFHR!=>qx4cI$d*VFV!r2G4lM5`5AOs))7ruwDy`7 z=2sD=SmEW66HUbl#?xc#q4k^6jtNSo&)#Wjdz~a6jK1%&XPwqYA@K(j3YFAMs9dTu zz~5gw55OJsgF}XHl8O_FU+Ye!@d9!_Lk*D@iPg5IsgNCzK|+A5qSrQyRiT$-tcjOe z(tH&_FPG$tSg*2nn0a-+ZgzR_3_vg0@QI&%u>YOAICZe6_c zJ?!1TKZ20-2q0P!;Y1~W?*!5PQvOM+PCno^Rq7<@r5ohoW*4DWr59?&I-pgx-Gd5~ z+L)#pef^JZU@D}5@|PD)`O}Sfr_O%P-|id1CoBke zPS&q3_z7*pI8=In73%Qo;*8G)ODcIR)m5b zb7uu8YpE%mhj0Oc&$=wd11^B2-u>_~8n!W?^F2ARB1X`J0Cw|`JW{U#NGH2b=lmPo zBH`kGcw{max}m4T=5H=cH=o*!xxn^rJRer+MjwEIK+@^DdL)?s)7rqA0+f6p5AK7r z`tJ9t(aAn%*OS*O*nRP7VvD)yR*m3T-$coik#@qo1V;>?>GTr9=fM_GnqH^M5i_AY z{~4;mw3Y8tU<=9`(=0`K>!-eXk2;cSNxMFu_2qz~8NN)Mt_ile-n(+(e)&6}*|r8S7=5jXDGKc)jQtn<3Bnp)~>3M$aw|szem46g8mK2 zSD^S5ka2UNw`UA`_A@hIc{R(9hx_fg?c?<=^hh*beWqJrfv)u?uhQdcn2hl}Lb>GIN)N}cl0(bqYnGpj zoX1*Ad4Ntq$n&RQPdwFB#V&>yC^~|!`ap6ZN3u{?pa(4GpHy=euQD3o`!|e^!lv|j zfb+0S@9R2Jza_u0p+E=5jR|Ejn*64wperwDHtLaR5;kQ5XL5VOU*40q2!spf@mHkJ zI1A(hnxsH~{0vvl^qt2$Ac9^#_LOMKih`-+M_0qut9@5}gtH4P2KdabBDjqwz&z^< zNzmQO%&C7Tm>f)xg*VGt>~u7invf)EvcYw!Ngt#Wm?s@cCS{7))WX&1A}IUSEP5|@ z=U6?X+caL4bF(0SVe}M^4G{iWwmB2Qmzx->^md?iY9SFvXS7KR(sh7l0Nx*@LG|A# zX6_)xG^~^4)9onuc9nH^>!~RBV_nrPZ$fAm`{K*NG!O+!{r!6pwl;-yFpbvPhJ6V- zL7KO+kwH~f5v!(PxW5$OpfDebma*Un4QsWlvA>KoKaK2gP<9aNs( zR5xPfs9q=TOU)by$?vZJdLEh|I&JgHFw%w2b3_cZ`4?*`$$%^%%ttH-u_9Vr(XoyE5rwv13e2u$NTP`Q)#@a*QTgRle#_t)!!v!_OK!|{eqQzUOL_F$3-EL8#)1hs%- z5ZiYunTx*JxA&Gxf^tpsSFn;_3e`I$%uAZq#l4fQ`~fFX$=wiBKw)R<8{Hpbo9q#x z);^B9EYsqRsKq95qVktY0fia0R*+W_B?QoF_JTA&>gN>5e%cPCa)SCbs9k7*#QCq8 zvAx4`jf~%Y?qc-v>F!NKmo5{q)prm8(sT->M3GXctc}Hy&Siu8HmZK;6V?m2DzOc_ z`L-*anJL^ndguYx-8c4OK4|=oq=XKrB$-KAYHhpRB&`;bq#G9_kR3W$xcXirz6ica z!&w=qzDz!?RoEozC(3-2r0Hhbkdsn!?oU$V0Tn3UcPowt#An+-R^w;gmC!{q?%u$v zUZ+6yeWGj>Ho7%UnjubbMqQu7ElzFh~|%sG<>EbBEPRB ztSOsbkUoUxoV;g#Y=(q4+E%t^FIQi{EvcymfoscJzSEdE`&M^WMsux|!z-s}Cw5~E zW=L>^gZ0S<*5~{3jLKum`-?*FHSAdx@hmK0XNJkx6CvEtn{=Mr4Mg~pT(9bSum2oR z2nUCktJY6X#8t4gZX7#2JG6o6=@we|Sak|>EZXLFgp9#sEZzp~EqqOlFNCkBN|Is# z?h%Lq=WIc-F!==fG_CC089qKGmJ^kSg$V{ z!AB&#W$PZ}@jcG}1~vqgxWYUmEOd{V&eQ)G6RxefW;cNJF+Y0tb7}57^UFAzWL!k` zwCoEf(8WS3=f{K_Xtb^h&Th_as>gopqiu?jFfIJO`xHFmuc0R=%Y`%nU<3o509KW4 z%n#ePY42ZEPe4ak6L9wp@xJZD4x~dvea7d>>1_CR>~Y<__pu&(BpKJTwfen<_Ne;4 zuV!&z&u5!#z`KEiK+8ps`P`<;OkJ%D8xv#J3hf@>Xzu-k;v~VnWDb;qqDfg!_{iT{@Lmulkmxab*7<6vVxMO2=8n#)yLZZ50r|K9hT)E0nwys2rhu(& zSp)v~rDk@@PuuSnW8zr_Viz)6;j2EL#Ap6DN(@Mg-VcOGt}EgTl?WkhmG!>n{RMhH zSMx?<=I$a?fd_O5NV`wfMKEzwaBuIEG-TmG(#L|JXk4AH4q2r4tgd(duj+{(3H9`x zDX&qH+@zhk0tLEzJo;47>L?yhz-G`oB>go%;G7%q+~R05__&U>mawkhjgsl3uwXUt zJIgJ;ID}SvXM{=Ps6Q4t0X0O5k9CKf>fVIM9d@ae{xHuDg6zd2+vh;B`eB$)ZYs{f z?&qb(j6~APR|ZE0mzzO@mzjdFyuQc3wq_pF~ z00^iTiaO1(RSrH6x0zHOzlf@J7+?FRDXDKZWXEZ54cZrh)`CDmm^*B9` z6X#iLJb)(FYCgCUPEYhTCiyA{|N&sOM$hionfTKSYRtXzwmUz-|D}Xh3AuM_9Kz=FWq-0M`#;!{;h{*5XIBp*}Q4B z65g&Ko&EMQG>68E5Ea$ADOGsa7XN14hNVFBU`?$R=){lLyvZmZ6J{VA6M;PmAJyoo zXq~z4137GmHBkkT0@Y%CK0Rw-n{K5@eyUw_KHyQZ@g-++%fX=Ryt)L{%^J^an%^Nq3r ziN8_K>*H==+@IbYsByGbkw;msepSM7`%yByP-@=m_P-rnza zy)1|PPky!H+3X57si(giI6T<1awZi#QR`L+Ym)up41 zjio-Yv)&2hlzi@!XX~b$GUNPU=m(6!P+c*Il`=nDoG{|J=DSP$S8h5le^0#i|L)=K zDrQCWkhzgD8J5=vhhg^I2BK8-p5}vTdMTIM+<)j;s(y`0= z*Bd+tKv;w{uNQ!|G$i_CSLl7$!jUWG+Fj2;@3%rHau=n|QQfYBjYvXL+_i3x1O@Zq zG4DOd-DL8};_-n*;Lk$X$YqfV>isA!hx`_&c8bc(!;_JoWT>y7oH<7>JFy4vlsMvc!)qr-N!`02n2dJ23hN~ zf|3f(i>I|!zJ}r8(A0hTbn&^@IY@_@jQs114}h028CPT|iiDYdNL+HzV|Ui+>ajkX zyICvrq$yqb0=KYExqY+2*s0~^w*Yt?KPOi#pahSbmzHcUXwgCAas%{zVE!itVe^tj zRyCV@@#=X8hauLrH-M)Bhn(ks9098!)p>B4R7!|s94Vx;Z^Yx zpHKKw|5Ssjt2v3G4YudamirS_QvN&cOpFAYL_V;}lxBv%w{Adizt7l!k_+fg9=bb5 z@vhEolWKk8y?7#Lqvq%@!?U*lP=dDjO; ztD~)A^JMV_ViJ_d%`HGS{DGlGzL=IlPVNPuqJ0{hWyYQzI(qh4>lAAS%7A^+XI6D6`aKBP!~kpi^T#D| z3EZp0VEzxmS`wV~I(Awn-PX7Y>zMAbqPA^EsIkX&U3v3=qoJCamogG5`KV3v4}liZ zLXF0{b%T8}YFBj|F-1~NhCqI{dswGsq zF3T?dE0CwOcKmz?$ux#C+WHPc_ zX&}4}w6keiiV+XEb7yLDVKguLMGmT1WM>Y=oZ&v>cnBI42)`=XOuLU$1N8NYsHXKDYx{?z??Fjg{r4o0I$O1^cTLF)FasWp0>nkCf z)}RO0sfBIa=E(mggtPmtBn&`eF#&FxP_&KockAICD1qw;_yrA#E7-CjYKL3KJm zXq8YOSzEWi{aBIkt@4obnDl@%E!5$X1SmLmkPuB$%f56SDOCVbuhJyPt1=$HRcxy9 z=DdovO^1x3EYzduN(?eg%5QKqwFeQMwl1uq)(Sd{c8OtC0MU+p!Mb$}8ok~28GH#0 za1}Gi1qGs^Rt>NR0lEHjh=)V#+?pP^xA2|sj<4*%=mnIW^uz@(+cx>k>-#-=qxzwS zR{*#m-u~ql8^l8~N|69;qP7foB zuNL^Pm^%X}J_!hXwqwU{~)AhI@_{*4x|xN|cW3E2hh6%dLX zG^(3L-_%4%ef*`aBrR>^Bt!D)scNxkFU<^q+xguTRC`Vg`~0m5eN3_Pu8Dy}`>75a z3m#8P&|#E5A2}s4O>~Q4(oC?~vDM!Ovd?d|_OR|}P-<^7uBO+`TNJ4$AE)s+%0IVS z1)}O?xCB6ONPEl^R}x`AKqv_|DJ+{EqKUsF55uuhiJ*Wd!&sjvGRIYUDw#f>93M~2<8pQEO-^1=RJAEm} z!*c;=wm(TmX&bR_rLU^1g?$@U$?is+j9xhpDa$~kMn~w9@a&D{EkFMzbN_x#%?C8| zHj9PgfpK~4Bfr`gl$2U0=L$&Q0eR5d>VioX{sx=~0&zc!-F3x-ccNm0sj)I`2{`vN zaPDaC??{fa9%dI`=Ae3B!g#3Nf~<_Q zHT#QsF&0>PN9`i)o90ENkLSFqSu(CDucvV?O(*7n3Yq&=TSJ{iY+4tf=o$c#)EbUV-y zZqgFRHTKH$ShmJpIl1Zg{-6ccl^w||^5~%kb=eJIi1BZQSJruZ;%n_#1E*V)-UUi= z6geER@lS(ax=x#QI03<=+(qlMlS`22emCdA-A0*|hbS(sEt?8+GlLUj)GM!&j&{zZ^4L{ z&x#OzGeEYO`f!2_VY8w&*}RTwwB$f38KS>byx5 z!>Mo~7|7K@$R8J`O7$pj175?kt<&R?!`5PqTcW-yXOY7|m_w%ckj8gP(`ukO40P77 zXz#sS{^iu(=h*J7?NB4@iK$2dsEECmx9Bp+L0$~DfMXhQ`s^G@t0&oX)4$pbLQYS5 z$n%q%RU(x2vb_ZijiVodRw9aZf33Bu@hDScSn}(GcP*lyLCxTeXNSy-Nt1<7l(6G70*v;*{p^K_2#I>sDnr0AiRbY-et(Jc}H(pPC~!K_^- zJ?p#BYc`OGR0U!QcY-To_2Wyj^BrtJW4zQU(finI_BwulD<(waA>a$8i}@Legq_`s#)KK6+FB)12eNZTMkF z^NrmvCD|sXpJczQo21Mpf{|)^KSJ~Bo^6)oVcEM1Em2WCuIe}I^#iR zMGoH)sqtymC9Kxc{H!@izi4A-Ev(-(#l$`2qku^SBQw%@n$8cmTJq+2VrUjBp!(|u zic9Fesp6T_!7L>}O23f*Slrur`B*OMV!#6ce+5MIhozCS)!%-9#g(CdhHLM!dJ`Vq zrkz$FO;pzzbXrrfE}1Sx8x9UI4t%1N5KTPxGHL|eE5B@X8|&^+I}PLl1sYXUPUKHM z$F)N`@ScHCK2ov>wEBK{Tw()blDpUGuoTiE;|e9>3p1Lp3#^kvPrkZoJcuu>-E`I9 z>EBbHag=3!U>^bq)6H+Om9Y8vEhb1hXd!~U;ptI^f~EZ|2)m^k6u2P)47Q@$LZU{< z=r{pAO8sh_(7WL~9$Tj~e-lF!pDI(Y-l8(710)B;3eiW(cU6;&k(G4R|#(Sgzm*#@ZKn?{UcX9GmX!{Yl!B)Yvpg zOx|&TEN(#LA*T@$9Hb6PC|TVBxyopVvIdKFwlIp>MYFP{t?NRPbc5^bn(wsNH#t4X zS4YT9D@LWRC41LZ&&V_zo15QKW|n&|j_JPw3ZmU8{+IBRxxT|G0Oxz8*bxZvXsEKEJY1+ye z&2pHQNNyOFfqLptn47v$;>O3_@0)TyS#O$uS#AHykkAh7Q8*$>nI9#P^yJ_P))YDF zSNnmtu+Ueo!Bk#ScHHk@`vR!9a)a#%;?O#O&q@S2^1%^EW+7J3e7uVa*b39|eIIm8 zY=PD_DZ6@aFfau#fla>RksPsa>^tJ^&Mq*r0-ieA(>>}xZC1W<$$1a!_Tz$_q$YlO z0%xg(UA*u&k%5m^)u3Ht0_g9;KjyyQ-W4<6!080dXlo_#`dv+0BJS%JT<|7?sAV=I zY#(l~*`0NHlRei1`we24MC)DIzTQye^U(48kCpnzDqM=+2W_#B3Y~J6pYQI7`sKqw zchPRC`qeOxe0`q}BzSHMUO!|RGCifDr|%2^O;;0h<3#f>;=>LgiuXHil(qDg1~0d3 zp+?D1s-;1Ku)5*5o(A`tlSI(x$Wd??D zYovX9-Nb+S1=;gB(hGVGrkJg-rT6+g>_aftN(da#vG#~-X&zKHqSRC1en@!oXUzjp zQ$jb`xVM5b67{=~)+XG~cfe1P&Kb$T(6v<$AA(zn*p6T0X$NO}uFwy@wyfqYtx>m* zEkuK@IRd`dkeADQk2SDh{lQlFk=u}&@MaQE1MdOhAciJ>qMM0$_jLJV!wg$d>YdFb zk4cMSO~Lb!=#b1DTgUsfM{sdg)BXw}2#Ke;^B)j|x|&c3{Tcl!{8zMG%gdP(05@%_ z3w-yQ%hP|Ud0=O5S12Z7V^K_5M@oxiLTb0(7%I=F;NTwfiZZV-oXe>gldt_VcuuSx zT!TZ4;8Ln)UwQ+}B{!-xCv66J)Tc*C{ip4HL1pkqQKpa5xt+oe++>+X?roN}Ae?t# z)!FH8ThBv@BhAf$mv+Wb+n20u%{H< zfWJ1i?u)JKJk|-yLK33q4YsL@o(_b68gVjt4X39m^%Vpbi%Xx_IO9mF=cixpC7ki{ zs_&i1h+0035SQxz!nNwED_+r)%BK+_wvnbUOp?ZHASNusIxMvus*BO9oa|rHJ_>$2 z9{@2F&Y6~|4Q7Gh&VvXV5D2i#+R-{A5^&wd{L(r1+OD-l!dis8zu%UyP+6|`SbYhG z902cb3_Sjg8H5 zfNVpkYAco`J&f)*hnv3nJ?jmf+0oH$wV#5?rQ~vN_rxY{th25+;9dVBp^fDk>2H){ z6_Tg_r=2p8GQBxIVd;-bxOtZ%An@imNT4rzc(FmaoLZ{B3Z^JNlb=$13c?9#S6cxF z-sr(QzHDnLx6XP7hi@tcr9oIb{{7_d!6T5Dt&iPfm@l^XeD;yOdL=i5%tf|6GJC5U zzHoL@u%N=S4nLiI6I0A~dJ2o=Gqe0H@a2o&{YtDcycp%=TX#Q z*KWv*yw8W$^52s3-md>@2|BAWf&l&y>Gi-t4*43ad7$@nkuJx=j596|>si`>T{as} zaUL(w{sBnlrWIKIYS6CR3H*Hj{GwwXxt!pY_+9nUe}&=k7M9*A5740I74JJC`SH$WfVwTSTl zem}bH{cd@9lfPd^y{Y}fDQKForvje7mX(iy`^T%9{RI0{; zpQV0sMb$#1?FP1RjIPuZwN{n9?_WGQky-*jo}LLo7Q$b#K+b&vDJzaGR=b{I_0H$; ziLascz2H6}R4D{ph|4w)geLy(YEA$PYK1WGTsUStqsjnRz|;V099{YNzG{{%+rLT0 zN9A^J#&93=H0TCjlWn`bPM@y{tU_$RG<=Ma&ym ztr8kY^S}6;-C2UCgv;v9a)ti6&o3?iL?xr4;UQpC&aC!=A<3d z>eJ1oTh~8zBQ8s3(IQgMk zOaN@9Wd6H1C8Q(r;EdF=swmH+i?1Y^GD1jd&yaxawtMXRtKbl>D8O5e#_B)quz8%# zQsnYM1Mj#w&O3Dq)qfa1InB}VG^kY%$jdOkq919tauSoat*yylIhN@&ey(uBa za4yY)gx2{jls`POY7yd|`+xLZGYM2$Lx!X>_yl3alwd)WrCZ=Y@w35&_){Ps? zkOy}GIte-VM$P^})g_~4Hlwrc9m|uBnp~esB&^?X$=8Ih>dd(Y5+hDImh?J9J&%$-d2wEDN+~M8KIuRu>Ngm=ug=n zX@b2HDL>Uo-j6sq`i;g_d+8<5OX6=9xW$BIytjnYGLLiy8RHjL+-OEADIaCe)Y*KP z^7qv_+*tp1UT?f%s_sTfAFPe$EVdO{Z zk%L?S?Us-SxY|~1*WyVtGGY^$Z4ozixeQU->H4~F|*y{|Ro_kaJbyS}XcntDNa zh%w9iS26*M>-8Uk+k{H4(dM{UUfZzJ;AT=cw3wBA%bV0@HJV)|`Eu^3M(xO^V~l%> zjMks*0!`-5n})jbYJQ53Kg#EtAs=@p3;Um(rkK>-fJjS$Q~QVEK?z;}cDQA&vyw#c zJww!;wBI`+!p{1&eBN&>H$&-%f75v`*9+m&Rx!tcm9cehe^mY+^eYY%j^&SjS+}13 zRVu>xBQnWRdpGj8d4&zwMuJR=J6DokQ%Ohdub%^%HO^!_w;XR0Qjhc?__~T5o+uIK zut#S{<_%1z@%~3!1DoijA`ygiKTRY3cWiIht;0*!sYTf3?s%bnmFfPad+*nFlQ#Pg z6_*kt{D@@Gl{Fj&+H3?5#8(46X<5HGbQV7>0{P(s7D``obBR<@Ma$Bj?l@sYC#3#< z@VBObTL(LR&ZZAao&Gefug8KlLEW{tICP#Re?F{rFdg{5fmZ>8S=dK?Qia~T zf5L6svF3Vs_Ma`0FbTRM8U{{JINZgJH5PfGiLG$v4-Sutbf57`PQ+@x6O58K-&WQG zBdQ_Q(N)jZ&x!DWE%7#?u@ zG@pmQWVo7pUnVg(a6<2MqREzHuuc+=SU;mT2>HPmmqX?x06vs-X!E@=c?{As`x9BJ zQUSWYo_f^zJXR(Nr|_=UNUxak`|kxCIN#Klx+vHBUxtY|j=@G_Y=OoLeQqE4+Vxl1 z@1qp2fUqsZNktA_f8-*_iFd~%^v}W0S^weesN0dsKt2cgH>}U7OoFs>CbthM- zv)HG%4tf#4?rrCl--U_Q5@!vqSeZ`6w(KG>NWwKW-$4H;OKZZYDrH90A zZ9;0ltY1G|^}$GlQ`k=|st0kj=gIjs$-yeGQGFmh(}6)T*Q8HdpzAXfOMONkR*kAn ze9_?g5qlfpF??)=u8;X?EY_bg&nR%d_Py7mjx$b5ksn|OX*T^Tw)bu6D?y~mHclaz z3Dq{FXdZh^zP+rmbFR1AxS3J4?l7v#A3_UZ;ss+}pG+7xq;b9aH_rIccbtP@h}R`y zcC$(m(rdM;S3a4GxHbH`$8h_P^1~6auXx8kt52-2E?22y_TM5bo;O39NCgbsl}(nv zl8B*nx;`c?*@FRmVNlgXSe$deMCSI6M zPn`V@E~0JXJ5KPbP=tJ{9XA1eb_Ase2wgc?b6g#vz+C~Ndug-Bvc5j*Q-1rg5&T7r zh+y_Z$1zzGYO!cZXasx;J5=lAm}{S;PZxe zQ4$!=G?iEx)-prfV8N&Q_ZWTlGJ02CY?5$)&VGny!d`nAo!<$OZgTudc*wlwaSkF5 zcq)*k>7Pbnn|w1F90dcgm)%oq+*9veG*t19Hu=&Ifv>b(^W;b7J*8%(InIn>qH#wq z3VggvYv)8*NDG$oK;y`4N&z-x7nb>KXGzVTPh7uL-0aLTU-$gU(y|g;4j-Oy0~&~@ zB}cK`xZ%~%uz)D#mUGhE@K|fOGfeTyjPx0Q{M47T@}ZgT+F2;l+V-oI9l>s&BHj8ZEe%ESm?43y( zeWh$-XWBW}Br{swBq;x<2bO=9E9pl_o63#QQZ@0r&7RXq27PCGZTrAoDl{i97t<_P zVYB&TT*|56JZO@9dz)DGi4te!^3#}D++4X9TV0o4$pc;$3qEf^>A~^y_6wd#sD1vb zxb`|zFX$nrxbf7UfsQ@OIDByb<7(@MasP7y>wDP~wbtvj&#)ah#0gr=7aV(5DtdgjQ*N928(T{f!~g$75TGV(<<^-P8EV! zCxS0^ZEBn;+xk^t^^LdwRg$K1bYM|Z&Xcz9l<~XxE)gjGnkqurfbehk9*!wxPtnng z=?X)fNOK%eIuakbnVa{G%o4vHIx9k`R#XCky!(J2d;k1F%6PunK076fFf6v;-Lo%E1xi3@_;BpH6oTZ#YxYuWb4h+mt6lqDx|ugRicsxB0`!C z=@_@_i%RX(p02p@dbY&d`r@B673<}~Pca+2*-Ydp*Ojyom?{z3xMu+AlYB1(VF%s) z;8(}HrNk?3Dl4IsAJy*uF0_#@aw=79o+|hx{q)Ym@4{_!K?E~>h6(@vKnZDAk8_wx zMzqo0`6&PG&bCUBSS9=$M0{zkc-(F@qq39$Yh4vEnEI9*a<*mNSmS>aSn^%k=}W5d zY}$9+n%M*k0cU(B)YEwFWiD--(LroMHPXU)GhFMpCeX=vMw*T%@G=+wqJi6Opz~B= zrzu3~F<+>`*Hq!|{e)}Asl|bxJlsc~UQFjGh_X;|(P#zR`_wt#OzWMVp5mppAu=?w zvCy5124=A}oaAfU`rqYxm zI8>#H3P=e71u01&bOl6eKp>$>4J5P>1VZjU{O<4G&wam-e;#S#au(y1YL>cs3iLy007)SS?xQuE!xCvCi3&iIfI_cNzIBzjVsuJGDgT5h`q zrfiYOizE(b{jz3aWP|3C_}511$>?_8xx?4M&~otZx^PX6fRd{Fhp2xDmT?`$%9KZ+ zP(8~TJpFojJr+&PISXr6al9WD>^r&XmCK6`{3~J#E@vJ&P%-ve)G1g!t!z z^a+?)dzj@`Iwf(qB}QwUzvNvd z?AmGCG^h_esbROcTFFF=(~-8u`ONEfN$Z5fr!y0w&Cf1n@?V!{$<_z{p2? z%aaWNb7c{;fuH^$i%4kee+rA|Iw3yOoXLk3tvN=`Xt#QE`A+ddkmFCY8bvQ1Z6!$o zuC_xoP8_w=l5Kq^iMeDcU|!wDYvy?T+@YR2?60!pu3_*$Vf<6l7%8tnTD_|^iwbDB z!Gf>+^_RSD=q7%w)%2nuDsimIDo@Wq2`m2C!{J;&XM^>gOQ7&~AtCvd5S!rnmZq`7 zs;#8P)n0$bJWzhA+N8ATilLs4V)lsAywhsd>5CV21P&LOt7WrJkr+o?y7P%A#+L?q z7%Z^RPew%*UVjR)d<0^frK8^}Ch#_1)RFZtNtPiB|F^bGKdJEE-r4Ta^>yS(?Sxe} zU|W~Ys?F=u&26l9^FH|8aO=kJJpt1}+kr zCnpxNuq&JOUyOc#^FoN0&Y&uK{~&?=Ac_3)pV<7^o`f&y&93pc%qs-l4tcv@#7RCb z`@Hp?CY>9+vj4*OoXFg@O2ltGIrcEAcjtO$a)bT0d5m-{8|!qad^=%2MABWVQfB&d zu|mZP11}ZPo$qOp)AiJoCf-Qmdei|pQ_&N;eFTN1ws}U!cZUz_+dZ6|5i(TxXjqks zL#SuRj59>FL#RF*1H3#ZZp~k}R zB?SXo3Btq*RoZcxw5h6ALiC!KN|pWj9D`a_t&-*+Eu->|tj(LOCTO&Z{hNAHqg7o) zLlCX|eEbr}F;$0W6tjCCWS->DgF>81S9^A}XTyWpuZVdc4t_M>p!y?tQ)Y?(CR;J) z&~o{^=bArE*utEVPd)ZMO6k77^x*SStSmiZ&`YQVPy1zm>&Nbqjaf-b(g-pGb9%?l z`5%G0yw3_x&doOh*kvtZl14+uEa^EF!snZwv&R9cIce>(f0>)*ZDr?}q(u1p_W_dz zEtx5(MO&2LsrH`==3`+?pTsf^^r{!9gN^0H`x{lOCcXR^pm@h89a7;=qU<`i&c+Qe zqVvrYY8K8Lo~EC>JYB56YC5$(iB3+s(gX^AVrqR{nddf?5uVR#OuTYPyF4r`{-7%m zi|Q0CdLw z2~o8vkIpUk=z%{w%3_5D6l08x?c^>QB$FPtNvVIIMTydk5-oh#SXlIdam@1aJX_LY z#m>R@sgU z9!hgZsJ(eoZPh+;5BgR(vqyyepTRD#qJxHpnRs;MJ}5d;`2#xsQ;U=iwh8-jiE&rq zjo>cJqgt=yj8MnTN7!@rXN-Hi*?^6tvWh%7w+j&6-stp2BH{~tM5Z%oytEVjh8f;@ zUTn+j>y!UhUnzGvn=YaD|NMMuYT<0GzOTV|VLt3EF8>KKENo>7siKop?ai$bQLZF> z`d1=Xnaf#0s4yF^3|$T1N$0*%*P}_k+25uTts?1nicj)=aIGkmip6f6VcT7M%l-J^ zeH@|pY3-NN#ZPB;^_=m{whwlBrd;^=NP-e4LAl!jZzX4ab#-UGCzfUeHIABmesD$w zQ*XWQxhr*#K23Qa);W5_l^rD+b?mlO;4uS_aO6T*JLBSyyVmugleF1;xLd!2z~#M! z?mTK7#l6WD5)2}L6|UZ4`Yw?;Hs&h6trW(PLGK(xXp?V=K>cH5;o0+D z;uY0TYBosm-xnqmeJkEMB%C0fdBGvXv;StE-mn$s@4om2G_hb&IR#yZ<18*KR^F1M zQs8m1uv3#|Fm-09_;D1*A};6Yj93-GGuudF$ zx2z%QxaM)&;SoJFAu_B$W;5EUm}*8bBG1dDk2UU)?viB$LY_X59oTXFxgw5Mn6MJM zEUphKQZpofGLQWprgeQ+yy&F2TA2TB=F=ZEPK!8K^)1Py%7>^s;#l9QWMqsLY{?la zzrrg41)a%}q``0tsjOa=uGA~V*xQPw}PeW$Ec}_XsZ-Kt60O&gp8K7Vi!Ff?UOZE zQ9jHciiYCYwPYU{(_(30AWwe6%Rn8}f^iMkN7DOleGJJ zUnJZC`_7<)Dg&oLz(pXo`xmHvh^1H9 z5%UTH(3d^4cLawn-H>%dyK)Pn+S;@Q%NTyEu`G2FFz6}ZM7*tgfIgjm#qXYuwy9kA z84w&n!b%Nar5C$c>uAe$(RY)K=(aBP+R_M3oRUwr76L-@Ll3f?DFoDlml-$~&`S9j z+Xvl{Et_{jr0ztgwyenXVnbuF)^3H5I#D8fUH;27$UU*V)W>sNi@fCh?%$TQ8qINf zeM@*)gd;b30tZue#R7E}sIIJ!x;$O+kNan9N7(vr9-Hzlhuf@DflC3TkiN!wa8ZYW zlo2VdtysNzyO{6gEti11{WylZNPDqC=8Hrt)>x&2o8gTgGLLD^7b;ksOP7~KFnpqK zZ3vBle$)d%oVk?sjKYTFjWu9FU$e9VG3&dJeuh!ndF=Ka?+4}SN$ol4O<4wdZWLbp z@o@(|IsEd%c=0caz(^eB}N;^h{qQV zP!Tm&4dS4Dkq_9?y$IS{FeVp4pRHcfZiw2VHUbIYL*1!!P5@HSd68516FYMbyk88L=0@SM?RU0KMKB zpW}tyn5IYU^wi`U%_@rT>Ssx8x$mX;m~-90acm9DjwNy;Vh{HogRi!?v2kM?%7!m4 zd^^VS9zY|C(L>vzA7yF8$862;LH!~mUPx5dRo#O^OL-6MV&_Q_n;pSW@T~D&lDX&e=^^b9}woYL+JN}bd};E zkY$`?DG@X9`dE_Bet1SE279{Xw5j891vvp!-mkaxN^~gvlJaf#;Mewf$K)+lt0L%I z_DnB5S5%)7XmPK23q*$TnZ{Sd48#0BOM~=!)|7JUd)pr`#Wve7;8t5R>@c=%>F9~= zjfnlnDvySE_%*&Mc$fj*r0?&-q!a@`_OQvG#y`U=}@4Qp|GZ zFS9GglIyd(D@Asm@OXmTt7bDJ&eEZ}G@qU!p~xKI#i-angGUA3o)y*AIY-}Y@D)+V z4e@XR|ESjC5Y+(;>&xLOt?_wJ)q_}W5eZg413?4$3OgOl%Uy+!BZL%UjQWTlqZ4Pw z78k>&HthC$EG?p_%*`LR^@5M33TR8abNg#bcFd~5UAR9>ju80~>Q*=`wZ?0Z;(!EI zI%lBZo)K8D7IxWib*}hFYNw*^EH0_#P65A}6Rb>Qt=m1vdO~p}mjqFMzV~$Sdj~#j z^*-@?$;QuNJ2 zS$v*pSPLZh!?=zYgLRY?y2-<4Py2T3hl3Uci0doR;puU*TsxgTD;qmK6~QaW{2Za? z<3-+z%^%YIAJ~KHPwr8z$ z45(M9qm0-LbwLxbd<~Kv;m=U^lS)tnhbroK$LE5#0@R+F9^w z2z$2^BTQhEXvF+6?Whvi*6)*dSt}J2Nc86I}!^HaCyhdp%q(UQ+~%9(*BX`&0E*|+ z_peEXY`!bjiPhnRS|6nkGIExpCq>}SAolct8|n1g76F13SL+(4+Vhwju#Q@zB4))2 zacpptW#itPFB;pLTevXxHAqFBF@V&W}*cgI#gn0 z&z`&8FKO1~RWCb&^L}{t3Rt6hplzm$W@(D3j1g6a zl50Mm?-JEkHLN=LYDh93QQJzRmJ1R$r5!MaY4=O+eZp?sKP#_s)dwjXPnZh@GH9#! z^%8@#?STrH@6^JO$hjJYFT>ik5{a#4meT;p&QcA)v#lPAe+UQ83oMDk%L| zXFOu_&ghG?FO>p`Hk@WqY1n^mtwWJ_`NEfg-S_$a1Ljqi*9<0(-6e)hDT~!SI306P zSblK1xBePYf4xrnZVUHVMhkw8CzK?^0;$K^GcFqz86hUF?XTu0LQclPkDYjz4GezA z)3x1aCAqWXQ5<|chz)*kIl-3Kfp>KY)6=Y{e-u$1&_#&L;1NEvBP{lIkQu(arVuut z_)bsr`JGzT6Ty9!HnvsmePR+H4Q{E07qoYFE)AtY*PIG`4PhxZ3@|)Joc1j3-*p;# zbLLss@}F7hHeAiUsiRE`r|jmwTtmuF-~t}0M;(ZIFe!~?=humr*vsQUQ?vZs_i zRk(3%oK59jB(hZV+kAUaMUA zHfw7U^yGc;WY480$_rFcYI%q7M%6}|FEzDD-3nM4_&Ud_r@cA$_^fjx$FeJ*z;d*7 zw5^4SjjEr5oKltd>7dk9Q34pc^Z(k@ZxBjvQ@?-G8x~Bb+EB}EY$Eo$Ccf(~w1+>-@M(IFc|xIf+VJ#Wb~urJ!Atx^x{KNTPx5ke?|;2sZec5 z?YB&rT5-H+OUBZtX+95#iOCca=i2o9kfQ17HpM%%`e(J<_A34*bfxaIlZhb0o?4^H zd8?v7d}k)w{n{bRLQ8LIOe%c^??5Q+s+Qdk$5aQ*Tjut2@tKm4n*1PR zT&dEhoCf;l;3(?K?z?Uo;q9KrbU@rftoy@0+Jy+ z_&{#!z!-PFHcCja?%pw35bUb)qcyWp8?ZsCnD*47{G{ywxHorR_OExgL-$JM%09co^AV>GB4t#T0 z%}73Xq`tED0mHWh4^tC$^oT87@``#bBN%HSUYYAK?>l`UH^4k_7U!O86}rUUXH`CN z{VPdYp{p-&GcV*VbswQW{WYwytR60Krl_HK80!JNN{Qto#Dk3L;R*0vA67wzJMGNT zhT;%~?i)0TmnAMLZtB{G?4{5x9IPE<53eE~b$w(}E?$jv@KCC1Q3B>9r;Z(7RPc=O z>f_+J8imOf{k1JNEL@?i%$v?db(dZZbDIBiw2?WQ<|n0=r4_2to=O&bX>F)v+GKr9}yD z>8gtYISNt=9%NF8ef98!Xo$^cBb$-*$Ae9(AOTppbTWu)Rb|@Jb3>UIq%A;91V8=_ zSIk2SnWPEN)NuznKfo!*Y%S4EI}>NvK546CIfS%FfkD%J@1FIb5USuu)QQm(1a!1z zgts2<8|kE+N0xz3OYgI4S#yoY-~u>jjUzz`fC>~s=}r_|)~NDbBRiZ9KixW*O&a)V zkt9==ri2}`toKJL8P&t7_7o+>0UL7eyP+OcQEyru_wZvS`m62R zzZJFL?}o$=rN%iY4NR!U$HlzjAQ&j(FerrVf7hw(aj(Ew;qG~~yQ@C6fA4udD#-U) zQy-GY+uEF)&mT0fS$q=^L2a#%-%YTt2m*32KWLvG!rp-XU-D|x&7E09&2538Hu4$GwcS@m9pu}|t-;vo1H+G*v~EASGOo7 zEuo`NmY6B0N>e7p{WKR)&C7|OcIR%5O#%I-cnt7y(GukPRG%H7Yf(hi9d3_Yn}3g# zYUeX-B7`8~qdD@k2lp%dDwaU>&vjz}H)9>$d*$5I=_79EcR-vqlE)6`O;ZeiHaaxB zbYRbg9L0f^A$Uj8DK<>7BP<;k-uGFX*4*HSz<9&m;ZAR3YwkL53sf?4?0%6+15RcY6d z?60uvw-msVhR~APmG<;dW3XiUIfv}<#GIXI#xJj7!s$i~Be~7-dF99EpDAYCgP2e! z_tn7G)SjLr)Tp7zt$>he24-f2yrAzeC927oilCc)6^l8J4`a5=y3T8Q&sBPgx$ zb^RfZj^R=lmC2p_S(_`oxp>eM$e7&wuKJXQK+lsqhSbNE0D1&cH;i+aAHNrGAyjuX zZW4zf=eq$C=8)1fT3Z-Ee-U!>z0|&1o!q`nV;mbr*`Dq4TZx3**>Ws9b^qgzD#$KXRCaMaaeGVZuIXAM%#ffrZf0tdO+JRG#~@I(KJ)rU^-i4vY`zI`F=`A8 zJ0H`=Z!0{InY5*$ASfSohbv+3Eka?^Wc@$ z0Hzg8e|$Dw@@GSsz`DW13)Ke!uT9Il6|}HvZx^{;Sp0E^jqT8WF$$k9#EUTmHy%P3{h3bcf0- zFZbM?2CxrQ{FE^J!r68=XyLrFn{h=*BT_1G;=(uhRY!~H_fDy+b9P;leNAKKl%2=4 zwckX(;Aij}gZ#6C%^w`QNE_6s^!K*6GTDlErtU6>eBKpm*Z&j=mp)EaUk1ML-Dp}* zh=MIo$B-p^%BP_?V3V@+r~@8}MQ(z7&A&3X(kn0TX=bZ;VVoG8i!(IBMZi22%vH&$>Hub5DJ%ZJn<|C*hb zWT~0XmG~7|qIx(DFY_h71>$RCv`x>Mub4A)xOkZP7A#)Ij0AqchM7C9} zuAHP%yv!7$R)gFZdoB%eI2*&Aem(oVMAoQvS)p{`Kru?Dy^c1ZW~!^ZloMRZ`UDpb zf_&+CNXpmQheBm5AW3J3HnytRT3laQBfTH5Ry_sp0ingc8!E-dQ7~{?5SvHTg}@4{ zL<)6i&A*k$0lYF#z}=)5Q{!@;rk^;M4F8j_R@Rc3_UR|(M8wo9p9{rC0k`0XSXuDFAPQt}r>jF2bzpa7AD%Wv z6o4d;|8Mf@_;7jn@q01vU+{1$sOaX0p596DlO)ETLnP;AzxI2{V$QvLJIFIs&}0>RmNoIA|2O#P{NwD|UL z6lQ)v16O(uWy~F_nQBG%Hsj~p3*IC!{t8feD3{C5MX+U%uGNl}UK>d}W7AhbG*#nY zm2hZ++^fag=<)513=$Y0aScFWp1cZb{!qNvS#O8ZX!NtMr44AJ@@#+RwkOadXqxaw zN>o$jr8)`HzHB5?N4o$ALLmPr56-pc1TlRpd+9sCrch3;z7{@y)Lp%;=@4~w*DhSs zkWPi~ViA>cm>F|vpjN`koTzFS-Gt*+G?1S>U;0-S6H^cM|GZ0EC+eD&2w??9&I-2O zU5G%#r5_soBn##)`>$ZRr+-_ zv~pmS6H2u|Tmqzj6H+@yL}ToqDw+=jR@*D6#vXSUzZ0VEw(4`8^Z?MMjABz0?7o|F zV!tG!M8AFxoW_%y=YUGx^Pf8YbmPe$3AXEW)uXnXo~06(0|n_8lAuFz`11lbI?jvi zz3)+5?liyq;WI-FO1B7u(%vVp9$1)4b+t+(Cbj|c7j?8JAv$`NJc~;-NbC91@~Xfr ze5Z$DS7Rt;ofI~lZnFBOku~1Yj}MD;9rpA0)~YrS|2s8r)5fl~eQR~jmC#%B+zUPZ zHrt2k6~1g9RRuCX)^~4Zz4a7VYf|0&FeMH4Rk3Q3@Kk?L^+4F`0Y7s zN-qYj?nyksSG{37tUXet?huA&xS`R)A?rxoFv{H*XhpGu@AUJ@cwo(uQfZqy>t7H5 zQMea~TkFwPFwT%RIvz2y+i)k}=xD=4g0D+H3EA-dqmBhlQkL^bLfa8AQz{~u>7Wo^ z9v-NwY|Os6!RYYy#T?FGwi1J#Q1UXQWPteW_^Xgr^#OZ4X79F&o^7@%V{$%T61%$& z1=e2b0Fv8vD?n+=%`_)1HGS{~^jj{ehudXh|Fzo)N3SWj z@s6=d2c6?RLu|qr+1&^Ixs7~((LZdFwyeVJACHF(CBoKi?^D>-BU1mMcH2-L@hqnG_*(xy2s_^>s=$0UtKFhPYTwI^41L=2t8_iGggAs8rrEPxjeo;kqq4F)Go%E;ZvLZW4@q>^P zeFG%dRQ}B=9U($5p5r*4rsI__b}c!E}BtI7xm zc39NfE9Op@02i&zMW#?P_ViLYGd7tLs=PhY1a9>|VQiO#m8;2!2+M#Pj?01t>KK*=+5fION1DR%k%@yd+qb!5=(!(!EJNB z@ws7-ef8QY%WuZXzoK<}cR8O@Y*Fy)0#-efxJ4+0pvDI(916e2XT;)D*sXO)4Cob-j`HE%_ z2cds1NAXf+tz_YZW-%DM!y*E~RFw@l*BDRvRE-Mws8jm0cz$o+MgK^%JmB}mwOzw! z3zf~DAi2Ikwe9Mz1legn|G(S4RYvw%mh)zAUZm-_&T*5@&{o^|j|r8TpwD~i`#-C> z#J_4P9RWq-+aan+G|CepqPQ~e;>U0>A8WPk)=A&KFpcbI6NtH_5+4{bPr~cGNd{Z9 zaw0Oq=%kzlE6bB(5ODB&$}wp~3&nV``JpP1EGAjcQS?<)XM=*+nzVG&-J}ij61V=a zfvLhIO1(pCWC^gq+e(NFXHtC?jmJw}o~JNNb!B0tYIWnP^726cq?{}2YsqrF!YfCA zHjf%}u-qzyyXz7N8B~i;03gBzVG~50E9Gv+#9fKXzWa3ySeRx~t)u)@ZMp-3hQG$E?yCwsVfRDSQ4`=X{BIJ-hO+oONo;}6&aLC}&0SD1LPsVukNOGKjN0(n|F1VImM`;)B5?C7rKwmlBKAThMW>L{lm=(t*PK# zyBv2S9>sHXNqKUbDi1b-gZU4N_wn6XzyNUP-)7lbc+s1is{}U@E%qN^R?ZaUaEwM| zOTTcc*a-HW`lJmU*UhUAJ$?fU+ z=Bin`@;NF=OeN28?SO}%G^9(R@Kr`^@fghJYINr_Y-^c@j4Js}3`A|^#u1b)hEN4> z^K^k?VB5lI{L;$y-~VSj0}q?y1Ib^!c*K5yPFMnhcET!^+xIe~ZPm3+vnFkhTOIJg z!5$y@9i1m@y$_ko6;`{fWN6RFxQWD3HXJM;Y`ZZXtoQXYU#Q896OR`Yn#O|ZvjFAD zA_9VhEZsS-z`LhYdh7Dv#N5*>h=qU5mBOsv&Wy&^mSgF@j7=zor<@DEBU9CP%`r2^ z_$U^HUroMRqFr5>`|f;bSK$(8bEHeiry#-g{(8#Im50B>q2)msibeT>Y<yOxbaLnheQQfFjRh(4WrXdP#4u&Yi}|vu6pi%uQCL-yef6zX3G=V-?4ebLh6lpnn#NKU8C&+}~^pzzanU+@uvz zJ?Y668h}k`7tOTYVtX0?&YFvF6-qrS-usb!jxXIAl#t9u2Le1~>kIl!Db!UH``$Re?Z9@ucd3tBXW zAQZwt57s}`u~2qSwXkY5Lf$r9ty@nZnSPj*f7Bf%3FT$vL74tYor#<+=YV3V1gXv3 zT3n^l#})I=;bu@sg3$r&^!346L-^!5Q|rtJcq^}%)Xu5-Qu=E9`i(=>UcYMHq!#WLwE*xsH3Zimr4oBZA(F-nS4&H?#T~p6TODC*eD21b#)}fQ19SY;x zWV`f1Nrp~MC=`(Qhq`AeKftkF_6)ze9%MwGLLDaESI6dq-t6ZsOQ)XKi)KX*V1g@0 z`?Vd?9ckGu49rwL1Ypfn01=V5P18u`eOXwH*DIlDeIVr7;R7FKNS1if7GFVB0h(J( zKH^NbrFYXPK-Ufo1A0<~nhaj^FHq)PjiI!E%@WY%i7i%R5Pa~W?(w~jafZ>S7l75E zqS&OmfsEP9ju(pEfp=Xv2!_@{J!{^ai)lJRVz`N8TXQvHA2?$d-qx17c6C! zeoVxTh5QjOMcmJNYNS+94XH3FMGJ?H*6F;w%`yy>Be^$|TmavlVzxLD; zrN!<9?2Jm`GG~?OeWF+t+R*Q$t)ylETD*V~_}$D6VqT-jFR z(7x`cnji&bDc-}jdxv|)OX@+1C=1I5RDz;RytbX`6;aDPU+M#&?jiu|-OZ>4Rj^c? zzVoB3Dlfb`thZ%z2hJuj)4cU49ele&_ybjoh61Qt{v4=)WpSwjC1&eAx7bJ;w&o}J zBDhWqqM|LuZ`7EpRK(US$a4}@vbC6A<<7!LrsJL&cr4QjqQ5>%-T2|1B>!u{_jtVf z>J`@>xzEU1#utZP5Ze^46kC|!0%GFzm^m8MG4&*BMl61ZIOaTb&Mxnfh%P&9#AKKy z&z@W6he4cbfV?~biEwg@Wo_jhi=^kR9q}%Au4TZgQx04${{wCCbkmf1|MxdLNd(zi zNAa5sNe#3qs=6$;D!7}@{9@La5pw$2Ig!V}TPPj2Bh@SUl#g&u@IdkjGLRC@(q~8U zYq%^ng7QPYylIrWUFf8l8|>rJ+ORKQD7gUjxxHCLyZE1C1c*bSO_fPdlGs$Igd8GW zFPd-7AxSHM1lH$llLi8=25;Mif$`KC{$ZJ+A!JZC&UtGHH~@=-7k@1h^C>pa_z@q%f!bIf zkZjn#Nt;44>nIcZZTa*rj$un74L*YpVr4GRQ3XvisWIn7C?uO=qD;3|A5K*n2mE%3 z{<6Vnb8s=KkLX#zVM?|j)%z|m01=M90Aq;4p4A9*BD6WR4^bcACmbd%8myT-XD||DO799VqFd) zYj@2DK%nuTpnRBR?!h@vh6B@=Te+)IHFOHZBx4C}c03)g9>A1|&8&@romoscqly9q zyb7qn2Shu{EjNHSULyQpUI_5s-_@pOVG#a_P50YQ(&i=1$kWc+zvG!M5KgNH!fGql z93+(Tzxa5Psc4>~+3)47_h=+#>Z{iG%psYy*&X}~zpF-g)T|wsP9=Z6CdM}6C^{2N zFM0AA5+&W$@0Rzkr(sDv_c5Xl8w{rBvIgnBoQ-Jxio=il7IN`TPhg(WceX|)KKe(5ZKIX*N*0-wuYH!VH5=uJYn|3MG*uw`Q3E;6E=Iw;_I~Sn10#G=58`>} z=0rd$iK)|;fK;R-#J}v%{ouxVbHhU%77xV_FHKR-7IWq$G@Jseo*JF}m3%j1$vXm+ud8g8A1h_}>t}^(0uw-utj#hx}?q zs;?w|Q#CGDlrvnD*Vwbd9rd_!+opEAjuZeu-VvUiNhTbL!%*Er60$opu7=IPWABuh z4tJ1$Vyk2Mzb@ygIX`d!O`7CZV}J&8e?g5LWLjj)1p5UVf6Y=2_Wx={DDyCm#*wa5|KK<6pamm570moc+m~;Ob=w` z_{=SfuFo}$=3z~azSm@zPAhuGCZSp=NrjI^&(4y8lKidUa0UN8kQbAIRYcXUe%%^e zZDHC!tjJp7qXfl$+KYtP?;IeNNxh|LtWbJ`uu-jPqZc66*u=(tAt#f|%SE<{_tH`B zyTr?8x1x+2h9cw{)6zH=*zombTS0kE(`ZZ{5$;w?A7ySSY;nNz1~7mj=MB$6G)T^g z2&1R)?9-XFsSc(qr&Kw&wS`v{<$EJ%K6~)YIy!2^Qe@W`17n7rEq$`pF!*~>RUv%i z?XKGPh^7TvYfNa1a$nv1l~Db8Tke^!H4{6NhVDPcKHGYMP00=b;GUwbz=k6WpH(=LNT9Opo43#i zaFE_g;NQgqsLdbon#IpZK`OfurzJ4s}w?bnbiQI5qzm*`Fg{F_xhn~dxgJcV|V-)lGg1lpxYRV`y52; zeQ5`ndJig$&HnUXcvtH?s8n+~2*Sk)Edhh>fBydG1pem){^tb#znlR6={{eiXP#o@ S2Rt2G@Q#kbjdCsfXa5TbbZBe< literal 0 HcmV?d00001 diff --git a/lib/application/assets/path_assets.dart b/lib/application/assets/path_assets.dart index 3bfdc02..39e8eb8 100644 --- a/lib/application/assets/path_assets.dart +++ b/lib/application/assets/path_assets.dart @@ -23,4 +23,5 @@ class PathAssets { static const String imgKtpCropped = 'assets/images/img-ktp-cropped.png'; static const String imgKtpClear = 'assets/images/img-ktp-clear.png'; static const String imgKtpBlur = 'assets/images/img-ktp-blur.png'; + static const String imgSuccessSignup = 'assets/images/img-success-signup.png'; } diff --git a/lib/application/component/button/button_view.dart b/lib/application/component/button/button_view.dart index 19799b6..376dffa 100644 --- a/lib/application/component/button/button_view.dart +++ b/lib/application/component/button/button_view.dart @@ -55,78 +55,80 @@ class ButtonView extends StatelessWidget { final widthPrefix = this.widthPrefix ?? (heightWrapContent ? width! / 4.7 : _widthBtn / 16); - return Container( - margin: EdgeInsets.symmetric(vertical: marginVertical ?? 32.0), - width: width ?? _widthBtn, - height: heightWrapContent ? null : height ?? _heightBtn, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - disabledBackgroundColor: isOutlined ? Colors.white : color.surface, - padding: contentPadding, - backgroundColor: backgroundColor ?? - (isOutlined - ? Colors.white - : isSecondaryColor - ? ColorPalette.grey - : ColorPalette.primary), - elevation: 0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(sizeBorderRadius ?? 48), - side: isOutlined - ? BorderSide( - color: disabled - ? color.surface - : isSecondaryColor - ? ColorPalette.greyBorder - : ColorPalette.primary, - ) - : BorderSide.none, + return Center( + child: Container( + margin: EdgeInsets.symmetric(vertical: marginVertical ?? 24.0), + width: width ?? _widthBtn, + height: heightWrapContent ? null : height ?? _heightBtn, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + disabledBackgroundColor: isOutlined ? Colors.white : color.surface, + padding: contentPadding, + backgroundColor: backgroundColor ?? + (isOutlined + ? Colors.white + : isSecondaryColor + ? ColorPalette.grey + : ColorPalette.primary), + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(sizeBorderRadius ?? 48), + side: isOutlined + ? BorderSide( + color: disabled + ? color.surface + : isSecondaryColor + ? ColorPalette.greyBorder + : ColorPalette.primary, + ) + : BorderSide.none, + ), ), - ), - onPressed: disabled ? null : onPressed, - child: Row( - mainAxisAlignment: mainAxisAlignmentContent ?? - (prefixIcon != null - ? MainAxisAlignment.center - : suffixIcon != null - ? MainAxisAlignment.end - : MainAxisAlignment.center), - children: [ - if (prefixIcon != null) ...[ - prefixIcon!, - SizedBox(width: widthPrefix), - ] else - Container(), - Flexible( - child: Text( - name, - textAlign: TextAlign.center, - maxLines: maxLines, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: textSize ?? 16, - fontWeight: textWeight, - color: textColor ?? - (disabled && isOutlined - ? color.primary - : disabled - ? Colors.white - : isOutlined && isSecondaryColor - ? ColorPalette.blackFont - : isOutlined - ? color.primary - : isSecondaryColor - ? Colors.white - : Colors.white), + onPressed: disabled ? null : onPressed, + child: Row( + mainAxisAlignment: mainAxisAlignmentContent ?? + (prefixIcon != null + ? MainAxisAlignment.center + : suffixIcon != null + ? MainAxisAlignment.end + : MainAxisAlignment.center), + children: [ + if (prefixIcon != null) ...[ + prefixIcon!, + SizedBox(width: widthPrefix), + ] else + Container(), + Flexible( + child: Text( + name, + textAlign: TextAlign.center, + maxLines: maxLines, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: textSize ?? 16, + fontWeight: textWeight, + color: textColor ?? + (disabled && isOutlined + ? color.primary + : disabled + ? Colors.white + : isOutlined && isSecondaryColor + ? ColorPalette.blackFont + : isOutlined + ? color.primary + : isSecondaryColor + ? Colors.white + : Colors.white), + ), ), ), - ), - if (suffixIcon != null) ...[ - SizedBox(width: widthSuffix), - suffixIcon! - ] else - Container() - ], + if (suffixIcon != null) ...[ + SizedBox(width: widthSuffix), + suffixIcon! + ] else + Container() + ], + ), ), ), ); diff --git a/lib/features/auth/registration/view/registration_password_view.dart b/lib/features/auth/registration/view/registration_password_view.dart new file mode 100644 index 0000000..032995b --- /dev/null +++ b/lib/features/auth/registration/view/registration_password_view.dart @@ -0,0 +1,151 @@ +import 'package:cims_apps/application/assets/path_assets.dart'; +import 'package:cims_apps/application/component/button/button_view.dart'; +import 'package:cims_apps/application/component/image/image_view.dart'; +import 'package:cims_apps/application/component/text_caption/text_caption.dart'; +import 'package:cims_apps/application/component/text_form/text_form_view.dart'; +import 'package:cims_apps/application/theme/color_palette.dart'; +import 'package:cims_apps/core/route/route.dart'; +import 'package:cims_apps/core/utils/size_config.dart'; +import 'package:cims_apps/features/auth/registration/view/submission_data/submission_parent.dart'; +import 'package:cims_apps/features/auth/registration/viewmodel/registration_viewmodel.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class RegistrationPasswordView extends StatelessWidget { + const RegistrationPasswordView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ChangeNotifierProvider( + create: (context) => RegistrationViewModel(), + builder: (context, child) { + return Scaffold( + appBar: AppBar( + title: const Text('Sign Up'), + ), + body: SingleChildScrollView( + padding: const EdgeInsets.all(16.0), + child: Consumer( + builder: (context, provider, child) { + return Form( + key: provider.formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const TextCaption( + title: 'Create your password', + subtitle: + 'The password you create serves as your login', + ), + TextFormView( + name: 'Password', + hintText: 'Input password', + ctrl: provider.passwordCtrl, + obscureText: !provider.showPassword, + validator: (value) { + if (value!.isEmpty) { + return 'Password must filled'; + } else { + return null; + } + }, + suffixIcon: GestureDetector( + onTap: () { + provider.toggleVisibility(); + }, + child: Icon( + provider.showPassword + ? Icons.visibility_off_outlined + : Icons.visibility_off_outlined, + color: ColorPalette.greyDarker, + ), + ), + ), + const SizedBox( + height: 32.0, + ), + TextFormView( + name: 'Confirm Password', + hintText: 'Input password', + ctrl: provider.confirmPasswordCtrl, + obscureText: !provider.showPasswordConfirm, + validator: (value) { + if (value!.isEmpty) { + return 'Password must filled'; + } else if (value != provider.passwordCtrl.text) { + return 'Password must be same'; + } else { + return null; + } + }, + suffixIcon: GestureDetector( + onTap: () { + provider.toggleVisibilityConfirm(); + }, + child: Icon( + provider.showPasswordConfirm + ? Icons.visibility_outlined + : Icons.visibility_off_outlined, + color: ColorPalette.greyDarker, + ), + ), + ), + ButtonView( + name: 'Confirm', + onPressed: () { + if (provider.formKey.currentState!.validate()) { + routePush(context, page: const DialogSuccess()); + } + }, + ) + ], + ), + ); + }), + ), + ); + }); + } +} + +class DialogSuccess extends StatelessWidget { + const DialogSuccess({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + padding: const EdgeInsets.all(24.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + ImageView( + image: PathAssets.imgSuccessSignup, + width: SizeConfig.width * .8, + ), + const TextCaption( + title: 'Success', + subtitle: + 'Congratulations, your account creation was successful!', + crossAxisAlignment: CrossAxisAlignment.center, + textAlignSubtitle: TextAlign.center, + ), + SizedBox( + height: SizeConfig.height * .2, + ), + ButtonView( + name: 'Next', + marginVertical: 8.0, + onPressed: () { + routePush(context, + page: const SubmissionParent(), + routeType: RouteType.pushReplace); + }, + ) + ], + ), + ), + ); + } +} diff --git a/lib/features/auth/registration/view/registration_view.dart b/lib/features/auth/registration/view/registration_view.dart index b98fb40..59d5f60 100644 --- a/lib/features/auth/registration/view/registration_view.dart +++ b/lib/features/auth/registration/view/registration_view.dart @@ -2,7 +2,7 @@ import 'package:cims_apps/application/component/button/button_view.dart'; import 'package:cims_apps/application/component/text_caption/text_caption.dart'; import 'package:cims_apps/application/component/text_form/text_form_view.dart'; import 'package:cims_apps/core/route/route.dart'; -import 'package:cims_apps/features/auth/registration/view/initial_registration_step.dart'; +import 'package:cims_apps/features/auth/registration/view/registration_password_view.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; @@ -29,7 +29,7 @@ class RegistrationView extends StatelessWidget { ButtonView( name: 'Next', onPressed: () { - routePush(context, page: const InitialRegistrationStep()); + routePush(context, page: const RegistrationPasswordView()); }, ), Align( diff --git a/lib/features/auth/registration/view/submission_data/submission_parent.dart b/lib/features/auth/registration/view/submission_data/submission_parent.dart index 6c962f4..087e8dc 100644 --- a/lib/features/auth/registration/view/submission_data/submission_parent.dart +++ b/lib/features/auth/registration/view/submission_data/submission_parent.dart @@ -1,10 +1,12 @@ import 'package:cims_apps/application/component/button/button_view.dart'; import 'package:cims_apps/application/theme/color_palette.dart'; +import 'package:cims_apps/core/route/route.dart'; import 'package:cims_apps/core/utils/size_config.dart'; import 'package:cims_apps/features/auth/registration/view/submission_data/initial_take_photo.dart'; import 'package:cims_apps/features/auth/registration/view/submission_data/submit_email.dart'; import 'package:cims_apps/features/auth/registration/view/submission_data/submit_personal_data.dart'; import 'package:cims_apps/features/auth/registration/viewmodel/submission_data_viewmodel.dart'; +import 'package:cims_apps/features/bottom_navigation_view.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -71,53 +73,63 @@ class _SubmissionParentState extends State { return ChangeNotifierProvider( create: (context) => SubmissionDataViewModel(), builder: (context, child) { - return Scaffold( - appBar: AppBar( - title: const Text('Registration'), - ), - body: Stack( - children: [ - Consumer( - builder: (context, provider, child) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 16.0, vertical: 16.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: List.generate( - provider.stepAmount, - (index) => _stepItem( - isCurrentStep: provider.currentStep == index + 1, + return WillPopScope( + onWillPop: () async { + await routePush(context, + page: const BottomNavigationView(), + routeType: RouteType.pushReplace); + return false; + }, + child: Scaffold( + appBar: AppBar( + title: const Text('Registration'), + ), + body: Stack( + children: [ + Consumer( + builder: (context, provider, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, vertical: 16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: List.generate( + provider.stepAmount, + (index) => _stepItem( + isCurrentStep: + provider.currentStep == index + 1, + ), ), ), ), - ), - Expanded( - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 16.0), - child: _content(provider.currentStep), + Expanded( + child: Container( + padding: + const EdgeInsets.symmetric(horizontal: 16.0), + child: _content(provider.currentStep), + ), ), - ), - provider.currentStep == 3 - ? const SizedBox() - : Align( - alignment: Alignment.bottomCenter, - child: ButtonView( - name: 'Next', - marginVertical: 16.0, - onPressed: () { - provider.nextSubmission(context); - }, - ), - ) - ], - ); - }), - ], + provider.currentStep == 3 + ? const SizedBox() + : Align( + alignment: Alignment.bottomCenter, + child: ButtonView( + name: 'Next', + marginVertical: 16.0, + onPressed: () { + provider.nextSubmission(context); + }, + ), + ) + ], + ); + }), + ], + ), ), ); }); diff --git a/lib/features/auth/registration/viewmodel/registration_viewmodel.dart b/lib/features/auth/registration/viewmodel/registration_viewmodel.dart new file mode 100644 index 0000000..c58548a --- /dev/null +++ b/lib/features/auth/registration/viewmodel/registration_viewmodel.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +class RegistrationViewModel extends ChangeNotifier { + TextEditingController passwordCtrl = TextEditingController(); + TextEditingController confirmPasswordCtrl = TextEditingController(); + var formKey = GlobalKey(); + bool showPassword = false; + bool showPasswordConfirm = false; + + void toggleVisibility() { + showPassword = !showPassword; + notifyListeners(); + } + + void toggleVisibilityConfirm() { + showPasswordConfirm = !showPasswordConfirm; + notifyListeners(); + } +} From 4b4b42beaec40cf6b65a3eca9e37397af710aaea Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Tue, 6 Feb 2024 17:02:12 +0700 Subject: [PATCH 4/6] add otp component --- .../component/button/button_view.dart | 2 +- lib/application/component/otp/otp_view.dart | 123 ++++++++++++++++++ .../component/otp/otp_viewmodel.dart | 17 +++ .../component/text_caption/text_caption.dart | 2 +- lib/application/theme/color_palette.dart | 1 + .../registration/view/registration_view.dart | 31 ++++- pubspec.lock | 29 +++++ pubspec.yaml | 2 + 8 files changed, 202 insertions(+), 5 deletions(-) create mode 100644 lib/application/component/otp/otp_view.dart create mode 100644 lib/application/component/otp/otp_viewmodel.dart diff --git a/lib/application/component/button/button_view.dart b/lib/application/component/button/button_view.dart index 376dffa..8ea3823 100644 --- a/lib/application/component/button/button_view.dart +++ b/lib/application/component/button/button_view.dart @@ -76,7 +76,7 @@ class ButtonView extends StatelessWidget { side: isOutlined ? BorderSide( color: disabled - ? color.surface + ? ColorPalette.greyBorder : isSecondaryColor ? ColorPalette.greyBorder : ColorPalette.primary, diff --git a/lib/application/component/otp/otp_view.dart b/lib/application/component/otp/otp_view.dart new file mode 100644 index 0000000..d282b6b --- /dev/null +++ b/lib/application/component/otp/otp_view.dart @@ -0,0 +1,123 @@ +import 'package:cims_apps/application/component/button/button_view.dart'; +import 'package:cims_apps/application/component/otp/otp_viewmodel.dart'; +import 'package:cims_apps/application/component/text_caption/text_caption.dart'; +import 'package:cims_apps/application/theme/color_palette.dart'; +import 'package:cims_apps/core/route/route.dart'; +import 'package:cims_apps/core/utils/size_config.dart'; +import 'package:cims_apps/features/auth/registration/view/registration_password_view.dart'; +import 'package:flutter/material.dart'; +import 'package:pinput/pinput.dart'; +import 'package:provider/provider.dart'; + +class OtpView extends StatelessWidget { + final String title; + final String? contentTitle, contentSubtitle; + const OtpView({ + Key? key, + required this.title, + this.contentTitle, + this.contentSubtitle, + }) : super(key: key); + + Widget _otpContent(BuildContext context, OtpViewModel provider) { + return Form( + key: provider.formKey, + child: Column( + children: [ + Pinput( + length: 4, + controller: provider.ctrlPin, + focusNode: provider.focusNode, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + validator: (value) { + if (value!.isEmpty) { + return 'Pin must be complete'; + } + return null; + }, + defaultPinTheme: PinTheme( + textStyle: const TextStyle( + color: ColorPalette.slate800, + fontSize: 24, + fontWeight: FontWeight.bold, + ), + width: SizeConfig.width * .19, + height: SizeConfig.height * .08, + decoration: BoxDecoration( + border: Border.all(color: const Color(0xFFE2E8F0)), + borderRadius: BorderRadius.circular(8), + ), + ), + errorPinTheme: PinTheme( + textStyle: const TextStyle( + color: ColorPalette.slate800, + fontSize: 24, + fontWeight: FontWeight.bold, + ), + width: SizeConfig.width * .19, + height: SizeConfig.height * .08, + decoration: BoxDecoration( + border: Border.all(color: Colors.redAccent), + borderRadius: BorderRadius.circular(8), + ), + ), + ), + ButtonView( + name: 'Verify', + // disabled: !provider.buttonIsActive, + // backgroundColor: ColorPalette.grey, + onPressed: () { + if (provider.formKey.currentState!.validate()) { + final pin = provider.ctrlPin.text; + provider.validateOtp(pin).then((value) { + if (value) { + routePush(context, + page: const RegistrationPasswordView(), + routeType: RouteType.pushReplace); + } else { + provider.ctrlPin.clear(); + } + }); + } + }, + ), + ], + )); + } + + @override + Widget build(BuildContext context) { + return ChangeNotifierProvider( + create: (context) => OtpViewModel(), + builder: (context, child) { + return Scaffold( + appBar: AppBar( + title: Text(title), + ), + body: Container( + padding: const EdgeInsets.all(16.0), + child: + Consumer(builder: (context, provider, child) { + return Column( + children: [ + TextCaption( + title: contentTitle ?? '', + subtitle: contentSubtitle ?? '', + ), + _otpContent(context, provider), + TextButton( + onPressed: () {}, + child: const Text( + 'Resend Code', + style: TextStyle( + fontWeight: FontWeight.w700, + ), + )) + ], + ); + }), + ), + ); + }); + } +} diff --git a/lib/application/component/otp/otp_viewmodel.dart b/lib/application/component/otp/otp_viewmodel.dart new file mode 100644 index 0000000..851ec22 --- /dev/null +++ b/lib/application/component/otp/otp_viewmodel.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +class OtpViewModel extends ChangeNotifier { + var formKey = GlobalKey(); + var focusNode = FocusNode(); + bool buttonIsActive = false; + + TextEditingController ctrlPin = TextEditingController(); + + Future validateOtp(String pin) async { + final pinLength = pin.length; + if (pinLength == 4) { + return true; + } + return false; + } +} diff --git a/lib/application/component/text_caption/text_caption.dart b/lib/application/component/text_caption/text_caption.dart index 3b7e67e..00ab5b6 100644 --- a/lib/application/component/text_caption/text_caption.dart +++ b/lib/application/component/text_caption/text_caption.dart @@ -38,7 +38,7 @@ class TextCaption extends StatelessWidget { style: const TextStyle( fontSize: 16, fontWeight: FontWeight.w500, - color: ColorPalette.slate800, + color: ColorPalette.slate500, ), ), ) diff --git a/lib/application/theme/color_palette.dart b/lib/application/theme/color_palette.dart index 724bd85..90ea85b 100644 --- a/lib/application/theme/color_palette.dart +++ b/lib/application/theme/color_palette.dart @@ -73,5 +73,6 @@ class ColorPalette { static const Color chathamsBlue = Color(0xFF285BB9); static const Color background = Color(0xFFDADADA); static const Color backgroundBlueLight = Color(0xFFEBF3FD); + static const Color slate500 = Color(0xFF64748B); static const Color slate800 = Color(0xFF1E293B); } diff --git a/lib/features/auth/registration/view/registration_view.dart b/lib/features/auth/registration/view/registration_view.dart index 59d5f60..0c60c17 100644 --- a/lib/features/auth/registration/view/registration_view.dart +++ b/lib/features/auth/registration/view/registration_view.dart @@ -1,8 +1,7 @@ import 'package:cims_apps/application/component/button/button_view.dart'; +import 'package:cims_apps/application/component/otp/otp_view.dart'; import 'package:cims_apps/application/component/text_caption/text_caption.dart'; import 'package:cims_apps/application/component/text_form/text_form_view.dart'; -import 'package:cims_apps/core/route/route.dart'; -import 'package:cims_apps/features/auth/registration/view/registration_password_view.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; @@ -12,6 +11,30 @@ class RegistrationView extends StatelessWidget { @override Widget build(BuildContext context) { + _showOtpWidget() { + Navigator.of(context).pop(); + showModalBottomSheet( + context: context, + isScrollControlled: true, + enableDrag: false, + builder: (BuildContext context) { + return Padding( + padding: EdgeInsets.only( + top: MediaQueryData.fromView( + WidgetsBinding.instance.window, + ).padding.top, + ), + child: const OtpView( + title: 'Sign Up', + contentTitle: 'Check your SMS', + contentSubtitle: + 'Enter 4 digit code We’ve sent to verify your phone number', + ), + ); + }, + ); + } + return Scaffold( appBar: AppBar( title: const Text('Sign Up'), @@ -29,7 +52,9 @@ class RegistrationView extends StatelessWidget { ButtonView( name: 'Next', onPressed: () { - routePush(context, page: const RegistrationPasswordView()); + _showOtpWidget(); + + // routePush(context, page: const RegistrationPasswordView()); }, ), Align( diff --git a/pubspec.lock b/pubspec.lock index ae75197..2ab6860 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -163,6 +163,11 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" http: dependency: transitive description: @@ -323,6 +328,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.2" + pinput: + dependency: "direct main" + description: + name: pinput + sha256: "543da5bfdefd9e06914a12100f8c9156f84cef3efc14bca507c49e966c5b813b" + url: "https://pub.dev" + source: hosted + version: "2.3.0" platform: dependency: transitive description: @@ -376,6 +389,14 @@ packages: description: flutter source: sdk version: "0.0.99" + smart_auth: + dependency: transitive + description: + name: smart_auth + sha256: a25229b38c02f733d0a4e98d941b42bed91a976cb589e934895e60ccfa674cf6 + url: "https://pub.dev" + source: hosted + version: "1.1.1" source_span: dependency: transitive description: @@ -464,6 +485,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.2" + universal_platform: + dependency: transitive + description: + name: universal_platform + sha256: d315be0f6641898b280ffa34e2ddb14f3d12b1a37882557869646e0cc363d0cc + url: "https://pub.dev" + source: hosted + version: "1.0.0+1" uuid: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 39356dc..2864079 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -40,6 +40,8 @@ dependencies: cached_network_image: ^3.2.3 remove_emoji_input_formatter: ^0.0.1+1 provider: ^6.1.1 + pinput: ^2.2.21 + From 7ec266cdedcfbcbbb192f275c534258815a526bc Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Tue, 6 Feb 2024 18:38:34 +0700 Subject: [PATCH 5/6] fix: otp component --- lib/application/component/otp/otp_view.dart | 61 +++++++++++++------ .../component/otp/otp_viewmodel.dart | 5 ++ 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/lib/application/component/otp/otp_view.dart b/lib/application/component/otp/otp_view.dart index d282b6b..1ab57b0 100644 --- a/lib/application/component/otp/otp_view.dart +++ b/lib/application/component/otp/otp_view.dart @@ -1,4 +1,3 @@ -import 'package:cims_apps/application/component/button/button_view.dart'; import 'package:cims_apps/application/component/otp/otp_viewmodel.dart'; import 'package:cims_apps/application/component/text_caption/text_caption.dart'; import 'package:cims_apps/application/theme/color_palette.dart'; @@ -61,26 +60,48 @@ class OtpView extends StatelessWidget { borderRadius: BorderRadius.circular(8), ), ), - ), - ButtonView( - name: 'Verify', - // disabled: !provider.buttonIsActive, - // backgroundColor: ColorPalette.grey, - onPressed: () { - if (provider.formKey.currentState!.validate()) { - final pin = provider.ctrlPin.text; - provider.validateOtp(pin).then((value) { - if (value) { - routePush(context, - page: const RegistrationPasswordView(), - routeType: RouteType.pushReplace); - } else { - provider.ctrlPin.clear(); - } - }); + onCompleted: (pin) => provider.enableButton(), + onChanged: (value) { + if (provider.ctrlPin.length != 4) { + provider.enableButton(isActive: false); } }, ), + Container( + margin: const EdgeInsets.symmetric(vertical: 32.0), + width: SizeConfig.width, + height: SizeConfig.height * .07, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + elevation: 0, + backgroundColor: ColorPalette.primary, + ), + onPressed: !provider.buttonIsActive + ? null + : () { + if (provider.formKey.currentState!.validate()) { + final pin = provider.ctrlPin.text; + provider.validateOtp(pin).then((value) { + if (value) { + routePush(context, + page: const RegistrationPasswordView(), + routeType: RouteType.pushReplace); + } else { + provider.ctrlPin.clear(); + } + }); + } + }, + child: const Text( + 'Verify', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ), + ), ], )); } @@ -106,7 +127,9 @@ class OtpView extends StatelessWidget { ), _otpContent(context, provider), TextButton( - onPressed: () {}, + onPressed: () { + provider.ctrlPin.clear(); + }, child: const Text( 'Resend Code', style: TextStyle( diff --git a/lib/application/component/otp/otp_viewmodel.dart b/lib/application/component/otp/otp_viewmodel.dart index 851ec22..4aac81d 100644 --- a/lib/application/component/otp/otp_viewmodel.dart +++ b/lib/application/component/otp/otp_viewmodel.dart @@ -14,4 +14,9 @@ class OtpViewModel extends ChangeNotifier { } return false; } + + void enableButton({bool isActive = true}) { + buttonIsActive = isActive; + notifyListeners(); + } } From e538fa59275858d32cc626cf194e9ff07a85dbd7 Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Tue, 6 Feb 2024 19:21:41 +0700 Subject: [PATCH 6/6] fix: sign up feature --- assets/icons/icon-flag.png | Bin 0 -> 2660 bytes lib/application/assets/path_assets.dart | 1 + .../component/text_form/text_form_view.dart | 78 ++++----- .../view/registration_password_view.dart | 2 +- .../registration/view/registration_view.dart | 157 ++++++++++++------ .../viewmodel/registration_viewmodel.dart | 2 + 6 files changed, 151 insertions(+), 89 deletions(-) create mode 100644 assets/icons/icon-flag.png diff --git a/assets/icons/icon-flag.png b/assets/icons/icon-flag.png new file mode 100644 index 0000000000000000000000000000000000000000..32fee5b83d2e6c8fd380f4cfd566a9b34514299a GIT binary patch literal 2660 zcmV-q3Y+zbP)@~0drDELIAGL9O(c600d`2O+f$vv5yPB<4euHrcR&p`8UA1R{tH5=aC#NNn0JSiq*O!~!-||!zNoQ2sNu1b@-@9}E*B^cFzGwT{e$RH|`;)9^ zU%zz5=iGbFx#!(`uAm7emn)p7Il7W@pFj2qtUV@h1?vsGRC5S+~dNUBg88-dZBmXp6jZ+tDjoFMzl75e?e(jY4_j-#<c1If6z-AsVgEC1+d^(94TJq z9={&-Jp>JbL-0_*IH|D$4pa$mZ+GviN8U!1xq;x%{q{F> zmS3al?Qy}V*!$6syD1`-(U6z|;AEY7$&rnAvLPV&#b5nm;skHfQxQ^ZxMdy<2~F%0 zQGhl%Li~*)Y&}fO5(|FZrlwz@h!6kt7k!N&?<)1xBuvuK3dlVvTyYc&-!M7o=@2~3 z%}EBMp~SBU@~%|hUVU!)0S&=W3efgmd7EZ?=G`6oLwm&G`qyZUd1n7yCr#8%XI9ZsT(@ZCmq)6Sm z^uqE6^-13f=wx<2apQ-&_fG?uz!iV?^HBRB=BO_PXou^G|CsI5B>WZ#Q=h)}>rgv8 z=9l|%%&~od4mCaTXS018g%9wX@!L%h5kgiJlUNGSldOn1fBC0BnM&ceh*ScHi6=d$Givb6VfU|p4^Gwu6=a+j1vR};iv-X_EJV1{dj9|kgkY=mDn z4S(=z*T3uZ1x$|+;;O$5cKpqar7tm8TRJDcknmNRd? zX*R9-opDoK$MJS59-%r=)=`tdvCXC}y)_1a8la?Bf}fSvKTp1r4b(kcahDzeQRc@AKRMuxO*7=oHTE3!k|ZoJL!Qrjs9#*b3@zg#EX|PagPz z88fVB*-I&c3UGF;^Gyrvaq|P&OY(x5PxB^Aa%4@}vg{>xpm)8=k{H;iNMmqsZ4>PzCcu1oQU-)qB2uKan1VQ%F+*)Kq(DVqcr_v+9 zGFCF77Ny9NBD=v+U`N21k-E~94`oL{YIvq>S@yD7=BthCSp}qpXUdjk&*_Mu0z5kc zQp0sUvnelCqsU#G<71aB>0owl9uXyp>Vn;FvLr{%=-dJ$fZcFDc#}t#bU3aX)`ev+ z*)Ih4wASm^1f@mYHB1o8UZSX}zp=&&u%T%3z_f=(0LxxB3lHV}?N#fD6UPj0lxS4* zZ7fSs>c0QWYOPL|WI3!J2R;iWwB^wXV7I&F|I&_tw-THw9 z!34~-|0tP^t5!hM4{Z5wI5?`2B^fGVlfKp3yxq=*DpGIw?>MSjKadprhr!N_qT%iL ztvB8gZTfG58LC)kJTx#poy-qtD7V_>YTz^Hf8OxdjtD%Eah1B`|6D#g zw$6A6;CvxNKQmb;P3w9l#Mz;l)U%GCglh_3rTV_sl}RF*J%<*F(Cj=f)h*Xavg&p-ro zM0@NDA|5PTnm{(C1Jm}4&2EMJx-QIeJ$1`;$WIDo8x=*MnzAv-{rMVq<9c*dU_r5&~s@b{{x%K3(gJ7oGC4ptv_f1yMJK#N60KrA@5jgL%pgl zUzrd5N7>eyq1H5lOlR2cQ@$y)p2SiB<_0JU2LK~sn&t?dgwLVS^?nca>3e@b(<$FF+lw3- zO@m{G!;KO?jxf2%vY|d1_!On>M}?b0hU+4qJA?G~Eb3&^X##OR!tZj#v+_aDj{!qT zDfhT=%`r;bgN!3}-pFxI#|9kCa52fMM`Z!n>F zvrqSqPDCQFW$Qm=lM^L;{6_rNq>i>t+*3CFLg>ty77O!PZI&i&L_qL+Y;KTJ@S^s~ zVG`;M7U^^&wF8}T`i6M`gdZs4?3pZOGY*Xtm>MjsPJbd-*+^8~&R+gU0s#Fw)slTt&2iLNF?3GLo`Qg&?YOqzEYoLdG6vy%U86jccv$ zQJvq{;%~dk^W<`)UiR)Lbz*ie#xh;a?H1NqoL6}YxlWV87FGqOX=*w#)_g&;V*8rY zaMo)yTDG{i-y3Cbk78mHHZ5gHC_;$K{6BVuk|obSmwUQ*9~)A}DRe&*n=#Wh_UGsd z+x*L3-CIR{wPtat6? validator; final bool obscureText; @@ -70,7 +70,8 @@ class TextFormView extends StatelessWidget { this.disableColor = false, this.enableInteractiveSelection = true, this.focusNode, - this.isTextAlignCenter = false}) + this.isTextAlignCenter = false, + this.prefix}) : super(key: key); @override @@ -148,46 +149,47 @@ class TextFormView extends StatelessWidget { enableInteractiveSelection: enableInteractiveSelection, textAlign: isTextAlignCenter ? TextAlign.center : TextAlign.left, decoration: InputDecoration( - helperText: helperText, - errorStyle: errorStyle, - errorText: errorText, - errorMaxLines: 2, - hintStyle: hintTextStyle ?? - const TextStyle( - fontSize: 14, - color: ColorPalette.greyFont, - fontWeight: FontWeight.normal, + helperText: helperText, + errorStyle: errorStyle, + errorText: errorText, + errorMaxLines: 2, + hintStyle: hintTextStyle ?? + const TextStyle( + fontSize: 14, + color: ColorPalette.greyFont, + fontWeight: FontWeight.normal, + ), + isDense: true, + hintText: hintText, + filled: true, + fillColor: enabled && disableColor == false + ? Colors.white + : const Color.fromARGB(255, 233, 236, 239), + disabledBorder: OutlineInputBorder( + borderRadius: _borderRadius, + borderSide: BorderSide( + color: disabledborderColor ?? ColorPalette.greyBorder, ), - isDense: true, - hintText: hintText, - filled: true, - fillColor: enabled && disableColor == false - ? Colors.white - : const Color.fromARGB(255, 233, 236, 239), - disabledBorder: OutlineInputBorder( - borderRadius: _borderRadius, - borderSide: BorderSide( - color: disabledborderColor ?? ColorPalette.greyBorder, ), - ), - enabledBorder: OutlineInputBorder( - borderRadius: _borderRadius, - borderSide: BorderSide( - color: enabledborderColor ?? ColorPalette.greyBorder, + enabledBorder: OutlineInputBorder( + borderRadius: _borderRadius, + borderSide: BorderSide( + color: enabledborderColor ?? ColorPalette.greyBorder, + ), ), - ), - focusedBorder: OutlineInputBorder( - borderRadius: _borderRadius, - borderSide: BorderSide( - color: focusedBorderColor ?? ColorPalette.greyBorder, + focusedBorder: OutlineInputBorder( + borderRadius: _borderRadius, + borderSide: BorderSide( + color: focusedBorderColor ?? ColorPalette.greyBorder, + ), ), - ), - border: OutlineInputBorder(borderRadius: _borderRadius), - suffixIcon: suffixIcon, - prefixIcon: prefixIcon, - suffixIconConstraints: suffixIconConstraints, - prefixIconConstraints: preffixIconConstraints, - ), + border: OutlineInputBorder(borderRadius: _borderRadius), + suffixIcon: suffixIcon, + prefixIcon: prefixIcon, + suffixIconConstraints: suffixIconConstraints, + prefixIconConstraints: preffixIconConstraints, + prefix: prefix, + contentPadding: EdgeInsets.zero), ) ], ); diff --git a/lib/features/auth/registration/view/registration_password_view.dart b/lib/features/auth/registration/view/registration_password_view.dart index 032995b..4210406 100644 --- a/lib/features/auth/registration/view/registration_password_view.dart +++ b/lib/features/auth/registration/view/registration_password_view.dart @@ -55,7 +55,7 @@ class RegistrationPasswordView extends StatelessWidget { }, child: Icon( provider.showPassword - ? Icons.visibility_off_outlined + ? Icons.visibility_outlined : Icons.visibility_off_outlined, color: ColorPalette.greyDarker, ), diff --git a/lib/features/auth/registration/view/registration_view.dart b/lib/features/auth/registration/view/registration_view.dart index 0c60c17..04cdf85 100644 --- a/lib/features/auth/registration/view/registration_view.dart +++ b/lib/features/auth/registration/view/registration_view.dart @@ -1,9 +1,16 @@ +import 'package:cims_apps/application/assets/path_assets.dart'; import 'package:cims_apps/application/component/button/button_view.dart'; +import 'package:cims_apps/application/component/image/image_view.dart'; import 'package:cims_apps/application/component/otp/otp_view.dart'; import 'package:cims_apps/application/component/text_caption/text_caption.dart'; import 'package:cims_apps/application/component/text_form/text_form_view.dart'; +import 'package:cims_apps/application/theme/color_palette.dart'; +import 'package:cims_apps/core/utils/size_config.dart'; +import 'package:cims_apps/features/auth/registration/viewmodel/registration_viewmodel.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:provider/provider.dart'; class RegistrationView extends StatelessWidget { static const routName = '/RegistrationView'; @@ -11,7 +18,7 @@ class RegistrationView extends StatelessWidget { @override Widget build(BuildContext context) { - _showOtpWidget() { + showOtpWidget() { Navigator.of(context).pop(); showModalBottomSheet( context: context, @@ -35,56 +42,106 @@ class RegistrationView extends StatelessWidget { ); } - return Scaffold( - appBar: AppBar( - title: const Text('Sign Up'), - ), - body: Container( - padding: const EdgeInsets.all(24.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const TextCaption( - title: 'Enter your phone number', - subtitle: 'Input your registered phone number', + return ChangeNotifierProvider( + create: (context) => RegistrationViewModel(), + builder: (context, child) { + return Scaffold( + appBar: AppBar( + title: const Text('Sign Up'), ), - TextFormView(name: 'Phone Number'), - ButtonView( - name: 'Next', - onPressed: () { - _showOtpWidget(); - - // routePush(context, page: const RegistrationPasswordView()); - }, + body: Container( + padding: const EdgeInsets.all(24.0), + child: Consumer( + builder: (context, provider, child) { + return Form( + key: provider.formKeyPhone, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const TextCaption( + title: 'Enter your phone number', + subtitle: 'Input your registered phone number', + ), + TextFormView( + name: 'Phone Number', + keyboardType: TextInputType.number, + inputFormatters: [ + FilteringTextInputFormatter.deny(RegExp(r'^0')) + ], + prefixIcon: Container( + width: SizeConfig.width * .23, + padding: + const EdgeInsets.symmetric(horizontal: 16.0), + margin: const EdgeInsets.only(right: 16), + decoration: const BoxDecoration( + color: ColorPalette.grey, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(8), + bottomLeft: Radius.circular(8), + )), + child: const Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ImageView( + image: PathAssets.iconFlag, + fit: BoxFit.contain, + width: 24, + height: 24, + ), + Text( + '+62', + style: TextStyle( + fontWeight: FontWeight.w600, + color: ColorPalette.slate800, + ), + ) + ], + )), + ctrl: provider.phoneNumberCtrl, + validator: (value) { + if (value!.isEmpty) { + return 'Phone number must be filled'; + } else { + return null; + } + }, + ), + ButtonView( + name: 'Next', + onPressed: () { + if (provider.formKeyPhone.currentState!.validate()) { + showOtpWidget(); + } + }, + ), + Align( + alignment: Alignment.center, + child: RichText( + textAlign: TextAlign.center, + text: TextSpan(children: [ + const TextSpan( + text: 'Already have an account? ', + style: TextStyle( + color: Colors.black, + decoration: TextDecoration.none, + ), + ), + TextSpan( + recognizer: TapGestureRecognizer()..onTap = () {}, + text: ' Sign In', + style: const TextStyle( + color: Colors.blue, + ), + ), + ]), + ), + ) + ], + ), + ); + }), ), - Align( - alignment: Alignment.center, - child: RichText( - textAlign: TextAlign.center, - text: TextSpan(children: [ - const TextSpan( - text: 'Already have an account? ', - style: TextStyle( - color: Colors.black, - decoration: TextDecoration.none, - ), - ), - TextSpan( - recognizer: TapGestureRecognizer() - ..onTap = () { - print('object'); - }, - text: ' Sign In', - style: const TextStyle( - color: Colors.blue, - ), - ), - ]), - ), - ) - ], - ), - ), - ); + ); + }); } } diff --git a/lib/features/auth/registration/viewmodel/registration_viewmodel.dart b/lib/features/auth/registration/viewmodel/registration_viewmodel.dart index c58548a..55a8f7f 100644 --- a/lib/features/auth/registration/viewmodel/registration_viewmodel.dart +++ b/lib/features/auth/registration/viewmodel/registration_viewmodel.dart @@ -3,7 +3,9 @@ import 'package:flutter/material.dart'; class RegistrationViewModel extends ChangeNotifier { TextEditingController passwordCtrl = TextEditingController(); TextEditingController confirmPasswordCtrl = TextEditingController(); + TextEditingController phoneNumberCtrl = TextEditingController(); var formKey = GlobalKey(); + var formKeyPhone = GlobalKey(); bool showPassword = false; bool showPasswordConfirm = false;