From a3de4dcb43d826090f0758eee934acac00d4640f Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Sun, 10 Nov 2024 04:47:40 +0100 Subject: [PATCH] add projects view and template --- .gitignore | 1 + assets/static/css/main.css | 2 +- assets/static/js/project-item.js | 31 ++++++ assets/views/website/base.html | 2 +- assets/views/website/components/footer.html | 2 +- assets/views/website/index.html | 72 +++++++------ .../views/website/macros/image_carousel.html | 16 +++ assets/views/website/macros/project_item.html | 98 ++++++++++++++++++ assets/views/website/projects.html | 4 + bun.lockb | Bin 0 -> 45019 bytes package.json | 14 +++ src/lib.rs | 3 +- src/models/jobs.rs | 10 +- src/models/projects.rs | 45 +++++--- src/services/jobs.rs | 6 +- src/services/mod.rs | 1 + src/services/projects.rs | 69 ++++++++++++ src/shared/get_technologies_from_string.rs | 7 ++ src/shared/mod.rs | 1 + src/views/website.rs | 4 +- tsconfig.json | 27 +++++ 21 files changed, 350 insertions(+), 65 deletions(-) create mode 100644 assets/static/js/project-item.js create mode 100644 assets/views/website/macros/image_carousel.html create mode 100644 assets/views/website/macros/project_item.html create mode 100644 bun.lockb create mode 100644 package.json create mode 100644 src/services/projects.rs create mode 100644 src/shared/get_technologies_from_string.rs create mode 100644 src/shared/mod.rs create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore index 7536997..1636a2f 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ # will have compiled files and executables debug/ target/ +node_modules/ # include cargo lock !Cargo.lock diff --git a/assets/static/css/main.css b/assets/static/css/main.css index 4f1bacb..32c5a2f 100644 --- a/assets/static/css/main.css +++ b/assets/static/css/main.css @@ -1 +1 @@ -/*! tailwindcss v3.4.10 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-bottom:3em;margin-top:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){border-inline-start-color:var(--tw-prose-quote-borders);border-inline-start-width:.25rem;color:var(--tw-prose-quotes);font-style:italic;font-weight:500;margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1em;quotes:"\201C""\201D""\2018""\2019"}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:2.25em;font-weight:800;line-height:1.1111111;margin-bottom:.8888889em;margin-top:0}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.5em;font-weight:700;line-height:1.3333333;margin-bottom:1em;margin-top:2em}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.25em;font-weight:600;line-height:1.6;margin-bottom:.6em;margin-top:1.6em}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;line-height:1.5;margin-bottom:.5em;margin-top:1.5em}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-bottom:2em;margin-top:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows)/10%),0 3px 0 rgb(var(--tw-prose-kbd-shadows)/10%);color:var(--tw-prose-kbd);font-family:inherit;font-size:.875em;font-weight:500;padding-inline-end:.375em;padding-bottom:.1875em;padding-top:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:var(--tw-prose-pre-bg);border-radius:.375rem;color:var(--tw-prose-pre-code);font-size:.875em;font-weight:400;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;overflow-x:auto;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-top:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:0}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em;line-height:1.7142857;margin-bottom:2em;margin-top:2em;table-layout:auto;width:100%}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-th-borders);border-bottom-width:1px}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em;vertical-align:bottom}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-td-borders);border-bottom-width:1px}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-color:var(--tw-prose-th-borders);border-top-width:1px}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:17 24 39;--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:255 255 255;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-top:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.pointer-events-none{pointer-events:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.bottom-0{bottom:0}.z-20{z-index:20}.m-4{margin:1rem}.m-8{margin:2rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mt-16{margin-top:4rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.hidden{display:none}.h-full{height:100%}.h-1{height:.25rem}.max-h-full{max-height:100%}.min-h-screen{min-height:100vh}.w-1\/2{width:50%}.w-full{width:100%}.w-\[60ch\]{width:60ch}.min-w-\[4rem\]{min-width:4rem}.min-w-full{min-width:100%}.max-w-\[12rem\]{max-width:12rem}.max-w-\[60ch\]{max-width:60ch}.flex-1{flex:1 1 0%}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.text-balance{text-wrap:balance}.text-pretty{text-wrap:pretty}.rounded-2xl{border-radius:1rem}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded{border-radius:.25rem}.border{border-width:1px}.border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}.bg-opacity-40{--tw-bg-opacity:0.4}.bg-clip-padding{background-clip:padding-box}.object-cover{-o-object-fit:cover;object-fit:cover}.p-2{padding:.5rem}.p-4{padding:1rem}.p-9{padding:2.25rem}.p-8{padding:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-justify{text-align:justify}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-5xl{font-size:3rem;line-height:1}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{line-height:1.75rem}.text-\[1\.25rem\],.text-xl{font-size:1.25rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-light{font-weight:300}.font-semibold{font-weight:600}.leading-\[1\.8\]{line-height:1.8}.leading-snug{line-height:1.375}.leading-relaxed{line-height:1.625}.tracking-tight{letter-spacing:-.025em}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.backdrop-blur-sm,.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}@media (min-width:768px){.md\:prose-lg{font-size:1.125rem;line-height:1.7777778}.md\:prose-lg :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}.md\:prose-lg :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2222222em;line-height:1.4545455;margin-bottom:1.0909091em;margin-top:1.0909091em}.md\:prose-lg :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.6666667em;margin-top:1.6666667em;padding-inline-start:1em}.md\:prose-lg :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.6666667em;line-height:1;margin-bottom:.8333333em;margin-top:0}.md\:prose-lg :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.6666667em;line-height:1.3333333;margin-bottom:1.0666667em;margin-top:1.8666667em}.md\:prose-lg :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.3333333em;line-height:1.5;margin-bottom:.6666667em;margin-top:1.6666667em}.md\:prose-lg :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.5555556;margin-bottom:.4444444em;margin-top:1.7777778em}.md\:prose-lg :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.md\:prose-lg :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.md\:prose-lg :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.md\:prose-lg :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.md\:prose-lg :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.8888889em;padding-inline-end:.4444444em;padding-bottom:.2222222em;padding-top:.2222222em;padding-inline-start:.4444444em}.md\:prose-lg :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.md\:prose-lg :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8666667em}.md\:prose-lg :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em}.md\:prose-lg :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.375rem;font-size:.8888889em;line-height:1.75;margin-bottom:2em;margin-top:2em;padding-inline-end:1.5em;padding-bottom:1em;padding-top:1em;padding-inline-start:1.5em}.md\:prose-lg :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.5555556em}.md\:prose-lg :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.5555556em}.md\:prose-lg :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.6666667em;margin-top:.6666667em}.md\:prose-lg :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.md\:prose-lg :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.md\:prose-lg :where(.md\:prose-lg>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}.md\:prose-lg :where(.md\:prose-lg>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.md\:prose-lg :where(.md\:prose-lg>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.md\:prose-lg :where(.md\:prose-lg>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.md\:prose-lg :where(.md\:prose-lg>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.md\:prose-lg :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}.md\:prose-lg :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}.md\:prose-lg :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.md\:prose-lg :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6666667em;padding-inline-start:1.5555556em}.md\:prose-lg :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:3.1111111em;margin-top:3.1111111em}.md\:prose-lg :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.md\:prose-lg :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.md\:prose-lg :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.md\:prose-lg :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.md\:prose-lg :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5}.md\:prose-lg :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-inline-start:.75em}.md\:prose-lg :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.md\:prose-lg :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.md\:prose-lg :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-top:.75em;padding-inline-start:.75em}.md\:prose-lg :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.md\:prose-lg :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.md\:prose-lg :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.md\:prose-lg :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.md\:prose-lg :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5;margin-top:1em}.md\:prose-lg :where(.md\:prose-lg>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.md\:prose-lg :where(.md\:prose-lg>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}}@media (min-width:1024px){.lg\:prose-xl{font-size:1.25rem;line-height:1.8}.lg\:prose-xl :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em}.lg\:prose-xl :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2em;line-height:1.5;margin-bottom:1em;margin-top:1em}.lg\:prose-xl :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1.0666667em}.lg\:prose-xl :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.8em;line-height:1;margin-bottom:.8571429em;margin-top:0}.lg\:prose-xl :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.8em;line-height:1.1111111;margin-bottom:.8888889em;margin-top:1.5555556em}.lg\:prose-xl :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.5em;line-height:1.3333333;margin-bottom:.6666667em;margin-top:1.6em}.lg\:prose-xl :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.6;margin-bottom:.6em;margin-top:1.8em}.lg\:prose-xl :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.lg\:prose-xl :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.lg\:prose-xl :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.lg\:prose-xl :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.lg\:prose-xl :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.9em;padding-inline-end:.4em;padding-bottom:.25em;padding-top:.25em;padding-inline-start:.4em}.lg\:prose-xl :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.lg\:prose-xl :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8611111em}.lg\:prose-xl :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.lg\:prose-xl :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.5rem;font-size:.9em;line-height:1.7777778;margin-bottom:2em;margin-top:2em;padding-inline-end:1.3333333em;padding-bottom:1.1111111em;padding-top:1.1111111em;padding-inline-start:1.3333333em}.lg\:prose-xl :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em;padding-inline-start:1.6em}.lg\:prose-xl :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em;padding-inline-start:1.6em}.lg\:prose-xl :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.6em;margin-top:.6em}.lg\:prose-xl :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4em}.lg\:prose-xl :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4em}.lg\:prose-xl :where(.lg\:prose-xl>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8em;margin-top:.8em}.lg\:prose-xl :where(.lg\:prose-xl>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em}.lg\:prose-xl :where(.lg\:prose-xl>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em}.lg\:prose-xl :where(.lg\:prose-xl>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em}.lg\:prose-xl :where(.lg\:prose-xl>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em}.lg\:prose-xl :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8em;margin-top:.8em}.lg\:prose-xl :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em}.lg\:prose-xl :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em}.lg\:prose-xl :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6em;padding-inline-start:1.6em}.lg\:prose-xl :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2.8em;margin-top:2.8em}.lg\:prose-xl :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em;line-height:1.5555556}.lg\:prose-xl :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.6666667em;padding-bottom:.8888889em;padding-inline-start:.6666667em}.lg\:prose-xl :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.lg\:prose-xl :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.lg\:prose-xl :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.6666667em;padding-bottom:.8888889em;padding-top:.8888889em;padding-inline-start:.6666667em}.lg\:prose-xl :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.lg\:prose-xl :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.lg\:prose-xl :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.lg\:prose-xl :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.lg\:prose-xl :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em;line-height:1.5555556;margin-top:1em}.lg\:prose-xl :where(.lg\:prose-xl>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(.lg\:prose-xl>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}}@media (min-width:768px){.md\:m-0{margin:0}.md\:mb-0{margin-bottom:0}.md\:mt-0{margin-top:0}.md\:flex{display:flex}.md\:w-1\/2{width:50%}.md\:w-fit{width:-moz-fit-content;width:fit-content}.md\:flex-row{flex-direction:row}.md\:items-start{align-items:flex-start}.md\:justify-start{justify-content:flex-start}.md\:p-16{padding:4rem}.md\:text-left{text-align:left}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}.md\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1024px){.lg\:p-20{padding:5rem}.lg\:text-2xl{font-size:1.5rem;line-height:2rem}.lg\:text-6xl{font-size:3.75rem;line-height:1}} \ No newline at end of file +/*! tailwindcss v3.4.10 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-bottom:3em;margin-top:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){border-inline-start-color:var(--tw-prose-quote-borders);border-inline-start-width:.25rem;color:var(--tw-prose-quotes);font-style:italic;font-weight:500;margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1em;quotes:"\201C""\201D""\2018""\2019"}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:2.25em;font-weight:800;line-height:1.1111111;margin-bottom:.8888889em;margin-top:0}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.5em;font-weight:700;line-height:1.3333333;margin-bottom:1em;margin-top:2em}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.25em;font-weight:600;line-height:1.6;margin-bottom:.6em;margin-top:1.6em}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;line-height:1.5;margin-bottom:.5em;margin-top:1.5em}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-bottom:2em;margin-top:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows)/10%),0 3px 0 rgb(var(--tw-prose-kbd-shadows)/10%);color:var(--tw-prose-kbd);font-family:inherit;font-size:.875em;font-weight:500;padding-inline-end:.375em;padding-bottom:.1875em;padding-top:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:var(--tw-prose-pre-bg);border-radius:.375rem;color:var(--tw-prose-pre-code);font-size:.875em;font-weight:400;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;overflow-x:auto;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-top:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:0}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em;line-height:1.7142857;margin-bottom:2em;margin-top:2em;table-layout:auto;width:100%}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-th-borders);border-bottom-width:1px}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em;vertical-align:bottom}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-td-borders);border-bottom-width:1px}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-color:var(--tw-prose-th-borders);border-top-width:1px}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:17 24 39;--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:255 255 255;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-top:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.pointer-events-none{pointer-events:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.bottom-0{bottom:0}.z-20{z-index:20}.z-50{z-index:50}.m-4{margin:1rem}.m-8{margin:2rem}.m-2{margin:.5rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mt-16{margin-top:4rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.hidden{display:none}.h-full{height:100%}.h-\[40rem\]{height:40rem}.max-h-full{max-height:100%}.min-h-screen{min-height:100vh}.w-1\/2{width:50%}.w-full{width:100%}.min-w-\[4rem\]{min-width:4rem}.min-w-full{min-width:100%}.max-w-\[12rem\]{max-width:12rem}.max-w-\[60ch\]{max-width:60ch}.max-w-\[10rem\]{max-width:10rem}.max-w-\[4rem\]{max-width:4rem}.max-w-\[9rem\]{max-width:9rem}.max-w-\[8rem\]{max-width:8rem}.max-w-\[15rem\]{max-width:15rem}.max-w-\[16rem\]{max-width:16rem}.max-w-\[20rem\]{max-width:20rem}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-normal{justify-content:normal}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.overflow-hidden{overflow:hidden}.scroll-smooth{scroll-behavior:smooth}.whitespace-pre-wrap{white-space:pre-wrap}.text-pretty{text-wrap:pretty}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.border-gray-500{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.border-yellow-400{--tw-border-opacity:1;border-color:rgb(250 204 21/var(--tw-border-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-slate-300{--tw-gradient-from:#cbd5e1 var(--tw-gradient-from-position);--tw-gradient-to:rgba(203,213,225,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-violet-200{--tw-gradient-from:#ddd6fe var(--tw-gradient-from-position);--tw-gradient-to:rgba(221,214,254,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-violet-600{--tw-gradient-from:#7c3aed var(--tw-gradient-from-position);--tw-gradient-to:rgba(124,58,237,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-slate-500{--tw-gradient-to:#64748b var(--tw-gradient-to-position)}.to-pink-200{--tw-gradient-to:#fbcfe8 var(--tw-gradient-to-position)}.to-indigo-600{--tw-gradient-to:#4f46e5 var(--tw-gradient-to-position)}.object-cover{-o-object-fit:cover;object-fit:cover}.p-2{padding:.5rem}.p-4{padding:1rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-justify{text-align:justify}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-5xl{font-size:3rem;line-height:1}.text-\[1\.25rem\]{font-size:1.25rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-light{font-weight:300}.font-semibold{font-weight:600}.leading-\[1\.8\]{line-height:1.8}.leading-relaxed{line-height:1.625}.tracking-tight{letter-spacing:-.025em}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-500{transition-duration:.5s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}@media (min-width:768px){.md\:prose-lg{font-size:1.125rem;line-height:1.7777778}.md\:prose-lg :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}.md\:prose-lg :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2222222em;line-height:1.4545455;margin-bottom:1.0909091em;margin-top:1.0909091em}.md\:prose-lg :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.6666667em;margin-top:1.6666667em;padding-inline-start:1em}.md\:prose-lg :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.6666667em;line-height:1;margin-bottom:.8333333em;margin-top:0}.md\:prose-lg :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.6666667em;line-height:1.3333333;margin-bottom:1.0666667em;margin-top:1.8666667em}.md\:prose-lg :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.3333333em;line-height:1.5;margin-bottom:.6666667em;margin-top:1.6666667em}.md\:prose-lg :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.5555556;margin-bottom:.4444444em;margin-top:1.7777778em}.md\:prose-lg :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.md\:prose-lg :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.md\:prose-lg :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.md\:prose-lg :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.md\:prose-lg :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.8888889em;padding-inline-end:.4444444em;padding-bottom:.2222222em;padding-top:.2222222em;padding-inline-start:.4444444em}.md\:prose-lg :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.md\:prose-lg :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8666667em}.md\:prose-lg :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em}.md\:prose-lg :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.375rem;font-size:.8888889em;line-height:1.75;margin-bottom:2em;margin-top:2em;padding-inline-end:1.5em;padding-bottom:1em;padding-top:1em;padding-inline-start:1.5em}.md\:prose-lg :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.5555556em}.md\:prose-lg :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.5555556em}.md\:prose-lg :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.6666667em;margin-top:.6666667em}.md\:prose-lg :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.md\:prose-lg :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.md\:prose-lg :where(.md\:prose-lg>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}.md\:prose-lg :where(.md\:prose-lg>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.md\:prose-lg :where(.md\:prose-lg>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.md\:prose-lg :where(.md\:prose-lg>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.md\:prose-lg :where(.md\:prose-lg>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.md\:prose-lg :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}.md\:prose-lg :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}.md\:prose-lg :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.md\:prose-lg :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6666667em;padding-inline-start:1.5555556em}.md\:prose-lg :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:3.1111111em;margin-top:3.1111111em}.md\:prose-lg :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.md\:prose-lg :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.md\:prose-lg :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.md\:prose-lg :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.md\:prose-lg :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5}.md\:prose-lg :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-inline-start:.75em}.md\:prose-lg :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.md\:prose-lg :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.md\:prose-lg :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-top:.75em;padding-inline-start:.75em}.md\:prose-lg :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.md\:prose-lg :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.md\:prose-lg :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.md\:prose-lg :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.md\:prose-lg :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5;margin-top:1em}.md\:prose-lg :where(.md\:prose-lg>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.md\:prose-lg :where(.md\:prose-lg>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}}@media (min-width:1024px){.lg\:prose-xl{font-size:1.25rem;line-height:1.8}.lg\:prose-xl :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em}.lg\:prose-xl :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2em;line-height:1.5;margin-bottom:1em;margin-top:1em}.lg\:prose-xl :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1.0666667em}.lg\:prose-xl :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.8em;line-height:1;margin-bottom:.8571429em;margin-top:0}.lg\:prose-xl :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.8em;line-height:1.1111111;margin-bottom:.8888889em;margin-top:1.5555556em}.lg\:prose-xl :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.5em;line-height:1.3333333;margin-bottom:.6666667em;margin-top:1.6em}.lg\:prose-xl :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.6;margin-bottom:.6em;margin-top:1.8em}.lg\:prose-xl :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.lg\:prose-xl :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.lg\:prose-xl :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.lg\:prose-xl :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.lg\:prose-xl :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.9em;padding-inline-end:.4em;padding-bottom:.25em;padding-top:.25em;padding-inline-start:.4em}.lg\:prose-xl :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.lg\:prose-xl :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8611111em}.lg\:prose-xl :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.lg\:prose-xl :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.5rem;font-size:.9em;line-height:1.7777778;margin-bottom:2em;margin-top:2em;padding-inline-end:1.3333333em;padding-bottom:1.1111111em;padding-top:1.1111111em;padding-inline-start:1.3333333em}.lg\:prose-xl :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em;padding-inline-start:1.6em}.lg\:prose-xl :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em;padding-inline-start:1.6em}.lg\:prose-xl :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.6em;margin-top:.6em}.lg\:prose-xl :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4em}.lg\:prose-xl :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4em}.lg\:prose-xl :where(.lg\:prose-xl>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8em;margin-top:.8em}.lg\:prose-xl :where(.lg\:prose-xl>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em}.lg\:prose-xl :where(.lg\:prose-xl>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em}.lg\:prose-xl :where(.lg\:prose-xl>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em}.lg\:prose-xl :where(.lg\:prose-xl>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em}.lg\:prose-xl :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8em;margin-top:.8em}.lg\:prose-xl :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em}.lg\:prose-xl :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em}.lg\:prose-xl :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6em;padding-inline-start:1.6em}.lg\:prose-xl :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2.8em;margin-top:2.8em}.lg\:prose-xl :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em;line-height:1.5555556}.lg\:prose-xl :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.6666667em;padding-bottom:.8888889em;padding-inline-start:.6666667em}.lg\:prose-xl :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.lg\:prose-xl :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.lg\:prose-xl :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.6666667em;padding-bottom:.8888889em;padding-top:.8888889em;padding-inline-start:.6666667em}.lg\:prose-xl :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.lg\:prose-xl :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.lg\:prose-xl :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.lg\:prose-xl :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.lg\:prose-xl :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em;line-height:1.5555556;margin-top:1em}.lg\:prose-xl :where(.lg\:prose-xl>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(.lg\:prose-xl>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}}.hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}@media (min-width:640px){.sm\:justify-center{justify-content:center}}@media (min-width:768px){.md\:m-0{margin:0}.md\:mb-0{margin-bottom:0}.md\:mt-0{margin-top:0}.md\:flex{display:flex}.md\:hidden{display:none}.md\:w-1\/2{width:50%}.md\:w-fit{width:-moz-fit-content;width:fit-content}.md\:w-1\/3{width:33.333333%}.md\:max-w-\[50hw\]{max-width:50hw}.md\:flex-row{flex-direction:row}.md\:items-start{align-items:flex-start}.md\:justify-start{justify-content:flex-start}.md\:p-16{padding:4rem}.md\:text-left{text-align:left}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}.md\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1024px){.lg\:p-20{padding:5rem}.lg\:text-2xl{font-size:1.5rem;line-height:2rem}.lg\:text-6xl{font-size:3.75rem;line-height:1}} \ No newline at end of file diff --git a/assets/static/js/project-item.js b/assets/static/js/project-item.js new file mode 100644 index 0000000..a53cec4 --- /dev/null +++ b/assets/static/js/project-item.js @@ -0,0 +1,31 @@ +document.addEventListener('DOMContentLoaded', () => { + const carousels = document.querySelectorAll('[id^="carousel-"]'); + carousels.forEach((carousel) => { + let buttons = carousel.querySelectorAll('.carousel-button'); + let activeSlide = 0; + + buttons.forEach((button, index) => { + button.addEventListener('click', () => { + let currentSlide = carousel.querySelector( + '.carousel-item:not(.opacity-0)' + ); + if (currentSlide) { + currentSlide.classList.add('opacity-0'); + } + let newSlide = carousel.querySelectorAll('.carousel-item')[index]; + if (newSlide) { + newSlide.classList.remove('opacity-0'); + } + activeSlide = index; + }); + }); + + setInterval(() => { + if (buttons.length === 0 || buttons.length === 1) { + return; + } + let nextSlide = (activeSlide + 1) % buttons.length; + buttons[nextSlide].click(); + }, 3000); + }); +}); diff --git a/assets/views/website/base.html b/assets/views/website/base.html index 8adb918..affb338 100644 --- a/assets/views/website/base.html +++ b/assets/views/website/base.html @@ -13,7 +13,7 @@ /> - +
{% include "website/components/navbar.html" %}

- Made with in Poland + Made with 💗 in Poland

Projects diff --git a/assets/views/website/index.html b/assets/views/website/index.html index dc14821..322c1b3 100644 --- a/assets/views/website/index.html +++ b/assets/views/website/index.html @@ -123,51 +123,57 @@

Who am I? 🤔

-
+

Hi, my name is Gabriel Kaszewski, and I am a Bioinformatics student 🧬 and self-taught full-stack developer 💻.

- I started coding when I was 11 🚀. I love solving problems and writing - software 👨‍💻. + My journey with programming started when I was 11 🚀. I love solving problems and creating software that + resolves them 👨‍💻.

- Currently, I am working as a Python Developer at digimonkeys.com 🐒. I am - very passionate about Computer Science 💾. + Currently, I am working as a Python Developer at digimonkeys.com 🐒. In my free time I like to read about + new technologies and work on my projects 📚.

-

Skills 🛠️

-{% for skill in skills %} {{ chip::chip(text=skill.name) }} {%endfor%} -
-

Experience 📈

-{% for job in jobs %} -
-

- {{ job.position }} -

-
- {{ job.company }} -
- {% if job.still_working %} -
- {{ job.start_date | - date(format="%d-%m-%Y") }} - Present -
- {% else %} -
- {{ job.start_date | - date(format="%d-%m-%Y") }} - {{ job.end_date | date(format="%d-%m-%Y") }} -
- {% endif %} -

Technologies

- {% for technology in job.technologies %} {{ chip::chip(text=technology.name) - }} {% endfor %} +
+

Skills 🛠️

+ {% for skill in skills %} {{ chip::chip(text=skill.name) }} {%endfor%} +
+
+

Experience 📈

+ {% for job in jobs %} +
+

+ {{ job.position }} +

+
+ {{ job.company }} +
+ {% if job.still_working %} +
+ {{ job.start_date | + date(format="%d-%m-%Y") }} - Present +
+ {% else %} +
+ {{ job.start_date | + date(format="%d-%m-%Y") }} - {{ job.end_date | date(format="%d-%m-%Y") }} +
+ {% endif %} +

Technologies

+
+ {% for technology in job.technologies %} {{ chip::chip(text=technology) + }} {% endfor %} +
+
+ {%endfor%}
-{%endfor%}
{% endblock content %} diff --git a/assets/views/website/macros/image_carousel.html b/assets/views/website/macros/image_carousel.html new file mode 100644 index 0000000..0320efb --- /dev/null +++ b/assets/views/website/macros/image_carousel.html @@ -0,0 +1,16 @@ +{% macro image_carousel(id, thumbnails) %} + +{% endmacro image_carousel %} \ No newline at end of file diff --git a/assets/views/website/macros/project_item.html b/assets/views/website/macros/project_item.html new file mode 100644 index 0000000..1ca962f --- /dev/null +++ b/assets/views/website/macros/project_item.html @@ -0,0 +1,98 @@ +{% import "website/macros/chip.html" as chip %} +{% import "website/macros/image_carousel.html" as image_carousel %} +{% macro project_item(project) %} + + +
+
+
+

{{ project.name }}

+

{{ project.short_description }}

+
+
+ {% for technology in project.technologies %} + {{ chip::chip(text=technology) }} + {% endfor %} +
+ Read more +
+ {% if project.githubUrl %} + + + CODE + + {% endif %} + {% if project.visitUrl %} + + + LIVE + + {% endif %} + {% if project.downloadUrl %} + + + DOWNLOAD + + {% endif %} +
+ {% if project.thumbnails|length > 0 %} +
+ {% set carousel_id = "carousel-mobile-" ~ project.id %} + {{ image_carousel::image_carousel(id=carousel_id, thumbnails=project.thumbnails) }} +
+ {% endif %} + {% if project.thumbnails|length == 0 %} +
+
+ {% if project.category == "Desktop" %} + + {% endif %} + {% if project.category == "Mobile" %} + + {%endif%} + {% if project.category == "Web" %} + + {%endif%} + {% if project.category == "Api" %} + + {%endif%} + {% if project.category == "Game" %} + + {%endif%} +
+
+ {% endif %} +
+ {% if project.thumbnails|length > 0 %} + + {% endif %} + {% if project.thumbnails|length == 0 %} + + {% endif %} +
+{% endmacro project_item %} \ No newline at end of file diff --git a/assets/views/website/projects.html b/assets/views/website/projects.html index eeeb663..f535036 100644 --- a/assets/views/website/projects.html +++ b/assets/views/website/projects.html @@ -1,6 +1,10 @@ +{% import "website/macros/project_item.html" as project_item %} {% extends "website/base.html" %} {% block content %}

My projects

+ {% for project in projects %} + {{ project_item::project_item(project=project) }} + {% endfor %}
{% endblock content %} diff --git a/bun.lockb b/bun.lockb new file mode 100644 index 0000000000000000000000000000000000000000..b78a764281e78c2685e3b9138390178d2af8c7eb GIT binary patch literal 45019 zcmeHw30#fM+y5yC32lTVDqD-wE>dZ=6=_vT=~SmWb=uA;DM`p$b{-@m3PqM=k4Pa~ zw(Mk=HfzdK|LeNXncO^7e((SN{NMNgG0!vRp5^H<_OKYEo}G{;0Fb z5wdoC{gFlK$L^jl7Ps94g}_A%1BS#;VS*^GI8Agx1>G2ogu!st6T&(OJ41L_6gP!x zr6BGr5O4&(48{#H1_R4GLD&hx7t z&@iqagRw(Yj?WQ<@uqPY7uquz{UHAogjg;YLgWc#3&Ns98I1NFg**YG{BW*+4A$!e z@$OJAMZ~uZLXheXH%P?x`0&}j907x|7~)v2 z6#hXuRDl%pr-;gv_S--l(?dA?0FEAmLFygYMW_#dwjeSBBegpC6YW&JK+MyYLMZMEUaB z0uEyl+B=xB|{}4up#!ALXASFY0G@WFRY;6Qdz2ZvteLez>9BaJE38 z0_hlk2kD3#14f7K>m^Drhd9=I9YU1vVlQF&GzhUjq7{T858|jliQYoH{RZhMpN=Se z3+aeAR}_|Sjc0lvp&UQ+ECOLrUOt34KI)Yi44_PS1R+$FaGHNe=Rydv9RR1==cXd8F9Sks&ua)VKUI_tYNE>R4Oz24 zXJ?}G$9s&xYN-b^ZR*eS+ShJ%K9dt|DJNz41&y+5KO4oj2|H6!ztks__!DHE(X^Uk%@w|9T9T4vqk4T#;%K}ll5(1)E%6w-Z5j*=KdOX=_BJh zcy2IF&In!156btnsVLqw|CrT|Z&I1jiT*FNCPodF-1zuzV#lZYiaTdL%6XZ`usfaW zTz1@NLuJUB4Q?+TF1UDCHGN*rt}Ez%yTj4Km;FrN7wjvM85+oR({sMmA*)D3d+gVG zkM8gGb?y6X(UP4k(tcgDZ3E-x%J%+{DVHj~(tkOr_vDZbca2?o*-U$4b6v-7iKp~{ zQO;&-hD^ECWx|cgd9~^bI;wA)uyy}-<9=hkVprPOCi$)2cl_@8M*#(kJr&Kgj~-q= zr{}zyg%7Qz_im3|Qo7hL`QRk({Y^Eh{njcdsX8XrM>Qn6RIbcBSQOrQ!vuN$YX{#M z_DO2-vuY}1Ol*3jU30uK@2y*uRr^nV&t5-Wr1S3mu8JK~Pc6x)o9^c%RovBaQCUu3 zHyg>=d;MfC`m$pDU6<7KcDEaq)upVl$?B$of}9-Bxxe&{6OPzs;jovZD^{$iL>s#jXkJgPiDKS&B!d1y^bMohFf|HFm9ZfpTlbOQfC5olK zIWsdn_14Aff)2}P`mP%>y`T6KFNd0%aQBln?Nc9CtGPPdnBe*D{NsY&13Mg>>RrAg zrZG%^v!cbOtd*5LET!1vP#E&NPFHIk9)D9<7=CSs-Jnv zq>Mu4!3=;)8?y3!>>w(E?r;9u3hfBv^ccEsD46_qhd)1 z^?X~M*&k+91zcJvSE;%}d-9S&d8S64!c2-^JER=jdSP8mTF^Ca+Q5V%n)5h5VlaOH zD-Kry=thFKfq4P1;TDKbV3Lc7VsWqa*3U*zf-(aqinCE$tf zh#j;>L-5N1Zz94Y_D}J50Z;4)RKbAdWt$wSUkVgI3hKvk*VekR0)meNJn9dzuoP-u zsbiUz9KpW^yuS$FQu&|r2;Lq#p6CzD{Av4>0gvrRzCY0cssAeAQU4@P!k^{+IZn#S zfxwoc_M;9-`p@Nmj+1iEfTy?r=W@S`6Z~?(lkto8(^g0D1%S5)`El%!w6<`NvNAC6 ztO5Tgbt6B)I|Cl>A^$Ocr3eq*NIAkQivBhrC~7|zZfiRTUIrHB*nb$u{%`9T zB>3?nJnA3apW@d5-cnTme}cdDQ~jWhHaQ}HA9xtT`wzxZcYiAXB*2sT4=est{jUZ* z>L1MbKhpn0z@z=bG)B2Um0uGcj^@La&-_(%OCmZZaFi;k4r4tQKY66~MaZv)`< zMR?eM_+$Bpz{5SxAEe!69JeSuWD@y(08j2;$U*F|t@vEPo739g8jj?X`o&?vJ(`C9 z)A2VJ@Th;n_ownN0Q_*kW4&Y!Co;AalKL)*@E9jH+!BuD5qx`CG~oEhIO#)DrlpYJ zCj;I_gm0_vkeA@M0sg|FQT^EVKb3zE;Ku@< z=pQ-S;)wpbb{FcO=&vnUEJN_NB0RCZKW+bh!0UnhgpY)+$wA6J`w8C~j^q=357;cm z`Jco|erq8q&jq}tNdK*2==lVn4R|vDVc-90|33vhx&Omb=8y5C;Gx$T$R7oGynhn?ll;~~g3lG< z|HO8Xo8TJ(Zwd92_@C;}2413(=P$&f9Bpx=zWIP3A!>hH>qdTpFA&vF=8v}2O~-!~ z;nDv7llq7EVKB@=ezZTt6S?5BMMuib2fQ`lu`o$%5h%(eWlI2$_Ji{urjhj4I7m4O zcwvcnY(J*8RR;t=8t~YE*zbt_Q#`&f#q|?Fsj)}KF~(bRr2cMw84O3jW4&#~A}_&n z06&pdKTHR0as+JUQ2{W zj<(KY1Yab=6Wx>awzmI0;9a49GXLW`qAiZpW25|i{}pkBr!@|OPXRoxf6;!?x788+ z6J-X&T!bfMs4W}>ud4EW{{!{^r_XW|s{{n3EO`wwDK|82EjC`y&Z@`%OyVJXRg;Y{g9 z8A5c*)W5yF&=^uaP$!IVN~jmA(jsZk70x;A44oJ z5XCV>d1An0y>Z~N{7mrZFvRo(@aPh#e}y5In++brIihq7vHU#nm_8poIt(#=5k|nZ z6k@q#s+2H9d6$afZ3(gba#8tTg(%kw@K|mYc#N+Gj}AkOufd4Op*-l({?KOrj@!TE z_V2ibfdGy^j{j$k+eYa|9LWDS9q@@UguHZWruYs{r>J{kRwc{h>en~uUT&HeJRgll=c@x)HKO0@Nxl7X|8ZX}Kh+~EfWS?7+bbWl6Npo*pY;V4C zpPGlpisG@gl}XNPmmC|r^U5x(knA1fPTBO&nX7-tKHkc8V~UnU{9fsdo$1eAyme{3 z^!+Gi?Be(W9qnyN&Lx-HPqsLxUY>vcpyqi08&6$~G*50gSmqwPFl^(}iyzBkmMi7; zx|uF-nswu~v|Yn}6E!&_rz2Zwym-GMjv1V}sp(yqnyzLrS1D<7ZfA}29v|0Biut@B zY~}iLZ8wFPFCHBk^J?p+E$73`Le`y&lOOx`p=Mp&fZ;pzU6s?v857o|tv}pp<`JERin)uly^F5Tb<#|aIr~6C+GuH~ z@g6&BY-i;@Hov& zt-Elgw>|Hmjg#!!l9%OO>w2Ewa&dO|{yy0Q4!=F>eTl|P-)m&P%z7)CQ~WLZRQb4` z*;kd*R?NwI)#JFXFZa!5J2@pCMTuMMvPN!;+2iFjQ{$s|U0<0cGubcJ>I}O5y4J+^ z#C#Tw7oS0hV>(17Ysg(b<+!0XOv3So^wgfWoho-l52|+DfAZbq#5V)FoH%T^z4QAn zefnROaMaF~5ga?WH*vONk^TE8?W}rFHK*}*C8Q8Ci_R{%d;W3WiSc!ASyJZ{3pZuV zi2uCa&`);OQ`wVO&s^olwhLW*Xvu#2wPshXmc6@wY}8k^@yQWS>o(n;+;{I8XBscO zK5cf)m;v0(VbUtu4$1|2P8ov}ntIA#{Hoi2zQw<^;+XvV@e6h4JqrLO-r~q_qFl zU~7kSb8HIEcJ1IXZ~pAJVrqA3yzpAG*)iv*G!C}2xb5O*-~R0M-EQZW9IZ-w&}H~| zr_Hf^%@^;wuPZa`lq&!B;^q>mi~56tZTlY2UaC;IG;3$mvXD3SooCQ^Wtv$*51TVK znG6ZacsOtMv0_&j=j(m%EpNz_xI6Id@QbtNPPv@$(&BWFU1IU!U)SRXSj1 zlC5Cd&f;}Kfa@1!h*i0H7oku8R{lIGUe&riZfedly1J+ zeJs1wqU^w#2TI(k86U1p;)`7wQsGhiMo-VZ@%W7b)^!@M9G!QFp1{MQqj@3D2Fr~lDuJ7&0F z{SZFK^g{W5+mhmk{Q5UN2kzc8X59`K7mIhMzGI#*eJjlnt3Fh2W7M5KpW)sPam?z7 zOK0L=PrX0-g^y10*wFPObibaK9a^|q>iDF+7p85Ktb4$&cvW(B^~0j}DqP8w#w|_< zdY%}*Xsqme?s?s}2glOn#kDhWOyiDWUp;21>Tljqf1voiRe)oqbvuWdRl~!Af_n=7 z(G`Eo`f?~lyZt1YUAvW&H5WO&%rrf}C&8|Fw{1GB&ZzISrt!jSiDt( zjJ-4{DKwqN3$GiR9rMO@%iQdo-3{^~&x;>xcak>?xpn98vxM!7n)KZc#cckt{-yQc zg0m&{GoPMZViLXZP1D|xgN>7mw8k!s?aXx=6GP*r@B1+;UhtkB8#cK#eQ(sxkF5Dl z+DchAqmvR`Y)y-Ub|h9*)r8qa-L}rni_)?0JLlD$4VI$~M^0;6H?oJ%!qa0q>I|Xr z;+_a`%u(v!dhU@*WN5wuX&q3^s0GTo%f($T=>=9c{@zA? zqmpyiFm%$)H|{;wtlQ)NPtLeW?P$D;gcL&N)IJh#thTsF^w_>*u6FgkYbQs{S`aH1 zpF7SjM(NG;^QDPL__qWrrm&ype2yuOzj1i{*qSEK;6rm3nd&QtH0&v-@%Ewf7F9R~ ztDJq5>D}$%r1@^gGD7MT%Py@g+(vLnX=;?4 zzCPvl0hj(XUf7mwc1-hUdt&Q(|EQJwG9xM!zg*ltzUO(5(Y*L0V*Bn@77Cs${8k>2 ztL?Y=;pAl@1qs22GICfSBy>Wf%64j}8!bB+NaIy*W`%w;jqBH;ht@S2OEc+qX%-{h z3>B-le~MDQ>9*rgpWv_M3r0OQnYWpxmn-X88l+ozA(>U zYpp#alR`ALw8edwD^J?ly*vH>rb_2M-{Dq5?d5T6tZpZ%YE6FiW#6NUu5mIcC1Y)s zHeW26{%$S*LHThrHCEyB$mHUqDGfc$61&za8#hD<>;-Wp5yxrr_NVjuoZ2}fYQc~_ z3O-sax8a6^Sr0?{)a{PdkydyfJ^z`xl0n3kj{(x=lfw@r-LLMlZujCZ_W9|i>gn$^ z4vkEdKTtyB9YE);T=gYsbwU zo_vjqJ*0ZTV07bc@BJIglLx6}?P8oBd&guSjdviO_o;n){MZpQ&b(Wr;h8tWi{+$| zuWapVP<>#=8S9btw_XPX6m&f~!Jzz%?bAp}6C<0Cr}h|bTEg*n?l7s?GdW@tjdu{8 zcdjBoeyeho&;EIxHeBDdxa!i|T$7UMdTxb#()uCPa zzEZ|>Rn_=Kci)$>teJ&ZXuN~zyhm>?J@j_L<>$Jo`}cL+?)Tm~(CBs7>C+W=PtWOX zr+3aPXicBSh4UsI+mv|c^ZY)OZ(XtO>L_=r>3m7nhcT7uHVQOeH9GH>nc0WM>`yga z&M_NQ8-M%x_K2?S4h&(;_@*^JO=jcx(g#mA&CXSo-`_OOvY=atLDrisSGOIPP|D-j zm+dZklxIxiRj2d5%eg7nu9L@{xV*DB&9s%TU!P*t!81(EI;-bN_w{Q1hreu!ESBzU z*D1+WQD&I&g^8Ef>Psk>pL|+pmU`goO1lv>UJW`gbFw}Nj4qa*fxSrcGa zy`cR90nfMo`I9$gpFdqxs`WdxKjs0i^X-6;!qiV6vi18LS%1)6&a3BYyVIWoH0ivX zz2lt}yxq^qtn8xpCV;8fF>{M<$bCntkC}IQ3Mq>1&ux}lU+?$s+NzK5|9RM3>cT&2 zvxcf%bLAA|x(8g2?L(g@htPTV$y+^iS)&rQ`Bk5zZ&%GY(c3h5vVHiYGUlWN@q)sh zM&p)#?r_%X>y^ByL;0I`IZhp48P(b-Hu*eet20R~{}` ziCR1HhMA+4MBV;QnUP2)xHc#f|%8he1??xR>zgn+b zlM{ByXoP`U=vnV5 zqx*!FrL%2yz8w`iT*b0)cP5(M@sojqZO1RHZw_zLAKZWcro#Sk!}h>c$(wac>GPxx zo!9Wil5sg{tG6`_+_uh2FL0Gzr%QStC8Sb%D>m$YS9ZT%quodk;o|T5sXkue z*Iv8l^WNLK$QIO`P>D4y`9RaJE}eJu*oh-I=H_fJFqf`Nz8!G+mbAFX=f}}()lGM6 zmrie&qTPRQ=&D|$d6_yTS$+JDK4aA$ zSL)UGaQk{CxAhzApL&d6w*K?O35K^gmo}&B|I_o46>O4_`@8|2*YA`pyK=-flZ_>h z)2E$1HsaLVy#2=RuB+ve%g59k?|z``sJ_n7e{4;3Pp>UW{v=MCxdCO$jx{_fznJwtbvJ{o)I|KUx;kL;oXkGpp*Ou165i^brec&m}MArD5Fx+sjlNRyYm zXQAX(JL4s9^Pyu>y!6xAD-EL67w_3pGR<>auJI=4@V=R|+bP}8yx*j6miTemqr`ZyxcgK zIe*`l4~O=r%pTsb_`~G*@!@<0ot!B%85#AZx2|6h_ix|lQ)6=9>G>+b^Rzsc)!3vVaY#J%FH@!YdGv> zOXD3$=dHGVp}up{=m+6*^gfQ>w{MH;q$X>H?h7_&Jl^9M=C?FWd$;0|=aFZ_I=#+j z@AL`_WgXI5pm0bv?3_Po2r@DXlj#!_g_O@L^Hrv22CJ zq`tmIuJwMQ_Z#O`d7Kzf`pUCmpxmSj1J&=}cac$YJse@jURFNEk;ZFI=dD%euc=h9 zdVllY?Z+}k(GK;mD%N~S&{(u*#SD|I*MbMN)nBib1V?p9WjdWNaF}6|ZBm=n<7r}! zy}wlQp|{UE(0DEAyj6-{tvv@+_Ig$Qkn#1a8!JzI=84pX$)5KbX5SlNwWi8=;0d?CYIC;u; z%Xo32zpqdK4d-$U=QgcjAYbk>u=VY6kg9;c+EpYkddEQ>GtON)2(^DkaiFF zgHP6mEdTs=*Q5Rp)=zraKU?YZ&zza#UkyIj&hy&gprygrcI=_?j-vB&9D~&|wKh)p z+H_*~)oxNp9WHMiqv&*XLxxX+(Z)gZM||lNKX1~$#`4JpL93U>+LX(8ebjVLN5^(y z{Da;aISY=`ct_KDnfr&?c{+IrYS-oue57&6H%GN$m-?yLUA=nrSZR}daN4aox$VBF zeaVqOu<~)cvwD-+5nE+L17~O17@U$cIQN7{s6nXesBDdplZ$jZ~CRFbhSRL(xE@sCU-zzdcTb& zq!2Qf#|7Ur8l@SemT|9p3* z&aJQOw`Xc~UHZl6-o0UC{JYTP9Y^P_t=-r|amv}54G+sFXBQNXnHzeh=kAU=$2je_ ztT&KIjZmsMknMRp@q*4CMY}ss=kud}!$GQ{!u@ zAJ?TYuJd{K(1e+btlD>(>$?2(>Lr;k3I=IDU1)sF=wo!%=%NMNCv0V;T;*QBs$d*D zj>bEI&b#AjuC1%s1poHsvR`MqF6+{5X`M!hUc_qI)UJY0T_#7~yc=a3kQX?VE!}r? zpG(UPGVU^}@5Ij7XIq&TF!jd4U>dI-omX+&2Tr_6v84Xl6LB>*eW#WUxm~9Bio2)j z{nxrvtQj|Fo|fyqt#H(n!8XNF2Q5oewFZ=}Ir%1T&<63+_LF;A(4Q~ho3v)f^a_{A zm+q@yAzqQu`Rpz&%OUdnoKJn z`SpX>K0aX1oyka3j69^2oU@wi!R&1&K2Sxa)4X{`WIc)R^&IHD!@2I3sdeY;wzT`; zd2^X~^o@mbC40OqZ*Cc4#_yuCNp^hKV>0qD+%~VA!JBVkTRJ6()8kX-uIz>i)8Nhe z&+I$W^o!qn5Xb!D;!tz_tjZk+r0c-n8Zx4RSmXkyJj6!v+UeS z?ft0qtRzd16E4!#E}AO3eKR({AN+RW#*s8$CqfD#)A-!|C7HK^T$d`AmR>KH_4K!x z&~W9kuX(m{`hcA0YnL)M$SywlZkm4Lm1VtdKQcPi>C34pQ)>7jA*b%oJHIbThQ{km z=Vd!AT*mFa?!c>*X(`j zhRkwwh&6HT-0Mk6?@hhbUgbJ&xXiqjf?QU&flC7#9+|IJa`CyyUX0BRf^zdOQEntJH_8 zPM4&a$08r-d&vcNy6MPHd`07(Oy|9{cjhit^NEx1EgfhT78s=FaLN0)_rZx>9s0Q6 zpC2wA5o>tg!*jLxrpWXgM|A5GUd_AyyvN3a_u88eS?J}rT279}OTKqPdgdru@sa1g zEUtYUmLkc%&|XP{+x=$oYsp4xuYqoMxmM|2H;S=_mNh1A-TZ+3By z-zz^V9@A;dKy@1L6uP{TRVVIu{^!B&y+aR16Gxl-5HZMQ+JI+?zUWom4)VvyPZwu=1=HE zkC}?)n(BPj3g;<$qiVhx$MIB_ z7Y?zWR%Rhx<39H(R&40Cd@s8CgvRY3~ZfbZr+W67;J-rDjgv`GD z%bk>JmlT_XyzZ)XtA9Y+%i@_S@xIL0ZoyKAHl*7m2c@kId44?Y#;t8{F7Ld$_{DaK zhlwA0Z7Zu}9FsY>27h~vj0-lMxBr!H>@}$$r>|4$KD;T~C};SiIb$Dd4?OtKQ1}YWZ%B6{q5sco@yP>qTT*;JuX$bu5s+VOz?Vz%FNvES|7G(m>#9;fkWr* zulLn|c01+nle!sMM)a}^)ZFRYKW6qd$p)!3p6f&@sRcXZw`N+h()JdquE}S0xuv-I zQC)#?{gdt4HW^pmrqJgd{BDUj=A3VLMy1O+ML#u>=(_*#?9p5PF+Y)YcuM5sxzZkA z3*QPl@0(DUA~PqX?((b5QCh~gw+)KBqI_mfw(_i}Z%nru)Awlu2q}cj<99{`j@RP_ zPd>%n|MlyeRPW2l>Yd${>rQ7s?d7dJyo>-fO8zLu{pxWOo#4ImwrKvA7X_Jie2ls9YTGDsMX+M`JvfO>j(fob; zJiCJ*lP?Ulc6oI}*=cB6!~Es>mJN&D@2YFkc)4`mG3PpuGW06hIIM(sr78W%+Hc1X z1kCR?Jfdv(w%Q3L3V!DOT|AG!>lqpP!FjFWwst!AOGgYyZJmi9+Ws{eGLDQ+H;eg=M;--tiyVo@SgZy(ZnpD-=MnK zHq&+TY-O#N%Zf{1*^gaN%~hKIG23dT#WuT?EtAtY@0=~i-YTH+@(3w}Ow)z$x<4tg zx__i*WUxv-yY(StW$ z3(Ks{`d_`#o5mYL=T(uq&bixr=Yhr{8jka&Ml7A?@{j!7ds68Z34PenXT^HVnCdah zK9C*ptX=M!58*+J^B0XVsN7TaBCpv0!}3D-lCH_Ui8kfo)*|B=9T zPZ%T%w^8<)H{%$v&Pc8%d5h` zs?Yz_?&T*-1d7R+$bP%=)^BONd^&IF3HuV}8SM{mIwmbQIvK0UI=F0h)*arYeoazY-wwpvjS1=^>9y?c z@_tE+7Rt>UwomfmwiQLaCxva$=>NQS%EXg2UICqV-}%CqH@MzrQN`0WEyRnLPdw_l z?}pj1#hgHPa`%+`k=srimI`K#%#I9HanLCeTTv(&xojQRpxwxS+DAuB)=Z)CM$&l) z*(V#n+!ARindK0%D!t#Ngzl39^{b1FFPc66I4v@J*p7WFFYMRYT^gXBpSaFFru`J{ zg>m~=s(gBU(pKL8b?i18Zxo$3z0hp7x0A_^j;=+|>?&TyGOwy$D0-bdXjbaTL8bkS zrHt>~4Vf0Av^u!{jApDNQ#PEn*159Qdg2G3q)d4J^5rz%X>{KC!{o{Wryf%~>>egD z`Sz9SqlLRdQV$!3uF|-@dr;1nh$VBCUk&`#z+Vmg)xcj3{MEo;4gA%> zUk&`#z+Vmgzt(`a=o#C2$O*Ap&U_AMq_UolvVa@Q3G*MK zY@p2MaRWlb{NbGzc1hxsw;okjp@aQnaI`KDc@b~JF zV+MFEhi!=kkLBaQV;a2Mpz<*d%VS!CNLkbIhw#8jnndaAjRc+iRy#r*%C{Um){kw( zHevlJ^9t}Q!7l~B3_R9{GNMc<1OE0*SMcy{0;NOLnJjpCWr=6K;(4FcZ>;u!uqXIl z;PH1OP>+h>QFp7r8-O1KUJX18ycT$E@Xp}zJMKx~UBTnG%=q0gej_{tKEl9?FDTD?E&ooy9)a}9DE>n zF8Cnu#^A?*UjTj~_*vlRfu92&zjF%)p8$R~cqQ=T!QfJYvu`CW5yI?*!fvyf=6pM_%A@TzP`WF*X@IreoS9QRoh# z8+Z@!Q^5Oz_XdyHsiM#aLN<7`-vIFb-~&Y==|3DFX!m3cV5k!Z|A2E$5{8l{9(snJ zQNv+2H*B7-bbp-9yFpQ~k%TnSd7?66UPHBXw4e*HM=^(-NGc)D!;_$4z@gnizbBBh zg2ly!^$AB8SWW^t%~V{>%RtLe3k-HO6ahO*Am^P@IR;qIHpuA?IpjoCDn~~PI{mPy z9&%=?xR@b`rVE%l$N`H?Ag2_|h+TmckSl?lk4(;61vYFCNI*_dCMU8&j;@xjmj3tm z+vLnvDo0Njgd?YYlhcDmvH^yiM^4T+hMeJA23mUh&0md?6ODyzdLRNhTbrEK3px5) z`g%|gIi;JN`b*^uMcME-8DRV-kn@Fw7}Og%F`S%03^{tx9>|#j80P542z~k@M8a`OFlCvV&L=8#ysqgn_}D2szjb=$kexnIBphiL00g!|CM$Y7> zFjNltg7Sy4pi4;*CWwS@M;T=NP*PKvTwp^xASZtV8`KY~W1JGzL(T>l)dTIh06B2? zNg$_(f0rPTEeMMag}GdGemKQO^<4Xo!j_T~#VHJo6VMJGY!8l{Ely!jfEMP14lqbj z2jqNl3PbhJLdbzTY63ZFTqMEodJg6gU4{>z?aL7`7~~Xkz@Y8Ge9#Rl!TErkQ!bJX z*cL+$NRVSavnKV52d$( zq8xIvIppB%0jfis}K(FD;RpDSnwl>H6OiPkn`1{9UiGmy)^^S|m za{9X2NPcIVBf_-*0ptAqUiupdcs5bM7yFL&OGp8wEK%ASbI!S!0vcO#=!;>EM%y z%|4!Y{Qkb&U62EsMqP`8IH0~*^z;)U{1_6!O6y(jwYSH*Ru#P zIOfddAFUg4Qer0Lh%7NWkn4-<0xGI@#PX0{QL&^4UjjBTP;F&7H1VYs4n=>=RQ*T|o4j8aETyDIB9F)!dWKH|j zht+D|B^Uz>WgLyJ4mT!vzB~UIF+v?&ha9w!O<5}|d&pm#2RXP1fSxOd9MtuWn8q;u z&59OG%HD7Y^Lh#G;TunEZ@8-UUBHM&{W8cwO#SB>fv4S8XNZeUhZG=6NP`gX3rebw z`xkUlJpvf)1<=k3$U)is+zU@{lHS~2Tx=(#fMOCZLWnJOxn4COHcZByl8u@}Dj)}? z)|Gr)sWG}cQ(WvOq~Pe#Q4sd2o%ZQ;g_6SVfDw(;Ur22roRNMZ8?GS1LZX2UrJgL7 zdT;cnG_+CCJ?l3ZXwNs11XX^MT^^VeSW{9{Y!c9YsEb`;x(9eQzMCKiXJx48E#zQ( zd?E&zns=5S4moI5z-A7Q(kQ`Ix2)1}AJU$~Jc@G&jFMlp)KJ)-U$pf1Qj2=w7cE5{ zfCRs2sR;9nmKuQ}g6&L)hi2?k_hLiG*ES7R&>o?QGD_fq4*T|T~arS%jB`c8*&05%&?qu%3uJF6~o zK}*Eh1vL6QjKP1jzIIa)TH=hVfJ+PIDpkeBuoLv57g9wzTQ97ONejBhh5i|?1*1WS zkpVe4yR6Wjykt4Le(7{9so zp|Ib>@iT|_17W_}5m8*1)bMauHR*nTXbC@r*&l>SMR(9YlFuy8Wf!zM>Xa(OI2 zPB@?A3rn*W>iDrBQ2&^~!douIh~_T*lf@R;gav>_cmaI?w+fV}1q^8mO((P#(o$Jy zDU>WNur+rva5P_o93s86fW-X>0Aaw=gRQsLyD0o&ZqENU;MjSUx?3a!n;1n5k> zpSDSPG%)U^84N?1AS{aS%VCAE!&xm3p&!Zt(+_bl0DJ~&MT+L3gMu_i0E_wg@YI8C45k1`LcZj zIVhxP+oc6F5tV>yL|3RGxIrR6JgEAH@j>Nbeo;IQwIHV|5k!UK+#q1Vc%*I;EI~{N zj~f~+VEOad0WH+l3KFDfr35vATeTv5bf6?f?KMXzY-`&8vCV-0F#(1WrT>-HX&R>8-++J?YZIDwqXaZ92D4b}leTDs2auvG zYO2>44Jpp_NF;2b_W>m;B%}~U(DquNyF^M45&)L;K#+ivfSS8}*&!SrtavyqxT&=u z#1G|w>xVdH(XCCR-`64l{~n=4q2?EyTB)^43t}{v!RCJ5#V8RQk->E+E z=kj=zLcs7n!lHIku_q(LSg;u7OmCIx$AZB2V*=b;;gLjS8=+AlJ{*1v z>HyOamI0pTYY?jSb;0?k>np0Cg~KKZv`|b+ ziIhpx%Lshgp|EG$LK~=EYLR9lfJ7IqtK}w$wyyysx&j#N*tLTCg;+xAMKV%-Nj)C% zqeAi42@8D=uLa5J#ZVR+ic$t;7ZFh$SeH;EKawqIsWX2n35-9bP^8r8Z9%9XS_#%9 zY9d@w^A**;7U1OFE5OJlSgL5{41*2s*=&9c^^nv83)w-ZDi?01Q`1#z!v9zSpnpvG zKH5ZLz)gVz51wJ6EluM8Dhs^-N~6SUZ6K2u5I{gKzbmH&b&yvYfFqZHgN+-sSP%sk ze7=0R8;JtyttTy+inl;7f&n`rfF(B0sK9O>#OL}2aH2Upo^}8y6rUWzVNV9`IUz7G zIeb{Las({6gjFstDg-`%6R^0UuzlkX@7!3hg7yt=aW4K%p&s((af!6}?-Ja;J0_;t+G_q->urb0n z5r}~yC>jeRO_ixFK4lYSgBJQmgr%|I<4r2re8VvX!;-Jpf7f}DQ z3SjwH8Z{kJldd0ZM`?2eAvmn?w~JcP2i|XhjJoZ>>jDGVl7ij}V*3UQ!a3|?Ujh8ED74W)F3&F<3bO+^@Bj?Y5dP4|EUdqUI)4oSDSn*+?Gi0U zTHyRyC}8_JiMqp6#t7R{uz4j2XGg=8 zD1{5)(HItgFzBgy09PO^>cx>3_8~lLka!C!pvpr9R0t!lEzbn-0tyh+izo`wT2p?K z6P59!4ujIRKLvbkua-+Nh=q3vHS}g)y)=e65Hh zfqJi_gS)80uZO5BYH15wjlw;R7TVTa2Kbw=S=2adZQdm>`T$8Tsdav9%i`t{D*{rZ zmxXUoDMO>4JHXt-+0=cy1=)Wp33NZDP+d(a$%oBjhx&5-;BE#V3be%eLqVkcA%Pm{ ztu?TDZUT7oHT1WE@b+!a6|mX90^HS(;+lsC2f#xowe14m-nBFl{#+E;n_+mT#7PM3 zp@qi%P&2?O30TxyQ$)fW0=Ut$qPc#Nf$*YW1U+sJFC$^V(vw)QiHGrUSPTfb1R#u= z3%?2bo{fd0;hjWt+2)A3@TGQh980#)hURi0fAjVCM>!OQ1+PeWoR&zw%LOdoBh)qp zWiJ#>YxBbQLcsDp^8L}Yg=S!-MAsr2NEBvl+&+R1;e><*afQ#zu&niu;=!vg=o^@W zVX_SmgH=}xHT(tvmHj3MEVT9KVVX$5M2k^o)S3a(dWWb?*jLbI(JF;{`2sBrg_me8 zHSdRVK=woY`@k0_hr;en3#$5FsF?^6ILWs9jM!|00ByboWwbsTzuO%^zelJ!v`vbn z>=Upw)1%&_w=xT~WO~gH^c;M-C*ZO}DT`}CcRv;cX?{$AiK+FSOPU!W!FQ{NyF%;R zEWbA@e0S2?Ew=f&25N4;Zqt(YHxEj{Lwjt3_UjApYxLp*P9%$ZbxKc+#E%xq;}$(b z_$mh9;NZabZJ{$-K!I34@ql@Y9{JkH_=AAJ_d}d&s2+6(r%ORzk3{jgZLEccfI4U~ zYQ@yry_a5hvzD>#MB~tEkx}5X6@QwoN?%AmE`_X+T{%Jt>8DipmK(9ok`LhvmPH3VB1BO2dyL<`_f1#>=Sr8pkQ e=PNDXDJ@W+p8&!42vlw;T(t;4Z26z}@BaZGIsaY& literal 0 HcmV?d00001 diff --git a/package.json b/package.json new file mode 100644 index 0000000..bedfe52 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "gabrielkaszewski_rs", + "module": "index.ts", + "type": "module", + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": { + "@tailwindcss/typography": "^0.5.15" + } +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 0e4603f..37a0f83 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,4 +7,5 @@ pub mod services; pub mod tasks; pub mod views; pub mod workers; -pub mod filters; \ No newline at end of file +pub mod filters; +pub mod shared; \ No newline at end of file diff --git a/src/models/jobs.rs b/src/models/jobs.rs index e40530a..53d6e26 100644 --- a/src/models/jobs.rs +++ b/src/models/jobs.rs @@ -16,12 +16,4 @@ pub struct JobWithTechnologies { pub end_date: Option, pub technologies: Vec, pub still_working: bool, -} - -pub fn get_technologies_from_string(technologies: &str) -> Vec { - technologies - .split(',') - .map(|s| s.to_string()) - .filter(|s| !s.trim().is_empty()) - .collect() -} +} \ No newline at end of file diff --git a/src/models/projects.rs b/src/models/projects.rs index 3fee725..8340179 100644 --- a/src/models/projects.rs +++ b/src/models/projects.rs @@ -7,20 +7,7 @@ impl ActiveModelBehavior for ActiveModel { // extend activemodel below (keep comment for generators) } -#[derive(Clone, Debug, Serialize, Deserialize)] -struct ProjectWithTechnologies { - pub id: i32, - pub name: String, - pub technologies: Vec, - pub short_description: String, - pub description: Option, - pub category: String, - pub github_url: Option, - pub download_url: Option, - pub visit_url: Option, -} - -#[derive(Debug)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub enum Category { Web, Mobile, @@ -28,3 +15,33 @@ pub enum Category { Game, Api, } + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ProjectDto { + pub id: i32, + pub name: String, + pub short_description: String, + pub description: Option, + pub category: Category, + pub github_url: Option, + pub download_url: Option, + pub visit_url: Option, + pub technologies: Vec, + pub thumbnails: Vec, +} + +pub fn get_category_from_string(category: &str) -> Category { + match category { + "Web" => Category::Web, + "Mobile" => Category::Mobile, + "Desktop" => Category::Desktop, + "Game" => Category::Game, + "Api" => Category::Api, + "web" => Category::Web, + "mobile" => Category::Mobile, + "desktop" => Category::Desktop, + "game" => Category::Game, + "api" => Category::Api, + _ => Category::Desktop, + } +} \ No newline at end of file diff --git a/src/services/jobs.rs b/src/services/jobs.rs index b01463f..8777e26 100644 --- a/src/services/jobs.rs +++ b/src/services/jobs.rs @@ -1,9 +1,9 @@ use loco_rs::prelude::*; -use crate::models::{ +use crate::{models::{ _entities::jobs::{Entity, Model}, - jobs::{get_technologies_from_string, JobWithTechnologies}, -}; + jobs::JobWithTechnologies, +}, shared::get_technologies_from_string::get_technologies_from_string}; pub async fn get_all_jobs(ctx: &AppContext) -> Result> { let jobs = Entity::find().all(&ctx.db).await?; diff --git a/src/services/mod.rs b/src/services/mod.rs index 123f66b..d47f498 100644 --- a/src/services/mod.rs +++ b/src/services/mod.rs @@ -2,3 +2,4 @@ pub mod data; pub mod jobs; pub mod skills; pub mod website; +pub mod projects; \ No newline at end of file diff --git a/src/services/projects.rs b/src/services/projects.rs new file mode 100644 index 0000000..ce9fa17 --- /dev/null +++ b/src/services/projects.rs @@ -0,0 +1,69 @@ +use loco_rs::prelude::*; + +use crate::{models::{_entities::{project_thumbnails, projects::{self, Entity, Model}}, projects::{get_category_from_string, ProjectDto}}, shared::get_technologies_from_string::get_technologies_from_string}; + +pub async fn get_all_projects(ctx: &AppContext) -> Result> { + let projects = Entity::find().all(&ctx.db).await?; + Ok(projects) +} + +pub async fn get_project_by_id(ctx: &AppContext, id: i32) -> Result { + let project = Entity::find_by_id(id).one(&ctx.db).await?; + let project = project.ok_or_else(|| ModelError::EntityNotFound)?; + Ok(project) +} + +pub async fn get_archived_projects(ctx: &AppContext) -> Result> { + let archived_projects = Entity::find() + .filter( + model::query::condition() + .eq(projects::Column::IsArchived, true) + .build(), + ) + .all(&ctx.db) + .await?; + Ok(archived_projects) +} + +pub async fn get_highlighted_projects(ctx: &AppContext) -> Result> { + let highlighted_projects = Entity::find() + .filter( + model::query::condition() + .eq(projects::Column::IsHighlighted, true) + .build(), + ) + .all(&ctx.db) + .await?; + Ok(highlighted_projects) +} + +pub async fn get_all_projects_dto(ctx: &AppContext) -> Result> { + let projects_with_thumbnails = Entity::find() + .find_with_related(project_thumbnails::Entity) + .all(&ctx.db) + .await?; + + let projects_dto = projects_with_thumbnails + .into_iter() + .map(|(project, thumbnails)| { + let thumbnails = thumbnails + .into_iter() + .map(|thumbnail| thumbnail.data_id.to_string()) + .collect(); + ProjectDto { + id: project.id, + name: project.name, + short_description: project.short_description, + description: project.description, + category: get_category_from_string(&project.category), + github_url: project.github_url, + download_url: project.download_url, + visit_url: project.visit_url, + technologies: get_technologies_from_string(&project.technology), + thumbnails, + } + }) + .collect(); + + Ok(projects_dto) +} \ No newline at end of file diff --git a/src/shared/get_technologies_from_string.rs b/src/shared/get_technologies_from_string.rs new file mode 100644 index 0000000..f49e6fa --- /dev/null +++ b/src/shared/get_technologies_from_string.rs @@ -0,0 +1,7 @@ +pub fn get_technologies_from_string(technologies: &str) -> Vec { + technologies + .split(',') + .map(|s| s.to_string()) + .filter(|s| !s.trim().is_empty()) + .collect() +} diff --git a/src/shared/mod.rs b/src/shared/mod.rs new file mode 100644 index 0000000..17a16ea --- /dev/null +++ b/src/shared/mod.rs @@ -0,0 +1 @@ +pub mod get_technologies_from_string; \ No newline at end of file diff --git a/src/views/website.rs b/src/views/website.rs index 4241ec9..ebedbab 100644 --- a/src/views/website.rs +++ b/src/views/website.rs @@ -14,9 +14,9 @@ pub async fn index(v: impl ViewRenderer, ctx: &AppContext) -> Result Result { - // let projects = services::projects::get_all_projects(ctx).await?; + let projects = services::projects::get_all_projects_dto(ctx).await?; - format::render().view(&v, "website/projects.html", data!({"projects": {}})) + format::render().view(&v, "website/projects.html", data!({"projects": projects})) } pub async fn about(v: impl ViewRenderer) -> Result { diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..238655f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +}