From 5033afac58207f0d76aeb59d44904eb867821470 Mon Sep 17 00:00:00 2001 From: harveyjavier Date: Thu, 31 Oct 2019 18:43:52 +0800 Subject: [PATCH 1/4] Add pull_to_refresh on pubspec.yaml --- pubspec.lock | 7 +++++++ pubspec.yaml | 1 + 2 files changed, 8 insertions(+) diff --git a/pubspec.lock b/pubspec.lock index c058b35..739b1f6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -212,6 +212,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.0" + pull_to_refresh: + dependency: "direct main" + description: + name: pull_to_refresh + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.7" quiver: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 0f090fb..4d3ae3c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,6 +23,7 @@ dependencies: image_picker: 0.4.0 uuid: ^2.0.2 progress_dialog: ^1.2.0 + pull_to_refresh: ^1.5.7 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. From 9bef9661cef516a53dab88461a5a747b75a30d7a Mon Sep 17 00:00:00 2001 From: harveyjavier Date: Thu, 31 Oct 2019 19:12:04 +0800 Subject: [PATCH 2/4] Close drawer on back press --- lib/screens/news_feed.dart | 80 +++++++++++++++++++++++++++----------- 1 file changed, 58 insertions(+), 22 deletions(-) diff --git a/lib/screens/news_feed.dart b/lib/screens/news_feed.dart index 466e22a..3af2d71 100644 --- a/lib/screens/news_feed.dart +++ b/lib/screens/news_feed.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:localstorage/localstorage.dart'; +import 'package:pull_to_refresh/pull_to_refresh.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'dart:io'; import 'package:bicolit/utils/uidata.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; - import 'package:bicolit/tools/drawer.dart'; class NewsFeed extends StatefulWidget { @@ -14,6 +14,24 @@ class NewsFeed extends StatefulWidget { class _NewsFeedState extends State { final storage = LocalStorage("data"); + final RefreshController _refreshController = RefreshController(); + + GlobalKey _globalKey = GlobalKey(); + List buildList() { + return List.generate( + 15, + (index) => Container( + height: 100, + margin: const EdgeInsets.symmetric( + vertical: 10, + horizontal: 15, + ), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + ), + )); + } @override initState() { @@ -26,23 +44,27 @@ class _NewsFeedState extends State { } Future _onBack() { - return showDialog( - context: context, - builder: (context) => AlertDialog( - title: Text("Confirm Exit", style: TextStyle(color: Colors.white),), - content: Text("Are sure you want to exit app?", style: TextStyle(color: Colors.white),), - actions: [ - FlatButton( - child: Text("No", style: TextStyle(color: Colors.white),), - onPressed: () => Navigator.pop(context, false), - ), - FlatButton( - child: Text("Yes", style: TextStyle(color: Colors.white),), - onPressed: () => exit(0), - ), - ], - ), - ); + if (_globalKey.currentState.isDrawerOpen) { + Navigator.pop(context); + } else { + return showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text("Confirm Exit", style: TextStyle(color: Colors.white),), + content: Text("Are sure you want to exit app?", style: TextStyle(color: Colors.white),), + actions: [ + FlatButton( + child: Text("No", style: TextStyle(color: Colors.white),), + onPressed: () => Navigator.pop(context, false), + ), + FlatButton( + child: Text("Yes", style: TextStyle(color: Colors.white),), + onPressed: () => exit(0), + ), + ], + ), + ); + } } @override @@ -50,13 +72,27 @@ class _NewsFeedState extends State { return WillPopScope( onWillPop: _onBack, child: Scaffold( + key: _globalKey, drawer: AppDrawer(current_screen: "newsFeed"), appBar: AppBar( - title: Text("NewsFeed"), + title: Text("News Feed"), centerTitle: true, ), - body: Container(), + //body: Container(), + body: SmartRefresher( + controller: _refreshController, + enablePullDown: true, + onRefresh: () async { + await Future.delayed(Duration(seconds: 1)); + _refreshController.refreshCompleted(); + }, + child: CustomScrollView( + slivers: [ + SliverList(delegate: SliverChildListDelegate(buildList())) + ], + ), + ), ), ); } -} +} \ No newline at end of file From 67acbe1aa8ef10fac6dfb621d2e88605a48de38f Mon Sep 17 00:00:00 2001 From: harveyjavier Date: Fri, 1 Nov 2019 14:52:11 +0800 Subject: [PATCH 3/4] Set minSdkVersion to 21 --- android/app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index c7e8500..c5c2287 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -38,7 +38,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.bicolit" - minSdkVersion 23 + minSdkVersion 21 targetSdkVersion 28 versionCode flutterVersionCode.toInteger() versionName flutterVersionName From c5a04a4f709e0c6bdd6c897b96d82bb701f602b1 Mon Sep 17 00:00:00 2001 From: harveyjavier Date: Sat, 2 Nov 2019 00:21:13 +0800 Subject: [PATCH 4/4] Add data from firebase on newsfeed --- android/gradle.properties | 1 + assets/images/default-profile-image.png | Bin 0 -> 46809 bytes lib/screens/edit_education.dart | 2 +- lib/screens/edit_experience.dart | 2 +- lib/screens/news_feed.dart | 183 +++++++++++++++++++----- lib/screens/profile.dart | 5 +- lib/tools/drawer.dart | 13 +- lib/tools/label_icon.dart | 32 +++++ lib/utils/uidata.dart | 1 + 9 files changed, 194 insertions(+), 45 deletions(-) create mode 100644 assets/images/default-profile-image.png create mode 100644 lib/tools/label_icon.dart diff --git a/android/gradle.properties b/android/gradle.properties index 8bd86f6..1b0656c 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1 +1,2 @@ org.gradle.jvmargs=-Xmx1536M +/*org.gradle.jvmargs=-Xmx1024m*/ diff --git a/assets/images/default-profile-image.png b/assets/images/default-profile-image.png new file mode 100644 index 0000000000000000000000000000000000000000..8e970d4ace067873733c496b9609b98082247040 GIT binary patch literal 46809 zcmeEu`9IWa|Nk{8EuzyVQR-xgL?Js>oA2x0{rM}tkNbzpqj|gD*Y(<8&)4&sd%v0)?%Hu^2SR9< z(Jwz+AhZR3+=8}kg?|oy;V&UX|I_H_^Hw43sSS@*DOR%bMC}ic9@!FR2Y3Ie=|51@ zQ8Tj1$KUGE4-YPv3EO!g#Ey{m=!aJ`F^az?9g@NArYcT`HjsZN?>VMybjGFj4C~sb zWG~ibSRRp+t?UG_AFetGocsRo_5c0*KRJLs{Lc>l=MUfr|FeVt#l!!_!~dWCU@sH` z#rOwCs&RG8oXN_l<|5g;#a$s0%}&1S$wMQlQPK!4isFtU#*uHlKc~k(58$H;@+Wg> zQLANCGmEqMjTH-HV+qTK1Pfz}1`(HJEBi$7DM2>hf?&k#%739lAWW}6pR`iQ zr%{G{msGM;F0|vQ#QX_wAt8%+`n%g|C+t zBue%QrMxm$aA~lxNKhwOSZo|$e(|DnhbaB%+T)%Ns&ugo+r6&Xb%c)())R zrls^Q5`~(t7AM={mg>`+$4wbuHQ=r2@!tIyTiCaKb=9r%ooY+%(DtRM1H0u2#zFOe z$?pv_q76vn*V=+N$DR1Mtw|P}p|RXLpHs?J_!3^<#=e>4f#^cogf#rsX_9Wzr@^F~ z_R-VSiQU~)?bo$gbRyHN&qO{EK1rk-Nd(FL(CF8CT7>^P%6v1_W6uwWEPf0Lp^)uS zN0vV=;HfLdLG-_=#;cbN*FA-GXN3H}UQ#_hor2Kib*xWU3OQ za&zuCGBanm-Kk&W1|sL}26J1#>n9aVr)!wXktj6Jpg;0%a`dX& z+6wgg`&&m0<4g6OTx)w)UfD0^zqrY{@n9f&sAD8w{`x0#OQP_&thz2UQg`QRcO`!H z;K)@~5tqAuzc{$bBYUS7_RF@<59+o3zx*mHt&`Lnm{OUPG*H+5VM!vW{^E7;s+p=( zv>OdeZ<7Aqm%fr8PClZmenV6=Hfe9m(^z?b;Gm zbjg9xR3}6;7pSe3wjeaEvcohqy8XY*KFQRIQfiEoYI9Xx88^AG_YcH4F9Rkgn)&L! z(L~oLv)@>B;zVV8#F>u8?w}(?pV7_R!lARn*T-Tn8q;KCO&vT`&-9kF^t3%@^Nils zc0A7M-QbS*JgV1@nhJ?Ktedb<7ERf0@9t6j>(OoKr7{k7@0?T;Fy0WTGjMO-xT)Ii z%VL3U#nRU+8s%Wn`W+>9R8M)`zUU0OruKQ;-i@W=@{RSn7k*M|_g%p9X^MRHV<8h= z`BJ(OTAyY{PhJ?}2QrIK??zW;1%l#6{o5D5Yg|=I77t{Pe6$ z?QN)78WVQ%oa;%B>(c#Niy)uG8vg8cpMe@mjF<*5BtWfR%eB*_lb$GJK^ z8AL3_(CP|`p_nvhaU;AUoa4B9oii6x>8VOFv9S4Mo)|6VO>)RfN{BkBIv;5q^wVF@ z4CBXI^AokBzWgG3*dTK}$B3n(CgRdOqn$7ZvcO|rv1YB{#u*!Ik|883r8@Ww)TU;X z`*J=%YfS6l zS6>jvzRs`pSzEz+2+w_Hpei*co^C-Hm44zxNShlOtyQ-nBqWrCpMUS)>k%1wsxj_J z(@LpFz{KC*Ow#3YX`LhrPXI@*Sx`O>w!BCy(KS6wp+mZe*VGK)Zf?Nhx?-Br9#V}a zLB2BulZqo>%kHw~_c#zF?jCEYHBYA8TJ29`YDcbG#Yt;t26eiBW19Z;?9^X~kr5gE z0|+(TR6&;5m*dI4Kk`sFcxIISAR}~k_WS{!a$8Ps&D3!tleKSKov6WirrG^+nO53i z%fFgs>mc_`cNJs|{TQ3Z1Cx$@V4^N5?2t6=Bnj-afvvM(lx8 zwF3CXFR=?g2j2uZ4nH*N!}MJdvS}YDt)EUSEVU1kXh_&5h$FLBvVMfa4(3=Gr&k*F znI*`?AHg>#duax&%}~7CIBC;aYaDz0V%yF|bIaddR-@8rg#qhdKiX>rYjDi6&GbE0 z<6Kf&a(C}WA^Kc-(DE=Tykvh#;bbdYqouZEAbiPxboD`h`0Ua8(>W9q)ijfTMNM&2 zr{yhwcSwDe^q)IC?QoEply(wiN&%wSR^&LYdk;)Jgkr3a_C1n3wfn-3*9_ow z7wAR2POHpUBib>eUJhPf>S*6FmC|C8$ILVc{n6J!tFB7_jd6L;_U&6hR+pp2Fjn?$F(!~!RoY8|FrKuvgfU|@aHY-O}qYTp-jKUjAFE0d9<}@BtOI5 zHYVGy(-z!m4{o>yS_ya1bEh6=g z_cq3lVaJLdGnt?^`)j)%+x#jLeu(e1)aH0Nz52;O^rx~+Osl{E;=+^XKDTvh$o-yfWYs40|IR6Oh$O_(x zgJr^#EP~pXz0&(@!tp~66$!daGt~P8YN_W<&f449n&cDxZ(3#Z)5)mxzqX)|iK>5LhH=FFk2*TB^l=AoAo)c_)X1fjmO*Q$kYtsa zPwfS4^L7Ef(5b6~k(}vF9X~x6h4D(WZQGFEhCcRwy;uulNKSz|Z6B7vXToZ$!cOs4 zA~@DVO+U{H7hNg0r{0(KFr&1Ga~<2iJu~biIjs8KKe!t$Yh$N3p)xfTnjU17&$Wr! z%zgdlPMwBd^PRXD6`ZkgrHY4-ru-GDFXCxt4dR3|FSZS|J>QLCpRF$lb913+(NBj;#0-(0& z)$u>#>1`uzZ4nCtOBJC!vk4u~zV0p3#o|s=FBBt(JSyzRJ~TY3UR%t?{8QG?;3$%s zUlPLJT;$I5yzAGxWK%d+b<(C&WzEE+w5vC5htT5e&M3mh>n+Rk_YzlTH-ZD^zdlkr zu#-tfw|*TG6C$H?C29+-nZcRxwZWQ*l?Bbv*{@gFK`BNf?oK^6Dl1i*TU9FE(rL|o zzIDmLDh|e$EL)}21KW@&yXtpPl_))XXr>AjwGceSnOKmHUOoF(dTJzfBb&I>AY%EJ zK^UKssU4});+9>@H5C+KoDY=;Ut_!_7&k#>PEoXpu6|Thx26o$W@)cFi8vuvgyTUel6{>k_rD9L)=;T$Mg*j&NL!6vQEJ#=~YO6~e;Mt^0n%Cu`j zkm?WXZ)uy+_@*1L-UqVBHi8G+b9ag-O#SONVoX5$!N7IViOpJLebR+r)=t_$`2d!A z=l9zm(3H>4nKgq(bE%F-Zf%B3V?1>-MdI$6pe=%o9o^9&WGNAR_G(r5lB2=K#H3!- z{0U;8`;7@PQOD!I$~u&rSd3Cyd`D}_RpbfDg_D`PwxJi+OIygOcr`0?A=P4TS`7cC zk6S21u%E*T*GN34-5+`U?rF=nk;b_gG5q_F$74#r>U3;HS98-kZ&Y`RCF4Z=J z(~Nan8}R2Q`zr(FEj>1H9lt@z%BEwc!|Pt**@|9Rt<{9Ht(9SQ1Y_bvuB&QV4l%>N zCg`|R6pvV0*y62Gs>LYP++L-*MPLvacP8z4H!7-niO_N#&4nLRqg; z?24XK1dmwA4^boPo>>sCUJl5WiS>E3(0k1Q-kGT#pa_=ZCv{2`O&!N}dFKyDLRuTO zB62CpU}K7h2LSi$P_u_rXu><+aIQ(j{{zO|R>q3WchnzE-9juqqe26V9KvNx-h zTG}5ze>$2!&(n*lPF^Up-A5Y!gpUqV-X_s-hFcS-z-|%bTUk^rgo=eT#!Hwc z<`X*6Yx6A;n+uw0W^8rS3^hB#gf{ zHE!Z>P7e8xvOm2v&1+v1Tx?WRYGSjmfsOLHb(`svpi?5TO-%$19EezoHz@4f58hp84H>j8M(A>DH-aihRo{(5=w(AE;4F5w zHKx1UpEp>uKF!T``?zGAU9g=`j(p*XK?ognn;Lzw%F!YG4G}`}^@B>HsQMCSmVz`| zvo|q?TjbE;;S@zlQuHF8To<(dXN7)-GS-~@BF(ph$1yiB?xT-aw$q(ah-oHn8}hws z$%4A6c6GIHeS@dc*+pQ}?|l`!x<8jzQcKV3Tbdc=Zx->}yBCApOUsrUaHuE-q%!!Y zeBa3C8na{WQ~8h^6d9}scW~BbMop{UDboeh>qC4FK7jkS=4DY^#1ta4FemVR`op09 z(YmBB{PhLjip7y#<*ow4|MY57%m5VOui^PAP~v+;YQ)M*qv~sLq>u}{WiDay z{@MT)NiVNM&ch5nL3z_eYCbPJdQIJ?Xz0B+aY7I(g`bphP^0!Qo8>WE#bei5PIxTZ zmDJ8qorZ@!(>M|sXZQod|Z*3E2C<13P+^9{SZ?w5YW41EF9nGgH zmX50rMFh*b;Kvf<4SvCDs%Ow_ItuJ1quCwFGLv4V{k7pLd`{iwDs#FHt(VehB^s2m zwHK^8R$X)oosv^nb`s61K1M=hn@_FOW^eY`YMb3kpGS6{4^5pk;(e0r6y{?Mb(3x3 zM#%9Et+9^iWf=w8$e|1&A@a~$`Lifwzo~aZ@3jmsO`k7y{KX}85~XS8K`L5r=9Lz1OKTC%ow>MxX6n5JXZdmrD5s0pE=uKK(^r9P^ZtB2lUl$DN=KN;V&Fc1F zYp1MphBmV*X-svw=eXgEVBN#AcG+$Iyv6DD1+J58r@E)fCQh%MqGrYNp9F(vu<1fG&S!oa33UL$b`ciVOM3xfzu8LeqD!IXZgLHa#qX zM$@yw4Qpd>a8u8hwYAF_U94GK>8OiLq58Y;XSDq4=CNnCQL=oF)nU*Ps6)~{jr8P` z_oApg`OibpdjxgRXqkj9v#QypM($ord;T}~&DC*_G&8$I(1Vl^{1u+wX;DJgXt}*6 zHW$6Qx+HUEMR<0HRlaJ5X~6Vq{K|Z35i|~RINY#A{$n)z2V^BIuFRk2cR2A=WIRnb zan-5>f}2Lh=$aR6u28c;$Ojl~Y^E-qBuDTwN@^0XsADPcS?y$u51S{*;7mdi9tKL`pi?f6W?@-J)1 zsVQ|RBDFX0=IS97bqCBnD{ow>DNwbk#Ayrjw=L$=Y$-D+1UP?V3kQVyLL4An(Eo9PTE}KW^>-&j)6L&!yPS)W2fGlOH<7- zJ6 zc(WfzAco`39X{bHXSOf~p$c7H4U4MwJMI**K?2A4&+gr1K{L>k`9}@Y%8RM|^~oVs z(F<~k_b%dk`71r+8lJUKbEwj4l+E1R3|Y&`Q!Z>Ii%ZZY7|4^k;mEH^=l zz&s{jQgc(_Wp{u92I`i9!?l&;UAyT9bLiHe@bIr9fXNb|Qi#lYcSB)a@alOmdQ&*lK+5vPb1Q}=20 zcTZ-K@L%91x1l=*Uvy`iS%hv17XKqeMpC~dHp#@U{20A9#Zxz>P_OL4iT(##(cGh& zPn-=|AK&x5g{+fy2s3`af;BX41Hxi+ z3*|!|Z7C{<^n?ibu3C2FikloU!`J~iZ-H2+bA|Al6|!uIX4B@rvdLcPf8(d?Rwd$@#rTK z;O^#i>x#VTX_LIYu~@s|n}W!M@6M~P={wL4O)J1q9u8=Edi6}2i7Gb*vmOi9gLp$U z6)tcNS(h?Ckx~X!!9|G^MkD=rlx3?RJ6Y=KGgz5;(x!;(y@jrXrZ}7L_n_kcKq83v z))w5$X1503SUZ3^JUCldG@PQB9O&hARicT2Kyfsv;cCTQVmG~lH0e|5Q1_~8!KQvI zgO_0QP`O9e!zb2q-vHUin#_Mxa$MND5UzIAQg-PTlQ{zaVg5QN0yJwZMj z4lUDF!MyrU(gUz)OTNlVqxG;#?TSWODZ=%{fKk7^bpFMpNMv?L?W!W_uw67R#M4;8 z)+u9bte~$VjL5NeMm;tg39`s}|4Y!yL?5?grDstIIo4Vjvzug`qItxzzCKUv(DC5N zJ^Woz>2wcNL4YNdZwkydLnLXfQidMPl-*FkKvU9+2hiFzrn6zgh{U)I?BctlUV-jw7zs9emWIE+b2DF|} z?XZ4HfH7F)1RCG?O@2LN?DI3jmCcE=*J_prQFYd;TAE2o*}!NOx5(9f$L{Zq7lcm& zVS?7o8d`t&gsbK!x)&8SwXc+#7TWXAEJ+*OTG@xfvwXIbBYQ*I+)Mi_Bjq)@gMQzH zQPF^_YSY#44W5;eqTvUD;uz3LPjEW5>BG{>KN-HARs=-{aa07>Q%Y}}u3GXR83U^{ zxP&VX{{G}H)@vdLIraAU`wJdNzE(_=xlh4E(33c96JTUPuy=NXMh3D`bFfVzm1y@_ z8u`+d%S`EXI&WjiCL&3|xdWm`aorA^PoVSKzKUfR)mKMR^_5(iY3~&2LZ_B`!}x!Z z(Nvp3GgvGB(94A0ml)6(z#AiqM?)iMGNE(9X>LJth#I7E3WYyJAeQT#f8rA`l*IJe zD*XEhr`px z5ax?LAk61yL`07ouSWgiaMBK1NcN|8_X_`wM(Bz?{STA%&&zLNWD);_*foO>d5qbZ z_k@xxT8uGr@aR3o+er3Gd%bsICs`BHG9&B1#-RyS(p3{at~ff$Le;C!zK(P}zTZ)d zapcbo0cUd!Gh*M^OwC#aiDO1>-xPGNJ9{lr&IQ9?igLdF082TfLaqug)FKdQG8jln zs!`hxeRNaeGbNw?T8i!x*MqIoEI`)maj_LZi}v;EP@7V!bay36?!)yIwOKpJ$^yW5 zGJitG;5XbX^(N+mzGp9!8mPU~jhN|-oT0rN)hjJ;? z7A&ZPHw?v?^a2P7(JvAz^XCS{Y%Ci-=31lbA82AIJnzIO(%ssQC7U9Eq^;=2xZ)1| zik=Bb?-hQWAS&}7D8ezi$PHThle;=0_q5rS^S*wgmh#b61t=$=_RLFKW^7@2K_+$f z-Ir6@tR=EC0|Be6Y*vh%+({?S;3Jay%DL`i|K5olgX>_a5M~gS?+&Q5kA^hfe^DBp z%%jl&h>|XJVBNvZvK92v)II9+`!0o!RVg%@_X7dvQBVP~4+<`PFjxQmYoc0uknr$X z%+}-&Jq1Z}1~+0bCA`xurYJDNf&prFyu9*C2vr-I%WW3gSEP3xI)<$KUJ?V=76%KrOx4Sd8I4}PrqL{n=fHG5<=AJCqu737vSwZq;5m>7 zsQ2IXMk6V5r;RGb4Ehy{-W$HwwCkSiS`_k0h>WV=Zv8D?I9?h8;2Labcv$^9iE>@a zANqj&3>|}L+-$Q~yet|veNIy}b>IMW50jrV9v^8PHCFJHPXsGd%dqS7yh)TmMJdLD z49Sn`By9ZI(AJlh1`CqYAb+H`tlydryGGhgwlM*N^|CRB6kFjx9k%);800DZ>L3-Q zRZBYA2TRHC^%7v5gn`uX!lJGbL~P#l#hLz!jC*&5$%5C!2FZ1|S#+9AfS+G#)~Z|=L}jm%O!9~`25+)q#NpOWr;gx4#<8_D!0$djD}c#?isdeV z?9|;z6gSrB*mRXq!9~I0{auHkP?%KpOoyng8(VmJK>dIaD$(82L$BBzc_6Z(`ry!Z z#$`DWM;YiKa)`r@$5YR42qS)uXS#QXcm-)~#*Fe>237wo0LEV-&ygIc443Dv{N*Z$ z)?>joScJl%>WTofLRn~AArjAqC4E_qFORzEkI31{O#?&**i-90M0D0nrUrr&Sh4oE99;#pHQ2BW+*|3jz|W=hdK@`%?xI ze?{n|*?|GoGRfa@Ax2jFkR$O){^b4ohX5B+iSkrF8n&6TPcLgNunYDU+&VnE;0Bq{ zCLaU<{YhVJ`=~UUwcB;g0h|mFS6x5x(@5n-?NtHfn2e3=+8@{jCnR*y`2vihLyc#k zz=Z_Z{H!q}Ee&)di|MBMHP}cwJ%IoAwtAx6v#ncElqFN$Hpl_YD4SN;h7*{r!j381 z;Af(i_T}wu;okHPrkUJ-}x`q=>nE4BZZZ3V+AlZJp-ce zcnPBSX@eKks}sG>qvgnrG;osSeUB^K#}S}D~}^eCz; z!k2=RdqZVSCHnMNCtsIx8QFuX&y`xUU_x@9&WTkwbvchhzNO!Qz|%{E;gncKB-e3* z8uu&~4X=RJ(TPX!gUvNDVz6V0#*a{@{)E|?)rgk64rT0Py&>=@@~*$~+KwEHufL#y zTj|QWaUvX0$fGc9(fm8Pg_g2d9=IE|Byt=LS4{VB?H}u|(X|Z%u$(N;WkMoQ={qd~ zpr#pAXBS#cr~w`Ktr z6g)GP`N9jT7jc?AXg4)iQI^R3GB(|pZ&9%!4q%0!6wLTS=a;V>@g?SArX*k`h8)vr zw9Zqhp|i_ZCa$duBbE9b&yurFUp|hFnDlQIVeG_|YoS-MvGjSQO)u(oa+B+xJU))W zwUNz#@uhvB%E(XhH0m%PMZ=@}k_Ozr00%?j?pvXws9MHF0RmA)Bq!>w>JCu-W>niA zG~1b!U{}s{?KD%38w0y^^Guh6VL-UpkzCJ1I|Ud4*v2eOKQ?F6ycwP?k`PQ{KGv<9(y6NFIFFJQD#y!8bq?1Rrcuo%ldDO1%K?K@PHP4|4d zA4j&y^Gw$p>~9|HrXSZtA&a%x`Kxw7J@GZBzi#O$$-yJ=f&|GP zlYL+cb%soJY>d46svLCZND{PRDJWF%hodIg+GM2XvH_@c^>gg_T@?Y`^TvJ$en8c6 z?7l7%y}Vp)$Z>gjD?<$vLBLP~iCSdxp^UA)_u_@f$V0=7cuPVV#Qo)I_I0r3A9C-5Bmf}jWzVQX+^D=S zJDt-6Fqm4yyfmsaE#JzB-T!ca!F~J8Fn@!(K@;7yt1ygx03h{MV~lXo z^!LT1X#Eo39d_gB5~PeOg1P4#-oAs)$XOX3(GSb?Q=;PpXJ1%tM_F~BPXK8CW$?DJ zLT*l>B4G1HR}^G1F#x5fqJl#8wD?cFKhmRs8*;1(1OQtaGy3w=<=DGW$Ogo|h(R~6 za7$2c5f;bo8!UkFQc_VyX`3!Ek>9&Z7**qdC`L;RUy|mk2V?KuX|)YynJYjtx9j66 zRk7@^>pL)`vC*2)8M!*Q{P9^A2}5u+pF zbxjLX%^Uu#AG8iyaR&s^pz{UI`?B#GnoM=JE{dvf1cXgI4r8;0R+lAHvoJZ;!&nj8 zn|v?nF|>TgpdD;ZFTJw4zA*z3?4Uz9hNREe37vcz)V*oc!aaroX!dm&rdaC{Evk=P z==$=N|7;gTAtO+1OvtAOkpA0nM`MA&9yU^Mm|>(C^8m^YYhxoAsHlwfUJJ~Bp=j_C zH(M0wgY-(No+X(brDbQ$nOzFGSNFkuVIkCjTcSTSn1C2w1mcZIuw42#3P8`*#cIQ^$z?lSY8BXPKP{1aEz?{kBQh8;w_sWv-QCW zFz4)`(kv46!q!8U@+xJ!4xG0mh6-mWVhqcPe?gW=+i{8DCe^4Hv91Nb{x#wl zJe5v08Y00s5P+94+^ot*CiWbGaKs?w%c2wNxow;fBPLCyMLZWA&K@5|A@o14uxtZk zmDX~h6mu5q9tU2D4>9*FZX2Vndpl^V^f$~c`VK&$4yFo_mT~Wj3km_WmEj9nljOkp zHby;l5fzIkCqPiL!zhs^CX<4*YHH#1!*X7E6le}xhUv1l9a}516v;R1&29- zx6pdftLKwI`dGQ~s5#|F)Kj`pX*WM!sodszLFdfQ3q9 zyojxm&I1sq{c$X;j5V!9$GT--WaVa=2$4~-JRyHlF~iPIV&uIj+B|;|4VTAWbjX`L zpu3lxB8V1qEE)jBYP16wR%kdoTnAp_n@>w9m|ig#zAuQv%@uT|r!_Ro)edm@xLL7E zEfiJrYZu9a=1pv4ZUZ@)zo03`zSFB8es&n)CnvEzxGA|nn6YG)Np68*mu3iw0+J;9 zK#Ev4jD)zhPFDoqw9tHzi^w&FNzmm25yhY%_Yi9cefR&Tvi+%@YlS^qKm@J*=@Xyp z8sK$u;pc&^&gBMBu|%0#vU=HBc~^I!9%-6lAMYZq`HKOH?Vo^5 zc*Mpc&umCVO)0eoDw1{T-*!& zntg8pYony2MB0*&93KMsC~mpn(vRZ@9E=IJBB)2)!IAPrT2(1k7x!ld8JDybgr>42 zR<&2CzF2L;<6l5`uBO6tGu2i!@(^c4d0yf{vfVc0kbo8TOfUlXZ#cb^r7YlxB;QB1b?4C1B^v6?hdsHuQATg4KyfJx-)*pvqYMBXSO5VokRw(a+AK9rD7VH5&7U z+G6CYo9`)@7zoU^7#m{-$<34(LQ~n7e3hCaUY*8mgXtOB=?YCr{IWP1HflxCH4L>9 zo!g={8yJYzjX4kJM;*m?1f|D zfi$7mR3d2tGX(>JtZkgjs$Wm<9udaxxjWG8JoSm$s$WH)0dOdb`d%dZ{UUM63wP_o z$mfh>PFWqm1)K+o4W`lK*dah=+XHfjf>!I14nB zcPQq}?YlU%7_6@%ds{5*zyIs>tBD9=L}{k{tS_uJ3wqZhD9E}rwc~y|Bn-M}b9Bga zHBq>yTZ2SHOu>!y+O*`}rNGKVKNG{=B?6`)coMC}Y zkD`asnYib_!WzmGZYP=&10r!+59dipFW2_DMZ!L&04lD#9F}0Qt13EYLs09v6+)X$ z<~*D%bqm0pH`m@+c9Wu!a4Jl>m^&{d=cvL+e9ggQQv?3)pf00I0zJz2N%@XF&S|6|_YR*}aXknZK&SxO)m=h9=WraTsVTqT0 z+KMo76F%?&8{brmbD`19Mnz#NWsZfb-Rn5Urgc{U!qymQKgBq-6%@TtZQX&x+Pt2_QZWGqZHg+Ixu`+QHOCJGYE0XyL3+_hz*v|No}C0mAe4>Pbz%nG2)*S%>6iiz9MA_an(X}bCY zy4diamf*T!%!jU>uZ;-W!a&2YduGEmSvzY=0Y>NQW8quHlb9psH$M*Q?7@;qmzG>& zSc1{Ci4*xY2JZ2dL?I`+%A-KX-2lB4j2pVjw*NQOC1AZ^EA&4Gr$&v^D~*W)up3Nw zR`psy4bQ(J0PlN7lS!nTMzjllca!y}<2fHOn^dP-8R=4TM4*k93KW3$8T&MPaX~S((p>A ztXpjOsO1*4JX(8gu4_qTN#6Ti* zbmy(%aVQbp;2uGj7PtX$Y$p_LGfYoyMcD2t{GLzfczH1?rMKZ_fV=}d3mRB`D12)e z+->rsK_{di+RQ)Zi_kGWmsvScovh+|TsvUsO z1VES<6fSf_dsQg36_P&&Ta{Xo_KZrBzt;|OH%z)&9(W+Zq3{Zy`20y7Lk&^4gIz=v zgnd4J=_#$0{wnLn4iNRl#B#siB02RGH9dqSZI53G1W{k_9BHu83=CXnP0PfH7I+-o zx=R`v34wQ7%3m4%&;XFx6n#H%*wyd5q|@786BEJo8Q8U}ItUKg^gYQIfDDmq?8{@$ z#AtR~+K{9Mb~5&2d#_6SrKG!E)zc0hp87Oa2wv#sadXHY&GHUG->_WZ{*=4+nyJAI zN*~k$>Dkuza6U9N_#AxhE?C^h!jcYrM0iFUb}Hanw*Vw zsu_R`=~CPmnL>YJ2AqEVAi$?UijZiyQYFkVw-SOHS>o1#t9X;>A_f-6%R4lOS! zGxq=F_6a(tCLo5IRjdwhRNk+KO~^cRfQK55NtAC*Lc`t@>v*(TVFvb>m3uYGqQvhv zeGJYTRELR@cM3HP6STDcVYE*5lPY~xn?)^D-w(X6$v_8|_Ul)VfGo8Q@v%xxP4j^1 zz?a!a^%7H1C+X)I`_I3B1W+3r%w+vO4KV@&4-n#x7-U}mdKOBK7^oB~Y5rf{e;$w| zUNrRAJ`*A_^Y%` zEjrYvpW~0g6IayGaPLk-hdl1u%c260 zNaCr;p}Z0$;Ljz~n*Dn@(2GOw|7<6~9l76o=V}Nd4Gq^s4`1VZUIvbJ7$&atF2KqiaEZ%#O$F6;*Mqk>{yem#9r*QE;Agz0A4eetaKn&5Fq6Wk zxZ!j5Nq>Qm4Qn}8|GSHX{imPQ{(UHNB|-oZwz6+oYe?NMra1R1_R8=&Fv_5~5 zWa2>-^_4P~*s8V-&FV~WwcLrs^al?v05T{HE#mk0TGJF;Mj!5NjLW6b?gMPXI7yf` z8|XBqpry9U0;0yVu{}+uLZtN*6;Rhm8|pr+I}Z0Z|DV8{CB)d$7pTUgG!l zSK#JDQ+LwJ*odYGRN7yL;`6;u9R@(E4DKSlpk=~Ms*MkM^j(0_ra^2W_DSJ`Wa>`? zWb)rP0X~p(U)yi$YWjEBxSBRbTw1SV=EddZ-^5>m_44 zmumXJtM{KUYDmb`302Jp;EWM4PXyr)4LlUNK%JHW(>BAW{DN@9qmyfH8r|;N{$Fpc z)&_4%18DdT4F{hjB#)jRn@VHmTigKLz4}W-K_T3eij&e$sF$3Sfa&6_9_erB?o|I{ zRA)c7{OUM_(!<80NTpXRPC*vC3)OJ_^@cc^Gt-MLXOvEBAGeh6jCYwb2DsDSL*5jw z_dFUs-2*-pa0Li^3gAOD#XPgj_dW4v9wVe;m`pKRb1@Y4AnK@XzyYv=#y>r=vfcln z|JT_^-rlX9US@#8?(bD>x&A(lnHTKCFZ&Tla5w;@^E8d%#+PVO(dc^!iUVfbkjlmH z*yyX{h87Ke9(Z8O2~#AHO4)gdM7SuSs_^cBELx@jMgso!6>f9E-NnjUa|c^-lobya znQCJ-q0=&|nrBV{R|iX2rZmq8myH;LrF2;X!fu0EnF$n(M4h&#y^U%jx3|E>mHe9% znfl>6w=rFvrvZ}vsh!AZ>MiwPE?uBC8_1%NE3l}c*x~li7bM5mz*znd#0T__8e!HB`qxu@i^@=$yIn1;)l7LPiaC9cTI|YwdLLjyfX4;Ua}w~K=SS} z;9$zfNq1l+rs-yz1N*t?x zN5xY?2oMZriSVD;~NCKFBOiO{VTg_mqBwWcMey-vJ8 z^4k?KUm+Mi#HZvyf~>!NcO2{T`A3Ds$;HP3RRoD`C)Ti z(xU@NC0`R$*o2%rk)8r~mfU-nuxE-+U4a@5h*UsV4sl^)`gefi$@4_uh`vPNjJn z!fJD?s*v|yXxw+{c4ubdBNaD>{Es#Nh>Dw7c6wJ7B^!<+2A(fYFhhV8S*Uth_Y{8ASyH zj#*tjQ<*M-pZhCvy1Ni#FM*J2rwoet_OhtR`9HRxxvI}Q52UO+b54W93h3j5; zV9MX&ae_8`VEk6?DgZ{7@hYjyG?C}g;VNYagG=GTcI}E-DeWK``8diiERw-P+-xV- z>PBAl2##gmDfIyE+TmNGC^si5AvVuEm!fVEhnu|_b_R|=36-8)qES0V7w(K__@m)- zlQG8<>1`DOoRV95TTu~KKC)gUCCP}JWgGWtNSNxt$Eae&eTo>sGSevKkO+r(~hhD-~L+3K6Dgm{X!cE z@H5ZSN^vn1^YDb^R)kSVG@0{(Etv+9s*R#tb$xW}VbVYgUfJo*V++p~6jEk&2o3%l zWI&*_qz*Qpj-wtyS`gU540O{iArepOz=-H1CdvmrX#!LJV_i*Pk6I2MlY5bHuW};_b-5!l}SujsmOJK;ZImxytFG9hF1YAe{In`Do{L^Qva}i za#A~b(OZWkMrL8|BUx6u|7Kc%hq;?eq{FstjEU}QnlVJ~&fHi}InzstTo}WEvIpN> zKL|Ye6bLi9ED>DsQ#dCi&E^VbUgWI6a2eL)Hh?OzCTwi4|O0Aqso=F_HHMCg6ISkQe{Uik5$+b*3k}n#;u-#D=@%bZi7LB z5IGszhDx8ba^J zl6%yGqd^fI5OP3qwoY~}x#h|?698Bu5tpcI zaE0UReLFOG5PJZEN9g2w1+47WyOa(b8z=#=AtYxm*M!{-eF zR(qf#u9>k&+Cg7_1B1>eoQ(J&F#G`8hGGr?ETOE?&O2&w5$=(X=M4e!hD{4xLWBF2 za22%QM~oo}2IFjgs1fLnZMvyL#(1dG7@H+(8^JQ-?HNFrXamIp6i$FWXh+X@WA|$B zi~+ODRY{gxvt|a(CuBuQjK0FvFdunL^_*)TZIQTaq|hz^j1~;xhHM2nAk9*~Pcr+)kiSDXs9sA7|@uT#6$>MbDt9);(8H7#;;6bXZo zlNJrHT-7h)7)Jouf!iUymU;dYU%mx8cwB)NKnU1cEABUIuYT#u--`vK%9Va=MS$pG zuG^JZ9lm05_j!9!w>r)3}t4ZTOfiqPH@QU1U z&hdcN6srU}q(WMnTeK4|y{cq_18&xQWcI?sLUr)?jj>oq3NV>4L90yJZ!2ll1;2b! zAJa*?42-(0{3~$#c8zOqrb|h)5_ayup7X_;-#)nVrVLFeb3dx~!&3<1|NIP>a>`2= zY(fQ`2feR!^;%HF6tJjJI9xy{Zve$R4$e_c zkt-ttC+Tg%>ws^K5I6m&dR_&#pmBT+ld-AxJTS}*= zEU7qw`^iBL>3N1dsH@94wGg`0nd|+sD32Qs=kO}J=uqBTyjWg6e&*{h0QtEWGipN^~pRlsSf{&c^vTFFkr2= zo8*Ayyx^hQFW6HRaD-Q{vf>BBFy zT#qIu6+ZPPt>kMZ$WNVXUzzl-vw(rB?Ke)lMnI@iJT-}2fk6~|y zIMG_=HW<3(4+VIFPp=(NUEWZYVhp6Kmj-9Loz89{ZvbJP(JTSORtL^AvBAp{jaKif zx1tWfxq-QZ-IWGIbeU8^Yw4i8WN$V&+IXUTz)HbR_&SiM9)iQ6VE$#E86b0&jng?N zWYClgc9PD-3w`*IC5n`8m<-Ry(;r6l7RE++k(K3ou@bsFwjvfplg~oaRoO0Wuz4E3 zfa2g*Fs~wDF92HuE?U2bZvyB%r7QgqzE?pAXtl2kC;g}1e~efjtb$>n7Qm}RFC`7* zztk@cwmqHf+J&tDz?NKeJvp0b6nBxcI~Zm89K36_()eW=;`kPFG8RBaH%655mP%jI zQwjr8_9FgEDAd*rq@!ki;tp%4uXOglLN76-NBF0qCD6`Fy}Wd8(wST>vEAh8o~#Zm z+gC@97kCFd{0!7K49*h%3Fz}39PNNP*THa(#h8O{i6EKMR5z*$H>p-&d!_cumfFi= zqGMsar6iNcs|=9g#GiV>+Y@#EVbZqr+#zB;dB9 z!7sXLRBm`*H4=Re(Un_Sz0^L6HBh`l-t}$dWH5?h#@TQOmPe$^ak#H`TPd~WJ{@r3 z_hH3X1GOXPejbD?{|9!K|1DTt34)Y*PxUo$f~=?pIYib}nt^*gwbtqmR}M$wRTo_v z{9d0xFO{%^SrBA-g_vEXGV{#b?6z&YyVz2#nZ}fdMK8lZCrg=F!U+;3oNL5x4{5 zmc7<=qY6ueV{;H)^_?y)3Ny}w%7)3Bw+Uk{%8gJ9%1cK)9`*mlPXTD|23$@{rk@6%Hz!Tj;~Y`9?QHvUE!iDH>}N-;M_x^aC) zOnUUgYFK6a+gTW45RBo~(sg`Cv%~nTi>!Bvhsn1u!ITrP1`TbZM)V4^F@NG83*ZBT zp?Rwu;J=xFrZ%vP@fNg3jy}V!l+yQCk6xdxhwlT(g~0b~vTL|O2lNqhO>5j~lg-d9 z!S7!ZGwhVnKx>XL=y=ED%)Qm+x*9lb!{HXwppkfTL2`vBjW<%j&V)~idce+bt{>fm5$rfhhhniN?O`v!x$Kc|jJ@nhl#JHX@MTW1P> z7wQ>Vg>TRJq7uF8f_+oYO6MIj1fnH7ok>Y}BF#%RH)#F_%_LVRR-jlI>MlsDOD>!9 zO@t$*2vk$%24Q%}XzkT|H(~UH zJ-Z7UfyvdE=6Neib?ax~VmNf+7F&z+vX~Bo(M!|S8{O}`RZ{-Kqh$%)QK0n%Xgetf zEPr^iK58EQOERSis>JH)>1lhtXl3bIzS#kX)aJHnG;993;mD*N~Gn}|~JBpD4n zSs{B%il{@#IAoWRB%|z2n^4(gAM-PD*e&-*(UcKk_ zzV^E5LXgD>JReYlkpjfDdoaFBn2{R*C_m z&mxFybHQg}RJ2A6Ou@y?wB}le9p@tM_Qu@}J!rx5sLYgRf*mZA33>?Fej#m4j8-l0 zOlboTsZ6D*+pqUu;+l$mX_n8MZ#jLcn zb!w_lg8LkItan%QiU>NuY0e!&w$a80+eapE5N~*F{KBn0*dSC%q3B}u1P>AB4iBY{ z;O&w0GSH`W;ksR*ha-(;ybz>eTn`#+@VW5fqZ%XQqCt8Es`f%*KrnTR`P&WaE}QBI zR!Bqp2CD4@KUl4x2XF&8*~L@3Y8gboo2ymx1D>(mpeTUHZ25HdUfzZhSBblYjFGP<`YS8&?#W>ha}u_IQq5& z$W_6iE46Jkpje;Y=aS_()LL%0rtc)4dB)5Hhe6A8CiwlN4k$zf?oea&9;_CzuuN>E z=YX^+h=Gy2iMFj#w@W3khY@kGP?3_0<1abe6N9&!1r-}l(AKciO;lkqK*c)PDb<~A z5;Rgezg(=14THrsbilT+d$_+655B?{e4F*o$}_MzorZ!xL#@sS+U@qTGICA1^PAoE z4sQ3APd%U6nPR{WR8E5Po7_41Of(^IXZzX9iM+b-9B!^0W3;! zdzr$ETu>LV5MLeeBLI4Jv=kYw z+8D7+sOn7bD0lvw9!wR@iM=Mk8WYkK>U%`2MhvVhlpibDT1&-V0#qz{ejk#l_Tl+P zUZl1q>{48Vb-i30`?qKdi({iV>N-9$k(Luw1JT0umye*5-UO|rcfA@X44o*zuhaq6 z%{$Q*l!|-e-~A30%}R@NwxZn=UXBIJ1KPFDBm`=my$}SBPZYo8zp%z{H}=PxvJKr51OcyL~6Jq>;WlnJVIb9B|(4`bf!QW8|B z2vwa9PEPaZFW$6IyKgy^<2p_^xR+&; z=3OS^K?#^XsJ3CE`(r*bvJ9${Lh!~UcUh@i$7+B}J11f#O#@Pg*ZySRxddPm-coPA z{GB0L-#(cDG09x}5Gv)o2tVjb4qzChLoWnR>9#uZV?e+CK%h67<-S1My95CJ=CEim zb*1bxX}O3%I6xB`cdY5$YyBqDdqSaeU@4G{9G$ygSsm z>wkp%Ldx9SlP5H*ki`!~01ls4?!Z@i7q)pogmdhdr_wf^Knc8l_^M!1R{~lPyt~}E zqXLKeyc$4yz!E6)mXv0S+MPMYg(y9~@`fflS!AhXi~S+;)_ElswZ;GLYdQ_B<^*B{ ztb@1I8#Z>fWH17q^mMDw1xeIX%6_83o0F}Ib)~OA{?{*s{9&VoFps!KEndpWq1tmn zcV}mY1VMzp$_k05H~wP$GtYRT0|jcYgTC+zU))>$2ZET!Uyh^Ed8s!QkjVB6DhWTQ z)_P07`64siM0VxFk7kq&;&4k!W6v@1;{EoL^OG8he1f%4PE^FQn9t=@oV>bHBze3()4_{5mK$hcb})+0@~3 z(yMA43WI(qyOQR-#d6G#aBf)v!T8rlF~M60k9<4&UBDJ<=mS$lhJrqqr+z(psLlvP z9;$-&abM`1nQSc^^-PmQ-s+*qK_43pscMcRzuPI~jajlQU>H;g9%t}bx}Ax-Uuzn= zz+v`xX=}j&3b6wko@avPctzF{$PFs%^z!=9R&~qbjqLFLb1gc`SGB1UVbMrMw+yoOFmMRDvRGM zZ84xIGe4N_)>JYNqPe*{=nbe}VGCZ&Fc(2Me0bf$@$GY84 z<+k~fq|JRHYz1q8f(i<7o=y97XceIZ4Kb4Z)_Pg`LZJFI6tATkHFNyMNr=w~at9_t z_mo^0LZhs-vW_DBmNvaCFe8y9r4C6Kj7#;*ND8uFCesV(!{iD`=Db36xZ-TKL_XevD)+*yXZDM8!i^(nH<%&L_261 zGg#@n_BY4EkNk7qG`Qmv6}kCwoSrTOX@USaA6m=|)od3mhwSB2llMQw`urHL@3s}? zcj!#%gzh^rk&%(0@k}ag?kXZDAFt8Cfv@l7yz1s9xw?{|n6m4oyh|>GqaNOBY?wB| zLaY${q?wWG8`D(p2ftTlBJ97XZn8qMOsKCoI9m`sC{jwg1~t*uo@*`*>zi*Nr9P>$ z;vC278*ol%w~r)<{T}T|kaiR_6+M17Y%7pvA_P==L{Iij1?T2cp0-*%Rm!Qa05&XX z_$qi76W?)xs_<(iY;v!w(l&HeQc4IwnnHv0_O@HLGhe(X_XSEdHs+s+Y%H}9VuhjG z8YknQ*9n_w0LFo1^W?BX?Alm;tb1NpHs4IVHfu2A);-RKLaF3z4s_jtbZ>9&^Pj55 z1Jg&m=kpx#<<47u{r@cPxBBhfwebd$v~P@mLQmfNaT(G{N3*&T|Aq1#bOBe9oNT-o zZDURG1M=Wp0EN2dyM0F*9IC^WmGsTzfUuJ2`=XHLdQCt_%)0JX2fMf(gk;^TwrG*v z&3TYaNZL@5vvhp4lj_(fsCBe+a#D64sS%>HqICFUb7G^xJBsH+-AJfU?R7JGCS{oc z+3r=|>)&Oi*U6Bgn+IsS?M7|gcB7cZLpxH&dvu|T2T_YM=U4yIr0-g4hobMc52(Gw z1!(ZI_yRpR6CC{8C~aLueJYgM^UAx7g3~goT9PAZw_|hu!#G53B%&0({@fX>^*9Uo zqQ$9QGu8Vqq_kDyJH(~ zNg}fN3~O(=EDm{ELT{SJ`mH}N&nWh(1U|z+ntQkW8)yE=>?Fn7Evo8=dBrmonerK- z-cN`#|E_8nhw{A9VKNljE=lh{Oq=ndGyL;Aa+r??bvV3XcgKIU#tYlR6{k^f5pwa7 z^>>IX>o%=Kc&!w z(ziA~(?W4Fhz%#&6^g?mn+`|z7D={=jp)gCa?5(}mL2&;r`}@Zx@jzN>?~zRh>=F@ zqxw5Z{2NUywvDUs#8B~UD|bU5EH|Rn6fV7kAWa7@_@nd?QYJ-UTaZ%f*GB6QA6D$t)4)lltesIC11 zPp&-rYJwR-Qihiq;cXBFab8W|$zO)zXA0yw?l=dkk0{r2MYcY`WPMPqWSIP^V#i&$ zS~zRgsc30wIygE~|lD=g2GZWFMKmpm;C9l7{1StC`hGxKxiW~Qd`d~xZmC-SlB%;C=U zOT&q{ZgC-D9fQ%DAocO@4Vi@<9a?oJ`q+cKLLY>*7h$8QgZa!3EIS`lg5hHZNa1Ks(8}*SP?_SwNJm_rm7kA1ECk_s-Mpb%y zd%Ar!G&RyXDo9Exsvx!qu`vELJpC&2^)WVFzf5F%O?;TXNqoGA=M=tyx>{K*daj*o z>o$`cBXLm52S6v6?z)F!8ghrNiYkC;42(*~hc2yMAF1`9_3}TMsUQ0*#qj5Ohy6dP z%q=na9-=5)mR+R2V3)^oi>GB{kWPn5e1BW7*VaPzx7HOB4M1x@H@`wFzf3PL zZyB+U)jBy-Usu7<41LDXODXEc2IZQPA25mRb`f^*A|l#mW;bG&bv?0# zc=Bqp%?qIXcTIbs_|C-piNoFFc80#ubN%|}23WPi`)l7Fh5mO!c13Y(R%42o=!)Ba zofbcNWS)M&pM+UHQlQcy{x}2g@~hrZkbKA2SAVF)YT(O>p*R6uDc$=IeshPS=uqfz zhV~+$L()lRujmgQ=6M2gTr1DGj@f!LAMxy-D^Q&lX;GM&p3P^eLw2tJV1IZF7g4I! zdwIw>-qX|GwByB#Sr4Ul)Qhex+) zWX`|OT=lo4FyJcH+|C!UcvuZ4<9P0Gx;}hgb}Q16d5P&#-#@`s|GAdNIF*)Vh;(Sz zc+DlpA6Fs{wsRD6O!oK&-6vvC!un~bK7d>emuz6$Z|W4MAV{jm*Yvu{4BnJ6TFWS* z&WAp2&QyyCzZ5-uu4Qbit@@GX(YS|#_GYiyDFV}lg0@ZrE^9i`MkXb?BHQu(Gr!uE zQ*rybou61MY`UsV1A2?0zAGd|wdbiuE`h~E*X4oOO-6kk!$Nruy!^CNH}@S0F{3D^ z$PP8nflo?j97dd*TbpxdTKk&*aqT2KF$mo8`)0hlQV(|GvRoG)q#dYsG0Tv@S6zZ_N(?xNqbdNl-jz-6X!wn{TuGYW5O1)%V zzjION&N21tDcfo-#U z-0F{=i@2=rJ2J-lP*rYVKagK65{E6|;3MaTPS~9&t?;vspt!ta8&Q4U`8RVuU%#dF zDQ9ryl&@Kv_pz0a`5ajRKjVB#WH7OOVMo*R``Q4!X44+!<>f-Iqxu)`@(pAr8QqkN zIjAKFYW?v==bomM~=-;!3~31subS-H8A6UmxiN~O2PwyPPp5d^vL zKge(@oGv=`nVo-fB3?A4zn}3ws^ad{XT=`p}17zA4#jW3#_INBW3>(45Jlu zE;tu%)R{!*Y8{m?__N&lu(hp({}g@Tj~kv7wYC74kP;Fnpn6E(TEoS{1D7(3$G21l zD?#`O=%HWeL^)=0TIoNEkAG&{(_Oz4IQQUvO$h`T4 zZfVWm)1qqi-yS$c6h+t-MMTDQnVQ;8Q9U}`dv~g{^ra6h=8{ged=k1=x2PS_6{XYBr({3*bgh1$9C#dLfVq>6E87_Uyf`=Be62B{h*6?p zdBHaLx%``8+Y~zgId4!9YFx%@o!8ZGjmdn13pIU1HCp5yGRFSv6noSY&)a`r3N4Qj z8q)2L@+EVysg|BS08en6X%9J1mbUKPuRFR}s3XDzjNDB!{U7*){yq!RUPS)_H;CFJ zAM~H@5vZ_4e~GqqA?RP&@Z=tXq5u4i`uq2O60Im>MSmfRs9%5Y_gND9WPl=&%JLsW z!(Ds5nK@JUl~7-j$o#yvYBwOo9O@rqP+u5s+)>l=>ZsqR!FH?N} zI2lX11}f?9L_`;DOzQQ>IHYV_UW>J}6Sy?FvNe2DLip)=CuwJW=~)X0?9IJ*STO<% z|Hmrz+_fiKt*WG=xQGq)=MF`DlYAJ-%TK<7dh(HjEjdHr@)M3@>bUO9vXVmAE)2;; zCf87RY8*j*;s7@O^Ve2ZHizvN`J=*yZIyLQZhC?ZIz&jxC{xp`V*WD;zhE9 z;aTda7}}E?)s%*VQciRF86?8%xP+oOtoal9!`}onoWjGy_3zGVYCy$DyIfJB6PCA} z`Q2lj<+m`>RWe+HStP-Y5Lu;vmBh=JAoBn!`Mik})^C+Dt{9 zB8y6;I@^-uSUf5Za}X+souACb7gFn%|8}ydyoG6x?e9wsO0cO z)b2)9;GdKP_vq+ftPgXm)`nVq0$Ara6dRh?@0=j|l10*2#w8wi8>`Fx$meq3q|A8T zV#Q_MtBq4=socEY+FE;fBgI>bwM3>ZRv;`|Mn9Raop`x3Pb(#^O4r5U^>lrVUR{d! zTyV3%N$jEhm{Lc9`?q}xpD(Hpp@bkRRWdkurWvsF_LrqsAHRBy%#{0e>58moS3Y#< z{rK-ykRn)Yq3A(2EP*JB9f)fu8dwg^$&Dz%>v?rJ8xGAaIE>x%tmq>k95AM}fI zWeCzvNpWV!`Alp+X6TcXrP`)PuUW7LZzuCT!OdzrnuUH#lN8cW95Ozt6ux32w zt2nYh)G_*OM@pSuoPB{ox{x-j;(}ejOPq1aJ>ImG9tFbBL%iERx~{PC0)JpLLTw>w zir3Y@UPB{}H-B3Aucj2mx$E*i#=ITMcWH5MGBFlz$!VD^)ttJ4)6dL0S@omq*VlJm zg{1QLn*DYTceb{!(bj+P=O5dZEb{I0eGt6qogARrplkk}BWgiy$FB7aL1At6<#_$7 z8YBLNnnq91Ntscx@5U!8&A|bBszpxW^YS%QK@&lpfj0LX-xDkXVEOp+hb8D8<-~m9 zI~3r4ftT$usF(rzP*;WM>L_>#d^aEP=f+QnXhnvXYEG(Y=-)Yix==_2izVRkSos+D zb+tQPVbZR``(6sKjV(Rv(&2KPc(65DadhX^> z;GoWh!@2bI9sEyMFrDsk^cVv3q6uNIJ47$k}=pT#GYLG+jCG*%)dJZ<=xD6|w znFeMU`-@G~mc&e|1{FS(DF1RTm+dhoT1d~(-ZVGoN!0P<>=oT@arV_kjw1F1*>HVV z+SaPhljZ-if_UN%utGf;NGsJ;BfY}7lhd?Hh!$~c>!IgBLbQ4A9{qjFe7lM*(0EWu(a8u~ zp{bFXC4`M=<%+n%b?6G$5lt@kNw2LrJO739=r;4he*YW_=KrR+%;eZ1qW9EV5n z`8Qo$n3&TIDQyfXFW0aGPchGaa^&(_$F5;cAYM{aro|#A@#S^p`5$xW6({=}Qk<0q z`(@)Eg3@r7_98(0t!l|1|GvPg{JU(EYLi*rZZbwCLqoTMGkWgy%l%2bM6~freHdRXde`xmzIG}-zbRffzD+Pq>k{Y~ zsM`r)|NKmN>lhAS)APd(u2ACKE_u3;BT`oE;1eN5@-M0~HgK@lo;}fa!T8WqiJ7b4 zW$q?xUckiWCH>XS)r}{El^I_mdiTB~rX?A}nqFz}wt$RVKJapP81x-4lq4mZ)flA) zPoHZ@1!>f#REQUn5!PbU$o%1!-5g~7?3qgBi&C3@2H~x-U|sHz4w8?=*T)&R4bBSL z+DH5<>iPNeA!-{q+Uqmz1cZ)z8zb zn@ZDO11Ap2h#ic)VhcO*v?&U@5+dA*t?X+?t2FDE7YdIZ;>A1OmDPFWt!tWwk0G@$ zTXb}ocsToNFfpa#Tw3~;>E5s$6I|v5h2NSk1az$!N0U+Su6gYgY~SU>t+tUZXHKnd z&YnI!`*z3#J2YoJzJ^`>XN5+AzxC03mWQ)AY5GXMvt3dIQE?}GdsFQfOlF_lr&296 zH7Ry)mX@yHH~R+U)QLvQ5r;c9=Y~$4A=jsr89Wcy6mHiVozJX!_H34UKi82fU{i!k zw)=~dQ%*Xp(j?L>7$4N#*YH1kxeFLWMZi?JaeP8WUAfQ#HCr+4Sh6Oi^!h7dcw*f> z^C0in=o3Pfu^8r8k-n)hN+l7RO6SiTt-URIpHU)lfKnvsJS|@^|7OPwkti&Zz034w z}BASpF)9Y{8dFf!QouQ>i*0NS|0&R45|SzHFp9x3phU4&Px$QNF?tdapP%l?3aLvGvHiszG7QQBx<` zWV!(A`-`K^>Zd%IvGH+Pd>@5K_iE|Ca&X!*ZXp&22P<{dl5>5@CokDXDEVFi109@b zgFpYvDi#$JO7-GOGh);XYxx&J0%*`1Trl*>(=K^^jQ{Xc^|^&Pa>j_Et4z0>gb^$5 zC@G37;Od;$yZlPXpNAoEvslP2IV`O;; zLSf;9dkgcltPj#kFIkN#Ya~_bx8BL057Hai0_R~k#xP3AVXlWW=-{RPHJYYY9TB=b z5~G~X8QX{=$r=C#ct-EqZ-gIbKi)s%G2C(nOBpn_rG;1Bfn0Df#uLTraI29c~u3Xb= z+CKn(H!o_>r`_T!ucOy%8w>f~xgRaKr#W66)3`SPfcfde|6z@$|_PZo^lv7I!KG$?kaz8Fe(FvsAT2H z^JUS23bIH|!vh^{rc>v{tX{htUZcYl)#;^M(}nzcEqu&T-ay=E}87 ze*n}`AbyT6*rmplc@cFYx|tENf46i!Z(1@u=@#lTI462;c5{GjwC29Lc50N&fgSK{ zp2CTmKc+$4_ZBq)FWfy5MerP^#89koKd#rmzh3LVHT-RK;GHO2G7mY`U}2=m^+ES} zT=oTw%b{83776#ZG$8dFpoh zpWP37EVVvx?$2D|$bzE+2c}hN_4IVE9-E7MMN0E;u=PTW|R@+)b|RZB{J&;NNDZ zk?f5i0!5MsCGo{h13K;=E)x_dc@Od?_T0I1j`#0h$}GSRfT}kmbO?EO6*Vl_wGvah zV*SKz30Ya1&83y#Ck*b!f`{{tMO|Q8dW8Yw&!-H?df$_tQv4#$<-NYy9}f?EUyOW- zWgqwk1zi<5l@9Jh#0CSS&1jj?7Ui>T7Y2n$tF^p|kjSy_BQr7@RNL+!#k zBc1g!i@;Sk{+<1Ld;%o6rdn;T~F#>oO6^YqB)*vU8&oC?q7sgz_4R7rRv?@4a)0ueURV6Pz7MhZtTFg&hjRPP+n(Ouhs6YofhunoC*S*-b9UShwUnTzQRmMw zG%-x!oPM<0t5V}mvm8@=4Sqo7j}u%IS}Jm}JvoL;S<|W$1RvpNHm69n=XkQ2r)7sy zp2!QP8uzWrVoUR$xEy{Ayv%(oU=RJM(XMOpTwl{5+DDPZ#wNoNQC?AxOC1fQ><^UX z6{1*mR^#TwLH(NhkNlOhav(d#Et#*TCO|{p^?SE`m5VT@E+Rs>lL;WU5{Oc<+tJ(+ z|42!#n9GA46c8TV9u*b!ghwtWyjNSg-?JkjGl6eKwKXtf{-f`_un;;S#N}w5^H92S z=@z5@;8AFP((tnZm2c}@eFUwst;!QNeRmvOtxuSn&z@eD5kAP@c@`60b^JUSI9~!K z!B1YyX4C&ut=LIKWOMb6tB0qrX^WYxXAVABm<3sUvUUQ+3zA>eaMul7^Vr3a5oNRS z@AtYWF|pSw*N?8#AdB}0IW(Z_d4UU;sgtL@qrUe-0Pf9DvE!{^ARQ9WUXO-@7I`H#+c>^?7gD{v${R`xma>Pt@~k?qLtLgQOnf*(-*N~)Yc^O;F{A@l9>3xA3$yi0kNHB+&56Ku~nAOkAmEJ%FXQ z)@yig(8JS~z{G|50Nj)aI#FPa37+Cz-Op@c9t^9Z zt)~LV9e)QC@`*QGd&mB0_MH=lFUAg46qTA;RcFCf3rYOXBfno`xM< zIPy^O%$DoIG(>g5Cq|-snjsV>#De@@4??kG*_mrQ2lKBjMB-i#%E?ufR^+^Q<4fn$ z%3s|FLW(^oW-GuHdr$`#H^nwu?{4Vr5`2bK4?YEac=$ymacB#H%Y4q8*|^{s{YeQ& zeUv6ACs*E3ffJB8jVao%(LROAs@W=75JD4m=Rjwl*ON^-Gk%;avU z#ffN}92-buy~@IfxJxad%Y2j%Q~<3~`zRZ>U@q0N-fG0CYCHxai^3gp)(EmVpViF) zu3>!fuav&XLXpj#+S-~RPmLDnZC{WZ7X2dy-uSJ%3f#-WqVK?Yiq)VQn|)?QYi z&V@tdjx7i!FQXygE9}o&gg)dGi}*Aw%}oa(Q2}n|(ypBM)SZ@Q;%Da)9X!+0wG;k) zn13AzN4Dza)C%VN84fTZ}7xK&ALWH?r1_cZI zT^Go04|#E><*VGnRl~D%bDqqUzm%HQBdb`G3J94g3+h7^4AS6L>hmY1DGOiz%AqE3 zIk%y9ivT(%pHA0-*iSSxH(N+(@q1#Rq$b3xatqWf9sL(BiVqEXxVZ_P6~-7UIvqf- zGb4I35~W_eW~b?Bjj!c+p#K#J++m-Ch|>Ru5h*+W5(V!czrLQKvybz?d~qfe6AFgN zRdFFH3vi6i2Q-cmYK&kVv~XEA`e9Xrc2iv}8vV+h6M0yW+ip8(hU7Q*x}PNnBIV?& zD6><^N1jpJNUTZgxzKePX-X2~6Lh_J-2SWvq#(#K)&)_Lv-6`-G$Z&zMF4WUwU#ZI ze8SwXqO#bfQCtsAa!9P8p8_Ca&p!1zMmP2@NGIGtKOU$=f@xWnh6hP$tPZ<*EiuA)iMx*hwUxkJi!! z>;Bc1xmJzhuJzF$3{hZ3{ceDbQ;R^cW;}Se-o?6BfKwQr{QGYQ0JMU?WJ_h( z73f~&1{#Yn`_}M;Fa%}E_OgQkncT8V!;Z0il`X(mED}Bu4f)NBUv>!;LfA_%NRCRYH)y1+gQ{n()0V7>V3@R1# zcyw4fZBhNfLEH+IxwDv~zQQ{&YfSX&ODvFgKPZDM%X+HQo9*Gr-T9&-Y5>x(jd(x+ zU0o3Jw&nhA`6O|xJ8Kyt4xq~LufRdqpJ(CivOGwu=cp@_Yc<4jV3z|jhcEFU0cdK) zx|XCSs!95L`Uk26FR8sTuO%95ML!M)R0z?t%;3VYJZ!Nq`0NiN?*w&)>fQb~z; zdDL~P&crnSATJAmne@4k4)UXYqm;G;tUR&gso`X+Ix7>?W9`IigJyeo*R^@Cbbz)4 z-y4@h58E?uu68@x^ag!5 z-f`iGMg5O8QJhNP4(|R!9-8JjgrqCIL{FcGiMiaux4nh=IaSm*_C7R?(9jQmL{kG{W+ztP zNJ?O~v#N@+?5%po(eZWEdt^}%)WiuDNH$7|S+=77xZY)Aeb?RLilnB!qn3j;oO9Xg zv#!#9cKd=4{(-@3=2W+}V&Zw6Ei_$Fc0kX0;{S1|@TD7tC01n0@Y7kAxSX{8+z5h{ zRptlg*)Hm-29(r#yL2d*WQnrz|Fe(w-HJOu4G&Uo6Wc5ETC$f+(NQrE%J ztfsxG@Z)@CZx^zw>Q4TXCsE-6T6oO68!2*Gg)#( zF&sQ_%NI4>Dqa_E#^-KAuItLAw>Qv;KK2kxNQb;Q-11#fFXmHKWodz6p}0{*D~bdh zl9CXg`TYLj+8uMZoWc%~&6kZk+2AcGC~%7N)RE;0>5%3|r(Q!dUe0RQgEz+S?{>A< z8gs0Vc$XIn+iED8`3c#E)l(-kL@bIm7MEP!nk^2~1tqVy)bp zGW&5+ziJ`_75!bR)chRXE4DTC`x09fq1{ANU08IHW9^o)eI_u3nW@dEHqYA)_O`l7 z(Gq6N$U??uF28vSxcqTqtdTHxR9Cz_M5qeWw?G>=gMGbfmt zCRJySTVUg6b2GVEnm(qJ04qN~;=rYNYL#7n29NDmiBF{l=6I~pgUoRdD%6TznUk-g zRHX+Q#5)MTc$j-15tE_4h_H{9&+2KK1ukiISv5qfU5|b{%8npNdiB-#V>U+m$7X*) zw{q9ufvPGO{9VY(Lf`3yVigL#{9K(2y?pv>i`QSKUFe&?Wa1dzuDo}r36bL+G0yKj z2c|ny%{RBKgN)-zMu5eM?py%97ed0q+6Ee|6`Mcf(i#JDIEJ+@q7;s#e06t-5Nc%y02e(kkJj8P+vYtm1W%Li}cUd>|F0+^L=~DnPLdyJ4p9@!m zG!Ce_DMA(CZW-Z%{d5wOC@gm#4eAeA;~zcRr{c4DZPdlYG`Y>}3~}$6-~RP8JA7jZ zP5;_iN@&b4>qZ~pUY8|Z2y)vrHa0Iz?YZCT&m3dx`uKnUcfw!|eIcEZyG;v?R83wv zVQoAO&F9m!7ZK?hpMmkQozT-NzPa;1GC}F9NZC6a=Z)*TnOutwp2v^p!J!S{za4UwNm?8*MnPOsGbb#eLRZ|nWM*lZ6dqcJ%0vlO$Xq(#v68;KUJL1T zxp@4*W1hP-G%5T5Ad*0b6ey<8UZ&jvc^|g+cPtFeB}ClIrsXv4Ek*hxgLamR;mdPf z(YLfELZs7PpeM``YU9G4*DkLQ%tpYq+m>3}W0&Y?pP;E(B9wG&F7zz@!|N z0fbf<-GGk`HYHt?i|!TegPb(#m6zpJ!QIBxr3{!D(y?N3-jT&%pkh8~IdW%%J2*}+ zrDamw(@UGBY(51w*}v=2VL0oJS9+Cn9URoDR&G?k5PAwM zzRYlcQ(LDzT?nE}z9pb-cuL6fAn1TBCgmPhD;6u6Mh|FdT9ZW-@-aNs zlu+^wWL3aubJ(x?m^CZCG?k&Ufdt~hj|L%H&7(m5eCWz*k_p;HWz}oEq#;key$Ed zE;t<4qvr|fN>hl?PqQ~OAMd8N>K#+N38fw&q}p3Fa=<=9Ka-a^l_Mft81CSPq*q3P zX|z~i6Y+Pf!?ZB3u#56%!-+pEW?A>VH+syxx)6Cytf|)EEEFdcHteoOh2sraALi53 zExzA?V$7zz=aRyDhHRcW{>*7$#hY`&w@6{0L+$efBl$=?zDG~>`@s0_CcA9(UHF3R zIszS-7xh7Q#*^QA=UXqR_TN-6==4RIY|}T@H`-T7w8aepg!gXwyF0C_vAG59_^hKW zP5uyHoM?`DEZN>`R3cxwGO={#Ba7k!N~eiW96T|Q?WWd{u}f~;DTYvqaQnkaUu64! z1MsTF3s*=~#X`X@V@d!e4zfJz1tF;)5*_UIT_f6wkd3XnyJ`YDlsOwVhlTbLw9&9Y z3Dpv&#l-~$uU}QJtxZ`2c8+|03;ytLMlDTYMRt}ZI_NCwqb;MED%uAb zu8m{huFp3T?D`1bYlS=gNls&0-yU!}{PYZUO?9{Ud>8f@{iA&$2QMP60*~8#gG&a7 zD2qMP8uai07(7* ziX?@LXim|)J4}JLa5S}uP59ho*22OV7Q@JBaTog5idAvoqWNCGUg@ac@~hm`O65za zfJ!tt+LOSRHLFgJQUApofYB!Ld{QlL<;-rF`}=v^+PDw(o;Q>fUfH5DfCu4jY0Ppb z4@{C^=-TXar%5kr==QOgZroX3IEY584zakkfeSHVJ(Q>G0cC3+b*l;ua?SqY{2vXU zlx(@ft5Z=~3i5{%yt}3v#~0R4JbL(HXvd>-O-=mA_&xtx_%kqUj_>YhOxhHs=r*D! z47jj+0;ii7xU(C)ODSxbRP#-fkZ9ruVQnGR!ZGEDrx0|gUE+-e2QFcv-_D`Lm}o1h zWg1_gdU7^+cWYc}dNtObQv+$@hbOi8w}r#r6i*Vjo=F(zZU+aw@*YXOqqB)Cngwr@}8b35y@678-VwpO#d75CzszmZdUk>4h1B(5V2o4Y%d!kYRtrPL!oxM8c1GcA{=OmizJhpFVMacpaT zgg|K1ci^ z)Mt=6eqZ-H5gi|JEkfThIv;<6x?mkNFh8HBWZL2z(sUA#`uAn?%JkW#Wvq(drUhD0 z(b@zPz|pD?&S*}|?j}W^;JP5x0rinDqQsh-PD->0eKAn++lFnd&vqGdHlO2y@l7P~ z`6~+AMg-NaUCeY`868yyfp+eF6Fr1$EZkZ+axhs8Amk|nBIiUs-kn9MZT)WFDUC)| zpCT4qP@VskNuo_Xjm1T{g+>GKi8Bd))SZdfRs@0*FMJ~zhPz4GM1ZdllMUbb5PqBi z%>{JrG5kDkJ#IiUmlPc!X0))zJwq9;Ij(d{qZ#56aI6C*Dn;02d%wl$g0zx`>+uhM zvAFeIr(v}CaN?~yv2%LJpShy6xlw6CVCi1E35iF!alyEy8@tP7SFXq_?aL{l=v5^A$?TX^-QqcdB?=XO%$T7o-RGk~ zc!Mr!kZltqx4pGi!WGq`74uli58Xw&F6y;X>NO}@*i0W^XyZCVQeb6Cgo?7JYojtF z&W%{pS?k78L;d*nn9JX#&^;_3Q$DNZ;YO*z0oNEHYtr9_;pXv0ExOy&x07fedbI*L@w^#hD4(r_eAp9Qu@z_R^kR~g_um(a!C zc!5bm4b>*K$JX9dz$uJ7Wch;#OCn9DVjBnS=RZ8MfRC|1bP&ddFo|fj6OBp+c?0%cuIlVIad~|f3Cuw-xbR*Dk5A$i2K62#Y z|Msxiz0C|KqfMD^GpzTkFV>9@V`Nd79O6|+QtCM(Apsia&{e)Un{!;Mk_tvKIKnA< zwOeO(3`c`kZj=nk$J!^|prLVSm8NU@Ce@PPhoSuX#-swKB-8)U^BrA^do)UoXE7yJ2nJ!JKAjT)0 zMi=imcV8E{RLS_fqXfrU9XN?D(^)#V_P;XNwTX+3-)qI4KKHz@f}xO8t5Go$3T~~& zp!&Ql(KsJHM#dCc+KUs%_``;7T1+SSGe^0&pd&*j$+?%Cd#*Q*2MgIo775}JU9J-0 ziDMr)rcw+KMF!P+>rG}Ev@4sUgBPuQ)0|v`tzmF>e~-jJ3XXu;j&*N~;;M`r$NY<$ zcP{#Nnxc?E79HTu9!jWdGlnD{>%hs&)A%=C;O=QY+qJ}2XR-s zIKhXG<gGfyl&VA}po#zzu)3*b@UuR-X0S215sIRIrP$sKDY>Xd6EOGXtS0}M(|KV^hwB=f z?N$`qK=9uBQ{*BUodNC$;9Sohbhh8+fH)wpdE+?=Z7DG@-rNPSfxZ^2n8e!fr4yY_%)CK|zA(UW+iui(SC4_>g#q@uDuM>p+79Q&d#fLpwV zM#J6_&+g>px4Ql0Z$wlhI@--FLh^6t%-WV-xp#M}5v`P1Qy%cn3x*?0@_nmgX{XQo zWyvf_wMa>)j{&)rtOF?8@Q_63rcstKaR`tm)eu@z zQpVI}bwEaATTgRS?eA`)p{LwkQ2*YK7-c7wT}Yw=f?X{+$azfCl35 zBYoh&iDD@0-|(wPj>JMo6>f+)23(HN$3#zO_~(ONdUh%81S-^!6lqe?v7GS*RU>_q zxqoy-2SV0R0Px`FWUxb#L15w;#IDIea0Zam-MZvsz6?f2R0|Z}t7FQh9iWDw zp&VxxQs-6tiY^6b$msZ9Ie<>MeL1$j&0y}&{LIWO(-fye#l8jbzi)qw{(8Bx&v)TKb)rcArsKT4Vp^S0!GM#eqxQeHd`KvSt(6Yf|&d4OD$GL^HpWLbTbI|L!&Q+3f1arUPePW~7` z>Y6#uI1uJl0QVVK`vdfl=*Oq5-t~i51!}BjmS)|d zRgj1_d>9yAbeV_jv2xd09n7RSlH$IH+Ak261hWWz)95??{wCs9MQ1x^j-r+pvi#qN ze7+^WmG$cV&9}@Ce0n=^^k3vd&hL6dQ!H?(f+AVsQ}7hLf0`~6@pfj_L$du`?KfKuy)9|q`p^)$bH@n7bg2?ST+ z4ypf1xkOuVP_(_ko?7+S>Wig$pQDC6*KYGKv9Tb(pUnF^*0wm0ihJaHE70(!x5S~|9O2gs>J&#vfRmW=FH5G$viyyY4IKx3&F&Ex=anS)=Mkt z28^y-ERib!<+^o4BOO)y9sPKef{XeueF8?4l#c*B_R(ffw zCh@lq?LFPZxfTviC(1+{^bPFuIHY0@G$H%h%k=yMhe?X)TF96P#R|53nf`z6 zU3)x~+t(iwlFA7gw}Wz-+%lnNQj%Ly?uJG#o#fU;qdAgGrzw|QCY4KdG^vowj4>xt z3N^xrG$oAUnBSn%Q4Z?3bh>!g^NjQ7``7RN=ly)n^Y62sz4x>C+H0@Ncdc#fldE4W ztMn<|QHHkO74b0$g>?-Nxm%y&Mo|gZcyfh$$w$+kfxpv_&CV8-Yw4tYhDE-Yzoi@! zxgm^Z{08a@!o%CSmlDQ7^qSsOTtwy`i=F+O9q0+K8^L2lQVnzI50OyS1)cKI29f!3 zrtpQ8YMuUNH5vNlhGjOpR|6=G5}I^or8`1Me-_|V=2EP-AtZ{RwcagK{`6-%=yrtZ zli}r2#OZwJwoZ~QWt%n^>_qybdz{4#-KqX|3H&a<+s2yP|1+xD$eAxuaYJy7eDz?0zf6TM9=fK2)D_w#fEG*>&95O9e(YvKkwS zSME%=XRG}~Q)lHC_xyd-OrM66Vf_@a-EdRX*IVovPPE2Jv=#S*oL>zy{eX*35`4$E zQQQLe%Fyeln00x4oeg0II}tOVC`y8uUj%!@>&EhKeRI>?)q#;<`jsWtJ-E># zy5Y@QK$|nFdkfpX@DOc4Nk7cQ!rTycZDb`4aKMNseCr$3l%Okza{$P4?%FmVd9R$H zi296vyaPSED}fuqW*bL+MNT#hVJU3(D3<6a4>q^o(B>IdEzlH3_M0+wa6U9dbI@k- z7n$Q4Rz#7Kew?C$xeD~QOK{I+^c+b&Gi5K@PWgC+-s4YdN7J<<>-QoPaC@@xc+>Hw zvXquPNMHz_@}@OUYxY3gd_Xivy7*j4Momsi*ZgJbpx*-E*1<~+Yq~fnP3K%|XOE(X zo>tK*O5(L**S4j~1!bARoFkD|8a+rD8IJn07gl{gam#0(a$Fpgvb-(6K({xJPg-f@ z{B<-sD8c=nH9{sn3_-c7z9;>ZL*s?Uc7gJNH|ss~4v#nag>Wj3DdgQVIw;u(n1vWF z7nY2LiPclWjM#%W&#h^toC7C1W_?EmDylKe|7i3jan-mX5Jn@8VO6>ysuL*B#}ePq zjJ%=r#Tj^HN_y40DTpFOo~v+uC(lsdnRR-(p37?OS;%x3`8g*@NSFxVt0{ONly^Fs zsb)gzGM2XM`d+$)xIb>D%_OaCm`*}Q#@jO`VsF=gFjkrOm_ZiFqGXr1MbAL(g15Go zRwOOyObZEJ0n57Zr+JRtexcQm=ZMRdEa7mle2QI1VH7n5`s6Q;ze{DT34BKzf{)H_*wRP!XTDvxG+?X5O zm~24dFz}LHwEr#0S91keXv49qt$(Xp0wmIMJ-@=#<91U+`B2IdxD6R;uie6zI~uz)KL z@IDND7XBT0`y1~{>?Qj0wg9%Fb5nAY`4Mve0q5%7>6qHJ{0e=S+u&20n>ruwingRi zi@uTwf(wd3AYdgsrVT8sN(3XgDfm(=8P%ic*^qQHUElk5_F|(!V)N%w(<8qGMv9Fv430f5(9LCVlK?{c zsX^9VnOpbNtRT#Qk{L?9Q$IpA2NhI!2+DTgWxc+l66d=Av9H(sd2l2!Q%V2#9Piuc(NK5K)h`HZn4*ODk@YvuV?vQfwG;)pC>wKm)Bt z1KYQH!rAfY9@;B?_gYt|B_VeP$`3eX9iT!T@7OzPOzW&%sLk;%Q3h$MKHvVlaP#H@ z!cH$mfy^>R!R+Z;zqaF5LqjKSW=0gF`!dkjIXbipK`P$Q|4GwAfRWM_?8yM{BohCN z^Reter_1~*4m7xy9U))NoVaPVq*+}T)A}mtFd)^g4>fHg!yU;e*(KTu(+I~r8>@3>o@5_9e?%GC7TCc8dn_Rs!Vly(0tBbm9S+JdHD*Kyr}HF zw>k|C4FLHR5M@yGVZzAHw-nu1!2hM*a@HJd$XdO~3+G=Wfa!r( zgAo=~7EB`x_C>BElqY~NbY=upxksKJYg(cHz{>$|#wl$Y!CHn+_?F!jFfpkU**Y77 zQiw*FJ=Cp2(Jz;*Es<{ANex4r51pX-{93~P0i|dshn8Xi4QX)1?0q;>5XV;%TY*C< zCB_3V{pQ10k)RvoRxHPNCUC!{RR7&_A-B~MM~H>atntnXW4CYJGi%!=;U|n}-E?rv z^xiLWa)62Sl*v$b#$@kc4j1+SXkXX4ZgonqfqrPobR z&jT_I&wCISP~N1^W#%U5Rt$p0xJIR0+#2gN{Ij_!O7xjB~np<^3U-`SvhW7v+^(I1dmBp3ExlsXSgmsG6e%Hvnp~b$b?KSoiQQ0{EF73 zi9HQcnuVvt??HKS+;ewf_REqPxf2PK>S$A#2j^+-azjO(tb=E?A87b1xxclq@!RMO zM{3%03!;Q!3f_M(v>FiEc;+5I_G$peA$ z;BDdodFtxMyJ%Xa?BNA;} zj?VxIzwlc*c0H!`(&&rk{!A}Xz>0PURVRb?#ck})pt+Ms;D*e?%7tW^$c4m9k=eSH z@h>mkDmIf?N=ByX*FiG5~H)WTET?s#qtn-4T_$yk#5tIDW;qn1(-PAAm>o z!JpDKeo(Dx`#XRQ(9sc7A2DefE80O;iIk;BK7mciHo5`Yr&7twuc)cd>j11m0K5Bm zY4`EupHHNyx-{b-jZ0o$@+YhiU7tWa21KW4Upn5A8vRtQla2`?e2TQtV&RNI14moJxO*w?5C%ZD z<%;Ydq;zeU`!BcMH+bSP1XlbR`C90xr~}3NlTG{**EjX&=YmhAV5T!+N}U+DG*-4N zqU(lRM(;;rm2S>tm>m$d7j7FpyEb+*za|XADCHH?bGCX@2Sr{ zXYt063hz~y=T?d&wZl_x?o1xD!shhGD9GBvL125N`T|sVBKI4=cNGOJm9|5OFz!Ja zUNJB7EoFrx^FPbb=S}f4#86+An_00t?%`32h{xCxh>nyktLm8UK>Er%TL*BhxFGy1 z^gT8G!$BiaUu*gdcb8btJmlL^@IHH}5^_RDuu>ZBO*3++` z3a+O>-iv>4t6<^6!T_zZb*dbuvx89#*bH#mAa5~aW*Q~2WLK@8v~yyG=5h~HJyw-5 zkzybsqp!uk@1>|Zz*R7*Hj>Ws)Jux1^g|sbDlIQzL(ias-KbW|sZ}5=jIy(UeJ`5v z&~KSG>nf`c0Ra1zEMt{;oL3%%YcHh3!Hd2Px0eSD%R$|#9l)*! z!T@W%ifT=DimJ4k&9qU!f&=}W!VaP9Xz_WpY5`aP;l6GqhP{WS_;Rsv;=Bz7HC6xo z5TmM>L#i5QHyQT3d2*0FthAugMs5oK?J64m|G}=QcV6 z+W_;8##SobR9a%jm+-~2nfs+REJ%J-#*C!E%DMQs_E;f_VOO_ass)``G9tR6jM-~# zI1qff=3kWME=>zk>6ap^&gH*z j`Ck|P`hUShw-$7IF8XZu)*DVjwvLOFyJNNe{?q>h#op}y literal 0 HcmV?d00001 diff --git a/lib/screens/edit_education.dart b/lib/screens/edit_education.dart index 392697e..0121c91 100644 --- a/lib/screens/edit_education.dart +++ b/lib/screens/edit_education.dart @@ -68,7 +68,7 @@ class _EditEducationState extends State { backgroundColor: Colors.black, actions: [ FlatButton( - child: Text("Submit", style: TextStyle(color: Colors.white),), + child: Text("Save", style: TextStyle(color: Colors.white),), onPressed: next, ), // IconButton( diff --git a/lib/screens/edit_experience.dart b/lib/screens/edit_experience.dart index b2b7ca5..963b563 100644 --- a/lib/screens/edit_experience.dart +++ b/lib/screens/edit_experience.dart @@ -64,7 +64,7 @@ class _EditExperienceState extends State { backgroundColor: Colors.black, actions: [ FlatButton( - child: Text("Submit", style: TextStyle(color: Colors.white),), + child: Text("Save", style: TextStyle(color: Colors.white),), onPressed: next, ), ], diff --git a/lib/screens/news_feed.dart b/lib/screens/news_feed.dart index 3af2d71..ccaf6c1 100644 --- a/lib/screens/news_feed.dart +++ b/lib/screens/news_feed.dart @@ -1,11 +1,13 @@ import 'package:flutter/material.dart'; import 'package:localstorage/localstorage.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:date_format/date_format.dart'; import 'dart:io'; import 'package:bicolit/utils/uidata.dart'; import 'package:bicolit/tools/drawer.dart'; +import 'package:bicolit/tools/label_icon.dart'; class NewsFeed extends StatefulWidget { @override @@ -13,24 +15,83 @@ class NewsFeed extends StatefulWidget { } class _NewsFeedState extends State { + GlobalKey _globalKey = GlobalKey(); + final db = Firestore.instance; final storage = LocalStorage("data"); - final RefreshController _refreshController = RefreshController(); + final _formKey = GlobalKey(); + + bool _loading = true; + RefreshController _refreshController = RefreshController(); + List _users = [], _posts = []; - GlobalKey _globalKey = GlobalKey(); List buildList() { - return List.generate( - 15, - (index) => Container( - height: 100, - margin: const EdgeInsets.symmetric( - vertical: 10, - horizontal: 15, + return List.generate(_posts.length, (i) => + Padding( + padding: const EdgeInsets.all(8.0), + child: Card( + elevation: 2.0, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + InkWell( + onTap: () {}, + child: CircleAvatar(backgroundImage: _posts[i]["user"]["profile_image"] == null + ? AssetImage(UIData.defaultProfileImage) + : NetworkImage(_posts[i]["user"]["profile_image"])), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(_posts[i]["user"]["firstname"] + " " + _posts[i]["user"]["lastname"], style: Theme.of(context).textTheme.body1.apply(fontWeightDelta: 700)), + SizedBox(height: 5.0), + Text(_posts[i]["user"]["email"]), + ], + ), + ), + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text(_posts[i]["post"]), ), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(15), + SizedBox(height: 10.0), + _posts[i]["images"].length == 0 ? Image.network(_posts[i]["images"][0], fit: BoxFit.cover) : Container(), + _posts[i]["images"].length == 0 ? Container() : Divider(color: Colors.grey.shade300, height: 8.0), + FittedBox( + fit: BoxFit.contain, + child: ButtonBar( + alignment: MainAxisAlignment.center, + children: [ + LabelIcon( + icon: Icons.favorite, iconColor: Colors.black, onPressed: () {}, + label: (_posts[i]["likes"].length > 0 ? _posts[i]["likes"].length : "") + "Likes", + ), + LabelIcon( + icon: Icons.comment, iconColor: Colors.black, onPressed: () {}, + label: (_posts[i]["comments"].length > 0 ? _posts[i]["comments"].length : "") + "Comments", + ), + Text( + formatDate(_posts[i]["created_at"].toDate(), [yyyy, " ", M, " ", d, " at ", h, ":", nn, " ", am]), + style: TextStyle(color: Colors.grey), + ), + ], + ), ), - )); + ], + ), + ), + ), + ); } @override @@ -40,7 +101,26 @@ class _NewsFeedState extends State { } void onMount() { - print(storage.getItem("user_data")); + fetchData(); + } + + void fetchData() async { + final QuerySnapshot users_result = await db.collection("users").getDocuments(); + final QuerySnapshot newsfeed_result = await db.collection("newsfeed").getDocuments(); + final List users_docs = users_result.documents; + final List newsfeed_docs = newsfeed_result.documents; + newsfeed_docs.forEach((nfd) { + users_docs.forEach((ud) { + if (nfd.data["creator"] == ud.documentID) + { nfd.data["user"] = ud.data; } + }); + }); + setState(() { + _users = users_docs; + _posts = newsfeed_docs; + _loading = false; + }); + _refreshController.refreshCompleted(); } Future _onBack() { @@ -67,32 +147,63 @@ class _NewsFeedState extends State { } } + loadScreen() => Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Image.asset( + UIData.bitLogoImage, + height: 70, + width: 70, + ), + SizedBox( height: 20.0 ), + SizedBox( + child: CircularProgressIndicator( + strokeWidth: 2.0, + valueColor: AlwaysStoppedAnimation(Colors.black), + ), + height: 17.0, + width: 17.0, + ), + SizedBox( height: 20.0 ), + ] + ); + @override Widget build(BuildContext context) { return WillPopScope( onWillPop: _onBack, - child: Scaffold( - key: _globalKey, - drawer: AppDrawer(current_screen: "newsFeed"), - appBar: AppBar( - title: Text("News Feed"), - centerTitle: true, - ), - //body: Container(), - body: SmartRefresher( - controller: _refreshController, - enablePullDown: true, - onRefresh: () async { - await Future.delayed(Duration(seconds: 1)); - _refreshController.refreshCompleted(); - }, - child: CustomScrollView( - slivers: [ - SliverList(delegate: SliverChildListDelegate(buildList())) - ], + child: _loading + ? Scaffold( + body: Center( + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [loadScreen()], + ), + ), + ), + ) + : Scaffold( + key: _globalKey, + drawer: AppDrawer(current_screen: "newsFeed"), + appBar: AppBar( + title: Text("News Feed"), + centerTitle: true, + ), + body: SmartRefresher( + controller: _refreshController, + enablePullDown: true, + onRefresh: fetchData, + child: CustomScrollView( + slivers: [SliverList(delegate: SliverChildListDelegate(buildList()))], + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: () {}, + child: Icon(Icons.edit), + backgroundColor: Colors.black, + ), ), - ), - ), ); } } \ No newline at end of file diff --git a/lib/screens/profile.dart b/lib/screens/profile.dart index bde054e..4ff64a1 100644 --- a/lib/screens/profile.dart +++ b/lib/screens/profile.dart @@ -6,6 +6,7 @@ import 'package:image_picker/image_picker.dart'; import 'package:uuid/uuid.dart'; import 'dart:io'; +import 'package:bicolit/utils/uidata.dart'; import 'package:bicolit/tools/common_scaffold.dart'; class Profile extends StatefulWidget { @@ -150,7 +151,9 @@ class _ProfileState extends State { onTap: getImage, child: CircleAvatar( radius: 40.0, - backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2015/10/05/22/37/blank-profile-picture-973460_960_720.png"), + backgroundImage: storage.getItem("user_data")["profile_image"] == null + ? AssetImage(UIData.defaultProfileImage) + : NetworkImage(storage.getItem("user_data")["profile_image"]), child: CircularProgressIndicator( strokeWidth: 3.0, valueColor: AlwaysStoppedAnimation(Colors.black), diff --git a/lib/tools/drawer.dart b/lib/tools/drawer.dart index 845de2c..59871cd 100644 --- a/lib/tools/drawer.dart +++ b/lib/tools/drawer.dart @@ -21,9 +21,7 @@ class _AppDrawerState extends State { WidgetsBinding.instance.addPostFrameCallback((_) => onMount()); } - void onMount() { - print(storage.getItem("user_data")); - } + void onMount() {} @override Widget build(BuildContext context) { @@ -39,7 +37,9 @@ class _AppDrawerState extends State { storage.getItem("user_data")["email"], ), currentAccountPicture: CircleAvatar( - backgroundImage: NetworkImage(storage.getItem("user_data")["profile_image"] == null ? "https://cdn.pixabay.com/photo/2015/10/05/22/37/blank-profile-picture-973460_960_720.png" : storage.getItem("user_data")["profile_image"]), + backgroundImage: storage.getItem("user_data")["profile_image"] == null + ? AssetImage(UIData.defaultProfileImage) + : NetworkImage(storage.getItem("user_data")["profile_image"]), ), ), ListTile( @@ -51,7 +51,7 @@ class _AppDrawerState extends State { Icons.web, color: Colors.black, ), - onTap: () { if (widget.current_screen != "newsFeed") Navigator.pushNamed(context, UIData.newsFeedRoute); }, + onTap: () { widget.current_screen == "newsFeed" ? Navigator.pop(context) : Navigator.pushNamed(context, UIData.newsFeedRoute); } ), ListTile( title: Text( @@ -62,7 +62,7 @@ class _AppDrawerState extends State { Icons.person, color: Colors.black, ), - onTap: () { Navigator.pushNamed(context, UIData.profileRoute); }, + onTap: () { widget.current_screen == "profile" ? Navigator.pop(context) : Navigator.pushNamed(context, UIData.profileRoute); }, ), ListTile( title: Text( @@ -74,6 +74,7 @@ class _AppDrawerState extends State { color: Colors.black, ), onTap: () {}, + //onTap: () { widget.current_screen == "about" ? Navigator.pop(context) : Navigator.pushNamed(context, UIData.aboutRoute); }, ), Divider( color: Colors.grey.shade300, height: 8.0, ), ListTile( diff --git a/lib/tools/label_icon.dart b/lib/tools/label_icon.dart new file mode 100644 index 0000000..f85c9a9 --- /dev/null +++ b/lib/tools/label_icon.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +class LabelIcon extends StatelessWidget { + final label; + final icon; + final iconColor; + final onPressed; + + LabelIcon( + {this.label, this.icon, this.onPressed, this.iconColor = Colors.grey}); + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () => onPressed, + child: Row( + children: [ + Icon( + icon, + color: iconColor, + ), + SizedBox( + width: 5.0, + ), + Text( + label, + style: TextStyle(fontWeight: FontWeight.w700), + ) + ], + ), + ); + } +} diff --git a/lib/utils/uidata.dart b/lib/utils/uidata.dart index cf540c6..e8fefe3 100644 --- a/lib/utils/uidata.dart +++ b/lib/utils/uidata.dart @@ -28,6 +28,7 @@ class UIData { static const String imageDir = "assets/images"; static const String bitLogoImage = "$imageDir/bit-logo.png"; static const String bitLogoTransparentImage = "$imageDir/bit-logo-transparent.png"; + static const String defaultProfileImage = "$imageDir/default-profile-image.png"; //gneric static const String error = "Error";