I);2OELy
z#!4wksdcMGsP%j`p3#LfBKt7=rZL|!KpJ~H)ZoksxY{E=`2~@CbQ=pUXFSiaBP?!N!&$IiDixKr_rU{;KcDTzf2^SK$~QF%Yy@`#@q*)rkK
zD`N*`kCU#pQHMYpPsQ61^-o%nXjYbq)|U6xHSLK6U0V`fqwv)NW)B=IyBiFz&kuxk
z56{;&bvBpPc)O9E-TgVhPKXNNxVyO6`?jRFmdS`+XsQ!!s+M=Gk{4|?6z`~zcMxrx
zz3O5)nS5ZumkP6YZnzRBM#hL!*IdADw2Ef!kQkjBPiM8ob_J@Ri8LarsdS3ax|6dq
zs|zypeD>ITr5vX0Z_i>_0aaJk8T7=Wr!ff^O@R6o`kWm^Z;$5xmd{-sD#&{(y0Vhk
zZ2dVERx__jxoGuRy|t0C&H0QhOHTt0b8~__~gudl5S_}+8F8yZ+4we`!jH6hHV
znw|W3Q**qAsTIS*ibk}6qm*vq7LoazX}4u}>bLj=#(TpX2CA4ja==!hNIQC|b)A@t
zyl_6Vv_3h;+#({_sU+MB#3aMWG0uwFsz)t&v<
z57$P;N&ug~PyO&s&5^NIV%@cy=WB1=YU;-Lx`)`?x(0){y^ni{ovk}F5YDA$=r`4t
zXj{mTl+IV#xVj+rIAmn&@qwi?BCR2#CVxdv9e40HY7!-$a6p;O5G7Vql$8o`L1xG0-cc_$_7>qM=`1{&;n
z)d(fu8_k};qUdYe8>^}{yE4OtnMpF9P62@5wdW5HWLkEni+w0BDO^fQev`HGO>izN
z*h-}$l06(}6IS6JVNr6>b>YK_-n0u$>#&Q@O~@r-;iW0;n0()$xPe+QRnx^RW18em
zT`5Ehce0s@3)#}@6lJ|oPn0i8fTN6Aena4csZ#U*b}6lU+3&F^X$X8cSA^9`J#2%P
z&_BkAXdbQz-|z6({9$@jJ(zq+o&EjTzZHP5UO_SJ+c>#!fDg-i*=ssJU<6O&{92>gPXyI0jG)NE$bO1ycsIuT;6mUI`Q1r
zYd}8O5cmH|PSwiU(v0%Q$m4IwW^MjXc4}e}H3RFQWP6pU^UN@2?QCgw=>y55Xe?hf
zyOGHVtM5A((ZryKH4(VYHa=lH8KHZ9+!)vkW`VMYa;wK;OzSk+%wH@CuN{&
zpJq;ix5x9pMBhLyK@~lDG-eSm|7XDYO-nmXVOq+6B+dMgkZ1{`jmfFIz!@+
zz6zrK)nAQknT4MU-~#g>mV2SKh_S;I7nfAi9px0a5@gc()b{fI?5ONW6#XuW{?wD=
zrKjefhc6!TZu|CPZ7S^&?Z6=Y3(Jeh^7cuVtBnjj9a<)ryxE)5li!oYtN;TAN3TsU
z7|bIdA2sCm_m^)oM+rwh`p5)}o}BGhdNltiFjIk`02*dks(|Hq8!5Xq6}o)%j>xr@
z+4%~xJn(!|Sct~_`>p5PtYNaN^!f+d--F)sw;tvI!|SsT3tgUzc(7CfEAi~|zF@>5
z>u%qD_vqfbYxsGK@Jx$z(2Zl6+*)2%SeJt&-4-u7rgKKa%U##iP}$9T#&!0>tYtrj
zlW?^56DTZc_MA0t>Bb>*4^Bgo-!uF8pA@nF&^
zD#_*)6<#VEtJ^1>O-+mKZA~j|ZiPzSr!Swbi8V1iWbuZS8Ur4iD7q5COe+`+9__%j
z>`=gsPqwU2Kz-`KrGc3L2-aef@}j7y@5=gf(_R14^cP)40NW5B1Sj45o2Wa~$VZo#
z=sJpE-Is1%@x_Amjn!_61P~`EilpEd3SnHdra{h^0jq9wU^<^}~t=3>m
zJ(Q!Gxt1Tm`fbDd$yW=!(A`GGLg!W#FDzKO%Gk<6Pl|VNn<{U(w=1^`aY5Woy2%|f
zSMHVj*?WRa=IMF){l)}qQ0
z_^6K2#$^$C(bq1+N99PnnDJhSxp%AGpuS3dy4o{|-00T6y~bu*wvjIqtu`(Y#22j(
ztNe_Hc#jXX)4S#&tIL9)oB~cuRm{&eE*0d-UFYzNjH{r$CaJ78?r$AEkf%vk^2shD
zAB(m{SLZY~n{wBLuG&dZWL@6N4}}m4hBXmIBDscl32YFN*XZXz3;aV9wt8vk}F(fwR*G5EetCQz6zN8Y3^6Vo(
zY`KQ=TJ0UL>HW^XX90jWe-cv$;NwF6zkTA&X+gAnqRS%L9jNy?yCPr+lSY_hJP_Qv4p<
zPuxqSjhGWdqDAP$-_ln-)=pvUbnKy%;xw~VRw{_CKOOH!ST$dKZ9}O|k5f~Zn#pkA
zu_1zIYbz5}Wf|*mlUyZgYeyY;YjVz$IMSJpCcfNYmfPnKlBvk1i*FjB*mjZ1FHre8
zQs{`S-XQiTQm>#?iy`qSjkIK%DMC|;ai%g(3Szt_n?=kr9xddBgyd*QbD<$GY5E{E
z6VQ{xcv{M6jScmcr5ytVCo859k@h8-6t^oe&@J3DnyCb@uIERgsbGY$OqBMzPf}WQiJ!FW_l8Qe3CIu5)(uucmmB-}
z#!s2GU3C2m)HW<&lIA$Y@T@P!F9qqL^b>nebk%6POf7-)R+;+q;zB=?)se^G3Xh-d+)2M7Tr6_8?!2LiAP
z2&g^q(wkZcgofk{oC(P82w|Qab(9&qqe%%b#9((G2W4?yd41=(=YVY(0Y%TFUMqDNV%HT
zcTV~dlFSm+`^SGh2NxgQ4IxKH2%++IPDfx)WPl>_%>m8re#M9yVHBWX5-F7uQqmzc
zYE(#$!GMuzK+B*vR4P;~Flk9U{qOf{cK*IAwqjDDC8jfk3dQ5aJ4s&d3sj+0(3+L8
zsJ9Ic@bxqRj&xcxvSgUiN)JRew|CV8t#)Pm?h-cWfCbY?Nhc*m^8`hE-+xD?YzO}N
z{^zvdk_cT_S);p6e;ASQsP_Dvno$IIJPP~&ud{4*hrL0Ea1?f#qTRD)xK2@}sH7)p
zwEus3j0^TGkw#1M%$%$}i*mpV*ae6x9D9M#U63o}lA%kPlcGu6Wy=u5Kecq0&C62y
zr`uBH35js)r1tmjSqQ8Ox4tNr0@=PAmhLV|o7MYc2siA6g8NFuZ(SHmdv&O3N)_8x`9M{L4Id(#c
z3z{8YwcEC0vlXzvg8bqL0_S?)r7j1T7=d!hgCLtjg+6M6A3#Kh
zpCCF%&NA_QtHgS*UWZ%28iY5ltr+*4b~#@?m?V$uM=|ElJ!Af4XnM`=Q7msz>cweWb83^3quL3f!KN5LMx*6%ltBZT*i@~(q=Qg!5vl1
zQ)EAEqh2>IUwvJtM?k*NIa1o#d0llxZ_&-FC-abLK60?1`tAY}&GI$6N2b_rXV>eD}jo
zzx;+!%%?Dv@l!#dM$i&L2)+~|g(n3Oc8e#PHY65)fFgc+Ez|Ec1A!sV!xGl{ZQ5er
zD-P{&7M7E-@`fr_qw;v#n7|~aFpU{`IhUC_>OL-$-+r$>Ov4eMbj}Q2WPx9w{
zSbD>Lh1aN?(hx9qHQ#|PjB2VM&<6zQ9AB=Q|4i)VO_7g!A31BVB@
z?$b@6-wp#{i1VrrFfJnDo`nJ{jVH-R0Pdt9%cOX0c-Y|e6&chlx*uW;X
zu#KJBqZ#35M}{L_IF=cE2j1fYKH^g#7Eh)jpd3}Gp;++-Z}0|h@J1n!oiQP1FwbvU
z65H}PV)rg$@4*Lr#HYnaJDOwcde5;HXq>r4t1sLW8^x%1x%~U;!ImUIXsoDfVl3O}4_6j&?-k5CBzK@)Wn
z#u;*0DN;wEN8dh%qJxa1hg@LgFdK<*h#uv{#W7jY<4RRIq2{j=#_W*v)+g4!`^^!G
z0tWW5hXdw7j8Me1&vEfOA;d{xNr;W4*hxu{tPpbIrzlQJVxz46RJ50>c&Leky13~H
z=bTvRR|H}lfH#<93mBFN&8or@?*Kl-8Y2Q{v2qcYEYGrIZR}A_<-pFBiBzR3A;TPq
zTNE*F2FmR3c-=M!Yu;0cXBM$pk|>8|FX3!N1#H@Z_x3i%JD;HUHL?0x-$N(7@NV$q
z)rugg1Nc2oY@nQ0k0R3VA#VdkUWIbD!bRZ#HdqmW4{q4uNyM=s#Ci1yZJ@zypjjh?
ztvJ|MuoOD*z;AF$MJU-q$+?XvRzi?ec;SZ^{tbSkctHT?QFMZW6?Vgt?2rkOpktl?
z>>DijI`5x4)`K8|2>P0Y?bP#w1A+X1>%4;ObNzhWp+upobJMv&5rIHIH`tR1eYXxt
zaO1+B*65|;`)O?Ql&RB%Zon|t?|W(%(1B&oqxFOk!M!c43@pGTqY#
zSsZRMYIW54)q+64->z_2uzoWr-_)Eg519!TfE9FNWni`k2GqO6TEtG<#);u&xhp
z;QSxR|0cJwSm3etFuup!nGCueckdqGh8~m&GZAeNNSx8A6UT0!7AQ?P0u96d`0Jnl
z2*5LeASl@HAe0ImZo1_F0fP3}Yo9^pA^cFvU|efG4G|@Bp(_P{1Gqne2}%(**R^ZY
zfv!`RZasRT#A4GYR+w=81~4!Ux&eVGfZ~M+g(w^f3co`DmBR+X5qz|v2&mx*5`i%x
zK^_I47k|C_P7mvybHl5+|2(rzG(b7gto55~l+7WKd7~RS@?b%~t;>Q~N6n~jxVQoQ
zTuQpEY7;mZ>lVZQ-)8!t3G(j)|G?>=iULBAy8&(YPA4>jXjiCW4H8N9VeOp@-LNV5ZTk??Vc~J#)k1rP4j#3PkW#TCzqLU)M+xKzP(l6$
z>5%fP@pt$n1w@AwBC5hrhn_9idnZ(NXl`EDDkyh6sWYzAf_HkIAZ`2a^
z!pX)wDsSKX6sewh?uA85(xh9qV%3^;FOg-Gy$=bBOrL%6)i>W|`2m4~hsyu391snF
zG6DDtEd36wc_cvF9+a;Ex=NJ#m?N;zkX)1sRChE~s@X%8h1O<+a#WilK#in~hS(i1
zF9cqQ1PWt0##;olqXCc_r4*fuL}gS+9Sr*rqBqGfEv+8Ri#G3$=7aP4eNN%C0%sF|
zyKaS7xCORs-C&T$5Ja@uRk0bn?nD(`P=C;iPt73J40D7We~~}PrlNy4UL6B
z4cJQRrgTD+g$}?jj?JK~v^1`hese3CV?F~P4y&93U&Xx2TuCo$!Z0;VuNbOi^O#G0
z+Kf5)`Bd5jL?*q9+?jVSOP>iDQSJT&i@C?UPgZIU?DvyMnu_JnF1;l6XDb#3gJb|RRe
z4Qa5BSNPt$FhSK5sA^mLd^;3Q#lAEn(~=fHXc9)Yi)%<2$e~Vv!kO}3TU!euh@X?R
zsZdRZ7ei)3b$CyJTF^!_8W8u#t#dVKa2%Fw^t=o2mQjtV7&*N>n-0xJ6w|19^-&^O
zdy+<2kOO<&Iw7xkvtf(#otj*N0tH&`h8f~I=8)lJwGUYewpj6?pxa5DYfdXvr$9-&
z@+Xtgxt7E{r-NVrAL&;A4U->6zt8m4PR6JHKR5Mp))Jk3aQy4n#~;KboYQS}fkh>>
zJI!6S?X_QRDxwPb(*D!I(80=GzdoWRUFrp(RIlV@HS6ODO8G|@eQq4FG9!T-!d-GV
z1Wp)P)Tl2cT-65mN2L%xsd`zQ@oC4$P{^}!u^W19Uc9g>^$&Z>9(CdQxB%cU9NTOT@fB>1y3R?
zoG(ZlHTt8LCE@9e=2J@MoE{5hE_nrS-3|93e=?4GMTbyld-N%AXG&RgbDMrb~C02IQt%DIUi
z=QN^ayHPZE8g}V_WiAF0EWf$hsJ*U1hqxr}5%OZH+thcQ_F|y!J!n}FH+E~I06A7R
zlT~@RGtpfVRy5$zQc3OaRrMDB=z}T$
zyN50fN*=*tgSD7?_5fv4jEz^9dK%%9^O~G1oNNsR(
z8@9IK)wKjD0p1PQmV{Up*i3OXb5of?85R>bjyvz!eGjX=vfzHQ3yh#Fp`NS_A(hS#
zp<_v1oPEAwT+33L2bv~>Q`#}-7-Hqe;3&L$1Cyu>p}q(CC$?w^c|=Qcs378QNgGSJ
z%1)b01+Mo?1*a%+(HtUF^L8EeRp7%J#n4WF&chyed*rc{VZnyUj8ZG`fTj?}`p&5(
zL3nYwX0;E+TO-y={?%?h&PN)Sz3SKVt-^2D4EBlYO?WUFge^?*G*3~KfYO!id
zn51Q#se83cuhJ{WnJedY*CEWCy=d$6|1d>g*N!$gplbcEG=a7V+=MBwW
zRlasnh^eRiaN}Vruf`_iY24!1&3@TQ=(N3x>&N=y+)_vfDIdG#ID#X0je__vTC!mX
z!TGRI7siuayEBQlcl7S|p+R{i5udm8P2&2Utc-HzrRcm$+2Z)oGJ*ONjLENi=TeoXzqm0swbr_{;YQ^y
zH1#K@Q+chO^TR>lhFOybWt|q#c*6=5(O#8h6E)v;C?KN=$Gno1sdTaaye{d(Mvu!o
zMg5+>_`?FVi1rmF5pwuoCRqD;7jfR=P!_=v_bt%Xct5Z11=`0+xa&tYY=XdX=
z0oxevv>@i7;Uv$Byt-E@rFYT%{g?ES9$J8ifX|&-VaFj{;Fel`){T?c!c67nbc{f$
z6JWCbm+uAx0ikaa-sa9rPJm_MP0@>d&mQ%%9*sCt5N9+vR5Zf8z$iztr8too?+{D$2VU#wL*BvgHk&h}
z865tU@;ct3Zr|&;mic>Cx4dc*{CJe&K|VRkDJh{$
zW?pmje*M*34;uJh6fZUkGGE^v$VtCOib{wLx|kL%<u2hS-$IvK-XWO}7YI
zgoTczw2iusr=78dYY=cREkQwdCA{o|eX4<2NO=VF10o^x(AKx=kh_^!NUFg*>&Qyrzw$)fUc5v+7;jt7
z>U1Jdyi~?vf-BCMain{1yaSwk$yw4-a))`x{SV#DgmhtFediQ(R%36zx5o@{9NsD2
z0h*f>jnp9}(N4+%dVH-IPP_&*F9+%^sl3@;kweRT*IGLJ_Vv;kl+pml>(s}z+~fsh
z>BJk#Dm63h5$Yv8V?GF{H1SRz0$FDIcgf&Hs~T%kW`0;!SyeV;2KD{f?bq|2Pk2wH
zH@twoo-))Fq&S@f|Fc|5D5L$)#@O8Mvr*UBPQTMpqA4Ah#{c&fu++y4E6z+L=TK8G
zRb~_*R8Vx^oh_ZUU|N(0o*4T$as2bt#H=mceP+1us@3Flw!b=MY8SV<_6hZT8jOk-@8vIh3hLu>fuv@4$xx}Z!Kj=6R_;Ii
zvw9;k>1L>un`Ce^ap3ink>NK_Si@XnE6RVBl>R8lNlhut<@MShNG68|r%{&ED9f2t
zkX=tw(yg;}OJv4*uTlzvc5lZ~p8n9@qtI+dw!j>#I=+Gay2bm`xhnLirBPq?%b3_g
zW_fY$FtDVC{u!4Qjw_HAjvWWJD-zoE+M3#R+92JPRfM`F?;cwq?;bY{Ugb!nbf&Ro
z3fa;n&@V93?_yklBLk^lpX|H&aJI9fzL^+cU|u$?x{iPL5bM9Oe|)m1cTlcT-YUz&
zC^vtbaEI$^H0oBN--S!3%+zI161ECMsVmrSLfW}f)0wlA-BD~`*}v0>V#5y{dQNv8
zBR#$&?f1)PwX1=BKRaQmFYev@pPno2*EH8cICIQP?No!jkGkN+zr|}tl)VMj2k{=1
zxJi)-dXvZkeWGjM`|nNA3|RW&+jnEb7sIMNPelk(29n1AuIwl_aj20ivSL{dYm|#5
zmLw3PsYKdAFiD=uB
zj;4C14g;1>u9^Jg2`0lshJJWodKX_qi7YaE$xy~ma6@3{@WQaXkjTg+7eLh46`>(w
zy`+Kug(@B}PlA#9<$6aAhe^w%5r}%UmLSzjA7Od$>-B?YAD5a>
z;`1IJBUZPm_!l3aAuum!eoRwmX{5KYHWer$cl{pbYq7Pob+9$jG#73m=zIKwefRlM
zUju$WJj`I;=0g1eUnOO)9~t}JbA6tf$8UVMsj{!Ql9!osr7{=g1?Gh2N9j`0*67egJA?=9?W>7f2=JwvmI6
znCL5?ibZXCzGT~0+KcEf=UYwLhPi__iucFMGsAa-^YHO4fCGkFa8}mpN%R2bX8zsG
zezWFztLC2c!n>fB;#nBQV&8#rifA173|hj7!I7GzlMNQBQzySlS8On^Q!{UL&
z1cx|c0Py!H_bVPylP>x$r>?1OIY>BsCP-ePY3K-yFJaN~)>E(dh&1q|Uy)&@OM%<{IgRjb32PhWn8cd@^F$eCC)FZ?^liD+C$Jz}KUU&4{a<
zM)p6fGB}9U#{XT;q%HAC|KqHQ{3xwm8+*w3waQ_zbkxdB3lT
zk4%KbvoZktycr)ALY)~~7sU;r`zs$&nk9*BL2Ojv-gw7#OE4BFQh&3id{5
z;$~^HwOaC;T0(Ip27G$)3B_5p6SN5&$Rq^>BtB^GnTGLU#^AT(1BgRe)qgeOdn2Q62^cU5_S)AAJe*r{UpcKv>BJh=TL;ZTA;&O47gjxK=?JQiDO;d
z?y>B-uzP#|eQi+^UAl7>1|Ghj&!7K1d!uLVx-^)6X02g9%`~_q*HmbD^pvTkze^ob
z*MFC4Ox5V9`#ECl66OlctxYh`Kgv;ToPi$>!xXQ=XcoH;Y{JAeZQm~ARhRJ8fyJZq
zGY9EH>x`9R!J$Xk;-x56Jlci>Szc7AIV?dHzS<;OIt6jXvn*b#uEV3JzPz2jwe+ZS
zC?GK|*e|&}0gu+G2Hg)KHK`Bo)g-59B$KnUeJW??f-e`8Bxe*9S4WMF*F+bUrcz4E
z125km_pZsMrDiCj;^Ih;#$wjTVnZIr*}=x6Lqf-*?yUj{ckh!eSqQp^P0+oj8?UQ9
zqOBgUeoZ}rMIPf%p@4G_bI&yM8x!>NJ8m+pbfxq&yqeIH8zIwY^%S#0?lO>+?vg6X
zwQx849N+tDy^=#gP8Gq-URy1xa~WO@Y*WiS=(W3ygvJVLZXL-(@2nYF^RQWyeu$e=
z(%}~SJx2S@2u5Cd=j6@Ov<_ULoA6nB>Dgrw0cY)arJ=-jXg`(WRn_}sUEWq#Q+?xM
zUl9G)!^*nWE5!w#E>?~%0hw{3(TiERI5}B*|4VJFJw~{u$$M?{oj_YlwJ@QfzK-u|
z%~4YGEYsd-GRbg~X+JyBZEJLYa>8h?*B1PSJFU-KCq*U4`2;sawGrhq;`L1BW$V~|
zT9Y%=%X7)9?)%IgV^7;2XXb`jfStOm3#hC`G4bj38esp_dyF)RW_oq?d`(rtZLL*8
zeDzPDp)VFW7x>GYQWD}WX~sxHxta}@C;t&ch})Hf?zmK?kJxG{7@DYhWr575U>&Uv
z@W+OIiz@wn3o88l3yOXHii`gVC>WkoQZ_VFIBR4|G%|z}g*L=eVohUBa%pmPBR~IV
zoiZJ0sjwxU-beJ-lm4T6{@i(`YEnZXzC1C=*WcgLv?GrOJVh6+jPzBd#COjr8OfZi
z_P87ypII60dsfduYj4pBntyXVCGA>5K#jPmiq1I$71_{A#18l-VU=C97zE^$W8m_|
z%J3<*QX!^tBc9|$ZYeZ3SlG^%2FQ4;E&Sid3#|XPH~~wCf~S9)JXR&IlXBruciH{|
z_u3E|&fm;NR`SeGcl?obcvn$v|3op#Bb)#%S3PS6M=L4^hZ~G)nIm#HN3LDQdbx#K
zS-OzCO+DR0EibqRB5rWL5&TXhx<>R5vw83bhLHlj;zJx6NZsn~{_%zB?)KX2#1Ji$
zf??HMii)49ix?3CVO(x7siIU-(9jB#yFdy(B0x0ZV7x5E00&Es2h+Ey)1T
zW!T=Id&TS-@2X9>G^;0TZ>?d-eIbK3D#1vmM$d_ah^g`A=5jRKp@3-(!a
zRxUpNcF#q@bd?{Q(XDB{=A6?w*j8G--oCVA9S|7n>qiZ|&`+R!>=_K}u#mP;H*L4^
zd$#k=bG?8PiW+f7fI18!~+1bwu4LpWYQXTrF6l>neU(dRcWZ;QQ
z<=n%OW#E)wf2%ROVJs=3Y;6FvAKGmVY`H4sN6&Ur4obr$ekgQ^exYOktY*=IoKG4Q
z#(UoxE!V7x`@2HP^R*T+EQy;C%xFzOa$)4O7j)%eW2r_UzHvcp%K+VGqK+N6W^
znzPg~6hcx*+m^T^ObS(ji>;_1WM}H
zj61>Vo@ySGA>>6C$$ta*{@N$h%-Y9ueRWT>GU^w!??3h|zATW*wLgJU3{qb2*vgBW
zi<-+hzH*0vNJNrtT)3lCY(!gZ%s_06k+r0@j$ZjqYW7C~ZcDt#y
z9Xweh9fu2uraB)Db5#;Pa#~SG9C)_){Pdj?Q3aHN@QZF!z*;2etM8PIqUH6cfT!Ce
zWbgMia7aYuM>4#;J!T;LjIX`}1y#miTqSxuT-4BRLgv)~xBGyc5)0QI*Zx{
z2D&&01=+zNQ6xJ@ER|0zEeE*5dY9@hGZ)E0a^Z5I&%a$HpZl;p;ZPEKwEMxeaBpG0
z+NeX(KMo$lvUkOIWp*WWv0@J%{_Iaa%vVno3A#$3#SUIdNXkqCwM}7arW}=$>98+^
zmP^YG+2`v1?*Esi8@-IV~OPQBf2cpmS1zJ@>&ZR%7Z;d
z7&*M=AQiO87Al|bbvNzUJ0T~v&!JYfLT&Dqigs#FX)97yg&WRFM|XFR
zQq#~qfS=v?e+bM@1*8NtS2ssty`!=9al0$R>=2wHoxhysEYPfZ&?qUF5))sWM~-Po
zz7#kV3fJo}$R9<#O@VUM*DUzHQ6<$-GMs2uODtmwFpRdGco3JZE|MiRaBu`RW_g7
zrIJ+l*lL%P=Tt3CLyMWJ%6Us2EkhGf+sNRUr~z}sZtq8BrBk;JmkwY0_d@lFTmSr>
z>B$Q}j;j}I^@~3M8zcMyFe2pl6Xv+bN)H^KB_{sbfBxCEp_~6gf8A2B>%t#AVYlat
zUDoXS*bATg>E*E+`@A7DJPwL=qOBeth|*bll>t9>kS>+Zx%L4V|7)f>x$5GtW_XoO
zFk2crpucR%QCVof-D-e$D;V&1tahM`KnLY^Z?2nLEZuh6F57K;QoYyU?EeR5|3NbX
zj{vHd*Ve{FgI($_sZh|m5o^fJHM5*&B9uS+`)M*u3-i$8_-xF2nBO^hsq1%WgB!83
z++0QD{>Bk^b!&7Z$h*0zIqqLbkipCEARDJFLea{$uL(ET>%~0Vp_*ZR9WV(>-u6z1
zLghv*rkiVg+~1d=W&x$DCyp!tk%PJyd>Z7Q-;C#-jmi0Kud$t_`HDU0(~X8T^b;Z&
zLd{B>1Zg|oVBB9W)IHt5)D1*@<%wPwOXR`ZXsZ@DQzr$>;M}v8xTGz^nYzT5Q}akD
z3-+Fvvi8`d?fr>W-kQANY|a6kd;Nb72VkdwqYOdzu(xYpvNl*F3;l;^F#gC-)jQK}
zxWTafx`1AIEN{LK@?Vo*S76h1a$z~Fec(l<)vI>TuB=AaUe=&r+uNB7UPExp-}gaR
z3bo}_5&7clGsW^9=`uL*QEh^SJOJE~UuVt(3Z=3Pb~^K&Q>yzwj52>aN7e{z?AG2#
zImb1avD&(AxbsV~9z3x(BiK8IypwQY$Jv5%P46dKjucK*pM#*UH7eZ7L^=(>!OJIK
z)T@i9eOxnW`;FS*X8FGg;_|p39h4*S
z(U_J|A#M1L8?+~y6nHMqs{vrE{w6q4<#Xip>VCdyrkn+zvxD;7EOHXW8T~)p1j;V>
z{@=rv7;Jf;J}w*7&-xpVoQshg0BX#3=@TfvvzQ%JWWj~=pL7k>xZY=k{T1CCp&V6t
z+a?(L>BoV#Lm%hzJo^cgkE@U9bQO^i2W7HU@07+wYPMJZ(LZ1ru*2N)2v9ay#l7&l
z>A6*Z$M2f}@ZwLr5&*mt7Qg*E@ONRBn!(BJ&gP}H
z{%vp7vK;CP4W+#mHHm`mBER{`dwKKOH>8(oVwL1z%VfF=94hie%K>@S7~we<23p_@
z7s#UmX)r-ZvAxy@+?xWT*pw#AYw^=s(h=OY1
zgydtbb~H~FOo^!#&q3fM$Zk@cCY9@`ao$r@TLQQ7l^q}D#BL4^7wI2WjcA}Y|L5xR
zINICUTz9WRXmP8tHb0cQN_arS>H6KtIzv#HUDeiHpLJmK^-!r%K5BF0Hw_$b534VW
zJ6SwB>M+7|=n^NN{!lnhmE!oNa;)e3
z(dB-|HJ5fVXHwkogSZa~dwS%1Vh9mi*5Z?%B{nEOoIq_bf?gC}4L7Ioxosj_n(SSyf6)Xf`87NR2!a;z^
zMQBK41#mpj?T_H#vOfwJ|6Fu`E(Z3;5)-{Y&OtS+%f$+ljyu62F(f}9-*6!rDQQzJ
zq#vxRpXeQE800Czv=R_Q7S|qg3MsA-7qI(fGGAYbY1cipg
zAlb7jNJc;FXH4RE3hoXMQI<5NQB0!1Laf`<*IS}7(u8Ef&vPP(u;!OEHq_BGwRA!p
ON3B$ub4ks;IsgFgYn-P5
literal 0
HcmV?d00001
diff --git a/web/berry/src/assets/images/icons/lark.svg b/web/berry/src/assets/images/icons/lark.svg
new file mode 100644
index 00000000..239e1bef
--- /dev/null
+++ b/web/berry/src/assets/images/icons/lark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/web/berry/src/assets/images/logo-white.svg b/web/berry/src/assets/images/logo-white.svg
new file mode 100644
index 00000000..d6289b9a
--- /dev/null
+++ b/web/berry/src/assets/images/logo-white.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/web/berry/src/assets/scss/_themes-vars.module.scss b/web/berry/src/assets/scss/_themes-vars.module.scss
index a470b033..661bb6c6 100644
--- a/web/berry/src/assets/scss/_themes-vars.module.scss
+++ b/web/berry/src/assets/scss/_themes-vars.module.scss
@@ -46,11 +46,16 @@ $grey600: #4b5565;
$grey700: #364152;
$grey900: #121926;
+$tableBackground: #f4f6f8;
+$tableBorderBottom: #f1f3f4;
+
// ==============================|| DARK THEME VARIANTS ||============================== //
// paper & background
$darkBackground: #1a223f; // level 3
$darkPaper: #111936; // level 4
+$darkDivider: rgba(227, 232, 239, 0.2);
+$darkSelectedBack : rgba(124, 77, 255, 0.15);
// dark 800 & 900
$darkLevel1: #29314f; // level 1
@@ -154,4 +159,9 @@ $darkTextSecondary: #8492c4;
darkSecondaryDark: $darkSecondaryDark;
darkSecondary200: $darkSecondary200;
darkSecondary800: $darkSecondary800;
+
+ darkDivider: $darkDivider;
+ darkSelectedBack: $darkSelectedBack;
+ tableBackground: $tableBackground;
+ tableBorderBottom: $tableBorderBottom;
}
diff --git a/web/berry/src/assets/scss/fonts.scss b/web/berry/src/assets/scss/fonts.scss
new file mode 100644
index 00000000..c792aab2
--- /dev/null
+++ b/web/berry/src/assets/scss/fonts.scss
@@ -0,0 +1,32 @@
+
+/* roboto-regular */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Roboto'), url('../fonts/roboto-regular.woff2') format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+ }
+
+ /* roboto-500 */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: local('Roboto'), url('../fonts/roboto-500.woff2') format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+
+
+/* roboto-700 */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: local('Roboto'), url('../fonts/roboto-700.woff2') format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+
\ No newline at end of file
diff --git a/web/berry/src/assets/scss/style.scss b/web/berry/src/assets/scss/style.scss
index 17d566e6..5d2d8975 100644
--- a/web/berry/src/assets/scss/style.scss
+++ b/web/berry/src/assets/scss/style.scss
@@ -1,3 +1,4 @@
+@import 'fonts.scss';
// color variants
@import 'themes-vars.module.scss';
diff --git a/web/berry/src/hooks/useLogin.js b/web/berry/src/hooks/useLogin.js
index 53626577..39d8b407 100644
--- a/web/berry/src/hooks/useLogin.js
+++ b/web/berry/src/hooks/useLogin.js
@@ -48,6 +48,28 @@ const useLogin = () => {
}
};
+ const larkLogin = async (code, state) => {
+ try {
+ const res = await API.get(`/api/oauth/lark?code=${code}&state=${state}`);
+ const { success, message, data } = res.data;
+ if (success) {
+ if (message === 'bind') {
+ showSuccess('绑定成功!');
+ navigate('/panel');
+ } else {
+ dispatch({ type: LOGIN, payload: data });
+ localStorage.setItem('user', JSON.stringify(data));
+ showSuccess('登录成功!');
+ navigate('/panel');
+ }
+ }
+ return { success, message };
+ } catch (err) {
+ // 请求失败,设置错误信息
+ return { success: false, message: '' };
+ }
+ };
+
const wechatLogin = async (code) => {
try {
const res = await API.get(`/api/oauth/wechat?code=${code}`);
@@ -72,7 +94,7 @@ const useLogin = () => {
navigate('/');
};
- return { login, logout, githubLogin, wechatLogin };
+ return { login, logout, githubLogin, wechatLogin, larkLogin };
};
export default useLogin;
diff --git a/web/berry/src/layout/MainLayout/Header/ProfileSection/index.js b/web/berry/src/layout/MainLayout/Header/ProfileSection/index.js
index 3e351254..e1392dc0 100644
--- a/web/berry/src/layout/MainLayout/Header/ProfileSection/index.js
+++ b/web/berry/src/layout/MainLayout/Header/ProfileSection/index.js
@@ -71,8 +71,8 @@ const ProfileSection = () => {
alignItems: 'center',
borderRadius: '27px',
transition: 'all .2s ease-in-out',
- borderColor: theme.palette.primary.light,
- backgroundColor: theme.palette.primary.light,
+ borderColor: theme.typography.menuChip.background,
+ backgroundColor: theme.typography.menuChip.background,
'&[aria-controls="menu-list-grow"], &:hover': {
borderColor: theme.palette.primary.main,
background: `${theme.palette.primary.main}!important`,
diff --git a/web/berry/src/layout/MainLayout/Header/index.js b/web/berry/src/layout/MainLayout/Header/index.js
index 51d40c75..8fd9c950 100644
--- a/web/berry/src/layout/MainLayout/Header/index.js
+++ b/web/berry/src/layout/MainLayout/Header/index.js
@@ -7,6 +7,7 @@ import { Avatar, Box, ButtonBase } from '@mui/material';
// project imports
import LogoSection from '../LogoSection';
import ProfileSection from './ProfileSection';
+import ThemeButton from 'ui-component/ThemeButton';
// assets
import { IconMenu2 } from '@tabler/icons-react';
@@ -37,9 +38,8 @@ const Header = ({ handleLeftDrawerToggle }) => {
sx={{
...theme.typography.commonAvatar,
...theme.typography.mediumAvatar,
+ ...theme.typography.menuButton,
transition: 'all .2s ease-in-out',
- background: theme.palette.secondary.light,
- color: theme.palette.secondary.dark,
'&:hover': {
background: theme.palette.secondary.dark,
color: theme.palette.secondary.light
@@ -55,7 +55,7 @@ const Header = ({ handleLeftDrawerToggle }) => {
-
+
>
);
diff --git a/web/berry/src/layout/MainLayout/Sidebar/MenuCard/index.js b/web/berry/src/layout/MainLayout/Sidebar/MenuCard/index.js
index 16b13231..dadd3eca 100644
--- a/web/berry/src/layout/MainLayout/Sidebar/MenuCard/index.js
+++ b/web/berry/src/layout/MainLayout/Sidebar/MenuCard/index.js
@@ -36,7 +36,7 @@ import { useNavigate } from 'react-router-dom';
// }));
const CardStyle = styled(Card)(({ theme }) => ({
- background: theme.palette.primary.light,
+ background: theme.typography.menuChip.background,
marginBottom: '22px',
overflow: 'hidden',
position: 'relative',
@@ -121,7 +121,6 @@ const MenuCard = () => {
/>
- {/* */}
);
diff --git a/web/berry/src/layout/MainLayout/Sidebar/index.js b/web/berry/src/layout/MainLayout/Sidebar/index.js
index e3c6d12d..10652ba6 100644
--- a/web/berry/src/layout/MainLayout/Sidebar/index.js
+++ b/web/berry/src/layout/MainLayout/Sidebar/index.js
@@ -39,7 +39,13 @@ const Sidebar = ({ drawerOpen, drawerToggle, window }) => {
-
+
@@ -48,7 +54,13 @@ const Sidebar = ({ drawerOpen, drawerToggle, window }) => {
-
+
diff --git a/web/berry/src/layout/MinimalLayout/Header/index.js b/web/berry/src/layout/MinimalLayout/Header/index.js
index 4f61da60..feaeb603 100644
--- a/web/berry/src/layout/MinimalLayout/Header/index.js
+++ b/web/berry/src/layout/MinimalLayout/Header/index.js
@@ -1,10 +1,30 @@
// material-ui
-import { useTheme } from "@mui/material/styles";
-import { Box, Button, Stack } from "@mui/material";
-import LogoSection from "layout/MainLayout/LogoSection";
-import { Link } from "react-router-dom";
-import { useLocation } from "react-router-dom";
-import { useSelector } from "react-redux";
+import { useState } from 'react';
+import { useTheme } from '@mui/material/styles';
+import {
+ Box,
+ Button,
+ Stack,
+ Popper,
+ IconButton,
+ List,
+ ListItemButton,
+ Paper,
+ ListItemText,
+ Typography,
+ Divider,
+ ClickAwayListener
+} from '@mui/material';
+import LogoSection from 'layout/MainLayout/LogoSection';
+import { Link } from 'react-router-dom';
+import { useLocation } from 'react-router-dom';
+import { useSelector } from 'react-redux';
+import ThemeButton from 'ui-component/ThemeButton';
+import ProfileSection from 'layout/MainLayout/Header/ProfileSection';
+import { IconMenu2 } from '@tabler/icons-react';
+import Transitions from 'ui-component/extended/Transitions';
+import MainCard from 'ui-component/cards/MainCard';
+import { useMediaQuery } from '@mui/material';
// ==============================|| MAIN NAVBAR / HEADER ||============================== //
@@ -12,16 +32,26 @@ const Header = () => {
const theme = useTheme();
const { pathname } = useLocation();
const account = useSelector((state) => state.account);
+ const [open, setOpen] = useState(null);
+ const isMobile = useMediaQuery(theme.breakpoints.down('sm'));
+
+ const handleOpenMenu = (event) => {
+ setOpen(open ? null : event.currentTarget);
+ };
+
+ const handleCloseMenu = () => {
+ setOpen(null);
+ };
return (
<>
@@ -31,43 +61,99 @@ const Header = () => {
-
-
-
- {account.user ? (
-
+
+ {isMobile ? (
+ <>
+
+
+
+
+ >
) : (
-
+ <>
+
+
+
+ {account.user ? (
+ <>
+
+
+ >
+ ) : (
+
+ )}
+ >
)}
+
+
+ {({ TransitionProps }) => (
+
+
+
+
+
+
+ 首页} />
+
+
+
+ 关于} />
+
+
+ {account.user ? (
+
+ 控制台
+
+ ) : (
+
+ 登录
+
+ )}
+
+
+
+
+
+ )}
+
>
);
};
diff --git a/web/berry/src/layout/MinimalLayout/index.js b/web/berry/src/layout/MinimalLayout/index.js
index c2919c6d..81047fd1 100644
--- a/web/berry/src/layout/MinimalLayout/index.js
+++ b/web/berry/src/layout/MinimalLayout/index.js
@@ -1,6 +1,6 @@
import { Outlet } from 'react-router-dom';
import { useTheme } from '@mui/material/styles';
-import { AppBar, Box, CssBaseline, Toolbar } from '@mui/material';
+import { AppBar, Box, CssBaseline, Toolbar, Container } from '@mui/material';
import Header from './Header';
import Footer from 'ui-component/Footer';
@@ -22,9 +22,11 @@ const MinimalLayout = () => {
flex: 'none'
}}
>
-
-
-
+
+
+
+
+
diff --git a/web/berry/src/routes/OtherRoutes.js b/web/berry/src/routes/OtherRoutes.js
index 085c4add..58c0b660 100644
--- a/web/berry/src/routes/OtherRoutes.js
+++ b/web/berry/src/routes/OtherRoutes.js
@@ -8,6 +8,7 @@ import MinimalLayout from 'layout/MinimalLayout';
const AuthLogin = Loadable(lazy(() => import('views/Authentication/Auth/Login')));
const AuthRegister = Loadable(lazy(() => import('views/Authentication/Auth/Register')));
const GitHubOAuth = Loadable(lazy(() => import('views/Authentication/Auth/GitHubOAuth')));
+const LarkOAuth = Loadable(lazy(() => import('views/Authentication/Auth/LarkOAuth')));
const ForgetPassword = Loadable(lazy(() => import('views/Authentication/Auth/ForgetPassword')));
const ResetPassword = Loadable(lazy(() => import('views/Authentication/Auth/ResetPassword')));
const Home = Loadable(lazy(() => import('views/Home')));
@@ -48,6 +49,10 @@ const OtherRoutes = {
path: '/oauth/github',
element:
},
+ {
+ path: '/oauth/lark',
+ element:
+ },
{
path: '/404',
element:
diff --git a/web/berry/src/store/actions.js b/web/berry/src/store/actions.js
index 221e8578..f1592d17 100644
--- a/web/berry/src/store/actions.js
+++ b/web/berry/src/store/actions.js
@@ -7,3 +7,4 @@ export const SET_BORDER_RADIUS = '@customization/SET_BORDER_RADIUS';
export const SET_SITE_INFO = '@siteInfo/SET_SITE_INFO';
export const LOGIN = '@account/LOGIN';
export const LOGOUT = '@account/LOGOUT';
+export const SET_THEME = '@customization/SET_THEME';
diff --git a/web/berry/src/store/customizationReducer.js b/web/berry/src/store/customizationReducer.js
index bd8e5f00..0c104025 100644
--- a/web/berry/src/store/customizationReducer.js
+++ b/web/berry/src/store/customizationReducer.js
@@ -9,7 +9,8 @@ export const initialState = {
defaultId: 'default',
fontFamily: config.fontFamily,
borderRadius: config.borderRadius,
- opened: true
+ opened: true,
+ theme: 'light'
};
// ==============================|| CUSTOMIZATION REDUCER ||============================== //
@@ -38,6 +39,11 @@ const customizationReducer = (state = initialState, action) => {
...state,
borderRadius: action.borderRadius
};
+ case actionTypes.SET_THEME:
+ return {
+ ...state,
+ theme: action.theme
+ };
default:
return state;
}
diff --git a/web/berry/src/themes/compStyleOverride.js b/web/berry/src/themes/compStyleOverride.js
index b6e87e01..67a3dd14 100644
--- a/web/berry/src/themes/compStyleOverride.js
+++ b/web/berry/src/themes/compStyleOverride.js
@@ -1,5 +1,5 @@
export default function componentStyleOverrides(theme) {
- const bgColor = theme.colors?.grey50;
+ const bgColor = theme.mode === 'dark' ? theme.backgroundDefault : theme.colors?.grey50;
return {
MuiButton: {
styleOverrides: {
@@ -12,15 +12,7 @@ export default function componentStyleOverrides(theme) {
}
}
},
- MuiMenuItem: {
- styleOverrides: {
- root: {
- '&:hover': {
- backgroundColor: theme.colors?.grey100
- }
- }
- }
- }, //MuiAutocomplete-popper MuiPopover-root
+ //MuiAutocomplete-popper MuiPopover-root
MuiAutocomplete: {
styleOverrides: {
popper: {
@@ -226,12 +218,12 @@ export default function componentStyleOverrides(theme) {
MuiTableCell: {
styleOverrides: {
root: {
- borderBottom: '1px solid rgb(241, 243, 244)',
+ borderBottom: '1px solid ' + theme.tableBorderBottom,
textAlign: 'center'
},
head: {
color: theme.darkTextSecondary,
- backgroundColor: 'rgb(244, 246, 248)'
+ backgroundColor: theme.headBackgroundColor
}
}
},
@@ -239,7 +231,7 @@ export default function componentStyleOverrides(theme) {
styleOverrides: {
root: {
'&:hover': {
- backgroundColor: 'rgb(244, 246, 248)'
+ backgroundColor: theme.headBackgroundColor
}
}
}
@@ -247,10 +239,29 @@ export default function componentStyleOverrides(theme) {
MuiTooltip: {
styleOverrides: {
tooltip: {
- color: theme.paper,
+ color: theme.colors.paper,
background: theme.colors?.grey700
}
}
+ },
+ MuiCssBaseline: {
+ styleOverrides: `
+ .apexcharts-title-text {
+ fill: ${theme.textDark} !important
+ }
+ .apexcharts-text {
+ fill: ${theme.textDark} !important
+ }
+ .apexcharts-legend-text {
+ color: ${theme.textDark} !important
+ }
+ .apexcharts-menu {
+ background: ${theme.backgroundDefault} !important
+ }
+ .apexcharts-gridline, .apexcharts-xaxistooltip-background, .apexcharts-yaxistooltip-background {
+ stroke: ${theme.divider} !important;
+ }
+ `
}
};
}
diff --git a/web/berry/src/themes/index.js b/web/berry/src/themes/index.js
index 6e694aa6..addd61f7 100644
--- a/web/berry/src/themes/index.js
+++ b/web/berry/src/themes/index.js
@@ -15,19 +15,10 @@ import themeTypography from './typography';
export const theme = (customization) => {
const color = colors;
-
+ const options = customization.theme === 'light' ? GetLightOption() : GetDarkOption();
const themeOption = {
colors: color,
- heading: color.grey900,
- paper: color.paper,
- backgroundDefault: color.paper,
- background: color.primaryLight,
- darkTextPrimary: color.grey700,
- darkTextSecondary: color.grey500,
- textDark: color.grey900,
- menuSelected: color.secondaryDark,
- menuSelectedBack: color.secondaryLight,
- divider: color.grey200,
+ ...options,
customization
};
@@ -53,3 +44,49 @@ export const theme = (customization) => {
};
export default theme;
+
+function GetDarkOption() {
+ const color = colors;
+ return {
+ mode: 'dark',
+ heading: color.darkTextTitle,
+ paper: color.darkLevel2,
+ backgroundDefault: color.darkPaper,
+ background: color.darkBackground,
+ darkTextPrimary: color.darkTextPrimary,
+ darkTextSecondary: color.darkTextSecondary,
+ textDark: color.darkTextTitle,
+ menuSelected: color.darkSecondaryMain,
+ menuSelectedBack: color.darkSelectedBack,
+ divider: color.darkDivider,
+ borderColor: color.darkBorderColor,
+ menuButton: color.darkLevel1,
+ menuButtonColor: color.darkSecondaryMain,
+ menuChip: color.darkLevel1,
+ headBackgroundColor: color.darkBackground,
+ tableBorderBottom: color.darkDivider
+ };
+}
+
+function GetLightOption() {
+ const color = colors;
+ return {
+ mode: 'light',
+ heading: color.grey900,
+ paper: color.paper,
+ backgroundDefault: color.paper,
+ background: color.primaryLight,
+ darkTextPrimary: color.grey700,
+ darkTextSecondary: color.grey500,
+ textDark: color.grey900,
+ menuSelected: color.secondaryDark,
+ menuSelectedBack: color.secondaryLight,
+ divider: color.grey200,
+ borderColor: color.grey300,
+ menuButton: color.secondaryLight,
+ menuButtonColor: color.secondaryDark,
+ menuChip: color.primaryLight,
+ headBackgroundColor: color.tableBackground,
+ tableBorderBottom: color.tableBorderBottom
+ };
+}
diff --git a/web/berry/src/themes/palette.js b/web/berry/src/themes/palette.js
index 09768555..70c78782 100644
--- a/web/berry/src/themes/palette.js
+++ b/web/berry/src/themes/palette.js
@@ -5,7 +5,7 @@
export default function themePalette(theme) {
return {
- mode: 'light',
+ mode: theme.mode,
common: {
black: theme.colors?.darkPaper
},
diff --git a/web/berry/src/themes/typography.js b/web/berry/src/themes/typography.js
index 24bfabb9..f20d87a5 100644
--- a/web/berry/src/themes/typography.js
+++ b/web/berry/src/themes/typography.js
@@ -132,6 +132,19 @@ export default function themeTypography(theme) {
width: '44px',
height: '44px',
fontSize: '1.5rem'
+ },
+ menuButton: {
+ color: theme.menuButtonColor,
+ background: theme.menuButton
+ },
+ menuChip: {
+ background: theme.menuChip
+ },
+ CardWrapper: {
+ backgroundColor: theme.mode === 'dark' ? theme.colors.darkLevel2 : theme.colors.primaryDark
+ },
+ SubCard: {
+ border: theme.mode === 'dark' ? '1px solid rgba(227, 232, 239, 0.2)' : '1px solid rgb(227, 232, 239)'
}
};
}
diff --git a/web/berry/src/ui-component/Logo.js b/web/berry/src/ui-component/Logo.js
index a34fe895..52e61f4f 100644
--- a/web/berry/src/ui-component/Logo.js
+++ b/web/berry/src/ui-component/Logo.js
@@ -1,6 +1,8 @@
// material-ui
-import logo from 'assets/images/logo.svg';
+import logoLight from 'assets/images/logo.svg';
+import logoDark from 'assets/images/logo-white.svg';
import { useSelector } from 'react-redux';
+import { useTheme } from '@mui/material/styles';
/**
* if you want to use image instead of
@@ -205,6 +210,13 @@ export default function Profile() {