From 7aa082c6c85c92f283d59f6258fc50fda8b18c8b Mon Sep 17 00:00:00 2001 From: amirrezaghabeli Date: Sun, 3 Aug 2025 09:44:43 +0330 Subject: [PATCH 1/2] merged login and home --- .fvmrc | 3 + .gitignore | 3 + .vscode/settings.json | 3 + assets/icons/SE.png | Bin 0 -> 4159 bytes assets/icons/arrow-right.svg | 4 + assets/icons/arrows.svg | 5 + assets/icons/edit.svg | 3 + assets/icons/home.svg | 11 ++ assets/icons/homeActive.svg | 11 ++ assets/icons/location.svg | 4 + assets/icons/profile-circle.svg | 5 + assets/icons/profile-circle_active.svg | 5 + assets/icons/shield.svg | 4 + assets/icons/task-square_active.svg | 7 + assets/icons/task_square.svg | 7 + assets/icons/tenderLogo.png | Bin 0 -> 54583 bytes assets/icons/tenderLogo.svg | 12 ++ assets/icons/thumb.svg | 4 + assets/pngs/logo.png | Bin 0 -> 11922 bytes assets/svgs/password_icon.svg | 5 + assets/svgs/password_visibility.svg | 4 + assets/svgs/user_icon.svg | 4 + lib/bottom_navigation.dart | 97 ++++++++++++++ lib/constants/app_strings.dart | 14 ++ lib/core/constants/assets.dart | 10 ++ lib/core/constants/colors.dart | 2 + lib/core/constants/texts.dart | 7 + lib/home/home_page.dart | 174 +++++++++++++++++++++++++ lib/home/progress_bar_column.dart | 104 +++++++++++++++ lib/home/statistics_card.dart | 73 +++++++++++ lib/home/tenders_list_item.dart | 111 ++++++++++++++++ lib/home/widgets.dart | 3 + lib/main.dart | 10 +- lib/size_config.dart | 31 +++++ lib/views/login_screen.dart | 120 ++++++++++------- lib/views/widget/login_button.dart | 38 ++++++ lib/views/widget/login_logo.dart | 13 ++ lib/views/widget/login_textfield.dart | 75 +++++++++++ lib/views/widget/login_title.dart | 30 +++++ pubspec.yaml | 12 +- 40 files changed, 979 insertions(+), 49 deletions(-) create mode 100644 .fvmrc create mode 100644 .vscode/settings.json create mode 100644 assets/icons/SE.png create mode 100644 assets/icons/arrow-right.svg create mode 100644 assets/icons/arrows.svg create mode 100644 assets/icons/edit.svg create mode 100644 assets/icons/home.svg create mode 100644 assets/icons/homeActive.svg create mode 100644 assets/icons/location.svg create mode 100644 assets/icons/profile-circle.svg create mode 100644 assets/icons/profile-circle_active.svg create mode 100644 assets/icons/shield.svg create mode 100644 assets/icons/task-square_active.svg create mode 100644 assets/icons/task_square.svg create mode 100644 assets/icons/tenderLogo.png create mode 100644 assets/icons/tenderLogo.svg create mode 100644 assets/icons/thumb.svg create mode 100644 assets/pngs/logo.png create mode 100644 assets/svgs/password_icon.svg create mode 100644 assets/svgs/password_visibility.svg create mode 100644 assets/svgs/user_icon.svg create mode 100644 lib/bottom_navigation.dart create mode 100644 lib/constants/app_strings.dart create mode 100644 lib/core/constants/assets.dart create mode 100644 lib/core/constants/texts.dart create mode 100644 lib/home/home_page.dart create mode 100644 lib/home/progress_bar_column.dart create mode 100644 lib/home/statistics_card.dart create mode 100644 lib/home/tenders_list_item.dart create mode 100644 lib/home/widgets.dart create mode 100644 lib/size_config.dart create mode 100644 lib/views/widget/login_button.dart create mode 100644 lib/views/widget/login_logo.dart create mode 100644 lib/views/widget/login_textfield.dart create mode 100644 lib/views/widget/login_title.dart diff --git a/.fvmrc b/.fvmrc new file mode 100644 index 0000000..b987073 --- /dev/null +++ b/.fvmrc @@ -0,0 +1,3 @@ +{ + "flutter": "3.29.3" +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 79c113f..b6323af 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,6 @@ app.*.map.json /android/app/debug /android/app/profile /android/app/release + +# FVM Version Cache +.fvm/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e560150 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "dart.flutterSdkPath": ".fvm/versions/3.29.3" +} \ No newline at end of file diff --git a/assets/icons/SE.png b/assets/icons/SE.png new file mode 100644 index 0000000000000000000000000000000000000000..12df24d36d4bc7ab6f7aacbb9b1dce2e562e11b8 GIT binary patch literal 4159 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 blp<3fJ2&4*uph(D3ShVMz8z1u(=Y!A%yXts literal 0 HcmV?d00001 diff --git a/assets/icons/arrow-right.svg b/assets/icons/arrow-right.svg new file mode 100644 index 0000000..98b921c --- /dev/null +++ b/assets/icons/arrow-right.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/arrows.svg b/assets/icons/arrows.svg new file mode 100644 index 0000000..c5ef0d4 --- /dev/null +++ b/assets/icons/arrows.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/icons/edit.svg b/assets/icons/edit.svg new file mode 100644 index 0000000..d93410f --- /dev/null +++ b/assets/icons/edit.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/home.svg b/assets/icons/home.svg new file mode 100644 index 0000000..2920ece --- /dev/null +++ b/assets/icons/home.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/icons/homeActive.svg b/assets/icons/homeActive.svg new file mode 100644 index 0000000..faee82a --- /dev/null +++ b/assets/icons/homeActive.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/icons/location.svg b/assets/icons/location.svg new file mode 100644 index 0000000..53d832d --- /dev/null +++ b/assets/icons/location.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/profile-circle.svg b/assets/icons/profile-circle.svg new file mode 100644 index 0000000..7ec0783 --- /dev/null +++ b/assets/icons/profile-circle.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/icons/profile-circle_active.svg b/assets/icons/profile-circle_active.svg new file mode 100644 index 0000000..4a0b012 --- /dev/null +++ b/assets/icons/profile-circle_active.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/icons/shield.svg b/assets/icons/shield.svg new file mode 100644 index 0000000..d164189 --- /dev/null +++ b/assets/icons/shield.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/task-square_active.svg b/assets/icons/task-square_active.svg new file mode 100644 index 0000000..ec4ccbb --- /dev/null +++ b/assets/icons/task-square_active.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/icons/task_square.svg b/assets/icons/task_square.svg new file mode 100644 index 0000000..94d43b7 --- /dev/null +++ b/assets/icons/task_square.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/icons/tenderLogo.png b/assets/icons/tenderLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..9fd283979086cf26315b335a7c153365eba492ee GIT binary patch literal 54583 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%0DtBcrWA0gEd0F!cxQQT zNPQ?vPzM44Bfu78ft-16LtJnu^StO3Zwyce;Z#zL1wi7W9-D^mIq&xiuyKC_Jt{I4)WpxNPqMuqThbc6^bTV zX&3?S!Uy5tNfM|iH*5fjph!JaNS}AnbfjGO;*WHI?a$s|m?8+qtzBv>ia%V zNB3`~qkWd@3gTV^6+wnMUclV+rDWq~P)hr|>m4QLC4m4xmkZaLxZ?>hi23jn*ATtq z)d~pAx!SZ%hUgf9kfLk~^JIP}3EUuv5m0U-oi=)WGyU+TVI2+5V^x;^@Eqw8h|7>h z^#RIpmrA%95onF)VSMVi2tUraD){Na)_D`pf@$uxuz9~J(Jx;QMp-H+Jw&XOJ>XGa_M_ zv`+r?TSQMk@rdH_&Qc0(6K&qMQ&&uEF2)h?zMwSoEOPC@dO>W!W@YsL-yfRA%hA8` z{fW<0_Cd9bT9!cPB{dG;Q@Z5lbBTWGwF}6bb)hMp%vJZoa($S0foU>C#Tll6RObph z^z6UWyZ_HH?Kx`ZO|y-V7mz3y!so%v8H;cC7v9*h$wR;1aHfflKiqG0Nxh^HO2K&} zkQnm=#@3%(U`)C|MWM z+4Id@fgk+1C608uWR8g-;C?k-IwlB^o#3Ki9y_q0xc}u5 z^M$wo(!zmAq@PF8k>0+s@&`+1QeL^-v;#&tM-JR^gE+igXz_HBt^k}OHo4#WGEx7w z2h=2)ZBpS7`P`x$;0K?fEnBwf=2C@1GKV~GiY-m#`rx!lxCQQ8Yo~``n$kX-WpS@7 zlodJ+?>KC##BpZCs}&LOi+A*pH(&V(M*2-Lov>Q4U{*yagiut5atEnJIl}w)&_6%0 zPgh}eecpL9EZn&-_Y&S`SXUrb5{y85lPSnHT#7$a4kQs zEkAnZ1*5$AuRLJrKCLl1afxq~q`GV#`{5)5*k_$W!5?Q9s^X!Y!&4At3z-+FyQ4LD7AW*#7bA*;2nz;<`yr$+!kiY@^Max9ZlRMJ|F-$Uh5! zKQ8sk)!qPvp4o0%ZnHZ8A`69NN!c?iL{#~k*?K|syS00aEl}LOndj(tzG_~M`U&KS zb(MvUqVp19hlDZ8eKnvv&RMAD%9&;z9kV|1(OlDR+(A}_$4R;nb-<(o)6eXP=ZNg} z62-HP_e%m<0EbLfK;(Q!k=>z1WqQf91L4IRWJJkF%pt{VCI~Bo02v%_Q~=;$uVDe) zjSMU!s^p>W$gSrQ{p2l*W}9=FiJA{=cPc$mxQ;Aa)YiJze}!zj4z!CPh^;II0_ebx z=pXJoqO%3KCqv$ZQ)1m1BdrEPn__AMB)MJ!7y>Y{00O>cX(d%&u%Az45aa;_P-Umd zCTmc=u*>KaX>`anIW7>ugJm9&R@7gA)&%g7mml<*b{;OE;SNp+IzcQ1sLDV4F{1gM zYBDw@6?#30+?b<^hwA?KHxPa05vARG6$~wQm^VmkCpv&-1khLh=tkPIZKnoSMGGi7 zjnJ=yan&hMfvJkNRxR9byc7OGlMqyXk;o0iv?E;`6M?&_NC^ zwpU$%tbt|Z^_*wlSTfP`feacXvvKMPlR~X$QE)zmX2YC;4d_@-y+?NG;%ty|PWvvU z1qbtU923BX2Lnv#A@tq2{d_Zj;2L0d5$mfgSXtaJ=RmJW>pl?d2+{_jK2WWd1CCjE z48{ZjJU*OafZH!UWdJ~-kR4@oG9o9Q8{Ei6DWH(9Q~=y}IO`$9*Fdr5tQzqPxG_VyYEBnToKKAK0|eUj;5DD~jR~2;9t7EsKZ-VfVckn+0J8m{$>4+V7%?Ci8w7;ODtLR2DHh;)lL}Y#@U49=}C&8j-t9z-jw@{6f6*s?`0;aB$_G72ywI_{@GVA zC4cs%X5Mg&NfelpvlSSQSfu2e^F+$+;30Z={Sdvh-xl7=sav3$$n~Cx-y#!BQnYmh z02-Tp%V68E5&mdl+>vp$Da;N=u@mL@VKW*HjK4cyE!9m=d5gGsD0xC0(o8^4|< zk-wMeT8{XKG6Dd=^Egjd+R^9iwdD5);(k;##x@=LxmV4n;_M48Bfzl%1&V?K`Ek|- z83GY#hO$wE*wjvYwyvg6eme$O^&pZBOY4@0=fKYD(#q;SdJQ136oqt73{g~i*!Qx} zGV=LyJpk_4G7`k;`T&OrlKkOj8#Gur2__)&ov6QWykIO7sd&plwiPdnizpdUbFfy~ zG60`{hiT;rsh8T+;}y(WLqUc8!*$!qB*>B5nBd7^*@PsWgMsX~JTW;J1c3eAvsT zciF0^Jk%tK;$g*F34*w4BK9eq_s+wH$(Pwyqi$i0+_5kbz5BIi3|i-foTnf-7sxaf z;$TP&(kEk~KsBZD^c5)f7J<8_D44)YLHFA%&h6jm*tFUN-vC0!i+9M;dyLpHa& z5Jzj5om_WU!81VMRAgRic>ZR^2>i@#v#Buae2V5!q78A57G~5$$s)qmIdt&&2>tKV zlt>ZFv#_p}g_2|%A^&l`34XkCu3-cqa1E5p`7q@47*LA0RoutAK|wOKVAh3y$HN5R z09?Ff{T|bxK{g`Dx(}ActAZjm9cf(vC4UHyn~M3_^wWf?Jx)nQ8PwIgV?|fX^GyN( zDZIhsC0HXUp-0Tp{znRkal%rZ&WK-MKX zCp{uM1-E=;1O3MjjSrYD!g|n4G9w}oHivWbJhqyMx!A3C!2f`sZ6nDCof?lq=e#1oFnC! z6=GljfA1B`iGKR_`Bdy$VF08K6a>)ZXs{~t(Hm10)}G+}kY3x=u0irs8xHCI3lc=R zK%gFgflQNwup5f!7v|669uq8xfVp7@1TY}=9EP`6Rg3;zVUhuo?3rAHFlrGKfvlX! z^*Ej{IMQ#@l~AyQnE@#^O-*{~&&i97!5OrB4wtLN;Gq)WpT3!>L-Z_>=NbiL)Y;|_ zk;oGh0;!`fY_Vy9zBTc%ai7YroW>sDm{4|yU!+Z2w`uFRsSxM>a`u3`fw+IQF0$YW z2b|)(wjCsTWV3k>y9{bkIG9hO0J%=kXbUU=Z{kupv3r17HaANLpNB;^T#jjP_JwL? zXUFX3vlS4yV*&Y{%P1})M5Al*F&V2G69(C+wpl`O#Vi^e=%+6}mHu`K%=E`8AHo){ zTUAgRWjy~1B4`fJt(a}xNYMRoQI%{q0T+Ce7PUXt{Fz4KAX&+z`A)nVuNRyL;&ApK zKS?Iwscq^*y=I`QZK_!k_X0z)AWaEYK4KrBNG?_S-9Z~RZP)H8RB0@WMm!?|)hGPRVQqs|DRO$@ zH^ce`ZHZnCgO-ge*0A9!Bd!yEef78FkkKW+17uF;+DLW;_eX5gq4&P#3@Xk(->^!U zJ6vYC`Y)$U2{IuxOQyg;Q>U)4@z@q;BSD zSB^m?XQSXR4{eD9;Wj~FF6+v%K>(SCCOZD4ScxcWUB-RkJlhPZXtDr4{bNK+W?Fw^ zAwS4@q9pQ9TiW`8HGysfWL8|sDBg*z*{<1zf&l}?8AN^CY4f(-y8B>LAx`DYV_ya+ zAk0hDOhC#YBnz}I)2M8f;e3#*+&5%g0TU%rW-AbwwBUNT)&uI<=>gc4&vi0z#KAk(>$4(-`YfBB$! zM;_v}CR$`k-C^q~0@H@3LvSO(m>3#ya_Li;luU{zm=5)a=2P08>b_5+9t;T5llC4< z22W&hZY6yAehgr6pKAgvpQT&?Z#7m#S8E()+f-~Y0j{u*34`>#^+fyj9xw_twE5ZC ztS3~V+Nlex$3wtj(PRxA-$Glq@71}lT#1e>mB-gP>nT8-C9q$u!>4z|zVKQUw|El^ z?xNNMSPi(=+!R8-f2x8*4BO40s|&(~f;n;ZN}~7ObtVjmorU|?WBJ+?VCX_p>VWC?H}WxZrHrMW`5y?cxGS~4hIVzUN(FQ&?QE^(E?tc!0; z+#@q$&rz!9;FtsKW$K@OwG%2vYB< zfKnJhVN!hM85rj~tui9BL6eLQn`jZo20L(U18sWwsBSyURwy$#g+g4`Ijh3KcJNsO zkncK5H81RoWx+Whz!+d{qSG8@%@WN%P||IQxq$WkQ@1arrmki2!bY3`3GH6%83I)S zN?`u*`_(z^KRlor+?XHEDVpi~j`hdKa%@@CU$0UH~mKYlOQMrgPKV(~1q3Tx}x z?Wjq4#QG;E(M+vKC$zp$<$@?5c#hU=+N~!x2MKc9=cXcMT09#F*wJd@0#KT{=EX}! zYU6qwIBuE-P4w(Y(?{$cz#m*Gn5WmRBKrAPFQ#HATm$e&xT#JV*7708I{0+7uN+mF ztk>)%h}78(1fuv9=e;~%@OD&$MLY?z!VrjC%1KpR9t)Hc1{lD(AyX&S9l(A%SWt)} zbSb4Q#R5p--`(15lmaaNMGESa+CRPq)Hv%OfPKOuLC^c($OIbeq~dYOqJcW8)(Va0q+|&!F9DP zI+{92`unk_zyy?o$=#Hq>V#y*Ys8j~#k$r(ziR*gh1V>hmYIqXDD~MNX zGit+LwfCMlAtI|o3jjn!&1C)v&(gWb8o>7+-$d)S9ipTC@dlbTyc)UP1RKQ`HF^o4 zJaa7z2UE$QDp0FKrFfc5bjqfylQa+sW49kyjDvM|!D6%_UO=t$FCmg)(4JrWE&&!9 zR1ryNz;ORwdT0Yh*T7GEYaI%MBKapJ2;y?x*aOjY=*F{5H_xF`x*o}#i#UvX;Q;u+ zps1MfQ7{Ra0wt{MaZ?aQJhFl+H4-kzMItzr=(6Re4nSwCu@JZh0D}g(U>dG~bip`* znhwh)leVYl3g^;j7)6sNvLvkjI!;9lC_J)`Hf-A;xv_Xo`=SU)Eh|L+X>yJ6yhM7P zuKjIatF<66{wYjD^EjjL1MUKRbBxABUjtbbDin++!&3(I_zl;eser((^OYxQfr(*3 ze1KoDaROlsE>pj#F#TYG(;X}7!+M(G*m-C~$8zyC;5m}DJ!_)GPXW~Ym|rhgCYWn* zV6RxNfWY-<#cg?mFgd@1K$Mctz#hRaG6)QN#1~ba$vCm?hmGY?5PiL~BpevRzF`Q` zKQ303;2*q!Xyy!K8B|k7jg7y$@X(+RwWd`umAE=v!~#r#qO7R&hVN8B;OItLz4@SS zS<98_5@m)nq78W?V~Y-R8F2yoj>Ye(sc9-U8#%;q(XjrQiglF$@pdERN``P1!7qBH zG6a6%^=D9X_hJ*&I?`u~?r{GKFN-1J@P7@^e&u_SbA+Xy4H~z!yR0x6iM_9_Wg9?_ zUIVwBM^Uh4If!+NK90Cw(*cBDrEy!eY%u%uHtvn1CewlfYh9SV;A?^l1Q);`zuCkB zG+A&UYfCq30gO+0Oc66eBZ{9cC^S_Q71uoCo&~|N4YYpiKHYSP(*$Kia8^W4M_4HU z0UP(n&()I7;VA5cFP36=z;vxG-Cy1oJL9f}_;=YdqW8XPF}2KGVaigMdMWNTK%-dv zHH;#aYpn0sA#KD}lZK9~6b9S8Sq_!sJ!Fa6FJ5(_EhI#7tOZx^l&;5G-y(SK=g z(iN4;M$tr6Y6g`jOJHf7ix-<9K$HUJHCzfB3*uA+^I}jJe<^Frqb4X)7H&R-z`^5N zXxsK3xIZpu%J-R35FC&Anoq8taf=K1|soGHOIHY|Vu@GeElrW)od^MqExfNIn0Fzo?T94u&K5^MpL(vgj{erJCo zWs3d8Y5wC{68xNU5N}|R0b7`{TBLKWNc7v7$(W#45~uPzxMV6M3V60OE~>}fcn;AU z@3>l_g_&mFjGVAwKn9;?z+%Af96mu?51NNr%#fLCk+opt9MRSFd;=8Oaz1Cii6?`w z>pW|F2%n?XlId?iKw!vk&gdqoFOXWp^E!!Me{melAuX(ioSIInELoDT(z-wX1~Kx60*7r9m;( zBFioFH6OOF0n7>X8hD-36E|IRftky#v*S0LJJSzx$COal3V=&Y*Lb1q#d1xTL?wo$ zyUMONUU!(sD0__xlsdq)90vnd1R2(-$n(^!xcdgSl1~iTR0-w`GAM9mbhQ!Pd4ai= z_2i{5r?EaxUYM2+wZ8}jdj{<0TWh1~89y(283bh-I`k4fyXmN&=S7jmR!d#N#sa6I zwQ5OhsI?ZaBhP{30W>Ltah@i&B?^cV-;WzE4hE|ae{a1)u>!BSN;!o4&D`;A$;ogs zOJPrxcqT|!F>`R&xd5PH_@s*rVy(76$i55cGl2R5CF=!^0?ISAnT#43h?4{pz|=@q z>2fUDS?vY{a8MP~zcOFEu`W(tFrK=QRKW27K2?@stpV|DgM$&9s6McdN`3oi-R?3C zTN)2@qG_6F>NFY4n$YgLk_mK!FmSIG1)pFs$mo(%5ZCJ9=chwhQOowmU;yyjhOAXL zTj`9qUQTq~D{e6LF9Pd((E))O$dlG5Rx;;94H>UQ?Sm=a{AHa5JZ8fI4C3sLm?hvf zSkrrD3P?$f31C5~#4Mx6(Egj*ZlXG)MiP`%vW=9$lNa{559o55L2dg=bxByyD)V8} z>bP$g_3wU$wjBucVos|HS=Kx+-z!N(r5~w?r%)#kaEF z#JnzJJe14A?LxIHd~UK(lIM*A0)|CSZ`L+RzMxR>2;ksgBv}y<(%Ae@QS4;ejT-ix zQw`$Jw+-7nHh`(g_~zqN)oe|NJF#EvgJqlGEpmS}pxfef&U zETk|lNnW0&eKbSb)=$c$2Xv9yjyJjMmXx zr}`_>(Y_!Gtjm(pOjz5_WKLrSrc!FQh|xHtxe!+v#BGma6MsozfU_>X!8GV84^U0Z zDCn<&2~J&PcA1Sdioh+;_gZ(gxWF(R4Fu>nP&P$&1U%9gKbQJmYRIWdL8B{cHjzyw z$wJ^1Q>HfBJ5VsbEZhM#P3MtOI9%zN?S_L#bQ&8|=xkNjVmV&E)px_>8s#c@(=G0>VV>yn+*JGVI6BNFh=ag%9~B!7 zzEFYQ_D=P$bw1T@V4%%`Zfd8dqSw%I6DTrv1cEvYdSCI9^SYJ`ck$wszp;`DAfpJo zTBt(FWKD1$00G}yA77lJPc@lVl||8Qm~ltzL*!CtXjD1X3qYXMuR9G!`M_SBE>^3q zfu>^2YB3jCPcQ6Fj2a0pEDu(2+W8K=^(e zi{tcUhSr64=Ic$BG9q^C)Ecs+-5H0E9@jynML*7^E!AjEa44N7msaAFQ-%m(7(*oN9Wbzyz5zt?2w z6bo^XbXMFiGMG3uFpz`1d)ngM-mHpV%#DTmtu^`=zg3sxEt*OV>~fK%duvVjw-r63 zYHSOvsEf(!yAmD2zQ zV+*DL>SuSfx0`BwIy1m3#i)W{4V!zQOf?~Z-x_GkZtJ!k)Hf6d1r}=v!^pJ<#WSNh z`5JGowIFO6LGY8LTZP$`S_J^?5|SGMGXwYop!vybm42MH%2-RGjSPz_^AwCFK5a1r zzFCKU6D^-*p5b$ndaa@2l9Cu38w4n)D94iFwGDes)>+idt8Ct1>-_^{kt|50H`3mW z6T)O)Hq&gPyjfP9TLxxQVEub9?I-%&{iYgN*$xJ`7A^5!B@|afMi&efKtN9iM|_En zHjpd?2+A^n`0d9x)5e#3O`$0f9}vBrre?~!8>IB#0ldP;zMw1lS}lp^-1>I&Wc|n$ z*=kvIY=EOMaSmwVynGJPFWotdytetKF%{|t1TrSZ&Xj4nIG+A3o*ML3^UOmAWpaON zumMTo`6x@v%OT?UkUhtV9^Ycz1O~(Yt>1i=)DX7*;7!zKd;5iEfqEAtZ zwTk8w;>DZ&_cjoH{9A^`X)ea+Vm|>EIe#w|h8> zA(7&`k|s+kz9Wnk4dyHQVXT}R|E5|GNWwTGenc~HAypJCsYQugp<$c{j&!irqA?^c zT1@nwJI_==V1aQf`8HS(U^ukdGCnf`Q~JwwjEk?nTc_}bNgdwMZKDeZIeN$Qoe=f{COQLDuaBFJJPratajP4s8? znydl#-?+Zj21p)TctS0krT#T_Q)Fj^B9S&z!tRWKhW5WmYj>tsg_{lwR{A2r1R!2# zDX&OU>jA1(~({R3$BA^c6Vxb9V9Z~s3B>h z0f4YwWXD;6J_MFOWElW}SpY!ZD?AY|0;%==gIygEy*HLpKmb=A!^y3hYy2Lr63o&j z$r%C={A}Nr0|l!4Q{@^sCJeqnxQIh1IH)1%a`6&1C$Q<4P@g%==7wGMWND+Iq+J7G z1h{-`B7|U)MY^W=`v3s2nJ(ydqLQiheC)2SK)M=RR_un$iZC;(#Tr9{rI-nTEXO5D?1to(Hd`*5_MwR<+y9cdh;U+>d+8ej<>)oqd z1D}7u6n%jBZV*_56{spa4*&w%+Pf(mJp)D)yQ<;G)lR@BJ$Z)rJwxku_89}qX-Pem zbDyVSXNyVAl#&JO8ZHdob~Pi@L}oyNGL2k{UJMFG7|^Kq+k-)~_UcD@z4f>zkze`=o1Q#JUDPeXn8!`VBCElr!YFoG#%2nlqIr zVD9WrQ$9HJyh%V&mIJ#qzz7_8fmUzt)r^3bVp&bLuxl9$xJzxOOJ`E%Lqcnl@0tsN(Kx z+Yb>vz0CxJ;#%uc(&Z$Z;sygUgIsG|g5<<=I}e*Qz+;24|33^XEq+cT zlt!aRwX5|Q=y1FP*5vGtQBnjUphm7*X{eA|Pk$Io5&*_7@)4VJ4Ho#mHAJ7f*OY^F z{bl1l?|NEi9880;Lh+PB*Gdx@1puH6rhq$lY6oOd^vdzIyQ6e)wT=ZH}d!DWWoi1I&M$lOAk=7vpZajDEc|`BJd7c6S z7a7+;v>v3`*4w8gHV_v;)o(TIgK}ea%xE%gro%XWl-(HhCT{vHZ`#9xjq>aZp!?wh zcyg=B0%*1FD{emLTXQ-T$MVGY$nU6C;rWVlMUW%bV+9D1k%RaEY6Z-0Hz(UvsPu_s zNo28vD9_WPI$Y%Mt|R)4O&@fFz(N|wIoA;i;9xY2$*YyoGj}d>)--=)Hcj|Ly%rO3 zpJmaL#727uBUIY|3~kuitAPN7i{Q8)nb5B%qhw~yAi8v^`OZv;7tax0-(ZG$JXFQ4 z;<_2fwdN*SWPqmoR}PY|X{yzxLEff-z%RUJ0r_(-Q75dpW$9w_3Ng4mX&~SWKw+yB zA{eoZz}!H`B;0sTQv^_@g<5aIQ-{}2XrII_XL>|wf$C0TIW4bJH_u`Qz}{oykRM7nr!3;+VLDP~ppLc*Gp*%0vYeRn<4 zpM1+8!GxtpmFFL(9JgLXE*>cNS)I*BIbrkn+su6(shstIK`X3yp#Tm(PwTe##?7dR zDqKzzEeKAU-)%rZRzz;@xDOrD*($7OmvOVV)tH3olC*U#p9;cs_sz8{iGKRlIpoi~ z#<&K!bERGvj4nIu!(3}gNVDgo=f!ZTV|6t_ezE24wBKNj@mtylN6vdGD%uz(;16;==_DoQsp+c z)qZ>4MP8$F7?+D@iIBj+hz^yJx&!7p!zdJ3CgYB#8uEAQPxNI!gGxeR2L2^#u`2k z!juryhPB>C_CHJOclH@@EXHD@H!nmb!#{~kjEfw|-_x=|OR(y=m8;~}DxPp{=KwsAMQcY!)y*O_$P zsu*y2V|_g560!MV9B<+>IGgsFQo#L6Wp%aKZkK`qs5n@LMY=H-_n31fkH+rxib*}U zi|Cq_hR!Ps`aDlG6R!&{27!eP*TBcWZG1$G_)DB7BB)Li!r7B~Qvb2^eu7elXBf+_qZ5RMz1b+VZ9`a_MXIuk?_LyNh*=Ac2 zXb8;uLQRX|qtx8oMDM;%{1h*JEbGNRASrM@XWj%E0O&dZBgV*$-si<&l#RW-3>i-c z1Q)aMJLc@e$zxK#bcf$JxLl^=1iL{2Td9v05*!^kp%!F<;u_a zUN%eSyTVKr(z=nZ%dYM*PmL{qREC?^na%*@30cb8061?9*q5Fr`t$ot6N!Q+KoC(y zP*}Z4+WEfoYGviknPVtVZ2n#$UoHVH)*Zk;S=<&{skHZpv~Fj=wko8;kkRDh5t)qw z!G?lBrAw9>mq59Ea>ttv@x975A;>db(;oTBM+Z!SE4xfJjt8w~@1 z!1q!>skI>TICdD8^A_5kK=wI*tPgO7A*4*e(v$VS`5<}liA$@VA9F-=lUipFtW`kZ zUZPz`DT)e*$QG|T7>03+Tpa8YSvHI4b(bscj%F&{QZ)||HLmcvMLTxM0D(P^M~pzh z33wat8sU_q(6%y0IvxDzH=b!;m&dJjsn8LYX2p71I?JRUV|H*UVP7cSEa$XKT~H{* zl(hB?sM|X(uvr5OZ#3zHm_Oro3Gl9lqZLezfZ<~_cXl_u>zd>{>y-hh=1wZxECBQZ zz`6ps#?+J6KQjdojtdAW`|e(xi>{9_Vw=8^@NACtVGb|>HU3uR5pq;j_MzLA-?u|elK#C)N44eL3}Jv1 zy9dhqpQH`D`ZZ8Km3)5oS7P%Ru_a5dUq!TPUd%lC8L&{KbsXskvAz)F&^^NhWUfHv<9yKw2~B%a>i|gs7rsMLFY%PGvhE(FR~fbDSCv z8M9766r`kXduABFR+B)tg&a<_(E9bb%`h)+fPrtnK=k5 zC-VdbIABIk0efy2DYwyuXU;VMpkzBUY3f`|l&FGQ4kiyQGQ>VWDHlz?c4_aEwD#pe z>K}=N#7@>FfWO{BqLpg1yz|2Nd0xCVze$o%rs6)&nRWySwp(VyvAiJCBFl=TRT>3M zpC<86KdyXWc*_d!u>U z4TQ_91VW!mwn=W(td~oc0eF0~aRC4jpQMViSnLpn82VV?>yfG7El-$rKlHyB15B)@2rVq1bmC~qebX| zBSx2eo7eaOW{qwy%V{S)V^RSGWU~aH`zPb=ErvJ-gT=|w6>h*hw zp4?*AlcvGNAtC_KKrg>t9gZKM*P=+{0e9KpV51D~55zqHbo*ZAemy1#kn|D;3qG!& zxK<2k4z1hK1WHQB2q^UU9h*Lgn$y0Q^aTbfs9Xk0H# zxZsuN#FM#h&?lJz>ALPnT_##)dfU9b1Q(rRZ7VmrbNS`h&}U6 zJiyWQ)U)s``q&%dgBSez(Zv!>N7Wg_m>t---vj}ICFpF6fi-W8foT4e^%?-I6QWLs z6tjhc)*Xq`|1v%)I2jO-mh+3}e(`37;^$H#jWGIAluwb-q8#9a3TO}7^g%EJ@_qWf zL>0k;Sx$d)MV<A06Ji`igFb>^XhnFPy7Swcs%K2f_pi-Cb-NoY4}4mvLSagUb3x>f-M ze&LSU$~ADc=`{d%8ZrQM_rNAIuLhNg+j9Z^^ebo5@;Pz5R=p8!kVvkH&Ul$0+zn!WXM6B|$t zV}GYqYIzf$a2#lXL5FJqV*uB{XO(MU^MQDrs<{R7B<`ung$3pQ3wNlA(xbS}p@WuA zDp0b&dY%xGb1obofahCgQF!QusGtz$5U1Ia7cXAW;@7ModXtR>;CVLIS7l9jLxdnU z;GB6T=ypT|(&fr!CgK7tVHRf~S%wvQ6d>?s#j^e^vIY<=IAARcvU3S<9zIH!UwtF} z$y<`&k(W*FRD^xq8}|}Dxz$*}Z~=@2F~H(B&k)JRPH99SKOh&Jt~)EYTq zm_G|gTBWSqqo@L zfd1W7Sb8V@`m2r3k-?_ENVm+hNOqO2TZ{v;0DidD0B5A2GD|IMI7lXquSph~ag8Q? zE(~_q)rJ8;PZ!J+HYOrAn`r#Sg1qQo(zlI;iYWP?zbOtlDA__7#X4YpwIyRICZ33h z5%|^%M1S&4Q=8gFnO+WP+%!p~)_5^J6nb_1nD(FO?k`?fQ(x84H~Ff zgMrenhiUEhV>)1|XoJH>?BDAyHt`fp*)`b|@w{b}$Y5jq;XKhLab}z8DZmOlFMwGV z5t5G~zN0gB3R`H>2Y>d~+2n%}K-K{2ZWLPS-LIUjOLWU)n>+br0_27zV~`-8eQv!1 z08ecrojlRrYQ|7!<%G$+dH$2B?^zc;D2YQp2uWCI16Zh=qp*&RfOPMCfRx;cgX9F1~8#Cx(R zsl_!squl#Pn(2{seJ0?^x19!wO_z}J0guAbU(+!HXg8=P#j(wFBwR#Y9ZlMugrGrW z0=(}Qlh4cPJxm`%azkBGr6mUeh{ic1?UuVTR_iN}7xAng2)6(N*!)MV?;6i7Q$GKm zt{L>g{%#6)f0veA^^^3kKkaEB?}*b!!krsg9Wz%OxG`01+3PNimH~Kbt8t~krBoIr zw{=4=u?foHNeRTVysqpNiemFH4n1mq+;FB@QzYhybOY$mdgBBEvLKACPQ(Lx@nWKv z4w$lxrLyyxoC?#pj8cb7aX}Q69DaH`(ZLf2i6Q7I`W#V3nwL8%v&tA~1nP-2Hvt^4 zQxo!`mlx5_O)r?rdh9D7&3ew;Bmw{c6M{f5WzhxwyXfHXENX9Sp)=+Zz5iCCt5(DS z0K)SnZ~oqLn6yw>sY7`|dG9%9(vVrv%lYJs{s}>iD{*=4(*F28obN96Dg>4-EV}mg zb~@gE6@B{cKHYe>86$`;bR)hmVI^m9zOY_o5R{hE$3c~__Sf$<-2k~1FlW+WA40zy z2-Dz^-lg?ydIpi4TElQq+^@s0N z68zz2qUUy)4GwchQ{`R^2ISiDz3gY(ltqre2GSx$k~get&LH~Kj}_=O7g8d+J8jdK z)Ol9LtPUg6I10mxWYD@i|8VA=h=8DHd0wX?0Fz|Q`7sz?a z@H}Th@;IZVL7vi9?NN+Y*%yHTgkQMXP?`84T(}^w!stsPHT-e8VO%g!Q}?`R(g(L5 zjFp}Q0d6r72^O-phJ%!I!}vg%gDKggXx`>#1<#wiDe8izC5Q0=sUnv%CXQW1`yQij zJWq7EFIjXdubV#$&+$?@R_vd@pXj&$c{TmlqrJNJ1{)MmR1CPKf47i>ngWvT;Wgv? zqG?TNKr~!N_pdW8m?c9(6k*ED*9u60A3OgGP6a&e0@xc@0)(D*YXyu40AxWTi=EPS z0<*8UMPM;1aKa5OPkpSazTL)(=` zTVev8So?*eh3DpICyZDPJ6fL2S@Mgtd)@cw(W6)Dz(C|S%Z-63d+UhjLp8x`BNqE{ zCcq~YYxZ0J@FdZZwNx7HrL99N>FSk6zW_w)bY!vdN#-rfvn0(L<@8Z>lazsjCkBZQ zDX_Sp+iZU308WgBbL=chDDRsL#^HPt+Wkp!W^4`F4 z0Pz3ca;`}WB%wF>GptiwIW-U2&v~B=YQdPG zvfzs^6YW<9@P&&^)__|O#l28jS-_D&Zx;gdljo*cX+V+rO8#ANHxaeYTD_YPO7l4k~mCEoEKY z%_>cK7i??;20^TAvu1!v@F;aHpN8%Qu+`Asv)hw~n9F|nKBYFx z$*P3H(3blP7al_wNz~eiz_9=e{JCoE+$n*8G%1UV1$27BVq^KDf*!s+S9Prg)e=4B zAWwcN6t6cGP1e8>wSX^N9G7yG?NhTr|EEa;!H32j^v?__tc!7h+LMf$mqCyy z;~dzh%k>XFb&qlZ{NoGCyj6d*lrIDw@^~&FcI5aLTDQNAI=XsHv@_X4TplIz?6WS_ zeApGiw)TA}&;~{Tx&(1pZB3NwR)Azx?=k}bS#K)=B7UT^HFhPresXu6Lu# zxqrw!zGkI~1BhI*u9~6I_mv3&0g{H&!Eu36UT_WUQb1ta;p}d1X(9*OrCbv46G)zK zQN0Ou1OSl02r%uNxOf>HEBs#0TgH6&yYDM{S1|xXBOx`nb{LQ-6t`xF)Q(X0XBfrL z_0a(Uf{_>yZP{5eU#1-MRsyjWpw9-CiRKmE~ZFklzS-r)B-uNlV054P2HXCI`9d?jfQ+%Y$?lbM`qAi zT)n~im33^vK9BQ1+GkRc=XDw5%k$z!GSxsqtqYGu!Ja$E002Dpw8iC?We~ORC3Uhq zPS!>4FU+{Z9Rj&>xiKhZk00rdj>cdrK!8m1;bKAn0%y)wK;W?HvZon=3@=t!;{ml)IckqQyfWx9Ci)h7BLgeowWP8uh7?aTuyJfvZ!4H zB-WSyNJi!dr@(;;D_Gs|7Y{0s_>a%)0yxxjwmRodixj{Fh!fL{K#y)h^}_xxny>t5 z=t;rKPBzZT;)cf}<0c{(fM8JcdnjgA<)(K)EuDSGP049y1QN%lY#0@+BOnDY*$x=Y zVwc)ahHPccf|snNp+Dot8y{y@WC<*%iJxLvA|(=IaEY@1FJB(l2jDePvghun&4ZM& zm=F-aQJaifIUo){2Kn+pDq9a2ARv8Qd6ERv5efi6Ce)4HB_&(c3D(dHJBf}BnivWI zrix*yg5IR>Y`TPLSq471MHjgLev0TL|JhFigM*3z=%i+~>+8uG#OYohf8HLesn|m0 zW~ISOC>%dvH$=N(R#?wj7ROoSrR2B47ao+%^R08~=!S36Lr1Trw_Rz{#6tUVzOA*T zcKIJC*+b7k=zFE;6it4~j&g3%M#7$m-;YRA4MP_poH1FQ_qWnL~SDdYm5Edm+8% zqBtVjr92~kVG4&LZJtCvTKmJw!u^BSKKUKR68(#E0UX;%)UnKL@_@==DeW6{`lN9U z00?x@$f5Q0)UHnI=;)wjvtyS)AT~w0@v+phei_ZBC|`$2#z52Her$XpeGqX1bGuA; zQzA!KgyI+!zdluC!&M^X_sQBKGG=7$ZlcFGTLz#twr;f>s8G4#6H#h#V6BShRo;)r zf#N-agJ3z(8UmyG$`u9(@f;|Ks)%@Rv5<5Ljkd>57zl8MTN*M_fiDMDj6hp$KWv)~ z6_S%PufiL(m-1Y(XbNBKIc|W!Y+GVD&Bw*}6Ci^oUdE#oBJ}NV$fHQK&Qhr$z_j*I3ym~T!s38C#Ft5{OB)MQQZA_+e ze4?2xHa=|>`Z1%tZm+2t*=N%LQ`0~*eobAAUmJgpMbD3mg*fBtA_V|0UshQz`gE@6 zq=5jbjJWz0EM27ffDJ&p9DXc(STedZ^OPRnie0}Vc7S3<3EviIO^gQ?FfKA&1F{}; zMez(uE+V4o88^?O)Bk>g=>Pkl5)BTA+Q$!IgLC3WC=sCXD4EAB#)YRqQxO{2N9C|rJDkBLVWE*c&molr&#{}3bUa%JsXNVg_ z!y}^c<)cJf4kS|t^TGGNmg$Ey8A%nNQoZF0wv0i8Xrp} z2q21rBteTSzxckb&(QbxpHFYR#H319umLo^3Q}%NYzTbf9-`m>*R>QN3jl?H3g{wv zl0Q;UEbyW&cET4a?AuMx?P{g2u1;DpCsvwmqJR#olRU&B$!K^M-aK0@@MhhB^s$4= zs90#T2Ke)7Y|&KB7dcnueg0i&2Mh)P06;PTL69s+$9qQBw+iQkb*4x>3Byi1pu==e*M@(nNneEA78kV$zLK8i1vJ`NlnwkBcVYN4Z;c?{x_&QuWo}#C`s8C77bX56W z?&4+Nm-hL2W;{H#>4ko)2^Q4pgO227qPW7yNe_}>IluY(j95S`a^y%&l~7K zqyeHGFz%xnP+)&o+4;S`*ehzia^{%g=yAS|{2EFDgHbzQ?FCn_h+XTvuW-=g>AC?Y z1O!y01?6p2^~zpYY;Xv0*mh8DdWYlJWy((;B+dWk3G_?$e$g`u3%(xo$HwBlVuh(I zz!ax9g-D(kEmKxy3*f-w!pivHr z#TX(uE~+eOKa^|HJdw3_{a7n#R%F-&3pTaWflWW8@9a8{-h4&DxR0EpOeQ-dg#(u$ zT+xoxvydwK;lFs4f}`t|X?L!O{vYoTvs%$h*z`77kchJe!V^2_#eMBGcXlV8F~_VU z0O~;-NEL)}ZhfXzix{?OL#0X!JEF~PL7}6zpb%Q?vTIhRbWa6)gu}}&ki3cE7QJRr zL=D0jFs$=j-+3Avl2wuW9IqXm7&iZ55d?_-8BN8c?vLE7M5pZ@nKXBRE0N#d{$L;+ zP~He~K%gKh3qqzl^=&f5rR)A^%BwkzE2fFNJR1Lk%CH5$O#M90);}cg#y3bfPnIFazn^f z`k)Z^x`yTW1sxpMqJhA{oona^`_7>^UuNcr99#V{n*6mCh`1H$^7{0>M8Ek@Ybfa3 zrGDH}!vN@FNYHlW@&CBUGz#tKJ&FrSS*FBqqOkvETD`A}W_7pge0j|PP!e$Gq4rcF zo`#ZZjITet8Syk+1ifnM9OyMb0ImUU%{f5we+ zC(5Ux$a?|yMz}=KXXa{~23QWLqHlmSnlb?b_=hJ_hSY8M4AX{~OAP0Qx|0%JBrkbC zdfh%Qh;zr{1x1Fq37|nV3z1DBqR&mT@LC(O)YN|{7r@89fl28_zcmnLU}d198@CYM z7r$FZ#=23!Tt~n!Hc^1A0R#$G1Pj)IM7tL=0~|C+w0r9s`p(X?>2)@1K#t+*Du?m? zHgoN`UB{HNqM3mLm5*;2?lNcN{D@*+xXPp;M*BieR@*it&8@ zWwYS{0C0~9DG>v})HjVDr<5g0V{p(62;%|c7%>2xVI_?}NOb;UUpZBoG7tdK{h+-V z1@eibna+6&OpL(RgXXWXO8U>51yOS5crb+BSHl>r1w zgEmG$;^3T%wt%4xLcxAOGZwUaVE^uIbnn(hbl2qtT~#fzq`Zlp9~EGZVpkEDc>Nm% z0DkRnpQQ4^7nEjSWHx;i{n2j@#QBU?_aQ|hAQYs$=9%wM>`2hNjn?dKqn@5F4Fuo| zFNbjjIypbHC{?p-EEB_)GjA*fKdw!JJ_BfAhNeT@eULZRG#8%!4mvfdc4gUBgbcAq zHktCbUACkM^a`$Slc<2_vK8DUi75MfguG4=olO;*Du4(M=knToZOTC$_W?c^l#0XvFwIC|(ub8B5o5s@7brby#^jj=f$>10B~*w4V#aF{ zL`BCEhfZt+qx=N7idV=Vwu0XV5b!@wDgW;O8`4F6`1_*o3X>%~D_8)bw4$HuEN=2r zo}=V({6aGYs3ni|!O{t10qRO~)`5omVL5*jC31oAA5j!D;5TbuJ6r?b-*YCt?MgqY zAx|VISnu>LC@v1g8^4^lP|Ug=@V~rB<=&T#3n0~}&l1qdiCq+F=6tk64C(BFaPT0l z-rK5N106aonJaX%r70^{W(^Iv*G?J(y!JSakYD2fNfZzQ5IE9jTm#&d5!W@+Ct*Cq z@_LVF&Lk=TQryuFpJfXl_fazau}$WE$Z)~uMuIr1$ ziSobgZ&RA)X$N^M)4e!7%q<(Ai$C4UZJ)%!)b|Btt?`)Sax9V z_Vx7O?lbAlm-{A0AdFM>i`ZJ3Hm~Po~)M ziTW=TDCpl$&+jTycXt=9oMT$9w%B;Wau^4xMdwD@7s(7rPyoR^0Lut41jcdyaiRr1 z1{kpZ@SSvR-i*gvdRJcMgkGY!5+DkrJ-N*Qj5g~6kQBsNOE}F?s5Ozgkj2%1O@8be zFWZiQ=mZECKuc2$9w;1p{7-i*Y61lC1_m?)M&RuErj7vO1OkDWMoT-(qR2&?_8N~3 zqraCF5ZH6nl#J}+7PEf(rVEis(tQo$0)Pnd+r^JGz;7y6_xHYPj&owjC=t)utP{VR zs-0~0-|0S7Y8D+@+vYngx?M1YN3Sj)EP&2P`9XXtA$Eu$a1x>;LU zWm_O7vM7A2NYfgxrI&U+hSl-^>0zQ@|C=Wj0C-7JRSRiaBszgOdMX?`O6&F&X=ZmP zEuUj7Ee>2|5KUq%a-vqWcowAbnsGBE5F>B^>4V({2oyy6nFInSv*Cu$_m7lg5Q^`I ztM~gG%ysB!HNTC)0e>bBBEc6V0gfnUMhbRa!qp0QFS`KB!nh-9fzrWFKm$w*dG zp#Qn)5E>)^HDcqN(VYBTUM34mv;h+(t~S>a&=j3#ilBf>LpH@#D+~}Qr*(|-Dp^x^ zV#**QcZT6PSPfr&R=EKFC$Q*06wxWR>A%BAkJEjdXVF`)ENW#NMaO%|tPdhOx#(ic1n4xg zvY88?Q7(Yr`uiVIxqq*5O?cKtGp&NNGR#o<#BN%5u#$9tjXg|=GaUt2#~7U^#vga4k;4Imq(O*Qz55u0ahxg zJTESs1L10VK#Its*u39No}RY!G2sbU4b6MbYkV!RI8h1kzn&oaqq}W75!p(9zC$Zh z<>cmLNN^{=Q@`%~j&PJQVUY!kqPbEiQi#feI#|#~E26?6n?ZRNnL5W3+FlDIy|jPN z4tjXc3cBku&(PprC7Tv07jJx{h0UW>j*B~e?g6DQzOa!-`t}+C(%fa^GD4bKaj&;l zzh*3o?NsX9PpkL9HPERG=U_b8zsmk*861}vk*r>{&V_{u;q<|IU2z*?&owA$biK{5`Xl`QsCppfLzr=rMhs6dupuybFI{E|=K%mjV`$$q zUU$Ih%9MhDiVei8v?AG0f~OE8aOPa)7EqS&mV@zTlc$N|ihEvBKBz>?>TmlY^9Mgt zduwb>OUrt^2%g`o0f0iLUw+n{OMFibjJ%4uWA(ADbU0)gfJUgfVO^ZiDBKGrabuwX*$FOO8UOo*m25i38S(g7Vphx8-!i5s2Vh1lMR9z zwZTvrw|vGeK6l?5v;#KBf|5jWpypz7!{&`zqSny>KsDgN8+yVzbrcCX;}8g{k>ksY zs3TD9Hqqh3$BloSY&%|>f>ksvl2D=cDO-|PpL3H21qT!(aPOA+^!96-5|nRItb8t{ z<2gqju|D)DP&71a^Zz`g=E&bZN2P(o1^`TVC&vhBO4`X$4r*+|fqfbXELkv1>lN*O zEL%UUD0-AfiPjrGR(~ypIJ*Ot1(Bk?pgV5rrpLsmFcdWQK3|1!23v~bxqB>uX$oVNbul^<5K0%*22IA?P7^n;g|(Hk%GO$`b$rf!8nzQ){@P72bvKKX5; zkAC4L8ae*5IZ&Y(kMp$gb73V2k=L8&LZOYq;Uo0?PM>D>bnAS1$WSS6z9U-_=S>oo zN=2Dkupii{kO_oNrl{Kjc2TCIjVktarnB)ih+RS{VBBx=ldO~eh?lHoAo~GiU0inx z0~=iqxNPbGfWZYQXTwbf0VZleP!2)BSSJ)ANmfkON{3^<)M7y~0wG)jC5320TVmMrDR=p$sbbGH!G3s# z6;VK7*WLs4wY9V8>NA^7?!3K*sd?G$O=+f&2bSwj&dH?|Y7{Q%Qg*cxdV{rI{ z(y_;lzU9~n7o@xH06hcjJb~_jQGytNky2cgDD5|JstS z;yU1P3w(Ej3G_Klz51^OXyrVmzGBv2UBV9~~p0EIu0PGbx0g+#GW(Iu?Na@|FrJ+vvs=QUttklx|9-b9bRYAbqq~_D6Hg%)V#Xuvq$K=4?U{3d*1|MA`mbf z;V(~q?{to}{C=La`ab4>T`cN;aC{qWIM7N<7j)60ZZq!z26S4RGws-Fi??;iQYtB#rV1>=Z5SG91=(}nF2+g@9tZybfrjNJOtd2wiA8hd7|$; z*H3%4ucy**zxli;cZ7@yt~<{G+$zx2(!GM-cGE(-@oZDB8`SkcDOTpPEwPk5kV^^o zfR|i%yeR_^ESX8PRN=^Fvy9=zr;YcZT``ygFh#qL7(LY16!*PPB(Ko;eow8At7Ivp zz9Wi%GxR5De;8*an@$Tx6}4}W*4@@psl%qb{BiAp0Q=8#5NFxyFpl0`qc*a?{vOfy z*BfdDsIyeAL{WJZ8LiKOb%A&-u*v*D_ZXWNi^wr4@!AO+oZ@c27+WlQH{g=LBXpjt z_Ivbm&ih;-Adi#g2ORH)AHC*$m#(v|+yddTmlQfWPI2eCdKWb~BZ>lQYSR|I*W695 ztuv^pwKbyQO6qoGsE@$N}RQ>}FILva>ChaDW<%&anK21Gm(vRP=h;BN|#@g8R zqRY9KW8Ziv=6O8`uX(r)%9bsV6+_wZ0$arHNiHVF8zmcYc@Q_IBGSEK(wgVxO-+L|a)MbTxur%P%M1f+@F?4*z6xt&Cx{*JO*c38ij)$xg7r#b-xOp6B;`{!i6 zczzCkIvG^Si=2z7G&vE{a`R4D@)SQG-FM!{R3jdGlssF zV@g^dQbARQqaTZ_+A)JvQb2%CD8x8;fRAEt`PbHyeP;#L{WL(Z=g)mj5+k?+KQ}hh!G1P= zfY)b1#BFJ#g59#t@$xi&Quif{6#EaU)#w8N0Kn;yQEZiSj0Ol8hsaGwuUBF5yxcj<;LoJF-U;O4W31A+U{?Vw{l^m`BcM{&&e%0 z5Z9597p4G;FdTg>Aj9x!AK$7@uGbtLo1ESVOJ>t64MatDawRhUfj9lgH6l1nz3CU? z*Z6Z79}cKH>CS((COWUidCtx_n@v%eF^}GL+ZlA-nZ}i-D+_uCNNaZ^#q@1Gs20u~ z;OrimO~RX>tRcb?{;u_(Ctd7X@vNUCrYP~$$gp({aEt)iU_tyf%{27|@+J`o;K0bSG>%*N z$1(vG{`3q=1Z-qngW3GeIh!#mv@fK0-F}8<1Ug#`00_gFCF69$y!g6DlY}2!Z05Y4 zS!Zx%)3R8*(oZfyLRQ7qGaNVy9m;z2n6f1c^^u&7UPxTcn#(#?%v@ zTQ!g9H(pJ2qguEJdqr*VI+4^=JRx$-NW==rARg%kaMN@c?N_AmdC6_XMg8)3xu2Ks zm(Tkt$CS77a}-v8KP1XU#{H%i^14>34ZllGoMF4E6%5T?I!?J1ruoCLaubhAE6afm z?fV%ZmEz;%Rb-x;l5+13`tR@Wq9?YPptl0Q99nBHtPcPnMe2hH&|44?*iDeLiYizD zs%`{iQCwD(_n9NghIoZiFV~)706=6&+4m+uM2!FdNT!$o7PeX;Q4pNH5Nnld;PVd< z{a~YQky&p{fUtu3u_rcteofkXZg8JW3zTCmgDor4{z6I(d`V>xh$@0>(%c29E`$^| zDDgT~ejoca8LcBmKxYjgg>c3Kv)Sp!LvbE?t~Wg`{wStMn0>21O}Ji!tKwX)S_7ki z{I+@YmRGK#Th2A9gWSZ7*HqqRG;7seyV8}H2HNu^Zae_||6rZr0>B?L0L+F+_C)I4 z=}rw~so5=3R*-U0i5^HxWpe?Fzy^Dx&%g(6F^w4pM=B>`-WM-h$cdDd6sz8SF8Vwr z7cpD#Zig^W+;=}OpZC+Oc&bF7)fPk=%OKeWa$hG(_}^q@Jg$RKEVd{zU@^5Xy_V?2 z%f{OEL>*Oq0H1P^Qs`RxkpwYIAn!8^;2t9?1e9S3Ww47F7uQ5Xfu+&_1qYv{H(Wxr zv?qRv%L>l@_1Ldr4S<9k)Ezw1Uw02eRGP(;m83W#nl zQ4{sjpT2V@-Tmux6%lYg(ZE4VdxvIZ(1~!Q*F?leqem2v8sE==L>U01y=N@#EV$n+ ziyI_~?1#b(($|zTBASq5WPs3ref({7mjVH=R7?O$Egv5=hJ}o!k*)!bPvQ;F?va@m zPyB@r-S0AUa-(xMyjmWI(79%E&taAWw@8!JsnjJ?5D4ds#!IL#!F2#!=GhxXXV!{j z*3?N;{7ex;&P0sBokXv_#8k8j>V(1@O?Z>%`@A@P*SdCqf#;rhwX=36;f0y zyLqOG70?pKw;Va|)qyF<5>;Ewfkf;Mhxjx2BLf76kEqMuNuT}j?ev-pP3df831F_Q zoMqWXGOhu=dDx7BLQ0byUt-3LN*dT6O^>ph&rQ{?947#)A6WyRzK?W}kDIO`Z}Tjp73r}yUgEtn zqTeH`$O5RAEs*v-Zd`%;-O+ba_2Z2eci_f1R6E89S8-9EBd6xe{_Bc^6RX^=kqkvr(;ZZw-e7kqGVDS%)AW;7>{ zBaP8&OlB=fZa@G;ZaBQTB-G<6xkrz1cqJ5bn_dZG`qy+FC*T!8f zaBs9=K6y-8!+;AFg`*tH{Vjn*_e<6xdd|*)0p+wShJ*CSKh{CN^h#4BUKbIvMW=A6 zM>Y|?@sqpg*zVP4gXmahnh=F0sxBg(E{}n9xf4$?0Rcs|5dzx?sXRpg@zGb&n=dz( zJ`_Hu1+t}&23_d6vHg&lJKS`L>t?tqgbe^t`;yQdR2dk}*I)N%DH$+`EVT0%nrkhC z|6~mtqHKVG+{DiFCc*$9>LZ~3&Q^5I@4Sxa_6rP(XQ?Lu0EuXNL9MeDBN;GB<-0zu z#PL!d`zg=ybzs_5zAsuVL={1R{wUw=J64x;b;x+H;ZmrmI-frNjt=_8n+*Uc$zoFW z7R{Ev@mq^&?itsZSb(8J$sd%u$y;l(0RS>05>*D)ty9!70Df~9{nc+60072NH=!z1 zqVzWA6Bs0PgPYx9I&BWxcH7eEfN+h91_;Q8c)}nFgb`8nMQl}Qt~VM1owv{cKv^%(eFQeX%JA4kN&0$;V1_ z8@LQYnl%)$4T2SjUK7VmD2p+WrN&(eO&gN80wNkt+A*FBR<8=kNo3slO z_*kyOOp6n!784+a579dqD7x08KX{|3m3v34JuYAC6efZ!gY={AM6dnCemc5uGwBV# z&}Lc^7u(Gy0_!pB5nuHvm|$hw2nj9#Fg^+x{QK|SN_Smq+9|`jZz;xeQC23E3Ljtq zZFC>sV&aYf9ynMKe@%rX$ZSaMi_}Zns<)5fKE@t#^$NoPAPA7Jv+pNAFS8`FBDn?u zIFWKWF73#^x{V45eEMFZ2iF-|uUxL*g~}9Ig+Cn+EVAWpfRu8}$KVY*iY*WubTvy~ z9;;dbqma_s1<(2I{2tT2E7XhlPv7FvdvA!VcgaOsZI*}j-(zb3f8%Ek)6tC&r~@oA zSp(XNEKpoRH#bYAJ_OgTG#JHs_-%9P?>}@2z2~~Pdu9;Cjkb7AjM%zSO@+!sqE#%I z#chZYC>XHG@5jcW(_nMsbj`O&CK-B!(?QXC9a#VuE=tw`(C?+}?;W`Z0UUG|`MB+C zU<5v|7~gwdG);%{#ebZfj23_=H~4CsIi+mu{2sT&X2s_nc0g|MqX7YaucYB1u;kDI z?)P3#I>MU)fV)^F;NSp7x6Lwuz&rou1npjZA5n9MX{%dkrYHuW0R%E6m@Kde+H~&- zuWb%}_LnZvnIcH};wXOz=Xx^`X7@lSUXvi9PXU1+yhOC)u%U^Yi`Lah4au5FMi>mh zF?DUPT26H7GLr=m#fXUOAH_FO(!H1!sSAuMHvn9y;j#%9{MFltZaK#wy+mMHPGz)w z-)ep=!JH?agM@Z>c7qM&_en_$^b4KGX}?1U-%#Z>@`aV9d!CP&ylw!1Uw);r%CL}w zAf0~szxu%rntz^}C?2B42I%B+<}+?00Y$M4v69927MMxkl%j(k+e-d?P{k6 z^M%Q9xU#bkG9%!5PS9XTRsHy*y(i7`FNZPxkL!bL1%=zGjJqQz%H%1U_pjdFLhrcB zELuJni0=gOR1?k%k6a>3p4>)s+aK?vz8#M$Gfz#DHiaMu51RY1E_L650wwwlxYg-& zg}MSYWD+FN9S{@K_6R_eDBnix6+3h-05Aam@@tpVk6&XfcAk%sf~QKb>IS1icr#!C z0WfjApXgD=9&I~l>IgKCa=9y-%TPlmL%6|Q!HMZ`#~XTt=L4=k0zc1F^#3(0P289p z0O(#nxyNM9J&=14;7WpK4&z|K&)-k$oHy8(&t@t?3Bopb%n<-El$9Fk83rB z;(j$31S?`$j+GafdreB^7_}oX>$hJ^^uAk+LYBuIFFhxfy$lG$E&RSe@%MeS=f&?R z5HQySm+8$N005PTQjn9}oW?>Q4LLnYv^w^U-yd}zklhg|Fra3v*D{Mf^Gg@f`){!y zp=6~$mhl(>B@sm~FD*8Y$2JjdQG`QVOB^g%@pCCT*BUZ8!ecM<_Y?6!L{ZI@LczF& z`iD&+AhZPLfMR_NF)v)>BFj>DAONCMLBb@xxAhRw$G=JR#8%ra%&SCq`5&32q(%1g z1|2%jyYGRNQ&@AC36P(4zgJr0E<1o5Tq96+$mRW`Hxd29P3Au2RFFAagz|A{PY9O8 zQ)+J9_4yODXYGSZ!_P5gg*h%Dvi6-?u`WZvU2P2vqWfGycSZtNxQKJX}tr|zBh49=Q9u}@5B9}w&ecgEkr+agHg!Z zA1i%#UTn3EB`(__GYN2vD_0VI^CKP9xkBwEM>pyUa}*9!1bw2;bP_!^0Kn7<&zQjc zp%%cv0rEPQ(ieaK8v3d0W5uo;!PvQyHqXWqo}(_~giDXO6!eu}G}AO40#Gf7lqkT3 zk4Z4ykjW9*v!E=Hmxzbum1QilhRP2*c)vWNyd5=eNu^vw#@rsS!8EZZ^+IC{I?^6qQcDqM^ z_BNuQQ_6itld$ANstEcUucUpBe-0D~+J)ZtTXSjA74J|R%wAhsxNMrwVB^uiprP8Q zMc|q#^_z0QxCVVMlRx`H`m6U{L~p&q_A!yS z0{XEl?S|~dAW|y0Q=KX<=#)|8{5XmN5-VqW}Om7ywXmI(|*GgegEr*B(%JE?Z9Y?fB9<@+^FDjvhHI=h|dH(o>Z z-Wv@wqYL|l7Q9jHa+pYAFp_Y6*zbfjcLNFvy}w9jT>W;X;djMv3WA0^U`j<@sG%d| z&Ao#D?iZKSFW+oj0Jsc@1&CY$H2NAI@AOFon2`XiL=_n=00pRJ0gH3RoY?*7W*{|W za)cQfmcRnTs}%saY-uu$)1zeOfc`wiujNr1?f{CT!liFc(m}hA5dE2AeD7Ujn+`Qm zq8u@#-WGG(X3OKqepi{+C*uO-F<60?MdvntAAbgxQ}+x702DLxGp~pPdhmL|UVw-> zI89$~HIY7Fnfh3^o6MTsM7MuxfcC!lb<=AA6$S~MZ_&gDRJA=Vjh$ONVxbq|1r{i3PHfm`BG6Ha zRx$@T97nMi{3Js*S!`DpWjyJ>oYm7@h#5y@Yk&bjrP#9;n0PO#$7Q-G8-*??$eT2n z0HQ=>JJZ|z7@Nvs0BEDDo$InCD)Ty*|LAkIbb0Awg z!vz38>TfFs;HO`aZ0;g64EPv@Nt)5}cgyc(E8+sR?|QE`^myZrL zp068+$T^?(oJYwy&l?J|2EYiMJChcxK~|#>F!rK!^8_7ytklz?{qIuYZ22?iYcV$`)&}^*>p_a6FQh zEyEiUf(1A3Gg(Oh2kd5IP{6+(rs9I-Z$1_);88nrerTw)A3{c>2D&B1!A zo|a()1XL4`k`=z}Bw5^JHm28JWRN8{9I7{|h@|z>U#t3AN&yUH#`4e!qMjLQoL_A! z0dmTYq*`l1`1i8X#^wWMgMuU9c)v$WFMFffsJ5yn_mify$5i4CO`k4SHETw|ns>)H zQDMm~^nX9JQm2Y?0U*z^GIC>>ZiVhUpf_?2w3<$pOJ|u3q@j{v%mU-jX3MtdH&}qt zM5X{rmn8iE!y~2<&?QSukCAd1TmQWAv(&nY_YZJ~rAr4~&|3kEC+DqRNJ9UmZ?t6b?Hx`XK5*TwnW{N7p=4oKAZg)j2) z%|t){e~DH<{6)n-b|?)rhoW8sGPk`U)dlW=z@~wKQ3-~0As}zT4fN0NUqL@}y<-hh z+!q8g-E+nbV3U0@@Waux2A~&iq)i7*3M^b;r6B2&EH(-XrHa(GvgQKD3Pu`e{|goq zU20tbWjpTj{qi{VNW?Wjz)48SQjNMZX~C2hM)$!lJ!2+VOR=#~U6HW@dT6ZMK$mYN z+aA~|?PCf6Eb1`~0Lr{VBx273<05HX%n`(q{P_PNdh|R0VQSf<4RJ+AfD8v~NJ0Rb zbXjH;b64YZbR89z-a%jZ;4<9~xS~}wQIuU$E3~c)f~BR3m$1QO!$OR}x;-Xm9oD@q-3>d6sDpYRa(w_^#@7|+W zqhC@O;2U56I?)Jx9T(`TcIHD!FF+Hb2G?6DmMy^;A-Ta>eoNJgXsC4q$d+}32$^ozrh)~!a79*KORptAC4*4 z%FG$Y)v|m}9Q-GlT?m83AR`9GWJv=AoP>;&EB)D;+Ex?nUmhX)!VeWYaKe-sZXnEb z;l;>#{$N*N@t|(^uf56yOG$d2rCJ<8Er?_|+|`40Qura!UiLS>O!W6(TdTCxM$_jW zJqHl&uIX+f%6)CJlN4R>UyaX+9s2%7H@%bo@jWKM3v;F@vPBARba#!+6aIY=-fY}n z10|dMpetai`>S`Gw$;!p&?OBfpi(s8rg%)a02B1etahR+mJ_Xq$igC!l1S}>rHA?R_YV<$CvS^={Fz6mNaw9rW3Em<$~a#_gx|`Wpx6mYeZZi7f8Jn?G+}Bjq^d zPcmeP5y1M`e82#K!~Le9P%~$d(%6=3p8VT#({_VBnRx?~0CD+ER10}1hk z#20^jRRV$d;_<@=zf=_xeDElhXh1vyZKaf^sBIF+yH07+)}&72_|@^uy_|LS+4t^y z=8oecdpsTACHXOPudiqBoU_l`d#}CEP7|v8>b)jszTb(V)TSyvL-z%ToeICRp!PPz zTSe!|Z#+r#+6zDD4R1E>X3-l`1na74kkdv$><8HQ9xxGFG~xeiXQ;I6G5Y>jM(LXm zFxi$Zc>xiCm6p-WWv#|fs|8u_A{cq+itcFgI;RKDPV%uW8xvw7e_vEu2tcRM{Czq! z)= zL5QK5G7H?#o+tW^Ap&n)F*d%JD+r(&sFWzxXS~~>NkHgwop!^Wkd60@^ZwCc@9Uo+ z`s{6dZX;~Y)pY~>d@#Nc_C56$(YK!>`sE=rNG6XEZFRfdH0GQLPDA|1E&&#MY`cub zzF>Y|oae`tL5_k& zM1wXW&`1b0$dN=P{fdN?XDuP}HfvFRo2R1|LQMQ>4`~3T?-2-)q+yXl+-I_CLwzdp z)*|YY>$I|wlYkY348Dd6e_y&v^ptV-e*3b?^IhhF+gnO{T>Bw0K`TbwDM*F!G}{i+ zVNK-f(6I~N3wowMb{En8d)Z(~ZrAV49XH?UG9sY8A&?^EvhfzN&-`}{2YB*tQxv}b z47VHZ*-Vt`CqNW8%86BouFK&2LPOw{MT!QXQ009VW(-rV4AJc$f0Q17nCRd=iRUN7 zKv(5-Gej2?Isz^I@3E8S@i#aBK&*)v4HdzqsG zufJmkt62d0%E>^N5SKvb#ySP^Qnb+lY{MT#287WgS2ti%Av?D+0YL75Y>-m5^!UA0 zOb^7!ee1SK3y%)tK^nmb`4Qvzix-K0c*u;AS5FbW{T$JTG1p+I&XokHBEXJ$NEbAa zSLty?pcBP}GD7e{miaxT4r7T5IrQH%Ok;O^j=sFVWH;*CKE$U8Q5K@u=}n_n3KAXD z&V*h-FTBIzW9Vv-UPB9Fw8E{+9K?xoewdWv0$IBrwhO-F;6JZ7U=kuEqX?-~%%9CB zk~luh;eS*C;5Zx&d4CcOC}h0f9NEZ8zzRcqv3grw{DkNG%rO%gFl6B5n>>l32CkNp zi6I@rT15yt1=7UFdLJ&jE7cP)Oc3Xw@edaNgLgA)2gD=BThbogdYG%eH>Sh1LWGd# z{K;R4etI~fiIYc(t{Fm5-O7;xkN}A2Y*}H0_al%#`l&txYdm0VbiyU7ErD?)1*1XsOwO0HlXZus0JcQD1qX3(49D-^9jA!*Z{<$<>g(kfY}4*l0;J^Kbn zQUQpnv0ux$;lbNCG0|y+>A93usTAZSVA;q?KpPOb1yClnsGG59qJrQ#;}o5rL08h+a8AP4nlT=9`8nK*_j9m5q*(Ijd>OLAzOGylin40BMT)JU_o^ z7X8@^tp4A02kqE`%i4*CH8dMYK&GHlhB(Ue5VL{HIGPeKH;Q z44~#nTTTRSjGP3lBD6t^)wyc&>cRT=(?oy%H}5YF1u#+tn8-*K^pun9DRbL)i1!bs zj-MOcWE~ykFx{6v#*-GXJGoJk7SWq~_*icfRey&1c8F((V`bM|sI1xsp!dWN{y=o% z!aQC3uUS~HpXEiiY(9kQ7QSk{K~b9^S_Dz}<9{PkQM<}13lqI44eh3#JGRlocb4c| z5At}4|D4i!>-B83L*>N+O9_P~j4t{TEcPO%Lw^AX2(cYE2s$EaHvDT60O|;txbt*Kmi_~*Kp^$V~tdx?!d2xd1&~Z*Fy>xb#rYFxEZ+n6X z0R)6-NnGkD`>9z$UV)NN&@-DL4MBmZN$weW&*>@!eO|y`KK^%ohKWFRm%ory?EJrL}@3Y;38f~gKit-lHt(-wlRUSliGIp-TzYe z(6fWOTsuc=8Fu_BJCX`I&eGDXZG^g5yUxv%E!e2gUrYPWs`Y*dqD`S z{V=xU@-*uPkUoHz5Ic7+I+9s-4hif^xtI>I`x`T9!dh_LGN2?nA(b8IV}SJ=pS>-Q zHp8fDuHDfWhnN=YdlXjl@q+1Uq)FvXqv0I4*v*HRZmJ7W-s+BIJIH=02JbKbv;Dg$HG*ArNSUJ2@S>j(R6 z`R5}aVWKFnOE<-e*14y@TFB}$DEC|NMZ;R8b)?%&vxE)DimA^N=t5y=VU>L4cp9fZ(hzj`w3 z!H;8D^bzK}c!j%(VF7s4L<%m?aC=qclc5Mk6Ac^44U&+WsE0+Qh{-uN#9rG_FL!Ah zH4}BP+U$91aZ$0bbjUEr>OqG}Lni?90ppHFM2H?Cnsj=Sqe+Mu%+(skfCp4F7XJF& zqWPSIlr=y_N7cA&ubPCWZq8zIS35SdQ z5C=e)12n<6t=jA$4kfar?lc7jJ#d-Tk55m*Oo*)~0ISQbw zfx?Vvp-vA4ON^-;D~p^2bQttPt66a>X-w3V$Mdg&5FZ#nCb#Xe?N)1a?n84C8-6P! zD)gn`8+Cb6QIviS-a3+F6`_s15CLGh(HKej%)QGy)irdlA@lbGRaR%qZkRW^mgH!| zFo{6Pc+m@fP6FBsx!*ogeN2{s2oD=Bmv0+hxpaV#JJ=NQ_Vq%oAM2N($7+~iL-MiF zUSyGg!<1vqfk|iOT0!y{lTSJf%I{IAl)+(h3to+^oT5G^(l046D^TleN%uP(*ZZO8 zXdmP=1N3Jl&+G9b$Mv!05#QIdq$40yHKY#Gus|WcMY5)KL07*qo IM6N<$g1rh9LI3~& literal 0 HcmV?d00001 diff --git a/assets/icons/tenderLogo.svg b/assets/icons/tenderLogo.svg new file mode 100644 index 0000000..900b039 --- /dev/null +++ b/assets/icons/tenderLogo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/assets/icons/thumb.svg b/assets/icons/thumb.svg new file mode 100644 index 0000000..c614def --- /dev/null +++ b/assets/icons/thumb.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/pngs/logo.png b/assets/pngs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9fbd60ddc2c69570a161bdfda40e27d719fe3b80 GIT binary patch literal 11922 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 Y0~~~9vREX+N&o-=07*qoM6N<$f^&R9?EnA( literal 0 HcmV?d00001 diff --git a/assets/svgs/password_icon.svg b/assets/svgs/password_icon.svg new file mode 100644 index 0000000..c30c824 --- /dev/null +++ b/assets/svgs/password_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/svgs/password_visibility.svg b/assets/svgs/password_visibility.svg new file mode 100644 index 0000000..6935a0c --- /dev/null +++ b/assets/svgs/password_visibility.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/svgs/user_icon.svg b/assets/svgs/user_icon.svg new file mode 100644 index 0000000..69c26ad --- /dev/null +++ b/assets/svgs/user_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/lib/bottom_navigation.dart b/lib/bottom_navigation.dart new file mode 100644 index 0000000..1a8dba8 --- /dev/null +++ b/lib/bottom_navigation.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +import 'size_config.dart'; + +class BottomNavigation extends StatefulWidget { + const BottomNavigation({super.key}); + + @override + State createState() => _BottomNavigationState(); +} + +class _BottomNavigationState extends State { + int activeTab = 0; + + @override + Widget build(BuildContext context) { + return Container( + height: 72.0.h(), + decoration: BoxDecoration( + color: Color(0xFFE3E3E3), + border: Border.fromBorderSide(BorderSide(color: Color(0xFFE3E3E3))), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _bottomNavigationItem( + text: 'Home', + isActive: activeTab == 0, + onTap: () { + setState(() { + activeTab = 0; + }); + }, + iconPath: 'assets/icons/home.svg', + activeIconPath: 'assets/icons/homeActive.svg', + ), + _bottomNavigationItem( + text: 'Tenders', + isActive: activeTab == 1, + onTap: () { + setState(() { + activeTab = 1; + }); + }, + iconPath: 'assets/icons/task_square.svg', + activeIconPath: 'assets/icons/task-square_active.svg', + ), + _bottomNavigationItem( + text: 'Profile', + isActive: activeTab == 2, + onTap: () { + setState(() { + activeTab = 2; + }); + }, + iconPath: 'assets/icons/profile-circle.svg', + activeIconPath: 'assets/icons/profile-circle_active.svg', + ), + ], + ), + ); + } + + Widget _bottomNavigationItem({ + required String text, + required bool isActive, + required VoidCallback onTap, + required String iconPath, + required String activeIconPath, + }) { + return InkWell( + onTap: onTap, + child: SizedBox( + width: 64.0.w(), + height: 72.0.h(), + child: Padding( + padding: EdgeInsets.only(top: 12.0.h(), bottom: 14.0.h()), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SvgPicture.asset(isActive ? activeIconPath : iconPath), + Text( + text, + style: TextStyle( + fontSize: 12.0.sp(), + fontWeight: FontWeight.w400, + color: isActive ? Color(0xFF0164FF) : Color(0xFF777777), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/constants/app_strings.dart b/lib/constants/app_strings.dart new file mode 100644 index 0000000..b9763af --- /dev/null +++ b/lib/constants/app_strings.dart @@ -0,0 +1,14 @@ +class AppStrings { + AppStrings._(); + + static const String home = 'Home'; + + static const String partnership = 'Partnership'; + static const String selfApply = 'Self-apply'; + static const String contracting = 'Contracting'; + static const String tenderSubmitting = 'Tender submitting'; + static const String approvedTenders = 'Approved tenders'; + static const String tenderValue = 'Tender Value'; + static const String thunderStatus = 'Thunder status'; + static const String yourTenders = 'Your tenders'; +} diff --git a/lib/core/constants/assets.dart b/lib/core/constants/assets.dart new file mode 100644 index 0000000..700a2c0 --- /dev/null +++ b/lib/core/constants/assets.dart @@ -0,0 +1,10 @@ +class AssetsManager { + AssetsManager._(); + + // login page + static const logo = 'assets/pngs/logo.png'; + static const userIcon = 'assets/svgs/user_icon.svg'; + static const passwordIcon = 'assets/svgs/password_icon.svg'; + static const passwordVisibility = 'assets/svgs/password_visibility.svg'; + static const passwordVisibilityOff = 'assets/svgs/password_visibility.svg'; +} diff --git a/lib/core/constants/colors.dart b/lib/core/constants/colors.dart index c727ee8..4cffacd 100644 --- a/lib/core/constants/colors.dart +++ b/lib/core/constants/colors.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; class AppColors { + static const Color mainBlue = Color(0xff0164FF); + static const Color borderBlue = Color(0xffA1C6FF); // Primary Colors static const Color primaryColor = Color(0xFF007BFF); static const Color accentColor = Color(0xFFE83E8C); diff --git a/lib/core/constants/texts.dart b/lib/core/constants/texts.dart new file mode 100644 index 0000000..f336237 --- /dev/null +++ b/lib/core/constants/texts.dart @@ -0,0 +1,7 @@ +class TextManager { + static const signInTitle = 'Sign In'; + static const signInSubtitle = 'Enter valid username & password to continue'; + static const usernameLabel = 'User Name'; + static const passwordLabel = 'Password'; + static const loginButton = 'Login'; +} \ No newline at end of file diff --git a/lib/home/home_page.dart b/lib/home/home_page.dart new file mode 100644 index 0000000..7b73246 --- /dev/null +++ b/lib/home/home_page.dart @@ -0,0 +1,174 @@ +import 'package:flutter/material.dart'; + +import '../../bottom_navigation.dart'; +import '../../constants/app_strings.dart'; +import '../../size_config.dart'; +import 'widgets.dart'; + +class HomePage extends StatelessWidget { + const HomePage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: _body(), + bottomNavigationBar: BottomNavigation(), + ); + } + + SafeArea _body() { + return SafeArea( + child: ListView( + children: [ + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 24.0.w(), + 26.0.h(), + 24.0.w(), + 24.0.h(), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _appbar(), + SizedBox(height: 32.0.h()), + _progressBarsRow(), + SizedBox(height: 32.0.h()), + _firstStatisticsRow(), + SizedBox(height: 8.0.h()), + _secondStatisticsRow(), + SizedBox(height: 32.0.h()), + _yourTenderText(), + SizedBox(height: 28.0.h()), + _bottomListView(), + ], + ), + ), + ], + ), + ); + } + + Widget _appbar() { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + AppStrings.home, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: Color(0xFF222222), + ), + ), + Image.asset( + 'assets/icons/tenderLogo.png', + width: 59.0.w(), + height: 28.0.h(), + fit: BoxFit.cover, + ), + ], + ); + } + + Widget _progressBarsRow() { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ProgressBarColumn( + text: AppStrings.partnership, + value: 0.75, + amount: '75%', + ), + ProgressBarColumn( + text: AppStrings.selfApply, + value: 0.88, + amount: '12', + ), + ProgressBarColumn( + text: AppStrings.contracting, + value: 0.36, + amount: '36', + ), + ], + ); + } + + Widget _firstStatisticsRow() { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + StatisticsCard( + backgroundColor: Color(0xFFE5EFFF), + iconPath: 'assets/icons/arrows.svg', + title: AppStrings.tenderSubmitting, + amount: '12', + textColor: Color(0xFF0164FF), + enableTap: true, + onTap: () {}, + ), + StatisticsCard( + backgroundColor: Color(0xFFEAF8F9), + iconPath: 'assets/icons/thumb.svg', + title: AppStrings.approvedTenders, + amount: '03', + textColor: Color(0xFF24848E), + enableTap: true, + onTap: () {}, + ), + ], + ); + } + + Widget _secondStatisticsRow() { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + StatisticsCard( + backgroundColor: Color(0xFFFFF2E0), + iconPath: 'assets/icons/shield.svg', + title: AppStrings.tenderValue, + amount: '\$250,000', + textColor: Color(0xFFE5821E), + enableTap: true, + onTap: () {}, + ), + StatisticsCard( + backgroundColor: Color(0xFFF4F4F4), + iconPath: 'assets/icons/edit.svg', + title: AppStrings.thunderStatus, + amount: '23', + textColor: Color(0xFF9E9E9E), + enableTap: false, + onTap: () {}, + ), + ], + ); + } + + Widget _yourTenderText() { + return Text( + AppStrings.yourTenders, + style: TextStyle( + fontSize: 20.0.sp(), + fontWeight: FontWeight.w600, + color: Color(0xFF777777), + ), + ); + } + + Widget _bottomListView() { + return SizedBox( + width: double.infinity, + height: 310.0.h(), + child: ListView.builder( + itemCount: 10, + scrollDirection: Axis.horizontal, + itemBuilder: (context, index) { + return TendersListItem(); + }, + ), + ); + } +} diff --git a/lib/home/progress_bar_column.dart b/lib/home/progress_bar_column.dart new file mode 100644 index 0000000..e7224ed --- /dev/null +++ b/lib/home/progress_bar_column.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; + +import '../size_config.dart'; + +class ProgressBarColumn extends StatefulWidget { + const ProgressBarColumn({ + super.key, + required this.text, + required this.value, + required this.amount, + }); + + final String text; + final double value; + final String amount; + + @override + State createState() => _ProgressBarColumnState(); +} + +class _ProgressBarColumnState extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + late Animation _animation; + + @override + void initState() { + super.initState(); + + // Initialize the animation controller + _controller = AnimationController( + vsync: this, + duration: Duration(milliseconds: 1500), // duration of the animation + ); + + // Create a Tween animation from 0.0 to 0.75 + _animation = Tween( + begin: 0.0, + end: widget.value, + ).animate(CurvedAnimation(parent: _controller, curve: Curves.easeOut)); + + // Start the animation + _controller.forward(); + } + + @override + void dispose() { + _controller.dispose(); // clean up controller + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Stack( + alignment: Alignment.center, + children: [_progressIndicator(), _centerText()], + ), + SizedBox(height: 12.0.h()), + _titleText(), + ], + ); + } + + Widget _progressIndicator() { + return SizedBox( + width: 96.0.w(), + height: 96.0.w(), + child: AnimatedBuilder( + animation: _animation, + builder: + (context, child) => CircularProgressIndicator( + backgroundColor: Color(0xFFE1E1E1), + strokeCap: StrokeCap.round, + strokeWidth: 8.0, + valueColor: AlwaysStoppedAnimation(Color(0xFF34BCCB)), + value: _animation.value, + ), + ), + ); + } + + Widget _centerText() { + return Center( + child: Text( + widget.amount, + style: TextStyle(fontSize: 24.0.sp(), fontWeight: FontWeight.bold), + textAlign: TextAlign.center, + ), + ); + } + + Widget _titleText() { + return Text( + widget.text, + style: TextStyle( + fontSize: 16.0.sp(), + fontWeight: FontWeight.bold, + color: Color(0xFF222222), + ), + ); + } +} diff --git a/lib/home/statistics_card.dart b/lib/home/statistics_card.dart new file mode 100644 index 0000000..eb8a17f --- /dev/null +++ b/lib/home/statistics_card.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +import '../size_config.dart'; + +class StatisticsCard extends StatelessWidget { + const StatisticsCard({ + super.key, + required this.backgroundColor, + required this.iconPath, + required this.title, + required this.amount, + required this.textColor, + required this.onTap, + required this.enableTap, + }); + + final Color backgroundColor; + final String iconPath; + final String title; + final String amount; + final Color textColor; + final VoidCallback onTap; + final bool enableTap; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: enableTap ? onTap : null, + child: Container( + width: 178.0.w(), + height: 148.0.h(), + padding: EdgeInsets.symmetric(horizontal: 16.0.w(), vertical: 12.0.h()), + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.circular(8), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SvgPicture.asset(iconPath), + SizedBox(height: 4.0.h()), + Text( + title, + style: TextStyle( + fontSize: 16.0.sp(), + fontWeight: FontWeight.bold, + color: Color(0xFF777777), + ), + ), + Spacer(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + amount, + style: TextStyle( + fontSize: 24.0.sp(), + fontWeight: FontWeight.bold, + color: textColor, + ), + ), + enableTap + ? SvgPicture.asset('assets/icons/arrow-right.svg') + : SizedBox(), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/home/tenders_list_item.dart b/lib/home/tenders_list_item.dart new file mode 100644 index 0000000..301cbca --- /dev/null +++ b/lib/home/tenders_list_item.dart @@ -0,0 +1,111 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +import '../size_config.dart'; + +class TendersListItem extends StatelessWidget { + const TendersListItem({super.key}); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 327.0.w(), + height: 309.0.h(), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0.w(), vertical: 16.0.h()), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '2025-05-21', + style: TextStyle( + fontSize: 12.0.sp(), + fontWeight: FontWeight.w400, + color: Color(0xFF777777), + ), + ), + Container( + width: 91.0.w(), + height: 24.0.h(), + decoration: BoxDecoration( + color: Color(0xFFDAF8D6), + borderRadius: BorderRadius.circular(8), + ), + alignment: Alignment.center, + child: Text( + 'Completed', + style: TextStyle( + fontSize: 12.0.sp(), + fontWeight: FontWeight.w500, + color: Color(0xFF289744), + ), + ), + ), + ], + ), + SizedBox(height: 12.0.h()), + Text( + 'Lorem ipsum dolor sit amet consectetur. Sed mi tortor eu purus senectus.', + style: TextStyle( + fontSize: 16.0.sp(), + fontWeight: FontWeight.w600, + color: Color(0xFF222222), + ), + ), + SizedBox(height: 8.0.h()), + Text( + 'Lorem ipsum dolor sit amet consectetur. Volutpat velit tincidunt amet diam. Placerat congue ut Sed facilisis faucibus porttitor. Proin suspendisse eu euismod sit lorem quis. Suscipit ...', + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w400, + color: Color(0xFF222222), + ), + ), + SizedBox(height: 24.0.h()), + Row( + children: [ + SvgPicture.asset('assets/icons/location.svg'), + SizedBox(width: 1.0.w()), + Text( + 'Location', + style: TextStyle( + fontSize: 12.0.sp(), + fontWeight: FontWeight.w400, + color: Color(0xFF777777), + ), + ), + SizedBox(width: 8.0.w()), + SizedBox( + width: 32.0.w(), + height: 21.0.h(), + child: Image.asset('assets/icons/SE.png', fit: BoxFit.cover), + ), + Spacer(), + Container( + width: 96.0.w(), + height: 24.0.h(), + decoration: BoxDecoration( + color: Color(0xFFE4E4E4), + borderRadius: BorderRadius.circular(88), + border: Border.all(color: Color(0xFFDADADA)), + ), + alignment: Alignment.center, + child: Text( + 'Self Control', + style: TextStyle( + fontSize: 12.0.sp(), + fontWeight: FontWeight.w500, + color: Color(0xFF777777), + ), + ), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/home/widgets.dart b/lib/home/widgets.dart new file mode 100644 index 0000000..57c84fa --- /dev/null +++ b/lib/home/widgets.dart @@ -0,0 +1,3 @@ +export 'progress_bar_column.dart'; +export 'statistics_card.dart'; +export 'tenders_list_item.dart'; diff --git a/lib/main.dart b/lib/main.dart index 585f0c5..a9cfff6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ import 'package:provider/provider.dart'; import 'data/repositories/auth_repository.dart'; import 'data/services/auth_service.dart'; +import 'size_config.dart'; import 'view_models/auth_view_model.dart'; import 'views/login_screen.dart'; @@ -32,6 +33,13 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - return const MaterialApp(home: LoginScreen()); + SizeConfig.init(context); + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), + ), + home: LoginScreen(), + ); } } diff --git a/lib/size_config.dart b/lib/size_config.dart new file mode 100644 index 0000000..49c0eeb --- /dev/null +++ b/lib/size_config.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; + +class SizeConfig { + static double screenWidth = 0.0; + static double screenHeight = 0.0; + static late TextScaler textScaler; + + static void init(BuildContext context) { + screenWidth = MediaQuery.sizeOf(context).width; + screenHeight = MediaQuery.sizeOf(context).height; + textScaler = MediaQuery.of(context).textScaler; + } +} + +extension SizeDoubleExt on double { + double h() { + final double screenHeight = SizeConfig.screenHeight; + final double res = (this / 917.0) * screenHeight; + return res; + } + + double w() { + final double screenWidth = SizeConfig.screenWidth; + final double res = (this / 412.0) * screenWidth; + return res; + } + + double sp() { + return h(); + } +} diff --git a/lib/views/login_screen.dart b/lib/views/login_screen.dart index fbc77cd..fee7a1a 100644 --- a/lib/views/login_screen.dart +++ b/lib/views/login_screen.dart @@ -1,8 +1,13 @@ // lib/views/login_screen.dart import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import '../view_models/auth_view_model.dart'; +import '../core/constants/assets.dart'; +import '../core/constants/texts.dart'; +import '../size_config.dart'; +import '../views/widget/login_button.dart'; +import '../views/widget/login_logo.dart'; +import '../views/widget/login_textfield.dart'; +import '../views/widget/login_title.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); @@ -12,58 +17,81 @@ class LoginScreen extends StatefulWidget { } class _LoginScreenState extends State { - final _emailController = TextEditingController(); + final _usernameController = TextEditingController(); final _passwordController = TextEditingController(); + final _usernameFocus = FocusNode(); + final _passwordFocus = FocusNode(); + + bool _obscurePassword = true; + + bool get _isLoginEnabled => + _usernameController.text.isNotEmpty && + _passwordController.text.isNotEmpty; + + @override + void initState() { + super.initState(); + _usernameController.addListener(_updateState); + _passwordController.addListener(_updateState); + _usernameFocus.addListener(_updateState); + _passwordFocus.addListener(_updateState); + } + + @override + void dispose() { + _usernameController.dispose(); + _passwordController.dispose(); + _usernameFocus.dispose(); + _passwordFocus.dispose(); + super.dispose(); + } + + void _updateState() => setState(() {}); + + void _togglePasswordVisibility() => + setState(() => _obscurePassword = !_obscurePassword); + @override Widget build(BuildContext context) { - final authViewModel = Provider.of(context); - return Scaffold( - appBar: AppBar(title: const Text('Login')), - body: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - TextField( - controller: _emailController, - decoration: const InputDecoration(labelText: 'Email'), - ), - TextField( - controller: _passwordController, - decoration: const InputDecoration(labelText: 'Password'), - obscureText: true, - ), - const SizedBox(height: 20), - if (authViewModel.isLoading) - const CircularProgressIndicator() - else - ElevatedButton( - onPressed: () { - authViewModel.login( - _emailController.text, - _passwordController.text, - ); - }, - child: const Text('Login'), + backgroundColor: Colors.white, + body: Center( + child: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 24.0.w()), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const LoginLogo(), + SizedBox(height: 32.0.h()), + const LoginTitle(), + SizedBox(height: 32.0.h()), + LoginTextField( + controller: _usernameController, + focusNode: _usernameFocus, + label: TextManager.usernameLabel, + iconPath: AssetsManager.userIcon, ), - if (authViewModel.errorMessage != null) - Padding( - padding: const EdgeInsets.only(top: 20), - child: Text( - authViewModel.errorMessage!, - style: const TextStyle(color: Colors.red), - ), + + SizedBox(height: 16.0.h()), + + LoginTextField( + controller: _passwordController, + focusNode: _passwordFocus, + label: TextManager.passwordLabel, + iconPath: AssetsManager.passwordIcon, + isPassword: true, + obscureText: _obscurePassword, + onToggleVisibility: _togglePasswordVisibility, ), - if (authViewModel.loggedInUser != null) - Padding( - padding: const EdgeInsets.only(top: 20), - child: Text( - 'Welcome, ${authViewModel.loggedInUser!.name}!', - style: const TextStyle(color: Colors.green), - ), + + SizedBox(height: 32.0.h()), + LoginButton( + isEnabled: _isLoginEnabled, + onPressed: _isLoginEnabled ? () {} : null, ), - ], + ], + ), ), ), ); diff --git a/lib/views/widget/login_button.dart b/lib/views/widget/login_button.dart new file mode 100644 index 0000000..e954b43 --- /dev/null +++ b/lib/views/widget/login_button.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; + +import '../../core/constants/colors.dart'; +import '../../core/constants/texts.dart'; +import '../../size_config.dart'; + +class LoginButton extends StatelessWidget { + final bool isEnabled; + final VoidCallback? onPressed; + + const LoginButton({ + super.key, + required this.isEnabled, + required this.onPressed, + }); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: double.infinity, + height: 55.0.h(), + child: ElevatedButton( + onPressed: onPressed, + style: ElevatedButton.styleFrom( + backgroundColor: isEnabled ? ColorManager.mainBlue : Colors.grey[300], + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(28.0.w()), + ), + ), + child: Text( + TextManager.loginButton, + style: TextStyle(fontSize: 16.0.sp(), fontWeight: FontWeight.bold), + ), + ), + ); + } +} diff --git a/lib/views/widget/login_logo.dart b/lib/views/widget/login_logo.dart new file mode 100644 index 0000000..6458770 --- /dev/null +++ b/lib/views/widget/login_logo.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; + +import '../../core/constants/assets.dart'; +import '../../size_config.dart'; + +class LoginLogo extends StatelessWidget { + const LoginLogo({super.key}); + + @override + Widget build(BuildContext context) { + return Image.asset(AssetsManager.logo, width: 190.0.w(), height: 88.0.h()); + } +} diff --git a/lib/views/widget/login_textfield.dart b/lib/views/widget/login_textfield.dart new file mode 100644 index 0000000..872259f --- /dev/null +++ b/lib/views/widget/login_textfield.dart @@ -0,0 +1,75 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +import '../../core/constants/assets.dart'; +import '../../core/constants/colors.dart'; +import '../../size_config.dart'; + +class LoginTextField extends StatelessWidget { + final TextEditingController controller; + final FocusNode focusNode; + final String label; + final String iconPath; + final bool isPassword; + final bool obscureText; + final VoidCallback? onToggleVisibility; + + const LoginTextField({ + super.key, + required this.controller, + required this.focusNode, + required this.label, + required this.iconPath, + this.isPassword = false, + this.obscureText = false, + this.onToggleVisibility, + }); + + @override + Widget build(BuildContext context) { + return TextField( + controller: controller, + focusNode: focusNode, + obscureText: isPassword ? obscureText : false, + decoration: InputDecoration( + labelText: label, + prefixIcon: Padding( + padding: EdgeInsets.all(12.0.w()), + child: SvgPicture.asset( + iconPath, + width: 24.0.w(), + height: 24.0.h(), + colorFilter: ColorFilter.mode( + focusNode.hasFocus ? Colors.black87 : Colors.grey, + BlendMode.srcIn, + ), + ), + ), + suffixIcon: + isPassword + ? IconButton( + onPressed: onToggleVisibility, + icon: SvgPicture.asset( + obscureText + ? AssetsManager.passwordVisibility + : AssetsManager.passwordVisibilityOff, + width: 24.0.w(), + height: 24.0.h(), + colorFilter: ColorFilter.mode( + focusNode.hasFocus ? Colors.black87 : Colors.grey, + BlendMode.srcIn, + ), + ), + ) + : null, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12.0.w()), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: ColorManager.borderBlue), + borderRadius: BorderRadius.circular(12.0.w()), + ), + ), + ); + } +} diff --git a/lib/views/widget/login_title.dart b/lib/views/widget/login_title.dart new file mode 100644 index 0000000..ed456d3 --- /dev/null +++ b/lib/views/widget/login_title.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; + +import '../../core/constants/texts.dart'; +import '../../size_config.dart'; + +class LoginTitle extends StatelessWidget { + const LoginTitle({super.key}); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Text( + TextManager.signInTitle, + style: TextStyle(fontSize: 28.0.sp(), fontWeight: FontWeight.w700), + ), + SizedBox(height: 8.0.h()), + Text( + TextManager.signInSubtitle, + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w400, + color: Colors.grey, + ), + textAlign: TextAlign.center, + ), + ], + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 55c68bf..804551f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,6 +16,12 @@ environment: dependencies: flutter: sdk: flutter + + provider: ^6.1.5 + flutter_svg: ^2.2.0 + freezed: ^3.1.0 + freezed_annotation: ^3.1.0 + # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. @@ -48,8 +54,10 @@ flutter: uses-material-design: true # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg + assets: + - assets/icons/ + - assets/svgs/ + - assets/pngs/ # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see From 9e2da9a68c7b369856981137930d5b9cb4f693e7 Mon Sep 17 00:00:00 2001 From: amirrezaghabeli Date: Sun, 3 Aug 2025 09:44:56 +0330 Subject: [PATCH 2/2] buttons fixed --- lib/views/widget/login_button.dart | 2 +- lib/views/widget/login_textfield.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/views/widget/login_button.dart b/lib/views/widget/login_button.dart index e954b43..0ebd88f 100644 --- a/lib/views/widget/login_button.dart +++ b/lib/views/widget/login_button.dart @@ -22,7 +22,7 @@ class LoginButton extends StatelessWidget { child: ElevatedButton( onPressed: onPressed, style: ElevatedButton.styleFrom( - backgroundColor: isEnabled ? ColorManager.mainBlue : Colors.grey[300], + backgroundColor: isEnabled ? AppColors.mainBlue : Colors.grey[300], foregroundColor: Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(28.0.w()), diff --git a/lib/views/widget/login_textfield.dart b/lib/views/widget/login_textfield.dart index 872259f..7825418 100644 --- a/lib/views/widget/login_textfield.dart +++ b/lib/views/widget/login_textfield.dart @@ -66,7 +66,7 @@ class LoginTextField extends StatelessWidget { borderRadius: BorderRadius.circular(12.0.w()), ), focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: ColorManager.borderBlue), + borderSide: BorderSide(color: AppColors.borderBlue), borderRadius: BorderRadius.circular(12.0.w()), ), ),