├── .gitattributes
├── tests
├── path
│ ├── acid.svg.gz
│ ├── acid.svg
│ └── test_path.py
├── font
│ ├── font_dir
│ │ └── Kokoro-Regular.ttf
│ └── ink.svg
├── version
│ └── test_version.py
└── shape
│ └── test_normal_shape.py
├── docs
├── resvg.md
├── installation.md
├── index.rst
├── Makefile
├── make.bat
├── contributing.md
├── debugging.md
├── conf.py
└── usage.md
├── Cargo.toml
├── pyproject.toml
├── .readthedocs.yml
├── .gitignore
├── LICENSE
├── .github
├── dependabot.yml
└── workflows
│ └── CI.yaml
├── README.md
├── resvg_py.pyi
├── src
└── rust
│ └── lib.rs
├── Cargo.lock
└── uv.lock
/.gitattributes:
--------------------------------------------------------------------------------
1 | tests/**/* linguist-vendored
2 | docs/**/* linguist-documentation
--------------------------------------------------------------------------------
/tests/path/acid.svg.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/baseplate-admin/resvg-py/HEAD/tests/path/acid.svg.gz
--------------------------------------------------------------------------------
/tests/font/font_dir/Kokoro-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/baseplate-admin/resvg-py/HEAD/tests/font/font_dir/Kokoro-Regular.ttf
--------------------------------------------------------------------------------
/tests/version/test_version.py:
--------------------------------------------------------------------------------
1 | import resvg_py
2 |
3 |
4 | def test_version_is_string():
5 | assert isinstance(resvg_py.__version__,str)
--------------------------------------------------------------------------------
/docs/resvg.md:
--------------------------------------------------------------------------------
1 | # Resvg Module
2 |
3 | ```{eval-rst}
4 |
5 | .. currentmodule:: resvg_py
6 |
7 | .. autofunction:: svg_to_bytes
8 |
9 | .. autoclass:: __version__
10 |
11 |
12 | .. autoclass:: __author__
13 |
14 | ```
15 |
--------------------------------------------------------------------------------
/docs/installation.md:
--------------------------------------------------------------------------------
1 | # Installation
2 |
3 | ## Requirements
4 |
5 | Python 3.8 to 3.12 supported.
6 |
7 | Currently it builds the non-EOL python versions with `maturin`\_ github-actions.
8 |
9 | ## Installation
10 |
11 | 1. Install with **pip**:
12 |
13 | ```python
14 | python -m pip install resvg_py
15 | ```
16 |
--------------------------------------------------------------------------------
/docs/index.rst:
--------------------------------------------------------------------------------
1 | .. resvg_py documentation master file, created by
2 | sphinx-quickstart on Sat Feb 24 21:13:02 2024.
3 | You can adapt this file completely to your liking, but it should at least
4 | contain the root `toctree` directive.
5 |
6 | Welcome to resvg_py's documentation!
7 | ========================================
8 |
9 | Safe bindings for `resvg`_
10 |
11 | .. toctree::
12 | :maxdepth: 2
13 | :caption: Contents:
14 |
15 | installation
16 | usage
17 | resvg
18 | debugging
19 | contributing
20 |
21 | Indices and tables
22 | ==================
23 |
24 | * :ref:`genindex`
25 | * :ref:`search`
26 |
27 |
28 | .. _resvg: https://docs.rs/resvg/latest/resvg/
--------------------------------------------------------------------------------
/Cargo.toml:
--------------------------------------------------------------------------------
1 | [package]
2 | name = "resvg_py"
3 | version = "0.2.4"
4 | edition = "2021"
5 | authors = ['baseplate-admin']
6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7 | [lib]
8 | name = "resvg_py"
9 | path = "src/rust/lib.rs"
10 | crate-type = ["cdylib"]
11 |
12 | [dependencies]
13 | log = "0.4.28"
14 | pyo3 = "0.27.2"
15 | resvg = { version = "0.45.1", features = ["raster-images", "text"] }
16 | svgtypes = "0.16.0"
17 |
18 |
19 | [profile.release.package."*"]
20 | codegen-units = 1
21 | opt-level = 'z'
22 | strip = true
23 |
24 | [profile.release]
25 | panic = "abort"
26 | codegen-units = 1
27 | lto = "fat"
28 | opt-level = 'z'
29 | strip = true
30 |
--------------------------------------------------------------------------------
/docs/Makefile:
--------------------------------------------------------------------------------
1 | # Minimal makefile for Sphinx documentation
2 | #
3 |
4 | # You can set these variables from the command line, and also
5 | # from the environment for the first two.
6 | SPHINXOPTS ?=
7 | SPHINXBUILD ?= sphinx-build
8 | SOURCEDIR = .
9 | BUILDDIR = _build
10 |
11 | # Put it first so that "make" without argument is like "make help".
12 | help:
13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
14 |
15 | .PHONY: help Makefile
16 |
17 | # Catch-all target: route all unknown targets to Sphinx using the new
18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
19 | %: Makefile
20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
21 |
--------------------------------------------------------------------------------
/docs/make.bat:
--------------------------------------------------------------------------------
1 | @ECHO OFF
2 |
3 | pushd %~dp0
4 |
5 | REM Command file for Sphinx documentation
6 |
7 | if "%SPHINXBUILD%" == "" (
8 | set SPHINXBUILD=sphinx-build
9 | )
10 | set SOURCEDIR=.
11 | set BUILDDIR=_build
12 |
13 | %SPHINXBUILD% >NUL 2>NUL
14 | if errorlevel 9009 (
15 | echo.
16 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
17 | echo.installed, then set the SPHINXBUILD environment variable to point
18 | echo.to the full path of the 'sphinx-build' executable. Alternatively you
19 | echo.may add the Sphinx directory to PATH.
20 | echo.
21 | echo.If you don't have Sphinx installed, grab it from
22 | echo.https://www.sphinx-doc.org/
23 | exit /b 1
24 | )
25 |
26 | if "%1" == "" goto help
27 |
28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
29 | goto end
30 |
31 | :help
32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
33 |
34 | :end
35 | popd
36 |
--------------------------------------------------------------------------------
/pyproject.toml:
--------------------------------------------------------------------------------
1 | [project]
2 | requires-python = ">=3.9"
3 | readme = "README.md"
4 | name = "resvg_py"
5 | dynamic = ["version"]
6 | authors = [
7 | { name = "baseplate-admin", email = "61817579+baseplate-admin@users.noreply.github.com" },
8 | ]
9 | classifiers = [
10 | "Programming Language :: Rust",
11 | "Programming Language :: Python :: Implementation :: CPython",
12 | "Programming Language :: Python :: Implementation :: PyPy",
13 | ]
14 |
15 |
16 | [dependency-groups]
17 | dev = ["pytest>=8.1.1"]
18 | docs = [
19 | "sphinx>=7.2.6",
20 | "furo>=2024.1.29",
21 | "sphinx-reload>=0.2.0",
22 | "myst-parser>=3.0.1",
23 | ]
24 |
25 | [project.urls]
26 | "Source Code" = "https://github.com/baseplate-admin/resvg-py"
27 | Issues = "https://github.com/baseplate-admin/resvg-py/issues"
28 | Documentation = "https://resvg-py.readthedocs.io/"
29 |
30 | [build-system]
31 | requires = ["maturin>=1.4,<2.0"]
32 | build-backend = "maturin"
33 |
34 | [tool.maturin]
35 | features = ["pyo3/extension-module"]
36 |
--------------------------------------------------------------------------------
/.readthedocs.yml:
--------------------------------------------------------------------------------
1 | # .readthedocs.yaml
2 | # Read the Docs configuration file
3 | # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
4 | # See https://github.com/astral-sh/uv/issues/10074
5 |
6 |
7 | # Required
8 | version: 2
9 |
10 | # Set the OS, Python version and other tools you might need
11 | build:
12 | os: ubuntu-lts-latest
13 | tools:
14 | python: 'latest'
15 | rust: 'latest'
16 | # You can also specify other tool versions:
17 | jobs:
18 | post_install:
19 | # Install with docs extras
20 | - python -m pip install uv
21 | - UV_PROJECT_ENVIRONMENT=$READTHEDOCS_VIRTUALENV_PATH uv sync --group docs
22 |
23 |
24 | python:
25 | install:
26 | - method: pip
27 | path: .
28 |
29 | # Build documentation in the "docs/" directory with Sphinx
30 | sphinx:
31 | configuration: docs/conf.py
32 | # Optionally build your docs in additional formats such as PDF and ePub
33 | # formats:
34 | # - pdf
35 | # - epub
36 |
37 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /target
2 |
3 | # Byte-compiled / optimized / DLL files
4 | __pycache__/
5 | .pytest_cache/
6 | *.py[cod]
7 |
8 | # C extensions
9 | *.so
10 |
11 | # Distribution / packaging
12 | .Python
13 | .venv/
14 | env/
15 | bin/
16 | build/
17 | develop-eggs/
18 | dist/
19 | eggs/
20 | lib/
21 | lib64/
22 | parts/
23 | sdist/
24 | var/
25 | include/
26 | man/
27 | venv/
28 | *.egg-info/
29 | .installed.cfg
30 | *.egg
31 |
32 | # Installer logs
33 | pip-log.txt
34 | pip-delete-this-directory.txt
35 | pip-selfcheck.json
36 |
37 | # Unit test / coverage reports
38 | htmlcov/
39 | .tox/
40 | .coverage
41 | .cache
42 | nosetests.xml
43 | coverage.xml
44 |
45 | # Translations
46 | *.mo
47 |
48 | # Mr Developer
49 | .mr.developer.cfg
50 | .project
51 | .pydevproject
52 |
53 | # Rope
54 | .ropeproject
55 |
56 | # Django stuff:
57 | *.log
58 | *.pot
59 |
60 | .DS_Store
61 |
62 | # Sphinx documentation
63 | docs/_build/
64 |
65 | # PyCharm
66 | .idea/
67 |
68 | # VSCode
69 | .vscode/
70 |
71 | # Pyenv
72 | .python-version
73 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (C) 2024, baseplate-admin
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a
4 | copy of this software and associated documentation files (the "Software"),
5 | to deal in the Software without restriction, including without limitation
6 | the rights to use, copy, modify, merge, publish, distribute, sublicense,
7 | and/or sell copies of the Software, and to permit persons to whom the
8 | Software is furnished to do so, subject to the following conditions:
9 |
10 | The above copyright notice and this permission notice shall be included in
11 | all copies or substantial portions of the Software.
12 |
13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
16 | THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
19 | DEALINGS IN THE SOFTWARE.
20 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | # To get started with Dependabot version updates, you'll need to specify which
2 | # package ecosystems to update and where the package manifests are located.
3 | # Please see the documentation for all configuration options:
4 | # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
5 |
6 | version: 2
7 | updates:
8 | - package-ecosystem: 'cargo' # See documentation for possible values
9 | directory: '/' # Location of package manifests
10 | schedule:
11 | interval: 'monthly'
12 | day: 'friday'
13 | open-pull-requests-limit: 100
14 | - package-ecosystem: 'uv' # See documentation for possible values
15 | directory: '/' # Location of package manifests
16 | schedule:
17 | interval: 'weekly'
18 | day: 'friday'
19 | open-pull-requests-limit: 100
20 |
21 | # - package-ecosystem: "github-actions" # See documentation for possible values
22 | # directory: "/" # Location of package manifests
23 | # schedule:
24 | # interval: "daily"
25 | # open-pull-requests-limit: 100
26 |
--------------------------------------------------------------------------------
/docs/contributing.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | Thank you taking interest in this project.
4 |
5 | ## Goals
6 |
7 | My goal for this project is:
8 |
9 | - To enable all the features available in [resvg](https://github.com/razrfalcon/resvg) but don't write to the disk, everything must be done in memory.
10 | - Use the bare minimum amount of packages, in both python side and rust side
11 | - Make the package as user friendly as possible
12 |
13 | ## Getting Started
14 |
15 | Pre-requisite packages:
16 |
17 | - Install [poetry](https://python-poetry.org/)
18 | - Install [pipx](https://pipx.pypa.io/stable/installation/)
19 | - Install [maturin](https://www.maturin.rs/tutorial)
20 |
21 | Then do the modifications to the [lib.rs]{.title-ref} file and add test
22 | in tests directory.
23 |
24 | 1. Install **poetry** dependencies:
25 |
26 | ```sh
27 | poetry install
28 | ```
29 |
30 | 2. Activate **poetry** shell:
31 |
32 | ```sh
33 | poetry shell
34 | ```
35 |
36 | 3. Build with **maturin**:
37 |
38 | ```sh
39 | maturin develop
40 | ```
41 |
42 | 4. Run tests:
43 |
44 | ```sh
45 | pytest .
46 | ```
47 |
48 | If all tests pass, please send a Pull Request to the main repository.
49 |
--------------------------------------------------------------------------------
/docs/debugging.md:
--------------------------------------------------------------------------------
1 | # Debugging
2 |
3 | While [resvg-py](https://github.com/baseplate-admin/resvg-py) is a very
4 | thin wrapper around the [resvg](https://docs.rs/resvg/latest/resvg/)
5 | project there might be bugs in _resvg-py_ (or _resvg_).
6 |
7 | In order to debug the issue you have to enable logging in
8 | [resvg-py](https://github.com/baseplate-admin/resvg-py)
9 |
10 | How to log in [resvg-py](https://github.com/baseplate-admin/resvg-py)?
11 |
12 | When you call [resvg-py](https://github.com/baseplate-admin/resvg-py)\'s
13 | function in your code you can pass [log_information=True]{.title-ref} to
14 | print debug information to the stdout
15 |
16 | For example:
17 |
18 | ```python
19 | import resvg_py
20 | import base64
21 |
22 | svg_string = """
23 |
26 | """
27 |
28 | # a large list of bytes
29 | png_bytes: list[bytes] = resvg_py.svg_to_bytes(
30 | svg_string=svg_string,
31 | log_information = True ## <----------- CHECK THIS LINE
32 | )
33 | base64_utf8_str = base64.b64encode(bytes(png_bytes)).decode("utf-8")
34 | print(f"data:image/png;base64,{base64_utf8_str}")
35 | ```
36 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # resvg_py
2 |
3 | [](https://pepy.tech/project/resvg_py) [](https://github.com/baseplate-admin/resvg-py/actions/workflows/CI.yaml) [](https://resvg-py.readthedocs.io/en/latest/?badge=latest) [](https://pypi.org/project/resvg-py/)
4 |
5 | A safe and high level binding for the [resvg](https://github.com/RazrFalcon/resvg) project
6 |
7 | ## Install
8 |
9 | ```py
10 | pip install resvg_py
11 | ```
12 |
13 | Then use it like this:
14 |
15 | ```python
16 |
17 | import resvg_py
18 |
19 | svg_string = """
20 |
23 | """
24 |
25 | print(resvg_py.svg_to_bytes(svg_string=svg_string))
26 |
27 | ```
28 |
29 | (if you have a complex use case, please check the [api](https://resvg-py.readthedocs.io/en/latest/resvg.html) or [usage](https://resvg-py.readthedocs.io/en/latest/usage.html). It mostly re-exposes everything of resvg)
30 |
31 | ## Requires
32 |
33 | - Python 3.8 or higher
34 |
35 | ---
36 |
37 | This library is feature complete in my opinion.
38 |
--------------------------------------------------------------------------------
/docs/conf.py:
--------------------------------------------------------------------------------
1 | # Configuration file for the Sphinx documentation builder.
2 | #
3 | # For the full list of built-in configuration values, see the documentation:
4 | # https://www.sphinx-doc.org/en/master/usage/configuration.html
5 |
6 | # -- Project information -----------------------------------------------------
7 | # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
8 | import datetime
9 | import resvg_py
10 |
11 | project = "resvg_py"
12 | author = resvg_py.__author__
13 | copyright = f"2024-{datetime.date.today().year}, {author}"
14 | release = resvg_py.__version__
15 |
16 | # -- General configuration ---------------------------------------------------
17 | # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
18 |
19 | extensions = [
20 | "myst_parser",
21 | "sphinx.ext.autodoc",
22 | "sphinx.ext.intersphinx",
23 | "sphinx.ext.viewcode",
24 | ]
25 |
26 | templates_path = ["_templates"]
27 | exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
28 |
29 | # List of patterns, relative to source directory, that match files and
30 | # directories to ignore when looking for source files.
31 |
32 |
33 | autodoc_typehints = "description"
34 |
35 | # -- Options for HTML output -------------------------------------------------
36 | # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
37 |
38 | html_theme = "furo"
39 | html_static_path = ["_static"]
40 |
--------------------------------------------------------------------------------
/tests/path/acid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/tests/shape/test_normal_shape.py:
--------------------------------------------------------------------------------
1 | import resvg_py
2 | import base64
3 |
4 | svg_string = """
5 |
8 | """
9 |
10 |
11 | def test_rectangle():
12 | _base64 = base64.b64encode(
13 | bytes(resvg_py.svg_to_bytes(svg_string=svg_string))
14 | ).decode("utf-8")
15 | assert (
16 | _base64
17 | == "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"
18 | )
19 |
--------------------------------------------------------------------------------
/resvg_py.pyi:
--------------------------------------------------------------------------------
1 | from typing import Literal
2 |
3 | __version__: str
4 | __author__: str
5 |
6 | def svg_to_bytes(
7 | svg_string: str | None = None,
8 | svg_path: str | None = None,
9 | background: str | None = None,
10 | skip_system_fonts: bool | None = False,
11 | log_information: bool | None = False,
12 | width: int | None = None,
13 | height: int | None = None,
14 | zoom: int | None = None,
15 | dpi: int | None = 0,
16 | resources_dir: str | None = None,
17 | languages: list[str] | None = [],
18 | font_size: int | None = 16,
19 | font_family: str | None = "Times New Roman",
20 | serif_family: str | None = "Times New Roman",
21 | sans_serif_family: str | None = "Arial",
22 | cursive_family: str | None = "Comic Sans MS",
23 | fantasy_family: str | None = "Impact",
24 | monospace_family: str | None = "Courier New",
25 | font_files: list[str] | None = None,
26 | font_dirs: list[str] | None = None,
27 | shape_rendering: Literal[
28 | "optimize_speed", "crisp_edges", "geometric_precision"
29 | ] = "geometric_precision",
30 | text_rendering: Literal[
31 | "optimize_speed", "optimize_legibility", "optimize_legibility"
32 | ] = "optimize_legibility",
33 | image_rendering: Literal["optimize_quality", "optimize_speed"] = "optimize_quality"
34 | ) -> bytes:
35 | """
36 | :param svg_str: A string containing valid svg.
37 | :param svg_path: A path to a valid svg.
38 | :param width: An Integer containing the pixels size for width.
39 | :param height: An Integer containing the pixels size for height.
40 | :param zoom: An Integer containing the zoom percentage.
41 | :param dpi: An Integer containing DPI size for the svg rendering.
42 | :param resources_dir: A directory that contains resources for svg rendering. Such as `foreign objects `_.
43 | :param languages: A list of string containing the languages used for `svg` rendering
44 | :param font_size: An integer describing the font_size.
45 | :param font_family: A string that describes the font family used in SVG.
46 | :param serif_family: A string that describes the serif font family used in SVG.
47 | :param sans_serif_family: A string that describes the sans serif font family used in SVG.
48 | :param cursive_family: A string that describes the cursive font family used in SVG.
49 | :param fantasy_family: A string that describes the fantasy font family used in SVG.
50 | :param monospace_family: A string that describes the monospace font family used in SVG.
51 | :param font_files: A list of paths that contain the font file.
52 | :param font_dirs: A list of directories that contain the font file. This parameter will add all the present files in the directory.
53 | :param shape_rendering: The `shape rendering method `_ used in resvg. **Defaults to "geometric_precision"**.
54 | :param text_rendering: The `text rendering method `_ used in resvg. **Defaults to "optimize_legibility"**.
55 | :param image_rendering: The `image rendering method `_ used in resvg. **Defaults to "optimize_quality"**.
56 | :param background: A `CSS color `_ value that describes the canvas size.
57 | """
58 |
59 | ...
60 |
--------------------------------------------------------------------------------
/docs/usage.md:
--------------------------------------------------------------------------------
1 | # Usage
2 |
3 | The module takes in **utf-8** encoded `svg_string` and returns `base64` encoded **PNG** string.
4 |
5 | Lets say our svg looks like this :
6 |
7 |
8 |
11 |
12 |
13 | We can convert it to `PNG` by:
14 |
15 | ```python
16 | import resvg_py
17 |
18 | svg_string = """
19 |
22 | """
23 |
24 | png_bytes: list[bytes] = resvg_py.svg_to_bytes(svg_string=svg_string) # a large list of bytes
25 |
26 | ```
27 |
28 | In order to convert image to base64:
29 |
30 | ```python
31 |
32 | import resvg_py
33 | import base64
34 |
35 | svg_string = """
36 |
39 | """
40 |
41 | # a large list of bytes
42 | png_bytes: list[bytes] = resvg_py.svg_to_bytes(svg_string=svg_string)
43 | base64_utf8_str = base64.b64encode(bytes(png_bytes)).decode("utf-8")
44 | print(f"data:image/png;base64,{base64_utf8_str}")
45 | ```
46 |
47 | This should return the following **PNG** image (check using inspect element):
48 |
49 |
50 |
51 |
52 |
53 | We can also do something like this :
54 |
55 | ```python
56 |
57 | import resvg_py
58 |
59 | svg = ... # path to svg file
60 |
61 | print(resvg_py.svg_to_bytes(svg_path=svg))
62 | ```
63 |
64 | But please do note that `resvg` first looks for _svg_string_ and if that is empty then it looks for _svg_path_
65 |
66 | ```{eval-rst}
67 | For extra parameters refer to :doc:`resvg <../resvg>`
68 | ```
69 |
--------------------------------------------------------------------------------
/.github/workflows/CI.yaml:
--------------------------------------------------------------------------------
1 | # This file is autogenerated by maturin v1.8.3
2 | # To update, run
3 | #
4 | # maturin generate-ci github
5 | #
6 | name: CI
7 |
8 | on:
9 | push:
10 | branches:
11 | - main
12 | - master
13 | tags:
14 | - '*'
15 | pull_request:
16 | workflow_dispatch:
17 |
18 | permissions:
19 | contents: read
20 |
21 | jobs:
22 | linux:
23 | runs-on: ${{ matrix.platform.runner }}
24 | strategy:
25 | matrix:
26 | platform:
27 | - runner: ubuntu-22.04
28 | target: x86_64
29 | - runner: ubuntu-22.04
30 | target: x86
31 | - runner: ubuntu-22.04
32 | target: aarch64
33 | - runner: ubuntu-22.04
34 | target: armv7
35 | - runner: ubuntu-22.04
36 | target: s390x
37 | - runner: ubuntu-22.04
38 | target: ppc64le
39 | steps:
40 | - uses: actions/checkout@v4
41 | - uses: actions/setup-python@v5
42 | with:
43 | python-version: 3.x
44 | - name: Build wheels
45 | uses: PyO3/maturin-action@v1
46 | with:
47 | target: ${{ matrix.platform.target }}
48 | args: --release --out dist --find-interpreter
49 | sccache: ${{ !startsWith(github.ref, 'refs/tags/') }}
50 | manylinux: auto
51 | - name: Upload wheels
52 | uses: actions/upload-artifact@v4
53 | with:
54 | name: wheels-linux-${{ matrix.platform.target }}
55 | path: dist
56 |
57 | musllinux:
58 | runs-on: ${{ matrix.platform.runner }}
59 | strategy:
60 | matrix:
61 | platform:
62 | - runner: ubuntu-22.04
63 | target: x86_64
64 | - runner: ubuntu-22.04
65 | target: x86
66 | - runner: ubuntu-22.04
67 | target: aarch64
68 | - runner: ubuntu-22.04
69 | target: armv7
70 | steps:
71 | - uses: actions/checkout@v4
72 | - uses: actions/setup-python@v5
73 | with:
74 | python-version: 3.x
75 | - name: Build wheels
76 | uses: PyO3/maturin-action@v1
77 | with:
78 | target: ${{ matrix.platform.target }}
79 | args: --release --out dist --find-interpreter
80 | sccache: ${{ !startsWith(github.ref, 'refs/tags/') }}
81 | manylinux: musllinux_1_2
82 | - name: Upload wheels
83 | uses: actions/upload-artifact@v4
84 | with:
85 | name: wheels-musllinux-${{ matrix.platform.target }}
86 | path: dist
87 |
88 | windows:
89 | runs-on: ${{ matrix.platform.runner }}
90 | strategy:
91 | matrix:
92 | platform:
93 | - runner: windows-latest
94 | target: x64
95 | - runner: windows-latest
96 | target: x86
97 | steps:
98 | - uses: actions/checkout@v4
99 | - uses: actions/setup-python@v5
100 | with:
101 | python-version: 3.x
102 | architecture: ${{ matrix.platform.target }}
103 | - name: Build wheels
104 | uses: PyO3/maturin-action@v1
105 | with:
106 | target: ${{ matrix.platform.target }}
107 | args: --release --out dist --find-interpreter
108 | sccache: ${{ !startsWith(github.ref, 'refs/tags/') }}
109 | - name: Upload wheels
110 | uses: actions/upload-artifact@v4
111 | with:
112 | name: wheels-windows-${{ matrix.platform.target }}
113 | path: dist
114 |
115 | macos:
116 | runs-on: ${{ matrix.platform.runner }}
117 | strategy:
118 | matrix:
119 | platform:
120 | - runner: macos-15
121 | target: x86_64
122 | - runner: macos-15
123 | target: aarch64
124 | steps:
125 | - uses: actions/checkout@v4
126 | - uses: actions/setup-python@v5
127 | with:
128 | python-version: 3.x
129 | - name: Build wheels
130 | uses: PyO3/maturin-action@v1
131 | with:
132 | target: ${{ matrix.platform.target }}
133 | args: --release --out dist --find-interpreter
134 | sccache: ${{ !startsWith(github.ref, 'refs/tags/') }}
135 | - name: Upload wheels
136 | uses: actions/upload-artifact@v4
137 | with:
138 | name: wheels-macos-${{ matrix.platform.target }}
139 | path: dist
140 |
141 | sdist:
142 | runs-on: ubuntu-latest
143 | steps:
144 | - uses: actions/checkout@v4
145 | - name: Build sdist
146 | uses: PyO3/maturin-action@v1
147 | with:
148 | command: sdist
149 | args: --out dist
150 | - name: Upload sdist
151 | uses: actions/upload-artifact@v4
152 | with:
153 | name: wheels-sdist
154 | path: dist
155 |
156 | release:
157 | name: Release
158 | runs-on: ubuntu-latest
159 | if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }}
160 | needs: [linux, musllinux, windows, macos, sdist, test]
161 | permissions:
162 | # Use to sign the release artifacts
163 | id-token: write
164 | # Used to upload release artifacts
165 | contents: write
166 | # Used to generate artifact attestation
167 | attestations: write
168 | steps:
169 | - uses: actions/download-artifact@v4
170 | - name: Generate artifact attestation
171 | uses: actions/attest-build-provenance@v2
172 | with:
173 | subject-path: 'wheels-*/*'
174 | - name: Publish to PyPI
175 | if: ${{ startsWith(github.ref, 'refs/tags/') }}
176 | uses: PyO3/maturin-action@v1
177 | env:
178 | MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
179 | with:
180 | command: upload
181 | args: --non-interactive --skip-existing wheels-*/*
182 |
183 | test:
184 | name: Run Tests
185 | runs-on: windows-latest
186 | strategy:
187 | matrix:
188 | python-version: ["3.10", "3.11", "3.12","3.13", "3.14"]
189 | steps:
190 |
191 | - uses: actions/checkout@v4
192 |
193 | - name: Set up Python (uv)
194 | uses: astral-sh/setup-uv@v6
195 | with:
196 | enable-cache: true
197 | python-version: ${{ matrix.python-version }}
198 | cache-dependency-glob: "uv.lock"
199 |
200 | - name: Create virtual environment and install dependencies
201 | run: |
202 | uv sync --group dev
203 |
204 | - name: Run backend tests
205 | run: |
206 | uv run pytest -v -x -rs
207 |
208 |
209 |
210 |
--------------------------------------------------------------------------------
/tests/path/test_path.py:
--------------------------------------------------------------------------------
1 | import resvg_py
2 | from pathlib import Path
3 | import os
4 | import base64
5 |
6 | BASE_DIR = Path(__file__).resolve().parent
7 |
8 | svg_output = "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"
9 |
10 |
11 | def test_path():
12 | path = os.path.join(BASE_DIR, "acid.svg")
13 | base = base64.b64encode(bytes(resvg_py.svg_to_bytes(svg_path=path))).decode("utf-8")
14 | assert base == svg_output
15 |
16 |
17 | def test_gzip_path():
18 | path = os.path.join(BASE_DIR, "acid.svg.gz")
19 | base = base64.b64encode(bytes(resvg_py.svg_to_bytes(svg_path=path))).decode("utf-8")
20 | assert base == svg_output
21 |
--------------------------------------------------------------------------------
/tests/font/ink.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/rust/lib.rs:
--------------------------------------------------------------------------------
1 | /*
2 | Based on
3 | * https://github.com/RazrFalcon/resvg/blob/master/crates/resvg/src/main.rs
4 | * https://github.com/mrdotb/resvg_nif/blob/master/native/resvg/src/lib.rs
5 | */
6 |
7 | use pyo3::prelude::*;
8 | use resvg::{self, usvg::{FontResolver}};
9 | use core::panic;
10 | use std::sync::Arc;
11 |
12 | #[derive(Clone, Copy, PartialEq, Debug)]
13 | enum FitTo {
14 | /// Keep original size.
15 | Original,
16 | /// Scale to width.
17 | Width(u32),
18 | /// Scale to height.
19 | Height(u32),
20 | /// Scale to size.
21 | Size(u32, u32),
22 | /// Zoom by factor.
23 | Zoom(f32),
24 | }
25 |
26 | /// A simple stderr logger.
27 | static LOGGER: SimpleLogger = SimpleLogger;
28 | struct SimpleLogger;
29 | impl log::Log for SimpleLogger {
30 | fn enabled(&self, metadata: &log::Metadata) -> bool {
31 | metadata.level() <= log::LevelFilter::Warn
32 | }
33 |
34 | fn log(&self, record: &log::Record) {
35 | if self.enabled(record.metadata()) {
36 | let target = if !record.target().is_empty() {
37 | record.target()
38 | } else {
39 | record.module_path().unwrap_or_default()
40 | };
41 |
42 | let line = record.line().unwrap_or(0);
43 | let args = record.args();
44 |
45 | match record.level() {
46 | log::Level::Error => println!("Error (in {}:{}): {}", target, line, args),
47 | log::Level::Warn => println!("Warning (in {}:{}): {}", target, line, args),
48 | log::Level::Info => println!("Info (in {}:{}): {}", target, line, args),
49 | log::Level::Debug => println!("Debug (in {}:{}): {}", target, line, args),
50 | log::Level::Trace => println!("Trace (in {}:{}): {}", target, line, args),
51 | }
52 | }
53 | }
54 |
55 | fn flush(&self) {}
56 | }
57 |
58 | impl FitTo {
59 | fn fit_to_size(&self, size: resvg::tiny_skia::IntSize) -> Option {
60 | match *self {
61 | FitTo::Original => Some(size),
62 | FitTo::Width(w) => size.scale_to_width(w),
63 | FitTo::Height(h) => size.scale_to_height(h),
64 | FitTo::Size(w, h) => resvg::tiny_skia::IntSize::from_wh(w, h).map(|s| size.scale_to(s)),
65 | FitTo::Zoom(z) => size.scale_by(z),
66 | }
67 | }
68 |
69 | fn fit_to_transform(&self, size: resvg::tiny_skia::IntSize) -> resvg::tiny_skia::Transform {
70 | let size1 = size.to_size();
71 | let size2 = match self.fit_to_size(size) {
72 | Some(v) => v.to_size(),
73 | None => return resvg::tiny_skia::Transform::default(),
74 | };
75 | resvg::tiny_skia::Transform::from_scale(
76 | size2.width() / size1.width(),
77 | size2.height() / size1.height(),
78 | )
79 | }
80 | }
81 | struct Opts<'a> {
82 | // font_size: u32,
83 | serif_family: Option,
84 | sans_serif_family: Option,
85 | cursive_family: Option,
86 | fantasy_family: Option,
87 | monospace_family: Option,
88 | background: Option,
89 | font_files: Option>,
90 | font_dirs: Option>,
91 | // Abstract Classes
92 | fit_to: FitTo,
93 | usvg_opt: resvg::usvg::Options<'a>,
94 | // Renderers
95 | skip_system_fonts: bool,
96 | }
97 |
98 | fn load_fonts(
99 | fontdb: &mut resvg::usvg::fontdb::Database,
100 | font_files: &Option>,
101 | font_dirs: &Option>,
102 | serif_family: String,
103 | sans_serif_family: String,
104 | cursive_family: String,
105 | fantasy_family: String,
106 | monospace_family: String,
107 | ) {
108 | if let Some(font_files) = font_files {
109 | for path in font_files {
110 | if let Err(e) = fontdb.load_font_file(path) {
111 | log::warn!("Failed to load '{}' cause {}.", path.to_string(), e);
112 | }
113 | }
114 | }
115 |
116 | if let Some(font_dirs) = font_dirs {
117 | for path in font_dirs {
118 | fontdb.load_fonts_dir(path);
119 | }
120 | }
121 |
122 |
123 | fontdb.set_serif_family(serif_family);
124 | fontdb.set_sans_serif_family(sans_serif_family);
125 | fontdb.set_cursive_family(cursive_family);
126 | fontdb.set_fantasy_family(fantasy_family);
127 | fontdb.set_monospace_family(monospace_family);
128 |
129 | }
130 |
131 | fn svg_to_skia_color(color: svgtypes::Color) -> resvg::tiny_skia::Color {
132 | resvg::tiny_skia::Color::from_rgba8(color.red, color.green, color.blue, color.alpha)
133 | }
134 |
135 | fn render_svg(
136 | background: Option,
137 | fit_to: FitTo,
138 | tree: &resvg::usvg::Tree
139 | ) -> Result {
140 | let original_size = tree.size().to_int_size();
141 |
142 | let final_size = fit_to.fit_to_size(original_size)
143 | .ok_or("Failed to calculate scaled size")?;
144 |
145 | let mut pixmap = resvg::tiny_skia::Pixmap::new(
146 | final_size.width(),
147 | final_size.height(),
148 | ).ok_or("Failed to create pixmap")?;
149 |
150 | if let Some(background) = background {
151 | pixmap.fill(svg_to_skia_color(background));
152 | }
153 |
154 | let ts = fit_to.fit_to_transform(original_size);
155 | resvg::render(tree, ts, &mut pixmap.as_mut());
156 |
157 | Ok(pixmap)
158 | }
159 |
160 |
161 | fn resvg_magic(mut options: Opts, svg_string: String) -> Result, String> {
162 | let xml_tree = {
163 | let xml_opt = resvg::usvg::roxmltree::ParsingOptions {
164 | allow_dtd: true,
165 | ..Default::default()
166 | };
167 | resvg::usvg::roxmltree::Document::parse_with_options(&svg_string, xml_opt)
168 | .map_err(|e| e.to_string())
169 | }?;
170 | let has_text_nodes = xml_tree
171 | .descendants()
172 | .any(|n| n.has_tag_name(("http://www.w3.org/2000/svg", "text")));
173 |
174 | // Create mutable reference to font database
175 | if let Some(fontdb) = Arc::get_mut(&mut options.usvg_opt.fontdb) {
176 | if !options.skip_system_fonts {
177 | fontdb.load_system_fonts();
178 | }
179 |
180 | if has_text_nodes {
181 | // Extract font options before passing to load_fonts
182 | load_fonts(
183 | fontdb,
184 | &options.font_files,
185 | &options.font_dirs,
186 | options.serif_family.unwrap(),
187 | options.sans_serif_family.unwrap(),
188 | options.cursive_family.unwrap(),
189 | options.fantasy_family.unwrap(),
190 | options.monospace_family.unwrap(),
191 | );
192 | }
193 | }
194 |
195 | let tree = {
196 | resvg::usvg::Tree::from_xmltree(&xml_tree, &options.usvg_opt)
197 | .map_err(|e| e.to_string())
198 | }?;
199 | Ok(render_svg(options.background, options.fit_to, &tree)?.encode_png().unwrap())
200 | }
201 |
202 | #[pyfunction]
203 | #[pyo3(signature = (
204 | svg_string= None,
205 | svg_path = None,
206 | background = None,
207 | skip_system_fonts= false,
208 | log_information = false,
209 | width = None,
210 | height= None,
211 | zoom = None,
212 | dpi = 0,
213 | style_sheet = None,
214 | resources_dir = None,
215 | languages = vec![],
216 | font_size = 16,
217 | font_family = None,
218 | serif_family = None,
219 | sans_serif_family = None,
220 | cursive_family = None,
221 | fantasy_family = None,
222 | monospace_family = None,
223 | font_files = None,
224 | font_dirs = None,
225 | shape_rendering = "geometric_precision".to_owned(),
226 | text_rendering = "optimize_legibility".to_owned(),
227 | image_rendering = "optimize_quality".to_owned(),
228 | ))]
229 | fn svg_to_bytes(
230 | svg_string: Option,
231 | svg_path: Option,
232 | // Background
233 | background: Option,
234 | // Skip System Fonts
235 | skip_system_fonts: Option,
236 | // Log informations
237 | log_information: Option,
238 | // Control width, height, zoom, dpi
239 | width: Option,
240 | height: Option,
241 | zoom: Option,
242 | dpi: Option,
243 | // Style Sheet
244 | style_sheet: Option,
245 | // Resource Directory
246 | resources_dir: Option,
247 | // Fonts
248 | languages: Option>,
249 | font_size: Option,
250 | mut font_family: Option,
251 | mut serif_family: Option,
252 | mut sans_serif_family:Option,
253 | mut cursive_family: Option,
254 | mut fantasy_family: Option,
255 | mut monospace_family:Option,
256 | // Font files and directories
257 | font_files: Option>,
258 | font_dirs: Option>,
259 | // Effects based
260 | shape_rendering:Option,
261 | text_rendering: Option,
262 | image_rendering: Option,
263 |
264 | ) -> PyResult> {
265 |
266 | if log_information.unwrap_or(false) {
267 | if let Ok(()) = log::set_logger(&LOGGER) {
268 | log::set_max_level(log::LevelFilter::Warn);
269 | }
270 | }
271 |
272 | let none_or_take = |item:Option,otherwise:&str|{
273 | if item.is_none(){
274 | Some(otherwise.to_owned())
275 | }else{
276 | item
277 | }
278 | };
279 |
280 | #[cfg(any(target_os = "windows", target_os = "macos"))]
281 | {
282 | font_family = none_or_take(font_family, "Times New Roman");
283 | serif_family = none_or_take(serif_family, "Times New Roman");
284 | sans_serif_family = none_or_take(sans_serif_family, "Arial");
285 | cursive_family = none_or_take(cursive_family, "Comic Sans MS");
286 | fantasy_family = none_or_take(fantasy_family, "Impact");
287 | monospace_family = none_or_take(monospace_family, "Courier New");
288 | }
289 |
290 | #[cfg(target_os="linux")]
291 | {
292 | font_family = none_or_take(font_family, "Liberation Serif");
293 | serif_family = none_or_take(serif_family, "Liberation Serif");
294 | sans_serif_family = none_or_take(sans_serif_family, "Liberation Sans");
295 | cursive_family = none_or_take(cursive_family, "Comic Neue");
296 | fantasy_family = none_or_take(fantasy_family, "Anton");
297 | monospace_family = none_or_take(monospace_family, "Liberation Mono");
298 | }
299 |
300 | let mut _svg_string = String::new();
301 | if let Some(svg_string) = svg_string {
302 | _svg_string = svg_string;
303 | }
304 |
305 | // Only check for path if provided string is empty
306 | if _svg_string.is_empty() {
307 | if let Some(svg_path) = svg_path {
308 | if std::path::Path::new(&svg_path).exists() {
309 | let mut svg_data =
310 | std::fs::read(&svg_path).expect("failed to open the provided file");
311 | if svg_data.starts_with(&[0x1f, 0x8b]) {
312 | svg_data = resvg::usvg::decompress_svgz(&svg_data)
313 | .expect("can't decompress the svg file");
314 | };
315 | _svg_string = std::str::from_utf8(&svg_data)
316 | .expect("can't convert bytes to utf-8")
317 | .to_owned();
318 | }
319 | }
320 | }
321 |
322 | if _svg_string.is_empty() {
323 | panic!("`svg_string` is empty or `svg_path` contains empty invalid svg");
324 | }
325 |
326 | let mut fit_to = FitTo::Original;
327 | let mut default_size = resvg::usvg::Size::from_wh(100.0, 100.0).unwrap();
328 |
329 | if let (Some(w), Some(h)) = (width, height) {
330 | default_size = resvg::usvg::Size::from_wh(w as f32, h as f32).unwrap();
331 | fit_to = FitTo::Size(w, h);
332 | } else if let Some(w) = width {
333 | default_size = resvg::usvg::Size::from_wh(w as f32, 100.0).unwrap();
334 | fit_to = FitTo::Width(w);
335 | } else if let Some(h) = height {
336 | default_size = resvg::usvg::Size::from_wh(100.0, h as f32).unwrap();
337 | fit_to = FitTo::Height(h);
338 | } else if let Some(z) = zoom {
339 | fit_to = FitTo::Zoom(z as f32);
340 | }
341 |
342 | let _shape_rendering = match shape_rendering
343 | .unwrap_or("geometric_precision".to_string())
344 | .as_ref()
345 | {
346 | "optimize_speed" => resvg::usvg::ShapeRendering::OptimizeSpeed,
347 | "crisp_edges" => resvg::usvg::ShapeRendering::CrispEdges,
348 | "geometric_precision" => resvg::usvg::ShapeRendering::GeometricPrecision,
349 | _ => panic!("Unexpected invalid token for shape rendering"),
350 | };
351 |
352 | let _text_rendering = match text_rendering
353 | .unwrap_or("optimize_legibility".to_string())
354 | .as_ref()
355 | {
356 | "optimize_speed" => resvg::usvg::TextRendering::OptimizeSpeed,
357 | "optimize_legibility" => resvg::usvg::TextRendering::OptimizeLegibility,
358 | "geometric_precision" => resvg::usvg::TextRendering::GeometricPrecision,
359 | _ => panic!("Unexpected invalid token for text rendering"),
360 | };
361 |
362 | let _image_rendering = match image_rendering
363 | .unwrap_or("optimize_quality".to_string())
364 | .as_ref()
365 | {
366 | "optimize_quality" => resvg::usvg::ImageRendering::OptimizeQuality,
367 | "optimize_speed" => resvg::usvg::ImageRendering::OptimizeSpeed,
368 | _ => panic!("Unexpected invalid token for image rendering",),
369 | };
370 |
371 | let _resources_dir = match resources_dir {
372 | Some(value) => Some(std::fs::canonicalize(value)?),
373 | None => None,
374 | };
375 |
376 | let _background = match background {
377 | Some(color_str) => match color_str.parse::() {
378 | Ok(color) => Some(color),
379 | Err(error) => panic!("Error background: {}", error),
380 | },
381 | None => None,
382 | };
383 |
384 | let fontdb = resvg::usvg::fontdb::Database::new();
385 |
386 | let usvg_options = resvg::usvg::Options {
387 | resources_dir: _resources_dir,
388 | dpi: dpi.unwrap_or(0) as f32,
389 | font_family: font_family.unwrap(),
390 | font_size: font_size.unwrap_or(16) as f32,
391 | languages: languages.unwrap_or(vec![]),
392 | shape_rendering: _shape_rendering,
393 | text_rendering: _text_rendering,
394 | image_rendering: _image_rendering,
395 | style_sheet: Some(style_sheet.unwrap_or_default()),
396 | default_size,
397 | image_href_resolver: resvg::usvg::ImageHrefResolver::default(),
398 | fontdb: Arc::new(fontdb),
399 | font_resolver: FontResolver::default(),
400 | };
401 |
402 |
403 |
404 | let options = Opts {
405 | usvg_opt: usvg_options,
406 | background: _background,
407 | skip_system_fonts: skip_system_fonts.unwrap_or(false),
408 | fit_to,
409 | serif_family,
410 | sans_serif_family,
411 | cursive_family,
412 | fantasy_family,
413 | monospace_family,
414 | font_files,
415 | font_dirs,
416 | };
417 | let pixmap = resvg_magic(options, _svg_string.trim().to_owned()).unwrap();
418 | Ok(pixmap)
419 | }
420 |
421 | fn get_version() -> &'static str {
422 | static VERSION : std::sync::OnceLock = std::sync::OnceLock::new();
423 |
424 | VERSION.get_or_init(||{
425 | env!("CARGO_PKG_VERSION").to_owned()
426 | })
427 | }
428 |
429 | fn get_author() -> &'static str {
430 | static AUTHOR : std::sync::OnceLock = std::sync::OnceLock::new();
431 |
432 | AUTHOR.get_or_init(||{
433 | env!("CARGO_PKG_AUTHORS").to_owned()
434 | })
435 | }
436 |
437 | /// A Python module implemented in Rust.
438 | #[pymodule]
439 | fn resvg_py(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> {
440 | m.add("__version__", get_version())?;
441 | m.add("__author__", get_author())?;
442 | m.add_function(wrap_pyfunction!(svg_to_bytes, m)?)?;
443 | Ok(())
444 | }
--------------------------------------------------------------------------------
/Cargo.lock:
--------------------------------------------------------------------------------
1 | # This file is automatically @generated by Cargo.
2 | # It is not intended for manual editing.
3 | version = 4
4 |
5 | [[package]]
6 | name = "adler"
7 | version = "1.0.2"
8 | source = "registry+https://github.com/rust-lang/crates.io-index"
9 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
10 |
11 | [[package]]
12 | name = "arrayref"
13 | version = "0.3.7"
14 | source = "registry+https://github.com/rust-lang/crates.io-index"
15 | checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545"
16 |
17 | [[package]]
18 | name = "arrayvec"
19 | version = "0.7.6"
20 | source = "registry+https://github.com/rust-lang/crates.io-index"
21 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
22 |
23 | [[package]]
24 | name = "autocfg"
25 | version = "1.2.0"
26 | source = "registry+https://github.com/rust-lang/crates.io-index"
27 | checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80"
28 |
29 | [[package]]
30 | name = "base64"
31 | version = "0.22.1"
32 | source = "registry+https://github.com/rust-lang/crates.io-index"
33 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
34 |
35 | [[package]]
36 | name = "bitflags"
37 | version = "1.3.2"
38 | source = "registry+https://github.com/rust-lang/crates.io-index"
39 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
40 |
41 | [[package]]
42 | name = "bitflags"
43 | version = "2.5.0"
44 | source = "registry+https://github.com/rust-lang/crates.io-index"
45 | checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
46 |
47 | [[package]]
48 | name = "bytemuck"
49 | version = "1.15.0"
50 | source = "registry+https://github.com/rust-lang/crates.io-index"
51 | checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15"
52 |
53 | [[package]]
54 | name = "byteorder-lite"
55 | version = "0.1.0"
56 | source = "registry+https://github.com/rust-lang/crates.io-index"
57 | checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
58 |
59 | [[package]]
60 | name = "cfg-if"
61 | version = "1.0.0"
62 | source = "registry+https://github.com/rust-lang/crates.io-index"
63 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
64 |
65 | [[package]]
66 | name = "color_quant"
67 | version = "1.1.0"
68 | source = "registry+https://github.com/rust-lang/crates.io-index"
69 | checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
70 |
71 | [[package]]
72 | name = "core_maths"
73 | version = "0.1.1"
74 | source = "registry+https://github.com/rust-lang/crates.io-index"
75 | checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30"
76 | dependencies = [
77 | "libm",
78 | ]
79 |
80 | [[package]]
81 | name = "crc32fast"
82 | version = "1.4.0"
83 | source = "registry+https://github.com/rust-lang/crates.io-index"
84 | checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa"
85 | dependencies = [
86 | "cfg-if",
87 | ]
88 |
89 | [[package]]
90 | name = "data-url"
91 | version = "0.3.1"
92 | source = "registry+https://github.com/rust-lang/crates.io-index"
93 | checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a"
94 |
95 | [[package]]
96 | name = "euclid"
97 | version = "0.22.11"
98 | source = "registry+https://github.com/rust-lang/crates.io-index"
99 | checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48"
100 | dependencies = [
101 | "num-traits",
102 | ]
103 |
104 | [[package]]
105 | name = "fdeflate"
106 | version = "0.3.4"
107 | source = "registry+https://github.com/rust-lang/crates.io-index"
108 | checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645"
109 | dependencies = [
110 | "simd-adler32",
111 | ]
112 |
113 | [[package]]
114 | name = "flate2"
115 | version = "1.0.28"
116 | source = "registry+https://github.com/rust-lang/crates.io-index"
117 | checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e"
118 | dependencies = [
119 | "crc32fast",
120 | "miniz_oxide",
121 | ]
122 |
123 | [[package]]
124 | name = "float-cmp"
125 | version = "0.9.0"
126 | source = "registry+https://github.com/rust-lang/crates.io-index"
127 | checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
128 |
129 | [[package]]
130 | name = "fontconfig-parser"
131 | version = "0.5.6"
132 | source = "registry+https://github.com/rust-lang/crates.io-index"
133 | checksum = "6a595cb550439a117696039dfc69830492058211b771a2a165379f2a1a53d84d"
134 | dependencies = [
135 | "roxmltree 0.19.0",
136 | ]
137 |
138 | [[package]]
139 | name = "fontdb"
140 | version = "0.23.0"
141 | source = "registry+https://github.com/rust-lang/crates.io-index"
142 | checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905"
143 | dependencies = [
144 | "fontconfig-parser",
145 | "log",
146 | "memmap2",
147 | "slotmap",
148 | "tinyvec",
149 | "ttf-parser",
150 | ]
151 |
152 | [[package]]
153 | name = "gif"
154 | version = "0.13.1"
155 | source = "registry+https://github.com/rust-lang/crates.io-index"
156 | checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2"
157 | dependencies = [
158 | "color_quant",
159 | "weezl",
160 | ]
161 |
162 | [[package]]
163 | name = "heck"
164 | version = "0.5.0"
165 | source = "registry+https://github.com/rust-lang/crates.io-index"
166 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
167 |
168 | [[package]]
169 | name = "image-webp"
170 | version = "0.2.3"
171 | source = "registry+https://github.com/rust-lang/crates.io-index"
172 | checksum = "f6970fe7a5300b4b42e62c52efa0187540a5bef546c60edaf554ef595d2e6f0b"
173 | dependencies = [
174 | "byteorder-lite",
175 | "quick-error",
176 | ]
177 |
178 | [[package]]
179 | name = "imagesize"
180 | version = "0.13.0"
181 | source = "registry+https://github.com/rust-lang/crates.io-index"
182 | checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285"
183 |
184 | [[package]]
185 | name = "indoc"
186 | version = "2.0.5"
187 | source = "registry+https://github.com/rust-lang/crates.io-index"
188 | checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5"
189 |
190 | [[package]]
191 | name = "kurbo"
192 | version = "0.11.0"
193 | source = "registry+https://github.com/rust-lang/crates.io-index"
194 | checksum = "6e5aa9f0f96a938266bdb12928a67169e8d22c6a786fda8ed984b85e6ba93c3c"
195 | dependencies = [
196 | "arrayvec",
197 | "smallvec",
198 | ]
199 |
200 | [[package]]
201 | name = "kurbo"
202 | version = "0.12.0"
203 | source = "registry+https://github.com/rust-lang/crates.io-index"
204 | checksum = "ce9729cc38c18d86123ab736fd2e7151763ba226ac2490ec092d1dd148825e32"
205 | dependencies = [
206 | "arrayvec",
207 | "euclid",
208 | "smallvec",
209 | ]
210 |
211 | [[package]]
212 | name = "libc"
213 | version = "0.2.153"
214 | source = "registry+https://github.com/rust-lang/crates.io-index"
215 | checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
216 |
217 | [[package]]
218 | name = "libm"
219 | version = "0.2.15"
220 | source = "registry+https://github.com/rust-lang/crates.io-index"
221 | checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
222 |
223 | [[package]]
224 | name = "log"
225 | version = "0.4.28"
226 | source = "registry+https://github.com/rust-lang/crates.io-index"
227 | checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
228 |
229 | [[package]]
230 | name = "memmap2"
231 | version = "0.9.4"
232 | source = "registry+https://github.com/rust-lang/crates.io-index"
233 | checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322"
234 | dependencies = [
235 | "libc",
236 | ]
237 |
238 | [[package]]
239 | name = "memoffset"
240 | version = "0.9.1"
241 | source = "registry+https://github.com/rust-lang/crates.io-index"
242 | checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
243 | dependencies = [
244 | "autocfg",
245 | ]
246 |
247 | [[package]]
248 | name = "miniz_oxide"
249 | version = "0.7.2"
250 | source = "registry+https://github.com/rust-lang/crates.io-index"
251 | checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
252 | dependencies = [
253 | "adler",
254 | "simd-adler32",
255 | ]
256 |
257 | [[package]]
258 | name = "num-traits"
259 | version = "0.2.19"
260 | source = "registry+https://github.com/rust-lang/crates.io-index"
261 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
262 | dependencies = [
263 | "autocfg",
264 | ]
265 |
266 | [[package]]
267 | name = "once_cell"
268 | version = "1.21.3"
269 | source = "registry+https://github.com/rust-lang/crates.io-index"
270 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
271 |
272 | [[package]]
273 | name = "pico-args"
274 | version = "0.5.0"
275 | source = "registry+https://github.com/rust-lang/crates.io-index"
276 | checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315"
277 |
278 | [[package]]
279 | name = "png"
280 | version = "0.17.13"
281 | source = "registry+https://github.com/rust-lang/crates.io-index"
282 | checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1"
283 | dependencies = [
284 | "bitflags 1.3.2",
285 | "crc32fast",
286 | "fdeflate",
287 | "flate2",
288 | "miniz_oxide",
289 | ]
290 |
291 | [[package]]
292 | name = "portable-atomic"
293 | version = "1.6.0"
294 | source = "registry+https://github.com/rust-lang/crates.io-index"
295 | checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0"
296 |
297 | [[package]]
298 | name = "proc-macro2"
299 | version = "1.0.92"
300 | source = "registry+https://github.com/rust-lang/crates.io-index"
301 | checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
302 | dependencies = [
303 | "unicode-ident",
304 | ]
305 |
306 | [[package]]
307 | name = "pyo3"
308 | version = "0.27.2"
309 | source = "registry+https://github.com/rust-lang/crates.io-index"
310 | checksum = "ab53c047fcd1a1d2a8820fe84f05d6be69e9526be40cb03b73f86b6b03e6d87d"
311 | dependencies = [
312 | "indoc",
313 | "libc",
314 | "memoffset",
315 | "once_cell",
316 | "portable-atomic",
317 | "pyo3-build-config",
318 | "pyo3-ffi",
319 | "pyo3-macros",
320 | "unindent",
321 | ]
322 |
323 | [[package]]
324 | name = "pyo3-build-config"
325 | version = "0.27.2"
326 | source = "registry+https://github.com/rust-lang/crates.io-index"
327 | checksum = "b455933107de8642b4487ed26d912c2d899dec6114884214a0b3bb3be9261ea6"
328 | dependencies = [
329 | "target-lexicon",
330 | ]
331 |
332 | [[package]]
333 | name = "pyo3-ffi"
334 | version = "0.27.2"
335 | source = "registry+https://github.com/rust-lang/crates.io-index"
336 | checksum = "1c85c9cbfaddf651b1221594209aed57e9e5cff63c4d11d1feead529b872a089"
337 | dependencies = [
338 | "libc",
339 | "pyo3-build-config",
340 | ]
341 |
342 | [[package]]
343 | name = "pyo3-macros"
344 | version = "0.27.2"
345 | source = "registry+https://github.com/rust-lang/crates.io-index"
346 | checksum = "0a5b10c9bf9888125d917fb4d2ca2d25c8df94c7ab5a52e13313a07e050a3b02"
347 | dependencies = [
348 | "proc-macro2",
349 | "pyo3-macros-backend",
350 | "quote",
351 | "syn",
352 | ]
353 |
354 | [[package]]
355 | name = "pyo3-macros-backend"
356 | version = "0.27.2"
357 | source = "registry+https://github.com/rust-lang/crates.io-index"
358 | checksum = "03b51720d314836e53327f5871d4c0cfb4fb37cc2c4a11cc71907a86342c40f9"
359 | dependencies = [
360 | "heck",
361 | "proc-macro2",
362 | "pyo3-build-config",
363 | "quote",
364 | "syn",
365 | ]
366 |
367 | [[package]]
368 | name = "quick-error"
369 | version = "2.0.1"
370 | source = "registry+https://github.com/rust-lang/crates.io-index"
371 | checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
372 |
373 | [[package]]
374 | name = "quote"
375 | version = "1.0.36"
376 | source = "registry+https://github.com/rust-lang/crates.io-index"
377 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
378 | dependencies = [
379 | "proc-macro2",
380 | ]
381 |
382 | [[package]]
383 | name = "resvg"
384 | version = "0.45.1"
385 | source = "registry+https://github.com/rust-lang/crates.io-index"
386 | checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43"
387 | dependencies = [
388 | "gif",
389 | "image-webp",
390 | "log",
391 | "pico-args",
392 | "rgb",
393 | "svgtypes 0.15.3",
394 | "tiny-skia",
395 | "usvg",
396 | "zune-jpeg",
397 | ]
398 |
399 | [[package]]
400 | name = "resvg_py"
401 | version = "0.2.3"
402 | dependencies = [
403 | "log",
404 | "pyo3",
405 | "resvg",
406 | "svgtypes 0.16.0",
407 | ]
408 |
409 | [[package]]
410 | name = "rgb"
411 | version = "0.8.37"
412 | source = "registry+https://github.com/rust-lang/crates.io-index"
413 | checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8"
414 | dependencies = [
415 | "bytemuck",
416 | ]
417 |
418 | [[package]]
419 | name = "roxmltree"
420 | version = "0.19.0"
421 | source = "registry+https://github.com/rust-lang/crates.io-index"
422 | checksum = "3cd14fd5e3b777a7422cca79358c57a8f6e3a703d9ac187448d0daf220c2407f"
423 |
424 | [[package]]
425 | name = "roxmltree"
426 | version = "0.20.0"
427 | source = "registry+https://github.com/rust-lang/crates.io-index"
428 | checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97"
429 |
430 | [[package]]
431 | name = "rustybuzz"
432 | version = "0.20.1"
433 | source = "registry+https://github.com/rust-lang/crates.io-index"
434 | checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702"
435 | dependencies = [
436 | "bitflags 2.5.0",
437 | "bytemuck",
438 | "core_maths",
439 | "log",
440 | "smallvec",
441 | "ttf-parser",
442 | "unicode-bidi-mirroring",
443 | "unicode-ccc",
444 | "unicode-properties",
445 | "unicode-script",
446 | ]
447 |
448 | [[package]]
449 | name = "simd-adler32"
450 | version = "0.3.7"
451 | source = "registry+https://github.com/rust-lang/crates.io-index"
452 | checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
453 |
454 | [[package]]
455 | name = "simplecss"
456 | version = "0.2.1"
457 | source = "registry+https://github.com/rust-lang/crates.io-index"
458 | checksum = "a11be7c62927d9427e9f40f3444d5499d868648e2edbc4e2116de69e7ec0e89d"
459 | dependencies = [
460 | "log",
461 | ]
462 |
463 | [[package]]
464 | name = "siphasher"
465 | version = "1.0.1"
466 | source = "registry+https://github.com/rust-lang/crates.io-index"
467 | checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
468 |
469 | [[package]]
470 | name = "slotmap"
471 | version = "1.0.7"
472 | source = "registry+https://github.com/rust-lang/crates.io-index"
473 | checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a"
474 | dependencies = [
475 | "version_check",
476 | ]
477 |
478 | [[package]]
479 | name = "smallvec"
480 | version = "1.15.1"
481 | source = "registry+https://github.com/rust-lang/crates.io-index"
482 | checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
483 |
484 | [[package]]
485 | name = "strict-num"
486 | version = "0.1.1"
487 | source = "registry+https://github.com/rust-lang/crates.io-index"
488 | checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731"
489 | dependencies = [
490 | "float-cmp",
491 | ]
492 |
493 | [[package]]
494 | name = "svgtypes"
495 | version = "0.15.3"
496 | source = "registry+https://github.com/rust-lang/crates.io-index"
497 | checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc"
498 | dependencies = [
499 | "kurbo 0.11.0",
500 | "siphasher",
501 | ]
502 |
503 | [[package]]
504 | name = "svgtypes"
505 | version = "0.16.0"
506 | source = "registry+https://github.com/rust-lang/crates.io-index"
507 | checksum = "c9165405c8cf6bdc11d4417ef1c8c90521ebbadffe7da5c67bb5c1b90a14aeb1"
508 | dependencies = [
509 | "kurbo 0.12.0",
510 | "siphasher",
511 | ]
512 |
513 | [[package]]
514 | name = "syn"
515 | version = "2.0.90"
516 | source = "registry+https://github.com/rust-lang/crates.io-index"
517 | checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
518 | dependencies = [
519 | "proc-macro2",
520 | "quote",
521 | "unicode-ident",
522 | ]
523 |
524 | [[package]]
525 | name = "target-lexicon"
526 | version = "0.13.2"
527 | source = "registry+https://github.com/rust-lang/crates.io-index"
528 | checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a"
529 |
530 | [[package]]
531 | name = "tiny-skia"
532 | version = "0.11.4"
533 | source = "registry+https://github.com/rust-lang/crates.io-index"
534 | checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab"
535 | dependencies = [
536 | "arrayref",
537 | "arrayvec",
538 | "bytemuck",
539 | "cfg-if",
540 | "log",
541 | "png",
542 | "tiny-skia-path",
543 | ]
544 |
545 | [[package]]
546 | name = "tiny-skia-path"
547 | version = "0.11.4"
548 | source = "registry+https://github.com/rust-lang/crates.io-index"
549 | checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93"
550 | dependencies = [
551 | "arrayref",
552 | "bytemuck",
553 | "strict-num",
554 | ]
555 |
556 | [[package]]
557 | name = "tinyvec"
558 | version = "1.6.0"
559 | source = "registry+https://github.com/rust-lang/crates.io-index"
560 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
561 | dependencies = [
562 | "tinyvec_macros",
563 | ]
564 |
565 | [[package]]
566 | name = "tinyvec_macros"
567 | version = "0.1.1"
568 | source = "registry+https://github.com/rust-lang/crates.io-index"
569 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
570 |
571 | [[package]]
572 | name = "ttf-parser"
573 | version = "0.25.1"
574 | source = "registry+https://github.com/rust-lang/crates.io-index"
575 | checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31"
576 | dependencies = [
577 | "core_maths",
578 | ]
579 |
580 | [[package]]
581 | name = "unicode-bidi"
582 | version = "0.3.15"
583 | source = "registry+https://github.com/rust-lang/crates.io-index"
584 | checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
585 |
586 | [[package]]
587 | name = "unicode-bidi-mirroring"
588 | version = "0.4.0"
589 | source = "registry+https://github.com/rust-lang/crates.io-index"
590 | checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe"
591 |
592 | [[package]]
593 | name = "unicode-ccc"
594 | version = "0.4.0"
595 | source = "registry+https://github.com/rust-lang/crates.io-index"
596 | checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e"
597 |
598 | [[package]]
599 | name = "unicode-ident"
600 | version = "1.0.12"
601 | source = "registry+https://github.com/rust-lang/crates.io-index"
602 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
603 |
604 | [[package]]
605 | name = "unicode-properties"
606 | version = "0.1.3"
607 | source = "registry+https://github.com/rust-lang/crates.io-index"
608 | checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0"
609 |
610 | [[package]]
611 | name = "unicode-script"
612 | version = "0.5.6"
613 | source = "registry+https://github.com/rust-lang/crates.io-index"
614 | checksum = "ad8d71f5726e5f285a935e9fe8edfd53f0491eb6e9a5774097fdabee7cd8c9cd"
615 |
616 | [[package]]
617 | name = "unicode-vo"
618 | version = "0.1.0"
619 | source = "registry+https://github.com/rust-lang/crates.io-index"
620 | checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94"
621 |
622 | [[package]]
623 | name = "unindent"
624 | version = "0.2.3"
625 | source = "registry+https://github.com/rust-lang/crates.io-index"
626 | checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce"
627 |
628 | [[package]]
629 | name = "usvg"
630 | version = "0.45.1"
631 | source = "registry+https://github.com/rust-lang/crates.io-index"
632 | checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef"
633 | dependencies = [
634 | "base64",
635 | "data-url",
636 | "flate2",
637 | "fontdb",
638 | "imagesize",
639 | "kurbo 0.11.0",
640 | "log",
641 | "pico-args",
642 | "roxmltree 0.20.0",
643 | "rustybuzz",
644 | "simplecss",
645 | "siphasher",
646 | "strict-num",
647 | "svgtypes 0.15.3",
648 | "tiny-skia-path",
649 | "unicode-bidi",
650 | "unicode-script",
651 | "unicode-vo",
652 | "xmlwriter",
653 | ]
654 |
655 | [[package]]
656 | name = "version_check"
657 | version = "0.9.4"
658 | source = "registry+https://github.com/rust-lang/crates.io-index"
659 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
660 |
661 | [[package]]
662 | name = "weezl"
663 | version = "0.1.8"
664 | source = "registry+https://github.com/rust-lang/crates.io-index"
665 | checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082"
666 |
667 | [[package]]
668 | name = "xmlwriter"
669 | version = "0.1.0"
670 | source = "registry+https://github.com/rust-lang/crates.io-index"
671 | checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9"
672 |
673 | [[package]]
674 | name = "zune-core"
675 | version = "0.4.12"
676 | source = "registry+https://github.com/rust-lang/crates.io-index"
677 | checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a"
678 |
679 | [[package]]
680 | name = "zune-jpeg"
681 | version = "0.4.19"
682 | source = "registry+https://github.com/rust-lang/crates.io-index"
683 | checksum = "2c9e525af0a6a658e031e95f14b7f889976b74a11ba0eca5a5fc9ac8a1c43a6a"
684 | dependencies = [
685 | "zune-core",
686 | ]
687 |
--------------------------------------------------------------------------------
/uv.lock:
--------------------------------------------------------------------------------
1 | version = 1
2 | revision = 2
3 | requires-python = ">=3.9"
4 | resolution-markers = [
5 | "python_full_version >= '3.11'",
6 | "python_full_version == '3.10.*'",
7 | "python_full_version < '3.10'",
8 | ]
9 |
10 | [[package]]
11 | name = "alabaster"
12 | version = "0.7.16"
13 | source = { registry = "https://pypi.org/simple" }
14 | resolution-markers = [
15 | "python_full_version < '3.10'",
16 | ]
17 | sdist = { url = "https://files.pythonhosted.org/packages/c9/3e/13dd8e5ed9094e734ac430b5d0eb4f2bb001708a8b7856cbf8e084e001ba/alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", size = 23776, upload_time = "2024-01-10T00:56:10.189Z" }
18 | wheels = [
19 | { url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92", size = 13511, upload_time = "2024-01-10T00:56:08.388Z" },
20 | ]
21 |
22 | [[package]]
23 | name = "alabaster"
24 | version = "1.0.0"
25 | source = { registry = "https://pypi.org/simple" }
26 | resolution-markers = [
27 | "python_full_version >= '3.11'",
28 | "python_full_version == '3.10.*'",
29 | ]
30 | sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload_time = "2024-07-26T18:15:03.762Z" }
31 | wheels = [
32 | { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload_time = "2024-07-26T18:15:02.05Z" },
33 | ]
34 |
35 | [[package]]
36 | name = "babel"
37 | version = "2.17.0"
38 | source = { registry = "https://pypi.org/simple" }
39 | sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload_time = "2025-02-01T15:17:41.026Z" }
40 | wheels = [
41 | { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload_time = "2025-02-01T15:17:37.39Z" },
42 | ]
43 |
44 | [[package]]
45 | name = "beautifulsoup4"
46 | version = "4.13.4"
47 | source = { registry = "https://pypi.org/simple" }
48 | dependencies = [
49 | { name = "soupsieve" },
50 | { name = "typing-extensions" },
51 | ]
52 | sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload_time = "2025-04-15T17:05:13.836Z" }
53 | wheels = [
54 | { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload_time = "2025-04-15T17:05:12.221Z" },
55 | ]
56 |
57 | [[package]]
58 | name = "certifi"
59 | version = "2025.6.15"
60 | source = { registry = "https://pypi.org/simple" }
61 | sdist = { url = "https://files.pythonhosted.org/packages/73/f7/f14b46d4bcd21092d7d3ccef689615220d8a08fb25e564b65d20738e672e/certifi-2025.6.15.tar.gz", hash = "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b", size = 158753, upload_time = "2025-06-15T02:45:51.329Z" }
62 | wheels = [
63 | { url = "https://files.pythonhosted.org/packages/84/ae/320161bd181fc06471eed047ecce67b693fd7515b16d495d8932db763426/certifi-2025.6.15-py3-none-any.whl", hash = "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057", size = 157650, upload_time = "2025-06-15T02:45:49.977Z" },
64 | ]
65 |
66 | [[package]]
67 | name = "charset-normalizer"
68 | version = "3.4.2"
69 | source = { registry = "https://pypi.org/simple" }
70 | sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload_time = "2025-05-02T08:34:42.01Z" }
71 | wheels = [
72 | { url = "https://files.pythonhosted.org/packages/95/28/9901804da60055b406e1a1c5ba7aac1276fb77f1dde635aabfc7fd84b8ab/charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", size = 201818, upload_time = "2025-05-02T08:31:46.725Z" },
73 | { url = "https://files.pythonhosted.org/packages/d9/9b/892a8c8af9110935e5adcbb06d9c6fe741b6bb02608c6513983048ba1a18/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", size = 144649, upload_time = "2025-05-02T08:31:48.889Z" },
74 | { url = "https://files.pythonhosted.org/packages/7b/a5/4179abd063ff6414223575e008593861d62abfc22455b5d1a44995b7c101/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", size = 155045, upload_time = "2025-05-02T08:31:50.757Z" },
75 | { url = "https://files.pythonhosted.org/packages/3b/95/bc08c7dfeddd26b4be8c8287b9bb055716f31077c8b0ea1cd09553794665/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", size = 147356, upload_time = "2025-05-02T08:31:52.634Z" },
76 | { url = "https://files.pythonhosted.org/packages/a8/2d/7a5b635aa65284bf3eab7653e8b4151ab420ecbae918d3e359d1947b4d61/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", size = 149471, upload_time = "2025-05-02T08:31:56.207Z" },
77 | { url = "https://files.pythonhosted.org/packages/ae/38/51fc6ac74251fd331a8cfdb7ec57beba8c23fd5493f1050f71c87ef77ed0/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", size = 151317, upload_time = "2025-05-02T08:31:57.613Z" },
78 | { url = "https://files.pythonhosted.org/packages/b7/17/edee1e32215ee6e9e46c3e482645b46575a44a2d72c7dfd49e49f60ce6bf/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", size = 146368, upload_time = "2025-05-02T08:31:59.468Z" },
79 | { url = "https://files.pythonhosted.org/packages/26/2c/ea3e66f2b5f21fd00b2825c94cafb8c326ea6240cd80a91eb09e4a285830/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", size = 154491, upload_time = "2025-05-02T08:32:01.219Z" },
80 | { url = "https://files.pythonhosted.org/packages/52/47/7be7fa972422ad062e909fd62460d45c3ef4c141805b7078dbab15904ff7/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", size = 157695, upload_time = "2025-05-02T08:32:03.045Z" },
81 | { url = "https://files.pythonhosted.org/packages/2f/42/9f02c194da282b2b340f28e5fb60762de1151387a36842a92b533685c61e/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", size = 154849, upload_time = "2025-05-02T08:32:04.651Z" },
82 | { url = "https://files.pythonhosted.org/packages/67/44/89cacd6628f31fb0b63201a618049be4be2a7435a31b55b5eb1c3674547a/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", size = 150091, upload_time = "2025-05-02T08:32:06.719Z" },
83 | { url = "https://files.pythonhosted.org/packages/1f/79/4b8da9f712bc079c0f16b6d67b099b0b8d808c2292c937f267d816ec5ecc/charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", size = 98445, upload_time = "2025-05-02T08:32:08.66Z" },
84 | { url = "https://files.pythonhosted.org/packages/7d/d7/96970afb4fb66497a40761cdf7bd4f6fca0fc7bafde3a84f836c1f57a926/charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", size = 105782, upload_time = "2025-05-02T08:32:10.46Z" },
85 | { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794, upload_time = "2025-05-02T08:32:11.945Z" },
86 | { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846, upload_time = "2025-05-02T08:32:13.946Z" },
87 | { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350, upload_time = "2025-05-02T08:32:15.873Z" },
88 | { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657, upload_time = "2025-05-02T08:32:17.283Z" },
89 | { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260, upload_time = "2025-05-02T08:32:18.807Z" },
90 | { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164, upload_time = "2025-05-02T08:32:20.333Z" },
91 | { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571, upload_time = "2025-05-02T08:32:21.86Z" },
92 | { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952, upload_time = "2025-05-02T08:32:23.434Z" },
93 | { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959, upload_time = "2025-05-02T08:32:24.993Z" },
94 | { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030, upload_time = "2025-05-02T08:32:26.435Z" },
95 | { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload_time = "2025-05-02T08:32:28.376Z" },
96 | { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload_time = "2025-05-02T08:32:30.281Z" },
97 | { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload_time = "2025-05-02T08:32:32.191Z" },
98 | { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload_time = "2025-05-02T08:32:33.712Z" },
99 | { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload_time = "2025-05-02T08:32:35.768Z" },
100 | { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload_time = "2025-05-02T08:32:37.284Z" },
101 | { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload_time = "2025-05-02T08:32:38.803Z" },
102 | { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload_time = "2025-05-02T08:32:40.251Z" },
103 | { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload_time = "2025-05-02T08:32:41.705Z" },
104 | { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload_time = "2025-05-02T08:32:43.709Z" },
105 | { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload_time = "2025-05-02T08:32:46.197Z" },
106 | { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload_time = "2025-05-02T08:32:48.105Z" },
107 | { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload_time = "2025-05-02T08:32:49.719Z" },
108 | { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload_time = "2025-05-02T08:32:51.404Z" },
109 | { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload_time = "2025-05-02T08:32:53.079Z" },
110 | { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload_time = "2025-05-02T08:32:54.573Z" },
111 | { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload_time = "2025-05-02T08:32:56.363Z" },
112 | { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload_time = "2025-05-02T08:32:58.551Z" },
113 | { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload_time = "2025-05-02T08:33:00.342Z" },
114 | { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload_time = "2025-05-02T08:33:02.081Z" },
115 | { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload_time = "2025-05-02T08:33:04.063Z" },
116 | { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload_time = "2025-05-02T08:33:06.418Z" },
117 | { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload_time = "2025-05-02T08:33:08.183Z" },
118 | { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload_time = "2025-05-02T08:33:09.986Z" },
119 | { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload_time = "2025-05-02T08:33:11.814Z" },
120 | { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload_time = "2025-05-02T08:33:13.707Z" },
121 | { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload_time = "2025-05-02T08:33:15.458Z" },
122 | { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload_time = "2025-05-02T08:33:17.06Z" },
123 | { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload_time = "2025-05-02T08:33:18.753Z" },
124 | { url = "https://files.pythonhosted.org/packages/28/f8/dfb01ff6cc9af38552c69c9027501ff5a5117c4cc18dcd27cb5259fa1888/charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", size = 201671, upload_time = "2025-05-02T08:34:12.696Z" },
125 | { url = "https://files.pythonhosted.org/packages/32/fb/74e26ee556a9dbfe3bd264289b67be1e6d616329403036f6507bb9f3f29c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", size = 144744, upload_time = "2025-05-02T08:34:14.665Z" },
126 | { url = "https://files.pythonhosted.org/packages/ad/06/8499ee5aa7addc6f6d72e068691826ff093329fe59891e83b092ae4c851c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", size = 154993, upload_time = "2025-05-02T08:34:17.134Z" },
127 | { url = "https://files.pythonhosted.org/packages/f1/a2/5e4c187680728219254ef107a6949c60ee0e9a916a5dadb148c7ae82459c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", size = 147382, upload_time = "2025-05-02T08:34:19.081Z" },
128 | { url = "https://files.pythonhosted.org/packages/4c/fe/56aca740dda674f0cc1ba1418c4d84534be51f639b5f98f538b332dc9a95/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", size = 149536, upload_time = "2025-05-02T08:34:21.073Z" },
129 | { url = "https://files.pythonhosted.org/packages/53/13/db2e7779f892386b589173dd689c1b1e304621c5792046edd8a978cbf9e0/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", size = 151349, upload_time = "2025-05-02T08:34:23.193Z" },
130 | { url = "https://files.pythonhosted.org/packages/69/35/e52ab9a276186f729bce7a0638585d2982f50402046e4b0faa5d2c3ef2da/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", size = 146365, upload_time = "2025-05-02T08:34:25.187Z" },
131 | { url = "https://files.pythonhosted.org/packages/a6/d8/af7333f732fc2e7635867d56cb7c349c28c7094910c72267586947561b4b/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", size = 154499, upload_time = "2025-05-02T08:34:27.359Z" },
132 | { url = "https://files.pythonhosted.org/packages/7a/3d/a5b2e48acef264d71e036ff30bcc49e51bde80219bb628ba3e00cf59baac/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", size = 157735, upload_time = "2025-05-02T08:34:29.798Z" },
133 | { url = "https://files.pythonhosted.org/packages/85/d8/23e2c112532a29f3eef374375a8684a4f3b8e784f62b01da931186f43494/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", size = 154786, upload_time = "2025-05-02T08:34:31.858Z" },
134 | { url = "https://files.pythonhosted.org/packages/c7/57/93e0169f08ecc20fe82d12254a200dfaceddc1c12a4077bf454ecc597e33/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", size = 150203, upload_time = "2025-05-02T08:34:33.88Z" },
135 | { url = "https://files.pythonhosted.org/packages/2c/9d/9bf2b005138e7e060d7ebdec7503d0ef3240141587651f4b445bdf7286c2/charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", size = 98436, upload_time = "2025-05-02T08:34:35.907Z" },
136 | { url = "https://files.pythonhosted.org/packages/6d/24/5849d46cf4311bbf21b424c443b09b459f5b436b1558c04e45dbb7cc478b/charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", size = 105772, upload_time = "2025-05-02T08:34:37.935Z" },
137 | { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload_time = "2025-05-02T08:34:40.053Z" },
138 | ]
139 |
140 | [[package]]
141 | name = "colorama"
142 | version = "0.4.6"
143 | source = { registry = "https://pypi.org/simple" }
144 | sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload_time = "2022-10-25T02:36:22.414Z" }
145 | wheels = [
146 | { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload_time = "2022-10-25T02:36:20.889Z" },
147 | ]
148 |
149 | [[package]]
150 | name = "docutils"
151 | version = "0.21.2"
152 | source = { registry = "https://pypi.org/simple" }
153 | sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload_time = "2024-04-23T18:57:18.24Z" }
154 | wheels = [
155 | { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload_time = "2024-04-23T18:57:14.835Z" },
156 | ]
157 |
158 | [[package]]
159 | name = "exceptiongroup"
160 | version = "1.3.0"
161 | source = { registry = "https://pypi.org/simple" }
162 | dependencies = [
163 | { name = "typing-extensions", marker = "python_full_version < '3.11'" },
164 | ]
165 | sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload_time = "2025-05-10T17:42:51.123Z" }
166 | wheels = [
167 | { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload_time = "2025-05-10T17:42:49.33Z" },
168 | ]
169 |
170 | [[package]]
171 | name = "furo"
172 | version = "2024.8.6"
173 | source = { registry = "https://pypi.org/simple" }
174 | dependencies = [
175 | { name = "beautifulsoup4" },
176 | { name = "pygments" },
177 | { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
178 | { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" },
179 | { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
180 | { name = "sphinx-basic-ng" },
181 | ]
182 | sdist = { url = "https://files.pythonhosted.org/packages/a0/e2/d351d69a9a9e4badb4a5be062c2d0e87bd9e6c23b5e57337fef14bef34c8/furo-2024.8.6.tar.gz", hash = "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01", size = 1661506, upload_time = "2024-08-06T08:07:57.567Z" }
183 | wheels = [
184 | { url = "https://files.pythonhosted.org/packages/27/48/e791a7ed487dbb9729ef32bb5d1af16693d8925f4366befef54119b2e576/furo-2024.8.6-py3-none-any.whl", hash = "sha256:6cd97c58b47813d3619e63e9081169880fbe331f0ca883c871ff1f3f11814f5c", size = 341333, upload_time = "2024-08-06T08:07:54.44Z" },
185 | ]
186 |
187 | [[package]]
188 | name = "idna"
189 | version = "3.10"
190 | source = { registry = "https://pypi.org/simple" }
191 | sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload_time = "2024-09-15T18:07:39.745Z" }
192 | wheels = [
193 | { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload_time = "2024-09-15T18:07:37.964Z" },
194 | ]
195 |
196 | [[package]]
197 | name = "imagesize"
198 | version = "1.4.1"
199 | source = { registry = "https://pypi.org/simple" }
200 | sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026, upload_time = "2022-07-01T12:21:05.687Z" }
201 | wheels = [
202 | { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769, upload_time = "2022-07-01T12:21:02.467Z" },
203 | ]
204 |
205 | [[package]]
206 | name = "importlib-metadata"
207 | version = "8.7.0"
208 | source = { registry = "https://pypi.org/simple" }
209 | dependencies = [
210 | { name = "zipp", marker = "python_full_version < '3.10'" },
211 | ]
212 | sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload_time = "2025-04-27T15:29:01.736Z" }
213 | wheels = [
214 | { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload_time = "2025-04-27T15:29:00.214Z" },
215 | ]
216 |
217 | [[package]]
218 | name = "iniconfig"
219 | version = "2.1.0"
220 | source = { registry = "https://pypi.org/simple" }
221 | sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload_time = "2025-03-19T20:09:59.721Z" }
222 | wheels = [
223 | { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload_time = "2025-03-19T20:10:01.071Z" },
224 | ]
225 |
226 | [[package]]
227 | name = "jinja2"
228 | version = "3.1.6"
229 | source = { registry = "https://pypi.org/simple" }
230 | dependencies = [
231 | { name = "markupsafe" },
232 | ]
233 | sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload_time = "2025-03-05T20:05:02.478Z" }
234 | wheels = [
235 | { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload_time = "2025-03-05T20:05:00.369Z" },
236 | ]
237 |
238 | [[package]]
239 | name = "livereload"
240 | version = "2.7.1"
241 | source = { registry = "https://pypi.org/simple" }
242 | dependencies = [
243 | { name = "tornado" },
244 | ]
245 | sdist = { url = "https://files.pythonhosted.org/packages/43/6e/f2748665839812a9bbe5c75d3f983edbf3ab05fa5cd2f7c2f36fffdf65bd/livereload-2.7.1.tar.gz", hash = "sha256:3d9bf7c05673df06e32bea23b494b8d36ca6d10f7d5c3c8a6989608c09c986a9", size = 22255, upload_time = "2024-12-18T13:42:01.461Z" }
246 | wheels = [
247 | { url = "https://files.pythonhosted.org/packages/e4/3e/de54dc7f199e85e6ca37e2e5dae2ec3bce2151e9e28f8eb9076d71e83d56/livereload-2.7.1-py3-none-any.whl", hash = "sha256:5201740078c1b9433f4b2ba22cd2729a39b9d0ec0a2cc6b4d3df257df5ad0564", size = 22657, upload_time = "2024-12-18T13:41:56.35Z" },
248 | ]
249 |
250 | [[package]]
251 | name = "markdown-it-py"
252 | version = "3.0.0"
253 | source = { registry = "https://pypi.org/simple" }
254 | dependencies = [
255 | { name = "mdurl" },
256 | ]
257 | sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload_time = "2023-06-03T06:41:14.443Z" }
258 | wheels = [
259 | { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload_time = "2023-06-03T06:41:11.019Z" },
260 | ]
261 |
262 | [[package]]
263 | name = "markupsafe"
264 | version = "3.0.2"
265 | source = { registry = "https://pypi.org/simple" }
266 | sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload_time = "2024-10-18T15:21:54.129Z" }
267 | wheels = [
268 | { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357, upload_time = "2024-10-18T15:20:51.44Z" },
269 | { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393, upload_time = "2024-10-18T15:20:52.426Z" },
270 | { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732, upload_time = "2024-10-18T15:20:53.578Z" },
271 | { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866, upload_time = "2024-10-18T15:20:55.06Z" },
272 | { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964, upload_time = "2024-10-18T15:20:55.906Z" },
273 | { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977, upload_time = "2024-10-18T15:20:57.189Z" },
274 | { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366, upload_time = "2024-10-18T15:20:58.235Z" },
275 | { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091, upload_time = "2024-10-18T15:20:59.235Z" },
276 | { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065, upload_time = "2024-10-18T15:21:00.307Z" },
277 | { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514, upload_time = "2024-10-18T15:21:01.122Z" },
278 | { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353, upload_time = "2024-10-18T15:21:02.187Z" },
279 | { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392, upload_time = "2024-10-18T15:21:02.941Z" },
280 | { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984, upload_time = "2024-10-18T15:21:03.953Z" },
281 | { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120, upload_time = "2024-10-18T15:21:06.495Z" },
282 | { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032, upload_time = "2024-10-18T15:21:07.295Z" },
283 | { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057, upload_time = "2024-10-18T15:21:08.073Z" },
284 | { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359, upload_time = "2024-10-18T15:21:09.318Z" },
285 | { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306, upload_time = "2024-10-18T15:21:10.185Z" },
286 | { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094, upload_time = "2024-10-18T15:21:11.005Z" },
287 | { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521, upload_time = "2024-10-18T15:21:12.911Z" },
288 | { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload_time = "2024-10-18T15:21:13.777Z" },
289 | { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload_time = "2024-10-18T15:21:14.822Z" },
290 | { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload_time = "2024-10-18T15:21:15.642Z" },
291 | { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload_time = "2024-10-18T15:21:17.133Z" },
292 | { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload_time = "2024-10-18T15:21:18.064Z" },
293 | { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload_time = "2024-10-18T15:21:18.859Z" },
294 | { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload_time = "2024-10-18T15:21:19.671Z" },
295 | { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload_time = "2024-10-18T15:21:20.971Z" },
296 | { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload_time = "2024-10-18T15:21:22.646Z" },
297 | { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload_time = "2024-10-18T15:21:23.499Z" },
298 | { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload_time = "2024-10-18T15:21:24.577Z" },
299 | { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload_time = "2024-10-18T15:21:25.382Z" },
300 | { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload_time = "2024-10-18T15:21:26.199Z" },
301 | { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload_time = "2024-10-18T15:21:27.029Z" },
302 | { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload_time = "2024-10-18T15:21:27.846Z" },
303 | { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload_time = "2024-10-18T15:21:28.744Z" },
304 | { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload_time = "2024-10-18T15:21:29.545Z" },
305 | { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload_time = "2024-10-18T15:21:30.366Z" },
306 | { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload_time = "2024-10-18T15:21:31.207Z" },
307 | { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload_time = "2024-10-18T15:21:32.032Z" },
308 | { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload_time = "2024-10-18T15:21:33.625Z" },
309 | { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload_time = "2024-10-18T15:21:34.611Z" },
310 | { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload_time = "2024-10-18T15:21:35.398Z" },
311 | { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload_time = "2024-10-18T15:21:36.231Z" },
312 | { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload_time = "2024-10-18T15:21:37.073Z" },
313 | { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload_time = "2024-10-18T15:21:37.932Z" },
314 | { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload_time = "2024-10-18T15:21:39.799Z" },
315 | { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload_time = "2024-10-18T15:21:40.813Z" },
316 | { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload_time = "2024-10-18T15:21:41.814Z" },
317 | { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload_time = "2024-10-18T15:21:42.784Z" },
318 | { url = "https://files.pythonhosted.org/packages/a7/ea/9b1530c3fdeeca613faeb0fb5cbcf2389d816072fab72a71b45749ef6062/MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", size = 14344, upload_time = "2024-10-18T15:21:43.721Z" },
319 | { url = "https://files.pythonhosted.org/packages/4b/c2/fbdbfe48848e7112ab05e627e718e854d20192b674952d9042ebd8c9e5de/MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", size = 12389, upload_time = "2024-10-18T15:21:44.666Z" },
320 | { url = "https://files.pythonhosted.org/packages/f0/25/7a7c6e4dbd4f867d95d94ca15449e91e52856f6ed1905d58ef1de5e211d0/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", size = 21607, upload_time = "2024-10-18T15:21:45.452Z" },
321 | { url = "https://files.pythonhosted.org/packages/53/8f/f339c98a178f3c1e545622206b40986a4c3307fe39f70ccd3d9df9a9e425/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", size = 20728, upload_time = "2024-10-18T15:21:46.295Z" },
322 | { url = "https://files.pythonhosted.org/packages/1a/03/8496a1a78308456dbd50b23a385c69b41f2e9661c67ea1329849a598a8f9/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", size = 20826, upload_time = "2024-10-18T15:21:47.134Z" },
323 | { url = "https://files.pythonhosted.org/packages/e6/cf/0a490a4bd363048c3022f2f475c8c05582179bb179defcee4766fb3dcc18/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", size = 21843, upload_time = "2024-10-18T15:21:48.334Z" },
324 | { url = "https://files.pythonhosted.org/packages/19/a3/34187a78613920dfd3cdf68ef6ce5e99c4f3417f035694074beb8848cd77/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", size = 21219, upload_time = "2024-10-18T15:21:49.587Z" },
325 | { url = "https://files.pythonhosted.org/packages/17/d8/5811082f85bb88410ad7e452263af048d685669bbbfb7b595e8689152498/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", size = 20946, upload_time = "2024-10-18T15:21:50.441Z" },
326 | { url = "https://files.pythonhosted.org/packages/7c/31/bd635fb5989440d9365c5e3c47556cfea121c7803f5034ac843e8f37c2f2/MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", size = 15063, upload_time = "2024-10-18T15:21:51.385Z" },
327 | { url = "https://files.pythonhosted.org/packages/b3/73/085399401383ce949f727afec55ec3abd76648d04b9f22e1c0e99cb4bec3/MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", size = 15506, upload_time = "2024-10-18T15:21:52.974Z" },
328 | ]
329 |
330 | [[package]]
331 | name = "mdit-py-plugins"
332 | version = "0.4.2"
333 | source = { registry = "https://pypi.org/simple" }
334 | dependencies = [
335 | { name = "markdown-it-py" },
336 | ]
337 | sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542, upload_time = "2024-09-09T20:27:49.564Z" }
338 | wheels = [
339 | { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316, upload_time = "2024-09-09T20:27:48.397Z" },
340 | ]
341 |
342 | [[package]]
343 | name = "mdurl"
344 | version = "0.1.2"
345 | source = { registry = "https://pypi.org/simple" }
346 | sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload_time = "2022-08-14T12:40:10.846Z" }
347 | wheels = [
348 | { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload_time = "2022-08-14T12:40:09.779Z" },
349 | ]
350 |
351 | [[package]]
352 | name = "myst-parser"
353 | version = "3.0.1"
354 | source = { registry = "https://pypi.org/simple" }
355 | resolution-markers = [
356 | "python_full_version < '3.10'",
357 | ]
358 | dependencies = [
359 | { name = "docutils", marker = "python_full_version < '3.10'" },
360 | { name = "jinja2", marker = "python_full_version < '3.10'" },
361 | { name = "markdown-it-py", marker = "python_full_version < '3.10'" },
362 | { name = "mdit-py-plugins", marker = "python_full_version < '3.10'" },
363 | { name = "pyyaml", marker = "python_full_version < '3.10'" },
364 | { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
365 | ]
366 | sdist = { url = "https://files.pythonhosted.org/packages/49/64/e2f13dac02f599980798c01156393b781aec983b52a6e4057ee58f07c43a/myst_parser-3.0.1.tar.gz", hash = "sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87", size = 92392, upload_time = "2024-04-28T20:22:42.116Z" }
367 | wheels = [
368 | { url = "https://files.pythonhosted.org/packages/e2/de/21aa8394f16add8f7427f0a1326ccd2b3a2a8a3245c9252bc5ac034c6155/myst_parser-3.0.1-py3-none-any.whl", hash = "sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1", size = 83163, upload_time = "2024-04-28T20:22:39.985Z" },
369 | ]
370 |
371 | [[package]]
372 | name = "myst-parser"
373 | version = "4.0.1"
374 | source = { registry = "https://pypi.org/simple" }
375 | resolution-markers = [
376 | "python_full_version >= '3.11'",
377 | "python_full_version == '3.10.*'",
378 | ]
379 | dependencies = [
380 | { name = "docutils", marker = "python_full_version >= '3.10'" },
381 | { name = "jinja2", marker = "python_full_version >= '3.10'" },
382 | { name = "markdown-it-py", marker = "python_full_version >= '3.10'" },
383 | { name = "mdit-py-plugins", marker = "python_full_version >= '3.10'" },
384 | { name = "pyyaml", marker = "python_full_version >= '3.10'" },
385 | { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" },
386 | { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
387 | ]
388 | sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985, upload_time = "2025-02-12T10:53:03.833Z" }
389 | wheels = [
390 | { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579, upload_time = "2025-02-12T10:53:02.078Z" },
391 | ]
392 |
393 | [[package]]
394 | name = "packaging"
395 | version = "25.0"
396 | source = { registry = "https://pypi.org/simple" }
397 | sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload_time = "2025-04-19T11:48:59.673Z" }
398 | wheels = [
399 | { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload_time = "2025-04-19T11:48:57.875Z" },
400 | ]
401 |
402 | [[package]]
403 | name = "pluggy"
404 | version = "1.6.0"
405 | source = { registry = "https://pypi.org/simple" }
406 | sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload_time = "2025-05-15T12:30:07.975Z" }
407 | wheels = [
408 | { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload_time = "2025-05-15T12:30:06.134Z" },
409 | ]
410 |
411 | [[package]]
412 | name = "pygments"
413 | version = "2.19.1"
414 | source = { registry = "https://pypi.org/simple" }
415 | sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload_time = "2025-01-06T17:26:30.443Z" }
416 | wheels = [
417 | { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload_time = "2025-01-06T17:26:25.553Z" },
418 | ]
419 |
420 | [[package]]
421 | name = "pytest"
422 | version = "8.4.1"
423 | source = { registry = "https://pypi.org/simple" }
424 | dependencies = [
425 | { name = "colorama", marker = "sys_platform == 'win32'" },
426 | { name = "exceptiongroup", marker = "python_full_version < '3.11'" },
427 | { name = "iniconfig" },
428 | { name = "packaging" },
429 | { name = "pluggy" },
430 | { name = "pygments" },
431 | { name = "tomli", marker = "python_full_version < '3.11'" },
432 | ]
433 | sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714, upload_time = "2025-06-18T05:48:06.109Z" }
434 | wheels = [
435 | { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474, upload_time = "2025-06-18T05:48:03.955Z" },
436 | ]
437 |
438 | [[package]]
439 | name = "pyyaml"
440 | version = "6.0.2"
441 | source = { registry = "https://pypi.org/simple" }
442 | sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload_time = "2024-08-06T20:33:50.674Z" }
443 | wheels = [
444 | { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199, upload_time = "2024-08-06T20:31:40.178Z" },
445 | { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758, upload_time = "2024-08-06T20:31:42.173Z" },
446 | { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463, upload_time = "2024-08-06T20:31:44.263Z" },
447 | { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280, upload_time = "2024-08-06T20:31:50.199Z" },
448 | { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239, upload_time = "2024-08-06T20:31:52.292Z" },
449 | { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802, upload_time = "2024-08-06T20:31:53.836Z" },
450 | { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527, upload_time = "2024-08-06T20:31:55.565Z" },
451 | { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052, upload_time = "2024-08-06T20:31:56.914Z" },
452 | { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774, upload_time = "2024-08-06T20:31:58.304Z" },
453 | { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload_time = "2024-08-06T20:32:03.408Z" },
454 | { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload_time = "2024-08-06T20:32:04.926Z" },
455 | { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload_time = "2024-08-06T20:32:06.459Z" },
456 | { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167, upload_time = "2024-08-06T20:32:08.338Z" },
457 | { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952, upload_time = "2024-08-06T20:32:14.124Z" },
458 | { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301, upload_time = "2024-08-06T20:32:16.17Z" },
459 | { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638, upload_time = "2024-08-06T20:32:18.555Z" },
460 | { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850, upload_time = "2024-08-06T20:32:19.889Z" },
461 | { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980, upload_time = "2024-08-06T20:32:21.273Z" },
462 | { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload_time = "2024-08-06T20:32:25.131Z" },
463 | { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload_time = "2024-08-06T20:32:26.511Z" },
464 | { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload_time = "2024-08-06T20:32:28.363Z" },
465 | { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload_time = "2024-08-06T20:32:30.058Z" },
466 | { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload_time = "2024-08-06T20:32:31.881Z" },
467 | { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload_time = "2024-08-06T20:32:37.083Z" },
468 | { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload_time = "2024-08-06T20:32:38.898Z" },
469 | { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload_time = "2024-08-06T20:32:40.241Z" },
470 | { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload_time = "2024-08-06T20:32:41.93Z" },
471 | { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload_time = "2024-08-06T20:32:43.4Z" },
472 | { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload_time = "2024-08-06T20:32:44.801Z" },
473 | { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload_time = "2024-08-06T20:32:46.432Z" },
474 | { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload_time = "2024-08-06T20:32:51.188Z" },
475 | { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload_time = "2024-08-06T20:32:53.019Z" },
476 | { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload_time = "2024-08-06T20:32:54.708Z" },
477 | { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload_time = "2024-08-06T20:32:56.985Z" },
478 | { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload_time = "2024-08-06T20:33:03.001Z" },
479 | { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload_time = "2024-08-06T20:33:04.33Z" },
480 | { url = "https://files.pythonhosted.org/packages/65/d8/b7a1db13636d7fb7d4ff431593c510c8b8fca920ade06ca8ef20015493c5/PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", size = 184777, upload_time = "2024-08-06T20:33:25.896Z" },
481 | { url = "https://files.pythonhosted.org/packages/0a/02/6ec546cd45143fdf9840b2c6be8d875116a64076218b61d68e12548e5839/PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", size = 172318, upload_time = "2024-08-06T20:33:27.212Z" },
482 | { url = "https://files.pythonhosted.org/packages/0e/9a/8cc68be846c972bda34f6c2a93abb644fb2476f4dcc924d52175786932c9/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", size = 720891, upload_time = "2024-08-06T20:33:28.974Z" },
483 | { url = "https://files.pythonhosted.org/packages/e9/6c/6e1b7f40181bc4805e2e07f4abc10a88ce4648e7e95ff1abe4ae4014a9b2/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", size = 722614, upload_time = "2024-08-06T20:33:34.157Z" },
484 | { url = "https://files.pythonhosted.org/packages/3d/32/e7bd8535d22ea2874cef6a81021ba019474ace0d13a4819c2a4bce79bd6a/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", size = 737360, upload_time = "2024-08-06T20:33:35.84Z" },
485 | { url = "https://files.pythonhosted.org/packages/d7/12/7322c1e30b9be969670b672573d45479edef72c9a0deac3bb2868f5d7469/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", size = 699006, upload_time = "2024-08-06T20:33:37.501Z" },
486 | { url = "https://files.pythonhosted.org/packages/82/72/04fcad41ca56491995076630c3ec1e834be241664c0c09a64c9a2589b507/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", size = 723577, upload_time = "2024-08-06T20:33:39.389Z" },
487 | { url = "https://files.pythonhosted.org/packages/ed/5e/46168b1f2757f1fcd442bc3029cd8767d88a98c9c05770d8b420948743bb/PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", size = 144593, upload_time = "2024-08-06T20:33:46.63Z" },
488 | { url = "https://files.pythonhosted.org/packages/19/87/5124b1c1f2412bb95c59ec481eaf936cd32f0fe2a7b16b97b81c4c017a6a/PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", size = 162312, upload_time = "2024-08-06T20:33:49.073Z" },
489 | ]
490 |
491 | [[package]]
492 | name = "requests"
493 | version = "2.32.4"
494 | source = { registry = "https://pypi.org/simple" }
495 | dependencies = [
496 | { name = "certifi" },
497 | { name = "charset-normalizer" },
498 | { name = "idna" },
499 | { name = "urllib3" },
500 | ]
501 | sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload_time = "2025-06-09T16:43:07.34Z" }
502 | wheels = [
503 | { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload_time = "2025-06-09T16:43:05.728Z" },
504 | ]
505 |
506 | [[package]]
507 | name = "resvg-py"
508 | source = { editable = "." }
509 |
510 | [package.dev-dependencies]
511 | dev = [
512 | { name = "pytest" },
513 | ]
514 | docs = [
515 | { name = "furo" },
516 | { name = "myst-parser", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
517 | { name = "myst-parser", version = "4.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
518 | { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
519 | { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" },
520 | { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
521 | { name = "sphinx-reload" },
522 | ]
523 |
524 | [package.metadata]
525 |
526 | [package.metadata.requires-dev]
527 | dev = [{ name = "pytest", specifier = ">=8.1.1" }]
528 | docs = [
529 | { name = "furo", specifier = ">=2024.1.29" },
530 | { name = "myst-parser", specifier = ">=3.0.1" },
531 | { name = "sphinx", specifier = ">=7.2.6" },
532 | { name = "sphinx-reload", specifier = ">=0.2.0" },
533 | ]
534 |
535 | [[package]]
536 | name = "roman-numerals-py"
537 | version = "3.1.0"
538 | source = { registry = "https://pypi.org/simple" }
539 | sdist = { url = "https://files.pythonhosted.org/packages/30/76/48fd56d17c5bdbdf65609abbc67288728a98ed4c02919428d4f52d23b24b/roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d", size = 9017, upload_time = "2025-02-22T07:34:54.333Z" }
540 | wheels = [
541 | { url = "https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", size = 7742, upload_time = "2025-02-22T07:34:52.422Z" },
542 | ]
543 |
544 | [[package]]
545 | name = "snowballstemmer"
546 | version = "3.0.1"
547 | source = { registry = "https://pypi.org/simple" }
548 | sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575, upload_time = "2025-05-09T16:34:51.843Z" }
549 | wheels = [
550 | { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload_time = "2025-05-09T16:34:50.371Z" },
551 | ]
552 |
553 | [[package]]
554 | name = "soupsieve"
555 | version = "2.7"
556 | source = { registry = "https://pypi.org/simple" }
557 | sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload_time = "2025-04-20T18:50:08.518Z" }
558 | wheels = [
559 | { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload_time = "2025-04-20T18:50:07.196Z" },
560 | ]
561 |
562 | [[package]]
563 | name = "sphinx"
564 | version = "7.4.7"
565 | source = { registry = "https://pypi.org/simple" }
566 | resolution-markers = [
567 | "python_full_version < '3.10'",
568 | ]
569 | dependencies = [
570 | { name = "alabaster", version = "0.7.16", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
571 | { name = "babel", marker = "python_full_version < '3.10'" },
572 | { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" },
573 | { name = "docutils", marker = "python_full_version < '3.10'" },
574 | { name = "imagesize", marker = "python_full_version < '3.10'" },
575 | { name = "importlib-metadata", marker = "python_full_version < '3.10'" },
576 | { name = "jinja2", marker = "python_full_version < '3.10'" },
577 | { name = "packaging", marker = "python_full_version < '3.10'" },
578 | { name = "pygments", marker = "python_full_version < '3.10'" },
579 | { name = "requests", marker = "python_full_version < '3.10'" },
580 | { name = "snowballstemmer", marker = "python_full_version < '3.10'" },
581 | { name = "sphinxcontrib-applehelp", marker = "python_full_version < '3.10'" },
582 | { name = "sphinxcontrib-devhelp", marker = "python_full_version < '3.10'" },
583 | { name = "sphinxcontrib-htmlhelp", marker = "python_full_version < '3.10'" },
584 | { name = "sphinxcontrib-jsmath", marker = "python_full_version < '3.10'" },
585 | { name = "sphinxcontrib-qthelp", marker = "python_full_version < '3.10'" },
586 | { name = "sphinxcontrib-serializinghtml", marker = "python_full_version < '3.10'" },
587 | { name = "tomli", marker = "python_full_version < '3.10'" },
588 | ]
589 | sdist = { url = "https://files.pythonhosted.org/packages/5b/be/50e50cb4f2eff47df05673d361095cafd95521d2a22521b920c67a372dcb/sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe", size = 8067911, upload_time = "2024-07-20T14:46:56.059Z" }
590 | wheels = [
591 | { url = "https://files.pythonhosted.org/packages/0d/ef/153f6803c5d5f8917dbb7f7fcf6d34a871ede3296fa89c2c703f5f8a6c8e/sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239", size = 3401624, upload_time = "2024-07-20T14:46:52.142Z" },
592 | ]
593 |
594 | [[package]]
595 | name = "sphinx"
596 | version = "8.1.3"
597 | source = { registry = "https://pypi.org/simple" }
598 | resolution-markers = [
599 | "python_full_version == '3.10.*'",
600 | ]
601 | dependencies = [
602 | { name = "alabaster", version = "1.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" },
603 | { name = "babel", marker = "python_full_version == '3.10.*'" },
604 | { name = "colorama", marker = "python_full_version == '3.10.*' and sys_platform == 'win32'" },
605 | { name = "docutils", marker = "python_full_version == '3.10.*'" },
606 | { name = "imagesize", marker = "python_full_version == '3.10.*'" },
607 | { name = "jinja2", marker = "python_full_version == '3.10.*'" },
608 | { name = "packaging", marker = "python_full_version == '3.10.*'" },
609 | { name = "pygments", marker = "python_full_version == '3.10.*'" },
610 | { name = "requests", marker = "python_full_version == '3.10.*'" },
611 | { name = "snowballstemmer", marker = "python_full_version == '3.10.*'" },
612 | { name = "sphinxcontrib-applehelp", marker = "python_full_version == '3.10.*'" },
613 | { name = "sphinxcontrib-devhelp", marker = "python_full_version == '3.10.*'" },
614 | { name = "sphinxcontrib-htmlhelp", marker = "python_full_version == '3.10.*'" },
615 | { name = "sphinxcontrib-jsmath", marker = "python_full_version == '3.10.*'" },
616 | { name = "sphinxcontrib-qthelp", marker = "python_full_version == '3.10.*'" },
617 | { name = "sphinxcontrib-serializinghtml", marker = "python_full_version == '3.10.*'" },
618 | { name = "tomli", marker = "python_full_version == '3.10.*'" },
619 | ]
620 | sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611, upload_time = "2024-10-13T20:27:13.93Z" }
621 | wheels = [
622 | { url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125, upload_time = "2024-10-13T20:27:10.448Z" },
623 | ]
624 |
625 | [[package]]
626 | name = "sphinx"
627 | version = "8.2.3"
628 | source = { registry = "https://pypi.org/simple" }
629 | resolution-markers = [
630 | "python_full_version >= '3.11'",
631 | ]
632 | dependencies = [
633 | { name = "alabaster", version = "1.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
634 | { name = "babel", marker = "python_full_version >= '3.11'" },
635 | { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" },
636 | { name = "docutils", marker = "python_full_version >= '3.11'" },
637 | { name = "imagesize", marker = "python_full_version >= '3.11'" },
638 | { name = "jinja2", marker = "python_full_version >= '3.11'" },
639 | { name = "packaging", marker = "python_full_version >= '3.11'" },
640 | { name = "pygments", marker = "python_full_version >= '3.11'" },
641 | { name = "requests", marker = "python_full_version >= '3.11'" },
642 | { name = "roman-numerals-py", marker = "python_full_version >= '3.11'" },
643 | { name = "snowballstemmer", marker = "python_full_version >= '3.11'" },
644 | { name = "sphinxcontrib-applehelp", marker = "python_full_version >= '3.11'" },
645 | { name = "sphinxcontrib-devhelp", marker = "python_full_version >= '3.11'" },
646 | { name = "sphinxcontrib-htmlhelp", marker = "python_full_version >= '3.11'" },
647 | { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.11'" },
648 | { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.11'" },
649 | { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.11'" },
650 | ]
651 | sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876, upload_time = "2025-03-02T22:31:59.658Z" }
652 | wheels = [
653 | { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload_time = "2025-03-02T22:31:56.836Z" },
654 | ]
655 |
656 | [[package]]
657 | name = "sphinx-basic-ng"
658 | version = "1.0.0b2"
659 | source = { registry = "https://pypi.org/simple" }
660 | dependencies = [
661 | { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
662 | { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" },
663 | { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
664 | ]
665 | sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736, upload_time = "2023-07-08T18:40:54.166Z" }
666 | wheels = [
667 | { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496, upload_time = "2023-07-08T18:40:52.659Z" },
668 | ]
669 |
670 | [[package]]
671 | name = "sphinx-reload"
672 | version = "0.2.0"
673 | source = { registry = "https://pypi.org/simple" }
674 | dependencies = [
675 | { name = "livereload" },
676 | ]
677 | sdist = { url = "https://files.pythonhosted.org/packages/9e/0c/cc638554fbb12066329aff959e6cd0dc24797c3de878326d0decd8c366f3/sphinx-reload-0.2.0.tar.gz", hash = "sha256:800e07bffea6de0e4ee5f9c14ef565ba1d0343c4a516d028e978bbcaf712fa07", size = 3527, upload_time = "2019-01-25T19:58:56.884Z" }
678 | wheels = [
679 | { url = "https://files.pythonhosted.org/packages/f4/95/9351a63ce7fdaff1bd44b69aa14d6c36b5be5d1f76577c32d5d79430b8d5/sphinx_reload-0.2.0-py3-none-any.whl", hash = "sha256:0c184b990d4bc50cf14b2e6b6cf89ce4f88a2baa9b22e36ae4e2abcb8f3f44b6", size = 4651, upload_time = "2019-01-25T19:58:55.733Z" },
680 | ]
681 |
682 | [[package]]
683 | name = "sphinxcontrib-applehelp"
684 | version = "2.0.0"
685 | source = { registry = "https://pypi.org/simple" }
686 | sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload_time = "2024-07-29T01:09:00.465Z" }
687 | wheels = [
688 | { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload_time = "2024-07-29T01:08:58.99Z" },
689 | ]
690 |
691 | [[package]]
692 | name = "sphinxcontrib-devhelp"
693 | version = "2.0.0"
694 | source = { registry = "https://pypi.org/simple" }
695 | sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload_time = "2024-07-29T01:09:23.417Z" }
696 | wheels = [
697 | { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload_time = "2024-07-29T01:09:21.945Z" },
698 | ]
699 |
700 | [[package]]
701 | name = "sphinxcontrib-htmlhelp"
702 | version = "2.1.0"
703 | source = { registry = "https://pypi.org/simple" }
704 | sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload_time = "2024-07-29T01:09:37.889Z" }
705 | wheels = [
706 | { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload_time = "2024-07-29T01:09:36.407Z" },
707 | ]
708 |
709 | [[package]]
710 | name = "sphinxcontrib-jsmath"
711 | version = "1.0.1"
712 | source = { registry = "https://pypi.org/simple" }
713 | sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload_time = "2019-01-21T16:10:16.347Z" }
714 | wheels = [
715 | { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload_time = "2019-01-21T16:10:14.333Z" },
716 | ]
717 |
718 | [[package]]
719 | name = "sphinxcontrib-qthelp"
720 | version = "2.0.0"
721 | source = { registry = "https://pypi.org/simple" }
722 | sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload_time = "2024-07-29T01:09:56.435Z" }
723 | wheels = [
724 | { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload_time = "2024-07-29T01:09:54.885Z" },
725 | ]
726 |
727 | [[package]]
728 | name = "sphinxcontrib-serializinghtml"
729 | version = "2.0.0"
730 | source = { registry = "https://pypi.org/simple" }
731 | sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload_time = "2024-07-29T01:10:09.332Z" }
732 | wheels = [
733 | { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload_time = "2024-07-29T01:10:08.203Z" },
734 | ]
735 |
736 | [[package]]
737 | name = "tomli"
738 | version = "2.2.1"
739 | source = { registry = "https://pypi.org/simple" }
740 | sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload_time = "2024-11-27T22:38:36.873Z" }
741 | wheels = [
742 | { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077, upload_time = "2024-11-27T22:37:54.956Z" },
743 | { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429, upload_time = "2024-11-27T22:37:56.698Z" },
744 | { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067, upload_time = "2024-11-27T22:37:57.63Z" },
745 | { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030, upload_time = "2024-11-27T22:37:59.344Z" },
746 | { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898, upload_time = "2024-11-27T22:38:00.429Z" },
747 | { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894, upload_time = "2024-11-27T22:38:02.094Z" },
748 | { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319, upload_time = "2024-11-27T22:38:03.206Z" },
749 | { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273, upload_time = "2024-11-27T22:38:04.217Z" },
750 | { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310, upload_time = "2024-11-27T22:38:05.908Z" },
751 | { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309, upload_time = "2024-11-27T22:38:06.812Z" },
752 | { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762, upload_time = "2024-11-27T22:38:07.731Z" },
753 | { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453, upload_time = "2024-11-27T22:38:09.384Z" },
754 | { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486, upload_time = "2024-11-27T22:38:10.329Z" },
755 | { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349, upload_time = "2024-11-27T22:38:11.443Z" },
756 | { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159, upload_time = "2024-11-27T22:38:13.099Z" },
757 | { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243, upload_time = "2024-11-27T22:38:14.766Z" },
758 | { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645, upload_time = "2024-11-27T22:38:15.843Z" },
759 | { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload_time = "2024-11-27T22:38:17.645Z" },
760 | { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875, upload_time = "2024-11-27T22:38:19.159Z" },
761 | { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418, upload_time = "2024-11-27T22:38:20.064Z" },
762 | { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708, upload_time = "2024-11-27T22:38:21.659Z" },
763 | { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582, upload_time = "2024-11-27T22:38:22.693Z" },
764 | { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543, upload_time = "2024-11-27T22:38:24.367Z" },
765 | { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691, upload_time = "2024-11-27T22:38:26.081Z" },
766 | { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170, upload_time = "2024-11-27T22:38:27.921Z" },
767 | { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530, upload_time = "2024-11-27T22:38:29.591Z" },
768 | { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666, upload_time = "2024-11-27T22:38:30.639Z" },
769 | { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954, upload_time = "2024-11-27T22:38:31.702Z" },
770 | { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724, upload_time = "2024-11-27T22:38:32.837Z" },
771 | { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383, upload_time = "2024-11-27T22:38:34.455Z" },
772 | { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload_time = "2024-11-27T22:38:35.385Z" },
773 | ]
774 |
775 | [[package]]
776 | name = "tornado"
777 | version = "6.5.1"
778 | source = { registry = "https://pypi.org/simple" }
779 | sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934, upload_time = "2025-05-22T18:15:38.788Z" }
780 | wheels = [
781 | { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948, upload_time = "2025-05-22T18:15:20.862Z" },
782 | { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112, upload_time = "2025-05-22T18:15:22.591Z" },
783 | { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672, upload_time = "2025-05-22T18:15:24.027Z" },
784 | { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019, upload_time = "2025-05-22T18:15:25.735Z" },
785 | { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252, upload_time = "2025-05-22T18:15:27.499Z" },
786 | { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930, upload_time = "2025-05-22T18:15:29.299Z" },
787 | { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351, upload_time = "2025-05-22T18:15:31.038Z" },
788 | { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328, upload_time = "2025-05-22T18:15:32.426Z" },
789 | { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396, upload_time = "2025-05-22T18:15:34.205Z" },
790 | { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840, upload_time = "2025-05-22T18:15:36.1Z" },
791 | { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596, upload_time = "2025-05-22T18:15:37.433Z" },
792 | ]
793 |
794 | [[package]]
795 | name = "typing-extensions"
796 | version = "4.14.0"
797 | source = { registry = "https://pypi.org/simple" }
798 | sdist = { url = "https://files.pythonhosted.org/packages/d1/bc/51647cd02527e87d05cb083ccc402f93e441606ff1f01739a62c8ad09ba5/typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4", size = 107423, upload_time = "2025-06-02T14:52:11.399Z" }
799 | wheels = [
800 | { url = "https://files.pythonhosted.org/packages/69/e0/552843e0d356fbb5256d21449fa957fa4eff3bbc135a74a691ee70c7c5da/typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af", size = 43839, upload_time = "2025-06-02T14:52:10.026Z" },
801 | ]
802 |
803 | [[package]]
804 | name = "urllib3"
805 | version = "2.5.0"
806 | source = { registry = "https://pypi.org/simple" }
807 | sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload_time = "2025-06-18T14:07:41.644Z" }
808 | wheels = [
809 | { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload_time = "2025-06-18T14:07:40.39Z" },
810 | ]
811 |
812 | [[package]]
813 | name = "zipp"
814 | version = "3.23.0"
815 | source = { registry = "https://pypi.org/simple" }
816 | sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload_time = "2025-06-08T17:06:39.4Z" }
817 | wheels = [
818 | { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload_time = "2025-06-08T17:06:38.034Z" },
819 | ]
820 |
--------------------------------------------------------------------------------