From a9166431ffac41eb874668ad0613e08e1f64f120 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 21 Sep 2021 21:19:59 +1000 Subject: [PATCH] add /signUp, update AuthLayout design --- src/App.tsx | 6 ++ src/assets/BrandedBackground.tsx | 10 ++- src/assets/SpaceGrotesk-Regular.woff2 | Bin 0 -> 42708 bytes src/assets/icons/Discord.tsx | 9 ++ src/components/Auth/AuthLayout.tsx | 123 ++++++++++++++++++++++---- src/components/Auth/FirebaseUi.tsx | 43 +++++---- src/constants/routes.ts | 3 + src/pages/Auth/ImpersonatorAuth.tsx | 36 ++++---- src/pages/Auth/JwtAuth.tsx | 8 +- src/pages/Auth/SetupGuide.tsx | 44 ++++----- src/pages/Auth/SignOut.tsx | 16 +--- src/pages/Auth/SignUp.tsx | 122 +++++++++++++++++++++++++ src/pages/Auth/index.tsx | 2 +- src/pages/PageNotFound.tsx | 23 ++--- src/pages/Setup.tsx | 4 +- src/space-grotesk.css | 8 ++ 16 files changed, 347 insertions(+), 110 deletions(-) create mode 100755 src/assets/SpaceGrotesk-Regular.woff2 create mode 100644 src/assets/icons/Discord.tsx create mode 100644 src/pages/Auth/SignUp.tsx diff --git a/src/App.tsx b/src/App.tsx index 7f36b67d..98e88fee 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -22,6 +22,7 @@ import routes from "constants/routes"; import AuthPage from "pages/Auth"; import SignOutPage from "pages/Auth/SignOut"; +import SignUpPage from "pages/Auth/SignUp"; import TestPage from "pages/Test"; import RowyRunTestPage from "pages/RowyRunTest"; import PageNotFound from "pages/PageNotFound"; @@ -83,6 +84,11 @@ export default function App() { path={routes.signOut} render={() => } /> + } + /> diff --git a/src/assets/SpaceGrotesk-Regular.woff2 b/src/assets/SpaceGrotesk-Regular.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..568d15a2e9dc9d77b93d85a5bc4d8cf9d0d071ef GIT binary patch literal 42708 zcmV)DK*7IvPew8T0RR910H)Lc5dZ)H0lwq_0H$vM0ssI200000000000000000000 z0000QgD@L`w@e(JUIt(Qka!4z0tuW95eN!{@f?G?PXRUpBm7bO*>Q z41r5qo|>@$s*COHI+Egr`&31`4S{3ootk@bv=cbF)jJ2Bx9bw31|Dm~o4pHg9zZB= zyF%Ij|NsC0|NsBHlZDvU>?X`6=?|2rfD{A-74-DK^Hfl?U=b84iy<#yWlB{nSkzh8 z3^B@(lI3Gd<0M;5+A%WZ6nR8RVK8M>P2&t{jxMEQVhf}cmRyyH2v=Cc0yyqBlLQt? zSvqX5vAODYBBCry6G2aO+RK@_9&R$Mj-nEQ@>HlT)jj={E<}d?QMne>Z*@BNE_e55 zir^AuSJK6NT|kXU$nk)CQH#eJ3T=Urd80Zsb%tF2QSP5`p1PFYOQ-3<%cE1{yOlvN z(JHN2)OarRMyF0~0n;d2G0{sIUtV!jVUzsLG;?XswT}lsnQL-v-o)^T-k0r!-2h;<2f-RHY#l}PycY&sPq^;7qBom!TBOS z(F@|`@#9@g;;zUf<(K>_$|&RitX0oTdZQ{O(}N ziZ>>Mq@*Op5fMS}{N4I)e0NTr!oe&1-6qIWjI1dlQanUKlB6)nTVa6+<|*Puu1yIq zWze>{Ig@UQ%G`^|ywC#a%REvymE?e|12VZiIwRt^Dk4^`cHYz1r z1&qc9Lfz<6mKPm$uxaxZ1SK&?5kGvlb1zLsxySX)-Zyyt7e9=IkJNwhtBjAd;-h?m`2E_x zJ4_{7A`-G@GWADV@CGGaCYf}z;h*YY@9#0@L10bcQQ(lSJ)v7aZ+C$;29eN0l^)Pg zRj?NBW2txdTj@RiBfuAPeo1jNpjQtv8q)Yv%8NL(xwh8@q!R!a3P1n~xYn%7ad1R` z7Q+F^58KAxydRZ1z0TJpW!e}+>fO8RvIaDjXo`lZk!K3<3&(gL9hvZnXoUc6EuQ zM{Fep%9kvYz^wPWG8JMw9vB5 z0t1H%7~TJG9kvPXZkV2b`oCvS9w(xa^=j3(`E9yq(6WU)@#$G1FF|aX%)Lc7a<>*s;~)Ss6%!7vu$p_=pT7NiY(_^%)PiM{W_ z-Ls2{CJC94NW{cYA}K*5lic_GtG0?Wl;x&B8R9@`2c&OGhPfE? z3knS(PQ0RR@+D!6FCw!PPwzJAF<-A{aau~UEX$6ZJKx&*vGUik39$kF0{(;)mEkrA z1OQOQ>8yz2UoqeF`R4z7{(IbX1qkH7`FP(*OjM>&kH}`#!X=%3O<;t8$x{8CK^BTC zz#$9c(Y^mImU4vF)y8V9t3Iu-srA~6W{q*T zJ+HsH>%|yz+r#y;@cehLX>x}Cql{g^#Ns&f=}oW}EL}qo<5qS%P^rA+3$moNpv&|B zfA7D#=kHf={nnCzRfSS_N~Mf|OS)LdFW|$Ng`)gPG|K;_n&c(#tKMBzCXGdB z-NI`i6sT0Q9yYB0*wgl$M zxdOf5FmBP_U>xZAfCp07@x*XeEt{S0{y6i5L4ig^l?H!hKdATVMtp2~hS?4CB zu;Q;4L>r_KOt)YAI|Doa3!a3EKaf2D@*q^|*g^;6P8dv#B$za5Fj>lA`>BAbISi&r z2TYG1*ipy8h=^b;ED%<0D8A}LT(vSNModtt(x46f@`KDh;Dj-h%pF6 zoFO0*C4opb3`DBYAQoE=lOY3=DGTnbb8wejg1h1>+-CTB`7JE*FqW zs03K$R{^{j#enc?V8|t>9cHQ+a)}j4L$L9-*b-@$T4s4Az|dJCU%+U>3b_O!pu|B4 zD8Il=xCIMzeFulYA3B}h#nroq>ZhGh?))0x3q!=dED4DXHbg_&Ou~dF$&LMIZnO1PBa{+Hn%0j0A)^`L5RX%pYn(b#hlf*vkLu*;aR;>OfDn`#(Q(i*w)SNijE`RM|1l{ zsnzV<8~eX`Cv%^U!co5cz5QG{g@ev9)<*gYO4n9G^et99Eq97=wF=R8_c;U5l&+LB zo=_U!0ugbY&L!8uo2lDqKQ|y$QIOaJ43aJ<%Tgpk*}hv>p-SFCM<~&xO@%H!YK{{; z$auX&PCM%`6BoAP5-000WlxtA$cUp*j36-MkDLTaYb#i%OJi zNxAYZqwC%ZhUZ(?qi3)6>DwCv2DXKTwQWO&wqwM|-kLDIcNQ(}lXdI+;+59}{0H|k z?pZccxeV?SDz`lHtIES(?Ts|iObe~F(M|_ZIyv;m^A|4e$WC|0S?9>6O}h?Jow{`E zu|%&vF-tA8+zS0}n$sCf7JJUzdB3KZVw)gNyab6RdZlFflJ8<0k5OC8;Zzut3)HsD z0&ic`c2*sl!!7Yro7OmQ}>k!qcONzS_fO7HYZ--Pe%@`IoJ;x~Wz%RjM=Z(@_1+VsuX%(BWZr`+<& zub{$;s&Fb+sp6_vqng{>+dI2@AxtRaLMm;n^C6}NyJy$gefFHQLmKixL%}7yj}P!6 zKElWN1fSwFe1R|V6~4x0T)|ab!#DUA-{E`wfFJP_ZptmWjXQEz?&W@yO)=H9rkl}B zvzjfbIp#J`a`P>a(n5<`Y)ProN|#Zl-1027tb7F(DympXrOK46QeBNY2I9$X#yG%1 zhg{`qhaGX$G1s{Ef6}dPbC-MiboX{&_xC_gyhHPC^Md(PUgdS(hGdc#x%>*ER9I2P zl|+pmBWA4FapK0Sw6X+yOPwYyo$4ahsI9L08tVP)THnTYM-uJ$1%*Y$C8cHM6_r)> z>NjZEr1@E#9sfN)Zp>K|G8{ z(=yUB@hqPA`71zy3R19e3K3oe5p~<&iDT8{8jpw6bM->?s9x2l`qhA9DwY~V9Std(;JK? zvxB2IAFk~F+A)ZA={`$W!SezSOFwV$e8BSs&kvk)jv6;LK4HStM5&1jlCYl6NXpp) z2FY3}!W+KEKKTK3$lr~h)?Ur)n59cjkJHgUNYp|bGKw&<;@lkRVfiTNLKG=hf~HiN z@;nH7s8Us`*SjXy8r7;(uR)_G&04fx+cv0ur90h~hj=~rLXTd3`VC-WU8gLV6kNR9XMjY_AEDcO1Id!p*fS;;km`yP80buh8uz3O==Q%ID zQky!BG-=VMlP+K&;2@x2;1G~d&@ixY@Cb-V$fJxlItFH}*m2^#le!6rR69QV3H81qJSy_RM~(kJ5c2Ss+>TI22w5{q}qCh%7Xw-D|ie2?%W@Gro>0{;)325JY` z${n^!L{t)@QV>;$K;bChV&D?sQs4^U8pwTQQwj12$TNVRBY+Em%Q!e5@;Jy-ApT~K z8?nsv@b*e*f0|sVzPdYl-`VP}soZ$*;=^A8AMgM6()pi>w!^m;|KNHneyPpho8WlU?Z4XNKz$fIwKj9tWo3lt`A3@mZ@A%%Zyob z=KBLKekkN4x{vWiz9IS6clFDW0L&RUFN4$wv(CsCA3Z(xjPeG(TXww9N2H&9@wfgR zDr+Rq{r<)7ysbVcCb6j!pSDlbF(aJzCTMWAD6r-Iro|{hQ>v`Wr%RM1MPca8xGvpc zH1VE#=D8ky2Cxj($Td_($r_)Zq@YgG6fx7qj9GIvKh>!4*Jx{eyR~E~GV-v!SdB*- z(lqU3oA#m~DV{yV1c^qcJ>{rl3=`O176LCcly-$hqPp5?`_95$c`0hQD^=!xkJ00p z^U}Np8@1`)DF~_HkO+be<+0jAbioeq=5nM%%co)@oH{;b?A1VO!}eHCZC!Qj39~wy zEg@U!a6bGMo`gCCT^NS>fFlt#YyD~;JF=9IGxI;u8n(TTaEyD7R4Z4bt@e4_>_Gd! zujo4Wre?sIU~Ps}%Mw4q1CUt-gZy+LR!s0|W+%5AmArOoQ4{*S?O;o6v#9dQ>yxa# z;EDBLQyoRS-2m(72Ir@Sl9fri6Sg+Lz?E3k$V8n?l)U;Qg7gH4V_WQ0(zm&N;3^sn zFD&79c_k?dxVIID7JTAe&f{o&P(NuE_)fA7-x zOIw<4WRLt$9B1E2LW0*$%GW`yTMyHklmE=cwfb5Q~=N@ao5xt^)`E`#R*2P>yPy4cnSys_eAH%f7ys96{C_lTscx6NFPYR=717!BGy zac9?5SM9D^RZj7jazFl`IGOI)oK=~#hJl~6w&X2G9?G&l7WtNROaF=pt4i(0Sz~UK#y-jiRjkd0Sra>2a(InXDjZXxMH5|*iW?OJ zm0^~8D?WSeeuoQ-|DJ^LVMQDjU#_dRrVfieRtQYgE=WGGm>F?iWM?a_>lA`@sko}C zwe1iSKVj|8Zny{c^h5w1*XZdqIpsgU*zqsdZ^|9fQv4*g4r%Lh-n693}qmaVP)LN31$RH`%(#TNqGDCi|b>gSE3GLDErL&}WZo4l;w8gU01s5`(IiN$g#SnXnn!5%1JkiRdG!v(G#!6}cP%$CTvv zAb;^SMC>5Ep1VR91w|s7pHMuT8>pPUtJ>1sj42N){+1KG{7|sMso=Pwp_JeKLv|;- zU^<|{gz4e;!$|B>Jc(Boyw;-Z{N8tX{=*FY=NvJJ(3@J&9O*4u_is=AvuWBFb5pff2r{llNpX zr3YNw)grn^ln=fOW?&bG{}$gdmuzZFS}hD+&n*WJ;{$~S(!x09J^qPKf0C}tCu=;Z z>m`Zuq+(ijDiG89mqm9FA2DDu{53LRf2-v3`W{8E3H+ZWahfQkw#)w;#f~Ptr_voB zCwBDG$cj^fn1c25g)lV5fYgaS^zN&Fj=K+BiViB?3yTrAms-AB{oMp7Y>0ZVb<{Ij>vf^gw1rXn4=l#}er~FF zl0NCmC%SE!H&qP3YYFx$M2&&n)KU0ei0#7kYR(ESpTt!MO4r(3iwb6hmPH~n#6H=u~IZS->5j>h+Q0N3oYS|rP96dWxRSR2b!j&O=p#a z_m~=eT5T5U5F(r(1bba>5#bed#Jdd(+!3 zB>fll|2BO$nW--=pJ{+gDDDq`h0WMO1HS50Wf!J4uSHa2y$ zs8gRRpDr0aih7mwspwZVplndPAtwyeH*y)=&ePhQ5@Exh$^{LTkh%#tBI+x9Bw-YU ziv**J!CtJJDTNm6{;}ecX+%O$qNF6+AUAe-5R~uxY=Oe$+k=0GPou?^Y2~)nA*9^L}3o`5#KiOA3nPqsI zSZ_d_o|9N_5tkm4>z%n!`V62_sXq*BaK8c3X@Jd{d->PV6?Y7?nX(U?hd zfp#gK3TZ9f2ECz&ncq?=A~`en{Gq{NLxKf5`LySdjjy%weyxxz5<0ea8lJ zUv}a%XTIXXYWWp?$Q|;8Ji+&~xlkF@oCrXwOI4 zADHuebd5kD5C{YUfj}S-h|y!C=PT+61P&2QAO3!`0Pm3I6xVkkad|!B@9}1t4KXh` zgG-=8iw4eLyW3KD!sh{OHkRPxRV%>(_$F=b>;5a_3+* z#+xPK&yCesahBwt(v+dgii9>5iJ4dz#RyWME>t=iMO6P_6Ll zAO#mh^&2n9z#TDq$-p%+`pLjeF_>iFvKWJ8;Jz5ctb{8=bmAfrk|Zt?5iacw1PP(C z7Iq%W9f(v@8aEr^UL|HM+{DQfj~;VrQtpjcbz2};7Z4H_ z(IP4)E-9rByx(`Gf})bL4i!~9VkIV}=}<_9+kPkpDHys33_S#K8Vo%LhMpJ@I$U0X zaZcWXxah?z#uYy3&*-m>b=TC-=sW!*@(YOT`gizC|BJty2Im&&JAi&d_(DHBf(Ph% z&BDDn2mV_Y;z=OwUFlH%P1xaS=NQgbyZ~+Uy<)!Ss>U`$3Xbz$CHm*^^r)5mtQDvy z=hi_*^)U{6c(f)UYgqFWb&zp&Os%Vl{~K$26h_Q_Tz@aU03Kk7WU1%E6JE#Ac_tNv zav$SuR#*i>)YikV_$>c{!@Bw^=)s!Tm#XVWzRLg3&lLQZk0Uk2)r_aBD^r#P5fe`p z39*%b9-%>xfz!{z1qeRThF{3^Zrw!$y;dYI#JGb(iY(xK_Bc#C6z;3}>1@rq^pxY1s^y`)#gOY8Y^a()~z;8BzenGOS>*v&%t`2@pdAt;g_z$Z3;@9 zqvBFo(6%9Z@@)0r>wq(er_W8&OHqK?T@vV-NzmWsM*XxVc*Vs@DY@rS8LlZ?w8beGg>OTbV)s-6sgf9aQsn=`a0j{w1To z`C~rrZ=u6K`Tmy$I11ndfO7y&)1h2+{S~fri@W^510M5?m%QOUpZLm)Z-w}o-}sY% zIPk>(f(2DCLz*R7Z#i(1Ymgft1oDP#%PGiEkWg7`NIA(RIi!g+kx?>A@<<+;!3*X5 z$=mPXUb4NBvo5h<$His7g3D^3(j4o!7uPX&QpZe@2NILo%%P6ssZl=kcwG2KZuDHr z)-jRkosw0Zk<;o%(;!7B7z?_PY+>CH!dfdpEpwk?TMI-Ouj75 z&9K`8`7fDD`G-clh7z)7T^8(+2+^mI5(JaI5A{T&ANM!c>&vaK$ElLnhiA6TI}0X* zieEl|0jT=a;0U1p{mh-;c03OB{_O(o2@Ku#y2Dj$l*Z1T7*8z8sHuyZwJ-&0ofeHTQk*_9-PPCX9sPIs`YOQLuxreSy`IK+Pi@$1pPQHKne}iTQhDMGhGAPa+36eZe<&k<#T0HiI zG}BypF`mw=X0_R!pFVtg{ojk9H|>5X=ZocPz3G5pme{!pbLBs+jtUnc(jD;eFuk)1oEIiOG;u7 zpDL=Vu7=v`drV``dBJD)*k3QIxB81&gEfp5(9uNH4q|XXNF#CPdzscfQnm2*Fihho5U*cW{zAc3X40 z2TX+GS?9hAndEikyV~8?*~y#uMyah#uMZPCo<2`}{9caXAxC=cHT?c6uypz!f?>yS z{)rsJTN`Cq_bX4j4Ry6b%_z}2R~G_sD;gwM(HPv-&T3RM+ zZUGRFln@U&3k+%x_@7Q=@++ql<(CE_b|O+ef+4ytiIRmco$nf2Fy_4VC)!-oiV>7NGf)FMtH^Lo&(E8_Pk zoK|{u)z{f$!bF^4fT+s~{U+tAaL=;UA$p31e~UH7Ua&3k1v+IVv_puM%_G@>wBHAsJh=~ z>toL`8)>ZB7Fub&uYKkamSIgu_J|B%Ea^}$`r9kG1 zb%shT^sk}`i0?+5v;20KOAD5)ShMN%A+W*RmNjIAeLCJ*RLm+G<1soGzF0&z14B_b_7zY(9a?c^ts-yBIm*|alh+QUa ztE4NFs~|^5fw;tH)Gj)i#H^N(Og64O=Sq1Vq&25hKsyAnwhvrJm9P#;`VtUoCk+em zBAozirJp&Y=tPC%$GsDp;}n0#x9Fz70eFM`zum&wX;(mZTJ|pp=xPA@wRFIOI6#0; zoE3+HVx0GX%KgXztZaaff^I`xTt;;@*OQuzl%_rld7T|)Jfg10Jg2qJ(tYBfi^YcU zA_9nT$<+Q*D~-~wtg0*q=*6otDygLjxu&(KRUPVHsG8KFZaeDRexCq=gR;0z;r|v^%&*~BMPlL`kAZCi~peFqWqGn7OmG|x4q65;C;bDKkL3a z@cw)FD6hKuLQ`7Migt7%L_xJGra`4B;})dB`RS{)=|k5B`=35a5B+QimUBN?O~cQw z1A0JSyxcb#RoNVX!ose{ln-BwL;H_(QJG(MzwU@0TDL`?_1lyQMs#EDppEYPH)~z zps54kYTeOV@_Og`=A5BZG+TP682sZvL`0;B%K-5WQc1j;-^~n`T)x+#{H`PUQP1UP9nPEG0(oEF;Y}T1fmWuqyV3~VGyhi0# zu5pTUJ@!Eb*j=4*&*gZ;D=zVr8DG6BzX01tsuX9-*%jS%G{k7h;>46{Zs?iYh9=&K zDr6nbzL0 zxq~3w=CQkcc8~9F!t55W-RHMQQud8NcFTcu$d0tig>=h_&_yF%aw9JktkF=_PL%o~ ztCTQR60T|@R1d{{2~jizB|}s?BxQqFJXzk(UGF5{f~0sOX~rhqxMX-Usm7$yoz%G{ z(@iX;12RHBV7980kjlFbee>~b>wcAsrk3ytT6w)MuGz<8X z@*@56AieS-Oa+i(@0UfTI#qA1U;~&gFvF4!E7okYFZga}$GCKcV>A3z&!hdQy-Kyl1Qh7Qh)d83fO}0tB?m zB!(H-8f8lk8V~r=xfxd@BKcYsKQXbT+NECeY$ms+1lyXHbr>OTrkOPwtjE!wT(K21 zv%5TddWG5<>~bVgm}V}-Q`y&C64o0MGkBm#5t@%m`o&!v8VUc~Ao7nq5Qpv1LOT?j zS#sU@DKcQPzbYj#5=IPIFVL7WGiOlff756}@ut3zDZFR4s!j8x zY@_V~ubQ?En8W4(JQv`>qp*9!u+o^_I1i_O8fu46Wr}mBjX^=-bnKDt0wuE30us~` zgom*mR$LPqHV0j@#@h7JQb40M6%^x14IN#8u}00U!{Jhh(hiUV%kMoYw*GD<(yZNs z$m`ZDVoj`JtM_d&&qHF3L%fqSQou)L5ON+rwGJ;d z+0XzK@N?`_N(Ojp6lq1LA|)}c2zbMY6?OC!@s=SzZ%Gp4MsLEI@YF-mxpn!x`J6O1 zM55jWB!u<05l$7L>JWsEXPmi9-V65UfmWEny)_fXdJ&A~B<;>e$r*Jkl*=FE(9 zj(AjP4XUXyJ;saJyrDd;goNS)*VTwcD2t&Yj;aI_Nz|mFE`^44G-a&DVAg+yRz7bD zQwjQ1ly3Pxxll^}sjigFzaML12E`!p0IEmNeQ-fqIBhK*Dy6zqkIJY%HK2ynh2ZdYZ^0hb7kP_1Bt)aJ0^ziplL9 zO50{w8zd>qtvpr&wkRC}0M6g=QreUvnJ>sT zsG=VC0pLv2_}C803)TE4&6`n2gW=TqyGSg(zeT0W0jZ*leT+B9X2t`_o-w%d&E>h! z^4a@5a}PiX@kdhlpfwptcG|YI_+URyji`!q^s%3&5>*147lEW3^9^${Kfjd&p^Ggu zjpxOxIwLz_l41%yz@67kIaf_@=$J!VN6?Q9$uQQ2n1xwQZ{%FzvwVRKS)Bi|=p`7)0TcFB zD_$~IRx(y`M0Xy*-UEh+yF1!sET=jleEj%cv^eMO4COY?g#6osGr2$Z01327Vn>XJ zaj`q2M=yp_%T!Vq)5<9OF@%|(gkRJ7<_R)zsqmBzfDxtuBEpCpuo)7o z8Nfyb3c)B#0F_|WPk^8ijJ5>O34Zs(VG|A`iZKN+5ysqr&9M;1ngZAndXEz})?vhP zECHMZeFg*IA{f^az)kSy&b|>N?)gzT)tlw)3G4es@hO7+`99pKK0b5lJ6HVLtmV~+ zkjB#5kpsgo^p?R+;%`Ev7W9SLu{c)8=GYyF<1BM|ZqMU+J)h_2_x~fpzZKN}g0`7O zqj@N7ja3aFL7#x{uT3rWKZ=9{g4&)L0MxGm488)K9$>*Q0G9ag02cfQv;K>n{z3rw z#0A)`?_sy9&JRm!{WbUwbbch$yl9THo?6TRD+@5m0zr8DcIDZ4wEEFA@}op$4J+=9t6-;*7J#c5uPO=YM0Q|j1Xyyz!se*k12eF@ zfXNa=wM8iv%G`a#uJANct&R*JUSuF?W&=EzFyem{-;`#n5RS~VvhcN_Y@CUz@?HzS zQzBEA>riwpdi1&JZiCB`v>5-VM)W?Hm}t2z==Lgfw~N};QLksGhSXQ!fLUW14XUoo-SY?6DU8>?9D&il5X2~Y}; zMlDQ1eUbn~1R9{B@%rv4VsbF&5^G>&n{f=6hMg}=_N&|&wKLMyp&#{?82-9hD;V68 zF;5Qk7YaS|(9MB9T!Og**D3J~-Dp>WT!>j%xTe zTlL5n05r6sPlWI|e;qGc%cyf;5SWKbMC}8fY?sVR#4RyvQI2y4-6k~7z*1fWd+VW6 zY~foWf%Dhx5~q9ob4^+bkx8Vo#kT<8zE~nU1^6cjJ`#7!laE+pP+ZY?qyk1Ptbx0; z`hV=FJGH|w?r^8gV;FNzMG7at0drVvvQ*Z>grrX321f+#`^6qQ zK`#pTwN(#o#;jlrSSyht9CerUy1YP!204p5j&7mv&ZyiFcqs1F>*@Bk9qYAocExHc zP#LgCe|!TBfTHQ~bi)OOh-ec8%c1dE14r1yIO+cFg%l+OBqd2D(Q5bhB5;F?tf>kJ z*n~a}Oy!oe@Elh%yrdBc`HlkZT*h^3}`8& z1B)$fAe(Uf;y}1W_yfe;^f^}0Sc5Ob%dgk$r5Z;|I!*Xy&a9?_G?ns57#+g9^3XqzY|qqe;U{XZn|~r z+hh!gb*sw^l%O4OT*H@37vf=IdA8CehaFiCA~go@V8>oCR-8C!?L+{aa0p%9YFDXa zF%nR~XxBKN?pH5OHvZaNI`IQ$0E)Rp3uBm>7p@G`KLTFw8Xp(Afe0j&`IJ;U!1XKV z@8Vw9R756tt7`Lvx_WX&^I?uof%C?CB3I;Affj&^{#NCC?K@H6W|nl9x^%xxNeN=m zh_N>%funG1`3BqSvYHd-Z#okeW`*CA4%3MaBr;)9{&p5}I1z`oNtb1G;1>|4lG3jh9ak|5 z=CTY22Ex}t#V1F*mtV9;?EOY6AbFPKOQwoM*U*MFXznOdhbmKV^mEe}3=xQa@4jAo z2V3R}XarOPAFObhkx|%@HSN*(Oahf$D#H5l+a@ED#zk{hPt?rCmmd#AMC>aqs*K_) zpa~SX!X(D}(a$DTh9#n?gAQE!8z3<3bid91(3$CR2r^=qwtItSQxiNSBU60Vd%|a@ z#6Uv)v@@%H5zA>&o?Gnj#>I%KC`q8qrUX-GZHxi}K{wJmL(d%Lun>F5R0V{B54v3i z$&%(|f_p6nC5&gYlC>r%4SN`EmtTdDmeOFKLaDV@YjUUHKU-sPr#)no6#E@l=U^sS zg`Lxp?BVArb+qZZ1G_FecXZ#~KYZd$Vrm&v?f~Lp%Mz46fBKF1v`no3*juu+icmAk z;w3@$*voIrwtX&z-s)-z)@%s}uU-ESwO4`O6KBb{Ks%QlyKcC_*7n?1f4S^vME1mK zsUp1Mu21)+BFG-(5(Vm`ZUD`=Q0*TGL5j+uww<6q>%XDZW~ZJ&!m$;8%iXcJ?6fn+ z*qW34Vq2SP6b9T}Z{w5Jn9<4bjz7_Y_HQj0k|zXfuoP|r_nh=PPvgWY3^Bw{K!1{fs5 zPZnHNgPFWvCVooNR;=}FbpzZMd*+`+K5@{lnto81BvlUkOPBwn1Y14Jiw??I>Ff({ zVQZ{_dC7JRgdN)oOb;ZGBrv?{v>&ue!q5wzL23FJ`Jh=tAs*%*CVl+LQ*@s3;Nb4P z114#Wh;qMyV_3-eC;sFvGLZf$CufT3vFPU+1zU(aCKS9*j;bFfK^tG6j9ENzw(2Qh z8(G-6QnOaQINheyl@RsI6cySmc~lOyM?nPL{Zjjc1MRJdtr?ubtG4m(vh^2@z2F)S zN0_kFfq^#?w#7TVxMEpY63>cI9Vv_2)iDG%#o&sPk7alkJ{a`YX!}2FI3EuAH)Oo{ zpP5&}i^6orGv?Jlxshh&m*plqrKZj9w0AWxiaWc~VkRo9A0{n9%gN&0wR>8D%@dwC z3tt^D4g(5?_<^2-Z@^@d+r-V%fKuWRQb|IDxYU3UOp3IzO9(BB+^Dm2lC>qxC7gPc zj4qBEe)m2={U*)T!t*LcNwkE}e0~_n{XFPOa9G~qb@Wt%APNfvT>&6r#w@3EYA(tD z5&8R-WWLl)#H($Z#kG}l1wM#JOf%WOZPynWt@hA?{C+@_$tsfk(i11uZyX0DxQT8s3u{dlXtTK~SRe$ffdco57N^sx%~3lV zqlV>L-Zc}3SXNVF7QF+k2~=vMeJCg!_fZ?EU?8-wnx{OrB%G$W%-K7v>zh1W;+94? zBr(<$4v*Yh$*tk#sU|sk1lFz@v~ad7$gM;sg4ibROoC3BF5CRfH(or9F?=c9Xd$b% z){Ptot^W&A_%!*NceH-J-bbw(m~O|pRLdXS)sa!EaAQW#~Y zbIX>+x!pa|B$a`451bt+VpSVU*hY@tOw)NKU*0WMZ4&yc0BvLv#+k!qyVgTq%oXO`JZlL&D!sll9p1+g!(?I!$no!K2SfIwl1CY^i7R8dqWPP7 zv6g;R;PGS~{BL8+Z#&vgmgXxbb{tOgJHvf_knTi7Hnl6cmx1>fcwgozAFI-aM745_~eg`H; zeTXF7y251JJWAbl+ee!eOD$;m$^bh+#J{5~?=6S-FF!NFhgjI(Q)|RizZM~SW5px+ zzjW}XzQ2`V&wLx0i;+FPQlFs#9JKB2e&dL~fk5zLkO3ZmKh-Qx)IiVfu0)(Ssu|V1 zk5Tk=XfI19Z@!l39P;J9z>w4{PXEbwz4J%{y{Jgo^sBFd+h8^$N8ox9h3HOoqO414 zWQE-ygs)Mxg&$_^>)p#7`-^6WOOgo2t$N8k*dnjniLkxpURz6U8^7Bv#KYBFy(6a1 z4OFQPlX5^pfrU)Hiy7F%O&1M&2A>G>z|Gaztmx|nua1S=v*oHg|Kor^Wx?vf25lz8 z7GLQ{2}Ea1P^R#ID0YdJ(WV>=p?T3~@%F_aIKn_FfU0FJ6s4EOgpmZBGIokeFvw=- z9nVupAC^b|L>w5*(#=H~Rc>NYIL5nnsj=EEOn`cCIC%bI`xftBo9{Yj-aJR`FCeR4 zvO4@#^C)KA8)2DQdSyMM32Txf<(29CaM4GzhckzgrWB9Tvkcn!0wMa7l@wqf3w73l zMKui$jLXDC6hw=7lV*)YYa`laTqh>u%;iP-=r#+BOT0Q*{fC`R&+|3L0_3#a}FL`gP=LI4hU+&(D;5BFxViJCr_7+G6^LoY?eZH__<=ud=-9 zk8zJrg)Wf|hr@(NMl*^Pd95?|h(!%+oAvfHIphtU2$b+IDYr;X%g5#-84uqbxLM5t zP8<~H9?9=^4?ZZlb{Uq5*;g7e4otrVO?&FfN&9Ve%SkY{Zf3o0ZLNnqpNsa)lY^r< zH?P6Ey2B;GfdI!-=q((E8kji=I{3{7Qe0%}s3~LeUY`YT%TeOM?IXm8m@&^&n=A6J z$gjN1vj9glA+6$3VO6$}@-+Ac{gXQ)Ly~e|%Z_B4KNHClefq$DUYT>OTpV^E`C%?8 zftRhHWoZ8bM-;qVV?I@=&_nYV+il}vFSvEiyhYG)>B3K}1u$}iLBm$#1H>XQln((Q zF1(;-tulspGh7vmGnOD?&bWeKGEn5CTE?KV`~yr5KNojgJzZZTP?`_hD!lKr^o~F{6iJGV{Q=2oK3`j^ zmI6Q=fP%VI1Mc996e_tf@#p-`BH9@i`yXzWCI_rWAP!8KV=OB9@Z0I%my?Uh>oYE< zw>YDB`o;R}FJ_+X_K99%-eLIP$9?OF93C8@M&K${B}-%zVajZ1FLA_WFH4Y%9U+$L z(CB`ZQOQpbPz%-m;->*nCBljxt$?T12%&$=rgeMQJwD+66~p7P#VE$^t_=igS|d}D zn$|$TU29K539;dE1@he_uidt8^QtGdtz8?0%j+5=&Ew73vaX!vn0*l`zo9`icfts7 zbMr$8dQ*x>Weh#R)~f~jE2F^BSl7qLTbz;I2mP)ZH2G6A)rug*gE4)!-7)Kym?iFM zL}r%JXt%T3afF86?p84>1`H0+D02XNmLoZ-r9EveT_U+r8Ie{RbqB)L-KAopgyRiI zBS`){y!Y%VVK`y$taF5TW_WXwI1-+A;Nd7?45i8kW5hKKE200%k)tPLE3<^9ybe?! ztj?4NLHI^1yt;-b3u*}(c@TdhRA)%_FY2v;DnW$+h8J1A`%30$Knrfg#)0d+=7aqk zTM`81TmT%sh73jid61)vuq7@z4%FE%5zB6JZld3*fd~05uNq)L8LxtL##d!h0@5ck zw7SyKbbl@Cba@~ttqsh*p}bbf5x@$C+|$f4nmTy8u!)H>kxIY}qDraMS_UR5U#@1$ zV6|FR9_1_kjedt@Am2qP2w};sM~Jk`NaM4vJL&kw?3Zny|RWNhHq&} zne3c#M@EQ)BijZh3d6k(Y#SWka-37}UHDqC=4d|QSbpScP;C`CMJ1f1a^rD-z7(FZ z5eFm88{p{tj*;K+RQS^F2X_k0{gohe74h_Ce4f@-AbO@)IHOVkvKOGtXN7==uC8nh z`>&F7IeL)NlfM|h-~2a2Z}PZc+35ibYti6Dk?2=lwjY?J2MzE_p zFb@Ucs<031Yf~@+T8G0X0l^eiYNK|X9TdAW86!feJBlRM!B(gYVX>VutPB*}l|cwR zW=+~Fb4LVa6avCt9d?3E75#&zMNnxnvA{lSbrOZBOx!~YKEcwVR&~O7gnw&lQ=7mh zg`(9`ym7uQ^OMm8)8)cf)|*11pYCZ3DOU(=RcX8|uj9&Yj@SDW3d3 z(OlKmsL)znaskl^m(yQnB1Q?Be2#eXEJzY+8x^Yde`?{XkO$+b3c*PHUWY>fI%}s8 zr~0(ne6f!!2E{fB-cW&1pYel=uLV!eSps5JcSCDFIU)l6n4p<+3T4_cBs-qB{1NdBf$ z--ky3Kqz0afjY>I)?0{rC}mjBI?xhuFviett<2bST_-YtL7>@1m zSj%w&ZN*`|`A65is?D>+O|#)w?zO|0x4uEd4%`jrjahl*W5g%NblLnKx^)bDk*a-f z%IQ~`VpYAEkK=%Y^%6c#3vxAtzV+)jOj&C(dbG?&@92q;I)NR`7ybPy0-Q>WN$ZWF4*TC73j z4@n+6cmO4XoBR~SBrRpWWeiX)v6#780kcF5xhK0{W?Q(IGrv5n;;R zS{$IN?hu(aOtghd=C=PBgJKh{U*sMq5)O(v1Z#&()db>QSbGpf9D#rh3w!+_UG~FZ z`|>$x`2%7`uP(bx6_Lmr%s7*xr9(L)B0y28rU`n~J2te$+A5ZY)GoCHakv70TQxBc z<-?i=iK@r6w~{>9JreAwLXP`j_8UDm~Wi*+nlVC47zB3;h<(czAMzEsZ_dl9dguV-_2 z{YIt5Ek*If_@b8LQb;j;t42k3H)RezA|K)twVtE&M{iV*>!FDrL(fQ;`PE?GypDWC zJ_3qtp>|`dL~-;1Fk9P*(hT~Al$v3?y+OA9w_JN}roHWq{fw=q$npx$ADNEx1K1So z&@!c;kXJ`0*X5Bt|L;dh zF8__0@XGJb-#NF=skmwTXGFWCs&bv4gOKl(7CDOy+EBF2Y-;5z12P%IVkjG&mj0Th zq+RH`R>k@q?K(-9Of7tsUoK^4Zq+$MyPm~I1>8l)W=p0eZA(DUh4b(5ie1G9-D6j! z?L+C-qao|DIQQZ){Nhn}oFUx~kK*IT^fBA9knL#C6^IUz$!qA|H8985@ZQRpCHIzlXxuQjkC#&YI>bE40Ek zV~R=G7St#>+tZ&Q8m+@Q*?4KGw=TECxpUIloZPk_^*^&bX<6u*!|txPOqUmE?3L~W zw>_lM*sEN4r@iX0zvY!IkyF8@Xj^XJuIep1rNmXvl&&=NND+lbYmv;5rmDM5Oyr> zU&S6;wzB=7(Y-J3-DTKSX7-MDeV7!HI%eIg&IDP#@LGAGru2>5U%35Z!m}Zae#;+t zFiIRldCaeAgJ5GWxz2TejJQTL7)o*`4@yD3p^yMs%9p4H4TSxOFf_MGd z8Ca_jx0qN13t_+CtkTL-e@c=fMRI+E>J$9T4>rmf25-K}4(kBa_JD2lqHw}9d@Y^M z&~saa1UMQ({7noiI+|4aFjBmp@VeSt`0^_|B3Cy!KJR-K^(#WJkB_g}95o`L8h1Qe zS!=ab)S~h3${GWD-Ttnf-;A^Q&&tv#`qZoK!Q)mGDz=OOb*NNPgovm*iwz;T88}RM zw^gl^n&GlaKx~X=s-75;j43WnKS(x0f6+KKRC%ZfKumE-9mJFe)s7JuR{?Wy$Qw+snCtlzM77+P`Kkeg3{cPtt-UlNpr6Ng<;!fLpa|+wS(=O>q@r)lPtR&QH)L)OYpt zxA&t^pU?pAbkuIJ*=;=zhf@oh9NJVcyWk&M;bF!TwDSdpAUz#S)q?gWEJGO*iYrwr zOPyDlPdkNFlv}N2A<^FGUF7QJC8rUIsmZ*i1y`?G%Ff2~ z&swh0XX5$il!9~dGpA>eqF0LG8NP#ZT@WsCI5tD;WcJner|3hxN;{QnSpRect>fpdB-Hp1% z^)guloQ|ejZ7wYayWsswju2L$-8GeQ4b~UfTS6if}v#m+#Pyz;6t1-a9ihh0n%@Cw+ z+NR$x->+Zter;sdMx3=p-mhI!dIj#EbWduMyBj|bYs4*PoLSr))_&e$>6mnic(xWK zu~KFVb_V3e2_$JNkF@*oM!b}FU$%LQx zen-IlIp)xPS$!PQlbttHG*tIX1(bK*f&Yd4)eaGKaBkG`@Yk0-;m-Mfa5zle z3N|aRWa>)(r`7+LRBxut=l{;us=Lg1NZ#3~GYTz5B>WAJtFKHKPq3WHe&eSZuY920 zWHa0SEvS&?fVri7gvWFUa3ZDy;b{ImS82=@&%O0Z{LX@%lozK6)}4nMa>(x&%@hv* z+AaM%tE|Sn&uPQsyGvYzZa-IYzG;!4dN=(I9mJ=#w!$BT1p4#CUk%$8a+_3IAOaryfqhtNYzOoVCx&!_cN2GG@#?cB*K)@B}ou z>DjZPNTja4Y{DZa#wX)&POFX={eYJLSiw{kH!Z18q*MJ%ZM`@V&Bj725 zzai{FMQ@ju>Szop@sYFGRJ8ED;br*4T)2>B*Uz|54~?&m&TD`3sf&LICU?{J6P~s4 z%vBXy9^6Ciffa`ogML@<1csXd=$%Gz8~qLUjkcC9!%El<%XOhzmoJt)iThzueP6R4 zgA)Yh2<>d{0!TgnW@;aZ7P<)@W{E4IG}7Lb!uruDR3oTEmpyA{;^NR!G6^4A0s@qaxy831ksV zHsLW(kQde@2v&IXE64^GJ2Ul8N@_wjF*`dkJ9}Q<9mGa|6dHP~zT=Ix8DmYevo$Nz zm!1vRA6rp0;9KEZX7pf*tFsRWG@|x9XB4)VYvkNDC0mFlWQ0V*3pw7}yr+&H*`3t1 z)9!w1Nm49$-~ihCwnG0ZA*C|l#Jk3(iWbgzhiLY8@YjXfW9`9hI*WwxqdP{U*Q2j5 zy1r=p`O*IsMejymnSXb_z>TyxX5UR(PSO={;*Z}my5#zji`eVfA3wfm$=xLv;_k*R zh}d^MvOmgn;4^ly2k4R78GSIeyxi0wePD^JstgHLTCjc9=X%mc_euX3Gb+{lHpGpc z?bzxbeUBvmj7uExkxEEyrrT>n_V^`0I2>CRS9#_>IS)Ith1XZ=ZP)jGPCmDep25Xx zadda9*ZC0N=j`8GR&=Cr)#d;RY9JPTQC9t7d*LI%0czrmizz`GHAq=(jMLab?gd)K zyZPQ-lNFRMG%n1qr!#u<7lI3=Hjp82k6^}W93TML<8~_T5}N(^lzqx(9|w8Ie_7b^Z8YJOMCsezC)hJb?of7O z+p^MLO(`fV!8Xbl>u7(LFm<%3h`D^Mdf8Y2Mu`@bEBb9^tg6Qtb$q|s?CQ>3H>6$> z*gep{sTr5tpiQiQX=_TGHhuN;>R#6(G@e5;J?l$1VZmy1B8u->Hr};3sa~7h@Wy0H zSN^NxZ&Zp$KYX{NhU#9ZB^n!DTeOSWnS}+3xa|M3vmTSO=aG+LTj`$P4?-z8uh>T} zE+{TZD)})#zkzLG9kJ9MY3-8Y;vFiX@)YZso-w~+3^9(OvN8UaKPzKZ#+U_;d89EW z`*qShQbK`hQV#lzuD+x(0b4+t=Th@XW%3z|W(g#Jkn(e2jCoTg@!JR`{jSVsZBDH@ z>PYQAnz{A;yW8ZnaN1+{ScO)>7PzrKKL2B3Q|AKQgTk7*7b*blq6RX%XYW)^efU*~V&5vPos6jl3BiD{F9yiH-q_icJ@DvDK;xNht1}&b8=ZARziR}Ia;qaLBKF<9VU*6 zY+S5FfR)#^4pw)UiIp*!gph^)h4{D6Ya*aG*QLX|}By7;e z>%uw&3F~z6+OWZd#bU7-j7?^~XC{9X0dlE<30UOi_%3Xm**6nc};|JN}XaHpMglWphcifW`4~~<`LjFjiTFTx7}?T*s^Oy z6v^mIORFH=ISgje${dAfMY_(^j5r|w*tjv9PRHN+#_y2)X~x0@fLU(VLyHF{#`>18 zTGN~0PO!Ube4eV>h2E3;Q}R>5sreOE4gP?m#-8L(>K$CuAKSck!H5qVnnWM|PS@x8 zDd4}HSBSnBhBzpxBl#@{H1l^lYVz`qsR!Bp6omWP13@GBielQmiFMd~J%qE4S)=DA z$~jPO1Px5;a=hVJ)NFcw%W&APK<`6jo6P*anfwag=+ruYQf4q1e^Cm5C@O^3z!wTd zKUNX8pJ9qED!I&V0t zVo9AD*D|njiNySC^cMPs_PO_3KSx9eIybiQ8T`-=A$H*Wg>WTh-G-^9;L;0Wd`cT} zVOWaAuA68G=g)2bu@CB-sQ)74I5Ga97>ivx-~)XB9751*QbaoP9Pr$LDHEffN3fe=t(E2gOXD3pEFpML?jY~@$23BzmhH~#65MSvK2m}Q&rXeP+tPE-sn z;yhQ!@K;B@Dfv5`kFKCAgP5w08pB&s92oOZMpw|40>+Vgl5tg53WSVmVtS*(qJh)n~9sW0`>_KFo9Q4-VjnOciJZUxWgTKm@CRRXGo zVbdv$=b45vzh~?#*%)dZ{DsX1IL&)nVD`TW6)AP9&J2G!^MR@P z1rFYbKW{XU$yU4Izo+?2wLZWncT0&hNhe?SHt>dA(^aM-s(G18m(A%rHCQ>}?}EZ{bdE+r{|Zc)4~orn-^wo_gqZm;9LUr&GaV*0m<} zwO04-(S+Np3lxxLpHXj=8v&zb^I}()exP68ukYU%f*diPn*_RZR5;P-CcW)GyqpFi z6*7JwKVIIvte)T^tlPQoDJ^RO^Aclh7|1i`q1{Dlolc>5gxozf6P5WJ$a&r1gzPy* zlUKAhpC{3aCIKO^pvx|-Sva>M!>`BshnujCwnjy}ma*5-H&AP(5reT|kU%PTJJN0E zk2;D>MnI+a1cQItL-&6^8wr8l)rlDPGGPX*l==hVc=-7nu#gz)jJD<3Cf69gkwu-PDgH}}Atd-R$#$6fSjE7!@?qR=G(G$#}|FpCtQmcdjxFqri@1eRZG-_;PJV!wZ$P`S%D^u@$=Iu@&i|CAGZ z{_t+(?(Up{OC=ztIiftZ)zn$A6#EX!HZfUtX@Yco&&&)~spfNhsVY4^tw1QtdM|T6 z{wtuQRIO9SD<8c}%T$0OUXi$qA$zRs1G2=XZbO+xDB3wX5}g;O)wMLVI9hN*o!DxE zoermA4V*S9I{%|JGWq~GvKAd(*3c8vU}EBKG;rFawOHTxK2|nl$eVOoBIpi4RT=l2WNy?9uF^ zr%SWH#=Q!qhp7+Wj*>E|CzAqudALtG0{;J#lzs3^xkP3~g|+iQ z&{FP$G4NQdmU*;zwLH`;Zr*O&1ts^F1JtbadkebwINX)MvfN*{ zD0AMz!9pDVidl5wMtAQw(n*=Af;loCf4gZrdS{WcQj6yDKCl0pIG+~zLHpe#@I3(L zY78P8Eg z%)@TaF&4A|ksW@$jsBOr>ozu-B+f}wHR`AXV( zjG^thp*Lj{XZt>swT-Wen2Gc`@0)W(GHn@y&V#-*WjMz$hw)B6Ni64iAGLn`8n+ay z=DmZ3U8q?Gb;rXN6oq8wl8{}(Hi+ards&wcK<*jOO&;$VP{xu~&*W@vIZpQzzZIEh6x(@hR3c@{LQFj@R4QRDkJEe?_m8qaZZ?qFVh4}qma>j* zl2j9Hw}kVO0OkUcHJ5%narf#nY@`3) z$d3`7Lf1tda2wD|9S6Ga!!;)WJ^;&rJD{q~*y0gb;EVjO^$jo5v{QMia=S*f%aI2R zzqRuKICL)o0UA72RV|WIf|uYdri2FmRN+*N_GJ$szAlo*8DQP?+##NQvllyZcU7>D zGi<6W7<8z`5#KW?7s_ByHG|6fpcv|WKD@83$$>;3Rlr^p^UAhccYdjD+3q)cu)8P9 zdT_LnxL?a;3uQb?sNJMX!oJYL(2*~8Kd$N11hVyAPb?Y+s3rag76 zJYUH6F=|AoInmixdLjs-vRT3tVk9e4w>5{4`CVPSRR(HPWqeHaD4Kt1o+F zBziL7QFulk+ZkVxW+`m+2I66OJJ@Z=cnD`v*7%&4Hl*FUvuV^T#Z^Yf`&w5AYF!?+9Pcxbr zr>!PpJy7w1D*m8M4)BTbT*s5GOwnzNGWvo7dzw%29&9i}5`O2fFqlJr(i5e^~_9eZBX#!7DV=t{D!v6OvdH2_(tj@;&h zXKI#|F-(6wfZwxa2{ibXeFj(WwrYS7Mr5Ys@-td|2a573RqvM&v}fn zjve{Ys3VESBK2}?h#QJobv`;D<0{wcy-m{g%^+>C4(GTy%ZHATOo+tjv|fi6_p^{Y zP2QW6Tve14RZkX>VYy}uZR&pR>79+lWZ|SJ+Bk=Ku(1pfpQyT3!PeOeiJI*>C4Vqd z=6EG@D#~(N$%0YZ(rnRY;EmL6tt~=?Dp;%Kg~URKz|uRU3?s2!lB9&*>=SiPq&cf&St$*F0bx!)967OG1x<-d0~mp+)rKk+$z#o z+qU_OtsaOpgZ_BqRHvd-@Fz*WdnksJbSQIH#2i>?s&QlL1^YeNRaQ0~qz_6SL&SWD zA>#`>fZcO#nnUs!M`vo}8Ygm%GcH?U&k0b`hABpjWUAzR*clp)+08+Nf;6M)h4~Nx zU7kBL+BOhiC#}(#_t~(MK7?RD<+&)Tav(2M60CY|cuQotxt#hwr?cA)Q-}$0EUxwm zJi_kdnL{__OAR+LW&4=3r1Ic3pYuCiB%v$d#6Eu6dFP{HP<`DcqNl^@&?dD>+5!Wy zq+klHLhK%nyni^khawIO2P*22^Kf{t8bZF@eBuO>EHomPxL4t#8LTH`&JW*73<>DR z(Y7B=vlONrF6x&I!Q`Yb3Nz>gUM`IJ^BFw|;H_^V9z-D6cb-4@>yS5Yo6owrBtOhQ zdfy|!{EJs1Bw);Ml+p>rH9A++m7Opm{FwuNZFC+5j)zBb5zrsT>K-d12=zzNeR}i( zi{qp`I+MY85n?c%f?ak@9X(M#xqbyiv0jaay4Z&)6PFz7uVRS?}9=?}_N?-V`VNZ9qmjJ&J(V10@o8>^Z z=(;MWbKHR~$5U?>*vRyV8;+-Dx=aUFv z#F=FErWvFSUpup$w%voF ztR9UA8Qnx>Oq%+i$ z=vEB+%|kSphvuQ}|E5zt$sK}o&=;FxK}VB!WVqH2gs>5GU{u5CQnKE)6uGghG=*XE zsxGK*hcF*0Rxx*n%3Ytx71(>HKvzy`WOj)0eWK?#da&VpgvueTPixhsRLAWGY!a^; z4F9hs&HoNT*L{S^Nq3^h#dKzWViLzouHE>~95Zr(9#mIeQ``hX&n8@R1n1SgDoR>q zb7pKy)bv>4LNXxKoDE+nH9S3;BBE;Aq>cgmpYj0o#sACAi9}k%N4F^-nAUA4m}9S< zMi94*sh`b<2*_gY%xIs40PAU!w)Q?tnerjP6t%gCy3o-K3JBKrEa$E;T8^NbmHK6% zP>2a|Ob(X>f`wOwn~sO5;RYsbpK+E%JO^Xu^?UjtG{zul{*;=7aM%Z4ns z)Xh<}Zj1a2l?>-c0K{vRtv5WL(I_!RWSHWmB1=sUex7)6RD(SvaDs#q!#ft*$9W7G z3a*0UX~2H?rpI@WDEESCl2aOC_BFnmnCz4u+~nlKFHvgT*lcl0y&@Fcx2DZ#q7sVQKe^o^sE}IbRv2MLoGlRIxZT zK857OdVH-oJn%~^IWX&#bCZtpF?I!rMJ1&>%Tv+*`_C~Vgiv2d)?+@AS}B)te#myF zFTP);+XW=}V1cvJj^MKSXXCMkQs#{vaQr<&*7*|0h9Zu$sNQhvO+Gk^;dKb}+~VKc zar`gW-yJi*&}?Hdw+^5JFvI7QzKf*s|3*vU;D>%odQ1N4c>>JvBQV4F)1u`4FYV*~ zOJ?$r=|5kId^6UEk2kgV_iz5s{tr9eE@cdaSK;;P)q-zb^Zy^e`O-C$*KQY-tO)-5 zYkSL?Z10!sE&#AD!1IjM+U5+oJ6lUnCV8+-y+0w`=B_1ppMM|P_Eh^5(qnrlyXuGQ z+iitP%G)jsHa;2dU8KJ7&B#hMQHiMf21ARHPTvk^AroZ()D-^5CZGxKC!NA=JXh!t z61_fn)kGyCf`4cVMbA-y3lEhj2_a(rmEe^)SFP=Ur;fx~fM3erYRN1i-0NAe$PE{B zf|+l-S<8fzz;j37zo9o!dJ`ct77_K?H5HySfPHDA-(~56vCRY>%!*F0D{qB=m)E zMz))ogkmE8|1zAZ{R3gJmJnJEjSi2-0SfA`H(i6&-ywsby+)v+F**v>BROcIn;WltICTb%4}%eJWjDxi9-n zn$&9Vbs+R$c5!VUNz>&ZvzBXq=d@u*w{&7x|I*{F0U5@Vp1CY*>?h7@bz^RH zoq?gpY;BVvlQLtiAyXs5<#ucbHj$o94R9B1bROtmoO9aLRff`ClK+)#Y1Yi(Q0jh0 zShGe5&PYlwaa}?!@JY#FL3GjvMAqYSa~@a{%SfEv>G0!W@&z*h zRZWD0l`shlU==9IIvl};7iYGkBWR5ZZ2W9wq>>Ef>{_KaoN)hn|d%u+O_$Cq6}o@eO{c8D_k{LplaHm{KqK#3G>`HRU7* zRZ*3Sl0ptjw_2da2LYB7`|hwB+jyn06_M_4o^9>jMF6}NmNidYCFy|`5)Nr{(4zG^jvNh!etA$LxZrx7tESuD7Vj+B0sV!=}`aAlsBu*akO7g#=gEEnc zf6wYAE2oDc2T9j4qH0Ipb29v`P{zNm3rR&GN22(ZmF|S?u#`erlP3r6wiZ$2Ikc63 zoG!hT4g~Tmo{qA3Bqq*XdTy;`l+>LYPG77u-eM~T|sf$#~ea^}JW3)lqYWp;SAi(p36 z2M5SoE-T$fTCEd?C8qFe1b7UoF1%B!gz;WrTO{ZqTtcYvzTf>FpHy&B76}Fce=|x; zx4FxzhH8=}qm!{jRv2Cu(YQQFEmsu=LgWEoC{W!jH>IYksj3Tcf!LZk4wshtnW%H6 zp*b(7dU-jQ5v@*nAiEveJ$v;&E}g6$Tix-saxJe*796GT6uQe=DnZrMb=tC((_XGq zA5+~Sc3*C4D!J4}DeKazP6UeyNSZX$S6gtqq$j@T$9iF_-M%wNMG*5*7qSWXx>Cw^ z?Us(WWX5T=ce0YMoa8|IL345GCJn8R0~==pu%3Z|`Mf~VWp~KaN-L98tb=hN{CnyU z<=iE58LSaK!hBaBOBHRUgJtToOIUVt1bAz*(o+ePP8*aaomi~nNd7%_h-~f>qZurD z?z4L`y=?ha2HDcVl&GYmndH)x1&L6%WW5>?&_LLV(U6lcDr7cAhnBavn6PAz`HT3kiO zQ25=VheB?UdLWt6Tdb5({P1(A$O@*+S{K+_FS_V5J6#>1afouRL{%ochhd&pF}ps< znIfN(yycM87R*sDv2~~xl~?8SYG?#9*#+4tgggnx=_=czlODpQzOPm1CgzodAvN(3$R|?{f5*Ma&WZOAQ=11UKOom^NFFV9{3h0$))0nGVlg8ub@RD$d>-K)UWqw6@QVD9EVC5>Fk6Ng(j~kRgvKGVxl2?e z_`0~dCzH>X4|Wf{B;N%RL+lXc+$9Dxcx5rKp?R~5+Pm3mg&{Q%Yao!x7UU`pk820; z0^6dK9>RA%Uu%DzBYn5ip;l+>=vE@V~jd{!-q+VPX_ttMMxV?LE`(MerZSJmt4 zb+ybaliH&j$rdLt7}39^Z0zD=uYb?}R6%nO6=fSz$Ryl(pESFT#Qux5|GfGS2rnLG zo|MwOv?~xiX%iA6(zj?!R<*jd2w>+H2}=_go}8VwS{OQT@6PF?vq!Cy*2&h!VII1O z!yM-;fybSld@$M(1Q=ZtBCrII{ow8LIp~AY4hA8jO?zZqgL`mbzsB#n6EJX>O&~`z4EIRx5wY?kuwVfm(bLOhO=n5& zD~9ScU<};q6G0E}v85?zYIsziNywTpjbX5q6&Y>Dg>)>7|3ABp1;=pLwSp`UiI~m0 zAPA#R47)R-H^Hx&{Mr-dcx_e&`YM=?wA z!i^LZMqw(*ZLNbmI zZjJ4)^F%`{Uh@MK1j9RU?{R`#lGkd!G&jxZ-WGYW5<1Z8hovY3x=o0)W^2#3iHz|8 zSIp3%#FBaE*QzMpxY-K>P*fa~P?DU9u8Dp(CDN>C|{<4pC zlzeqMa0nK?Ol&p#XNo5<0O4bU=mL!x?NyKGV)o!ctcOPoGsBgCGlo;xuC~s1MGqu-AHt*tnjw8jq?2U&A`by{jekNOp|C<| zqb~=EC!++B#jFb7wMpKj!RfN`MeZh;IQrRCne{$S{83m@ZQ`8dYc)t3FpsH)lc7FP ziY8E+qO5aVbrFZY#muA%`f4xNXbqivaX>TtWZe;eYDiHkGyn|j1V_e<_-fDKlN~s( zhy1iE7%{~WW<#t6Icqj)bU9lEjPmmEkacj`bwHC69H&m+9oeGM1F{tJk!pu}S zPZmgup}B;d>Gf1q3bC^WRM2TdC=W&i$_GvaKoxibG7E73XJ?if8!3uueoU1d%|5OG zv`Zx>hbPz7Dw=96YubY|+h5F(BHo+w3}9Ajvt!8^25)jl6`oj?e0=(WLEn(!r1PZ8 z=u%ww+bT$KrcF8@uXQW!QSwqILLLw_Nk@CR*X=hvCnZNoMhL;r(CuMN^}3ISt6Q^t_Qr_G;V1uxaM?f4sr7OIT52T2@Z zoo5)PM+bRI@%!HY241pw&IDFBo-Jpb?!w<`Z!lcQNlk(?Iv>hfK`R&VC8Va8H=qZo zx+uyO=zU(Vt)s`UepCeMik?>L)*QFBwOLmV9K0{Twoay#>Rg{Grg$`B-OEZAOPv<8 z#wQ`T0Mp&9a#Sl$N8zqN9DD~1Kww5qFo2)K3`+qVPbm3?uGI|7ay_ty230q>AqB{G zH~1N51^khg2{Q_4^|q9XoJlI*!60NlwO2}a0hCeZz*6_s@g&J-&`*t5>8&pEn4mLE zqL32=_o$A*Xpq?rRS*PJSApuqf*~$ObBftMfK=zN z-;!5U8XK$0PO?=lUfr7j$FpL<;ZmQ_k!+O(*^plz2}%q(JX_g&>fvl#00_VSaLIpT zG}&B`0!@&a&czRso6F8b0YveVkrhjQW&diwz)$XQyEShk2HD2_on%mRiIk0{kIE{N z3RoPhLFJpkUR!@hcsj_K2nAEsl%RxEPAyZPe-S$rs7u4}_WLJE$JAs2tmeD1yMOVK z+>1{7V=U3(GrJdL0 zal1SNXV5qWOl{3R?Jm0OFN$eN!jIRu{*n2mq%HE;F=D)~OeD4+^T*A^)&FD0 z*C!=%Ho+3|O7I}I26T2JAGdGdDf#i&@+eya0d#S572#R<<@w67^HMfQ&L7+sx9fac z%Ah*>1zJ1TVFVY8czDEqbtlyd4bf_0?^rs3fl7np%UvuvSjv8JFG2xfe~>?o`*BH6 zEkCWogZT3@4B@xbVv+YQFDN~FaPj=|`Ps?d&T$(0uB}WOhn%8~;+%dwVLfhirOC*g zRrcEy2PF**CQQX3-Y~${i=`b0vZ?BHSNv~>jE58>U&T?nZ@IH5^!uTgte`LNg9RJL z>$=h^&pb988E7GM4C8DK+R&d{wR$N$4g2OlZ^ymkF&)HuZv@_ClchoPmJ>+4K~-5M zu!32S4uZZI*(s7`Unl&ES&0!WQ?}+1Q2x5QiIt#{-sy4R++S(}pnaONcB?0bJ7j*d zhbjPD>qQJBHS#ZFs@Ut}xGi`!@E%(O6#{}cW7v;M_0f4dnl}beD8s@O8(2ITkSBT{ zT!)r45r>#eCG)Lk11KnzVjXOjUz!XO?HV@n8dpY>0kqb+kI78mSiOkf=n-TxXJ_?! zJi<9;JN~{;!I{?Yy_wd%^(zLR?HB_z*0^1UVj<*p1K2M--|^d zqp(D!H>v+|uGLbYeRgYn5PBtwe(>PN)Cd>loM~CIm3czAWH#nxk!&NGom6jDDR@&~ z1&lo2-*X^8+WT++e7=1-&(qKuMGuwpfZ}Z`6p=DDPoNkTI5Qip@f4y{uF~n6ShvQk zse~<{oi#9y7tXW#aoVx503)X#Bx0DUORVrpIfJCz$6K zqsZBW2(EOfe4psTeSHgCZ+~1Tl>3_8v_7!9a5dDV)K%8nF45X57QMKt+F%N`$0je; z-1|Lcu&dMsMe1`i5ko$sK%DKSkmQ3by3&3i!ZjOc@7SALQ=7_4Q77jIl5{-eV?D>- zC`K#uh*_2+6{!#k=HI$)ifzS>ce)A9!!u?G-C6mrsUKIfDT)5@4^t$}V|gLguAp+d z;z2y5lrXo*>tcM`V6Fx|NLdmIPEbpL8BSaa4E-@Wh5E++gFDcH3RbIk!Q6UO6=TJBAE;bgmv?I6}W9Tm!I&1mK~j8 zdjCGx2#O)dNh5%*&EDKXU}q9E(|}S9hNr~cVg@$ygodr#&#n|dLn6D3&8C~DM4E+b z=PgvhE|gsKW))iV&ErjLdyV8Cw)&b5sj376a*Jj6n?M}`3{R33wOB0j_MmZK@GupZ z^I@LGu5BHufNG{a{XAwFyL1PUD+G&pUsEe{URN#7sZg|m@6a%;x(2|c0!S$O9$H%! zWZq?oUjc5YRPM-SuMd&Kl#PKwxStTd1;7Qq6-4SnkhlTGU#6YDRY!d+vf&0Sf6wep z3r?5BZ(ik=!M^phK{xOb6t5B3HQ@O5h}nMu3=L~ppvm2feTY!F<~}MU7^l`UM+X?| zHa87GUA_D`qKS?lEV1JkI@p6+hcQWJaBFs7qxV%Rwn}X8mE9kPldjGp5ipE)i3@^8 ztbVkq*-8CKskmo9;EbfFMuw*bRYD3KjdK^a1=IMeb-dQt9)InGPj4IB=PwyCnV7*HG}NaD9*yVbt5FHA3sEUKLRDe zh!3Gc3)zHlj|+tn=?@S8W#Dg(=m8u$CvJE4uP3urr>L3B8-m^&p*wfh%u0 zd0Vh0u-$$oO$}#1n9$CK9!v&T@_Z%bBi|C;u&O?dSpx6IYRS?{^AB+J(BgJnRwfFQwQdIQE3G*)PM*3aU|@nEPt)<>B~Wn3a^ zFqeh9sYmTM0}2ZJ*>4a4z+0KWj@qa4qwOzNm;qUNrr zoK29x%+gVp@jxO?Ob}UrHQQIEcm|lQQmAN86j0V+WEpPs0@MvBj}cRvOE{EFbT@-Ad17 zTjgFP{MA`@$Ly+n*3sv}4RWk13RG-6= zy@MfhgqjC2X6v8BHE?o_YZqAv*(Z^JCt$lP}XxKT1LL|M#BSqM2XK2pK_<~wo?5Pk41I$)kN z;8_z-l>g%VHGX*i{Mp5`(|mXPDtJcU^*RnN_@EHExpJhe0BOC?H(hkQi^eKWrg~>W zOX$n3I}0*!mF@y^<0}ftUv6$z6~N}tobdE;J{=F$T-i0H(F(LtpLQbqsdjQ(w)8z3 zvTbZY*SPu3_@w$+)^pf;oy=rJ?_68&wsGmid9#^T0JE3b@N$}`aj1;ybzgEG)Jbrt z{>r?qP41@NLh8ZN&HV)i@KMb+XOB7AJ9_}-xA7hw4$S3badof_Ai1M1YJipi*=@TH zpIY98aJ@0G`#2ruv8h1MAqkffy_h~)cn99VhOp#z^$GgERUgKbBLRA+@d$s93ai&) zLTgO8zxTLp6Ua?C9#6;5K~kC+3tz)_#ZlhJX6e`pKD>x zQ#&4Wbixj1iJemFhj})#~H;c5Rc6)%;aJ zueSgZJpgS`_RD_i>Z5I0Oih{@70=o`AZzYRoaVtEU%kjJn{~a`P&H-xnf+_HO?XZ0}ZEe}# zQRO$TV&Ur7pCYj(_bCCU-rwd5LlE%=ta>${@u(h_JdjWk5Tbbn$Yb%x&Qs%A8L9qu zR`+0NSR%q;B-WZ(y#v0}CxRbRv-gF7btgaE^S;x3?jdMNnMM~+wYQ~5J``0v0h_S^ zjph3cv5L(^Ntx+MK`n}A-hZI6{D9*V;?R_GJGX0BD+sSmi<^D1veq8Lu~fXL@j|08 z?0{xs#Rx)0hwN_)>ZZNjyGLUI&U(`GY2LIlb%K|Ud~fjIUt{}=U5JO zWBwM)=j+9)U~b#Zy=7QOoqK)6gZHp8AY5ioiv=(EwMF^j(&RQ)cg?vy zYnjw(?Pny}U**4Gw8G=>C8t;AZwN27<~w135b(4yB>#S#db5P-E=!kAkBMkDx{Gk1 z><2wy28IkZ~s*Nr(L^g^w zQBbks<@g1C@|8nm%n1l8B6DU}lv71f!JcHmh~PTln&6gMA#ztbn#@+B5HIIUiqb~4 z>O9mn>wT3TlV7oabAwhf*3?z0yQUdwrrcigR;3~SPvXwA0*{uBMpJab(feOc4)Jw%AM7|z5^>wCDnc$1?;k&>vcXf4$)|Vbki}y{ z0kfj5lQ9S*k3Nlq`|Ct)njMauXdM0H;dm*Wnprua899!b{aT{#;nh6Nr1fw8csDah z;Wxwt&0aqYT3!$^&?k6)0wXPJ*BF|o4{#sv*_JcZ!?e*C_OR9y9mPw)2 zqj2<6G%t^vv^82=Ra>oCnrG{_PxGx!2ku?wk4_)$?_RF=*ReAyi3M8`Y~)MxZiKA< zhn0y*-yI_C7aP=EjyFi@c8l$0hFszEAnAF7frV+pQ6EEBx76o^5pFBb^k+H2z`maT zEV~oJVccUV9ZzbSMqseIONNCn4 z)rMStx|*aS#DYArNO7O@gAWnWUpoQ0xP=4a9PU_ZAn=4zXDB$_$65l_?1FfqHswNmg_iO?upAZ)6q_ z?KjGy%;RELkgqLKfLYiS;m(Ui9sp=)logSR=%Kt$GU{97ZMTKl-QqdXG==`k@xCQP zA@F`olU-l?XeDs(GxNLTnsu&L0|4%<(PWc6scO4wDPimaH*T)5kj*%>a5X60bcJnw z3Y1BvM*eC73imeD41BWwR>iQR=qvDO@yunVG7kxzk?#zbAnXrzJ?I4kX0(!s$ z3V&Tgw0-M^kR-17=vFT!6u)w(w4JcCxwn*}qylGinYomK(mkXwE z);MW$v|RN>J7&RXsDc&wL18ZnWLhhy?xN7x%`p$N3dTtSrzV~>MMiJqX=64(WU9LEa}Cf#!lr2~7*vW8EwP0_N{CK3Qdm+xvRblaYTKl73bV?_OCx%u{`#0m#RG9HGkm>=LVq zTw$4#G&W_h{%;X`{o)gorX4ntr_+OXe?%+QM!Z}DY-D3!J?unfvAf*Vuh$^6#bm2h zKTTO^jbfny;BG%m1r0v{?sZQPk>>7h!RuDYmMQslsoTU`O7PTmu?wT`wkafAFf*xu z7^sm(1E4hfn}JMaTIOco$p|rojmu7I><`7h*Ee?%M`spK3GVgfR2Z6UIM?Hj^pbyu z6Oeznf+|03>bj2w!SU|pW@PL0dc6SGEb^jt09a%2CB!9d_p5KHu;WIpjkzz@N9r$n z0W?-$CkYe+s%ydx8DrRm13U|>)m!Wtj;z^V(MI|dE8?=!(=*73} zYejPY0wXoT)6zen5!CRrnGW-YfaZ~tVwE))zHro&A5j3QbeJQGkV06ht-N#*iro%6 zlwZrXl4sFE|DXGa+~)GaeH1*|KlQMdoN0XY{Nq&daTnGo*Qj~= zsCfn6Eu_3$K*?V&&ItDNIeTfTY9b>opeeQjB=q5|tO^-s!hl^|w4k=v47h+35iMA^ zl0Z8K2)~M|;wej@T#?n0VDNCUjdP^2z6S3RqLI4Dg4k6e_Jo|@rq;cAwIJV>_ z47A#uR)kX?X{i-&7_)we1nd#OdNVDP|0GGioq-ulQE$$KJv^t%Q${Tg?tpX|oS6K5~2_ zX)4@QAKam#*SBcAX?k+el;fJ3?Xs))@G#_Ecgo!s4r_8qjp#omI2e}H6UN# zw~i!|9(Tn2hlhr+zx92Vzgg_zlB`)YeNigl4fE-CZ;o={{W_JheABD&%EBsbHoLc) zM{LcME-4EZ0IS)xm<5d~;n_kLRTi|6%Oo=;E9Gt>V4{P1bc}MdyM50nQ9FJ{j+thn zk{w}%Q-#m_ZAL;jcDbADlp^8tvmq#Gb{Ee7C}W`unws$QuCP{aZOtzwBh$3a^`8cXtUu4+B8JpI6%W)5ib5 z^J<7=gZg!0ajO&H6w1~bs z3&+WpK4{epndVb(5K^a-O0S}LGLzpk==2mP$FW!k3>$~6W~7sFWBSHE*!pI`?{iAJ zQT*oyu2cg!=?HN4T$s6;^5IrS2Yt141z2O4=y+L2f(CUhQ-8fPrigiTS zvPRYGK|C5I-B@DVdPGu>L1Vipj1mcFNC5t14%Ftg#NT>S2`HU_I6C|bis2{jgRBXM ztVbimbo3riAG7uJU+Qgp%pZS@8jSga0@HQlaM7U9i-zF8Q_w31c<&fk4;umWmm`?Q zT#w2x>}aHYHQd8EV%qhi6{(3_=u~EyQr74?A!KAOI5!$X`Y!N><31m>bS`l|HA=uY z;2Nj<&Y)vCmsA>}t;760oucf&BH*e!uwSf?!;K;|Cg9U*$HC68IGSi*15Yq3m>CaD z$$npJ3<4uL4(_rLkxKDMI9~G7cr=3a{TrPySj{vTAtwZRopVBNtoUd(s$lfEt&bm9 z(U|f^vcmxRiRQF!WBpW+Nee~|sN=oNXWDuOnKJ0B2wgpjQ7wukbEv^4eGCeQ?*;3) zznF-AY#?zn7EN4tY+OU;T-9B{Ou=F{vHK5!lNa6!;dZ@W{7)}z!Dk%L754MuBqY&t zoC*CMnMhJu?@_HpsdPG3@W!V&SKpEx{IcB|m4dkp%zOQtDVxo4IEo@pJ%Yw6%n01^^WJFwL8$8Yh;IIP>xHeJ}Uf83CXM*gS<1<^*$cG4!H_ zUjSBBHDiBj?!Jz+FV?a%ymN@bYb2MJHdE-8HJ@y&A?lHIVDyCIjIET-y=Z_mg*Ys0 zeMz?))&`8-qNQ5dJE2g=Pz$Yu;v7^=3^=b=mP_Dr-vGfJev(&JF*iv`Bu#e`Fp9j6 zG?*hX1KSY;k|x>flAaQWx$@N{WY8Ob6TaCOn|b0Thl8<{U{2;jQIcw!?)2bXM1}X} zxiEgt#p987n)Z1`UPl|uey%o?q|);!SB@ND4cBYjdw{aex0(*6j7KEh1)8vmU1Ojf z@N#v542+Pz{(Ys40pLYbmjSR^Ko&=&@ko=1ug#&5FLsKUuU?^H#Q!FB!m!6lG?>8b zNC#&v`DW_!x`e|Lb9}ZBBm)6t#b{!Q$z;%-1dQ|-^Z_4>9kn5i9%HGz0_S>JJU<1H z9t{(aW-cE|&M;V$An`Tb8Amkos%S8$i{qGqurDzq7R*uY*+|X^D?{7OGL8$4ruZLo6v6 zhO10)5+Y}Tz^=T_buBh^X3G@`v0b79sb+)*R00L zM%ZEW*-0{R@mIWn!vWKA5e{`+0K5a{35bA4Fq(J|r^h!0tvSHLM66iJB%36X?lx>e zBSZNW^)+CRvQ*M~|C*>=A*1jJB9R2}HS&_0)OB41Hi~BqVRvkZy1dp5z6@;9# zaiGLTW`|Ki_?sYkUQs3?t%5KtG*D2mxd2t7@SfS1GDL8t}MxL~d4WkSw&`KJacmuCdatc3_7! z5d|EhFZPw;!O&>t72AZwMv71q-jmq1V{c4~@50dRf6O93ixB2Wx^yZUA9n2$F2Rd2 zzE)0NNOnVECIi|pyd0d??tBIh=fIH@ zXD(d1aR<8mKionF4DoOo4=S4Vy)j6^!fkGMi(5V7QBDrRBCaO5SlmVKbH8Rcx!J=G zH)5X#>|DzS#DG4vyjld=0k$}h#@k<shdK6p=HkNKvkc&IRSJR73W>eEb4!`cr%^%2jmDRo8RxMjon! zRg0+UZQga})9ZYDpPxoenk!JGSd3?Gxg$}6q=Mq83uiZFi$jO5*SEg*U9dLoIz)BG z-v=LSr$~X4EO%u(BNfI26*9!i)uGTmdGaIa?wn+^R?SKA(!52>7A#r8@YMatmgv26)04sSP7a^Wy)2! z=e`FXs#K*~jYn$Lsn?)UlV&YiwQ1L((_?g9x;?@0)HBb$(4$wMegl|T1`QcDV$_&% z6DCcWHe=SDm*y>4v}DJqc5J_Z!LZ#6eOctBNFPM6!`_4(apO0Cr!%~re91tAzgF`OVNnqfI!5G7erHQg{R+i^WV z2%|Vjv%Dy)UVktgjVIIDe6d{7MntZPLKUSdDpk~~(WrKd?F1G3gM}HG;1@{J|Mp2U zEXNC?BrEE4HrI5+?C(=+;BNt<--=ls_Zs*M2G^aU0w$ zyBUq~Xl$FoM1GVMj7mb2ki?fpX+|s>&PRQ8g+}u}BwL|nR^Gfsl-$QurZOK3S*MK6 zegWtohOEH^ZF6?Xws<QwN7Pn;rN*IW@&nD^TfFjyd2 zV2bpWYUwLUd1|Sap~uj(?-FwP&rC(%Vr$ISlBVmN4>b~`HycQBTKGX&fYTi$Smwqq z4emKbg%u!~I_u);u$WdjLOk9cc6Il(iP7B{5R)j{a|pv$U*RsmfWhV=pK1s=QYX3vk)hb&Ht*tD7K`?yABWGtDva~ zHKU|5BQRGHWb$(iWJ<|-_^I>h2%tKPsDPq&-R*Q^56lyxz^rttt~k_rj+Aw(_wuNT zjq==sWw>e9IVr8P`<6rJ)NjpZiN4i)e$KheJlt|WtbF8HW)dyx>xCStQES|YL_4R3 zZ8c}AAPp@}SXWR0^|3mdV@6ogD{2 z`B)+hF3FBTY!DmiTR@CVwh@J_x3+tZK`D-02NcdV*CE;r^%7Fvk zM?7x2MY?tNH|Jp6T=zkKYzRxbbKU6H%iA9^3!&Ov!i)M`ZWswPMx(SRjnbYpN_)~M z9i;>22a-uQ?e3N&;+(WPW~5ryS<Xia^>1}=Fa2ZM^I~0jr?}K`ZmT@)m|SG3&}qB3A(3p^ zr(vUKLhsk8mSxSMN^0>j)-;KBR)J{LMdML4LNo@#KKuk($g(@Vj6jY8Awsx7Gyypw zAOr%T0tg;5vozFmUZE`;A}93DRVM!^+c}rxmd)f&5DTfr)@e5}*w6n*e5x_*BB5F`C)2R&>5#yI?}UbtD{?N*dXE0rJj`( zkM6cikYa6>?IUtLr)%jCwzkC59%6J3D-J}+`)Lv9EnAKP zAwsx9GyypwAOr%T0w`W?s!1p9ZedBDcr(24Xc402OC8gK2X*fgnrM5sn7f8kWIc}! z&4}e$JRIJ`LI^IJ@DZYp0p8#YYFr|C5U$z^!$Vf!AuI5Z6?jnZ)&4b~Y)<|0ZV$iz zr7OC-7q!jspA4%lG>la{Zu@zvpC->+nJnAMsp%1tj=t)*oj~zq16b7kN$<_l&VGmI zynOkp-gi(Ods)>@ac(u^GUUq^p`@|Q7Kuo}rLC<>)4FA!iWY_vN^j1G*^?z9!CDnG zsHM#Z)xF0O_K^i|%<5l`0!wk05~gtjI`dU=Td-my(o(hid7O^$6hSkg5Kt!w0d<0i z;HLselN4XEQ#F-CgouPdAS4i7As_@1A{Ou{_ow2zzSuBl3TX=e%`+6O-ZQ*-T*Sl5 z=fQ^VSo%zx2Qtfla{gjVeQ<53OR}jGFN$upqWqzs1t;MIzdG6Q-K99Yb=iM zb~IR09*$WaLD_PM5RniFgao211cV?$!~#xTqKDge;hqVKYCV6|6^Fae<=qVQQHKj3 zAySNK``eUzm3u11I{S*q_OmKr4M;oCo6?g8=*1Vm)=z076_jENpbv!S_Yd(>O z(9q(C_n!*FzGE}biQtGKKjo*=u)^FevCKwot|aS3x}Wo+dX5_ z8RO3Q=X+s!Xg7nOeg|y(9|oMi?E15V+~)tTpU^wXVDN7`kF#*TNM0U1Py2^{2K1b> kZ*N(`w_WDuv-?W7vS!{n{>Qc;E`5@n%>JVs)6)4l0Ff2o=Kufz literal 0 HcmV?d00001 diff --git a/src/assets/icons/Discord.tsx b/src/assets/icons/Discord.tsx new file mode 100644 index 00000000..4e4d5063 --- /dev/null +++ b/src/assets/icons/Discord.tsx @@ -0,0 +1,9 @@ +import SvgIcon, { SvgIconProps } from "@mui/material/SvgIcon"; + +export default function Discord(props: SvgIconProps) { + return ( + + + + ); +} diff --git a/src/components/Auth/AuthLayout.tsx b/src/components/Auth/AuthLayout.tsx index 3d35391f..a095298d 100644 --- a/src/components/Auth/AuthLayout.tsx +++ b/src/components/Auth/AuthLayout.tsx @@ -1,4 +1,11 @@ -import { Paper, Typography, LinearProgress } from "@mui/material"; +import { + Paper, + Typography, + LinearProgress, + Stack, + Link, + LinkProps, +} from "@mui/material"; import { alpha } from "@mui/material/styles"; import BrandedBackground from "assets/BrandedBackground"; import Logo from "assets/Logo"; @@ -7,17 +14,46 @@ import { useAppContext } from "contexts/AppContext"; import { homepage } from "@root/package.json"; export interface IAuthLayoutProps { + hideLogo?: boolean; + title?: React.ReactNode; + description?: React.ReactNode; children: React.ReactNode; loading?: boolean; } -export default function AuthLayout({ children, loading }: IAuthLayoutProps) { +export default function AuthLayout({ + hideLogo, + title, + description, + children, + loading, +}: IAuthLayoutProps) { const { projectId } = useAppContext(); + const linkProps: LinkProps = { + variant: "caption", + color: "text.secondary", + underline: "hover", + target: "_blank", + rel: "noopener noreferrer", + }; + return ( - <> +
+
+ + + +
+ alpha(theme.palette.background.paper, 0.5), backdropFilter: "blur(20px) saturate(150%)", - "--spacing-contents": (theme) => theme.spacing(4), - "& > * + *": { marginTop: "var(--spacing-contents)" }, - + display: "flex", + flexDirection: "column", textAlign: "center", + + "& > :not(style) + :not(style)": { mt: 6 }, } as any } > - - - - - Project: {projectId} - - {children} + {title && ( + + {title} + + )} + {description && ( + + {description} + + )} + + + {children} + {loading && ( )} + + + Project: {projectId} + - + + + + {homepage.split("//").pop()?.replace(/\//g, "")} + + + Discord + + + Twitter + + +
+ + + Docs + + + Privacy + + + Terms + + +
); } diff --git a/src/components/Auth/FirebaseUi.tsx b/src/components/Auth/FirebaseUi.tsx index d66ac82d..e33a625e 100644 --- a/src/components/Auth/FirebaseUi.tsx +++ b/src/components/Auth/FirebaseUi.tsx @@ -17,6 +17,9 @@ const useStyles = makeStyles((theme) => createStyles({ "@global": { ".rowy-firebaseui": { + width: "100%", + minHeight: 48, + "& .firebaseui-container": { backgroundColor: "transparent", color: theme.palette.text.primary, @@ -89,8 +92,12 @@ const useStyles = makeStyles((theme) => maxWidth: "none", minHeight: 48, }, + "& .firebaseui-idp-icon": { + display: "block", + }, "& .firebaseui-idp-text": { ...theme.typography.button, + fontSize: "1rem", paddingLeft: theme.spacing(2), paddingRight: Number(theme.spacing(2).replace("px", "")) + 18, @@ -98,10 +105,10 @@ const useStyles = makeStyles((theme) => width: "100%", textAlign: "center", - [theme.breakpoints.down("sm")]: { - "&.firebaseui-idp-text-long": { display: "none" }, - "&.firebaseui-idp-text-short": { display: "table-cell" }, - }, + // [theme.breakpoints.down("sm")]: { + "&.firebaseui-idp-text-long": { display: "none" }, + "&.firebaseui-idp-text-short": { display: "table-cell" }, + // }, }, "& .firebaseui-idp-google": { @@ -166,15 +173,15 @@ const useStyles = makeStyles((theme) => }, signInText: { - display: "none", - [theme.breakpoints.down("sm")]: { display: "block" }, - + fontSize: "1rem", + display: "block", textAlign: "center", - color: theme.palette.text.primary, - margin: theme.spacing(3, 0, -3), + color: theme.palette.text.secondary, + margin: theme.spacing(-1, 0, -2.5), }, skeleton: { + width: "100%", marginBottom: "calc(var(--spacing-contents) * -1)", "& > *": { @@ -212,13 +219,15 @@ export default function FirebaseUi(props: Partial) { if (!signInOptions) return ( -
- -
+ <> + + Continue with + + +
+ +
+ ); const uiConfig: firebaseui.auth.Config = { @@ -237,7 +246,7 @@ export default function FirebaseUi(props: Partial) { return ( <> - Sign in with + Continue with
diff --git a/src/constants/routes.ts b/src/constants/routes.ts index a246bb99..c84c162d 100644 --- a/src/constants/routes.ts +++ b/src/constants/routes.ts @@ -1,9 +1,12 @@ export enum routes { home = "/", + auth = "/auth", impersonatorAuth = "/impersonatorAuth", jwtAuth = "/jwtAuth", signOut = "/signOut", + signUp = "/signUp", + authSetup = "/authSetup", setup = "/setup", pageNotFound = "/404", diff --git a/src/pages/Auth/ImpersonatorAuth.tsx b/src/pages/Auth/ImpersonatorAuth.tsx index e5e074a6..1f811ffd 100644 --- a/src/pages/Auth/ImpersonatorAuth.tsx +++ b/src/pages/Auth/ImpersonatorAuth.tsx @@ -43,21 +43,27 @@ export default function ImpersonatorAuthPage() { }; return ( - -
- - Admin Authentication - - - Using an admin account, sign in as another user on this project to - test permissions and access controls. - - - Make sure the {name} Run service account has the{" "} - Service Account Token Creator IAM role. - -
- + + + Using an admin account, sign in as another user on this project to + test permissions and access controls. + + + Make sure the {name} Run service account has the{" "} + Service Account Token Creator IAM role. + + + } + > {adminUser === undefined ? ( - - Test Authentication - - + - - - To sign in to {name}, set up Firebase Authentication in the - Firebase Console. - - - - } - /> + + To sign in to {name}, first set up Firebase Authentication in the + Firebase Console. + + } + > + ); } diff --git a/src/pages/Auth/SignOut.tsx b/src/pages/Auth/SignOut.tsx index 45018f34..74bff1f7 100644 --- a/src/pages/Auth/SignOut.tsx +++ b/src/pages/Auth/SignOut.tsx @@ -2,10 +2,8 @@ import { useEffect } from "react"; import { Link } from "react-router-dom"; import { Button } from "@mui/material"; -import CheckIcon from "@mui/icons-material/Check"; import AuthLayout from "components/Auth/AuthLayout"; -import EmptyState from "components/EmptyState"; import { auth } from "../../firebase"; export default function SignOutPage() { @@ -14,16 +12,10 @@ export default function SignOutPage() { }, []); return ( - - - Sign In Again - - } - Icon={CheckIcon} - /> + + ); } diff --git a/src/pages/Auth/SignUp.tsx b/src/pages/Auth/SignUp.tsx new file mode 100644 index 00000000..edc6b485 --- /dev/null +++ b/src/pages/Auth/SignUp.tsx @@ -0,0 +1,122 @@ +import { useLocation } from "react-router-dom"; +import queryString from "query-string"; + +import { useMediaQuery, Stack, Paper, Typography, Button } from "@mui/material"; +import { alpha } from "@mui/material/styles"; +import DiscordIcon from "assets/icons/Discord"; +import TwitterIcon from "@mui/icons-material/Twitter"; + +import Logo from "assets/Logo"; +import AuthLayout from "components/Auth/AuthLayout"; +import FirebaseUi from "components/Auth/FirebaseUi"; +import { homepage } from "@root/package.json"; + +export default function SignUpPage() { + const { search } = useLocation(); + const parsed = queryString.parse(search); + + const uiConfig: firebaseui.auth.Config = {}; + if (typeof parsed.redirect === "string" && parsed.redirect.length > 0) { + uiConfig.signInSuccessUrl = parsed.redirect; + } + + return ( + + + alpha(theme.palette.background.paper, 0.5), + backdropFilter: "blur(20px) saturate(150%)", + + pt: (theme) => `max(env(safe-area-inset-top), ${theme.spacing(8)})`, + pb: (theme) => + `max(env(safe-area-inset-bottom), ${theme.spacing(8)})`, + pl: (theme) => `max(env(safe-area-inset-left), ${theme.spacing(8)})`, + pr: 8, + }} + > + + + + + +
+ + Manage Firestore data in a spreadsheet-like UI + + + Write Cloud Functions effortlessly in the browser + + + Connect to your favorite third party platforms + +
+ + + + + +
+
+ +
+ + Welcome! To join this project, sign in with the email address + {parsed.email ? ( + <> + : {parsed.email} + + ) : ( + " used to invite you." + )} + + } + > + + +
+
+ ); +} diff --git a/src/pages/Auth/index.tsx b/src/pages/Auth/index.tsx index 8fa8ea37..b21e4203 100644 --- a/src/pages/Auth/index.tsx +++ b/src/pages/Auth/index.tsx @@ -14,7 +14,7 @@ export default function AuthPage() { } return ( - + ); diff --git a/src/pages/PageNotFound.tsx b/src/pages/PageNotFound.tsx index cb5ccc94..3c591809 100644 --- a/src/pages/PageNotFound.tsx +++ b/src/pages/PageNotFound.tsx @@ -18,20 +18,15 @@ export default function PageNotFound() { if (!currentUser) return ( - - } - > - {homepage.split("//")[1].replace(/\//g, "")} - - } - /> + + ); diff --git a/src/pages/Setup.tsx b/src/pages/Setup.tsx index 674e14c2..97090780 100644 --- a/src/pages/Setup.tsx +++ b/src/pages/Setup.tsx @@ -246,7 +246,7 @@ export default function SetupPage() { }; return ( - <> +
- +
); } diff --git a/src/space-grotesk.css b/src/space-grotesk.css index 1c168ec0..59ca25d7 100644 --- a/src/space-grotesk.css +++ b/src/space-grotesk.css @@ -5,3 +5,11 @@ font-display: swap; src: url("assets/SpaceGrotesk-Bold.woff2") format("woff2"); } + +@font-face { + font-family: "Space Grotesk"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("assets/SpaceGrotesk-Regular.woff2") format("woff2"); +}