diff --git a/config/_default/hugo.toml b/config/_default/hugo.toml index 230865a..b259a6e 100644 --- a/config/_default/hugo.toml +++ b/config/_default/hugo.toml @@ -1,69 +1,58 @@ -# -- Site Configuration -- -# Refer to the theme docs for more details about each of these parameters. -# https://blowfish.page/docs/getting-started/ - theme = "blowfish" -baseURL = "https://tommytran.io/" +baseURL = "https://www.tommytran.io" defaultContentLanguage = "en" - -# pluralizeListTitles = "true" # hugo function useful for non-english languages, find out more in https://gohugo.io/getting-started/configuration/#pluralizelisttitles - enableRobotsTXT = true summaryLength = 0 - buildDrafts = false buildFuture = false - enableEmoji = true -# googleAnalytics = "G-XXXXXXXXX" - [pagination] - pagerSize = 100 +pagerSize = 100 [imaging] - anchor = 'Center' +anchor = "Center" [taxonomies] - tag = "tags" - category = "categories" - author = "authors" - series = "series" +tag = "tags" +category = "categories" +author = "authors" +series = "series" [sitemap] - changefreq = 'daily' - filename = 'sitemap.xml' - priority = 0.5 +changefreq = "daily" +filename = "sitemap.xml" +priority = 0.5 [outputs] - home = ["HTML", "RSS", "JSON"] +home = [ "HTML", "RSS", "JSON" ] [related] - threshold = 0 - toLower = false +threshold = 0 +toLower = false - [[related.indices]] - name = "tags" - weight = 100 + [[related.indices]] + name = "tags" + weight = 100 - [[related.indices]] - name = "categories" - weight = 100 + [[related.indices]] + name = "categories" + weight = 100 - [[related.indices]] - name = "series" - weight = 50 + [[related.indices]] + name = "series" + weight = 50 - [[related.indices]] - name = "authors" - weight = 20 + [[related.indices]] + name = "authors" + weight = 20 - [[related.indices]] - name = "date" - weight = 10 + [[related.indices]] + name = "date" + weight = 10 - [[related.indices]] - applyFilter = false - name = 'fragmentrefs' - type = 'fragments' - weight = 10 + [[related.indices]] + applyFilter = false + name = "fragmentrefs" + type = "fragments" + weight = 10 diff --git a/public/404.html b/public/404.html index 8cca726..b198921 100644 --- a/public/404.html +++ b/public/404.html @@ -1,8 +1,776 @@ -404 Page not found · Tommy's Space
-Skip to main content

Page Not Found 😕

Error 404

It seems that the page you've requested does not exist.

\ No newline at end of file + + + + + + + + + + + + + 404 Page not found · Tommy's Space + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + Skip to main content + +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
+ +

Page Not Found 😕

+

+ Error 404 +

+
+

It seems that the page you've requested does not exist.

+
+ + + + + + + + + +
+ + +
+ + + diff --git a/public/authors/index.html b/public/authors/index.html index 8e8fdb1..e1eed75 100644 --- a/public/authors/index.html +++ b/public/authors/index.html @@ -1,8 +1,817 @@ -Authors · Tommy's Space
-Skip to main content

Authors

\ No newline at end of file + + + + + + + + + + + + + Authors · Tommy's Space + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + Skip to main content + +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
+ + + +
+ +

Authors

+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + +
+ +
+ + + + + + + + + + + +
+ + +
+ + + diff --git a/public/authors/index.xml b/public/authors/index.xml index 22811f9..6c8ebcc 100644 --- a/public/authors/index.xml +++ b/public/authors/index.xml @@ -1 +1,13 @@ -Authors on Tommy's Spacehttps://tommytran.io/authors/Recent content in Authors on Tommy's SpaceHugo -- gohugo.ioen© 2025 Tommy Tran \ No newline at end of file + + + + Authors on Tommy's Space + http://localhost:1313/authors/ + Recent content in Authors on Tommy's Space + Hugo -- gohugo.io + en + © 2025 Tommy Tran + + + + diff --git a/public/avatar.png b/public/avatar.png new file mode 100644 index 0000000..1d47a6c Binary files /dev/null and b/public/avatar.png differ diff --git a/public/categories/index.html b/public/categories/index.html index 00567d5..27c5b8a 100644 --- a/public/categories/index.html +++ b/public/categories/index.html @@ -1,8 +1,817 @@ -Categories · Tommy's Space
-Skip to main content

Categories

\ No newline at end of file + + + + + + + + + + + + + Categories · Tommy's Space + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + Skip to main content + +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
+ + + +
+ +

Categories

+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + +
+ +
+ + + + + + + + + + + +
+ + +
+ + + diff --git a/public/categories/index.xml b/public/categories/index.xml index a4c3402..c6683e4 100644 --- a/public/categories/index.xml +++ b/public/categories/index.xml @@ -1 +1,13 @@ -Categories on Tommy's Spacehttps://tommytran.io/categories/Recent content in Categories on Tommy's SpaceHugo -- gohugo.ioen© 2025 Tommy Tran \ No newline at end of file + + + + Categories on Tommy's Space + http://localhost:1313/categories/ + Recent content in Categories on Tommy's Space + Hugo -- gohugo.io + en + © 2025 Tommy Tran + + + + diff --git a/public/css/main.bundle.min.7946532fa78157bafb1b4340d4074792811f18177af35790b3a0cb90566ce1cda3edd782eb92e134849964d14b6d9185c9d4ded2a12dcf5b706cb6a275c0cce0.css b/public/css/main.bundle.min.7946532fa78157bafb1b4340d4074792811f18177af35790b3a0cb90566ce1cda3edd782eb92e134849964d14b6d9185c9d4ded2a12dcf5b706cb6a275c0cce0.css new file mode 100644 index 0000000..01d7e8d --- /dev/null +++ b/public/css/main.bundle.min.7946532fa78157bafb1b4340d4074792811f18177af35790b3a0cb90566ce1cda3edd782eb92e134849964d14b6d9185c9d4ded2a12dcf5b706cb6a275c0cce0.css @@ -0,0 +1,178 @@ +:root{--color-neutral:255, 255, 255;--color-neutral-50:248, 250, 252;--color-neutral-100:241, 245, 249;--color-neutral-200:226, 232, 240;--color-neutral-300:203, 213, 225;--color-neutral-400:148, 163, 184;--color-neutral-500:100, 116, 139;--color-neutral-600:71, 85, 105;--color-neutral-700:51, 65, 85;--color-neutral-800:30, 41, 59;--color-neutral-900:15, 23, 42;--color-primary-50:239, 246, 255;--color-primary-100:219, 234, 254;--color-primary-200:191, 219, 254;--color-primary-300:147, 197, 253;--color-primary-400:96, 165, 250;--color-primary-500:59, 130, 246;--color-primary-600:37, 99, 235;--color-primary-700:29, 78, 216;--color-primary-800:30, 64, 175;--color-primary-900:30, 58, 138;--color-secondary-50:236, 254, 255;--color-secondary-100:207, 250, 254;--color-secondary-200:165, 243, 252;--color-secondary-300:103, 232, 249;--color-secondary-400:34, 211, 238;--color-secondary-500:6, 182, 212;--color-secondary-600:8, 145, 178;--color-secondary-700:14, 116, 144;--color-secondary-800:21, 94, 117;--color-secondary-900:22, 78, 99}/*!tailwindcss v4.1.14 | MIT License | https://tailwindcss.com*//*!Blowfish | MIT License | https://github.com/nunocoracao/blowfish*/@layer properties;#zen-mode-button{cursor:pointer}.zen-mode{position:relative}body.zen-mode-enable{ #bmc-wbtn, .author { display: none !important; }}.prose .chroma{position:static;border-radius:var(--radius-md);background-color:rgba(var(--color-neutral-50),1);color:rgba(var(--color-neutral-700),1);&:is(.dark *) { background-color:rgba(var(--color-neutral-700),1); } &:is(.dark *) { color:rgba(var(--color-neutral-200),1); }}.chroma .lntd,.chroma .lntd pre{margin:calc(var(--spacing) * 0);--tw-border-style:none;border-style:none;padding:calc(var(--spacing) * 0);vertical-align:top}.chroma .lntable{display:block;width:auto;overflow:hidden;padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));border-spacing:0}.chroma .hl{margin-inline:calc(var(--spacing) * -4);display:block;width:auto;background-color:rgba(var(--color-primary-100),1);padding-inline:calc(var(--spacing) * 4);&:is(.dark *) { background-color:rgba(var(--color-primary-900),1); }}.chroma .lntd .hl{margin:calc(var(--spacing) * 0);padding:calc(var(--spacing) * 0)}.chroma .lnt,.chroma .ln{margin-right:.4em;padding-inline:.4em;padding-block:calc(var(--spacing) * 0);color:rgba(var(--color-neutral-600),1);&:is(.dark *) { color:rgba(var(--color-neutral-300),1); }}.chroma .k,.chroma .kd,.chroma .kn,.chroma .kp,.chroma .kr,.chroma .nc,.chroma .fm,.chroma .nn,.chroma .vc,.chroma .o{color:rgba(var(--color-primary-600),1);&:is(.dark *) { color:rgba(var(--color-primary-300),1); }}.chroma .kc{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:rgba(var(--color-secondary-400),1);&:is(.dark *) { color:rgba(var(--color-secondary-500),1); }}.chroma .kt,.chroma .nv,.chroma .vi,.chroma .vm,.chroma .m,.chroma .mb,.chroma .mf,.chroma .mh,.chroma .mi,.chroma .il,.chroma .mo{color:rgba(var(--color-secondary-400),1);&:is(.dark *) { color:rgba(var(--color-secondary-600),1); }}.chroma .n,.chroma .nd,.chroma .ni,.chroma .nl{color:rgba(var(--color-secondary-900),1);&:is(.dark *) { color:rgba(var(--color-secondary-200),1); }}.chroma .na,.chroma .nb,.chroma .bp,.chroma .nx,.chroma .py,.chroma .nt{color:rgba(var(--color-secondary-800),1);&:is(.dark *) { color:rgba(var(--color-secondary-300),1); }}.chroma .no,.chroma .ne,.chroma .vg{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:rgba(var(--color-secondary-400),1);&:is(.dark *) { color:rgba(var(--color-secondary-500),1); }}.chroma .nf{color:rgba(var(--color-secondary-600),1);&:is(.dark *) { color:rgba(var(--color-secondary-500),1); }}.chroma .l,.chroma .ld,.chroma .s,.chroma .sa,.chroma .sb,.chroma .sc,.chroma .dl,.chroma .sd,.chroma .s2,.chroma .sh,.chroma .si,.chroma .sx,.chroma .s1,.chroma .gi,.chroma .go,.chroma .gp{color:rgba(var(--color-primary-800),1);&:is(.dark *) { color:rgba(var(--color-primary-400),1); }}.chroma .se{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:rgba(var(--color-secondary-400),1);&:is(.dark *) { color:rgba(var(--color-secondary-500),1); }}.chroma .sr,.chroma .ss{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:rgba(var(--color-primary-800),1);&:is(.dark *) { color:rgba(var(--color-primary-400),1); }}.chroma .ow{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:rgba(var(--color-primary-400),1);&:is(.dark *) { color:rgba(var(--color-primary-600),1); }}.chroma .c,.chroma .cm,.chroma .c1,.chroma .cs,.chroma .cp,.chroma .cpf{color:rgba(var(--color-neutral-500),1);font-style:italic;&:is(.dark *) { color:rgba(var(--color-neutral-400),1); }}.chroma .ch{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:rgba(var(--color-neutral-500),1);font-style:italic;&:is(.dark *) { color:rgba(var(--color-neutral-400),1); }}.chroma .ge{font-style:italic}.chroma .gh{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:rgba(var(--color-neutral-500),1)}.chroma .gs{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.chroma .gu,.chroma .gt{color:rgba(var(--color-neutral-500),1)}.chroma .gl{text-decoration-line:underline}.a11y-panel-enter-active{animation:slideInFromTop .3s cubic-bezier(.4,0,.2,1)forwards}.a11y-panel-leave-active{animation:slideOutToTop .3s cubic-bezier(.4,0,.2,1)forwards}.ios-toggle{position:relative;width:42px;height:24px;background:#e5e5e5;border-radius:12px;cursor:pointer;transition:background-color .3s ease;pointer-events:auto}.ios-toggle input{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer;z-index:1}.ios-toggle::after{content:"";position:absolute;top:2px;left:2px;width:20px;height:20px;background:#fff;border-radius:50%;transition:transform .3s ease,background-color .3s ease;box-shadow:0 1px 3px rgba(0,0,0,.2);z-index:0}.ios-toggle input:checked+.toggle-track::after{transform:translateX(18px)}.ios-toggle input:checked+.toggle-track{background:rgba(var(--color-primary-500),1)}.ios-toggle input:checked~.ios-toggle-ball{transform:translateX(18px)}.ios-toggle.is-checked{background:rgba(var(--color-primary-500),1)}.ios-toggle:has(input:checked){background:rgba(var(--color-primary-500),1)}.ios-toggle:has(input:checked)::after{transform:translateX(18px)}.dark .ios-toggle{background:#404040}.dark .ios-toggle::after{background:#f5f5f5}@layer theme,base,components,utilities;@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", + "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", + "Courier New", monospace;--spacing:0.25rem;--container-2xs:18rem;--container-xs:20rem;--container-xl:36rem;--container-3xl:48rem;--container-7xl:80rem;--text-xs:0.75rem;--text-xs--line-height:calc(1 / 0.75);--text-sm:0.875rem;--text-sm--line-height:calc(1.25 / 0.875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-normal:0em;--leading-snug:1.375;--radius-md:0.375rem;--radius-lg:0.5rem;--radius-xl:0.75rem;--radius-2xl:1rem;--ease-in:cubic-bezier(0.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, 0.2, 1);--ease-in-out:cubic-bezier(0.4, 0, 0.2, 1);--animate-pulse:pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;--blur-sm:8px;--blur-2xl:40px;--default-transition-duration:150ms;--default-transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::after,::before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;tab-size:4;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}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;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:initial;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports(not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::placeholder{color:currentcolor;@supports(color:color-mix(in lab,red,red)){color: color-mix(in oklab,currentcolor 50%,transparent);}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.\!visible{visibility:visible!important}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border-width:0}.\!absolute{position:absolute!important}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.-start-6{inset-inline-start:calc(var(--spacing) * -6)}.start-\[calc\(max\(-50vw\,-800px\)\+50\%\)\]{inset-inline-start:calc(max(-50vw,-800px) + 50%)}.end-6{inset-inline-end:calc(var(--spacing) * 6)}.top-0{top:calc(var(--spacing) * 0)}.top-1\/2{top:calc(1/2 * 100%)}.top-20{top:calc(var(--spacing) * 20)}.right-0{right:calc(var(--spacing) * 0)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-6{bottom:calc(var(--spacing) * 6)}.bottom-24{bottom:calc(var(--spacing) * 24)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:calc(1/2 * 100%)}.-z-10{z-index:calc(10 * -1)}.z-2{z-index:2}.z-10{z-index:10}.z-30{z-index:30}.z-50{z-index:50}.z-80{z-index:80}.z-100{z-index:100}.z-500{z-index:500}.z-\[1\]{z-index:1}.z-\[999\]{z-index:999}.z-\[1040\]{z-index:1040}.z-\[1070\]{z-index:1070}.z-\[1080\]{z-index:1080}.order-first{order:-9999}.float-left{float:left}.container{width:100%;@media(width >= 640px){max-width: 640px;}@media(width >= 853px){max-width: 853px;}@media(width >= 1024px){max-width: 1024px;}@media(width >= 1280px){max-width: 1280px;}@media(width >= 1536px){max-width: 1536px;}}.\!-m-px{margin:-1px!important}.m-0{margin:calc(var(--spacing) * 0)}.m-1{margin:calc(var(--spacing) * 1)}.m-2{margin:calc(var(--spacing) * 2)}.m-300{margin:calc(var(--spacing) * 300)}.m-auto{margin:auto}.-mx-2{margin-inline:calc(var(--spacing) * -2)}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-\[3px\]{margin-inline:3px}.mx-\[15\%\]{margin-inline:15%}.mx-auto{margin-inline:auto}.-my-2{margin-block:calc(var(--spacing) * -2)}.my-0{margin-block:calc(var(--spacing) * 0)}.my-3{margin-block:calc(var(--spacing) * 3)}.-ms-5{margin-inline-start:calc(var(--spacing) * -5)}.ms-0{margin-inline-start:calc(var(--spacing) * 0)}.ms-2{margin-inline-start:calc(var(--spacing) * 2)}.ms-6{margin-inline-start:calc(var(--spacing) * 6)}.-me-48{margin-inline-end:calc(var(--spacing) * -48)}.me-1{margin-inline-end:calc(var(--spacing) * 1)}.me-2{margin-inline-end:calc(var(--spacing) * 2)}.me-4{margin-inline-end:calc(var(--spacing) * 4)}.me-6{margin-inline-end:calc(var(--spacing) * 6)}.prose{color:var(--tw-prose-body);max-width:65ch; :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 1.25em; margin-bottom: 1.25em; } :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-top: 1.2em; margin-bottom: 1.2em; } :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-links); text-decoration: none; font-weight: 500; text-decoration-color: rgba(var(--color-primary-300), 1); &:hover { color: rgba(var(--color-primary-600), 1); text-decoration: none; border-radius: 0.09rem; } } :where(strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-bold); font-weight: 600; } :where(a strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(blockquote strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(thead th strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: decimal; margin-top: 1.25em; margin-bottom: 1.25em; padding-inline-start: 1.625em; } :where(ol[type="A"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: upper-alpha; } :where(ol[type="a"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: lower-alpha; } :where(ol[type="A" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: upper-alpha; } :where(ol[type="a" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: lower-alpha; } :where(ol[type="I"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: upper-roman; } :where(ol[type="i"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: lower-roman; } :where(ol[type="I" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: upper-roman; } :where(ol[type="i" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: lower-roman; } :where(ol[type="1"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: decimal; } :where(ul):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: disc; margin-top: 1.25em; margin-bottom: 1.25em; padding-inline-start: 1.625em; } :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *))::marker { font-weight: 400; color: var(--tw-prose-counters); } :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *))::marker { color: var(--tw-prose-bullets); } :where(dt):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-headings); font-weight: 600; margin-top: 1.25em; } :where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)) { border-color: var(--tw-prose-hr); border-top-width: 1px; margin-top: 3em; margin-bottom: 3em; } :where(blockquote):not(:where([class~="not-prose"],[class~="not-prose"] *)) { font-weight: 500; font-style: italic; color: var(--tw-prose-quotes); border-inline-start-width: 0.25rem; border-inline-start-color: var(--tw-prose-quote-borders); quotes: "\201C""\201D""\2018""\2019"; margin-top: 1.6em; margin-bottom: 1.6em; padding-inline-start: 1em; } :where(blockquote p:first-of-type):not(:where([class~="not-prose"],[class~="not-prose"] *))::before { content: open-quote; } :where(blockquote p:last-of-type):not(:where([class~="not-prose"],[class~="not-prose"] *))::after { content: close-quote; } :where(h1):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-headings); font-weight: 800; font-size: 2.25em; margin-top: 0; margin-bottom: 0.8888889em; line-height: 1.1111111; } :where(h1 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { font-weight: 900; color: inherit; } :where(h2):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-headings); font-weight: 700; font-size: 1.5em; margin-top: 2em; margin-bottom: 1em; line-height: 1.3333333; } :where(h2 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { font-weight: 800; color: inherit; } :where(h3):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-headings); font-weight: 600; font-size: 1.25em; margin-top: 1.6em; margin-bottom: 0.6em; line-height: 1.6; } :where(h3 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { font-weight: 700; color: inherit; } :where(h4):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-headings); font-weight: 600; margin-top: 1.5em; margin-bottom: 0.5em; line-height: 1.5; } :where(h4 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { font-weight: 700; color: inherit; } :where(img):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 2em; margin-bottom: 2em; } :where(picture):not(:where([class~="not-prose"],[class~="not-prose"] *)) { display: block; margin-top: 2em; margin-bottom: 2em; } :where(video):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 2em; margin-bottom: 2em; } :where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)) { font-weight: 600; font-family: inherit; color: var(--tw-prose-kbd); box-shadow: 0 0 0 1px var(--tw-prose-kbd-shadows), 0 3px 0 var(--tw-prose-kbd-shadows); font-size: 0.9rem; border-radius: 0.25rem; padding-top: 0.1875em; padding-inline-end: 0.375em; padding-bottom: 0.1875em; padding-inline-start: 0.375em; background-color: rgba(var(--color-neutral-200), 1); padding: 0.1rem 0.4rem; } :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-code); font-weight: 600; font-size: 0.875em; background-color: rgba(var(--color-neutral-50), 1); padding-top: 3px; padding-bottom: 3px; padding-left: 5px; padding-right: 5px; border-radius: 0.25rem; } :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *))::before { content: "`"; display: none; } :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *))::after { content: "`"; display: none; } :where(a code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-code); } :where(h1 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(h2 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; font-size: 0.875em; } :where(h3 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; font-size: 0.9em; } :where(h4 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(blockquote code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(thead th code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(pre):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-pre-code); background-color: var(--tw-prose-pre-bg); overflow-x: auto; font-weight: 400; font-size: 0.875em; line-height: 1.7142857; margin-top: 1.7142857em; margin-bottom: 1.7142857em; border-radius: 0.375rem; padding-top: 0.8571429em; padding-inline-end: 1.1428571em; padding-bottom: 0.8571429em; padding-inline-start: 1.1428571em; } :where(pre code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { background-color: transparent; border-width: 0; border-radius: 0; padding: 0; font-weight: inherit; color: inherit; font-size: inherit; font-family: inherit; line-height: inherit; } :where(pre code):not(:where([class~="not-prose"],[class~="not-prose"] *))::before { content: none; } :where(pre code):not(:where([class~="not-prose"],[class~="not-prose"] *))::after { content: none; } :where(table):not(:where([class~="not-prose"],[class~="not-prose"] *)) { width: 100%; table-layout: auto; margin-top: 2em; margin-bottom: 2em; font-size: 0.875em; line-height: 1.7142857; } :where(thead):not(:where([class~="not-prose"],[class~="not-prose"] *)) { border-bottom-width: 1px; border-bottom-color: var(--tw-prose-th-borders); } :where(thead th):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-headings); font-weight: 600; vertical-align: bottom; padding-inline-end: 0.5714286em; padding-bottom: 0.5714286em; padding-inline-start: 0.5714286em; } :where(tbody tr):not(:where([class~="not-prose"],[class~="not-prose"] *)) { border-bottom-width: 1px; border-bottom-color: var(--tw-prose-td-borders); } :where(tbody tr:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { border-bottom-width: 0; } :where(tbody td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { vertical-align: baseline; } :where(tfoot):not(:where([class~="not-prose"],[class~="not-prose"] *)) { border-top-width: 1px; border-top-color: var(--tw-prose-th-borders); } :where(tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { vertical-align: top; } :where(th, td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-align: start; } :where(figure > *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; margin-bottom: 0; } :where(figcaption):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-captions); font-size: 0.875em; line-height: 1.4285714; margin-top: 0.8571429em; } --tw-prose-body: rgba(var(--color-neutral-700), 1);--tw-prose-headings:rgba(var(--color-neutral-800), 1);--tw-prose-lead:rgba(var(--color-neutral-500), 1);--tw-prose-links:rgba(var(--color-primary-600), 1);--tw-prose-bold:rgba(var(--color-neutral-900), 1);--tw-prose-counters:rgba(var(--color-neutral-800), 1);--tw-prose-bullets:rgba(var(--color-neutral-500), 1);--tw-prose-hr:rgba(var(--color-neutral-200), 1);--tw-prose-quotes:rgba(var(--color-neutral-700), 1);--tw-prose-quote-borders:rgba(var(--color-primary-200), 1);--tw-prose-captions:rgba(var(--color-neutral-500), 1);--tw-prose-kbd:oklch(21% 0.034 264.665);--tw-prose-kbd-shadows:color-mix(in oklab, oklch(21% 0.034 264.665) 10%, transparent);--tw-prose-code:rgba(var(--color-secondary-700), 1);--tw-prose-pre-code:rgba(var(--color-neutral-700), 1);--tw-prose-pre-bg:rgba(var(--color-neutral-50), 1);--tw-prose-th-borders:rgba(var(--color-neutral-500), 1);--tw-prose-td-borders:rgba(var(--color-neutral-300), 1);--tw-prose-invert-body:rgba(var(--color-neutral-300), 1);--tw-prose-invert-headings:rgba(var(--color-neutral-50), 1);--tw-prose-invert-lead:rgba(var(--color-neutral-500), 1);--tw-prose-invert-links:rgba(var(--color-primary-400), 1);--tw-prose-invert-bold:rgba(var(--color-neutral), 1);--tw-prose-invert-counters:rgba(var(--color-neutral-400), 1);--tw-prose-invert-bullets:rgba(var(--color-neutral-600), 1);--tw-prose-invert-hr:rgba(var(--color-neutral-500), 1);--tw-prose-invert-quotes:rgba(var(--color-neutral-200), 1);--tw-prose-invert-quote-borders:rgba(var(--color-primary-900), 1);--tw-prose-invert-captions:rgba(var(--color-neutral-400), 1);--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:rgb(255 255 255 / 10%);--tw-prose-invert-code:rgba(var(--color-secondary-400), 1);--tw-prose-invert-pre-code:rgba(var(--color-neutral-200), 1);--tw-prose-invert-pre-bg:rgba(var(--color-neutral-700), 1);--tw-prose-invert-th-borders:rgba(var(--color-neutral-500), 1);--tw-prose-invert-td-borders:rgba(var(--color-neutral-700), 1);font-size:1rem;line-height:1.75; :where(picture > img):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; margin-bottom: 0; } :where(li):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0.5em; margin-bottom: 0.5em; } :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-inline-start: 0.375em; } :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-inline-start: 0.375em; } :where(.prose > ul > li p):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0.75em; margin-bottom: 0.75em; } :where(.prose > ul > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 1.25em; } :where(.prose > ul > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-bottom: 1.25em; } :where(.prose > ol > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 1.25em; } :where(.prose > ol > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-bottom: 1.25em; } :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0.75em; margin-bottom: 0.75em; } :where(dl):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 1.25em; margin-bottom: 1.25em; } :where(dd):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0.5em; padding-inline-start: 1.625em; } :where(hr + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; } :where(h2 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; } :where(h3 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; } :where(h4 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; } :where(thead th:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-inline-start: 0; } :where(thead th:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-inline-end: 0; } :where(tbody td, tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-top: 0.5714286em; padding-inline-end: 0.5714286em; padding-bottom: 0.5714286em; padding-inline-start: 0.5714286em; } :where(tbody td:first-child, tfoot td:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-inline-start: 0; } :where(tbody td:last-child, tfoot td:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-inline-end: 0; } :where(figure):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 2em; margin-bottom: 2em; } :where(.prose > :first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; } :where(.prose > :last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-bottom: 0; } :where(mark):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: rgba(var(--color-neutral-800), 1); background-color: rgba(var(--color-primary-600), 1); padding: 0.1rem 0.2rem; border-radius: 0.25rem; } :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *))::before { display: none; } :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *))::after { display: none; } :where(a.active):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color: rgba(var(--color-primary-600), 1); } :where(p.active):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color: rgba(var(--color-primary-600), 1); }}.\!mt-0{margin-top:calc(var(--spacing) * 0)!important}.-mt-\[2px\]{margin-top:calc(2px * -1)}.-mt-\[15px\]{margin-top:calc(15px * -1)}.mt-0{margin-top:calc(var(--spacing) * 0)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-20{margin-top:calc(var(--spacing) * 20)}.mt-\[0\.5rem\]{margin-top:.5rem}.-mr-\[100\%\]{margin-right:calc(100% * -1)}.mr-0{margin-right:calc(var(--spacing) * 0)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mr-5{margin-right:calc(var(--spacing) * 5)}.\!mb-0{margin-bottom:calc(var(--spacing) * 0)!important}.\!mb-9{margin-bottom:calc(var(--spacing) * 9)!important}.-mb-1{margin-bottom:calc(var(--spacing) * -1)}.mb-0{margin-bottom:calc(var(--spacing) * 0)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.mb-20{margin-bottom:calc(var(--spacing) * 20)}.mb-\[2px\]{margin-bottom:2px}.ml-0{margin-left:calc(var(--spacing) * 0)}.ml-2{margin-left:calc(var(--spacing) * 2)}.box-border{box-sizing:border-box}.box-content{box-sizing:content-box}.scrollbar{&::-webkit-scrollbar-track { background-color:var(--scrollbar-track); border-radius:var(--scrollbar-track-radius); } &::-webkit-scrollbar-thumb { background-color:var(--scrollbar-thumb); border-radius:var(--scrollbar-thumb-radius); } &::-webkit-scrollbar-corner { background-color:var(--scrollbar-corner); border-radius:var(--scrollbar-corner-radius); } @supports (-moz-appearance:none) { scrollbar-width:auto; scrollbar-color:var(--scrollbar-thumb,initial) var(--scrollbar-track,initial); } &::-webkit-scrollbar { display:block; width:var(--scrollbar-width,16px); height:var(--scrollbar-height,16px); }}.scrollbar-thin{&::-webkit-scrollbar-track { background-color:var(--scrollbar-track); border-radius:var(--scrollbar-track-radius); } &::-webkit-scrollbar-thumb { background-color:var(--scrollbar-thumb); border-radius:var(--scrollbar-thumb-radius); } &::-webkit-scrollbar-corner { background-color:var(--scrollbar-corner); border-radius:var(--scrollbar-corner-radius); } @supports (-moz-appearance:none) { scrollbar-width:thin; scrollbar-color:var(--scrollbar-thumb,initial) var(--scrollbar-track,initial); } &::-webkit-scrollbar { display:block; width:8px; height:8px; }}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.\!block{display:block!important}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.table{display:table}.table-cell{display:table-cell}.size-1{width:calc(var(--spacing) * 1);height:calc(var(--spacing) * 1)}.\!h-px{height:1px!important}.h-0{height:calc(var(--spacing) * 0)}.h-1\/2{height:calc(1/2 * 100%)}.h-3{height:calc(var(--spacing) * 3)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-12{height:calc(var(--spacing) * 12)}.h-24{height:calc(var(--spacing) * 24)}.h-36{height:calc(var(--spacing) * 36)}.h-40{height:calc(var(--spacing) * 40)}.h-48{height:calc(var(--spacing) * 48)}.h-84{height:calc(var(--spacing) * 84)}.h-\[3px\]{height:3px}.h-\[150px\]{height:150px}.h-\[800px\]{height:800px}.h-\[1000px\]{height:1e3px}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.max-h-3{max-height:calc(var(--spacing) * 3)}.max-h-\[5rem\]{max-height:5rem}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[130px\]{min-height:130px}.min-h-\[148px\]{min-height:148px}.min-h-full{min-height:100%}.\!w-px{width:1px!important}.w-0{width:calc(var(--spacing) * 0)}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-12{width:calc(var(--spacing) * 12)}.w-24{width:calc(var(--spacing) * 24)}.w-36{width:calc(var(--spacing) * 36)}.w-80{width:calc(var(--spacing) * 80)}.w-\[15\%\]{width:15%}.w-\[30px\]{width:30px}.w-auto{width:auto}.w-full{width:100%}.w-screen{width:100vw}.max-w-3xl{max-width:var(--container-3xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[5rem\]{max-width:5rem}.max-w-\[200px\]{max-width:200px}.max-w-\[267px\]{max-width:267px}.max-w-\[1600px\]{max-width:1600px}.max-w-\[calc\(100\%-1rem\)\]{max-width:calc(100% - 1rem)}.max-w-fit{max-width:fit-content}.max-w-full{max-width:100%}.max-w-prose{max-width:65ch}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[1\.8rem\]{min-width:1.8rem}.min-w-\[30px\]{min-width:30px}.min-w-\[220px\]{min-width:220px}.min-w-full{min-width:100%}.flex-1{flex:1}.flex-auto{flex:auto}.flex-initial{flex:0 auto}.flex-none{flex:none}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-auto{flex-basis:auto}.-translate-x-1\/2{--tw-translate-x:calc(calc(1/2 * 100%) * -1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-full{--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1/2 * 100%) * -1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-8{--tw-translate-y:calc(var(--spacing) * -8);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-0{--tw-translate-y:calc(var(--spacing) * 0);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-4{--tw-translate-y:calc(var(--spacing) * 4);translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-\[1\.02\]{scale:1.02}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.transform\!{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)!important}.transform-none{transform:none}.animate-pulse{animation:var(--animate-pulse)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.touch-pan-y{--tw-pan-y:pan-y;touch-action:var(--tw-pan-x,)var(--tw-pan-y,)var(--tw-pinch-zoom,)}.touch-none{touch-action:none}.resize{resize:both}.list-none{list-style-type:none}.appearance-none{appearance:none}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-4{gap:calc(var(--spacing) * 4)}.space-y-2{ :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse))); }}.space-y-3{ :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse))); }}.space-y-5{ :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse))); }}.space-y-10{ :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse))); }}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-5{column-gap:calc(var(--spacing) * 5)}.space-x-2{ :where(& > :not(:last-child)) { --tw-space-x-reverse: 0; margin-inline-start: calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse)); margin-inline-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse))); }}.space-x-3{ :where(& > :not(:last-child)) { --tw-space-x-reverse: 0; margin-inline-start: calc(calc(var(--spacing) * 3) * var(--tw-space-x-reverse)); margin-inline-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-x-reverse))); }}.space-x-5{ :where(& > :not(:last-child)) { --tw-space-x-reverse: 0; margin-inline-start: calc(calc(var(--spacing) * 5) * var(--tw-space-x-reverse)); margin-inline-end: calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-x-reverse))); }}.place-self-center{place-self:center}.self-center{align-self:center}.\!overflow-hidden{overflow:hidden!important}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.scroll-smooth{scroll-behavior:smooth}.\!rounded-md{border-radius:var(--radius-md)!important}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[50\%\]{border-radius:50%}.rounded-full{border-radius:calc(infinity * 1px)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-s-\[0\.25rem\]{border-start-start-radius:.25rem;border-end-start-radius:.25rem}.rounded-e-\[0\.25rem\]{border-start-end-radius:.25rem;border-end-end-radius:.25rem}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-b-lg{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.\!border-0{border-style:var(--tw-border-style)!important;border-width:0!important}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-y-\[10px\]{border-block-style:var(--tw-border-style);border-block-width:10px}.border-s-0{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.border-s-1{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-s-2{border-inline-start-style:var(--tw-border-style);border-inline-start-width:2px}.border-s-\[0\.125rem\]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:.125rem}.border-e-0{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-solid{--tw-border-style:solid;border-style:solid}.border-neutral-100{border-color:rgba(var(--color-neutral-100),1)}.border-neutral-200{border-color:rgba(var(--color-neutral-200),1)}.border-neutral-300{border-color:rgba(var(--color-neutral-300),1)}.border-primary-400{border-color:rgba(var(--color-primary-400),1)}.border-primary-500{border-color:rgba(var(--color-primary-500),1)}.border-secondary-500{border-color:rgba(var(--color-secondary-500),1)}.border-transparent{border-color:transparent}.prose-invert{--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-kbd:var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows:var(--tw-prose-invert-kbd-shadows);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders); :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color: rgba(var(--color-neutral-600), 1); &:hover { color: rgba(var(--color-primary-400), 1); } } :where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: rgba(var(--color-neutral-200), 1); background-color: rgba(var(--color-neutral-700), 1); } :where(mark):not(:where([class~="not-prose"],[class~="not-prose"] *)) { background-color: rgba(var(--color-primary-400), 1); } :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { background-color: rgba(var(--color-neutral-700), 1); } :where(a.active):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color: rgba(var(--color-primary-400), 1); } :where(p.active):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color: rgba(var(--color-primary-400), 1); }}.bg-\[\#6d6d6d\]{background-color:#6d6d6d}.bg-black{background-color:#000}.bg-neutral{background-color:rgba(var(--color-neutral),1)}.bg-neutral-50{background-color:rgba(var(--color-neutral-50),1)}.bg-neutral-100{background-color:rgba(var(--color-neutral-100),1)}.bg-neutral-100\/50{background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral-100),1),1) 50%,transparent);@supports(color:color-mix(in lab,red,red)){background-color: color-mix(in oklab,rgba(var(--color-neutral-100),1) 50%,transparent);}}.bg-neutral-300{background-color:rgba(var(--color-neutral-300),1)}.bg-neutral-500\/50{background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral-500),1),1) 50%,transparent);@supports(color:color-mix(in lab,red,red)){background-color: color-mix(in oklab,rgba(var(--color-neutral-500),1) 50%,transparent);}}.bg-neutral\/50{background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral),1),1) 50%,transparent);@supports(color:color-mix(in lab,red,red)){background-color: color-mix(in oklab,rgba(var(--color-neutral),1) 50%,transparent);}}.bg-primary-100{background-color:rgba(var(--color-primary-100),1)}.bg-primary-200{background-color:rgba(var(--color-primary-200),1)}.bg-primary-500{background-color:rgba(var(--color-primary-500),1)}.bg-primary-600{background-color:rgba(var(--color-primary-600),1)}.bg-transparent{background-color:initial}.bg-white{background-color:#fff}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-none{background-image:none}.from-neutral{--tw-gradient-from:rgba(var(--color-neutral), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-primary-500{--tw-gradient-from:rgba(var(--color-primary-500), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-60\%{--tw-gradient-from-position:60%}.to-neutral{--tw-gradient-to:rgba(var(--color-neutral), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-neutral-100{--tw-gradient-to:rgba(var(--color-neutral-100), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-secondary-600{--tw-gradient-to:rgba(var(--color-secondary-600), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-clip-padding{background-clip:padding-box}.object-cover{object-fit:cover}.object-scale-down{object-fit:scale-down}.object-left{object-position:left}.\!p-0{padding:calc(var(--spacing) * 0)!important}.p-0{padding:calc(var(--spacing) * 0)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-0{padding-inline:calc(var(--spacing) * 0)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-\[0\.4rem\]{padding-inline:.4rem}.px-\[30px\]{padding-inline:30px}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-\[0\.4rem\]{padding-block:.4rem}.py-\[1px\]{padding-block:1px}.ps-2{padding-inline-start:calc(var(--spacing) * 2)}.ps-5{padding-inline-start:calc(var(--spacing) * 5)}.pe-2{padding-inline-end:calc(var(--spacing) * 2)}.pe-3{padding-inline-end:calc(var(--spacing) * 3)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pt-16{padding-top:calc(var(--spacing) * 16)}.pt-\[2px\]{padding-top:2px}.pt-\[5px\]{padding-top:5px}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-32{padding-bottom:calc(var(--spacing) * 32)}.pb-\[3px\]{padding-bottom:3px}.pl-0{padding-left:calc(var(--spacing) * 0)}.text-center{text-align:center}.text-end{text-align:end}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.-indent-\[999px\]{text-indent:calc(999px * -1)}.align-bottom{vertical-align:bottom}.align-middle{vertical-align:middle}.align-text-bottom{vertical-align:text-bottom}.align-top{vertical-align:top}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.6rem\]{font-size:.6rem}.leading-3{--tw-leading:calc(var(--spacing) * 3);line-height:calc(var(--spacing) * 3)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.text-wrap{text-wrap:wrap}.break-normal{overflow-wrap:normal;word-break:normal}.break-words{overflow-wrap:break-word}.\!whitespace-nowrap{white-space:nowrap!important}.whitespace-normal{white-space:normal}.\!text-neutral{color:rgba(var(--color-neutral),1)!important}.text-neutral-50{color:rgba(var(--color-neutral-50),1)}.text-neutral-200{color:rgba(var(--color-neutral-200),1)}.text-neutral-300{color:rgba(var(--color-neutral-300),1)}.text-neutral-400{color:rgba(var(--color-neutral-400),1)}.text-neutral-500{color:rgba(var(--color-neutral-500),1)}.text-neutral-700{color:rgba(var(--color-neutral-700),1)}.text-neutral-800{color:rgba(var(--color-neutral-800),1)}.text-neutral-900{color:rgba(var(--color-neutral-900),1)}.text-primary-100{color:rgba(var(--color-primary-100),1)}.text-primary-300{color:rgba(var(--color-primary-300),1)}.text-primary-400{color:rgba(var(--color-primary-400),1)}.text-primary-500{color:rgba(var(--color-primary-500),1)}.text-primary-600{color:rgba(var(--color-primary-600),1)}.text-primary-700{color:rgba(var(--color-primary-700),1)}.text-primary-800{color:rgba(var(--color-primary-800),1)}.text-transparent{color:transparent}.text-white{color:#fff}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.\!no-underline{text-decoration-line:none!important}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.decoration-neutral-300{text-decoration-color:rgba(var(--color-neutral-300),1)}.decoration-primary-500{text-decoration-color:rgba(var(--color-primary-500),1)}.underline-offset-auto{text-underline-offset:auto}.\!opacity-0{opacity:0%!important}.\!opacity-100{opacity:100%!important}.opacity-0{opacity:0%}.opacity-30{opacity:30%}.opacity-50{opacity:50%}.opacity-60{opacity:60%}.opacity-65{opacity:65%}.opacity-100{opacity:100%}.mix-blend-multiply{mix-blend-mode:multiply}.mix-blend-normal{mix-blend-mode:normal}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur\!{--tw-blur:blur(8px) !important;filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)!important}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter\!{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)!important}.backdrop-blur{--tw-backdrop-blur:blur(8px);-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,)}.backdrop-blur-2xl{--tw-backdrop-blur:blur(var(--blur-2xl));-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,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-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,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[height\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,_opacity\]{transition-property:transform,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:150ms;transition-duration:150ms}.duration-200{--tw-duration:200ms;transition-duration:200ms}.duration-300{--tw-duration:300ms;transition-duration:300ms}.duration-\[350ms\]{--tw-duration:350ms;transition-duration:350ms}.duration-\[600ms\]{--tw-duration:600ms;transition-duration:600ms}.ease-\[cubic-bezier\(0\,0\,0\.15\,1\)\,_cubic-bezier\(0\,0\,0\.15\,1\)\]{--tw-ease:cubic-bezier(0,0,0.15,1), cubic-bezier(0,0,0.15,1);transition-timing-function:cubic-bezier(0,0,.15,1),cubic-bezier(0,0,.15,1)}.ease-\[cubic-bezier\(0\.25\,0\.1\,0\.25\,1\.0\)\]{--tw-ease:cubic-bezier(0.25,0.1,0.25,1.0);transition-timing-function:cubic-bezier(.25,.1,.25,1)}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}.\!\[clip\:rect\(0\,0\,0\,0\)\]{clip:rect(0,0,0,0)!important}.scrollbar-thumb-neutral-400{--scrollbar-thumb:oklch(70.8% 0 0)}.scrollbar-track-neutral-200{--scrollbar-track:oklch(92.2% 0 0)}.group-hover\:text-primary-300{&:is(:where(.group):hover *) { @media (hover:hover) { color:rgba(var(--color-primary-300),1); } }}.group-hover\:opacity-100{&:is(:where(.group):hover *) { @media (hover:hover) { opacity:100%; } }}.group-data-\[twe-input-focused\]\:border-x-0{&:is(:where(.group)[data-twe-input-focused] *) { border-inline-style:var(--tw-border-style); border-inline-width:0px; }}.group-data-\[twe-input-focused\]\:border-s-0{&:is(:where(.group)[data-twe-input-focused] *) { border-inline-start-style:var(--tw-border-style); border-inline-start-width:0px; }}.group-data-\[twe-input-focused\]\:border-e-0{&:is(:where(.group)[data-twe-input-focused] *) { border-inline-end-style:var(--tw-border-style); border-inline-end-width:0px; }}.group-data-\[twe-input-focused\]\:border-t{&:is(:where(.group)[data-twe-input-focused] *) { border-top-style:var(--tw-border-style); border-top-width:1px; }}.group-data-\[twe-input-focused\]\:border-solid{&:is(:where(.group)[data-twe-input-focused] *) { --tw-border-style:solid; border-style:solid; }}.group-data-\[twe-input-focused\]\:border-white{&:is(:where(.group)[data-twe-input-focused] *) { border-color:#fff; }}.group-data-\[twe-input-focused\]\:border-t-transparent{&:is(:where(.group)[data-twe-input-focused] *) { border-top-color:transparent; }}.group-data-\[twe-input-focused\]\:shadow-white{&:is(:where(.group)[data-twe-input-focused] *) { --tw-shadow-color:#fff; @supports (color:color-mix(in lab,red,red)) { --tw-shadow-color:color-mix(in oklab,#fff var(--tw-shadow-alpha),transparent); } }}.group-data-\[twe-input-state-active\]\:border-x-0{&:is(:where(.group)[data-twe-input-state-active] *) { border-inline-style:var(--tw-border-style); border-inline-width:0px; }}.group-data-\[twe-input-state-active\]\:border-s-0{&:is(:where(.group)[data-twe-input-state-active] *) { border-inline-start-style:var(--tw-border-style); border-inline-start-width:0px; }}.group-data-\[twe-input-state-active\]\:border-e-0{&:is(:where(.group)[data-twe-input-state-active] *) { border-inline-end-style:var(--tw-border-style); border-inline-end-width:0px; }}.group-data-\[twe-input-state-active\]\:border-t{&:is(:where(.group)[data-twe-input-state-active] *) { border-top-style:var(--tw-border-style); border-top-width:1px; }}.group-data-\[twe-input-state-active\]\:border-solid{&:is(:where(.group)[data-twe-input-state-active] *) { --tw-border-style:solid; border-style:solid; }}.group-data-\[twe-input-state-active\]\:border-t-transparent{&:is(:where(.group)[data-twe-input-state-active] *) { border-top-color:transparent; }}.before\:absolute{&::before { content:var(--tw-content); position:absolute; }}.before\:inset-0{&::before { content:var(--tw-content); inset:calc(var(--spacing) * 0); }}.after\:clear-both{&::after { content:var(--tw-content); clear:both; }}.after\:block{&::after { content:var(--tw-content); display:block; }}.after\:content-\[\'\'\]{&::after { --tw-content:''; content:var(--tw-content); }}.first\:mt-8{&:first-child { margin-top:calc(var(--spacing) * 8); }}.empty\:hidden{&:empty { display:none; }}.hover\:border-transparent{&:hover { @media (hover:hover) { border-color:transparent; } }}.hover\:\!bg-primary-500{&:hover { @media (hover:hover) { background-color:rgba(var(--color-primary-500),1)!important; } }}.hover\:bg-primary-100{&:hover { @media (hover:hover) { background-color:rgba(var(--color-primary-100),1); } }}.hover\:bg-primary-500{&:hover { @media (hover:hover) { background-color:rgba(var(--color-primary-500),1); } }}.hover\:bg-primary-600{&:hover { @media (hover:hover) { background-color:rgba(var(--color-primary-600),1); } }}.hover\:text-neutral{&:hover { @media (hover:hover) { color:rgba(var(--color-neutral),1); } }}.hover\:text-neutral-700{&:hover { @media (hover:hover) { color:rgba(var(--color-neutral-700),1); } }}.hover\:text-primary-400{&:hover { @media (hover:hover) { color:rgba(var(--color-primary-400),1); } }}.hover\:text-primary-500{&:hover { @media (hover:hover) { color:rgba(var(--color-primary-500),1); } }}.hover\:text-primary-600{&:hover { @media (hover:hover) { color:rgba(var(--color-primary-600),1); } }}.hover\:text-primary-700{&:hover { @media (hover:hover) { color:rgba(var(--color-primary-700),1); } }}.hover\:no-underline{&:hover { @media (hover:hover) { text-decoration-line:none; } }}.hover\:underline{&:hover { @media (hover:hover) { text-decoration-line:underline; } }}.hover\:decoration-primary-400{&:hover { @media (hover:hover) { text-decoration-color:rgba(var(--color-primary-400),1); } }}.hover\:decoration-2{&:hover { @media (hover:hover) { text-decoration-thickness:2px; } }}.hover\:underline-offset-2{&:hover { @media (hover:hover) { text-underline-offset:2px; } }}.hover\:opacity-90{&:hover { @media (hover:hover) { opacity:90%; } }}.hover\:outline-none{&:hover { @media (hover:hover) { --tw-outline-style:none; outline-style:none; } }}.focus\:translate-y-0{&:focus { --tw-translate-y:calc(var(--spacing) * 0); translate:var(--tw-translate-x) var(--tw-translate-y); }}.focus\:border-primary-500{&:focus { border-color:rgba(var(--color-primary-500),1); }}.focus\:bg-primary-100{&:focus { background-color:rgba(var(--color-primary-100),1); }}.focus\:no-underline{&:focus { text-decoration-line:none; }}.focus\:opacity-90{&:focus { opacity:90%; }}.focus\:ring-primary-500{&:focus { --tw-ring-color:rgba(var(--color-primary-500),1); }}.focus\:outline-2{&:focus { outline-style:var(--tw-outline-style); outline-width:2px; }}.focus\:outline-transparent{&:focus { outline-color:transparent; }}.focus\:outline-dotted{&:focus { --tw-outline-style:dotted; outline-style:dotted; }}.focus\:outline-none{&:focus { --tw-outline-style:none; outline-style:none; }}.data-\[popper-reference-hidden\]\:hidden{&[data-popper-reference-hidden] { display: none; }}.data-\[twe-carousel-fade\]\:z-0{&[data-twe-carousel-fade] { z-index: 0; }}.data-\[twe-carousel-fade\]\:z-\[1\]{&[data-twe-carousel-fade] { z-index: 1; }}.data-\[twe-carousel-fade\]\:opacity-0{&[data-twe-carousel-fade] { opacity: 0%; }}.data-\[twe-carousel-fade\]\:opacity-100{&[data-twe-carousel-fade] { opacity: 100%; }}.data-\[twe-carousel-fade\]\:delay-600{&[data-twe-carousel-fade] { transition-delay: 600ms; }}.data-\[twe-carousel-fade\]\:duration-\[600ms\]{&[data-twe-carousel-fade] { --tw-duration: 600ms; transition-duration: 600ms; }}.motion-reduce\:transition-none{@media(prefers-reduced-motion:reduce){transition-property: none;}}.sm\:me-7{@media(width >= 640px){margin-inline-end: calc(var(--spacing) * 7);}}.sm\:mt-16{@media(width >= 640px){margin-top: calc(var(--spacing) * 16);}}.sm\:mb-0{@media(width >= 640px){margin-bottom: calc(var(--spacing) * 0);}}.sm\:w-1\/2{@media(width >= 640px){width: calc(1/2 * 100%);}}.sm\:grid-cols-2{@media(width >= 640px){grid-template-columns: repeat(2,minmax(0,1fr));}}.sm\:flex-row{@media(width >= 640px){flex-direction: row;}}.sm\:overflow-hidden{@media(width >= 640px){overflow: hidden;}}.sm\:p-6{@media(width >= 640px){padding: calc(var(--spacing) * 6);}}.sm\:px-6{@media(width >= 640px){padding-inline: calc(var(--spacing) * 6);}}.sm\:px-14{@media(width >= 640px){padding-inline: calc(var(--spacing) * 14);}}.sm\:py-24{@media(width >= 640px){padding-block: calc(var(--spacing) * 24);}}.sm\:text-lg{@media(width >= 640px){font-size: var(--text-lg); line-height: var(--tw-leading,var(--text-lg--line-height));}}.sm\:last\:me-0{@media(width >= 640px){&:last-child{margin-inline-end:calc(var(--spacing) * 0)}}}.md\:-me-16{@media(width >= 853px){margin-inline-end: calc(var(--spacing) * -16);}}.md\:mt-0{@media(width >= 853px){margin-top: calc(var(--spacing) * 0);}}.md\:mr-7{@media(width >= 853px){margin-right: calc(var(--spacing) * 7);}}.md\:ml-12{@media(width >= 853px){margin-left: calc(var(--spacing) * 12);}}.md\:flex{@media(width >= 853px){display: flex;}}.md\:hidden{@media(width >= 853px){display: none;}}.md\:h-56{@media(width >= 853px){height: calc(var(--spacing) * 56);}}.md\:h-\[200px\]{@media(width >= 853px){height: 200px;}}.md\:w-1\/3{@media(width >= 853px){width: calc(1/3 * 100%);}}.md\:w-auto{@media(width >= 853px){width: auto;}}.md\:grid-cols-3{@media(width >= 853px){grid-template-columns: repeat(3,minmax(0,1fr));}}.md\:flex-row{@media(width >= 853px){flex-direction: row;}}.md\:justify-start{@media(width >= 853px){justify-content: flex-start;}}.md\:p-\[10vh\]{@media(width >= 853px){padding: 10vh;}}.md\:px-24{@media(width >= 853px){padding-inline: calc(var(--spacing) * 24);}}.md\:pr-4{@media(width >= 853px){padding-right: calc(var(--spacing) * 4);}}.lg\:absolute{@media(width >= 1024px){position: absolute;}}.lg\:relative{@media(width >= 1024px){position: relative;}}.lg\:sticky{@media(width >= 1024px){position: sticky;}}.lg\:top-10{@media(width >= 1024px){top: calc(var(--spacing) * 10);}}.lg\:top-\[140px\]{@media(width >= 1024px){top: 140px;}}.lg\:order-last{@media(width >= 1024px){order: 9999;}}.lg\:m-0{@media(width >= 1024px){margin: calc(var(--spacing) * 0);}}.lg\:mx-0{@media(width >= 1024px){margin-inline: calc(var(--spacing) * 0);}}.lg\:mx-auto{@media(width >= 1024px){margin-inline: auto;}}.lg\:mt-0{@media(width >= 1024px){margin-top: calc(var(--spacing) * 0);}}.lg\:ml-auto{@media(width >= 1024px){margin-left: auto;}}.lg\:block{@media(width >= 1024px){display: block;}}.lg\:grid{@media(width >= 1024px){display: grid;}}.lg\:hidden{@media(width >= 1024px){display: none;}}.lg\:h-72{@media(width >= 1024px){height: calc(var(--spacing) * 72);}}.lg\:h-full{@media(width >= 1024px){height: 100%;}}.lg\:w-1\/4{@media(width >= 1024px){width: calc(1/4 * 100%);}}.lg\:w-auto{@media(width >= 1024px){width: auto;}}.lg\:max-w-2xs{@media(width >= 1024px){max-width: var(--container-2xs);}}.lg\:max-w-7xl{@media(width >= 1024px){max-width: var(--container-7xl);}}.lg\:max-w-none{@media(width >= 1024px){max-width: none;}}.lg\:max-w-xs{@media(width >= 1024px){max-width: var(--container-xs);}}.lg\:grid-flow-col-dense{@media(width >= 1024px){grid-auto-flow: column dense;}}.lg\:grid-cols-2{@media(width >= 1024px){grid-template-columns: repeat(2,minmax(0,1fr));}}.lg\:flex-row{@media(width >= 1024px){flex-direction: row;}}.lg\:gap-24{@media(width >= 1024px){gap: calc(var(--spacing) * 24);}}.lg\:p-\[12vh\]{@media(width >= 1024px){padding: 12vh;}}.lg\:px-0{@media(width >= 1024px){padding-inline: calc(var(--spacing) * 0);}}.lg\:px-8{@media(width >= 1024px){padding-inline: calc(var(--spacing) * 8);}}.lg\:px-32{@media(width >= 1024px){padding-inline: calc(var(--spacing) * 32);}}.lg\:py-16{@media(width >= 1024px){padding-block: calc(var(--spacing) * 16);}}.lg\:py-32{@media(width >= 1024px){padding-block: calc(var(--spacing) * 32);}}.lg\:ps-8{@media(width >= 1024px){padding-inline-start: calc(var(--spacing) * 8);}}.xl\:w-1\/4{@media(width >= 1280px){width: calc(1/4 * 100%);}}.xl\:grid-cols-4{@media(width >= 1280px){grid-template-columns: repeat(4,minmax(0,1fr));}}.\32 xl\:grid-cols-5{@media(width >= 1536px){grid-template-columns: repeat(5,minmax(0,1fr));}}.ltr\:-ml-12{&:where(:dir(ltr),[dir="ltr"],[dir="ltr"] *) { margin-left:calc(var(--spacing) * -12); }}.ltr\:block{&:where(:dir(ltr),[dir="ltr"],[dir="ltr"] *) { display:block; }}.ltr\:hidden{&:where(:dir(ltr),[dir="ltr"],[dir="ltr"] *) { display:none; }}.ltr\:inline{&:where(:dir(ltr),[dir="ltr"],[dir="ltr"] *) { display:inline; }}.rtl\:left-0{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { left:calc(var(--spacing) * 0); }}.rtl\:-mr-\[79px\]{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { margin-right:calc(79px * -1); }}.rtl\:block{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { display:block; }}.rtl\:hidden{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { display:none; }}.rtl\:rotate-180{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { rotate:180deg; }}.dark\:flex{&:is(.dark *) { display:flex; }}.dark\:hidden{&:is(.dark *) { display:none; }}.dark\:border-neutral-400{&:is(.dark *) { border-color:rgba(var(--color-neutral-400),1); }}.dark\:border-neutral-600{&:is(.dark *) { border-color:rgba(var(--color-neutral-600),1); }}.dark\:border-neutral-700{&:is(.dark *) { border-color:rgba(var(--color-neutral-700),1); }}.dark\:border-primary-300{&:is(.dark *) { border-color:rgba(var(--color-primary-300),1); }}.dark\:border-primary-600{&:is(.dark *) { border-color:rgba(var(--color-primary-600),1); }}.dark\:border-white\/10{&:is(.dark *) { border-color:color-mix(in oklab,#fff 10%,transparent); }}.dark\:prose-invert{&:is(.dark *) { --tw-prose-body:var(--tw-prose-invert-body); --tw-prose-headings:var(--tw-prose-invert-headings); --tw-prose-lead:var(--tw-prose-invert-lead); --tw-prose-links:var(--tw-prose-invert-links); --tw-prose-bold:var(--tw-prose-invert-bold); --tw-prose-counters:var(--tw-prose-invert-counters); --tw-prose-bullets:var(--tw-prose-invert-bullets); --tw-prose-hr:var(--tw-prose-invert-hr); --tw-prose-quotes:var(--tw-prose-invert-quotes); --tw-prose-quote-borders:var(--tw-prose-invert-quote-borders); --tw-prose-captions:var(--tw-prose-invert-captions); --tw-prose-kbd:var(--tw-prose-invert-kbd); --tw-prose-kbd-shadows:var(--tw-prose-invert-kbd-shadows); --tw-prose-code:var(--tw-prose-invert-code); --tw-prose-pre-code:var(--tw-prose-invert-pre-code); --tw-prose-pre-bg:var(--tw-prose-invert-pre-bg); --tw-prose-th-borders:var(--tw-prose-invert-th-borders); --tw-prose-td-borders:var(--tw-prose-invert-td-borders);:where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color:rgba(var(--color-neutral-600),1); &:hover { color:rgba(var(--color-primary-400),1); } }:where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color:rgba(var(--color-neutral-200),1); background-color:rgba(var(--color-neutral-700),1); }:where(mark):not(:where([class~="not-prose"],[class~="not-prose"] *)) { background-color:rgba(var(--color-primary-400),1); }:where(code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { background-color:rgba(var(--color-neutral-700),1); }:where(a.active):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color:rgba(var(--color-primary-400),1); }:where(p.active):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color:rgba(var(--color-primary-400),1); } }}.dark\:bg-neutral-400{&:is(.dark *) { background-color:rgba(var(--color-neutral-400),1); }}.dark\:bg-neutral-600{&:is(.dark *) { background-color:rgba(var(--color-neutral-600),1); }}.dark\:bg-neutral-700{&:is(.dark *) { background-color:rgba(var(--color-neutral-700),1); }}.dark\:bg-neutral-800{&:is(.dark *) { background-color:rgba(var(--color-neutral-800),1); }}.dark\:bg-neutral-800\/50{&:is(.dark *) { background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral-800),1),1) 50%,transparent); @supports (color:color-mix(in lab,red,red)) { background-color:color-mix(in oklab,rgba(var(--color-neutral-800),1) 50%,transparent); } }}.dark\:bg-neutral-900\/50{&:is(.dark *) { background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral-900),1),1) 50%,transparent); @supports (color:color-mix(in lab,red,red)) { background-color:color-mix(in oklab,rgba(var(--color-neutral-900),1) 50%,transparent); } }}.dark\:bg-primary-300{&:is(.dark *) { background-color:rgba(var(--color-primary-300),1); }}.dark\:bg-primary-400{&:is(.dark *) { background-color:rgba(var(--color-primary-400),1); }}.dark\:bg-primary-800{&:is(.dark *) { background-color:rgba(var(--color-primary-800),1); }}.dark\:bg-primary-900{&:is(.dark *) { background-color:rgba(var(--color-primary-900),1); }}.dark\:from-neutral-800{&:is(.dark *) { --tw-gradient-from:rgba(var(--color-neutral-800),1); --tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-to) var(--tw-gradient-to-position)); }}.dark\:from-primary-600{&:is(.dark *) { --tw-gradient-from:rgba(var(--color-primary-600),1); --tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-to) var(--tw-gradient-to-position)); }}.dark\:to-neutral-800{&:is(.dark *) { --tw-gradient-to:rgba(var(--color-neutral-800),1); --tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-to) var(--tw-gradient-to-position)); }}.dark\:to-secondary-800{&:is(.dark *) { --tw-gradient-to:rgba(var(--color-secondary-800),1); --tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-to) var(--tw-gradient-to-position)); }}.dark\:text-neutral{&:is(.dark *) { color:rgba(var(--color-neutral),1); }}.dark\:text-neutral-100{&:is(.dark *) { color:rgba(var(--color-neutral-100),1); }}.dark\:text-neutral-200{&:is(.dark *) { color:rgba(var(--color-neutral-200),1); }}.dark\:text-neutral-300{&:is(.dark *) { color:rgba(var(--color-neutral-300),1); }}.dark\:text-neutral-400{&:is(.dark *) { color:rgba(var(--color-neutral-400),1); }}.dark\:text-neutral-500{&:is(.dark *) { color:rgba(var(--color-neutral-500),1); }}.dark\:text-neutral-700{&:is(.dark *) { color:rgba(var(--color-neutral-700),1); }}.dark\:text-neutral-800{&:is(.dark *) { color:rgba(var(--color-neutral-800),1); }}.dark\:text-primary-200{&:is(.dark *) { color:rgba(var(--color-primary-200),1); }}.dark\:text-primary-400{&:is(.dark *) { color:rgba(var(--color-primary-400),1); }}.dark\:text-white{&:is(.dark *) { color:#fff; }}.dark\:opacity-60{&:is(.dark *) { opacity:60%; }}.dark\:scrollbar-thumb-neutral-600{&:is(.dark *) { --scrollbar-thumb:oklch(43.9% 0 0); }}.dark\:scrollbar-track-neutral-800{&:is(.dark *) { --scrollbar-track:oklch(26.9% 0 0); }}.dark\:group-hover\:text-neutral-700{&:is(.dark *) { &:is(:where(.group):hover *) { @media (hover:hover) { color:rgba(var(--color-neutral-700),1); } } }}.dark\:hover\:\!bg-primary-700{&:is(.dark *) { &:hover { @media (hover:hover) { background-color:rgba(var(--color-primary-700),1)!important; } } }}.dark\:hover\:bg-primary-400{&:is(.dark *) { &:hover { @media (hover:hover) { background-color:rgba(var(--color-primary-400),1); } } }}.dark\:hover\:bg-primary-900{&:is(.dark *) { &:hover { @media (hover:hover) { background-color:rgba(var(--color-primary-900),1); } } }}.dark\:hover\:text-neutral-200{&:is(.dark *) { &:hover { @media (hover:hover) { color:rgba(var(--color-neutral-200),1); } } }}.dark\:hover\:text-neutral-800{&:is(.dark *) { &:hover { @media (hover:hover) { color:rgba(var(--color-neutral-800),1); } } }}.dark\:hover\:text-primary-400{&:is(.dark *) { &:hover { @media (hover:hover) { color:rgba(var(--color-primary-400),1); } } }}.dark\:focus\:bg-primary-900{&:is(.dark *) { &:focus { background-color:rgba(var(--color-primary-900),1); } }}.print\:hidden{@media print{display: none;}}}body a,body button{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}button,[role=button]{cursor:pointer}.icon svg{height:1em;width:1em}.logo svg{height:5rem;width:5rem}#search-query::-webkit-search-cancel-button,#search-query::-webkit-search-decoration,#search-query::-webkit-search-results-button,#search-query::-webkit-search-results-decoration{display:none}.prose blockquote{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { border-right-style:var(--tw-border-style); border-right-width:4px; } &:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { border-left-style:var(--tw-border-style); border-left-width:0px; } &:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { padding-right:calc(var(--spacing) * 4); }}.prose ul>li,.prose ol>li{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { margin-right:calc(var(--spacing) * 7); } &:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { padding-right:calc(var(--spacing) * 2); } &:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { padding-left:calc(var(--spacing) * 0); }}.prose ol>li:before,.prose ul>li:before{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { right:calc(var(--spacing) * 1); } &:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { left:auto; }}.prose thead td:first-child,.prose thead th:first-child{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { padding-right:calc(var(--spacing) * 0); }}.prose thead td:last-child,.prose thead th:last-child{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { padding-left:calc(var(--spacing) * 0); }}.prose div.min-w-0.max-w-prose>*:first-child{margin-top:calc(var(--spacing) * 3)}#TOCView{max-height:calc(100vh - 150px);min-height:0;overflow-x:hidden}.toc ul,.toc li{list-style-type:none;padding-inline:calc(var(--spacing) * 0);--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.toc ul ul{&:where(:dir(ltr),[dir="ltr"],[dir="ltr"] *) { padding-left:calc(var(--spacing) * 4); } &:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { padding-right:calc(var(--spacing) * 4); }}.toc a{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal);color:rgba(var(--color-neutral-700),1);&:is(.dark *) { color:rgba(var(--color-neutral-400),1); }}.toc ul>li{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { margin-right:calc(var(--spacing) * 0); }}.highlight-wrapper{display:block}.highlight{position:relative;z-index:0}.highlight:hover>.copy-button{visibility:visible}.copy-button{visibility:hidden;position:absolute;top:calc(var(--spacing) * 0);right:calc(var(--spacing) * 0);z-index:10;width:calc(var(--spacing) * 20);cursor:pointer;text-overflow:ellipsis;overflow:hidden;border-top-right-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md);background-color:rgba(var(--color-neutral-200),1);padding-block:calc(var(--spacing) * 1);font-family:var(--font-mono);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));white-space:nowrap;color:rgba(var(--color-neutral-700),1);opacity:90%;&:is(.dark *) { background-color:rgba(var(--color-neutral-600),1); } &:is(.dark *) { color:rgba(var(--color-neutral-200),1); }}.copy-button:hover,.copy-button:focus,.copy-button:active,.copy-button:active:hover{background-color:rgba(var(--color-primary-100),1);&:is(.dark *) { background-color:rgba(var(--color-primary-600),1); }}.copy-textarea{position:absolute;z-index:calc(10 * -1);opacity:5%}.katex-display{overflow:auto hidden}.katex-display{padding:1em;width:calc(100% - 1em)}table{display:block;overflow:auto}code{word-wrap:break-word;overflow-wrap:break-word}a{word-break:break-word;word-wrap:break-word;overflow-wrap:break-word}.prose-invert .highlight pre>code{background-color:unset}pre{text-align:left}.single_hero_round{max-height:50vh;object-fit:cover}.single_hero_background{width:calc(100% + 1px);z-index:-10}.hero_gradient{width:100%;height:100%}.thumbnail_card{min-width:300px;height:200px}.thumbnail_card_related{height:150px}.thumbnail{width:300px;min-height:180px}@media(width < 853px){.thumbnail{width:100%}}.thumbnail-shadow{box-shadow:5px 5px 20px 1px rgba(0,0,0,.3)}.anchor{display:block;position:relative;top:-150px;height:0;visibility:hidden}[id^=fn],[id^=fnref]{scroll-margin-top:145px}#main-content{scroll-margin-top:-125px}@media(width >= 640px){.article{flex-wrap:wrap}}@media(width >= 853px){.article{flex-wrap:nowrap}}.medium-zoom-image--opened{z-index:100}.nested-menu:hover+.menuhide{visibility:visible;opacity:1;transition:visibility .3s,opacity .3s ease-in-out}.menuhide:hover{visibility:visible;opacity:1;transition:visibility .3s,opacity .3s ease-in-out}.menuhide{visibility:hidden;opacity:0;transition:visibility .3s,opacity .3s ease-in-out;z-index:1000}.active{text-decoration-line:underline;text-decoration-thickness:3px;text-underline-offset:4px}@layer base{[type=text],input:where(:not([type])),[type=email],[type=url],[type=password],[type=number],[type=date],[type=datetime-local],[type=month],[type=search],[type=tel],[type=time],[type=week],[multiple],textarea,select{appearance:none;background-color:#fff;border-color:oklch(55.1% .027 264.364);border-width:1px;border-radius:0;padding-top:.5rem;padding-right:.75rem;padding-bottom:.5rem;padding-left:.75rem;font-size:1rem;line-height:1.5rem;--tw-shadow:0 0 #0000;&:focus { outline:2px solid transparent; outline-offset:2px; --tw-ring-inset:var(--tw-empty,); --tw-ring-offset-width:0px; --tw-ring-offset-color:#fff; --tw-ring-color:oklch(54.6% 0.245 262.881); --tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); --tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow); border-color:oklch(54.6% 0.245 262.881); }}input::placeholder,textarea::placeholder{color:oklch(55.1% .027 264.364);opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em}::-webkit-date-and-time-value{text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='oklch(55.1%25 0.027 264.364)' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;print-color-adjust:exact}[multiple],[size]:where(select:not([size="1"])){background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;padding-right:.75rem;print-color-adjust:unset}[type=checkbox],[type=radio]{appearance:none;padding:0;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:oklch(54.6% .245 262.881);background-color:#fff;border-color:oklch(55.1% .027 264.364);border-width:1px;--tw-shadow:0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:oklch(54.6% 0.245 262.881);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}[type=checkbox]:checked,[type=radio]:checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");@media(forced-colors:active){appearance: auto;}}[type=radio]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");@media(forced-colors:active){appearance: auto;}}[type=checkbox]:checked:hover,[type=checkbox]:checked:focus,[type=radio]:checked:hover,[type=radio]:checked:focus{border-color:transparent;background-color:currentColor}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat;@media(forced-colors:active){appearance: auto;}}[type=checkbox]:indeterminate:hover,[type=checkbox]:indeterminate:focus{border-color:transparent;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}}@layer base{*{@supports(-moz-appearance:none){scrollbar-color: initial; scrollbar-width: initial;}}}@property --tw-font-weight{syntax: "*"; + inherits: false; +}@property --tw-translate-x{syntax: "*"; + inherits: false; + initial-value: 0; +}@property --tw-translate-y{syntax: "*"; + inherits: false; + initial-value: 0; +}@property --tw-translate-z{syntax: "*"; + inherits: false; + initial-value: 0; +}@property --tw-scale-x{syntax: "*"; + inherits: false; + initial-value: 1; +}@property --tw-scale-y{syntax: "*"; + inherits: false; + initial-value: 1; +}@property --tw-scale-z{syntax: "*"; + inherits: false; + initial-value: 1; +}@property --tw-rotate-x{syntax: "*"; + inherits: false; +}@property --tw-rotate-y{syntax: "*"; + inherits: false; +}@property --tw-rotate-z{syntax: "*"; + inherits: false; +}@property --tw-skew-x{syntax: "*"; + inherits: false; +}@property --tw-skew-y{syntax: "*"; + inherits: false; +}@property --tw-pan-x{syntax: "*"; + inherits: false; +}@property --tw-pan-y{syntax: "*"; + inherits: false; +}@property --tw-pinch-zoom{syntax: "*"; + inherits: false; +}@property --tw-space-y-reverse{syntax: "*"; + inherits: false; + initial-value: 0; +}@property --tw-space-x-reverse{syntax: "*"; + inherits: false; + initial-value: 0; +}@property --tw-border-style{syntax: "*"; + inherits: false; + initial-value: solid; +}@property --tw-gradient-position{syntax: "*"; + inherits: false; +}@property --tw-gradient-from{syntax: ""; + inherits: false; + initial-value: #0000; +}@property --tw-gradient-via{syntax: ""; + inherits: false; + initial-value: #0000; +}@property --tw-gradient-to{syntax: ""; + inherits: false; + initial-value: #0000; +}@property --tw-gradient-stops{syntax: "*"; + inherits: false; +}@property --tw-gradient-via-stops{syntax: "*"; + inherits: false; +}@property --tw-gradient-from-position{syntax: ""; + inherits: false; + initial-value: 0%; +}@property --tw-gradient-via-position{syntax: ""; + inherits: false; + initial-value: 50%; +}@property --tw-gradient-to-position{syntax: ""; + inherits: false; + initial-value: 100%; +}@property --tw-leading{syntax: "*"; + inherits: false; +}@property --tw-tracking{syntax: "*"; + inherits: false; +}@property --tw-ordinal{syntax: "*"; + inherits: false; +}@property --tw-slashed-zero{syntax: "*"; + inherits: false; +}@property --tw-numeric-figure{syntax: "*"; + inherits: false; +}@property --tw-numeric-spacing{syntax: "*"; + inherits: false; +}@property --tw-numeric-fraction{syntax: "*"; + inherits: false; +}@property --tw-shadow{syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +}@property --tw-shadow-color{syntax: "*"; + inherits: false; +}@property --tw-shadow-alpha{syntax: ""; + inherits: false; + initial-value: 100%; +}@property --tw-inset-shadow{syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +}@property --tw-inset-shadow-color{syntax: "*"; + inherits: false; +}@property --tw-inset-shadow-alpha{syntax: ""; + inherits: false; + initial-value: 100%; +}@property --tw-ring-color{syntax: "*"; + inherits: false; +}@property --tw-ring-shadow{syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +}@property --tw-inset-ring-color{syntax: "*"; + inherits: false; +}@property --tw-inset-ring-shadow{syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +}@property --tw-ring-inset{syntax: "*"; + inherits: false; +}@property --tw-ring-offset-width{syntax: ""; + inherits: false; + initial-value: 0px; +}@property --tw-ring-offset-color{syntax: "*"; + inherits: false; + initial-value: #fff; +}@property --tw-ring-offset-shadow{syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +}@property --tw-blur{syntax: "*"; + inherits: false; +}@property --tw-brightness{syntax: "*"; + inherits: false; +}@property --tw-contrast{syntax: "*"; + inherits: false; +}@property --tw-grayscale{syntax: "*"; + inherits: false; +}@property --tw-hue-rotate{syntax: "*"; + inherits: false; +}@property --tw-invert{syntax: "*"; + inherits: false; +}@property --tw-opacity{syntax: "*"; + inherits: false; +}@property --tw-saturate{syntax: "*"; + inherits: false; +}@property --tw-sepia{syntax: "*"; + inherits: false; +}@property --tw-drop-shadow{syntax: "*"; + inherits: false; +}@property --tw-drop-shadow-color{syntax: "*"; + inherits: false; +}@property --tw-drop-shadow-alpha{syntax: ""; + inherits: false; + initial-value: 100%; +}@property --tw-drop-shadow-size{syntax: "*"; + inherits: false; +}@property --tw-backdrop-blur{syntax: "*"; + inherits: false; +}@property --tw-backdrop-brightness{syntax: "*"; + inherits: false; +}@property --tw-backdrop-contrast{syntax: "*"; + inherits: false; +}@property --tw-backdrop-grayscale{syntax: "*"; + inherits: false; +}@property --tw-backdrop-hue-rotate{syntax: "*"; + inherits: false; +}@property --tw-backdrop-invert{syntax: "*"; + inherits: false; +}@property --tw-backdrop-opacity{syntax: "*"; + inherits: false; +}@property --tw-backdrop-saturate{syntax: "*"; + inherits: false; +}@property --tw-backdrop-sepia{syntax: "*"; + inherits: false; +}@property --tw-duration{syntax: "*"; + inherits: false; +}@property --tw-ease{syntax: "*"; + inherits: false; +}@property --tw-content{syntax: "*"; + initial-value: ""; + inherits: false; +}@property --tw-outline-style{syntax: "*"; + inherits: false; + initial-value: solid; +}@keyframes pulse{50%{opacity:.5}}@layer properties{@supports((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::before,::after,::backdrop{--tw-font-weight:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-outline-style:solid}}}.medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform} \ No newline at end of file diff --git a/public/index.html b/public/index.html index 11da7a0..5dfff6b 100644 --- a/public/index.html +++ b/public/index.html @@ -1,16 +1,1407 @@ -Tommy's Space

Recent

I am open to work!
About Me
Contact Information

© -2025 -Tommy Tran

Powered by Hugo & Blowfish

\ No newline at end of file + + + + + + + + + + + + + + Tommy's Space + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
+ + + + + +
+ + + + + + +

Recent

+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ I am open to work! +
+ + +
+
+ +

+ I am open to work! + +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ About Me +
+ + +
+
+ +

+ About Me + +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ Contact Information +
+ + +
+
+ +

+ Contact Information + +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + +
+ +
+
+
+ + +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ + +

+ © + 2025 + Tommy Tran +

+ + + + +

+ + + Powered by Hugo & Blowfish +

+ +
+ + + + + + + + +
+ + +
+ + + diff --git a/public/index.json b/public/index.json index eae7869..8eec94a 100644 --- a/public/index.json +++ b/public/index.json @@ -1 +1,2 @@ + [{"content":"I’m currently open to new opportunities and eager to join a team in the U.S. or Canada as an employee. I do not take on freelance or contract work. For U.S. opportunities, I don’t require visa sponsorship at this time, though I may need it in the future. For Canadian opportunities, I will need an employer to apply for a work permit on my behalf. If you’re looking for a committed team member, let’s connect!\nWhat I Can Do # As a system administrator with 5 years of experience, I bring extensive expertise working with all three major Linux families—Red Hat, SUSE, and Debian—with a particular preference for Red Hat systems. While I am primarily a Linux administrator, I am also familiar with Windows systems and can handle tasks such as managing Active Directory.\nI prioritize creating secure and reliable systems, implementing measures like systemd hardening, container hardening, timely vulnerability patching for containers, attack surface reduction, and protecting systems from both external and internal threats.\nMost of my work is open source and available on GitHub. You can explore my server configurations on Metropolis Nexus\u0026rsquo;s GitHub to see my approach to system administration. For container security, I specialize in porting containers to Alpine Linux and performing daily rebuilds to ensure the latest patches are applied. Check out my work at Polarix-Containers, where I maintain a collection of OCI containers with enhanced protections.\nQualifications # I hold several professional certifications, including the Red Hat Certified System Administrator and Linux Foundation Certified Sysadmin, demonstrating my expertise in Linux system administration. For a full list of my certifications, please visit my LinkedIn profile. I am committed to continuous learning and plan to pursue additional certifications in the near future to further enhance my skills.\n","date":"23 September 2025","externalUrl":null,"permalink":"/posts/hire-me/","section":"Posts","summary":"","title":"I am open to work!","type":"posts"},{"content":"","date":"23 September 2025","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"23 September 2025","externalUrl":null,"permalink":"/","section":"Tommy's Space","summary":"","title":"Tommy's Space","type":"page"},{"content":"Hello! 👋\nI\u0026rsquo;m Thien, though you may know me as Tommy. With over five years of experience as a Linux system administrator, I specialize in managing a diverse range of Linux distributions, including Red Hat, Debian, SUSE, and Arch Linux. Recently, I\u0026rsquo;ve been diving into the world of containers and immutable distributions, which I find both innovative and exciting.\nLike most Linux users, I am an open source enthusiast and publish most of the projects made in my free time on GitHub. I also made a couple of small contributions to various projets as well.\nI host several services, such as Matrix and Mastodon, free of charge. If you\u0026rsquo;re curious, feel free to explore Metropolis Nexus, where you might find resources or services that suit your needs.\nTogether with friends I connected with through GrapheneOS, I co-author a blog, PrivSec.dev, where we explore topics related to privacy and security.\n","date":"2 September 2022","externalUrl":null,"permalink":"/posts/about/","section":"Posts","summary":"","title":"About Me","type":"posts"},{"content":" Matrix # The best way to contact me is through Matrix. My account is @tommy:metropolis.nexus. If you do not have a an account, you can sign up for one on my homeserver metropolis.nexus. I do not ask for your email address or any personal information for registration.\nTelegram # My Telegram is TommyTran732. I do not check it as often as I do with Matrix. When contacting me, please use the Secret Chat feature.\nEmail # If you prefer to reach out to me via email, my address is contact@tommytran.io. Aliases:\ntommy@metropolis.nexus tommy@privsec.dev Please use encryption if possible. My PGP key is available here.\nOther Accounts # Discord # TommyTran732 Linkedin # TommyTran732 For employers, please see Hire Me!\nTwitter # @TommyTran732 @PrivSec_Dev Git accounts # GitHub Metropolis GitLab Please by wary of anyone claiming to be me or using the handle \u0026ldquo;TommyTran732\u0026rdquo; reaching out to you. Chances are, they are an impersonator. You can always contact me via Matrix or Email for identity verification.\n","date":"2 September 2022","externalUrl":null,"permalink":"/posts/contact/","section":"Posts","summary":"","title":"Contact Information","type":"posts"},{"content":"These are some of my most notable projects. For a complete list, please visit my GitHub profile.\nPrivSec.dev # PrivSec.dev is a website created by me and a few friends to provide practical privacy and security advice for end users. Think of it as a shared blog focused on this topic.\nWe emphasize in-depth system configuration, security analysis, and software/hardware recommendations, prioritizing technical merits over ideologies or politics.\nPolarix Containers # Polarix Containers is a collection of OCI containers designed to enhance security compared to upstream builds.\nSome containers are daily rebuilds of upstream containers, while others are rebuilt from scratch using Alpine Linux or Red Hat UBI with unprivileged users, maintaining upstream compatibility. Most builds include hardened_malloc for added security.\nPolarix Containers serve as the foundation for my other projects, such as Metropolis.nexus.\nMetropolis.nexus # Metropolis.nexus is a collection of services I offer free of charge, including but not limited to:\nMatrix Mastodon Vaultwarden Redlib Traccar Stirling PDF Signature PDF The Metropolis-nexus GitHub organization contains repositories documenting the system\u0026rsquo;s setup. Key subprojects include:\nLinux Setup Scripts # These setup scripts are used on my Linux systems and include hardening configurations such as:\nRemoval of unnecessary packages Hardened boot parameters Hardened sysctl settings Kernel module blacklist from SecureBlue SSH client and server hardening Systemd hardening Installation of Hardened Malloc on Red Hat systems NTS setup Fedora CoreOS Ignition Files # These Butane/Ignition configuration files enable rapid deployment of Fedora CoreOS servers with the same hardening as the Linux Setup Scripts.\nThey also include systemd services to:\nInstall and update gVisor at boot Update containers in a Docker Compose stack daily NGINX Configs # My reverse proxy setup is available in this repository. It includes:\nTLS configuration with strong cipher suites A robust set of security headers Content security policies for various services ModSecurity configuration Systemd hardening for system services QubesOS scripts # My QubesOS scripts configure Qubes virtual machines with the same hardening as my Linux setup scripts, tailored for Qubes\u0026rsquo; unique environment. I also provide documentation on how I set up my daily driver — a ThinkPad P53 — with Qubes for maximum privacy and security.\nMicrosoft Egde Policies # Microsoft Edge can be one of the best browsers when configured properly, but it is privacy-invasive and has a large attack surface by default. My list of policies configures it for improved privacy and security.\n","date":"2 September 2022","externalUrl":null,"permalink":"/posts/projects/","section":"Posts","summary":"","title":"My Projects","type":"posts"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"},{"content":"","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"}] \ No newline at end of file diff --git a/public/index.xml b/public/index.xml index ec327ad..5348f4e 100644 --- a/public/index.xml +++ b/public/index.xml @@ -1 +1,53 @@ -Tommy's Spacehttps://tommytran.io/Recent content on Tommy's SpaceHugo -- gohugo.ioen© 2025 Tommy TranTue, 23 Sep 2025 00:00:00 +0000I am open to work!https://tommytran.io/posts/hire-me/Tue, 23 Sep 2025 00:00:00 +0000https://tommytran.io/posts/hire-me/About Mehttps://tommytran.io/posts/about/Fri, 02 Sep 2022 00:00:00 +0000https://tommytran.io/posts/about/Contact Informationhttps://tommytran.io/posts/contact/Fri, 02 Sep 2022 00:00:00 +0000https://tommytran.io/posts/contact/My Projectshttps://tommytran.io/posts/projects/Fri, 02 Sep 2022 00:00:00 +0000https://tommytran.io/posts/projects/ \ No newline at end of file + + + + Tommy's Space + http://localhost:1313/ + Recent content on Tommy's Space + Hugo -- gohugo.io + en + © 2025 Tommy Tran + Tue, 23 Sep 2025 00:00:00 +0000 + + + I am open to work! + http://localhost:1313/posts/hire-me/ + Tue, 23 Sep 2025 00:00:00 +0000 + + http://localhost:1313/posts/hire-me/ + + + + + + About Me + http://localhost:1313/posts/about/ + Fri, 02 Sep 2022 00:00:00 +0000 + + http://localhost:1313/posts/about/ + + + + + + Contact Information + http://localhost:1313/posts/contact/ + Fri, 02 Sep 2022 00:00:00 +0000 + + http://localhost:1313/posts/contact/ + + + + + + My Projects + http://localhost:1313/posts/projects/ + Fri, 02 Sep 2022 00:00:00 +0000 + + http://localhost:1313/posts/projects/ + + + + + + diff --git a/public/js/appearance.min.6f41174b3a05b680820fe08cadbfa5fb7a7ca347b76a0955cdc68b9d8aca1ce24f0547e138cea33bcc7904d551a90afcb1cc7f2d9fe8557075d501419046c08c.js b/public/js/appearance.min.6f41174b3a05b680820fe08cadbfa5fb7a7ca347b76a0955cdc68b9d8aca1ce24f0547e138cea33bcc7904d551a90afcb1cc7f2d9fe8557075d501419046c08c.js new file mode 100644 index 0000000..fc8ae8d --- /dev/null +++ b/public/js/appearance.min.6f41174b3a05b680820fe08cadbfa5fb7a7ca347b76a0955cdc68b9d8aca1ce24f0547e138cea33bcc7904d551a90afcb1cc7f2d9fe8557075d501419046c08c.js @@ -0,0 +1 @@ +const sitePreference=document.documentElement.getAttribute("data-default-appearance"),userPreference=localStorage.getItem("appearance");(sitePreference==="dark"&&userPreference===null||userPreference==="dark")&&document.documentElement.classList.add("dark"),document.documentElement.getAttribute("data-auto-appearance")==="true"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches&&userPreference!=="light"&&document.documentElement.classList.add("dark"),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e=>{e.matches?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")}));var updateMeta,getTargetAppearance,updateMermaidTheme=()=>{if(typeof mermaid!="undefined"){const e=document.documentElement.classList.contains("dark"),t=document.querySelectorAll("pre.mermaid");t.forEach(e=>{e.getAttribute("data-processed")?(e.removeAttribute("data-processed"),e.innerHTML=e.getAttribute("data-graph")):e.setAttribute("data-graph",e.textContent)}),e?(initMermaidDark(),mermaid.run()):(initMermaidLight(),mermaid.run())}};window.addEventListener("DOMContentLoaded",e=>{const t=document.getElementById("appearance-switcher"),n=document.getElementById("appearance-switcher-mobile");updateMeta(),this.updateLogo?.(getTargetAppearance()),updateMermaidTheme(),t&&(t.addEventListener("click",()=>{document.documentElement.classList.toggle("dark");var e=getTargetAppearance();localStorage.setItem("appearance",e),updateMeta(),updateMermaidTheme(),this.updateLogo?.(e)}),t.addEventListener("contextmenu",e=>{e.preventDefault(),localStorage.removeItem("appearance")})),n&&(n.addEventListener("click",()=>{document.documentElement.classList.toggle("dark");var e=getTargetAppearance();localStorage.setItem("appearance",e),updateMeta(),updateMermaidTheme(),this.updateLogo?.(e)}),n.addEventListener("contextmenu",e=>{e.preventDefault(),localStorage.removeItem("appearance")}))}),updateMeta=()=>{var e=document.querySelector("body"),t=getComputedStyle(e);document.querySelector('meta[name="theme-color"]').setAttribute("content",t.backgroundColor)},getTargetAppearance=()=>document.documentElement.classList.contains("dark")?"dark":"light",window.addEventListener("DOMContentLoaded",e=>{const t=document.getElementById("top-scroller"),n=document.getElementById("site-footer");t&&n&&t.getBoundingClientRect().top>n.getBoundingClientRect().top&&(t.hidden=!0)}) \ No newline at end of file diff --git a/public/js/main.bundle.min.9df4fc14d50efcc9aa4cfc2b6f348e365f421f5ad491278f8f48c0360cf2f93f08882fda6da162d7ace8e5add57c2df4ac46bd3861306b1d4c452cd31f448d64.js b/public/js/main.bundle.min.9df4fc14d50efcc9aa4cfc2b6f348e365f421f5ad491278f8f48c0360cf2f93f08882fda6da162d7ace8e5add57c2df4ac46bd3861306b1d4c452cd31f448d64.js new file mode 100644 index 0000000..50d8d2e --- /dev/null +++ b/public/js/main.bundle.min.9df4fc14d50efcc9aa4cfc2b6f348e365f421f5ad491278f8f48c0360cf2f93f08882fda6da162d7ace8e5add57c2df4ac46bd3861306b1d4c452cd31f448d64.js @@ -0,0 +1,15 @@ +function scrollToTop(){const e=document.getElementById("scroll-to-top");window.scrollY>window.innerHeight*.5?(e.classList.remove("translate-y-4","opacity-0"),e.classList.add("translate-y-0","opacity-100")):(e.classList.remove("translate-y-0","opacity-100"),e.classList.add("translate-y-4","opacity-0"))}window.addEventListener("scroll",scrollToTop),window.addEventListener("load",scrollToTop),e=this,t=function(){"use strict";function R(e,t){var n,s=Object.keys(e);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(e),t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),s.push.apply(s,n)),s}function h(e){for(var t,n=1;ne.length)&&(t=e.length);for(var n=0,s=new Array(t);n0&&0[0]!==arguments[0]?arguments[0]:{},s=n.getFn,i=0[0]===s?e.getFn:s,o=n.fieldNormWeight,r=0[0]===o?e.fieldNormWeight:o;t(this,a),this.norm=function(){var n=arguments.length>0&&0[0]!==arguments[0]?arguments[0]:1,s=arguments.length>1&&0[0]!==arguments[1]?arguments[1]:3,e=new Map,t=10**s;return{get:function(s){if(o=s.match(ce).length,e.has(o))return e.get(o);var o,a=1/o**(.5*n),i=parseFloat(Math.round(a*t)/t);return e.set(o,i),i},clear:function(){e.clear()}}}(r,3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return n(a,[{key:"setSources",value:function(){var e=arguments.length>0&&0[0]!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&0[0]!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var t=this,e=arguments.length>0&&0[0]!==arguments[0]?arguments[0]:[];this.keys=e,this._keysMap={},e.forEach(function(e,n){t._keysMap[e.id]=n})}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,o(this.docs[0])?this.docs.forEach(function(t,n){e._addString(t,n)}):this.docs.forEach(function(t,n){e._addObject(t,n)}),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();o(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&0[0]!==arguments[2]?arguments[2]:{},i=o.getFn,r=0[0]===i?e.getFn:i,a=o.fieldNormWeight,c=0[0]===a?e.fieldNormWeight:a,s=new E({getFn:r,fieldNormWeight:c});return s.setKeys(t.map(H)),s.setSources(n),s.create(),s}function p(t){var s,n=arguments.length>1&&0[0]!==arguments[1]?arguments[1]:{},d=n.errors,f=0[0]===d?0:d,l=n.currentLocation,u=0[0]===l?0:l,a=n.expectedLocation,h=0[0]===a?0:a,r=n.distance,c=0[0]===r?e.distance:r,i=n.ignoreLocation,m=0[0]===i?e.ignoreLocation:i,o=f/t.length;return m?o:(s=Math.abs(h-u),c?o+s/c:s?1:o)}a=32;function K(t,n,s){var o,r,f,v,b,w,k,A,H,c=arguments.length>3&&0[0]!==arguments[3]?arguments[3]:{},F=c.location,$=0[0]===F?e.location:F,R=c.distance,C=0[0]===R?e.distance:R,N=c.threshold,V=0[0]===N?e.threshold:N,I=c.findAllMatches,W=0[0]===I?e.findAllMatches:I,P=c.minMatchCharLength,z=0[0]===P?e.minMatchCharLength:P,B=c.includeMatches,D=0[0]===B?e.includeMatches:B,L=c.ignoreLocation,y=0[0]===L?e.ignoreLocation:L;if(n.length>a)throw new Error("Pattern length exceeds max of ".concat(a,"."));for(var _,d=n.length,g=t.length,i=Math.max(0,Math.min($,g)),m=V,h=i,x=z>1||D,S=x?Array(g):[];(_=t.indexOf(n,h))>-1;)if(H=p(n,{currentLocation:_,expectedLocation:i,distance:C,ignoreLocation:y}),m=Math.min(H,m),h=_+d,x)for(b=0;b=T;o-=1)if(v=o-1,A=s[t.charAt(v)],x&&(S[v]=+!!A),u[o]=(u[o+1]<<1|1)&A,l&&(u[o]|=(O[o+1]|O[o])<<1|1|O[o+1]),u[o]&U&&(E=p(n,{errors:l,currentLocation:v,expectedLocation:i,distance:C,ignoreLocation:y}))<=m){if(m=E,(h=v)<=i)break;T=Math.max(1,2*i-h)}if(p(n,{errors:l+1,currentLocation:i,expectedLocation:i,distance:C,ignoreLocation:y})>m)break;O=u}return w={isMatch:h>=0,score:Math.max(.001,E)},x&&(k=function(){for(var i,s=arguments.length>0&&0[0]!==arguments[0]?arguments[0]:[],a=arguments.length>1&&0[0]!==arguments[1]?arguments[1]:e.minMatchCharLength,o=[],t=-1,r=-1,n=0,c=s.length;n=a&&o.push([t,r]),t=-1);return s[n-1]&&n-t>=a&&o.push([t,n-1]),o}(S,z),k.length?D&&(w.indices=k):w.isMatch=!1),w}function ee(e){for(var s,n={},t=0,o=e.length;t1&&0[0]!==arguments[1]?arguments[1]:{},h=o.location,A=0[0]===h?e.location:h,u=o.threshold,E=0[0]===u?e.threshold:u,v=o.distance,F=0[0]===v?e.distance:v,f=o.includeMatches,S=0[0]===f?e.includeMatches:f,g=o.findAllMatches,k=0[0]===g?e.findAllMatches:g,d=o.minMatchCharLength,O=0[0]===d?e.minMatchCharLength:d,y=o.isCaseSensitive,_=0[0]===y?e.isCaseSensitive:y,w=o.ignoreDiacritics,j=0[0]===w?e.ignoreDiacritics:w,b=o.ignoreLocation,C=0[0]===b?e.ignoreLocation:b;if(t(this,s),this.options={location:A,threshold:E,distance:F,includeMatches:S,findAllMatches:k,minMatchCharLength:O,isCaseSensitive:_,ignoreDiacritics:j,ignoreLocation:C},n=_?n:n.toLowerCase(),n=j?m(n):n,this.pattern=n,this.chunks=[],this.pattern.length)if(r=function(e,t){x.chunks.push({pattern:e,alphabet:ee(e),startIndex:t})},i=this.pattern.length,i>a){for(var c=0,p=i%a,M=i-p;c1&&0[0]!==arguments[1]?arguments[1]:{},r=s.location,O=0[0]===r?e.location:r,l=s.threshold,g=0[0]===l?e.threshold:l,u=s.distance,_=0[0]===u?e.distance:u,m=s.includeMatches,j=0[0]===m?e.includeMatches:m,p=s.findAllMatches,v=0[0]===p?e.findAllMatches:p,a=s.minMatchCharLength,b=0[0]===a?e.minMatchCharLength:a,f=s.isCaseSensitive,y=0[0]===f?e.isCaseSensitive:f,h=s.ignoreDiacritics,w=0[0]===h?e.ignoreDiacritics:h,c=s.ignoreLocation,x=0[0]===c?e.ignoreLocation:c;return t(this,o),(d=i.call(this,n))._bitapSearch=new V(n,{location:O,threshold:g,distance:_,includeMatches:j,findAllMatches:v,minMatchCharLength:b,isCaseSensitive:y,ignoreDiacritics:w,ignoreLocation:x}),d}return n(o,[{key:"search",value:function(e){return this._bitapSearch.searchIn(e)}}],[{key:"type",get:function(){return"fuzzy"}},{key:"multiRegex",get:function(){return/^"(.*)"$/}},{key:"singleRegex",get:function(){return/^(.*)$/}}]),o}(c),U=function(e){r(s,e);var o=l(s);function s(e){return t(this,s),o.call(this,e)}return n(s,[{key:"search",value:function(e){for(var t,o,n=0,s=[],i=this.pattern.length;(t=e.indexOf(this.pattern,n))>-1;)n=t+i,s.push([t,n-1]);return o=!!s.length,{isMatch:o,score:o?0:1,indices:s}}}],[{key:"type",get:function(){return"include"}},{key:"multiRegex",get:function(){return/^'"(.*)"$/}},{key:"singleRegex",get:function(){return/^'(.*)$/}}]),s}(c),j=[Z,U,se,Y,X,G,Q,S],I=j.length,te=/ +(?=(?:[^"]*"[^"]*")*[^"]*$)/,ne=new Set([S.type,U.type]),q=function(){function s(n){var o=arguments.length>1&&0[0]!==arguments[1]?arguments[1]:{},a=o.isCaseSensitive,r=0[0]===a?e.isCaseSensitive:a,c=o.ignoreDiacritics,l=0[0]===c?e.ignoreDiacritics:c,d=o.includeMatches,O=0[0]===d?e.includeMatches:d,h=o.minMatchCharLength,v=0[0]===h?e.minMatchCharLength:h,f=o.ignoreLocation,_=0[0]===f?e.ignoreLocation:f,g=o.findAllMatches,b=0[0]===g?e.findAllMatches:g,i=o.location,y=0[0]===i?e.location:i,p=o.threshold,w=0[0]===p?e.threshold:p,u=o.distance,x=0[0]===u?e.distance:u;t(this,s),this.query=null,this.options={isCaseSensitive:r,ignoreDiacritics:l,includeMatches:O,minMatchCharLength:v,findAllMatches:b,ignoreLocation:_,location:y,threshold:w,distance:x},n=r?n:n.toLowerCase(),n=l?m(n):n,this.pattern=n,this.query=function(e){var t=arguments.length>1&&0[0]!==arguments[1]?arguments[1]:{};return e.split("|").map(function(e){for(var a,r,c,l,d=e.trim().split(te).filter(function(e){return e&&!!e.trim()}),s=[],o=0,h=d.length;o2&&0[0]!==arguments[2]?arguments[2]:{}).auto,s=0[0]===n||n;return b(e)||(e=T(e)),function e(n){var r,c,d,u,a=Object.keys(n),l=function(e){return!!e[D]}(n);if(!l&&a.length>1&&!b(n))return e(T(n));if(function(e){return!i(e)&&B(e)&&!b(e)}(n)){if(r=l?n[D]:a[0],c=l?n[le]:n[r],!o(c))throw new Error(function(e){return"Invalid value for key ".concat(e)}(r));return d={keyId:_(r),pattern:c},s&&(d.searcher=w(c,t)),d}return u={children:[],operator:a[0]},a.forEach(function(t){var s=n[t];i(s)&&s.forEach(function(t){u.children.push(e(t))})}),u}(e)}function me(e,t){var n=e.matches;t.matches=[],s(n)&&n.forEach(function(e){if(s(e.indices)&&e.indices.length){var n={indices:e.indices,value:e.value};e.key&&(n.key=e.key.src),e.idx>-1&&(n.refIndex=e.idx),t.matches.push(n)}})}function fe(e,t){t.score=e.score}return u=function(){function a(n){var s=arguments.length>1&&0[0]!==arguments[1]?arguments[1]:{},o=arguments.length>2?arguments[2]:0[0];t(this,a),this.options=h(h({},e),s),this.options.useExtendedSearch,this._keyStore=new pe(this.options.keys),this.setCollection(n,o)}return n(a,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof E))throw new Error("Incorrect 'index' type");this._myIndex=t||L(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){s(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var t,o=arguments.length>0&&0[0]!==arguments[0]?arguments[0]:function(){return!1},n=[],e=0,s=this._docs.length;e1&&0[0]!==arguments[1]?arguments[1]:{}).limit,i=0[0]===a?-1:a,n=this.options,r=n.includeMatches,c=n.includeScore,l=n.shouldSort,d=n.sortFn,u=n.ignoreFieldNorm,s=o(t)?o(this._docs[0])?this._searchStringList(t):this._searchObjectList(t):this._searchLogical(t);return function(t,n){var s=n.ignoreFieldNorm,o=0[0]===s?e.ignoreFieldNorm:s;t.forEach(function(e){var t=1;e.matches.forEach(function(e){var n=e.key,a=e.norm,s=e.score,i=n?n.weight:null;t*=(0===s&&i?Number.EPSILON:s)**((i||1)*(o?1:a))}),e.score=t})}(s,{ignoreFieldNorm:u}),l&&s.sort(d),$(i)&&i>-1&&(s=s.slice(0,i)),function(t,n){var o=arguments.length>2&&0[0]!==arguments[2]?arguments[2]:{},i=o.includeMatches,r=0[0]===i?e.includeMatches:i,a=o.includeScore,c=0[0]===a?e.includeScore:a,s=[];return r&&s.push(me),c&&s.push(fe),t.map(function(e){var t=e.idx,o={item:n[t],refIndex:t};return s.length&&s.forEach(function(t){t(e,o)}),o})}(s,this._docs,{includeMatches:r,includeScore:c})}},{key:"_searchStringList",value:function(e){var n=w(e,this.options),o=this._myIndex.records,t=[];return o.forEach(function(e){var o=e.v,a=e.i,r=e.n;if(s(o)){var i=n.searchIn(o),c=i.isMatch,l=i.score,d=i.indices;c&&t.push({item:o,idx:a,matches:[{score:l,value:o,norm:r,indices:d}]})}}),t}},{key:"_searchLogical",value:function(e){var n=this,i=he(e,this.options),a=function e(t,s,o){if(!t.children){var c,l=t.keyId,u=t.searcher,i=n._findMatches({key:n._keyStore.get(l),value:n._myIndex.getValueForItemAtKeyId(s,l),searcher:u});return i&&i.length?[{idx:o,item:s,matches:i}]:[]}for(var a=[],r=0,h=t.children.length;r1&&0[0]!==arguments[1]?arguments[1]:{},o=s.getFn,a=0[0]===o?e.getFn:o,i=s.fieldNormWeight,r=0[0]===i?e.fieldNormWeight:i,c=t.keys,l=t.records,n=new E({getFn:a,fieldNormWeight:r});return n.setKeys(c),n.setIndexRecords(l),n},u.config=e,function(){f.push.apply(f,arguments)}(q),u},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Fuse=t();var e,t,fuse,menuButton,menuCloseButton,menuWrapper,menuOpen,openMenu,closeMenu,showButton=document.getElementById("search-button"),showButtonMobile=document.getElementById("search-button-mobile"),hideButton=document.getElementById("close-search-button"),wrapper=document.getElementById("search-wrapper"),modal=document.getElementById("search-modal"),input=document.getElementById("search-query"),output=document.getElementById("search-results"),first=output.firstChild,last=output.lastChild,searchVisible=!1,indexed=!1,hasResults=!1;showButton?showButton.addEventListener("click",displaySearch):null,showButtonMobile?showButtonMobile.addEventListener("click",displaySearch):null,hideButton.addEventListener("click",hideSearch),wrapper.addEventListener("click",hideSearch),modal.addEventListener("click",function(e){return e.stopPropagation(),e.stopImmediatePropagation(),!1}),document.addEventListener("keydown",function(e){if(e.key=="/"){const t=document.activeElement,n=t.tagName,s=n==="INPUT"||n==="TEXTAREA"||t.isContentEditable;!searchVisible&&!s&&(e.preventDefault(),displaySearch())}e.key=="Escape"&&hideSearch(),e.key=="ArrowDown"&&searchVisible&&hasResults&&(e.preventDefault(),document.activeElement==input?first.focus():document.activeElement==last?last.focus():document.activeElement.parentElement.nextSibling.firstElementChild.focus()),e.key=="ArrowUp"&&searchVisible&&hasResults&&(e.preventDefault(),document.activeElement==input?input.focus():document.activeElement==first?input.focus():document.activeElement.parentElement.previousSibling.firstElementChild.focus()),e.key=="Enter"&&searchVisible&&hasResults&&(e.preventDefault(),document.activeElement==input?first.focus():document.activeElement.click())}),input.onkeyup=function(){executeQuery(this.value)};function displaySearch(){indexed||buildIndex(),searchVisible||(document.body.style.overflow="hidden",wrapper.style.visibility="visible",input.focus(),searchVisible=!0)}function hideSearch(){searchVisible&&(document.body.style.overflow="visible",wrapper.style.visibility="hidden",input.value="",output.innerHTML="",document.activeElement.blur(),searchVisible=!1)}function fetchJSON(e,t){var n=new XMLHttpRequest;n.onreadystatechange=function(){if(n.readyState===4&&n.status===200){var e=JSON.parse(n.responseText);t&&t(e)}},n.open("GET",e),n.send()}function buildIndex(){var e=wrapper.getAttribute("data-url"),e=e.replace(/\/?$/,"/");fetchJSON(e+"index.json",function(e){var t={shouldSort:!0,ignoreLocation:!0,threshold:0,includeMatches:!0,keys:[{name:"title",weight:.8},{name:"section",weight:.2},{name:"summary",weight:.6},{name:"content",weight:.4}]};fuse=new Fuse(e,t),indexed=!0})}function executeQuery(e){let n=fuse.search(e),t="";n.length>0?(n.forEach(function(e){var o,i,a=e.item.summary,s=document.createElement("div");s.innerHTML=a,e.item.summary=s.textContent||s.innerText||"",o=e.item.externalUrl?e.item.title+''+e.item.externalUrl+"":e.item.title,i=e.item.externalUrl?'target="_blank" rel="noopener" href="'+e.item.externalUrl+'"':'href="'+e.item.permalink+'"',t=t+`
  • + +
    +
    + ${o} +
    +
    ${e.item.section}·${e.item.date?e.item.date:""}
    +
    ${e.item.summary}
    +
    +
    +
    +
    +
  • `}),hasResults=!0):(t="",hasResults=!1),output.innerHTML=t,n.length>0&&(first=output.firstChild.firstElementChild,last=output.lastChild.firstElementChild)}menuButton=document.getElementById("menu-button"),menuCloseButton=document.getElementById("menu-close-button"),menuWrapper=document.getElementById("menu-wrapper"),menuOpen=!1,openMenu=function(){menuOpen||(menuOpen=!0,document.body.style.overflowY="hidden",menuButton.style.visibility="hidden",menuWrapper.style.visibility="visible",menuWrapper.style.opacity="1",window.onbeforeunload=function(){closeMenu()})},closeMenu=function(e){menuOpen&&(menuOpen=!1,document.body.style.overflowY="auto",menuButton.style.visibility="visible",menuWrapper.style.visibility="hidden",menuWrapper.style.opacity="0",window.onbeforeunload=function(){},e.stopPropagation())},menuButton&&menuButton.addEventListener("click",openMenu),menuCloseButton&&menuCloseButton.addEventListener("click",closeMenu),document.getElementById("button_likes")&&document.getElementById("button_likes").addEventListener("click",()=>{process_article()}),document.getElementById("katex-render")&&document.getElementById("katex-render").addEventListener("load",()=>{renderMathInElement(document.body)}) \ No newline at end of file diff --git a/public/page/1/index.html b/public/page/1/index.html index 1d6b6e6..6c63e57 100644 --- a/public/page/1/index.html +++ b/public/page/1/index.html @@ -1 +1,9 @@ -https://tommytran.io/ \ No newline at end of file + + + + http://localhost:1313/ + + + + + diff --git a/public/posts/about/index.html b/public/posts/about/index.html index 03b2aef..234be76 100644 --- a/public/posts/about/index.html +++ b/public/posts/about/index.html @@ -1,20 +1,1213 @@ -About Me · Tommy's Space
    Background Image

    About Me

    Tommy Tran
    Author
    Tommy Tran
    System Administrator and Technical Writer

    Hello! 👋

    I’m Thien, though you may know me as Tommy. With over five years of experience as a Linux system administrator, I specialize in managing a diverse range of Linux distributions, including Red Hat, Debian, SUSE, and Arch Linux. Recently, I’ve been diving into the world of containers and immutable distributions, which I find both innovative and exciting.

    Like most Linux users, I am an open source enthusiast and publish most of the projects made in my free time on GitHub. I also made a couple of small contributions to various projets as well.

    I host several services, such as Matrix and Mastodon, free of charge. If you’re curious, feel free to explore Metropolis Nexus, where you might find resources or services that suit your needs.

    Together with friends I connected with through GrapheneOS, I co-author a blog, PrivSec.dev, where we explore topics related to privacy and security.

    © -2025 -Tommy Tran

    Powered by Hugo & Blowfish

    \ No newline at end of file + + + + + + + + + + + + + About Me · Tommy's Space + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + About Me +
    +
    +
    + + +
    + + + + + + + + +
    + +

    + About Me +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    + + + + + + + + + + + +
    + + + + + + + + + + + + + + +
    + + + + + + + + + + + Tommy Tran + + +
    + +
    + Author +
    +
    + Tommy Tran +
    + + +
    System Administrator and Technical Writer
    + +
    +
    + + + + + + + + + + + + + Matrix + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + + + + + + +
    + + + +
    + + +
    + + + + + + + +
    + + +
    +

    Hello! 👋

    +

    I’m Thien, though you may know me as Tommy. With over five years of experience as a Linux system administrator, I specialize in managing a diverse range of Linux distributions, including Red Hat, Debian, SUSE, and Arch Linux. Recently, I’ve been diving into the world of containers and immutable distributions, which I find both innovative and exciting.

    +

    Like most Linux users, I am an open source enthusiast and publish most of the projects made in my free time on GitHub. I also made a couple of small contributions to various projets as well.

    +

    I host several services, such as Matrix and Mastodon, free of charge. If you’re curious, feel free to explore Metropolis Nexus, where you might find resources or services that suit your needs.

    +

    Together with friends I connected with through GrapheneOS, I co-author a blog, PrivSec.dev, where we explore topics related to privacy and security.

    + + + + +
    + + + + + + + +
    + + + + + + + + + + + + +
    + + + +
    + + + + + + + + + +
    + + + + + + + + + + + + + +
    + + +

    + © + 2025 + Tommy Tran +

    + + + + +

    + + + Powered by Hugo & Blowfish +

    + +
    + + + + + + + + +
    + + +
    + + + diff --git a/public/posts/contact/index.html b/public/posts/contact/index.html index 9f20063..38eb6c5 100644 --- a/public/posts/contact/index.html +++ b/public/posts/contact/index.html @@ -1,20 +1,1321 @@ -Contact Information · Tommy's Space

    Contact Information

    Tommy Tran
    Author
    Tommy Tran
    System Administrator and Technical Writer

    Matrix
    #

    The best way to contact me is through Matrix. My account is @tommy:metropolis.nexus. If you do not have a an account, you can sign up for one on my homeserver metropolis.nexus. I do not ask for your email address or any personal information for registration.

    Telegram
    #

    My Telegram is TommyTran732. I do not check it as often as I do with Matrix. When contacting me, please use the Secret Chat feature.

    Email
    #

    If you prefer to reach out to me via email, my address is contact@tommytran.io. Aliases:

    Please use encryption if possible. My PGP key is available here.

    Other Accounts
    #

    Discord
    #

    • TommyTran732

    Linkedin
    #

    For employers, please see Hire Me!

    Twitter
    #

    Git accounts
    #

    Please by wary of anyone claiming to be me or using the handle “TommyTran732” reaching out to you. Chances are, they are an impersonator. You can always contact me via Matrix or Email for identity verification.

    © -2025 -Tommy Tran

    Powered by Hugo & Blowfish

    \ No newline at end of file + + + + + + + + + + + + + Contact Information · Tommy's Space + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + +
    +
    + + +
    + + + + +
    + +

    + Contact Information +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    + + + + + + + + + + + +
    + + + + + + + + + + + + + + +
    + + + + + + + + + + + Tommy Tran + + +
    + +
    + Author +
    +
    + Tommy Tran +
    + + +
    System Administrator and Technical Writer
    + +
    +
    + + + + + + + + + + + + + Matrix + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + + + + + + +
    + + + +
    + + +
    + + + + + +
    +
    + + +
    + + Table of Contents + + +
    + + + + +
    +
    + + + +
    + + +
    + +

    Matrix +
    + + + # + + +

    +

    The best way to contact me is through Matrix. My account is @tommy:metropolis.nexus. If you do not have a an account, you can sign up for one on my homeserver metropolis.nexus. I do not ask for your email address or any personal information for registration.

    + +

    Telegram +
    + + + # + + +

    +

    My Telegram is TommyTran732. I do not check it as often as I do with Matrix. When contacting me, please use the Secret Chat feature.

    + +

    Email +
    + + + # + + +

    +

    If you prefer to reach out to me via email, my address is contact@tommytran.io. Aliases:

    + +

    Please use encryption if possible. My PGP key is available here.

    + +

    Other Accounts +
    + + + # + + +

    + +

    Discord +
    + + + # + + +

    +
      +
    • TommyTran732
    • +
    + +

    Linkedin +
    + + + # + + +

    + +

    For employers, please see Hire Me!

    + +

    Twitter +
    + + + # + + +

    + + +

    Git accounts +
    + + + # + + +

    + +

    Please by wary of anyone claiming to be me or using the handle “TommyTran732” reaching out to you. Chances are, they are an impersonator. You can always contact me via Matrix or Email for identity verification.

    + + + + +
    + + + + + + + +
    + + + + + + + + + + + + +
    + + + +
    + + + + + + + + + +
    + + + + + + + + + + + + + +
    + + +

    + © + 2025 + Tommy Tran +

    + + + + +

    + + + Powered by Hugo & Blowfish +

    + +
    + + + + + + + + +
    + + +
    + + + diff --git a/public/posts/hire-me/index.html b/public/posts/hire-me/index.html index 9fd53c2..17a24b3 100644 --- a/public/posts/hire-me/index.html +++ b/public/posts/hire-me/index.html @@ -1,18 +1,1190 @@ -I am open to work! · Tommy's Space

    I am open to work!

    Tommy Tran
    Author
    Tommy Tran
    System Administrator and Technical Writer

    I’m currently open to new opportunities and eager to join a team in the U.S. or Canada as an employee. I do not take on freelance or contract work. For U.S. opportunities, I don’t require visa sponsorship at this time, though I may need it in the future. For Canadian opportunities, I will need an employer to apply for a work permit on my behalf. If you’re looking for a committed team member, let’s connect!

    What I Can Do
    #

    As a system administrator with 5 years of experience, I bring extensive expertise working with all three major Linux families—Red Hat, SUSE, and Debian—with a particular preference for Red Hat systems. While I am primarily a Linux administrator, I am also familiar with Windows systems and can handle tasks such as managing Active Directory.

    I prioritize creating secure and reliable systems, implementing measures like systemd hardening, container hardening, timely vulnerability patching for containers, attack surface reduction, and protecting systems from both external and internal threats.

    Most of my work is open source and available on GitHub. You can explore my server configurations on Metropolis Nexus’s GitHub to see my approach to system administration. For container security, I specialize in porting containers to Alpine Linux and performing daily rebuilds to ensure the latest patches are applied. Check out my work at Polarix-Containers, where I maintain a collection of OCI containers with enhanced protections.

    Qualifications
    #

    I hold several professional certifications, including the Red Hat Certified System Administrator and Linux Foundation Certified Sysadmin, demonstrating my expertise in Linux system administration. For a full list of my certifications, please visit my LinkedIn profile. I am committed to continuous learning and plan to pursue additional certifications in the near future to further enhance my skills.

    © -2025 -Tommy Tran

    Powered by Hugo & Blowfish

    \ No newline at end of file + + + + + + + + + + + + + I am open to work! · Tommy's Space + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + +
    +
    + + +
    + + + + +
    + +

    + I am open to work! +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    + + + + + + + + + + + +
    + + + + + + + + + + + + + + +
    + + + + + + + + + + + Tommy Tran + + +
    + +
    + Author +
    +
    + Tommy Tran +
    + + +
    System Administrator and Technical Writer
    + +
    +
    + + + + + + + + + + + + + Matrix + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + + + + + + +
    + + + +
    + + +
    + + + + + +
    +
    + + +
    + + Table of Contents + + +
    + + + + +
    +
    + + + +
    + + +
    +

    I’m currently open to new opportunities and eager to join a team in the U.S. or Canada as an employee. I do not take on freelance or contract work. For U.S. opportunities, I don’t require visa sponsorship at this time, though I may need it in the future. For Canadian opportunities, I will need an employer to apply for a work permit on my behalf. If you’re looking for a committed team member, let’s connect!

    + +

    What I Can Do +
    + + + # + + +

    +

    As a system administrator with 5 years of experience, I bring extensive expertise working with all three major Linux families—Red Hat, SUSE, and Debian—with a particular preference for Red Hat systems. While I am primarily a Linux administrator, I am also familiar with Windows systems and can handle tasks such as managing Active Directory.

    +

    I prioritize creating secure and reliable systems, implementing measures like systemd hardening, container hardening, timely vulnerability patching for containers, attack surface reduction, and protecting systems from both external and internal threats.

    +

    Most of my work is open source and available on GitHub. You can explore my server configurations on Metropolis Nexus’s GitHub to see my approach to system administration. For container security, I specialize in porting containers to Alpine Linux and performing daily rebuilds to ensure the latest patches are applied. Check out my work at Polarix-Containers, where I maintain a collection of OCI containers with enhanced protections.

    + +

    Qualifications +
    + + + # + + +

    +

    I hold several professional certifications, including the Red Hat Certified System Administrator and Linux Foundation Certified Sysadmin, demonstrating my expertise in Linux system administration. For a full list of my certifications, please visit my LinkedIn profile. I am committed to continuous learning and plan to pursue additional certifications in the near future to further enhance my skills.

    + + + + +
    + + + + + + + +
    + + + + + + + + + + + + +
    + + + +
    + + + + + + + + + +
    + + + + + + + + + + + + + +
    + + +

    + © + 2025 + Tommy Tran +

    + + + + +

    + + + Powered by Hugo & Blowfish +

    + +
    + + + + + + + + +
    + + +
    + + + diff --git a/public/posts/index.html b/public/posts/index.html index 4bb04b4..e408932 100644 --- a/public/posts/index.html +++ b/public/posts/index.html @@ -1,8 +1,1420 @@ -Posts · Tommy's Space

    Posts

    I am open to work!
    My Projects
    Contact Information
    About Me

    © -2025 -Tommy Tran

    Powered by Hugo & Blowfish

    \ No newline at end of file + + + + + + + + + + + + + Posts · Tommy's Space + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + +
    +
    + + + + + + + + + +
    + +

    Posts

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + +
    + + +
    + + + + +
    + +
    + +
    +
    + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + I am open to work! +
    + +
    +
    + +

    + I am open to work! + +

    +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    + + + + + + + + + + + +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + My Projects +
    + +
    +
    + +

    + My Projects + +

    +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    + + + + + + + + + + + +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + Contact Information +
    + +
    +
    + +

    + Contact Information + +

    +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    + + + + + + + + + + + +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + About Me +
    + +
    +
    + +

    + About Me + +

    +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    + + + + + + + + + + + +
    + +
    +
    +
    + + + + +
    + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + +
    + + +

    + © + 2025 + Tommy Tran +

    + + + + +

    + + + Powered by Hugo & Blowfish +

    + +
    + + + + + + + + +
    + + +
    + + + diff --git a/public/posts/index.xml b/public/posts/index.xml index dd23215..993dcb3 100644 --- a/public/posts/index.xml +++ b/public/posts/index.xml @@ -1 +1,53 @@ -Posts on Tommy's Spacehttps://tommytran.io/posts/Recent content in Posts on Tommy's SpaceHugo -- gohugo.ioen© 2025 Tommy TranTue, 23 Sep 2025 00:00:00 +0000I am open to work!https://tommytran.io/posts/hire-me/Tue, 23 Sep 2025 00:00:00 +0000https://tommytran.io/posts/hire-me/About Mehttps://tommytran.io/posts/about/Fri, 02 Sep 2022 00:00:00 +0000https://tommytran.io/posts/about/Contact Informationhttps://tommytran.io/posts/contact/Fri, 02 Sep 2022 00:00:00 +0000https://tommytran.io/posts/contact/My Projectshttps://tommytran.io/posts/projects/Fri, 02 Sep 2022 00:00:00 +0000https://tommytran.io/posts/projects/ \ No newline at end of file + + + + Posts on Tommy's Space + http://localhost:1313/posts/ + Recent content in Posts on Tommy's Space + Hugo -- gohugo.io + en + © 2025 Tommy Tran + Tue, 23 Sep 2025 00:00:00 +0000 + + + I am open to work! + http://localhost:1313/posts/hire-me/ + Tue, 23 Sep 2025 00:00:00 +0000 + + http://localhost:1313/posts/hire-me/ + + + + + + About Me + http://localhost:1313/posts/about/ + Fri, 02 Sep 2022 00:00:00 +0000 + + http://localhost:1313/posts/about/ + + + + + + Contact Information + http://localhost:1313/posts/contact/ + Fri, 02 Sep 2022 00:00:00 +0000 + + http://localhost:1313/posts/contact/ + + + + + + My Projects + http://localhost:1313/posts/projects/ + Fri, 02 Sep 2022 00:00:00 +0000 + + http://localhost:1313/posts/projects/ + + + + + + diff --git a/public/posts/page/1/index.html b/public/posts/page/1/index.html index f58ed29..440847b 100644 --- a/public/posts/page/1/index.html +++ b/public/posts/page/1/index.html @@ -1 +1,9 @@ -https://tommytran.io/posts/ \ No newline at end of file + + + + http://localhost:1313/posts/ + + + + + diff --git a/public/posts/projects/index.html b/public/posts/projects/index.html index da1d0bf..eb6987c 100644 --- a/public/posts/projects/index.html +++ b/public/posts/projects/index.html @@ -1,17 +1,1334 @@ -My Projects · Tommy's Space

    My Projects

    Tommy Tran
    Author
    Tommy Tran
    System Administrator and Technical Writer

    These are some of my most notable projects. For a complete list, please visit my GitHub profile.

    PrivSec.dev
    #

    PrivSec.dev is a website created by me and a few friends to provide practical privacy and security advice for end users. Think of it as a shared blog focused on this topic.

    We emphasize in-depth system configuration, security analysis, and software/hardware recommendations, prioritizing technical merits over ideologies or politics.

    Polarix Containers
    #

    Polarix Containers is a collection of OCI containers designed to enhance security compared to upstream builds.

    Some containers are daily rebuilds of upstream containers, while others are rebuilt from scratch using Alpine Linux or Red Hat UBI with unprivileged users, maintaining upstream compatibility. Most builds include hardened_malloc for added security.

    Polarix Containers serve as the foundation for my other projects, such as Metropolis.nexus.

    Metropolis.nexus
    #

    Metropolis.nexus is a collection of services I offer free of charge, including but not limited to:

    • Matrix
    • Mastodon
    • Vaultwarden
    • Redlib
    • Traccar
    • Stirling PDF
    • Signature PDF

    The Metropolis-nexus GitHub organization contains repositories documenting the system’s setup. Key subprojects include:

    Linux Setup Scripts
    #

    These setup scripts are used on my Linux systems and include hardening configurations such as:

    • Removal of unnecessary packages
    • Hardened boot parameters
    • Hardened sysctl settings
    • Kernel module blacklist from SecureBlue
    • SSH client and server hardening
    • Systemd hardening
    • Installation of Hardened Malloc on Red Hat systems
    • NTS setup

    Fedora CoreOS Ignition Files
    #

    These Butane/Ignition configuration files enable rapid deployment of Fedora CoreOS servers with the same hardening as the Linux Setup Scripts.

    They also include systemd services to:

    • Install and update gVisor at boot
    • Update containers in a Docker Compose stack daily

    NGINX Configs
    #

    My reverse proxy setup is available in this repository. It includes:

    • TLS configuration with strong cipher suites
    • A robust set of security headers
    • Content security policies for various services
    • ModSecurity configuration
    • Systemd hardening for system services

    QubesOS scripts
    #

    My QubesOS scripts configure Qubes virtual machines with the same hardening as my Linux setup scripts, tailored for Qubes’ unique environment. I also provide documentation on how I set up my daily driver — a ThinkPad P53 — with Qubes for maximum privacy and security.

    Microsoft Egde Policies
    #

    Microsoft Edge can be one of the best browsers when configured properly, but it is privacy-invasive and has a large attack surface by default. My list of policies configures it for improved privacy and security.

    © -2025 -Tommy Tran

    Powered by Hugo & Blowfish

    \ No newline at end of file + + + + + + + + + + + + + My Projects · Tommy's Space + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + +
    +
    + + +
    + + + + +
    + +

    + My Projects +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    + + + + + + + + + + + +
    + + + + + + + + + + + + + + +
    + + + + + + + + + + + Tommy Tran + + +
    + +
    + Author +
    +
    + Tommy Tran +
    + + +
    System Administrator and Technical Writer
    + +
    +
    + + + + + + + + + + + + + Matrix + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + + + + + + +
    + + + +
    + + +
    + + + + + + + + + +
    + + +
    +

    These are some of my most notable projects. For a complete list, please visit my GitHub profile.

    + +

    PrivSec.dev +
    + + + # + + +

    +

    PrivSec.dev is a website created by me and a few friends to provide practical privacy and security advice for end users. Think of it as a shared blog focused on this topic.

    +

    We emphasize in-depth system configuration, security analysis, and software/hardware recommendations, prioritizing technical merits over ideologies or politics.

    + +

    Polarix Containers +
    + + + # + + +

    +

    Polarix Containers is a collection of OCI containers designed to enhance security compared to upstream builds.

    +

    Some containers are daily rebuilds of upstream containers, while others are rebuilt from scratch using Alpine Linux or Red Hat UBI with unprivileged users, maintaining upstream compatibility. Most builds include hardened_malloc for added security.

    +

    Polarix Containers serve as the foundation for my other projects, such as Metropolis.nexus.

    + +

    Metropolis.nexus +
    + + + # + + +

    +

    Metropolis.nexus is a collection of services I offer free of charge, including but not limited to:

    +
      +
    • Matrix
    • +
    • Mastodon
    • +
    • Vaultwarden
    • +
    • Redlib
    • +
    • Traccar
    • +
    • Stirling PDF
    • +
    • Signature PDF
    • +
    +

    The Metropolis-nexus GitHub organization contains repositories documenting the system’s setup. Key subprojects include:

    + +

    Linux Setup Scripts +
    + + + # + + +

    +

    These setup scripts are used on my Linux systems and include hardening configurations such as:

    +
      +
    • Removal of unnecessary packages
    • +
    • Hardened boot parameters
    • +
    • Hardened sysctl settings
    • +
    • Kernel module blacklist from SecureBlue
    • +
    • SSH client and server hardening
    • +
    • Systemd hardening
    • +
    • Installation of Hardened Malloc on Red Hat systems
    • +
    • NTS setup
    • +
    + +

    Fedora CoreOS Ignition Files +
    + + + # + + +

    +

    These Butane/Ignition configuration files enable rapid deployment of Fedora CoreOS servers with the same hardening as the Linux Setup Scripts.

    +

    They also include systemd services to:

    +
      +
    • Install and update gVisor at boot
    • +
    • Update containers in a Docker Compose stack daily
    • +
    + +

    NGINX Configs +
    + + + # + + +

    +

    My reverse proxy setup is available in this repository. It includes:

    +
      +
    • TLS configuration with strong cipher suites
    • +
    • A robust set of security headers
    • +
    • Content security policies for various services
    • +
    • ModSecurity configuration
    • +
    • Systemd hardening for system services
    • +
    + +

    QubesOS scripts +
    + + + # + + +

    +

    My QubesOS scripts configure Qubes virtual machines with the same hardening as my Linux setup scripts, tailored for Qubes’ unique environment. I also provide documentation on how I set up my daily driver — a ThinkPad P53 — with Qubes for maximum privacy and security.

    + +

    Microsoft Egde Policies +
    + + + # + + +

    +

    Microsoft Edge can be one of the best browsers when configured properly, but it is privacy-invasive and has a large attack surface by default. My list of policies configures it for improved privacy and security.

    + + + + +
    + + + + + + + +
    + + + + + + + + + + + + +
    + + + +
    + + + + + + + + + +
    + + + + + + + + + + + + + +
    + + +

    + © + 2025 + Tommy Tran +

    + + + + +

    + + + Powered by Hugo & Blowfish +

    + +
    + + + + + + + + +
    + + +
    + + + diff --git a/public/robots.txt b/public/robots.txt index 6c7fcb3..5759686 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,3 +1,3 @@ User-agent: * -Allow: / -Sitemap: https://tommytran.io/sitemap.xml +Disallow: / +Sitemap: http://localhost:1313/sitemap.xml diff --git a/public/series/index.html b/public/series/index.html index e166574..397cd8b 100644 --- a/public/series/index.html +++ b/public/series/index.html @@ -1,8 +1,817 @@ -Series · Tommy's Space

    Series

    © -2025 -Tommy Tran

    Powered by Hugo & Blowfish

    \ No newline at end of file + + + + + + + + + + + + + Series · Tommy's Space + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + +
    +
    + + + +
    + +

    Series

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + +
    +
    + + + + +
    + +
    + + + + + + + + + + + +
    + + + + + + + + + + + + + +
    + + +

    + © + 2025 + Tommy Tran +

    + + + + +

    + + + Powered by Hugo & Blowfish +

    + +
    + + + + + + + + +
    + + +
    + + + diff --git a/public/series/index.xml b/public/series/index.xml index 319840c..4496140 100644 --- a/public/series/index.xml +++ b/public/series/index.xml @@ -1 +1,13 @@ -Series on Tommy's Spacehttps://tommytran.io/series/Recent content in Series on Tommy's SpaceHugo -- gohugo.ioen© 2025 Tommy Tran \ No newline at end of file + + + + Series on Tommy's Space + http://localhost:1313/series/ + Recent content in Series on Tommy's Space + Hugo -- gohugo.io + en + © 2025 Tommy Tran + + + + diff --git a/public/sitemap.xml b/public/sitemap.xml index fee6d80..4d29436 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -1 +1,41 @@ -https://tommytran.io/posts/hire-me/2025-09-23T00:00:00+00:00daily0.5https://tommytran.io/posts/2025-09-23T00:00:00+00:00daily0.5https://tommytran.io/2025-09-23T00:00:00+00:00daily0.5https://tommytran.io/posts/about/2022-09-02T00:00:00+00:00daily0.5https://tommytran.io/posts/contact/2022-09-02T00:00:00+00:00daily0.5https://tommytran.io/posts/projects/2022-09-02T00:00:00+00:00daily0.5 \ No newline at end of file + + + + + http://localhost:1313/posts/hire-me/ + 2025-09-23T00:00:00+00:00 + daily + 0.5 + + + http://localhost:1313/posts/ + 2025-09-23T00:00:00+00:00 + daily + 0.5 + + + http://localhost:1313/ + 2025-09-23T00:00:00+00:00 + daily + 0.5 + + + http://localhost:1313/posts/about/ + 2022-09-02T00:00:00+00:00 + daily + 0.5 + + + http://localhost:1313/posts/contact/ + 2022-09-02T00:00:00+00:00 + daily + 0.5 + + + http://localhost:1313/posts/projects/ + 2022-09-02T00:00:00+00:00 + daily + 0.5 + + diff --git a/public/tags/index.html b/public/tags/index.html index 82df3e5..415e036 100644 --- a/public/tags/index.html +++ b/public/tags/index.html @@ -1,8 +1,817 @@ -Tags · Tommy's Space

    Tags

    © -2025 -Tommy Tran

    Powered by Hugo & Blowfish

    \ No newline at end of file + + + + + + + + + + + + + Tags · Tommy's Space + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + +
    +
    + + + +
    + +

    Tags

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + +
    +
    + + + + +
    + +
    + + + + + + + + + + + +
    + + + + + + + + + + + + + +
    + + +

    + © + 2025 + Tommy Tran +

    + + + + +

    + + + Powered by Hugo & Blowfish +

    + +
    + + + + + + + + +
    + + +
    + + + diff --git a/public/tags/index.xml b/public/tags/index.xml index 108a2b5..03e3110 100644 --- a/public/tags/index.xml +++ b/public/tags/index.xml @@ -1 +1,13 @@ -Tags on Tommy's Spacehttps://tommytran.io/tags/Recent content in Tags on Tommy's SpaceHugo -- gohugo.ioen© 2025 Tommy Tran \ No newline at end of file + + + + Tags on Tommy's Space + http://localhost:1313/tags/ + Recent content in Tags on Tommy's Space + Hugo -- gohugo.io + en + © 2025 Tommy Tran + + + + diff --git a/themes/blowfish b/themes/blowfish index 3e652b3..d0db919 160000 --- a/themes/blowfish +++ b/themes/blowfish @@ -1 +1 @@ -Subproject commit 3e652b3749f3f46b26258662599649d10dba2708 +Subproject commit d0db9190d4d678d809064a7d666906ef5d9c2653