prime8dev

prime8dev
git clone https://git.prime8.dev/prime8dev.git
Log | Files | Refs | README | LICENSE

commit 2d48ef2139f1b832b21d454650e6d3cf0d2237b4
parent 1f03e0d4e80812461c08dc05d56a54c9350195c6
Author: Damian Myrda <damian@prime8.dev>
Date:   Fri, 16 Jan 2026 22:53:29 -0600

rewrite website

Diffstat:
DDockerfile | 18------------------
Mweb/.gitignore | 33++++++++++++++++++++++++++++++---
Aweb/.husky/pre-commit | 1+
Aweb/.prettierignore | 3+++
Aweb/.prettierrc | 16++++++++++++++++
Aweb/Dockerfile | 22++++++++++++++++++++++
Aweb/astro.config.mjs | 16++++++++++++++++
Aweb/blogs/building-my-portfolio.md | 47+++++++++++++++++++++++++++++++++++++++++++++++
Aweb/bun.lock | 1187+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dweb/config.toml | 6------
Aweb/config/about.json | 18++++++++++++++++++
Aweb/config/contact.json | 5+++++
Aweb/config/experience.json | 35+++++++++++++++++++++++++++++++++++
Aweb/config/projects.json | 38++++++++++++++++++++++++++++++++++++++
Aweb/env.example | 1+
Aweb/eslint.config.js | 24++++++++++++++++++++++++
Aweb/package.json | 42++++++++++++++++++++++++++++++++++++++++++
Aweb/public/amplifier/logo.svg | 9+++++++++
Aweb/public/favicon.png | 0
Aweb/public/mandolin/company.jpeg | 0
Aweb/public/mandolin/company_silly.jpeg | 0
Aweb/public/mandolin/employee_polaroids.jpeg | 0
Aweb/public/mandolin/logo.svg | 11+++++++++++
Aweb/public/mandolin/moment_polaroids.jpeg | 0
Aweb/public/me.jpg | 0
Aweb/public/robots.txt | 4++++
Aweb/public/site.webmanifest | 21+++++++++++++++++++++
Aweb/src/components/Article.astro | 418+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/components/Footer.astro | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/components/Header.astro | 140+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/components/Lightbox.astro | 139+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/components/pages/About.astro | 385+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/components/pages/Blog.astro | 205+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/components/pages/Experience.astro | 623+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/components/pages/Projects.astro | 404+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/components/styles.css | 111+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/constants/calendar.ts | 24++++++++++++++++++++++++
Aweb/src/constants/tags.ts | 33+++++++++++++++++++++++++++++++++
Aweb/src/constants/website.ts | 1+
Aweb/src/layouts/Layout.astro | 557+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/lib/blogs.ts | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/lib/readme/fetch.ts | 132+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/lib/readme/render.ts | 149+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/lib/schemas/blog.ts | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/lib/schemas/experience.ts | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/lib/schemas/person.ts | 24++++++++++++++++++++++++
Aweb/src/lib/schemas/project.ts | 45+++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/lib/schemas/website.ts | 13+++++++++++++
Aweb/src/lib/types/about.ts | 11+++++++++++
Aweb/src/lib/types/blog.ts | 11+++++++++++
Aweb/src/lib/types/contact.ts | 5+++++
Aweb/src/lib/types/experience.ts | 13+++++++++++++
Aweb/src/lib/types/project.ts | 9+++++++++
Aweb/src/lib/utils/duration.ts | 11+++++++++++
Aweb/src/lib/utils/job.ts | 8++++++++
Aweb/src/lib/utils/period.ts | 37+++++++++++++++++++++++++++++++++++++
Aweb/src/lib/utils/tags.ts | 12++++++++++++
Aweb/src/lib/wakatime.ts | 159+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/pages/404.astro | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/pages/blog/[slug].astro | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/pages/experience/[id].astro | 309+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/pages/index.astro | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/pages/projects/[id].astro | 275+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/pages/sitemap.xml.ts | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/scripts/ui/blog.ts | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/scripts/ui/boot.ts | 177+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/scripts/ui/clicks.ts | 39+++++++++++++++++++++++++++++++++++++++
Aweb/src/scripts/ui/detail.ts | 27+++++++++++++++++++++++++++
Aweb/src/scripts/ui/index.ts | 28++++++++++++++++++++++++++++
Aweb/src/scripts/ui/keyboard.ts | 82+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/scripts/ui/navigation.ts | 86+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/scripts/ui/state.ts | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/scripts/ui/status.ts | 17+++++++++++++++++
Aweb/src/scripts/ui/tabs.ts | 48++++++++++++++++++++++++++++++++++++++++++++++++
Aweb/src/scripts/ui/url.ts | 94+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dweb/start.sh | 3---
Dweb/static/css/bootstrap-responsive.css | 937-------------------------------------------------------------------------------
Dweb/static/css/bootstrap.css | 6204-------------------------------------------------------------------------------
Dweb/static/css/fonts/Fixedsys500c.eot | 0
Dweb/static/css/fonts/Fixedsys500c.otf | 0
Dweb/static/css/fonts/Fixedsys500c.svg | 646-------------------------------------------------------------------------------
Dweb/static/css/fonts/Fixedsys500c.ttf | 0
Dweb/static/css/fonts/Fixedsys500c.woff | 0
Dweb/static/css/fonts/Px437_IBM_EGA8.otf | 0
Dweb/static/img/moncheeta.png | 0
Dweb/static/js/bootstrap.js | 2425-------------------------------------------------------------------------------
Dweb/static/js/wakatime.js | 56--------------------------------------------------------
Dweb/templates/404.html | 9---------
Dweb/templates/429.html | 9---------
Dweb/templates/500.html | 9---------
Dweb/templates/base.html | 52----------------------------------------------------
Dweb/templates/error.html | 29-----------------------------
Dweb/templates/index.html | 107-------------------------------------------------------------------------------
Dweb/templates/nav.html | 19-------------------
Dweb/templates/projects.html | 83-------------------------------------------------------------------------------
Aweb/tsconfig.json | 6++++++
96 files changed, 7021 insertions(+), 10615 deletions(-)

diff --git a/Dockerfile b/Dockerfile @@ -1,18 +0,0 @@ -FROM ghcr.io/getzola/zola:v0.19.2 AS web -COPY ./web/ /src/ -WORKDIR /src/ -RUN ["zola", "build"] - -FROM caddy:builder AS caddy -RUN xcaddy build \ - --with github.com/caddyserver/cache-handler \ - --with github.com/mholt/caddy-ratelimit - -FROM caddy:latest -COPY --from=caddy /usr/bin/caddy /usr/bin/caddy -COPY ./caddy /etc/caddy/Caddyfile -COPY --from=web /src/public/ /web/ -EXPOSE 80 443 443/udp - -HEALTHCHECK --interval=60s --timeout=5s --start-period=5s \ - CMD curl -f http://localhost/ || exit 1 diff --git a/web/.gitignore b/web/.gitignore @@ -1,3 +1,30 @@ -/data/ -/config/ -/public/ +# dependencies +node_modules/ + +# build output +dist/ + +# Astro +.astro/ + +# environment variables +.env +.env.local +.env.*.local + +# macOS +.DS_Store +Thumbs.db + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/web/.husky/pre-commit b/web/.husky/pre-commit @@ -0,0 +1 @@ +bunx lint-staged diff --git a/web/.prettierignore b/web/.prettierignore @@ -0,0 +1,3 @@ +dist +node_modules +bun.lock diff --git a/web/.prettierrc b/web/.prettierrc @@ -0,0 +1,16 @@ +{ + "semi": true, + "singleQuote": false, + "tabWidth": 2, + "trailingComma": "all", + "printWidth": 80, + "plugins": ["prettier-plugin-astro"], + "overrides": [ + { + "files": "*.astro", + "options": { + "parser": "astro" + } + } + ] +} diff --git a/web/Dockerfile b/web/Dockerfile @@ -0,0 +1,22 @@ +FROM oven/bun:1 AS base +WORKDIR /app + +FROM base AS deps +COPY package.json bun.lock ./ +RUN bun install --frozen-lockfile + +FROM base AS build +COPY --from=deps /app/node_modules ./node_modules +COPY . . +RUN bun run build + +FROM oven/bun:1-slim AS runtime +WORKDIR /app +COPY --from=build /app/dist ./dist +COPY --from=build /app/node_modules ./node_modules + +ENV HOST=0.0.0.0 +ENV PORT=4321 +EXPOSE 4321 + +CMD ["bun", "./dist/server/entry.mjs"] diff --git a/web/astro.config.mjs b/web/astro.config.mjs @@ -0,0 +1,16 @@ +import { defineConfig } from "astro/config"; +import bun from "astro-bun-adapter"; + +export default defineConfig({ + output: "server", + site: "https://prime8.dev", + adapter: bun(), + server: { + host: true, + }, + image: { + service: { + entrypoint: "astro/assets/services/noop", + }, + }, +}); diff --git a/web/blogs/building-my-portfolio.md b/web/blogs/building-my-portfolio.md @@ -0,0 +1,47 @@ +--- +id: building-my-portfolio +title: Building a TUI-Inspired Portfolio +description: How I built this terminal-style portfolio with Astro +date: 2026-01-16 +tags: + - Astro + - TypeScript + - TUI + - Web Development + - Portfolio +--- + +I've always been drawn to terminal interfaces. There's something satisfying about the simplicity and efficiency of a well-designed TUI. So when it came time to build my portfolio, I knew I wanted to capture that aesthetic—monospace fonts, keyboard navigation, and a dark color scheme that feels like home. + +## The Stack + +This site is built with **Astro** for server-side rendering. At build/request time, READMEs are fetched directly from my GitLab and GitHub repositories—no CORS issues, no stale content. The markdown is parsed with **marked** and rendered with custom styling to match the terminal aesthetic. + +**WakaTime integration** pulls my coding stats in real-time, showing weekly activity breakdowns and total hours coded. It's a nice way to show I'm actually writing code, not just talking about it. + +## Design Decisions + +A few key choices drove the design: + +- **Keyboard-first navigation** – Number keys (`1-4`) switch tabs instantly. Arrow keys navigate lists and timelines. `Tab` cycles through sections. `Enter` opens blog posts, `Escape` closes them. It feels like using a real terminal application. +- **List-detail pattern** – Projects and experience use a sidebar list with detail views, similar to email clients or file managers. The experience page features a timeline visualization that's navigable with arrow keys. +- **Live data everywhere** – WakaTime stats update on every page load. Project READMEs are fetched fresh from git repositories. No static snapshots that go stale. +- **Lightbox for images** – Experience photos open in a full-screen lightbox with keyboard navigation (arrow keys to cycle, escape to close). + +## The Color Palette + +The palette is inspired by classic terminal emulators: + +- Background: `#0d0d0d` (near-black) +- Foreground: `#c0c0c0` (soft gray) +- Accent: `#d7af5f` (warm gold) +- Links: `#5fafff` (light blue) +- Cyan, magenta, red for semantic colors + +JetBrains Mono is the font throughout—it's readable and has great character distinction. + +## Conclusion + +Building this portfolio was a chance to combine two things I love: terminal aesthetics and modern web development. The result is something that feels personal—a site that reflects how I actually work, not just what I've worked on. + +If you're thinking about building your own portfolio, my advice is simple: make it yours. Pick a style that resonates with you, add the features you'd actually want to use, and don't be afraid to over-engineer the parts you find interesting. That's where the best learning happens. diff --git a/web/bun.lock b/web/bun.lock @@ -0,0 +1,1187 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "prime8dev", + "dependencies": { + "astro": "^5.16.11", + "astro-bun-adapter": "^1.0.2", + "gray-matter": "^4.0.3", + "jimp": "^1.6.0", + "marked": "^17.0.1", + }, + "devDependencies": { + "@eslint/js": "^9.39.2", + "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-astro": "^1.5.0", + "globals": "^17.0.0", + "husky": "^9.1.7", + "lint-staged": "^16.2.7", + "prettier": "^3.8.0", + "prettier-plugin-astro": "^0.14.1", + "typescript-eslint": "^8.53.0", + }, + }, + }, + "packages": { + "@astrojs/compiler": ["@astrojs/compiler@2.13.0", "", {}, "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw=="], + + "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.7.5", "", {}, "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA=="], + + "@astrojs/markdown-remark": ["@astrojs/markdown-remark@6.3.10", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.5", "@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.2.0", "js-yaml": "^4.1.1", "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.19.0", "smol-toml": "^1.5.2", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A=="], + + "@astrojs/prism": ["@astrojs/prism@3.3.0", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ=="], + + "@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=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + + "@babel/parser": ["@babel/parser@7.28.6", "", { "dependencies": { "@babel/types": "^7.28.6" }, "bin": "./bin/babel-parser.js" }, "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="], + + "@babel/types": ["@babel/types@7.28.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="], + + "@capsizecss/unpack": ["@capsizecss/unpack@4.0.0", "", { "dependencies": { "fontkitten": "^1.0.0" } }, "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], + + "@eslint/config-array": ["@eslint/config-array@0.21.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.3", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ=="], + + "@eslint/js": ["@eslint/js@9.39.2", "", {}, "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + + "@img/colour": ["@img/colour@1.0.0", "", {}, "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw=="], + + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], + + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], + + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], + + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], + + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], + + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], + + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="], + + "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="], + + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], + + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], + + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], + + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], + + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], + + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + + "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="], + + "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="], + + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], + + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], + + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], + + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], + + "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="], + + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], + + "@jimp/core": ["@jimp/core@1.6.0", "", { "dependencies": { "@jimp/file-ops": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "await-to-js": "^3.0.0", "exif-parser": "^0.1.12", "file-type": "^16.0.0", "mime": "3" } }, "sha512-EQQlKU3s9QfdJqiSrZWNTxBs3rKXgO2W+GxNXDtwchF3a4IqxDheFX1ti+Env9hdJXDiYLp2jTRjlxhPthsk8w=="], + + "@jimp/diff": ["@jimp/diff@1.6.0", "", { "dependencies": { "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "pixelmatch": "^5.3.0" } }, "sha512-+yUAQ5gvRC5D1WHYxjBHZI7JBRusGGSLf8AmPRPCenTzh4PA+wZ1xv2+cYqQwTfQHU5tXYOhA0xDytfHUf1Zyw=="], + + "@jimp/file-ops": ["@jimp/file-ops@1.6.0", "", {}, "sha512-Dx/bVDmgnRe1AlniRpCKrGRm5YvGmUwbDzt+MAkgmLGf+jvBT75hmMEZ003n9HQI/aPnm/YKnXjg/hOpzNCpHQ=="], + + "@jimp/js-bmp": ["@jimp/js-bmp@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "bmp-ts": "^1.0.9" } }, "sha512-FU6Q5PC/e3yzLyBDXupR3SnL3htU7S3KEs4e6rjDP6gNEOXRFsWs6YD3hXuXd50jd8ummy+q2WSwuGkr8wi+Gw=="], + + "@jimp/js-gif": ["@jimp/js-gif@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "gifwrap": "^0.10.1", "omggif": "^1.0.10" } }, "sha512-N9CZPHOrJTsAUoWkWZstLPpwT5AwJ0wge+47+ix3++SdSL/H2QzyMqxbcDYNFe4MoI5MIhATfb0/dl/wmX221g=="], + + "@jimp/js-jpeg": ["@jimp/js-jpeg@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "jpeg-js": "^0.4.4" } }, "sha512-6vgFDqeusblf5Pok6B2DUiMXplH8RhIKAryj1yn+007SIAQ0khM1Uptxmpku/0MfbClx2r7pnJv9gWpAEJdMVA=="], + + "@jimp/js-png": ["@jimp/js-png@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "pngjs": "^7.0.0" } }, "sha512-AbQHScy3hDDgMRNfG0tPjL88AV6qKAILGReIa3ATpW5QFjBKpisvUaOqhzJ7Reic1oawx3Riyv152gaPfqsBVg=="], + + "@jimp/js-tiff": ["@jimp/js-tiff@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "utif2": "^4.1.0" } }, "sha512-zhReR8/7KO+adijj3h0ZQUOiun3mXUv79zYEAKvE0O+rP7EhgtKvWJOZfRzdZSNv0Pu1rKtgM72qgtwe2tFvyw=="], + + "@jimp/plugin-blit": ["@jimp/plugin-blit@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-M+uRWl1csi7qilnSK8uxK4RJMSuVeBiO1AY0+7APnfUbQNZm6hCe0CCFv1Iyw1D/Dhb8ph8fQgm5mwM0eSxgVA=="], + + "@jimp/plugin-blur": ["@jimp/plugin-blur@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/utils": "1.6.0" } }, "sha512-zrM7iic1OTwUCb0g/rN5y+UnmdEsT3IfuCXCJJNs8SZzP0MkZ1eTvuwK9ZidCuMo4+J3xkzCidRwYXB5CyGZTw=="], + + "@jimp/plugin-circle": ["@jimp/plugin-circle@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-xt1Gp+LtdMKAXfDp3HNaG30SPZW6AQ7dtAtTnoRKorRi+5yCJjKqXRgkewS5bvj8DEh87Ko1ydJfzqS3P2tdWw=="], + + "@jimp/plugin-color": ["@jimp/plugin-color@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "tinycolor2": "^1.6.0", "zod": "^3.23.8" } }, "sha512-J5q8IVCpkBsxIXM+45XOXTrsyfblyMZg3a9eAo0P7VPH4+CrvyNQwaYatbAIamSIN1YzxmO3DkIZXzRjFSz1SA=="], + + "@jimp/plugin-contain": ["@jimp/plugin-contain@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/plugin-blit": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-oN/n+Vdq/Qg9bB4yOBOxtY9IPAtEfES8J1n9Ddx+XhGBYT1/QTU/JYkGaAkIGoPnyYvmLEDqMz2SGihqlpqfzQ=="], + + "@jimp/plugin-cover": ["@jimp/plugin-cover@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/plugin-crop": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-Iow0h6yqSC269YUJ8HC3Q/MpCi2V55sMlbkkTTx4zPvd8mWZlC0ykrNDeAy9IJegrQ7v5E99rJwmQu25lygKLA=="], + + "@jimp/plugin-crop": ["@jimp/plugin-crop@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-KqZkEhvs+21USdySCUDI+GFa393eDIzbi1smBqkUPTE+pRwSWMAf01D5OC3ZWB+xZsNla93BDS9iCkLHA8wang=="], + + "@jimp/plugin-displace": ["@jimp/plugin-displace@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-4Y10X9qwr5F+Bo5ME356XSACEF55485j5nGdiyJ9hYzjQP9nGgxNJaZ4SAOqpd+k5sFaIeD7SQ0Occ26uIng5Q=="], + + "@jimp/plugin-dither": ["@jimp/plugin-dither@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0" } }, "sha512-600d1RxY0pKwgyU0tgMahLNKsqEcxGdbgXadCiVCoGd6V6glyCvkNrnnwC0n5aJ56Htkj88PToSdF88tNVZEEQ=="], + + "@jimp/plugin-fisheye": ["@jimp/plugin-fisheye@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-E5QHKWSCBFtpgZarlmN3Q6+rTQxjirFqo44ohoTjzYVrDI6B6beXNnPIThJgPr0Y9GwfzgyarKvQuQuqCnnfbA=="], + + "@jimp/plugin-flip": ["@jimp/plugin-flip@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-/+rJVDuBIVOgwoyVkBjUFHtP+wmW0r+r5OQ2GpatQofToPVbJw1DdYWXlwviSx7hvixTWLKVgRWQ5Dw862emDg=="], + + "@jimp/plugin-hash": ["@jimp/plugin-hash@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/js-bmp": "1.6.0", "@jimp/js-jpeg": "1.6.0", "@jimp/js-png": "1.6.0", "@jimp/js-tiff": "1.6.0", "@jimp/plugin-color": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "any-base": "^1.1.0" } }, "sha512-wWzl0kTpDJgYVbZdajTf+4NBSKvmI3bRI8q6EH9CVeIHps9VWVsUvEyb7rpbcwVLWYuzDtP2R0lTT6WeBNQH9Q=="], + + "@jimp/plugin-mask": ["@jimp/plugin-mask@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-Cwy7ExSJMZszvkad8NV8o/Z92X2kFUFM8mcDAhNVxU0Q6tA0op2UKRJY51eoK8r6eds/qak3FQkXakvNabdLnA=="], + + "@jimp/plugin-print": ["@jimp/plugin-print@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/js-jpeg": "1.6.0", "@jimp/js-png": "1.6.0", "@jimp/plugin-blit": "1.6.0", "@jimp/types": "1.6.0", "parse-bmfont-ascii": "^1.0.6", "parse-bmfont-binary": "^1.0.6", "parse-bmfont-xml": "^1.1.6", "simple-xml-to-json": "^1.2.2", "zod": "^3.23.8" } }, "sha512-zarTIJi8fjoGMSI/M3Xh5yY9T65p03XJmPsuNet19K/Q7mwRU6EV2pfj+28++2PV2NJ+htDF5uecAlnGyxFN2A=="], + + "@jimp/plugin-quantize": ["@jimp/plugin-quantize@1.6.0", "", { "dependencies": { "image-q": "^4.0.0", "zod": "^3.23.8" } }, "sha512-EmzZ/s9StYQwbpG6rUGBCisc3f64JIhSH+ncTJd+iFGtGo0YvSeMdAd+zqgiHpfZoOL54dNavZNjF4otK+mvlg=="], + + "@jimp/plugin-resize": ["@jimp/plugin-resize@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-uSUD1mqXN9i1SGSz5ov3keRZ7S9L32/mAQG08wUwZiEi5FpbV0K8A8l1zkazAIZi9IJzLlTauRNU41Mi8IF9fA=="], + + "@jimp/plugin-rotate": ["@jimp/plugin-rotate@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/plugin-crop": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-JagdjBLnUZGSG4xjCLkIpQOZZ3Mjbg8aGCCi4G69qR+OjNpOeGI7N2EQlfK/WE8BEHOW5vdjSyglNqcYbQBWRw=="], + + "@jimp/plugin-threshold": ["@jimp/plugin-threshold@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/plugin-color": "1.6.0", "@jimp/plugin-hash": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-M59m5dzLoHOVWdM41O8z9SyySzcDn43xHseOH0HavjsfQsT56GGCC4QzU1banJidbUrePhzoEdS42uFE8Fei8w=="], + + "@jimp/types": ["@jimp/types@1.6.0", "", { "dependencies": { "zod": "^3.23.8" } }, "sha512-7UfRsiKo5GZTAATxm2qQ7jqmUXP0DxTArztllTcYdyw6Xi5oT4RaoXynVtCD4UyLK5gJgkZJcwonoijrhYFKfg=="], + + "@jimp/utils": ["@jimp/utils@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "tinycolor2": "^1.6.0" } }, "sha512-gqFTGEosKbOkYF/WFj26jMHOI5OH2jeP1MmC/zbK6BF6VJBf8rIC5898dPfSzZEbSA0wbbV5slbntWVc5PKLFA=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="], + + "@pkgr/core": ["@pkgr/core@0.2.9", "", {}, "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA=="], + + "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "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-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.55.1", "", { "os": "android", "cpu": "arm" }, "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.55.1", "", { "os": "android", "cpu": "arm64" }, "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.55.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.55.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.55.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.55.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.55.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.55.1", "", { "os": "linux", "cpu": "arm" }, "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.55.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.55.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA=="], + + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g=="], + + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.55.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw=="], + + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.55.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.55.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.55.1", "", { "os": "linux", "cpu": "x64" }, "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.55.1", "", { "os": "linux", "cpu": "x64" }, "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w=="], + + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.55.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg=="], + + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.55.1", "", { "os": "none", "cpu": "arm64" }, "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.55.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.55.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.55.1", "", { "os": "win32", "cpu": "x64" }, "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.55.1", "", { "os": "win32", "cpu": "x64" }, "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw=="], + + "@shikijs/core": ["@shikijs/core@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-AXSQu/2n1UIQekY8euBJlvFYZIw0PHY63jUzGbrOma4wPxzznJXTXkri+QcHeBNaFxiiOljKxxJkVSoB3PjbyA=="], + + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-ATwv86xlbmfD9n9gKRiwuPpWgPENAWCLwYCGz9ugTJlsO2kOzhOkvoyV/UD+tJ0uT7YRyD530x6ugNSffmvIiQ=="], + + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ=="], + + "@shikijs/langs": ["@shikijs/langs@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0" } }, "sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA=="], + + "@shikijs/themes": ["@shikijs/themes@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0" } }, "sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw=="], + + "@shikijs/types": ["@shikijs/types@3.21.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA=="], + + "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], + + "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], + + "@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/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@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@16.9.1", "", {}, "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.53.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.53.0", "@typescript-eslint/type-utils": "8.53.0", "@typescript-eslint/utils": "8.53.0", "@typescript-eslint/visitor-keys": "8.53.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.53.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.53.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.53.0", "@typescript-eslint/types": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0", "@typescript-eslint/visitor-keys": "8.53.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-npiaib8XzbjtzS2N4HlqPvlpxpmZ14FjSJrteZpPxGUaYPlvhzlzUZ4mZyABo0EFrOWnvyd0Xxroq//hKhtAWg=="], + + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.53.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.53.0", "@typescript-eslint/types": "^8.53.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.53.0", "", { "dependencies": { "@typescript-eslint/types": "8.53.0", "@typescript-eslint/visitor-keys": "8.53.0" } }, "sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.53.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.53.0", "", { "dependencies": { "@typescript-eslint/types": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0", "@typescript-eslint/utils": "8.53.0", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.53.0", "", {}, "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.53.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.53.0", "@typescript-eslint/tsconfig-utils": "8.53.0", "@typescript-eslint/types": "8.53.0", "@typescript-eslint/visitor-keys": "8.53.0", "debug": "^4.4.3", "minimatch": "^9.0.5", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.53.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.53.0", "@typescript-eslint/types": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.53.0", "", { "dependencies": { "@typescript-eslint/types": "8.53.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + + "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=="], + + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="], + + "ansi-escapes": ["ansi-escapes@7.2.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw=="], + + "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], + + "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=="], + + "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], + + "array-iterate": ["array-iterate@2.0.1", "", {}, "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="], + + "astro": ["astro@5.16.11", "", { "dependencies": { "@astrojs/compiler": "^2.13.0", "@astrojs/internal-helpers": "0.7.5", "@astrojs/markdown-remark": "6.3.10", "@astrojs/telemetry": "3.3.0", "@capsizecss/unpack": "^4.0.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", "acorn": "^8.15.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.3.1", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^1.1.1", "cssesc": "^3.0.0", "debug": "^4.4.3", "deterministic-object-hash": "^2.0.2", "devalue": "^5.6.2", "diff": "^8.0.3", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.7.0", "esbuild": "^0.25.0", "estree-walker": "^3.0.3", "flattie": "^1.1.1", "fontace": "~0.4.0", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "magic-string": "^0.30.21", "magicast": "^0.5.1", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "p-limit": "^6.2.0", "p-queue": "^8.1.1", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", "picomatch": "^4.0.3", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.7.3", "shiki": "^3.20.0", "smol-toml": "^1.6.0", "svgo": "^4.0.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tsconfck": "^3.1.6", "ultrahtml": "^1.6.0", "unifont": "~0.7.1", "unist-util-visit": "^5.0.0", "unstorage": "^1.17.3", "vfile": "^6.0.3", "vite": "^6.4.1", "vitefu": "^1.1.1", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "yocto-spinner": "^0.2.3", "zod": "^3.25.76", "zod-to-json-schema": "^3.25.1", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.34.0" }, "bin": { "astro": "astro.js" } }, "sha512-Z7kvkTTT5n6Hn5lCm6T3WU6pkxx84Hn25dtQ6dR7ATrBGq9eVa8EuB/h1S8xvaoVyCMZnIESu99Z9RJfdLRLDA=="], + + "astro-bun-adapter": ["astro-bun-adapter@1.0.2", "", { "peerDependencies": { "astro": "^4.0.7" } }, "sha512-ugiguVhpLq/O0HTA/DIokAGX9u/aOr+JiwR0++xURN6aAY9zjXU0dfj9A3V4KGXgNXMEEFiZ5gobMhcURAM3Fw=="], + + "astro-eslint-parser": ["astro-eslint-parser@1.2.2", "", { "dependencies": { "@astrojs/compiler": "^2.0.0", "@typescript-eslint/scope-manager": "^7.0.0 || ^8.0.0", "@typescript-eslint/types": "^7.0.0 || ^8.0.0", "astrojs-compiler-sync": "^1.0.0", "debug": "^4.3.4", "entities": "^6.0.0", "eslint-scope": "^8.0.1", "eslint-visitor-keys": "^4.0.0", "espree": "^10.0.0", "fast-glob": "^3.3.3", "is-glob": "^4.0.3", "semver": "^7.3.8" } }, "sha512-JepyLROIad6f44uyqMF6HKE2QbunNzp3mYKRcPoDGt0QkxXmH222FAFC64WTyQu2Kg8NNEXHTN/sWuUId9sSxw=="], + + "astrojs-compiler-sync": ["astrojs-compiler-sync@1.1.1", "", { "dependencies": { "synckit": "^0.11.0" }, "peerDependencies": { "@astrojs/compiler": ">=0.27.0" } }, "sha512-0mKvB9sDQRIZPsEJadw6OaFbGJ92cJPPR++ICca9XEyiUAZqgVuk25jNmzHPT0KF80rI94trSZrUR5iHFXGGOQ=="], + + "await-to-js": ["await-to-js@3.0.0", "", {}, "sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g=="], + + "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], + + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "base-64": ["base-64@1.0.0", "", {}, "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "bmp-ts": ["bmp-ts@1.0.9", "", {}, "sha512-cTEHk2jLrPyi+12M3dhpEbnnPOsaZuq7C45ylbbQIiWgDFZq4UVYPEY5mlqjvsj/6gJv9qX5sa+ebDzLXT28Vw=="], + + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "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=="], + + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "camelcase": ["camelcase@8.0.0", "", {}, "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA=="], + + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], + + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], + + "ci-info": ["ci-info@4.3.1", "", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="], + + "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="], + + "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], + + "cli-truncate": ["cli-truncate@5.1.1", "", { "dependencies": { "slice-ansi": "^7.1.0", "string-width": "^8.0.0" } }, "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "commander": ["commander@14.0.2", "", {}, "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ=="], + + "common-ancestor-path": ["common-ancestor-path@1.0.1", "", {}, "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], + + "cookie-es": ["cookie-es@1.2.2", "", {}, "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="], + + "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], + + "css-tree": ["css-tree@3.1.0", "", { "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" } }, "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w=="], + + "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], + + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "deterministic-object-hash": ["deterministic-object-hash@2.0.2", "", { "dependencies": { "base-64": "^1.0.0" } }, "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ=="], + + "devalue": ["devalue@5.6.2", "", {}, "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg=="], + + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "diff": ["diff@8.0.3", "", {}, "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ=="], + + "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], + + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + + "dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="], + + "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + + "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + + "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], + + "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + + "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.39.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw=="], + + "eslint-compat-utils": ["eslint-compat-utils@0.6.5", "", { "dependencies": { "semver": "^7.5.4" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ=="], + + "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="], + + "eslint-plugin-astro": ["eslint-plugin-astro@1.5.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@jridgewell/sourcemap-codec": "^1.4.14", "@typescript-eslint/types": "^7.7.1 || ^8", "astro-eslint-parser": "^1.0.2", "eslint-compat-utils": "^0.6.0", "globals": "^16.0.0", "postcss": "^8.4.14", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "eslint": ">=8.57.0" } }, "sha512-IWy4kY3DKTJxd7g652zIWpBGFuxw7NIIt16kyqc8BlhnIKvI8yGJj+Maua0DiNYED3F/D8AmzoTTTA6A95WX9g=="], + + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + + "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + + "exif-parser": ["exif-parser@0.1.12", "", {}, "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], + + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "file-type": ["file-type@16.5.4", "", { "dependencies": { "readable-web-to-node-stream": "^3.0.0", "strtok3": "^6.2.4", "token-types": "^4.1.1" } }, "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "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=="], + + "fontace": ["fontace@0.4.0", "", { "dependencies": { "fontkitten": "^1.0.0" } }, "sha512-moThBCItUe2bjZip5PF/iZClpKHGLwMvR79Kp8XpGRBrvoRSnySN4VcILdv3/MJzbhvUA5WeiUXF5o538m5fvg=="], + + "fontkitten": ["fontkitten@1.0.1", "", { "dependencies": { "tiny-inflate": "^1.0.3" } }, "sha512-m+/cO+/kAU9farlejecXLgQH20+UXyH0K6oosGtogAz7BWco+KTYE60epKwMt8eVxqlOE2Fs+GoHVlGDUbKOoA=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], + + "gifwrap": ["gifwrap@0.10.1", "", { "dependencies": { "image-q": "^4.0.0", "omggif": "^1.0.10" } }, "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw=="], + + "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "globals": ["globals@17.0.0", "", {}, "sha512-gv5BeD2EssA793rlFWVPMMCqefTlpusw6/2TbAVMy0FzcG8wKJn4O+NqJ4+XWmmwrayJgw5TzrmWjFgmz1XPqw=="], + + "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=="], + + "h3": ["h3@1.15.5", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.5", "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "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=="], + + "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=="], + + "hast-util-is-element": ["hast-util-is-element@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="], + + "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], + + "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=="], + + "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-parse5": ["hast-util-to-parse5@8.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="], + + "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=="], + + "husky": ["husky@9.1.7", "", { "bin": { "husky": "bin.js" } }, "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "image-q": ["image-q@4.0.0", "", { "dependencies": { "@types/node": "16.9.1" } }, "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], + + "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + + "is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "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=="], + + "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "jimp": ["jimp@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/diff": "1.6.0", "@jimp/js-bmp": "1.6.0", "@jimp/js-gif": "1.6.0", "@jimp/js-jpeg": "1.6.0", "@jimp/js-png": "1.6.0", "@jimp/js-tiff": "1.6.0", "@jimp/plugin-blit": "1.6.0", "@jimp/plugin-blur": "1.6.0", "@jimp/plugin-circle": "1.6.0", "@jimp/plugin-color": "1.6.0", "@jimp/plugin-contain": "1.6.0", "@jimp/plugin-cover": "1.6.0", "@jimp/plugin-crop": "1.6.0", "@jimp/plugin-displace": "1.6.0", "@jimp/plugin-dither": "1.6.0", "@jimp/plugin-fisheye": "1.6.0", "@jimp/plugin-flip": "1.6.0", "@jimp/plugin-hash": "1.6.0", "@jimp/plugin-mask": "1.6.0", "@jimp/plugin-print": "1.6.0", "@jimp/plugin-quantize": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/plugin-rotate": "1.6.0", "@jimp/plugin-threshold": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0" } }, "sha512-YcwCHw1kiqEeI5xRpDlPPBGL2EOpBKLwO4yIBJcXWHPj5PnA5urGq0jbyhM5KoNpypQ6VboSoxc9D8HyfvngSg=="], + + "jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], + + "jpeg-js": ["jpeg-js@0.4.4", "", {}, "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg=="], + + "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], + + "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "lint-staged": ["lint-staged@16.2.7", "", { "dependencies": { "commander": "^14.0.2", "listr2": "^9.0.5", "micromatch": "^4.0.8", "nano-spawn": "^2.0.0", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.8.1" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow=="], + + "listr2": ["listr2@9.0.5", "", { "dependencies": { "cli-truncate": "^5.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="], + + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], + + "lru-cache": ["lru-cache@11.2.4", "", {}, "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg=="], + + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "magicast": ["magicast@0.5.1", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "source-map-js": "^1.2.1" } }, "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw=="], + + "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], + + "marked": ["marked@17.0.1", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg=="], + + "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=="], + + "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=="], + + "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=="], + + "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=="], + + "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-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.1", "", { "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-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], + + "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=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "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-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-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-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=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], + + "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nano-spawn": ["nano-spawn@2.0.0", "", {}, "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "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-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], + + "node-mock-http": ["node-mock-http@1.0.4", "", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + + "ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="], + + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], + + "omggif": ["omggif@1.0.10", "", {}, "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="], + + "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], + + "oniguruma-parser": ["oniguruma-parser@0.12.1", "", {}, "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w=="], + + "oniguruma-to-es": ["oniguruma-to-es@4.3.4", "", { "dependencies": { "oniguruma-parser": "^0.12.1", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA=="], + + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "p-limit": ["p-limit@6.2.0", "", { "dependencies": { "yocto-queue": "^1.1.1" } }, "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "p-queue": ["p-queue@8.1.1", "", { "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^6.1.2" } }, "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ=="], + + "p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="], + + "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], + + "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], + + "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], + + "parse-bmfont-xml": ["parse-bmfont-xml@1.1.6", "", { "dependencies": { "xml-parse-from-string": "^1.0.0", "xml2js": "^0.5.0" } }, "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA=="], + + "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=="], + + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "peek-readable": ["peek-readable@4.1.0", "", {}, "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg=="], + + "piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "pidtree": ["pidtree@0.6.0", "", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="], + + "pixelmatch": ["pixelmatch@5.3.0", "", { "dependencies": { "pngjs": "^6.0.0" }, "bin": { "pixelmatch": "bin/pixelmatch" } }, "sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q=="], + + "pngjs": ["pngjs@7.0.0", "", {}, "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow=="], + + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.8.0", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA=="], + + "prettier-plugin-astro": ["prettier-plugin-astro@0.14.1", "", { "dependencies": { "@astrojs/compiler": "^2.9.1", "prettier": "^3.0.0", "sass-formatter": "^0.7.6" } }, "sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw=="], + + "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], + + "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], + + "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], + + "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], + + "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], + + "readable-web-to-node-stream": ["readable-web-to-node-stream@3.0.4", "", { "dependencies": { "readable-stream": "^4.7.0" } }, "sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw=="], + + "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + + "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="], + + "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-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=="], + + "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=="], + + "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=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], + + "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=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], + + "rollup": ["rollup@4.55.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.55.1", "@rollup/rollup-android-arm64": "4.55.1", "@rollup/rollup-darwin-arm64": "4.55.1", "@rollup/rollup-darwin-x64": "4.55.1", "@rollup/rollup-freebsd-arm64": "4.55.1", "@rollup/rollup-freebsd-x64": "4.55.1", "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", "@rollup/rollup-linux-arm-musleabihf": "4.55.1", "@rollup/rollup-linux-arm64-gnu": "4.55.1", "@rollup/rollup-linux-arm64-musl": "4.55.1", "@rollup/rollup-linux-loong64-gnu": "4.55.1", "@rollup/rollup-linux-loong64-musl": "4.55.1", "@rollup/rollup-linux-ppc64-gnu": "4.55.1", "@rollup/rollup-linux-ppc64-musl": "4.55.1", "@rollup/rollup-linux-riscv64-gnu": "4.55.1", "@rollup/rollup-linux-riscv64-musl": "4.55.1", "@rollup/rollup-linux-s390x-gnu": "4.55.1", "@rollup/rollup-linux-x64-gnu": "4.55.1", "@rollup/rollup-linux-x64-musl": "4.55.1", "@rollup/rollup-openbsd-x64": "4.55.1", "@rollup/rollup-openharmony-arm64": "4.55.1", "@rollup/rollup-win32-arm64-msvc": "4.55.1", "@rollup/rollup-win32-ia32-msvc": "4.55.1", "@rollup/rollup-win32-x64-gnu": "4.55.1", "@rollup/rollup-win32-x64-msvc": "4.55.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "s.color": ["s.color@0.0.15", "", {}, "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "sass-formatter": ["sass-formatter@0.7.9", "", { "dependencies": { "suf-log": "^2.5.3" } }, "sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw=="], + + "sax": ["sax@1.4.4", "", {}, "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw=="], + + "section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="], + + "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + + "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shiki": ["shiki@3.21.0", "", { "dependencies": { "@shikijs/core": "3.21.0", "@shikijs/engine-javascript": "3.21.0", "@shikijs/engine-oniguruma": "3.21.0", "@shikijs/langs": "3.21.0", "@shikijs/themes": "3.21.0", "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "simple-xml-to-json": ["simple-xml-to-json@1.2.3", "", {}, "sha512-kWJDCr9EWtZ+/EYYM5MareWj2cRnZGF93YDNpH4jQiHB+hBIZnfPFSQiVMzZOdk+zXWqTZ/9fTeQNu2DqeiudA=="], + + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + + "slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], + + "smol-toml": ["smol-toml@1.6.0", "", {}, "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw=="], + + "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=="], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="], + + "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=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "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.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "strtok3": ["strtok3@6.3.0", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "peek-readable": "^4.1.0" } }, "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw=="], + + "suf-log": ["suf-log@2.5.3", "", { "dependencies": { "s.color": "0.0.15" } }, "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "svgo": ["svgo@4.0.0", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^5.1.0", "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "^1.4.1" }, "bin": "./bin/svgo.js" }, "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw=="], + + "synckit": ["synckit@0.11.12", "", { "dependencies": { "@pkgr/core": "^0.2.9" } }, "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ=="], + + "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="], + + "tinycolor2": ["tinycolor2@1.6.0", "", {}, "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="], + + "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="], + + "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "token-types": ["token-types@4.2.1", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ=="], + + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + + "ts-api-utils": ["ts-api-utils@2.4.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA=="], + + "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=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "typescript-eslint": ["typescript-eslint@8.53.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.53.0", "@typescript-eslint/parser": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0", "@typescript-eslint/utils": "8.53.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-xHURCQNxZ1dsWn0sdOaOfCSQG0HKeqSj9OexIxrz6ypU6wHYOdX2I3D2b8s8wFSsSOYJb+6q283cLiLlkEsBYw=="], + + "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="], + + "ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="], + + "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], + + "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.7.3", "", { "dependencies": { "css-tree": "^3.1.0", "ofetch": "^1.5.1", "ohash": "^2.0.11" } }, "sha512-b0GtQzKCyuSHGsfj5vyN8st7muZ6VCI4XD4vFlr7Uy1rlWVYxC3npnfk8MyreHxJYrz1ooLDqDzFe9XqQTlAhA=="], + + "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.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], + + "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-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=="], + + "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=="], + + "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.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], + + "unstorage": ["unstorage@1.17.4", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.5", "lru-cache": "^11.2.0", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "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 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "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/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "utif2": ["utif2@4.1.0", "", { "dependencies": { "pako": "^1.0.11" } }, "sha512-+oknB9FHrJ7oW7A2WZYajOcv4FcDR4CfoGB0dPNfxbi4GO05RRnFmt5oa23+9w32EanrYcSJWspUiJkLMs+37w=="], + + "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.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], + + "vite": ["vite@6.4.1", "", { "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-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="], + + "vitefu": ["vitefu@1.1.1", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" }, "optionalPeers": ["vite"] }, "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ=="], + + "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "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=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], + + "xml-parse-from-string": ["xml-parse-from-string@1.0.1", "", {}, "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g=="], + + "xml2js": ["xml2js@0.5.0", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA=="], + + "xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], + + "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="], + + "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="], + + "yocto-spinner": ["yocto-spinner@0.2.3", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ=="], + + "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], + + "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + + "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="], + + "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=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "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=="], + + "boxen/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "cli-truncate/string-width": ["string-width@8.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" } }, "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg=="], + + "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], + + "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "eslint-plugin-astro/globals": ["globals@16.5.0", "", {}, "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "gray-matter/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], + + "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "pixelmatch/pngjs": ["pngjs@6.0.0", "", {}, "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg=="], + + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "svgo/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], + + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "ansi-align/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], + + "gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + } +} diff --git a/web/config.toml b/web/config.toml @@ -1,6 +0,0 @@ -base_url = "https://prime8.dev" - -[extra] -tabs = [ - { name = "home", url = "/" }, -] diff --git a/web/config/about.json b/web/config/about.json @@ -0,0 +1,18 @@ +{ + "name": "Damian Myrda", + "handle": "moncheeta", + "bio": "Passionate about low-level systems programming, TUI/CLI tooling, and UNIX philosophy", + "location": "Chicago, IL", + "profession": "Software Engineer", + "profession_short": "SWE", + "languages": ["Zig", "Rust", "C", "Go", "TypeScript", "Python"], + "interests": [ + "Low-level systems", + "TUI/CLI tooling", + "Embedded OS", + "UNIX philosophy" + ], + "tools": ["Zed (Vim mode)", "Neovim", "OpenCode", "Linux", "Fish", "Ghostty"], + "school": "Prospect High School (Senior)", + "graduating": "May 2026" +} diff --git a/web/config/contact.json b/web/config/contact.json @@ -0,0 +1,5 @@ +{ + "email": "damian@prime8.dev", + "gitlab": "https://git.prime8.dev/moncheeta", + "linkedin": "https://linkedin.com/in/damian-myrda" +} diff --git a/web/config/experience.json b/web/config/experience.json @@ -0,0 +1,35 @@ +[ + { + "id": "mandolin", + "company": "Mandolin", + "role": "Senior SWE Intern", + "startDate": "2024-10", + "description": [ + "Building AI agents for specialty drug access. Automating prior authorizations, benefits verification, and revenue cycle management.", + "Mandolin raised $40M to automate access to life-saving medicines, wiring AI labor into thousands of infusion centers, specialty pharmacies, and health systems." + ], + "tech": ["TypeScript", "Temporal"], + "url": "https://mandolin.com", + "logo": "/mandolin/logo.svg", + "images": [ + "/mandolin/company.jpeg", + "/mandolin/company_silly.jpeg", + "/mandolin/employee_polaroids.jpeg", + "/mandolin/moment_polaroids.jpeg" + ] + }, + { + "id": "amplifier-health", + "company": "Amplifier Health", + "role": "SWE Intern", + "startDate": "2024-06", + "endDate": "2024-08", + "description": [ + "Voice AI for early disease detection. Large Acoustic Model analyzing 1000+ voice biomarkers across 30+ health conditions." + ], + "tech": ["Python", "PyTorch"], + "url": "https://amplifierhealth.com", + "logo": "/amplifier/logo.svg", + "logoFilter": "logo-invert" + } +] diff --git a/web/config/projects.json b/web/config/projects.json @@ -0,0 +1,38 @@ +[ + { + "id": "janitor", + "name": "janitor", + "subtitle": "Audio classification with AST", + "tech": ["Rust", "CUDA"], + "url": "https://git.prime8.dev/moncheeta/janitor", + "dateCreated": "2025-09-15", + "dateModified": "2026-01-10" + }, + { + "id": "summarizer", + "name": "summarizer", + "subtitle": "Audio transcription microservices", + "tech": ["Python", "Docker", "Kafka"], + "url": "https://git.prime8.dev/moncheeta/summarizer", + "dateCreated": "2025-06-01", + "dateModified": "2025-12-20" + }, + { + "id": "finger", + "name": "finger", + "subtitle": "Mobile auth app", + "tech": ["TypeScript", "React Native", "Supabase"], + "url": "https://git.prime8.dev/moncheeta/finger", + "dateCreated": "2025-03-10", + "dateModified": "2025-08-15" + }, + { + "id": "computer-science-club", + "name": "computer-science-club", + "subtitle": "CS Club website", + "tech": ["Python"], + "url": "https://github.com/moncheeta/computer-science-club", + "dateCreated": "2024-09-01", + "dateModified": "2025-05-20" + } +] diff --git a/web/env.example b/web/env.example @@ -0,0 +1 @@ +WAKATIME_API_KEY=your_wakatime_api_key_here diff --git a/web/eslint.config.js b/web/eslint.config.js @@ -0,0 +1,24 @@ +import js from "@eslint/js"; +import globals from "globals"; +import prettier from "eslint-config-prettier"; +import eslintPluginAstro from "eslint-plugin-astro"; +import tseslint from "typescript-eslint"; + +export default [ + { ignores: ["dist", "node_modules", ".astro"] }, + js.configs.recommended, + ...tseslint.configs.recommended, + ...eslintPluginAstro.configs.recommended, + prettier, + { + files: ["**/*.js", "**/*.ts"], + languageOptions: { + ecmaVersion: 2022, + sourceType: "module", + globals: { + ...globals.browser, + ...globals.node, + }, + }, + }, +]; diff --git a/web/package.json b/web/package.json @@ -0,0 +1,42 @@ +{ + "name": "prime8dev", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "astro dev", + "build": "astro build", + "preview": "astro preview", + "lint": "bun eslint .", + "format": "bun prettier --write .", + "prepare": "husky" + }, + "lint-staged": { + "*.{ts,astro,js}": [ + "eslint --fix", + "prettier --write" + ], + "*.{json,md,css}": [ + "prettier --write" + ] + }, + "dependencies": { + "astro-bun-adapter": "^1.0.2", + "astro": "^5.16.11", + "gray-matter": "^4.0.3", + "jimp": "^1.6.0", + "marked": "^17.0.1" + }, + "devDependencies": { + "@eslint/js": "^9.39.2", + "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-astro": "^1.5.0", + "globals": "^17.0.0", + "husky": "^9.1.7", + "lint-staged": "^16.2.7", + "prettier": "^3.8.0", + "prettier-plugin-astro": "^0.14.1", + "typescript-eslint": "^8.53.0" + } +} diff --git a/web/public/amplifier/logo.svg b/web/public/amplifier/logo.svg @@ -0,0 +1,9 @@ +<svg width="165" height="50" viewBox="0 0 165 50" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<rect width="164.167" height="50" fill="url(#pattern0_1_14974)"/> +<defs> +<pattern id="pattern0_1_14974" patternContentUnits="objectBoundingBox" width="1" height="1"> +<use xlink:href="#image0_1_14974" transform="matrix(0.00200374 0 0 0.00657895 -0.00093511 0)"/> +</pattern> +<image id="image0_1_14974" width="500" height="152" xlink:href="data:image/png;base64,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"/> +</defs> +</svg> diff --git a/web/public/favicon.png b/web/public/favicon.png Binary files differ. diff --git a/web/public/mandolin/company.jpeg b/web/public/mandolin/company.jpeg Binary files differ. diff --git a/web/public/mandolin/company_silly.jpeg b/web/public/mandolin/company_silly.jpeg Binary files differ. diff --git a/web/public/mandolin/employee_polaroids.jpeg b/web/public/mandolin/employee_polaroids.jpeg Binary files differ. diff --git a/web/public/mandolin/logo.svg b/web/public/mandolin/logo.svg @@ -0,0 +1,11 @@ +<svg width="148" height="25" viewBox="0 0 148 25" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_5341_382)"> +<path d="M-11.2273 8.155C-7.23482 12.1475 -5.14863 14.3079 -3.5057 16.0249C-1.86502 17.7397 -0.677597 19.0004 1.52874 21.2068C3.73442 23.4125 4.78203 24.3868 6.39141 25.922C8.00364 27.46 10.1643 29.5467 14.5808 33.9631L13.4783 35.0653C13.8714 35.457 14.2851 35.8694 14.7204 36.3046L13.4009 37.6244C8.99312 33.2167 6.84298 31.1405 5.24295 29.6142C3.64008 28.0851 2.57372 27.0932 0.348847 24.8684C-1.87525 22.6443 -3.0784 21.3666 -4.7143 19.6569C-6.34804 17.9494 -8.42472 15.7988 -12.4072 11.8164L-11.3077 10.7169C-11.6994 10.3236 -12.1116 9.91002 -12.5469 9.47478L-11.2273 8.155ZM17.6108 32.3116L16.291 33.6314L-9.51682 7.82329L-8.19727 6.50351L17.6108 32.3116ZM-4.88882 5.40061C-2.86324 7.42619 -0.715327 9.37416 1.45242 11.34C3.61427 13.3004 5.79612 15.2788 7.85905 17.3418C10.1334 19.6161 12.2837 21.9698 14.4179 24.3054C16.5566 26.646 18.6792 28.9686 20.9193 31.2087L19.5995 32.5285C17.3248 30.2538 15.1744 27.9 13.0402 25.5644C10.9015 23.2237 8.77896 20.9012 6.53927 18.6615C4.51403 16.6363 2.36645 14.6884 0.198711 12.7226C-1.96313 10.7622 -4.14513 8.78363 -6.20837 6.72039L-4.88882 5.40061ZM-3.23618 3.05881C0.710573 7.00557 3.07486 8.77848 4.99531 10.1134C6.93579 11.4622 8.5358 12.4355 10.8228 14.7225C13.1149 17.0146 13.9018 18.4334 15.161 20.2816C16.4043 22.1064 18.1952 24.4904 22.5717 28.8669L21.2521 30.1867C16.8045 25.739 14.9361 23.266 13.6187 21.3323C12.3171 19.422 11.6416 18.1807 9.50325 16.0422C7.35972 13.8987 5.91766 13.0275 3.93 11.6459C1.92231 10.2504 -0.52773 8.40683 -4.55597 4.3786L-3.23618 3.05881ZM-1.03062 0.439756C2.8884 4.35878 5.43193 5.9252 7.53303 7.06167C9.66269 8.21359 11.5369 9.01396 13.8699 11.347C16.2126 13.6897 16.8051 15.3708 17.845 17.3809C18.8661 19.3548 20.4255 21.8957 24.7774 26.2476L23.4577 27.5674C18.9855 23.0952 17.3062 20.4012 16.1874 18.2385C15.0873 16.1121 14.6383 14.7547 12.5504 12.6668C10.453 10.5694 8.86419 9.9035 6.64498 8.70314C4.39719 7.48732 1.70572 5.81521 -2.35018 1.75931L-1.03062 0.439756ZM0.966248 -1.55689C4.8157 2.29255 7.75733 3.3601 10.2835 4.02182C12.8243 4.68735 15.3518 4.9902 17.7894 7.42779C20.2431 9.8815 20.3273 12.2362 20.8835 14.6416C21.4338 17.0216 22.4866 19.9636 26.7741 24.2512L25.4545 25.5707C20.918 21.0342 19.6936 17.7799 19.0652 15.0619C18.4427 12.3694 18.4466 10.7244 16.4699 8.74757C14.4769 6.75464 12.5801 6.55255 9.81058 5.8271C7.02661 5.09785 3.77191 3.88832 -0.353533 -0.237108L0.966248 -1.55689ZM2.88885 -3.47949C6.63379 0.265398 10.149 0.670448 13.3728 0.663706C14.9562 0.660392 16.6569 0.543751 18.1533 0.715422C19.7176 0.894902 21.2221 1.39527 22.522 2.69521C23.8261 3.99936 24.2842 5.4596 24.407 6.97556C24.4671 7.71701 24.4477 8.47791 24.412 9.23169C24.3754 10.0048 24.3232 10.7469 24.3038 11.5466C24.2658 13.116 24.3623 14.7549 24.9709 16.5161C25.5782 18.274 26.7153 20.2091 28.8345 22.3284L27.515 23.6481C25.2222 21.3553 23.9181 19.1841 23.2068 17.1258C22.4968 15.0708 22.3972 13.1836 22.4379 11.5015C22.4579 10.6755 22.5137 9.86057 22.5477 9.1433C22.5827 8.40674 22.5966 7.7438 22.5466 7.12638C22.4492 5.92451 22.1136 4.92589 21.2024 4.01476C20.2871 3.09944 19.2266 2.71723 17.9405 2.56968C16.5864 2.41433 15.1509 2.52632 13.3767 2.53004C9.88532 2.53734 5.7991 2.0701 1.56907 -2.15994L2.88885 -3.47949Z" fill="white"/> +</g> +<path d="M32.4499 23.1855V2.38053H35.5707L42.9119 20.2134L50.2233 2.38053H53.3738V23.1855H50.8772V6.71986L44.1007 23.1855H41.6933L34.9465 6.77931V23.1855H32.4499ZM61.8154 23.4233C58.2488 23.4233 55.9603 21.5806 55.9603 18.6976C55.9603 15.0716 59.4674 14.388 62.6179 14.0611C65.0253 13.8233 67.1058 13.853 67.1355 12.575C67.1058 10.5837 65.4711 9.18674 63.0934 9.18674C60.8049 9.18674 59.0216 10.4648 58.7541 12.3372H56.3169C56.6141 9.24619 59.408 7.07652 63.1529 7.07652C67.0464 7.07652 69.543 9.39479 69.543 12.7236V20.3917C69.543 20.897 69.8105 21.1645 70.3454 21.1645H71.2371V23.1855H69.8402C68.1461 23.1855 67.2544 22.4128 67.2544 20.9564V20.4809C66.3331 22.2939 64.5498 23.4233 61.8154 23.4233ZM58.4271 18.6382C58.4271 20.2728 59.9132 21.3131 62.1721 21.3131C65.1145 21.3131 67.1355 19.4406 67.1355 16.8252V14.7744C66.4519 15.6957 64.6984 15.8741 62.7665 16.0821C60.5968 16.3199 58.4271 16.6171 58.4271 18.6382ZM72.814 23.1855V7.43318H74.7756L75.0133 9.84062C76.0833 8.17622 78.1341 7.07652 80.4821 7.07652C83.8703 7.07652 86.1292 9.27591 86.1292 12.7533V23.1855H83.6623V12.8425C83.6623 10.6431 82.2357 9.24619 79.8579 9.24619C77.0344 9.24619 75.3106 11.2078 75.2808 13.6152V23.1855H72.814ZM95.1682 23.5125C90.9478 23.5125 88.0053 20.1242 88.0053 15.2202C88.0053 10.4053 90.918 7.07652 95.1385 7.07652C97.5162 7.07652 99.5075 8.11677 100.637 9.78117V0.89446H103.104V23.1855H101.142L100.875 20.154C99.8345 22.2047 97.754 23.5125 95.1682 23.5125ZM90.5614 15.2202C90.5614 18.8462 92.6122 21.3725 95.5546 21.3725C98.5564 21.3725 100.637 18.8165 100.637 15.1608C100.637 11.6239 98.6159 9.18674 95.7032 9.18674C92.6716 9.18674 90.5614 11.6536 90.5614 15.2202ZM112.975 23.5125C107.922 23.5125 105.247 19.9162 105.247 15.1608C105.247 9.90006 108.695 7.07652 112.975 7.07652C117.998 7.07652 120.702 10.7025 120.702 15.1608C120.702 20.5998 117.403 23.5125 112.975 23.5125ZM107.774 15.1608C107.774 19.2029 110.122 21.3725 112.975 21.3725C116.333 21.3725 118.176 18.5787 118.176 15.1608C118.176 11.6239 116.125 9.21647 112.975 9.21647C109.824 9.21647 107.774 11.6239 107.774 15.1608ZM122.829 23.1855V0.89446H125.296V23.1855H122.829ZM128.227 23.1855V7.43318H130.694V23.1855H128.227ZM127.633 2.94524C127.633 1.90499 128.435 1.13223 129.475 1.13223C130.516 1.13223 131.288 1.90499 131.288 2.94524C131.288 3.98549 130.516 4.78797 129.475 4.78797C128.435 4.78797 127.633 3.98549 127.633 2.94524ZM133.54 23.1855V7.43318H135.501L135.739 9.84062C136.809 8.17622 138.86 7.07652 141.208 7.07652C144.596 7.07652 146.855 9.27591 146.855 12.7533V23.1855H144.388V12.8425C144.388 10.6431 142.961 9.24619 140.584 9.24619C137.76 9.24619 136.036 11.2078 136.007 13.6152V23.1855H133.54Z" fill="white"/> +<defs> +<clipPath id="clip0_5341_382"> +<rect x="0.168457" y="0.563477" width="24.2623" height="24.2623" rx="4.41133" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/web/public/mandolin/moment_polaroids.jpeg b/web/public/mandolin/moment_polaroids.jpeg Binary files differ. diff --git a/web/public/me.jpg b/web/public/me.jpg Binary files differ. diff --git a/web/public/robots.txt b/web/public/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://prime8.dev/sitemap.xml diff --git a/web/public/site.webmanifest b/web/public/site.webmanifest @@ -0,0 +1,21 @@ +{ + "name": "Damian Myrda | Software Engineer", + "short_name": "Damian Myrda", + "description": "Software Engineer portfolio - low-level programming, TUI development, and embedded systems", + "start_url": "/", + "display": "standalone", + "background_color": "#0d0d0d", + "theme_color": "#0d0d0d", + "icons": [ + { + "src": "/favicon.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/favicon.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} diff --git a/web/src/components/Article.astro b/web/src/components/Article.astro @@ -0,0 +1,418 @@ +--- +import type Blog from "../lib/types/blog"; + +interface Props { + blog: Blog; + isStandalone?: boolean; +} + +const { blog, isStandalone = true } = Astro.props; +--- + +<article class="blog-article" data-id={blog.id} data-blog-id={blog.id}> + { + isStandalone ? ( + <a href="/#blog" class="blog-back-btn"> + ← See all posts + </a> + ) : ( + <button class="blog-back-btn blog-back-btn-internal"> + <span class="color-dim">← Back to posts</span> + </button> + ) + } + <header class="blog-article-header"> + <div class="blog-article-header-top"> + <h1 class="blog-article-title">{blog.title}</h1> + <button + class="blog-share-btn" + data-blog-id={blog.id} + data-blog-title={blog.title} + > + [Share] + </button> + </div> + <time class="blog-article-date" datetime={blog.date}>{blog.date}</time> + </header> + <div class="blog-article-content" data-blog-id={blog.id}> + { + blog.url ? ( + <a + class="external-link" + href={blog.url} + target="_blank" + rel="noopener noreferrer" + > + Read on external site → + </a> + ) : blog.content ? ( + <Fragment set:html={blog.content} /> + ) : ( + <p class="color-dim">Content not available</p> + ) + } + </div> +</article> + +<style> + .blog-back-btn { + display: inline-block; + background: transparent; + border: 1px solid var(--border); + color: var(--fg-dim); + padding: 8px 16px; + cursor: pointer; + font-family: inherit; + font-size: 12px; + margin-bottom: 24px; + transition: all 0.15s; + text-decoration: none; + } + + .blog-back-btn:hover { + background: var(--bg-alt); + color: var(--accent); + border-color: var(--accent); + } + + .blog-article { + animation: fadeIn 0.2s ease; + } + + @keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + + .blog-article-header { + margin-bottom: 24px; + padding-bottom: 16px; + border-bottom: 1px solid var(--border); + } + + .blog-article-header-top { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 16px; + } + + .blog-article-title { + font-size: 28px; + font-weight: 500; + color: var(--accent); + margin: 0 0 8px 0; + line-height: 1.3; + } + + .blog-share-btn { + background: transparent; + border: 1px solid var(--border); + color: var(--fg-dim); + padding: 6px 12px; + cursor: pointer; + font-family: inherit; + font-size: 12px; + transition: all 0.15s; + flex-shrink: 0; + } + + .blog-share-btn:hover { + background: var(--bg-alt); + color: var(--accent); + border-color: var(--accent); + } + + .blog-share-btn.copied { + color: var(--green); + border-color: var(--green); + } + + .blog-article-date { + color: var(--fg-dim); + font-size: 13px; + } + + .blog-article-content { + font-size: 14px; + line-height: 1.7; + color: var(--fg); + padding-bottom: 64px; + } + + .blog-article-content :global(p) { + margin-bottom: 16px; + } + + .blog-article-content :global(p:last-child) { + margin-bottom: 0; + } + + .blog-article-content :global(h2) { + font-size: 20px; + color: var(--accent); + margin: 32px 0 12px; + font-weight: 600; + } + + .blog-article-content :global(h2:first-child) { + margin-top: 0; + } + + .blog-article-content :global(h3) { + font-size: 17px; + color: var(--accent); + margin: 24px 0 10px; + font-weight: 500; + } + + .blog-article-content :global(h4) { + font-size: 15px; + color: var(--fg); + margin: 20px 0 8px; + font-weight: 500; + } + + .blog-article-content :global(h5), + .blog-article-content :global(h6) { + font-size: 14px; + color: var(--fg-dim); + margin: 16px 0 8px; + font-weight: 500; + } + + .blog-article-content :global(ul), + .blog-article-content :global(ol) { + margin: 12px 0; + padding-left: 24px; + } + + .blog-article-content :global(li) { + margin-bottom: 8px; + } + + .blog-article-content :global(li > ul), + .blog-article-content :global(li > ol) { + margin: 6px 0; + } + + .blog-article-content :global(code) { + background: var(--bg-alt); + padding: 2px 6px; + font-size: 13px; + border-radius: 2px; + } + + .blog-article-content :global(pre) { + display: block; + background: var(--bg-alt); + border: 1px solid var(--border); + padding: 16px; + margin: 16px 0; + overflow-x: auto; + font-size: 13px; + line-height: 1.5; + } + + .blog-article-content :global(pre code) { + background: none; + padding: 0; + font-size: inherit; + } + + .blog-article-content :global(a) { + color: var(--light-blue); + text-decoration: none; + } + + .blog-article-content :global(a:hover) { + opacity: 0.8; + } + + .blog-article-content :global(strong) { + font-weight: 600; + color: var(--fg); + } + + .blog-article-content :global(em) { + font-style: italic; + color: var(--fg-dim); + } + + .blog-article-content :global(del) { + text-decoration: line-through; + color: var(--fg-dim); + } + + .blog-article-content :global(blockquote) { + border-left: 3px solid var(--accent); + margin: 16px 0; + padding: 12px 20px; + color: var(--fg-dim); + background: var(--bg-alt); + } + + .blog-article-content :global(blockquote p) { + margin-bottom: 0; + } + + .blog-article-content :global(hr) { + border: none; + border-top: 1px solid var(--border); + margin: 24px 0; + } + + .blog-article-content :global(table) { + width: 100%; + border-collapse: collapse; + margin: 16px 0; + font-size: 13px; + } + + .blog-article-content :global(th), + .blog-article-content :global(td) { + border: 1px solid var(--border); + padding: 10px 14px; + text-align: left; + } + + .blog-article-content :global(th) { + background: var(--bg-alt); + color: var(--accent); + font-weight: 500; + } + + .blog-article-content :global(tr:nth-child(even)) { + background: rgba(255, 255, 255, 0.02); + } + + .blog-article-content :global(img) { + max-width: 100%; + height: auto; + margin: 16px 0; + } + + .external-link { + color: var(--light-blue); + text-decoration: none; + font-size: 14px; + } + + .external-link:hover { + opacity: 0.8; + } + + @media (max-width: 768px) { + .blog-back-btn { + padding: 6px 12px; + font-size: 11px; + margin-bottom: 16px; + } + + .blog-article-header { + margin-bottom: 16px; + padding-bottom: 12px; + } + + .blog-article-header-top { + flex-direction: column; + gap: 12px; + } + + .blog-article-title { + font-size: 22px; + } + + .blog-share-btn { + align-self: flex-start; + } + + .blog-article-content { + font-size: 13px; + padding-bottom: 32px; + } + + .blog-article-content :global(h2) { + font-size: 18px; + margin: 24px 0 10px; + } + + .blog-article-content :global(h3) { + font-size: 15px; + margin: 20px 0 8px; + } + + .blog-article-content :global(pre) { + padding: 12px; + font-size: 12px; + } + + .blog-article-content :global(code) { + font-size: 12px; + } + + .blog-article-content :global(table) { + font-size: 12px; + } + + .blog-article-content :global(th), + .blog-article-content :global(td) { + padding: 8px 10px; + } + } +</style> + +<script> + import { closeBlogPost } from "../scripts/ui/blog"; + import { updateUrl } from "../scripts/ui/url"; + + document.addEventListener("DOMContentLoaded", () => { + const shareButtons = document.querySelectorAll(".blog-share-btn"); + + shareButtons.forEach((btn) => { + btn.addEventListener("click", async (e) => { + e.stopPropagation(); + const button = e.currentTarget as HTMLButtonElement; + const blogId = button.dataset.blogId; + const title = button.dataset.blogTitle; + const url = `${window.location.origin}/#blog/${blogId}`; + + if (navigator.share) { + try { + await navigator.share({ + title, + url, + }); + } catch { + // User cancelled share dialog + } + } else { + copyToClipboard(url, button); + } + }); + }); + + function copyToClipboard(text: string, btn: HTMLButtonElement) { + navigator.clipboard.writeText(text).then(() => { + const originalText = btn.textContent; + btn.textContent = "[Copied!]"; + btn.classList.add("copied"); + setTimeout(() => { + btn.textContent = originalText; + btn.classList.remove("copied"); + }, 2000); + }); + } + + document.querySelectorAll(".blog-back-btn-internal").forEach((btn) => { + btn.addEventListener("click", () => { + closeBlogPost(); + updateUrl(); + }); + }); + }); +</script> diff --git a/web/src/components/Footer.astro b/web/src/components/Footer.astro @@ -0,0 +1,51 @@ +--- +import type { WakaTimeData } from "../lib/wakatime"; + +interface Props { + wakaTimeData: WakaTimeData | null; +} + +const { wakaTimeData } = Astro.props; +--- + +<footer id="statusbar"> + <span class="time" id="status-time"></span> + <span class="spacer"></span> + { + wakaTimeData?.weeklyStats && ( + <span class="wakatime">{wakaTimeData.allTimeStats?.totalText}</span> + ) + } +</footer> + +<style> + #statusbar { + display: flex; + align-items: center; + background: var(--bg-alt); + border-top: 1px solid var(--border); + padding: 0 12px; + height: 24px; + font-size: 12px; + flex-shrink: 0; + } + + #statusbar .time { + color: var(--cyan); + } + + #statusbar .spacer { + flex: 1; + } + + #statusbar .wakatime { + color: var(--magenta); + } + + @media (max-width: 768px) { + #statusbar { + font-size: 11px; + padding: 0 10px; + } + } +</style> diff --git a/web/src/components/Header.astro b/web/src/components/Header.astro @@ -0,0 +1,140 @@ +<header id="tabs"> + <nav class="tab-nav" aria-label="Main navigation"> + <div class="tab active" data-tab="about" aria-current="page">[1] About</div> + <div class="tab" data-tab="experience">[2] Experience</div> + <div class="tab" data-tab="projects">[3] Projects</div> + <div class="tab" data-tab="blog">[4] Blog</div> + </nav> + <div class="tab-spacer"></div> + <div class="status" id="header-status"> + <span class="dpad"> + <span class="dpad-row"><span class="dpad-key">↑</span></span> + <span class="dpad-row" + ><span class="dpad-key">←</span><span class="dpad-key">↓</span><span + class="dpad-key">→</span + ></span + > + </span> + <span class="navigate"> navigate · Tab cycle</span> + </div> +</header> + +<style> + #tabs { + display: flex; + align-items: center; + gap: 4px; + background: var(--bg-alt); + border-bottom: 1px solid var(--border); + padding: 0 12px; + height: 36px; + flex-shrink: 0; + position: relative; + z-index: 10; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + #tabs * { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + .tab-nav { + display: flex; + align-items: center; + gap: 4px; + } + + .tab { + padding: 6px 12px; + color: var(--fg-dim); + cursor: pointer; + border-bottom: 2px solid transparent; + transition: + color 0.15s, + border-color 0.15s; + } + + .tab:hover { + color: var(--fg); + } + + .tab.active { + color: var(--accent); + border-bottom-color: var(--accent); + } + + .tab-spacer { + flex: 1; + } + + .status { + display: flex; + align-items: center; + gap: 8px; + color: var(--fg-dim); + font-size: 11px; + margin-right: 8px; + } + + .dpad { + display: inline-flex; + flex-direction: column; + align-items: center; + gap: 1px; + font-size: 8px; + line-height: 1; + } + + .dpad-row { + display: flex; + gap: 1px; + } + + .dpad-key { + width: 12px; + height: 10px; + display: flex; + align-items: center; + justify-content: center; + background: var(--border); + border-radius: 2px; + color: var(--fg); + } + + @media (max-width: 768px) { + #tabs { + flex-wrap: wrap; + height: auto; + min-height: 36px; + padding: 8px 12px; + gap: 8px; + } + + .tab-nav { + width: 100%; + justify-content: space-between; + gap: 0; + } + + .tab { + padding: 6px 8px; + font-size: 12px; + flex: 1; + text-align: center; + } + + .tab-spacer { + display: none; + } + + .status { + display: none; + } + } +</style> diff --git a/web/src/components/Lightbox.astro b/web/src/components/Lightbox.astro @@ -0,0 +1,139 @@ +--- + +--- + +<div id="image-lightbox" class="lightbox hidden"> + <div class="lightbox-overlay"></div> + <div class="lightbox-content"> + <img src="" alt="" class="lightbox-image" /> + <button class="lightbox-close">[X]</button> + </div> +</div> + +<style> + .lightbox { + position: fixed; + inset: 0; + z-index: 1000; + display: flex; + align-items: center; + justify-content: center; + } + + .lightbox.hidden { + display: none; + } + + .lightbox-overlay { + position: absolute; + inset: 0; + background: rgba(0, 0, 0, 0.9); + cursor: pointer; + } + + .lightbox-content { + position: relative; + max-width: 90vw; + max-height: 90vh; + z-index: 1; + } + + .lightbox-image { + max-width: 100%; + max-height: 90vh; + border-radius: 4px; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5); + } + + .lightbox-close { + position: absolute; + top: 8px; + right: 8px; + background: rgba(0, 0, 0, 0.7); + border: 1px solid var(--border); + color: var(--fg); + font-family: "JetBrains Mono", monospace; + font-size: 12px; + cursor: pointer; + padding: 4px 8px; + line-height: 1; + transition: + color 0.15s, + background 0.15s; + z-index: 10; + } + + .lightbox-close:hover { + color: var(--accent); + background: rgba(0, 0, 0, 0.9); + } +</style> + +<script> + document.addEventListener("DOMContentLoaded", () => { + const lightbox = document.getElementById("image-lightbox"); + const lightboxImage = lightbox?.querySelector( + ".lightbox-image", + ) as HTMLImageElement; + const lightboxOverlay = lightbox?.querySelector(".lightbox-overlay"); + const lightboxClose = lightbox?.querySelector(".lightbox-close"); + + let lightboxImages: string[] = []; + let currentLightboxIndex = 0; + + (window as Window & { isLightboxOpen?: () => boolean }).isLightboxOpen = + () => !lightbox?.classList.contains("hidden"); + + ( + window as Window & { + openLightbox?: (images: string[], startIndex?: number) => void; + } + ).openLightbox = (images: string[], startIndex: number = 0) => { + if (lightbox && lightboxImage && images.length > 0) { + lightboxImages = images; + currentLightboxIndex = startIndex; + lightboxImage.src = images[startIndex]; + lightbox.classList.remove("hidden"); + } + }; + + function closeLightbox() { + lightbox?.classList.add("hidden"); + lightboxImages = []; + currentLightboxIndex = 0; + } + + function navigateLightboxImage(direction: number) { + if (lightboxImages.length <= 1) return; + currentLightboxIndex = + (currentLightboxIndex + direction + lightboxImages.length) % + lightboxImages.length; + if (lightboxImage) { + lightboxImage.src = lightboxImages[currentLightboxIndex]; + } + } + + ( + window as Window & { navigateLightboxImage?: (direction: number) => void } + ).navigateLightboxImage = navigateLightboxImage; + + lightboxOverlay?.addEventListener("click", closeLightbox); + lightboxClose?.addEventListener("click", closeLightbox); + + document.addEventListener("keydown", (e) => { + if (!lightbox?.classList.contains("hidden")) { + if (e.key === "Escape") { + closeLightbox(); + } else if (e.key === "ArrowLeft") { + e.preventDefault(); + e.stopPropagation(); + navigateLightboxImage(-1); + } else if (e.key === "ArrowRight") { + e.preventDefault(); + e.stopPropagation(); + navigateLightboxImage(1); + } + } + }); + }); +</script> diff --git a/web/src/components/pages/About.astro b/web/src/components/pages/About.astro @@ -0,0 +1,385 @@ +--- +import rawAbout from "../../../config/about.json"; +import type About from "../../lib/types/about"; +import rawContact from "../../../config/contact.json"; +import type Contact from "../../lib/types/contact"; +import type { WakaTimeData } from "../../lib/wakatime"; +import { getTagClass } from "../../lib/utils/tags"; + +const about = rawAbout as About; +const contact = rawContact as Contact; + +interface Props { + wakaTimeData: WakaTimeData | null; +} + +const { wakaTimeData } = Astro.props; +--- + +<section id="about" class="page active"> + <div class="about-layout"> + <div class="about-left"> + <img + class="profile-image" + src="/me.jpg" + alt="Damian Myrda - Software Engineer and high school senior from Chicago" + width="280" + height="280" + loading="eager" + /> + <div class="contact-box"> + <div class="box-title">─ Contact ─</div> + <div class="contact-item"> + <span class="label">Email</span> + <a href={`mailto:${contact.email}`}>{contact.email}</a> + </div> + <div class="contact-item"> + <span class="label">GitLab</span> + <a href={contact.gitlab} target="_blank" rel="noopener noreferrer me" + >git.prime8.dev/moncheeta</a + > + </div> + <div class="contact-item"> + <span class="label">LinkedIn</span> + <a + href={contact.linkedin} + target="_blank" + rel="noopener noreferrer me">linkedin.com/in/damian-myrda</a + > + </div> + </div> + </div> + <div class="about-right"> + <div class="section"> + <h1> + {about.name} + <span class="dim">@{about.handle}</span> + </h1> + <p class="bio">{about.bio}</p> + </div> + <div class="section"> + <div class="box-title">─ Info ─</div> + <div class="info-row"> + <span class="label">Location</span> + {about.location} + </div> + <div class="info-row"> + <span class="label">School</span> + {about.school} + </div> + <div class="info-row"> + <span class="label">Graduating</span> + {about.graduating} + </div> + </div> + <div class="section"> + <div class="box-title">─ Interests ─</div> + <div class="tags"> + { + about.interests.map((interest) => ( + <span class={`tag ${getTagClass(interest)}`}>{interest}</span> + )) + } + </div> + </div> + <div class="section"> + <div class="box-title">─ Tools ─</div> + <div class="tags"> + { + about.tools.map((tool) => ( + <span class={`tag ${getTagClass(tool)}`}>{tool}</span> + )) + } + </div> + </div> + <div class="section"> + <div class="box-title">─ Languages ─</div> + <div class="tags"> + { + about.languages.map((lang) => ( + <span class={`tag ${getTagClass(lang)}`}>{lang}</span> + )) + } + </div> + </div> + { + wakaTimeData?.weeklyStats && ( + <div class="section"> + <div class="box-title">─ Activity ─</div> + <div class="weekly-stats"> + <div class="weekly-total"> + {wakaTimeData.weeklyStats.totalText} + </div> + <div class="weekly-days"> + {wakaTimeData.weeklyStats.days.map((day) => ( + <div class="weekly-day-row"> + <span class="weekly-day-name">{day.dayText}</span> + <div class="weekly-day-bar-container"> + <div + class="weekly-day-bar" + style={`width: ${day.barWidthPercent}`} + /> + </div> + <span class="weekly-day-time">{day.timeText}</span> + </div> + ))} + </div> + </div> + </div> + ) + } + </div> + </div> +</section> + +<style> + .about-layout { + display: flex; + width: 100%; + height: 100%; + } + + .about-left { + width: 320px; + flex-shrink: 0; + border-right: 1px solid var(--border); + display: flex; + flex-direction: column; + padding: 16px; + gap: 16px; + overflow-y: auto; + } + + .about-right { + flex: 1; + padding: 24px 32px; + overflow-y: auto; + } + + .profile-image { + width: 100%; + max-width: 280px; + height: auto; + border-radius: 4px; + border: 1px solid var(--border); + } + + .contact-box { + border: 1px solid var(--border); + padding: 12px; + } + + .box-title { + color: var(--accent); + font-size: 12px; + margin-bottom: 8px; + text-align: center; + } + + .contact-item { + display: flex; + margin-bottom: 4px; + font-size: 12px; + } + + .contact-item .label { + color: var(--fg-dim); + width: 70px; + flex-shrink: 0; + } + + .contact-item a { + color: var(--light-blue); + text-decoration: none; + } + + .contact-item a:hover { + opacity: 0.8; + } + + .section { + margin-bottom: 20px; + } + + .section h1 { + font-size: 18px; + font-weight: 400; + margin-bottom: 4px; + } + + .section h1 .dim { + color: var(--fg-dim); + font-size: 14px; + } + + .section .bio { + color: var(--fg-dim); + font-style: italic; + } + + .info-row { + display: flex; + font-size: 13px; + margin-bottom: 4px; + } + + .info-row .label { + color: var(--fg-dim); + width: 100px; + flex-shrink: 0; + } + + .tags { + display: flex; + flex-wrap: wrap; + gap: 6px; + } + + .weekly-stats { + background: var(--bg-alt); + border: 1px solid var(--border); + padding: 12px; + } + + .weekly-total { + font-size: 16px; + font-weight: 500; + color: var(--accent); + margin-bottom: 12px; + } + + .weekly-days { + display: flex; + flex-direction: column; + gap: 6px; + } + + .weekly-day-row { + display: flex; + align-items: center; + gap: 8px; + font-size: 12px; + } + + .weekly-day-name { + width: 32px; + flex-shrink: 0; + color: var(--fg-dim); + } + + .weekly-day-bar-container { + flex: 1; + height: 8px; + background: var(--bg); + border-radius: 2px; + overflow: hidden; + } + + .weekly-day-bar { + height: 100%; + background: var(--accent); + border-radius: 2px; + } + + .weekly-day-time { + min-width: 50px; + flex-shrink: 0; + text-align: right; + color: var(--fg-dim); + white-space: nowrap; + } + + @media (max-width: 768px) { + .about-layout { + flex-direction: column; + } + + .about-left { + width: 100%; + border-right: none; + border-bottom: 1px solid var(--border); + padding: 16px; + flex-direction: row; + flex-wrap: wrap; + gap: 16px; + } + + .profile-image { + width: 120px; + max-width: 120px; + height: 120px; + } + + .contact-box { + flex: 1; + min-width: 200px; + } + + .about-right { + padding: 16px; + } + + .section h1 { + font-size: 16px; + } + + .section h1 .dim { + font-size: 12px; + } + + .tags { + gap: 4px; + } + + .tag { + font-size: 11px; + padding: 2px 6px; + } + + .weekly-stats { + padding: 10px; + } + + .weekly-total { + font-size: 14px; + } + + .weekly-day-row { + font-size: 11px; + } + + .weekly-day-name { + width: 28px; + } + + .weekly-day-time { + min-width: 45px; + } + } + + @media (max-width: 480px) { + .about-left { + flex-direction: column; + align-items: center; + } + + .profile-image { + width: 150px; + max-width: 150px; + height: 150px; + } + + .contact-box { + width: 100%; + } + + .contact-item { + flex-direction: column; + gap: 2px; + } + + .contact-item .label { + width: auto; + } + } +</style> diff --git a/web/src/components/pages/Blog.astro b/web/src/components/pages/Blog.astro @@ -0,0 +1,205 @@ +--- +import rawBlogs from "../../lib/blogs"; +import type Blog from "../../lib/types/blog"; +import BlogArticle from "../Article.astro"; + +const blogs = rawBlogs as Blog[]; +--- + +<section id="blog" class="page"> + { + blogs.length === 0 ? ( + <div class="blog-empty"> + <p class="color-dim">No blog posts yet.</p> + <p class="color-dim">Check back soon!</p> + </div> + ) : ( + <> + <div id="blog-list-view" class="blog-list-view"> + <div class="blog-list-container"> + {blogs.map((blog, i) => ( + <div class="blog-list-item" data-index={i} data-id={blog.id}> + <span class="blog-list-date">{blog.date}</span> + <span class="blog-list-title">{blog.title}</span> + <span class="blog-list-arrow">→</span> + </div> + ))} + </div> + </div> + + <div id="blog-post-view" class="blog-post-view hidden"> + <div class="blog-post-container"> + {blogs.map((blog, i) => ( + <div + class="blog-post hidden" + data-index={i} + data-id={blog.id} + data-blog-id={blog.id} + > + <BlogArticle blog={blog} isStandalone={false} /> + </div> + ))} + </div> + </div> + </> + ) + } +</section> + +<style> + .blog-empty { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + width: 100%; + gap: 8px; + } + + .blog-list-view { + display: flex; + align-items: center; + justify-content: center; + height: 100%; + width: 100%; + } + + .blog-list-view.hidden { + display: none; + } + + .blog-list-container { + max-width: 600px; + width: 100%; + padding: 32px; + } + + .blog-list-item { + display: flex; + align-items: center; + gap: 16px; + padding: 16px 20px; + border: 1px solid var(--border); + margin-bottom: 12px; + cursor: pointer; + transition: + background 0.15s ease, + border-color 0.15s ease; + text-decoration: none; + color: inherit; + } + + .blog-list-item:hover { + background: var(--selection); + border-color: var(--accent); + } + + .blog-list-item.selected { + background: var(--bg-alt); + border-color: var(--accent); + } + + .blog-list-item.selected:hover { + background: var(--selection); + } + + .blog-list-item:last-child { + margin-bottom: 0; + } + + .blog-list-date { + color: var(--fg-dim); + font-size: 12px; + flex-shrink: 0; + width: 90px; + } + + .blog-list-title { + flex: 1; + color: var(--fg); + font-weight: 500; + } + + .blog-list-arrow { + color: var(--fg-dim); + font-size: 14px; + transition: + transform 0.15s, + color 0.15s; + } + + .blog-list-item:hover .blog-list-arrow { + color: var(--accent); + transform: translateX(4px); + } + + .blog-post-view { + display: flex; + justify-content: center; + height: 100%; + width: 100%; + overflow-y: auto; + padding: 32px; + } + + .blog-post-view.hidden { + display: none; + } + + .blog-post-container { + max-width: 700px; + width: 100%; + } + + .blog-post.hidden { + display: none; + } + + @media (max-width: 768px) { + .blog-list-container { + padding: 16px; + } + + .blog-list-item { + gap: 12px; + padding: 12px 16px; + margin-bottom: 10px; + } + + .blog-list-date { + font-size: 11px; + width: 80px; + } + + .blog-list-title { + font-size: 14px; + } + + .blog-post-view { + padding: 16px; + } + } + + @media (max-width: 480px) { + .blog-list-item { + flex-wrap: wrap; + gap: 4px; + } + + .blog-list-date { + width: auto; + order: 2; + } + + .blog-list-title { + width: 100%; + order: 1; + } + + .blog-list-arrow { + order: 3; + margin-left: auto; + } + } +</style> diff --git a/web/src/components/pages/Experience.astro b/web/src/components/pages/Experience.astro @@ -0,0 +1,623 @@ +--- +import rawExperience from "../../../config/experience.json"; +import type Experience from "../../lib/types/experience"; +import { MONTH_NAMES } from "../../constants/calendar"; +import { calculateMonths } from "../../lib/utils/period"; +import { getTagClass } from "../../lib/utils/tags"; + +const experience = (rawExperience as Experience[]).sort((a, b) => + a.startDate.localeCompare(b.startDate), +); + +const dates = experience.map((exp) => { + const [year, month] = exp.startDate.split("-").map(Number); + return new Date(year, month - 1, 1); +}); +const endDates = experience.map((exp) => + exp.endDate + ? new Date( + parseInt(exp.endDate.split("-")[0]), + parseInt(exp.endDate.split("-")[1]) - 1, + 28, + ) + : new Date(), +); +const earliestDate = new Date(Math.min(...dates.map((d) => d.getTime()))); +const latestDate = new Date(Math.max(...endDates.map((d) => d.getTime()))); + +const timelineStart = new Date( + earliestDate.getFullYear(), + earliestDate.getMonth(), + 1, +); +const timelineEnd = latestDate; +const totalDays = Math.ceil( + (timelineEnd.getTime() - timelineStart.getTime()) / (1000 * 60 * 60 * 24), +); + +const startYear = timelineStart.getFullYear(); +const endYear = timelineEnd.getFullYear(); +const years = Array.from( + { length: endYear - startYear + 1 }, + (_, i) => startYear + i, +); + +const monthTicks: string[] = []; +let current = new Date(timelineStart); +while (current <= timelineEnd) { + monthTicks.push(MONTH_NAMES[current.getMonth()][0]); + current.setMonth(current.getMonth() + 1); +} +--- + +<section id="experience" class="page"> + <article class="experience-layout"> + <div class="timeline-container"> + <div class="timeline-years"> + {years.map((year) => <span class="year-marker">{year}</span>)} + </div> + + <div class="timeline-bar"> + { + experience.map((exp) => { + const [startYear, startMonth] = exp.startDate + .split("-") + .map(Number); + const expStart = new Date(startYear, startMonth - 1, 1); + const expEnd = exp.endDate + ? new Date( + parseInt(exp.endDate.split("-")[0]), + parseInt(exp.endDate.split("-")[1]) - 1, + 28, + ) + : new Date(); + + const startOffset = Math.max( + 0, + (expStart.getTime() - timelineStart.getTime()) / + (1000 * 60 * 60 * 24), + ); + const duration = + (expEnd.getTime() - expStart.getTime()) / (1000 * 60 * 60 * 24); + + const leftPercent = (startOffset / totalDays) * 100; + const widthPercent = (duration / totalDays) * 100; + const months = calculateMonths(exp.startDate, exp.endDate); + + const originalIndex = experience.findIndex((e) => e.id === exp.id); + + return ( + <div + class={`timeline-segment ${originalIndex === 0 ? "selected" : ""}`} + style={`left: ${leftPercent}%; width: ${widthPercent}%;`} + data-index={originalIndex} + data-id={exp.id} + > + <div class="segment-content"> + <span class="segment-company">{exp.company}</span> + <span class="segment-duration">{months} mos</span> + </div> + </div> + ); + }) + } + </div> + + <div class="timeline-ticks"> + {monthTicks.map((m) => <span class="tick-mark">{m}</span>)} + </div> + </div> + + <div class="experience-detail"> + { + experience.map((exp, index) => { + const months = calculateMonths(exp.startDate, exp.endDate); + const [startYear, startMonth] = exp.startDate.split("-").map(Number); + const startStr = `${MONTH_NAMES[startMonth - 1]} ${startYear}`; + const endStr = exp.endDate + ? `${MONTH_NAMES[parseInt(exp.endDate.split("-")[1]) - 1]} ${exp.endDate.split("-")[0]}` + : "Present"; + + return ( + <div + class={`exp-card ${index !== 0 ? "hidden" : ""}`} + data-for={index} + > + <div class="exp-card-header"> + <div class="exp-card-title"> + {exp.logo ? ( + <div class="exp-title-with-logo"> + <img + src={exp.logo} + alt={`${exp.company} logo`} + class={`exp-logo ${exp.logoFilter || ""}`} + /> + <span class="exp-role">{exp.role}</span> + </div> + ) : ( + <div class="exp-title-text"> + <h2>{exp.company}</h2> + <span class="exp-role">{exp.role}</span> + </div> + )} + </div> + <div class="exp-card-meta"> + <span class="exp-dates"> + {startStr} → {endStr} + </span> + <span class="exp-duration">{months} months</span> + {exp.url && ( + <a + class="external-link" + href={exp.url} + target="_blank" + rel="noopener noreferrer" + > + {new URL(exp.url).hostname} → + </a> + )} + </div> + </div> + <div class="exp-card-tech"> + {exp.tech.map((tech) => ( + <span class={`tag ${getTagClass(tech)}`}>{tech}</span> + ))} + </div> + <div class="exp-card-body"> + {exp.description.map((description) => ( + <p>{description}</p> + ))} + </div> + {exp.images && exp.images.length > 0 && ( + <div class="exp-card-images"> + <img + src={exp.images[0]} + alt={`${exp.company} workplace, ${exp.role} experience at ${exp.company}`} + class="exp-image-hero" + loading="lazy" + data-idx="0" + /> + {exp.images.length > 1 && ( + <div class="exp-image-grid"> + {exp.images.slice(1).map((image, index) => ( + <img + src={image} + alt={`${exp.company} team and office environment, image ${index + 2} of ${exp.images!.length}`} + class="exp-image-thumb" + loading="lazy" + data-idx={index + 1} + /> + ))} + </div> + )} + </div> + )} + </div> + ); + }) + } + </div> + </article> +</section> + +<script> + document.addEventListener("DOMContentLoaded", () => { + document + .querySelectorAll(".exp-image-hero, .exp-image-thumb") + .forEach((img) => { + img.addEventListener("click", () => { + const container = (img as HTMLElement).closest(".exp-card-images"); + const allImages = container + ? Array.from(container.querySelectorAll("img")).map( + (i) => (i as HTMLImageElement).src, + ) + : []; + const startIndex = allImages.indexOf((img as HTMLImageElement).src); + ( + window as Window & { + openLightbox?: (images: string[], startIndex?: number) => void; + } + ).openLightbox?.(allImages, startIndex); + }); + }); + }); +</script> + +<style> + .experience-layout { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + padding: 32px 48px; + gap: 24px; + } + + .timeline-container { + flex-shrink: 0; + display: flex; + flex-direction: column; + gap: 8px; + } + + .timeline-years { + display: flex; + justify-content: space-between; + padding: 0 4px; + font-size: 12px; + color: var(--fg-dim); + } + + .year-marker { + font-weight: 500; + } + + .timeline-bar { + position: relative; + height: 48px; + background: var(--bg-alt); + border: 1px solid var(--border); + border-radius: 4px; + } + + .timeline-segment { + position: absolute; + top: 4px; + bottom: 4px; + background: var(--border); + border-radius: 3px; + cursor: pointer; + transition: all 0.2s ease; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + } + + .timeline-segment:hover { + background: var(--fg-dim); + } + + .timeline-segment.selected { + background: var(--accent); + box-shadow: + 0 0 0 2px var(--accent), + 0 0 12px rgba(215, 175, 95, 0.3); + } + + .segment-content { + display: flex; + flex-direction: column; + align-items: center; + gap: 2px; + padding: 0 8px; + min-width: 0; + } + + .segment-company { + font-size: 11px; + font-weight: 600; + color: var(--bg); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; + } + + .segment-duration { + font-size: 9px; + color: var(--bg); + opacity: 0.8; + } + + .timeline-segment.selected .segment-company, + .timeline-segment.selected .segment-duration { + color: var(--bg); + } + + .timeline-ticks { + display: flex; + justify-content: space-between; + padding: 0 2px; + font-size: 9px; + color: var(--fg-dim); + opacity: 0.6; + } + + .tick-mark { + width: 5%; + text-align: center; + } + + .experience-detail { + flex: 1; + overflow-y: auto; + display: flex; + flex-direction: column; + } + + .exp-card { + background: var(--bg-alt); + border: 1px solid var(--border); + border-radius: 4px; + padding: 24px; + width: 100%; + flex: 1; + display: flex; + flex-direction: column; + gap: 0; + animation: slideUp 0.2s ease; + } + + @keyframes slideUp { + from { + opacity: 0; + transform: translateY(8px); + } + to { + opacity: 1; + transform: translateY(0); + } + } + + .exp-card.hidden { + display: none; + } + + .exp-card-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 16px; + gap: 24px; + } + + .exp-card-title { + display: flex; + align-items: center; + gap: 16px; + } + + .exp-logo { + height: 32px; + width: auto; + flex-shrink: 0; + } + + .exp-logo.logo-invert { + filter: brightness(0) invert(1); + } + + .exp-title-with-logo { + display: flex; + flex-direction: column; + gap: 4px; + } + + .exp-title-with-logo .exp-role { + color: #999; + font-size: 14px; + } + + .exp-title-with-logo .exp-duration { + color: #aaa; + font-size: 12px; + } + + .exp-title-text h2 { + font-size: 22px; + font-weight: 500; + color: var(--accent); + margin: 0 0 4px 0; + } + + .exp-title-text .exp-role { + font-size: 14px; + color: #999; + } + + .exp-card-meta { + display: flex; + flex-direction: column; + align-items: flex-end; + gap: 4px; + font-size: 13px; + } + + .exp-dates { + color: var(--fg); + } + + .exp-duration { + color: #aaa; + font-size: 12px; + } + + .exp-card-tech { + display: flex; + flex-wrap: wrap; + gap: 6px; + margin-bottom: 20px; + } + + .exp-card-body { + color: var(--fg); + line-height: 1.7; + padding-bottom: 0; + margin-bottom: 0; + } + + .exp-card-body p { + margin-bottom: 12px; + } + + .exp-card-body p:last-child { + margin-bottom: 0; + } + + .exp-card-images { + display: flex; + gap: 16px; + margin-top: 12px; + padding-top: 12px; + border-top: 1px solid var(--border); + flex: 1; + min-height: 0; + overflow: hidden; + } + + .exp-image-hero { + flex: 1; + min-width: 0; + height: 100%; + border-radius: 4px; + border: 1px solid var(--border); + object-fit: cover; + cursor: pointer; + transition: + transform 0.15s, + box-shadow 0.15s; + } + + .exp-image-hero:hover { + opacity: 0.8; + border-color: var(--accent); + } + + .exp-image-grid { + width: 180px; + flex-shrink: 0; + display: flex; + flex-direction: column; + gap: 4px; + } + + .exp-image-thumb { + width: 100%; + flex: 1; + min-height: 50px; + border-radius: 4px; + border: 1px solid var(--border); + object-fit: cover; + cursor: pointer; + transition: + opacity 0.15s, + border-color 0.15s; + } + + .exp-image-thumb:hover { + opacity: 0.8; + border-color: var(--accent); + } + + .external-link { + color: var(--light-blue); + text-decoration: none; + font-size: 12px; + } + + .external-link:hover { + opacity: 0.8; + } + + @media (max-width: 768px) { + .experience-layout { + padding: 16px; + gap: 16px; + } + + .timeline-container { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + + .timeline-bar { + min-width: 500px; + height: 40px; + } + + .timeline-years { + min-width: 500px; + font-size: 11px; + } + + .timeline-ticks { + min-width: 500px; + font-size: 8px; + } + + .segment-content { + padding: 0 4px; + } + + .segment-company { + font-size: 9px; + } + + .segment-duration { + font-size: 8px; + } + + .exp-card { + padding: 16px; + } + + .exp-card-header { + flex-direction: column; + gap: 12px; + } + + .exp-card-meta { + align-items: flex-start; + } + + .exp-logo { + height: 28px; + } + + .exp-title-text h2 { + font-size: 18px; + } + + .exp-card-tech { + gap: 4px; + } + + .exp-card-body { + font-size: 13px; + } + + .exp-card-images { + flex-direction: column; + gap: 12px; + } + + .exp-image-hero { + height: auto; + max-height: 200px; + } + + .exp-image-grid { + width: 100%; + flex-direction: row; + flex-wrap: wrap; + gap: 8px; + } + + .exp-image-thumb { + width: calc(33.33% - 6px); + min-height: 60px; + max-height: 80px; + } + } + + @media (max-width: 480px) { + .timeline-bar { + height: 36px; + } + + .exp-image-thumb { + width: calc(50% - 4px); + } + } +</style> diff --git a/web/src/components/pages/Projects.astro b/web/src/components/pages/Projects.astro @@ -0,0 +1,404 @@ +--- +import rawProjects from "../../../config/projects.json"; +import type Project from "../../lib/types/project"; +import { getTagClass, getTechMeta } from "../../lib/utils/tags"; + +const projects = rawProjects as Project[]; + +interface Props { + readmes?: Record<string, string>; +} + +const { readmes } = Astro.props; +--- + +<section id="projects" class="page"> + <aside class="list-view" aria-label="Project list"> + { + projects.map((prg, i) => ( + <div + class={`list-item ${i === 0 ? "selected" : ""}`} + data-index={i} + data-id={prg.id} + > + <div class="list-header"> + <span class="list-title">{prg.name}</span> + <span class="list-meta">{getTechMeta(prg.tech)}</span> + </div> + <div class="list-subtitle">{prg.subtitle}</div> + </div> + )) + } + </aside> + <article class="detail-view"> + { + projects.map((prg, index) => ( + <div + class={`detail-content ${index !== 0 ? "hidden" : ""}`} + data-for={index} + data-id={prg.id} + > + <div class="detail-header"> + <h2>{prg.name}</h2> + <a + class="external-link" + href={prg.url} + target="_blank" + rel="noopener noreferrer" + > + {prg.url.includes("github.com") ? "GitHub" : "GitLab"} → + </a> + </div> + <div class="tech-stack"> + {prg.tech.map((tech) => ( + <span class={`tag ${getTagClass(tech)}`}>{tech}</span> + ))} + </div> + <div class="readme-content" data-readme={prg.id}> + {readmes?.[prg.id] ? ( + <Fragment set:html={readmes[prg.id]} /> + ) : ( + <p class="color-dim">README not available</p> + )} + </div> + </div> + )) + } + </article> +</section> + +<style> + aside.list-view { + width: 300px; + flex-shrink: 0; + border-right: 1px solid var(--border); + overflow-y: auto; + } + + article.detail-view { + flex: 1; + padding: 24px 32px; + overflow: hidden; + display: flex; + flex-direction: column; + } + + .list-item { + padding: 12px 16px; + border-bottom: 1px solid var(--border); + cursor: pointer; + transition: background 0.1s; + } + + .list-item:hover { + background: var(--bg-alt); + } + + .list-item.selected { + background: var(--selection); + border-left: 3px solid var(--accent); + } + + .list-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 2px; + } + + .list-title { + font-weight: 600; + color: var(--fg); + } + + .list-meta { + font-size: 11px; + color: var(--fg-dim); + } + + .list-subtitle { + font-size: 12px; + color: var(--fg-dim); + } + + .detail-content { + display: flex; + flex-direction: column; + height: 100%; + } + + .detail-content.hidden { + display: none; + } + + .detail-content h2 { + font-size: 20px; + font-weight: 400; + color: var(--accent); + margin-bottom: 4px; + } + + .detail-content .tech-stack { + display: flex; + flex-wrap: wrap; + gap: 6px; + margin-bottom: 16px; + } + + .detail-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 12px; + } + + .detail-header h2 { + margin-bottom: 0; + } + + .external-link { + color: var(--light-blue); + text-decoration: none; + font-size: 12px; + } + + .external-link:hover { + opacity: 0.8; + } + + .readme-content { + flex: 1; + min-height: 0; + overflow-y: auto; + font-size: 13px; + line-height: 1.6; + color: var(--fg); + margin-top: 16px; + padding-top: 16px; + border-top: 1px solid var(--border); + } + + .readme-content :global(p) { + margin-bottom: 12px; + } + + .readme-content :global(p:last-child) { + margin-bottom: 0; + } + + .readme-content :global(h2), + .readme-content :global(.readme-h1) { + font-size: 16px; + color: var(--accent); + margin: 20px 0 8px; + font-weight: 600; + } + + .readme-content :global(h2:first-child), + .readme-content :global(.readme-h1:first-child) { + margin-top: 0; + } + + .readme-content :global(h3), + .readme-content :global(.readme-h2) { + font-size: 14px; + color: var(--accent); + margin: 16px 0 8px; + font-weight: 500; + } + + .readme-content :global(h4), + .readme-content :global(.readme-h3) { + font-size: 13px; + color: var(--fg); + margin: 12px 0 6px; + font-weight: 500; + } + + .readme-content :global(h5), + .readme-content :global(h6) { + font-size: 12px; + color: var(--fg-dim); + margin: 10px 0 6px; + font-weight: 500; + } + + .readme-content :global(pre) { + display: block; + background: var(--bg-alt); + border: 1px solid var(--border); + padding: 12px; + margin: 12px 0; + overflow-x: auto; + font-size: 12px; + line-height: 1.4; + } + + .readme-content :global(pre code) { + background: none; + padding: 0; + font-size: inherit; + } + + .readme-content :global(code) { + background: var(--bg-alt); + padding: 2px 6px; + font-size: 12px; + border-radius: 2px; + } + + .readme-content :global(a) { + color: var(--light-blue); + text-decoration: none; + } + + .readme-content :global(a:hover) { + opacity: 0.8; + } + + .readme-content :global(ul), + .readme-content :global(ol) { + margin: 8px 0; + padding-left: 20px; + } + + .readme-content :global(li) { + margin-bottom: 4px; + } + + .readme-content :global(li > ul), + .readme-content :global(li > ol) { + margin: 4px 0; + } + + .readme-content :global(table) { + width: 100%; + border-collapse: collapse; + margin: 12px 0; + font-size: 12px; + } + + .readme-content :global(th), + .readme-content :global(td) { + border: 1px solid var(--border); + padding: 8px 12px; + text-align: left; + } + + .readme-content :global(th) { + background: var(--bg-alt); + color: var(--accent); + font-weight: 500; + } + + .readme-content :global(tr:nth-child(even)) { + background: rgba(255, 255, 255, 0.02); + } + + .readme-content :global(blockquote) { + border-left: 3px solid var(--accent); + margin: 12px 0; + padding: 8px 16px; + color: var(--fg-dim); + background: var(--bg-alt); + } + + .readme-content :global(blockquote p) { + margin-bottom: 0; + } + + .readme-content :global(hr) { + border: none; + border-top: 1px solid var(--border); + margin: 20px 0; + } + + .readme-content :global(img) { + max-width: 100%; + height: auto; + margin: 12px 0; + } + + .readme-content :global(strong) { + color: var(--fg); + font-weight: 600; + } + + .readme-content :global(em) { + font-style: italic; + color: var(--fg-dim); + } + + .readme-content :global(del) { + text-decoration: line-through; + color: var(--fg-dim); + } + + @media (max-width: 768px) { + #projects { + flex-direction: column; + } + + aside.list-view { + width: 100%; + border-right: none; + border-bottom: 1px solid var(--border); + max-height: 200px; + overflow-y: auto; + } + + .list-item { + padding: 10px 14px; + } + + .list-title { + font-size: 13px; + } + + .list-subtitle { + font-size: 11px; + } + + article.detail-view { + padding: 16px; + overflow-y: auto; + } + + .detail-content h2 { + font-size: 18px; + } + + .detail-header { + flex-direction: column; + align-items: flex-start; + gap: 8px; + } + + .readme-content { + font-size: 12px; + } + + .readme-content :global(pre) { + font-size: 11px; + padding: 10px; + } + + .readme-content :global(code) { + font-size: 11px; + } + } + + @media (max-width: 480px) { + aside.list-view { + max-height: 150px; + } + + .list-item { + padding: 8px 12px; + } + + .list-meta { + display: none; + } + } +</style> diff --git a/web/src/components/styles.css b/web/src/components/styles.css @@ -0,0 +1,111 @@ +/* Tag colors */ +.tag { + border: none; + padding: 2px 8px; + font-size: 12px; + color: var(--bg); + background: var(--fg-dim); +} + +/* Language tags */ +.tag.lang-zig { + background: #f7a41d; +} +.tag.lang-rust { + background: #dea584; +} +.tag.lang-c { + background: #a8b1c2; +} +.tag.lang-go { + background: #00add8; +} +.tag.lang-ts { + background: #3178c6; + color: #fff; +} +.tag.lang-python { + background: #3572a5; + color: #fff; +} + +/* Tool tags */ +.tag.tool-zed { + background: #084ccf; + color: #fff; +} +.tag.tool-neovim { + background: #57a143; +} +.tag.tool-opencode { + background: #af5faf; + color: #fff; +} +.tag.tool-linux { + background: #f7c94c; +} +.tag.tool-fish { + background: #d78700; +} +.tag.tool-ghostty { + background: #8b5cf6; + color: #fff; +} + +/* Interest tags */ +.tag.interest-lowlevel { + background: #d75f5f; + color: #fff; +} +.tag.interest-tui { + background: #5faf5f; + color: #0d0d0d; +} +.tag.interest-embedded { + background: #5fafaf; + color: #0d0d0d; +} +.tag.interest-unix { + background: #d7af5f; + color: #0d0d0d; +} + +/* Tech tags */ +.tag.tech-temporal { + background: #4c35c9; + color: #fff; +} +.tag.tech-postgres { + background: #336791; + color: #fff; +} +.tag.tech-pytorch { + background: #ee4c2c; + color: #fff; +} +.tag.tech-cuda { + background: #76b900; +} +.tag.tech-docker { + background: #2496ed; + color: #fff; +} +.tag.tech-kafka { + background: #4c35c9; + color: #fff; +} +.tag.tech-rn { + background: #61dafb; +} +.tag.tech-supabase { + background: #3ecf8e; +} + +/* Utility classes */ +.color-dim { + color: var(--fg-dim); +} + +.hidden { + display: none; +} diff --git a/web/src/constants/calendar.ts b/web/src/constants/calendar.ts @@ -0,0 +1,24 @@ +export const MONTH_NAMES = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", +]; + +export const DAY_NAMES = [ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", +]; diff --git a/web/src/constants/tags.ts b/web/src/constants/tags.ts @@ -0,0 +1,33 @@ +export const TAG_CLASS_MAP: Record<string, string> = { + // Languages + Zig: "lang-zig", + Rust: "lang-rust", + C: "lang-c", + Go: "lang-go", + TypeScript: "lang-ts", + Python: "lang-python", + // Tools + "Zed (Vim mode)": "tool-zed", + Neovim: "tool-neovim", + OpenCode: "tool-opencode", + Linux: "tool-linux", + Fish: "tool-fish", + Ghostty: "tool-ghostty", + // Interests + "Low-level systems": "interest-lowlevel", + "TUI/CLI tooling": "interest-tui", + "Embedded OS": "interest-embedded", + "UNIX philosophy": "interest-unix", + // Tech + Temporal: "tech-temporal", + PyTorch: "tech-pytorch", + CUDA: "tech-cuda", + Docker: "tech-docker", + Kafka: "tech-kafka", + "React Native": "tech-rn", + Supabase: "tech-supabase", +}; + +export const TECH_ABBREVIATIONS: Record<string, string> = { + TypeScript: "TS", +}; diff --git a/web/src/constants/website.ts b/web/src/constants/website.ts @@ -0,0 +1 @@ +export const URL = "https://prime8.dev"; diff --git a/web/src/layouts/Layout.astro b/web/src/layouts/Layout.astro @@ -0,0 +1,557 @@ +--- +import Lightbox from "../components/Lightbox.astro"; +import about from "../../config/about.json"; +import { URL } from "../constants/website"; + +interface Props { + title: string; + description: string; + type: "website" | "article"; + url: string; + image?: string; + keywords?: string; + publishedTime?: string; + modifiedTime?: string; +} + +const { + title, + description, + type, + url, + image, + keywords, + publishedTime, + modifiedTime, +} = Astro.props; + +const ogImage = image + ? image.startsWith("http") + ? image + : `${URL}${image}` + : `${URL}/me.jpg`; +--- + +<!doctype html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title>{title}</title> + <meta name="description" content={description} /> + {keywords && <meta name="keywords" content={keywords} />} + + <link rel="canonical" href={url} /> + <link rel="alternate" hreflang="en" href={url} /> + <link rel="alternate" hreflang="x-default" href={url} /> + + <!-- Preconnect for external resources --> + <link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin /> + <link rel="dns-prefetch" href="https://cdn.jsdelivr.net" /> + + <!-- Preload font for performance --> + <link + rel="preload" + href="https://cdn.jsdelivr.net/npm/@fontsource/jetbrains-mono@5.0.18/files/jetbrains-mono-latin-400-normal.woff2" + as="font" + type="font/woff2" + crossorigin + /> + + <!-- Open Graph --> + <meta property="og:type" content={type} /> + <meta property="og:url" content={url} /> + <meta property="og:title" content={title} /> + <meta property="og:description" content={description} /> + <meta property="og:image" content={ogImage} /> + <meta property="og:image:width" content="1200" /> + <meta property="og:image:height" content="630" /> + <meta property="og:site_name" content={about.name} /> + <meta property="og:locale" content="en_US" /> + { + type === "article" && publishedTime && ( + <meta property="article:published_time" content={publishedTime} /> + ) + } + { + type === "article" && modifiedTime && ( + <meta property="article:modified_time" content={modifiedTime} /> + ) + } + { + type === "article" && ( + <meta property="article:author" content={about.name} /> + ) + } + + <!-- Twitter Card --> + <meta name="twitter:card" content="summary_large_image" /> + <meta name="twitter:url" content={url} /> + <meta name="twitter:title" content={title} /> + <meta name="twitter:description" content={description} /> + <meta name="twitter:image" content={ogImage} /> + + <!-- Additional Meta --> + <meta name="author" content={about.name} /> + <meta name="robots" content="index, follow" /> + <meta name="theme-color" content="#0d0d0d" /> + + <!-- Favicons --> + <link rel="icon" type="image/png" href="/favicon.png" /> + <link rel="apple-touch-icon" href="/favicon.png" /> + <link rel="manifest" href="/site.webmanifest" /> + </head> + <body> + <div id="app"> + <slot /> + </div> + + <Lightbox /> + </body> +</html> + +<style is:global> + * { + margin: 0; + padding: 0; + box-sizing: border-box; + } + + :root { + --bg: #0d0d0d; + --bg-alt: #161616; + --fg: #c0c0c0; + --fg-dim: #606060; + --accent: #d7af5f; + --accent-dim: #a68a3d; + --cyan: #5fafaf; + --blue: #5f87d7; + --light-blue: #5fafff; + --yellow: #d7af5f; + --magenta: #af5faf; + --red: #d75f5f; + --border: #333; + --selection: #3d3520; + } + + @font-face { + font-family: "JetBrains Mono"; + src: url("https://cdn.jsdelivr.net/npm/@fontsource/jetbrains-mono@5.0.18/files/jetbrains-mono-latin-400-normal.woff2") + format("woff2"); + font-weight: 400; + } + + body { + background: var(--bg); + color: var(--fg); + font-family: "JetBrains Mono", "SF Mono", "Fira Code", monospace; + font-size: 14px; + line-height: 1.5; + min-height: 100vh; + overflow: hidden; + } + + ::-webkit-scrollbar { + width: 8px; + } + + ::-webkit-scrollbar-track { + background: var(--bg); + } + + ::-webkit-scrollbar-thumb { + background: var(--fg-dim); + border-radius: 4px; + } + + ::-webkit-scrollbar-thumb:hover { + background: var(--fg); + } + + .link { + color: var(--light-blue); + text-decoration: underline; + cursor: pointer; + } + + .link:hover { + color: var(--light-blue); + opacity: 0.8; + } + + a { + color: var(--light-blue); + text-decoration: none; + } + + a:hover { + opacity: 0.8; + } + + .color-green { + color: var(--accent); + } + .color-blue { + color: var(--blue); + } + .color-cyan { + color: var(--cyan); + } + .color-yellow { + color: var(--yellow); + } + .color-red { + color: var(--red); + } + .color-magenta { + color: var(--magenta); + } + .color-dim { + color: var(--fg-dim); + } + .bold { + font-weight: 700; + } + + #app { + display: flex; + flex-direction: column; + height: 100vh; + opacity: 0; + } + + #app.ready { + opacity: 1; + } + + #content { + flex: 1; + overflow: hidden; + } + + .page { + display: none; + height: 100%; + } + + .page.active { + display: flex; + } + + .tag { + border: none; + padding: 2px 8px; + font-size: 12px; + color: var(--bg); + background: var(--fg-dim); + } + + .tag.lang-zig { + background: #f7a41d; + } + .tag.lang-rust { + background: #dea584; + } + .tag.lang-c { + background: #a8b1c2; + } + .tag.lang-go { + background: #00add8; + } + .tag.lang-ts { + background: #3178c6; + color: #fff; + } + .tag.lang-python { + background: #3572a5; + color: #fff; + } + + .tag.tool-zed { + background: #084ccf; + color: #fff; + } + .tag.tool-neovim { + background: #57a143; + } + .tag.tool-opencode { + background: #af5faf; + color: #fff; + } + .tag.tool-linux { + background: #f7c94c; + } + .tag.tool-fish { + background: #d78700; + } + .tag.tool-ghostty { + background: #8b5cf6; + color: #fff; + } + + .tag.interest-lowlevel { + background: #d75f5f; + color: #fff; + } + .tag.interest-tui { + background: #5faf5f; + color: #0d0d0d; + } + .tag.interest-embedded { + background: #5fafaf; + color: #0d0d0d; + } + .tag.interest-unix { + background: #d7af5f; + color: #0d0d0d; + } + + .tag.tech-temporal { + background: #4c35c9; + color: #fff; + } + .tag.tech-postgres { + background: #336791; + color: #fff; + } + .tag.tech-pytorch { + background: #ee4c2c; + color: #fff; + } + .tag.tech-cuda { + background: #76b900; + } + .tag.tech-docker { + background: #2496ed; + color: #fff; + } + .tag.tech-kafka { + background: #4c35c9; + color: #fff; + } + .tag.tech-rn { + background: #61dafb; + } + .tag.tech-supabase { + background: #3ecf8e; + } + + @media (max-width: 768px) { + body { + font-size: 13px; + overflow-y: auto; + } + + #app { + display: flex; + flex-direction: column; + min-height: 100vh; + height: auto; + } + + #content { + flex: 1; + overflow: visible; + } + + .page { + height: auto; + min-height: calc(100vh - 60px - 24px); + } + + .page.active { + display: block; + } + } + + /* Boot Animation */ + #boot-overlay { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background: var(--bg); + z-index: 9999; + display: flex; + align-items: flex-start; + justify-content: flex-start; + padding: 20px; + overflow: hidden; + } + + #boot-overlay.fade-out { + animation: bootFadeOut 0.6s ease-out forwards; + } + + .boot-scanline { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient( + to bottom, + transparent 50%, + rgba(0, 0, 0, 0.1) 50% + ); + background-size: 100% 4px; + pointer-events: none; + opacity: 0.3; + z-index: 1; + } + + .boot-terminal { + font-family: "JetBrains Mono", monospace; + font-size: 14px; + color: var(--fg); + line-height: 1.6; + position: relative; + z-index: 2; + } + + .boot-content { + white-space: pre-wrap; + } + + .boot-line { + transition: + opacity 0.15s ease-out, + transform 0.15s ease-out; + } + + .boot-line-hidden { + opacity: 0; + transform: translateX(-10px); + } + + .boot-line-visible { + opacity: 1; + transform: translateX(0); + } + + .boot-cursor { + display: inline; + animation: blink 0.7s step-end infinite; + color: #ffffff; + } + + .boot-progress { + margin-top: 16px; + width: 200px; + height: 4px; + background: var(--border); + border-radius: 2px; + overflow: hidden; + } + + .boot-progress-bar { + height: 100%; + width: 0; + background: linear-gradient(90deg, var(--cyan), var(--accent)); + animation: progressFill 1s ease-out forwards; + } + + @keyframes progressFill { + 0% { + width: 0; + } + 100% { + width: 100%; + } + } + + /* ANSI colors */ + .ansi-bold-yellow { + color: #d7af5f; + font-weight: bold; + } + + .ansi-bold-cyan { + color: #5fafaf; + font-weight: bold; + } + + .ansi-accent { + color: var(--accent); + font-weight: bold; + } + + .ansi-bold-accent { + color: var(--accent); + font-weight: bold; + } + + .ansi-bold-green { + color: #5faf5f; + font-weight: bold; + } + + .ansi-white { + color: #e0e0e0; + } + + .ansi-dim { + color: #606060; + } + + /* Color blocks for neofetch */ + .ansi-block-black { + background: #0d0d0d; + } + .ansi-block-red { + background: #d75f5f; + } + .ansi-block-green { + background: #5faf5f; + } + .ansi-block-yellow { + background: #d7af5f; + } + .ansi-block-blue { + background: #5f87d7; + } + .ansi-block-magenta { + background: #af5faf; + } + .ansi-block-cyan { + background: #5fafaf; + } + .ansi-block-white { + background: #c0c0c0; + } + + @keyframes blink { + 0%, + 100% { + opacity: 1; + } + 50% { + opacity: 0; + } + } + + @keyframes bootFadeOut { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } + } + + #app.boot-reveal { + animation: revealContent 0.5s ease-out; + } + + @keyframes revealContent { + 0% { + opacity: 0; + transform: translateY(15px); + } + 100% { + opacity: 1; + transform: translateY(0); + } + } +</style> diff --git a/web/src/lib/blogs.ts b/web/src/lib/blogs.ts @@ -0,0 +1,52 @@ +import matter from "gray-matter"; +import { parseMarkdown } from "./readme/render"; +import type BlogPost from "./types/blog"; + +const blogModules = import.meta.glob<string>("../../blogs/*.md", { + eager: true, + query: "?raw", + import: "default", +}); + +const blogs = Object.values(blogModules) + .map((raw) => { + const { data, content } = matter(raw); + + const blog: Partial<BlogPost> = { + id: data.id as string | undefined, + title: data.title as string | undefined, + description: data.description as string | undefined, + date: + data.date instanceof Date + ? data.date.toISOString().split("T")[0] + : (data.date as string | undefined), + modifiedDate: data.modifiedDate + ? data.modifiedDate instanceof Date + ? data.modifiedDate.toISOString().split("T")[0] + : (data.modifiedDate as string) + : undefined, + url: data.url as string | undefined, + content: parseMarkdown(content), + image: data.image as string | undefined, + tags: data.tags as string[] | undefined, + }; + + const missingKeys = ["id", "title", "description", "date"].filter( + (key) => !blog[key as keyof typeof blog], + ); + if (missingKeys.length > 0) { + throw new Error(`Missing keys: ${missingKeys.join(", ")}`); + } + + if (blog.url && blog.content) { + throw new Error("Blogs cannot have both a URL and content"); + } else if (!blog.url && !blog.content) { + throw new Error("Blogs must have either a URL or content"); + } + + return blog as BlogPost; + }) + .filter((blog) => blog.id && blog.title) + .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()); + +export default blogs satisfies BlogPost[]; diff --git a/web/src/lib/readme/fetch.ts b/web/src/lib/readme/fetch.ts @@ -0,0 +1,132 @@ +import { parseMarkdown, removeFirstH1 } from "./render"; + +export async function fetchAllReadmes(): Promise<Record<string, string>> { + const readmes: Record<string, string> = {}; + + const results = await Promise.allSettled( + README_CONFIGS.map(async (config) => { + const result = await fetchWithFallback(config.sources); + if (result) { + const fixed = fixRelativePaths(result.content, result.baseUrl); + const html = parseMarkdown(removeFirstH1(fixed)); + return { name: config.name, html }; + } + return { name: config.name, html: "" }; + }), + ); + + for (const result of results) { + if (result.status === "fulfilled" && result.value.html) { + readmes[result.value.name] = result.value.html; + } + } + + return readmes; +} + +export async function fetchReadmeForProject( + projectId: string, +): Promise<string | null> { + const config = README_CONFIGS.find((c) => c.name === projectId); + if (!config) return null; + + const result = await fetchWithFallback(config.sources); + if (result) { + const fixed = fixRelativePaths(result.content, result.baseUrl); + return parseMarkdown(removeFirstH1(fixed)); + } + return null; +} + +async function fetchWithFallback(sources: ReadmeSource[]): Promise<{ + content: string; + baseUrl: string; +} | null> { + for (const source of sources) { + try { + const response = await fetch(source.url, { + headers: { "User-Agent": "prime8dev-portfolio" }, + }); + if (response.ok) { + return { + content: await response.text(), + baseUrl: source.baseUrl, + }; + } + } catch { + // Try next source + } + } + return null; +} + +function fixRelativePaths(markdown: string, baseUrl: string): string { + // Fix relative image paths: ![alt](./path) -> ![alt](baseUrl/path) + let fixed = markdown.replace( + /!\[([^\]]*)\]\(\.\/([^)]+)\)/g, + `![$1](${baseUrl}/$2)`, + ); + + // Fix relative link paths (not images): [text](./path) -> [text](baseUrl/path) + fixed = fixed.replace( + /(?<!!)\[([^\]]+)\]\(\.\/([^)]+)\)/g, + `[$1](${baseUrl}/$2)`, + ); + + return fixed; +} + +interface ReadmeConfig { + name: string; + sources: ReadmeSource[]; +} + +interface ReadmeSource { + url: string; + baseUrl: string; +} + +const README_CONFIGS: ReadmeConfig[] = [ + { + name: "janitor", + sources: [ + { + url: "https://git.prime8.dev/moncheeta/janitor/-/raw/master/README.md", + baseUrl: "https://git.prime8.dev/moncheeta/janitor/-/raw/master", + }, + ], + }, + { + name: "summarizer", + sources: [ + { + url: "https://git.prime8.dev/moncheeta/summarizer/-/raw/master/README.md", + baseUrl: "https://git.prime8.dev/moncheeta/summarizer/-/raw/master", + }, + ], + }, + { + name: "finger", + sources: [ + { + url: "https://git.prime8.dev/moncheeta/finger/-/raw/master/README.md", + baseUrl: "https://git.prime8.dev/moncheeta/finger/-/raw/master", + }, + ], + }, + { + name: "computer-science-club", + sources: [ + { + url: "https://raw.githubusercontent.com/moncheeta/computer-science-club/main/README.md", + baseUrl: + "https://cdn.jsdelivr.net/gh/moncheeta/computer-science-club@main", + }, + { + url: "https://raw.githubusercontent.com/moncheeta/computer-science-club/master/README.md", + baseUrl: + "https://cdn.jsdelivr.net/gh/moncheeta/computer-science-club@master", + }, + ], + }, +]; diff --git a/web/src/lib/readme/render.ts b/web/src/lib/readme/render.ts @@ -0,0 +1,149 @@ +import { marked } from "marked"; +import type { Tokens, RendererThis } from "marked"; + +export function parseMarkdown(markdown: string): string { + return marked.parse(markdown) as string; +} + +export function removeFirstH1(markdown: string): string { + return markdown.replace(/^#\s+.+\n+/, ""); +} + +const renderer = { + heading(this: RendererThis, token: Tokens.Heading): string { + const level = token.depth; + const tag = `h${level + 1}`; + const text = this.parser.parseInline(token.tokens); + return `<${tag} class="readme-h${level}">${text}</${tag}>`; + }, + + code(token: Tokens.Code): string { + const escaped = token.text.replace(/</g, "&lt;").replace(/>/g, "&gt;"); + return `<pre class="readme-code"><code>${escaped}</code></pre>`; + }, + + codespan(token: Tokens.Codespan): string { + const escaped = token.text.replace(/</g, "&lt;").replace(/>/g, "&gt;"); + return `<code class="readme-inline-code">${escaped}</code>`; + }, + + link(this: RendererThis, token: Tokens.Link): string { + const text = this.parser.parseInline(token.tokens); + return `<a href="${token.href}" target="_blank" rel="noopener noreferrer" class="readme-link">${text}</a>`; + }, + + image(token: Tokens.Image): string { + return `<img src="${token.href}" alt="${token.text || ""}" class="readme-img" loading="lazy" />`; + }, + + list(this: RendererThis, token: Tokens.List): string { + function renderList( + parser: RendererThis["parser"], + token: Tokens.List, + ): string { + const tag = token.ordered ? "ol" : "ul"; + const items = token.items + .map((item) => { + let content = ""; + for (const tok of item.tokens) { + if (tok.type === "paragraph" && "tokens" in tok && tok.tokens) { + content += parser.parseInline(tok.tokens as Tokens.Generic[]); + } else if (tok.type === "text") { + const textToken = tok as Tokens.Text; + if (textToken.tokens && textToken.tokens.length > 0) { + content += parser.parseInline(textToken.tokens); + } else { + const inlineTokens = marked.lexer( + textToken.raw || textToken.text, + { gfm: true }, + ); + if ( + inlineTokens.length > 0 && + inlineTokens[0].type === "paragraph" && + "tokens" in inlineTokens[0] + ) { + content += parser.parseInline( + (inlineTokens[0] as Tokens.Paragraph).tokens, + ); + } else { + content += textToken.text || ""; + } + } + } else if (tok.type === "list") { + content += renderList(parser, tok as Tokens.List); + } else { + content += parser.parse([tok as Tokens.Generic]); + } + } + return `<li>${content}</li>`; + }) + .join(""); + return `<${tag} class="readme-list">${items}</${tag}>`; + } + + return renderList(this.parser, token); + }, + + paragraph(this: RendererThis, token: Tokens.Paragraph): string { + const text = this.parser.parseInline(token.tokens); + return `<p class="readme-p">${text}</p>`; + }, + + table(this: RendererThis, token: Tokens.Table): string { + const headerCells = token.header + .map((h) => { + const text = this.parser.parseInline(h.tokens as Tokens.Generic[]); + return `<th>${text}</th>`; + }) + .join(""); + const bodyRows = token.rows + .map((row) => { + const cells = row + .map((cell) => { + const text = this.parser.parseInline( + cell.tokens as Tokens.Generic[], + ); + return `<td>${text}</td>`; + }) + .join(""); + return `<tr>${cells}</tr>`; + }) + .join(""); + return `<table class="readme-table"><thead><tr>${headerCells}</tr></thead><tbody>${bodyRows}</tbody></table>`; + }, + + blockquote(this: RendererThis, token: Tokens.Blockquote): string { + const text = this.parser.parse(token.tokens); + return `<blockquote class="readme-blockquote">${text}</blockquote>`; + }, + + hr(): string { + return "<hr />"; + }, + + strong(this: RendererThis, token: Tokens.Strong): string { + const text = this.parser.parseInline(token.tokens); + return `<strong>${text}</strong>`; + }, + + em(this: RendererThis, token: Tokens.Em): string { + const text = this.parser.parseInline(token.tokens); + return `<em>${text}</em>`; + }, + + del(this: RendererThis, token: Tokens.Del): string { + const text = this.parser.parseInline(token.tokens); + return `<del>${text}</del>`; + }, + + text(token: Tokens.Text | Tokens.Escape): string { + return token.text; + }, +}; + +marked.use({ renderer }); + +marked.setOptions({ + gfm: true, + breaks: true, +}); diff --git a/web/src/lib/schemas/blog.ts b/web/src/lib/schemas/blog.ts @@ -0,0 +1,61 @@ +import type Blog from "../types/blog"; +import personSchema from "./person"; +import { URL } from "../../constants/website"; + +export function getSchemaForBlog(blog: Blog) { + const schema: Record<string, unknown> = { + "@context": "https://schema.org", + "@type": "BlogPosting", + headline: blog.title, + description: blog.description, + datePublished: blog.date, + dateModified: blog.modifiedDate || blog.date, + url: `${URL}/blog/${blog.id}`, + author: personSchema, + publisher: personSchema, + mainEntityOfPage: { + "@type": "WebPage", + "@id": `${URL}/blog/${blog.id}`, + }, + articleSection: "Technology", + }; + + if (blog.image) { + schema.image = blog.image.startsWith("http") + ? blog.image + : `${URL}${blog.image}`; + } + + if (blog.tags && blog.tags.length > 0) { + schema.keywords = blog.tags.join(", "); + } + + return schema; +} + +export function getBreadcrumbSchema(blog: Blog) { + return { + "@context": "https://schema.org", + "@type": "BreadcrumbList", + itemListElement: [ + { + "@type": "ListItem", + position: 1, + name: "Home", + item: URL, + }, + { + "@type": "ListItem", + position: 2, + name: "Blog", + item: `${URL}/#blog`, + }, + { + "@type": "ListItem", + position: 3, + name: blog.title, + item: `${URL}/blog/${blog.id}`, + }, + ], + }; +} diff --git a/web/src/lib/schemas/experience.ts b/web/src/lib/schemas/experience.ts @@ -0,0 +1,54 @@ +import type Experience from "../types/experience"; +import personSchema from "./person"; +import { URL } from "../../constants/website"; + +export function getSchemaForExperience(experience: Experience) { + return { + "@context": "https://schema.org", + "@type": "Person", + name: personSchema.name, + url: personSchema.url, + worksFor: { + "@type": "Organization", + name: experience.company, + url: experience.url, + }, + hasOccupation: { + "@type": "Occupation", + name: experience.role, + startDate: experience.startDate, + ...(experience.endDate && { endDate: experience.endDate }), + occupationLocation: { + "@type": "City", + name: "Remote", + }, + }, + }; +} + +export function getBreadcrumbSchema(experience: Experience) { + return { + "@context": "https://schema.org", + "@type": "BreadcrumbList", + itemListElement: [ + { + "@type": "ListItem", + position: 1, + name: "Home", + item: URL, + }, + { + "@type": "ListItem", + position: 2, + name: "Experience", + item: `${URL}/#experience`, + }, + { + "@type": "ListItem", + position: 3, + name: experience.company, + item: `${URL}/experience/${experience.id}`, + }, + ], + }; +} diff --git a/web/src/lib/schemas/person.ts b/web/src/lib/schemas/person.ts @@ -0,0 +1,24 @@ +import about from "../../../config/about.json"; +import currentJob from "../utils/job"; +import contact from "../../../config/contact.json"; +import { URL } from "../../constants/website"; + +export default { + "@context": "https://schema.org", + "@type": "Person", + name: about.name, + alternateName: about.handle, + email: contact.email, + sameAs: [contact.gitlab, contact.linkedin], + url: URL, + image: `${URL}/me.jpg`, + ...(currentJob && { + jobTitle: currentJob.role, + worksFor: { + "@type": "Organization", + name: currentJob.company, + url: currentJob.url, + }, + }), + knowsAbout: [...about.interests], +}; diff --git a/web/src/lib/schemas/project.ts b/web/src/lib/schemas/project.ts @@ -0,0 +1,45 @@ +import type Project from "../types/project"; +import personSchema from "./person"; +import { URL } from "../../constants/website"; + +export function getSchemaForProject(project: Project) { + return { + "@context": "https://schema.org", + "@type": "SoftwareSourceCode", + name: project.name, + description: project.subtitle, + url: `${URL}/projects/${project.id}`, + codeRepository: project.url, + programmingLanguage: project.tech, + author: personSchema, + ...(project.dateCreated && { dateCreated: project.dateCreated }), + ...(project.dateModified && { dateModified: project.dateModified }), + }; +} + +export function getBreadcrumbSchema(project: Project) { + return { + "@context": "https://schema.org", + "@type": "BreadcrumbList", + itemListElement: [ + { + "@type": "ListItem", + position: 1, + name: "Home", + item: URL, + }, + { + "@type": "ListItem", + position: 2, + name: "Projects", + item: `${URL}/#projects`, + }, + { + "@type": "ListItem", + position: 3, + name: project.name, + item: `${URL}/projects/${project.id}`, + }, + ], + }; +} diff --git a/web/src/lib/schemas/website.ts b/web/src/lib/schemas/website.ts @@ -0,0 +1,13 @@ +import about from "../../../config/about.json"; +import { URL } from "../../constants/website"; +import currentJob from "../utils/job"; +import personSchema from "./person"; + +export default { + "@context": "https://schema.org", + "@type": "WebSite", + name: about.name, + url: URL, + description: `Portfolio and blog of ${about.name}, a ${about.profession.toLowerCase()}${currentJob?.company ? ` at ${currentJob.company}` : ""}. ${about.bio}.`, + author: personSchema, +}; diff --git a/web/src/lib/types/about.ts b/web/src/lib/types/about.ts @@ -0,0 +1,11 @@ +export default interface About { + name: string; + handle: string; + bio: string; + location: string; + school?: string; + graduating?: string; + languages: string[]; + interests: string[]; + tools: string[]; +} diff --git a/web/src/lib/types/blog.ts b/web/src/lib/types/blog.ts @@ -0,0 +1,11 @@ +export default interface Blog { + id: string; + title: string; + description: string; + date: string; + modifiedDate?: string; + content?: string; + url?: string; + image?: string; + tags?: string[]; +} diff --git a/web/src/lib/types/contact.ts b/web/src/lib/types/contact.ts @@ -0,0 +1,5 @@ +export default interface Contact { + email: string; + gitlab: string; + linkedin: string; +} diff --git a/web/src/lib/types/experience.ts b/web/src/lib/types/experience.ts @@ -0,0 +1,13 @@ +export default interface Experience { + id: string; + company: string; + role: string; + startDate: string; + endDate?: string; + description: string[]; + tech: string[]; + url: string; + logo: string; + logoFilter?: string; + images?: string[]; +} diff --git a/web/src/lib/types/project.ts b/web/src/lib/types/project.ts @@ -0,0 +1,9 @@ +export default interface Project { + id: string; + name: string; + subtitle: string; + tech: string[]; + url: string; + dateCreated?: string; + dateModified?: string; +} diff --git a/web/src/lib/utils/duration.ts b/web/src/lib/utils/duration.ts @@ -0,0 +1,11 @@ +export function formatDuration(seconds: number): string { + const hours = Math.floor(seconds / 3600); + const minutes = Math.floor((seconds % 3600) / 60); + + if (hours > 0) { + return `${hours}h ${minutes}m`; + } else if (minutes > 0) { + return `${minutes}m`; + } + return "0m"; +} diff --git a/web/src/lib/utils/job.ts b/web/src/lib/utils/job.ts @@ -0,0 +1,8 @@ +import rawExperiences from "../../../config/experience.json"; +import type Experience from "../types/experience"; + +const experiences = rawExperiences as Experience[]; + +const currentJob = experiences.find((exp) => !exp.endDate) || null; + +export default currentJob; diff --git a/web/src/lib/utils/period.ts b/web/src/lib/utils/period.ts @@ -0,0 +1,37 @@ +export function formatPeriod(startDate: string, endDate?: string): string { + const months = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + ]; + const [startYear, startMonth] = startDate.split("-").map(Number); + const startStr = `${months[startMonth - 1]} ${startYear}`; + + if (!endDate) { + const totalMonths = calculateMonths(startDate); + return `${startStr} – Present (${totalMonths} mos)`; + } + + const [endYear, endMonth] = endDate.split("-").map(Number); + const endStr = `${months[endMonth - 1]} ${endYear}`; + const totalMonths = calculateMonths(startDate, endDate); + return `${startStr} – ${endStr} (${totalMonths} mos)`; +} + +export function calculateMonths(startDate: string, endDate?: string): number { + const [startYear, startMonth] = startDate.split("-").map(Number); + const end = endDate + ? endDate.split("-").map(Number) + : [new Date().getFullYear(), new Date().getMonth() + 1]; + const [endYear, endMonth] = end; + return (endYear - startYear) * 12 + (endMonth - startMonth) + 1; +} diff --git a/web/src/lib/utils/tags.ts b/web/src/lib/utils/tags.ts @@ -0,0 +1,12 @@ +import { TAG_CLASS_MAP, TECH_ABBREVIATIONS } from "../../constants/tags"; + +export function getTagClass(tag: string): string { + return TAG_CLASS_MAP[tag] || ""; +} + +export function getTechMeta(tech: string[]): string { + return tech + .slice(0, 2) + .map((t) => TECH_ABBREVIATIONS[t] || t) + .join(", "); +} diff --git a/web/src/lib/wakatime.ts b/web/src/lib/wakatime.ts @@ -0,0 +1,159 @@ +import { DAY_NAMES, MONTH_NAMES } from "../constants/calendar"; +import { formatDuration } from "./utils/duration"; + +const WAKATIME_API_BASE = "https://wakatime.com/api/v1"; + +const WAKATIME_API_KEY = import.meta.env.WAKATIME_API_KEY; + +export interface WakaTimeData { + allTimeStats: AllTimeStats | null; + weeklyStats: WeeklyStats | null; +} + +export async function fetchWakaTimeData(): Promise<WakaTimeData | null> { + if (!WAKATIME_API_KEY) { + return null; + } + + try { + const [allTimeStats, weeklyStats] = await Promise.all([ + fetchAllTimeStats(), + fetchWeeklyStats(), + ]); + + return { allTimeStats, weeklyStats }; + } catch (error) { + console.error("Failed to fetch WakaTime data:", error); + return null; + } +} + +export interface AllTimeStats { + totalText: string; + dailyAverageText: string; +} + +export async function fetchAllTimeStats(): Promise<AllTimeStats | null> { + try { + const [statsResponse, languagesResponse] = [ + await fetch(`${WAKATIME_API_BASE}/users/current/all_time_since_today`, { + headers: { + Authorization: `Basic ${Buffer.from(WAKATIME_API_KEY).toString("base64")}`, + }, + }), + await fetch(`${WAKATIME_API_BASE}/users/current/stats/last_year`, { + headers: { + Authorization: `Basic ${Buffer.from(WAKATIME_API_KEY).toString("base64")}`, + }, + }), + ]; + if ([statsResponse, languagesResponse].some((r) => !r.ok)) { + return null; + } + + const [statsData, langData] = await Promise.all( + [statsResponse, languagesResponse].map((r) => r.json()), + ); + + let dailyAverageText = "1 hr"; + if (langData.data?.daily_average_including_other_language) { + const avgSeconds = langData.data.daily_average_including_other_language; + dailyAverageText = formatDuration(avgSeconds); + } + + const totalSeconds = statsData.data?.total_seconds || 0; + const totalHours = Math.floor(totalSeconds / 3600); + const totalText = `${totalHours.toLocaleString()}+ hrs coded`; + + return { + totalText, + dailyAverageText, + }; + } catch (error) { + console.error("Failed to fetch WakaTime stats:", error); + return null; + } +} + +export interface WeeklyStats { + totalText: string; + days: DailyEntry[]; +} + +export interface DailyEntry { + dayText: string; // e.g., "Mon", "Tue" + dateText: string; // e.g., "Jan 10" + timeText: string; // e.g., "2 hrs 30 mins" + barWidthPercent: string; // e.g., "75%" +} + +export async function fetchWeeklyStats(): Promise<WeeklyStats | null> { + try { + const start = new Date(); + start.setDate(start.getDate() - 6); // 7 days including today + const end = new Date(); + + const formatDate = (d: Date) => d.toISOString().split("T")[0]; + + const response = await fetch( + `${WAKATIME_API_BASE}/users/current/summaries?start=${formatDate(start)}&end=${formatDate(end)}`, + { + headers: { + Authorization: `Basic ${Buffer.from(WAKATIME_API_KEY).toString("base64")}`, + }, + }, + ); + + if (!response.ok) { + console.error("WakaTime weekly stats error:", response.status); + return null; + } + + const { data } = await response.json(); + + let totalSeconds = 0; + let maxMinutes = 0; + + const minutesPerDay: number[] = []; + const days: DailyEntry[] = (data || []).map( + ( + { + range, + grand_total, + }: { + range: { date: string }; + grand_total: { total_seconds?: number }; + }, + i: number, + ) => { + const date = new Date(range.date); + const dayText = DAY_NAMES[date.getUTCDay()].slice(0, 3); + const dateText = `${MONTH_NAMES[date.getUTCMonth()].slice(0, 3)} ${date.getUTCDate()}`; + + const seconds = grand_total?.total_seconds || 0; + totalSeconds += seconds; + + const totalMinutes = Math.floor(seconds / 60); + minutesPerDay[i] = totalMinutes; + if (totalMinutes > maxMinutes) maxMinutes = totalMinutes; + + const timeText = formatDuration(seconds); + + return { dayText, dateText, timeText, barWidthPercent: "0%" }; + }, + ); + + const effectiveMax = maxMinutes || 1; + for (let i = 0; i < days.length; i++) { + days[i].barWidthPercent = + `${Math.round((minutesPerDay[i] / effectiveMax) * 100)}%`; + } + + const totalText = formatDuration(totalSeconds); + + return { totalText, days }; + } catch (error) { + console.error("Failed to fetch weekly stats:", error); + return null; + } +} diff --git a/web/src/pages/404.astro b/web/src/pages/404.astro @@ -0,0 +1,78 @@ +--- +import Layout from "../layouts/Layout.astro"; +import about from "../../config/about.json"; +import { URL } from "../constants/website"; +--- + +<Layout + title={`404 - Page Not Found | ${about.name}`} + description="The page you're looking for doesn't exist." + type="website" + url={`${URL}/404`} +> + <main class="error-page"> + <div class="error-content"> + <h1>404</h1> + <p class="error-message">Page not found</p> + <p class="error-description"> + The page you're looking for doesn't exist or has been moved. + </p> + <a href="/" class="home-link">← Return home</a> + </div> + </main> +</Layout> + +<style> + .error-page { + display: flex; + align-items: center; + justify-content: center; + min-height: 100vh; + padding: 24px; + } + + .error-content { + text-align: center; + } + + h1 { + font-size: 72px; + font-weight: 400; + color: var(--accent); + margin-bottom: 8px; + } + + .error-message { + font-size: 24px; + color: var(--fg); + margin-bottom: 16px; + } + + .error-description { + color: var(--fg-dim); + margin-bottom: 32px; + } + + .home-link { + display: inline-block; + color: var(--light-blue); + padding: 8px 16px; + border: 1px solid var(--border); + transition: border-color 0.2s; + } + + .home-link:hover { + border-color: var(--light-blue); + opacity: 1; + } + + @media (max-width: 768px) { + h1 { + font-size: 48px; + } + + .error-message { + font-size: 18px; + } + } +</style> diff --git a/web/src/pages/blog/[slug].astro b/web/src/pages/blog/[slug].astro @@ -0,0 +1,77 @@ +--- +import Layout from "../../layouts/Layout.astro"; +import BlogArticle from "../../components/Article.astro"; +import blogs from "../../lib/blogs"; +import { getSchemaForBlog, getBreadcrumbSchema } from "../../lib/schemas/blog"; + +const blog = blogs.find((blog) => blog.id === Astro.params.slug); +if (!blog) { + return new Response(null, { + status: 404, + statusText: "Not Found", + }); +} + +const keywords = blog.tags?.join(", "); +--- + +<Layout + title={`${blog.title} | Damian Myrda`} + description={blog.description} + type="article" + url={`https://prime8.dev/blog/${blog.id}`} + publishedTime={blog.date} + modifiedTime={blog.modifiedDate || blog.date} + keywords={keywords} + image={blog.image} +> + <main id="content"> + <div class="blog-page"> + <BlogArticle blog={blog} /> + </div> + <div id="blog-data" data-blog-id={blog.id}></div> + <script + type="application/ld+json" + set:html={JSON.stringify(getSchemaForBlog(blog))} + /> + <script + type="application/ld+json" + set:html={JSON.stringify(getBreadcrumbSchema(blog))} + /> + </main> +</Layout> + +<script> + document.getElementById("app")?.classList.add("ready"); +</script> + +<style> + :global(body) { + overflow: auto; + } + + :global(#app) { + height: auto; + min-height: 100vh; + } + + :global(#content) { + overflow: visible; + } + + .blog-page { + max-width: 720px; + margin: 0 auto; + padding: 40px 24px; + min-height: 100vh; + } +</style> + +<script> + import { setCurrentBlogId } from "../../scripts/ui/state"; + + document.addEventListener("DOMContentLoaded", () => { + const blogId = document.getElementById("blog-data")?.dataset.blogId; + if (blogId) setCurrentBlogId(blogId); + }); +</script> diff --git a/web/src/pages/experience/[id].astro b/web/src/pages/experience/[id].astro @@ -0,0 +1,309 @@ +--- +import Layout from "../../layouts/Layout.astro"; +import rawExperience from "../../../config/experience.json"; +import type Experience from "../../lib/types/experience"; +import { URL } from "../../constants/website"; +import { getTagClass } from "../../lib/utils/tags"; +import { + getSchemaForExperience, + getBreadcrumbSchema, +} from "../../lib/schemas/experience"; + +const experiences = rawExperience as Experience[]; +const experience = experiences.find((e) => e.id === Astro.params.id); + +if (!experience) { + return new Response(null, { + status: 404, + statusText: "Not Found", + }); +} + +function formatDate(dateStr: string): string { + const [year, month] = dateStr.split("-"); + const date = new Date(parseInt(year), parseInt(month) - 1); + return date.toLocaleDateString("en-US", { month: "short", year: "numeric" }); +} + +const dateRange = experience.endDate + ? `${formatDate(experience.startDate)} - ${formatDate(experience.endDate)}` + : `${formatDate(experience.startDate)} - Present`; + +const keywords = [...experience.tech, experience.company, experience.role].join( + ", ", +); +const description = `${experience.role} at ${experience.company}. ${experience.description[0]}`; +--- + +<Layout + title={`${experience.company} - ${experience.role} | Damian Myrda`} + description={description} + type="website" + url={`${URL}/experience/${experience.id}`} + keywords={keywords} + image={experience.logo} +> + <main id="content"> + <div class="experience-page"> + <a href="/#experience" class="back-btn">← Back to experience</a> + + <header class="experience-header"> + <div class="header-top"> + <div class="company-info"> + { + experience.logo && ( + <img + src={experience.logo} + alt={`${experience.company} logo`} + class={`company-logo ${experience.logoFilter || ""}`} + width="48" + height="48" + /> + ) + } + <div> + <h1>{experience.company}</h1> + <p class="role">{experience.role}</p> + </div> + </div> + <a + class="external-link" + href={experience.url} + target="_blank" + rel="noopener noreferrer" + > + Visit website → + </a> + </div> + <time class="date-range" datetime={experience.startDate} + >{dateRange}</time + > + </header> + + <section class="description"> + {experience.description.map((paragraph) => <p>{paragraph}</p>)} + </section> + + <section class="tech-section"> + <h2>Technologies</h2> + <div class="tech-stack"> + { + experience.tech.map((tech) => ( + <span class={`tag ${getTagClass(tech)}`}>{tech}</span> + )) + } + </div> + </section> + + { + experience.images && experience.images.length > 0 && ( + <section class="images-section"> + <h2>Photos</h2> + <div class="image-grid"> + {experience.images.map((img, i) => ( + <img + src={img} + alt={`${experience.company} photo ${i + 1}`} + class="experience-image" + loading="lazy" + /> + ))} + </div> + </section> + ) + } + </div> + <script + type="application/ld+json" + set:html={JSON.stringify(getSchemaForExperience(experience))} + /> + <script + type="application/ld+json" + set:html={JSON.stringify(getBreadcrumbSchema(experience))} + /> + </main> +</Layout> + +<script> + document.getElementById("app")?.classList.add("ready"); +</script> + +<style> + :global(body) { + overflow: auto; + } + + :global(#app) { + height: auto; + min-height: 100vh; + } + + :global(#content) { + overflow: visible; + } + + .experience-page { + max-width: 800px; + margin: 0 auto; + padding: 40px 24px; + min-height: 100vh; + } + + .back-btn { + display: inline-block; + background: transparent; + border: 1px solid var(--border); + color: var(--fg-dim); + padding: 8px 16px; + cursor: pointer; + font-family: inherit; + font-size: 12px; + margin-bottom: 24px; + transition: all 0.15s; + text-decoration: none; + } + + .back-btn:hover { + background: var(--bg-alt); + color: var(--accent); + border-color: var(--accent); + } + + .experience-header { + margin-bottom: 32px; + padding-bottom: 24px; + border-bottom: 1px solid var(--border); + } + + .header-top { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 12px; + } + + .company-info { + display: flex; + align-items: center; + gap: 16px; + } + + .company-logo { + width: 48px; + height: 48px; + object-fit: contain; + } + + .company-logo.logo-invert { + filter: invert(1); + } + + .experience-header h1 { + font-size: 28px; + font-weight: 500; + color: var(--accent); + margin: 0; + } + + .role { + color: var(--fg); + font-size: 16px; + margin: 4px 0 0 0; + } + + .external-link { + color: var(--light-blue); + text-decoration: none; + font-size: 14px; + } + + .external-link:hover { + opacity: 0.8; + } + + .date-range { + color: var(--fg-dim); + font-size: 14px; + } + + .description { + margin-bottom: 32px; + } + + .description p { + color: var(--fg); + font-size: 14px; + line-height: 1.7; + margin-bottom: 12px; + } + + .description p:last-child { + margin-bottom: 0; + } + + .tech-section { + margin-bottom: 32px; + } + + .tech-section h2, + .images-section h2 { + font-size: 16px; + color: var(--accent); + margin-bottom: 12px; + font-weight: 500; + } + + .tech-stack { + display: flex; + flex-wrap: wrap; + gap: 8px; + } + + .images-section { + margin-bottom: 32px; + } + + .image-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 16px; + } + + .experience-image { + width: 100%; + height: auto; + border-radius: 4px; + border: 1px solid var(--border); + cursor: pointer; + transition: transform 0.15s; + } + + .experience-image:hover { + transform: scale(1.02); + } + + @media (max-width: 768px) { + .experience-page { + padding: 24px 16px; + } + + .header-top { + flex-direction: column; + gap: 16px; + } + + .company-info { + flex-direction: column; + align-items: flex-start; + gap: 12px; + } + + .experience-header h1 { + font-size: 22px; + } + + .image-grid { + grid-template-columns: 1fr; + } + } +</style> diff --git a/web/src/pages/index.astro b/web/src/pages/index.astro @@ -0,0 +1,63 @@ +--- +import Layout from "../layouts/Layout.astro"; +import { fetchWakaTimeData } from "../lib/wakatime"; +import { fetchAllReadmes } from "../lib/readme/fetch"; + +import about from "../../config/about.json"; +import currentJob from "../lib/utils/job"; +import personSchema from "../lib/schemas/person"; +import websiteSchema from "../lib/schemas/website"; +import { URL } from "../constants/website"; + +import Header from "../components/Header.astro"; +import AboutPage from "../components/pages/About.astro"; +import ExperiencePage from "../components/pages/Experience.astro"; +import ProjectsPage from "../components/pages/Projects.astro"; +import BlogPage from "../components/pages/Blog.astro"; +import Footer from "../components/Footer.astro"; + +const [wakaTimeData, readmes] = await Promise.all([ + fetchWakaTimeData(), + fetchAllReadmes(), +]); +--- + +<Layout + title={`${about.name} | ${about.profession_short}`} + description={`${about.name} - ${about.profession}${currentJob?.company ? ` at ${currentJob.company}` : ""}`} + type="website" + url={URL} + keywords={[ + about.name, + about.profession, + currentJob?.company, + about.languages, + about.interests, + about.school, + ] + .flat() + .filter(Boolean) + .join(", ")} +> + <Header /> + + <main id="content"> + <AboutPage wakaTimeData={wakaTimeData} /> + <ExperiencePage /> + <ProjectsPage readmes={readmes} /> + <BlogPage isStandalone={false} /> + </main> + + <Footer wakaTimeData={wakaTimeData} /> + + <script type="application/ld+json" set:html={JSON.stringify(personSchema)} /> + <script type="application/ld+json" set:html={JSON.stringify(websiteSchema)} /> +</Layout> + +<script> + import { initUI } from "../scripts/ui/index"; + + document.addEventListener("DOMContentLoaded", () => { + initUI(); + }); +</script> diff --git a/web/src/pages/projects/[id].astro b/web/src/pages/projects/[id].astro @@ -0,0 +1,275 @@ +--- +import Layout from "../../layouts/Layout.astro"; +import rawProjects from "../../../config/projects.json"; +import type Project from "../../lib/types/project"; +import { URL } from "../../constants/website"; +import { getTagClass } from "../../lib/utils/tags"; +import { fetchReadmeForProject } from "../../lib/readme/fetch"; +import { + getSchemaForProject, + getBreadcrumbSchema, +} from "../../lib/schemas/project"; + +const projects = rawProjects as Project[]; +const project = projects.find((p) => p.id === Astro.params.id); + +if (!project) { + return new Response(null, { + status: 404, + statusText: "Not Found", + }); +} + +const readme = await fetchReadmeForProject(project.id); +const keywords = project.tech.join(", "); +--- + +<Layout + title={`${project.name} | Damian Myrda`} + description={project.subtitle} + type="website" + url={`${URL}/projects/${project.id}`} + keywords={keywords} +> + <main id="content"> + <div class="project-page"> + <a href="/#projects" class="back-btn">← Back to projects</a> + + <header class="project-header"> + <div class="header-top"> + <h1>{project.name}</h1> + <a + class="external-link" + href={project.url} + target="_blank" + rel="noopener noreferrer" + > + {project.url.includes("github.com") ? "GitHub" : "GitLab"} → + </a> + </div> + <p class="subtitle">{project.subtitle}</p> + <div class="tech-stack"> + { + project.tech.map((tech) => ( + <span class={`tag ${getTagClass(tech)}`}>{tech}</span> + )) + } + </div> + </header> + + <div class="readme-content"> + { + readme ? ( + <Fragment set:html={readme} /> + ) : ( + <p class="color-dim">README not available</p> + ) + } + </div> + </div> + <script + type="application/ld+json" + set:html={JSON.stringify(getSchemaForProject(project))} + /> + <script + type="application/ld+json" + set:html={JSON.stringify(getBreadcrumbSchema(project))} + /> + </main> +</Layout> + +<script> + document.getElementById("app")?.classList.add("ready"); +</script> + +<style> + :global(body) { + overflow: auto; + } + + :global(#app) { + height: auto; + min-height: 100vh; + } + + :global(#content) { + overflow: visible; + } + + .project-page { + max-width: 800px; + margin: 0 auto; + padding: 40px 24px; + min-height: 100vh; + } + + .back-btn { + display: inline-block; + background: transparent; + border: 1px solid var(--border); + color: var(--fg-dim); + padding: 8px 16px; + cursor: pointer; + font-family: inherit; + font-size: 12px; + margin-bottom: 24px; + transition: all 0.15s; + text-decoration: none; + } + + .back-btn:hover { + background: var(--bg-alt); + color: var(--accent); + border-color: var(--accent); + } + + .project-header { + margin-bottom: 32px; + padding-bottom: 24px; + border-bottom: 1px solid var(--border); + } + + .header-top { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 8px; + } + + .project-header h1 { + font-size: 28px; + font-weight: 500; + color: var(--accent); + margin: 0; + } + + .external-link { + color: var(--light-blue); + text-decoration: none; + font-size: 14px; + } + + .external-link:hover { + opacity: 0.8; + } + + .subtitle { + color: var(--fg-dim); + font-size: 14px; + margin-bottom: 16px; + } + + .tech-stack { + display: flex; + flex-wrap: wrap; + gap: 8px; + } + + .readme-content { + font-size: 14px; + line-height: 1.7; + color: var(--fg); + } + + .readme-content :global(p) { + margin-bottom: 16px; + } + + .readme-content :global(h2), + .readme-content :global(.readme-h1) { + font-size: 20px; + color: var(--accent); + margin: 32px 0 12px; + font-weight: 600; + } + + .readme-content :global(h2:first-child), + .readme-content :global(.readme-h1:first-child) { + margin-top: 0; + } + + .readme-content :global(h3), + .readme-content :global(.readme-h2) { + font-size: 17px; + color: var(--accent); + margin: 24px 0 10px; + font-weight: 500; + } + + .readme-content :global(pre) { + display: block; + background: var(--bg-alt); + border: 1px solid var(--border); + padding: 16px; + margin: 16px 0; + overflow-x: auto; + font-size: 13px; + line-height: 1.5; + } + + .readme-content :global(pre code) { + background: none; + padding: 0; + font-size: inherit; + } + + .readme-content :global(code) { + background: var(--bg-alt); + padding: 2px 6px; + font-size: 13px; + border-radius: 2px; + } + + .readme-content :global(a) { + color: var(--light-blue); + text-decoration: none; + } + + .readme-content :global(a:hover) { + opacity: 0.8; + } + + .readme-content :global(ul), + .readme-content :global(ol) { + margin: 12px 0; + padding-left: 24px; + } + + .readme-content :global(li) { + margin-bottom: 8px; + } + + .readme-content :global(blockquote) { + border-left: 3px solid var(--accent); + margin: 16px 0; + padding: 12px 20px; + color: var(--fg-dim); + background: var(--bg-alt); + } + + .readme-content :global(img) { + max-width: 100%; + height: auto; + margin: 16px 0; + } + + @media (max-width: 768px) { + .project-page { + padding: 24px 16px; + } + + .header-top { + flex-direction: column; + align-items: flex-start; + gap: 12px; + } + + .project-header h1 { + font-size: 22px; + } + + .readme-content { + font-size: 13px; + } + } +</style> diff --git a/web/src/pages/sitemap.xml.ts b/web/src/pages/sitemap.xml.ts @@ -0,0 +1,70 @@ +import type { APIRoute } from "astro"; +import blogs from "../lib/blogs"; +import rawProjects from "../../config/projects.json"; +import rawExperience from "../../config/experience.json"; +import type Project from "../lib/types/project"; +import type Experience from "../lib/types/experience"; + +const projects = rawProjects as Project[]; +const experiences = rawExperience as Experience[]; +const siteUrl = "https://prime8.dev"; + +export const GET: APIRoute = () => { + const now = new Date().toISOString().split("T")[0]; + + // Static pages + const staticPages = [ + { url: "/", changefreq: "weekly", priority: "1.0", lastmod: now }, + ]; + + // Project pages + const projectPages = projects.map((project) => ({ + url: `/projects/${project.id}`, + changefreq: "monthly", + priority: "0.7", + lastmod: project.dateModified || project.dateCreated || now, + })); + + // Experience pages + const experiencePages = experiences.map((experience) => ({ + url: `/experience/${experience.id}`, + changefreq: "monthly", + priority: "0.7", + lastmod: experience.endDate || experience.startDate || now, + })); + + // Blog posts + const blogPages = blogs.map((blog) => ({ + url: `/blog/${blog.id}`, + changefreq: "monthly", + priority: "0.8", + lastmod: blog.date, + })); + + const allPages = [ + ...staticPages, + ...projectPages, + ...experiencePages, + ...blogPages, + ]; + + const sitemap = `<?xml version="1.0" encoding="UTF-8"?> +<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> +${allPages + .map( + (page) => ` <url> + <loc>${siteUrl}${page.url}</loc> + <lastmod>${page.lastmod || now}</lastmod> + <changefreq>${page.changefreq}</changefreq> + <priority>${page.priority}</priority> + </url>`, + ) + .join("\n")} +</urlset>`; + + return new Response(sitemap, { + headers: { + "Content-Type": "application/xml", + }, + }); +}; diff --git a/web/src/scripts/ui/blog.ts b/web/src/scripts/ui/blog.ts @@ -0,0 +1,58 @@ +import { selectedIndex, setCurrentBlogId } from "./state"; +import { updateUrl } from "./url"; + +export function setupBlogNavigation(): void { + document.querySelectorAll("#blog .blog-list-item").forEach((item) => { + item.addEventListener("click", () => { + const blogId = item.getAttribute("data-id"); + if (blogId) { + const index = parseInt(item.getAttribute("data-index") || "0"); + selectedIndex.blog = index; + + document.querySelectorAll("#blog .blog-list-item").forEach((li, i) => { + li.classList.toggle("selected", i === index); + }); + + openBlogPost(blogId); + } + }); + }); + + const listItems = document.querySelectorAll("#blog .blog-list-item"); + if (listItems.length > 0) { + listItems[0].classList.add("selected"); + } +} + +export function openBlogPost(blogId: string): void { + setCurrentBlogId(blogId); + + const listView = document.getElementById("blog-list-view"); + const postView = document.getElementById("blog-post-view"); + + if (listView && postView) { + listView.classList.add("hidden"); + postView.classList.remove("hidden"); + + document.querySelectorAll(".blog-post").forEach((post) => { + post.classList.toggle( + "hidden", + post.getAttribute("data-blog-id") !== blogId, + ); + }); + } + + updateUrl(); +} + +export function closeBlogPost(): void { + setCurrentBlogId(null); + + const listView = document.getElementById("blog-list-view"); + const postView = document.getElementById("blog-post-view"); + + if (listView && postView) { + listView.classList.remove("hidden"); + postView.classList.add("hidden"); + } +} diff --git a/web/src/scripts/ui/boot.ts b/web/src/scripts/ui/boot.ts @@ -0,0 +1,177 @@ +interface SystemInfo { + platform: string; + browser: string; + screen: string; + locale: string; + uptime: string; + timezone: string; +} + +function getSystemInfo(): SystemInfo { + const ua = navigator.userAgent; + + let platform = "Unknown"; + if (ua.includes("Mac")) platform = "Darwin"; + else if (ua.includes("Win")) platform = "Windows"; + else if (ua.includes("Linux")) platform = "Linux"; + else if (ua.includes("Android")) platform = "Android"; + else if (ua.includes("iPhone") || ua.includes("iPad")) platform = "iOS"; + + let browser = "Unknown"; + if (ua.includes("Firefox")) browser = "Firefox"; + else if (ua.includes("Edg")) browser = "Edge"; + else if (ua.includes("Chrome")) browser = "Chrome"; + else if (ua.includes("Safari")) browser = "Safari"; + + const screen = `${window.screen.width}x${window.screen.height}`; + const locale = navigator.language || "en-US"; + + const now = new Date(); + const hours = now.getHours().toString().padStart(2, "0"); + const minutes = now.getMinutes().toString().padStart(2, "0"); + const seconds = now.getSeconds().toString().padStart(2, "0"); + const uptime = `${hours}:${minutes}:${seconds}`; + + const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; + + return { platform, browser, screen, locale, uptime, timezone }; +} + +function generateNeofetch(sys: SystemInfo): string[] { + const logo = [ + " .--. ", + " |o_o | ", + " |:_/ | ", + " // \\ \\ ", + " (| | ) ", + " /'\\_ _/`\\ ", + " \\___)=(___/ ", + ]; + + const info = [ + `<span class="ansi-bold-accent">prime8</span>@<span class="ansi-bold-accent">dev</span>`, + '<span class="ansi-dim">──────────────</span>', + `<span class="ansi-bold-accent">OS</span>: <span class="ansi-white">${sys.platform}</span>`, + `<span class="ansi-bold-accent">Browser</span>: <span class="ansi-white">${sys.browser}</span>`, + `<span class="ansi-bold-accent">Resolution</span>: <span class="ansi-white">${sys.screen}</span>`, + `<span class="ansi-bold-accent">Time</span>: <span class="ansi-white">${sys.uptime}</span>`, + `<span class="ansi-bold-accent">Timezone</span>: <span class="ansi-white">${sys.timezone}</span>`, + `<span class="ansi-bold-accent">Locale</span>: <span class="ansi-white">${sys.locale}</span>`, + ]; + + const lines: string[] = []; + const maxLen = Math.max(logo.length, info.length); + + for (let i = 0; i < maxLen; i++) { + const left = logo[i] || " "; + const right = info[i] || ""; + lines.push( + `<span class="ansi-bold-white">${left.replace(/ /g, "&nbsp;")}</span>&nbsp;&nbsp;${right}`, + ); + } + + return lines; +} + +function generateBootMessages(): string[] { + const sys = getSystemInfo(); + const neofetchLines = generateNeofetch(sys); + + return [...neofetchLines]; +} + +const CURSOR_CHAR = "█"; + +function createBootOverlay(): HTMLElement { + const overlay = document.createElement("div"); + overlay.id = "boot-overlay"; + overlay.innerHTML = ` + <div class="boot-terminal"> + <div class="boot-content"></div> + <div class="boot-cursor">${CURSOR_CHAR}</div> + </div> + `; + document.body.appendChild(overlay); + return overlay; +} + +function sleep(ms: number): Promise<void> { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +async function runBootSequence(overlay: HTMLElement): Promise<void> { + const content = overlay.querySelector(".boot-content") as HTMLElement; + const cursor = overlay.querySelector(".boot-cursor") as HTMLElement; + const messages = generateBootMessages(); + + await sleep(200); + + for (let i = 0; i < messages.length; i++) { + const line = messages[i]; + const lineEl = document.createElement("div"); + lineEl.className = "boot-line boot-line-hidden"; + lineEl.innerHTML = line || "&nbsp;"; + content.appendChild(lineEl); + + await sleep(50); + lineEl.classList.remove("boot-line-hidden"); + lineEl.classList.add("boot-line-visible"); + } + + await sleep(400); + + const startMsg = document.createElement("div"); + startMsg.className = "boot-line boot-line-hidden"; + startMsg.innerHTML = + '<br><span class="ansi-bold-green">Starting prime8dev...</span>'; + content.appendChild(startMsg); + await sleep(60); + startMsg.classList.remove("boot-line-hidden"); + startMsg.classList.add("boot-line-visible"); + + await sleep(500); + + cursor.style.display = "none"; + + const progressBar = document.createElement("div"); + progressBar.className = "boot-line boot-line-visible"; + content.appendChild(progressBar); + + const progressWidth = 30; + for (let i = 0; i <= progressWidth; i++) { + const filled = "=".repeat(i); + const arrow = i < progressWidth ? ">" : "="; + const empty = " ".repeat(progressWidth - i); + progressBar.innerHTML = `<span class="ansi-bold-green">[${filled}${arrow}${empty}]</span> ${Math.round((i / progressWidth) * 100)}%`; + await sleep(25); + } + + await sleep(250); + + overlay.classList.add("fade-out"); + await sleep(400); + + overlay.remove(); +} + +export async function playBootAnimation(): Promise<void> { + const BOOT_KEY = "prime8dev-boot-shown"; + const app = document.getElementById("app"); + + if (sessionStorage.getItem(BOOT_KEY)) { + if (app) { + app.classList.add("ready"); + } + return; + } + + const overlay = createBootOverlay(); + + await runBootSequence(overlay); + + sessionStorage.setItem(BOOT_KEY, "1"); + + if (app) { + app.classList.add("ready", "boot-reveal"); + } +} diff --git a/web/src/scripts/ui/clicks.ts b/web/src/scripts/ui/clicks.ts @@ -0,0 +1,39 @@ +import { selectedIndex } from "./state"; +import { updateUrl } from "./url"; +import { updateExperienceDetail, updateDetailView } from "./detail"; + +export function setupTimelineClicks(): void { + document.querySelectorAll(".timeline-segment").forEach((segment) => { + segment.addEventListener("click", () => { + const index = parseInt(segment.getAttribute("data-index") || "0"); + selectedIndex.experience = index; + + document.querySelectorAll(".timeline-segment").forEach((s) => { + s.classList.toggle( + "selected", + parseInt(s.getAttribute("data-index") || "0") === index, + ); + }); + + updateExperienceDetail(); + updateUrl(); + }); + }); +} + +export function setupListClicks(): void { + document.querySelectorAll("#projects .list-item").forEach((item) => { + item.addEventListener("click", () => { + const index = parseInt(item.getAttribute("data-index") || "0"); + + selectedIndex.projects = index; + + document.querySelectorAll("#projects .list-item").forEach((li, i) => { + li.classList.toggle("selected", i === index); + }); + + updateDetailView("projects"); + updateUrl(); + }); + }); +} diff --git a/web/src/scripts/ui/detail.ts b/web/src/scripts/ui/detail.ts @@ -0,0 +1,27 @@ +import { selectedIndex } from "./state"; + +export function updateExperienceDetail(): void { + const index = selectedIndex.experience; + const detailContents = document.querySelectorAll("#experience .exp-card"); + + detailContents.forEach((content) => { + content.classList.toggle( + "hidden", + parseInt(content.getAttribute("data-for") || "0") !== index, + ); + }); +} + +export function updateDetailView(pageId: string): void { + const index = selectedIndex[pageId]; + const detailContents = document.querySelectorAll( + `#${pageId} .detail-content`, + ); + + detailContents.forEach((content) => { + content.classList.toggle( + "hidden", + parseInt(content.getAttribute("data-for") || "0") !== index, + ); + }); +} diff --git a/web/src/scripts/ui/index.ts b/web/src/scripts/ui/index.ts @@ -0,0 +1,28 @@ +import { applyInitialState } from "./state"; +import { loadFromUrl } from "./url"; +import { setupTabs } from "./tabs"; +import { setupKeyboard } from "./keyboard"; +import { setupTimelineClicks, setupListClicks } from "./clicks"; +import { setupBlogNavigation } from "./blog"; +import { updateStatusTime } from "./status"; +import { playBootAnimation } from "./boot"; + +export async function initUI(): Promise<void> { + await playBootAnimation(); + + loadFromUrl(); + setupTabs(); + setupKeyboard(); + setupTimelineClicks(); + setupListClicks(); + setupBlogNavigation(); + applyInitialState(); + + updateStatusTime(); + setInterval(updateStatusTime, 1000); + + window.addEventListener("popstate", () => { + loadFromUrl(); + applyInitialState(); + }); +} diff --git a/web/src/scripts/ui/keyboard.ts b/web/src/scripts/ui/keyboard.ts @@ -0,0 +1,82 @@ +import { currentTab, currentBlogId, selectedIndex } from "./state"; +import { getItemId, updateUrl } from "./url"; +import { switchTab, cycleTab } from "./tabs"; +import { navigateList, navigateTimeline } from "./navigation"; +import { openBlogPost, closeBlogPost } from "./blog"; + +export function setupKeyboard(): void { + document.addEventListener("keydown", (e) => { + if ( + e.target instanceof HTMLInputElement || + e.target instanceof HTMLTextAreaElement + ) + return; + + switch (e.key) { + case "1": + switchTab("about"); + break; + case "2": + switchTab("experience"); + break; + case "3": + switchTab("projects"); + break; + case "4": + switchTab("blog"); + break; + case "ArrowDown": + e.preventDefault(); + navigateList(1); + break; + case "ArrowUp": + e.preventDefault(); + navigateList(-1); + break; + case "ArrowLeft": + if ( + ( + window as Window & { isLightboxOpen?: () => boolean } + ).isLightboxOpen?.() + ) + return; + e.preventDefault(); + if (currentTab === "experience") { + navigateTimeline(-1); + } else { + cycleTab(-1); + } + break; + case "ArrowRight": + if ( + ( + window as Window & { isLightboxOpen?: () => boolean } + ).isLightboxOpen?.() + ) + return; + e.preventDefault(); + if (currentTab === "experience") { + navigateTimeline(1); + } else { + cycleTab(1); + } + break; + case "Tab": + e.preventDefault(); + cycleTab(e.shiftKey ? -1 : 1); + break; + case "Enter": + if (currentTab === "blog" && !currentBlogId) { + const blogId = getItemId("blog", selectedIndex.blog); + openBlogPost(blogId); + } + break; + case "Escape": + if (currentTab === "blog" && currentBlogId) { + closeBlogPost(); + updateUrl(); + } + break; + } + }); +} diff --git a/web/src/scripts/ui/navigation.ts b/web/src/scripts/ui/navigation.ts @@ -0,0 +1,86 @@ +import { currentTab, selectedIndex, currentBlogId } from "./state"; +import { updateUrl } from "./url"; +import { updateExperienceDetail, updateDetailView } from "./detail"; +import { cycleTab } from "./tabs"; + +export function navigateList(direction: number): void { + if (currentTab === "about") return; + if (currentTab === "experience") { + navigateTimeline(direction); + return; + } + if (currentTab === "blog") { + if (!currentBlogId) { + navigateBlogList(direction); + } + return; + } + + const listItems = document.querySelectorAll(`#${currentTab} .list-item`); + const maxIndex = listItems.length - 1; + + selectedIndex[currentTab] = Math.max( + 0, + Math.min(maxIndex, selectedIndex[currentTab] + direction), + ); + + listItems.forEach((item, i) => { + item.classList.toggle("selected", i === selectedIndex[currentTab]); + }); + + updateDetailView(currentTab); + updateUrl(); + + listItems[selectedIndex[currentTab]]?.scrollIntoView({ block: "nearest" }); +} + +export function navigateTimeline(direction: number): void { + const segments = document.querySelectorAll("#experience .timeline-segment"); + + const sortedSegments = Array.from(segments).sort((a, b) => { + const aLeft = parseFloat((a as HTMLElement).style.left) || 0; + const bLeft = parseFloat((b as HTMLElement).style.left) || 0; + return aLeft - bLeft; + }); + + const sortedIndices = sortedSegments.map((s) => + parseInt(s.getAttribute("data-index") || "0"), + ); + const currentPos = sortedIndices.indexOf(selectedIndex.experience); + const newPos = currentPos + direction; + + if (newPos < 0) { + cycleTab(-1); + return; + } + if (newPos >= sortedIndices.length) { + cycleTab(1); + return; + } + + selectedIndex.experience = sortedIndices[newPos]; + + segments.forEach((segment) => { + const idx = parseInt(segment.getAttribute("data-index") || "0"); + segment.classList.toggle("selected", idx === selectedIndex.experience); + }); + + updateExperienceDetail(); + updateUrl(); +} + +export function navigateBlogList(direction: number): void { + const listItems = document.querySelectorAll("#blog .blog-list-item"); + const maxIndex = listItems.length - 1; + + selectedIndex.blog = Math.max( + 0, + Math.min(maxIndex, selectedIndex.blog + direction), + ); + + listItems.forEach((item, i) => { + item.classList.toggle("selected", i === selectedIndex.blog); + }); + + listItems[selectedIndex.blog]?.scrollIntoView({ block: "nearest" }); +} diff --git a/web/src/scripts/ui/state.ts b/web/src/scripts/ui/state.ts @@ -0,0 +1,60 @@ +import { openBlogPost } from "./blog"; +import { updateDetailView, updateExperienceDetail } from "./detail"; + +export let currentTab = "about"; +export const selectedIndex: Record<string, number> = { + experience: 0, + projects: 0, + blog: 0, +}; +export let currentBlogId: string | null = null; + +export function applyInitialState(): void { + const tabs = document.querySelectorAll(".tab"); + const pages = document.querySelectorAll(".page"); + + tabs.forEach((tab) => { + const isActive = tab.getAttribute("data-tab") === currentTab; + tab.classList.toggle("active", isActive); + if (isActive) { + tab.setAttribute("aria-current", "page"); + } else { + tab.removeAttribute("aria-current"); + } + }); + pages.forEach((page) => { + page.classList.toggle("active", page.id === currentTab); + }); + + const timelineSegments = document.querySelectorAll( + "#experience .timeline-segment", + ); + timelineSegments.forEach((segment) => { + const idx = parseInt(segment.getAttribute("data-index") || "0"); + segment.classList.toggle("selected", idx === selectedIndex.experience); + }); + updateExperienceDetail(); + + const projectItems = document.querySelectorAll("#projects .list-item"); + projectItems.forEach((item, i) => { + item.classList.toggle("selected", i === selectedIndex.projects); + }); + updateDetailView("projects"); + + const blogItems = document.querySelectorAll("#blog .blog-list-item"); + blogItems.forEach((item, i) => { + item.classList.toggle("selected", i === selectedIndex.blog); + }); + + if (currentTab === "blog" && currentBlogId) { + openBlogPost(currentBlogId); + } +} + +export function setCurrentTab(tab: string): void { + currentTab = tab; +} + +export function setCurrentBlogId(id: string | null): void { + currentBlogId = id; +} diff --git a/web/src/scripts/ui/status.ts b/web/src/scripts/ui/status.ts @@ -0,0 +1,17 @@ +export function updateStatusTime(): void { + const el = document.getElementById("status-time"); + if (!el) return; + + const now = new Date(); + const time = now.toLocaleTimeString("en-US", { + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + hour12: false, + }); + const date = now.toLocaleDateString("en-US", { + month: "short", + day: "numeric", + }); + el.textContent = `${date} ${time}`; +} diff --git a/web/src/scripts/ui/tabs.ts b/web/src/scripts/ui/tabs.ts @@ -0,0 +1,48 @@ +import { currentTab, setCurrentTab } from "./state"; +import { updateUrl } from "./url"; +import { closeBlogPost } from "./blog"; + +export function setupTabs(): void { + const tabs = document.querySelectorAll(".tab"); + tabs.forEach((tab) => { + tab.addEventListener("click", () => { + const tabName = tab.getAttribute("data-tab"); + if (tabName) switchTab(tabName); + }); + }); +} + +export function switchTab(tabName: string): void { + setCurrentTab(tabName); + + if (tabName === "blog") { + closeBlogPost(); + } + + const tabs = document.querySelectorAll(".tab"); + const pages = document.querySelectorAll(".page"); + + tabs.forEach((tab) => { + const isActive = tab.getAttribute("data-tab") === tabName; + tab.classList.toggle("active", isActive); + if (isActive) { + tab.setAttribute("aria-current", "page"); + } else { + tab.removeAttribute("aria-current"); + } + }); + + pages.forEach((page) => { + page.classList.toggle("active", page.id === tabName); + }); + + updateUrl(); +} + +export function cycleTab(direction: number): void { + const tabOrder = ["about", "experience", "projects", "blog"]; + const currentIndex = tabOrder.indexOf(currentTab); + const newIndex = + (currentIndex + direction + tabOrder.length) % tabOrder.length; + switchTab(tabOrder[newIndex]); +} diff --git a/web/src/scripts/ui/url.ts b/web/src/scripts/ui/url.ts @@ -0,0 +1,94 @@ +import { + currentTab, + selectedIndex, + currentBlogId, + setCurrentTab, + setCurrentBlogId, +} from "./state"; + +export function getItemId(tab: string, index: number): string { + if (tab === "experience") { + const item = document.querySelector( + `#experience .timeline-segment[data-index="${index}"]`, + ); + return item?.getAttribute("data-id") || String(index); + } else if (tab === "projects") { + const item = document.querySelector( + `#projects .list-item[data-index="${index}"]`, + ); + return item?.getAttribute("data-id") || String(index); + } else if (tab === "blog") { + const item = document.querySelector( + `#blog .blog-list-item[data-index="${index}"]`, + ); + return item?.getAttribute("data-id") || String(index); + } + return String(index); +} + +export function getIndexFromId(tab: string, id: string): number { + if (tab === "experience") { + const items = document.querySelectorAll(`#experience .timeline-segment`); + for (let i = 0; i < items.length; i++) { + if (items[i].getAttribute("data-id") === id) { + return parseInt(items[i].getAttribute("data-index") || "0"); + } + } + } else if (tab === "projects") { + const items = document.querySelectorAll(`#projects .list-item`); + for (let i = 0; i < items.length; i++) { + if (items[i].getAttribute("data-id") === id) { + return i; + } + } + } else if (tab === "blog") { + const items = document.querySelectorAll(`#blog .blog-list-item`); + for (let i = 0; i < items.length; i++) { + if (items[i].getAttribute("data-id") === id) { + return parseInt(items[i].getAttribute("data-index") || "0"); + } + } + } + return 0; +} + +export function updateUrl(): void { + let newHash: string; + + if (currentTab === "about") { + newHash = "#about"; + } else if (currentTab === "blog") { + if (currentBlogId) { + newHash = `#blog/${currentBlogId}`; + } else { + newHash = "#blog"; + } + } else { + newHash = `#${currentTab}/${getItemId(currentTab, selectedIndex[currentTab])}`; + } + + if (window.location.hash !== newHash) { + history.pushState(null, "", newHash); + } +} + +export function loadFromUrl(): void { + const hash = window.location.hash.slice(1); + if (!hash) return; + + const parts = hash.split("/"); + const tab = parts[0]; + const id = parts[1]; + + if (["about", "experience", "projects", "blog"].includes(tab)) { + setCurrentTab(tab); + if (tab === "blog" && id) { + setCurrentBlogId(id); + selectedIndex.blog = getIndexFromId("blog", id); + } else if (tab === "blog") { + setCurrentBlogId(null); + } else if (tab !== "about" && id) { + selectedIndex[tab] = getIndexFromId(tab, id); + } + } +} diff --git a/web/start.sh b/web/start.sh @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -zola serve -p 8000 diff --git a/web/static/css/bootstrap-responsive.css b/web/static/css/bootstrap-responsive.css @@ -1,937 +0,0 @@ -/*! - * Bootstrap Responsive v2.3.1 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 20px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -@-ms-viewport { - width: device-width; -} - -.hidden { - display: none; - visibility: hidden; -} - -.visible-phone { - display: none !important; -} - -.visible-tablet { - display: none !important; -} - -.hidden-desktop { - display: none !important; -} - -.visible-desktop { - display: inherit !important; -} - -@media (min-width: 768px) and (max-width: 979px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important ; - } - .visible-tablet { - display: inherit !important; - } - .hidden-tablet { - display: none !important; - } -} - -@media (max-width: 767px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important; - } - .visible-phone { - display: inherit !important; - } - .hidden-phone { - display: none !important; - } -} - -.visible-print { - display: none !important; -} - -@media print { - .visible-print { - display: inherit !important; - } - .hidden-print { - display: none !important; - } -} - -@media (min-width: 1200px) { - .row { - margin-left: -24px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - line-height: 0; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 16px; - } - .container, - .span12 { - width: 1128px; - } - .span11 { - width: 1032px; - } - .span10 { - width: 936px; - } - .span9 { - width: 840px; - } - .span8 { - width: 744px; - } - .span7 { - width: 648px; - } - .span6 { - width: 552px; - } - .span5 { - width: 456px; - } - .span4 { - width: 360px; - } - .span3 { - width: 264px; - } - .span2 { - width: 168px; - } - .span1 { - width: 72px; - } - .offset12 { - margin-left: 1176px; - } - .offset11 { - margin-left: 1080px; - } - .offset10 { - margin-left: 984px; - } - .offset9 { - margin-left: 888px; - } - .offset8 { - margin-left: 792px; - } - .offset7 { - margin-left: 696px; - } - .offset6 { - margin-left: 600px; - } - .offset5 { - margin-left: 504px; - } - .offset4 { - margin-left: 408px; - } - .offset3 { - margin-left: 312px; - } - .offset2 { - margin-left: 216px; - } - .offset1 { - margin-left: 120px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - line-height: 0; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 20px; - margin-left: 2.127659574468085%; - *margin-left: 2.07469347277317%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.127659574468085%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94703389830508%; - } - .row-fluid .span11 { - width: 91.48936170212765%; - *width: 91.43639560043273%; - } - .row-fluid .span10 { - width: 82.97872340425532%; - *width: 82.9257573025604%; - } - .row-fluid .span9 { - width: 74.46808510638297%; - *width: 74.41511900468805%; - } - .row-fluid .span8 { - width: 65.95744680851064%; - *width: 65.90448070681572%; - } - .row-fluid .span7 { - width: 57.44680851063829%; - *width: 57.39384240894338%; - } - .row-fluid .span6 { - width: 48.93617021276595%; - *width: 48.88320411107104%; - } - .row-fluid .span5 { - width: 40.42553191489362%; - *width: 40.372565813198705%; - } - .row-fluid .span4 { - width: 31.914893617021278%; - *width: 31.86192751532636%; - } - .row-fluid .span3 { - width: 23.404255319148934%; - *width: 23.351289217454017%; - } - .row-fluid .span2 { - width: 14.893617021276595%; - *width: 14.84065091958168%; - } - .row-fluid .span1 { - width: 6.382978723404255%; - *width: 6.33001262170934%; - } - .row-fluid .offset12 { - margin-left: 104.25531914893617%; - *margin-left: 104.14938694554633%; - } - .row-fluid .offset12:first-child { - margin-left: 102.12765957446808%; - *margin-left: 102.02172737107824%; - } - .row-fluid .offset11 { - margin-left: 95.74468085106382%; - *margin-left: 95.63874864767398%; - } - .row-fluid .offset11:first-child { - margin-left: 93.61702127659574%; - *margin-left: 93.5110890732059%; - } - .row-fluid .offset10 { - margin-left: 87.23404255319149%; - *margin-left: 87.12811034980164%; - } - .row-fluid .offset10:first-child { - margin-left: 85.1063829787234%; - *margin-left: 85.00045077533356%; - } - .row-fluid .offset9 { - margin-left: 78.72340425531914%; - *margin-left: 78.6174720519293%; - } - .row-fluid .offset9:first-child { - margin-left: 76.59574468085106%; - *margin-left: 76.48981247746121%; - } - .row-fluid .offset8 { - margin-left: 70.2127659574468%; - *margin-left: 70.10683375405696%; - } - .row-fluid .offset8:first-child { - margin-left: 68.08510638297872%; - *margin-left: 67.97917417958888%; - } - .row-fluid .offset7 { - margin-left: 61.70212765957446%; - *margin-left: 61.59619545618464%; - } - .row-fluid .offset7:first-child { - margin-left: 59.574468085106375%; - *margin-left: 59.46853588171655%; - } - .row-fluid .offset6 { - margin-left: 53.191489361702125%; - *margin-left: 53.08555715831229%; - } - .row-fluid .offset6:first-child { - margin-left: 51.063829787234035%; - *margin-left: 50.95789758384421%; - } - .row-fluid .offset5 { - margin-left: 44.68085106382979%; - *margin-left: 44.57491886043996%; - } - .row-fluid .offset5:first-child { - margin-left: 42.5531914893617%; - *margin-left: 42.447259285971874%; - } - .row-fluid .offset4 { - margin-left: 36.170212765957444%; - *margin-left: 36.06428056256762%; - } - .row-fluid .offset4:first-child { - margin-left: 34.04255319148936%; - *margin-left: 33.936620988099534%; - } - .row-fluid .offset3 { - margin-left: 27.659574468085104%; - *margin-left: 27.55364226469527%; - } - .row-fluid .offset3:first-child { - margin-left: 25.53191489361702%; - *margin-left: 25.425982690227183%; - } - .row-fluid .offset2 { - margin-left: 19.148936170212764%; - *margin-left: 19.043003966822933%; - } - .row-fluid .offset2:first-child { - margin-left: 17.02127659574468%; - *margin-left: 16.91534439235485%; - } - .row-fluid .offset1 { - margin-left: 10.638297872340425%; - *margin-left: 10.532365668950595%; - } - .row-fluid .offset1:first-child { - margin-left: 8.51063829787234%; - *margin-left: 8.40470609448251%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 24px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 1114px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 1018px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 922px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 826px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 730px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 634px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 538px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 442px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 346px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 250px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 154px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 58px; - } - .thumbnails { - margin-left: -24px; - } - .thumbnails > li { - margin-left: 24px; - } - .row-fluid .thumbnails { - margin-left: 0; - } -} - -@media (min-width: 768px) and (max-width: 979px) { - .row { - margin-left: -16px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - line-height: 0; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 16px; - } - .container, - .span12 { - width: 656px; - } - .span11 { - width: 600px; - } - .span10 { - width: 544px; - } - .span9 { - width: 488px; - } - .span8 { - width: 432px; - } - .span7 { - width: 376px; - } - .span6 { - width: 320px; - } - .span5 { - width: 264px; - } - .span4 { - width: 208px; - } - .span3 { - width: 152px; - } - .span2 { - width: 96px; - } - .span1 { - width: 40px; - } - .offset12 { - margin-left: 688px; - } - .offset11 { - margin-left: 632px; - } - .offset10 { - margin-left: 576px; - } - .offset9 { - margin-left: 520px; - } - .offset8 { - margin-left: 464px; - } - .offset7 { - margin-left: 408px; - } - .offset6 { - margin-left: 352px; - } - .offset5 { - margin-left: 296px; - } - .offset4 { - margin-left: 240px; - } - .offset3 { - margin-left: 184px; - } - .offset2 { - margin-left: 128px; - } - .offset1 { - margin-left: 72px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - line-height: 0; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 20px; - margin-left: 2.4390243902439024%; - *margin-left: 2.386058288548987%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.4390243902439024%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94703389830508%; - } - .row-fluid .span11 { - width: 91.46341463414635%; - *width: 91.41044853245143%; - } - .row-fluid .span10 { - width: 82.92682926829268%; - *width: 82.87386316659776%; - } - .row-fluid .span9 { - width: 74.39024390243902%; - *width: 74.3372778007441%; - } - .row-fluid .span8 { - width: 65.85365853658537%; - *width: 65.80069243489045%; - } - .row-fluid .span7 { - width: 57.31707317073171%; - *width: 57.2641070690368%; - } - .row-fluid .span6 { - width: 48.78048780487805%; - *width: 48.727521703183136%; - } - .row-fluid .span5 { - width: 40.24390243902439%; - *width: 40.190936337329475%; - } - .row-fluid .span4 { - width: 31.70731707317073%; - *width: 31.654350971475814%; - } - .row-fluid .span3 { - width: 23.170731707317074%; - *width: 23.117765605622157%; - } - .row-fluid .span2 { - width: 14.634146341463415%; - *width: 14.5811802397685%; - } - .row-fluid .span1 { - width: 6.097560975609756%; - *width: 6.044594873914841%; - } - .row-fluid .offset12 { - margin-left: 104.8780487804878%; - *margin-left: 104.77211657709796%; - } - .row-fluid .offset12:first-child { - margin-left: 102.4390243902439%; - *margin-left: 102.33309218685406%; - } - .row-fluid .offset11 { - margin-left: 96.34146341463415%; - *margin-left: 96.23553121124431%; - } - .row-fluid .offset11:first-child { - margin-left: 93.90243902439025%; - *margin-left: 93.7965068210004%; - } - .row-fluid .offset10 { - margin-left: 87.80487804878048%; - *margin-left: 87.69894584539064%; - } - .row-fluid .offset10:first-child { - margin-left: 85.36585365853658%; - *margin-left: 85.25992145514674%; - } - .row-fluid .offset9 { - margin-left: 79.26829268292683%; - *margin-left: 79.16236047953699%; - } - .row-fluid .offset9:first-child { - margin-left: 76.82926829268293%; - *margin-left: 76.72333608929308%; - } - .row-fluid .offset8 { - margin-left: 70.73170731707317%; - *margin-left: 70.62577511368333%; - } - .row-fluid .offset8:first-child { - margin-left: 68.29268292682927%; - *margin-left: 68.18675072343943%; - } - .row-fluid .offset7 { - margin-left: 62.19512195121951%; - *margin-left: 62.089189747829685%; - } - .row-fluid .offset7:first-child { - margin-left: 59.75609756097561%; - *margin-left: 59.650165357585784%; - } - .row-fluid .offset6 { - margin-left: 53.65853658536585%; - *margin-left: 53.552604381976025%; - } - .row-fluid .offset6:first-child { - margin-left: 51.21951219512195%; - *margin-left: 51.113579991732124%; - } - .row-fluid .offset5 { - margin-left: 45.12195121951219%; - *margin-left: 45.016019016122364%; - } - .row-fluid .offset5:first-child { - margin-left: 42.68292682926829%; - *margin-left: 42.57699462587846%; - } - .row-fluid .offset4 { - margin-left: 36.58536585365854%; - *margin-left: 36.4794336502687%; - } - .row-fluid .offset4:first-child { - margin-left: 34.146341463414636%; - *margin-left: 34.0404092600248%; - } - .row-fluid .offset3 { - margin-left: 28.04878048780488%; - *margin-left: 27.942848284415046%; - } - .row-fluid .offset3:first-child { - margin-left: 25.609756097560975%; - *margin-left: 25.50382389417114%; - } - .row-fluid .offset2 { - margin-left: 19.51219512195122%; - *margin-left: 19.40626291856139%; - } - .row-fluid .offset2:first-child { - margin-left: 17.073170731707318%; - *margin-left: 16.967238528317484%; - } - .row-fluid .offset1 { - margin-left: 10.975609756097562%; - *margin-left: 10.86967755270773%; - } - .row-fluid .offset1:first-child { - margin-left: 8.536585365853659%; - *margin-left: 8.430653162463829%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 16px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 642px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 586px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 530px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 474px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 418px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 362px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 306px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 250px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 194px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 138px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 82px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 26px; - } -} - -@media (max-width: 767px) { - body { - padding-right: 18px; - padding-left: 18px; - } - .container-fluid { - padding: 0; - } - .dl-horizontal dt { - float: none; - width: auto; - clear: none; - text-align: left; - } - .dl-horizontal dd { - margin-left: 0; - } - .container { - width: auto; - } - .row-fluid { - width: 100%; - } - .row, - .thumbnails { - margin-left: 0; - } - .thumbnails > li { - float: none; - margin-left: 0; - } - [class*="span"], - .uneditable-input[class*="span"], - .row-fluid [class*="span"] { - display: block; - float: none; - width: 100%; - margin-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .span12, - .row-fluid .span12 { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="offset"]:first-child { - margin-left: 0; - } - .input-large, - .input-xlarge, - .input-xxlarge, - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - min-height: 20px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .input-prepend input, - .input-append input, - .input-prepend input[class*="span"], - .input-append input[class*="span"] { - display: inline-block; - width: auto; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 0; - } - .modal { - position: fixed; - top: 20px; - right: 20px; - left: 20px; - width: auto; - margin: 0; - } - .modal.fade { - top: -100px; - } - .modal.fade.in { - top: 18px; - } -} - -@media (max-width: 480px) { - .page-header h1 small { - display: block; - line-height: 20px; - } - input[type="checkbox"], - input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-right: 10px; - padding-left: 10px; - } - .media .pull-left, - .media .pull-right { - display: block; - float: none; - margin-bottom: 20px; - } - .media-object { - margin-right: 0; - margin-left: 0; - } - .modal { - top: 9px; - right: 4px; - left: 4px; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} - -@media (max-width: 979px) { - body { - padding-top: 0; - } -} diff --git a/web/static/css/bootstrap.css b/web/static/css/bootstrap.css @@ -1,6204 +0,0 @@ -/*! - * Bootstrap v2.3.1 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 20px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} - -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} - -audio:not([controls]) { - display: none; -} - -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -a:focus { - outline: thin solid #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -a:hover, -a:active { - outline: 0; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - width: auto\9; - height: auto; - max-width: 100%; - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} - -#map_canvas img, -.google-maps img { - max-width: none; -} - -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} - -button, -input { - *overflow: visible; - line-height: normal; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -label, -select, -button, -input[type="button"], -input[type="reset"], -input[type="submit"], -input[type="radio"], -input[type="checkbox"] { - cursor: pointer; -} - -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -@media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: none; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - .ir a:after, - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 0.5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } -} - -@font-face { - font-family: "DOS"; - font-style: normal; - font-weight: normal; - src: url("fonts/Fixedsys500c.eot"); - src: - local("☺"), - url("fonts/Fixedsys500c.woff") format("woff"), - url("fonts/Fixedsys500c.ttf") format("truetype"), - url("fonts/Fixedsys500c.svg") format("svg"); -} - -body { - margin: 0; - font-family: DOS, Monaco, Menlo, Consolas, "Courier New", monospace; - font-size: 18px; - line-height: 20px; - color: #bbbbbb; - background-color: #000084; -} - -a { - color: #fefe54; - text-decoration: none; -} - -a:hover, -a:focus { - color: #fefe54; - background: #aa5500; -} - -.img-rounded { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.img-polaroid { - padding: 9px 4px 9px 4px; - background-color: #ffffff; - border: 2px solid #000000; -} - -.row { - margin-left: -16px; - *zoom: 1; -} - -.row:before, -.row:after { - display: table; - line-height: 0; - content: ""; -} - -.row:after { - clear: both; -} - -[class*="span"] { - float: left; - min-height: 1px; - margin-left: 16px; -} - -.container, -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 944px; -} - -.span12 { - width: 944px; -} - -.span11 { - width: 864px; -} - -.span10 { - width: 784px; -} - -.span9 { - width: 704px; -} - -.span8 { - width: 624px; -} - -.span7 { - width: 544px; -} - -.span6 { - width: 464px; -} - -.span5 { - width: 384px; -} - -.span4 { - width: 304px; -} - -.span3 { - width: 224px; -} - -.span2 { - width: 144px; -} - -.span1 { - width: 64px; -} - -.offset12 { - margin-left: 976px; -} - -.offset11 { - margin-left: 896px; -} - -.offset10 { - margin-left: 816px; -} - -.offset9 { - margin-left: 736px; -} - -.offset8 { - margin-left: 656px; -} - -.offset7 { - margin-left: 576px; -} - -.offset6 { - margin-left: 496px; -} - -.offset5 { - margin-left: 416px; -} - -.offset4 { - margin-left: 336px; -} - -.offset3 { - margin-left: 256px; -} - -.offset2 { - margin-left: 176px; -} - -.offset1 { - margin-left: 96px; -} - -.row-fluid { - width: 100%; - *zoom: 1; -} - -.row-fluid:before, -.row-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.row-fluid:after { - clear: both; -} - -.row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 20px; - margin-left: 1.694915254237288%; - *margin-left: 1.6419491525423728%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} - -.row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 1.694915254237288%; -} - -.row-fluid .span12 { - width: 100%; - *width: 99.94703389830508%; -} - -.row-fluid .span11 { - width: 91.52542372881356%; - *width: 91.47245762711864%; -} - -.row-fluid .span10 { - width: 83.0508474576271%; - *width: 82.99788135593218%; -} - -.row-fluid .span9 { - width: 74.57627118644066%; - *width: 74.52330508474574%; -} - -.row-fluid .span8 { - width: 66.10169491525423%; - *width: 66.04872881355931%; -} - -.row-fluid .span7 { - width: 57.6271186440678%; - *width: 57.574152542372886%; -} - -.row-fluid .span6 { - width: 49.152542372881356%; - *width: 49.09957627118644%; -} - -.row-fluid .span5 { - width: 40.677966101694906%; - *width: 40.62499999999999%; -} - -.row-fluid .span4 { - width: 32.20338983050847%; - *width: 32.15042372881356%; -} - -.row-fluid .span3 { - width: 23.728813559322035%; - *width: 23.675847457627118%; -} - -.row-fluid .span2 { - width: 15.254237288135592%; - *width: 15.201271186440676%; -} - -.row-fluid .span1 { - width: 6.779661016949152%; - *width: 6.726694915254237%; -} - -.row-fluid .offset12 { - margin-left: 103.38983050847457%; - *margin-left: 103.28389830508473%; -} - -.row-fluid .offset12:first-child { - margin-left: 101.69491525423729%; - *margin-left: 101.58898305084745%; -} - -.row-fluid .offset11 { - margin-left: 94.91525423728814%; - *margin-left: 94.8093220338983%; -} - -.row-fluid .offset11:first-child { - margin-left: 93.22033898305085%; - *margin-left: 93.11440677966101%; -} - -.row-fluid .offset10 { - margin-left: 86.44067796610167%; - *margin-left: 86.33474576271183%; -} - -.row-fluid .offset10:first-child { - margin-left: 84.74576271186439%; - *margin-left: 84.63983050847455%; -} - -.row-fluid .offset9 { - margin-left: 77.96610169491524%; - *margin-left: 77.8601694915254%; -} - -.row-fluid .offset9:first-child { - margin-left: 76.27118644067795%; - *margin-left: 76.16525423728811%; -} - -.row-fluid .offset8 { - margin-left: 69.4915254237288%; - *margin-left: 69.38559322033896%; -} - -.row-fluid .offset8:first-child { - margin-left: 67.79661016949152%; - *margin-left: 67.69067796610167%; -} - -.row-fluid .offset7 { - margin-left: 61.016949152542374%; - *margin-left: 60.91101694915255%; -} - -.row-fluid .offset7:first-child { - margin-left: 59.32203389830509%; - *margin-left: 59.21610169491526%; -} - -.row-fluid .offset6 { - margin-left: 52.54237288135593%; - *margin-left: 52.436440677966104%; -} - -.row-fluid .offset6:first-child { - margin-left: 50.847457627118644%; - *margin-left: 50.74152542372882%; -} - -.row-fluid .offset5 { - margin-left: 44.06779661016948%; - *margin-left: 43.961864406779654%; -} - -.row-fluid .offset5:first-child { - margin-left: 42.37288135593219%; - *margin-left: 42.26694915254237%; -} - -.row-fluid .offset4 { - margin-left: 35.593220338983045%; - *margin-left: 35.48728813559322%; -} - -.row-fluid .offset4:first-child { - margin-left: 33.89830508474576%; - *margin-left: 33.79237288135593%; -} - -.row-fluid .offset3 { - margin-left: 27.11864406779661%; - *margin-left: 27.01271186440678%; -} - -.row-fluid .offset3:first-child { - margin-left: 25.423728813559322%; - *margin-left: 25.317796610169488%; -} - -.row-fluid .offset2 { - margin-left: 18.644067796610166%; - *margin-left: 18.538135593220336%; -} - -.row-fluid .offset2:first-child { - margin-left: 16.94915254237288%; - *margin-left: 16.84322033898305%; -} - -.row-fluid .offset1 { - margin-left: 10.169491525423728%; - *margin-left: 10.063559322033898%; -} - -.row-fluid .offset1:first-child { - margin-left: 8.47457627118644%; - *margin-left: 8.36864406779661%; -} - -[class*="span"].hide, -.row-fluid [class*="span"].hide { - display: none; -} - -[class*="span"].pull-right, -.row-fluid [class*="span"].pull-right { - float: right; -} - -.container { - margin-left: 20px; - *zoom: 1; -} - -.container:before, -.container:after { - display: table; - line-height: 0; - content: ""; -} - -.container:after { - clear: both; -} - -.container-fluid { - padding-right: 16px; - padding-left: 16px; - *zoom: 1; -} - -.container-fluid:before, -.container-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.container-fluid:after { - clear: both; -} - -img { - -webkit-filter: contrast(800%); - -moz-filter: contrast(1000%); - -ms-filter: contrast(800%); - -o-filter: contrast(800%); - filter: contrast(1000%); -} - -p { - margin: 0 0 20px; -} - -.lead { - padding: 9px 14px 9px 14px; - margin: 9px 4px 9px 4px; - font-size: 18px; - color: #ffffff; - border: 2px solid #bbbbbb; -} - -small { - font-size: 100%; -} - -strong { - font-weight: normal; - color: #ffffff; -} - -em { - font-weight: normal; - color: #ffffff; -} - -cite { - font-style: normal; -} - -i, -cite, -em, -var, -address, -dfn { - font-style: normal; -} - -i:before, -cite:before, -em:before, -var:before, -address:before, -dfn:before, -i:after, -cite:after, -em:after, -var:after, -address:after, -dfn:after { - content: "/"; -} - -.muted { - display: none; - color: #bbbbbb; -} - -.text-warning { - color: #ffffff; -} - -a.text-warning:hover, -a.text-warning:focus { - color: #ffffff; -} - -.text-error { - color: #ffffff; -} - -a.text-error:hover, -a.text-error:focus { - color: #ffffff; -} - -.text-info { - color: #000000; -} - -a.text-info:hover, -a.text-info:focus { - color: #000000; -} - -.text-success { - color: #00aa00; -} - -a.text-success:hover, -a.text-success:focus { - color: #00aa00; -} - -.text-left { - text-align: left; -} - -.text-right { - text-align: right; -} - -.text-center { - text-align: center; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - font-family: inherit; - font-weight: inherit; - line-height: 20px; - color: #ffffff; - text-rendering: optimizelegibility; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - line-height: 1; - color: #bbbbbb; -} - -h1, -h2, -h3 { - line-height: 20px; -} - -h3:before { - content: ">>> "; -} - -h3:after { - content: " <<<"; -} - -h1 { - font-size: 18px; - text-transform: uppercase; -} - -h2 { - font-size: 18px; - text-align: center; - white-space: nowrap; -} - -h3 { - font-size: 18px; -} - -h4 { - font-size: 18px; - color: #fe54fe; -} - -h5 { - font-size: 18px; -} - -h6 { - font-size: 18px; -} - -h1 small { - font-size: 18px; -} - -h2 small { - font-size: 18px; -} - -h3 small { - font-size: 18px; -} - -h4 small { - font-size: 18px; -} - -.page-header { - padding: 20px 20px; - margin: 20px 0 20px; - background: #00aaaa; -} - -.page-header h1 { - color: #000000; -} - -ul, -ol { - padding: 0; - margin: 0 0 20px 18px; -} - -ul { - list-style: square; -} - -ol { - margin-left: 21px; - list-style: decimal; -} - -ol > li { - padding-left: 0; -} - -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; - list-style: square; -} - -li { - padding-left: 4px; - margin-left: 0; - line-height: 20px; -} - -ol > li { - margin-left: 12px; -} - -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} - -ul.unstyled > li, -ol.unstyled > li { - padding-left: 0; -} - -ul.inline, -ol.inline { - margin-left: 0; - list-style: none; -} - -ul.inline > li, -ol.inline > li { - display: inline-block; - *display: inline; - padding-right: 9.5px; - padding-left: 10.7px; - *zoom: 1; -} - -dl { - margin-bottom: 20px; -} - -dt, -dd { - line-height: 20px; -} - -dt { - font-weight: normal; -} - -dd { - margin-left: 21px; -} - -.dl-horizontal { - *zoom: 1; -} - -.dl-horizontal:before, -.dl-horizontal:after { - display: table; - line-height: 0; - content: ""; -} - -.dl-horizontal:after { - clear: both; -} - -.dl-horizontal dt { - float: left; - width: 162px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; -} - -.dl-horizontal dd { - margin-left: 182px; -} - -hr { - margin: 6px 0 7px; - border: 0; - border-top: 0px solid #bbbbbb; - border-bottom: 2px solid #ffffff; -} - -abbr[title], -abbr[data-original-title] { - cursor: help; - border: 0; -} - -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} - -blockquote { - padding: 0 0 0 15px; - margin: 0 0 20px; - border-left: 5px solid #bbbbbb; -} - -blockquote p { - margin-bottom: 0; - font-size: 18px; - line-height: 20px; -} - -blockquote small { - display: block; - line-height: 20px; - color: #bbbbbb; -} - -blockquote small:before { - content: "\2014 \00A0"; -} - -blockquote.pull-right { - float: right; - padding-right: 1em; - padding-left: 0; - border-right: 5px solid #bbbbbb; - border-left: 0; -} - -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} - -blockquote.pull-right small:before { - content: ""; -} - -blockquote.pull-right small:after { - content: "\00A0 \2014"; -} - -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} - -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 20px; -} - -code, -pre { - padding: 0; - font-family: DOS, Monaco, Menlo, Consolas, "Courier New", monospace; - font-size: 18px; - color: #555555; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -code { - padding: 0; - color: #ffffff; - white-space: nowrap; - background-color: #000000; - border: 0; -} - -pre { - display: block; - padding: 0; - margin: 0 0 10px; - font-size: 18px; - font-weight: normal; - line-height: 20px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #000000; - border: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -pre.prettyprint { - margin-bottom: 20px; -} - -pre code { - padding: 0; - color: inherit; - white-space: pre; - white-space: pre-wrap; - background-color: transparent; - border: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -form { - margin: 0 0 20px; -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 18px; - line-height: 40px; - color: #ffffff; - border: 0; -} - -legend small { - font-size: 20px; - color: #bbbbbb; -} - -legend:before { - content: "## "; -} - -legend:after { - content: " ##"; -} - -label, -input, -button, -select, -textarea { - font-size: 18px; - font-weight: normal; - line-height: 20px; -} - -input, -button, -select, -textarea { - font-family: DOS, Monaco, Menlo, Consolas, "Courier New", monospace; -} - -label { - display: block; - margin-bottom: 5px; -} - -select, -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - display: inline-block; - height: 20px; - padding: 0 0; - margin: 10px 5px; - font-size: 18px; - line-height: 20px; - color: #000000; - vertical-align: middle; - background: #bbbbbb; - border: 2px solid #000000; -} - -input[type="text"]:before { - content: "["; -} - -input[type="text"]:after { - content: "]"; -} - -input, -textarea, -.uneditable-input { - width: 206px; -} - -textarea { - height: auto; -} - -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - background-color: #bbbbbb; - border: 0; -} - -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="datetime"]:focus, -input[type="datetime-local"]:focus, -input[type="date"]:focus, -input[type="month"]:focus, -input[type="time"]:focus, -input[type="week"]:focus, -input[type="number"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="search"]:focus, -input[type="tel"]:focus, -input[type="color"]:focus, -.uneditable-input:focus { - outline: 0; -} - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - *margin-top: 0; - line-height: normal; -} - -input[type="file"], -input[type="image"], -input[type="submit"], -input[type="reset"], -input[type="button"], -input[type="radio"], -input[type="checkbox"] { - width: auto; -} - -select, -input[type="file"] { - height: 20px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - - line-height: 20px; -} - -select { - width: 220px; - background-color: #ffffff; - border: 1px solid #cccccc; -} - -select[multiple], -select[size] { - height: auto; -} - -select:focus, -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin solid #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.uneditable-input, -.uneditable-textarea { - color: #bbbbbb; - cursor: not-allowed; - background-color: #fcfcfc; - border-color: #cccccc; -} - -.uneditable-input { - overflow: hidden; - white-space: nowrap; -} - -.uneditable-textarea { - width: auto; - height: auto; -} - -input:-moz-placeholder, -textarea:-moz-placeholder { - color: #bbbbbb; -} - -input:-ms-input-placeholder, -textarea:-ms-input-placeholder { - color: #bbbbbb; -} - -input::-webkit-input-placeholder, -textarea::-webkit-input-placeholder { - color: #bbbbbb; -} - -.radio, -.checkbox { - min-height: 20px; - padding-left: 20px; -} - -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -20px; -} - -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} - -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} - -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} - -.input-mini { - width: 60px; -} - -.input-small { - width: 90px; -} - -.input-medium { - width: 150px; -} - -.input-large { - width: 210px; -} - -.input-xlarge { - width: 270px; -} - -.input-xxlarge { - width: 530px; -} - -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} - -.input-append input[class*="span"], -.input-append .uneditable-input[class*="span"], -.input-prepend input[class*="span"], -.input-prepend .uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"], -.row-fluid .input-prepend [class*="span"], -.row-fluid .input-append [class*="span"] { - display: inline-block; -} - -input, -textarea, -.uneditable-input { - margin-left: 0; -} - -.controls-row [class*="span"] + [class*="span"] { - margin-left: 16px; -} - -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 930px; -} - -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 850px; -} - -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 770px; -} - -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 690px; -} - -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 610px; -} - -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 530px; -} - -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 450px; -} - -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 370px; -} - -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 290px; -} - -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 210px; -} - -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 130px; -} - -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 50px; -} - -.controls-row { - *zoom: 1; -} - -.controls-row:before, -.controls-row:after { - display: table; - line-height: 0; - content: ""; -} - -.controls-row:after { - clear: both; -} - -.controls-row [class*="span"], -.row-fluid .controls-row [class*="span"] { - float: left; -} - -.controls-row .checkbox[class*="span"], -.controls-row .radio[class*="span"] { - padding-top: 5px; -} - -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #bbbbbb; -} - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} - -.control-group.warning .control-label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #ffffff; -} - -.control-group.warning .checkbox, -.control-group.warning .radio, -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #ffffff; -} - -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - border-color: #ffffff; -} - -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #ffffff; - -webkit-box-shadow: 0; - -moz-box-shadow: 0; - box-shadow: 0; -} - -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #ffffff; - background-color: #00aaaa; - border-color: #ffffff; -} - -.control-group.error .control-label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #ffffff; -} - -.control-group.error .checkbox, -.control-group.error .radio, -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #ffffff; -} - -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - border-color: #ffffff; -} - -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #ffffff; - -webkit-box-shadow: 0; - -moz-box-shadow: 0; - box-shadow: 0; -} - -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #ffffff; - background-color: #aa0000; - border-color: #ffffff; -} - -.control-group.success .control-label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #00aa00; -} - -.control-group.success .checkbox, -.control-group.success .radio, -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #00aa00; -} - -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - border-color: #00aa00; -} - -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #00aa00; - -webkit-box-shadow: 0; - -moz-box-shadow: 0; - box-shadow: 0; -} - -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #00aa00; - background-color: #000000; - border-color: #00aa00; -} - -.control-group.info .control-label, -.control-group.info .help-block, -.control-group.info .help-inline { - color: #000000; -} - -.control-group.info .checkbox, -.control-group.info .radio, -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - color: #000000; -} - -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - border-color: #000000; -} - -.control-group.info input:focus, -.control-group.info select:focus, -.control-group.info textarea:focus { - border-color: #000000; - -webkit-box-shadow: 0; - -moz-box-shadow: 0; - box-shadow: 0; -} - -.control-group.info .input-prepend .add-on, -.control-group.info .input-append .add-on { - color: #000000; - background-color: #000000; - border-color: #000000; -} - -input:focus:invalid, -textarea:focus:invalid, -select:focus:invalid { - color: #b94a48; - border-color: #ee5f5b; -} - -input:focus:invalid:focus, -textarea:focus:invalid:focus, -select:focus:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} - -.form-actions { - padding: 19px 20px 20px; - margin-top: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - *zoom: 1; -} - -.form-actions:before, -.form-actions:after { - display: table; - line-height: 0; - content: ""; -} - -.form-actions:after { - clear: both; -} - -.help-block, -.help-inline { - color: #e1e1e1; -} - -.help-block { - display: block; - margin-bottom: 10px; -} - -.help-inline { - display: inline-block; - *display: inline; - padding-left: 5px; - vertical-align: middle; - *zoom: 1; -} - -.input-append, -.input-prepend { - display: inline-block; - margin-bottom: 10px; - font-size: 0; - white-space: nowrap; - vertical-align: middle; -} - -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input, -.input-append .dropdown-menu, -.input-prepend .dropdown-menu, -.input-append .popover, -.input-prepend .popover { - font-size: 18px; -} - -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - vertical-align: top; - -webkit-border-radius: 0 0 0px 0; - -moz-border-radius: 0 0 0px 0; - border-radius: 0 0 0px 0; -} - -.input-append input:focus, -.input-prepend input:focus, -.input-append select:focus, -.input-prepend select:focus, -.input-append .uneditable-input:focus, -.input-prepend .uneditable-input:focus { - z-index: 2; -} - -.input-append .add-on, -.input-prepend .add-on { - display: inline-block; - width: auto; - height: 20px; - min-width: 16px; - padding: 4px 5px; - font-size: 18px; - font-weight: normal; - line-height: 20px; - text-align: center; - text-shadow: 0; - background-color: #bbbbbb; - border: 0; -} - -.input-append .add-on, -.input-prepend .add-on, -.input-append .btn, -.input-prepend .btn, -.input-append .btn-group > .dropdown-toggle, -.input-prepend .btn-group > .dropdown-toggle { - vertical-align: top; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} - -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 0 0 0 0px; - -moz-border-radius: 0 0 0 0px; - border-radius: 0 0 0 0px; -} - -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 0 0 0 0px; - -moz-border-radius: 0 0 0 0px; - border-radius: 0 0 0 0px; -} - -.input-append input + .btn-group .btn:last-child, -.input-append select + .btn-group .btn:last-child, -.input-append .uneditable-input + .btn-group .btn:last-child { - -webkit-border-radius: 0 0 0px 0; - -moz-border-radius: 0 0 0px 0; - border-radius: 0 0 0px 0; -} - -.input-append .add-on, -.input-append .btn, -.input-append .btn-group { - margin-left: -1px; -} - -.input-append .add-on:last-child, -.input-append .btn:last-child, -.input-append .btn-group:last-child > .dropdown-toggle { - -webkit-border-radius: 0 0 0px 0; - -moz-border-radius: 0 0 0px 0; - border-radius: 0 0 0px 0; -} - -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-prepend.input-append input + .btn-group .btn, -.input-prepend.input-append select + .btn-group .btn, -.input-prepend.input-append .uneditable-input + .btn-group .btn { - -webkit-border-radius: 0 0 0px 0; - -moz-border-radius: 0 0 0px 0; - border-radius: 0 0 0px 0; -} - -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 0 0 0 0px; - -moz-border-radius: 0 0 0 0px; - border-radius: 0 0 0 0px; -} - -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 0 0px 0; - -moz-border-radius: 0 0 0px 0; - border-radius: 0 0 0px 0; -} - -.input-prepend.input-append .btn-group:first-child { - margin-left: 0; -} - -input.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - - margin-bottom: 0; -} - -/* Allow for input prepend/append in search forms */ - -.form-search .input-append .search-query, -.form-search .input-prepend .search-query { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - margin-bottom: 0; - vertical-align: middle; - *zoom: 1; -} - -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} - -.form-search label, -.form-inline label, -.form-search .btn-group, -.form-inline .btn-group { - display: inline-block; -} - -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} - -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} - -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} - -.control-group { - margin-bottom: 10px; -} - -legend + .control-group { - margin-top: 20px; - -webkit-margin-top-collapse: separate; -} - -.form-horizontal .control-group { - margin-bottom: 20px; - *zoom: 1; -} - -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - line-height: 0; - content: ""; -} - -.form-horizontal .control-group:after { - clear: both; -} - -.form-horizontal .control-label { - float: left; - width: 162px; - padding-top: 5px; - text-align: right; -} - -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 182px; - *margin-left: 0; -} - -.form-horizontal .controls:first-child { - *padding-left: 182px; -} - -.form-horizontal .help-block { - margin-bottom: 0; -} - -.form-horizontal input + .help-block, -.form-horizontal select + .help-block, -.form-horizontal textarea + .help-block, -.form-horizontal .uneditable-input + .help-block, -.form-horizontal .input-prepend + .help-block, -.form-horizontal .input-append + .help-block { - margin-top: 10px; -} - -.form-horizontal .form-actions { - padding-left: 182px; -} - -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} - -.table { - width: 100%; - margin-bottom: 20px; -} - -.table th, -.table td { - padding: 8px; - line-height: 20px; - text-align: left; - vertical-align: top; - border-top: 2px solid #dddddd; -} - -.table th { - font-weight: normal; -} - -.table thead th { - vertical-align: bottom; -} - -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} - -.table tbody + tbody { - border-top: 2px solid #dddddd; -} - -.table .table { - background-color: #000084; -} - -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} - -.table-bordered { - margin-left: 4px; - border: 2px solid #dddddd; - border-collapse: separate; - *border-collapse: collapse; - border-left: 0; -} - -.table-bordered th, -.table-bordered td { - padding: inherit 5.2px; - border-left: 2px solid #dddddd; -} - -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} - -.table-bordered thead:first-child tr:first-child > th:first-child, -.table-bordered tbody:first-child tr:first-child > td:first-child, -.table-bordered tbody:first-child tr:first-child > th:first-child { - -webkit-border-top-left-radius: 0; - border-top-left-radius: 0; - -moz-border-radius-topleft: 0; -} - -.table-bordered thead:first-child tr:first-child > th:last-child, -.table-bordered tbody:first-child tr:first-child > td:last-child, -.table-bordered tbody:first-child tr:first-child > th:last-child { - -webkit-border-top-right-radius: 0; - border-top-right-radius: 0; - -moz-border-radius-topright: 0; -} - -.table-bordered thead:last-child tr:last-child > th:first-child, -.table-bordered tbody:last-child tr:last-child > td:first-child, -.table-bordered tbody:last-child tr:last-child > th:first-child, -.table-bordered tfoot:last-child tr:last-child > td:first-child, -.table-bordered tfoot:last-child tr:last-child > th:first-child { - -webkit-border-bottom-left-radius: 0; - border-bottom-left-radius: 0; - -moz-border-radius-bottomleft: 0; -} - -.table-bordered thead:last-child tr:last-child > th:last-child, -.table-bordered tbody:last-child tr:last-child > td:last-child, -.table-bordered tbody:last-child tr:last-child > th:last-child, -.table-bordered tfoot:last-child tr:last-child > td:last-child, -.table-bordered tfoot:last-child tr:last-child > th:last-child { - -webkit-border-bottom-right-radius: 0; - border-bottom-right-radius: 0; - -moz-border-radius-bottomright: 0; -} - -.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { - -webkit-border-bottom-left-radius: 0; - border-bottom-left-radius: 0; - -moz-border-radius-bottomleft: 0; -} - -.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 0; - border-bottom-right-radius: 0; - -moz-border-radius-bottomright: 0; -} - -.table-bordered caption + thead tr:first-child th:first-child, -.table-bordered caption + tbody tr:first-child td:first-child, -.table-bordered colgroup + thead tr:first-child th:first-child, -.table-bordered colgroup + tbody tr:first-child td:first-child { - -webkit-border-top-left-radius: 0; - border-top-left-radius: 0; - -moz-border-radius-topleft: 0; -} - -.table-bordered caption + thead tr:first-child th:last-child, -.table-bordered caption + tbody tr:first-child td:last-child, -.table-bordered colgroup + thead tr:first-child th:last-child, -.table-bordered colgroup + tbody tr:first-child td:last-child { - -webkit-border-top-right-radius: 0; - border-top-right-radius: 0; - -moz-border-radius-topright: 0; -} - -.table-striped tbody > tr:nth-child(odd) > td, -.table-striped tbody > tr:nth-child(odd) > th { - background-color: transparent; -} - -.table-hover tbody tr:hover > td, -.table-hover tbody tr:hover > th { - background-color: #f5f5f5; -} - -table td[class*="span"], -table th[class*="span"], -.row-fluid table td[class*="span"], -.row-fluid table th[class*="span"] { - display: table-cell; - float: none; - margin-left: 0; -} - -.table td.span1, -.table th.span1 { - float: none; - width: 48px; - margin-left: 0; -} - -.table td.span2, -.table th.span2 { - float: none; - width: 128px; - margin-left: 0; -} - -.table td.span3, -.table th.span3 { - float: none; - width: 208px; - margin-left: 0; -} - -.table td.span4, -.table th.span4 { - float: none; - width: 288px; - margin-left: 0; -} - -.table td.span5, -.table th.span5 { - float: none; - width: 368px; - margin-left: 0; -} - -.table td.span6, -.table th.span6 { - float: none; - width: 448px; - margin-left: 0; -} - -.table td.span7, -.table th.span7 { - float: none; - width: 528px; - margin-left: 0; -} - -.table td.span8, -.table th.span8 { - float: none; - width: 608px; - margin-left: 0; -} - -.table td.span9, -.table th.span9 { - float: none; - width: 688px; - margin-left: 0; -} - -.table td.span10, -.table th.span10 { - float: none; - width: 768px; - margin-left: 0; -} - -.table td.span11, -.table th.span11 { - float: none; - width: 848px; - margin-left: 0; -} - -.table td.span12, -.table th.span12 { - float: none; - width: 928px; - margin-left: 0; -} - -.table tbody tr.success > td { - background-color: #000000; -} - -.table tbody tr.error > td { - background-color: #aa0000; -} - -.table tbody tr.warning > td { - background-color: #00aaaa; -} - -.table tbody tr.info > td { - background-color: #000000; -} - -.table-hover tbody tr.success:hover > td { - background-color: #000000; -} - -.table-hover tbody tr.error:hover > td { - background-color: #910000; -} - -.table-hover tbody tr.warning:hover > td { - background-color: #009091; -} - -.table-hover tbody tr.info:hover > td { - background-color: #000000; -} - -[class^="icon-"], -[class*=" icon-"] { - display: none; - width: 14px; - height: 14px; - margin-top: 1px; - *margin-right: 0.3em; - line-height: 20px; - vertical-align: text-top; - background-image: url("../img/glyphicons-halflings.png"); - background-position: 14px 14px; - background-repeat: no-repeat; -} - -/* White icons with optional class, or on hover/focus/active states of certain elements */ - -.icon-white, -.nav-pills > .active > a > [class^="icon-"], -.nav-pills > .active > a > [class*=" icon-"], -.nav-list > .active > a > [class^="icon-"], -.nav-list > .active > a > [class*=" icon-"], -.navbar-inverse .nav > .active > a > [class^="icon-"], -.navbar-inverse .nav > .active > a > [class*=" icon-"], -.dropdown-menu > li > a:hover > [class^="icon-"], -.dropdown-menu > li > a:focus > [class^="icon-"], -.dropdown-menu > li > a:hover > [class*=" icon-"], -.dropdown-menu > li > a:focus > [class*=" icon-"], -.dropdown-menu > .active > a > [class^="icon-"], -.dropdown-menu > .active > a > [class*=" icon-"], -.dropdown-submenu:hover > a > [class^="icon-"], -.dropdown-submenu:focus > a > [class^="icon-"], -.dropdown-submenu:hover > a > [class*=" icon-"], -.dropdown-submenu:focus > a > [class*=" icon-"] { - background-image: url("../img/glyphicons-halflings-white.png"); -} - -.icon-glass { - background-position: 0 0; -} - -.icon-music { - background-position: -24px 0; -} - -.icon-search { - background-position: -48px 0; -} - -.icon-envelope { - background-position: -72px 0; -} - -.icon-heart { - background-position: -96px 0; -} - -.icon-star { - background-position: -120px 0; -} - -.icon-star-empty { - background-position: -144px 0; -} - -.icon-user { - background-position: -168px 0; -} - -.icon-film { - background-position: -192px 0; -} - -.icon-th-large { - background-position: -216px 0; -} - -.icon-th { - background-position: -240px 0; -} - -.icon-th-list { - background-position: -264px 0; -} - -.icon-ok { - background-position: -288px 0; -} - -.icon-remove { - background-position: -312px 0; -} - -.icon-zoom-in { - background-position: -336px 0; -} - -.icon-zoom-out { - background-position: -360px 0; -} - -.icon-off { - background-position: -384px 0; -} - -.icon-signal { - background-position: -408px 0; -} - -.icon-cog { - background-position: -432px 0; -} - -.icon-trash { - background-position: -456px 0; -} - -.icon-home { - background-position: 0 -24px; -} - -.icon-file { - background-position: -24px -24px; -} - -.icon-time { - background-position: -48px -24px; -} - -.icon-road { - background-position: -72px -24px; -} - -.icon-download-alt { - background-position: -96px -24px; -} - -.icon-download { - background-position: -120px -24px; -} - -.icon-upload { - background-position: -144px -24px; -} - -.icon-inbox { - background-position: -168px -24px; -} - -.icon-play-circle { - background-position: -192px -24px; -} - -.icon-repeat { - background-position: -216px -24px; -} - -.icon-refresh { - background-position: -240px -24px; -} - -.icon-list-alt { - background-position: -264px -24px; -} - -.icon-lock { - background-position: -287px -24px; -} - -.icon-flag { - background-position: -312px -24px; -} - -.icon-headphones { - background-position: -336px -24px; -} - -.icon-volume-off { - background-position: -360px -24px; -} - -.icon-volume-down { - background-position: -384px -24px; -} - -.icon-volume-up { - background-position: -408px -24px; -} - -.icon-qrcode { - background-position: -432px -24px; -} - -.icon-barcode { - background-position: -456px -24px; -} - -.icon-tag { - background-position: 0 -48px; -} - -.icon-tags { - background-position: -25px -48px; -} - -.icon-book { - background-position: -48px -48px; -} - -.icon-bookmark { - background-position: -72px -48px; -} - -.icon-print { - background-position: -96px -48px; -} - -.icon-camera { - background-position: -120px -48px; -} - -.icon-font { - background-position: -144px -48px; -} - -.icon-bold { - background-position: -167px -48px; -} - -.icon-italic { - background-position: -192px -48px; -} - -.icon-text-height { - background-position: -216px -48px; -} - -.icon-text-width { - background-position: -240px -48px; -} - -.icon-align-left { - background-position: -264px -48px; -} - -.icon-align-center { - background-position: -288px -48px; -} - -.icon-align-right { - background-position: -312px -48px; -} - -.icon-align-justify { - background-position: -336px -48px; -} - -.icon-list { - background-position: -360px -48px; -} - -.icon-indent-left { - background-position: -384px -48px; -} - -.icon-indent-right { - background-position: -408px -48px; -} - -.icon-facetime-video { - background-position: -432px -48px; -} - -.icon-picture { - background-position: -456px -48px; -} - -.icon-pencil { - background-position: 0 -72px; -} - -.icon-map-marker { - background-position: -24px -72px; -} - -.icon-adjust { - background-position: -48px -72px; -} - -.icon-tint { - background-position: -72px -72px; -} - -.icon-edit { - background-position: -96px -72px; -} - -.icon-share { - background-position: -120px -72px; -} - -.icon-check { - background-position: -144px -72px; -} - -.icon-move { - background-position: -168px -72px; -} - -.icon-step-backward { - background-position: -192px -72px; -} - -.icon-fast-backward { - background-position: -216px -72px; -} - -.icon-backward { - background-position: -240px -72px; -} - -.icon-play { - background-position: -264px -72px; -} - -.icon-pause { - background-position: -288px -72px; -} - -.icon-stop { - background-position: -312px -72px; -} - -.icon-forward { - background-position: -336px -72px; -} - -.icon-fast-forward { - background-position: -360px -72px; -} - -.icon-step-forward { - background-position: -384px -72px; -} - -.icon-eject { - background-position: -408px -72px; -} - -.icon-chevron-left { - background-position: -432px -72px; -} - -.icon-chevron-right { - background-position: -456px -72px; -} - -.icon-plus-sign { - background-position: 0 -96px; -} - -.icon-minus-sign { - background-position: -24px -96px; -} - -.icon-remove-sign { - background-position: -48px -96px; -} - -.icon-ok-sign { - background-position: -72px -96px; -} - -.icon-question-sign { - background-position: -96px -96px; -} - -.icon-info-sign { - background-position: -120px -96px; -} - -.icon-screenshot { - background-position: -144px -96px; -} - -.icon-remove-circle { - background-position: -168px -96px; -} - -.icon-ok-circle { - background-position: -192px -96px; -} - -.icon-ban-circle { - background-position: -216px -96px; -} - -.icon-arrow-left { - background-position: -240px -96px; -} - -.icon-arrow-right { - background-position: -264px -96px; -} - -.icon-arrow-up { - background-position: -289px -96px; -} - -.icon-arrow-down { - background-position: -312px -96px; -} - -.icon-share-alt { - background-position: -336px -96px; -} - -.icon-resize-full { - background-position: -360px -96px; -} - -.icon-resize-small { - background-position: -384px -96px; -} - -.icon-plus { - background-position: -408px -96px; -} - -.icon-minus { - background-position: -433px -96px; -} - -.icon-asterisk { - background-position: -456px -96px; -} - -.icon-exclamation-sign { - background-position: 0 -120px; -} - -.icon-gift { - background-position: -24px -120px; -} - -.icon-leaf { - background-position: -48px -120px; -} - -.icon-fire { - background-position: -72px -120px; -} - -.icon-eye-open { - background-position: -96px -120px; -} - -.icon-eye-close { - background-position: -120px -120px; -} - -.icon-warning-sign { - background-position: -144px -120px; -} - -.icon-plane { - background-position: -168px -120px; -} - -.icon-calendar { - background-position: -192px -120px; -} - -.icon-random { - width: 16px; - background-position: -216px -120px; -} - -.icon-comment { - background-position: -240px -120px; -} - -.icon-magnet { - background-position: -264px -120px; -} - -.icon-chevron-up { - background-position: -288px -120px; -} - -.icon-chevron-down { - background-position: -313px -119px; -} - -.icon-retweet { - background-position: -336px -120px; -} - -.icon-shopping-cart { - background-position: -360px -120px; -} - -.icon-folder-close { - width: 16px; - background-position: -384px -120px; -} - -.icon-folder-open { - width: 16px; - background-position: -408px -120px; -} - -.icon-resize-vertical { - background-position: -432px -119px; -} - -.icon-resize-horizontal { - background-position: -456px -118px; -} - -.icon-hdd { - background-position: 0 -144px; -} - -.icon-bullhorn { - background-position: -24px -144px; -} - -.icon-bell { - background-position: -48px -144px; -} - -.icon-certificate { - background-position: -72px -144px; -} - -.icon-thumbs-up { - background-position: -96px -144px; -} - -.icon-thumbs-down { - background-position: -120px -144px; -} - -.icon-hand-right { - background-position: -144px -144px; -} - -.icon-hand-left { - background-position: -168px -144px; -} - -.icon-hand-up { - background-position: -192px -144px; -} - -.icon-hand-down { - background-position: -216px -144px; -} - -.icon-circle-arrow-right { - background-position: -240px -144px; -} - -.icon-circle-arrow-left { - background-position: -264px -144px; -} - -.icon-circle-arrow-up { - background-position: -288px -144px; -} - -.icon-circle-arrow-down { - background-position: -312px -144px; -} - -.icon-globe { - background-position: -336px -144px; -} - -.icon-wrench { - background-position: -360px -144px; -} - -.icon-tasks { - background-position: -384px -144px; -} - -.icon-filter { - background-position: -408px -144px; -} - -.icon-briefcase { - background-position: -432px -144px; -} - -.icon-fullscreen { - background-position: -456px -144px; -} - -.dropup, -.dropdown { - position: relative; -} - -.dropdown-toggle { - *margin-bottom: -3px; -} - -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - /* - border-top: 4px solid @black; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - */ -} - -.caret:before { - content: "▼"; -} - -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 9px 4px 9px 4px; - margin: -15.5px 4px 8px 4px; - list-style: none; - background-color: #bbbbbb; - border: 1px solid #000000; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: 0px 0px 0 5px #bbbbbb; - -moz-box-shadow: 0px 0px 0 5px #bbbbbb; - box-shadow: 0px 0px 0 5px #bbbbbb; - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - *width: 100%; - height: 1px; - height: 0; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #000000; -} - -.dropdown-menu > li > a { - display: block; - padding: 0 10px; - clear: both; - font-weight: normal; - line-height: 20px; - color: #000000; - white-space: nowrap; -} - -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus, -.dropdown-submenu:hover > a, -.dropdown-submenu:focus > a { - color: #bbbbbb; - text-decoration: none; -} - -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #bbbbbb; - text-decoration: none; - background-color: #fefe4a; - background-image: -moz-linear-gradient(top, #fefe54, #fefe3b); - background-image: -webkit-gradient( - linear, - 0 0, - 0 100%, - from(#fefe54), - to(#fefe3b) - ); - background-image: -webkit-linear-gradient(top, #fefe54, #fefe3b); - background-image: -o-linear-gradient(top, #fefe54, #fefe3b); - background-image: linear-gradient(to bottom, #fefe54, #fefe3b); - background-repeat: repeat-x; - outline: 0; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffefe54', endColorstr='#fffefe3b', GradientType=0); -} - -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #bbbbbb; -} - -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: default; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.open { - *z-index: 1000; -} - -.open > .dropdown-menu { - display: block; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 1px solid #000000; - content: ""; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} - -.dropdown-submenu { - position: relative; -} - -.dropdown-submenu > .dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.dropdown-submenu:hover > .dropdown-menu { - display: block; -} - -.dropup .dropdown-submenu > .dropdown-menu { - top: auto; - bottom: 0; - margin-top: 0; - margin-bottom: -2px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.dropdown-submenu > a:after { - display: block; - float: right; - width: 0; - height: 0; - margin-top: 5px; - margin-right: -10px; - border-color: transparent; - border-left-color: #cccccc; - border-style: solid; - border-width: 1px; - content: " "; -} - -.dropdown-submenu:hover > a:after { - border-left-color: #bbbbbb; -} - -.dropdown-submenu.pull-left { - float: none; -} - -.dropdown-submenu.pull-left > .dropdown-menu { - left: -100%; - margin-left: 10px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.dropdown .dropdown-menu .nav-header { - padding-right: 16px; - padding-left: 16px; -} - -.typeahead { - z-index: 1051; - margin-top: 2px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0); -} - -.well-large { - padding: 24px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.well-small { - padding: 9px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.in { - opacity: 1; -} - -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -.collapse.in { - height: auto; -} - -.close { - float: right; - font-size: 18px; - font-weight: normal; - line-height: 20px; - color: #000000; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.close:hover, -.close:focus { - color: #000000; - text-decoration: none; - cursor: pointer; -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.btn:hover:before, -.btn:hover:after { - color: #ffffff; -} - -.btn:before { - content: "< "; -} - -.btn:after { - content: " >"; -} - -.btn { - display: inline-block; - *display: inline; - padding: 0 10px; - margin-bottom: 20px; - *margin-left: 0.3em; - font-size: 18px; - line-height: 20px; - color: #000000; - text-align: center; - vertical-align: middle; - cursor: default; - background: #bbbbbb; - border: 0; - border-width: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - *zoom: 1; - -webkit-box-shadow: 10px 10px 0 #000000; - -moz-box-shadow: 10px 10px 0 #000000; - box-shadow: 10px 10px 0 #000000; -} - -.btn:first-child { - *margin-left: 0; -} - -.btn:hover, -.btn:focus { - color: #ffffff; - text-decoration: none; - background: #555555; - outline: 0; -} - -.btn:focus { - outline: thin solid #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn.active, -.btn:active { - margin: 10px 0 10px 10px; - outline: 0; - -webkit-box-shadow: 0 0 0; - -moz-box-shadow: 0 0 0; - box-shadow: 0 0 0; -} - -.btn.disabled, -.btn[disabled] { - cursor: default; - background-image: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-large { - padding: 10px 10px; - font-size: 18px; - color: #000000; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-large [class^="icon-"], -.btn-large [class*=" icon-"] { - margin-top: 4px; -} - -.btn-small { - padding: 0; - font-size: 18px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-small [class^="icon-"], -.btn-small [class*=" icon-"] { - margin-top: 0; -} - -.btn-mini [class^="icon-"], -.btn-mini [class*=" icon-"] { - margin-top: -1px; -} - -.btn-mini { - padding: 0; - font-size: 18px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-block { - display: block; - width: 100%; - padding-right: 0; - padding-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.btn-block + .btn-block { - margin-top: 5px; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.btn-primary { - color: #000000; - background: #bbbbbb; -} - -.btn-warning { - *background-color: #f47a00; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - color: #ffffff; -} - -.btn-danger { - *background-color: #ee5f5b; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - color: #ffffff; -} - -.btn-success { - *background-color: #62c462; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - color: #ffffff; -} - -.btn-info { - *background-color: #5bc0de; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - color: #ffffff; -} - -.btn-inverse { - *background-color: #555555; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-inverse:hover, -.btn-inverse:focus, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - color: #ffffff; -} - -button.btn, -input[type="submit"].btn { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} - -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} - -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 0; - *padding-bottom: 0; -} - -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 0; - *padding-bottom: 0; -} - -.btn-link, -.btn-link:active, -.btn-link[disabled] { - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-link { - color: #fefe54; - cursor: pointer; - border-color: transparent; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-link:hover, -.btn-link:focus { - color: #fefe54; - text-decoration: none; - background-color: #00aa00; -} - -.btn-link[disabled]:hover, -.btn-link[disabled]:focus { - color: #555555; - text-decoration: none; -} - -.btn-group { - position: relative; - display: inline-block; - *display: inline; - *margin-left: 0.3em; - font-size: 0; - white-space: nowrap; - vertical-align: middle; - *zoom: 1; -} - -.btn-group:first-child { - *margin-left: 0; -} - -.btn-group + .btn-group { - margin-left: 0; -} - -.btn-toolbar { - margin-top: 20px; - margin-bottom: 20px; - font-size: 0; -} - -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group { - margin-left: 5px; -} - -.btn-group > .btn { - position: relative; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group > .btn + .btn { - margin-left: -1px; -} - -.btn-group > .btn, -.btn-group > .dropdown-menu, -.btn-group > .popover { - font-size: 18px; -} - -.btn-group > .btn-mini { - font-size: 18px; -} - -.btn-group > .btn-small { - font-size: 18px; -} - -.btn-group > .btn-large { - font-size: 18px; -} - -.btn-group > .btn:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 0; - border-bottom-left-radius: 0; - -webkit-border-top-left-radius: 0; - border-top-left-radius: 0; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topleft: 0; -} - -.btn-group > .btn:last-child, -.btn-group > .dropdown-toggle { - -webkit-border-top-right-radius: 0; - border-top-right-radius: 0; - -webkit-border-bottom-right-radius: 0; - border-bottom-right-radius: 0; - -moz-border-radius-topright: 0; - -moz-border-radius-bottomright: 0; -} - -.btn-group > .btn.large:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 0; - border-bottom-left-radius: 0; - -webkit-border-top-left-radius: 0; - border-top-left-radius: 0; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topleft: 0; -} - -.btn-group > .btn.large:last-child, -.btn-group > .large.dropdown-toggle { - -webkit-border-top-right-radius: 0; - border-top-right-radius: 0; - -webkit-border-bottom-right-radius: 0; - border-bottom-right-radius: 0; - -moz-border-radius-topright: 0; - -moz-border-radius-bottomright: 0; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group > .btn + .dropdown-toggle { - *padding-top: 14px; - padding-right: 8px; - *padding-bottom: 14px; - padding-left: 8px; -} - -.btn-group > .btn-mini + .dropdown-toggle { - *padding-top: 2px; - padding-right: 5px; - *padding-bottom: 2px; - padding-left: 5px; -} - -.btn-group > .btn-small + .dropdown-toggle { - *padding-top: 5px; - *padding-bottom: 4px; -} - -.btn-group > .btn-large + .dropdown-toggle { - *padding-top: 7px; - padding-right: 12px; - *padding-bottom: 7px; - padding-left: 12px; -} - -.btn-group.open .dropdown-toggle { - background-image: none; -} - -.btn-group.open .btn.dropdown-toggle { - background-color: #aa5500; -} - -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #fefe54; -} - -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #a85400; -} - -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} - -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} - -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} - -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #555555; -} - -.btn .caret { - margin-top: 0; - margin-left: 0; -} - -.btn-large .caret { - margin-top: 0; -} - -.btn-large .caret { - border-top-width: 5px; - border-right-width: 5px; - border-left-width: 5px; -} - -.btn-mini .caret, -.btn-small .caret { - margin-top: 0; -} - -.dropup .btn-large .caret { - border-bottom-width: 5px; -} - -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.btn-group-vertical { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} - -.btn-group-vertical > .btn { - display: block; - float: none; - max-width: 100%; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group-vertical > .btn + .btn { - margin-top: -1px; - margin-left: 0; -} - -.btn-group-vertical > .btn:first-child { - -webkit-border-radius: 0 0px 0 0; - -moz-border-radius: 0 0px 0 0; - border-radius: 0 0px 0 0; -} - -.btn-group-vertical > .btn:last-child { - -webkit-border-radius: 0 0 0 0px; - -moz-border-radius: 0 0 0 0px; - border-radius: 0 0 0 0px; -} - -.btn-group-vertical > .btn-large:first-child { - -webkit-border-radius: 0 0px 0 0; - -moz-border-radius: 0 0px 0 0; - border-radius: 0 0px 0 0; -} - -.btn-group-vertical > .btn-large:last-child { - -webkit-border-radius: 0 0 0 0px; - -moz-border-radius: 0 0 0 0px; - border-radius: 0 0 0 0px; -} - -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 20px; - text-shadow: 0; - background-color: #00aaaa; - border: 1px solid #00aaaa; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.alert, -.alert h4 { - color: #ffffff; -} - -.alert h4 { - margin: 0; -} - -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 20px; -} - -.alert-success { - color: #00aa00; - background-color: #000000; - border-color: #000000; -} - -.alert-success h4 { - color: #00aa00; -} - -.alert-danger, -.alert-error { - color: #ffffff; - background-color: #aa0000; - border-color: #aa0000; -} - -.alert-danger h4, -.alert-error h4 { - color: #ffffff; -} - -.alert-info { - color: #000000; - background-color: #000000; - border-color: #000000; -} - -.alert-info h4 { - color: #000000; -} - -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} - -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} - -.alert-block p + p { - margin-top: 5px; -} - -.nav { - margin-bottom: 20px; - margin-left: 0; - list-style: none; - background: #bbbbbb; -} - -.nav > li > a { - display: block; -} - -.nav > li > a::first-letter { - color: #aa0000; -} - -.nav > li > a:hover, -.nav > li > a:focus { - color: #bbbbbb; - text-decoration: none; - background-color: #000000; -} - -.nav > li > a > img { - max-width: none; -} - -.nav > .pull-right { - float: right; -} - -.nav-header { - display: block; - font-weight: normal; - line-height: 20px; - color: #000000; - text-transform: uppercase; -} - -.nav li + .nav-header { - line-height: 20px; -} - -.nav-list { - display: block; - padding: 10px 15px; - margin: 10px 5px; - margin-left: -5px; - border: 2px solid #000000; - -webkit-box-shadow: - 0 0 0 5px, - 11px 13px 0 4px black; - -moz-box-shadow: - 0 0 0 5px, - 11px 13px 0 4px black; - box-shadow: - 0 0 0 5px, - 11px 13px 0 4px black; -} - -.nav-list > li > a, -.nav-list .nav-header { - margin-right: -10px; - margin-left: -10px; -} - -.nav-list > li > a { - padding: 0 8px; - color: #000000; -} - -.nav-list > .active > a, -.nav-list > .active > a:hover, -.nav-list > .active > a:focus { - color: #ffffff; - background-color: #00aaaa; -} - -.nav-list [class^="icon-"], -.nav-list [class*=" icon-"] { - margin-right: 0; -} - -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #000000; - border-bottom: 1px solid #000000; -} - -.nav-tabs, -.nav-pills { - *zoom: 1; -} - -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - line-height: 0; - content: ""; -} - -.nav-tabs:after, -.nav-pills:after { - clear: both; -} - -.nav-tabs > li, -.nav-pills > li { - float: left; -} - -.nav-tabs > li > a, -.nav-pills > li > a { - padding-right: 8px; - padding-left: 8px; - margin-right: 0; - line-height: 20px; - color: #000000; -} - -.nav-tabs { - border-bottom: 0.5em solid #bbbbbb; -} - -.nav-tabs > li { - margin-bottom: -1px; -} - -.nav-tabs > li > a { - line-height: 20px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.nav-tabs > li > a:hover, -.nav-tabs > li > a:focus { - background: #000000; -} - -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover, -.nav-tabs > .active > a:focus { - color: #bbbbbb; - cursor: default; - background-color: #000084; - border: 0; - border-bottom-color: transparent; -} - -.nav-pills > li > a { - padding-top: 0; - padding-bottom: 0; - margin-top: 0; - margin-bottom: 0; - line-height: 20px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.nav-pills > .active > a, -.nav-pills > .active > a:hover, -.nav-pills > .active > a:focus { - color: #bbbbbb; - background-color: #fefe54; -} - -.nav-stacked > li { - float: none; -} - -.nav-stacked > li > a { - margin-right: 0; -} - -.nav-tabs.nav-stacked { - border-bottom: 0; -} - -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-top-right-radius: 0; - border-top-right-radius: 0; - -webkit-border-top-left-radius: 0; - border-top-left-radius: 0; - -moz-border-radius-topright: 0; - -moz-border-radius-topleft: 0; -} - -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-bottom-right-radius: 0; - border-bottom-right-radius: 0; - -webkit-border-bottom-left-radius: 0; - border-bottom-left-radius: 0; - -moz-border-radius-bottomright: 0; - -moz-border-radius-bottomleft: 0; -} - -.nav-tabs.nav-stacked > li > a:hover, -.nav-tabs.nav-stacked > li > a:focus { - z-index: 2; - border-color: #ddd; -} - -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} - -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} - -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.nav-pills .dropdown-menu { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.nav .dropdown-toggle .caret { - margin-top: 6px; - border-top-color: #fefe54; - border-bottom-color: #fefe54; -} - -.nav .dropdown-toggle:hover .caret, -.nav .dropdown-toggle:focus .caret { - border-top-color: #fefe54; - border-bottom-color: #fefe54; -} - -/* move down carets for tabs */ - -.nav .active .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} - -.nav-tabs .active .dropdown-toggle .caret { - border-top-color: #bbbbbb; - border-bottom-color: #bbbbbb; -} - -.nav > .dropdown.active > a:hover, -.nav > .dropdown.active > a:focus { - cursor: pointer; -} - -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover, -.nav > li.dropdown.open.active > a:focus { - color: #ffffff; - background-color: #bbbbbb; - border-color: #bbbbbb; -} - -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret, -.nav li.dropdown.open a:focus .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 1; - filter: alpha(opacity=100); -} - -.tabs-stacked .open > a:hover, -.tabs-stacked .open > a:focus { - border-color: #bbbbbb; -} - -.tabbable { - *zoom: 1; -} - -.tabbable:before, -.tabbable:after { - display: table; - line-height: 0; - content: ""; -} - -.tabbable:after { - clear: both; -} - -.tab-content { - overflow: auto; -} - -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} - -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} - -.tab-content > .active, -.pill-content > .active { - display: block; -} - -.tabs-below > .nav-tabs { - border-top: 1px solid #ddd; -} - -.tabs-below > .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} - -.tabs-below > .nav-tabs > li > a { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.tabs-below > .nav-tabs > li > a:hover, -.tabs-below > .nav-tabs > li > a:focus { - border-top-color: #ddd; - border-bottom-color: transparent; -} - -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover, -.tabs-below > .nav-tabs > .active > a:focus { - border-color: transparent #ddd #ddd #ddd; -} - -.tabs-left > .nav-tabs > li, -.tabs-right > .nav-tabs > li { - float: none; -} - -.tabs-left > .nav-tabs > li > a, -.tabs-right > .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 0; -} - -.tabs-left > .nav-tabs { - float: left; - margin-right: 18px; - border-right: 1px solid #ddd; -} - -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.tabs-left > .nav-tabs > li > a:hover, -.tabs-left > .nav-tabs > li > a:focus { - border-color: #bbbbbb #dddddd #bbbbbb #bbbbbb; -} - -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover, -.tabs-left > .nav-tabs .active > a:focus { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #ffffff; -} - -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} - -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.tabs-right > .nav-tabs > li > a:hover, -.tabs-right > .nav-tabs > li > a:focus { - border-color: #bbbbbb #bbbbbb #bbbbbb #dddddd; -} - -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover, -.tabs-right > .nav-tabs .active > a:focus { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #ffffff; -} - -.nav > .disabled > a { - color: #bbbbbb; -} - -.nav > .disabled > a:hover, -.nav > .disabled > a:focus { - text-decoration: none; - cursor: default; - background-color: transparent; -} - -.navbar { - *position: relative; - *z-index: 2; - margin-bottom: 20px; - overflow: visible; -} - -.navbar-inner { - min-height: 20px; - padding-right: 12.4px; - padding-left: 12.4px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - *zoom: 1; - -webkit-box-shadow: 0; - -moz-box-shadow: 0; - box-shadow: 0; -} - -.navbar-inner:before, -.navbar-inner:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-inner:after { - clear: both; -} - -.navbar .container { - width: auto; -} - -.nav-collapse.collapse { - height: auto; - overflow: visible; -} - -.navbar .brand { - display: block; - float: left; - padding: 0 10px; - margin-left: -10px; - font-size: 18px; - color: #000084; - text-shadow: 0; -} - -.navbar .brand:hover, -.navbar .brand:focus { - text-decoration: none; -} - -.navbar-text { - margin-bottom: 0; - line-height: 20px; - color: #000000; -} - -.navbar-link { - color: #000000; -} - -.navbar-link:hover, -.navbar-link:focus { - color: #555555; -} - -.navbar .divider-vertical { - height: 20px; - margin: 0 12.4px; - border-right: 1px solid #ffffff; - border-left: 1px solid #bbbbbb; -} - -.navbar .btn, -.navbar .btn-group { - margin-top: -5px; -} - -.navbar .btn-group .btn, -.navbar .input-prepend .btn, -.navbar .input-append .btn, -.navbar .input-prepend .btn-group, -.navbar .input-append .btn-group { - margin-top: 0; -} - -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} - -.navbar-form:before, -.navbar-form:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-form:after { - clear: both; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: -5px; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .btn { - display: inline-block; - margin-bottom: 0; - -webkit-box-shadow: 0 0; - -moz-box-shadow: 0 0; - box-shadow: 0 0; -} - -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} - -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 5px; - white-space: nowrap; -} - -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} - -.navbar-search { - position: relative; - float: left; - margin-top: -5px; - margin-bottom: 0; -} - -.navbar-search .search-query { - padding: 4px 12.4px; - margin-bottom: 0; - font-family: DOS, Monaco, Menlo, Consolas, "Courier New", monospace; - font-size: 18px; - font-weight: normal; - line-height: 1; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-static-top { - position: static; - margin-bottom: 0; -} - -.navbar-static-top .navbar-inner { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - border-width: 0; -} - -.navbar-fixed-bottom .navbar-inner { - border-width: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-right: 0; - padding-left: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 944px; -} - -.navbar-fixed-top { - top: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - -webkit-box-shadow: 0; - -moz-box-shadow: 0; - box-shadow: 0; -} - -.navbar-fixed-bottom { - bottom: 0; -} - -.navbar-fixed-bottom .navbar-inner { - -webkit-box-shadow: 0; - -moz-box-shadow: 0; - box-shadow: 0; -} - -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 20px 0 0; -} - -.navbar .nav.pull-right { - float: right; - margin-right: 0; -} - -.navbar .nav > li { - float: left; - padding-left: 0; -} - -.navbar .nav > li > a { - float: none; - padding: 0 10px; - color: #000000; - text-decoration: none; - text-shadow: 0; -} - -.navbar .nav .dropdown-toggle .caret { - margin-top: 0; -} - -.navbar .nav > li > a:focus, -.navbar .nav > li > a:hover { - color: #555555; - text-decoration: none; - background-color: transparent; -} - -.navbar .nav > .active > a, -.navbar .nav > .active > a:hover, -.navbar .nav > .active > a:focus { - color: #bbbbbb; - text-decoration: none; - background-color: #bbbbbb; -} - -.navbar .btn-navbar { - display: none; - float: right; - padding: 0 12.4px; - margin-right: 12.4px; - margin-left: 12.4px; - *background-color: #aeaeae; - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.navbar .btn-navbar:hover, -.navbar .btn-navbar:focus, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - color: #ffffff; -} - -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} - -.navbar .nav > li > .dropdown-menu:before { - position: absolute; - top: -7px; - left: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ""; -} - -.navbar .nav > li > .dropdown-menu:after { - position: absolute; - top: -6px; - left: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - border-left: 6px solid transparent; - content: ""; -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:before { - top: auto; - bottom: -7px; - border-top: 7px solid #ccc; - border-bottom: 0; - border-top-color: rgba(0, 0, 0, 0.2); -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:after { - top: auto; - bottom: -6px; - border-top: 6px solid #ffffff; - border-bottom: 0; -} - -.navbar .nav li.dropdown > a:hover .caret, -.navbar .nav li.dropdown > a:focus .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - color: #bbbbbb; - background-color: #bbbbbb; -} - -.navbar .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #000000; - border-bottom-color: #000000; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #bbbbbb; - border-bottom-color: #bbbbbb; -} - -.navbar .pull-right > li > .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:before, -.navbar .nav > li > .dropdown-menu.pull-right:before { - right: 12px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:after, -.navbar .nav > li > .dropdown-menu.pull-right:after { - right: 13px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { - right: 100%; - left: auto; - margin-right: -1px; - margin-left: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-inverse .navbar-inner { - background: #bbbbbb; -} - -.navbar-inverse .brand, -.navbar-inverse .nav > li > a { - color: #000000; - text-shadow: 0; - background: #bbbbbb; -} - -.navbar-inverse .brand:hover, -.navbar-inverse .nav > li > a:hover, -.navbar-inverse .brand:focus, -.navbar-inverse .nav > li > a:focus { - color: #bbbbbb; - background: #000000; -} - -.navbar-inverse .brand { - color: #000084; -} - -.navbar-inverse .navbar-text { - color: #000000; -} - -.navbar-inverse .nav > li > a:focus, -.navbar-inverse .nav > li > a:hover { - color: #bbbbbb; - background: #000000; -} - -.navbar-inverse .nav .active > a, -.navbar-inverse .nav .active > a:hover, -.navbar-inverse .nav .active > a:focus { - color: #bbbbbb; - text-decoration: none; - background: #000000; -} - -.navbar-inverse .navbar-link { - color: #000000; -} - -.navbar-inverse .navbar-link:hover, -.navbar-inverse .navbar-link:focus { - color: #ffffff; -} - -.navbar-inverse .divider-vertical { - border-right-color: #000000; - border-left-color: #000000; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - color: #ffffff; - background-color: #000000; -} - -.navbar-inverse .nav li.dropdown > a:hover .caret, -.navbar-inverse .nav li.dropdown > a:focus .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #000000; - border-bottom-color: #000000; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .navbar-search .search-query { - color: #ffffff; - background-color: #404040; - border-color: #000000; - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; -} - -.navbar-inverse .navbar-search .search-query:-moz-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:focus, -.navbar-inverse .navbar-search .search-query.focused { - padding: 0 20px; - color: #555555; - text-shadow: 0; - background-color: #ffffff; - border: 0; - outline: 0; -} - -.navbar-inverse .btn-navbar { - *background-color: #000000; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.navbar-inverse .btn-navbar:hover, -.navbar-inverse .btn-navbar:focus, -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active, -.navbar-inverse .btn-navbar.disabled, -.navbar-inverse .btn-navbar[disabled] { - color: #ffffff; -} - -.breadcrumb:before { - content: ">>"; -} - -.breadcrumb { - padding: 0 20px; - margin: 0 0 20px; - list-style: none; - background-color: #000000; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.breadcrumb > li { - display: inline-block; - *display: inline; - text-shadow: 0; - *zoom: 1; -} - -.breadcrumb > li > .divider { - padding: 0 10px; - color: #bbbbbb; -} - -.breadcrumb > .active { - color: #bbbbbb; -} - -.pagination { - margin: 20px 0; -} - -.pagination ul { - display: inline-block; - *display: inline; - margin-bottom: 0; - margin-left: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - *zoom: 1; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.pagination ul > li { - display: inline; -} - -.pagination ul > li > a, -.pagination ul > li > span { - float: left; - padding: 20px 10px; - line-height: 20px; - text-decoration: none; - background-color: #00aa00; - border: 0; - border-left-width: 0; -} - -.pagination ul > li > a:hover, -.pagination ul > li > a:focus, -.pagination ul > .active > a, -.pagination ul > .active > span { - background-color: #f5f5f5; -} - -.pagination ul > .active > a, -.pagination ul > .active > span { - color: #bbbbbb; - cursor: default; -} - -.pagination ul > .disabled > span, -.pagination ul > .disabled > a, -.pagination ul > .disabled > a:hover, -.pagination ul > .disabled > a:focus { - color: #bbbbbb; - cursor: default; - background-color: transparent; -} - -.pagination ul > li:first-child > a, -.pagination ul > li:first-child > span { - border-left-width: 1px; - -webkit-border-bottom-left-radius: 0; - border-bottom-left-radius: 0; - -webkit-border-top-left-radius: 0; - border-top-left-radius: 0; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topleft: 0; -} - -.pagination ul > li:last-child > a, -.pagination ul > li:last-child > span { - -webkit-border-top-right-radius: 0; - border-top-right-radius: 0; - -webkit-border-bottom-right-radius: 0; - border-bottom-right-radius: 0; - -moz-border-radius-topright: 0; - -moz-border-radius-bottomright: 0; -} - -.pagination-centered { - text-align: center; -} - -.pagination-right { - text-align: right; -} - -.pagination-large ul > li > a, -.pagination-large ul > li > span { - padding: 18px; - font-size: 18px; -} - -.pagination-large ul > li:first-child > a, -.pagination-large ul > li:first-child > span { - -webkit-border-bottom-left-radius: 0; - border-bottom-left-radius: 0; - -webkit-border-top-left-radius: 0; - border-top-left-radius: 0; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topleft: 0; -} - -.pagination-large ul > li:last-child > a, -.pagination-large ul > li:last-child > span { - -webkit-border-top-right-radius: 0; - border-top-right-radius: 0; - -webkit-border-bottom-right-radius: 0; - border-bottom-right-radius: 0; - -moz-border-radius-topright: 0; - -moz-border-radius-bottomright: 0; -} - -.pagination-mini ul > li:first-child > a, -.pagination-small ul > li:first-child > a, -.pagination-mini ul > li:first-child > span, -.pagination-small ul > li:first-child > span { - -webkit-border-bottom-left-radius: 0; - border-bottom-left-radius: 0; - -webkit-border-top-left-radius: 0; - border-top-left-radius: 0; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topleft: 0; -} - -.pagination-mini ul > li:last-child > a, -.pagination-small ul > li:last-child > a, -.pagination-mini ul > li:last-child > span, -.pagination-small ul > li:last-child > span { - -webkit-border-top-right-radius: 0; - border-top-right-radius: 0; - -webkit-border-bottom-right-radius: 0; - border-bottom-right-radius: 0; - -moz-border-radius-topright: 0; - -moz-border-radius-bottomright: 0; -} - -.pagination-small ul > li > a, -.pagination-small ul > li > span { - padding: 0; - font-size: 18px; -} - -.pagination-mini ul > li > a, -.pagination-mini ul > li > span { - padding: 0; - font-size: 18px; -} - -.pager { - margin: 20px 0; - text-align: center; - list-style: none; - *zoom: 1; -} - -.pager:before, -.pager:after { - display: table; - line-height: 0; - content: ""; -} - -.pager:after { - clear: both; -} - -.pager li { - display: inline; -} - -.pager li > a, -.pager li > span { - display: inline-block; - padding: 0 20px; - background-color: #555555; -} - -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; -} - -.pager .next > a, -.pager .next > span { - float: right; -} - -.pager .previous > a, -.pager .previous > span { - float: left; -} - -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #bbbbbb; - cursor: default; - background-color: #555555; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} - -.modal-backdrop.fade { - opacity: 0; -} - -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.modal { - position: fixed; - top: 10%; - left: 50%; - z-index: 1050; - width: 560px; - margin-left: -280px; - background-color: #ffffff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - outline: none; - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} - -.modal.fade { - top: -25%; -} - -.modal.fade.in { - top: 10%; -} - -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} - -.modal-header .close { - margin-top: 2px; -} - -.modal-header h3 { - margin: 0; - line-height: 30px; -} - -.modal-body { - position: relative; - max-height: 400px; - padding: 15px; - overflow-y: auto; -} - -.modal-form { - margin-bottom: 0; -} - -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - *zoom: 1; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - line-height: 0; - content: ""; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} - -.tooltip { - position: absolute; - z-index: 1030; - display: block; - font-size: 18px; - line-height: 1; - opacity: 0; - filter: alpha(opacity=0); - visibility: visible; -} - -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.tooltip.top { - padding: 9px 0 9px; - margin-top: -3px; -} - -.tooltip.right { - padding: 0 4px 0 4px; - margin-left: 3px; -} - -.tooltip.bottom { - padding: 9px 0 9px; - margin-top: 3px; -} - -.tooltip.left { - padding: 0 4px 0 4px; - margin-left: -3px; -} - -.tooltip-inner { - max-width: 310px; - padding: 9px 4px 9px 4px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-right-color: #000000; - border-width: 5px 5px 5px 0; -} - -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-left-color: #000000; - border-width: 5px 0 5px 5px; -} - -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 496px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #ffffff; - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.popover.top { - margin-top: -10px; -} - -.popover.right { - margin-left: 10px; -} - -.popover.bottom { - margin-top: 10px; -} - -.popover.left { - margin-left: -10px; -} - -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #ffffff; - border-bottom: 1px solid #f2f2f2; -} - -.popover-title:empty { - display: none; -} - -.popover-content { - padding: 9px 14px; -} - -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover .arrow { - border-width: 11px; -} - -.popover .arrow:after { - border-width: 10px; - content: ""; -} - -.popover.top .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, 0.25); - border-bottom-width: 0; -} - -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - border-top-color: #ffffff; - border-bottom-width: 0; -} - -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, 0.25); - border-left-width: 0; -} - -.popover.right .arrow:after { - bottom: -10px; - left: 1px; - border-right-color: #ffffff; - border-left-width: 0; -} - -.popover.bottom .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, 0.25); - border-top-width: 0; -} - -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - border-bottom-color: #ffffff; - border-top-width: 0; -} - -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, 0.25); - border-right-width: 0; -} - -.popover.left .arrow:after { - right: 1px; - bottom: -10px; - border-left-color: #ffffff; - border-right-width: 0; -} - -.thumbnails { - margin-left: -16px; - list-style: none; - *zoom: 1; -} - -.thumbnails:before, -.thumbnails:after { - display: table; - line-height: 0; - content: ""; -} - -.thumbnails:after { - clear: both; -} - -.row-fluid .thumbnails { - margin-left: 0; -} - -.thumbnails > li { - float: left; - margin-bottom: 20px; - margin-left: 16px; -} - -.thumbnail { - display: block; - padding: 3px 6px; - margin: 4px 3px; - line-height: 20px; - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: 0; - -moz-box-shadow: 0; - box-shadow: 0; -} - -a.thumbnail:hover, -a.thumbnail:focus { - border-color: #fefe54; - -webkit-box-shadow: 0; - -moz-box-shadow: 0; - box-shadow: 0; -} - -.thumbnail > img { - display: block; - max-width: 100%; - margin-right: auto; - margin-left: auto; -} - -.thumbnail .caption { - padding: 9px; - color: #bbbbbb; -} - -.media, -.media-body { - overflow: hidden; - *overflow: visible; - zoom: 1; -} - -.media, -.media .media { - margin-top: 15px; -} - -.media:first-child { - margin-top: 0; -} - -.media-object { - display: block; -} - -.media-heading { - margin: 0 0 5px; -} - -.media > .pull-left { - margin-right: 10px; -} - -.media > .pull-right { - margin-left: 10px; -} - -.media-list { - margin-left: 0; - list-style: none; -} - -.label, -.badge { - display: inline-block; - padding: 0 12.4px; - font-size: 18px; - line-height: 20px; - color: #ffffff; - white-space: nowrap; - vertical-align: baseline; - background-color: #555555; -} - -.badge { - padding-right: 12.4px; - padding-left: 12.4px; -} - -.label:empty, -.badge:empty { - display: none; -} - -a.label:hover, -a.label:focus, -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.label-important, -.badge-important { - background-color: #aa0000; -} - -.label-important[href], -.badge-important[href] { - background-color: #aa0000; -} - -.label-warning, -.badge-warning { - background-color: #a85400; -} - -.label-warning[href], -.badge-warning[href] { - background-color: #a85400; -} - -.label-success, -.badge-success { - background-color: #00aa00; -} - -.label-success[href], -.badge-success[href] { - background-color: #00aa00; -} - -.label-info, -.badge-info { - background-color: #000000; -} - -.label-info[href], -.badge-info[href] { - background-color: #000000; -} - -.label-inverse, -.badge-inverse { - background-color: #555555; -} - -.label-inverse[href], -.badge-inverse[href] { - background-color: #555555; -} - -.btn .label, -.btn .badge { - position: relative; - top: -1px; -} - -.btn-mini .label, -.btn-mini .badge { - top: 0; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient( - linear, - 0 0, - 0 100%, - from(#f5f5f5), - to(#f9f9f9) - ); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); -} - -.progress .bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - color: #ffffff; - text-align: center; - text-shadow: 0; - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient( - linear, - 0 0, - 0 100%, - from(#149bdf), - to(#0480be) - ); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(to bottom, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress-striped .bar { - background-color: #149bdf; - background-image: -webkit-gradient( - linear, - 0 100%, - 100% 0, - color-stop(0.25, rgba(255, 255, 255, 0.15)), - color-stop(0.25, transparent), - color-stop(0.5, transparent), - color-stop(0.5, rgba(255, 255, 255, 0.15)), - color-stop(0.75, rgba(255, 255, 255, 0.15)), - color-stop(0.75, transparent), - to(transparent) - ); - background-image: -webkit-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); - background-image: -moz-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); - background-image: -o-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); - background-image: linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} - -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-danger .bar, -.progress .bar-danger { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient( - linear, - 0 0, - 0 100%, - from(#ee5f5b), - to(#c43c35) - ); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); -} - -.progress-danger.progress-striped .bar, -.progress-striped .bar-danger { - background-color: #ee5f5b; - background-image: -webkit-gradient( - linear, - 0 100%, - 100% 0, - color-stop(0.25, rgba(255, 255, 255, 0.15)), - color-stop(0.25, transparent), - color-stop(0.5, transparent), - color-stop(0.5, rgba(255, 255, 255, 0.15)), - color-stop(0.75, rgba(255, 255, 255, 0.15)), - color-stop(0.75, transparent), - to(transparent) - ); - background-image: -webkit-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); - background-image: -moz-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); - background-image: -o-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); - background-image: linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); -} - -.progress-success .bar, -.progress .bar-success { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient( - linear, - 0 0, - 0 100%, - from(#62c462), - to(#57a957) - ); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(to bottom, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); -} - -.progress-success.progress-striped .bar, -.progress-striped .bar-success { - background-color: #62c462; - background-image: -webkit-gradient( - linear, - 0 100%, - 100% 0, - color-stop(0.25, rgba(255, 255, 255, 0.15)), - color-stop(0.25, transparent), - color-stop(0.5, transparent), - color-stop(0.5, rgba(255, 255, 255, 0.15)), - color-stop(0.75, rgba(255, 255, 255, 0.15)), - color-stop(0.75, transparent), - to(transparent) - ); - background-image: -webkit-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); - background-image: -moz-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); - background-image: -o-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); - background-image: linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); -} - -.progress-info .bar, -.progress .bar-info { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient( - linear, - 0 0, - 0 100%, - from(#5bc0de), - to(#339bb9) - ); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(to bottom, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); -} - -.progress-info.progress-striped .bar, -.progress-striped .bar-info { - background-color: #5bc0de; - background-image: -webkit-gradient( - linear, - 0 100%, - 100% 0, - color-stop(0.25, rgba(255, 255, 255, 0.15)), - color-stop(0.25, transparent), - color-stop(0.5, transparent), - color-stop(0.5, rgba(255, 255, 255, 0.15)), - color-stop(0.75, rgba(255, 255, 255, 0.15)), - color-stop(0.75, transparent), - to(transparent) - ); - background-image: -webkit-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); - background-image: -moz-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); - background-image: -o-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); - background-image: linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); -} - -.progress-warning .bar, -.progress .bar-warning { - background-color: #d66b00; - background-image: -moz-linear-gradient(top, #f47a00, #a85400); - background-image: -webkit-gradient( - linear, - 0 0, - 0 100%, - from(#f47a00), - to(#a85400) - ); - background-image: -webkit-linear-gradient(top, #f47a00, #a85400); - background-image: -o-linear-gradient(top, #f47a00, #a85400); - background-image: linear-gradient(to bottom, #f47a00, #a85400); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff47a00', endColorstr='#ffa85400', GradientType=0); -} - -.progress-warning.progress-striped .bar, -.progress-striped .bar-warning { - background-color: #f47a00; - background-image: -webkit-gradient( - linear, - 0 100%, - 100% 0, - color-stop(0.25, rgba(255, 255, 255, 0.15)), - color-stop(0.25, transparent), - color-stop(0.5, transparent), - color-stop(0.5, rgba(255, 255, 255, 0.15)), - color-stop(0.75, rgba(255, 255, 255, 0.15)), - color-stop(0.75, transparent), - to(transparent) - ); - background-image: -webkit-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); - background-image: -moz-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); - background-image: -o-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); - background-image: linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); -} - -.accordion { - margin-bottom: 20px; -} - -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.accordion-heading { - border-bottom: 0; -} - -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} - -.accordion-toggle { - cursor: pointer; -} - -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} - -.carousel { - position: relative; - margin-bottom: 20px; - line-height: 1; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel-inner > .item { - position: relative; - display: none; -} - -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - line-height: 1; -} - -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} - -.carousel-inner > .active { - left: 0; -} - -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} - -.carousel-inner > .next { - left: 100%; -} - -.carousel-inner > .prev { - left: -100%; -} - -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} - -.carousel-inner > .active.left { - left: -100%; -} - -.carousel-inner > .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - font-weight: 100; - line-height: 30px; - color: #ffffff; - text-align: center; - background: #555555; - border: 3px solid #ffffff; - opacity: 0.5; - filter: alpha(opacity=50); -} - -.carousel-control.right { - right: 15px; - left: auto; -} - -.carousel-control:hover, -.carousel-control:focus { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.carousel-indicators { - position: absolute; - top: 15px; - right: 15px; - z-index: 5; - margin: 0; - list-style: none; -} - -.carousel-indicators li { - display: block; - float: left; - width: 10px; - height: 10px; - margin-left: 5px; - text-indent: -999px; - background-color: #ccc; - background-color: rgba(255, 255, 255, 0.25); -} - -.carousel-indicators .active { - background-color: #fff; -} - -.carousel-caption { - position: absolute; - right: 0; - bottom: 0; - left: 0; - padding: 15px; - background: #555555; - background: rgba(0, 0, 0, 0.75); -} - -.carousel-caption h4, -.carousel-caption p { - line-height: 20px; - color: #ffffff; -} - -.carousel-caption h4 { - margin: 0 0 5px; -} - -.carousel-caption p { - margin-bottom: 0; -} - -.hero-unit { - padding: 16px 20.8px; - margin-bottom: 20px; - font-size: 18px; - line-height: 20px; - color: #ffffff; - background-color: #00aaaa; - border: 4px double #ffffff; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - box-shadow: 0 0 0 4px #00aaaa; -} - -.hero-unit h1 { - margin-bottom: 20px; - font-size: 18px; - line-height: 1; - color: #ffffff; - text-align: center; - text-decoration: blink; -} - -.hero-unit li { - line-height: 20px; -} - -.pull-right { - float: right; -} - -.pull-left { - float: left; -} - -.hide { - display: none; -} - -.show { - display: block; -} - -.invisible { - visibility: hidden; -} - -#wrap386 { - position: fixed; - right: 0; - bottom: 0; - z-index: 9999999; - width: 100%; - height: 100%; - background: #000084; -} - -#bar386 { - float: right; - width: 100%; - height: 20px; - margin-top: -20px; - font-weight: bold; - color: #ffffff; - background: #000084; -} - -#cursor386 { - position: fixed; - right: 0; - bottom: 0; - z-index: 9999999; - font-weight: bold; - color: #ffffff; -} diff --git a/web/static/css/fonts/Fixedsys500c.eot b/web/static/css/fonts/Fixedsys500c.eot Binary files differ. diff --git a/web/static/css/fonts/Fixedsys500c.otf b/web/static/css/fonts/Fixedsys500c.otf Binary files differ. diff --git a/web/static/css/fonts/Fixedsys500c.svg b/web/static/css/fonts/Fixedsys500c.svg @@ -1,646 +0,0 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"> -<metadata> -Created by FontForge 20190801 at Sun Aug 5 10:20:04 2001 - By chris -GPL, see http://www.gnu.org/licenses/gpl.txt -</metadata> -<defs> -<font id="FixedsysTTF" horiz-adv-x="550" > - <font-face - font-family="FixedsysTTF" - font-weight="600" - font-stretch="normal" - units-per-em="1000" - panose-1="2 0 0 9 0 0 0 0 0 0" - ascent="800" - descent="-200" - x-height="465" - cap-height="610" - bbox="-1 -288 550 813" - underline-thickness="50" - underline-position="-125" - unicode-range="U+0001-20AC" - /> -<missing-glyph - /> - <glyph glyph-name=".notdef" - /> - <glyph glyph-name=".null" - /> - <glyph glyph-name="nonmarkingreturn" - /> - <glyph glyph-name="space" unicode=" " - /> - <glyph glyph-name="space" unicode="&#xa0;" - /> - <glyph glyph-name=".0015" -d="M10 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130h-135v-130h-125v470h125v-130h135v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5 -h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470z" /> - <glyph glyph-name="exclam" unicode="!" -d="M226 130v-130h120v130h-120zM221 335v-125h130v125h65v205q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-120q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-205h65z" /> - <glyph glyph-name="quotedbl" unicode="&#x22;" -d="M54 602v-200h130v200h-130v0zM324 602v-200h130v200h-130v0z" /> - <glyph glyph-name="numbersign" unicode="#" -d="M119 135v-135h123v130h90v-130h127v135h69v70h-68v200h68v70h-69v135h-127v-130h-85v130h-128v-135h-69v-70h64v-200h-64v-70h69v0zM247 400h80v-190h-80v190v0z" /> - <glyph glyph-name="dollar" unicode="$" -d="M187 1v-134h128v136h70v69l69 2v138h-68v69h-71v61h-69l-1 70h-59v141h129v-70h140v70h-69l-1 69h-70v139h-129v-139h-70v-71h-69v-138h70v-69h69v-61h60v-70l68 1v-142h-128v69h-141v-67h69q0 -19 0.5 -35.5t0.5 -35.5q3 -1 13 -1h22h22q11 0 15 -1z" /> - <glyph glyph-name="percent" unicode="%" -d="M266 10v-65h205q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-205v-65h-55v-140h55zM341 145h60v-130h-60v130zM71 215v-130h60q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5 -q1 1 10 2.5t19.5 2.5t19.5 2t11 3q3 3 5.5 12t4 19.5t2 20t-1.5 13.5h50q-2 4 -2 13q0 10 1.5 20.5t4.5 19.5t6 12t12 6t19.5 4.5t19.5 1.5q10 0 14 -2v50q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v130h-60 -q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-2 -2 -11 -3t-19.5 -2t-19.5 -2.5t-10 -2.5q-3 -3 -5.5 -11.5t-4 -18t-2 -18t1.5 -12.5q-3 1 -10.5 0.5t-15.5 -2t-15 -3.5t-9 -5 -t-4.5 -10t-4 -15t-2.5 -15t1 -10q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM1 495q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h190q-2 4 -1.5 12.5t2 18 -t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-190q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-130zM141 625h60v-130h-60v130z" /> - <glyph glyph-name="ampersand" unicode="&#x26;" -d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h195v60h70v-60h135v65h-60v140h60v65h-270v-65h60v-135h-120v265h120q-2 4 -1.5 13.5t2 20t4 19.5t5.5 12t11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5 -t-5.5 11.5t-4 18t-2 18t1.5 12.5h-190q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-135h60v-70h-60v-265zM196 540h50v-130h-50v130z" /> - <glyph glyph-name="quotesingle" unicode="'" -d="M178 604v-200h120v200h-120v0z" /> - <glyph glyph-name="parenleft" unicode="(" -d="M282 -66v-65h135v65h-65v140h-65v340h65v140h65v65h-135v-65h-60v-140h-65v-340h65v-140h60v0z" /> - <glyph glyph-name="parenright" unicode=")" -d="M165 -61l1 -68h121v65h75v140h65v340h-65v137h-70v68h-126l-1 -72h66l1 -133h55v-340h-55l-1 -137h-66z" /> - <glyph glyph-name="asterisk" unicode="*" -d="M109 216v-65h125v60h70v-60h135v65h-60v70h130v60h-130v70h60v65h-135v-60h-70v60h-125v-65h60v-70h-130v-60h130v-70h-60v0z" /> - <glyph glyph-name="plus" unicode="+" -d="M194 252v-135h130v135h135v60h-135v135h-130v-135h-135v-60h135v0z" /> - <glyph glyph-name="comma" unicode="," -d="M200 -63v-65h120q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v200h-190v-135h50v-70h-50z" /> - <glyph glyph-name="minus" unicode="-" -d="M56 303v-50h400v50h-400z" /> - <glyph glyph-name="period" unicode="." -d="M198 130v-130h190v130h-190v0z" /> - <glyph glyph-name="slash" unicode="/" -d="M87 -64h99l301 631v49h-108l-292 -584v-96z" /> - <glyph glyph-name="zero" unicode="0" -d="M82 71q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18 -t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470zM218 134h60v140h-60v265h130v-65h-60v-140h60v-265h-130v65z" /> - <glyph glyph-name="one" unicode="1" -d="M249 406v-405h135v610h-135v-65h-60v-70h-135v-70h195v0z" /> - <glyph glyph-name="two" unicode="2" -d="M98 0h400v65h-260v70h58q-2 4 -3 13.5t-1 19.5q0 11 1.5 20t4.5 12q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 12 5.5t19.5 4t20 2t13.5 -1.5v55h65v205q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260 -q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-130h135v130h125v-205h-60q1 -3 1 -11t-1.5 -17t-4 -16.5t-5.5 -10.5q-2 -3 -9.5 -4.5t-16.5 -2.5t-18 -1q-8 0 -11 2q2 -4 3.5 -14t1.5 -22q0 -11 -1 -21t-4 -13q-2 -2 -12 -1.5t-22.5 1.5 -t-23.5 1q-10 0 -11 -1q-2 -2 -2 -12t0.5 -22.5t0 -23t-1.5 -11.5q-3 -3 -12 -4t-19 -1t-19 1.5t-13 3.5v-135z" /> - <glyph glyph-name="three" unicode="3" -d="M95 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v205h-60v60h60v205q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5 -t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-130h135v130h125v-205h-120v-60h120v-205h-125v130h-135v-130z" /> - <glyph glyph-name="four" unicode="4" -d="M319 135v-135h140v135h65v70h-65v265h-140v-260h-125v65h50v335h-125v-335h-65v-140h265v0z" /> - <glyph glyph-name="five" unicode="5" -d="M44 65v-65h313q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v135h-65v60h-248v210h313v65h-453v-335h313v-135q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5t-5.5 -12t-4 -19.5 -t-2 -20t1.5 -13.5h-243z" /> - <glyph glyph-name="six" unicode="6" -d="M95 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v260q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 12t-4 19.5t-2 20t1.5 13.5h-130v65q4 -2 12.5 -1.5t18 2t18 4 -t11.5 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v60h-195v-130q-4 2 -13.5 1.5t-20 -2t-19.5 -4t-12 -5.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM235 330h120v-260h-120v260z" /> - <glyph glyph-name="seven" unicode="7" -d="M157 205v-205h125v205h70v130h70v140h65v135h-400v-65h260v-70h-65v-140h-60v-130h-65v0z" /> - <glyph glyph-name="eight" unicode="8" -d="M87 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v205h-60v60h60v205q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5 -t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-205h60v-60h-60v-205zM227 270h50q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t11.5 -5.5t18 -4t18 -2t12.5 1.5v-130h-120v200zM282 405h-55v135h120v-200h-65v65z" /> - <glyph glyph-name="nine" unicode="9" -d="M156 60v-60h195v130q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5 -t-18 -4t-18 -2t-12.5 1.5v-260q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h120v-70h-50q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM226 540h120v-260h-120v260z" /> - <glyph glyph-name="colon" unicode=":" -d="M193 139v-130h190v130h-190v0zM193 479v-130h190v130h-190v0z" /> - <glyph glyph-name="semicolon" unicode=";" -d="M198 -66v-65h120q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v200h-190v-135h50v-70h-50zM198 479v-130h190v130h-190z" /> - <glyph glyph-name="less" unicode="&#x3c;" -d="M494 0h-102l-301 300l301 310h102v-42l-267 -269l267 -262v-37z" /> - <glyph glyph-name="equal" unicode="=" -d="M99 283v-60h401v60h-401v0zM99 422v-60h401v60h-401v0z" /> - <glyph glyph-name="greater" unicode="&#x3e;" -d="M92 0h102l301 300l-301 310h-102v-42l259 -261l-259 -265v-42z" /> - <glyph glyph-name="question" unicode="?" -d="M211 130v-130h120v130h-120zM211 335v-125h125v120q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18 -t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-130h135v130h125v-130q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5t-5.5 -12t-4 -19.5t-2 -20t1.5 -13.5h-50z" /> - <glyph glyph-name="at" unicode="@" -d="M7 71q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h470v65h-400v481h265v-141h-140v-70h-55v-130h55v-65h275v404h-66l-4 66h-406v-65l-64 -1v-474zM359 335h72v-130h-72v130z" /> - <glyph glyph-name="A" unicode="A" -d="M59 470v-470h135v200h130v-200h135v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5h-120q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3 -t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM199 470h120v-190h-120v190z" /> - <glyph glyph-name="B" unicode="B" -d="M62 610v-610h330q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v205h-60v60h60v205q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-330zM202 270h120v-200h-120v200zM202 540h120v-200h-120v200z" /> - <glyph glyph-name="C" unicode="C" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130h-135v-130h-125v470h125v-130h135v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5 -h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470z" /> - <glyph glyph-name="D" unicode="D" -d="M54 610v-610h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5 -t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5h-260zM194 540h50q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t11.5 -5.5t18 -4t18 -2t12.5 1.5v-330q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5t-5.5 -11.5t-4 -18t-2 -18t1.5 -12.5h-50v470z" /> - <glyph glyph-name="E" unicode="E" -d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0z" /> - <glyph glyph-name="F" unicode="F" -d="M59 610v-610h135v275h195v60h-190v210h260v65h-400v0z" /> - <glyph glyph-name="G" unicode="G" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v270h-200v-65h60v-135h-120v470h125v-130h135v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5 -t-18 -4t-18 -2t-12.5 1.5v-470z" /> - <glyph glyph-name="H" unicode="H" -d="M59 610v-610h135v270h130v-270h135v610h-135v-270h-130v270h-135v0z" /> - <glyph glyph-name="I" unicode="I" -d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0z" /> - <glyph glyph-name="J" unicode="J" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v540h-135v-540h-130v130h-135v-130z" /> - <glyph glyph-name="K" unicode="K" -d="M56 610v-610h135v270h60v-135h70v-135h135v135h-65v140h-65v60h65v140h65v135h-135v-135h-70v-135h-60v270h-135v0z" /> - <glyph glyph-name="L" unicode="L" -d="M59 610v-610h400v65h-265v545h-135v0z" /> - <glyph glyph-name="M" unicode="M" -d="M44 610v-610h135v405h55v70h-55v135h-135zM379 400v-400h135v610h-135v-130q-4 2 -13.5 1.5t-20 -2t-19.5 -4t-12 -5.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-190h65v190h70z" /> - <glyph glyph-name="N" unicode="N" -d="M56 610v-610h135v350l200 -176v-174h135v610h-135v-301l-200 191v110h-135z" /> - <glyph glyph-name="O" unicode="O" -d="M75 69q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18 -t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470zM215 539h120v-470h-120v470z" /> - <glyph glyph-name="P" unicode="P" -d="M57 615v-615h139v275h200v60h65v209l-65 1v70h-339v0zM196 544h129v-209h-129v209v0z" /> - <glyph glyph-name="Q" unicode="Q" -d="M247 0q-2 -4 -1.5 -13.5t2 -20t4 -19.5t5.5 -12q1 -2 10 -3t19.5 -2t19.5 -2.5t11 -2.5q3 -3 5.5 -11.5t4 -18t2 -18t-1.5 -12.5h130v65h-60v140h60v475q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18 -t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h120zM197 545h120v-470h-120v470z" /> - <glyph glyph-name="R" unicode="R" -d="M79 610v-610h135v270h55q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t12 -5.5t19.5 -4t20 -2t13.5 1.5v-200h135v205h-60v130h60v205q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-330zM219 540h120v-200h-120v200z" /> - <glyph glyph-name="S" unicode="S" -d="M51 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -12 5.5t-19.5 4t-20 2 -t-13.5 -1.5v50q-4 -2 -14 -2q-9 0 -19.5 1.5t-19.5 4.5t-12 6t-6 12t-4.5 19.5t-1.5 19.5q0 10 2 14h-50v135h125v-60h135v60q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4 -t-18 -2t-12.5 1.5v-130q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q3 -3 11.5 -5.5t18 -4t18 -2t12.5 1.5q-2 -3 -1 -10.5t2.5 -15.5t4 -15t4.5 -9t9 -4.5t15 -4t15.5 -2.5t10.5 1q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t11.5 -5.5t18 -4 -t18 -2t12.5 1.5v-130h-125v60h-135v-60z" /> - <glyph glyph-name="T" unicode="T" -d="M194 545v-545h130v545h135v65h-400v-65h135v0z" /> - <glyph glyph-name="U" unicode="U" -d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v540h-135v-540h-130v540h-135v-540z" /> - <glyph glyph-name="V" unicode="V" -d="M54 140q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q1 -2 10 -3t19.5 -2t19.5 -2.5t11 -2.5q3 -3 5.5 -11.5t4 -18t2 -18t-1.5 -12.5h120q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5 -t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v470h-135v-470h-130v470h-135v-470z" /> - <glyph glyph-name="W" unicode="W" -d="M119 205v-205h130v205h65v195h-65v-190h-60v400h-135v-405h65v0zM324 205v-205h135v205h65v405h-135v-405h-65v0z" /> - <glyph glyph-name="X" unicode="X" -d="M56 200v-200h135v270h55q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t12 -5.5t19.5 -4t20 -2t13.5 1.5v-200h135v200q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -11.5 5.5t-18 4t-18 2t-12.5 -1.5v120q4 -2 12.5 -1.5t18 2t18 4 -t11.5 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v130h-135v-200h-70v65h-60v135h-135v-130q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q3 -3 11.5 -5.5t18 -4t18 -2t12.5 1.5v-120q-4 2 -12.5 1.5t-18 -2 -t-18 -4t-11.5 -5.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5z" /> - <glyph glyph-name="Y" unicode="Y" -d="M189 275v-275h130v275h70v60h65v275h-135v-270h-130v270h-135v-275h65v-60h70v0z" /> - <glyph glyph-name="Z" unicode="Z" -d="M56 200v-200h400v65h-260v140h50q-2 4 -2 13q0 10 1.5 20.5t4.5 19.5t6 12t12 6t19.5 4.5t19.5 1.5q10 0 14 -2v50q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v200h-400v-65h260v-135q-4 2 -12.5 1.5t-18 -2 -t-18 -4t-11.5 -5.5t-5.5 -11.5t-4 -18t-2 -18t1.5 -12.5q-3 1 -10.5 0.5t-15.5 -2t-15 -3.5t-9 -5t-4.5 -9.5t-4 -14.5t-2.5 -15.5t1 -10.5q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5z -" /> - <glyph glyph-name="bracketleft" unicode="[" -d="M121 623v-798h269v55h-130v678h130v65h-269v0z" /> - <glyph glyph-name="backslash" unicode="\" -d="M372 -60l110 -3l-2 53l-314 625l-84 2v-99z" /> - <glyph glyph-name="bracketright" unicode="]" -d="M166 -132v-55h260v810h-260v-65h120v-690h-120v0z" /> - <glyph glyph-name="asciicircum" unicode="^" -d="M208 717v-60v0h-60v0v-60v0h-60v0v-60v0h120v0v60h120v0v-60v0h108v0v60v0h-48v0v60v0h-60v0v60v0h-120v0z" /> - <glyph glyph-name="underscore" unicode="_" -d="M0 -158v-50h550v50h-550z" /> - <glyph glyph-name="grave" unicode="`" -d="M282 589v-69h140v69h-70v140h-199v-70h70v-70h59z" /> - <glyph glyph-name="a" unicode="a" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260v-65h190v-130h-190q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5 -v-130zM199 200h120v-130h-120v130z" /> - <glyph glyph-name="b" unicode="b" -d="M97 610v-610h330q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v330h-66v75h-199v135h-135zM237 400h120v-330h-120v330z" /> - <glyph glyph-name="c" unicode="c" -d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v60h-135v-60h-125v330h125v-60h135v60q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5 -h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330z" /> - <glyph glyph-name="d" unicode="d" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v610h-135v-135h-195q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM199 400h120v-330h-120v330z" /> - <glyph glyph-name="e" unicode="e" -d="M51 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260v65h-190v140h260v195q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5 -v-330zM191 400h120v-120h-120v120z" /> - <glyph glyph-name="f" unicode="f" -d="M124 275v-275h130v275h209v61h-208v211h208v67h-267v-68h-72v-211h-70v-60h70v0z" /> - <glyph glyph-name="g" unicode="g" -d="M62 -140v-55h335v55h65v615h-330q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h190v-140h-260zM202 405h120v-330h-120v330z" /> - <glyph glyph-name="h" unicode="h" -d="M62 610v-610h135v400h130v-400h135v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 12t-4 19.5t-2 20t1.5 13.5h-195v135h-135z" /> - <glyph glyph-name="i" unicode="i" -d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM199 660v-110h120v110h-120v0z" /> - <glyph glyph-name="j" unicode="j" -d="M59 -155v-55h265v55h65v615h-260v-65h120v-550h-190v0zM259 650v-110h130v110h-130v0z" /> - <glyph glyph-name="k" unicode="k" -d="M62 610v-610h135v200h55q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t12 -5.5t19.5 -4t20 -2t13.5 1.5v-130h135v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -11.5 5.5t-18 4t-18 2t-12.5 -1.5v65h65v60h65v135h-135v-135h-65 -q2 -3 1.5 -11t-2 -17t-4 -16.5t-5.5 -10.5t-11 0t-16.5 7.5t-16.5 8.5t-11 4v310h-135z" /> - <glyph glyph-name="l" unicode="l" -d="M59 65v-65h400v65h-135v545h-265v-65h130v-480h-130v0z" /> - <glyph glyph-name="m" unicode="m" -d="M59 470v-470h135v400h60v-330h70v330h70v-400h135v400h-65v70h-405v0z" /> - <glyph glyph-name="n" unicode="n" -d="M59 470v-470h135v400h130v-400h135v400l-65 7v63h-335v0z" /> - <glyph glyph-name="o" unicode="o" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18 -t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM199 400h120v-330h-120v330z" /> - <glyph glyph-name="p" unicode="p" -d="M56 470v-664h134v193h193q-2 4 -1.5 13.5t2 19.5t4 19t5.5 13q3 3 11 5.5t17.5 4t17.5 1.5q9 0 13 -1v326q-4 -2 -12.5 -1.5t-18 2t-17.5 4t-11 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-327zM195 400h118v-326h-118v326z" /> - <glyph glyph-name="q" unicode="q" -d="M324 1v-194h135v664h-327q1 -4 2 -15t1 -23t-1 -21.5t-4 -9.5q-4 0 -13.5 -0.5t-20 -1t-20.5 -0.5q-9 0 -13 2v-327q4 2 14 3t21.5 0.5t21.5 -1.5t13 -4t4 -13.5t0 -22t-2.5 -22t-2.5 -14.5h192zM201 402h119v-327h-119v327z" /> - <glyph glyph-name="r" unicode="r" -d="M62 470v-470h135v276l60 1l1 58h204v135h-135l1 -63h-70l-2 -72h-59v135h-135z" /> - <glyph glyph-name="s" unicode="s" -d="M62 65v-65h330q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 12t-4 19.5t-2 20t1.5 13.5h-190v130h260v65h-330q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5 -v-120q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h190v-140h-260z" /> - <glyph glyph-name="t" unicode="t" -d="M124 70q4 2 13.5 1.5t20 -2t19.5 -4t12 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260v65h-200v340h200v70h-205v135h-130v-135h-65v-70h65v-335z" /> - <glyph glyph-name="u" unicode="u" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v470h-135v-400h-130v400h-135v-400z" /> - <glyph glyph-name="v" unicode="v" -d="M59 140q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q1 -2 10 -3t19.5 -2t19.5 -2.5t11 -2.5q3 -3 5.5 -11.5t4 -18t2 -18t-1.5 -12.5h120q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5 -t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v330h-135v-330h-130v330h-135v-330z" /> - <glyph glyph-name="w" unicode="w" -d="M113 133v-133h129v133h64v263h-64v-257h-59v326h-135v-332h65v0zM316 133v-133h134v133h64v332h-133v-332h-65v0z" /> - <glyph glyph-name="x" unicode="x" -d="M59 130v-130h135v130h130v-130h135v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -11.5 5.5t-18 4t-18 2t-12.5 -1.5v65h65v60h65v135h-135v-130h-130v130h-135v-135h65v-60h65v-65q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5 -q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5z" /> - <glyph glyph-name="y" unicode="y" -d="M22 -141v-55h265v50q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 12 5.5t19.5 4t20 2t13.5 -1.5v135h65v405h-135v-400h-130v400h-135v-400q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h120v-70h-55v-70h-205z -" /> - <glyph glyph-name="z" unicode="z" -d="M59 130v-130h400v65h-260v70h50q-2 4 -1.5 13.5t2 20t4 19.5t5.5 12q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 12 5.5t19.5 4t20 2t13.5 -1.5v55h65v135h-400v-65h260v-70h-60q1 -3 1 -11t-1.5 -17t-4 -16.5t-5.5 -10.5q-2 -3 -9 -5.5 -t-15 -4t-15.5 -2t-10.5 1.5q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5z" /> - <glyph glyph-name="braceleft" unicode="{" -d="M240 -47v-65h135v65h-65v205h-68v75h-57v65h60v65h65v199h65v65h-135v-65h-60v-199h-70v-65h-65v-65h66v-75h69v-205h60z" /> - <glyph glyph-name="bar" unicode="|" -d="M228 611v-810h120v810h-120v0z" /> - <glyph glyph-name="braceright" unicode="}" -d="M101 -61v-65h139v70h75v200h72v80h63v65h-65v76h-70v200h-77v65h-139v-65h71v-200h78l2 -76h60v-65h-59v-75h-79v-210h-71z" /> - <glyph glyph-name="asciitilde" unicode="~" -d="M1 557v-134h61v65h67v68h77v-68h60v-65h216v65h59v135h-60v-63h-80v-67h-60v68h-80v71h-195v-75h-65z" /> - <glyph glyph-name="tilde" unicode="&#x2dc;" -d="M1 557v-134h61v65h67v68h77v-68h60v-65h216v65h59v135h-60v-63h-80v-67h-60v68h-80v71h-195v-75h-65z" /> - <glyph glyph-name="sf256" - /> - <glyph glyph-name="sf260" -d="M0 479v-480h120v400h160v-400h152q0 82 1.5 150t-2.5 122.5t-18 94.5t-44 67t-80.5 40.5t-128.5 13.5q-9 0 -32 -1.5t-48.5 -3t-48 -2.5t-31.5 -1z" /> - <glyph glyph-name="sf264" -d="M6 236q0 -62 6.5 -106t26.5 -72.5t58.5 -41.5t103.5 -13t103.5 13t59 41.5t26.5 72.5t6 106t-6 106t-26.5 72t-59 41t-103.5 13t-103.5 -13t-58.5 -41t-26.5 -72t-6.5 -106zM164 386h75v-300h-75v300z" /> - <glyph glyph-name="sf265" -d="M8 417v-705q6 0 17 2.5t23 7t22 9.5t13 11q6 6 16 28t21.5 47t21.5 47t16 28t28 17t47 23t47 22t28 13q8 6 21 17t25 23t20.5 22t8.5 13t1 21t2.5 42t2.5 48.5t1 38.5t-1 38t-2.5 48t-2.5 42.5t-1 21.5q-3 8 -12 19.5t-20.5 23t-23 20.5t-19.5 12q-3 0 -21.5 1t-42.5 2.5 -t-48 2.5t-38 1q-9 0 -30 -1t-45 -2.5t-45.5 -2.5t-29.5 -1zM158 342h75v-300h-75v300z" /> - <glyph glyph-name="sf259" -d="M69 448v-450h75l3 372l109 -297l150 300v-375h143q0 15 -1.5 45t-4.5 67t-6.5 78t-6.5 77.5t-6 65.5t-5 42q0 8 -8.5 21t-20.5 25t-25 20.5t-21 8.5q-3 0 -25.5 1t-52 2.5t-60 2.5t-50.5 1q-11 0 -37.5 -1t-56 -2.5t-56 -2.5t-37.5 -1z" /> - <glyph glyph-name="sf261" -d="M10 610v-610h135v311q3 0 11 4t16.5 8t16.5 6.5t11 0.5t5.5 -9t4 -15t2 -15.5t-1.5 -10.5q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q3 -3 12 -5.5t19.5 -4t20 -2t13.5 1.5v-200h135v610h-135v-270h-65q2 4 1.5 12.5t-2 18t-4 18 -t-5.5 11.5q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 12t-4 19.5t-2 20t1.5 13.5h-55v135h-135z" /> - <glyph glyph-name="sf263" -d="M7 457v-457h102v233q2 0 8 3t12.5 6t12.5 5t8 0t4 -6.5t3 -10.5t1 -12q0 -5 -1 -8q3 1 9 1q7 0 14 -1.5t13.5 -3.5t8.5 -4q1 -1 2 -8t2 -14.5t2 -14.5t2 -8q3 -2 9.5 -4t14 -3t15 -1.5t10.5 1.5v-150h101v457h-101v-202h-49q1 3 1 9q0 7 -1.5 14t-3.5 13.5t-4 8.5 -q-1 1 -8 2t-14.5 1.5t-14.5 1.5t-8 2q-2 3 -4 9.5t-3 14.5t-1.5 15t1.5 10h-41v101h-102z" /> - <glyph glyph-name="sf262" -d="M7 457v-457h102v304h41v52h-41v101h-102zM259 300v-300h101v457h-101v-97q-3 1 -11 1q-7 0 -14.5 -1.5t-14 -3.5t-9.5 -4q-1 -1 -2 -8t-2 -14.5t-2 -14.5t-2 -8q-2 -2 -8.5 -4t-13.5 -3t-13.5 -1.5t-9.5 1.5v-143h49v143h53z" /> - <glyph glyph-name="sf266" -d="M10 130v-130h135v130h130v-130h135v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -11.5 5.5t-18 4t-18 2t-12.5 -1.5v65h65v60h65v135h-135v-130h-130v130h-135v-135h65v-60h65v-65q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5 -q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5z" /> - <glyph glyph-name="sf267" -d="M6 -139v-55h265v50q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 12 5.5t19.5 4t20 2t13.5 -1.5v135h65v405h-135v-400h-130v400h-135v-400q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h120v-70h-55v-70h-205z" /> - <glyph glyph-name="sf268" -d="M145 4v-130h130v130q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -12 5.5t-19.5 4t-20 2t-13.5 -1.5v50 -q-4 -2 -14 -2q-9 0 -19.5 1.5t-19.5 4.5t-12 6t-6 12t-4.5 19.5t-1.5 19.5q0 10 2 14h-50v135h125v-60h135v60q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -12 5.5t-19.5 4t-20 2t-13.5 -1.5v90h-130v-90q-4 2 -13.5 1.5t-20 -2 -t-19.5 -4t-12 -5.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-130q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q3 -3 11.5 -5.5t18 -4t18 -2t12.5 1.5q-2 -3 -1 -10t2.5 -15t4 -15t4.5 -10t9 -5 -t15 -3.5t15.5 -2t10.5 0.5q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t11.5 -5.5t18 -4t18 -2t12.5 1.5v-130h-125v60h-135v-60q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q3 -3 12 -5.5t19.5 -4t20 -2t13.5 1.5z" /> - <glyph glyph-name="sf269" -d="M10 810v-810h260v55h-130v690h130v65h-260v0z" /> - <glyph glyph-name="sf270" -d="M56 603v-200h130v200h-130v0zM326 603v-200h130v200h-130v0z" /> - <glyph glyph-name="acute" unicode="&#xb4;" -d="M292 589v-69h-140v69h70v140h199v-70h-70v-70h-59z" /> - <glyph glyph-name="degree" unicode="&#xb0;" -d="M146 649v-63v0h-67v0v-127v0h67v0v-63v0h271v0v63v0h63v0v127v0h-63v0v63v0h-271v0zM354 586v-127h-139v127h139z" /> - <glyph glyph-name="section" unicode="&#xa7;" -d="M148 578v-60v0h-60v0v-120v0h60v-120v0h-60v0v-120v0h60v0v-60v0h60v0v-66v0h120v-136h-120v0v68v0h-120v0v-68v0h60v0v-66v0h240v0v66v0h60v0v136v0h-60v126v0h60v0v120v0h-60v0v60v0h-60v0v60v0h-120v120v0h120v0v-60v0h120v0v60v0h-60v0v60v0h-240v0zM328 278v-120 -h-120v120h120z" /> - <glyph glyph-name="adieresis" unicode="&#xe4;" -d="M136 440v-60v0h202v-141v0h-202v0v-60v0h-60v0v-120v0h60v0v-60v0h322v0v381v0h-60v0v60v0h-262v0zM338 179v-120h-134v120h134zM81 641v-120v0h120v0v120v0h-120v0zM321 641v-120v0h120v0v120v0h-120v0z" /> - <glyph glyph-name="Adieresis" unicode="&#xc4;" -d="M57 770v-129v0h134v0v129v0h-134v0zM330 770v-129v0h134v0v129v0h-134v0zM198 576v-66v0h-68v0v-69v0h-66v0v-442v0h134v0v180h139v-180v0h134v0v442v0h-66v0v69v0h-68v0v66v0h-139v0zM337 441v-202h-139v0v202h139z" /> - <glyph glyph-name="odieresis" unicode="&#xf6;" -d="M81 641v-120v0h120v0v120v0h-120v0zM321 641v-120v0h120v0v120v0h-120v0zM141 447v-60v0h-60v0v-327v0h60v0v-60v0h240v0v60v0h60v0v327v0h-60v0v60v0h-240v0zM321 387v-327h-120v0v327h120z" /> - <glyph glyph-name="Odieresis" unicode="&#xd6;" -d="M119 580v-70v0h-60v0v-447v0h60v0v-60v0h279v0v60v0h60v0v447v0h-60v0v70v0h-279v0zM338 510v0v-447h-143v0v447h143zM57 770v-129v0h134v0v129v0h-134v0zM330 770v-129v0h134v0v129v0h-134v0z" /> - <glyph glyph-name="udieresis" unicode="&#xfc;" -d="M83 435v-377v0h60v0v-60v0h300v0v437v0h-120v0v-377h-120v0v377v0h-120v0zM81 641v-120v0h120v0v120v0h-120v0zM321 641v-120v0h120v0v120v0h-120v0z" /> - <glyph glyph-name="Udieresis" unicode="&#xdc;" -d="M59 572v-513v0h60v0v-60v0h281v0v60v0h60v0v513v0h-120v0v-513h-149v0v513v0h-132v0zM57 770v-129v0h134v0v129v0h-134v0zM330 770v-129v0h134v0v129v0h-134v0z" /> - <glyph glyph-name="germandbls" unicode="&#xdf;" -d="M138 576v-60v0h-60v0v-517v0h120v0v517v0h60v-204v0h60v0v-253v0h-60v0v-60v0h120v0v60v0h60v0v253v0h-60v0v204v0h-60v0v60v0h-180v0z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" unicode="&#x85;" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" unicode="&#xa;" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="uni0001" -d="M67 600h400v-600h-400v600z" /> - <glyph glyph-name="glyph124" -d="M267 600h133v-267h-200z" /> - <glyph glyph-name="uni0091" -d="M266 600h132v-66h-68v-68h68v-133h-200v201h68v66z" /> - <glyph glyph-name="uni0092" -d="M200 600h200v-199h-67v-68h-133v68h66v67h-66v132z" /> - <glyph glyph-name="exclamdown" unicode="&#xa1;" -d="M200 400h133v-133h-133v133zM200 200h132v-133h68v-200h-67v-67h-133v67h-67v200h67v133z" /> - <glyph glyph-name="cent" unicode="&#xa2;" -d="M200 600h133v-133h66v-67h67v-67h-133v67h-133v-267h132v67h133v-66h-65v-66h-67v-135h-133v135h-67v65h-66v267h65v68h68v132z" /> - <glyph glyph-name="sterling" unicode="&#xa3;" -d="M0 133h67v135h-67v65h67v200h66v67h267v-66h66v-67h-133v66h-133v-200h200v-65h-201v-134h-66v-67h334v-67h-467v133z" /> - <glyph glyph-name="currency" unicode="&#xa4;" -d="M200 400v-133h133v133h-133zM67 533h132v-66h134v66h134v-66h-67v-67h66v-133h-67v-66h68v-68h-134v68h-133v-68h-133v67h66v67h-66v133h66v67h-66v66z" /> - <glyph glyph-name="yen" unicode="&#xa5;" -d="M67 600h132v-199h134v199h133v-199h-66v-68h66v-66h-133v-67h132v-67h-132v-133h-133v133h-133v67h133v67h-133v66h65v68h-65v199z" /> - <glyph glyph-name="brokenbar" unicode="&#xa6;" -d="M200 133h133v-333h-133v333zM200 600h133v-333h-133v333z" /> - <glyph glyph-name="dieresis" unicode="&#xa8;" -d="M67 667h133v-134h-133v134zM333 667h134v-134h-134v134z" /> - <glyph glyph-name="uni00AD" unicode="&#xad;" -d="M466 268h-400v65h400v-65z" /> - <glyph glyph-name="macron" unicode="&#xaf;" -d="M0 800h532v-66h-532v66z" /> - <glyph glyph-name="periodcentered" unicode="&#xb7;" -d="M200 400h200v-133h-200v133z" /> - <glyph glyph-name="logicalnot" unicode="&#xac;" -d="M467 333v-200h-135v134h-265v66h400z" /> - <glyph glyph-name="uni00B2" unicode="&#xb2;" -d="M133 600h200v-67h67v-66h-68v-66h-65v-68h133v-66h-267v133h67v67h67v66h-134v67z" /> - <glyph glyph-name="plusminus" unicode="&#xb1;" -d="M466 68v-68h-399v68h399zM200 467h133v-134h133v-66h-133v-134h-133v134h-133v66h133v134z" /> - <glyph glyph-name="uni00B3" unicode="&#xb3;" -d="M133 600h200v-67h67v-65h-67v-67h66v-67h-66v-67h-200v66h134v68h-67v66h67v66h-134v67z" /> - <glyph glyph-name="divide" unicode="&#xf7;" -d="M200 200h133v-133h-133v133zM200 533h133v-133h-133v133zM465 333v-66h-398v66h398z" /> - <glyph glyph-name="edieresis" unicode="&#xeb;" -d="M67 667h133v-134h-133v134zM200 400v-133h133v133h-133zM133 467h266v-67h68v-200h-267v-133h199v-66h-266v66h-66v334h66v66zM333 667h134v-134h-134v134z" /> - <glyph glyph-name="copyright" unicode="&#xa9;" -d="M200 467h132v-67h68v-67h-67v68h-133v-201h-67v200h67v67zM67 468v-334h66v-66h267v66h67v335h-67v65h-268v-66h-65zM0 533h66v67h399v-67h68v-466h-67v-67h-399v67h-67v466zM200 200h133v67h67v-66h-68v-67h-132v66z" /> - <glyph glyph-name="ordfeminine" unicode="&#xaa;" -d="M200 400v-67h133v67h-133zM467 200v-67h-400v67h400zM134 601h266v-68h67v-266h-335v66h-65v67h65v67h201v66h-199v68z" /> - <glyph glyph-name="guillemotleft" unicode="&#xab;" -d="M266 334v-66h-68v-66h-66v-68h66v-67h68v-66h-133v67h-67v66h-67v66h67v67h66v67h134zM400 334h133v-65h-67v-67h-66v-68h64v-66h69v-68h-133v67h-68v67h-65v66h66v66h67v68z" /> - <glyph glyph-name="registered" unicode="&#xae;" -d="M67 467v-333h66v-66h267v66h66v333h-66v66h-267v-66h-66zM132 133v334h200v-67h68v-133h-67v133h-133v-132h132v-68h67v-66h-67v67h-133v-68h-67zM0 533h67v67h398v-67h68v-466h-67v-67h-400v67h-66v466z" /> - <glyph glyph-name="egrave" unicode="&#xe8;" -d="M200 400v-133h133v133h-133zM333 600v-67h-134v67h-66v67h-66v67h199v-134h67zM133 467h267v-67h66v-200h-266v-133h199v-68h-266v68h-66v333h66v67z" /> - <glyph glyph-name="eacute" unicode="&#xe9;" -d="M200 400v-133h133v133h-133zM133 467h267v-67h67v-200h-267v-133h199v-68h-266v68h-66v334h66v66zM267 733h198v-65h-65v-67h-67v-68h-133v67h67v133z" /> - <glyph glyph-name="ecircumflex" unicode="&#xea;" -d="M200 400v-133h133v133h-133zM133 467h267v-67h67v-200h-267v-133h199v-66h-266v66h-66v334h66v66zM200 733h132v-66h68v-66h66v-67h-134v66h-132v-67h-133v68h66v66h67v66z" /> - <glyph glyph-name="Agrave" unicode="&#xc0;" -d="M59 470v-470h135v200h130v-200h135v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5h-120q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3 -t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM199 470h120v-190h-120v190zM129 803h133v-67h66v-67h-133v67h-66v67z" /> - <glyph glyph-name="Aacute" unicode="&#xc1;" -d="M59 470v-470h135v200h130v-200h135v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5h-120q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3 -t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM199 470h120v-190h-120v190zM263 737v66h134v-65h-68v-68h-131v67h65z" /> - <glyph glyph-name="Acircumflex" unicode="&#xc2;" -d="M59 470v-470h135v200h130v-200h135v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5h-120q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3 -t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM199 470h120v-190h-120v190zM130 803h267v-66h67v-68h-134v67h-133v-66h-133v66h66v67z" /> - <glyph glyph-name="Atilde" unicode="&#xc3;" -d="M59 470v-470h135v200h130v-200h135v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5h-120q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3 -t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM199 470h120v-190h-120v190zM129 803h200v-66h67v66h132v-67h-67v-65h-198v65h-67v-65h-133v65h66v67z" /> - <glyph glyph-name="Aring" unicode="&#xc5;" -d="M59 470v-470h135v200h130v-200h135v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t75.5 6.5v71h66v63h-65v66h-265v-65h-68v-64h65v-69q75 0 74.5 -8.5t-2 -18 -t-4 -18t-5.5 -11.5q-2 -2 -11 -3t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM199 470h120v-190h-120v190zM194 739h133v-66h-133v66z" /> - <glyph glyph-name="Egrave" unicode="&#xc8;" -d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0zM127 805h131v-64h67v-63h-134v62h-64v65z" /> - <glyph glyph-name="Eacute" unicode="&#xc9;" -d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0zM260 803h132v-66h-66v-66h-133v66h67v66z" /> - <glyph glyph-name="Ecircumflex" unicode="&#xca;" -d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0zM129 806h265v-66h67v-66h-132v65h-134v-66h-133v67h67v66z" /> - <glyph glyph-name="Edieresis" unicode="&#xcb;" -d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0zM62 807h132v-133h-132v133zM326 806h132v-133h-132v133z" /> - <glyph glyph-name="Igrave" unicode="&#xcc;" -d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0zM127 806h133v-67h66v-65h-133v66h-66v66z" /> - <glyph glyph-name="Iacute" unicode="&#xcd;" -d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0zM261 805h132v-67h-66v-66h-133v65h67v68z" /> - <glyph glyph-name="Icircumflex" unicode="&#xce;" -d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0zM124 809h266v-66h67v-66h-133v66h-134v-66h-132v65h66v67z" /> - <glyph glyph-name="Idieresis" unicode="&#xcf;" -d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0zM55 813h133v-131h-133v131zM322 812h132v-132h-132v132z" /> - <glyph glyph-name="Ograve" unicode="&#xd2;" -d="M75 69q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18 -t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470zM215 539h120v-470h-120v470zM142 808h133v-66h67v-68h-133v68h-67v66z" /> - <glyph glyph-name="Oacute" unicode="&#xd3;" -d="M75 69q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18 -t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470zM215 539h120v-470h-120v470zM276 806h132v-66h-66v-66h-133v65h67v67z" /> - <glyph glyph-name="Ocircumflex" unicode="&#xd4;" -d="M75 69q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18 -t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470zM215 539h120v-470h-120v470zM141 808h266v-68h66v-65h-132v67h-133v-66h-133v65h66v67z" /> - <glyph glyph-name="Otilde" unicode="&#xd5;" -d="M75 69q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18 -t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470zM215 539h120v-470h-120v470zM138 807h200v-66h67v66h132v-66h-66v-66h-199v65h-67v-65h-133v65h66v67z" /> - <glyph glyph-name="Ugrave" unicode="&#xd9;" -d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v540h-135v-540h-130v540h-135v-540zM124 809h133v-65h65v-67h-131v67h-67v65z" /> - <glyph glyph-name="Uacute" unicode="&#xda;" -d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v540h-135v-540h-130v540h-135v-540zM259 809h133v-66h-68v-66h-132v66h67v66z" /> - <glyph glyph-name="Ucircumflex" unicode="&#xdb;" -d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v540h-135v-540h-130v540h-135v-540zM124 809h268v-66h65v-65h-132v65h-132v-66h-134v66h65v66z" /> - <glyph glyph-name="ograve" unicode="&#xf2;" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18 -t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM199 400h120v-330h-120v330zM59 742h200v-133h66v-67h-132v67h-68v67h-66v66z" /> - <glyph glyph-name="oacute" unicode="&#xf3;" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18 -t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM199 400h120v-330h-120v330zM254 741h199v-66h-65v-67h-67v-67h-133v66h66v134z" /> - <glyph glyph-name="ocircumflex" unicode="&#xf4;" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18 -t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM199 400h120v-330h-120v330zM192 737h133v-66h67v-68h65v-66h-132v67h-134v-68h-132v67h65v67h68v67z" /> - <glyph glyph-name="otilde" unicode="&#xf5;" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18 -t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM199 400h120v-330h-120v330zM0 672h67v65h199v-66h66v-67h68v68h65v65h67v-132h-67l1 -67h-199v67h-67v67h-68v-68h-66v-66h-66v134z" /> - <glyph glyph-name="ugrave" unicode="&#xf9;" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v470h-135v-400h-130v400h-135v-400zM58 738h199v-132h67v-68h-133v68h-67v67h-66v65z" /> - <glyph glyph-name="uacute" unicode="&#xfa;" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v470h-135v-400h-130v400h-135v-400zM259 737h199v-66h-66v-66h-67v-67h-133v66h67v133z" /> - <glyph glyph-name="ucircumflex" unicode="&#xfb;" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v470h-135v-400h-130v400h-135v-400zM193 736h132v-65h67v-67h66v-67h-133v67h-133v-68h-132v67h66v67h67v66z" /> - <glyph glyph-name="Ntilde" unicode="&#xd1;" -d="M63 610v-610h135v311q3 0 11 4t16.5 8t16.5 6.5t11 0.5t5.5 -9t4 -15t2 -15.5t-1.5 -10.5q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q3 -3 12 -5.5t19.5 -4t20 -2t13.5 1.5v-200h135v610h-135v-270h-65q2 4 1.5 12.5t-2 18t-4 18 -t-5.5 11.5q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 12t-4 19.5t-2 20t1.5 13.5h-55v135h-135zM132 800h201v-66h66l1 66h132v-66h-66v-66h-199v66h-68v-66h-134v66h67v66z" /> - <glyph glyph-name="Eth" unicode="&#xd0;" -d="M55 611v-271h-55v-64h54v-276h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11 -q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5zM194 540h50q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t11.5 -5.5t18 -4t18 -2t12.5 1.5v-330q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5t-5.5 -11.5t-4 -18t-2 -18t1.5 -12.5h-50v205h67v65h-67 -v200z" /> - <glyph glyph-name="Yacute" unicode="&#xdd;" -d="M189 275v-275h130v275h70v60h65v275h-135v-270h-130v270h-135v-275h65v-60h70v0zM189 743h68v67h132v-66h-66v-66h-134v65z" /> - <glyph glyph-name="agrave" unicode="&#xe0;" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260v-65h190v-130h-190q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5 -v-130zM199 200h120v-130h-120v130zM63 737h198v-133h66v-67h-133v67h-66v68h-65v65z" /> - <glyph glyph-name="aacute" unicode="&#xe1;" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260v-65h190v-130h-190q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5 -v-130zM199 200h120v-130h-120v130zM459 739l1 -65h-67v-67h-66v-68h-133v67h67v133h198z" /> - <glyph glyph-name="acircumflex" unicode="&#xe2;" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260v-65h190v-130h-190q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5 -v-130zM199 200h120v-130h-120v130zM461 606v-68h-133v68h-134v-67h-133v66h67v67h66v66h133v-66h67v-66h67z" /> - <glyph glyph-name="atilde" unicode="&#xe3;" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260v-65h190v-130h-190q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5 -v-130zM199 200h120v-130h-120v130zM532 736v-132h-67v-68h-198v67h-67v67h-68v-66h-66v-67h-66v133h67v67h200v-67h66v-67h66v67h66v66h67z" /> - <glyph glyph-name="aring" unicode="&#xe5;" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260v-65h190v-130h-190q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5 -v-130zM199 200h120v-130h-120v130zM459 674h-67v66h-266v-66h-66v-67h65v-67h268v68h66v66zM194 672h133v-67h-132z" /> - <glyph glyph-name="igrave" unicode="&#xec;" -d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM194 537h133v67h-67v133h-200v-65h67v-67h67v-68z" /> - <glyph glyph-name="iacute" unicode="&#xed;" -d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM109 577zM257 606h-66v-67h132v67h67v67h67v65h-200v-132z" /> - <glyph glyph-name="icircumflex" unicode="&#xee;" -d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM192 737v-66h-67v-67h-66v-67h133v68h133v-67h134v66h-66v67h-67v66h-134v0z" /> - <glyph glyph-name="idieresis" unicode="&#xef;" -d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM323 672v-135h134v135h-134v0zM58 672v-135h134v135h-134v0z" /> - <glyph glyph-name="ntilde" unicode="&#xf1;" -d="M59 470v-470h135v400h130v-400h135v400l-65 7v63h-335v0zM533 736v-133h-67v-68h-199v67h-67v67h-68v-66h-66v-68h-67v134h67v67h200v-66h66v-67h68v66h66v67h67z" /> - <glyph glyph-name="yacute" unicode="&#xfd;" -d="M6 -139v-55h265v50q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 12 5.5t19.5 4t20 2t13.5 -1.5v135h65v405h-135v-400h-130v400h-135v-400q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h120v-70h-55v-70h-205z -M272 744h200v-66h-66v-67h-67v-68h-133v67h67z" /> - <glyph glyph-name="ydieresis" unicode="&#xff;" -d="M6 -139v-55h265v50q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 12 5.5t19.5 4t20 2t13.5 -1.5v135h65v405h-135v-400h-130v400h-135v-400q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h120v-70h-55v-70h-205z -M207 674v-134h-133v134h133zM476 674v-134h-134v134h134z" /> - <glyph glyph-name="oslash" unicode="&#xf8;" -d="M200 133v-66h133v133h-66v-67h-67zM200 400v-133h66v66h67v67h-133zM133 467h333v-400h-66v-67h-333v400h66v67z" /> - <glyph glyph-name="cedilla" unicode="&#xb8;" -d="M200 0h132v-67h68v-65h-67v-68h-200v67h134v66h-67v67z" /> - <glyph glyph-name="uni00B9" unicode="&#xb9;" -d="M200 600h133v-333h-133v200h-67v67h67v66z" /> - <glyph glyph-name="ordmasculine" unicode="&#xba;" -d="M135 600v-66h-66v-201h65v-66h268v66h66v200h-66v67h-267zM466 200v-67h-399v67h399zM200 333v200h133v-200h-133z" /> - <glyph glyph-name="paragraph" unicode="&#xb6;" -d="M533 600v-67h-67v-733h-133v333h-133v67h-67v67h-66v200h66v66h67v67h333z" /> - <glyph glyph-name="mu" unicode="&#xb5;" -d="M199 467v-400h134v400h132v-400h68v-67h-133v68h-67v-68h-133v-132h-67v-68h-133v67h67v600h132z" /> - <glyph glyph-name="Thorn" unicode="&#xde;" -d="M200 200h133v200h-133v-200zM67 600h133v-132h199v-68h66v-199h-66v-67h-199v-134h-133v600z" /> - <glyph glyph-name="thorn" unicode="&#xfe;" -d="M200 68h133v266h-133v-266zM67 600h133v-199h199v-68h66v-266h-65v-67h-200v-200h-133v800z" /> - <glyph glyph-name="guillemotright" unicode="&#xbb;" -d="M266 334v-66h68v-66h66v-68h-66v-67h-68v-66h133v67h67v66h67v66h-67v67h-66v67h-134zM132 334h-133v-65h67v-67h66v-68h-64v-66h-69v-68h133v67h68v67h65v66h-66v66h-67v68z" /> - <glyph glyph-name="Ccedilla" unicode="&#xc7;" -d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h64v-66h72v-65h-137v-68h204v68h66v64h-67v67h58q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130h-135v-130h-125v470h125v-130h135v130q-4 -2 -12.5 -1.5t-18 2 -t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470z" /> - <glyph glyph-name="Oslash" unicode="&#xd8;" -d="M200 133v-66h133v201h-66v-135h-67zM199 533v-200h67v134h66v66h-133zM133 600l333 1v-534h-66v-67h-333v534h66v66z" /> - <glyph glyph-name="multiply" unicode="&#xd7;" -d="M67 200v-132h65v65h68v68h133v-67h66v-66h66v132h-66v67h-67v67h68v66h66v134h-66v-67h-67v-67h-134v68h-67v66h-65v-133h66v-67h66v-67h-67v-67h-65z" /> - <glyph glyph-name="questiondown" unicode="&#xbf;" -d="M328 270v130h-120v-130h120zM329 72v125h-125v-120q-4 2 -13.5 1.5t-20 -2t-19.5 -4t-12 -5.5q-1 -1 -2.5 -10t-2.5 -19.5t-2 -19.5t-3 -11q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-130q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260 -q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130h-135v-130h-125v130q4 -2 12.5 -1.5t18 2t18 4t11.5 5.5t5.5 12t4 19.5t2 20t-1.5 13.5h50z" /> - <glyph glyph-name="ccedilla" unicode="&#xe7;" -d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h67v-64h68v-63h-130v-69h198v69h66v62h-66v67h56q-1 2 -0.5 10.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v60h-135v-60h-125v330h125v-60h135v60q-4 -2 -12.5 -1.5t-18 2t-18 4 -t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330z" /> - <glyph glyph-name="eth" unicode="&#xf0;" -d="M200 334h133v-267h-133v267zM332 600v-67h-66v67h-133v-67h67v-66h-133v-67h133v-67h-133v-266h66v-67h267v68h65v333h-65v66h-68v67h133v66h-133zM200 400h67v67h-67v-67z" /> - <glyph glyph-name="ae" unicode="&#xe6;" -d="M533 401v-200h-200v-133h199v-68h-199v68h-66v-68h-200v68h-67v133h66v67h134v133h-133v67h132v-67h67v67h199v-67h68zM333 267h67v133h-67v-133zM133 67h67v133h-67v-133z" /> - <glyph glyph-name="AE" unicode="&#xc6;" -d="M267 600h266v-67h-133v-199h132v-66h-132v-201h132v-67h-265v201h-68v-201h-132v400h65v67h67v66h68v67zM200 267h67v133h-67v-133z" /> - <glyph glyph-name="onequarter" unicode="&#xbc;" -d="M67 667h132v-334h68v68h66v66h66v66h134v-65h-68v-67h-66v-67h-66v-67h200v-334h-133v67h-200v133h-68v-66h-132v66h66v67h67v67h67v66h-134v200h-66v68h67v66zM333 67h67v66h-67v-66zM267 200h66v67h-66v-67zM200 133h67v67h-67v-67z" /> - <glyph glyph-name="onehalf" unicode="&#xbd;" -d="M67 667h132v-334h68v68h66v66h66v66h134v-65h-68v-67h-66v-67h-66v-67h132v-66h67v-67h-67v-66h-65v-68h133v-67h-267v135h66v66h67v67h-199v-68h-68v-66h-132v66h66v67h67v67h67v66h-134v200h-66v68h67v66z" /> - <glyph glyph-name="threequarters" unicode="&#xbe;" -d="M0 667h199v-67h67v-66h-67v-67h67v-66h-67v-68h68v68h66v66h66v66h134v-65h-68v-67h-66v-67h-66v-67h199v-334h-132v66h-200v135h67v66h66v67h-67v-66h-66v-68h-68v-66h-132v66h66v67h67v67h67v66h-200v68h132v67h-66v65h67v68h-133v66zM333 67h67v66h-67v-66z" /> - <glyph glyph-name="Euro" unicode="&#x20ac;" -d="M125 625h311v-61h63v-64h-124v63h-188v-162h188v-57l-189 -1v-63h126v-64h-126v-153h188v62h125v-61h-62v-64h-313v64h-61v154h-63v63h63v63h-63v56h62v163h63v62z" /> - </font> -</defs></svg> diff --git a/web/static/css/fonts/Fixedsys500c.ttf b/web/static/css/fonts/Fixedsys500c.ttf Binary files differ. diff --git a/web/static/css/fonts/Fixedsys500c.woff b/web/static/css/fonts/Fixedsys500c.woff Binary files differ. diff --git a/web/static/css/fonts/Px437_IBM_EGA8.otf b/web/static/css/fonts/Px437_IBM_EGA8.otf Binary files differ. diff --git a/web/static/img/moncheeta.png b/web/static/img/moncheeta.png Binary files differ. diff --git a/web/static/js/bootstrap.js b/web/static/js/bootstrap.js @@ -1,2425 +0,0 @@ -/* =================================================== - * bootstrap-transition.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#transitions - * =================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - -!(function ($) { - "use strict"; // jshint ;_; - - /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) - * ======================================================= */ - - $(function () { - $.support.transition = (function () { - var transitionEnd = (function () { - var el = document.createElement("bootstrap"), - transEndEventNames = { - WebkitTransition: "webkitTransitionEnd", - MozTransition: "transitionend", - OTransition: "oTransitionEnd otransitionend", - transition: "transitionend", - }, - name; - - for (name in transEndEventNames) { - if (el.style[name] !== undefined) { - return transEndEventNames[name]; - } - } - })(); - - return ( - transitionEnd && { - end: transitionEnd, - } - ); - })(); - }); -})(window.jQuery); /* ========================================================== - * bootstrap-alert.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#alerts - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - -!(function ($) { - "use strict"; // jshint ;_; - - /* ALERT CLASS DEFINITION - * ====================== */ - - var dismiss = '[data-dismiss="alert"]', - Alert = function (el) { - $(el).on("click", dismiss, this.close); - }; - - Alert.prototype.close = function (e) { - var $this = $(this), - selector = $this.attr("data-target"), - $parent; - - if (!selector) { - selector = $this.attr("href"); - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, ""); //strip for ie7 - } - - $parent = $(selector); - - e && e.preventDefault(); - - $parent.length || - ($parent = $this.hasClass("alert") ? $this : $this.parent()); - - $parent.trigger((e = $.Event("close"))); - - if (e.isDefaultPrevented()) return; - - $parent.removeClass("in"); - - function removeElement() { - $parent.trigger("closed").remove(); - } - - $.support.transition && $parent.hasClass("fade") - ? $parent.on($.support.transition.end, removeElement) - : removeElement(); - }; - - /* ALERT PLUGIN DEFINITION - * ======================= */ - - var old = $.fn.alert; - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this), - data = $this.data("alert"); - if (!data) $this.data("alert", (data = new Alert(this))); - if (typeof option == "string") data[option].call($this); - }); - }; - - $.fn.alert.Constructor = Alert; - - /* ALERT NO CONFLICT - * ================= */ - - $.fn.alert.noConflict = function () { - $.fn.alert = old; - return this; - }; - - /* ALERT DATA-API - * ============== */ - - $(document).on("click.alert.data-api", dismiss, Alert.prototype.close); -})( - window.jQuery, -); /* ============================================================ - * bootstrap-button.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#buttons - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - -!(function ($) { - "use strict"; // jshint ;_; - - /* BUTTON PUBLIC CLASS DEFINITION - * ============================== */ - - var Button = function (element, options) { - this.$element = $(element); - this.options = $.extend({}, $.fn.button.defaults, options); - }; - - Button.prototype.setState = function (state) { - var d = "disabled", - $el = this.$element, - data = $el.data(), - val = $el.is("input") ? "val" : "html"; - - state = state + "Text"; - data.resetText || $el.data("resetText", $el[val]()); - - $el[val](data[state] || this.options[state]); - - // push to event loop to allow forms to submit - setTimeout(function () { - state == "loadingText" - ? $el.addClass(d).attr(d, d) - : $el.removeClass(d).removeAttr(d); - }, 0); - }; - - Button.prototype.toggle = function () { - var $parent = this.$element.closest('[data-toggle="buttons-radio"]'); - - $parent && $parent.find(".active").removeClass("active"); - - this.$element.toggleClass("active"); - }; - - /* BUTTON PLUGIN DEFINITION - * ======================== */ - - var old = $.fn.button; - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this), - data = $this.data("button"), - options = typeof option == "object" && option; - if (!data) $this.data("button", (data = new Button(this, options))); - if (option == "toggle") data.toggle(); - else if (option) data.setState(option); - }); - }; - - $.fn.button.defaults = { - loadingText: "loading...", - }; - - $.fn.button.Constructor = Button; - - /* BUTTON NO CONFLICT - * ================== */ - - $.fn.button.noConflict = function () { - $.fn.button = old; - return this; - }; - - /* BUTTON DATA-API - * =============== */ - - $(document).on( - "click.button.data-api", - "[data-toggle^=button]", - function (e) { - var $btn = $(e.target); - if (!$btn.hasClass("btn")) $btn = $btn.closest(".btn"); - $btn.button("toggle"); - }, - ); -})(window.jQuery); /* ========================================================== - * bootstrap-carousel.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#carousel - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - -!(function ($) { - "use strict"; // jshint ;_; - - /* CAROUSEL CLASS DEFINITION - * ========================= */ - - var Carousel = function (element, options) { - this.$element = $(element); - this.$indicators = this.$element.find(".carousel-indicators"); - this.options = options; - this.options.pause == "hover" && - this.$element - .on("mouseenter", $.proxy(this.pause, this)) - .on("mouseleave", $.proxy(this.cycle, this)); - }; - - Carousel.prototype = { - cycle: function (e) { - if (!e) this.paused = false; - if (this.interval) clearInterval(this.interval); - this.options.interval && - !this.paused && - (this.interval = setInterval( - $.proxy(this.next, this), - this.options.interval, - )); - return this; - }, - - getActiveIndex: function () { - this.$active = this.$element.find(".item.active"); - this.$items = this.$active.parent().children(); - return this.$items.index(this.$active); - }, - - to: function (pos) { - var activeIndex = this.getActiveIndex(), - that = this; - - if (pos > this.$items.length - 1 || pos < 0) return; - - if (this.sliding) { - return this.$element.one("slid", function () { - that.to(pos); - }); - } - - if (activeIndex == pos) { - return this.pause().cycle(); - } - - return this.slide( - pos > activeIndex ? "next" : "prev", - $(this.$items[pos]), - ); - }, - - pause: function (e) { - if (!e) this.paused = true; - if ( - this.$element.find(".next, .prev").length && - $.support.transition.end - ) { - this.$element.trigger($.support.transition.end); - this.cycle(true); - } - clearInterval(this.interval); - this.interval = null; - return this; - }, - - next: function () { - if (this.sliding) return; - return this.slide("next"); - }, - - prev: function () { - if (this.sliding) return; - return this.slide("prev"); - }, - - slide: function (type, next) { - var $active = this.$element.find(".item.active"), - $next = next || $active[type](), - isCycling = this.interval, - direction = type == "next" ? "left" : "right", - fallback = type == "next" ? "first" : "last", - that = this, - e; - - this.sliding = true; - - isCycling && this.pause(); - - $next = $next.length ? $next : this.$element.find(".item")[fallback](); - - e = $.Event("slide", { - relatedTarget: $next[0], - direction: direction, - }); - - if ($next.hasClass("active")) return; - - if (this.$indicators.length) { - this.$indicators.find(".active").removeClass("active"); - this.$element.one("slid", function () { - var $nextIndicator = $( - that.$indicators.children()[that.getActiveIndex()], - ); - $nextIndicator && $nextIndicator.addClass("active"); - }); - } - - if ($.support.transition && this.$element.hasClass("slide")) { - this.$element.trigger(e); - if (e.isDefaultPrevented()) return; - $next.addClass(type); - $next[0].offsetWidth; // force reflow - $active.addClass(direction); - $next.addClass(direction); - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(" ")).addClass("active"); - $active.removeClass(["active", direction].join(" ")); - that.sliding = false; - setTimeout(function () { - that.$element.trigger("slid"); - }, 0); - }); - } else { - this.$element.trigger(e); - if (e.isDefaultPrevented()) return; - $active.removeClass("active"); - $next.addClass("active"); - this.sliding = false; - this.$element.trigger("slid"); - } - - isCycling && this.cycle(); - - return this; - }, - }; - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.carousel; - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this), - data = $this.data("carousel"), - options = $.extend( - {}, - $.fn.carousel.defaults, - typeof option == "object" && option, - ), - action = typeof option == "string" ? option : options.slide; - if (!data) $this.data("carousel", (data = new Carousel(this, options))); - if (typeof option == "number") data.to(option); - else if (action) data[action](); - else if (options.interval) data.pause().cycle(); - }); - }; - - $.fn.carousel.defaults = { - interval: 5000, - pause: "hover", - }; - - $.fn.carousel.Constructor = Carousel; - - /* CAROUSEL NO CONFLICT - * ==================== */ - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old; - return this; - }; - - /* CAROUSEL DATA-API - * ================= */ - - $(document).on( - "click.carousel.data-api", - "[data-slide], [data-slide-to]", - function (e) { - var $this = $(this), - href, - $target = $( - $this.attr("data-target") || - ((href = $this.attr("href")) && href.replace(/.*(?=#[^\s]+$)/, "")), - ), //strip for ie7 - options = $.extend({}, $target.data(), $this.data()), - slideIndex; - - $target.carousel(options); - - if ((slideIndex = $this.attr("data-slide-to"))) { - $target.data("carousel").pause().to(slideIndex).cycle(); - } - - e.preventDefault(); - }, - ); -})( - window.jQuery, -); /* ============================================================= - * bootstrap-collapse.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#collapse - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - -!(function ($) { - "use strict"; // jshint ;_; - - /* COLLAPSE PUBLIC CLASS DEFINITION - * ================================ */ - - var Collapse = function (element, options) { - this.$element = $(element); - this.options = $.extend({}, $.fn.collapse.defaults, options); - - if (this.options.parent) { - this.$parent = $(this.options.parent); - } - - this.options.toggle && this.toggle(); - }; - - Collapse.prototype = { - constructor: Collapse, - - dimension: function () { - var hasWidth = this.$element.hasClass("width"); - return hasWidth ? "width" : "height"; - }, - - show: function () { - var dimension, scroll, actives, hasData; - - if (this.transitioning || this.$element.hasClass("in")) return; - - dimension = this.dimension(); - scroll = $.camelCase(["scroll", dimension].join("-")); - actives = this.$parent && this.$parent.find("> .accordion-group > .in"); - - if (actives && actives.length) { - hasData = actives.data("collapse"); - if (hasData && hasData.transitioning) return; - actives.collapse("hide"); - hasData || actives.data("collapse", null); - } - - this.$element[dimension](0); - this.transition("addClass", $.Event("show"), "shown"); - $.support.transition && - this.$element[dimension](this.$element[0][scroll]); - }, - - hide: function () { - var dimension; - if (this.transitioning || !this.$element.hasClass("in")) return; - dimension = this.dimension(); - this.reset(this.$element[dimension]()); - this.transition("removeClass", $.Event("hide"), "hidden"); - this.$element[dimension](0); - }, - - reset: function (size) { - var dimension = this.dimension(); - - this.$element.removeClass("collapse")[dimension](size || "auto")[0] - .offsetWidth; - - this.$element[size !== null ? "addClass" : "removeClass"]("collapse"); - - return this; - }, - - transition: function (method, startEvent, completeEvent) { - var that = this, - complete = function () { - if (startEvent.type == "show") that.reset(); - that.transitioning = 0; - that.$element.trigger(completeEvent); - }; - - this.$element.trigger(startEvent); - - if (startEvent.isDefaultPrevented()) return; - - this.transitioning = 1; - - this.$element[method]("in"); - - $.support.transition && this.$element.hasClass("collapse") - ? this.$element.one($.support.transition.end, complete) - : complete(); - }, - - toggle: function () { - this[this.$element.hasClass("in") ? "hide" : "show"](); - }, - }; - - /* COLLAPSE PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.collapse; - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this), - data = $this.data("collapse"), - options = $.extend( - {}, - $.fn.collapse.defaults, - $this.data(), - typeof option == "object" && option, - ); - if (!data) $this.data("collapse", (data = new Collapse(this, options))); - if (typeof option == "string") data[option](); - }); - }; - - $.fn.collapse.defaults = { - toggle: true, - }; - - $.fn.collapse.Constructor = Collapse; - - /* COLLAPSE NO CONFLICT - * ==================== */ - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old; - return this; - }; - - /* COLLAPSE DATA-API - * ================= */ - - $(document).on( - "click.collapse.data-api", - "[data-toggle=collapse]", - function (e) { - var $this = $(this), - href, - target = - $this.attr("data-target") || - e.preventDefault() || - ((href = $this.attr("href")) && href.replace(/.*(?=#[^\s]+$)/, "")), //strip for ie7 - option = $(target).data("collapse") ? "toggle" : $this.data(); - $this[$(target).hasClass("in") ? "addClass" : "removeClass"]("collapsed"); - $(target).collapse(option); - }, - ); -})( - window.jQuery, -); /* ============================================================ - * bootstrap-dropdown.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#dropdowns - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - -!(function ($) { - "use strict"; // jshint ;_; - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = "[data-toggle=dropdown]", - Dropdown = function (element) { - var $el = $(element).on("click.dropdown.data-api", this.toggle); - $("html").on("click.dropdown.data-api", function () { - $el.parent().removeClass("open"); - }); - }; - - Dropdown.prototype = { - constructor: Dropdown, - - toggle: function (e) { - var $this = $(this), - $parent, - isActive; - - if ($this.is(".disabled, :disabled")) return; - - $parent = getParent($this); - - isActive = $parent.hasClass("open"); - - clearMenus(); - - if (!isActive) { - $parent.toggleClass("open"); - } - - $this.focus(); - - return false; - }, - - keydown: function (e) { - var $this, $items, $active, $parent, isActive, index; - - if (!/(38|40|27)/.test(e.keyCode)) return; - - $this = $(this); - - e.preventDefault(); - e.stopPropagation(); - - if ($this.is(".disabled, :disabled")) return; - - $parent = getParent($this); - - isActive = $parent.hasClass("open"); - - if (!isActive || (isActive && e.keyCode == 27)) { - if (e.which == 27) $parent.find(toggle).focus(); - return $this.click(); - } - - $items = $("[role=menu] li:not(.divider):visible a", $parent); - - if (!$items.length) return; - - index = $items.index($items.filter(":focus")); - - if (e.keyCode == 38 && index > 0) index--; // up - if (e.keyCode == 40 && index < $items.length - 1) index++; // down - if (!~index) index = 0; - - $items.eq(index).focus(); - }, - }; - - function clearMenus() { - $(toggle).each(function () { - getParent($(this)).removeClass("open"); - }); - } - - function getParent($this) { - var selector = $this.attr("data-target"), - $parent; - - if (!selector) { - selector = $this.attr("href"); - selector = - selector && - /#/.test(selector) && - selector.replace(/.*(?=#[^\s]*$)/, ""); //strip for ie7 - } - - $parent = selector && $(selector); - - if (!$parent || !$parent.length) $parent = $this.parent(); - - return $parent; - } - - /* DROPDOWN PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.dropdown; - - $.fn.dropdown = function (option) { - return this.each(function () { - var $this = $(this), - data = $this.data("dropdown"); - if (!data) $this.data("dropdown", (data = new Dropdown(this))); - if (typeof option == "string") data[option].call($this); - }); - }; - - $.fn.dropdown.Constructor = Dropdown; - - /* DROPDOWN NO CONFLICT - * ==================== */ - - $.fn.dropdown.noConflict = function () { - $.fn.dropdown = old; - return this; - }; - - /* APPLY TO STANDARD DROPDOWN ELEMENTS - * =================================== */ - - $(document) - .on("click.dropdown.data-api", clearMenus) - .on("click.dropdown.data-api", ".dropdown form", function (e) { - e.stopPropagation(); - }) - .on("click.dropdown-menu", function (e) { - e.stopPropagation(); - }) - .on("click.dropdown.data-api", toggle, Dropdown.prototype.toggle) - .on( - "keydown.dropdown.data-api", - toggle + ", [role=menu]", - Dropdown.prototype.keydown, - ); -})(window.jQuery); -/* ========================================================= - * bootstrap-modal.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#modals - * ========================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================= */ - -!(function ($) { - "use strict"; // jshint ;_; - - /* MODAL CLASS DEFINITION - * ====================== */ - - var Modal = function (element, options) { - this.options = options; - this.$element = $(element).delegate( - '[data-dismiss="modal"]', - "click.dismiss.modal", - $.proxy(this.hide, this), - ); - this.options.remote && - this.$element.find(".modal-body").load(this.options.remote); - }; - - Modal.prototype = { - constructor: Modal, - - toggle: function () { - return this[!this.isShown ? "show" : "hide"](); - }, - - show: function () { - var that = this, - e = $.Event("show"); - - this.$element.trigger(e); - - if (this.isShown || e.isDefaultPrevented()) return; - - this.isShown = true; - - this.escape(); - - this.backdrop(function () { - var transition = $.support.transition && that.$element.hasClass("fade"); - - if (!that.$element.parent().length) { - that.$element.appendTo(document.body); //don't move modals dom position - } - - that.$element.show(); - - if (transition) { - that.$element[0].offsetWidth; // force reflow - } - - that.$element.addClass("in").attr("aria-hidden", false); - - that.enforceFocus(); - - transition - ? that.$element.one($.support.transition.end, function () { - that.$element.focus().trigger("shown"); - }) - : that.$element.focus().trigger("shown"); - }); - }, - - hide: function (e) { - e && e.preventDefault(); - - var that = this; - - e = $.Event("hide"); - - this.$element.trigger(e); - - if (!this.isShown || e.isDefaultPrevented()) return; - - this.isShown = false; - - this.escape(); - - $(document).off("focusin.modal"); - - this.$element.removeClass("in").attr("aria-hidden", true); - - $.support.transition && this.$element.hasClass("fade") - ? this.hideWithTransition() - : this.hideModal(); - }, - - enforceFocus: function () { - var that = this; - $(document).on("focusin.modal", function (e) { - if ( - that.$element[0] !== e.target && - !that.$element.has(e.target).length - ) { - that.$element.focus(); - } - }); - }, - - escape: function () { - var that = this; - if (this.isShown && this.options.keyboard) { - this.$element.on("keyup.dismiss.modal", function (e) { - e.which == 27 && that.hide(); - }); - } else if (!this.isShown) { - this.$element.off("keyup.dismiss.modal"); - } - }, - - hideWithTransition: function () { - var that = this, - timeout = setTimeout(function () { - that.$element.off($.support.transition.end); - that.hideModal(); - }, 500); - - this.$element.one($.support.transition.end, function () { - clearTimeout(timeout); - that.hideModal(); - }); - }, - - hideModal: function () { - var that = this; - this.$element.hide(); - this.backdrop(function () { - that.removeBackdrop(); - that.$element.trigger("hidden"); - }); - }, - - removeBackdrop: function () { - this.$backdrop && this.$backdrop.remove(); - this.$backdrop = null; - }, - - backdrop: function (callback) { - var that = this, - animate = this.$element.hasClass("fade") ? "fade" : ""; - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate; - - this.$backdrop = $( - '<div class="modal-backdrop ' + animate + '" />', - ).appendTo(document.body); - - this.$backdrop.click( - this.options.backdrop == "static" - ? $.proxy(this.$element[0].focus, this.$element[0]) - : $.proxy(this.hide, this), - ); - - if (doAnimate) this.$backdrop[0].offsetWidth; // force reflow - - this.$backdrop.addClass("in"); - - if (!callback) return; - - doAnimate - ? this.$backdrop.one($.support.transition.end, callback) - : callback(); - } else if (!this.isShown && this.$backdrop) { - this.$backdrop.removeClass("in"); - - $.support.transition && this.$element.hasClass("fade") - ? this.$backdrop.one($.support.transition.end, callback) - : callback(); - } else if (callback) { - callback(); - } - }, - }; - - /* MODAL PLUGIN DEFINITION - * ======================= */ - - var old = $.fn.modal; - - $.fn.modal = function (option) { - return this.each(function () { - var $this = $(this), - data = $this.data("modal"), - options = $.extend( - {}, - $.fn.modal.defaults, - $this.data(), - typeof option == "object" && option, - ); - if (!data) $this.data("modal", (data = new Modal(this, options))); - if (typeof option == "string") data[option](); - else if (options.show) data.show(); - }); - }; - - $.fn.modal.defaults = { - backdrop: true, - keyboard: true, - show: true, - }; - - $.fn.modal.Constructor = Modal; - - /* MODAL NO CONFLICT - * ================= */ - - $.fn.modal.noConflict = function () { - $.fn.modal = old; - return this; - }; - - /* MODAL DATA-API - * ============== */ - - $(document).on("click.modal.data-api", '[data-toggle="modal"]', function (e) { - var $this = $(this), - href = $this.attr("href"), - $target = $( - $this.attr("data-target") || - (href && href.replace(/.*(?=#[^\s]+$)/, "")), - ), //strip for ie7 - option = $target.data("modal") - ? "toggle" - : $.extend( - { remote: !/#/.test(href) && href }, - $target.data(), - $this.data(), - ); - - e.preventDefault(); - - $target.modal(option).one("hide", function () { - $this.focus(); - }); - }); -})(window.jQuery); -/* =========================================================== - * bootstrap-tooltip.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#tooltips - * Inspired by the original jQuery.tipsy by Jason Frame - * =========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - -!(function ($) { - "use strict"; // jshint ;_; - - /* TOOLTIP PUBLIC CLASS DEFINITION - * =============================== */ - - var Tooltip = function (element, options) { - this.init("tooltip", element, options); - }; - - Tooltip.prototype = { - constructor: Tooltip, - - init: function (type, element, options) { - var eventIn, eventOut, triggers, trigger, i; - - this.type = type; - this.$element = $(element); - this.options = this.getOptions(options); - this.enabled = true; - - triggers = this.options.trigger.split(" "); - - for (i = triggers.length; i--; ) { - trigger = triggers[i]; - if (trigger == "click") { - this.$element.on( - "click." + this.type, - this.options.selector, - $.proxy(this.toggle, this), - ); - } else if (trigger != "manual") { - eventIn = trigger == "hover" ? "mouseenter" : "focus"; - eventOut = trigger == "hover" ? "mouseleave" : "blur"; - this.$element.on( - eventIn + "." + this.type, - this.options.selector, - $.proxy(this.enter, this), - ); - this.$element.on( - eventOut + "." + this.type, - this.options.selector, - $.proxy(this.leave, this), - ); - } - } - - this.options.selector - ? (this._options = $.extend({}, this.options, { - trigger: "manual", - selector: "", - })) - : this.fixTitle(); - }, - - getOptions: function (options) { - options = $.extend( - {}, - $.fn[this.type].defaults, - this.$element.data(), - options, - ); - - if (options.delay && typeof options.delay == "number") { - options.delay = { - show: options.delay, - hide: options.delay, - }; - } - - return options; - }, - - enter: function (e) { - var defaults = $.fn[this.type].defaults, - options = {}, - self; - - this._options && - $.each( - this._options, - function (key, value) { - if (defaults[key] != value) options[key] = value; - }, - this, - ); - - self = $(e.currentTarget)[this.type](options).data(this.type); - - if (!self.options.delay || !self.options.delay.show) return self.show(); - - clearTimeout(this.timeout); - self.hoverState = "in"; - this.timeout = setTimeout(function () { - if (self.hoverState == "in") self.show(); - }, self.options.delay.show); - }, - - leave: function (e) { - var self = $(e.currentTarget)[this.type](this._options).data(this.type); - - if (this.timeout) clearTimeout(this.timeout); - if (!self.options.delay || !self.options.delay.hide) return self.hide(); - - self.hoverState = "out"; - this.timeout = setTimeout(function () { - if (self.hoverState == "out") self.hide(); - }, self.options.delay.hide); - }, - - show: function () { - var $tip, - pos, - actualWidth, - actualHeight, - placement, - tp, - e = $.Event("show"); - - if (this.hasContent() && this.enabled) { - this.$element.trigger(e); - if (e.isDefaultPrevented()) return; - $tip = this.tip(); - this.setContent(); - - if (this.options.animation) { - $tip.addClass("fade"); - } - - placement = - typeof this.options.placement == "function" - ? this.options.placement.call(this, $tip[0], this.$element[0]) - : this.options.placement; - - $tip.detach().css({ top: 0, left: 0, display: "block" }); - - this.options.container - ? $tip.appendTo(this.options.container) - : $tip.insertAfter(this.$element); - - pos = this.getPosition(); - - actualWidth = $tip[0].offsetWidth; - actualHeight = $tip[0].offsetHeight; - - switch (placement) { - case "bottom": - tp = { - top: pos.top + pos.height, - left: pos.left + pos.width / 2 - actualWidth / 2, - }; - break; - case "top": - tp = { - top: pos.top - actualHeight, - left: pos.left + pos.width / 2 - actualWidth / 2, - }; - break; - case "left": - tp = { - top: pos.top + pos.height / 2 - actualHeight / 2, - left: pos.left - actualWidth, - }; - break; - case "right": - tp = { - top: pos.top + pos.height / 2 - actualHeight / 2, - left: pos.left + pos.width, - }; - break; - } - - this.applyPlacement(tp, placement); - this.$element.trigger("shown"); - } - }, - - applyPlacement: function (offset, placement) { - var $tip = this.tip(), - width = $tip[0].offsetWidth, - height = $tip[0].offsetHeight, - actualWidth, - actualHeight, - delta, - replace; - - $tip.offset(offset).addClass(placement).addClass("in"); - - actualWidth = $tip[0].offsetWidth; - actualHeight = $tip[0].offsetHeight; - - if (placement == "top" && actualHeight != height) { - offset.top = offset.top + height - actualHeight; - replace = true; - } - - if (placement == "bottom" || placement == "top") { - delta = 0; - - if (offset.left < 0) { - delta = offset.left * -2; - offset.left = 0; - $tip.offset(offset); - actualWidth = $tip[0].offsetWidth; - actualHeight = $tip[0].offsetHeight; - } - - this.replaceArrow(delta - width + actualWidth, actualWidth, "left"); - } else { - this.replaceArrow(actualHeight - height, actualHeight, "top"); - } - - if (replace) $tip.offset(offset); - }, - - replaceArrow: function (delta, dimension, position) { - this.arrow().css( - position, - delta ? 50 * (1 - delta / dimension) + "%" : "", - ); - }, - - setContent: function () { - var $tip = this.tip(), - title = this.getTitle(); - - $tip.find(".tooltip-inner")[this.options.html ? "html" : "text"](title); - $tip.removeClass("fade in top bottom left right"); - }, - - hide: function () { - var that = this, - $tip = this.tip(), - e = $.Event("hide"); - - this.$element.trigger(e); - if (e.isDefaultPrevented()) return; - - $tip.removeClass("in"); - - function removeWithAnimation() { - var timeout = setTimeout(function () { - $tip.off($.support.transition.end).detach(); - }, 500); - - $tip.one($.support.transition.end, function () { - clearTimeout(timeout); - $tip.detach(); - }); - } - - $.support.transition && this.$tip.hasClass("fade") - ? removeWithAnimation() - : $tip.detach(); - - this.$element.trigger("hidden"); - - return this; - }, - - fixTitle: function () { - var $e = this.$element; - if ( - $e.attr("title") || - typeof $e.attr("data-original-title") != "string" - ) { - $e.attr("data-original-title", $e.attr("title") || "").attr( - "title", - "", - ); - } - }, - - hasContent: function () { - return this.getTitle(); - }, - - getPosition: function () { - var el = this.$element[0]; - return $.extend( - {}, - typeof el.getBoundingClientRect == "function" - ? el.getBoundingClientRect() - : { - width: el.offsetWidth, - height: el.offsetHeight, - }, - this.$element.offset(), - ); - }, - - getTitle: function () { - var title, - $e = this.$element, - o = this.options; - - title = - $e.attr("data-original-title") || - (typeof o.title == "function" ? o.title.call($e[0]) : o.title); - - return title; - }, - - tip: function () { - return (this.$tip = this.$tip || $(this.options.template)); - }, - - arrow: function () { - return (this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow")); - }, - - validate: function () { - if (!this.$element[0].parentNode) { - this.hide(); - this.$element = null; - this.options = null; - } - }, - - enable: function () { - this.enabled = true; - }, - - disable: function () { - this.enabled = false; - }, - - toggleEnabled: function () { - this.enabled = !this.enabled; - }, - - toggle: function (e) { - var self = e - ? $(e.currentTarget)[this.type](this._options).data(this.type) - : this; - self.tip().hasClass("in") ? self.hide() : self.show(); - }, - - destroy: function () { - this.hide() - .$element.off("." + this.type) - .removeData(this.type); - }, - }; - - /* TOOLTIP PLUGIN DEFINITION - * ========================= */ - - var old = $.fn.tooltip; - - $.fn.tooltip = function (option) { - return this.each(function () { - var $this = $(this), - data = $this.data("tooltip"), - options = typeof option == "object" && option; - if (!data) $this.data("tooltip", (data = new Tooltip(this, options))); - if (typeof option == "string") data[option](); - }); - }; - - $.fn.tooltip.Constructor = Tooltip; - - $.fn.tooltip.defaults = { - animation: true, - placement: "top", - selector: false, - template: - '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', - trigger: "hover focus", - title: "", - delay: 0, - html: false, - container: false, - }; - - /* TOOLTIP NO CONFLICT - * =================== */ - - $.fn.tooltip.noConflict = function () { - $.fn.tooltip = old; - return this; - }; -})(window.jQuery); -/* =========================================================== - * bootstrap-popover.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#popovers - * =========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * =========================================================== */ - -!(function ($) { - "use strict"; // jshint ;_; - - /* POPOVER PUBLIC CLASS DEFINITION - * =============================== */ - - var Popover = function (element, options) { - this.init("popover", element, options); - }; - - /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js - ========================================== */ - - Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, { - constructor: Popover, - - setContent: function () { - var $tip = this.tip(), - title = this.getTitle(), - content = this.getContent(); - - $tip.find(".popover-title")[this.options.html ? "html" : "text"](title); - $tip - .find(".popover-content") - [this.options.html ? "html" : "text"](content); - - $tip.removeClass("fade top bottom left right in"); - }, - - hasContent: function () { - return this.getTitle() || this.getContent(); - }, - - getContent: function () { - var content, - $e = this.$element, - o = this.options; - - content = - (typeof o.content == "function" ? o.content.call($e[0]) : o.content) || - $e.attr("data-content"); - - return content; - }, - - tip: function () { - if (!this.$tip) { - this.$tip = $(this.options.template); - } - return this.$tip; - }, - - destroy: function () { - this.hide() - .$element.off("." + this.type) - .removeData(this.type); - }, - }); - - /* POPOVER PLUGIN DEFINITION - * ======================= */ - - var old = $.fn.popover; - - $.fn.popover = function (option) { - return this.each(function () { - var $this = $(this), - data = $this.data("popover"), - options = typeof option == "object" && option; - if (!data) $this.data("popover", (data = new Popover(this, options))); - if (typeof option == "string") data[option](); - }); - }; - - $.fn.popover.Constructor = Popover; - - $.fn.popover.defaults = $.extend({}, $.fn.tooltip.defaults, { - placement: "right", - trigger: "click", - content: "", - template: - '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>', - }); - - /* POPOVER NO CONFLICT - * =================== */ - - $.fn.popover.noConflict = function () { - $.fn.popover = old; - return this; - }; -})(window.jQuery); -/* ============================================================= - * bootstrap-scrollspy.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#scrollspy - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================== */ - -!(function ($) { - "use strict"; // jshint ;_; - - /* SCROLLSPY CLASS DEFINITION - * ========================== */ - - function ScrollSpy(element, options) { - var process = $.proxy(this.process, this), - $element = $(element).is("body") ? $(window) : $(element), - href; - this.options = $.extend({}, $.fn.scrollspy.defaults, options); - this.$scrollElement = $element.on("scroll.scroll-spy.data-api", process); - this.selector = - (this.options.target || - ((href = $(element).attr("href")) && - href.replace(/.*(?=#[^\s]+$)/, "")) || //strip for ie7 - "") + " .nav li > a"; - this.$body = $("body"); - this.refresh(); - this.process(); - } - - ScrollSpy.prototype = { - constructor: ScrollSpy, - - refresh: function () { - var self = this, - $targets; - - this.offsets = $([]); - this.targets = $([]); - - $targets = this.$body - .find(this.selector) - .map(function () { - var $el = $(this), - href = $el.data("target") || $el.attr("href"), - $href = /^#\w/.test(href) && $(href); - return ( - ($href && - $href.length && [ - [ - $href.position().top + - (!$.isWindow(self.$scrollElement.get(0)) && - self.$scrollElement.scrollTop()), - href, - ], - ]) || - null - ); - }) - .sort(function (a, b) { - return a[0] - b[0]; - }) - .each(function () { - self.offsets.push(this[0]); - self.targets.push(this[1]); - }); - }, - - process: function () { - var scrollTop = this.$scrollElement.scrollTop() + this.options.offset, - scrollHeight = - this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight, - maxScroll = scrollHeight - this.$scrollElement.height(), - offsets = this.offsets, - targets = this.targets, - activeTarget = this.activeTarget, - i; - - if (scrollTop >= maxScroll) { - return activeTarget != (i = targets.last()[0]) && this.activate(i); - } - - for (i = offsets.length; i--; ) { - activeTarget != targets[i] && - scrollTop >= offsets[i] && - (!offsets[i + 1] || scrollTop <= offsets[i + 1]) && - this.activate(targets[i]); - } - }, - - activate: function (target) { - var active, selector; - - this.activeTarget = target; - - $(this.selector).parent(".active").removeClass("active"); - - selector = - this.selector + - '[data-target="' + - target + - '"],' + - this.selector + - '[href="' + - target + - '"]'; - - active = $(selector).parent("li").addClass("active"); - - if (active.parent(".dropdown-menu").length) { - active = active.closest("li.dropdown").addClass("active"); - } - - active.trigger("activate"); - }, - }; - - /* SCROLLSPY PLUGIN DEFINITION - * =========================== */ - - var old = $.fn.scrollspy; - - $.fn.scrollspy = function (option) { - return this.each(function () { - var $this = $(this), - data = $this.data("scrollspy"), - options = typeof option == "object" && option; - if (!data) $this.data("scrollspy", (data = new ScrollSpy(this, options))); - if (typeof option == "string") data[option](); - }); - }; - - $.fn.scrollspy.Constructor = ScrollSpy; - - $.fn.scrollspy.defaults = { - offset: 10, - }; - - /* SCROLLSPY NO CONFLICT - * ===================== */ - - $.fn.scrollspy.noConflict = function () { - $.fn.scrollspy = old; - return this; - }; - - /* SCROLLSPY DATA-API - * ================== */ - - $(window).on("load", function () { - $('[data-spy="scroll"]').each(function () { - var $spy = $(this); - $spy.scrollspy($spy.data()); - }); - }); -})(window.jQuery); /* ======================================================== - * bootstrap-tab.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#tabs - * ======================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================== */ - -!(function ($) { - "use strict"; // jshint ;_; - - /* TAB CLASS DEFINITION - * ==================== */ - - var Tab = function (element) { - this.element = $(element); - }; - - Tab.prototype = { - constructor: Tab, - - show: function () { - var $this = this.element, - $ul = $this.closest("ul:not(.dropdown-menu)"), - selector = $this.attr("data-target"), - previous, - $target, - e; - - if (!selector) { - selector = $this.attr("href"); - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, ""); //strip for ie7 - } - - if ($this.parent("li").hasClass("active")) return; - - previous = $ul.find(".active:last a")[0]; - - e = $.Event("show", { - relatedTarget: previous, - }); - - $this.trigger(e); - - if (e.isDefaultPrevented()) return; - - $target = $(selector); - - this.activate($this.parent("li"), $ul); - this.activate($target, $target.parent(), function () { - $this.trigger({ - type: "shown", - relatedTarget: previous, - }); - }); - }, - - activate: function (element, container, callback) { - var $active = container.find("> .active"), - transition = - callback && $.support.transition && $active.hasClass("fade"); - - function next() { - $active - .removeClass("active") - .find("> .dropdown-menu > .active") - .removeClass("active"); - - element.addClass("active"); - - if (transition) { - element[0].offsetWidth; // reflow for transition - element.addClass("in"); - } else { - element.removeClass("fade"); - } - - if (element.parent(".dropdown-menu")) { - element.closest("li.dropdown").addClass("active"); - } - - callback && callback(); - } - - transition ? $active.one($.support.transition.end, next) : next(); - - $active.removeClass("in"); - }, - }; - - /* TAB PLUGIN DEFINITION - * ===================== */ - - var old = $.fn.tab; - - $.fn.tab = function (option) { - return this.each(function () { - var $this = $(this), - data = $this.data("tab"); - if (!data) $this.data("tab", (data = new Tab(this))); - if (typeof option == "string") data[option](); - }); - }; - - $.fn.tab.Constructor = Tab; - - /* TAB NO CONFLICT - * =============== */ - - $.fn.tab.noConflict = function () { - $.fn.tab = old; - return this; - }; - - /* TAB DATA-API - * ============ */ - - $(document).on( - "click.tab.data-api", - '[data-toggle="tab"], [data-toggle="pill"]', - function (e) { - e.preventDefault(); - $(this).tab("show"); - }, - ); -})( - window.jQuery, -); /* ============================================================= - * bootstrap-typeahead.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#typeahead - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - -!(function ($) { - "use strict"; // jshint ;_; - - /* TYPEAHEAD PUBLIC CLASS DEFINITION - * ================================= */ - - var Typeahead = function (element, options) { - this.$element = $(element); - this.options = $.extend({}, $.fn.typeahead.defaults, options); - this.matcher = this.options.matcher || this.matcher; - this.sorter = this.options.sorter || this.sorter; - this.highlighter = this.options.highlighter || this.highlighter; - this.updater = this.options.updater || this.updater; - this.source = this.options.source; - this.$menu = $(this.options.menu); - this.shown = false; - this.listen(); - }; - - Typeahead.prototype = { - constructor: Typeahead, - - select: function () { - var val = this.$menu.find(".active").attr("data-value"); - this.$element.val(this.updater(val)).change(); - return this.hide(); - }, - - updater: function (item) { - return item; - }, - - show: function () { - var pos = $.extend({}, this.$element.position(), { - height: this.$element[0].offsetHeight, - }); - - this.$menu - .insertAfter(this.$element) - .css({ - top: pos.top + pos.height, - left: pos.left, - }) - .show(); - - this.shown = true; - return this; - }, - - hide: function () { - this.$menu.hide(); - this.shown = false; - return this; - }, - - lookup: function (event) { - var items; - - this.query = this.$element.val(); - - if (!this.query || this.query.length < this.options.minLength) { - return this.shown ? this.hide() : this; - } - - items = $.isFunction(this.source) - ? this.source(this.query, $.proxy(this.process, this)) - : this.source; - - return items ? this.process(items) : this; - }, - - process: function (items) { - var that = this; - - items = $.grep(items, function (item) { - return that.matcher(item); - }); - - items = this.sorter(items); - - if (!items.length) { - return this.shown ? this.hide() : this; - } - - return this.render(items.slice(0, this.options.items)).show(); - }, - - matcher: function (item) { - return ~item.toLowerCase().indexOf(this.query.toLowerCase()); - }, - - sorter: function (items) { - var beginswith = [], - caseSensitive = [], - caseInsensitive = [], - item; - - while ((item = items.shift())) { - if (!item.toLowerCase().indexOf(this.query.toLowerCase())) - beginswith.push(item); - else if (~item.indexOf(this.query)) caseSensitive.push(item); - else caseInsensitive.push(item); - } - - return beginswith.concat(caseSensitive, caseInsensitive); - }, - - highlighter: function (item) { - var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); - return item.replace( - new RegExp("(" + query + ")", "ig"), - function ($1, match) { - return "<strong>" + match + "</strong>"; - }, - ); - }, - - render: function (items) { - var that = this; - - items = $(items).map(function (i, item) { - i = $(that.options.item).attr("data-value", item); - i.find("a").html(that.highlighter(item)); - return i[0]; - }); - - items.first().addClass("active"); - this.$menu.html(items); - return this; - }, - - next: function (event) { - var active = this.$menu.find(".active").removeClass("active"), - next = active.next(); - - if (!next.length) { - next = $(this.$menu.find("li")[0]); - } - - next.addClass("active"); - }, - - prev: function (event) { - var active = this.$menu.find(".active").removeClass("active"), - prev = active.prev(); - - if (!prev.length) { - prev = this.$menu.find("li").last(); - } - - prev.addClass("active"); - }, - - listen: function () { - this.$element - .on("focus", $.proxy(this.focus, this)) - .on("blur", $.proxy(this.blur, this)) - .on("keypress", $.proxy(this.keypress, this)) - .on("keyup", $.proxy(this.keyup, this)); - - if (this.eventSupported("keydown")) { - this.$element.on("keydown", $.proxy(this.keydown, this)); - } - - this.$menu - .on("click", $.proxy(this.click, this)) - .on("mouseenter", "li", $.proxy(this.mouseenter, this)) - .on("mouseleave", "li", $.proxy(this.mouseleave, this)); - }, - - eventSupported: function (eventName) { - var isSupported = eventName in this.$element; - if (!isSupported) { - this.$element.setAttribute(eventName, "return;"); - isSupported = typeof this.$element[eventName] === "function"; - } - return isSupported; - }, - - move: function (e) { - if (!this.shown) return; - - switch (e.keyCode) { - case 9: // tab - case 13: // enter - case 27: // escape - e.preventDefault(); - break; - - case 38: // up arrow - e.preventDefault(); - this.prev(); - break; - - case 40: // down arrow - e.preventDefault(); - this.next(); - break; - } - - e.stopPropagation(); - }, - - keydown: function (e) { - this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40, 38, 9, 13, 27]); - this.move(e); - }, - - keypress: function (e) { - if (this.suppressKeyPressRepeat) return; - this.move(e); - }, - - keyup: function (e) { - switch (e.keyCode) { - case 40: // down arrow - case 38: // up arrow - case 16: // shift - case 17: // ctrl - case 18: // alt - break; - - case 9: // tab - case 13: // enter - if (!this.shown) return; - this.select(); - break; - - case 27: // escape - if (!this.shown) return; - this.hide(); - break; - - default: - this.lookup(); - } - - e.stopPropagation(); - e.preventDefault(); - }, - - focus: function (e) { - this.focused = true; - }, - - blur: function (e) { - this.focused = false; - if (!this.mousedover && this.shown) this.hide(); - }, - - click: function (e) { - e.stopPropagation(); - e.preventDefault(); - this.select(); - this.$element.focus(); - }, - - mouseenter: function (e) { - this.mousedover = true; - this.$menu.find(".active").removeClass("active"); - $(e.currentTarget).addClass("active"); - }, - - mouseleave: function (e) { - this.mousedover = false; - if (!this.focused && this.shown) this.hide(); - }, - }; - - /* TYPEAHEAD PLUGIN DEFINITION - * =========================== */ - - var old = $.fn.typeahead; - - $.fn.typeahead = function (option) { - return this.each(function () { - var $this = $(this), - data = $this.data("typeahead"), - options = typeof option == "object" && option; - if (!data) $this.data("typeahead", (data = new Typeahead(this, options))); - if (typeof option == "string") data[option](); - }); - }; - - $.fn.typeahead.defaults = { - source: [], - items: 8, - menu: '<ul class="typeahead dropdown-menu"></ul>', - item: '<li><a href="#"></a></li>', - minLength: 1, - }; - - $.fn.typeahead.Constructor = Typeahead; - - /* TYPEAHEAD NO CONFLICT - * =================== */ - - $.fn.typeahead.noConflict = function () { - $.fn.typeahead = old; - return this; - }; - - /* TYPEAHEAD DATA-API - * ================== */ - - $(document).on( - "focus.typeahead.data-api", - '[data-provide="typeahead"]', - function (e) { - var $this = $(this); - if ($this.data("typeahead")) return; - $this.typeahead($this.data()); - }, - ); -})(window.jQuery); -/* ========================================================== - * bootstrap-affix.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#affix - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - -!(function ($) { - "use strict"; // jshint ;_; - - /* AFFIX CLASS DEFINITION - * ====================== */ - - var Affix = function (element, options) { - this.options = $.extend({}, $.fn.affix.defaults, options); - this.$window = $(window) - .on("scroll.affix.data-api", $.proxy(this.checkPosition, this)) - .on( - "click.affix.data-api", - $.proxy(function () { - setTimeout($.proxy(this.checkPosition, this), 1); - }, this), - ); - this.$element = $(element); - this.checkPosition(); - }; - - Affix.prototype.checkPosition = function () { - if (!this.$element.is(":visible")) return; - - var scrollHeight = $(document).height(), - scrollTop = this.$window.scrollTop(), - position = this.$element.offset(), - offset = this.options.offset, - offsetBottom = offset.bottom, - offsetTop = offset.top, - reset = "affix affix-top affix-bottom", - affix; - - if (typeof offset != "object") offsetBottom = offsetTop = offset; - if (typeof offsetTop == "function") offsetTop = offset.top(); - if (typeof offsetBottom == "function") offsetBottom = offset.bottom(); - - affix = - this.unpin != null && scrollTop + this.unpin <= position.top - ? false - : offsetBottom != null && - position.top + this.$element.height() >= scrollHeight - offsetBottom - ? "bottom" - : offsetTop != null && scrollTop <= offsetTop - ? "top" - : false; - - if (this.affixed === affix) return; - - this.affixed = affix; - this.unpin = affix == "bottom" ? position.top - scrollTop : null; - - this.$element - .removeClass(reset) - .addClass("affix" + (affix ? "-" + affix : "")); - }; - - /* AFFIX PLUGIN DEFINITION - * ======================= */ - - var old = $.fn.affix; - - $.fn.affix = function (option) { - return this.each(function () { - var $this = $(this), - data = $this.data("affix"), - options = typeof option == "object" && option; - if (!data) $this.data("affix", (data = new Affix(this, options))); - if (typeof option == "string") data[option](); - }); - }; - - $.fn.affix.Constructor = Affix; - - $.fn.affix.defaults = { - offset: 0, - }; - - /* AFFIX NO CONFLICT - * ================= */ - - $.fn.affix.noConflict = function () { - $.fn.affix = old; - return this; - }; - - /* AFFIX DATA-API - * ============== */ - - $(window).on("load", function () { - $('[data-spy="affix"]').each(function () { - var $spy = $(this), - data = $spy.data(); - - data.offset = data.offset || {}; - - data.offsetBottom && (data.offset.bottom = data.offsetBottom); - data.offsetTop && (data.offset.top = data.offsetTop); - - $spy.affix(data); - }); - }); -})(window.jQuery); -self._386 = self._386 || {}; - -$(function () { - var character = { height: 20, width: 12.4 }; - - function scrollLock() { - var last = 0; - $(window).bind("scroll", function (e) { - var func, - off = $(window).scrollTop(); - - console.log(off, last, off < last ? "up" : "down"); - - // this determines whether the user is intending to go up or down. - func = off < last ? "floor" : "ceil"; - - // make sure we don't run this from ourselves - if (off % character.height === 0) { - return; - } - last = off; - - window.scrollTo(0, Math[func](off / character.height) * character.height); - }); - } - - function loading() { - if (_386.fastLoad) { - document.body.style.visibility = "visible"; - return; - } - - var onePass = _386.onePass, - speedFactor = (1 / (_386.speedFactor || 1)) * 165000; - (wrap = document.createElement("div")), - (bar = wrap.appendChild(document.createElement("div"))), - (cursor = document.createElement("div")), - // If the user specified that the visibility is hidden, then we - // start at the first pass ... otherwise we just do the - // cursor fly-by - (pass = $(document.body).css("visibility") == "visible" ? 1 : 0), - (height = $(window).height()), - (width = $(window).width()), - // this makes the loading of the screen proportional to the real-estate of the window. - // it helps keep the cool sequence there while not making it waste too much time. - (rounds = (height * width) / speedFactor), - (column = width), - (row = height - character.height); - - wrap.id = "wrap386"; - bar.id = "bar386"; - cursor.id = "cursor386"; - - cursor.innerHTML = bar.innerHTML = "&#9604;"; - - // only inject the wrap if the pass is 0 - if (pass === 0) { - document.body.appendChild(wrap); - document.body.style.visibility = "visible"; - } else { - document.body.appendChild(cursor); - rounds /= 2; - character.height *= 4; - } - - var ival = setInterval(function () { - for (var m = 0; m < rounds; m++) { - column -= character.width; - - if (column <= 0) { - column = width; - row -= character.height; - } - if (row <= 0) { - pass++; - row = height - character.height; - - if (pass == 2) { - document.body.removeChild(cursor); - clearInterval(ival); - } else { - wrap.parentNode.removeChild(wrap); - if (onePass) { - clearInterval(ival); - } else { - document.body.appendChild(cursor); - rounds /= 2; - character.height *= 4; - } - } - } - - if (pass === 0) { - bar.style.width = column + "px"; - wrap.style.height = row + "px"; - } else { - cursor.style.right = column + "px"; - cursor.style.bottom = row + "px"; - } - } - }, 1); - } - loading(); -}); diff --git a/web/static/js/wakatime.js b/web/static/js/wakatime.js @@ -1,56 +0,0 @@ -function createRow(data, max_length, total_hours) { - const { date, hours, text } = data; - var row = date.toLowerCase().padEnd(max_length); - row += " | "; - - if (hours > 0 && total_hours > 0) { - const bar_length = Math.ceil((hours / total_hours) * (100 / 5)); - const bar = "#".repeat(bar_length); - if (bar.length !== 0) { - row += `${bar} `; - } - } - row += `${text}\n`; - return row; -} - -function createChart(data) { - const table = []; - var max_length = 0; - var total_hours = 0; - data.forEach((entry) => { - const date = entry.range.text.replace(/\s*\d{4}$/, ""); - max_length = Math.max(max_length, date.length); - const { total_seconds, text: timeText } = entry.grand_total; - const hours = total_seconds / 60 / 60; - total_hours += hours; - table.push({ date, hours, text: timeText }); - }); - - var chart = ""; - table.forEach((row) => { - chart += createRow(row, max_length, total_hours); - }); - var total_minutes = total_hours % 1; - total_hours -= total_minutes; - total_minutes = Math.ceil(total_minutes * 60); - chart += `total: ${total_hours} hours and ${total_minutes} minutes`; - return chart; -} - -$.ajax({ - type: "GET", - url: "https://wakatime.com/share/@Moncheeta/235513c0-b88a-483b-a5a5-d0f54e7c471e.json", - dataType: "jsonp", - success: function (response) { - const chart = createChart(response.data); - for (let element of document.getElementsByClassName("activity")) { - element.textContent = chart; - } - }, - error: function (error) { - console.error("Error fetching data:", error); - document.getElementById("activity-small").textContent = "Failed to load chart"; - document.getElementById("activity-big").textContent = "Failed to load chart"; - }, -}); diff --git a/web/templates/404.html b/web/templates/404.html @@ -1,9 +0,0 @@ -{% extends "error.html" %} - -{% block title %} -<title>not found</title> -{% endblock %} - -{% block message %} -<h1 id="message">not found (404)</h1> -{% endblock %} diff --git a/web/templates/429.html b/web/templates/429.html @@ -1,9 +0,0 @@ -{% extends "error.html" %} - -{% block title %} -<title>too many requests</title> -{% endblock %} - -{% block message %} -<h1 id="message">too many requests (429)</h1> -{% endblock %} diff --git a/web/templates/500.html b/web/templates/500.html @@ -1,9 +0,0 @@ -{% extends "error.html" %} - -{% block title %} -<title>server error</title> -{% endblock %} - -{% block message %} -<h1 id="message">server error (500)</h1> -{% endblock %} diff --git a/web/templates/base.html b/web/templates/base.html @@ -1,52 +0,0 @@ -<!doctype html> -<html lang="en"> - <head> - <meta charset="UTF-8" /> - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - - <title>Damian Myrda</title> - <link rel="icon" type="image/png" href="/img/moncheeta.png" /> - <meta - name="description" - content="Terminal enthusiast, learning from Curious George (the curious part, not the monkey business). Systems and backend programming are my focus. Striving to turn spaghetti code into well-structured algorithms and make every line count with efficiency and creativity." - /> - - {% block title %}{% endblock %} - - <style> - body { - visibility: hidden; - min-height: 100vh; - } - - #content { - max-width: 800px; - margin: 0 auto 0 auto; - padding: 1rem 0 1rem 0; - } - - pre { - color: #e8e6e3 !important; - background-color: #000084 !important; - } - - h3 { - text-align: center !important; - } - </style> - <link href="/css/bootstrap.css" rel="stylesheet" media="screen" /> - <link href="/css/bootstrap-responsive.css" rel="stylesheet" /> - - <script src="https://code.jquery.com/jquery.js"></script> - <script> - _386 = { onePass: true }; - </script> - <script src="/js/bootstrap.js"></script> - </head> - - <body> - {% block navbar %}{% endblock %} - - <div id="content">{% block content %}{% endblock %}</div> - </body> -</html> diff --git a/web/templates/error.html b/web/templates/error.html @@ -1,29 +0,0 @@ -{% extends "base.html" %} - -{% import "nav.html" as nav %} -{% block navbar %} -{{ nav::bar(active="") }} -{% endblock %} - -{% block content %} -<div> - {% block message %} - {% endblock %} -</div> -<style> - #content { - padding: 0px !important; - } - - #message { - color: #ff5555; - display: flex; - justify-content: center; - align-items: center; - height: 100vh; - } -</style> -<script> - _386 = { fastLoad: true }; -</script> -{% endblock %} diff --git a/web/templates/index.html b/web/templates/index.html @@ -1,107 +0,0 @@ -{% extends "base.html" %} - -{% import "projects.html" as projects %} - -{% block title %} -<title>prime8.dev</title> -{% endblock %} - -{% block content %} -<div id="logo"> - <div> - <pre id="firstname"> - _ _ - | | (_) - __| | __ _ _ __ ___ _ __ _ _ __ - / _` |/ _` | '_ ` _ \| |/ _` | '_ \ -| (_| | (_| | | | | | | | (_| | | | | - \__,_|\__,_|_| |_| |_|_|\__,_|_| |_| - </pre> - <div style="display: table; width: 100%"> - <div class="d-table-cell"> - <a href="mailto:damian@prime8.dev">damian@prime8.dev</a> - </div> - <div style="display: table-cell; text-align: right"> - <pre class="hidden-phone">chicago,</pre> - <a class="visible-phone" href="https://www.linkedin.com/in/damian-myrda/">linkedin</a></pre> - </div> - </div> - </div> - <pre id="middle" class="hidden-phone"></pre> - <pre id="lastname" class="hidden-phone"> - _ - | | - _ __ ___ _ _ _ __ __| | __ _ -| '_ ` _ \| | | | '__/ _` |/ _` | -| | | | | | |_| | | | (_| | (_| | -|_| |_| |_|\__, |_| \__,_|\__,_| - __/ | -illinois |___/ <a class="align-right" href="https://www.linkedin.com/in/damian-myrda/">linkedin</a></pre> - <script> - const heights = [ - document.getElementById("firstname").textContent.split("\n").length, - document.getElementById("lastname").textContent.split("\n").length, - ]; - const max_height = Math.max(...heights); - document.getElementById("middle").textContent = " \n".repeat(max_height); - </script> - <style> - #logo { - display: table; - margin-left: auto; - margin-right: auto; - } - - #firstname, #middle, #lastname { - display: table-cell; - } - - @media (max-width: 480px) { - #firstname, #middle, #lastname { - font-size: 16px !important; - line-height: 18px !important; - } - } - </style> -</div> -<div id="content"> - <p class="lead" style="text-align: center"> - Terminal enthusiast, learning from Curious George (the curious part, not the - monkey business). Systems and backend programming are my focus. Striving to - turn spaghetti code into well-structured algorithms and make every line - count with efficiency and creativity. - </p> - <div style="display: table; width: 100%"> - <div class="d-table-cell"> - <h3>techonologies:</h3> - <ul> - <li style="color: #fff">languages: <span style="color: #fefe54">zig</span>, <span style="color: #ff5555">rust</span>, <span style="color: #55ffff">go</span>, <span style="color: #bbb">c</span>, <span style="color: #00aaaa">c++</span>, <span style="color: #fefe54">python</span></li> - <li style="color: #fff">frameworks: <span style="color: #ff5555">tokio</span>, <span style="color: #55ff55">fastapi<span>, <span style="color: #bbb">flask</span></li> - <li style="color: #fff">libraries: <span style="color: #ff5555">torch</span>, <span style="color: #fe54fe">kafka</span> - <li style="color: #fff">tools: <span style="color: #bbb">git</span>, <span style="color: #55ff55">bash</span>, <span style="color: #aa5500">make</span>, <span style="color: #bbb">gdb</span>, <span style="color: #00aaaa">docker</span></li> - </ul> - <h3>learning:</h3> - <ul> - <li style="color: #00aaaa">typescript</li> - <li style="color: #a85400">java</li> - </ul> - <div class="visible-phone"> - <h3>activity:</h3> - <pre class="activity" style="color: #bbb !important">Loading activity...</pre> - </div> - </div> - <div style="display: table-cell; vertical-align: middle"> - <div style="display: flex; justify-content: center"> - <div class="hidden-phone"> - <h3>activity:</h3> - <pre class="activity" style="color: #bbb !important">Loading activity...</pre> - </div> - </div> - </div> - </div - <div> - {{ projects::list() }} - </div> -</div> -<script src="js/wakatime.js"></script> -{% endblock %} diff --git a/web/templates/nav.html b/web/templates/nav.html @@ -1,19 +0,0 @@ -{% macro bar(active) %} -<div class="navbar navbar-inverse navbar-fixed-top"> - <div class="navbar-inner"> - <a class="brand" href="/">prime8</a> - <ul class="nav"> - {% for tab in config.extra.tabs %} - <li {% if tab.name == active %} class="active" {% endif %}> - <a href="{{ tab.url }}">{{ tab.name }}</a> - </li> - {% endfor %} - </ul> - </div> -</div> -<style> - .brand { - margin-left: 0 !important; - } -</style> -{% endmacro %} diff --git a/web/templates/projects.html b/web/templates/projects.html @@ -1,83 +0,0 @@ -{% macro list() %} -<pre style="color: #fff !important"> - _ _ - (_) | | - _ __ _ __ ___ _ ___ ___| |_ ___ -| '_ \| '__/ _ \| |/ _ \/ __| __/ __| -| |_) | | | (_) | | __/ (__| |_\__ \ -| .__/|_| \___/| |\___|\___|\__|___/ -| | _/ | -|_| |__/ - -</pre> -<div class="row-fluid"> - <div class="span4 w-100"> - <h3>MOS</h3> - <p> - In my free time, I work on MOS, my minimal operating system. This project - has deepened my understanding of OS internals, and I'm planning to rewrite - it for the RISC-V architecture. Users interact with the terminal through - command line and terminal user interfaces designed for ease of use and - efficiency. - </p> - <a href="https://git.prime8.dev/?p=mos.git" class="btn">src</a> - </div> - <div class="span4 w-100"> - <h3>Janitor</h3> - <p> - During my summer internship at Amplifier Health, I developed a service - that sorts audio files into three categories: speech, music, and noise. I - wrote it in Rust with tch-rs and Axum aiming for better performance. The - service is designed to be fast, using efficient multithreading on the CPU - and taking advantage of the GPU for highly parallel processing. - </p> - <a href="https://git.prime8.dev/?p=janitor.git" class="btn">src</a> - </div> - <div class="span4 w-100"> - <h3>Summarizer</h3> - <p> - An experiment using a microservice architecture that transcribes and - summarizes audio into text using OpenAI's API. Each service has its own - function that it performs, and the services communicate with each other - through Kafka, where jobs are requested and results are received. The - entire system can be easily deployed with a Docker Compose file. - </p> - <a href="https://github.com/moncheeta/summarizer" class="btn">src</a> - </div> -</div> -<div class="row-fluid"> - <div class="span4 w-100"> - <h3>Tutor Connect</h3> - <p> - For HSHacks 2024, my friends and I developed a website to help students - find tutors. Recognizing that not every school has a dedicated portal for - peer tutoring, we created a district-wide, easily accessible platform. We - used ReactJS for the user interface and Firebase for storage and - authentication. In the end, we won 3rd place! - </p> - <a href="https://d214tutorconnect.prime8.dev" class="btn">src</a> - </div> - <div class="span4 w-100"> - <h3>CSC Website</h3> - <p> - I built a website for the Computer Science Club (CSC) at Prospect High - School during a mini-hackathon. The site displays important information it - fetches from the Schoology API. Members can share their projects using - their Google account and uploading their work to a SQLite database. - </p> - <a href="https://git.prime8.dev/?p=csc.git" class="btn">src</a> - <a href="https://csc.prime8.dev" class="btn">live</a> - </div> - <div class="span4 w-100"> - <h3>Veterans Website</h3> - <p> - For HSHacks 2023, my very first hackathon, I created a website for an - organization that helps veterans manage donations. Donors can use their - Venmo account to donate to the organization. They receive a notification - on their phone for confirmation, and each donor gets a thank-you email as - a gesture of appreciation. - </p> - <a href="https://github.com/moncheeta/veteran_donations" class="btn">src</a> - </div> -</div> -{% endmacro %} diff --git a/web/tsconfig.json b/web/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "astro/tsconfigs/strict", + "compilerOptions": { + "strictNullChecks": true + } +}