]> git.otsuka.systems Git - cotsuka.github.io/commitdiff
migrate to astro
authorCameron Otsuka <cameron@otsuka.haus>
Sun, 15 Jun 2025 20:44:55 +0000 (13:44 -0700)
committerCameron Otsuka <cameron@otsuka.haus>
Sun, 15 Jun 2025 20:44:55 +0000 (13:44 -0700)
103 files changed:
.github/workflows/deploy-to-ghpages.yml
.gitignore
.vscode/extensions.json [new file with mode: 0644]
.vscode/launch.json [new file with mode: 0644]
.vscode/settings.json [new file with mode: 0644]
_data/metadata.json [deleted file]
_includes/components/activitylist.njk [deleted file]
_includes/components/posse.njk [deleted file]
_includes/css/prism-okaidia.css [deleted file]
_includes/css/public-sans.css [deleted file]
_includes/css/reset.css [deleted file]
_includes/css/style.css [deleted file]
_includes/layouts/base.njk [deleted file]
_includes/layouts/home.njk [deleted file]
_includes/layouts/post.njk [deleted file]
astro.config.mjs [new file with mode: 0644]
bun.lock
content/404.md [deleted file]
content/articles.njk [deleted file]
content/articles/articles.json [deleted file]
content/articles/bitcoin-mempools-cleared-is-nobody-using-bitcoin/index.mdx [moved from content/articles/bitcoin-mempools-cleared-is-nobody-using-bitcoin/index.md with 80% similarity]
content/articles/minimum-utxo-value/index.mdx [moved from content/articles/minimum-utxo-value/index.md with 71% similarity]
content/articles/monetary-system-enshittification/index.mdx [moved from content/articles/monetary-system-enshittification/index.md with 90% similarity]
content/articles/r1-vs-o1-ai-as-commodity-or-moat/index.mdx [moved from content/articles/r1-vs-o1-ai-as-commodity-or-moat/index.md with 73% similarity]
content/articles/removing-a-drive-from-a-btrfs-array.mdx [moved from content/articles/removing-a-drive-from-a-btrfs-array.md with 95% similarity]
content/bitcoin.md [deleted file]
content/index.md [deleted file]
content/links.njk [deleted file]
content/links/build-weekly-roundup-2025-week-11.mdx [moved from content/links/build-weekly-roundup-2025-week-11.md with 82% similarity]
content/links/build-weekly-roundup-2025-week-12.mdx [moved from content/links/build-weekly-roundup-2025-week-12.md with 81% similarity]
content/links/build-weekly-roundup-2025-week-14.mdx [moved from content/links/build-weekly-roundup-2025-week-14.md with 79% similarity]
content/links/build-weekly-roundup-2025-week-15.mdx [moved from content/links/build-weekly-roundup-2025-week-15.md with 79% similarity]
content/links/build-weekly-roundup-2025-week-17.mdx [moved from content/links/build-weekly-roundup-2025-week-17.md with 80% similarity]
content/links/build-weekly-roundup-2025-week-18.mdx [moved from content/links/build-weekly-roundup-2025-week-18.md with 78% similarity]
content/links/build-weekly-roundup-2025-week-19.mdx [moved from content/links/build-weekly-roundup-2025-week-19.md with 77% similarity]
content/links/build-weekly-roundup-2025-week-20.mdx [moved from content/links/build-weekly-roundup-2025-week-20.md with 80% similarity]
content/links/build-weekly-roundup-2025-week-21.mdx [moved from content/links/build-weekly-roundup-2025-week-21.md with 77% similarity]
content/links/build-weekly-roundup-2025-week-23.mdx [moved from content/links/build-weekly-roundup-2025-week-23.md with 78% similarity]
content/links/build-weekly-roundup-2025-week-24.md [deleted file]
content/links/build-weekly-roundup-2025-week-5.mdx [moved from content/links/build-weekly-roundup-2025-week-5.md with 100% similarity]
content/links/build-weekly-roundup-2025-week-6.mdx [moved from content/links/build-weekly-roundup-2025-week-6.md with 83% similarity]
content/links/build-weekly-roundup-2025-week-7.mdx [moved from content/links/build-weekly-roundup-2025-week-7.md with 79% similarity]
content/links/build-weekly-roundup-2025-week-8.mdx [moved from content/links/build-weekly-roundup-2025-week-8.md with 78% similarity]
content/links/links.json [deleted file]
content/links/were-ripping-off-the-cuff-about-dollar-rallying-rates-stargate-and-deepseek-listen-in.mdx [moved from content/links/were-ripping-off-the-cuff-about-dollar-rallying-rates-stargate-and-deepseek-listen-in.md with 100% similarity]
content/reviews.njk [deleted file]
content/reviews/28-days-later.md [deleted file]
content/reviews/a-complete-unknown.mdx [moved from content/reviews/a-complete-unknown.md with 100% similarity]
content/reviews/burning.mdx [moved from content/reviews/burning.md with 100% similarity]
content/reviews/challengers.mdx [moved from content/reviews/challengers.md with 94% similarity]
content/reviews/conclave.mdx [moved from content/reviews/conclave.md with 100% similarity]
content/reviews/hunchback-of-notre-dame.mdx [moved from content/reviews/hunchback-of-notre-dame.md with 100% similarity]
content/reviews/its-whats-inside.mdx [moved from content/reviews/its-whats-inside.md with 100% similarity]
content/reviews/perfect-days.mdx [moved from content/reviews/perfect-days.md with 100% similarity]
content/reviews/reviews.json [deleted file]
content/reviews/sinners.mdx [moved from content/reviews/sinners.md with 100% similarity]
content/reviews/subservience.mdx [moved from content/reviews/subservience.md with 94% similarity]
content/reviews/the-boy-and-the-heron.mdx [moved from content/reviews/the-boy-and-the-heron.md with 93% similarity]
content/reviews/warfare.mdx [moved from content/reviews/warfare.md with 100% similarity]
content/reviews/wicked.mdx [moved from content/reviews/wicked.md with 93% similarity]
data/contributions.json [moved from _data/contributions.json with 100% similarity]
data/metadata.json [new file with mode: 0644]
data/socials.json [moved from _data/socials.json with 100% similarity]
eleventy.config.js [deleted file]
package.json
public/.well-known/atproto-did [moved from static/.well-known/atproto-did with 100% similarity]
public/.well-known/nostr.json [moved from static/.well-known/nostr.json with 100% similarity]
public/CNAME [moved from static/CNAME with 100% similarity]
public/public/banner.jpg [moved from static/public/banner.jpg with 100% similarity]
public/public/bitcoin.pdf [moved from static/public/bitcoin.pdf with 100% similarity]
public/public/pfp.jpg [moved from static/public/pfp.jpg with 100% similarity]
src/assets/favicon.ico [moved from static/favicon.ico with 100% similarity]
src/components/footer.astro [new file with mode: 0644]
src/components/head/article.astro [new file with mode: 0644]
src/components/head/base.astro [new file with mode: 0644]
src/components/head/page.astro [new file with mode: 0644]
src/components/heading.astro [new file with mode: 0644]
src/components/navigation.astro [new file with mode: 0644]
src/components/posse.astro [new file with mode: 0644]
src/components/ui/callout.astro [new file with mode: 0644]
src/components/ui/figure.astro [new file with mode: 0644]
src/components/youtube.astro [new file with mode: 0644]
src/content.config.ts [new file with mode: 0644]
src/layouts/article.astro [new file with mode: 0644]
src/layouts/base.astro [new file with mode: 0644]
src/pages/404.astro [new file with mode: 0644]
src/pages/articles.astro [new file with mode: 0644]
src/pages/articles/[date]-[id].astro [new file with mode: 0644]
src/pages/bitcoin.astro [new file with mode: 0644]
src/pages/index.astro [new file with mode: 0644]
src/pages/links.astro [new file with mode: 0644]
src/pages/links/[date]-[id].astro [new file with mode: 0644]
src/pages/reviews.astro [new file with mode: 0644]
src/pages/reviews/[date]-[id].astro [new file with mode: 0644]
src/styles/global.css [new file with mode: 0644]
src/utils/format.ts [new file with mode: 0644]
static/fonts/PublicSans-Bold.woff2 [deleted file]
static/fonts/PublicSans-BoldItalic.woff2 [deleted file]
static/fonts/PublicSans-Italic.woff2 [deleted file]
static/fonts/PublicSans-Regular.woff2 [deleted file]
static/fonts/PublicSans-Thin.woff2 [deleted file]
static/fonts/PublicSans-ThinItalic.woff2 [deleted file]
tsconfig.json [new file with mode: 0644]

index 4831fdb2ffd2107e8a6b9adb020a17a5566e3ad2..c3a26df2d291bdb14f83091b8cc39ebe7b6eb6b2 100644 (file)
@@ -4,38 +4,24 @@ on:
   push:
     branches:
       - main
-  pull_request:
 
 jobs:
-  deploy:
+  build:
     runs-on: ubuntu-latest
     permissions:
-      contents: write
-    concurrency:
-      group: ${{ github.workflow }}-${{ github.ref }}
+      contents: read
     steps:
       - uses: actions/checkout@v4
-
-      - name: Setup Bun
-        uses: oven-sh/setup-bun@v2
-        with:
-          bun-version: latest
-          # bun-version-file: 'package.json'
-
-      - name: Persist Bun cache
-        uses: actions/cache@v4
-        with:
-          path: ~/.bun/install/cache
-          key: ${{ runner.os }}-${{ matrix.bun }}-bun-${{ hashFiles('**/bun.lock') }}
-          restore-keys: |
-            ${{ runner.os }}-${{ matrix.bun }}-bun-
-
-      - run: bun install
-      - run: bun run build-ghpages
-
-      - name: Deploy
-        uses: peaceiris/actions-gh-pages@v4
-        if: github.ref == 'refs/heads/main'
-        with:
-          github_token: ${{ secrets.GITHUB_TOKEN }}
-          publish_dir: ./_site
\ No newline at end of file
+      - uses: withastro/action@v3
+  deploy:
+    needs: build
+    runs-on: ubuntu-latest
+    permissions:
+      pages: write
+      id-token: write
+    environment:
+      name: github-pages
+      url: ${{ steps.deployment.outputs.page_url }}
+    steps:
+      - uses: actions/deploy-pages@v4
+        id: deployment
\ No newline at end of file
index 19ded4c407cc65fa66c51cbe089cfca18578f9f2..16d54bb13c8a867268b45c22eb7794d2625a78f5 100644 (file)
@@ -1,4 +1,24 @@
-_site/
+# build output
+dist/
+# generated types
+.astro/
+
+# dependencies
 node_modules/
-package-lock.json
-.cache
\ No newline at end of file
+
+# logs
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+
+# environment variables
+.env
+.env.production
+
+# macOS-specific files
+.DS_Store
+
+# jetbrains setting folder
+.idea/
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644 (file)
index 0000000..56f043d
--- /dev/null
@@ -0,0 +1,4 @@
+{
+  "recommendations": ["astro-build.astro-vscode", "unifiedjs.vscode-mdx"],
+  "unwantedRecommendations": []
+}
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644 (file)
index 0000000..1ea3455
--- /dev/null
@@ -0,0 +1,11 @@
+{
+  "version": "0.2.0",
+  "configurations": [
+    {
+      "command": "bun x --bun astro dev",
+      "name": "Development server",
+      "request": "launch",
+      "type": "node-terminal"
+    }
+  ]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644 (file)
index 0000000..7e980b0
--- /dev/null
@@ -0,0 +1,5 @@
+{
+  "[astro]": {
+    "editor.defaultFormatter": "astro-build.astro-vscode"
+  }
+}
\ No newline at end of file
diff --git a/_data/metadata.json b/_data/metadata.json
deleted file mode 100644 (file)
index 70befa1..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-    "title": "Cameron Otsuka",
-    "subtitle": "The collection of Cameron's thoughts.",
-    "base": "https://otsuka.haus",
-    "language": "en",
-    "author": {
-        "name": "Cameron Otsuka",
-        "email": "cameron@otsuka.haus"
-    },
-    "categories": {
-        "articles": [],
-        "links": [
-            "video",
-            "podcast"
-        ],
-        "reviews": [
-            "movie",
-            "music",
-            "show"
-        ]
-    },
-    "calloutLabels": {
-        "info": "ⓘ Info",
-        "warn": "⚠ Warning",
-        "error": "! Error"
-    }
-}
\ No newline at end of file
diff --git a/_includes/components/activitylist.njk b/_includes/components/activitylist.njk
deleted file mode 100644 (file)
index 8921837..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-<dl>
-{%- if page.filePathStem === "/articles" -%}
-    {% set activitiescollection = collections.articles %}
-{%- elseif page.filePathStem === "/links" -%}
-    {% set activitiescollection = collections.links %}
-{%- elseif page.filePathStem === "/reviews" -%}
-    {% set activitiescollection = collections.reviews %}
-{%- else -%}
-    {% set activitiescollection = collections.activities %}
-{%- endif %}
-
-{%- set numPosts = maxPosts | default(activitiescollection | length) %}
-{%- set activitieslist = activitiescollection | reverse | head(numPosts) %}
-
-{%- for item in activitieslist %}
-    <dt><a href="{{ item.url }}">{{ item.data.title }}</a></dt>
-    <dd>
-        {%- set tag = false %}
-        {%- if page.filePathStem === "/articles" -%}
-            {% set tag = "" %}
-        {%- elseif page.filePathStem === "/links" -%}
-            {%- if "video" in item.data.tags -%}
-                {% set tag = "video" %}
-            {%- elseif "podcast" in item.data.tags -%}
-                {% set tag = "podcast" %}
-            {%- endif %}
-        {%- elseif page.filePathStem === "/reviews" -%}
-            {%- if "movie" in item.data.tags -%}
-                {% set tag = "movie" %}
-            {%- elseif "music" in item.data.tags -%}
-                {% set tag = "music" %}
-            {%- elseif "show" in item.data.tags -%}
-                {% set tag = "show" %}
-            {%- endif %}
-        {%- else -%}
-            {%- if "articles" in item.data.tags -%}
-                {% set tag = "article" %}
-            {%- elseif "reviews" in item.data.tags -%}
-                {% set tag = "review" %}
-            {%- elseif "links" in item.data.tags -%}
-                {% set tag = "link" %}
-            {%- endif %}
-        {%- endif %}
-
-        {%- if tag -%}
-            <small class="collectiontag">{{ tag }}</small>
-        {%- endif %}
-        {{ item.data.description }}
-    </dd>
-{%- endfor %}
-</dl>
\ No newline at end of file
diff --git a/_includes/components/posse.njk b/_includes/components/posse.njk
deleted file mode 100644 (file)
index 94e5005..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<li>
-    Also Posted To: 
-    {%- for posse_location, posse_url in posse %}
-        <a href="{{ posse_url }}">{{ posse_location }}</a>
-    {%- endfor %}
-</li>
\ No newline at end of file
diff --git a/_includes/css/prism-okaidia.css b/_includes/css/prism-okaidia.css
deleted file mode 100644 (file)
index 28abb2f..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-/**
- * okaidia theme for JavaScript, CSS and HTML
- * Loosely based on Monokai textmate theme by http://www.monokai.nl/
- * @author ocodia
- */
-
-code[class*="language-"],
-pre[class*="language-"] {
-       color: #f8f8f2;
-       background: none;
-       text-shadow: 0 1px rgba(0, 0, 0, 0.3);
-       font-family: monospace;
-       font-size: 0.75rem;
-       text-align: left;
-       white-space: pre;
-       word-spacing: normal;
-       word-break: normal;
-       word-wrap: normal;
-       line-height: 1rem;
-
-       -moz-tab-size: 4;
-       -o-tab-size: 4;
-       tab-size: 4;
-
-       -webkit-hyphens: none;
-       -moz-hyphens: none;
-       -ms-hyphens: none;
-       hyphens: none;
-}
-
-/* Code blocks */
-pre[class*="language-"] {
-       padding: 1em;
-       margin: .5em 0;
-       overflow: auto;
-       border-radius: 0.3em;
-}
-
-:not(pre) > code[class*="language-"],
-pre[class*="language-"] {
-       background: #272822;
-}
-
-/* Inline code */
-:not(pre) > code[class*="language-"] {
-       padding: .1em;
-       border-radius: .3em;
-       white-space: normal;
-}
-
-.token.comment,
-.token.prolog,
-.token.doctype,
-.token.cdata {
-       color: #8292a2;
-}
-
-.token.punctuation {
-       color: #f8f8f2;
-}
-
-.token.namespace {
-       opacity: .7;
-}
-
-.token.property,
-.token.tag,
-.token.constant,
-.token.symbol,
-.token.deleted {
-       color: #f92672;
-}
-
-.token.boolean,
-.token.number {
-       color: #ae81ff;
-}
-
-.token.selector,
-.token.attr-name,
-.token.string,
-.token.char,
-.token.builtin,
-.token.inserted {
-       color: #a6e22e;
-}
-
-.token.operator,
-.token.entity,
-.token.url,
-.language-css .token.string,
-.style .token.string,
-.token.variable {
-       color: #f8f8f2;
-}
-
-.token.atrule,
-.token.attr-value,
-.token.function,
-.token.class-name {
-       color: #e6db74;
-}
-
-.token.keyword {
-       color: #66d9ef;
-}
-
-.token.regex,
-.token.important {
-       color: #fd971f;
-}
-
-.token.important,
-.token.bold {
-       font-weight: bold;
-}
-.token.italic {
-       font-style: italic;
-}
-
-.token.entity {
-       cursor: help;
-}
diff --git a/_includes/css/public-sans.css b/_includes/css/public-sans.css
deleted file mode 100644 (file)
index b10dd88..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-@font-face {
-    font-family: "Public Sans";
-    font-style: normal;
-    font-weight: 100;
-    font-display: swap;
-    src: url("/fonts/PublicSans-Thin.woff2") format("woff2")
-}
-
-@font-face {
-    font-family: "Public Sans";
-    font-style: normal;
-    font-weight: 400;
-    font-display: swap;
-    src: url("/fonts/PublicSans-Regular.woff2") format("woff2")
-}
-
-@font-face {
-    font-family: "Public Sans";
-    font-style: normal;
-    font-weight: 700;
-    font-display: swap;
-    src: url("/fonts/PublicSans-Bold.woff2") format("woff2")
-}
-
-@font-face {
-    font-family: "Public Sans";
-    font-style: italic;
-    font-weight: 100;
-    font-display: swap;
-    src: url("/fonts/PublicSans-ThinItalic.woff2") format("woff2")
-}
-
-@font-face {
-    font-family: "Public Sans";
-    font-style: italic;
-    font-weight: 400;
-    font-display: swap;
-    src: url("/fonts/PublicSans-Italic.woff2") format("woff2")
-}
-
-@font-face {
-    font-family: "Public Sans";
-    font-style: italic;
-    font-weight: 700;
-    font-display: swap;
-    src: url("/fonts/PublicSans-BoldItalic.woff2") format("woff2")
-}
\ No newline at end of file
diff --git a/_includes/css/reset.css b/_includes/css/reset.css
deleted file mode 100644 (file)
index 7c22795..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
-  Josh's Custom CSS Reset
-  https://www.joshwcomeau.com/css/custom-css-reset/
-*/
-
-*, *::before, *::after {
-  box-sizing: border-box;
-}
-
-* {
-  margin: 0;
-}
-
-body {
-  line-height: 1.5;
-  -webkit-font-smoothing: antialiased;
-}
-
-img, picture, video, canvas, svg {
-  display: block;
-  max-width: 100%;
-}
-
-input, button, textarea, select {
-  font: inherit;
-}
-
-p, h1, h2, h3, h4, h5, h6 {
-  overflow-wrap: break-word;
-}
-
-p {
-  text-wrap: pretty;
-}
-h1, h2, h3, h4, h5, h6 {
-  text-wrap: balance;
-}
-
-#root, #__next {
-  isolation: isolate;
-}
\ No newline at end of file
diff --git a/_includes/css/style.css b/_includes/css/style.css
deleted file mode 100644 (file)
index 3d052c0..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-html {
-  background-color: #ffffff;
-  color: #000000;
-  font-family: "Public Sans", sans-serif;
-  font-weight: 400;
-  font-size: 100%;
-  line-height: 1.1rem;
-}
-body {
-  max-width: 45rem;
-  margin-left: auto;
-  margin-right: auto;
-  padding: 0.5rem 1rem;
-  font-size: 1rem;
-}
-h1 {
-  font-weight: 100;
-}
-h2, h3, h4, h5, h6 {
-  font-weight: 700;
-}
-strong {
-  font-weight: 700;
-}
-nav {
-  margin-bottom: 1rem;
-}
-nav > h1 {
-  font-size: 2rem;
-  font-weight: 700;
-}
-nav > h1 > a {
-  text-decoration: none;
-}
-nav > menu {
-  margin-inline-start: 0;
-  padding-inline-start: 0;
-}
-nav > menu > li {
-  display: inline;
-  padding-right: 1rem;
-}
-details {
-  margin-bottom: 1rem;
-  font-size: 0.8rem;
-}
-p {
-  margin-bottom: 1rem;
-}
-dl, menu, ol, ul {
-  margin-bottom: 1rem;
-}
-ul ul, ul ol, ul dl, ul menu,
-ol ul, ol ol, ol dl, ol menu,
-dl ul, dl ol, dl dl, dl menu,
-menu ul, menu ol, menu dl, menu menu {
-  /* nested lists won't have margins*/
-  margin-bottom: 0;
-}
-dd {
-  margin-bottom: 0.2rem;
-  padding-left: 1.5rem;
-}
-blockquote {
-  margin-bottom: 1rem;
-  padding-left: 0.5rem;
-  border-left: 0.2rem solid;
-}
-figure {
-  margin-bottom: 1rem;
-}
-figcaption {
-  font-size: 0.8rem;
-}
-img {
-  height: auto;
-}
-figcaption {
-  font-style: italic;
-}
-table {
-  margin-bottom: 1rem;
-  border: 0.1rem solid;
-  border-collapse: collapse;
-}
-th, td {
-  border: 0.1rem solid;
-  text-align: center;
-  vertical-align: middle;
-  padding: 0.5rem;
-}
-object {
-  width: 100%;
-}
-hr {
-  margin-bottom: 1rem;
-  margin-top: 1rem;
-}
-footer {
-  text-align: center;
-}
-footer > address > menu {
-  margin-inline-start: 0;
-  padding-inline-start: 0;
-}
-footer > address > menu > li {
-  display: inline;
-  padding-right: 0.2rem;
-}
-.callout {
-  margin-bottom: 1rem;
-  padding-left: 0.5rem;
-  border-left: 0.2rem solid;
-}
-.callout-info {
-  border-left: 0.2rem solid #086ddd;
-}
-.callout-info > .callout-label {
-  color: #086ddd;
-  font-weight: 700;
-}
-.callout-warn {
-  border-left: 0.2rem solid #ec7500;
-}
-.callout-warn > .callout-label {
-  color: #ec7500;
-  font-weight: 700;
-}
-.callout-error {
-  border-left: 0.2rem solid #e93147;
-}
-.callout-error > .callout-label {
-  color: #e93147;
-  font-weight: 700;
-}
-.collectiontag {
-  font-variant: small-caps;
-}
-iframe.youtube-shortcode {
-  aspect-ratio: 16 / 9;
-  width: 100%;
-  display: block;
-}
\ No newline at end of file
diff --git a/_includes/layouts/base.njk b/_includes/layouts/base.njk
deleted file mode 100644 (file)
index dd3d177..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-<!doctype html>
-<html lang="{{ metadata.language }}" prefix="og: http://ogp.me/ns#">
-<head>
-    {%- if modified -%}
-        {% set updated = modified %}
-    {%- else -%}
-        {% set updated = date %}
-    {%- endif %}
-    <meta charset="utf-8" />
-    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src 'self' 'unsafe-inline'; frame-src youtube.com www.youtube.com youtube-noocookie.com www.youtube-nocookie.com" />
-    <meta name="title" property="og:title" content="{{ title }}" />
-    <meta name="description" property="og:description" content="{{ description or metadata.subtitle }}" />
-    <meta name="author" content="{{ metadata.author.name }}" />
-    <meta name="generator" content="{{ eleventy.generator }}" />
-    <meta name="fediverse:creator" content="{{ socials.activitypub.username }}" />
-    <meta name="twitter:card" content="summary" />
-    <meta name="twitter:creator" content="{{ socials.x.username }}" />
-    <meta name="twitter:title" content="{{ title }}" />
-    <meta name="twitter:description" content="{{ description or metadata.subtitle }}" />
-    <meta name="twitter:image" property="og:image" content="https://v1.screenshot.11ty.dev/{{ metadata.base | urlencode }}{{ page.url | urlencode }}/opengraph/9:16/" />
-    <meta property="og:image:type" content="image/jpeg" />
-    <meta property="og:image:width" content="1200" />
-    <meta property="og:image:height" content="630" />
-    <meta property="og:locale" content="en_US" />
-    <meta property="og:url" content="{{ metadata.base }}{{ page.url }}" />
-    <meta property="og:site_name" content="{{ metadata.title }}" />
-    <meta property="og:updated_time" content="{{ updated | isoDate }}" />
-    {%- set categories = metadata.categories | keys %}
-    {%- if tags %}
-        <meta property="og:type" content="article" />
-        <meta property="article:published_time" content="{{ date | isoDate }}" />
-        <meta property="article:modified_time" content="{{ updated | isoDate }}" />
-        <meta property="article:author" content="{{ metadata.author.name }}" />
-        {%- for tag in tags | notIn(categories) %}
-            <meta property="article:tag" content="{{ tag }}" />
-        {%- endfor %}
-    {%- else %}
-        <meta property="og:type" content="website" />
-    {%- endif %}
-    <title>{{ title }} | {{ metadata.title }}</title>
-    <link rel="icon" type="image/x-icon" href="/favicon.ico" />
-    <link rel="canonical" href="{{ metadata.base }}{{ page.url }}" />
-    <link rel="alternate" href="/feed.xml" type="application/atom+xml" title="{{ metadata.title }}" />
-    {%- for category in categories %}
-        <link rel="alternate" href="/feeds/{{ category }}.xml" type="application/atom+xml" title="{{ metadata.title }} - {{ category | capitalize }}" />
-    {%- endfor %}
-    <link rel="preload" href="/fonts/PublicSans-Bold.woff2" as="font" type="font/woff2" crossorigin />
-    <link rel="preload" href="/fonts/PublicSans-BoldItalic.woff2" as="font" type="font/woff2" crossorigin />
-    <link rel="preload" href="/fonts/PublicSans-Italic.woff2" as="font" type="font/woff2" crossorigin />
-    <link rel="preload" href="/fonts/PublicSans-Regular.woff2" as="font" type="font/woff2" crossorigin />
-    {%- set css %}
-        {% include "css/reset.css" %}
-        {% include "css/style.css" %}
-        {% include "css/public-sans.css" %}
-        {% include "css/prism-okaidia.css" %}
-    {%- endset %}
-    <style>
-        {{ css | cssmin | safe }}
-    </style>
-</head>
-<body>
-    <header>
-        <nav>
-            <h1><a href="{{ "index.md" | inputPathToUrl }}">{{ metadata.title }}</a></h1>
-            <menu>
-                <li><a href="{{ "articles.njk" | inputPathToUrl }}">Articles</a></li>
-                <li><a href="{{ "links.njk" | inputPathToUrl }}">Links</a></li>
-                <li><a href="{{ "reviews.njk" | inputPathToUrl }}">Reviews</a></li>
-            </menu>
-        </nav>
-    </header>
-    <hr>
-    <main>
-        {{ content | safe }}
-    </main>
-    <hr>
-    <footer>
-        <address>
-            <menu>
-            {%- for _, social in socials %}
-                <li><a href="{{ social.url }}" rel="me">{{ social.title }}</a></li>
-            {%- endfor %}
-            </menu>
-        </address>
-        <p>
-            &copy; {% currentYear %} {{ metadata.author.name }}.<br>
-            All views my own. Not financial advice. Links, citations, and other references are not endorsements. Content is licensed under <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>.
-        </p>
-    </footer>
-</body>
-</html>
\ No newline at end of file
diff --git a/_includes/layouts/home.njk b/_includes/layouts/home.njk
deleted file mode 100644 (file)
index 62beefd..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
----
-layout: layouts/base.njk
-maxPosts: 5
----
-
-<section>
-    {{ content | safe }}
-</section>
-
-<section>
-    <h2>Latest Activity</h2>
-    {%- include "components/activitylist.njk" %}
-</section>
-
-<section>
-    <h2>Contributions</h2>
-    <ul>
-    {%- for contribution in contributions %}
-        <li><a href="{{ contribution.url }}">{{ contribution.title }}</a></li>
-    {%- endfor %}
-    </ul>
-</section>
\ No newline at end of file
diff --git a/_includes/layouts/post.njk b/_includes/layouts/post.njk
deleted file mode 100644 (file)
index bcb5038..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
----
-layout: layouts/base.njk
----
-
-<h1>
-       {%- if page.filePathStem | startsWith("/links") -%}
-               <a href="{{ href }}">{{ title }}</a>
-       {%- else -%}
-               {{ title }}
-       {%- endif %}
-</h1>
-
-<details>
-       <summary>Metadata</summary>
-       <ul>
-               <li>Published: <time datetime="{{ page.date | htmlDateString }}">{{ page.date | htmlDateString }}</time></li>
-               {%- if modified -%}
-                       <li>Last Modified: <time datetime="{{ modified | htmlDateString }}">{{ modified | htmlDateString }}</time></li>
-               {%- endif -%}
-               <li>
-                       {%- if page.filePathStem | startsWith("/reviews") -%}
-                               Rating:
-                       {%- else -%}
-                               Description:
-                       {%- endif %}
-                       {{ description }}
-               </li>
-               <li>
-                       Tags:&nbsp;
-                       {%- if page.filePathStem | startsWith("/articles") -%}
-                               {{ tags | reject("equalto", "articles") | sort | join(", ") }}
-                       {%- elseif page.filePathStem | startsWith("/links") -%}
-                               {{ tags | reject("equalto", "links") | sort | join(", ") }}
-                       {%- elseif page.filePathStem | startsWith("/reviews") -%}
-                               {{ tags | reject("equalto", "reviews") | sort | join(", ") }}
-                       {%- else -%}
-                               {{ tags | sort | join(", ") }}
-                       {%- endif %}
-               </li>
-               {%- if posse %}
-                       {%- include "components/posse.njk" %}
-               {%- endif %}
-       </ul>
-</details>
-
-<article>
-       {{ content | safe }}
-</article>
diff --git a/astro.config.mjs b/astro.config.mjs
new file mode 100644 (file)
index 0000000..106f9d5
--- /dev/null
@@ -0,0 +1,15 @@
+// @ts-check
+import { defineConfig } from 'astro/config';
+
+import mdx from '@astrojs/mdx';
+import tailwindcss from '@tailwindcss/vite';
+import Metadata from '@data/metadata.json';
+
+export default defineConfig({
+  site: Metadata.base,
+  trailingSlash: "always",
+  integrations: [mdx()],
+  vite: {
+    plugins: [tailwindcss()],
+  },
+});
\ No newline at end of file
index 9bc895c5f1fe97ce2bd5619cfe89f5c21d88cad7..2608b290f6becaf3a7c404d3044949e8c7b661a5 100644 (file)
--- a/bun.lock
+++ b/bun.lock
   "workspaces": {
     "": {
       "name": "cotsuka.github.io",
+      "dependencies": {
+        "@astrojs/mdx": "^4.3.0",
+        "@fontsource-variable/public-sans": "^5.2.6",
+        "@fontsource-variable/source-code-pro": "^5.2.6",
+        "@tailwindcss/vite": "^4.1.10",
+        "astro": "^5.9.3",
+        "tailwindcss": "^4.1.10",
+      },
       "devDependencies": {
-        "@11ty/eleventy": "^3.1.1",
-        "@11ty/eleventy-img": "^6.0.4",
-        "@11ty/eleventy-plugin-rss": "^2.0.4",
-        "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.1",
-        "lightningcss": "^1.30.1",
-        "luxon": "^3.6.1",
-        "markdown-it-footnote": "^4.0.0",
+        "@tailwindcss/typography": "^0.5.16",
+        "@types/bun": "^1.2.16",
       },
     },
   },
   "packages": {
-    "@11ty/dependency-tree": ["@11ty/dependency-tree@4.0.0", "", { "dependencies": { "@11ty/eleventy-utils": "^2.0.1" } }, "sha512-PTOnwM8Xt+GdJmwRKg4pZ8EKAgGoK7pedZBfNSOChXu8MYk2FdEsxdJYecX4t62owpGw3xK60q9TQv/5JI59jw=="],
-
-    "@11ty/dependency-tree-esm": ["@11ty/dependency-tree-esm@2.0.0", "", { "dependencies": { "@11ty/eleventy-utils": "^2.0.1", "acorn": "^8.14.0", "dependency-graph": "^1.0.0", "normalize-path": "^3.0.0" } }, "sha512-+4ySOON4aEAiyAGuH6XQJtxpGSpo6nibfG01krgix00sqjhman2+UaDUopq6Ksv8/jBB3hqkhsHe3fDE4z8rbA=="],
+    "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="],
 
-    "@11ty/eleventy": ["@11ty/eleventy@3.1.1", "", { "dependencies": { "@11ty/dependency-tree": "^4.0.0", "@11ty/dependency-tree-esm": "^2.0.0", "@11ty/eleventy-dev-server": "^2.0.8", "@11ty/eleventy-plugin-bundle": "^3.0.6", "@11ty/eleventy-utils": "^2.0.7", "@11ty/lodash-custom": "^4.17.21", "@11ty/posthtml-urls": "^1.0.1", "@11ty/recursive-copy": "^4.0.1", "@sindresorhus/slugify": "^2.2.1", "bcp-47-normalize": "^2.3.0", "chokidar": "^3.6.0", "debug": "^4.4.1", "dependency-graph": "^1.0.0", "entities": "^6.0.0", "filesize": "^10.1.6", "gray-matter": "^4.0.3", "iso-639-1": "^3.1.5", "js-yaml": "^4.1.0", "kleur": "^4.1.5", "liquidjs": "^10.21.1", "luxon": "^3.6.1", "markdown-it": "^14.1.0", "minimist": "^1.2.8", "moo": "^0.5.2", "node-retrieve-globals": "^6.0.1", "nunjucks": "^3.2.4", "picomatch": "^4.0.2", "please-upgrade-node": "^3.2.0", "posthtml": "^0.16.6", "posthtml-match-helper": "^2.0.3", "semver": "^7.7.2", "slugify": "^1.6.6", "tinyglobby": "^0.2.14" }, "bin": { "eleventy": "cmd.cjs" } }, "sha512-nsMCW44WSYzpi6JSQ1ar/wlotj/2cxuP4AABX5Dxqwol3IQ3SkEMgcAugP1t1mthv5I0kIB9lql1Jv/lhUHIkg=="],
+    "@astrojs/compiler": ["@astrojs/compiler@2.12.2", "", {}, "sha512-w2zfvhjNCkNMmMMOn5b0J8+OmUaBL1o40ipMvqcG6NRpdC+lKxmTi48DT8Xw0SzJ3AfmeFLB45zXZXtmbsjcgw=="],
 
-    "@11ty/eleventy-dev-server": ["@11ty/eleventy-dev-server@2.0.8", "", { "dependencies": { "@11ty/eleventy-utils": "^2.0.1", "chokidar": "^3.6.0", "debug": "^4.4.0", "finalhandler": "^1.3.1", "mime": "^3.0.0", "minimist": "^1.2.8", "morphdom": "^2.7.4", "please-upgrade-node": "^3.2.0", "send": "^1.1.0", "ssri": "^11.0.0", "urlpattern-polyfill": "^10.0.0", "ws": "^8.18.1" }, "bin": { "eleventy-dev-server": "cmd.js" } }, "sha512-15oC5M1DQlCaOMUq4limKRYmWiGecDaGwryr7fTE/oM9Ix8siqMvWi+I8VjsfrGr+iViDvWcH/TVI6D12d93mA=="],
+    "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.6.1", "", {}, "sha512-l5Pqf6uZu31aG+3Lv8nl/3s4DbUzdlxTWDof4pEpto6GUJNhhCbelVi9dEyurOVyqaelwmS9oSyOWOENSfgo9A=="],
 
-    "@11ty/eleventy-fetch": ["@11ty/eleventy-fetch@5.1.0", "", { "dependencies": { "@11ty/eleventy-utils": "^2.0.7", "@rgrove/parse-xml": "^4.2.0", "debug": "^4.4.0", "flatted": "^3.3.3", "p-queue": "6.6.2" } }, "sha512-gSmCA3olJxRwtTkXyS+KIanq1kEufCC+JsHyTa7ta5NqmeUQlWA8zEngtXrDl+ebrAvFz2bNaxLd+0ERpnnSPQ=="],
+    "@astrojs/markdown-remark": ["@astrojs/markdown-remark@6.3.2", "", { "dependencies": { "@astrojs/internal-helpers": "0.6.1", "@astrojs/prism": "3.3.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.1.0", "js-yaml": "^4.1.0", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "shiki": "^3.2.1", "smol-toml": "^1.3.1", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.1", "vfile": "^6.0.3" } }, "sha512-bO35JbWpVvyKRl7cmSJD822e8YA8ThR/YbUsciWNA7yTcqpIAL2hJDToWP5KcZBWxGT6IOdOkHSXARSNZc4l/Q=="],
 
-    "@11ty/eleventy-img": ["@11ty/eleventy-img@6.0.4", "", { "dependencies": { "@11ty/eleventy-fetch": "^5.1.0", "@11ty/eleventy-utils": "^2.0.7", "brotli-size": "^4.0.0", "debug": "^4.4.0", "entities": "^6.0.0", "image-size": "^1.2.1", "p-queue": "^6.6.2", "sharp": "^0.33.5" } }, "sha512-jSy9BmubVs0mN76dcXWfSYDgRU+1+/rq/SxUR3MgIvTUAJRDop5pFW+Z1f56CDcOlEHaiPqHgnfOlqRmJvXl7g=="],
+    "@astrojs/mdx": ["@astrojs/mdx@4.3.0", "", { "dependencies": { "@astrojs/markdown-remark": "6.3.2", "@mdx-js/mdx": "^3.1.0", "acorn": "^8.14.1", "es-module-lexer": "^1.6.0", "estree-util-visit": "^2.0.0", "hast-util-to-html": "^9.0.5", "kleur": "^4.1.5", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "remark-smartypants": "^3.0.2", "source-map": "^0.7.4", "unist-util-visit": "^5.0.0", "vfile": "^6.0.3" }, "peerDependencies": { "astro": "^5.0.0" } }, "sha512-OGX2KvPeBzjSSKhkCqrUoDMyzFcjKt5nTE5SFw3RdoLf0nrhyCXBQcCyclzWy1+P+XpOamn+p+hm1EhpCRyPxw=="],
 
-    "@11ty/eleventy-plugin-bundle": ["@11ty/eleventy-plugin-bundle@3.0.6", "", { "dependencies": { "@11ty/eleventy-utils": "^2.0.2", "debug": "^4.4.0", "posthtml-match-helper": "^2.0.3" } }, "sha512-wlEIMa1SEe6HE6ZyREEnPQiTw72337a2MPkyn0D1IzrqHrKU9euB17mv27LnnnyKvMJamCCqtU0985F5yyDL8g=="],
+    "@astrojs/prism": ["@astrojs/prism@3.3.0", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ=="],
 
-    "@11ty/eleventy-plugin-rss": ["@11ty/eleventy-plugin-rss@2.0.4", "", { "dependencies": { "@11ty/eleventy-utils": "^2.0.0", "@11ty/posthtml-urls": "^1.0.1", "debug": "^4.4.0", "posthtml": "^0.16.6" } }, "sha512-LF60sGVlxGTryQe3hTifuzrwF8R7XbrNsM2xfcDcNMSliLN4kmB+7zvoLRySRx0AQDjqhPTAeeeT0ra6/9zHUQ=="],
+    "@astrojs/telemetry": ["@astrojs/telemetry@3.3.0", "", { "dependencies": { "ci-info": "^4.2.0", "debug": "^4.4.0", "dlv": "^1.1.3", "dset": "^3.1.4", "is-docker": "^3.0.0", "is-wsl": "^3.1.0", "which-pm-runs": "^1.1.0" } }, "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ=="],
 
-    "@11ty/eleventy-plugin-syntaxhighlight": ["@11ty/eleventy-plugin-syntaxhighlight@5.0.1", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-xDPF3Ay38XlmWZe9ER0SLtMmNah7olUBlGORhUiCUkPh3jYGVCDTDayi4tbFI9Dxha8NwKlfBZ2FXM/s3aZzAg=="],
+    "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
 
-    "@11ty/eleventy-utils": ["@11ty/eleventy-utils@2.0.7", "", {}, "sha512-6QE+duqSQ0GY9rENXYb4iPR4AYGdrFpqnmi59tFp9VrleOl0QSh8VlBr2yd6dlhkdtj7904poZW5PvGr9cMiJQ=="],
+    "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="],
 
-    "@11ty/lodash-custom": ["@11ty/lodash-custom@4.17.21", "", {}, "sha512-Mqt6im1xpb1Ykn3nbcCovWXK3ggywRJa+IXIdoz4wIIK+cvozADH63lexcuPpGS/gJ6/m2JxyyXDyupkMr5DHw=="],
+    "@babel/parser": ["@babel/parser@7.27.5", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg=="],
 
-    "@11ty/posthtml-urls": ["@11ty/posthtml-urls@1.0.1", "", { "dependencies": { "evaluate-value": "^2.0.0", "http-equiv-refresh": "^2.0.1", "list-to-array": "^1.1.0", "parse-srcset": "^1.0.2" } }, "sha512-6EFN/yYSxC/OzYXpq4gXDyDMlX/W+2MgCvvoxf11X1z76bqkqFJ8eep5RiBWfGT5j0323a1pwpelcJJdR46MCw=="],
+    "@babel/types": ["@babel/types@7.27.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q=="],
 
-    "@11ty/recursive-copy": ["@11ty/recursive-copy@4.0.1", "", { "dependencies": { "errno": "^1.0.0", "junk": "^3.1.0", "maximatch": "^0.1.0", "slash": "^3.0.0" } }, "sha512-Zsg1xgfdVTMKNPj9o4FZeYa73dFZRX856CL4LsmqPMvDr0TuIK4cH9CVWJyf0OkNmM8GmlibGX18fF0B75Rn1w=="],
+    "@capsizecss/unpack": ["@capsizecss/unpack@2.4.0", "", { "dependencies": { "blob-to-buffer": "^1.2.8", "cross-fetch": "^3.0.4", "fontkit": "^2.0.2" } }, "sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q=="],
 
     "@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="],
 
+    "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA=="],
+
+    "@esbuild/android-arm": ["@esbuild/android-arm@0.25.5", "", { "os": "android", "cpu": "arm" }, "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA=="],
+
+    "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.5", "", { "os": "android", "cpu": "arm64" }, "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg=="],
+
+    "@esbuild/android-x64": ["@esbuild/android-x64@0.25.5", "", { "os": "android", "cpu": "x64" }, "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw=="],
+
+    "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ=="],
+
+    "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ=="],
+
+    "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw=="],
+
+    "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw=="],
+
+    "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.5", "", { "os": "linux", "cpu": "arm" }, "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw=="],
+
+    "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg=="],
+
+    "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA=="],
+
+    "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg=="],
+
+    "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg=="],
+
+    "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ=="],
+
+    "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA=="],
+
+    "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ=="],
+
+    "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.5", "", { "os": "linux", "cpu": "x64" }, "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw=="],
+
+    "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.5", "", { "os": "none", "cpu": "arm64" }, "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw=="],
+
+    "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.5", "", { "os": "none", "cpu": "x64" }, "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ=="],
+
+    "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.5", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw=="],
+
+    "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg=="],
+
+    "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA=="],
+
+    "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw=="],
+
+    "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ=="],
+
+    "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.5", "", { "os": "win32", "cpu": "x64" }, "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g=="],
+
+    "@fontsource-variable/public-sans": ["@fontsource-variable/public-sans@5.2.6", "", {}, "sha512-NXUIBhVuxk0n0S5ZUQvEJNw6k2vtgh4GIHHGMNm1hPt2dyyl7ScsDoygzUi1Q/LD4+nj6mlb1qjITzNcBAo4dw=="],
+
+    "@fontsource-variable/source-code-pro": ["@fontsource-variable/source-code-pro@5.2.6", "", {}, "sha512-veMbS6Fa1GxIRYXzUOavQuB1QMclA5YGlOCq9IivbFQTl1fB40MJ5UsU/gX2Z5RwYB7Ez1Q4Bzy91aUrhPkL4g=="],
+
     "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="],
 
     "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="],
 
     "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="],
 
-    "@rgrove/parse-xml": ["@rgrove/parse-xml@4.2.0", "", {}, "sha512-UuBOt7BOsKVOkFXRe4Ypd/lADuNIfqJXv8GvHqtXaTYXPPKkj2nS2zPllVsrtRjcomDhIJVBnZwfmlI222WH8g=="],
+    "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="],
+
+    "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="],
+
+    "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
+
+    "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="],
+
+    "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="],
+
+    "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="],
+
+    "@mdx-js/mdx": ["@mdx-js/mdx@3.1.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw=="],
+
+    "@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="],
+
+    "@rollup/pluginutils": ["@rollup/pluginutils@5.1.4", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ=="],
+
+    "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.43.0", "", { "os": "android", "cpu": "arm" }, "sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw=="],
+
+    "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.43.0", "", { "os": "android", "cpu": "arm64" }, "sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA=="],
+
+    "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.43.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A=="],
+
+    "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.43.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg=="],
+
+    "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.43.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ=="],
+
+    "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.43.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg=="],
+
+    "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.43.0", "", { "os": "linux", "cpu": "arm" }, "sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw=="],
+
+    "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.43.0", "", { "os": "linux", "cpu": "arm" }, "sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw=="],
+
+    "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.43.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA=="],
+
+    "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.43.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA=="],
+
+    "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.43.0", "", { "os": "linux", "cpu": "none" }, "sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg=="],
+
+    "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.43.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw=="],
+
+    "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.43.0", "", { "os": "linux", "cpu": "none" }, "sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g=="],
+
+    "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.43.0", "", { "os": "linux", "cpu": "none" }, "sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q=="],
+
+    "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.43.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw=="],
+
+    "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.43.0", "", { "os": "linux", "cpu": "x64" }, "sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ=="],
+
+    "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.43.0", "", { "os": "linux", "cpu": "x64" }, "sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ=="],
+
+    "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.43.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw=="],
+
+    "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.43.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw=="],
+
+    "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.43.0", "", { "os": "win32", "cpu": "x64" }, "sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw=="],
+
+    "@shikijs/core": ["@shikijs/core@3.6.0", "", { "dependencies": { "@shikijs/types": "3.6.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-9By7Xb3olEX0o6UeJyPLI1PE1scC4d3wcVepvtv2xbuN9/IThYN4Wcwh24rcFeASzPam11MCq8yQpwwzCgSBRw=="],
+
+    "@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.6.0", "", { "dependencies": { "@shikijs/types": "3.6.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.3" } }, "sha512-7YnLhZG/TU05IHMG14QaLvTW/9WiK8SEYafceccHUSXs2Qr5vJibUwsDfXDLmRi0zHdzsxrGKpSX6hnqe0k8nA=="],
+
+    "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.6.0", "", { "dependencies": { "@shikijs/types": "3.6.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-nmOhIZ9yT3Grd+2plmW/d8+vZ2pcQmo/UnVwXMUXAKTXdi+LK0S08Ancrz5tQQPkxvjBalpMW2aKvwXfelauvA=="],
+
+    "@shikijs/langs": ["@shikijs/langs@3.6.0", "", { "dependencies": { "@shikijs/types": "3.6.0" } }, "sha512-IdZkQJaLBu1LCYCwkr30hNuSDfllOT8RWYVZK1tD2J03DkiagYKRxj/pDSl8Didml3xxuyzUjgtioInwEQM/TA=="],
+
+    "@shikijs/themes": ["@shikijs/themes@3.6.0", "", { "dependencies": { "@shikijs/types": "3.6.0" } }, "sha512-Fq2j4nWr1DF4drvmhqKq8x5vVQ27VncF8XZMBuHuQMZvUSS3NBgpqfwz/FoGe36+W6PvniZ1yDlg2d4kmYDU6w=="],
+
+    "@shikijs/types": ["@shikijs/types@3.6.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-cLWFiToxYu0aAzJqhXTQsFiJRTFDAGl93IrMSBNaGSzs7ixkLfdG6pH11HipuWFGW5vyx4X47W8HDQ7eSrmBUg=="],
+
+    "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],
+
+    "@swc/helpers": ["@swc/helpers@0.5.17", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A=="],
+
+    "@tailwindcss/node": ["@tailwindcss/node@4.1.10", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.10" } }, "sha512-2ACf1znY5fpRBwRhMgj9ZXvb2XZW8qs+oTfotJ2C5xR0/WNL7UHZ7zXl6s+rUqedL1mNi+0O+WQr5awGowS3PQ=="],
+
+    "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.10", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.10", "@tailwindcss/oxide-darwin-arm64": "4.1.10", "@tailwindcss/oxide-darwin-x64": "4.1.10", "@tailwindcss/oxide-freebsd-x64": "4.1.10", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.10", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.10", "@tailwindcss/oxide-linux-arm64-musl": "4.1.10", "@tailwindcss/oxide-linux-x64-gnu": "4.1.10", "@tailwindcss/oxide-linux-x64-musl": "4.1.10", "@tailwindcss/oxide-wasm32-wasi": "4.1.10", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.10", "@tailwindcss/oxide-win32-x64-msvc": "4.1.10" } }, "sha512-v0C43s7Pjw+B9w21htrQwuFObSkio2aV/qPx/mhrRldbqxbWJK6KizM+q7BF1/1CmuLqZqX3CeYF7s7P9fbA8Q=="],
+
+    "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.10", "", { "os": "android", "cpu": "arm64" }, "sha512-VGLazCoRQ7rtsCzThaI1UyDu/XRYVyH4/EWiaSX6tFglE+xZB5cvtC5Omt0OQ+FfiIVP98su16jDVHDEIuH4iQ=="],
+
+    "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ZIFqvR1irX2yNjWJzKCqTCcHZbgkSkSkZKbRM3BPzhDL/18idA8uWCoopYA2CSDdSGFlDAxYdU2yBHwAwx8euQ=="],
+
+    "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-eCA4zbIhWUFDXoamNztmS0MjXHSEJYlvATzWnRiTqJkcUteSjO94PoRHJy1Xbwp9bptjeIxxBHh+zBWFhttbrQ=="],
 
-    "@sindresorhus/slugify": ["@sindresorhus/slugify@2.2.1", "", { "dependencies": { "@sindresorhus/transliterate": "^1.0.0", "escape-string-regexp": "^5.0.0" } }, "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw=="],
+    "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.10", "", { "os": "freebsd", "cpu": "x64" }, "sha512-8/392Xu12R0cc93DpiJvNpJ4wYVSiciUlkiOHOSOQNH3adq9Gi/dtySK7dVQjXIOzlpSHjeCL89RUUI8/GTI6g=="],
 
-    "@sindresorhus/transliterate": ["@sindresorhus/transliterate@1.6.0", "", { "dependencies": { "escape-string-regexp": "^5.0.0" } }, "sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ=="],
+    "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.10", "", { "os": "linux", "cpu": "arm" }, "sha512-t9rhmLT6EqeuPT+MXhWhlRYIMSfh5LZ6kBrC4FS6/+M1yXwfCtp24UumgCWOAJVyjQwG+lYva6wWZxrfvB+NhQ=="],
 
-    "a-sync-waterfall": ["a-sync-waterfall@1.0.1", "", {}, "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA=="],
+    "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-3oWrlNlxLRxXejQ8zImzrVLuZ/9Z2SeKoLhtCu0hpo38hTO2iL86eFOu4sVR8cZc6n3z7eRXXqtHJECa6mFOvA=="],
 
-    "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="],
+    "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-saScU0cmWvg/Ez4gUmQWr9pvY9Kssxt+Xenfx1LG7LmqjcrvBnw4r9VjkFcqmbBb7GCBwYNcZi9X3/oMda9sqQ=="],
 
-    "acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="],
+    "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.10", "", { "os": "linux", "cpu": "x64" }, "sha512-/G3ao/ybV9YEEgAXeEg28dyH6gs1QG8tvdN9c2MNZdUXYBaIY/Gx0N6RlJzfLy/7Nkdok4kaxKPHKJUlAaoTdA=="],
+
+    "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.10", "", { "os": "linux", "cpu": "x64" }, "sha512-LNr7X8fTiKGRtQGOerSayc2pWJp/9ptRYAa4G+U+cjw9kJZvkopav1AQc5HHD+U364f71tZv6XamaHKgrIoVzA=="],
+
+    "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.10", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", "@napi-rs/wasm-runtime": "^0.2.10", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, "cpu": "none" }, "sha512-d6ekQpopFQJAcIK2i7ZzWOYGZ+A6NzzvQ3ozBvWFdeyqfOZdYHU66g5yr+/HC4ipP1ZgWsqa80+ISNILk+ae/Q=="],
+
+    "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-i1Iwg9gRbwNVOCYmnigWCCgow8nDWSFmeTUU5nbNx3rqbe4p0kRbEqLwLJbYZKmSSp23g4N6rCDmm7OuPBXhDA=="],
+
+    "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.10", "", { "os": "win32", "cpu": "x64" }, "sha512-sGiJTjcBSfGq2DVRtaSljq5ZgZS2SDHSIfhOylkBvHVjwOsodBhnb3HdmiKkVuUGKD0I7G63abMOVaskj1KpOA=="],
+
+    "@tailwindcss/typography": ["@tailwindcss/typography@0.5.16", "", { "dependencies": { "lodash.castarray": "^4.4.0", "lodash.isplainobject": "^4.0.6", "lodash.merge": "^4.6.2", "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA=="],
+
+    "@tailwindcss/vite": ["@tailwindcss/vite@4.1.10", "", { "dependencies": { "@tailwindcss/node": "4.1.10", "@tailwindcss/oxide": "4.1.10", "tailwindcss": "4.1.10" }, "peerDependencies": { "vite": "^5.2.0 || ^6" } }, "sha512-QWnD5HDY2IADv+vYR82lOhqOlS1jSCUUAmfem52cXAhRTKxpDh3ARX8TTXJTCCO7Rv7cD2Nlekabv02bwP3a2A=="],
+
+    "@types/bun": ["@types/bun@1.2.16", "", { "dependencies": { "bun-types": "1.2.16" } }, "sha512-1aCZJ/6nSiViw339RsaNhkNoEloLaPzZhxMOYEa7OzRzO41IGg5n/7I43/ZIAW/c+Q6cT12Vf7fOZOoVIzb5BQ=="],
+
+    "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="],
+
+    "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
+
+    "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="],
+
+    "@types/fontkit": ["@types/fontkit@2.0.8", "", { "dependencies": { "@types/node": "*" } }, "sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew=="],
+
+    "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
+
+    "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="],
+
+    "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="],
+
+    "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="],
+
+    "@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="],
+
+    "@types/node": ["@types/node@24.0.1", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw=="],
+
+    "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
+
+    "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
+
+    "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
+
+    "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
+
+    "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="],
+
+    "ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="],
+
+    "ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="],
 
     "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
 
     "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
 
-    "array-differ": ["array-differ@1.0.0", "", {}, "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ=="],
+    "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
+
+    "array-iterate": ["array-iterate@2.0.1", "", {}, "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="],
+
+    "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="],
+
+    "astro": ["astro@5.9.3", "", { "dependencies": { "@astrojs/compiler": "^2.12.2", "@astrojs/internal-helpers": "0.6.1", "@astrojs/markdown-remark": "6.3.2", "@astrojs/telemetry": "3.3.0", "@capsizecss/unpack": "^2.4.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.1.4", "acorn": "^8.14.1", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.2.0", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^1.0.2", "cssesc": "^3.0.0", "debug": "^4.4.0", "deterministic-object-hash": "^2.0.2", "devalue": "^5.1.1", "diff": "^5.2.0", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.6.0", "esbuild": "^0.25.0", "estree-walker": "^3.0.3", "flattie": "^1.1.1", "fontace": "~0.3.0", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.1.1", "import-meta-resolve": "^4.1.0", "js-yaml": "^4.1.0", "kleur": "^4.1.5", "magic-string": "^0.30.17", "magicast": "^0.3.5", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "p-limit": "^6.2.0", "p-queue": "^8.1.0", "package-manager-detector": "^1.1.0", "picomatch": "^4.0.2", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.7.1", "shiki": "^3.2.1", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.12", "tsconfck": "^3.1.5", "ultrahtml": "^1.6.0", "unifont": "~0.5.0", "unist-util-visit": "^5.0.0", "unstorage": "^1.15.0", "vfile": "^6.0.3", "vite": "^6.3.4", "vitefu": "^1.0.6", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "yocto-spinner": "^0.2.1", "zod": "^3.24.2", "zod-to-json-schema": "^3.24.5", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.33.3" }, "bin": { "astro": "astro.js" } }, "sha512-VReZrpUa/3rfeiVvsQ1A2M3ujDPI+pDGIYOMtXPEZwut8tZoEyealXXLjitgCsJ+3dunKGZbg4Eak6i+r0vniw=="],
+
+    "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
+
+    "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="],
+
+    "base-64": ["base-64@1.0.0", "", {}, "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="],
+
+    "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
+
+    "blob-to-buffer": ["blob-to-buffer@1.2.9", "", {}, "sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA=="],
+
+    "boxen": ["boxen@8.0.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^8.0.0", "chalk": "^5.3.0", "cli-boxes": "^3.0.0", "string-width": "^7.2.0", "type-fest": "^4.21.0", "widest-line": "^5.0.0", "wrap-ansi": "^9.0.0" } }, "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw=="],
+
+    "brotli": ["brotli@1.3.3", "", { "dependencies": { "base64-js": "^1.1.2" } }, "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg=="],
+
+    "bun-types": ["bun-types@1.2.16", "", { "dependencies": { "@types/node": "*" } }, "sha512-ciXLrHV4PXax9vHvUrkvun9VPVGOVwbbbBF/Ev1cXz12lyEZMoJpIJABOfPcN9gDJRaiKF9MVbSygLg4NXu3/A=="],
 
-    "array-union": ["array-union@1.0.2", "", { "dependencies": { "array-uniq": "^1.0.1" } }, "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng=="],
+    "camelcase": ["camelcase@8.0.0", "", {}, "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA=="],
 
-    "array-uniq": ["array-uniq@1.0.3", "", {}, "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q=="],
+    "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
 
-    "arrify": ["arrify@1.0.1", "", {}, "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA=="],
+    "chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="],
 
-    "asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="],
+    "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="],
 
-    "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+    "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="],
 
-    "bcp-47": ["bcp-47@2.1.0", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w=="],
+    "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="],
 
-    "bcp-47-match": ["bcp-47-match@2.0.3", "", {}, "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ=="],
+    "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="],
 
-    "bcp-47-normalize": ["bcp-47-normalize@2.3.0", "", { "dependencies": { "bcp-47": "^2.0.0", "bcp-47-match": "^2.0.0" } }, "sha512-8I/wfzqQvttUFz7HVJgIZ7+dj3vUaIyIxYXaTRP1YWoSDfzt6TUmxaKZeuXR62qBmYr+nvuWINFRl6pZ5DlN4Q=="],
+    "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
 
-    "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="],
+    "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="],
 
-    "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="],
+    "ci-info": ["ci-info@4.2.0", "", {}, "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg=="],
 
-    "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
+    "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="],
 
-    "brotli-size": ["brotli-size@4.0.0", "", { "dependencies": { "duplexer": "0.1.1" } }, "sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA=="],
+    "clone": ["clone@2.1.2", "", {}, "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="],
 
-    "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="],
+    "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
+
+    "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="],
 
     "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="],
 
 
     "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="],
 
-    "commander": ["commander@10.0.1", "", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="],
+    "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="],
+
+    "common-ancestor-path": ["common-ancestor-path@1.0.1", "", {}, "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="],
+
+    "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="],
+
+    "cookie-es": ["cookie-es@1.2.2", "", {}, "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="],
+
+    "cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="],
 
-    "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
+    "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="],
+
+    "css-tree": ["css-tree@3.1.0", "", { "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" } }, "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w=="],
+
+    "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
 
     "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="],
 
-    "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
+    "decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="],
+
+    "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="],
+
+    "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
 
-    "dependency-graph": ["dependency-graph@1.0.0", "", {}, "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg=="],
+    "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="],
 
     "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="],
 
-    "dom-serializer": ["dom-serializer@1.4.1", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="],
+    "deterministic-object-hash": ["deterministic-object-hash@2.0.2", "", { "dependencies": { "base-64": "^1.0.0" } }, "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ=="],
 
-    "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="],
+    "devalue": ["devalue@5.1.1", "", {}, "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw=="],
 
-    "domhandler": ["domhandler@4.3.1", "", { "dependencies": { "domelementtype": "^2.2.0" } }, "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="],
+    "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
 
-    "domutils": ["domutils@2.8.0", "", { "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" } }, "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A=="],
+    "dfa": ["dfa@1.2.0", "", {}, "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q=="],
 
-    "duplexer": ["duplexer@0.1.1", "", {}, "sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q=="],
+    "diff": ["diff@5.2.0", "", {}, "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A=="],
 
-    "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
+    "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="],
 
-    "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],
+    "dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="],
 
-    "entities": ["entities@6.0.0", "", {}, "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw=="],
+    "emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="],
 
-    "errno": ["errno@1.0.0", "", { "dependencies": { "prr": "~1.0.1" }, "bin": { "errno": "cli.js" } }, "sha512-3zV5mFS1E8/1bPxt/B0xxzI1snsg3uSCIh6Zo1qKg6iMw93hzPANk9oBFzSFBFrwuVoQuE3rLoouAUfwOAj1wQ=="],
+    "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="],
 
-    "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
+    "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
+
+    "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="],
+
+    "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="],
+
+    "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="],
+
+    "esbuild": ["esbuild@0.25.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.5", "@esbuild/android-arm": "0.25.5", "@esbuild/android-arm64": "0.25.5", "@esbuild/android-x64": "0.25.5", "@esbuild/darwin-arm64": "0.25.5", "@esbuild/darwin-x64": "0.25.5", "@esbuild/freebsd-arm64": "0.25.5", "@esbuild/freebsd-x64": "0.25.5", "@esbuild/linux-arm": "0.25.5", "@esbuild/linux-arm64": "0.25.5", "@esbuild/linux-ia32": "0.25.5", "@esbuild/linux-loong64": "0.25.5", "@esbuild/linux-mips64el": "0.25.5", "@esbuild/linux-ppc64": "0.25.5", "@esbuild/linux-riscv64": "0.25.5", "@esbuild/linux-s390x": "0.25.5", "@esbuild/linux-x64": "0.25.5", "@esbuild/netbsd-arm64": "0.25.5", "@esbuild/netbsd-x64": "0.25.5", "@esbuild/openbsd-arm64": "0.25.5", "@esbuild/openbsd-x64": "0.25.5", "@esbuild/sunos-x64": "0.25.5", "@esbuild/win32-arm64": "0.25.5", "@esbuild/win32-ia32": "0.25.5", "@esbuild/win32-x64": "0.25.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ=="],
 
     "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
 
-    "esm-import-transformer": ["esm-import-transformer@3.0.3", "", { "dependencies": { "acorn": "^8.11.2" } }, "sha512-Wj9kBIA9vKZRYAQzhe229M7wmWb2f3vTu86CkszZUy2/iiVCYljXm/EkwJtWKc0vup30WHhxbm3rpkysBKczxQ=="],
+    "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="],
+
+    "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="],
 
-    "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
+    "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="],
 
-    "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],
+    "estree-util-scope": ["estree-util-scope@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ=="],
 
-    "evaluate-value": ["evaluate-value@2.0.0", "", {}, "sha512-VonfiuDJc0z4sOO7W0Pd130VLsXN6vmBWZlrog1mCb/o7o/Nl5Lr25+Kj/nkCCAhG+zqeeGjxhkK9oHpkgTHhQ=="],
+    "estree-util-to-js": ["estree-util-to-js@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="],
 
-    "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="],
+    "estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="],
 
-    "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="],
+    "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="],
 
-    "fdir": ["fdir@6.4.5", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw=="],
+    "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="],
 
-    "filesize": ["filesize@10.1.6", "", {}, "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w=="],
+    "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
 
-    "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
+    "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
 
-    "finalhandler": ["finalhandler@1.3.1", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ=="],
+    "fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="],
 
-    "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="],
+    "flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="],
 
-    "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="],
+    "fontace": ["fontace@0.3.0", "", { "dependencies": { "@types/fontkit": "^2.0.8", "fontkit": "^2.0.4" } }, "sha512-czoqATrcnxgWb/nAkfyIrRp6Q8biYj7nGnL6zfhTcX+JKKpWHFBnb8uNMw/kZr7u++3Y3wYSYoZgHkCcsuBpBg=="],
+
+    "fontkit": ["fontkit@2.0.4", "", { "dependencies": { "@swc/helpers": "^0.5.12", "brotli": "^1.3.2", "clone": "^2.1.2", "dfa": "^1.2.0", "fast-deep-equal": "^3.1.3", "restructure": "^3.0.0", "tiny-inflate": "^1.0.3", "unicode-properties": "^1.4.0", "unicode-trie": "^2.0.0" } }, "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g=="],
 
     "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
 
-    "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
+    "get-east-asian-width": ["get-east-asian-width@1.3.0", "", {}, "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ=="],
+
+    "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="],
+
+    "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
+
+    "h3": ["h3@1.15.3", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.4", "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.0", "radix3": "^1.1.2", "ufo": "^1.6.1", "uncrypto": "^0.1.3" } }, "sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ=="],
 
-    "gray-matter": ["gray-matter@4.0.3", "", { "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" } }, "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="],
+    "hast-util-from-html": ["hast-util-from-html@2.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="],
 
-    "htmlparser2": ["htmlparser2@7.2.0", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.2", "domutils": "^2.8.0", "entities": "^3.0.1" } }, "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog=="],
+    "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="],
 
-    "http-equiv-refresh": ["http-equiv-refresh@2.0.1", "", {}, "sha512-XJpDL/MLkV3dKwLzHwr2dY05dYNfBNlyPu4STQ8WvKCFdc6vC5tPXuq28of663+gHVg03C+16pHHs/+FmmDjcw=="],
+    "hast-util-is-element": ["hast-util-is-element@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="],
 
-    "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="],
+    "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="],
 
-    "image-size": ["image-size@1.2.1", "", { "dependencies": { "queue": "6.0.2" }, "bin": { "image-size": "bin/image-size.js" } }, "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw=="],
+    "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-from-parse5": "^8.0.0", "hast-util-to-parse5": "^8.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "parse5": "^7.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="],
 
-    "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
+    "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="],
+
+    "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="],
+
+    "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="],
+
+    "hast-util-to-parse5": ["hast-util-to-parse5@8.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw=="],
+
+    "hast-util-to-text": ["hast-util-to-text@4.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "hast-util-is-element": "^3.0.0", "unist-util-find-after": "^5.0.0" } }, "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A=="],
+
+    "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="],
+
+    "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="],
+
+    "html-escaper": ["html-escaper@3.0.3", "", {}, "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="],
+
+    "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="],
+
+    "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="],
+
+    "import-meta-resolve": ["import-meta-resolve@4.1.0", "", {}, "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw=="],
+
+    "inline-style-parser": ["inline-style-parser@0.2.4", "", {}, "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q=="],
+
+    "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="],
 
     "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="],
 
 
     "is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="],
 
-    "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="],
-
     "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="],
 
-    "is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="],
+    "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
 
-    "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
+    "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
 
-    "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
+    "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="],
 
-    "is-json": ["is-json@2.0.1", "", {}, "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA=="],
+    "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="],
 
-    "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
+    "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],
 
-    "iso-639-1": ["iso-639-1@3.1.5", "", {}, "sha512-gXkz5+KN7HrG0Q5UGqSMO2qB9AsbEeyLP54kF1YrMsIxmu+g4BdB7rflReZTSTZGpfj8wywu6pfPBCylPIzGQA=="],
+    "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="],
 
-    "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="],
-
-    "junk": ["junk@3.1.0", "", {}, "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ=="],
+    "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="],
 
-    "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
+    "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="],
 
     "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="],
 
 
     "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="],
 
-    "linkify-it": ["linkify-it@5.0.0", "", { "dependencies": { "uc.micro": "^2.0.0" } }, "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ=="],
+    "lodash.castarray": ["lodash.castarray@4.4.0", "", {}, "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q=="],
+
+    "lodash.isplainobject": ["lodash.isplainobject@4.0.6", "", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="],
 
-    "liquidjs": ["liquidjs@10.21.1", "", { "dependencies": { "commander": "^10.0.0" }, "bin": { "liquidjs": "bin/liquid.js", "liquid": "bin/liquid.js" } }, "sha512-NZXmCwv3RG5nire3fmIn9HsOyJX3vo+ptp0yaXUHAMzSNBhx74Hm+dAGJvscUA6lNqbLuYfXgNavRQ9UbUJhQQ=="],
+    "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
 
-    "list-to-array": ["list-to-array@1.1.0", "", {}, "sha512-+dAZZ2mM+/m+vY9ezfoueVvrgnHIGi5FvgSymbIgJOFwiznWyA59mav95L+Mc6xPtL3s9gm5eNTlNtxJLbNM1g=="],
+    "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],
 
-    "luxon": ["luxon@3.6.1", "", {}, "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ=="],
+    "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
 
-    "markdown-it": ["markdown-it@14.1.0", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", "linkify-it": "^5.0.0", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg=="],
+    "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="],
 
-    "markdown-it-footnote": ["markdown-it-footnote@4.0.0", "", {}, "sha512-WYJ7urf+khJYl3DqofQpYfEYkZKbmXmwxQV8c8mO/hGIhgZ1wOe7R4HLFNwqx7TjILbnC98fuyeSsin19JdFcQ=="],
+    "magicast": ["magicast@0.3.5", "", { "dependencies": { "@babel/parser": "^7.25.4", "@babel/types": "^7.25.4", "source-map-js": "^1.2.0" } }, "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ=="],
 
-    "maximatch": ["maximatch@0.1.0", "", { "dependencies": { "array-differ": "^1.0.0", "array-union": "^1.0.1", "arrify": "^1.0.0", "minimatch": "^3.0.0" } }, "sha512-9ORVtDUFk4u/NFfo0vG/ND/z7UQCVZBL539YW0+U1I7H1BkZwizcPx5foFv7LCPcBnm2U6RjFnQOsIvN4/Vm2A=="],
+    "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="],
 
-    "mdurl": ["mdurl@2.0.0", "", {}, "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="],
+    "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],
 
-    "mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="],
+    "mdast-util-definitions": ["mdast-util-definitions@6.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ=="],
 
-    "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="],
+    "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="],
 
-    "mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="],
+    "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="],
 
-    "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
+    "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="],
 
-    "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
+    "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="],
+
+    "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="],
+
+    "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="],
+
+    "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="],
+
+    "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="],
+
+    "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="],
+
+    "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="],
+
+    "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="],
+
+    "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="],
+
+    "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="],
+
+    "mdast-util-to-hast": ["mdast-util-to-hast@13.2.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="],
+
+    "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="],
+
+    "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="],
+
+    "mdn-data": ["mdn-data@2.12.2", "", {}, "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="],
+
+    "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="],
+
+    "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="],
+
+    "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="],
+
+    "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="],
+
+    "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="],
+
+    "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="],
+
+    "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="],
+
+    "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="],
+
+    "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="],
+
+    "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="],
+
+    "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="],
+
+    "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="],
+
+    "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="],
+
+    "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="],
+
+    "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="],
+
+    "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="],
+
+    "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="],
+
+    "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="],
+
+    "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="],
+
+    "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="],
+
+    "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="],
+
+    "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="],
+
+    "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="],
+
+    "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="],
+
+    "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="],
+
+    "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="],
+
+    "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="],
+
+    "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="],
+
+    "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="],
+
+    "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="],
+
+    "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="],
+
+    "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="],
+
+    "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="],
+
+    "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="],
+
+    "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="],
 
     "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
 
-    "moo": ["moo@0.5.2", "", {}, "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q=="],
+    "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="],
+
+    "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="],
 
-    "morphdom": ["morphdom@2.7.5", "", {}, "sha512-z6bfWFMra7kBqDjQGHud1LSXtq5JJC060viEkQFMBX6baIecpkNr2Ywrn2OQfWP3rXiNFQRPoFjD8/TvJcWcDg=="],
+    "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="],
 
     "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
 
-    "node-retrieve-globals": ["node-retrieve-globals@6.0.1", "", { "dependencies": { "acorn": "^8.14.1", "acorn-walk": "^8.3.4", "esm-import-transformer": "^3.0.3" } }, "sha512-j0DeFuZ/Wg3VlklfbxUgZF/mdHMTEiEipBb3q0SpMMbHaV3AVfoUQF8UGxh1s/yjqO0TgRZd4Pi/x2yRqoQ4Eg=="],
+    "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
+
+    "neotraverse": ["neotraverse@0.6.18", "", {}, "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA=="],
+
+    "nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="],
+
+    "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="],
+
+    "node-fetch-native": ["node-fetch-native@1.6.6", "", {}, "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ=="],
+
+    "node-mock-http": ["node-mock-http@1.0.0", "", {}, "sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ=="],
 
     "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
 
-    "nunjucks": ["nunjucks@3.2.4", "", { "dependencies": { "a-sync-waterfall": "^1.0.0", "asap": "^2.0.3", "commander": "^5.1.0" }, "peerDependencies": { "chokidar": "^3.3.0" }, "optionalPeers": ["chokidar"], "bin": { "nunjucks-precompile": "bin/precompile" } }, "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ=="],
+    "ofetch": ["ofetch@1.4.1", "", { "dependencies": { "destr": "^2.0.3", "node-fetch-native": "^1.6.4", "ufo": "^1.5.4" } }, "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw=="],
 
-    "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
+    "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="],
 
-    "p-finally": ["p-finally@1.0.0", "", {}, "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="],
+    "oniguruma-parser": ["oniguruma-parser@0.12.1", "", {}, "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w=="],
 
-    "p-queue": ["p-queue@6.6.2", "", { "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" } }, "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ=="],
+    "oniguruma-to-es": ["oniguruma-to-es@4.3.3", "", { "dependencies": { "oniguruma-parser": "^0.12.1", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg=="],
 
-    "p-timeout": ["p-timeout@3.2.0", "", { "dependencies": { "p-finally": "^1.0.0" } }, "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg=="],
+    "p-limit": ["p-limit@6.2.0", "", { "dependencies": { "yocto-queue": "^1.1.1" } }, "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA=="],
 
-    "parse-srcset": ["parse-srcset@1.0.2", "", {}, "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q=="],
+    "p-queue": ["p-queue@8.1.0", "", { "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^6.1.2" } }, "sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw=="],
 
-    "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],
+    "p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="],
 
-    "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="],
+    "package-manager-detector": ["package-manager-detector@1.3.0", "", {}, "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ=="],
+
+    "pako": ["pako@0.2.9", "", {}, "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="],
 
-    "please-upgrade-node": ["please-upgrade-node@3.2.0", "", { "dependencies": { "semver-compare": "^1.0.0" } }, "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg=="],
+    "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="],
 
-    "posthtml": ["posthtml@0.16.6", "", { "dependencies": { "posthtml-parser": "^0.11.0", "posthtml-render": "^3.0.0" } }, "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ=="],
+    "parse-latin": ["parse-latin@7.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "@types/unist": "^3.0.0", "nlcst-to-string": "^4.0.0", "unist-util-modify-children": "^4.0.0", "unist-util-visit-children": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ=="],
 
-    "posthtml-match-helper": ["posthtml-match-helper@2.0.3", "", { "peerDependencies": { "posthtml": "^0.16.6" } }, "sha512-p9oJgTdMF2dyd7WE54QI1LvpBIkNkbSiiECKezNnDVYhGhD1AaOnAkw0Uh0y5TW+OHO8iBdSqnd8Wkpb6iUqmw=="],
+    "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="],
 
-    "posthtml-parser": ["posthtml-parser@0.11.0", "", { "dependencies": { "htmlparser2": "^7.1.1" } }, "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw=="],
+    "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+    "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="],
 
-    "posthtml-render": ["posthtml-render@3.0.0", "", { "dependencies": { "is-json": "^2.0.1" } }, "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA=="],
+    "postcss": ["postcss@8.5.5", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg=="],
+
+    "postcss-selector-parser": ["postcss-selector-parser@6.0.10", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w=="],
 
     "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="],
 
-    "prr": ["prr@1.0.1", "", {}, "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw=="],
+    "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],
 
-    "punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="],
+    "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
 
-    "queue": ["queue@6.0.2", "", { "dependencies": { "inherits": "~2.0.3" } }, "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA=="],
+    "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="],
 
-    "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="],
+    "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
 
-    "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="],
+    "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="],
 
-    "section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="],
+    "recma-jsx": ["recma-jsx@1.0.0", "", { "dependencies": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" } }, "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q=="],
 
-    "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
+    "recma-parse": ["recma-parse@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="],
+
+    "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="],
+
+    "regex": ["regex@6.0.1", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA=="],
+
+    "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="],
+
+    "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="],
+
+    "rehype": ["rehype@13.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "rehype-parse": "^9.0.0", "rehype-stringify": "^10.0.0", "unified": "^11.0.0" } }, "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A=="],
+
+    "rehype-parse": ["rehype-parse@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-html": "^2.0.0", "unified": "^11.0.0" } }, "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag=="],
+
+    "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="],
+
+    "rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="],
+
+    "rehype-stringify": ["rehype-stringify@10.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-html": "^9.0.0", "unified": "^11.0.0" } }, "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA=="],
+
+    "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="],
 
-    "semver-compare": ["semver-compare@1.0.0", "", {}, "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow=="],
+    "remark-mdx": ["remark-mdx@3.1.0", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA=="],
 
-    "send": ["send@1.2.0", "", { "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.0", "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.1" } }, "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw=="],
+    "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="],
 
-    "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
+    "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="],
+
+    "remark-smartypants": ["remark-smartypants@3.0.2", "", { "dependencies": { "retext": "^9.0.0", "retext-smartypants": "^6.0.0", "unified": "^11.0.4", "unist-util-visit": "^5.0.0" } }, "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA=="],
+
+    "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="],
+
+    "restructure": ["restructure@3.0.2", "", {}, "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw=="],
+
+    "retext": ["retext@9.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", "retext-stringify": "^4.0.0", "unified": "^11.0.0" } }, "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA=="],
+
+    "retext-latin": ["retext-latin@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "parse-latin": "^7.0.0", "unified": "^11.0.0" } }, "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA=="],
+
+    "retext-smartypants": ["retext-smartypants@6.2.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ=="],
+
+    "retext-stringify": ["retext-stringify@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unified": "^11.0.0" } }, "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA=="],
+
+    "rollup": ["rollup@4.43.0", "", { "dependencies": { "@types/estree": "1.0.7" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.43.0", "@rollup/rollup-android-arm64": "4.43.0", "@rollup/rollup-darwin-arm64": "4.43.0", "@rollup/rollup-darwin-x64": "4.43.0", "@rollup/rollup-freebsd-arm64": "4.43.0", "@rollup/rollup-freebsd-x64": "4.43.0", "@rollup/rollup-linux-arm-gnueabihf": "4.43.0", "@rollup/rollup-linux-arm-musleabihf": "4.43.0", "@rollup/rollup-linux-arm64-gnu": "4.43.0", "@rollup/rollup-linux-arm64-musl": "4.43.0", "@rollup/rollup-linux-loongarch64-gnu": "4.43.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.43.0", "@rollup/rollup-linux-riscv64-gnu": "4.43.0", "@rollup/rollup-linux-riscv64-musl": "4.43.0", "@rollup/rollup-linux-s390x-gnu": "4.43.0", "@rollup/rollup-linux-x64-gnu": "4.43.0", "@rollup/rollup-linux-x64-musl": "4.43.0", "@rollup/rollup-win32-arm64-msvc": "4.43.0", "@rollup/rollup-win32-ia32-msvc": "4.43.0", "@rollup/rollup-win32-x64-msvc": "4.43.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg=="],
+
+    "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
 
     "sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="],
 
+    "shiki": ["shiki@3.6.0", "", { "dependencies": { "@shikijs/core": "3.6.0", "@shikijs/engine-javascript": "3.6.0", "@shikijs/engine-oniguruma": "3.6.0", "@shikijs/langs": "3.6.0", "@shikijs/themes": "3.6.0", "@shikijs/types": "3.6.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-tKn/Y0MGBTffQoklaATXmTqDU02zx8NYBGQ+F6gy87/YjKbizcLd+Cybh/0ZtOBX9r1NEnAy/GTRDKtOsc1L9w=="],
+
     "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="],
 
-    "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="],
+    "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
+
+    "smol-toml": ["smol-toml@1.3.4", "", {}, "sha512-UOPtVuYkzYGee0Bd2Szz8d2G3RfMfJ2t3qVdZUAozZyAk+a0Sxa+QKix0YCwjL/A1RR0ar44nCxaoN9FxdJGwA=="],
+
+    "source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="],
+
+    "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
+
+    "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
+
+    "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
+
+    "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],
+
+    "strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
 
-    "slugify": ["slugify@1.6.6", "", {}, "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw=="],
+    "style-to-js": ["style-to-js@1.1.16", "", { "dependencies": { "style-to-object": "1.0.8" } }, "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw=="],
 
-    "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="],
+    "style-to-object": ["style-to-object@1.0.8", "", { "dependencies": { "inline-style-parser": "0.2.4" } }, "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g=="],
 
-    "ssri": ["ssri@11.0.0", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-aZpUoMN/Jj2MqA4vMCeiKGnc/8SuSyHbGSBdgFbZxP8OJGF/lFkIuElzPxsN0q8TQQ+prw3P4EDfB3TBHHgfXw=="],
+    "tailwindcss": ["tailwindcss@4.1.10", "", {}, "sha512-P3nr6WkvKV/ONsTzj6Gb57sWPMX29EPNPopo7+FcpkQaNsrNpZ1pv8QmrYI2RqEKD7mlGqLnGovlcYnBK0IqUA=="],
 
-    "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="],
+    "tapable": ["tapable@2.2.2", "", {}, "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg=="],
 
-    "strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="],
+    "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="],
+
+    "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="],
+
+    "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
 
     "tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="],
 
-    "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
+    "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="],
+
+    "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],
 
-    "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
+    "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],
+
+    "tsconfck": ["tsconfck@3.1.6", "", { "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w=="],
 
     "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
 
-    "uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="],
+    "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
 
-    "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],
+    "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
 
-    "urlpattern-polyfill": ["urlpattern-polyfill@10.1.0", "", {}, "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw=="],
+    "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="],
 
-    "ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="],
+    "ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="],
 
-    "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
+    "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="],
+
+    "undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="],
+
+    "unicode-properties": ["unicode-properties@1.4.1", "", { "dependencies": { "base64-js": "^1.3.0", "unicode-trie": "^2.0.0" } }, "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg=="],
+
+    "unicode-trie": ["unicode-trie@2.0.0", "", { "dependencies": { "pako": "^0.2.5", "tiny-inflate": "^1.0.0" } }, "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ=="],
+
+    "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="],
+
+    "unifont": ["unifont@0.5.0", "", { "dependencies": { "css-tree": "^3.0.0", "ohash": "^2.0.0" } }, "sha512-4DueXMP5Hy4n607sh+vJ+rajoLu778aU3GzqeTCqsD/EaUcvqZT9wPC8kgK6Vjh22ZskrxyRCR71FwNOaYn6jA=="],
+
+    "unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="],
+
+    "unist-util-is": ["unist-util-is@6.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="],
+
+    "unist-util-modify-children": ["unist-util-modify-children@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "array-iterate": "^2.0.0" } }, "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw=="],
+
+    "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="],
+
+    "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="],
+
+    "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="],
+
+    "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
 
-    "dom-serializer/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="],
+    "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="],
 
-    "finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
+    "unist-util-visit-children": ["unist-util-visit-children@3.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA=="],
+
+    "unist-util-visit-parents": ["unist-util-visit-parents@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="],
+
+    "unstorage": ["unstorage@1.16.0", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", "destr": "^2.0.5", "h3": "^1.15.2", "lru-cache": "^10.4.3", "node-fetch-native": "^1.6.6", "ofetch": "^1.4.1", "ufo": "^1.6.1" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6.0.3 || ^7.0.0", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/kv": "^1.0.1", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA=="],
+
+    "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
+
+    "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
+
+    "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="],
+
+    "vfile-message": ["vfile-message@4.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw=="],
+
+    "vite": ["vite@6.3.5", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ=="],
+
+    "vitefu": ["vitefu@1.0.6", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" }, "optionalPeers": ["vite"] }, "sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA=="],
+
+    "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
+
+    "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="],
+
+    "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="],
+
+    "which-pm-runs": ["which-pm-runs@1.1.0", "", {}, "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA=="],
+
+    "widest-line": ["widest-line@5.0.0", "", { "dependencies": { "string-width": "^7.0.0" } }, "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA=="],
+
+    "wrap-ansi": ["wrap-ansi@9.0.0", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q=="],
+
+    "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="],
+
+    "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="],
+
+    "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
+
+    "yocto-queue": ["yocto-queue@1.2.1", "", {}, "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg=="],
+
+    "yocto-spinner": ["yocto-spinner@0.2.3", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ=="],
+
+    "yoctocolors": ["yoctocolors@2.1.1", "", {}, "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ=="],
+
+    "zod": ["zod@3.25.64", "", {}, "sha512-hbP9FpSZf7pkS7hRVUrOjhwKJNyampPgtXKc3AN6DsWtoHsg2Sb4SQaS4Tcay380zSwd2VPo9G9180emBACp5g=="],
+
+    "zod-to-json-schema": ["zod-to-json-schema@3.24.5", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g=="],
+
+    "zod-to-ts": ["zod-to-ts@1.2.0", "", { "peerDependencies": { "typescript": "^4.9.4 || ^5.0.2", "zod": "^3" } }, "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA=="],
+
+    "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
+
+    "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
+
+    "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="],
+
+    "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="],
+
+    "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="],
+
+    "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.11", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" }, "bundled": true }, "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA=="],
+
+    "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="],
+
+    "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
+    "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+
+    "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
 
-    "gray-matter/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="],
+    "hast-util-to-parse5/property-information": ["property-information@6.5.0", "", {}, "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig=="],
 
-    "htmlparser2/entities": ["entities@3.0.1", "", {}, "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q=="],
+    "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
 
-    "markdown-it/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
+    "prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
 
-    "nunjucks/commander": ["commander@5.1.0", "", {}, "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="],
+    "rollup/@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="],
 
-    "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
+    "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
 
-    "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
+    "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
 
-    "gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
+    "ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
   }
 }
diff --git a/content/404.md b/content/404.md
deleted file mode 100644 (file)
index 4f09f98..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
----
-layout: layouts/base.njk
-title: 404
-permalink: 404.html
-date: 2024-07-30
----
-
-# 404 Not Found
-
-Oops! The page you requested is not found.
\ No newline at end of file
diff --git a/content/articles.njk b/content/articles.njk
deleted file mode 100644 (file)
index f09e5c3..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
----
-layout: layouts/base.njk
-title: Articles
-date: 2025-02-01
-modified: 2025-03-20
----
-
-<h1>Articles</h1>
-
-{% include "components/activitylist.njk" %}
diff --git a/content/articles/articles.json b/content/articles/articles.json
deleted file mode 100644 (file)
index a007138..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "tags": ["articles"],
-    "layout": "layouts/post.njk",
-    "permalink": "articles/{{ date | htmlDateString }}-{{ title | slugify }}/"
-}
\ No newline at end of file
similarity index 80%
rename from content/articles/bitcoin-mempools-cleared-is-nobody-using-bitcoin/index.md
rename to content/articles/bitcoin-mempools-cleared-is-nobody-using-bitcoin/index.mdx
index cbe4c594402611d29f6e0802ae9f69c7571b4065..94d794b0e51009c8741864797e72983f85eb7458 100644 (file)
@@ -10,28 +10,31 @@ posse:
   ActivityPub: https://otsuka.social/@cameron/statuses/01JKRH19PJ7HMABRE4A1F8ZYMV
   Bluesky: https://bsky.app/profile/otsuka.haus/post/3lhtqq2u5ck2h
 ---
+import { Picture } from 'astro:assets';
+import Callout from '@components/ui/callout.astro';
+import Figure from '@components/ui/figure.astro';
+import mempool1yr from './mempool-1yr.svg';
+import mempoolAllTime from './mempool-all-time.svg';
+import hashpriceIndex2yr from './hashprice-index-2yr.png';
+import hashrate2yr from './hashrate-2yr.svg';
+import innovativeOnlineIndustries from './innovative-online-industries.jpg';
 
-{% callout "info" %}
-**TL;DR:** Don't panic.
-{% endcallout %}
+<Callout level="info">**TL;DR:** Don't panic.</Callout>
 
 Bitcoin mempools cleared last week and concern for the health of the network started rolling in. Most of the concerns that we're seeing today have already been voiced during past cycles and there are incentive mechanisms built into the Bitcoin protocol that automatically protect against some of these concerns. If we see long-term low transaction volumes, there could be real concerns for the health of the network, but I don't see any immediate reason to panic.
 
 Here's the chart everyone was worried about, showing the dropoff in feerates:
 
-<figure>
-    {% image "./mempool-1yr.svg", "Bitcoin mempool by sats/vByte over the last year" %}
-    <figcaption>Bitcoin mempool by sats/vByte over the last year. Data from 2024-02-07 through 2025-02-07. Source: <a href="https://mempool.space/graphs/mempool#1y">mempool.space</a>.</figcaption>
-</figure>
-
+<Figure image={mempool1yr} alt="Bitcoin mempool by sats/vByte over the last year" formats={['svg']}>
+    Bitcoin mempool by sats/vByte over the last year. Data from 2024-02-07 through 2025-02-07. Source: [mempool.space](https://mempool.space/graphs/mempool#1y).
+</Figure>
 
 ## Is this abnormal?
 I wouldn't call empty mempools abnormal by any means. Zooming out the mempool chart's date range shows prior periods of low mempool utilization:
 
-<figure>
-    {% image "./mempool-all-time.svg", "Bitcoin mempool by sats/vByte since beginning of data" %}
-    <figcaption>Bitcoin mempool by sats/vByte since beginning of data. Data from beginning of dataset through 2025-02-07. Source: <a href="https://mempool.space/graphs/mempool#all">mempool.space</a>.</figcaption>
-</figure>
+<Figure image={mempoolAllTime} alt="Bitcoin mempool by sats/vByte since beginning of data" formats={['svg']}>
+    Bitcoin mempool by sats/vByte since beginning of data. Data from beginning of dataset through 2025-02-07. Source: [mempool.space](https://mempool.space/graphs/mempool#all).
+</Figure>
 
 If you overlay the Bitcoin/USD price chart with this, you'll notice the highest mempool utilization periods mostly align with runups to and during bull markets. I'd also point out that the most recent period of mempool activity reached higher feerates than prior periods largely due to BRC-20 tokens, Runes, and other NFT/NFT-like transactions.
 
@@ -39,9 +42,9 @@ If you overlay the Bitcoin/USD price chart with this, you'll notice the highest
 I selected posts that exemplified common themes from the concern posts I saw bubbling up on my feeds.
 
 ### Security Budget
-> In case you were confused, this is not a good thing. This is where mindless maxi hodl narratives lead, a network with less censorship resistance.
+> "In case you were confused, this is not a good thing. This is where mindless maxi hodl narratives lead, a network with less censorship resistance.
 >
-> Demand for blockspace (specifically black market) ultimately secures the #Bitcoin network from censorship. No fees, no security.
+> Demand for blockspace (specifically black market) ultimately secures the #Bitcoin network from censorship. No fees, no security."
 > — [@aeonBTC](https://x.com/aeonBTC/status/1885820706702963058)
 
 This is probably the most common concern you'll come across: no transactions means no fees. In the future, the block subsidy will be miniscule and transaction fees must generate enough revenue for miners to contribute hashrate, thereby securing the network.
@@ -49,7 +52,7 @@ This is probably the most common concern you'll come across: no transactions mea
 æon ties this into censorship resistance[^1] but the incentives for a decentralized miner (e.g., solo miner at home) are the same as a centralized miner.[^2] Even today, centralized miners benefit from scale, generally lower costs of energy due to negotiated rate contracts, and earlier access to ASICs which puts them at an advantage to the decentralized miner.
 
 ### Sovereign Disuse
-> An empty mempool is a sign that sovereign usage of Bitcoin is extremely low.
+> "An empty mempool is a sign that sovereign usage of Bitcoin is extremely low."
 > — [@lopp](https://x.com/lopp/status/1885808221610291443)
 
 I don't think empty mempools necessarily point to this. I do think there's transaction volume that never appears on-chain because of custodial solutions, but I would also expect much of the day-to-day transaction volume to occur on Lightning given confirmation times and transaction fees.
@@ -57,11 +60,11 @@ I don't think empty mempools necessarily point to this. I do think there's trans
 And would bartering or exchanging Bitcoin for goods be considered even more sovereign? Those are transactions occurring completely off-chain.
 
 ### Hoarding
-> An empty mempool whispers what few want to hear—Bitcoin isn't circulating, it's being hoarded.
+> "An empty mempool whispers what few want to hear—Bitcoin isn't circulating, it's being hoarded.
 >
 > Trades happen off-chain, value sits idle, and few price in sats. Until more goods, services, and wages abandon fiat entirely, the network will remain a vault rather than a thriving economy.
 >
-> The mempool should be alive, not a monument to stillness.
+> The mempool should be alive, not a monument to stillness."
 > — [@BastienSinclair](https://x.com/BastienSinclair/status/1885810844933739006)
 
 I'd say this is the current state of affairs. Bitcoin is mostly used to HODL. The "digital gold" narrative is strong. I would add that during the higher feerate period, the opposite scalability concern popped up: fees would become so high that Bitcoin usage will only be usable by large entities for high economic value transactions.
@@ -81,15 +84,13 @@ The relative economic incentives impacts miners' hashrate decision, which is mor
 
 We haven't seen a significant decline in total hashrate, despite hashprice decreasing over the last few years, meaning miners haven't seen profitability decline enough that would force them to decrease their hashrate.
 
-<figure>
-    {% image "./hashprice-index-2yr.png", "Bitcoin hashprice over the last 2 years" %}
-    <figcaption>Bitcoin hashprice over the last 2 years. Data from 2023-02-04 through 2025-02-08. Source: <a href="https://data.hashrateindex.com/network-data/bitcoin-hashprice-index">Hashrate Index</a>.</figcaption>
-</figure>
+<Figure image={hashpriceIndex2yr} alt="Bitcoin hashprice over the last 2 years">
+    Bitcoin hashprice over the last 2 years. Data from 2023-02-04 through 2025-02-08. Source: [Hashrate Index](https://data.hashrateindex.com/network-data/bitcoin-hashprice-index).
+</Figure>
 
-<figure>
-    {% image "./hashrate-2yr.svg", "Bitcoin hashrate over the last 2 years" %}
-    <figcaption>Bitcoin hashrate over the last 2 years. Data from 2023-02-08 through 2025-02-07. Source: <a href="https://mempool.space/graphs/mining/hashrate-difficulty#2y">mempool.space</a>.</figcaption>
-</figure>
+<Figure image={hashrate2yr} alt="Bitcoin hashrate over the last 2 years" formats={['svg']}>
+    Bitcoin hashrate over the last 2 years. Data from 2023-02-08 through 2025-02-07. Source: [mempool.space](https://mempool.space/graphs/mining/hashrate-difficulty#2y).
+</Figure>
 
 If energy prices continue to rise and hashprice doesn't increase, Bitcoin miners will eventuallly decrease their hashrate. We've started to see this with news of some miners using their energy for AI training/inference instead. I'd argue this is a good thing for the Bitcoin network, as oversaturating hashrate means we overallocated capital to mining.
 
@@ -106,13 +107,13 @@ It's not up to me to tell others how they want to use Bitcoin. I'd like to see m
 ## What should I do then?
 Take advantage of the lower fees and make on-chain transactions. Some ideas:
 - Transact with Bitcoin!
-- Consolidate your UTXOs. [I wrote an article on considerations for minimum UTXO size]({{ "../minimum-utxo-value/index.md" | inputPathToUrl }}).
+- Consolidate your UTXOs. [I wrote an article on considerations for minimum UTXO size](/articles/minimum-utxo-value/).
 - Open/close Lightning channels. The initial funding and closing mechanisms require on-chain transactions.
 - Create new multisig vaults.
 
 [^1]: [https://x.com/aeonBTC/status/1885943894581583996](https://x.com/aeonBTC/status/1885943894581583996)
 [^2]: And this should really be a concern with centralized pools as well, since it really turns into a regulatory concern argument. The jurisdiction of both the miner and the pool will impact decision making on whether hashrate will be pointed at a transaction filtering pool.
-[^3]: Some kind of cyberpunk megacorporation that somehow benefits from destroying Bitcoin??? A bitcoin-focused IOI from <cite>Ready Player One</cite>? {% image "./innovative-online-industries.jpg", "Innovative Online Industries logo." %}
+[^3]: Some kind of cyberpunk megacorporation that somehow benefits from destroying Bitcoin??? A bitcoin-focused IOI from <cite>Ready Player One</cite>? <Picture src={innovativeOnlineIndustries} alt="Innovative Online Industries logo." />
 [^4]: Braiins put together [a good analysis of this](https://braiins.com/blog/how-much-would-it-cost-to-51-attack-bitcoin) in 2021.
 [^5]: [https://docs.luxor.tech/hashrateindex/hashprice](https://docs.luxor.tech/hashrateindex/hashprice)
 [^6]: Some that come to mind are [Strike](https://strike.me), [River](https://river.com), and [Kraken](https://www.kraken.com), among others.
similarity index 71%
rename from content/articles/minimum-utxo-value/index.md
rename to content/articles/minimum-utxo-value/index.mdx
index aac83838853ef6f152e9f3ba62f1fe9fdf78a6da..cd8c10a5d59073a11288bc97342f58db4ed5bd63 100644 (file)
@@ -9,6 +9,13 @@ posse:
   𝕏: https://x.com/CameronOtsuka/status/1687510820417363968
   Nostr: https://primal.net//e/note1r0ht4gkxpg8hddyxflfzw0w0rv6qxchc6s836pt9lsqeqwxahj9sgrrgpw
 ---
+import Callout from '@components/ui/callout.astro';
+import Figure from '@components/ui/figure.astro';
+import minimumUTXOValueMempoolVBytesHistory from './minimum-utxo-value_mempool_vbytes_history.svg';
+import minimumUTXOValueBoxWhiskerOverall from './minimum-utxo-value_box-whisker-overall.svg';
+import minimumUTXOValueBoxWhiskerFeeRateScriptTypes from './minimum-utxo-value_box-whisker-fee-rate-script-type.svg';
+import minimumUTXOValueBoxWhiskerFeesScriptType from './minimum-utxo-value_box-whisker-fees-script-type.svg';
+import minimumUTXOValueBoxWhiskerFeesScriptTypeZoomed from './minimum-utxo-value_box-whisker-fees-script-type-zoomed.svg';
 
 Due to recent high fee rate periods, many were advocating for consolidating low-value UTXOs to ensure they wouldn't become dust. I was curious whether I had UTXOs that were in danger of becoming dust.
 
@@ -16,17 +23,14 @@ While there is a [technical definition](https://bitcoin.stackexchange.com/a/4108
 
 Because fee rates are the primary variable determining the dust threshold, whether a UTXO is considered dust can change over time. I took a look at historical fee rates, how fees are calculated, and included qualitative projections of future block space demand to determine a UTXO value that will stay above the dust threshold for myself.
 
-{% callout "info" %}
-**TL;DR:** Taproot UTXO, 65k sats
-{% endcallout %}
+<Callout level="info">**TL;DR:** Taproot UTXO, 65k sats</Callout>
 
 ### Historical Fee Rates
 The highest fee periods in Bitcoin history have been 2018, 2021, and 2023:
 
-<figure>
-    {% image "./minimum-utxo-value_mempool_vbytes_history.svg", "Historical graph of Bitcoin mempool by vBytes" %}
-    <figcaption>Source: <a href="https://mempool.space/graphs/mempool#all">mempool.space</a>.</figcaption>
-</figure>
+<Figure image={minimumUTXOValueMempoolVBytesHistory} alt="Historical graph of Bitcoin mempool by vBytes" formats={['svg']}>
+    Source: [mempool.space](https://mempool.space/graphs/mempool#all).
+</Figure>
 
 I've selected 4 blocks to deep dive, based on their proximity to mempool peaks in those three years, as well as a more "normal" current block:
 - 504000: January 12, 2018
@@ -34,10 +38,9 @@ I've selected 4 blocks to deep dive, based on their proximity to mempool peaks i
 - 782400: March 24, 2023
 - 801171: July 31, 2023
 
-<figure>
-    {% image "./minimum-utxo-value_box-whisker-overall.svg", "Box and whisker plot of fee rates across blocks" %}
-    <figcaption>Outliers removed.</figcaption>
-</figure>
+<Figure image={minimumUTXOValueBoxWhiskerOverall} alt="Box and whisker plot of fee rates across blocks" formats={['svg']}>
+    Outliers removed.
+</Figure>
 
 | **Fee Rate (sats/vB)** | **504000** | **680000** | **782400** | **801171** |
 |:----------------------:|:----------:|:----------:|:----------:|:----------:|
@@ -48,16 +51,13 @@ I've selected 4 blocks to deep dive, based on their proximity to mempool peaks i
 
 The first visible difference based on the box and whisker plot is the noticeable decrease in fee rate variance, likely attributable to better fee estimations. Second, is the 86% decline in median fee rate with an average 194 sats/vB between blocks 504000 and 680000 vs. 27 sats/vB in block 782400.
 
-{% callout "info" %}
-I'm taking a naïve view of transactions, so transactions pushed through using CPFP aren't coalesced into a single transaction with a blended, "effective" fee rate. In theory, this should reduce fee rate spread, but will be relatively centered around the median.
-{% endcallout %}
+<Callout level="info">I'm taking a naïve view of transactions, so transactions pushed through using CPFP aren't coalesced into a single transaction with a blended, "effective" fee rate. In theory, this should reduce fee rate spread, but will be relatively centered around the median.</Callout>
 
 I don't expect to see major differences in fee rates by script type, but since I have the data available here's what that looks like (it's as expected):
 
-<figure>
-    {% image "./minimum-utxo-value_box-whisker-fee-rate-script-type.svg", "Box and whiskper plot of fee rates by script type" %}
-    <figcaption>Fee Rate axis capped at 50 sats/vB to better show the differences between script types.</figcaption>
-</figure>
+<Figure image={minimumUTXOValueBoxWhiskerFeeRateScriptTypes} alt="Box and whiskper plot of fee rates by script type" formats={['svg']}>
+    Fee Rate axis capped at 50 sats/vB to better show the differences between script types.
+</Figure>
 
 Transactions are shifting towards the newer P2WPKH, P2WSH, and P2TR script types:
 
@@ -71,17 +71,15 @@ Transactions are shifting towards the newer P2WPKH, P2WSH, and P2TR script types
 
 Where the script types do differ is in the total size of the transaction and therefore, the total fees paid.
 
-<figure>
-    {% image "./minimum-utxo-value_box-whisker-fees-script-type.svg", "Box and whisker plot of total fees by script type" %}
-    <figcaption>Fee Rate axis capped at 300000 sats/vB to better show the differences between script types.</figcaption>
-</figure>
+<Figure image={minimumUTXOValueBoxWhiskerFeesScriptType} alt="Box and whisker plot of total fees by script type" formats={['svg']}>
+    Fee Rate axis capped at 300000 sats/vB to better show the differences between script types.
+</Figure>
 
 P2WSH and P2TR transactions appear to be paying higher median fees than other script types.
 
-<figure>
-    {% image "./minimum-utxo-value_box-whisker-fees-script-type-zoomed.svg", "Box and whisker plot of total fees by script type, zoomed" %}
-    <figcaption>Fee Rate axis capped at 18000 sats/vB to better show the differences between script types.</figcaption>
-</figure>
+<Figure image={minimumUTXOValueBoxWhiskerFeesScriptTypeZoomed} alt="Box and whisker plot of total fees by script type, zoomed" formats={['svg']}>
+    Fee Rate axis capped at 18000 sats/vB to better show the differences between script types.
+</Figure>
 
 To better understand the cause of this, we have to know how vBytes are allocated during the construction of a transaction.
 
@@ -90,7 +88,7 @@ The total fees paid to move a given UTXO depend on the vBytes needed to construc
 
 The table below shows the amount of vBytes required by a transaction consisting of a single input being spent to a single output.
 
-| **Output →{% raw %}<br>{% endraw %}Input ↓** | **P2PKH** | **P2SH** | **P2WPKH** | **P2WSH** | **P2TR** |
+| **Output →<br />Input ↓** | **P2PKH** | **P2SH** | **P2WPKH** | **P2WSH** | **P2TR** |
 |:--------------------:|:---------:|:--------:|:----------:|:---------:|:--------:|
 |         P2PKH        |    192    |    190   |     189    |    201    |    201   |
 |     P2SH (2-of-3)    |    341    |    339   |     338    |    350    |    350   |
@@ -100,9 +98,7 @@ The table below shows the amount of vBytes required by a transaction consisting
 
 So in ideal dust spending conditions, you would hold a P2TR UTXO and spend it to a P2WPKH output. An input requires more vBytes than an output, so the ideal will change if you are spending few inputs to many outputs.
 
-{% callout "info" %}
-Surprisingly, despite P2SH and P2PKH inputs being the most expensive (in terms of total fees), the fee data above doesn't bear that out. Without doing further digging, I assume it's due to multi-sig being more common with other script types.
-{% endcallout %}
+<Callout level="info">Surprisingly, despite P2SH and P2PKH inputs being the most expensive (in terms of total fees), the fee data above doesn't bear that out. Without doing further digging, I assume it's due to multi-sig being more common with other script types.</Callout>
 
 ### Choosing a Minimum UTXO Value
 Putting everything together, here are my assumptions for choosing my minimum UTXO value:
similarity index 90%
rename from content/articles/monetary-system-enshittification/index.md
rename to content/articles/monetary-system-enshittification/index.mdx
index 2ae123b98bd7fd55a7bf2b895c93750481c1bcbf..8624b9d5a3304d7fd3c1496233f04a1e05512ee8 100644 (file)
@@ -8,12 +8,15 @@ tags:
 posse:
   𝕏: https://x.com/CameronOtsuka/status/1763677048814616669
 ---
+import { Picture } from 'astro:assets';
+import honeyBadger from './monetary-system-enshittification_honeybadger.jpg';
 
-{% image "./monetary-system-enshittification_honeybadger.jpg", "Bitcoin honeybadger stomping on the US monetary system." %}
+<Picture src={honeyBadger} alt="Bitcoin honeybadger stomping on the US monetary system." />
 
 Is the US monetary system experiencing enshittification? And how do we solve it? If we think about monetary systems as platforms which facilitate value transfer, I think some of [Cory Doctorow's](https://twitter.com/doctorow) ideas on preventing platform decay can apply.
 
-> "First, they are good to their users; then they abuse their users to make things better for their business customers; finally, they abuse those business customers to claw back all the value for themselves. Then, they die." — Cory Doctorow
+> "First, they are good to their users; then they abuse their users to make things better for their business customers; finally, they abuse those business customers to claw back all the value for themselves. Then, they die."
+> — Cory Doctorow
 
 Ultimately, enshittification is a rent-seeking problem: the platform is no longer incentivized to maximize value for the users since they're locked into the network. Rent-seeking continues to drain value from debtors to creditors and leads to heavy stratification of society.
 
similarity index 73%
rename from content/articles/r1-vs-o1-ai-as-commodity-or-moat/index.md
rename to content/articles/r1-vs-o1-ai-as-commodity-or-moat/index.mdx
index 9aa5535d37b513ff47846c32d8c2bf69d52fcd6a..368eeeefa7cc51a8b0a36dd58d8761fb1e42b126 100644 (file)
@@ -10,39 +10,43 @@ posse:
   ActivityPub: https://otsuka.social/@cameron/statuses/01JJN5WVS1ZMZ56SK4T3YQ3J8Z
   Bluesky: https://bsky.app/profile/otsuka.haus/post/3lgradsawkc2v
 ---
+import { Picture } from 'astro:assets';
+import Callout from '@components/ui/callout.astro';
+import Figure from '@components/ui/figure.astro';
+import dabbingMeme from './us-china-ai-model-enjoyers-dabbing-dude.jpg';
+import nvda from './nvda-2025-01-27.png';
+import inputOutputPricing from './input-output-pricing.jpg';
+import accuracyByBenchmark from './r1-o1-benchmarks.jpg';
+import r1OniPhone from './r1-on-iphone-localghost.gif';
 
-{% image "./us-china-ai-model-enjoyers-dabbing-dude.jpg", "US - China AI model enjoyers Dabbing Dude meme" %}
+<Picture src={dabbingMeme} alt="US - China AI model enjoyers Dabbing Dude meme" />
 
 DeepSeek announced the release of its R1 reasoning model[^1] a day before the US announced it would use its executive power to secure the infrastructure needs for a joint venture between OpenAI (developers of the o1 reasoning model), Microsoft, Oracle, and Softbank, titled "Stargate"[^2].
 
 A few days later, markets have taken this as an existential threat to OpenAI's dominance and energy/compute demand. This is a shot across the bow from DeepSeek and zooming out, represents the economic tug-of-war between China and the US, but I don't think it spells disaster for the US' ambitions -- if US companies can continue pushing the performance frontier.
 
-<figure>
-    {% image "./nvda-2025-01-27.png", "NVDA price action on 2025-01-27" %}
-    <figcaption>Nvidia was down ~17% by end of day on the news.</figcaption>
-</figure>
+<Figure image={nvda} alt="NVDA price action on 2025-01-27">
+    Nvidia was down ~17% by end of day on the news.
+</Figure>
 
 ## The Facts
 DeepSeek trained R1 for an estimated $5.6MM on A100 and H800 GPUs (not the latest-and-greatest GPUs available). End-user inference pricing is an order of magnitude cheaper than o1.
 
-<figure>
-    {% image "./input-output-pricing.jpg", "Input/Output Pricing for o1-Class Inference Models ($/1M Tokens)" %}
-    <figcaption>Source: <a href="https://x.com/RnaudBertrand/status/1881709223152878000/photo/1">@RnaudBertrand</a>.</figcaption>
-</figure>
+<Figure image={inputOutputPricing} alt="Input/Output Pricing for o1-Class Inference Models ($/1M Tokens)">
+    Source: [@RnaudBertrand](https://x.com/RnaudBertrand/status/1881709223152878000/photo/1).
+</Figure>
 
 Despite less capital expenditure, R1 has comparable performance to o1 due to several technical innovations. I don't pretend to deeply understand everything on this front, so instead I'll direct you [to this paper](https://github.com/deepseek-ai/DeepSeek-R1/blob/main/DeepSeek_R1.pdf), which breaks down what's happening under the hood. Ultimately, R1 is essentially a drop-in replacement for o1.
 
-<figure>
-    {% image "./r1-o1-benchmarks.jpg", "Accuracy / Percentile (%) by Benchmark" %}
-    <figcaption>Source: <a href="https://github.com/deepseek-ai/DeepSeek-R1/blob/main/DeepSeek_R1.pdf">DeepSeek-AI</a>.</figcaption>
-</figure>
+<Figure image={accuracyByBenchmark} alt="Accuracy / Percentile (%) by Benchmark">
+    Source: [DeepSeek-AI](https://github.com/deepseek-ai/DeepSeek-R1/blob/main/DeepSeek_R1.pdf).
+</Figure>
 
 This is incredible for the little guy: run your own model, privately, without the need for massive infrastructure.
 
-<figure>
-    {% image "./r1-on-iphone-localghost.gif", "R1 running locally on an iPhone" %}
-    <figcaption>A distilled version of R1 running locally on an iPhone. Source: <a href="https://x.com/localghost/status/1882109711732154387">@localghost</a>.</figcaption>
-</figure>
+<Figure image={r1OniPhone} alt="R1 running locally on an iPhone" formats={['gif']}>
+    A distilled version of R1 running locally on an iPhone. Source: [@localghost](https://x.com/localghost/status/1882109711732154387).
+</Figure>
 
 ## Is OpenAI Cooked?
 First, the threshold for publicly available, open-source reasoning models will never be lower than this. HuggingFace is attempting to reproduce R1 fully in the open[^3] which would make it an end-to-end public frontier model. I think this is a win for society.
@@ -63,6 +67,6 @@ I don't think it's a stretch to compare OpenAI's business model with that of IBM
 [^1]: [🚀 DeepSeek-R1 is here!](https://x.com/deepseek_ai/status/1881318130334814301)
 [^2]: [Announcing the Stargate Project](https://openai.com/index/announcing-the-stargate-project/)
 [^3]: [Open R1](https://github.com/huggingface/open-r1)
-[^4]: [Full Translation: China’s ‘New Generation Artificial Intelligence Development Plan’ (2017)](https://digichina.stanford.edu/work/full-translation-chinas-new-generation-artificial-intelligence-development-plan-2017/#:~:text=Open-Source%20and,a%20global%20scale.)
-[^5]: [Full Translation: China’s ‘New Generation Artificial Intelligence Development Plan’ (2017)](https://digichina.stanford.edu/work/full-translation-chinas-new-generation-artificial-intelligence-development-plan-2017/#:~:text=(2)%20optimize%20arrangements%20to%20build%20ai%20innovation%20bases)
+[^4]: [Full Translation: China's 'New Generation Artificial Intelligence Development Plan' (2017)](https://digichina.stanford.edu/work/full-translation-chinas-new-generation-artificial-intelligence-development-plan-2017/#:~:text=Open-Source%20and,a%20global%20scale.)
+[^5]: [Full Translation: China's 'New Generation Artificial Intelligence Development Plan' (2017)](https://digichina.stanford.edu/work/full-translation-chinas-new-generation-artificial-intelligence-development-plan-2017/#:~:text=(2)%20optimize%20arrangements%20to%20build%20ai%20innovation%20bases)
 [^6]: [History of IBM - 1975–1992: Information revolution, rise of software and PC industries](https://en.wikipedia.org/wiki/History_of_IBM#1975%E2%80%931992:_Information_revolution,_rise_of_software_and_PC_industries)
\ No newline at end of file
similarity index 95%
rename from content/articles/removing-a-drive-from-a-btrfs-array.md
rename to content/articles/removing-a-drive-from-a-btrfs-array.mdx
index 228c7372e745123d09eaf0b986a92ef09856a8c1..aea7fd488266bc0ec01ec7aa65bb507daaf6d6c6 100644 (file)
@@ -6,14 +6,13 @@ description: If a drive is failing in an array, Btrfs could block attempts at re
 tags:
 - linux
 ---
+import Callout from '@components/ui/callout.astro';
 
 I recently ran into a situation where I knew one of the hard drives in my Btrfs array was failing. Simply following the [Btrfs wiki removing devices instructions](https://archive.kernel.org/oldwiki/btrfs.wiki.kernel.org/index.php/Using_Btrfs_with_Multiple_Devices.html#Removing_devices) was unsuccessful as the `btrfs delete device` command would throw an error, cancelling the device deletion process.
 
 At this point, I was okay with losing any corrupted/unrecoverable files. You should already be past the point of restoring from backup, attempting other recovery methods, etc. I just wanted to get the dying drive removed from the array since I knew I didn't have critical data on the array.
 
-{% callout "warn" %}
-Make sure you've exhausted all other resources before continuing. Check the [ArchWiki](https://wiki.archlinux.org/title/Btrfs), [Btrfs mailing list](https://archive.kernel.org/oldwiki/btrfs.wiki.kernel.org/index.php/Btrfs_mailing_list.html), etc. This will lead to data loss!
-{% endcallout %}
+<Callout level="warn">Make sure you've exhausted all other resources before continuing. Check the [ArchWiki](https://wiki.archlinux.org/title/Btrfs), [Btrfs mailing list](https://archive.kernel.org/oldwiki/btrfs.wiki.kernel.org/index.php/Btrfs_mailing_list.html), etc. This will lead to data loss!</Callout>
 
 ### Scrub the Array
 Start a scrub to identify files blocking the device from getting deleted:
diff --git a/content/bitcoin.md b/content/bitcoin.md
deleted file mode 100644 (file)
index b83389c..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
----
-layout: layouts/base.njk
-title: "Bitcoin: A Peer-to-Peer Electronic Cash System"
-date: 2024-07-30
-tags:
-- bitcoin
----
-
-# Bitcoin: A Peer-to-Peer Electronic Cash System
-
-<object data="/public/bitcoin.pdf" type="application/pdf" height="890"></object>
\ No newline at end of file
diff --git a/content/index.md b/content/index.md
deleted file mode 100644 (file)
index cdec53b..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
----
-layout: layouts/home.njk
-title: Home
-date: 2024-07-30
-modified: 2025-03-18
----
-
-I am **Head of Data and Analytics** at Build Asset Management, where I've helped launch a [private credit fund](https://buildbitcoin.com) investing into over-collateralized bitcoin-backed loans, a [fixed income ETF](https://bfix.fund) and related vehicles, and built the internal tech stack that glues everything together.
-
-{% callout "info" %}
-Some topics currently holding my interest: data, analytics, economics, [Bitcoin](/bitcoin/), cryptography, privacy, security, urbanism, skiing &hellip;
-{% endcallout %}
-
-Articles will tend towards serious. Other activities are likely more frivolous.
\ No newline at end of file
diff --git a/content/links.njk b/content/links.njk
deleted file mode 100644 (file)
index d2c2104..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
----
-layout: layouts/base.njk
-title: Links
-date: 2025-02-01
-modified: 2025-03-20
----
-
-<h1>Links</h1>
-
-{% include "components/activitylist.njk" %}
similarity index 82%
rename from content/links/build-weekly-roundup-2025-week-11.md
rename to content/links/build-weekly-roundup-2025-week-11.mdx
index 23f9da2719d90a1c1a1b40e3cfc964be1e68a16f..b71188da97df59763790e2868c0c1798582d82db 100644 (file)
@@ -14,10 +14,11 @@ posse:
   YouTube: https://www.youtube.com/watch?v=SbpNbMR9HdM
   Spotify: https://creators.spotify.com/pod/show/buildmarkets/episodes/BUILD-WEEKLY-ROUNDUP---2025-WEEK-11-e32jcn6
 ---
+import YouTube from '@components/youtube.astro';
 
 - Fork in the road for Treasury yields
 - What would a Mar-a-Lago Accord mean for Bitcoin and Treasury yield correlation
 - Bitcoin bonds
 - Tariff whiplash
 
-{% youtube "https://www.youtube.com/watch?v=SbpNbMR9HdM", "BUILD WEEKLY ROUNDUP - 2025 WEEK #11" %}
+<YouTube title="BUILD WEEKLY ROUNDUP - 2025 WEEK #11" videoURL="https://www.youtube.com/watch?v=SbpNbMR9HdM" />
\ No newline at end of file
similarity index 81%
rename from content/links/build-weekly-roundup-2025-week-12.md
rename to content/links/build-weekly-roundup-2025-week-12.mdx
index 39c7f5fe352a8bca61c714c6cbf1b48b6df8fc69..da1f8ef81af5af2c49b1272cbf0c4bb950baebd1 100644 (file)
@@ -13,8 +13,9 @@ posse:
   YouTube: https://www.youtube.com/watch?v=dX0VjqLCZVQ
   Spotify: https://creators.spotify.com/pod/show/buildmarkets/episodes/BUILD-WEEKLY-ROUNDUP---2025-WEEK-12-e32jcqi
 ---
+import YouTube from '@components/youtube.astro';
 
 - Post-FOMC landscape
 - EU Savings & Investments Union
 
-{% youtube "https://www.youtube.com/watch?v=dX0VjqLCZVQ", "BUILD WEEKLY ROUNDUP - 2025 WEEK #12" %}
+<YouTube title="BUILD WEEKLY ROUNDUP - 2025 WEEK #12" videoURL="https://www.youtube.com/watch?v=dX0VjqLCZVQ" />
\ No newline at end of file
similarity index 79%
rename from content/links/build-weekly-roundup-2025-week-14.md
rename to content/links/build-weekly-roundup-2025-week-14.mdx
index 47eda6342689acdae15da611f42ae9b49a5f4273..5d8e6213a2e8eb7758a3a21ca65732191cae94fd 100644 (file)
@@ -13,9 +13,10 @@ posse:
   YouTube: https://www.youtube.com/watch?v=2Mny_aaCciw
   Spotify: https://creators.spotify.com/pod/show/buildmarkets/episodes/BUILD-WEEKLY-ROUNDUP---2025-WEEK-14-e32jd2b
 ---
+import YouTube from '@components/youtube.astro';
 
 - Liberation Day? Or Recession Day?
 - Will tariffs improve GDP outlook?
 - CoreWeave IPO
 
-{% youtube "https://www.youtube.com/watch?v=2Mny_aaCciw", "BUILD WEEKLY ROUNDUP - 2025 WEEK #14" %}
+<YouTube title="BUILD WEEKLY ROUNDUP - 2025 WEEK #14" videoURL="https://www.youtube.com/watch?v=2Mny_aaCciw" />
\ No newline at end of file
similarity index 79%
rename from content/links/build-weekly-roundup-2025-week-15.md
rename to content/links/build-weekly-roundup-2025-week-15.mdx
index 07f8aadbc19fc2f8445fc5b28485734629f2ada0..1d3fc235e35edcdbe84a509d3e77087407e91427 100644 (file)
@@ -13,7 +13,8 @@ posse:
   YouTube: https://www.youtube.com/watch?v=88uye8yGnDA
   Spotify: https://creators.spotify.com/pod/show/buildmarkets/episodes/BUILD-WEEKLY-ROUNDUP---2025-WEEK-15-e32jd6m
 ---
+import YouTube from '@components/youtube.astro';
 
 - Tariffs pack a wallop
 
-{% youtube "https://www.youtube.com/watch?v=88uye8yGnDA", "BUILD WEEKLY ROUNDUP - 2025 WEEK #15" %}
+<YouTube title="BUILD WEEKLY ROUNDUP - 2025 WEEK #15" videoURL="https://www.youtube.com/watch?v=88uye8yGnDA" />
\ No newline at end of file
similarity index 80%
rename from content/links/build-weekly-roundup-2025-week-17.md
rename to content/links/build-weekly-roundup-2025-week-17.mdx
index b63b8a2595ef03fc64d4482fdf82fbf30fc0821a..16728f2d3dc6c8fc4524f81f9140ba859b5a6551 100644 (file)
@@ -14,9 +14,10 @@ posse:
   YouTube: https://www.youtube.com/watch?v=7Rnz-um_t_8
   Spotify: https://creators.spotify.com/pod/show/buildmarkets/episodes/BUILD-WEEKLY-ROUNDUP---2025-WEEK-17-e32jdhr
 ---
+import YouTube from '@components/youtube.astro';
 
 - credit markets settle in
 - bitcoin breaks out?
 - retail rushes for gold
 
-{% youtube "https://www.youtube.com/watch?v=7Rnz-um_t_8", "BUILD WEEKLY ROUNDUP - 2025 WEEK #17" %}
+<YouTube title="BUILD WEEKLY ROUNDUP - 2025 WEEK #17" videoURL="https://www.youtube.com/watch?v=7Rnz-um_t_8" />
\ No newline at end of file
similarity index 78%
rename from content/links/build-weekly-roundup-2025-week-18.md
rename to content/links/build-weekly-roundup-2025-week-18.mdx
index d345a0e89f194522b29d6430ae3823a4e7a27c34..bf6a8fd360bacfdfb1afb73c56b859cdb3274d47 100644 (file)
@@ -14,8 +14,9 @@ posse:
   YouTube: https://www.youtube.com/watch?v=Qujrx5baRIY
   Spotify: https://creators.spotify.com/pod/show/buildmarkets/episodes/THE-ART-OF-THE-UKRAINE-DEAL---BUILD-WEEKLY-ROUNDUP---2025-WEEK-18-e32jdle
 ---
+import YouTube from '@components/youtube.astro';
 
 - us - ukraine minerals deal
 - bitcoin custody security in meatspace
 
-{% youtube "https://www.youtube.com/watch?v=Qujrx5baRIY", "THE ART OF THE (UKRAINE) DEAL - BUILD WEEKLY ROUNDUP - 2025 WEEK #18" %}
+<YouTube title="THE ART OF THE (UKRAINE) DEAL - BUILD WEEKLY ROUNDUP - 2025 WEEK #18" videoURL="https://www.youtube.com/watch?v=Qujrx5baRIY" />
\ No newline at end of file
similarity index 77%
rename from content/links/build-weekly-roundup-2025-week-19.md
rename to content/links/build-weekly-roundup-2025-week-19.mdx
index 5a8e3ceef880d98970e757f333473c1d5fc6af4c..168ac568afa9d269437e3d73e545cd6d990ed585 100644 (file)
@@ -14,9 +14,10 @@ posse:
   YouTube: https://www.youtube.com/watch?v=4Lh8o3z_0ws
   Spotify: https://creators.spotify.com/pod/show/buildmarkets/episodes/HONG-KONG-DOLLAR-SQUEEZE---BUILD-WEEKLY-ROUNDUP---2025-WEEK-19-e32jb7m
 ---
+import YouTube from '@components/youtube.astro';
 
 - hong kong dollar squeeze
 - us dollar catches a bid
 - why not silver?
 
-{% youtube "https://www.youtube.com/watch?v=4Lh8o3z_0ws", "HONG KONG DOLLAR SQUEEZE - BUILD WEEKLY ROUNDUP - 2025 WEEK #19" %}
+<YouTube title="HONG KONG DOLLAR SQUEEZE - BUILD WEEKLY ROUNDUP - 2025 WEEK #19" videoURL="https://www.youtube.com/watch?v=4Lh8o3z_0ws" />
\ No newline at end of file
similarity index 80%
rename from content/links/build-weekly-roundup-2025-week-20.md
rename to content/links/build-weekly-roundup-2025-week-20.mdx
index 54ef4ab21e68c6c0544ec15154fb044c145d9039..c1097c245def584c41a8edd9cb22f002a045b140 100644 (file)
@@ -13,6 +13,7 @@ posse:
   YouTube: https://www.youtube.com/watch?v=UuDEhyhx8cs
   Spotify: https://creators.spotify.com/pod/show/buildmarkets/episodes/NOT-YOUR-FATHERS-RECESSION---BUILD-WEEKLY-ROUNDUP---2025-WEEK-20-e32un7n
 ---
+import YouTube from '@components/youtube.astro';
 
 - Geneva-brokered truce
 - $USD Credit Expansion
@@ -20,4 +21,4 @@ posse:
 
 🛰️ 𝕏 Spaces: [https://x.com/TheBitcoinConf/status/1922769164092994047](https://x.com/TheBitcoinConf/status/1922769164092994047)
 
-{% youtube "https://www.youtube.com/watch?v=UuDEhyhx8cs", "NOT YOUR FATHER'S RECESSION - BUILD WEEKLY ROUNDUP - 2025 WEEK #20" %}
+<YouTube title="NOT YOUR FATHER'S RECESSION - BUILD WEEKLY ROUNDUP - 2025 WEEK #20" videoURL="https://www.youtube.com/watch?v=UuDEhyhx8cs" />
\ No newline at end of file
similarity index 77%
rename from content/links/build-weekly-roundup-2025-week-21.md
rename to content/links/build-weekly-roundup-2025-week-21.mdx
index e7caac9fcab6372a5d8320081d119cea88259e83..0d57bec66f77b269c6503abaeadaaf1c42d881e2 100644 (file)
@@ -13,9 +13,10 @@ posse:
   YouTube: https://www.youtube.com/watch?v=6PqNrcdX7iY
   Spotify: https://creators.spotify.com/pod/show/buildmarkets/episodes/A-PIVOTAL-WEEK---BUILD-WEEKLY-ROUNDUP---2025-WEEK-21-e3380tv
 ---
+import YouTube from '@components/youtube.astro';
 
 - Long bond breaks its channel to the downside
 - GENIUS Act
 - Ukraine impasse
 
-{% youtube "https://www.youtube.com/watch?v=6PqNrcdX7iY", "A PIVOTAL WEEK - BUILD WEEKLY ROUNDUP - 2025 WEEK #21" %}
+<YouTube title="A PIVOTAL WEEK - BUILD WEEKLY ROUNDUP - 2025 WEEK #21" videoURL="https://www.youtube.com/watch?v=6PqNrcdX7iY" />
\ No newline at end of file
similarity index 78%
rename from content/links/build-weekly-roundup-2025-week-23.md
rename to content/links/build-weekly-roundup-2025-week-23.mdx
index 90b1004116390d8d47b87b8865a3fda67a1e4714..96a1131a92b7133ed661ab6c8cae75a282208306 100644 (file)
@@ -14,9 +14,10 @@ posse:
   YouTube: https://www.youtube.com/watch?v=y0fzFUhvPSs
   Spotify: https://creators.spotify.com/pod/show/buildmarkets/episodes/JPM-BENDS-THE-KNEE-TO-BITCOIN---BUILD-WEEKLY-ROUNDUP---2025-WEEK-23-e33td1r
 ---
+import YouTube from '@components/youtube.astro';
 
 - May Nonfarm Payrolls
 - Circle IPO
 - J.P. Morgan x Bitcoin
 
-{% youtube "https://www.youtube.com/watch?v=y0fzFUhvPSs", "JPM BENDS THE KNEE TO BITCOIN - BUILD WEEKLY ROUNDUP - 2025 WEEK #23" %}
+<YouTube title="JPM BENDS THE KNEE TO BITCOIN - BUILD WEEKLY ROUNDUP - 2025 WEEK #23" videoURL="https://www.youtube.com/watch?v=y0fzFUhvPSs" />
\ No newline at end of file
diff --git a/content/links/build-weekly-roundup-2025-week-24.md b/content/links/build-weekly-roundup-2025-week-24.md
deleted file mode 100644 (file)
index 31a138b..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
----
-title: "Last Chance to Hit the Exit?"
-href: https://www.youtube.com/watch?v=DzkHVmYWFNQ
-date: 2025-06-12
-modified: 2025-06-12
-description: "Build Weekly Roundup - 2025 Week #24"
-tags:
-- video
-- macro
-- bitcoin
-posse:
-  𝕏: https://x.com/BuildMarkets/status/1933280062511681715
-  LinkedIn: https://www.linkedin.com/feed/update/urn:li:activity:7339045809440571392/
-  YouTube: https://www.youtube.com/watch?v=DzkHVmYWFNQ
-  Spotify: https://creators.spotify.com/pod/show/buildmarkets/episodes/LAST-CHANCE-TO-HIT-THE-EXIT----BUILD-WEEKLY-ROUNDUP---2025-WEEK-24-e345pap
----
-
-- One Big Beautiful Bill Act
-- US-China Trade Talks in China
-- Unrest in the US
-
-{% youtube "https://www.youtube.com/watch?v=DzkHVmYWFNQ", "LAST CHANCE TO HIT THE EXIT? - BUILD WEEKLY ROUNDUP - 2025 WEEK #24" %}
similarity index 83%
rename from content/links/build-weekly-roundup-2025-week-6.md
rename to content/links/build-weekly-roundup-2025-week-6.mdx
index bb1228a5d20c72b198d4ec6b5ddac719d6622e4d..4cfbdb571c1c113d32b6ae95a3aef2973b363543 100644 (file)
@@ -16,5 +16,6 @@ posse:
   YouTube: https://www.youtube.com/watch?v=gORG_wURG78
   Spotify: https://creators.spotify.com/pod/show/buildmarkets/episodes/BUILD-WEEKLY-ROUNDUP---2025-WEEK-6-e32jcck
 ---
+import YouTube from '@components/youtube.astro';
 
-{% youtube "https://www.youtube.com/watch?v=gORG_wURG78", "BUILD WEEKLY ROUNDUP - 2025 WEEK #6" %}
+<YouTube title="BUILD WEEKLY ROUNDUP - 2025 WEEK #6" videoURL="https://www.youtube.com/watch?v=gORG_wURG78" />
\ No newline at end of file
similarity index 79%
rename from content/links/build-weekly-roundup-2025-week-7.md
rename to content/links/build-weekly-roundup-2025-week-7.mdx
index a800b4ebaa59df2576f3e5a5055d608de11d4a8c..954ddac21d8f0f648cd7f2b94b7bcd5f621d0366 100644 (file)
@@ -14,5 +14,6 @@ posse:
   YouTube: https://www.youtube.com/watch?v=kFL1LCy-Rsk
   Spotify: https://creators.spotify.com/pod/show/buildmarkets/episodes/THE-PENNY-PEG-HAS-BROKEN---BUILD-WEEKLY-ROUNDUP-2025-WEEK-7-e32jcfi
 ---
+import YouTube from '@components/youtube.astro';
 
-{% youtube "https://www.youtube.com/watch?v=kFL1LCy-Rsk", "🚨 THE PENNY PEG HAS BROKEN - BUILD WEEKLY ROUNDUP 2025 WEEK #7" %}
+<YouTube title="🚨 THE PENNY PEG HAS BROKEN - BUILD WEEKLY ROUNDUP 2025 WEEK #7" videoURL="https://www.youtube.com/watch?v=kFL1LCy-Rsk" />
\ No newline at end of file
similarity index 78%
rename from content/links/build-weekly-roundup-2025-week-8.md
rename to content/links/build-weekly-roundup-2025-week-8.mdx
index 0bcb7f204ae8b876ee017ba691818e6d949f6be4..c9894a791922bee579942c680960113251f874ab 100644 (file)
@@ -14,7 +14,8 @@ posse:
   YouTube: https://www.youtube.com/watch?v=-3IfnpazO4A
   Spotify: https://creators.spotify.com/pod/show/buildmarkets/episodes/BUILD-WEEKLY-ROUNDUP---2025-WEEK-8-e32jcj3
 ---
+import YouTube from '@components/youtube.astro';
 
 Talking DOGE cuts 🐶
 
-{% youtube "https://www.youtube.com/watch?v=-3IfnpazO4A", "BUILD WEEKLY ROUNDUP - 2025 WEEK #8" %}
+<YouTube title="BUILD WEEKLY ROUNDUP - 2025 WEEK #8" videoURL="https://www.youtube.com/watch?v=-3IfnpazO4A" />
\ No newline at end of file
diff --git a/content/links/links.json b/content/links/links.json
deleted file mode 100644 (file)
index 203b398..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "tags": ["links"],
-    "layout": "layouts/post.njk",
-    "permalink": "links/{{ date | htmlDateString }}-{{ title | slugify }}/"
-}
\ No newline at end of file
diff --git a/content/reviews.njk b/content/reviews.njk
deleted file mode 100644 (file)
index 56bf07a..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
----
-layout: layouts/base.njk
-title: Reviews
-date: 2025-02-01
-modified: 2025-03-20
----
-
-<h1>Reviews</h1>
-
-{% include "components/activitylist.njk" %}
diff --git a/content/reviews/28-days-later.md b/content/reviews/28-days-later.md
deleted file mode 100644 (file)
index 62ae2ba..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
----
-title: 28 Days Later
-date: 2025-06-06
-modified: 2025-06-06
-description: ★★★
-tags:
-- movie
-posse:
-  Letterboxd: https://letterboxd.com/cotsuka/film/28-days-later/
----
-
-- soundtrack is just as good as i remember with brian eno and godspeed you! black emperor
-- forgot how much of this movie is actually silent with minimal talking
-- middle drags just a tad
-- editing with quick cuts and slightly shaky handheld camera style adds to the confusion and tension they're trying to build
\ No newline at end of file
similarity index 94%
rename from content/reviews/challengers.md
rename to content/reviews/challengers.mdx
index 22965d253f65084983873fa5178de324320b8363..d450111b5e49b868e4202a6e982ce77bc0fde582 100644 (file)
@@ -1,5 +1,5 @@
 ---
-title: 'Challengers'
+title: Challengers
 date: 2024-12-24
 modified: 2024-12-26
 description: ★★★
diff --git a/content/reviews/reviews.json b/content/reviews/reviews.json
deleted file mode 100644 (file)
index a4229ec..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "tags": ["reviews"],
-    "layout": "layouts/post.njk",
-    "permalink": "reviews/{{ date | htmlDateString }}-{{ title | slugify }}/"
-}
\ No newline at end of file
similarity index 94%
rename from content/reviews/subservience.md
rename to content/reviews/subservience.mdx
index 3e55f93c335185fc4e06e4fa35b6be8e2c08fd88..b1bab5132f8c0e5220d40d198e7473df9b445774 100644 (file)
@@ -1,5 +1,5 @@
 ---
-title: 'Subservience'
+title: Subservience
 date: 2024-12-25
 modified: 2024-12-26
 description: ★★
similarity index 93%
rename from content/reviews/the-boy-and-the-heron.md
rename to content/reviews/the-boy-and-the-heron.mdx
index 38d48ad884713bea51a14d00030f9dc98af2e7be..ecb5f04c5657ceed8611ca4c55ba3eb5afd4a3c5 100644 (file)
@@ -1,5 +1,5 @@
 ---
-title: 'The Boy and the Heron'
+title: The Boy and the Heron
 date: 2024-12-21
 modified: 2024-12-23
 description: ★★★★★
similarity index 93%
rename from content/reviews/wicked.md
rename to content/reviews/wicked.mdx
index 2ebed8e9b82fa61f765d97cc44b17bc36184fc9f..f207f8b0840208f92b7088b412aed8d1d8b3b307 100644 (file)
@@ -1,5 +1,5 @@
 ---
-title: 'Wicked'
+title: Wicked
 date: 2024-11-29
 modified: 2025-06-04
 description: ★★★★
diff --git a/data/metadata.json b/data/metadata.json
new file mode 100644 (file)
index 0000000..9103a41
--- /dev/null
@@ -0,0 +1,15 @@
+{
+    "title": "Cameron Otsuka",
+    "subtitle": "The collection of Cameron's thoughts.",
+    "base": "https://otsuka.haus",
+    "language": "en",
+    "author": {
+        "name": "Cameron Otsuka",
+        "email": "cameron@otsuka.haus"
+    },
+    "navMenu": [
+        { "title": "Articles", "url": "/articles/" },
+        { "title": "Links", "url": "/links/" },
+        { "title": "Reviews", "url": "/reviews/" }
+    ]
+}
\ No newline at end of file
similarity index 100%
rename from _data/socials.json
rename to data/socials.json
diff --git a/eleventy.config.js b/eleventy.config.js
deleted file mode 100644 (file)
index 9fa2e9d..0000000
+++ /dev/null
@@ -1,195 +0,0 @@
-import { transform } from "lightningcss";
-import { DateTime } from "luxon";
-import { feedPlugin } from "@11ty/eleventy-plugin-rss";
-import eleventyImagePlugin, { generateHTML } from "@11ty/eleventy-img";
-import eleventySyntaxHighlightPlugin from "@11ty/eleventy-plugin-syntaxhighlight";
-import globalMetadata from "./_data/metadata.json" with { type: "json" };
-import markdownIt from "markdown-it";
-import markdownItFootnote from 'markdown-it-footnote';
-import { resolve, sep, join } from "path";
-
-const markdownOptions = {
-       html: true,
-       breaks: false,
-       linkify: true,
-       typographer: true,
-};
-const mdLibrary = markdownIt(markdownOptions).use(markdownItFootnote);
-
-function relativeToInputPath(inputPath, relativeFilePath) {
-       const split = inputPath.split("/");
-       split.pop();
-       return resolve(split.join(sep), relativeFilePath);
-}
-
-function isFullUrl(url) {
-       try {
-               new URL(url);
-               return true;
-       } catch(e) {
-               return false;
-       }
-}
-
-export default async function (eleventyConfig) {
-       eleventyConfig.addCollection("activities", async (collectionApi) => {
-               let collectionSubset = [];
-               // getFilteredByTag matches ALL tags its passed, not any, so we have to do this
-               for (const category in globalMetadata['categories']) {
-                       collectionSubset.push(...collectionApi.getFilteredByTag(category))
-               }
-               let sortedSubset = collectionSubset.sort(function(a, b) {
-                       // maintain sort order when working with default collections objects
-                       return a.date - b.date;
-               });
-               return sortedSubset;
-       });
-       eleventyConfig.addFilter("cssmin", function (originalCSS) {
-               let { code } = transform({
-                       code: Buffer.from(originalCSS),
-                       minify: true,
-                       sourceMap: false
-               });
-               return code;
-       });
-       eleventyConfig.addFilter("head", (array, n) => {
-               // Get the first `n` elements of a collection.
-               if(!Array.isArray(array) || array.length === 0) {
-                       return [];
-               }
-               if( n < 0 ) {
-                       return array.slice(n);
-               }
-
-               return array.slice(0, n);
-       });
-       eleventyConfig.addFilter("htmlDateString", (dateObj) => {
-               return DateTime.fromJSDate(dateObj, {zone: 'utc'}).toFormat('yyyy-LL-dd');
-       });
-       eleventyConfig.addFilter("isoDate", (dateObj) => {
-               return DateTime.fromJSDate(dateObj, {zone: 'utc'}).toISO();
-       });
-       eleventyConfig.addFilter("keys", function (obj) {
-               return Object.keys(obj);
-       });
-       eleventyConfig.addFilter("min", (...numbers) => {
-               return Math.min.apply(null, numbers);
-       });
-       eleventyConfig.addFilter("notIn", (stringList, rejectList) => {
-               return stringList.filter(str => !rejectList.includes(str));
-       });
-       eleventyConfig.addFilter("startsWith", (str, prefix) => {
-               return str.startsWith(prefix);
-       });
-       eleventyConfig.addPairedShortcode(
-               "callout",
-               function (content, level = "", format = "md", customLabel = "") {
-                       const label = customLabel || globalMetadata['calloutLabels'][level]
-                       if (format === "md") {
-                               content = mdLibrary.renderInline(content);
-                       } else if (format === "md-block") {
-                               content = mdLibrary.render(content);
-                       }
-                       const labelHtml = label
-                               ? `<div class="callout-label">${label}</div>`
-                               : "";
-                       const contentHtml =
-                               (content || "").trim().length > 0
-                                       ? `<div class="callout-content">${content}</div>`
-                                       : "";
-                       return `<div class="callout${level
-                               ? ` callout-${level}`
-                               : ""
-                       }">${labelHtml}${contentHtml}</div>`;
-               }
-       );
-       eleventyConfig.addPassthroughCopy({ "./static/": "/" });
-       eleventyConfig.addPlugin(feedPlugin, {
-               type: "atom",
-               outputPath: "/feed.xml",
-               collection: {
-                       name: "activities",
-                       limit: 10,
-               },
-               metadata: globalMetadata,
-       });
-       for (const category in globalMetadata['categories']) {
-               eleventyConfig.addPlugin(feedPlugin, {
-                       type: "atom",
-                       outputPath: `/feeds/${category}.xml`,
-                       inputPath: `eleventy-plugin-feed-cameron-otsuka-${category}-atom.njk`,
-                       collection: {
-                               name: `${category}`,
-                               limit: 10,
-                       },
-                       metadata: {
-                               ...globalMetadata,
-                               title: globalMetadata['title'].concat(
-                                       ` - ${category.charAt(0).toUpperCase() + category.slice(1)}`
-                               ),
-                       },
-               });
-       }
-       eleventyConfig.addPlugin(eleventySyntaxHighlightPlugin);
-       eleventyConfig.addShortcode("image", async function (src, alt) {
-               let input;
-               if(isFullUrl(src)) {
-                       input = src;
-               } else {
-                       input = relativeToInputPath(this.page.inputPath, src);
-               }
-               const metadata = await eleventyImagePlugin(input, {
-                       widths: [360, 720, 1440],
-                       formats: ["svg", "avif", "jpeg", "gif"],
-                       svgAllowUpscale: true,
-                       sharpOptions: {
-                               animated: true,
-                               limitInputPixels: false,
-                       },
-                       urlPath: "/img/",
-                       outputDir: join(eleventyConfig.dir.output, "img"),
-               });
-               const sizes = new Set(
-                       Object.values(metadata).flatMap(format =>
-                               Object.values(format).map(size => `${size.width}w`)
-                       )
-               );
-               const imageAttributes = {
-                       alt,
-                       sizes: Array.from(sizes).join(", "),
-                       loading: "lazy",
-                       decoding: "async",
-                       "eleventy:ignore": "",
-               };
-               const options = {
-                       pictureAttributes: {},
-                       whitespaceMode: "inline",
-               };
-               return generateHTML(metadata, imageAttributes, options);
-       });
-       eleventyConfig.addShortcode("currentYear", () => {
-               return `${new Date().getFullYear()}`;
-       });
-       eleventyConfig.addShortcode("youtube", (videoURL, title) => {
-               const url = new URL(videoURL);
-               const videoID = url.searchParams.get("v");
-               return `<iframe class="youtube-shortcode" src="https://www.youtube-nocookie.com/embed/${videoID}" title="${title}" loading="lazy" allow="fullscreen"></iframe>`;
-       });
-       eleventyConfig.setLibrary("md", mdLibrary);
-       return {
-               templateFormats: [
-                       "md",
-                       "njk",
-                       "html"
-               ],
-               markdownTemplateEngine: "njk",
-               htmlTemplateEngine: "njk",
-               dir: {
-                       input: "content",
-                       includes: "../_includes",
-                       data: "../_data",
-                       output: "_site"
-               },
-               pathPrefix: "/"
-       };
-};
\ No newline at end of file
index 10d532f46ced3c70e221088245a99eaf581236e5..205c779c35e1f145a207030a800f39af0afc56a8 100644 (file)
@@ -1,13 +1,13 @@
 {
   "name": "cotsuka.github.io",
   "description": "The collection of Cameron's thoughts.",
-  "version": "1.0.0",
+  "version": "2.0.0",
   "type": "module",
-  "engines": {
-    "node": ">=18"
-  },
   "scripts": {
-    "build-ghpages": "npx @11ty/eleventy"
+    "dev": "astro dev",
+    "build": "astro build",
+    "preview": "astro preview",
+    "astro": "astro"
   },
   "repository": {
     "type": "git",
   },
   "license": "MIT",
   "homepage": "https://github.com/cotsuka/cotsuka.github.io",
+  "dependencies": {
+    "@astrojs/mdx": "^4.3.0",
+    "@fontsource-variable/public-sans": "^5.2.6",
+    "@fontsource-variable/source-code-pro": "^5.2.6",
+    "@tailwindcss/vite": "^4.1.10",
+    "astro": "^5.9.3",
+    "tailwindcss": "^4.1.10"
+  },
   "devDependencies": {
-    "@11ty/eleventy": "^3.1.1",
-    "@11ty/eleventy-img": "^6.0.4",
-    "@11ty/eleventy-plugin-rss": "^2.0.4",
-    "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.1",
-    "lightningcss": "^1.30.1",
-    "luxon": "^3.6.1",
-    "markdown-it-footnote": "^4.0.0"
+    "@tailwindcss/typography": "^0.5.16",
+    "@types/bun": "^1.2.16"
   }
-}
+}
\ No newline at end of file
similarity index 100%
rename from static/CNAME
rename to public/CNAME
similarity index 100%
rename from static/public/pfp.jpg
rename to public/public/pfp.jpg
similarity index 100%
rename from static/favicon.ico
rename to src/assets/favicon.ico
diff --git a/src/components/footer.astro b/src/components/footer.astro
new file mode 100644 (file)
index 0000000..eb64895
--- /dev/null
@@ -0,0 +1,21 @@
+---
+import { getCollection } from 'astro:content';
+import Metadata from '@data/metadata.json';
+
+const socials = await getCollection('socials');
+const currentYear = new Date().getFullYear();
+---
+<div class="text-center">
+    <hr class="w-48 h-1 mx-auto bg-black border-0" />
+    <address>
+        <menu>
+            {socials.map((social) => (
+                <li class="inline-block mx-1"><a href={social.data.url} rel="me">{social.data.title}</a></li>
+            ))}
+        </menu>
+    </address>
+    <p>
+        &copy; {currentYear} {Metadata.author.name}.<br>
+        All views my own. Not financial advice. Links, citations, and other references are not endorsements. Content is licensed under <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>.
+    </p>
+</div>
\ No newline at end of file
diff --git a/src/components/head/article.astro b/src/components/head/article.astro
new file mode 100644 (file)
index 0000000..60737de
--- /dev/null
@@ -0,0 +1,19 @@
+---
+import Metadata from '@data/metadata.json';
+
+interface Props {
+    publishedTime: string
+    modifiedTime: string
+    tags?: string[]
+}
+
+const { publishedTime, modifiedTime, tags = [] } = Astro.props;
+---
+
+<meta property="og:type" content="article" />
+<meta property="article:published_time" content={publishedTime} />
+<meta property="article:modified_time" content={modifiedTime} />
+<meta property="article:author" content={Metadata.author.name} />
+{tags.map((tag) => (
+    <meta property="article:tag" content={tag} />
+))}
diff --git a/src/components/head/base.astro b/src/components/head/base.astro
new file mode 100644 (file)
index 0000000..2a0c3e7
--- /dev/null
@@ -0,0 +1,44 @@
+---
+import { getImage } from 'astro:assets';
+import FavIcon from '@assets/favicon.ico';
+import Metadata from '@data/metadata.json';
+import Socials from '@data/socials.json'
+
+interface Props {
+    title: string
+    description: string
+}
+
+const canonicalURL = new URL(Astro.url.pathname, Astro.site);
+const favIcon = await getImage({
+    src: FavIcon,
+    width: 48,
+    height: 48,
+    format: 'ico'
+});
+const { title, description } = Astro.props;
+---
+
+<meta charset="utf-8" />
+<link rel="icon" type="image/x-icon" href={favIcon.src} />
+<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+<!-- <meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src 'self' 'unsafe-inline'; frame-src youtube.com www.youtube.com youtube-noocookie.com www.youtube-nocookie.com" /> -->
+<meta name="title" property="og:title" content={`${title} | ${Metadata.title}`} />
+<meta name="description" property="og:description" content={description} />
+<meta name="author" content={Metadata.author.name} />
+<meta name="generator" content={Astro.generator} />
+<meta name="fediverse:creator" content={Socials.activitypub.username} />
+<meta name="twitter:card" content="summary" />
+<meta name="twitter:creator" content={Socials.x.username} />
+<meta name="twitter:title" content={`${title} | ${Metadata.title}`} />
+<meta name="twitter:description" content={description} />
+<meta name="twitter:image" property="og:image" content={`https://v1.screenshot.11ty.dev/${canonicalURL}opengraph/9:16/`} />
+<meta property="og:image:type" content="image/jpeg" />
+<meta property="og:image:width" content="1200" />
+<meta property="og:image:height" content="630" />
+<meta property="og:locale" content="en_US" />
+<meta property="og:url" content={canonicalURL} />
+<meta property="og:site_name" content={`${title} | ${Metadata.title}`} />
+<meta property="og:updated_time" content={new Date().toISOString()} />
+<title>{`${title} | ${Metadata.title}`}</title>
+<link rel="canonical" href={canonicalURL} />
\ No newline at end of file
diff --git a/src/components/head/page.astro b/src/components/head/page.astro
new file mode 100644 (file)
index 0000000..85475cd
--- /dev/null
@@ -0,0 +1 @@
+<meta property="og:type" content="website" />
\ No newline at end of file
diff --git a/src/components/heading.astro b/src/components/heading.astro
new file mode 100644 (file)
index 0000000..4742c0b
--- /dev/null
@@ -0,0 +1,5 @@
+---
+import Navigation from '@components/navigation.astro';
+---
+<a href="/" class="no-underline"><h1>Cameron Otsuka</h1></a>
+<Navigation />
\ No newline at end of file
diff --git a/src/components/navigation.astro b/src/components/navigation.astro
new file mode 100644 (file)
index 0000000..2baa2f8
--- /dev/null
@@ -0,0 +1,12 @@
+---
+import Metadata from '@data/metadata.json';
+---
+<nav class="text-center">
+    <menu>
+        {Metadata.navMenu.map((menuItem) => {
+            return (
+                <li class="inline-block mx-4"><a href={menuItem.url}>{menuItem.title}</a></li>
+            )
+        })}
+    </menu>
+</nav>
\ No newline at end of file
diff --git a/src/components/posse.astro b/src/components/posse.astro
new file mode 100644 (file)
index 0000000..0bfd584
--- /dev/null
@@ -0,0 +1,16 @@
+---
+interface Props {
+    posse: Record<string, string>
+}
+
+const { posse } = Astro.props;
+---
+{Object.entries(posse).map((site) => {
+    const url = site[1];
+    const label = site[0]
+    return (
+        <Fragment>
+            <a href={url}>{label}</a>&nbsp;
+        </Fragment>
+    )
+})}
\ No newline at end of file
diff --git a/src/components/ui/callout.astro b/src/components/ui/callout.astro
new file mode 100644 (file)
index 0000000..0bf1704
--- /dev/null
@@ -0,0 +1,37 @@
+---
+type CalloutLevel = 'info' | 'warn' | 'error';
+
+interface Props {
+    level: CalloutLevel
+    label?: string
+}
+
+const { level, label } = Astro.props;
+
+let calloutLabel = label;
+let textColor = ''
+let calloutColor = '';
+if (label == null) {
+    switch(level) {
+        case 'info':
+            calloutLabel = 'ⓘ Info';
+            textColor = 'text-blue-500';
+            calloutColor = 'border-blue-500';
+            break;
+        case 'warn':
+            calloutLabel = '⚠ Warning';
+            textColor = 'text-orange-500';
+            calloutColor = 'border-orange-500';
+            break;
+        case 'error':
+            calloutLabel = '! Error';
+            textColor = 'text-red-500';
+            calloutColor = 'border-red-500';
+            break;
+    }
+};
+---
+<div class={`callout callout-${level} pl-[0.5rem] border-l-[0.2rem] border-solid ${calloutColor}`}>
+    <div class={`callout-label font-bold ${textColor}`}>{calloutLabel}</div>
+    <div class="callout-content"><slot /></div>
+</div>
\ No newline at end of file
diff --git a/src/components/ui/figure.astro b/src/components/ui/figure.astro
new file mode 100644 (file)
index 0000000..3742b1e
--- /dev/null
@@ -0,0 +1,15 @@
+---
+import { Picture } from 'astro:assets';
+
+interface Props {
+    image: ImageMetadata
+    alt: string
+    formats?: string[]
+}
+
+const { image, alt, formats = ['avif', 'webp'] } = Astro.props;
+---
+<figure>
+    <Picture src={image} alt={alt} formats={formats} />
+    <figcaption class="mt-0"><slot /></figcaption>
+</figure>
\ No newline at end of file
diff --git a/src/components/youtube.astro b/src/components/youtube.astro
new file mode 100644 (file)
index 0000000..07426dc
--- /dev/null
@@ -0,0 +1,19 @@
+---
+interface Props {
+       title: string;
+       videoURL: string;
+}
+
+const { title, videoURL } = Astro.props;
+
+const url = new URL(videoURL);
+const videoID = url.searchParams.get("v");
+---
+
+<iframe
+    class="w-full aspect-video"
+    src={`https://www.youtube-nocookie.com/embed/${videoID}`}
+    title={title}
+    loading="lazy"
+    allow="fullscreen"
+></iframe>
\ No newline at end of file
diff --git a/src/content.config.ts b/src/content.config.ts
new file mode 100644 (file)
index 0000000..dfc711e
--- /dev/null
@@ -0,0 +1,50 @@
+import { defineCollection, z } from 'astro:content';
+import { glob, file } from 'astro/loaders';
+
+const socials = defineCollection({
+    loader: file('data/socials.json'),
+    schema: z.object({
+        title: z.string(),
+        url: z.string(),
+        username: z.string()
+    })
+});
+
+const articles = defineCollection({
+    loader: glob({ pattern: '**/*.{md,mdx}', base: 'content/articles' }),
+    schema: z.object({
+        title: z.string(),
+        description: z.string(),
+        date: z.coerce.date(),
+        modified: z.coerce.date().optional(),
+        tags: z.array(z.string()).optional(),
+        posse: z.record(z.string(), z.string()).optional()
+    })
+});
+
+const links = defineCollection({
+    loader: glob({ pattern: '**/*.{md,mdx}', base: 'content/links' }),
+    schema: z.object({
+        title: z.string(),
+        href: z.string(),
+        description: z.string(),
+        date: z.coerce.date(),
+        modified: z.coerce.date().optional(),
+        tags: z.array(z.string()).optional(),
+        posse: z.record(z.string(), z.string()).optional()
+    })
+});
+
+const reviews = defineCollection({
+    loader: glob({ pattern: '**/*.{md,mdx}', base: 'content/reviews' }),
+    schema: z.object({
+        title: z.string(),
+        description: z.string(),
+        date: z.coerce.date(),
+        modified: z.coerce.date().optional(),
+        tags: z.array(z.string()).optional(),
+        posse: z.record(z.string(), z.string()).optional()
+    })
+});
+
+export const collections = { socials, articles, links, reviews };
\ No newline at end of file
diff --git a/src/layouts/article.astro b/src/layouts/article.astro
new file mode 100644 (file)
index 0000000..a889e8d
--- /dev/null
@@ -0,0 +1,25 @@
+---
+import Base from '@layouts/base.astro';
+import HeadArticle from '@components/head/article.astro';
+
+interface Props {
+       title: string
+       description: string
+    publishedTime: string
+       modifiedTime: string
+       tags?: string[]
+}
+
+const { title, description, publishedTime, modifiedTime, tags = [] } = Astro.props;
+---
+<Base title={title} description={description}>
+    <HeadArticle
+         slot="post-head"
+         publishedTime={publishedTime}
+         modifiedTime={modifiedTime}
+         tags={tags}
+    />
+    <article>
+        <slot />
+    </article>
+</Base>
\ No newline at end of file
diff --git a/src/layouts/base.astro b/src/layouts/base.astro
new file mode 100644 (file)
index 0000000..36aebe1
--- /dev/null
@@ -0,0 +1,40 @@
+---
+import '@styles/global.css';
+import '@fontsource-variable/public-sans';
+import '@fontsource-variable/source-code-pro';
+import HeadBase from '@components/head/base.astro';
+import HeadPage from '@components/head/page.astro';
+import Heading from '@components/heading.astro';
+import Footer from '@components/footer.astro';
+
+interface Props {
+       title: string
+       description: string
+}
+
+const { title, description } = Astro.props;
+---
+
+<!doctype html>
+<html lang="en">
+       <head>
+               <slot name="pre-head" />
+               <HeadBase title={title} description={description} />
+               <slot name="post-head">
+                       <HeadPage />
+               </slot>
+       </head>
+       <body class="antialiased md:subpixel-antialiased w-screen p-4">
+               <div id="container" class="max-w-3xl mx-auto prose dark:prose-invert prose-headings:mb-0">
+                       <Heading />
+                       <main>
+                               <slot />
+                       </main>
+                       <footer>
+                               <slot name="pre-footer" />
+                               <Footer />
+                               <slot name="post-footer" />
+                       </footer>
+               </div>
+       </body>
+</html>
diff --git a/src/pages/404.astro b/src/pages/404.astro
new file mode 100644 (file)
index 0000000..f90a542
--- /dev/null
@@ -0,0 +1,11 @@
+---
+import Base from '@layouts/base.astro';
+import Callout from '@components/ui/callout.astro';
+---
+
+<Base title="404" description="Not Found">
+    <Callout level="error">
+        404 Not Found
+    </Callout>
+    <p>Oops! The page you requested is not found.</p>
+</Base>
\ No newline at end of file
diff --git a/src/pages/articles.astro b/src/pages/articles.astro
new file mode 100644 (file)
index 0000000..0540317
--- /dev/null
@@ -0,0 +1,23 @@
+---
+import { getCollection } from 'astro:content';
+import { formatDate } from '@utils/format.ts';
+import Base from '@layouts/base.astro';
+
+const articles = await getCollection('articles');
+const sortedArticles = articles.sort((a, b) => b.data.date - a.data.date);
+---
+
+<Base title="Articles" description="Description">
+    <h2>Articles</h2>
+    <dl>
+        {sortedArticles.map((article) => {
+            const date = formatDate(article.data.date);
+            return (
+                <dt><a href={`/articles/${date}-${article.id}/`}>{article.data.title}</a></dt>
+                <dd class="mt-0">
+                    {article.data.description}
+                </dd>
+            )
+        })}
+    </dl>
+</Base>
\ No newline at end of file
diff --git a/src/pages/articles/[date]-[id].astro b/src/pages/articles/[date]-[id].astro
new file mode 100644 (file)
index 0000000..925930a
--- /dev/null
@@ -0,0 +1,42 @@
+---
+import { type CollectionEntry, getCollection, render } from 'astro:content';
+import { formatDate } from '@utils/format.ts';
+import Article from '@layouts/article.astro';
+import POSSE from '@components/posse.astro';
+
+interface Props {
+    article: CollectionEntry<'articles'>
+}
+
+export async function getStaticPaths() {
+    const articles = await getCollection('articles');
+    return articles.map(article => ({
+        params: { date: formatDate(article.data.date), id: article.id },
+        props: { article },
+    }));
+}
+
+const { article } = Astro.props;
+const date = formatDate(article.data.date);
+const { Content } = await render(article);
+---
+<Article
+     title={article.data.title}
+     description={article.data.description}
+     publishedTime={article.data.date.toISOString()}
+     modifiedTime={article.data.modified ? article.data.modified.toISOString() : article.data.date.toISOString()}
+     tags={article.data.tags}
+>
+    <h2>{article.data.title}</h2>
+    <details class="mb-4">
+        <summary>Metadata</summary>
+        <ul class="mt-0">
+            <li class="mt-0 mb-0">Description: {article.data.description}</li>
+            <li class="mt-0 mb-0">Published: <time datetime="">{date}</time></li>
+            <li class="mt-0 mb-0">Last Modified: <time datetime="">{article.data.modified ? formatDate(article.data.modified) : date}</time></li>
+            <li class="mt-0 mb-0">Tags: {article.data.tags.join(', ')}</li>
+            {article.data.posse && <li class="mt-0 mb-0">POSSE: <POSSE posse={article.data.posse} /></li>}
+        </ul>
+    </details>
+    <Content />
+</Article>
\ No newline at end of file
diff --git a/src/pages/bitcoin.astro b/src/pages/bitcoin.astro
new file mode 100644 (file)
index 0000000..4312d67
--- /dev/null
@@ -0,0 +1,8 @@
+---
+import Base from '@layouts/base.astro';
+---
+
+<Base title="Bitcoin" description="Description">
+    <h2>Bitcoin</h2>
+    <object class="w-full" data="/public/bitcoin.pdf" type="application/pdf" height="890" />
+</Base>
\ No newline at end of file
diff --git a/src/pages/index.astro b/src/pages/index.astro
new file mode 100644 (file)
index 0000000..6fcb360
--- /dev/null
@@ -0,0 +1,25 @@
+---
+import Base from '@layouts/base.astro';
+import Callout from '@components/ui/callout.astro';
+import Contributions from '@data/contributions.json';
+---
+
+<Base title="Home" description="Description">
+       <section>
+               <p>I am <strong>Head of Data and Analytics</strong> at Build Asset Management, where I've helped launch a <a href="https://buildbitcoin.com/">private credit fund</a> investing into over-collateralized bitcoin-backed loans, a <a href="https://bfix.fund/">fixed income ETF</a> and related vehicles, and built the internal tech stack that glues everything together.</p>
+               <Callout level="info">
+                       Some topics currently holding my interest: data, analytics, economics, <a href="/bitcoin/">Bitcoin</a>, cryptography, privacy, security, urbanism, skiing &hellip;
+               </Callout>
+               <p>Articles will tend towards serious. Other activities are likely more frivolous.</p>
+       </section>
+    <section>
+               <h2>Contributions</h2>
+               <ul>
+                       {Contributions.map((contribution) => {
+                               return (
+                                       <li><a href={contribution.url}>{contribution.title}</a></li>
+                               )
+                       })}
+               </ul>
+       </section>
+</Base>
\ No newline at end of file
diff --git a/src/pages/links.astro b/src/pages/links.astro
new file mode 100644 (file)
index 0000000..086d314
--- /dev/null
@@ -0,0 +1,23 @@
+---
+import { getCollection } from 'astro:content';
+import { formatDate } from '@utils/format.ts';
+import Base from '@layouts/base.astro';
+
+const links = await getCollection('links');
+const sortedLinks = links.sort((a, b) => b.data.date - a.data.date);
+---
+
+<Base title="Links" description="Description">
+    <h2>Links</h2>
+    <dl>
+        {sortedLinks.map((link) => {
+            const date = formatDate(link.data.date);
+            return (
+                <dt><a href={`/links/${date}-${link.id}/`}>{link.data.title}</a></dt>
+                <dd class="mt-0">
+                    {link.data.description}
+                </dd>
+            )
+        })}
+    </dl>
+</Base>
\ No newline at end of file
diff --git a/src/pages/links/[date]-[id].astro b/src/pages/links/[date]-[id].astro
new file mode 100644 (file)
index 0000000..05ed379
--- /dev/null
@@ -0,0 +1,42 @@
+---
+import { type CollectionEntry, getCollection, render } from 'astro:content';
+import { formatDate } from '@utils/format.ts';
+import Article from '@layouts/article.astro';
+import POSSE from '@components/posse.astro';
+
+interface Props {
+    link: CollectionEntry<'links'>
+}
+
+export async function getStaticPaths() {
+    const links = await getCollection('links');
+    return links.map(link => ({
+        params: { date: formatDate(link.data.date), id: link.id },
+        props: { link },
+    }));
+}
+
+const { link } = Astro.props;
+const date = formatDate(link.data.date);
+const { Content } = await render(link);
+---
+<Article
+     title={link.data.title}
+     description={link.data.description}
+     publishedTime={link.data.date.toISOString()}
+     modifiedTime={link.data.modified ? link.data.modified.toISOString() : link.data.date.toISOString()}
+     tags={link.data.tags}
+>
+    <a href={link.data.href}><h2>{link.data.title}</h2></a>
+    <details class="mb-4">
+        <summary>Metadata</summary>
+        <ul class="mt-0">
+            <li class="mt-0 mb-0">Description: {link.data.description}</li>
+            <li class="mt-0 mb-0">Published: <time datetime="">{date}</time></li>
+            <li class="mt-0 mb-0">Last Modified: <time datetime="">{link.data.modified ? formatDate(link.data.modified) : date}</time></li>
+            <li class="mt-0 mb-0">Tags: {link.data.tags.join(', ')}</li>
+            {link.data.posse && <li class="mt-0 mb-0">POSSE: <POSSE posse={link.data.posse} /></li>}
+        </ul>
+    </details>
+    <Content />
+</Article>
\ No newline at end of file
diff --git a/src/pages/reviews.astro b/src/pages/reviews.astro
new file mode 100644 (file)
index 0000000..3209535
--- /dev/null
@@ -0,0 +1,23 @@
+---
+import { getCollection } from 'astro:content';
+import { formatDate } from '@utils/format.ts';
+import Base from '@layouts/base.astro';
+
+const reviews = await getCollection('reviews');
+const sortedReviews = reviews.sort((a, b) => b.data.date - a.data.date);
+---
+
+<Base title="Reviews" description="Description">
+    <h2>Reviews</h2>
+    <dl>
+        {sortedReviews.map((review) => {
+            const date = formatDate(review.data.date);
+            return (
+                <dt><a href={`/reviews/${date}-${review.id}/`}>{review.data.title}</a></dt>
+                <dd class="mt-0">
+                    {review.data.description}
+                </dd>
+            )
+        })}
+    </dl>
+</Base>
\ No newline at end of file
diff --git a/src/pages/reviews/[date]-[id].astro b/src/pages/reviews/[date]-[id].astro
new file mode 100644 (file)
index 0000000..6a36561
--- /dev/null
@@ -0,0 +1,42 @@
+---
+import { type CollectionEntry, getCollection, render } from 'astro:content';
+import { formatDate } from '@utils/format.ts';
+import Article from '@layouts/article.astro';
+import POSSE from '@components/posse.astro';
+
+interface Props {
+    review: CollectionEntry<'reviews'>
+}
+
+export async function getStaticPaths() {
+    const reviews = await getCollection('reviews');
+    return reviews.map(review => ({
+        params: { date: formatDate(review.data.date), id: review.id },
+        props: { review },
+    }));
+}
+
+const { review } = Astro.props;
+const date = formatDate(review.data.date);
+const { Content } = await render(review);
+---
+<Article
+     title={review.data.title}
+     description={review.data.description}
+     publishedTime={review.data.date.toISOString()}
+     modifiedTime={review.data.modified ? review.data.modified.toISOString() : review.data.date.toISOString()}
+     tags={review.data.tags}
+>
+    <h2>{review.data.title}</h2>
+    <details class="mb-4">
+        <summary>Metadata</summary>
+        <ul class="mt-0">
+            <li class="mt-0 mb-0">Description: {review.data.description}</li>
+            <li class="mt-0 mb-0">Published: <time datetime="">{date}</time></li>
+            <li class="mt-0 mb-0">Last Modified: <time datetime="">{review.data.modified ? formatDate(review.data.modified) : date}</time></li>
+            <li class="mt-0 mb-0">Tags: {review.data.tags.join(', ')}</li>
+            {review.data.posse && <li class="mt-0 mb-0">POSSE: <POSSE posse={review.data.posse} /></li>}
+        </ul>
+    </details>
+    <Content />
+</Article>
\ No newline at end of file
diff --git a/src/styles/global.css b/src/styles/global.css
new file mode 100644 (file)
index 0000000..f65dc5e
--- /dev/null
@@ -0,0 +1,24 @@
+@import "tailwindcss";
+@plugin "@tailwindcss/typography";
+
+@theme {
+    --font-sans: 'Public Sans Variable', sans-serif;
+    --font-mono: 'Source Code Pro Variable', monospace;
+}
+
+@utility prose {
+    blockquote {
+        p {
+            &:first-of-type::before,
+            &:last-of-type::after {
+                content: none;
+            }
+        }
+    }
+    code {
+        &::before,
+        &::after {
+            content: none;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/utils/format.ts b/src/utils/format.ts
new file mode 100644 (file)
index 0000000..5beb20c
--- /dev/null
@@ -0,0 +1,6 @@
+export function formatDate(date: Date): string {
+  const year = date.getFullYear();
+  const month = String(date.getMonth() + 1).padStart(2, '0');
+  const day = String(date.getDate()).padStart(2, '0');
+  return `${year}-${month}-${day}`;
+}
\ No newline at end of file
diff --git a/static/fonts/PublicSans-Bold.woff2 b/static/fonts/PublicSans-Bold.woff2
deleted file mode 100644 (file)
index a216e9a..0000000
Binary files a/static/fonts/PublicSans-Bold.woff2 and /dev/null differ
diff --git a/static/fonts/PublicSans-BoldItalic.woff2 b/static/fonts/PublicSans-BoldItalic.woff2
deleted file mode 100644 (file)
index 61b8752..0000000
Binary files a/static/fonts/PublicSans-BoldItalic.woff2 and /dev/null differ
diff --git a/static/fonts/PublicSans-Italic.woff2 b/static/fonts/PublicSans-Italic.woff2
deleted file mode 100644 (file)
index ae9ba71..0000000
Binary files a/static/fonts/PublicSans-Italic.woff2 and /dev/null differ
diff --git a/static/fonts/PublicSans-Regular.woff2 b/static/fonts/PublicSans-Regular.woff2
deleted file mode 100644 (file)
index 581f06c..0000000
Binary files a/static/fonts/PublicSans-Regular.woff2 and /dev/null differ
diff --git a/static/fonts/PublicSans-Thin.woff2 b/static/fonts/PublicSans-Thin.woff2
deleted file mode 100644 (file)
index cc6a264..0000000
Binary files a/static/fonts/PublicSans-Thin.woff2 and /dev/null differ
diff --git a/static/fonts/PublicSans-ThinItalic.woff2 b/static/fonts/PublicSans-ThinItalic.woff2
deleted file mode 100644 (file)
index 6a0caa2..0000000
Binary files a/static/fonts/PublicSans-ThinItalic.woff2 and /dev/null differ
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644 (file)
index 0000000..7db74d6
--- /dev/null
@@ -0,0 +1,28 @@
+{
+  "extends": "astro/tsconfigs/strict",
+  "include": [".astro/types.d.ts", "**/*"],
+  "exclude": ["dist"],
+  "compilerOptions": {
+    "baseUrl": ".",
+    "paths": {
+      "@assets/*": [
+        "src/assets/*"
+      ],
+      "@components/*": [
+        "src/components/*"
+      ],
+      "@data/*": [
+        "data/*"
+      ],
+      "@layouts/*": [
+        "src/layouts/*"
+      ],
+      "@styles/*": [
+        "src/styles/*"
+      ],
+      "@utils/*": [
+        "src/utils/*"
+      ]
+    },
+  }
+}