From c0203dea0c53e8d527b2920597682b8d9d4375ed Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 16:48:09 +0000 Subject: [PATCH 1/7] Changes Co-authored-by: domfelipe <53182096+domfelipe@users.noreply.github.com> --- bun.lockb | Bin 285029 -> 288556 bytes package.json | 8 +++++--- src/routeTree.gen.ts | 9 --------- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/bun.lockb b/bun.lockb index fd9327ddd673d6e677b446bb35685d182a22dbd8..6a506b66490ee7a5df0c80b9eb68d1ed90ff6221 100755 GIT binary patch delta 50900 zcmeFa2Yij^|2}@sb8^Tr6NH2qv1bS}%!qJ~6~q=ZG9*MI12IoxYpr<7ZPZ9hZAGb3 zZN;WmYEvq0snMz!HCpw*u4g2nKK=Nt@9*`0y?S1*T=)CB-}he6^W;2nW2^Iqlg@KJ zYYbo4wBj7s=aHA}XIrg1ay-PNV&SmzJ@&ttTHE_k^|){Ay&vgd;AdM}&+=s)_DPDN z{%|%JQpUuEE5@0$wDR_``3#0a5RZVJz!8aqMnuPi8wOYmhGMWgfQy6uz$L&{HN6nH zH0-C2s{S3gBPcs^1V9AFb4nQS@zeHtQBhZAI~!RnaS5V(Lo*B zgox0vBn*Fu9NRby;}I~2xr9kw8Fj0xqx2liQPOmK%6AYjGAYNwTsphKToTK{9LB7A zYDSY_bC?H#IZsN~SEqqHY%aC-U{>fLn#qdq2D4%tG&?aaHZ~%`U`U7viwaFhO5ECz zesZL_w6UX{YA$c@>#HVQ?5%QmgF0bxF>wh2(77aFM}#Iu7~VyEQP|@(zgW%g-bhV1 zK(pI{UEo)u;)WqZoFCTdr|1A%L@MpLy%%7Y8QRtBz4bmC*! zoX8u%^gG#1tzbHAwpa$Upc0y`r;CXT4^50R7{()irVoorOvXqX7NCbpa$2!! zp@~BgalVCGf$#vepmB(2%frB&6B}Bpc6ew~M4iakL>V^6b{d!!>j^({M=*OZ0L+4~ zwo>&oU^c7{^b(BlvZ{MWC9C`(pQn9Z8?^@`+NtFvMkK_I42?1Lh0Xj{wlx^Aucd4U zv#0mBSEs->FzczGB_m>o$BY;p9ebyP8Xp=Kmk^8gorBGE_k+}W$8}VvTrV)Dl0D@T zA~>hQqT+@|hleJhC&RHZ4%c_deVx>vj!vvII3{k8VNYkZLEALl8mv}uEo_d=poGw{ zh(yfSE~;N|Fh^=Vm<C)ZRMe(wms*i%so`}-;8~C%M8~0Ev)*j3rI1Zg7IwUb7F%0=ug?~Xigv5wp zBe`mZVEK3>VsJ!k;^^2g!^B?dDop~j1>M2iWLt-*tF$3(uF^hz)Rv77jfsg)OfqzW z&5920t2PM5g~o)2M})v;#jM~G;KpD(9bFJ`1$!YOkBRc&V&Kr&#Ax)SVKr*XQ($;P zL{d_8M1p;QT0mRqtk8&oYP=V0=5rnU5nF7*CRYX=)c~2`lbA3vnVb+eLQ%#J!ir!9 zXF^rSLg8u#_cZ$nY>w%W#5$uxhs78|69x|tO-PLBi}7KP1cBN0Ex>Hqd<+}m!hV#A}uq78;|QEJyHrC=-~ zVv}%~M;NskJh&q4XUKqO&=oNKzW{Uf zEC;iP>|mxdgPp+(N2x7O3LPFgC?>*?4VyhS85L62{~1gPCe#nH&tY>JJ{+xf;T13^ z)qagPf!PBK!Sst9s}`^iTnzRWFbj@C0qmJBVESc@Q|&ciH`w;^oV0S0LZxdQpP)wR zRro_vlbpot;Hcez%_Ps|;6imR`svzUo>8cpTZ>6*2kU9e!v499+PIuF z)z!@|*r=BHT=pnjO-h?4w<}!E{&I%erPsmikpp11U?rGcIt|RO9uXT6I})?{<#e@& zdV?*{N5_o_!!$C4%u?shCty}(1-LjkEDk#?R!VD4_Xe|h73V1V6ig|G0EH^EXb=`&Hd&aY_{iJ*c_1^ zusMYiVKcpe&Gh}$czeod&B3N6=%d*UU^7F1*vzmZm>pvRv*Yf~RV#b}%%er$V2{J* z+{>7$`s-)Xt5>7?#VC%3|It0qUtf))g384xCf|R2&+`aVgDv(3vx_f+*<)FlCeGjp zT#3de84Q)zs8eP(m{Vyo*v<`Vj200SF)|iu3`1aZiiAf*498`X!38#V;6h*~9JNlh zuYj5U1ehD40rA}DuB}S+VHBv2h8Qllti$866v5XT)%W<3=0}ba=5rbsSzN zCN2!uK;Y5LojiTU2`jY)-yJFe^AJDq2}}(TNes zNNTssZHg~9W8s9X_tG1&RQtab05s*S-`#-kW?c31sfYBQ^X>33b@ zGhpTyyIX0kJ%!g?p)rYu`yZ)`_8TxOH2yPnjqQi+2748l71I0912$*ei&dCi;BsH6 z1?g+?^$DX-l$W2YYgo;vDXvx^Fr#Z=5AYr^52C8z3g91504s0+Ok1B(pJ&M574xxw zaX@YOkNefVpxZ%p7{kyZY)9KeYJ+{j?6}5<)pl0axG&VWVcBgFlz% zaWLm!LWFwF5`9wbm;qp}tYB~vFy>L*s91yH!&7QQ+CXQzo=9JccN`N>tB$y|P%b>% zB7zBhz?|uKP;(|I37Z+0{#wn*QS;jeoBD9p5}!@5*>f+Dt|0g!nDP1ryZ-n?S<>9Z zvf#i1hD9U{j;L=iOh2p6!N}0Wq$Ou^)VcV%{l$1ZQRZl{y*HtZOWwjj~`tf{p7Ms)qEA!wE8J>ng6n0)^TN3EnK}<9I29eu1J?B4}yjz`mEaae&vKg1*Z>ims_}} zIM(s`{;sW+J>!$T?x%}5-*hk-dZB+n%Eu&UkMT2_<;%6KMj?CDwn>ip?;o{sXYI)TPva)y`9xJ%w*qjzw9 zo6#l*w4rwv!e`{nHt@!VZdJS^x zAIMw0ZIZdTJjB~-43`6ZY~~Eikudp%cPj@>>ri=^cc6I+LeUHv@5!OQHnYveVCbpX z%j9g>&tUgc>>hHepUt>ZK8l}bW#>jVsdOnhq>?)6G zY&Eu!GaB2>OR#bDmd7^^G(M7po7l|3IF<(}_GUQ?wsTp7p}S&7%JEH6N!Y#RVa;1P zV3+O32=gd}!sO4JwvyAD+00FFI6ZyYS&Zu$SSX|i5Eiplbe?A#s|uPTSMw;Ds`^!7HREZ@e@FJ-R|HmQ6y zc}xeZF-*?rU^6a|EkQP8rW}l)Q{+YXd05U0vRR~>27?b4mPt+z@^|)w)e#o%43tlP z*{im%#Z=2+Xb#mVXSeq^c9M;qY?f4LtrRVDNeej*O5xfDLl>rHPR1zNqcf*)bZ48n zLLH=+f0hG{{pDw!Z5E5C!7xxs>v5@t1C0J6!z>k-PuFskThy+Onq>wfzq$rP55+4K zrH09&U07$t7(bD-yVxXSJ-KmLtFgVD+SO*9B_Hi-vlzXQmy!hIY8e1a&4AV3E~j_1 zS^Ti657Ir1i)F9wHp?|=9rS|CH5;H|^3nl;mRN+?YzNsG>~Gv42lucU@5_tuvz45M zpSR>1J#EG{a(qvl<+``tjlrG#jV0x@UZv!@@6|K*l-u^Q8Pj0fEJxALYFE?erR>q$ zW*OqEcB6w#ZIiqO+5>2QDAz>IQWL?(ip6dSmuH07Q18qTo8=N>nkg~ajaX)C-%|35 zMfEIUjdY!}dxf0c$7cB!T6^8s(g+#)t5$n|OEN4qpNv|ilmWob*Ux5o1YI5C_}cy! zzb2|>kW>5n8)wS5`*9cX>Ti?$o62MQTa7#A3>Z=~xxfIcr71FOi4q)?6*fU$G=TeN z)&QHu8C}X=HOrwbIho=I+AOnjwDbY~#;;^!s7-S4m)nI}Esao5HKX(%{+6+@>LIbD zWV>GW7-X{)Yhf@%LCY^^`uSVN!0M}8&OgCQre#n+W#x>Meog@f!%&DOP4tqDe!kL` z0C~tDtED*#Yl}#WoOQro`mCk=9HJ>u9T8=eq$Yv#J7HGKyAU~?SQR_`rHnwibhy=0 z3mwMMGRmpP{4Ei%Vqq1Mw?x*JJ7aodiaWoA8behpzcS0W3~jA8;}u`&Olx^vxYaz_ zifJov3=cHlM5q-*mYO!TFO*G8O0dbtBCOH{n_Mi?D)nqDhk&lNl|KMEx0CNgTFpuA zcm|Ch94PH>CyyCywcLlm%9_}lQqA^qfhemb2GgVsM1$;xxp5hmx`wud`&;T^nKaeo zq?iu!yjoVv`w%g^Fece8{Vm2IHGx6)+U+k543c+8Tb*TysCUk`Vv;jE_)3$l zqXNwi-3*5Ma!{{8iw{Ee;OQu1c}tPq;4RR_9MJf=aD5@3P$0&A&ixMK|XLJ=F~`H#aT_dr!GtqSbN? zk@b~UU^g=V4$F^;ESq|%9g|OvKj?4y2^PJS&EK(HZ*@nJThwxuPbXEk^nrkBf@qG; zz&REt2<&9NNVQ5gpbnJlBm|m6(MKUl=re@E8M1`;QG3{|bpA3}9A0JeI-iAwWu4-X z(;+;##`iTC(2H1&IFc-vVX5PhI@(_<)=xe*$|`m5Cl^b$N~`t>n1I=3zvMPP~w7)!Nv{kA(K;8#hGC(dc#wwi|Aa@yKHMpcgd9!kA$Ak>8+ z$v0F^7;BX(50ZC}waNqS4raBd(n3nf6~t< zT|A{g&J^{)B;w4FWNquW^n;?N(3KA~C3j_AhQc+WTn|Xr!E)mit0if$nw3HJNb@&u zhUFul2ne*?WJqyFuUnR5r?$d!(5v8l0}2k$oSERJ?1rVI(Mqb^1}sBhvB3Pw0$m1+ zRm`U}>O3se2XQcTz-i>F=z#nXZ#fVt#XatY8Z6VH0fXjp1G zPS^YC7UNKP_hhT(F?4lr#Mx!(5u>(6nSqw~VX-R>azKi|V1XD|e-msC5G>q!}L@;a!chvQ_Eo6QK6QiscpXIL#qAn@E*u5T?!t^A3& z`p$_9hZUM*9fZYssd~C6<@Fp53rkUpI}0l}o%aY_+ULZ*2Mbd}^ZX4~Zk}C6;tF4n zGp~l#TV6V|mE)+qnfHN}Q+;X8D0%lRtNC|`KJts9fl~csx!r85IX;;?>##Y2mInx7 z2T(Ty^-5CeI9eVu$7(T-QF~oEN-a%b;S_=+H~ATPE%OCfZR8VO1I^{f8Vojh)}laZ za^0*Bln2haAGN{o}&rCH6v<9Ii=s#~CRb)4LIp4D7^ye3!{A;hs%iZS1Y z)rA?WH8VGv!0dz02TBts$aiF`O9%5o?QBAVv;jD`&zC+ZLYgo z+*9;&(iZtkF)8xm`Buvwh}w}S`)i$%FI7%hV72r~)i=%f&iN0k*jmk~GSd6FLH%^$AuF|;A=g}PHJ5#dceQnv2b#wr6sm--BGg9-`Mt|KV8$*%s2@X?rwI9> z44#;!yS?=HD#teB;9Jc3$ZcW9OTT#rR3A;)h*$(^nHjObOcrxc~)4U zrSxnyxq24%hs7P$C>y7>z`b$l53SB;p>f)14KU>6MTMo_9Q+yvY5`?`8Uc&t<(Ije ze+-K$P5!v*X6U7ib=eP%lN>j}V>~K&!bx z%iTCq4p?t9XTsKU790-xq#&f`brvBtFW-f_-!z0&zneLl&mvu$kC0mXEQI*6$*-AdKG04Jb{9fw z*)MXm)*t98(hyQ=YQBJwTC&H7dfI4&)SS2HXfF^_^0Nf2REJ&SgtFLSaZACqO0>VZ z$||;V{INi3^eVaWr&ekBM{?sMR>^aXeC$)JMXb?x^wbXimP}Ypk<=jL{?c4{EiAcT z%Rs5^TKUcnt7S9<9_x~vn&EHBfaRk)&-XV!fo0|60IAtJxxg-~^VD_Nm=SH%h6uY- zkgxd$)TZi@yCS5X#bZ6%KqvjWN{U!7*W7KjtU^SB62S|yQX8}tC#TQ%w{(Zq5OLUK zVsP$garyKtEQg`6VrJ#qX>Wi9zj@M@pMK91tSR~Q%PY$qDBMTXM7%FL429XKj~5&_ z=~dvRi4_)m!Z9cPLMZGy2VN#QpM_PAmezPPSF^e3$H+sT6%uF(LP*VdhR z0GW?6j(0ZF%a7&8Us^5xo7Jq532wW_!t#c50gjPn7p#sfh))SD`M0Q}srF1CSS=9e zNKa|y7WvLztK}NR&PoEUFC@>c@|X;(Mc%64ndld^2Xhp?+nzvSMb+CAc2c`f)W;6F z7rir~up`y0y#ui7E5-5p&bUn-Zgp2|4U3*R*SO~KQ1Ae3Z=mG}LM@e&IQ}KJt380H z1v^_{8D2hMwQPjeP)W_l3R&CbAqTByw@DmpW8x$H=f0AN96SvvRt^QhT@B0Y>GrdlW2IPMwQeVEMu- zqR&3*)^2&sF{^XK&(w!9dZk>H$CC4)wu3v4=&t_G-)KJi)GVZ&zg70gi@&lu&)cKb zQOiN;DC2c`%SoHL|L45fYxXIgsC=Q;9Xrfqe{GAl41w4Lr4*34ldOWpnSxvXFn{x1 zSm?e+f#$kjayw!slMv#}g-3|LITMzZy1CR|o=^bodcsDQ=I!K|G9lMm?^L76N4rNf8h z0%xtxoe!&x*QbxW@@Q?@VR`XcT&p0GOEkai9OUoVbQP`SN+I<@s0Y#TqX9&il(wR~*c2k%P=fg{j94 zhT5>OroZ&J?1$AHmQmgk-oo*OzDx1ZMIbCS3XL?U!fMB3+wv7coSVv>w6oJmwbzYW zca`LIq2qL@k?_%P&@A^LaJ$4+Ru4QhrLwp@dy?&jR> zt9_k!Gm3`A3%#Pef_6L(i=H_xb3CJN{mQ+x*$-A{dHm==%XEa;eYw>+1Vt?*Ga%== zSK+e;gBRTN{&V3r^x7dea6}D9xT)3UGv|e{*i>}P4uA7;SpLebT)A@wLjy(6nB{K{ zhJ}NrQ=nxULTrM1!Eg~)3&o4qs@2Y`D_6b#9R|x^@xd>K|#`9RDILgq?iFVCbZH9!5xs zF_-v8E7#lyp|(owN`%z1Z|7+Buj(o62q`r+A3{hi+4-8DHUuFx=hZpdeT0{u^sv z2t}Zql+XW+weppM*tOHO0?879n@r_HX8gNA8Q>#;pZ}EY|7iyQVS4*3E#M@>1-tTj z6LYfd*W&*>jQ;=cWb|+5!|`VYIJP*ul}}!#j&oc2kWB!NS7mM-Q&fW?FLT*qyHN7O z#-K13zVadG2W|jd=C=W5{xQH0nFag=(BVG751IBOfE9YI+0Ve7q`v`7_lL$tI8ir& z&0t3`;|qfGft@ujWi$*?B1%JG%{;(NSV`k5U<+(dFf;H1^FyXz1I>ODGu|8V1;GB` zBJ$GvrFt_#CoL73!OogZW_7!3dJm0zYVm)`a^dV!a?@W-tjqSewzB{svacR~+aw z20vK9I54X}QAa1ws7Ia4)z8by4_^q-~av%#FeD>VHhFh69@zja_r>y2vp2r!yL zF4OU2&2h7)=Viuk)AYQ|27C&gyi<$M%hY#6cLeXVBS4@1nqyw3bU@R|3?9^MGJ}US zKCJN(jgK-CA2JL4O0)Aa7li$+7Lk|PvWr^6%UXP1<_gP#&Y}1LOqUy)eTxP@WRCsM znoTYW`*+RO*#5ep*sSp%aAZX!7_=SmgBe=D%%cEBjj0!f%?cIM^tWS-|C<~+Hl?+U z$Skl7m{M6yCo{;e&+~|{1?D950<$6w8TlGBA8+VvSR=-B{xMJr+*yn02Bu?oI=sfz zdq8Iay}@+pgCErU()b5l5c*&(J}-0r8KSfdqBRFHgF`hvM$^fx`Ebo9vm%KakJNNB zgUR^8{6}j%h9W*>_Ed_b9vciOV>?B2oT@qIWfn98Iw#*;aAELLFvtD_F#Z`<@`uK( z=o;7@nr)i?XV%vLpCg#fUnTr=JS+AY3SwEGYX#GWZK&_`%TRF?V8`GnqOXK z{0``B`7SW8<1r{D)>caDs6?F~BY|tAfJJ zAirk6iRtf%c={F4{QebY`hrS&x%uz;ls&aDOv*(xE~>E;m>)9Zoxv=&xMr8o;{S@7 z&PDShbFH{)HrTFY>;{1umjN?@yXHVk0l!?^_%x$d;m>G1{5|U|m)402)lbKOZ&Cbj8?**N6x3A{cAI$AD0?hq; zxLG@chieg|!2FPzL9)i9!JPSa%}&uc70eHr{u4Eu%z|cUHkrZM_(8upU{*X$&u|`N z@gXzfJ&hNDd3G)Xvn$iVJfU`gS-=-ye)2N?GN7}deH!oA{9fl~6xc<49fhB~%nXib z864H(^Rgt5e_2X?|D~e`Bfr)>$ZWz{%_cj@H(pj#=Gqla&C4w38|aM6(&EX?<$EyW zf6#O?^_!ahqo%(Ft7A<^ZretV=l>~dbM1dwFnfw0n+8415pK`&|Bs%CvfMvCkF@_A zk5=E9(Z89GU8xbT)21oe{@*Z%WV%uw`kw*L-ggv1WjeeI{5PM7ex&993UmBl5&n;C z?ni3@W&Sh3PhS4-KM{T7gG{CT|I;U>9NGg)bIEG?iol42S_GM0bOhksI0o>Om;co# zqD+6AKky+l|DRYsH-i6zC!$J$rO`^BQThYX?tecKRYxN4lTh@J@`Uv7C!&8p5&ip# z=-*F7|9&F+uRZzX{`saSs62T7ej@t!6H)a^C}+vvPelKIBKqHWLdt9Ozn_S5Md248 zc$mU_nZKWiD&3(x8D)RueG&qq$GccIkP;k!B?O&?Np^QxCu zC!M~LeXmrKJnK;XnqSVHx}$I@zifYI-t%k#~ z`2!9vx%*v6@c<@}?di@vSf59zdF zLCl6XUpeENq0FQ8&7WL4+^T*`;gE^n?pU97JvB4?L2v)9PdA=!{GeT2p6VUe z>jrk{d(ye2b=MQ8;zyRejIVR@o3*QciR#?XHr0ApUUHO0W_llPnKPwjVpqz1Lk1pRm85*|#MZ=CM9S^#Fo_)SU>eD?( z$38hwaNKe4n@K}FRtENK)XOSn^*6e9Sam6XZGWfG(&M^6omJ;cuL{KmebVDW;Kiby z5(ZC;x-+g%i!Bj`tC{6iHj3%}OLl#EkJrHo-7mN6er!VV9}ZP+-*H8r>YWiY*y=U| z&<#KLMK_!ijru`&N?~a~2p7a{3Tp;J2vb zGYUHg8HnI3ML|PPtHA5jhrtnMzL__Em z13@X}H<3-jaTtW|L*Vg3qz{3xlY)6DgqI?CD1@k32-_h@Mx&5oj6H;F9F&L{C?=!W zO63R@mtj!MMlom@l;q)14pPZ)6vbkpRF8);A{H52L`Ez!zDS`;9E5@*J`Te41PJFS z6c!%CA^0UCG-Wu1q9T*REehW85S&G7JcNZw5N=Q?F1!*Tv>5?megXs+kwxJth1Q7> zN{O^Y2x~?{cuc`f1SCP|H44J2BnV|hHU-CI2;E0OC@a!OK-fvaJQ6~A5j+w?)MyCX zDR>CuC+%HADu5ixjGi zfly1tkAX0KJcM%;>Ijdq5d0=Um@*bZU6D!Q76tEd5WGa{I0y^v5N=RtAiTyyXp;hA z{&)!9B8$RP3auwV@D*tjAgoD+@R&j)5nzYVYa)bIb_h*GHU-B?5W1&8XeQEAAnc@I zPKDqvf>R+xO@^?YLVz$%gy1>_Lc~M}fnp1VBNSXFL1-;PCqYP_3gI9Hn{b{Cq53ok zBPK&=D>5itq)=rFg!UqS3WVv?A)KQSBs``<@S6c)%2WuQL?(q>6uhTF2o|Z+j6IEA z#3fQ!;WZu9P0S#57g?kpqR|XcPmxCIC2o^?i-31PAz~4!kH{wV6>Z-I^%Lo&{^A*F zfC!!m8YtG1LWOY_Xprbl3KLsM;leT-6d^)EA~_9}J2)Ga8!VjXK&U*BiA)N&D0t6<5HC{aL0C8+!VL1$%N~FC9VU2+Bn8IigFdss%g%HNG*s&s;g5x3x-4{R@FVYu4 z*h#@GAlOB)fDpA9!gdO&!nhEE>k6)!hDfM;VFgI%OMDnwj9Em4`51Iigpv-4U8KXpc{AvUh$bBs8Kh&v zZ42lt5l=cUj*?CYkFB7SVl?TL$RwQ>H9i4lid53q;u7hM@Y)7CD`t?+i7e82(P%s9 zf=DA>6t_v2M8Kz@%VH7fipVB?Biil&T@~r1YvLK{TM@hybX}|^WeMXh(08IY>3gw- z^n>(pOQeUw>q`u1n|&D2`Cno{AB!vsPbswC3*m`K+Y4dMeh7~#JQD#K5PBVe zuqp$>Zz7w5<3R}B_d$3e()U5wNx{4y!b=gnA41e22-_h@MoCBquv5Aoh7xgrN4_Ms zQaM7!vMlXCTxSnG|kO@IDK{OQfEKuu^zM<}>lfzVonUV)H&4Z=YRHsSmY zgzDcy81W5+wjzVVMG94}LTE4IuR@r99l|*ZLBiu21ivf@Q?5biBr+-7qTu~4gkX{S zErf;NLAXJotMIxGq0RRY=3j@T2)%AVSoIx* zJ|dff<4p+NzlYFIq<;@#Ck68l5C(|gA0R~i2w^*gP+`0Q!Sxn|h#L^X#1;xiD7f5& z5FtWuLP)+1;UI;ERWAWXjt;T(lw!s9jszn>sX zxeXysWKy{G6Yghx?%;kVUZmcEu<&Pi+_(deMB#N8LYsRK=HG=dLS#{RN}=^n5Jri# zpCGLH1;S$rqeZ~a5PIE*uUB2PsSw&JQ3|e+)snTbUs;C|snVY$)%F z_=gat{|e#ULnN6cJRU*td%`4-Aj}b&6mC)QeheW^q&~(@I!|08$-?Vb(0gJAX}-uJ zEf9^KfP_dREflv&i$uUv&|TDb}!r3>S4pbtcE z(uZOTX{E6I4q7EbNjU#WtA+Cm5YB(nT9H9oC*1x3trzj64dN(iqwshM+9XDkJ{Fmz z>zWJ&jxDr{d?<`IqqX6X9i)<``#+45L)d+yY34}grz^2L3OPwfj4Ws-{$QGeNGTyXnvdD=jeeF^>kZmhN)37j?YLG-O_t0uME6W?eCx!pv!u?2-M3-EG#KS zneX9kXr+JpC|SKbK*l2x#n*4TF^L>b_FmEofS| z|GD96t%pRQcXyylos=F^`|WpSSoY3q>>yTnNF~hvGcaDPw@|8=G!xmXX>x~8X)k?j zicii6b&~K$PD?0S7{2XRIBz=k=Gd)jy{CY+iZIi?N(v=YrWjyU>}vS-Rsq_+Mpn+% zOFCjUpVTU+bgKF6X|0ccQ&LFy0|ClZtEA@eYP}qHRPdGdOx%G2ryC2j*~iYst3wCH z&0SJE=f*JEwR}f~pT;6!w^Y1Y6HVrqxLlM7{6Ya56Z89Ad=-YD=9-@wVRuErn$LWo#@CfDXnq~k{OtTI|NOHe%BQ2|$nV8PX^x#V zjlI`P)A(8&d$a`5Pt$@mja^wt)4FIHzgk@dVSc)T+2wpaZodAqCf|Q!hOWRu2Jq>r zX&eVWMdhcLrtzzd{O&e;i0{nN<`+GeYZ_l)!#`!bqO~3zp`|SgJqQ|mV4U1*n$tV_e=hkLJzK-e3h?{#oQcyAz6$V*_>+Liz!YFAFwHFPeIb<= zg}#*h?DtWHY~TU#5O@SU27U#e08fEuz;oa?;CJ8!z&8TM0Gzt#0Z!M8KwlKv9_RoB z0Ud!(Kxd#Ez!}W9xFUhU4tVQ~(>EI6t6n`s>X%q*eG%kr?GJbYb%A<7C7>!$4dBc@ zfxNI88BPIwo_!v`p8+xaifMZk*aPt0IKG;=3gD}XE6}Iuzz4vGKm}+XKt-SuP?_&V zatTxgssVH0G#5w%<^eJ=9}oanz#?E0Fd5*x)8l~&KoT$l7zOaFt$cBttHTHI1^j?U zKx3c@&=hC`zqb6IEZ^9@2mAuu2eN?&z^}j);2FTD`M&{tRpMP>CNK-&?^yXpi#Ol{ z_yL{(-+`$HR0nDRd}*N~;0}}p$^i#Z0k_@=lm_@q?UDdr7b*x80{D(}elTBsdI=a2 zmH-ow3Zwv$z+iyuIR+R2@XeOCW-&5D8swaTLiPbToeZmiHR5)LG{F2Jf-6PPKB=00 z3W8Gse$l-@a26$TfpbAm08)V%AQp%R__qwa!8K4j{(*#Vfh^!V;2g&AJn#*04d4>m z3Gn^YwZJ-HJ+J}b27m>R7b6kig60C|g5?6``{}EJHNaY6KD33vDTGf0nE-c^RzMqo zn?5&mZs0*cUEmw|@a^tP0C$+rfX{(10d6jz0P#lb;E@On2KYw>`T-##b-&cW-X6gY zKsvhf17Ibv3g9NR4&cVK5!eiD0k#640Na4=z^A}Xq`w2)1%3h?P%kr(56BPj_j7#H zsWH$EHs7VH3{*1XudP);pgh1=$BF@b)yxsF00Yt6BQXl2fMj4aFh zen5X<05A~1hHB>yY6t_ufk=P{BM(9zd|m+G<>!0;{BsHe0saMu-at>FBfvi+5e#$# zIstrL=PK|mz!!YZ0bc`0fn&ga-~ezCIK;QCb|SC~*bRIJd=Bt074TL1fiJwCopIum#Y;Jd8Tfo%9a0QgS#SYRA59vA`eJ#e0nJe&{n&Dbnt@*Qvy zI1KQOsl7l^IPe9*$zZ-L&c9-C1NQd-Uw+B}ZUP-qAm7`q4b%Z}ou|AXyb>EMUpSrx z3V91C01YQgD0J@rm&tYj$;n9d11MuC} zG(3%x8k9ST;342Ja0ECC90R@rjys6mI59mVP^Dw2(mvoCvbzj)1NgtR#vzU`^ItrT zANX9qC2%xXwfn#v40u7~e#T-sJ-LnZiilTA93);@bq6XykB1Mpdi02LP_00CIj|I1 z0tjFMz;oz5fX(5##Pf+~75^5;OyC_Orv5YprUFv{9#p9SCj<{E9#~_6kpK@Xelwp_ zzB_OUnN|Vgk7g;S>OL?}*sp*yz-fRdFHhi6z)@f%z{BnUupd}r*wN#twA;b$AdDRV z9S;GAweShybyO-Ys-Kh!)%Y43k8!LP!%KYV%M7WV132TTof82krSd@qP`AoJMZf{z z95Mh`K;^-|gMS0KSNs5c4=`J{iyg}_KRhh1i_DX_@L-VV2d|v?2YATe0a<`v8}g69 zO`sug1Go#^0`35}HPC(r@N9YnJOJ(kzW_f2m@e~Nnd@$_0jf#Rsq1OR7RY`Q3*B+)0s1X8+lit3&6Cs!1g-$Q59gf>f_C+ z!g;}IMW>oTHGp%2*BjLVP9w$>wPDkT@jNkDFe}*^U_7TLmy}*8%WDMSdeE*E%t^(> zz7Uyt1B89R-hd~-dCW>RK)62O1=I!VX<=#&^Mn~s|MuY4KntK1U;|nL%>aL(DaXGF z0*y7XIhf9L2+*J>4us9js8iF~if~(?jmGW3JTHTQ4uI~*3Q(t}=h>0tPtgc`h8lB> z+4USRb{)H)-K7r=b&en7^zLN$>%+)l;81dS@}|-A(zPC1p7sa?dI1ZOh+P(ra2PNM z2n7ZL1AzWOKcFwr2M7UpwZPdQ39bjO1b86a1Rb|u752THuO&gbD-vkr5B`Hc#^I3nc7+6 z{sqa&7$b}qr3PjtTM>FuDr4p_%@(~cN`tjwVVWYm5L*PW+ZGzdvg1<8!dVE91vp(M zaP-RH@pj%4Dx8-JSw<2P{lfZG{7;pqQ zWE3Ae z!Ign>KqBn2;4%O e`sfD2Fpz+Hn~xleI~!MjG@J@WE~cajc(0eFduJO#KN{sDdg z{0{sEJO`d>Vcj+&jR}wd=EeIW-XG^BDn$h{MC%P(B;r(CNe031QymY3mu~Elkf?FO>6y@!bHNG`t7<09sF=3c!0UX2|q>TobL?0=xj=?ZJHTd%(NEI{+u&3^0dy8t@D3so<{Q zU|=G`DU6%|@Q#~z;EBKx;4T~z!12H^AO_&L4FwMeb|D-Kj??VX;E})xAPE=+Bm?6B z-qka27RvItk{IUIt({$)szpu#PXbs8I!p%h&SN^5t&zdA0N#nr1hZ9hf!V+ufbnU- zJYXxZ1=tLH3~T~60vmw!z&c>9WDs9{D+Lr`*E-#Xf={a{I~re?PB=)78VSn{=|ZW( z=qCL?n3atEz3O{5@bj$KQCz(tx#1VJPi{yJ@T>A#Hzl_+iP-ina3Aa1LC;dORg_EzR4MWNrH1&vQP3?M zx|hZ1TT&BzNoV^lr1?$Uz9pT)ufuoUhIK^zd>i=<5?}T zJ-Q12yC{8#aPFg)K0$Mh8Ti4=^J%*Ra$VmO*(g1qQu-P(0RC*|Zjr$ZPKhg^GT&*b z>pPF{k+r+apxo3?MbV!mH=jZn)6%HP?uaiuz03DFn(I&%G5AGHO2&<}HN{KWp5(^( zSw#PzBv)exQMa#J=m304L2{FvoW%x2xR-HOGaZvSu!Dmw`F97SmuCY`6@$04xDF5R zj_@dj%zb-DM`ovcdggjWAjTCj5mA@!%=qEj+1!}%qR!7~(o#6M!(mh1u>I$z55t|S zp7|~j3I}|}Y%IwAKK#nSZ+zyU!8L$9dO5YSa{t--d52bRHiFxSRN_;?vL$M#A#ZlgR!BfPd(1_1Yw7R_iQ*Y z>(5G*EY@$%qKUZ3ga*6 z<FI<3>+%J!D&wAdr>n3@;EF;j0a+}mL^u( zerCmn+@zn0rAS)l5**mTuY9|%x%p0k9=Q%rMJ6lZT3Y(p0K3a)#+^u=Q_+q3>*4uvq~XV?%W!e8?#OfL(($G5X(vgFTQuL z#fr>7avg4qbT~-)%ZNSqC0D6Z8FBu;)B#^@OiwVm;k$`nRssFJ^p!p4f4=my9!jGt z{Zdsq{8C;&CY+3VOo$l&NNOOtR~PqRV9e@P7klfQT=A_kue!=$y?liAHAw{dz*;Vh z%|N?FDy`$96Rq#?Wg)mc7pHto4W!~V#OcS#r%?^@ejxH`C6@b|29)Vp16PTdGk>l} zPZ9S_auW-Fl`58*T2tMA4lJp6@aaUyDmaF4^l|rJD$e{WH7K(c4o=9%_w)QaK6CGM zn5P{aaG9`Acs!9>TTZ~i2Mz%u?g_q(aYCGWA_e8B14Nal(tsRush9=R_*DG-RPw;d zR1_7#cTtVMOAW-_XHqd7wWwPIi(dIWQ3Z5O?XOmvD=4FhsjQg$TxwTYcX>mbwcgMY zzm}P+T89CZ{&@z^#mnj#0;OVayzk} zETxk5MXx`k{%_H&+&YxbI}kp4ha^OVh9%*`Y3`2~uer@V@Sc;gGR^|-sekV4$_>Tz zmr@0M`)=(^TN{F)tKK6GN?g(EaC9L(>Ex<*qFzEL;cXj)?IDBL7d>z=+?5Cz~K z0LIloO35icj_H+6LnNbDg*p{@&AeF4u+Ep;%MPxU(m*n{(|p4l)JcjS7GW6e>1(oUENUe+a^OCV)^$TT5Ml31iGhUQ6p|Uj_t8Fec(B-n_-0cUs z4&y{H9HbIWMU2Vh>R!I7TFp9}CKmQ+vadW^<>l?^hvT?LQ?bHis#)o2?SIt4dWBx^)u`|2&T)FV$MPDL6T%z)H-yl33P;mLCqN#(aKEAyf2NPceq>8V9 zf9POpQ08PawX<%md8g?4^ZABL#xJ07Gf~QD-QCbay|DW86w+g&hlM5%MORqIm2G~- zY3OBCK)a0ohfNjnPo?5bnm0o=G0o1S2wq?IZ5_8>@_V>V$)J8i%)amdby}`2c6f8g z!%Z9z)4;PKF8Y-WDpzc&UR+HBbM~$_osyEC@4F5+FVBYT0=cD_Z8p`HHnbG`%%)a$ zQ!BM=|GZT6jsMT>)ML&dE$7$!l@kUPoIb#vrKqXq*6wQ@3s*hGu`rV8#=+o%(9+p}_)=cX*%iKhB`*7w64^=c!=<;T=- z3lCl*4Sn)y!{!fKPE$R6F;G!$#AbSof(Lhw(ocu|ytaMCcXIQX+D5E!!VLuTo7YDC zLGRV@<~3Qr@U|CL8=lp~O84~g@xj%520TibT%`+bL~Ak(3z%v)*Vp); z^VVbjJbCq)a~(wUDkfKPuYjqvb_?o$r-OR+5Mtc6r|tfEP0*$FFemEc7a>8Sc|kPo zevsG;cJI|u^&HqXtYF0%-MNq(czSX6#B~%i=@ADH-Y7hCju`q!!xM|(;icXXt9f*g z)^-v_3L(#JokaCQX!pKOqHiHn2OoY%fSYpnfj_-`J~#ANq^ytoaV*h2oz-PkU}@In z$@#y>ri>VjBNk1txQ0C3i{qCbTzJhM?%i_C$vX-jm^1X~-9^+cjC!qy2Xn7kx6SWQ z`;@@u3y*rNIm#ahk2jaE9B}`5+8*yJHX*I_O;>R}R-1a-G!(xUHkFfZcNHazm^!F8 z_-<0wHey1NT>lDu8t~=`&5JiZr|U&b4(>0zsU2J8;747nl^Mc~4r_-iqjdKLMUiLY z9^!OSZ267QsN-GL9s2H&u~RLLeU_`vjA`FPbfmXlV`}Qs;==LK%5)XmikeDmS>`(D zI=td6sWrfTO0W~Q1NE-ul@ipJxVm2oQs>VSmmPOXPuVjR^}?a==~dsL&W@7ej+4p# zEt}G?muTvYq3zyF-7|WRS^4>6mus8U#Myi%3CjUClSe8G6FdXly{q=~&m zp<@6Dn!UsI z;5VmF|M7#87Nh247~EG3DuH7_9dP&8tKnqKL{cs~wa;GJnWb0vUsuUKK-70JMf&`M z4Fs1lBL=E_`S?9uQ<`Ks_wWP`2ePXCOc&>eB*-{pb`90@Y z@LLutI+w(h*byo=d!Y3hI6!y?mpz>%hRpsPyD|1NFCQ;YpEIFit{Xh=AusND-k(>A zC>Plo)uMy1XM={8L83!N?6r4Fnrc_nxBWkF+Ioz5UK(poKNhspMAC|p#tsrQU6I-D zQl?_k;z8nMDO0R|d{#($^i(W*N?)pa@Z~3`V4HglJa=o_*oTYyK%q z4m7dP|Kbmh2sU!ecHMJ+q&SWgZ{dkNOS_wD7AP_pzeYix?opznJ5tt+Qp=cjwAb&I zDm8tm)dr`9UzAu;7Q;}XoT;>XOSm~9+3b(Tmlzh<=pNkg)Ro6hmnd=C9S2iCc<_2= zL9eeGuZs=(79Kp9kkPm(QLZdHZf=z5Qr6T#QZueEB@Yq9%b~eC=P9t^U)1Y0_t%oU zh%@C(W!;;_sK?~dkDKof@7A<}QeRvQ;debTqELC0Yv(_E@JfIeAGeT}8^yE26}P*z zSb-a|i%{75L2+?0gF+J{>V=-YG@;+FbmWQ_vW>~ZL{fRQ@wLja^IXI)e{HUPxqX)p-;Af9;RaM`f_^HLKD|3;=)Z^+d0|1 zHg|pg@hbYKYdvR~PN;~r{BfLET+vkXEvlq1CvEwNhLudk-r^cEY`7Rw3G;Wwes8AWl&KL0D^G@%k-mZbS=6;y#aRo7aRC@CExs6jkcswgN=2^UmW!mxy z`1L0|DtiTc28QgOlj{+Hm`aGb-ND@XXXB8)xiR4hVh_@~PlksFJkE7rdMqmF4j$y| zHCvS+?lbrOS{_H6j2~EU#I&xt9yhhLiwgH}%V_hkSZ<7d!Y>>pdR4(z^ow{Gk5Mzy#mXc`=3SQ@Vg7H&rOKo_Fkw!M05A3 z@@O`WE7$?vOIZiGcw)3!2x)TF3KSr#hzoZ!tc4 zrdlrlaze>IUTmm?j(>HKwA#6g$v&o%uRfI2EB8;IOXfU~d^Kz2#%I)GLS2*fEgGmM zZk3an-eC37_^b8Ic?iyDsCtj;^?i%7UVn0`J$}#aTjinp@d@I-SI$)J|F8B#Zc|R$ z#c)4lq!;^_Ly%Y@@z1`}b_xi6o-lE>GPpsG5@#?J2S+1|lF|BUeqyM)kR3GZM$vp1_ ze$&Kzi=kE~u#1_OT>r|b|K+scFJoR`jj!z<`0e6b4{}a_{>3k@-lAh)A5FcZ|H+!t zDysc1EvGJdeh2f{^X^~RqTgnxm0C;^o^AegDEu2+*xR-HO}|lmeHFgaDf*lgk%4&R zr>)Faf6MsxgO%q%Mu-3Rb|ii5UtMI{r2OmV{p;uFD}|I*&db+F@n6nVzeM=|db#?r zn$I_0=X;RIlEleTLT2p5N>NrBn}Y%UnPFKF|009;Ys4c3r>gw?B3~-}`><`+n}{dG6=s{yeoD4LW!K zV{t8KC$~|bFc#O!7K_U3>lS;iYm;NWaB0BAZ-Qz3gev2)gF0i=jw)Zceb9I!QC4A$*GO3@C zT^KNtpK8R*2kPx7D8@Nz`6(mVm~Yr(H9dT%j7d|$^iT-VA9g6{ifF%Zf2PqDn6t7i9(-`mw>_! zt!HnH3|<_6{HEMcSEmpZcHnhAWqW1J#+(p6r5Y3^C%4c4%AbwgTgLx_MNlz z3dxKQ)>EE?!j8au++=>gcnAd&g<|}1opE$IW%~<3GLz4!$zQNHZd}fpFufX|)YTAI1U4rnB?ITvAQ}#|&_=3tyi_vO-D8$@$>W}k-R8D$QR=T7^&I{3s1NhY?A7EFi0cWdwKA#oukerL!51FY zd06uJEBZw0HJQ|l%KH=eWL)r|;_5Z`%5;{tbg*+q?*$??i2m)>>diiK@IwtmWShcJ zM6_C1VR&mLi0VYQ`oYTHU5i*#k?R5_pG>A9$0UMUE#&wh;#w7e&Q53FUm#dPk&6h{ zo=$DRSHUsJNc`I`8JoAKM>ZMRp4Y2!HKN98Sgu6)s;EaquqyC+Xz+CCd4W}h6cMY+ zz+C{Uiq_XjVzu(pIl*0B=Ih1Ypq;F?h*h<)M%^~xs-O($NdK7*uZ`%)N9@T*8P;iq z0eO01B3xC0KMn@0ss#mqByL1OPrd%G0eB8-?LzvyE5$V zjl#^>wTny)ZT6V(2KPZ>6EHcTs^s$yb)_N&cYk>DQAAy4!w$0|`g#U}PTwL4c;YoT zVCI-bSrR7#*Dz2_AYkLJUrq7_&E(1w36?hc!~fJ)tSNMbrdQviu_Q3SlXMV8L6qr-)*M@$pCz zEe*z0M7H}d`>ijcKk%!(2648~JK1vFIqL`Iry!06Y}kx(G-@Vlb}pvn;h65-i#ZOU zyXl^TDJwN=MNSbH(!ZFpXCh?~SxgNxAv>j*OlQHTpP&Zoj}dEBt8I>%G14+N4 z8*^P(YvV37Fe@C^84UxmPLQDyW?2(-JF^U-2_XG(APg5^)Z$<%}MQ91dB!cHue zk)fz@@GHtkS!rCsWuFTysrPue5pyM--JD{r;{D&f9Xj;m3cANCudAT;VNmn=UasbR zr(5dOJk?RCLB~6z?}Lj-69!IcfKx#jwuDpnQDvC0UN&Gq1%^YnZd};!=RwP7=egwH zt|%NuYoQ%)%J$O{j2x%y;9y&|dym!M2X`|X1`dn@)*j6P?!{j__fd3OWNWW)scvp9 zJV*m)>$S1LoirPBKDm--Ia{6CtPKVO4)MsMvHG*>($)UX`uH*S5H+%SE5#8qog#zQo74g~51KR-nEk=*E$b6zAEWmbo&X)Y$FT?F*$ zLetAZ%gvR=reOxj7}yM1G_|U!-4~6&4TN*pW(Skx+Y(BTXr>QNDT@G7N++`sma<%h z*@fyG!PBi-Fq2FjduUCh@V>E*v8BPt!oIH0WW0&*_y7CY%Ok9XmHjJv_;`v*D^5u5UPg%~1DK54Z7K z9%`TRx@_!t)KIAg8M?{fumcCj-RK}E=6!}D-C}ZrZ=QSScxpll@_^15gyn$!*Z&0B z#h{;Dz`@o;*BYaN{zfM%^c;F6m_&;&08adV ziVxwm+V$UOSD!CI3#25j>1pzc#WBX}G?m5*_8s3m&Ex+Cx*aPxVB6CxP8e*QB7Hq^ zntbCB;jf&g{5XuCAMu^7Jny&{+NLe;Y6-c3owK;jS4IW3ix(W6?n-R)l@awnYJ(U& zivi295Bd`nV+i;)x_U$4ZNFMjSTIAjUIK3QdI}D<=~)^dd1!{`of@&O816)1ii6Uq zmRmeDrfywMkA*B^0#A$P8CcZP{dn}O6F9m-gwJ2cDk|mb^)kag_`*EyA=RC_qu*VV ztfWfR1u~As(kZp%mVlN5Bey&OeRKw#tfiN`IBU$hkN1!a1?Qz&Is#7M9!%y53ddVu zWLuBBej%y8%LZbn%+>)mNOzv$E!p~LeyD$!8WUzH58VHz>8L8(cZQPYAsQQg%OiZ- z6~>+A*4R$4DX4aD=q8H7s)pBkXQ^=>>PuNl>0d$x*dtT=8e5Ccbpp;xs{H1AlQ%r8FY3_V%!^QK4d3y{6djl

p@9_TUpQX+I_VRAH>40VSp)>fEI5se*OiC0gFavM1?ZTh^M^tU;O0!H*wx z6ta@9L@&|O-BiJ$Y}Za7etYXeMSVCH#=pNdX_pYYDj#dhCNnLg~Y^%MJ6~< z#Ax|gw^m6^eoJNuvu6)sA&pg6MJA|X6XU~}j1T%W|AMN`iz?vmooQCNU_+~lh4y=9wcPOL#iMiLStBoRB4(A2)9r#zNgVk=tI zRzWvy)zVs`sGSt8rB%_YrRaCx=bVx7($~BFzwf)Q&gIVi{O;%X?AtjfXX5?Cu2;9X z&h@L2o3nm@+KT2QBm1=;;Ca_v^0?<~ABWG`6e-=0yw_mzf$S3zP6mG7&+Jvf>)cLR zHMAeD21DA|VKJ()J2SI_y-6X1p(w;ujQ z(|;kD>Bs5uef0Rodc2nwZ%=!Sb}@r9;L6MZTnW4s%mOEYSx`I}Y0^4@*@pqTUK-4T z3W1A(hYw2`5uK7^m|aD)-vG1eiMGUH@tAziPBM(a|9F=D^(1SBn*GPKOnG1ob{*)X z4Q+C)EqVlo-%|;7s%Cepq0Q7uHMI#bA|)Yy0Ai(D219X_oeZ5zuOFB*xk7C%7Yl4o zvj7>Hel4GOeY{?^1 zlIzn?8EEp9iYw`+3U=>cEn%M^jbj4qL=Q_CmMlT%l7Jm+ONlkKM|=s`&2&FM-F9oF zrK_OZE?_tK-GEO2M{0qFw4cGWV|2Tx#`d(PO|-6V2Z3wyI&AjHMX(E49k@F2DchTB z6E^`&zuC>S3ff?^#ofT{f#XO=+mS9|Sd1+t&R}SU{J9XK6H-QFqzx0%LuC!!4Qay= zV9k1hIp!-{=ry&Ch^;d)F=aYzj@?8s3vLHLawwQRR0muJysM?Q1-#!9*)$$%&}9 zA8h)!ZKqXhKiCWQW-w<$fX4Q;=(u4+;$v*d=!h8XYr`FzoL2{}qvBKQ3`!U_z~I(V z>*!*-z6>@iCc|b&4oJ2|$EFwz37s^*Ens%EQ)hhu62}a+jfjqOf zgHvKtqLJ?=__M+(u|r43+A-+|WA+CjVo+>i%9zAx!`bfIB0B_T3pRqeM=tHDEwWj# zxyZKl(pomgmXHviGQzMHHY@sBgw`MwXG^ff#BPPniY)_|0V`noC4%kl2uw#pZsMcC zrNFktlz8-{p&nYuO?-HA?1&NZvB{_UY6*{_1+38F*R}Xvu$j*#Y$t5-fJm)};sTKg zJ}Jo~N0XC>rK-wt#4~;ENSvbV%Gf9^1FN2}i%sjI!6|jd*oGz;Y{`R$+mcgaw?k)- ztO2v@7lPTcTi6uIBjZQJ4oo!|QU?xWc?JvOU7*K~P8pUkGS(0s7aN-#Kg@7F#xZ&A zG4avy2Ez#m>>9Ncj74nX2%N>SDIY>-O*6sFCt*$WqrBjmSX+9Xb!z#&*E4VF?4UvH7DV>{`d< zDv6%*hJCM}w!F@QX}_-z!AA*NgBHW)Dj7CZ8`=@jQ!BxTa!LNbKfq5ly9~rZUPJx*&63hbgFoD?e5w_vB0SU2&b|bVNdjl0J z2fa3i3F+*PvnH)91TMo4BegE959Xxu*10g4J&>pSeL6}jzzb80lhy^yg5yvCd!j42 zEZB35W=ml1kEg(#)Y=)R^ekGchVMAd#c>=yk+r1N#%o1fh0Ub9l+2=a&5lE|h;pE4 zHIIdMt)m@jE5Mi4+@+X{1^d*Qr1j3zG}X1%hf7+CyA)foYVwWA%JgEd*(2W6y0#IR zU0NQ@mOReTy7m&7U7ng4n~2UZM8GZ%d&?X8J}@jb8uQDrb(%JZicZ(6@&I;e_(c!H zP8(}5EQQS~&IWUc#?4UkDUvn>0SXhRDFMZ++Q-k)nl=bb|8OvSv;~+w{n=b?Qdft~ zkxH1Y)w4Kk_HaAcmB0_dTwH!&w&x0%`IH26Dt!ZH`rEU#^dD;R_OxRV=&)Q*uuZpT z!e)jGU^ByUV0O&wV0N4p%nH{7bFQg7EjC(T*j%-qXgK{HXVbG6m5yslTwMN-Ze9NR zq7oHTuPHIH{^MJhj+i2B@oY>HcCkNf_E;{a35PHi7nF%unG;rNQ|3po8Txs!o%_(Y zdPG9($V8+ud;yzNBqla?IIeaKiLgsBBQO&lU8C9c-_TrW?9gYS%^jxP!46l6#@U5*H zkAuzKus@i!-m*=zT~V^yJ?a~Txti@Q2N5Ki>m?#nO;~LiTX^N|s zomxi0i10y#8<@L_9ePD@GZerIln2vx%&4-TD3wY#u$SATHN3@V+Fq~$Hp`7hhp-(h zKGzyN7tD@RzR=n^LFa*B?jeo?I1+x?#M2srtAcU)qE;*ZD{Z1X?rc(0qmyxN+YKT6 zwStDnCu91i7>15T3Vd7-XycBH&cyhEV+@6K+YkO2tu$XSE1DduUAugKQ0tg%Fh_Dd zm@5nOXxJ#M%|~Br4atJebRXm}!@$fq<*=5K zP51LUqUpm~OMD8$X3zCRJQqL*J)Psi+VK=aUDDjd8pDAF42?}56dPbLrb-f+OEyRMk4YHG@(uO$0&!KS+7)4QPQPdyx3h)+FK**j zbyEGOPoUa-wbiq1)j~>?cMB!kJ8f%=@<)ryhnjkiVry+R zUB)EnpcL~9ljmug2U zNe!*0ov{0AfrdT18 zVyhh@Ra4@_{(m=BhA3?@VKyn5?NN1Kuu9#Oc>J_0n>$$Li&d3}9V}91 zCA6be>Zwe_&rBr;KU*svovhLn#n#Dc{=A04&;Xr*N!}^M^**dluw-?Q!M3Mtt{rUt zqNc&nT*%6sZ6ySiDVB8t@ADs@!acDI`M)I&awT+J2y9T~8;sfteztNA{(0S*tTkFpus z(f}-ZM?t0=uv#hQqr%L7fm&;wl=ScrDM88UX_Y=uJbGCrC&h-JYn65Q8K>m+vYM9% zIeIUrbBOsQtcJ+ZsDz3Tshn~k!YYL;uDz}1Y3O3Dm*IzvA`4p0V3Y`NCxu#~;@`(= z-U3a_f%)Bl)mY7sT~S3b_qC$#;eD;Y)7#w0aHxv)Z1EBu`hbLB>kI8N^LPu=YLS1F+ak3YKgSyA(Yu%@rdG9X^XO&b5Kpr9g~vVl5-~y zT1N<)<`Wen%}~;9R{6{3%0ZjO`~bR^kx#D>a}%@*V~dH!Y=T1T2I8DXfGy36`T;DbwRD z@}<_wG0-53;u&voU1ZUEUD93GD!Cnl<;NCfeZ0jKW<|A>4e?>-F$ihH%tf&kR!e0= za+rMAsvI0_F-Ny~I-duHn0CTysvH^|X1{qY{n^3}~mg47Hdqx6@Xwq+}isF$ZCKK)~F^T$AnXmG9wl5F-22s3Z*v zG1tIqd1}eF4$7`Xi+M3b&Kjc#FCqskU1~dISZA&O3Tss; z8EAHfqSv%Th+b1yJH$RnWu(PixjQO>NHn=~h^YsxhD>BG+(YY%LW=+X5OZr- z^ip?Q^C(!{2_!|TTTYofs=9d_6c!SR6(pE!R4j^H@k}PEVW8li?&(R1>9R=QjuTc658__z-zWZ)N&e zi@dS7atwsRJjYq&Zhe#i<1D5P7>G!vAL>!0FE5VRYvFyB#^WvWM4&mg~^-xD~s$F*WyvQc4A}n!roP~8U>psK<%Qg$3sy{a+<~5 z*QQNVZF=XxVlSyXpSkb=tp{XvVurwKf;gA_wJ{bF=drAW_X|-zo9JZXJXJ08A9~^f zODQl~8+l2=Stc)wRvu2Wm=8f@9tI^>2{D;txQ}#f8De*ufD4hKJ0+QbusnT*{`nMc?hx=CUt#Y zgw+a`wvsCk(hejS)pGzW=295Bv~bo9BTrZJF<5FcMJj017^X}D#8usEG(@7EUollN0n(sz~XGzHm0{= z(NlU_6Z1hx*bJU7Et4{IdS#R65UyoRT{&`ya%Q^4v;#u8b`>*vTs_${K^Z*5VoFKC z`J_Ca5hkBWP#(^(n0c`MA^KGk4&9scU>pk2ht@1`m>-?Etd zjMO?`JyXqZ!@`yhNAB+57qm?EMqwf-9lM8_Mk8cZI=&Mo9~q^bQ7q;e0zCFU^24j?m5Yor!g82?Y+JN$)Z8?@31~S%aW_la8RVj8lOg=kS zSwG)m4jtz>cx|;?NaK{o!eTxTt({s^57abxytWl+^-hJQWsl1+dGC0o&jO3tZNk$d zZhnZ~2mL1~0ShhWZHUq~&%7=nX6K2HJ}8j7Cq(Y$+WKEHQCYOeqG$5UM5X3pi@Af{ zV8FQvk3EY+|!{lpe%HSmy*N}8= z21o|&gDZlRVDsBhwL!u4py_*9?b)s74wJM|HDGbKkhE4lQ&00+c=S~3l;0H76NtT7 zzE*$N9+RQcFEORjIkkVs14}o3Ku}+`~D$s=E1ODB3Q>{_&a4*;FSs%$$M{lWS+<4p`h! z)hQz1oUWW%ZE>wLLz_2x3k-#L9bujZwKZH_)V3dn#qFuEx|=)CbR0V2*yJp*cnN?b zXm^M_dZse{U5o3-5DRYa?n+XxVEN8W#dEF2G92*-QcWdqt<^ME z;ds#JG(uWlb>4R5H5VbR2A2@h{6gkAv^fZA+AW0C{H4Z<|9e)`y!jkG=6VMqn;PmS z9PP?Ns4HtI|0@#kSdMDz(&+S5Ji0(xs(J`WCC{25ilb|_3fmZdz* zw#WxoC=U->dD!>UY81KUdwx#ouM>jp84r2uGg|sFX7ELSj>f6Wr%qhEcSwPzIz^| zrYwdvcCGWCcI)A!x7@@PY>I>0Tq)K!%)ADn2Jpu71>CfrgJn@ITpOAyy^lEFz{nBr zD-ZWr%nKkeYm<5;j3^)Ne<4gSZk>OGpJSbgx2US85k{ zJ6&vYg@Iu9(_OzPD)n$U~_+{J=AEMGF*DqnSGYUJL)h7Zj+qtq_L$+%@ zZ`32zyLIzYsNAcxp83h)qumOAsHM>RBJBsWGZc2MwgisCV%4Vs>EOtr zJCw$UEUvQ<(-tv~TDhr@{cb{S2NgrxJ;XIATk~;D&Z6qEJ26}7bJ*f~6On2q^&HfG zGBw)CrTsWN%(MfcNQTUlcWG6|CNm{O-=NK3Kx~4NToi65Phhc=Op1SOh^f_XcHvMw zMxKgLcV?oLJnUp*aq9iQspdyoF|C{sh)~Phk5C^qROw^hAhHgl5o)7`K67a1z)u{v zJ1lAttShOgx$8pFUNlAGesNf2Pd| z7lqe67e7-xPgq=i_Gk;%(XTSk8FMeFJ(0OKMjyiB7~#al9oKDG+#}Sy&F4RNT>oUg z8zNWyLOFQS;=1k&t*;$($eXuu^1UyVKHuRobyWd6pn61a!7hn3&U8L&74 zh17fA>#$led-X5~KBVR1*qqjzouM$kka{Jy2^Qy`c2E2m7W2guvJSW(IPBQYx!v+-f(T!eUtI4Xn;cU0Uxcpe8!sxiyfvu88!Ll;FeUqZySYBpsJ_O4Kb~Ug_EUo znE4VyYy$Si-63ZGW7d68TD_PgArmbi6obW3){~K0Q+p~Il^K68su%|dJ zn%L3V>~Qr%b^_W0rGUNwKV+U5kpPFjKfn*!6Bt7SpMQhx|8BznQaY{t7uLKeipWrl z`5&@gzFH8w_D#J&vJ6bsZ8GDh0bal=fS>=A?f+>8|6zLjGcDjG!v(hbc@cB6?a|}^ zJBW_GJ_o? zw4Z^FdIXulPP$EI3%cogcb$9a@vp*k?Wy~d8SJHVL>WCIq97|D|5{ERnBGuXd?c71 z7XxNL4AQ*|GNm|OC$s&7b^Bjorc2=>$ZdK3~=s$rAHKGw(Ovu z@Ebk8AagB!3!Ou75=@uxbo&eqe8?Qyi@HrN0sEF_+Z}-yGHZMrj;zRUVA{Wfnc*K` z{4+e_51pw?aAJj===@KatqI9@q>qXc`zqgWiTsJm66Xe z^Qi{iiR-VH?m#XFyCoyQ_*J7?pjD4A$jqP(bQaJaOqY)MLA?`=mv9m2z4dr}G19Y3rip1(1r|V<}2jhpN^t)fq&VEVOW62z_QH%wT*7btS zT*pD@Oq&EQ2A%_Ey0^jjXPD0)I zLjM#xEBvL5^4X$&5O_|U&=ZiUpVIj(mxAHW>YJTNPAAIu&y zAu|LGg~6P`CBV$TlpR0WHLro0um+fpwZQmi@WT%-&So@pW<^@UCR@QC;3zO%qVa9B>!Cw~|=-dR%j9P=4pbeM>^#HTx zy}-4?4-+zrAUHo6m@L#N;yg2>dlK**BLG8YU! zWa>sRD`?W~LTY?nv{DVcn3=G!9#1wZ^PW`TRg|H)u9CTiT*1^!={lKqY27Z!tcIH& zUsjJN)4!a~?z&E9OTBfyyooPk;e)_GWfoLH_aoEx(KD)~>jl}Yoc~j6o}V6DkXgOD z(AnGoJ-#3__xid{=JaU{<_^{h%=E4GcrtB^&Q@Iq+tq5e)rEr01nr=+KRSU~U>7jA z%3fgZ)dRr%kg3P(Hks)M>pTR^3MT1xvd$?c?btS?=)wpvKV)V&PPfSnrr`%OP6x9> zlXd$IM&d)J{-(}T!8|7UcN*A}3Ydq{IxzG9z>WYv9~59ZZiUT)w&}cGkAD%fhj!}m z1)1r0>FIat@dcR`?f9`CQIHw&DRf4CsmGJ4f2G@G7JLxQg1)9Mf@G;eC<2BC$K9sXZnZI1je3TDgsX|2N%X2-S# zcpcMMKQ{lD&oEi;3!fmWy1qtU?w}_BiwypQcwT|oGxQApFPKB}rd}Qylhpn{e}=hA zFYv{T{(o`A|3>Hb^R8YYl{x+e1un-uy2JkktMl*wq9Bg_=X%2mu=XJ73q69&F8T`K z4z?fQryz6Po&lKQt31PmoBHU|!OZ^#zZ&L6I1Nwt^GJikJu~%KrT@lj}r%h}z2$_%E|qgz7d3OQIp8$8I2tu1!2ySr@&I?-{g!{2laq(50)K0o6 zT;n0E9SD!qczEQBJrp7aLGT?6;j%~?48b`L!U+mjh0hQO*%UH{K=@JQP>73%5R?Gn zx=2re;650_RSGwS|4<0~Da;!R;b)OcVe}9PtrH>qA~F*pR8N3#mqMNh9R}eP1+|o4 zMIMEzLm~7S4v)JcYdD04i4aUl5blZaBna0iY=M0fsgA$tzaQZ5#c`?!hQ<#Mnfnjaw&`+iBRh?5K4&5 zF%YVcf^e6Ds|Xzn;S`0{V z7OAIrKEeZ^+d>%#mtsGqQrBE?Qpf8jb06eZ$GHnE2^ zKzPgtMT;a-j5t7w6+QyRWWSBdWe8MmkjSABHxEM40toRUeE|gb`4FyB7$W=^LfB7X z-a-gNMJ|QW0z&IW5Qd4&MG&elfN+;Wk_cT4;S_}l^C6^&JPK16Lg?`hgjA9B4upn_ zAefdw7$w4&K)6O>JB2YqS_)yoVhFQVLKr7DQ)u%J1U1tM!nO>;eF}S*!NV?GmqS>) z#E~Rj?4b~`6oPLSJSMB1A)J>%I6)yp_^g0OHie885T$yj2ipiChY!S3qdJ8p0frxf(+Cl@RVi5NRvX@rRZpN)dT$5H)obqSRK+ z6It&qI(8 zxW5nQs~h3`p77rUVLyd=n;>iuxfDikfYAB_2%ALa2N0@ngm9O_W)Zp>!YK-?H$&Je z@*qgtMB6Q(?IMfxp?E;rA;PzUvc)>mP9bdr?Gn97yTxYGN5Z@v^s%s!J`p=fp9FDXGCw(S+SXPPMALfofkIJ1+kNKQMm2_T@vx6T(O7rz3})PbXg>ku80GqtHS3C z&<|n^=|_=6x+ZFT3A!%QNjJo4(oNyN7xa^uM*3Ogl5UAcUx9uRnWWp|Iw?5k@YQvhB**S$03vx;m09d zqp+QVhmcM{Sa1wN>lS__{m5V9#`T!CN}ITYf)hY)lXLR*o3 z6@vR^2v;ez7yds$*iT{J4-h(vTneMFKxq9Vgw7)KM+nugLbyvIT!dbOaEij}YY@7L zJPK2PfY9SQgdQU6I)sKlLNMKc&`X5hz>jMbwo~XWq?-^HT!RpM6GC6HnL?ZE5Zr!( z&`;QYf^eV0UJCt%>(3C@-hhz$GX$I1Lm}cO1m9Z_qD9gz2+lu2I6)y+`1}GPn?lAf z5C(}H3UNO}2)Yd+UZmfK;C>6jRSH9de;$PW6z1hY7%FlpjQ#~e>pKvJiOf3?s^7-_ z%^NEKPXL1=gfg6S@VQ6l^Y`idk{`MK#~mM^AJKdg^Y&~ridI0arYqv{Q+T`NdE(Z`vVA9Da;W5k09))Fz*qB zSt6Ih=!XzmKZY!=e_?r!)IsbiELSt}rMIH|dk}$2#lB9aOE8P< zfZ16VB?ILBs@NUxqm`u3Fq-n`<#v2hMD8hjc=)RCPp7HR3GjnYl%8f#TBfu4b@!T#qpW) zLZRus>}YI$W3*a-VMAx`K$SYH9i(;BBXtx$Q_>nci5Au6GNuI?7#~(#sP#KE75Qq3 z@`p=pFnz45&(jgKJ zCAD_h!T9^Zkq7nKsoiR-b4c&yKhz|B@il36ZdKN@C|EK4X@DJ{HIqM@k?x>>Lug~xpSo`2s_0S8bdB$_*3z}+y2jT|r?EVILZIQF`ZWQ* zI?Ye0?#DO%kLen}b;DNj>j;iluER9Vu6`-vfbQ4|BL4AjR`btisvnD<*cDbE-H%__ zVTOFqsGY9yD?5&^?5t~Tb&Xy5g#Cw4J6&T}mgCn(_;GyChwr9NXD;|SzVpNH4e|X| zww&Mp;p<=SK&GxazKX+dZ}ioBM*Uh2Z2E>k<2OHs=mqo31Xy`$BNOa;h8#V|_ZQyO z9m_-G|82z26kU4_VH-5|##B8mM>z;#epcvy6%l@4Z^%kr^MSTS*H-D8y%NMey0}^w zD??kLw`7g3Re`od*WT4NUub-{nXO!_YgG|W)hoSD*Q!D5hA==x0p6DImoMfaPzqvcpbX#!lm*HG?tll74xdTDWZ(@T z1DFC#132wx0Q}-bgfa@xRR|9K+>A(!p@u1w_G!{Wz+Z~jv+4)BkUI)HH?p(uMv%`TDfM05g0-^!F zuviUT4Yj+2@HyZ-a1po!@VjgKfy2O2fXj@_h2Oec47>v@0hR*GfaO4zjMpQ%=()(b zsJVuhpn!$IB49DV&0{*S2jS0wF92>B4S>c#6M%a@_jvBtD-(b_Lz|HZUI$0QZx30PZ2nfEB<>U=^?$SOdHZ ztOZUXn{&W<-~zz!rQQSX0}lXxZ?zWuY6CnT_;r!8fE!Q>z}Hg-s9%9`g2AuM@OwCa z0Q~b8ao~7hFfas20NwyHfH#3Dz*JxwFddiy%miiuvw=ClTp&{%`bMs0Pe+hnG)o0W z0;7P@zzr028MuV{@x`Bw0N)Vf3DOzp0)zuy0q%|13k^Mho_+ob%~!4V(_;1?G50sJDvZr~$;-=_Ew*a2h% z>w))x_kj(-CV=0w<`;n<15bcI0Upx)l5idV%C#JvOaQ;%z%R#51jYknfU&@3I9~x0 zfT2JlFbo(3@a&8Scu?;|hTkHO;{d-^!LM@gYav?ze)E{$bs7ogIl2qJ-@!h?t%Tq4 z*b1BiTA)CG;5DEEa18b0Hy-B${0b$%0@xkk*D$k@5f64A_o!RW0)z#?6N$&u9AGvu3z!LTzvM~76K5*GQ;4S#PA0qhcLgTG zm;j6e#sH%L9!Vnr{(XW(U?^Y%INdqbInd?7Ibd9ht49RS(R~2VRi3X0fl@*lu` zfM)z$7vJ09*%d0*t!_`~utt=*Lrx zjb=+8qkOfsWntWd_B(JF2n6W#80_eghX_9ao&ZezCy4RvHTGBvz&L8O3Ht8_x&aQ| z(J(I0Cn#Ud%ms!sP#ADz>L{2!QwTZ>FoB%_Bj6~Qf8c}#(Vvxeq;o^K3{VUx0x(Tc zpfpela0Too@uN6U0$?ra%$jo?9b@kSjf)2BP#ynVuor9==3veTZs+ZRb^y~>2Kxf9 z0qj){Gv@^7%_#t7*j1-WaHs%qa`=EN0-RK=1W^SxeHh;s%z|0THekkcqH+=a2Cz^T z$iL1~4`9Ld0j8}Bn|TK!><6yHKlo7<0sK>IRSSWdKn;MGJk|9uwb}*3jAtvtz|DY$ zKvN(DXbc1a!9aZ=5C{OMH2~<#a3jL53rySuU}lVNv<6xM4nO8W zotmRU7F{bi5!v+|F7}+=(Or(QVFbsIk&fiRo@OmH|;OvhC*JA;I2jjrZFbd)Rz&wO`ojV^; zfH^=6^x5E9zziT7_M6}V;BjD{5~Bk>EiH{@rAtdARdRb_Vi9^l zE?vpdL(FG9^2>ZKzX6g+yeL<7b!3s>h7A|wx*lxq(@G=Es^nM0lnyD)Q5Bzya%Ydc85`e4uFn9~F8K6J&UJY!N z41*2tA+R1;2dn|s0`CHdRBy4~2X6vc2tS7qu8T~+0e=k~1P%cEfqlSU;0s_6@G0;y zup8JZ`dyaG_527yUMpt<9|GHfZNOGw2f!n9Czwf?lvyw)CZWB&y1Od@q8G-A>#0~0a^nbI>)eC5#~*|oe^OG z6Se^J$w45(e2T#FB|;JAoh*HMCrgcqX)_&dM?M7$bL8tNl=Fn~9RSWD#M{+}wj4ti z$O-0fW`>T*#zGkHh$9oc-R7+~*BEWy+qmm-ydCGQxC}cI+z)si;B7hYtGH1-z1r;y zfj3gU0bWKqu1p#BLI%vl!SBH*3RncKGf*Dj%@s2Q8Rp^#Z_H@V0nY|_uP_Td6POH4 z0yvS=IsT&nGOxuag1dpkfw2gW21Wv@Kr%1{7yw*G{9tfA5DUZr9JXk19IzANf#5;9 zodiw*N)NSCV(&J-6gQub$ZBOTuCQ)gnPH zwyw#8LnA-``hN9rDN*7V*~5#E`AWc{#aciA#d*u?!6Dc$*dJL;6#agYJL0r@kAD1n zK1JZy?*4%U(=RK#!w=>7`D4Qu7k`lh@ybx?+j4DD!q-?>)E{AV6Mb*XQ}8R@I#rAw z;?ZrnzBCuV%*Fw`Nc78-o8aZ8g?VbSLwWKMynwLe4y>sn=Z@?lRT4Kz^+nbsW0^vz z57v#S@T=?*6j>M>531q*@S%U#gAHPxq!3*aT5XPFBhCUsk`~IX|YRX!aXw(Hst}MMBhyKTl@v49$1wE|TCN z#fcfDu_E*hN89I!Pa!o}p(hP+ozOFPSJwggNwX2dUQwF-RC(~MMN{)*zHt`C@1n*( zz@rpA_FTC@t9mH;F-1k+yQoP8;hJGAQ&{cfqb0>$W_K2I z$`jd*O^NE@WF7s;N%Hp#48W{1+(nEBVh$9ll~E+^h;M#Oad95mdHK3xkAg#N-02(B zu3R{t@6b%R{*LnciCQ49G4Lx7zdCW%Ouc8BzRUNUFZ#ow!3S{gg2RNIKffK7bR;g{ z;cGqV#A%;gxsrW4#4#MgJn&@O6M}_5%trb59iu`FDXR^ zRvbURVr2b7qV7FRyV9s}1voUkJ+5={l2dY=r22jh>T&i5AjTUp+yDIOj*I6(wAT^S zNlZXeuXs4HLqZCN4@{nVAST~olGqFfyhrdg$U7T;mEbpH&f|A>RCc|Q?{~(1{(Vk5 zIJ^djLL-jFBpm)#&Uf%a{;b_rU#EWcu4RSsy2E0ScQ*Vg!Y{bmhK2!u9JS>8o$?SzS&0YmU?sX=_%v(EZ|R=-9_26}*bybZ z&+)JQ=xa;~M@IyT@()mnE^y$S`Mp`?KE5}ujn8)&EW+U+O&3Ez-s|ARB7O+dSn;eV$_Z1B~8fPqFKP+(CLnY<|t?A7v(+1)Q z;VK*F-sEBYlEZ{ z++UQp!Wt|5pTL?aa$3MzAws)=b_v&DoHl8VjGpqh)y1V|$m~INarg-`a}qfnjs3mK z)xfnmD)En%DJN`y;#{(bC4VC0ej-USmKBHol*{AZ{3fMI^GwFp=2KQ%Fj#}r(x;P|sR$6aks{-B#=Jhg`7bE?R?W#E3UeI2> zC-e*oW~lbQT2}wc|2zY&*YPG3YW^zzFK&cdrk+)n@F|RObm?id{Ida5`=>zTpEl$9 z$@EOt@=1Tuw6HPq6*G!j{;Pi3adq5VN!hrZs)q|Vs4=318B;k~)G!-s^-6wLPs{GeKCfwJU+3pwrpF@beP#1D-%jA>AE_gfjud&p90J;qxsEMn~F z<<>|mIOt*7#OQ#cxw3>+r+%6Vsi@IIzR^f{7d5(jH*KO_-`-1m(x%HdQFl?p0Q4gc z=HpF77kJ1Qn}~|Va3$3c;`JutjiSbym9uNVtXCZ|-9!$G!AqStNeN z{o_j2>VMK1F*&ZQBvJh-CT{e zyf24o*KPlp@8vM@x~s9Gys4G=pq$aY!LC-C=e-Vde(}FjISzFW=0&={;TU3gp)%y& zhxMD^X*nf7Ca;zF%*$9tTyix!c^g`5^V0MF(4W_}uQXkAYv>nbDA9U;Db&!b_52E; zdaXrdWpKOJ^J{~mT8p?+#)0yL*5YU>V@=a^WMdZLK3JX#f?P&Nz_>U}n|(eiqeQRE zUzCw{w-)tEqw;kuVz>`7X>Jh-rNLSeVrgk(?JC_Y+U4~>Hr)~9NPX2JoXcQPZdpWA zaKk4d6U0k+Jr{Au&Dg+O?x5ZGEq!x$*xJX%*I-Tu`SJG9P^^P!RTgdZ>L5m!HFofR z{vsMh1!#AOZXLy?vgn0n9mPYYNa!T|I8nBA(pI@sL_qgLh1Tyy3RHlT+o`j*l4{m% z^XPuxGItOYj2Ki7rHx107ng=D6b~M?X(;=45nVitWh!#s1a(1u(G4ZSEN4qJ`?;Z- zUqJqh5@p?S$Y-?k*C&jg93ObhW&+r?`MM z>*%+al)&EJ)N1}%V_Dqfylkg?Iv@>3_tH*_ue?h?S#rIEdwx@=BZl`$H{Xk0z4X|! z549N1vbDX$#`37hHoPfc-q>MqVuZFKPpS7~P50SLN5KMJ@`Fb?#7$(DtU@9^v5C{F~nV{v=`j42vaGq-Ed0FR7T_lk`Yvn!z(&C6YUR!LjA=O{WhHLd5o{cYOrkoM%0 za`jffSyq;+K;gJOb2J7xjz&ifv?jQV3zdzXv|}Yuw%EjgDi}5O@tlX)SjAXh?qU;H zs$frFsOLIa#JOI}TK}a!*4X{m*u-I9RBXFV4D^NPc6jnqF=O$UP3-eNdBXX^dzyL< z&jz;!Xf-?<(B*#ew7hNb;Dsvo^naR`r8KB&tl4}}G#>M#l++llw1_i7{W|oxUs0`> zKl7Tb$4og8@u+g;roZYnMoeamSX$K>;Jp|gC6UMMH51AV4Qq4@9=PV^sq$m|Fw67byKg4O}Xr(w3UgI}a9P$=LEY)-<|5yX8Bs zjYOGRX!mn-+A*WX*D{v+>y`1SHY(y+V|p(7m78OFI+nn*D=vRYEUJwPI46h?Ya466 zLSfHVRdlIiEcFW4avvp#H|rQ{HanW2^>gGa;R+V%(xWnNTxFR@nr}ELE6l-BV($ccHKU6gJ!+BLMQQQ22 zng+RtU7Ncy-=lt_7!HpHUEzTTDQWc+J_=|Mn)*k+$7sax$zc`$aKErVyXNG_EJ_rg zFzv_iVEI#Tc3-n?O@|iw9_JC`gP0RNmK==hc;i5R%#%b>v@UAqJxqPeBJDtv2~qV@ zr*zBr2pJ|?z~ku|nU^9))Wrhh`~DA?fIF@Ba9G>OIla^;c4{wq$n8dm zlJzk8p1)&%_VJJQz(+2dDvEc(4E^U1erl(Rn(bcc7GHmC^vK_6dG+TdPd)QewI})> z84+RSO_9g*cbvi_#o+*S&~wkTo_P|XJvQ<1_8zHCm5=VNelX@t?+xnl#N}?NKT`NL zM=l*kilu?C)SeeSU_s)<`o>mIA0+*2P5yM0XdZ+kLcQ_zkX=TLnL((L*J$xsLDmOQ ze{Lt^YlL0;7`;WAU}IU?bBwsv7&kP18ej?Q&*ntMCa=`vj(oLB|C_1hQ)5IV9|%4> z8mwiDwwO@*1I1?s=b55j=}FYn$4}3eQsBvC)YFOckJk^5XKhH#XL?UFb98{VBA&1E zGY>x<9sNwzU!lmCEWT&ET=pF&O148EYI8F3U+$7;T2*blnAsAUIf{Py0Oe03edg$^ z=K1=(!sEPMBCFFsc?^t)r-NRh$6meq>iqhPr`XSLYWm{jV{Ck(l#fCkqxoFBy=!Cd z;f>ISjw7bs4%&B~yGDR|E%5AP?^kHf^K>XZpr5J;kJs`OEg- zU4;eC>HpSt<>>Nfmzq8||8g4syB+;pNiQDEfAdm6KM9|m8P846e|2KKu)fd!YSGaZ z|LG3*;#~g=JDP{y2VQk1X(z+JkDA3C-yC<6cZuo^vi2Ls{;#k|@z8oiPxUv8JP}`M zC;UH~w_<+;R$2Z*`EOoT9qx_$j(@TrK67E{m;kRjw{A=p75n0L{`uFe@PWc>w zU%er&^)*&(;GdyA+q!?)rRKs;AF6|`z6JIdxp&ME&0oje+KWoj?%yIZ#LU-?H5=?k zJ^1R^sA0)NVv}PGiw8SL|MYtoMV1DlT;A!~!FVwwZThD>OP)Pm(a%_3_M9fx_cKPy12cq6q%puHc$)Sk zYT`8UC=%T{dzy$MFP$dFB3|A)O>BhS-~s$fBh&TeexH4>((Y-vv*YCzZvBf+*Pg%4 z%V_Gd<+tFU)R=nw6^x#z_Yl0!&8JL*8aMBBJmpavcPHwYYX$J2aj?nW!>(m z8!IOb9Lblr0_(FL)>-qT(1h3Fz#a?x@Q?F3A1zDat5Em_DK3Dgs$? zzuDp_>(LG#d`1z~y{r3A-FJ7&_eekt=Yfw?iRBl&Z~i_%X69`1nhj}}!=o%b#{D$l zcG1b}R^&JGLp`SRofV%B^h+(5AM?#@k$|+`S9FhuGeRp*{B~h#zQ@DaVmWg!K1X{k z>6eJ}^NP3IULcR^h~d*4Z?6Y4t_GGknV+`B9C3?j!{Nc2?Y=zkWbL`dvhzI#A;t|c z!`C#=o;2>}viz9wb41et=)2G6ik<_E0S#W>{+IWe-m8Dn@A}Bd`bho7Sn8wQ;N|n- z<#PzXDV&XY5VTqUjbv2Y=pvP-^*Doxs=tHq!bkS_{dGM>W>dyyP8E z#MBgZVo{5iyyFRn?!pEKyyH2J^z=NlGOZZJ{L+)+O zR*1s`F}ZuL5Hm-D$F30aApFMTtren0veDgTBT^Pe4o_ByE`zXuyjN-mNAA?KBQ|$B z=!}Vj$-#&5L5Sh+pDy@#lyYfSTt*CbPyXV$?Mkr}X}$ZygNKhtpeJFXfTJ%n-_Bdd#3m8Krl0v=tPxG&L1OAv35`(<{i7wW-NzDL8L~ zlN}n2&i-uYusRbao8gV1-2*i(0EL$F{qwe(ic#;;a)=*9d|Tc1(e92X4x(14O3)1%+&WVRj4{e*Bq+#6UprBJyKpm~cr9pei{<+*!XUqTLc*OZQVDJ6}w_V$o3c zQ6Axq9|jHe*|+%(8j{YM{7Wc077`JK*T=&BnjPbmVF~u*CVbqFAp?M8W;0+B-Y}E3 z1{btUeUbY+kPkS2VX+ef*##L^*FnJ$t(iVoEqz-Wzm|Amfak}^E)L!4I!^I%pzL8b zfim;}spHVo(i3z&PRNm^m(j9#=oQi9P-m6#ti->lRr%zag}c}{@np!UoNmRVHLr5M zG9JGQyB%t3Q5+?8&_o-z2WqV^DM?qC z<5Rxmc&wD@J@dww22S}x{UYiQ^j-nH0OlNGf_-v#4EO*m{4IJMO2!~!)NcGu0vkPB zCGz;g)wqv^HYe23Jd|ZYHMCU;kVbe7wJQa0EAw-F1-ry9o*9-Ad>lGqOr5=OXXP9@ zrN9gDV|6nF2KyLYOAAov5mL*sVk2w^dD^4~;F~H#-Y{Ine^1@lgO>S-t+iCl=KO&hn;BA5&x)~(m;MI!4=s+OIBj1 zq->zZm4c#oMgw>8r$|rvt;)vo7&CiQd$Dz}udyTy9&$hvZC{1?@?8^OJraj({{`v< zr$@mB-s1yN$;(%~n>!So;@1Hey_0yuX5QM8h|7*%{*`#cG8cs9+6&~Ij?s8~k;3q_ zy4lQS}C*iznfp@hC}4RhGX+ubVBE)GLgcRs@Fm}MDs@nyt;H3TSuk5|9?4K6-YayDPqO#5!>L@iGr<*k>xJ)o(V#405`||8v+2l1bM}<&B8fvdUhP; iXQhHcMSY`?Afuz#QEvK0=vz_WEMyr}q_+u0JN^QcAS%cJ diff --git a/package.json b/package.json index edd0f95..ad02dd6 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "@radix-ui/react-toggle-group": "^1.1.11", "@radix-ui/react-tooltip": "^1.2.8", "@tailwindcss/vite": "^4.2.1", - "@tanstack/react-query": "^5.83.0", + "@tanstack/react-query": "^5.99.0", "@tanstack/react-router": "^1.168.0", "@tanstack/react-start": "^1.167.14", "@tanstack/router-plugin": "^1.167.10", @@ -50,12 +50,14 @@ "cmdk": "^1.1.1", "date-fns": "^4.1.0", "embla-carousel-react": "^8.6.0", + "framer-motion": "^12.38.0", "input-otp": "^1.4.2", "lucide-react": "^0.575.0", "react": "^19.2.0", "react-day-picker": "^9.14.0", "react-dom": "^19.2.0", - "react-hook-form": "^7.71.2", + "react-hook-form": "^7.72.1", + "react-imask": "^7.6.1", "react-resizable-panels": "^4.6.5", "recharts": "^2.15.4", "sonner": "^2.0.7", @@ -64,7 +66,7 @@ "tw-animate-css": "^1.3.4", "vaul": "^1.1.2", "vite-tsconfig-paths": "^6.0.2", - "zod": "^3.24.2" + "zod": "^4.3.6" }, "devDependencies": { "@eslint/js": "^9.32.0", diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index dceedff..d204c26 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -57,12 +57,3 @@ const rootRouteChildren: RootRouteChildren = { export const routeTree = rootRouteImport ._addFileChildren(rootRouteChildren) ._addFileTypes() - -import type { getRouter } from './router.tsx' -import type { createStart } from '@tanstack/react-start' -declare module '@tanstack/react-start' { - interface Register { - ssr: true - router: Awaited> - } -} From 6184835992a8420cc27e89488f36d9fa12603665 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 16:48:41 +0000 Subject: [PATCH 2/7] Changes Co-authored-by: domfelipe <53182096+domfelipe@users.noreply.github.com> --- .env | 5 + bun.lockb | Bin 288556 -> 293002 bytes package.json | 1 + src/integrations/supabase/auth-middleware.ts | 77 +++++++++ src/integrations/supabase/client.server.ts | 37 +++++ src/integrations/supabase/client.ts | 36 +++++ src/integrations/supabase/types.ts | 155 +++++++++++++++++++ supabase/config.toml | 1 + 8 files changed, 312 insertions(+) create mode 100644 .env create mode 100644 src/integrations/supabase/auth-middleware.ts create mode 100644 src/integrations/supabase/client.server.ts create mode 100644 src/integrations/supabase/client.ts create mode 100644 src/integrations/supabase/types.ts create mode 100644 supabase/config.toml diff --git a/.env b/.env new file mode 100644 index 0000000..14fb927 --- /dev/null +++ b/.env @@ -0,0 +1,5 @@ +SUPABASE_PUBLISHABLE_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InNtc2FybWdvaXJsY2VkbXF2ZGdjIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzY0MzczNjAsImV4cCI6MjA5MjAxMzM2MH0.AjMSQOn3BtzV-fJ2x9SWoM2ozjLyPD6g3dmTSeCT9II" +SUPABASE_URL="https://smsarmgoirlcedmqvdgc.supabase.co" +VITE_SUPABASE_PROJECT_ID="smsarmgoirlcedmqvdgc" +VITE_SUPABASE_PUBLISHABLE_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InNtc2FybWdvaXJsY2VkbXF2ZGdjIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzY0MzczNjAsImV4cCI6MjA5MjAxMzM2MH0.AjMSQOn3BtzV-fJ2x9SWoM2ozjLyPD6g3dmTSeCT9II" +VITE_SUPABASE_URL="https://smsarmgoirlcedmqvdgc.supabase.co" diff --git a/bun.lockb b/bun.lockb index 6a506b66490ee7a5df0c80b9eb68d1ed90ff6221..4d5c249748abefb8032cdf7127bbd152d76a56ab 100755 GIT binary patch delta 47880 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

  • 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 delta 45015 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 diff --git a/package.json b/package.json index ad02dd6..c5445e7 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "@radix-ui/react-toggle": "^1.1.10", "@radix-ui/react-toggle-group": "^1.1.11", "@radix-ui/react-tooltip": "^1.2.8", + "@supabase/supabase-js": "^2.103.3", "@tailwindcss/vite": "^4.2.1", "@tanstack/react-query": "^5.99.0", "@tanstack/react-router": "^1.168.0", diff --git a/src/integrations/supabase/auth-middleware.ts b/src/integrations/supabase/auth-middleware.ts new file mode 100644 index 0000000..4e8f69d --- /dev/null +++ b/src/integrations/supabase/auth-middleware.ts @@ -0,0 +1,77 @@ +// This file is automatically generated. Do not edit it directly. +import { createMiddleware } from '@tanstack/react-start' +import { getRequest } from '@tanstack/react-start/server' +import { createClient } from '@supabase/supabase-js' +import type { Database } from './types' + + + +export const requireSupabaseAuth = createMiddleware({ type: 'function' }).server( + async ({ next }) => { + + const SUPABASE_URL = process.env.SUPABASE_URL; + const SUPABASE_PUBLISHABLE_KEY = process.env.SUPABASE_PUBLISHABLE_KEY; + + if (!SUPABASE_URL || !SUPABASE_PUBLISHABLE_KEY) { + throw new Response( + 'Missing Supabase environment variables. Ensure SUPABASE_URL and SUPABASE_PUBLISHABLE_KEY are set.', + { status: 500 } + ); + } + + const request = getRequest(); + + if (!request?.headers) { + throw new Response('Unauthorized: No request headers available', { status: 401 }); + } + + const authHeader = request.headers.get('authorization'); + + if (!authHeader) { + throw new Response('Unauthorized: No authorization header provided', { status: 401 }); + } + + if (!authHeader.startsWith('Bearer ')) { + throw new Response('Unauthorized: Only Bearer tokens are supported', { status: 401 }); + } + + const token = authHeader.replace('Bearer ', ''); + if (!token) { + throw new Response('Unauthorized: No token provided', { status: 401 }); + } + + const supabase = createClient( + SUPABASE_URL!, + SUPABASE_PUBLISHABLE_KEY!, + { + global: { + headers: { + Authorization: `Bearer ${token}`, + }, + }, + auth: { + storage: undefined, + persistSession: false, + autoRefreshToken: false, + }, + } + ); + + const { data, error } = await supabase.auth.getClaims(token); + if (error || !data?.claims) { + throw new Response('Unauthorized: Invalid token', { status: 401 }); + } + + if (!data.claims.sub) { + throw new Response('Unauthorized: No user ID found in token', { status: 401 }); + } + + return next({ + context: { + supabase, + userId: data.claims.sub, + claims: data.claims, + }, + }) + } +) diff --git a/src/integrations/supabase/client.server.ts b/src/integrations/supabase/client.server.ts new file mode 100644 index 0000000..bfe7546 --- /dev/null +++ b/src/integrations/supabase/client.server.ts @@ -0,0 +1,37 @@ +// This file is automatically generated. Do not edit it directly. +// Server-side Supabase client with service role key - bypasses RLS. +// Use this for admin operations in server functions and server routes only. +// For user-authenticated queries (with RLS), use the auth middleware instead. +import { createClient } from '@supabase/supabase-js'; +import type { Database } from './types'; + +function createSupabaseAdminClient() { + const SUPABASE_URL = process.env.SUPABASE_URL; + const SUPABASE_SERVICE_ROLE_KEY = process.env.SUPABASE_SERVICE_ROLE_KEY; + + if (!SUPABASE_URL || !SUPABASE_SERVICE_ROLE_KEY) { + throw new Error( + 'Missing Supabase server environment variables. Ensure SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY are set.' + ); + } + + return createClient(SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, { + auth: { + storage: undefined, + persistSession: false, + autoRefreshToken: false, + } + }); +} + +let _supabaseAdmin: ReturnType | undefined; + +// Server-side Supabase client with service role - bypasses RLS +// SECURITY: Only use this for trusted server-side operations, never expose to client code +// Import like: import { supabaseAdmin } from "@/integrations/supabase/client.server"; +export const supabaseAdmin = new Proxy({} as ReturnType, { + get(_, prop, receiver) { + if (!_supabaseAdmin) _supabaseAdmin = createSupabaseAdminClient(); + return Reflect.get(_supabaseAdmin, prop, receiver); + }, +}); diff --git a/src/integrations/supabase/client.ts b/src/integrations/supabase/client.ts new file mode 100644 index 0000000..c81d68f --- /dev/null +++ b/src/integrations/supabase/client.ts @@ -0,0 +1,36 @@ +// This file is automatically generated. Do not edit it directly. +import { createClient } from '@supabase/supabase-js'; +import type { Database } from './types'; + +function createSupabaseClient() { + // Use import.meta.env for client-side (Vite build-time replacement) + // Fall back to process.env for SSR (server-side rendering) + const SUPABASE_URL = import.meta.env.VITE_SUPABASE_URL || process.env.SUPABASE_URL; + const SUPABASE_PUBLISHABLE_KEY = import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY || process.env.SUPABASE_PUBLISHABLE_KEY; + + if (!SUPABASE_URL || !SUPABASE_PUBLISHABLE_KEY) { + throw new Error( + 'Missing Supabase environment variables. Ensure SUPABASE_URL and SUPABASE_PUBLISHABLE_KEY (or VITE_ prefixed versions) are set in your .env file.' + ); + } + + return createClient(SUPABASE_URL, SUPABASE_PUBLISHABLE_KEY, { + auth: { + storage: typeof window !== 'undefined' ? localStorage : undefined, + persistSession: true, + autoRefreshToken: true, + } + }); +} + +let _supabase: ReturnType | undefined; + +// Import the supabase client like this: +// import { supabase } from "@/integrations/supabase/client"; +export const supabase = new Proxy({} as ReturnType, { + get(_, prop, receiver) { + if (!_supabase) _supabase = createSupabaseClient(); + return Reflect.get(_supabase, prop, receiver); + }, +}); + diff --git a/src/integrations/supabase/types.ts b/src/integrations/supabase/types.ts new file mode 100644 index 0000000..ba7e5bb --- /dev/null +++ b/src/integrations/supabase/types.ts @@ -0,0 +1,155 @@ +export type Json = + | string + | number + | boolean + | null + | { [key: string]: Json | undefined } + | Json[] + +export type Database = { + // Allows to automatically instantiate createClient with right options + // instead of createClient(URL, KEY) + __InternalSupabase: { + PostgrestVersion: "14.5" + } + public: { + Tables: { + [_ in never]: never + } + Views: { + [_ in never]: never + } + Functions: { + [_ in never]: never + } + Enums: { + [_ in never]: never + } + CompositeTypes: { + [_ in never]: never + } + } +} + +type DatabaseWithoutInternals = Omit + +type DefaultSchema = DatabaseWithoutInternals[Extract] + +export type Tables< + DefaultSchemaTableNameOrOptions extends + | keyof (DefaultSchema["Tables"] & DefaultSchema["Views"]) + | { schema: keyof DatabaseWithoutInternals }, + TableName extends DefaultSchemaTableNameOrOptions extends { + schema: keyof DatabaseWithoutInternals + } + ? keyof (DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] & + DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Views"]) + : never = never, +> = DefaultSchemaTableNameOrOptions extends { + schema: keyof DatabaseWithoutInternals +} + ? (DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] & + DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Views"])[TableName] extends { + Row: infer R + } + ? R + : never + : DefaultSchemaTableNameOrOptions extends keyof (DefaultSchema["Tables"] & + DefaultSchema["Views"]) + ? (DefaultSchema["Tables"] & + DefaultSchema["Views"])[DefaultSchemaTableNameOrOptions] extends { + Row: infer R + } + ? R + : never + : never + +export type TablesInsert< + DefaultSchemaTableNameOrOptions extends + | keyof DefaultSchema["Tables"] + | { schema: keyof DatabaseWithoutInternals }, + TableName extends DefaultSchemaTableNameOrOptions extends { + schema: keyof DatabaseWithoutInternals + } + ? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] + : never = never, +> = DefaultSchemaTableNameOrOptions extends { + schema: keyof DatabaseWithoutInternals +} + ? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"][TableName] extends { + Insert: infer I + } + ? I + : never + : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema["Tables"] + ? DefaultSchema["Tables"][DefaultSchemaTableNameOrOptions] extends { + Insert: infer I + } + ? I + : never + : never + +export type TablesUpdate< + DefaultSchemaTableNameOrOptions extends + | keyof DefaultSchema["Tables"] + | { schema: keyof DatabaseWithoutInternals }, + TableName extends DefaultSchemaTableNameOrOptions extends { + schema: keyof DatabaseWithoutInternals + } + ? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] + : never = never, +> = DefaultSchemaTableNameOrOptions extends { + schema: keyof DatabaseWithoutInternals +} + ? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"][TableName] extends { + Update: infer U + } + ? U + : never + : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema["Tables"] + ? DefaultSchema["Tables"][DefaultSchemaTableNameOrOptions] extends { + Update: infer U + } + ? U + : never + : never + +export type Enums< + DefaultSchemaEnumNameOrOptions extends + | keyof DefaultSchema["Enums"] + | { schema: keyof DatabaseWithoutInternals }, + EnumName extends DefaultSchemaEnumNameOrOptions extends { + schema: keyof DatabaseWithoutInternals + } + ? keyof DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions["schema"]]["Enums"] + : never = never, +> = DefaultSchemaEnumNameOrOptions extends { + schema: keyof DatabaseWithoutInternals +} + ? DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions["schema"]]["Enums"][EnumName] + : DefaultSchemaEnumNameOrOptions extends keyof DefaultSchema["Enums"] + ? DefaultSchema["Enums"][DefaultSchemaEnumNameOrOptions] + : never + +export type CompositeTypes< + PublicCompositeTypeNameOrOptions extends + | keyof DefaultSchema["CompositeTypes"] + | { schema: keyof DatabaseWithoutInternals }, + CompositeTypeName extends PublicCompositeTypeNameOrOptions extends { + schema: keyof DatabaseWithoutInternals + } + ? keyof DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"] + : never = never, +> = PublicCompositeTypeNameOrOptions extends { + schema: keyof DatabaseWithoutInternals +} + ? DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"][CompositeTypeName] + : PublicCompositeTypeNameOrOptions extends keyof DefaultSchema["CompositeTypes"] + ? DefaultSchema["CompositeTypes"][PublicCompositeTypeNameOrOptions] + : never + +export const Constants = { + public: { + Enums: {}, + }, +} as const diff --git a/supabase/config.toml b/supabase/config.toml new file mode 100644 index 0000000..b925aa7 --- /dev/null +++ b/supabase/config.toml @@ -0,0 +1 @@ +project_id = "smsarmgoirlcedmqvdgc" \ No newline at end of file From b5254cf33d25b6d6a3aef0588a074806b8c5a7e5 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 16:49:34 +0000 Subject: [PATCH 3/7] Changes Co-authored-by: domfelipe <53182096+domfelipe@users.noreply.github.com> --- public/favicon.svg | 5 + public/og.svg | 20 +++ src/components/mika/Logo.tsx | 19 +++ src/components/mika/ThemeToggle.tsx | 21 +++ src/components/theme-provider.tsx | 65 ++++++++ src/routeTree.gen.ts | 9 ++ src/styles.css | 227 ++++++++++++++++++---------- 7 files changed, 289 insertions(+), 77 deletions(-) create mode 100644 public/favicon.svg create mode 100644 public/og.svg create mode 100644 src/components/mika/Logo.tsx create mode 100644 src/components/mika/ThemeToggle.tsx create mode 100644 src/components/theme-provider.tsx diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..27dbdc5 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,5 @@ + + + M. + diff --git a/public/og.svg b/public/og.svg new file mode 100644 index 0000000..6d155cf --- /dev/null +++ b/public/og.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + Mika. + + + Seu assistente de IA no Telegram + + + mika.domco.ai + + + diff --git a/src/components/mika/Logo.tsx b/src/components/mika/Logo.tsx new file mode 100644 index 0000000..0388116 --- /dev/null +++ b/src/components/mika/Logo.tsx @@ -0,0 +1,19 @@ +import { Link } from "@tanstack/react-router"; +import { cn } from "@/lib/utils"; + +export function Logo({ className, size = "md" }: { className?: string; size?: "sm" | "md" | "lg" }) { + const sizes = { + sm: "text-xl", + md: "text-2xl", + lg: "text-3xl", + }; + return ( + + Mika. + + ); +} diff --git a/src/components/mika/ThemeToggle.tsx b/src/components/mika/ThemeToggle.tsx new file mode 100644 index 0000000..ec19fe1 --- /dev/null +++ b/src/components/mika/ThemeToggle.tsx @@ -0,0 +1,21 @@ +"use client"; + +import { Moon, Sun } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { useTheme } from "@/components/theme-provider"; + +export function ThemeToggle() { + const { theme, toggleTheme } = useTheme(); + return ( + + ); +} diff --git a/src/components/theme-provider.tsx b/src/components/theme-provider.tsx new file mode 100644 index 0000000..20a32a3 --- /dev/null +++ b/src/components/theme-provider.tsx @@ -0,0 +1,65 @@ +"use client"; + +import { createContext, useContext, useEffect, useState, type ReactNode } from "react"; + +type Theme = "light" | "dark"; +type ThemeContextValue = { + theme: Theme; + setTheme: (t: Theme) => void; + toggleTheme: () => void; +}; + +const ThemeContext = createContext(null); +const STORAGE_KEY = "mika-theme"; + +function applyTheme(theme: Theme) { + if (typeof document === "undefined") return; + const root = document.documentElement; + if (theme === "dark") root.classList.add("dark"); + else root.classList.remove("dark"); + root.style.colorScheme = theme; +} + +function getInitialTheme(): Theme { + if (typeof window === "undefined") return "light"; + try { + const stored = window.localStorage.getItem(STORAGE_KEY); + if (stored === "light" || stored === "dark") return stored; + } catch {} + if (window.matchMedia?.("(prefers-color-scheme: dark)").matches) return "dark"; + return "light"; +} + +export function ThemeProvider({ children }: { children: ReactNode }) { + const [theme, setThemeState] = useState("light"); + const [mounted, setMounted] = useState(false); + + useEffect(() => { + const t = getInitialTheme(); + setThemeState(t); + applyTheme(t); + setMounted(true); + }, []); + + const setTheme = (t: Theme) => { + setThemeState(t); + applyTheme(t); + try { + window.localStorage.setItem(STORAGE_KEY, t); + } catch {} + }; + + const toggleTheme = () => setTheme(theme === "dark" ? "light" : "dark"); + + return ( + +
    {children}
    +
    + ); +} + +export function useTheme() { + const ctx = useContext(ThemeContext); + if (!ctx) throw new Error("useTheme deve ser usado dentro de ThemeProvider"); + return ctx; +} diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index d204c26..dceedff 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -57,3 +57,12 @@ const rootRouteChildren: RootRouteChildren = { export const routeTree = rootRouteImport ._addFileChildren(rootRouteChildren) ._addFileTypes() + +import type { getRouter } from './router.tsx' +import type { createStart } from '@tanstack/react-start' +declare module '@tanstack/react-start' { + interface Register { + ssr: true + router: Awaited> + } +} diff --git a/src/styles.css b/src/styles.css index a9806b4..dfd4671 100644 --- a/src/styles.css +++ b/src/styles.css @@ -5,47 +5,48 @@ @custom-variant dark (&:is(.dark *)); /* - * Design system definition. - * - * The @theme inline block maps CSS custom properties to Tailwind utility - * classes (e.g. --color-primary -> bg-primary, text-primary). - * - * The :root and .dark blocks define the actual color values using oklch. - * All colors MUST use oklch format. - * - * To add a new semantic color: - * 1. Add the variable to :root (light value) and .dark (dark value) - * 2. Register it in @theme inline as --color-: var(--) + * Mika Design System + * Paleta inspirada em Linear / Supabase / Cal.com. + * - Primary: Indigo (#6366F1) — confiança e tecnologia + * - Secondary: Emerald (#10B981) — sucesso/check + * - Accent: Amber (#F59E0B) — destaque, ponto final do wordmark + * Todas as cores em oklch. */ @theme inline { + --font-sans: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; + --radius-sm: calc(var(--radius) - 4px); --radius-md: calc(var(--radius) - 2px); --radius-lg: var(--radius); --radius-xl: calc(var(--radius) + 4px); --radius-2xl: calc(var(--radius) + 8px); --radius-3xl: calc(var(--radius) + 12px); - --radius-4xl: calc(var(--radius) + 16px); + --color-background: var(--background); --color-foreground: var(--foreground); + --color-surface: var(--surface); --color-card: var(--card); --color-card-foreground: var(--card-foreground); --color-popover: var(--popover); --color-popover-foreground: var(--popover-foreground); --color-primary: var(--primary); --color-primary-foreground: var(--primary-foreground); + --color-primary-dark: var(--primary-dark); + --color-primary-light: var(--primary-light); --color-secondary: var(--secondary); --color-secondary-foreground: var(--secondary-foreground); - --color-muted: var(--muted); - --color-muted-foreground: var(--muted-foreground); --color-accent: var(--accent); --color-accent-foreground: var(--accent-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); --color-destructive: var(--destructive); --color-destructive-foreground: var(--destructive-foreground); + --color-success: var(--success); + --color-warning: var(--warning); --color-border: var(--border); --color-input: var(--input); --color-ring: var(--ring); - --color-ring-offset-background: var(--background); --color-chart-1: var(--chart-1); --color-chart-2: var(--chart-2); --color-chart-3: var(--chart-3); @@ -63,73 +64,115 @@ :root { --radius: 0.625rem; - --background: oklch(1 0 0); - --foreground: oklch(0.129 0.042 264.695); + + /* Mika light tokens */ + --background: oklch(0.985 0 0); /* #FAFAFA */ + --foreground: oklch(0.18 0.04 265); /* #0F172A */ + --surface: oklch(1 0 0); /* #FFFFFF */ + --card: oklch(1 0 0); - --card-foreground: oklch(0.129 0.042 264.695); + --card-foreground: oklch(0.18 0.04 265); --popover: oklch(1 0 0); - --popover-foreground: oklch(0.129 0.042 264.695); - --primary: oklch(0.208 0.042 265.755); - --primary-foreground: oklch(0.984 0.003 247.858); - --secondary: oklch(0.968 0.007 247.896); - --secondary-foreground: oklch(0.208 0.042 265.755); - --muted: oklch(0.968 0.007 247.896); - --muted-foreground: oklch(0.554 0.046 257.417); - --accent: oklch(0.968 0.007 247.896); - --accent-foreground: oklch(0.208 0.042 265.755); - --destructive: oklch(0.577 0.245 27.325); - --destructive-foreground: oklch(0.984 0.003 247.858); - --border: oklch(0.929 0.013 255.508); - --input: oklch(0.929 0.013 255.508); - --ring: oklch(0.704 0.04 256.788); - --chart-1: oklch(0.646 0.222 41.116); - --chart-2: oklch(0.6 0.118 184.704); - --chart-3: oklch(0.398 0.07 227.392); - --chart-4: oklch(0.828 0.189 84.429); - --chart-5: oklch(0.769 0.188 70.08); - --sidebar: oklch(0.984 0.003 247.858); - --sidebar-foreground: oklch(0.129 0.042 264.695); - --sidebar-primary: oklch(0.208 0.042 265.755); - --sidebar-primary-foreground: oklch(0.984 0.003 247.858); - --sidebar-accent: oklch(0.968 0.007 247.896); - --sidebar-accent-foreground: oklch(0.208 0.042 265.755); - --sidebar-border: oklch(0.929 0.013 255.508); - --sidebar-ring: oklch(0.704 0.04 256.788); + --popover-foreground: oklch(0.18 0.04 265); + + --primary: oklch(0.62 0.19 277); /* #6366F1 indigo-500 */ + --primary-foreground: oklch(0.99 0 0); + --primary-dark: oklch(0.55 0.21 277); /* #4F46E5 indigo-600 */ + --primary-light: oklch(0.74 0.13 277); /* #818CF8 indigo-400 */ + + --secondary: oklch(0.72 0.17 162); /* #10B981 emerald-500 */ + --secondary-foreground: oklch(0.99 0 0); + + --accent: oklch(0.78 0.16 75); /* #F59E0B amber-500 */ + --accent-foreground: oklch(0.18 0.04 265); + + --muted: oklch(0.96 0.005 256); + --muted-foreground: oklch(0.55 0.03 256);/* #64748B */ + + --destructive: oklch(0.63 0.23 25); /* #EF4444 */ + --destructive-foreground: oklch(0.99 0 0); + --success: oklch(0.72 0.17 162); + --warning: oklch(0.78 0.16 75); + + --border: oklch(0.92 0.01 256); /* #E2E8F0 */ + --input: oklch(0.92 0.01 256); + --ring: oklch(0.62 0.19 277); + + --chart-1: oklch(0.62 0.19 277); + --chart-2: oklch(0.72 0.17 162); + --chart-3: oklch(0.78 0.16 75); + --chart-4: oklch(0.55 0.21 277); + --chart-5: oklch(0.74 0.13 277); + + --sidebar: oklch(1 0 0); + --sidebar-foreground: oklch(0.18 0.04 265); + --sidebar-primary: oklch(0.62 0.19 277); + --sidebar-primary-foreground: oklch(0.99 0 0); + --sidebar-accent: oklch(0.96 0.005 256); + --sidebar-accent-foreground: oklch(0.18 0.04 265); + --sidebar-border: oklch(0.92 0.01 256); + --sidebar-ring: oklch(0.62 0.19 277); + + /* Gradientes & sombras Mika */ + --gradient-hero: radial-gradient(circle at 30% 20%, oklch(0.62 0.19 277 / 0.18), transparent 60%), + radial-gradient(circle at 80% 80%, oklch(0.72 0.17 162 / 0.12), transparent 55%); + --gradient-primary: linear-gradient(135deg, oklch(0.62 0.19 277), oklch(0.55 0.21 277)); + --shadow-soft: 0 1px 2px oklch(0.18 0.04 265 / 0.04), 0 4px 12px oklch(0.18 0.04 265 / 0.06); + --shadow-glow: 0 10px 40px -10px oklch(0.62 0.19 277 / 0.45); } .dark { - --background: oklch(0.129 0.042 264.695); - --foreground: oklch(0.984 0.003 247.858); - --card: oklch(0.208 0.042 265.755); - --card-foreground: oklch(0.984 0.003 247.858); - --popover: oklch(0.208 0.042 265.755); - --popover-foreground: oklch(0.984 0.003 247.858); - --primary: oklch(0.929 0.013 255.508); - --primary-foreground: oklch(0.208 0.042 265.755); - --secondary: oklch(0.279 0.041 260.031); - --secondary-foreground: oklch(0.984 0.003 247.858); - --muted: oklch(0.279 0.041 260.031); - --muted-foreground: oklch(0.704 0.04 256.788); - --accent: oklch(0.279 0.041 260.031); - --accent-foreground: oklch(0.984 0.003 247.858); - --destructive: oklch(0.704 0.191 22.216); - --destructive-foreground: oklch(0.984 0.003 247.858); - --border: oklch(1 0 0 / 10%); - --input: oklch(1 0 0 / 15%); - --ring: oklch(0.551 0.027 264.364); - --chart-1: oklch(0.488 0.243 264.376); - --chart-2: oklch(0.696 0.17 162.48); - --chart-3: oklch(0.769 0.188 70.08); - --chart-4: oklch(0.627 0.265 303.9); - --chart-5: oklch(0.645 0.246 16.439); - --sidebar: oklch(0.208 0.042 265.755); - --sidebar-foreground: oklch(0.984 0.003 247.858); - --sidebar-primary: oklch(0.488 0.243 264.376); - --sidebar-primary-foreground: oklch(0.984 0.003 247.858); - --sidebar-accent: oklch(0.279 0.041 260.031); - --sidebar-accent-foreground: oklch(0.984 0.003 247.858); - --sidebar-border: oklch(1 0 0 / 10%); - --sidebar-ring: oklch(0.551 0.027 264.364); + --background: oklch(0.18 0.04 265); /* #0F172A */ + --foreground: oklch(0.96 0.01 247); /* #F1F5F9 */ + --surface: oklch(0.25 0.04 260); /* #1E293B */ + + --card: oklch(0.25 0.04 260); + --card-foreground: oklch(0.96 0.01 247); + --popover: oklch(0.25 0.04 260); + --popover-foreground: oklch(0.96 0.01 247); + + --primary: oklch(0.62 0.19 277); + --primary-foreground: oklch(0.99 0 0); + --primary-dark: oklch(0.55 0.21 277); + --primary-light: oklch(0.74 0.13 277); + + --secondary: oklch(0.72 0.17 162); + --secondary-foreground: oklch(0.99 0 0); + + --accent: oklch(0.78 0.16 75); + --accent-foreground: oklch(0.18 0.04 265); + + --muted: oklch(0.28 0.04 260); + --muted-foreground: oklch(0.65 0.03 256); + + --destructive: oklch(0.63 0.23 25); + --destructive-foreground: oklch(0.99 0 0); + --success: oklch(0.72 0.17 162); + --warning: oklch(0.78 0.16 75); + + --border: oklch(0.32 0.03 256); /* #334155 */ + --input: oklch(0.32 0.03 256); + --ring: oklch(0.74 0.13 277); + + --chart-1: oklch(0.74 0.13 277); + --chart-2: oklch(0.72 0.17 162); + --chart-3: oklch(0.78 0.16 75); + --chart-4: oklch(0.55 0.21 277); + --chart-5: oklch(0.62 0.19 277); + + --sidebar: oklch(0.22 0.04 262); + --sidebar-foreground: oklch(0.96 0.01 247); + --sidebar-primary: oklch(0.74 0.13 277); + --sidebar-primary-foreground: oklch(0.99 0 0); + --sidebar-accent: oklch(0.28 0.04 260); + --sidebar-accent-foreground: oklch(0.96 0.01 247); + --sidebar-border: oklch(0.32 0.03 256); + --sidebar-ring: oklch(0.74 0.13 277); + + --gradient-hero: radial-gradient(circle at 30% 20%, oklch(0.62 0.19 277 / 0.25), transparent 60%), + radial-gradient(circle at 80% 80%, oklch(0.72 0.17 162 / 0.18), transparent 55%); + --shadow-soft: 0 1px 2px oklch(0 0 0 / 0.3), 0 8px 24px oklch(0 0 0 / 0.35); + --shadow-glow: 0 10px 40px -10px oklch(0.62 0.19 277 / 0.55); } @layer base { @@ -137,8 +180,38 @@ border-color: var(--color-border); } + html { + font-family: var(--font-sans); + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + } + body { background-color: var(--color-background); color: var(--color-foreground); + font-feature-settings: "cv02", "cv03", "cv04", "cv11"; + } + + ::selection { + background-color: oklch(0.62 0.19 277 / 0.25); + color: var(--color-foreground); + } +} + +@layer utilities { + .bg-gradient-hero { + background-image: var(--gradient-hero); + } + .bg-gradient-primary { + background-image: var(--gradient-primary); + } + .shadow-soft { + box-shadow: var(--shadow-soft); + } + .shadow-glow { + box-shadow: var(--shadow-glow); + } + .text-balance { + text-wrap: balance; } } From faa10d9a720f6dc69990f9a8519aab56ce7fe37c Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 16:51:36 +0000 Subject: [PATCH 4/7] Changes Co-authored-by: domfelipe <53182096+domfelipe@users.noreply.github.com> --- src/components/mika/EnterpriseLeadForm.tsx | 119 ++++++++++++ src/components/mika/FaqSection.tsx | 58 ++++++ src/components/mika/FeaturesSection.tsx | 44 +++++ src/components/mika/HeroSection.tsx | 148 +++++++++++++++ src/components/mika/HowItWorksSection.tsx | 37 ++++ src/components/mika/LandingFooter.tsx | 67 +++++++ src/components/mika/LandingHeader.tsx | 102 ++++++++++ src/components/mika/PlansSection.tsx | 207 +++++++++++++++++++++ src/routeTree.gen.ts | 9 - 9 files changed, 782 insertions(+), 9 deletions(-) create mode 100644 src/components/mika/EnterpriseLeadForm.tsx create mode 100644 src/components/mika/FaqSection.tsx create mode 100644 src/components/mika/FeaturesSection.tsx create mode 100644 src/components/mika/HeroSection.tsx create mode 100644 src/components/mika/HowItWorksSection.tsx create mode 100644 src/components/mika/LandingFooter.tsx create mode 100644 src/components/mika/LandingHeader.tsx create mode 100644 src/components/mika/PlansSection.tsx diff --git a/src/components/mika/EnterpriseLeadForm.tsx b/src/components/mika/EnterpriseLeadForm.tsx new file mode 100644 index 0000000..dd86d4f --- /dev/null +++ b/src/components/mika/EnterpriseLeadForm.tsx @@ -0,0 +1,119 @@ +"use client"; + +import { useState } from "react"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { z } from "zod"; +import { IMaskInput } from "react-imask"; +import { toast } from "sonner"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Textarea } from "@/components/ui/textarea"; +import { Label } from "@/components/ui/label"; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; +import { Loader2 } from "lucide-react"; + +const schema = z.object({ + company_name: z.string().min(2, "Informe o nome da empresa").max(120), + contact_name: z.string().min(2, "Informe seu nome").max(120), + email: z.string().email("Formato de e-mail inválido."), + phone: z.string().min(14, "Telefone inválido").max(20), + team_size: z.enum(["1-10", "11-50", "51-200", "200+"], { message: "Selecione o tamanho da equipe" }), + message: z.string().max(1000).optional(), +}); + +type FormValues = z.infer; + +export function EnterpriseLeadForm() { + const [submitting, setSubmitting] = useState(false); + const { + register, + handleSubmit, + setValue, + watch, + reset, + formState: { errors }, + } = useForm({ resolver: zodResolver(schema) }); + + const onSubmit = async (data: FormValues) => { + setSubmitting(true); + try { + // Etapa 2: gravar em enterprise_leads via supabase.from(...).insert(...) + // Por ora: feedback otimista para o usuário. + await new Promise((r) => setTimeout(r, 700)); + toast.success("Recebemos seu contato! Falamos com você em até 1 dia útil."); + reset(); + } catch { + toast.error("Algo deu errado do nosso lado. Já estamos investigando."); + } finally { + setSubmitting(false); + } + }; + + const phone = watch("phone") || ""; + + return ( +
    +
    +
    + + + {errors.company_name &&

    {errors.company_name.message}

    } +
    +
    + + + {errors.contact_name &&

    {errors.contact_name.message}

    } +
    +
    + +
    +
    + + + {errors.email &&

    {errors.email.message}

    } +
    +
    + + setValue("phone", value as string, { shouldValidate: true })} + placeholder="(11) 99999-9999" + className="flex h-10 w-full rounded-lg border border-input bg-transparent px-3 py-2 text-sm focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" + /> + {errors.phone &&

    {errors.phone.message}

    } +
    +
    + +
    + + + {errors.team_size &&

    {errors.team_size.message}

    } +
    + +
    + +