From b0600072902887a31cb43278dd29a25fe7db3452 Mon Sep 17 00:00:00 2001 From: TZGyn Date: Sat, 2 Nov 2024 20:42:55 +0800 Subject: [PATCH] basic form + fetch --- .gitignore | 21 +++ .npmrc | 1 + .prettierignore | 4 + .prettierrc | 19 +++ README.md | 38 +++++ bun.lockb | Bin 0 -> 106489 bytes components.json | 17 ++ package.json | 41 +++++ postcss.config.js | 6 + src/app.css | 75 +++++++++ src/app.d.ts | 13 ++ src/app.html | 12 ++ src/lib/components/theme-toggle.svelte | 25 +++ src/lib/components/ui/button/button.svelte | 74 +++++++++ src/lib/components/ui/button/index.ts | 17 ++ .../ui/calendar/calendar-cell.svelte | 19 +++ .../ui/calendar/calendar-day.svelte | 30 ++++ .../ui/calendar/calendar-grid-body.svelte | 12 ++ .../ui/calendar/calendar-grid-head.svelte | 12 ++ .../ui/calendar/calendar-grid-row.svelte | 12 ++ .../ui/calendar/calendar-grid.svelte | 16 ++ .../ui/calendar/calendar-head-cell.svelte | 16 ++ .../ui/calendar/calendar-header.svelte | 16 ++ .../ui/calendar/calendar-heading.svelte | 12 ++ .../ui/calendar/calendar-months.svelte | 20 +++ .../ui/calendar/calendar-next-button.svelte | 28 ++++ .../ui/calendar/calendar-prev-button.svelte | 28 ++++ .../components/ui/calendar/calendar.svelte | 61 +++++++ src/lib/components/ui/calendar/index.ts | 30 ++++ .../dropdown-menu-checkbox-item.svelte | 35 ++++ .../dropdown-menu-content.svelte | 21 +++ .../dropdown-menu-group-heading.svelte | 19 +++ .../dropdown-menu/dropdown-menu-item.svelte | 23 +++ .../dropdown-menu/dropdown-menu-label.svelte | 23 +++ .../dropdown-menu-radio-item.svelte | 30 ++++ .../dropdown-menu-separator.svelte | 16 ++ .../dropdown-menu-shortcut.svelte | 20 +++ .../dropdown-menu-sub-content.svelte | 19 +++ .../dropdown-menu-sub-trigger.svelte | 28 ++++ src/lib/components/ui/dropdown-menu/index.ts | 50 ++++++ src/lib/components/ui/form/form-button.svelte | 7 + .../ui/form/form-description.svelte | 17 ++ .../ui/form/form-element-field.svelte | 30 ++++ .../ui/form/form-field-errors.svelte | 31 ++++ src/lib/components/ui/form/form-field.svelte | 30 ++++ .../components/ui/form/form-fieldset.svelte | 21 +++ src/lib/components/ui/form/form-label.svelte | 21 +++ src/lib/components/ui/form/form-legend.svelte | 17 ++ src/lib/components/ui/form/index.ts | 33 ++++ src/lib/components/ui/input/index.ts | 7 + src/lib/components/ui/input/input.svelte | 22 +++ src/lib/components/ui/label/index.ts | 7 + src/lib/components/ui/label/label.svelte | 19 +++ src/lib/components/ui/popover/index.ts | 17 ++ .../ui/popover/popover-content.svelte | 25 +++ src/lib/components/ui/select/index.ts | 34 ++++ .../ui/select/select-content.svelte | 36 +++++ .../ui/select/select-group-heading.svelte | 16 ++ .../components/ui/select/select-item.svelte | 37 +++++ .../select/select-scroll-down-button.svelte | 19 +++ .../ui/select/select-scroll-up-button.svelte | 19 +++ .../ui/select/select-separator.svelte | 13 ++ .../ui/select/select-trigger.svelte | 24 +++ src/lib/components/ui/separator/index.ts | 7 + .../components/ui/separator/separator.svelte | 22 +++ src/lib/index.ts | 1 + src/lib/utils.ts | 6 + src/routes/+layout.svelte | 8 + src/routes/+page.svelte | 149 ++++++++++++++++++ src/routes/+page.ts | 18 +++ src/routes/schema.ts | 48 ++++++ static/favicon.png | Bin 0 -> 1571 bytes svelte.config.js | 21 +++ tailwind.config.ts | 96 +++++++++++ tsconfig.json | 19 +++ vite.config.ts | 6 + 76 files changed, 1862 insertions(+) create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 README.md create mode 100755 bun.lockb create mode 100644 components.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 src/app.css create mode 100644 src/app.d.ts create mode 100644 src/app.html create mode 100644 src/lib/components/theme-toggle.svelte create mode 100644 src/lib/components/ui/button/button.svelte create mode 100644 src/lib/components/ui/button/index.ts create mode 100644 src/lib/components/ui/calendar/calendar-cell.svelte create mode 100644 src/lib/components/ui/calendar/calendar-day.svelte create mode 100644 src/lib/components/ui/calendar/calendar-grid-body.svelte create mode 100644 src/lib/components/ui/calendar/calendar-grid-head.svelte create mode 100644 src/lib/components/ui/calendar/calendar-grid-row.svelte create mode 100644 src/lib/components/ui/calendar/calendar-grid.svelte create mode 100644 src/lib/components/ui/calendar/calendar-head-cell.svelte create mode 100644 src/lib/components/ui/calendar/calendar-header.svelte create mode 100644 src/lib/components/ui/calendar/calendar-heading.svelte create mode 100644 src/lib/components/ui/calendar/calendar-months.svelte create mode 100644 src/lib/components/ui/calendar/calendar-next-button.svelte create mode 100644 src/lib/components/ui/calendar/calendar-prev-button.svelte create mode 100644 src/lib/components/ui/calendar/calendar.svelte create mode 100644 src/lib/components/ui/calendar/index.ts create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte create mode 100644 src/lib/components/ui/dropdown-menu/index.ts create mode 100644 src/lib/components/ui/form/form-button.svelte create mode 100644 src/lib/components/ui/form/form-description.svelte create mode 100644 src/lib/components/ui/form/form-element-field.svelte create mode 100644 src/lib/components/ui/form/form-field-errors.svelte create mode 100644 src/lib/components/ui/form/form-field.svelte create mode 100644 src/lib/components/ui/form/form-fieldset.svelte create mode 100644 src/lib/components/ui/form/form-label.svelte create mode 100644 src/lib/components/ui/form/form-legend.svelte create mode 100644 src/lib/components/ui/form/index.ts create mode 100644 src/lib/components/ui/input/index.ts create mode 100644 src/lib/components/ui/input/input.svelte create mode 100644 src/lib/components/ui/label/index.ts create mode 100644 src/lib/components/ui/label/label.svelte create mode 100644 src/lib/components/ui/popover/index.ts create mode 100644 src/lib/components/ui/popover/popover-content.svelte create mode 100644 src/lib/components/ui/select/index.ts create mode 100644 src/lib/components/ui/select/select-content.svelte create mode 100644 src/lib/components/ui/select/select-group-heading.svelte create mode 100644 src/lib/components/ui/select/select-item.svelte create mode 100644 src/lib/components/ui/select/select-scroll-down-button.svelte create mode 100644 src/lib/components/ui/select/select-scroll-up-button.svelte create mode 100644 src/lib/components/ui/select/select-separator.svelte create mode 100644 src/lib/components/ui/select/select-trigger.svelte create mode 100644 src/lib/components/ui/separator/index.ts create mode 100644 src/lib/components/ui/separator/separator.svelte create mode 100644 src/lib/index.ts create mode 100644 src/lib/utils.ts create mode 100644 src/routes/+layout.svelte create mode 100644 src/routes/+page.svelte create mode 100644 src/routes/+page.ts create mode 100644 src/routes/schema.ts create mode 100644 static/favicon.png create mode 100644 svelte.config.js create mode 100644 tailwind.config.ts create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..79518f7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +node_modules + +# Output +.output +.vercel +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..ab78a95 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +# Package Managers +package-lock.json +pnpm-lock.yaml +yarn.lock diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..7fc6612 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,19 @@ +{ + "useTabs": true, + "singleQuote": true, + "semi": false, + "trailingComma": "all", + "printWidth": 70, + "bracketSameLine": true, + "htmlWhitespaceSensitivity": "ignore", + "plugins": [ + "prettier-plugin-svelte", + "prettier-plugin-tailwindcss" + ], + "overrides": [ + { + "files": "*.svelte", + "options": { "parser": "svelte" } + } + ] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..b5b2950 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# sv + +Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). + +## Creating a project + +If you're seeing this, you've probably already done this step. Congrats! + +```bash +# create a new project in the current directory +npx sv create + +# create a new project in my-app +npx sv create my-app +``` + +## Developing + +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: + +```bash +npm run dev + +# or start the server and open the app in a new browser tab +npm run dev -- --open +``` + +## Building + +To create a production version of your app: + +```bash +npm run build +``` + +You can preview the production build with `npm run preview`. + +> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..9b9612a02f0a60531ee81c926c5e5a666d79306f GIT binary patch literal 106489 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

B_%HyF1o+K(ED0ncKoGnh_;3K=pH0grCh z<7WW=VLuQe2;LOn#Q+}04f`M5>k=dg{wctNTkt>nkI+6u@Jj#>Zn4+L5A+Y(LXaSM z70_U1fd9AoivV~ye;^(?2nhi3-v;n-{fF&_2WSpKg5W8^!w}eh2%-naM#m2oxVhK+ z4ZIb=AN&n`?r-9keiN?*E_lBae+h4B+7>T)+SA__6v;e8z9$Cw~(!0v?KgOLGvc-{Fo?LP_dq5u#1U=9ft#Q$A@R|0r= z--FZakAnyj#GecoZvBO2n7fVo_XBwJ^<$&?F9vuRKU_EdP5yrXJY0X_`VD2H z@oRD8+E3`Zh4b>~_&*2m$oz*nMDmK*{Wp!+RpI@^GNG|UP6WS-$HTnC1F45LeHzXpYe{ZD8N zh<^?~-2M&XxL{xe3W7fm@P;6N5C;8&$DsrXf`0?>=<6q;eTd*G_%RqkeE*RW5&Q>$S4a6r&i|7}@cV^vizN`T!5(hy4#@N9w`HzZJyp0>H!P z59E03jn1ETfJgV=M)SuFZvIq(e*}lb^|!%;lZc%Yz$4F3;2hd${;B|88Tg0(VE+*+ zh<_rm_(1<;cpy^$PdtcSJsywD-+#g(=MnrCFnQtr8@YBMc|`2~n?~>kcs$bY8^vD& zctzkJ<{olxH2-q|e+b|S#UbrM;#UPPzrghq$v<-bpEQCG!{awHb|5!`e+lr)z&}#n zX#SYM%_DOE1hFsDIBh)wKNAOqh{*m>A5Z`EgD;^KW-@oxsx)*~{1o?yG z58{!yz{kH8#Lg7pRRJCvBXxfZ#GgcL;{hIyAGrR(I;8%eI1sxxcsy)BtRplB2%a8n z-eCX1euvnN;tvBn-2XrvJvfkc0DSygLHtJpJh+6d;~@v3^AN#5#N(0m1F8R8=inq_ zHxBS{{|D`1-A3Cl1|I&x{)bo?1I!~Kg826bctbp%ju0T;2Eh-5i!Z$X!ZMsg8_nNY zY25lpXxvDMh<^z%c)%1~?>~5MqyDc0JXnH5p?{crq#q&I-wEQs4&agT3w>|2|9+wT zLp-6^LBzi(c=;5$|N1xM_Xxndfc7JK+i3jn03Nm<<_gAy?4w}$?*xf|7g+qk6bOa3 z&^J;K%YP?`ohiV>>j$(YG8=3^#_(Wat%cAF906q5Bi6D zkpGP1Km8(Q1pfozk@Xj;Lu~#|BewkD;-v@tBlGv~Fz9m#{uIE&@rPW0HyVE-z{B+i zaua&(fwqYM5r79%C=}NH8$27h`O*b=IDZ+yvC;L*1>lkV!yFPSNcTL|JpBF@V)@_?0tLYj zDB|{CNEy-pM1$C|DBVJm;I`^>lciD2O*B}Hi-Wa zfQS1JIByBfJ)}VJl>n~+@UZURj6Xg#-28!KZyO{bP!RtP0Dlnphq1%wFNAU+_y+(F zx*!zskJSHD7>L~$fJfGEG{(nH7%a;ej7O!DD$y~EV)Qxq8NsWl|GEEz{ZFVM_+WrX z_J98dUjp#(`T_H|k!K)?e{RtEUs-O_#A*&26!ZP zLdP(Ip8|L|{t-N(As~2e%|Gv-;P`{%h!8>W<^XR5{6h?(xr4R{{t>{#{VS}4^N&zL z@Z?&5KEGrKU@ig)5WEY(o8$fOA`lDB5d0{>gCV$n{e$&X@CN~c;3dH38;(C%Mh*ht zfB26AczFK`u~otNC0r7Q;DPY| zQw)e*9Ka*{FW7$@_5TXsVg4cR-;7^cuy`Zm7f=zr1|ae41H2;ePYSS5HX8pGJRZRz zyg0W1{u8ll19-UqgMEk8{dd%#XAoN!FnAOJ9vORtu7L>N65!$f4f=;1Nd2Fl{`wPQ z7Y*=m{YU&GdH8G8pS1|S_CN4Q{hyY9{Ry%A4)E5%KeU2vAaor@@N@=$K0kotkI*rQ z;12@43GfebunrkV;N#y4f^PzNRebyngeDI#Bltbw;UTz%3q{I^)Ai>M;KA&c)2fs! z<3|6FOFLrk2k`26|F92{enfcwn?~@xcsvsNM)NNQE?#vB9}ola6z~H9g5ci*JaYXawC^B2g5L@TKlBgt4rAX2PZA&q-U8s^ z_=ONyM`#QP{x-nF^&j!SQTzvhR|a@ELEzY<0|z03_;)n@bN;{>kote(KkAFyN+BnbXJz=JK^`uv6c zM`-(@69)VNF);UV?(PN$6sTeS9#{Z^*07#uy%wioEPVL#UukI1k3SDJv=_u{VSGK* zFn*-{XbtBym}Bb#HMCP)Fa5QK?E-08m;WznxCXf5Vt(s2H!ub;(fh|d5APZ2OO|I z7aUN~8eU5tfCHW{1_uTC;mLt(7p>_h8o7x2M*|W z036VM5FAjThV{d+00ga}-3U0K9t8&!sGa$S3!Xq#w&y`Lk&L)^ZGD24^1rb`Uu`0Y8p`QjxR$E`8yj1@b`;Bff}9<$CsgoA0xmIh`)rd|0@mibrqb4@!Y`M{gsCNQ2uvc@_*<4g%0%1 z|Bd?*IA&m6aA^JSz656Df9_BIcVF_q`x3Z6`QLpBZhr#TiT~Y~z*XX}_bKo?{8#%C zXbt|vVPNR6?UJem#0m&4##dq&BdtBVhTdP<3;MYQ}#ayZInfEAOxK~63OH)KPShvkI@W-C*r`m?s zPQF;k0KbZvsP5~W`mpnK4U6R2^ryjoEsd%RAA$r=F4xFQzTHdBc2{sdZS>md&fdEy zUU&^e1RM7Aty(&*@ySs+GK%8Lv+8NL6rbf)9`PGKM`ih=_LJ|{2fE7%)M4(+uO_n9 zgk^g(_XM@E*M;S?pBY_{&ydC4%i;PB-lHOd)p9>s^Xhrb-KeSL_6e@?q$bOw8vAT~ z0uMjDaZuK2o{K8iBwqL6?GO9kMZFL8Y}%TLooyiziWDbj!WyPH>P4dBg>wuMY*pZJ z#o~}@E1Sc;SG|1&E3bL0OCFq>d`v77@&jwoYm-MCN}<-0e~Cn!aX{oV-_5`t^)T%d z6Q$!!2O2xJ$R9xQ!h0Y@utZVsdi=!guDGB6U`S-X=jB)SnDD1Pj?xOMEe4{|)NQF! zUIzvabz89MkD{hrYkF!TMTtKgs%Dw`=nt zMcq)Jm&weDV(h@PCKs1G@Lmy_Z(Gs4Igwvj`kCCG#|VpmJZJoR>Sy-$cG7p!$1&n6 zYp%)@x{~L~(+tMzNOJ^E`Bn#&8a@0pr8+{VcTi^g=)Rl5RJthMZD?MyF}>^)IW9@6 zy;hPP!sSJ&GM&S3lbt=&oot%r&&BQ&urtob<}Mr2e9sHFX{j(3*d}5RIWfp95f*T?$NvR9PuRX35rR}4{f${yfXn3q4| zwQuh?AF!ps2yM6R+3D6a<3S()@gxhKW`s_U3WNJZ&q3>`M`TlB){nQAh7Q> z<4cK$+D2Y;T-v59}_GE7ci(h+~{Xv^2LeEZ95#Q-2Da~jP&6+x9i{gd%(uiQ)X=y__xfI+L%F3?G z+hL=VsZG9EY-bXtdaEV!fvjHn-g6_x&zsBi%9k#+?o~CN=wdhCo3eWT>Qm*_ixz!+ z@L33w2U>&_Xe^ib5682_>~x2=ODlUb>NyGI+HnP(?cB0Tnc`-qPf2+pHzXrlSt#Xx zJ!kAwp>1ziQr|CE%dU*v&DYLq`;?%J;@yts)o9wPCS~1{w6DdjZ7qEy?&p)zfPP?c^fNN2bqyb3AOLzru*S%S?Ucwj}WUc+bE*) z3w{mTAA+rKywKM?T=wkXvUwh5b9ilX*6EOM@ly6QXGUqNI_f%n0*O81Dq@Na;uJbm zt}OOHR{Ozw@RIlFa&q6{o%icZP`u24u!4RI;C9a5N5zqE$X;D$oW&Em#z6n#huG%x zO7Hx|L=9$oLKBv1Lq2_7f3rABvX+&6_~+O0ND? zM9}@31mcF-cKno7Z#+7a)6KWi)ZEKA?rD=fl%xkM($Qylj84f;{w|G~3n~%-FP@ zxuhpCv8{JgXS$L?`*2wF4LIMD@vQzJw)qoK2D(=CvjIY8-z-rgTR6z@(nZ{^7)5<8N`G?ABmpEu=5X`Zcm?OFLl?D=Gow&$MGBeDzIl*3X*nADC* zbKiOCuQ}_(u1-&>U&-W5{h|HJh=KMxFLwPoCwvzQ5$sqTO(UI(!Sy!_v6E}0L|cU> zso&Ow(gnK>Mm@MpnZVFhdUkLiwlux~Ge4$6RJ*mHhRONoJ}DDUoA!pLT^u8LUNAW@ z>qhkP=uQ&uZ#EZ&%~C@s-Wf2AQyyMK&Dm*|SzHGI6GfRhu=dt8%J zcX0L4(o{>~c(KjNHj*@NNxiWAIidz)qpBjAHQ}Axjrg_~8xNLU->OVy_H^vx6+Z4Q zyB;g)H6PbGt+=qxiy>nNoLp#L))L*?_uj=n{QC@*jJIrGP*Z*&&>^|kTk7`P*^=?E zm)|XJ(tkPJ)6{Ldqapd;OP&E)mi^~ERe#=TmI@HOTatm}-2|^~+-Tlc)6ylZQ`oCt z1A@GsN%%LD(*$0nI7cIYi}+Sw`glSW=heE&^O{4}vl<$@+CxT17uoEo6{~ahF)8;< zt9za5TIUUgf2Zq@?{y(Pwuh$sXEG(tXVJ`(Cxyv1&&-u5Pt9!gx>p+86wdf;jBK@N zl&DI0XBg!Ic}3MPx&r+%&uv7HOJ2Hf`lj>N3pFXY_=3GsrBDlWRSM}oiF+NLpx ztAzBY#4hu_&lyfyj%3J`h&;YG%V@LbnSj~OJAph)r`YsusTo@WL$cs{=&MWdzYsrN#)fRVurj318EY>N_fHRpIHM6XRaTR z%Am;3zMHSgs3$G`fIyf+Z~Br#eZn>Wl6O+ho3p1W{)A=qt=do4);(??Ot93v&s|eTiZwioC>v`ET?|5cE>Ju@ zU~~D`{cN>w87tvg_ovSkN%*Yul3_vtCqJ53%b}jZAo?x6u2`1a3bk_FRvQO_+OW>G zAD%OJFsvUVw12A1^}0SSJ%26K;x?U8egZ{j6Io}0mQBb0sGhZ5N7s3Aueb=Hc@IaH ziv_*8RKL}`MpWFVKYEYGh*zX|?A1*#_kT&-DgHT864TufLx&Bg3g&x2>UE26{CF7U zj76NzlM0EfSt0l=g$U5X@gRuiJ+|_OGQA^b;ltZ^9s8yBB(Sa&e2wLcp3M4mn~zKV z(d9x6Stj8(O-E_z`R6QqZa7hdOu(7X@kn=jc=+&UJ^ z5=Fr|b4$!-`R%Rbf?aveybs0t-joeqd)+Kj;u5wmv~=02Fk46E;=AERNwtt8By@DF z^*8PC-;t1o0#0ExZyD*C?(ycw5;arzBdT>;%bKd{I*#bZ^TeN)UpPb@WV^q5P5Gv2 z@M6%#B5`e#&m4Zzqc1A0jJX(wz^`#$S>VFQs|Ywn(7e+VT(=L~v?^*C-<-^TD}14? zur}as;fmmD*A*o{%Bqu@9v25{f?k`bujKiNC^azT=SbY(9#2cLviCeULXr=^g9HD_ zV17l>yglV?dWl7^PZfJvg^;jLzuctkHytX|lgG9<%6@mzMe%dJgJzFaXH7&DzMJ(O zzDu>tu53P;k-$v)^@7Idqu%g4F*tr9uNa!wZFv=Q!rgsT{Ss&F@othFH{Jy`;o+L8 z>F4relqdO*D9SV4Y>r;0O7nZDEc4-10prM0`1aL!nTe!I-tX%5xch+6_3w+s(Y)R4 zL%Xt#7sPS3Pz4 zZ)iNrk2I8|diAiaZn?(JboQIAz2zgf^FJbW;u+62ejnK)c4UmZo$D*@xv)3;u&2f2 zE}(e#qIna%DKA8Z5364HuGTAS8D)qc{hspqPR0?b9i22^PRb1M)v=1uh8UQt^;gb_ z9#GGv?1-Pb`Q;t$gnWkQ>jGImJTF`)rO><#T2qmw!`_QUYGfAMCCHA9kql|XO`B&= zo0^N5PYe%vSDlYncR7}FS0Itr;Ftg1ElrJM)=>i<*UR3P-rnv)g69ndocqwctd2)j z4b2N$+6KfO@>6&;j`(~QYvCAp_>3w0gNPlC*e;4+51LCpJ;<*=c&jjYwj^};Ha815 zv-!#wK_S{vmJIJvx^}Kalr5nrmp4{e6%6TW!u_r5! z_P-S+|D?jpL}ZwJ+w|`0E#-C--t5P*BZspYTRG6zP4M5y{}AlXi(E{8HNCu>eD3W? zYa2+hy04^VzmKP}Jw_2*NDLeZGPJbMuE_V~@oseP_x3dCFek;Ew<< za_P!6`xf0F`U%fQ(`Br?>05?V(=@~8;K3*J5aL$G{w z5xY1P)cOs&xRdvXnzC;*DmAD&?{(C)A$^M~vx!LfQCZ{D5#QVHC|x~rEtQduxjoRD z^4{`5<|B(Y)0>V=;CbO<3Et`aL$D8*m&t-J2GL*H6D9xQTb)CSlyLipcFL=KQcuLs z9q@J|c3e`AOBvn!>}O`A;S-W9qxr{z3jU_yekoX$`S%*geiE*eihrTMLpT4)o;BIK7nNeaZKpuJFEV?qCq?Nm`_FO#T zV0Sz7;ndEQ^?0%C<3S0{8R+v+(5A^c4ljsaPc^QW&@zOSb_qrag83KAzWJ>$4nV(qUtPQ5V%;A;Gt11V3cG|3Z)Fh3kVdns-a}Glx!2`#qM}D+%hR zxkqo%9$s?0|NU0p{l&HYPib#$N<1&@H&rxmB++EZ`$1)W&uho%KMs_eJsbF{cr9&( z=AEvL5qk#P^JaRZz1y{ku5H42D&z{kvt^(dHrI+Jjm)ZZJA38|=UY54TzAyayoyWZ z$DDTvTTb2nST4KeeNM5<)quxWuSSX&*~=b~biAUOEi8F$O;6IpsO?!viOffiTc^%r zHLuNlTZ($UlStytIxp@zq>ko2zmK-Z$>uR{rG+Qi;oi2{N3{j+iIq|wH~4$+?I}$2 zjycChJHKzIf?l706nXP=f$>y5Lkazt#XRYeF$1eh`6yluG_Qwsc4qMFnV2pHmZEKH zt&Jkxl}D6r+0fctXB^PLup`lNkB*TP06R^O!WjW{o)@_i-~ z#jAicvf@4nzH2QQEOT5r`e@q8YE7bkWxykCX0-@;mjU7YY^3~tRj}P=|vQSR6S#myp>bYnvfXv zXU0g62eats)jDY2pHgePn_Avj9pB4ClJ@MN)H|Ni*L$6~Oep!4eoBkloBL2csv9l6 z-1sx7+UkzSe%67+8qKUS{rK52_4?FpYll$zJ&5LY-)-A;E&BDrZHLZvz1Xan^nllr z|5}6Q{B*QQT+Cz5+_nN0_xv2K=h|F_=Oo@5gs7M$B?yy++^5RQP5)qeR1C$di{=fy z7*Z`Nk{NB%@^bTGr6#_ir_JR82OYacO{E2@?v(df1V(x$U4F6D6L6KSjIleNUOumD zib`*_Uyhen+V~;vx{1rL9-7xRJ9%xdCV zYpe;Y{ibGl#(3$pZfr_?C3)~e(MXn(D3PP}ug@6^qz5z(Fi}ZgCO>GIGpBQ=J)iK4M^CBO)ZAcm0h}U5hH(8evz}CHR?{R*+Qcr2! z0Gsp7=`U@Ee2CfvCoSg}#KkRsJ?W|zdX3^WLGucV`^p<)slSA@UXl3fB}p?NZdJvH zVLgBN%GihVY{#~kzxx?}f13M#!qlAcg@z~jCX-8nVvka{1i7%h;=ueULGhZRdE0bm ztptU=mEAF2J7Rk+%O0O5@%d847;))>iXh3o8tUE(p*zll1>Y(&s4|ZYN8jG_vGqlm zjuDUY1%2!8-a6dA1UG&Up?N!LO_tcNJhPKvXRz3jp>O5*=tRzGi;gc|Ve+j*#X2nw zgFY(@47=|YY23~+HC0-ax6}A=`4bg}XtrWVTbd3%-;nplAw721`(<6oluf_-$77-m znjY~oVn1qV_SU9SJ~?#1^+e{D{hlta48FI-HhmKMUg0jX`4Dx% zJ@!iiQHJB$^36q|dd%B1MQ_yc<*K51EzrCVdj*NEr0AWVpHr4~F0jns9OJ1-8p+0w zotKxte&u@jN5%;@j|a893ZjDjj9gf|?_U1vaJ{f* zWZ+h3V~qe5uO*sy@}t|><9&zQ)9?G|E(x7C7GcZNR*w!f)sb&-$qApFne){1?^P`+ z^A|PP88#7iM_FC!z=^fn2X-8btkED96-4nKLG!Bd{bVSjx^zY(@2&d-zNw=^X4VnO zUl`}cXUhh51$lMcE6b73?+=xh8}Mi;;wbEs@;DT{V6h|ic9G+)Lajr@C|)ZxuMI2N zf=Zex*^aw8=R{`Tbymroxe!PcQlh07z_xIzxjp=$&l}%sM{Gw6zXddebX6YIoLjSU ztq6;fmtc2aEyC@iaO2k+&09Zd>{1?Y-gXYyLzJqy7F|FGj9a-o2 zOJ3-MmUxIb%T|_`iM$2c;s{W-hMb1GO}e+*qv8<@fTkt&|Bz#H){TG(j~KN3c0;37@``RgqjTJ*8-VZKvsgQ#a;E z`)--lI8`gZXmJEi)ig|X~Rc~Jd-=G%nC#ZNG(7eZ<=brYz zAXvn7OjyW#zZ8$qpgZgGy+BbarVl62k14WAdbcedr&2uZRT|wtyY2S9i{A~NrpxoC zFY;F$2&XS?LGe1Gd8coDk3JAL&LPnKf;H@mn0vA4tk%BJnTLKC+>c+ZeL6CAzCuf3 zWaLLsUm-cYv6<}&K-^x8e@g7I>jvAzgXv&8jBfW*TN)cbDCHGtXB7a@ICgp-t2|V7ku69 zRz8d@^nCmJf^FWuqBvl{ZENpw_u9m-U-Bimq*cENTy=H72axs=`K#+1Oaxha)4e#L&V^TyKWTZ7D$t+#m3?B(b*bEqz{ zIQ}Y-6}?V+pm`tAs|=dPa`>lCus-^99+rxu%Sw-CAD$^rsC9aYzAyAd^BTWx{M=9x+%|ZX!#_^HOTmb@SRnEW z_wXFGrrIt*hTa>^Fs4JyH`na zZ}HBxI%W45UjDDmUJEg==JlR$kDwmEo^(#2&;L<+$BNioq326!8A)D`#-skSfeG4< z@-JGlg+&>@p}&vyM)Q8Orfz23NrTGOyG}PQrHZwq*GV5VuhhpFt-_R>nX9`qZ>xwq-OwX{ zDZWHTnZV4ldT+6(e}$iTRB8*eg|gSC#a*1k*X%coFnnOn+(uJ9_lzS@zU2#Q{Q9DK z)iw1GB$X7VRx461U+O*n>J8N<%WuOcZ8?+s<}aTjP7vX`?{R}sXr})A!+y-;prNjP zeDb;iZT_a+JPCQr`&UrBerVoVlcj;xjP%Z2W`1SMPF2ON1=ODo(2DTH6%7p;DBg}L zWgLwb|M*l=bmGU}+>WbaTb}kGD746A&X&WnQ}mQ8pm_b!y!Ov&Y^P;1<&s*4(@!)$ zmU;fEtXS5<>?ZA{A&nK;djn!de7B`6->T}j^foc+?Jb`7&8>=IAxH@@3O=;^!4~8nm2r`^m8B2CkBt)p5dpI7Vqy%((umYAIM8$*cDPs z_x?)2jBsO? zW(oIyb8!2e05tD{dN-xO)5!PZG=gFQf+~EoY>!SK?y}3;IsQ>=_a{;Ll6T(^I$nK| zz0}U!c)&$0=d)0utyX${<~75%_5Z)%RcqT;p5-s3IZCvo|!%D6nwKBK4abhk-{qIgfEc^{?%vPJvTz-p+h;+p>}2Dds?6T#cwReH*XI7Oz$7llG9H9*s(SyiYPrI zFAGe2OT6;xHx$&fP*z*t4zEl(^oZY{A@yp?mgI+#NqJ>9-F6@uY z1=fX;BM@c;R?*>IMZHeHiVZ1=qo5k3! z@+qmmT9PT|){!0slFZdgYaJBt88q*#&PTr7L+S%wVd6{b4<4j(9$HgnqPviqHC$xx zX@5CI!xz?T@LKVUnm?}84e(vA7&4JCb7sVTj<}J9rT{(a*G1!fP zN?bq7$T+BWus-{7K2vz~PP=-u6?>2VUlB8w&$!zstX6l^9%|jq*WYhS&1P2Vt!H~> z=!g-D_bi%sp3f(Cnn~qz_q*Oozp zt9Pqs-*KzN&dBb5W=nG_jH>re(A+|{KIcedkw9vFiiquuI*Y`anVqP3&!Kq@)HQX^ zylXudwz&9J;kdCC&GxL1tz34;xb8F+N}XGa6)IFR`}NwgMzT|tC~R%6W>ZWqNA+R# z&Dmbm8a@qS=yfL?%_}sJy7;KNsbTXGM%A1bKkSK~M~9tyD0J+Hpt`8^Xp?D@Uwx}- z_2la$6^HN7DykAZ%Zets__Lgg=^|GRE9#%2;*CJ_ddkIj&&$=mE{p86#gPX+I}3{^*V7>r#%b}KCS-~>+-u~lcK%VpQjoFWwOc{Fbn zbsKjUm5GYVY)6}H%b43_+gv(@!wPLlz4%I8FOD7d`wrEmQt%dIxHdt&N&ug5Qg zgubwsE^n@R_`hnHM)6)i^J0tl=~)?D`p(Ba-Tj`w!mf~WwSez=U;*Qf9oMxlm7jPM zRzm!p_j@6I>GfgaM)AY8-WfC=PG|G9C7*ARY#MPx@kXL~Rf7%+r#K|0HLx)aEfLwO zay*Ixfgr9bZvEy93qY;dLrD+xi<0@__w6OjN)L`jC@kXP0)1{O5X(xRb;wljn zO1msqq%xQv=OwB|c9W}clG0|>!shx5hRS^NLPlP_>*GxqNbh*ioi7OaAd}r2)mdGs zI*H=Fgyyv>q^Py7*JP%kN99DBc(}FL%3yL;duYK`E1Cb9V9)LECDBwl-UMga${c zY~FUx>}t);nCy?$djv)!Wgkl~ot#mxzi?MK1C!9<{JMilHV}D#@)zL0jONW5EzvO} z(skTCMDruq?8>(7mzVk7#l3IRBvSZ(-FDcoyU$iAo2V6z-T6>W_rP?VmxoI+MYh!`1vLJnN z&`k83la{RA{f7@7Ji7Obb$QQ0Hjipnx~w5SrMHJ)Jd3}aE@DZlPajSvcn>|!uAzAc z!;=kWw~JXn4j)jAFPjm#l#r`8dzs^dC!LD@ltz2j(-oe$;ZjBCU`z^&Uj^Hx!kf;P zSZ0MyyE!<>BO;{H`@ZXF-u=!N%8AR(%W1@4th%pkI@uLT+frn$+zsB0_u0mgOmmRp zF*W^1^VI97-OelNv>$PC*zq;HAb)jI-ZfQX%zzY?-y3M&@22)K?OzmW+tNDncWdOi zJosUUrN zCYo2asXr$Bjf>f3miG47Lo`;7O1i6U!*+`KvgzD~AL1@!?$BJUT09{U-gbqt_r3IU z^6$@&9GUZRcYod=(fq)L8pRun=Cw79yyDD!yYxmQWz2)y6Qm5CHO*g|8?B3v@4q`H z)&0u%z(@aVo0v27R(0R4cCN;ljLBH-AsN~%)bhSQ`u-AnzTHCe+MS`7=jhKzcod(C21SQ{=clo&} zxtqmErQw7OjddLQJ@W)KuNZId%ler86g#VlCfiiRvd((eP!?Yi(q##954>11eVKmC zm5u}C({DbVub4<2-Q1Mym)`YIY$bFe;`N6eN#*Z0D+)$h+ux+6 zMdcw8&8tSU=|I!>i}Rm66Smm4Zf4_mrh7Yc<<|*mlMcRT5()`CHk;Mn?{$oqq3{}S z*gABLGOp#PUeNGo_V*1MF}i{wmTdR=1d7~ z3mmWLQzf_G^lW-+B!EpTo#20)oWx&MY445VO-1w0_{9xlS%w7od^jgfj)<$x{ge%I z?Mn~Ba(q+ZOqnLr~vD%Z_#ZKQ3Fem@ zd+!0(RMWMM21F2*YQf&c8afDwf{38lP{A%5AV44xOz1Z36$=)`f?&f2c2N)o6crUK zV(%!T*b9nGnqC;^ z=eWXA;fP_sUTTbRt>5dg{m|LtLhqU{ObGU~EWO2^Pu=h1^A}H6dp#Mhe7@=PBYs)_2kW(ueDV3aZ^n>%p}L}_^Yko? zzZ*E-N@3}{gDuzO+0M_+JTBM!tkYKE-k)Kdz(1)QM)b>BqnfyO@0~mPzrSu1cK9aj zSLe`$ra47p){bnjLh^c5`x%ED>wSsu-Y11^hn;M>_d7ia^T@lLwY|-|#R)eZXFoq9 zn0-I?&VjV0Nu7?}?{)u0kwKdJ*Nf(@XEz8QS3IRy{B@S#hr^Afb!OFf2w!9In5Az5 zTkiKTadOueR=Y2>%z9@hYIstTuwo`dFiSr0$BF3PjB?sz@71xxO3w%q&8;}!li zZl7~?iSe3%)#xH{CyI1Ls{*yxqd+0F4bF?@nDl(L>kT zZ|UNokK>;{-No)l?P1HkvA@-fRhLumzME2d|3%jcZ7Tr~pwQq@RxlwBerB9AC>!@^S_PsMt2kD<$bf<^YWUrM&*78z7N2~mucbHqXwd|*fzE^Mr@vaneOb~t z{#gH}rB>N<+F9gjMzZVQ{cO40o)7z(wb#CrQlk|=wt)j%oFFZBjp$z6aQHA7ynHX0&>L^!1LL z!-|~6_KW(4`4ujFx?c78pMCq2+&c|PZP4VBbhh5+omg+8@^O(6ZI;mNKN4bl6#mf z_fCgHJH5XixT4(X;PZ9PKb>~(daAy(Kx;(E(IL$S#JdI0%(xOU!o?&vV$%E09SQ|m zo39&;pQ~o^DE8yPSG@+^Ph-hF!j?PtPuQWe!$+FLFD&wy)z;a{^!5B~743{SPshy2 znHd(}#h!olvc{m~gT;F-hcrF5Wx9Xq_Nimew#gk7(PU6gq3;!z+@ox{$Hh}boQCPw zC%<$nN zn0xmM87Dl)l6#CT_qn6mkgLwq{WmE4E;%>+$)d0yn>Dn?Sl<{tr^g#}W6RQ6ySVw? zwuqj-u^*Z_L3?sewzEpnh&68?N8ftYqu_9B_IzJ5TdvYC)#eU!y$u#FX|8V9t9`GY ztJ8Qq@f)LC65V+NM)k8&o~E1SzonV>l$o(+S7Yx4HPy}S*?9IC&dONs30J2z^!{qP zA9b89_u!unk562?b71N-zYi*>j7na<+L^TO_YGrLwYm+xi`;@8ToU{HW;lG_{9#R6 z+|hwkerk`2{LyQb{m2K6z5Bh^tjn^)3AWtux4%ksrfjt|+M8JPvr}QO`Iqb74~x!t zYNTWCy!FbLZ5C6vUQqt3`|OU}+mGYVcY0YbA#!tY*ml)^>7BdGQ|pt;lAFSo`ytui z`|c1AVQa5F>-O!Q?E7}vGv)Zp{^Y3S>Y8^GW@gh4`Ig%y!BwKFQ?hw_rUtPyrua4-J z-rl#hlj73b8M|U{l?dA_U)oYSQoY*&@y*9|r?p+@`^U-X<%gU1Mtc1`skK65yvlyv ztU~sDNg7*jvQ^QlwEHbH-%sHU_%r3^&cx^2m#-{V>D6=4Y@d4m-+S2}Iv>k_tlli+{!+We7@^q?7NqCFbwq0X1JNe~pP*?2#GCb`KJKs*T<;LvY zkiVmY&&IQv?K#t46s+BRePO@3C0k9q{J8(EBwG@e)MwfQozixb=H=;}I+btGy=}YP zBhTusAH3`OoO$1T+mB)Co6eRyDs5u6+0K;KwszOHZ1=Q07I`wdWls9X<1LCxwZ=Y~ zCHB1XTYrsZkWcRKFuh6Y#?9IkbZdPy;qcZEvjQBi?$sw}a7o8+8Em;vcFpjO3-(j# zps4e+Nsna%nl~O-pc=6;ZPSmBk9!s#{CfNMl|Vb&?%RXS8{}-9SQ@zJ&|BBLb+XL7 z56(>*1L4W^||{O{tlTER+n8r zoMp?kQ}}h?$0o2@E0grL;{#@o3YgD7fAq&N&HjNX~zi*h^;jXB;&V>iFlQL#U&&YlM zNpQ%v$%+$)aTQZJT?9Bs}H@|{l0T-xms^#g*|V- z^4;pm*$E?WM-`iE`1RNHonzVEG0dXbY>n97Z+@Jzn&+0{{^OW;*pfMdwkIrd6XJav z9&_qdw58S9k1YG1XUiQl!Sh^WyI<|MZwZNUcP`nkueNUH{QW=t^W36lx7>XFN$TTz z?#)X$Ta^pmXXb01o3B6Q^TPvm!w*GmDx79Eq6d3D_5xe(5>AFFeYM-^WIvDJpKNIp%d-dq{SJQ*h&xB`^C5l^Dzh=q3#FpFmLwl2t zLz0FVzu)$A>YaxhI>o17PT|gw9U}}xa%yI+{@+Unk=8AlhE3H_14>Sek<`$`y{J3y8CBt^pF-E62C^CcRKjc zxJdwi<&iVG{m$+eeRAJ^d%@MV8hgKepB}GzLU5G5e=>(HH)!$GHm$qp&TSiOFMK7~ zId5DSj)$+l#g){U2VXM(Xl}AUbuzqds_Th2uSdrv^*M8~^!Fq6l;^fO@slRb5QizV z>zylXxm&NLKN~Z#W7`P=kl5<1xoe}^4plU?cZq2fHsnhXFq+`9PM@PE7I zl*@|NmwuY|f34vd5prkqDf35*QqxmUPu$Z{{rkd8@mDmTSYCC0vwGdCTh}+OFHYz* zu;snXV;yrEgmEu-VCj3EEw{tA(`t4qBl|yE+Q{kC4AnY`f%h8!uJ5^HS?<*sHUAG8 z?Uh$tf2z@@>)}}^J*S>{`N1-!j>^K8JI!4+R-8T%@5ml!-C)c8eP!>g`Ks%9FB;_i zsJl&cS*7mjgLm&L+#6%_{g;Ga_kLFFm+l|6%~vhtUHGu$ZRnqP-<#t!^p>}XDiB|Y zP)T9WN8M!0ojI?0*Y$BlFTW_IH>+E$y88UIw+)6(JG$%HvS~AZ^ZPAPGf^&Cq0%fb zr1ds#Y_U@FE1$(hPwuMD@#v9l9FyKfk!6Qmw%o|$^V+R*cem90UO#qpllclg+Iufr z^GI#O(PIO&E=DA`3FoE9U)eZH>1oG-2j`9pS!ej`YhvQN0$#UsgB(ZwXvCI#i!Jwq z`0%40uQvsE`|T9D#b?X15SyS(tDLiYdUq~);=U}!aoWJNjk9_^YPjo0$O|LQ9pyPV_qE%zpd%D&krG9Y%%3PZ2$0TWxET^@JL<7c9-M$=zE^TxQDv+Qu2E%)vSG!)KzK7Ty5!*S$C=qz+M7<9vc+ht$)Q)e(MR69TP{*z;NPTjZr8B6Xx zw%o#Q4l1TiKdhhpXzZSSyy$GBk?qDDkKH{eU)|CBTyXTy`^G`>54IojUn(qB$s1!l zxJSfS(-?ns=auabDOtDKb%7=KK3lFz_t(oe3VpsRI-M3AyKh<7_FK=69xj^_78Q(F zQ7;L0a(b;?Z~na4>`O^27HR3Ia0EY%Edw+(ywZ1xQ~gq`y;yP|u;pHfzMbKA<%;!q zr~R8Jsc%^O%*ImH_4(Jmtt`9cchtFa)hf{0D*v{_hqwASHeOaxeca^SN`);2&SnkP zXbYR<^qI(#`;aa7`2IAPVUyzAn_13{aULEm=wX@`p%@>p8hjxCc&p$-J)QU5%!M8H z^%b`(y*KcTZ*F#XUao*MDK%sBSGzlcX!iK{5nHZp;_a*hX0NSY55A$e_(%7gKEJ<> z()9AmJC?Ba(S${J_x5#~le)`%OD7kz{_~UfiWOeCyqeI=Kw(Xc=G!(KZ&>eU>HC;1 zS7p)K!iJ+uKYHChy+>z6Lw@sJ!?YXgIwc0Yx41a3zplin^%L#_tM5xRh7EH#*Ib-v ztJAvA4Bcs`ri_Y8>vDD4PnO&#Y`F{6+pLNUa~D4SKL4x91`?`C`Y(*V;lF!z;ST~Su-ZC%$wap$o1szzt@YTAJyesvS=YDE) zPs8l}etn;Bfh>Is*m56h?LN|D??%5z@20J=b?|Mp;q2iNu0uXPRT!+0+OT`e6?ej- zK6HBB%(HaMhKm9xhgSvq{G1_bwugPV`mc*5t=_TZzGBNQD7gBev|;0Gr|Rh1YP86> z7t_4)$HTkpuDP-%Hs!_OQ=%q@7kij4*sr{&u0;E!U&HUV=L(+9SJEmxo^JG5(nFa& zz9?kNouTD2DSQ2BkDW&sA6tJ~YpsoTvd5W~-XSM+^jnQuVs`pwL6+}~F-tV=ul^P` z<=pV_RNEWZUyc0b*;{S@{Yh@y>F>tr`I6Ucxgq<8ZMS)Rh&zWrZg_vg*wnT<#)>z; zwd|>QZpD-#<83ajKQyG}&(>3mHvi1KwL_>gx=o5v@r?xMHhVe@XnA;T@d%b3-mv8! z*UEj6_TWmU5l4v3B7O&jT;eRq`Mll;<>SJT2%=67!M-p+I3 z%q2ljyGOpZZKyNC`V)KKYY|)SNb?pu3)ihZ+-rYAbEOom=a- z6ullcH&dmrsO{{-d*5|kbv`<#>-i7kyB&9%Y`L8>$PTBj`P`TL4( z&*mma+8Ep!8hvxAOPA|2H`ssgw{%R~Jy)MyXUTofmYc7<`)qra% z`jB6D=I_G2g5eIvPrkNYWZwMDoO+|0`@bj}ymsQ7Coj%hXSM4*K-5F|_=N@%(O#C^ z4{W(Z6}zN3->Uy~<`>(Rx|^0-Cy26+s2Z*J-P|H>TJzKVx4#p+KAyKRX}as}w4pb$ z%-cN(yHwORe|!F@&Ig~a8J5WQvyW`KowRJ%-%jA)Qk3LhH|a6P`AXzx{Q@ylAZNgDk<+QTpfd z+}GQu73@9rbkVkT9!eU1$rI16U*S9W_}(|qdMOS!9%{6v&WP7P@0`)S%#vHomV3e2 z_?yOBK}`3$^G(sa#Z1SsL}{ntH?cF?xpUV(c$& zT0Cs*`wiZUBF-Ic%C0BBv*iZ*Ca=1iI!Kbg*uP88izW3Zy^CACIb`K(4_o{5J$Gw< zDt_zzrFEa(db{4Fb=jI1_~?Yn6_l397bm8gs@WY2J;2iU2V3q^-~J|Q>iJ79_dYdk zZOOxaD>vb*B(-sG#|%3Cb6NXEz48P`TMX`Ky>0l#L}kI%AJ=!e>K6Q&qi=Tg`46`? z4}%-AJ&yFohN#1NWZ(5HzwoxAE1T48f*>Z=~Jz6C0ZJhb2$>y9LafP`jHJWKH z8*Me~e9ovN`y&Jyny1_*?tbGFy4tmFpXnwUs@9JWFa4VMBid@ia`PT*d$PX|_{Ekx ze}9j!&vg&*lnqzxh@6zwsMA}Ow0Upu&nVD$Xl?iSy@ zy30c69=q93*Lq~DDH(?0EPa2orqV7VT&_B~NdW%ltOGN;NeDzNmdlTB-cfMgQWmDW@$~o`@PAt+A|rkIa%qb(TaA zZQONA@KW~tPAOaN^=&7c4jk$^w$x)m&eB64&!q*&ANd)O<{4Lf_Sqd%y#YVZ#kzXs>&7?kC5ucWgaa zc2Ho;-PT^?ZBysnL9e|Be|IWKDV>yk{L6`9kuwgpxBocvK+FD@w;X!*v{}MLr+oX_ z%0kOdJMSl5nzro3rsZC~nFCcWvcHcdV{qwDsZHJ?l|pZ|jLo}No}Z98Ao!f5c^#uM z<~!fK>2-7SvM4jJOktfvcjy1Ow9hcV=zvbjkS=~N_51%e`_pZH&V#g0?C}s;%aHz* zmYsBpEI9vlq=oe@&6K$CT{jX=P6+D39c8ube2dJ^_4SJQ8yY&C-OM{+Z~xik(lb9% z!Qp3JW?%7+7;(|F&k`~FyCgDKDg7ypoUCr+sP6^@BzICw)yQfGp|!I$0}{{*)s5 z5~URWrf$0gmR}!Ep2R!8viN~MUnlV7tqp3;`U*yCi4C$I1>_&r>ffkz%c`)83u1Cd z4m$WU>h$UCIY*BAu=9=VwU+*rOiFu6`aR$3pzPegO?;0jk6mwR+)53#u*I9yw@CVF5cZ>a;vCa#&V-o{EOoly z?cG#+;ro&A``+B~Vu$@>NtdYh#x9HWXMAV3n`BN#`cs+|dE(Nhk*9wtZQXY!JLqzw zh`KZF2VVP~d^KM9aFNk^i;KE83oOGL-01XCb-%?3%MFey5B7E`c2YkjIobGh+pp|$ zT%Rr1?_Q_h(=N7)EEpNnd9&+^d#(Ho?q&MV-KKDP_6gNI?M5kYRs|$>9Fa9VV$VjS zlkb*BcxoJ4J#*bVTfGP7%f2|8u@8j-z3{zpW2#TU>D;Lu zj&YPvh|Hb%ZNJ3#4S#zuB*|&v?XKI_E~?n&>8)&1tjowCf@B#FJa*Wa-|p9gx=ctIo@2RuivUg)A1_6)n@!FkSKVS;Cfj z(XYj6+;Q%u zst+9d&E1mzs}HC96j9i~@SXMBWM6E!YE-9fSGXtUono(FkhK@-Pst(6SaoMw9qZ(e zS{jQs`?-$P9kTX?%Xbye3!T$7OIPoH{yu?wV20hJq}Fjh@1i!6*|{5s!mFAI4nFgP!EGWw)ja-*wrfp?(u@f(mO ztsk`5a`_=exdp$bo0VKWI*+&h_D)4Dooz~~nUg}NnAC}E;hD6&-;qtyv)l)N=OpCy;oQ+vKy|Irwj-Q94NreJdW zH)k#cuDtu)Zb*p2Eu$U%cn=g;a0X|5?RO_9t#jeYBDEFW>NrWx)@dIX#F8bIS$m}| zfUQCtp1Vlwk89()9F8jflo3t&zyCkcC0G#1Cowy!a5xSA2XrBE`1AZl0uTHxw|dmy zPLCk(_!74ufzX3f2L||`h?k_P_V?eh0LfpmNGJ>n;Be+@QGZ`9;=iNG|NmlDVv;Pq zR%Zc1m!i5b)x9VA>n@S-CGPmUkFD^xv;RT8L3qP>enKMKP2jKR=OZDv|N2My8ebw3 z2J<;9+SJx1|JsnXjQ{H`K*}?kSgKtAZ%GU(zg|L-8_{=X59$p22y*{_@<+wNrR%Aw zxN81``s)9r9<{Rmzi$EJYd(TN0ZHj_v;TYT5sCMrIql=QxT@9qILU(AU#$gdE%0Bq z0I8b>58`kdp-ytewP7`N6A8zch$(HmIsUV8#eX@8HAYX;b{rsSZ!q+KrVm2m2oUoF z0|k7slGFc895p8Ne{ld}KOR8x=$7+;Za*TgiwiB!T`15aLtXMNZZ!4xz#^pY@an(% ztDUa>ubRI$@>&bjTAS=G0ah~4!B{*pkRP^c#qx%+ww zgnT_`F`wVJosmI1i6ERW^6c5pq#aKv@bVXV;>?k<-=9+YM_$lp?sGUec82;%pUHPu z(lcJkS#9K-r#b*ReT3YTbJj>0a)v@6Kz{W3r5p~9Y2rkX7x>YC1BSy<#=Rq9#E+aI zMs9J05=Z*?14#OaJaQg`^o)M`?|)KfK5?Yy;FB{vi5?_9_F6?4=ex{0*ipfz!G37K>i*`C_v7!n+`NXoXvq2KuZ8e(QsM= zI0lB(4rmW_06GDq5Z)OeXHLGwGdWM0oPGQOAZH2_-}nrWb9KoXxa7QAa<=SufSlP% z&Q~R8p^|e;$r+>M+)g3j2avP8M8H&le7#EiCkO}zLVz$J9GC`72W9{>fmuKVFdHxg zi~tkz3>`ZG?SYO!Tc904&cllYmIEt*J_u_K%)>o7le|0bdjb=1KLQ~BIT#oKkiVU5 z4cGwv09&9xU@(3hV~<0!hGTAQp%NVt{qPQeYl12bc?t1I7arfQi5)z!jJbOaXX+8{iIj0OSBO zPrwWC1_Xc)U<336Y=QoO9WVf}2ONNbz#za87z_*n@M$h*7%&{bC$yXqz(`;e;0(9` zqk)x3e=wkjdox^z09;@do-=?<;0$mU$O6s*CxJBJ6tDp}2y6qk1FM1I;CBL|aDM~1 z30woN0_TAXz-eG3kO1rea)Dbw9zg1uJHTDwI*<)q1TF!afL*{Vpb&Thyab*DIlyJ$ zDew%C00W`NK3o%lEx>$WDBeB7^)c`exCh(^9x%_+_fAYbw4EHNjGw&vh}09L{7d7a z>TALV{KDlY@B=6TNLf?_z5v9Z_5iy9l8+=mNxn7#8UsWG39A9r1?mCnfEv&cXaLj) zQ~?!08BhZ10MhW%E8)`yGyyG!-iUc7VT^&6fDX_UV49<9FD($JInWF+0t^8IKp!Cf z#07c+J%H{&H=rxf1<(aL1D$}5KnI{b&<KnVB(L{GvO0QdtUfP|R}hyfyl&_jU`fbazYBrU|g!2pSafV|TNb^vpL z*}!yQ8W0Z50wRDJz)XNVF9)K46~HoJ9xxYJ0L%xL0*ir#z#?D?KzJg7mB1=s4X_%B z2i5~yfOSADuol<|koV+WG;`g6YYean*bHn32tVPCW3Jn9-3sghNdBJ&J_DbCkH81u zJx~C=1oDALzg+O7{~+^fqg&*kPZ;}^?_5sen1I00h|O{f$P9E;3`1g5!?dufP27Q;12K*c)(l}aD5Iu0|@OYK*Bx&9s@4`5+C`!!+lGj z5O@W=0bT>--CLjtAn_49YXaYZuRwEv*o@e~9w4%cnJc;fx4$2dK|tgZ{AR9uaV3@R zALh9fSJLNG21p%G@|5%orQxY(yi>xvx&R5Q!hrM(N&k@a6G?xOq-8vy1CaNm&q(^$ zq%ThT-h@tgh|dsTy2G?PC8XnnUwx|yMrM{M9;{;O%N#I1_?N-NmDi^%~;NujF) z$V?Q^1jRtlOwSbcWH4VyPLO@G?x~k$4Rbf1Hh!DG^m4;#E(}09eJZYMKRSgq3aecP*jv!IQT!=a0e6vJtJZR z;?>B#2*>Z)!n*IbIfG&hgIdu3)(DiTb;AbpKIX-OVhG)Oq1J$7zyl+;bdKoRV?N&v z6h>?5dAMDb1ey-2C7}$(7`3;^12Lg>HhccY!EROt6_1gzo;lS&Cn+7c?ZShB`&$bY ziEbuDw~E%$RPaU2#Ltf5+5}gQ=c%)AS5AEZ9wX!eyy_At#MVEw_`ZKka$-O+)Pr`g z0VpJI`?@Ng%za<)F-0*Txgb4J_-^qEkCeFlkD!?A84~k+1`q0m2+y63y?70SD25FY)8@{ew9tf5&I3 z@DDwuq)}x7=l1XdV4W!Cjq{padnckO$W^2T(uj4kUw?c2X<2+OD5U&=(ghTv+hng+ zGYUdt_cIj4(~IF*cWm&sdcDpTgJPg(Y@lao*dG*<+o{XL?v}heq(jAHNTmG}yLG2> zvKk(w)wDWW!#Wjht*OwrkGY-&%(Jd8owpmCB)@Jk|D-RiHOZeuP*6)ngnc}E=f3sH znGD6qgwsTs=9x0cy+Mb?F84q|9#rcG(9MLC4j$q=Pygg3bv032PuYMf3)RO{rF9_9 zpzNexC*l2p8aw)}f;3VcK?Ug<&6*wi^bb+_oJ?tLWTKTvXfk-zVp*%lt8{%!WW|tGG}~gLPv#ujfwZ7enFWF^5Tgh z@I;P#?&-Q0l4LwFDzxvc(jOnGd$f;5V}%8H(+HN_jw|uena6`97tC)NK^lCDWWxba zNSV`F*E8&4;_ufoY0^`zCl7DisY7PoQrLjhqo`ea)}u?7Wbwd1M|O0Y4hm{(qMI2g zL|Ttq+r-y>4^5;fRL%`hrTUE#j~<=gyw@nrLP-Hd1mzw*TZSSyVYSOd+3%%{B48*5 z>jFQ;TYpQHQKm7Jj2EkRHPUe?mQf-ZirJ9M$Ks=ogv%&fKq0m;u-z~@Sy@9-MmfY# zw(g$k^R8a!8!}23Ls_J>&wH|#WvGmDhoRKd>f7VE!kWu6${SEf?SDbVDcb&(U#5&w z%21k>lo*b@XvUXO8lj>hJeiz#4!VVkHZn>VhH`(dr@i62dl@oHZ-&xcyQ{In(&zCq z%5a9_*7TREM%%{UWE6LXvbuLsN1w88U7}XXACGr+TqShlMG(XZzQ7xGZga=(}t^SF1#+ItOcb5c$TjCy(zh))@vCh z8I+Eoe0PnRX|m~Jsf=yribAEI>e&LtdEo7AOppe?%T4jW%cu}^8j3NQ0H7Kpahbz38ek(#o zSqVxDQ05HY;`?TI{UI{S9#BXwXgs@a*z?z=Uoy%$M%p6r#x4&R4N{X)ijm{&K9Z(F z9dt1eJc1|o0u8laR)^aoqDOQN;E1ko8#^+@)dYM_w*%`T3YL;P!#lDF!o2fP>n zeXdpunupZA-V7zQmEhXbMXsMfLCs4jQ$axyia4m&CVz3{ZZ0U$fY@LfLwVzOcH`KB z5tl$A=|QbrWgSoTgyu6mEqBj)oK$cWqaKO}J%<&bkX(peklKIOZ}pv^n9;W0z)+Tm zebOd57M=rz8Ds1Kh4jUyD^J?kXW0&a8RalTF%VsiS*0_B*xJyPN>Bzv8Mn9NYqj~o zCz*Jl!BtQ+A+43Mwt44koi>AFij=|zk3k{+F#N}vqbHTzNI#LJ6g;0mA+^idq!3$e z1-ofdX@+HIz>gYu_mk30Q_@pqw4MwHC0cJa&KtI6$B$m1kctNum7e`>QqnMO%-Vyl zppgCndiYi34zu>q_z9~9yt{TdwQ?7N(~j7bkDReG->=>=374<+q7 zq!H_E^9c?L`!k_6WdlPbmh+g2XYK+1)$SI&GSj2oISC-aLsY z#2>RW)=O0vJ3hHaNuzAtu^rvp*cfxM#Z3 zQGE&SgzA;pp#J8k_vWcQH>P+fi|z!4^lFA>9(K+<>9(KQYD4N%P+a@@o`cfJI3 zK8^1vr<^Hh3m%f&D8YuPtVs!WnNn0*vXb|W(GAjefkHIs^Ev(CMNLz0Pj*S*Ph<%5Y z67ztkN>4;g)leu~SJuFlSO?Oo8684{vE67N%~QAV*KRU+5Hw)w9qGyVo?{~4wHP;S z0LcXu5)9jT;L(B&!tb}$yzI^mqw>d)bnX1e)DM0)M&{1{I5wz1l^*y!N~1u`3q+xt z_3llWm1EN_Ogu=B7}7}1_j-i;G^eFq>G3J$2NvDwHfzVXP>)gS=hUcpsPx!@LQ4I} z#d%3>#yZxQNgKiN)GhYNfBk&1fs7~6o9|D2^wZ~kg}WwaL@Fw5Kv?2|)yLx}@D~JN zgeXy7Im3OuWhkVPQV+Wo^q}pQ-lDT|>f|X;Kw-S<14C)6_{??0yLSPgkY)j8;Rh(B z4W6$#Q7D|Ju!+*mkW?Z{J?Z+Oxwf{@xuXU>PeJt$8iPXm@p~HP{VDB#%Y@>gY;X<~ zBF$;0@Z^JohxdWP)GpT<%BhipGm3w1lKOxt3jw@9Z>}#t?1tp@pIalXR6$`z{A0Ov znX_r~c)jK6dNV*_JTb&u;O>n)z3jKVc-!z#_6!9%Cy?+%`Jn9TIp*Fd?bo+uJU#U2 z{Hb3!rnPn4vJxsDO6$rN{fMxnx7k3Sw&;hmGXgfxRw~p zV15U=V8H2(G&Ka}w@~3gKnJ^f;9*L=D=38Ld&xBK%&}{BC@MJM4e6Qq<60lr)*YU9 zOjqqdT1}D*cpC{2-8{yf$&A&AtE;FGiZ^7mwh>p-F1Xw*>J%>097pL!<@Rwl$?akKnOmD*JkuCFOgXJWYi7o*3f)Mb59zmu2NSKwD{Q)N zU%Z9*DAQ(D!-Lo_gNJBP=l$wD8t*c0B^;$EzP(@0K4WL04 zDP?%7NT~%J5vg=Q!$tCR+&Qz6uN{9BAw9HGgQc9e+(j2j-0;(PA=fMx=34{2Y zrHk*bKKEUJ6nKcgLAP`0brI|2I_?VUYdsllFna5hv}>RcAH5M!^7)R!+Sj1KHbl1v z3}xJg8}GWQhkpl!NzW@#h}ORM8m#`XKgyZ%_+Dhl@(mPiP>QYYT2E?n`V%OaVk27D zGp9#-ZjI*zUHw@)o#HVj+0Y3TE%3D6toX!4`$z#zK^Mi;6clvWBi_%>z58&zav@D2 z(wsmcTIcz$kM8o_EQg8*2HQkaOaB<-HKl2Y$E_t2D= znz15Enju`9!}s*$y9Z*t)$Z|{*_X4DK{3W8DD37V5>S@qn@=p>nLBzbi3b%nMs7in zMzl^{TO!ot+V7xvC|fT8h4^)}?Si_k4V(4>h4?5eirf*ni2^wfe~maR@NJ$83hHrU zgD~>v#qc|G@>T2XsRwLHJoF4;#hH349%`n372+YbHh*gwGf8EkmXu;##Z3J+ge7Bh zT&VIRUFFeKNXIK;o#yB#k&^YMZ~B%lGf&W-NcCOZMHru=T3&r~d%oeQx2SiZHASh$ z-;fK{&#mhso<@jg@8{yJ2Djc{fHbCd@fGre#L#a{pE=7Wofv$Pp`e6RH-m1<@e}(A z{GglI?2z%-0y?-a2}F#Xx9H`n|A0^(n1v>vO$n>--ztnpn}E z?|h=@yH~QWmLg`Usb+!t8%|<=C};lJVNbrjZ9@77goF}&mEoDbDr3A#dOOTHWZ(^{ z3#<3UKoRzV3M7G{XLe?%c&w-cX^dC-iRs!U$!P)M5vyHzap@DQwOlBI|B z)^s_|J2l%eapwvk4uN`!3?;D9n;@e%W7R<+wnkY<1BI0O zjC|v|8;-v81cj+7s?>n0L#n6f+0j}DHaB`vVy~V`#Y3&J1c5?wq4WInJ5IN|dI}V# zw^0fT(fU|Pz;k`wb7YKxh6Ei&a}78)(XD%9moDyaokkD}hDCa&#_d2M(!`tEx3PUS z&ynUK`J-=7Q-U@7rur7=_N2U*(%Kvp(*8W$eRs;IvHg5xlb+q!SXeiz>;2yMNo`4b#K@njwI*HSFW@1q%sVB{zVq+KBr!b5pK7gR zq2NH;dlRVNjFF=7HFr;-M;-eA4Kv>(hXJsSJ7SrdQ8I$&x93Mr@gMJX-P+x@-{3e%!j z@7ERkNK}o4UTpR2!KPKsY?Cnt(&LF~5>l7sIG8^_aQ*oZXu$MGtDlRmvPJJjdia%V ze`!lwu@)oi+oY*As5Bpf+%|4EeR?}rlghI=s9h+n#|@)bUsgUbOYW6rP+zuwIvte8 zu;{O*iY~j{&iczJD?uT1ooVrzM!TK&e34Q1gVGt4hkoOV7R^2jM5nt(u-EQCk#E8zeOmc*nmQ$ zxfg`x)Q{W9(%OZg+zi<=cywmqXBm$VDDA*=<-TLc=H@vUWt1hLkhQ4`F&)~U{rq%- zjFQOkydOTs+iC85j*OB63h6x+cujxt^Gd=48Kn>uqII5e#M8)hhj}u}Lii1t!I19k zkx?q{2BLhF6q2&PBqZG@L{mrss_Z*)PSg(7D*A5?N6<41d|Wl4f&0$|w%4QjkEhBH zb_`S{jq2GUp0m(`c!+eL5Hw&~+KM}(AdU2dP)bsmcvRzp{Yy8^`2Y&3-_T>PtaUaM zw#`VoPOPgkb!BRwJv>r}psqmdZ$Z(52D^v1zP>5y25GY}$3{qhK+yz+H{$-LXZL1W zGZgeK(T-4kS?NwPP>fL}VP>w%9zHz_8syLS0N)7fV71pS?(4vV(t~=8^H1!iK8kKB zs*HzfWh&c1%Cic*WOR6G^tzlIxpO8{8lc!$Rgc2fR7F~ib-?4`OxMbHRU!+)4I*V zm3Z%)-aKBm(J(U4NA_`<7;;uKA(ESAJ-Bx5kF-B(XkPZ0p`6~wCyc)^ou0#|{2G63 znJ2{f?3eJ&@1YYyN&cXBOEjo5J(O-0Evl(de+=DfRzIRd7F8JSO8a~R?G-@7tb_x7 zE&s`ugzp#37wZiO#l{?eo^Vv4Sm5u~x1FJE!=-t-4VQuBk4NK|{d-9Cfv|{ z*W+N9rl|Nx`yBnp*j9L8uy!$I6VH(D3am)4xVBt^RR9wHzRR@jWA?UdUbh<^-)tQh z_0q;BkF@Zt33`^r?xQh7VxkQO!@+nShrlBzX0n&d@}1KaTf~$0{yUx%MBq*M0~M#U|@j6QeR)p_refR z9H!?VfWH#1ClY(2ErbFd=oL>x)hoiGSwQcK26W<-U@eU#~~?t znHWq)l5vH6(^Xk$A)>4RbE&-!L<-wkz4-pzDoS`D*{C2T$WfFnsvHkuF855zk)Dxh z#ps!hB-|je;4fogaZss~h=jp>!Vhn*xumo8WhEVwSWlF$l~k4R1Gzl0m>2e!ik5|k z@UnZV6j1fG94VO70}uX3lE?(U)N4rdhd-w&hm(W=E7eYtjlq~2LVmkq&J7)5(l+$% zL-si988B5g*+zsf%e@2rQPYxk4=c`GzMmW4!-MZ3Cm!j(0>mY~rQC~ha5;QTj}mOm z9hcfb-HT`$AaEDCi-aQVVy3D~;(c7XsVx@{GRr;xm8E5I5|zpnplTf|mq=lyw>;~) z%hiPr1S#|lat>4O(u`v!f8-d32?2iQ4n9aWLK6u#QX)?f$_)r`H!~@FBNX@tg~BWS zD!d70g^>jLizHn38}uNJjmo{jrb4_d_lg!R;29g0$@b?5x=B3Bg`!233&r#I5Q_vJ z<+PH%V{74w&O$|TW$9t*Prs`w-4bI9gU~YVL;-yNit=dnU>}w|CavXPN);^sR;pt8 zx3oe+k;vbRC6<0G7D(KKE4}p-1W3$G_(C}jP?ii@j+6rqQT_$XFaBN{qg9zO=J{XA zV$xkEi+TQsvdUQ&vdTUGLs{kW4zkKU|3g`9=YS~o<3E(day>p8la6sn^hQSWo{_4$=aB zq;l}|59P>eR)~>3{6i_SDjQN{5C2dK?JcC1hZNbvKa?VCWFSTM@DHWXrl51F?EW9h zC~Fd-NZI{AltG(;)}!qHU&)|7g_iNp{iLi@fV7m|v-I%5Y=S=N#)w5iVNigaMuQFj zG4u_FP2>X@st3Z57y`Riv?)(w`8!&{@-#ZPkU}#PuAd~>y#iTUbg2LpXl2F$tCxR} z9I9WCL|B2$(uvFGxd|$e%VZPDgzoKGZ3rU0${?%)T1C?6D5R}!bqNR%h496sdne>q zn@Fnuu7WBnP8D>Q6_G0RlA0V|T!D?&81JiyOGYE+kmFF*$|QU;KPxYf<#zu@G>lu7 zWW4@Yf>{=liDkX~S3=9@iA-+!_y00#P_zHx7C7d=jX&huVkSvC(sQ+O!WmRESv6K=2RU{RwV_6Ip zDgR1*nK4K!Q$;<)v_GKy$KtD~YiQ~JX>CJEk=aFB-_XKk&GO&ZkF*amNk`KwlU8=J&|T#3De&?Tc!Y_9{P;Y7KY_bgM16iFooe%ukPmCP0X(d^1Tsr8_>9imAIGUs zD{>$OdP_qK`~t8MQ2OMLX@9vR#`nlJEv`Ec zi>%Zzi2m?ej&Ye421FxWYk<398wZh( z-wo*Rb-_&EfQj*P&mezyvL}Fx%#pj~zzzpF<@k_}n%910egJma!{6Bt-|vBod_hbt zbkt~X`luK#+YbqU6|YGPR%0nDUq?ey`4@jx1+l7p2w*+^6*sHx05|IiCAj7a3ob)g zz{%WE)f_dsfEU=YL8$V5kO@SKU>=C?;h%ihlNud+Ok_FWBcU{)c-^tLK`g<^ug{GerS!7$_IqB@-NV?kX>tZb?YC5op%hu?lVmcGo^r>UVlC^mfwSx$S;6cxu%Xvv z-LSB#huuSg?B@`k&{vLQ&|l+2EPaD?kev_mZNMtXU}QZZ6KbwfD=J5lB+(;kQbwd) znjHq)`TVh=TTU9NFZ~(IOob5g5nT;QV2%I)6LSYPvMow}!mCh=)}GOk%1dhfRUG6` znojh6<*wkdgArX=T$C{=zraSQAoLzc-#m~fk(ZejLPBDNH{ z*4*Q%fEZ z=Rk%S689jnI1C$R`CejC5b;rOfzTrWfq7nhZ0$j(-xGPvCGpFNvuXw;scHh!#q=KJ z$gHRoq*Z)HHOZ7SqO!((k0gK>f?CN7yO+^n70A<=6$*k`PgL&JR3EXT12^l5>eNsL zP=c{6dTS{3R6Rht3|#883_WV8PxdUw1XOrLKwYWUpr%;|>eLNzP*;khrleHRlNh7C z<}xW#0@Z_*qjtG)EP-^-^KW*Uy!$_50E;%-a z>Kjl41-N?vk7|(R=w2Zt#8r4hWi@3aH+<89UEdzq;fJm7@?@3^NJN%T~Q?{?U*V+K2= z0ro>OgK2vAJ2yn&5$KIi0W8_iHsl*2Jp=YDF19C<=KypDBmyY|{bWNOxMwIMlfWTl zPqs8{*@F%BC96T%GYKgtgUZ4||FV18*o%nAHvTXif-6UeOfN{0Jy7!sl)q47YN{7x zfgnZpAR9~8paE)A%GQhy(nr+Tqz{R#x-k=UfuPYAEo~ng_5fl^}`rM7dE-4#>(KsmbWPLYkRg3bh{>DfGuTN%E3cE*ylFdzKY^ z`nA9OPdQ|P$^;P(Qpwghs4Me9u$JA!7&Vthncsm`_CVF4e`QF@Kf%j#J?eA*8fpO& zmDJamn5B=h5jY>~JUj_LEuuV5j+>Pa2zljSkZnOV)=MlmA_8Pyk5-}Pd6DX!icIv^ z)WnvJYY=nUy{yYiMo&J1z#3N0NC@zg3!DbKsB0R1;7kLA$N!X%)zs3WVL)j7PgN~7 zH9yj2Jj?{s--dy=(mN_&YO+lk7d5-X7DK&2DI+`n<+nLieai+(RlSBh>Qey-^a;W; zqq|V#&-a5n;L|;B2>SXMBYN=p0aWBR^hf{tST@6FVK)3wERRT-CkfA!Z{tP2hY1SQ zXAU-^JO4~*G*|9Io2DJ#NoW+w7YT$59}9}aHo+M0qJ<_G;>iYF{QW%h z3W2DB1udJ4iA8){jUMT6Lna~&JqksD2Ia9Ra6wyd8l=(&u zp8?A5a7cWzC8jv}c$ukIb2olLC za=a8(>C`kmR+boWmEBXVXHA8fI=YDB!eLDm2eny1PU8K@>V=;KF2u|*$qD;+Spj)f zWO7+fQ9TeU9kg%BvYYY)InkH-Dq<+Rr|LKhQa=$d<_W{X;xwk#)YPV-%P&W@KU$AQJlW^n=85C!d&8oJiuCTbU{4SdBgx z3S9IJGMXuEa(HA4fe&g?MMA1BHTy1yxl$cNQeUy&p{lH!yqO%hLYQ%Z2Bf+@8OxML=Vk%|o6r39LE?39@GuFz@ z6!}RW0aHE*o7iZAJLC6O7CTrzZ_-DB@^7`o~gKN>KZcr74S-X zF7!E!H6)eQ;{Yq`>8}#Z>YdOX7|5vf4tdYaIoY`J-1tJW;1q}>4$&>+3BCB3e34@q zSs;j(Jy6=!l#S)113wcnhDt`vM?EQ3_zHLqymBu-*4 z5h@q@08WxuHr~7dfxfqh?@Qki2ecu(@j`fEIC;VY-7ZPlGdbcRNXRRD#_ z8WH%Yt)PF$#TtE*)MF4zb$2M2DccMr+nI$9nRLL4$&3K}X?HO?Y~(Z*i3Ep?U}cBr zCX~11ri##rw~X_z+Q5n$K!8*kSik0TNXjJ#%;lb`dBz(1PSWjFBx>pXU(HZbM@oW= zx-xEB)AS7Ord7@!koe2bC!nk{)m%9?tXRr(J9^VNndyKj#iUz8?Fpq?C(0L?qQYvk z<%z2}{{eX<2F!#I^~mwoq->C)k0YVkQx{}944WqTp*2iI$eDaWTvZ4r@iJ4USSLri z@TX!7qz4nAK}Xw;_tcq}Ch}578H(L?L3AvmPzwdvJBrkiq~N$1`3Whn0c4eb0e5ER zCs_wUFq>!PXi1%zNo-E`-xW9^_yks)$ zsHwQQ$>IVt>xmQ~SV(>+o$&^6O8tWJg_HhmP4KfHscN<+yUFHA!7Y1`ZEq(Y&P*NF)Wu;3BW9rf*euh{ zA>LV&Ey$Uv;3F5rPZqG`=ecxi7kH$%=ry9)*T5&;Ed@U5EyY(;d~yz6gD5#vxPlqI z58nohA;DOw74riF1t?k4L*cLopG(gSNNl7;eTEni%u=<`OT~b@g09$W%oT~ThpQrinb{z5 zRwVgIJVfplU;3dlQ%O1oF!(rz^iZfXizF49aIPGVqr+4_FA#}#3&LN>sWu2>(28`n zQ7X~MqA#61;`mZ>4TtDRgR#AU?6<0^&6n~??M;^$wiKy<&_#)CwWa1;F>#DeG&M;~ z9G;mut8|KNC>U)hUklbL@1SkSSq1+pRs4_4UNp?Xk3Aj#8F-pRh`lw z)A&;kO4F&`6Y_Qj3o3_(@G9OS5u_Ebq0Yl!7Y92zQWpkgW>VxNi}^d{U}5g4WH1h6 z{Qop}ZaWCVFc^L$F&d0_Jd0-&2?=O;eZRjz=m>VV-l&7EYya%fZf&*RsvBWk98lf) zKXcOvlLwckPCyL$Lc=0ErX8%{B*QwaBy_PjKeB5=L`gO=juqVqiK^?*o5%H~3$cI$ zUkw^#16aW+JjcpXpOQyQhItPhIEm|~24IvO+e;E4Wv_+2dumo0diHGtBX=sE^ySri zv15(3p!vL`0gk>JT=?SP*2NVo*qqv?Cu$4@w0ql)!>%ZbZMiRTmw$eUOL^($OSv&| zibhACZLnO-#-b)XES_k1WfcV1H56Ql?S4#i7J%S|pt&#FBpQT0PGL?jv~W!o+=;NmH`hLqS)5bpv&WWv$FZt? + + + + + + %sveltekit.head% + + +

%sveltekit.body%
+ + diff --git a/src/lib/components/theme-toggle.svelte b/src/lib/components/theme-toggle.svelte new file mode 100644 index 0000000..af82af1 --- /dev/null +++ b/src/lib/components/theme-toggle.svelte @@ -0,0 +1,25 @@ + + + + + + + Toggle theme + + + setMode('light')}>Light + setMode('dark')}>Dark + resetMode()}>System + + diff --git a/src/lib/components/ui/button/button.svelte b/src/lib/components/ui/button/button.svelte new file mode 100644 index 0000000..8f44d5c --- /dev/null +++ b/src/lib/components/ui/button/button.svelte @@ -0,0 +1,74 @@ + + + + +{#if href} + + {@render children?.()} + +{:else} + +{/if} diff --git a/src/lib/components/ui/button/index.ts b/src/lib/components/ui/button/index.ts new file mode 100644 index 0000000..fb585d7 --- /dev/null +++ b/src/lib/components/ui/button/index.ts @@ -0,0 +1,17 @@ +import Root, { + type ButtonProps, + type ButtonSize, + type ButtonVariant, + buttonVariants, +} from "./button.svelte"; + +export { + Root, + type ButtonProps as Props, + // + Root as Button, + buttonVariants, + type ButtonProps, + type ButtonSize, + type ButtonVariant, +}; diff --git a/src/lib/components/ui/calendar/calendar-cell.svelte b/src/lib/components/ui/calendar/calendar-cell.svelte new file mode 100644 index 0000000..3c065a5 --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-cell.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/calendar/calendar-day.svelte b/src/lib/components/ui/calendar/calendar-day.svelte new file mode 100644 index 0000000..d5e802a --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-day.svelte @@ -0,0 +1,30 @@ + + + diff --git a/src/lib/components/ui/calendar/calendar-grid-body.svelte b/src/lib/components/ui/calendar/calendar-grid-body.svelte new file mode 100644 index 0000000..8cd86de --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-grid-body.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/lib/components/ui/calendar/calendar-grid-head.svelte b/src/lib/components/ui/calendar/calendar-grid-head.svelte new file mode 100644 index 0000000..333edc4 --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-grid-head.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/lib/components/ui/calendar/calendar-grid-row.svelte b/src/lib/components/ui/calendar/calendar-grid-row.svelte new file mode 100644 index 0000000..9032236 --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-grid-row.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/lib/components/ui/calendar/calendar-grid.svelte b/src/lib/components/ui/calendar/calendar-grid.svelte new file mode 100644 index 0000000..1d7edb5 --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-grid.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/calendar/calendar-head-cell.svelte b/src/lib/components/ui/calendar/calendar-head-cell.svelte new file mode 100644 index 0000000..dd5e55f --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-head-cell.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/calendar/calendar-header.svelte b/src/lib/components/ui/calendar/calendar-header.svelte new file mode 100644 index 0000000..e64feae --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-header.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/calendar/calendar-heading.svelte b/src/lib/components/ui/calendar/calendar-heading.svelte new file mode 100644 index 0000000..5d57a50 --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-heading.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/lib/components/ui/calendar/calendar-months.svelte b/src/lib/components/ui/calendar/calendar-months.svelte new file mode 100644 index 0000000..4cd0ed7 --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-months.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/calendar/calendar-next-button.svelte b/src/lib/components/ui/calendar/calendar-next-button.svelte new file mode 100644 index 0000000..62f8754 --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-next-button.svelte @@ -0,0 +1,28 @@ + + +{#snippet Fallback()} + +{/snippet} + + diff --git a/src/lib/components/ui/calendar/calendar-prev-button.svelte b/src/lib/components/ui/calendar/calendar-prev-button.svelte new file mode 100644 index 0000000..425b87c --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-prev-button.svelte @@ -0,0 +1,28 @@ + + +{#snippet Fallback()} + +{/snippet} + + diff --git a/src/lib/components/ui/calendar/calendar.svelte b/src/lib/components/ui/calendar/calendar.svelte new file mode 100644 index 0000000..16bebd7 --- /dev/null +++ b/src/lib/components/ui/calendar/calendar.svelte @@ -0,0 +1,61 @@ + + + + + {#snippet children({ months, weekdays })} + + + + + + + {#each months as month} + + + + {#each weekdays as weekday} + + {weekday.slice(0, 2)} + + {/each} + + + + {#each month.weeks as weekDates} + + {#each weekDates as date} + + + + {/each} + + {/each} + + + {/each} + + {/snippet} + diff --git a/src/lib/components/ui/calendar/index.ts b/src/lib/components/ui/calendar/index.ts new file mode 100644 index 0000000..ab257ab --- /dev/null +++ b/src/lib/components/ui/calendar/index.ts @@ -0,0 +1,30 @@ +import Root from "./calendar.svelte"; +import Cell from "./calendar-cell.svelte"; +import Day from "./calendar-day.svelte"; +import Grid from "./calendar-grid.svelte"; +import Header from "./calendar-header.svelte"; +import Months from "./calendar-months.svelte"; +import GridRow from "./calendar-grid-row.svelte"; +import Heading from "./calendar-heading.svelte"; +import GridBody from "./calendar-grid-body.svelte"; +import GridHead from "./calendar-grid-head.svelte"; +import HeadCell from "./calendar-head-cell.svelte"; +import NextButton from "./calendar-next-button.svelte"; +import PrevButton from "./calendar-prev-button.svelte"; + +export { + Day, + Cell, + Grid, + Header, + Months, + GridRow, + Heading, + GridBody, + GridHead, + HeadCell, + NextButton, + PrevButton, + // + Root as Calendar, +}; diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte new file mode 100644 index 0000000..f5f9db4 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte @@ -0,0 +1,35 @@ + + + + {#snippet children({ checked })} + + {#if checked === "indeterminate"} + + {:else} + + {/if} + + {@render childrenProp?.({ checked })} + {/snippet} + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte new file mode 100644 index 0000000..255b1a6 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte @@ -0,0 +1,21 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte new file mode 100644 index 0000000..84d5cca --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte new file mode 100644 index 0000000..70a5236 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte @@ -0,0 +1,23 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte new file mode 100644 index 0000000..9837d5a --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte @@ -0,0 +1,23 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte new file mode 100644 index 0000000..0f219da --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte @@ -0,0 +1,30 @@ + + + + {#snippet children({ checked })} + + {#if checked} + + {/if} + + {@render childrenProp?.({ checked })} + {/snippet} + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte new file mode 100644 index 0000000..32fac4b --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte new file mode 100644 index 0000000..053e2a2 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte @@ -0,0 +1,20 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte new file mode 100644 index 0000000..0bb6eea --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte new file mode 100644 index 0000000..c2dcd32 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte @@ -0,0 +1,28 @@ + + + + {@render children?.()} + + diff --git a/src/lib/components/ui/dropdown-menu/index.ts b/src/lib/components/ui/dropdown-menu/index.ts new file mode 100644 index 0000000..40c4502 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/index.ts @@ -0,0 +1,50 @@ +import { DropdownMenu as DropdownMenuPrimitive } from "bits-ui"; +import CheckboxItem from "./dropdown-menu-checkbox-item.svelte"; +import Content from "./dropdown-menu-content.svelte"; +import GroupHeading from "./dropdown-menu-group-heading.svelte"; +import Item from "./dropdown-menu-item.svelte"; +import Label from "./dropdown-menu-label.svelte"; +import RadioItem from "./dropdown-menu-radio-item.svelte"; +import Separator from "./dropdown-menu-separator.svelte"; +import Shortcut from "./dropdown-menu-shortcut.svelte"; +import SubContent from "./dropdown-menu-sub-content.svelte"; +import SubTrigger from "./dropdown-menu-sub-trigger.svelte"; + +const Sub = DropdownMenuPrimitive.Sub; +const Root = DropdownMenuPrimitive.Root; +const Trigger = DropdownMenuPrimitive.Trigger; +const Group = DropdownMenuPrimitive.Group; +const RadioGroup = DropdownMenuPrimitive.RadioGroup; + +export { + CheckboxItem, + Content, + Root as DropdownMenu, + CheckboxItem as DropdownMenuCheckboxItem, + Content as DropdownMenuContent, + Group as DropdownMenuGroup, + GroupHeading as DropdownMenuGroupHeading, + Item as DropdownMenuItem, + Label as DropdownMenuLabel, + RadioGroup as DropdownMenuRadioGroup, + RadioItem as DropdownMenuRadioItem, + Separator as DropdownMenuSeparator, + Shortcut as DropdownMenuShortcut, + Sub as DropdownMenuSub, + SubContent as DropdownMenuSubContent, + SubTrigger as DropdownMenuSubTrigger, + Trigger as DropdownMenuTrigger, + Group, + GroupHeading, + Item, + Label, + RadioGroup, + RadioItem, + Root, + Separator, + Shortcut, + Sub, + SubContent, + SubTrigger, + Trigger, +}; diff --git a/src/lib/components/ui/form/form-button.svelte b/src/lib/components/ui/form/form-button.svelte new file mode 100644 index 0000000..cc0c590 --- /dev/null +++ b/src/lib/components/ui/form/form-button.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/form/form-description.svelte b/src/lib/components/ui/form/form-description.svelte new file mode 100644 index 0000000..6c70187 --- /dev/null +++ b/src/lib/components/ui/form/form-description.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/lib/components/ui/form/form-element-field.svelte b/src/lib/components/ui/form/form-element-field.svelte new file mode 100644 index 0000000..278395c --- /dev/null +++ b/src/lib/components/ui/form/form-element-field.svelte @@ -0,0 +1,30 @@ + + + + + + {#snippet children({ constraints, errors, tainted, value })} +
+ {@render childrenProp?.({ constraints, errors, tainted, value: value as T[U] })} +
+ {/snippet} +
diff --git a/src/lib/components/ui/form/form-field-errors.svelte b/src/lib/components/ui/form/form-field-errors.svelte new file mode 100644 index 0000000..c866b83 --- /dev/null +++ b/src/lib/components/ui/form/form-field-errors.svelte @@ -0,0 +1,31 @@ + + + + {#snippet children({ errors, errorProps })} + {#if childrenProp} + {@render childrenProp({ errors, errorProps })} + {:else} + {#each errors as error} +
{error}
+ {/each} + {/if} + {/snippet} +
diff --git a/src/lib/components/ui/form/form-field.svelte b/src/lib/components/ui/form/form-field.svelte new file mode 100644 index 0000000..6f7a766 --- /dev/null +++ b/src/lib/components/ui/form/form-field.svelte @@ -0,0 +1,30 @@ + + + + + + {#snippet children({ constraints, errors, tainted, value })} +
+ {@render childrenProp?.({ constraints, errors, tainted, value: value as T[U] })} +
+ {/snippet} +
diff --git a/src/lib/components/ui/form/form-fieldset.svelte b/src/lib/components/ui/form/form-fieldset.svelte new file mode 100644 index 0000000..bc40a2a --- /dev/null +++ b/src/lib/components/ui/form/form-fieldset.svelte @@ -0,0 +1,21 @@ + + + + + diff --git a/src/lib/components/ui/form/form-label.svelte b/src/lib/components/ui/form/form-label.svelte new file mode 100644 index 0000000..dd252f4 --- /dev/null +++ b/src/lib/components/ui/form/form-label.svelte @@ -0,0 +1,21 @@ + + + + {#snippet child({ props })} + + {/snippet} + diff --git a/src/lib/components/ui/form/form-legend.svelte b/src/lib/components/ui/form/form-legend.svelte new file mode 100644 index 0000000..b493821 --- /dev/null +++ b/src/lib/components/ui/form/form-legend.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/lib/components/ui/form/index.ts b/src/lib/components/ui/form/index.ts new file mode 100644 index 0000000..0713927 --- /dev/null +++ b/src/lib/components/ui/form/index.ts @@ -0,0 +1,33 @@ +import * as FormPrimitive from "formsnap"; +import Description from "./form-description.svelte"; +import Label from "./form-label.svelte"; +import FieldErrors from "./form-field-errors.svelte"; +import Field from "./form-field.svelte"; +import Fieldset from "./form-fieldset.svelte"; +import Legend from "./form-legend.svelte"; +import ElementField from "./form-element-field.svelte"; +import Button from "./form-button.svelte"; + +const Control = FormPrimitive.Control; + +export { + Field, + Control, + Label, + Button, + FieldErrors, + Description, + Fieldset, + Legend, + ElementField, + // + Field as FormField, + Control as FormControl, + Description as FormDescription, + Label as FormLabel, + FieldErrors as FormFieldErrors, + Fieldset as FormFieldset, + Legend as FormLegend, + ElementField as FormElementField, + Button as FormButton, +}; diff --git a/src/lib/components/ui/input/index.ts b/src/lib/components/ui/input/index.ts new file mode 100644 index 0000000..f47b6d3 --- /dev/null +++ b/src/lib/components/ui/input/index.ts @@ -0,0 +1,7 @@ +import Root from "./input.svelte"; + +export { + Root, + // + Root as Input, +}; diff --git a/src/lib/components/ui/input/input.svelte b/src/lib/components/ui/input/input.svelte new file mode 100644 index 0000000..598829f --- /dev/null +++ b/src/lib/components/ui/input/input.svelte @@ -0,0 +1,22 @@ + + + diff --git a/src/lib/components/ui/label/index.ts b/src/lib/components/ui/label/index.ts new file mode 100644 index 0000000..8bfca0b --- /dev/null +++ b/src/lib/components/ui/label/index.ts @@ -0,0 +1,7 @@ +import Root from "./label.svelte"; + +export { + Root, + // + Root as Label, +}; diff --git a/src/lib/components/ui/label/label.svelte b/src/lib/components/ui/label/label.svelte new file mode 100644 index 0000000..247d23c --- /dev/null +++ b/src/lib/components/ui/label/label.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/popover/index.ts b/src/lib/components/ui/popover/index.ts new file mode 100644 index 0000000..63aecf9 --- /dev/null +++ b/src/lib/components/ui/popover/index.ts @@ -0,0 +1,17 @@ +import { Popover as PopoverPrimitive } from "bits-ui"; +import Content from "./popover-content.svelte"; +const Root = PopoverPrimitive.Root; +const Trigger = PopoverPrimitive.Trigger; +const Close = PopoverPrimitive.Close; + +export { + Root, + Content, + Trigger, + Close, + // + Root as Popover, + Content as PopoverContent, + Trigger as PopoverTrigger, + Close as PopoverClose, +}; diff --git a/src/lib/components/ui/popover/popover-content.svelte b/src/lib/components/ui/popover/popover-content.svelte new file mode 100644 index 0000000..a897b3b --- /dev/null +++ b/src/lib/components/ui/popover/popover-content.svelte @@ -0,0 +1,25 @@ + + + + + diff --git a/src/lib/components/ui/select/index.ts b/src/lib/components/ui/select/index.ts new file mode 100644 index 0000000..f31b8ae --- /dev/null +++ b/src/lib/components/ui/select/index.ts @@ -0,0 +1,34 @@ +import { Select as SelectPrimitive } from "bits-ui"; + +import GroupHeading from "./select-group-heading.svelte"; +import Item from "./select-item.svelte"; +import Content from "./select-content.svelte"; +import Trigger from "./select-trigger.svelte"; +import Separator from "./select-separator.svelte"; +import ScrollDownButton from "./select-scroll-down-button.svelte"; +import ScrollUpButton from "./select-scroll-up-button.svelte"; + +const Root = SelectPrimitive.Root; +const Group = SelectPrimitive.Group; + +export { + Root, + Group, + GroupHeading, + Item, + Content, + Trigger, + Separator, + ScrollDownButton, + ScrollUpButton, + // + Root as Select, + Group as SelectGroup, + GroupHeading as SelectGroupHeading, + Item as SelectItem, + Content as SelectContent, + Trigger as SelectTrigger, + Separator as SelectSeparator, + ScrollDownButton as SelectScrollDownButton, + ScrollUpButton as SelectScrollUpButton, +}; diff --git a/src/lib/components/ui/select/select-content.svelte b/src/lib/components/ui/select/select-content.svelte new file mode 100644 index 0000000..1ccce22 --- /dev/null +++ b/src/lib/components/ui/select/select-content.svelte @@ -0,0 +1,36 @@ + + + + + + + {@render children?.()} + + + + diff --git a/src/lib/components/ui/select/select-group-heading.svelte b/src/lib/components/ui/select/select-group-heading.svelte new file mode 100644 index 0000000..7984bef --- /dev/null +++ b/src/lib/components/ui/select/select-group-heading.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/select/select-item.svelte b/src/lib/components/ui/select/select-item.svelte new file mode 100644 index 0000000..c3a77db --- /dev/null +++ b/src/lib/components/ui/select/select-item.svelte @@ -0,0 +1,37 @@ + + + + {#snippet children({ selected, highlighted })} + + {#if selected} + + {/if} + + {#if childrenProp} + {@render childrenProp({ selected, highlighted })} + {:else} + {label || value} + {/if} + {/snippet} + diff --git a/src/lib/components/ui/select/select-scroll-down-button.svelte b/src/lib/components/ui/select/select-scroll-down-button.svelte new file mode 100644 index 0000000..82d63a6 --- /dev/null +++ b/src/lib/components/ui/select/select-scroll-down-button.svelte @@ -0,0 +1,19 @@ + + + + + diff --git a/src/lib/components/ui/select/select-scroll-up-button.svelte b/src/lib/components/ui/select/select-scroll-up-button.svelte new file mode 100644 index 0000000..b8939ba --- /dev/null +++ b/src/lib/components/ui/select/select-scroll-up-button.svelte @@ -0,0 +1,19 @@ + + + + + diff --git a/src/lib/components/ui/select/select-separator.svelte b/src/lib/components/ui/select/select-separator.svelte new file mode 100644 index 0000000..38a3ab0 --- /dev/null +++ b/src/lib/components/ui/select/select-separator.svelte @@ -0,0 +1,13 @@ + + + diff --git a/src/lib/components/ui/select/select-trigger.svelte b/src/lib/components/ui/select/select-trigger.svelte new file mode 100644 index 0000000..f917f13 --- /dev/null +++ b/src/lib/components/ui/select/select-trigger.svelte @@ -0,0 +1,24 @@ + + +span]:line-clamp-1", + className + )} + {...restProps} +> + {@render children?.()} + + diff --git a/src/lib/components/ui/separator/index.ts b/src/lib/components/ui/separator/index.ts new file mode 100644 index 0000000..82442d2 --- /dev/null +++ b/src/lib/components/ui/separator/index.ts @@ -0,0 +1,7 @@ +import Root from "./separator.svelte"; + +export { + Root, + // + Root as Separator, +}; diff --git a/src/lib/components/ui/separator/separator.svelte b/src/lib/components/ui/separator/separator.svelte new file mode 100644 index 0000000..839494d --- /dev/null +++ b/src/lib/components/ui/separator/separator.svelte @@ -0,0 +1,22 @@ + + + diff --git a/src/lib/index.ts b/src/lib/index.ts new file mode 100644 index 0000000..856f2b6 --- /dev/null +++ b/src/lib/index.ts @@ -0,0 +1 @@ +// place files you want to import through the `$lib` alias in this folder. diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..ac680b3 --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 0000000..04e8f3b --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,8 @@ + + + +{@render children()} diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 0000000..5651f71 --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,149 @@ + + +
+ + + {#snippet children({ props })} + Symbol + + {/snippet} + + Symbol + + + + + {#snippet children({ props })} + Limit + + {/snippet} + + Limit + + + + + {#snippet children({ props })} + Category + + + {$formData.category ?? 'Select a category'} + + + {#each categories as category} + + {/each} + + + {/snippet} + + Category + + + + + {#snippet children({ props })} + Interval + + + {$formData.interval ?? 'Select a interval'} + + + {#each intervals as interval} + + {/each} + + + {/snippet} + + Category + + + + + {#snippet children({ props })} + Start + + {/snippet} + + Start + + + + + {#snippet children({ props })} + End + + {/snippet} + + End + + + Submit +
diff --git a/src/routes/+page.ts b/src/routes/+page.ts new file mode 100644 index 0000000..1b08287 --- /dev/null +++ b/src/routes/+page.ts @@ -0,0 +1,18 @@ +import { superValidate } from 'sveltekit-superforms' +import { zod } from 'sveltekit-superforms/adapters' +import type { PageLoad } from './$types' +import { formSchema } from './schema' + +export const load = (async () => { + const form = await superValidate( + { + symbol: 'BTCUSDT', + interval: '1', + category: 'linear', + limit: 200, + }, + zod(formSchema), + { errors: false }, + ) + return { form } +}) satisfies PageLoad diff --git a/src/routes/schema.ts b/src/routes/schema.ts new file mode 100644 index 0000000..08ab873 --- /dev/null +++ b/src/routes/schema.ts @@ -0,0 +1,48 @@ +import type { DateValue } from '@internationalized/date' +import { z } from 'zod' + +export type Category = 'spot' | 'linear' | 'inverse' + +export const categories: Category[] = ['linear', 'spot', 'inverse'] + +export type Interval = + | '1' + | '3' + | '5' + | '15' + | '30' + | '60' + | '120' + | '240' + | '360' + | '720' + | 'D' + | 'M' + | 'W' + +export const intervals: Interval[] = [ + '1', + '3', + '5', + '15', + '30', + '60', + '120', + '240', + '360', + '720', + 'D', + 'M', + 'W', +] + +export const formSchema = z.object({ + category: z.custom(), + symbol: z.string(), + interval: z.custom(), + start: z.number().min(0).optional(), + end: z.number().min(0).optional(), + limit: z.number().int().min(1).max(1000).optional(), +}) + +export type FormSchema = typeof formSchema diff --git a/static/favicon.png b/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..825b9e65af7c104cfb07089bb28659393b4f2097 GIT binary patch literal 1571 zcmV+;2Hg3HP)Px)-AP12RCwC$UE6KzI1p6{F2N z1VK2vi|pOpn{~#djwYcWXTI_im_u^TJgMZ4JMOsSj!0ma>B?-(Hr@X&W@|R-$}W@Z zgj#$x=!~7LGqHW?IO8+*oE1MyDp!G=L0#^lUx?;!fXv@l^6SvTnf^ac{5OurzC#ZMYc20lI%HhX816AYVs1T3heS1*WaWH z%;x>)-J}YB5#CLzU@GBR6sXYrD>Vw(Fmt#|JP;+}<#6b63Ike{Fuo!?M{yEffez;| zp!PfsuaC)>h>-AdbnwN13g*1LowNjT5?+lFVd#9$!8Z9HA|$*6dQ8EHLu}U|obW6f z2%uGv?vr=KNq7YYa2Roj;|zooo<)lf=&2yxM@e`kM$CmCR#x>gI>I|*Ubr({5Y^rb zghxQU22N}F51}^yfDSt786oMTc!W&V;d?76)9KXX1 z+6Okem(d}YXmmOiZq$!IPk5t8nnS{%?+vDFz3BevmFNgpIod~R{>@#@5x9zJKEHLHv!gHeK~n)Ld!M8DB|Kfe%~123&Hz1Z(86nU7*G5chmyDe ziV7$pB7pJ=96hpxHv9rCR29%bLOXlKU<_13_M8x)6;P8E1Kz6G<&P?$P^%c!M5`2` zfY2zg;VK5~^>TJGQzc+33-n~gKt{{of8GzUkWmU110IgI0DLxRIM>0US|TsM=L|@F z0Bun8U!cRB7-2apz=y-7*UxOxz@Z0)@QM)9wSGki1AZ38ceG7Q72z5`i;i=J`ILzL z@iUO?SBBG-0cQuo+an4TsLy-g-x;8P4UVwk|D8{W@U1Zi z!M)+jqy@nQ$p?5tsHp-6J304Q={v-B>66$P0IDx&YT(`IcZ~bZfmn11#rXd7<5s}y zBi9eim&zQc0Dk|2>$bs0PnLmDfMP5lcXRY&cvJ=zKxI^f0%-d$tD!`LBf9^jMSYUA zI8U?CWdY@}cRq6{5~y+)#h1!*-HcGW@+gZ4B};0OnC~`xQOyH19z*TA!!BJ%9s0V3F?CAJ{hTd#*tf+ur-W9MOURF-@B77_-OshsY}6 zOXRY=5%C^*26z?l)1=$bz30!so5tfABdSYzO+H=CpV~aaUefmjvfZ3Ttu9W&W3Iu6 zROlh0MFA5h;my}8lB0tAV-Rvc2Zs_CCSJnx@d`**$idgy-iMob4dJWWw|21b4NB=LfsYp0Aeh{Ov)yztQi;eL4y5 zMi>8^SzKqk8~k?UiQK^^-5d8c%bV?$F8%X~czyiaKCI2=UH)", + input: "hsl(var(--input) / )", + ring: "hsl(var(--ring) / )", + background: "hsl(var(--background) / )", + foreground: "hsl(var(--foreground) / )", + primary: { + DEFAULT: "hsl(var(--primary) / )", + foreground: "hsl(var(--primary-foreground) / )" + }, + secondary: { + DEFAULT: "hsl(var(--secondary) / )", + foreground: "hsl(var(--secondary-foreground) / )" + }, + destructive: { + DEFAULT: "hsl(var(--destructive) / )", + foreground: "hsl(var(--destructive-foreground) / )" + }, + muted: { + DEFAULT: "hsl(var(--muted) / )", + foreground: "hsl(var(--muted-foreground) / )" + }, + accent: { + DEFAULT: "hsl(var(--accent) / )", + foreground: "hsl(var(--accent-foreground) / )" + }, + popover: { + DEFAULT: "hsl(var(--popover) / )", + foreground: "hsl(var(--popover-foreground) / )" + }, + card: { + DEFAULT: "hsl(var(--card) / )", + foreground: "hsl(var(--card-foreground) / )" + }, + sidebar: { + DEFAULT: "hsl(var(--sidebar-background))", + foreground: "hsl(var(--sidebar-foreground))", + primary: "hsl(var(--sidebar-primary))", + "primary-foreground": "hsl(var(--sidebar-primary-foreground))", + accent: "hsl(var(--sidebar-accent))", + "accent-foreground": "hsl(var(--sidebar-accent-foreground))", + border: "hsl(var(--sidebar-border))", + ring: "hsl(var(--sidebar-ring))", + }, + }, + borderRadius: { + xl: "calc(var(--radius) + 4px)", + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)" + }, + fontFamily: { + sans: [...fontFamily.sans] + }, + keyframes: { + "accordion-down": { + from: { height: "0" }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: "0" }, + }, + "caret-blink": { + "0%,70%,100%": { opacity: "1" }, + "20%,50%": { opacity: "0" }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + "caret-blink": "caret-blink 1.25s ease-out infinite", + }, + }, + }, + plugins: [tailwindcssAnimate], +}; + +export default config; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..0b2d886 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes + // from the referenced tsconfig.json - TypeScript does not merge them in +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..bbf8c7d --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,6 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit()] +});