diff --git a/.gitignore b/.gitignore index 2808f6befa1b014c5af8e7ce990a943d8782bd64..55d3459833930b83e217b7e9dad6c4eda6199d4c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ dist/ .idea/ venv/ .venv/ +node_modules/ pdm.lock result.png diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 642550abc26560ad3fabee59c823befeaa10af81..6a2373ea9fcb6ab57557d65f01c51b416187e759 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,23 +6,12 @@ ci: autoupdate_commit_msg: "chore: auto update by pre-commit hooks" repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.9 + rev: v0.3.5 hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] stages: [commit] - - - repo: https://github.com/pycqa/isort - rev: 5.13.2 - hooks: - - id: isort - stages: [commit] - - - repo: https://github.com/psf/black - rev: 23.12.1 - hooks: - - id: black - stages: [commit] + - id: ruff-format - repo: https://github.com/pre-commit/mirrors-prettier rev: v4.0.0-alpha.8 diff --git a/Dockerfile b/Dockerfile index 20012fa6df2f6b83b5321f812bb4a61ee5ef1e5d..8ccc6d42858f3da2dcefd8b985965dd863fd2f3b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,12 +2,13 @@ FROM python:3.10 as tmp WORKDIR /tmp +RUN curl -sSL https://install.python-poetry.org | python - + ENV PATH="${PATH}:/root/.local/bin" COPY ./pyproject.toml ./poetry.lock* /tmp/ -RUN pip install poetry \ - && poetry config virtualenvs.in-project true \ - && poetry install --only main --no-interaction --no-ansi + +RUN poetry export -f requirements.txt --output requirements.txt --without-hashes FROM python:3.10-slim as app @@ -17,20 +18,8 @@ EXPOSE 2233 VOLUME /data -COPY --from=tmp /tmp/.venv /app/.venv - -COPY ./resources/fonts/* /usr/share/fonts/meme-fonts/ -RUN apt-get update \ - && apt-get install -y --no-install-recommends locales fontconfig fonts-noto-cjk fonts-noto-color-emoji gettext \ - && localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8 \ - && fc-cache -fv \ - && apt-get purge -y --auto-remove \ - && rm -rf /var/lib/apt/lists/* - ENV TZ=Asia/Shanghai \ LC_ALL=zh_CN.UTF-8 \ - PATH="/app/.venv/bin:${PATH}" \ - VIRTUAL_ENV="/app/.venv" \ LOAD_BUILTIN_MEMES=true \ MEME_DIRS="[\"/data/memes\"]" \ MEME_DISABLED_LIST="[]" \ @@ -40,12 +29,23 @@ ENV TZ=Asia/Shanghai \ BAIDU_TRANS_APIKEY="" \ LOG_LEVEL="INFO" +COPY --from=tmp /tmp/requirements.txt /app/requirements.txt + +COPY ./resources/fonts/* /usr/share/fonts/meme-fonts/ + +RUN apt-get update \ + && apt-get install -y --no-install-recommends locales fontconfig fonts-noto-color-emoji gettext \ + && localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8 \ + && fc-cache -fv \ + && apt-get purge -y --auto-remove \ + && rm -rf /var/lib/apt/lists/* \ + && pip install --no-cache-dir --upgrade -r /app/requirements.txt + COPY ./meme_generator /app/meme_generator COPY ./docker/config.toml.template /app/config.toml.template COPY ./docker/start.sh /app/start.sh -RUN mkdir -p /.config -RUN chmod -R 777 /.config RUN chmod +x /app/start.sh +RUN python -m meme_generator.cli CMD ["/app/start.sh"] diff --git a/Dockerfile.memebot b/Dockerfile.memebot new file mode 100644 index 0000000000000000000000000000000000000000..365aaec810b93349c338123c907c17a72fe07f08 --- /dev/null +++ b/Dockerfile.memebot @@ -0,0 +1,58 @@ +FROM python:3.10 as tmp + +WORKDIR /tmp + +RUN curl -sSL https://install.python-poetry.org | python - + +ENV PATH="${PATH}:/root/.local/bin" + +COPY ./pyproject.toml ./poetry.lock* /tmp/ + +RUN apt-get update \ + && apt-get install -y --no-install-recommends git \ + && poetry export -f requirements.txt --output requirements.txt --without-hashes \ + && git clone --depth=1 https://github.com/MeetWq/github-meme-bot + +FROM python:3.10-slim as app + +WORKDIR /app + +EXPOSE 2233 + +VOLUME /data + +ENV TZ=Asia/Shanghai \ + LC_ALL=zh_CN.UTF-8 \ + LOAD_BUILTIN_MEMES=true \ + MEME_DIRS="[\"/data/memes\"]" \ + MEME_DISABLED_LIST="[]" \ + GIF_MAX_SIZE=10.0 \ + GIF_MAX_FRAMES=100 \ + BAIDU_TRANS_APPID="" \ + BAIDU_TRANS_APIKEY="" \ + LOG_LEVEL="INFO" + +COPY --from=tmp /tmp/requirements.txt /app/requirements.txt +COPY --from=tmp /tmp/github-meme-bot/src /app/src +COPY --from=tmp /tmp/github-meme-bot/bot.py /app/bot.py +COPY --from=tmp /tmp/github-meme-bot/.env /app/.env + +COPY ./resources/fonts/* /usr/share/fonts/meme-fonts/ + +RUN apt-get update \ + && apt-get install -y --no-install-recommends locales fontconfig fonts-noto-color-emoji gettext \ + && localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8 \ + && fc-cache -fv \ + && apt-get purge -y --auto-remove \ + && rm -rf /var/lib/apt/lists/* \ + && pip install --no-cache-dir --upgrade -r /app/requirements.txt \ + && pip install --no-cache-dir --upgrade nonebot2 nonebot-adapter-github + +COPY ./meme_generator /app/meme_generator + +COPY ./docker/config.toml.template /app/config.toml.template +COPY ./docker/start_memebot.sh /app/start_memebot.sh +RUN chmod +x /app/start_memebot.sh +RUN python -m meme_generator.cli + +CMD ["/app/start_memebot.sh"] diff --git a/docker/start_memebot.sh b/docker/start_memebot.sh new file mode 100644 index 0000000000000000000000000000000000000000..1a3cc3c2fb2df9d879cfd74fd57122f51f70cbc4 --- /dev/null +++ b/docker/start_memebot.sh @@ -0,0 +1,7 @@ +#! /usr/bin/env bash + +mkdir -p ~/.config/meme_generator + +envsubst < /app/config.toml.template > ~/.config/meme_generator/config.toml + +exec python /app/bot.py diff --git a/meme_generator/app.py b/meme_generator/app.py index 20a27306f38d2e7ea575874a0ff7b061b00526a8..e14881c47f6b2e1ea6d004fe506853814adffbac 100644 --- a/meme_generator/app.py +++ b/meme_generator/app.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Literal, Optional, Tuple +from typing import Any, Literal, Optional import filetype from fastapi import Depends, FastAPI, Form, HTTPException, Response, UploadFile @@ -20,7 +20,7 @@ class MemeArgsResponse(BaseModel): type: str description: Optional[str] = None default: Optional[Any] = None - enum: Optional[List[Any]] = None + enum: Optional[list[Any]] = None class MemeParamsResponse(BaseModel): @@ -28,14 +28,14 @@ class MemeParamsResponse(BaseModel): max_images: int min_texts: int max_texts: int - default_texts: List[str] - args: List[MemeArgsResponse] + default_texts: list[str] + args: list[MemeArgsResponse] class MemeInfoResponse(BaseModel): key: str - keywords: List[str] - patterns: List[str] + keywords: list[str] + patterns: list[str] params: MemeParamsResponse @@ -56,11 +56,11 @@ def register_router(meme: Meme): @app.post(f"/memes/{meme.key}/") async def _( - images: List[UploadFile] = [], - texts: List[str] = meme.params_type.default_texts, + images: list[UploadFile] = [], + texts: list[str] = meme.params_type.default_texts, args: args_model = Depends(args_checker), # type: ignore ): - imgs: List[bytes] = [] + imgs: list[bytes] = [] for image in images: imgs.append(await image.read()) @@ -94,16 +94,16 @@ default_meme_list = [ class RenderMemeListRequest(BaseModel): - meme_list: List[MemeKeyWithProperties] = default_meme_list + meme_list: list[MemeKeyWithProperties] = default_meme_list order_direction: Literal["row", "column"] = "column" columns: int = 4 column_align: Literal["left", "center", "right"] = "left" - item_padding: Tuple[int, int] = (15, 2) - image_padding: Tuple[int, int] = (50, 50) + item_padding: tuple[int, int] = (15, 2) + image_padding: tuple[int, int] = (50, 50) bg_color: ColorType = "white" fontsize: int = 30 fontname: str = "" - fallback_fonts: List[str] = [] + fallback_fonts: list[str] = [] def register_routers(): @@ -158,7 +158,7 @@ def register_routers(): if meme.params_type.args_type else MemeArgsModel ) - properties: Dict[str, Dict[str, Any]] = ( + properties: dict[str, dict[str, Any]] = ( args_model.schema().get("properties", {}).copy() ) properties.pop("user_infos") @@ -198,7 +198,7 @@ def register_routers(): return Response(content=content, media_type=media_type) @app.post("/memes/{key}/parse_args") - async def _(key: str, args: List[str] = []): + async def _(key: str, args: list[str] = []): try: meme = get_meme(key) return meme.parse_args(args) diff --git a/meme_generator/cli.py b/meme_generator/cli.py index 3b87b432f4071b659857c33c520bd6a3dcd8bccc..557f710281d44b5f85d82623717d1d499a0ed3df 100644 --- a/meme_generator/cli.py +++ b/meme_generator/cli.py @@ -2,7 +2,7 @@ import asyncio import copy from argparse import ArgumentParser from pathlib import Path -from typing import Any, Dict, List +from typing import Any import filetype @@ -80,7 +80,7 @@ def meme_info(key: str) -> str: default_texts = ", ".join([f'"{text}"' for text in meme.params_type.default_texts]) - def arg_info(name: str, info: Dict[str, Any]) -> str: + def arg_info(name: str, info: dict[str, Any]) -> str: text = ( f' "{name}"\n' f" 描述:{info.get('description', '')}\n" @@ -94,7 +94,7 @@ def meme_info(key: str) -> str: if args := meme.params_type.args_type: model = args.model - properties: Dict[str, Dict[str, Any]] = model.schema().get("properties", {}) + properties: dict[str, dict[str, Any]] = model.schema().get("properties", {}) properties.pop("user_infos") args_info = "\n" + "\n".join( [arg_info(name, info) for name, info in properties.items()] @@ -134,7 +134,7 @@ def generate_meme_preview(key: str) -> str: def generate_meme( - key: str, images: List[str], texts: List[str], args: Dict[str, Any] + key: str, images: list[str], texts: list[str], args: dict[str, Any] ) -> str: try: meme = get_meme(key) @@ -180,8 +180,8 @@ def main(): kwargs = vars(args) kwargs.pop("handle") key: str = kwargs.pop("key") - images: List[str] = kwargs.pop("images") - texts: List[str] = kwargs.pop("texts") + images: list[str] = kwargs.pop("images") + texts: list[str] = kwargs.pop("texts") print(generate_meme(key, images, texts, kwargs)) # noqa: T201 elif handle in ["run", "start"]: diff --git a/meme_generator/config.py b/meme_generator/config.py index b361c9ab02c8142b80b2d2bd6a2289b33e058122..1bb8ea6994d70e84d481c724ea8ad7b570496dd1 100644 --- a/meme_generator/config.py +++ b/meme_generator/config.py @@ -1,6 +1,6 @@ import json from pathlib import Path -from typing import List, Optional, Union +from typing import Optional, Union import toml from pydantic import BaseModel, Extra @@ -12,13 +12,13 @@ config_file_path = get_config_file("config.toml") class MemeConfig(BaseModel): load_builtin_memes: bool = True - meme_dirs: List[Path] = [] - meme_disabled_list: List[str] = [] + meme_dirs: list[Path] = [] + meme_disabled_list: list[str] = [] class ResourceConfig(BaseModel): resource_url: Optional[str] = None - resource_urls: List[str] = [ + resource_urls: list[str] = [ "https://raw.githubusercontent.com/MeetWq/meme-generator/", "https://ghproxy.com/https://raw.githubusercontent.com/MeetWq/meme-generator/", "https://fastly.jsdelivr.net/gh/MeetWq/meme-generator@", diff --git a/meme_generator/dirs.py b/meme_generator/dirs.py index d03aeedb99eff29cc9c0a2f3e9c0a15b9c35781b..cecb6206f96919f32aa242f6ec0881a6df11ef38 100644 --- a/meme_generator/dirs.py +++ b/meme_generator/dirs.py @@ -23,7 +23,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ - import os import sys from pathlib import Path @@ -119,7 +118,7 @@ def user_config_dir(appname: str, roaming: bool = True) -> Path: # -- Windows support functions -- def _get_win_folder_from_registry( - csidl_name: Literal["CSIDL_APPDATA", "CSIDL_COMMON_APPDATA", "CSIDL_LOCAL_APPDATA"] + csidl_name: Literal["CSIDL_APPDATA", "CSIDL_COMMON_APPDATA", "CSIDL_LOCAL_APPDATA"], ) -> Path: """ This is a fallback technique at best. I'm not sure if using the @@ -143,7 +142,7 @@ def _get_win_folder_from_registry( def _get_win_folder_with_ctypes( - csidl_name: Literal["CSIDL_APPDATA", "CSIDL_COMMON_APPDATA", "CSIDL_LOCAL_APPDATA"] + csidl_name: Literal["CSIDL_APPDATA", "CSIDL_COMMON_APPDATA", "CSIDL_LOCAL_APPDATA"], ) -> Path: csidl_const = { "CSIDL_APPDATA": 26, diff --git a/meme_generator/download.py b/meme_generator/download.py index 6faa23f7c5150ec498fad093f6bf3c10a955d61c..967734fba35f5f07f653fa23fae3d4be55c49c60 100644 --- a/meme_generator/download.py +++ b/meme_generator/download.py @@ -3,7 +3,6 @@ import hashlib import json import time from pathlib import Path -from typing import List, Tuple import httpx from rich.progress import Progress @@ -18,13 +17,13 @@ def _resource_url(base_url: str, name: str) -> str: # https://github.com/mnixry/nonebot-plugin-gocqhttp/blob/main/nonebot_plugin_gocqhttp/process/download.py -async def get_fastest_mirror() -> List[str]: +async def get_fastest_mirror() -> list[str]: assert meme_config.resource.resource_urls, "No resource url specified." async def head_mirror(client: httpx.AsyncClient, base_url: str): begin_time = time.time() response = await client.head( - _resource_url(base_url, "resources/fonts/NotoSansSC-Regular.otf"), timeout=5 + _resource_url(base_url, "resources/fonts/NotoSansSC-Regular.ttf"), timeout=5 ) response.raise_for_status() elapsed_time = (time.time() - begin_time) * 1000 @@ -39,7 +38,7 @@ async def get_fastest_mirror() -> List[str]: return_exceptions=True, ) results = sorted( - (result for result in results if not isinstance(result, Exception)), + (result for result in results if not isinstance(result, BaseException)), key=lambda r: r["elapsed_time"], ) return [result["base_url"] for result in results] @@ -76,7 +75,7 @@ async def check_resources(): else: return - download_list: List[Tuple[Path, str]] = [] + download_list: list[tuple[Path, str]] = [] for resource in resource_list: file_name = str(resource["path"]) file_hash = str(resource["hash"]) diff --git a/meme_generator/manager.py b/meme_generator/manager.py index 78d1477ffdb9c7c0b7a7640e5e12ace363672680..a75ede0c7ad9965acf56553d7637a2960947b798 100644 --- a/meme_generator/manager.py +++ b/meme_generator/manager.py @@ -2,14 +2,14 @@ import importlib import importlib.util import pkgutil from pathlib import Path -from typing import Dict, List, Optional, Union +from typing import Optional, Union from .config import meme_config from .exception import NoSuchMeme from .log import logger from .meme import Meme, MemeArgsType, MemeFunction, MemeParamsType -_memes: Dict[str, Meme] = {} +_memes: dict[str, Meme] = {} def path_to_module_name(path: Path) -> str: @@ -64,10 +64,10 @@ def add_meme( max_images: int = 0, min_texts: int = 0, max_texts: int = 0, - default_texts: List[str] = [], + default_texts: list[str] = [], args_type: Optional[MemeArgsType] = None, - keywords: List[str] = [], - patterns: List[str] = [], + keywords: list[str] = [], + patterns: list[str] = [], ): if key in _memes: logger.warning(f'Meme with key "{key}" already exists!') @@ -96,9 +96,9 @@ def get_meme(key: str) -> Meme: return _memes[key] -def get_memes() -> List[Meme]: +def get_memes() -> list[Meme]: return list(_memes.values()) -def get_meme_keys() -> List[str]: +def get_meme_keys() -> list[str]: return list(_memes.keys()) diff --git a/meme_generator/meme.py b/meme_generator/meme.py index 632a622ce11b312cd150dc1738fa8159bd020b12..42033d04c8525fd489a2fd6f5d9d3346a5e017de 100644 --- a/meme_generator/meme.py +++ b/meme_generator/meme.py @@ -1,5 +1,6 @@ import copy from argparse import ArgumentError, ArgumentParser +from collections.abc import Awaitable from contextvars import ContextVar from dataclasses import dataclass, field from io import BytesIO @@ -7,13 +8,9 @@ from pathlib import Path from typing import ( IO, Any, - Awaitable, Callable, - Dict, - List, Literal, Optional, - Type, TypeVar, Union, cast, @@ -40,14 +37,14 @@ class UserInfo(BaseModel): class MemeArgsModel(BaseModel): - user_infos: List[UserInfo] = [] + user_infos: list[UserInfo] = [] ArgsModel = TypeVar("ArgsModel", bound=MemeArgsModel) MemeFunction = Union[ - Callable[[List[BuildImage], List[str], ArgsModel], BytesIO], - Callable[[List[BuildImage], List[str], ArgsModel], Awaitable[BytesIO]], + Callable[[list[BuildImage], list[str], ArgsModel], BytesIO], + Callable[[list[BuildImage], list[str], ArgsModel], Awaitable[BytesIO]], ] @@ -77,8 +74,8 @@ class MemeArgsParser(ArgumentParser): @dataclass class MemeArgsType: parser: MemeArgsParser - model: Type[MemeArgsModel] - instances: List[MemeArgsModel] = field(default_factory=list) + model: type[MemeArgsModel] + instances: list[MemeArgsModel] = field(default_factory=list) @dataclass @@ -87,7 +84,7 @@ class MemeParamsType: max_images: int = 0 min_texts: int = 0 max_texts: int = 0 - default_texts: List[str] = field(default_factory=list) + default_texts: list[str] = field(default_factory=list) args_type: Optional[MemeArgsType] = None @@ -96,15 +93,15 @@ class Meme: key: str function: MemeFunction params_type: MemeParamsType - keywords: List[str] = field(default_factory=list) - patterns: List[str] = field(default_factory=list) + keywords: list[str] = field(default_factory=list) + patterns: list[str] = field(default_factory=list) async def __call__( self, *, - images: Union[List[str], List[Path], List[bytes], List[BytesIO]] = [], - texts: List[str] = [], - args: Dict[str, Any] = {}, + images: Union[list[str], list[Path], list[bytes], list[BytesIO]] = [], + texts: list[str] = [], + args: dict[str, Any] = {}, ) -> BytesIO: if not ( self.params_type.min_images <= len(images) <= self.params_type.max_images @@ -128,12 +125,12 @@ class Meme: except ValidationError as e: raise ArgModelMismatch(self.key, str(e)) - imgs: List[BuildImage] = [] + imgs: list[BuildImage] = [] try: for image in images: if isinstance(image, bytes): image = BytesIO(image) - imgs.append(BuildImage.open(image)) + imgs.append(BuildImage.open(image)) # type: ignore except Exception as e: raise OpenImageFailed(str(e)) @@ -146,7 +143,7 @@ class Meme: else: return await run_sync(cast(Callable[..., BytesIO], self.function))(**values) - def parse_args(self, args: List[str] = []) -> Dict[str, Any]: + def parse_args(self, args: list[str] = []) -> dict[str, Any]: parser = ( copy.deepcopy(self.params_type.args_type.parser) if self.params_type.args_type @@ -163,7 +160,7 @@ class Meme: finally: parser_message.reset(t) - async def generate_preview(self, *, args: Dict[str, Any] = {}) -> BytesIO: + async def generate_preview(self, *, args: dict[str, Any] = {}) -> BytesIO: default_images = [random_image() for _ in range(self.params_type.min_images)] default_texts = ( self.params_type.default_texts.copy() @@ -175,7 +172,7 @@ class Meme: else [random_text() for _ in range(self.params_type.min_texts)] ) - async def _generate_preview(images: List[BytesIO], texts: List[str]): + async def _generate_preview(images: list[BytesIO], texts: list[str]): try: return await self.__call__(images=images, texts=texts, args=args) except TextOrNameNotEnough: diff --git a/meme_generator/memes/5000choyen/__init__.py b/meme_generator/memes/5000choyen/__init__.py index 2f25662279cef91e9c425fbd9f488b0cc3bf3939..0538bd2017a5f9e4d25f14be80bb9d1ae976adf4 100644 --- a/meme_generator/memes/5000choyen/__init__.py +++ b/meme_generator/memes/5000choyen/__init__.py @@ -1,5 +1,3 @@ -from typing import List, Tuple - from PIL.Image import Image as IMG from PIL.Image import Resampling, Transform from pil_utils import BuildImage, Text2Image @@ -8,13 +6,13 @@ from pil_utils.gradient import ColorStop, LinearGradient from meme_generator import add_meme -def fivethousand_choyen(images, texts: List[str], args): +def fivethousand_choyen(images, texts: list[str], args): fontsize = 200 fontname = "Noto Sans SC" text = texts[0] pos_x = 40 pos_y = 220 - imgs: List[Tuple[IMG, Tuple[int, int]]] = [] + imgs: list[tuple[IMG, tuple[int, int]]] = [] def transform(img: IMG) -> IMG: skew = 0.45 @@ -26,7 +24,7 @@ def fivethousand_choyen(images, texts: List[str], args): Resampling.BILINEAR, ) - def shift(t2m: Text2Image) -> Tuple[int, int]: + def shift(t2m: Text2Image) -> tuple[int, int]: return ( pos_x - t2m.lines[0].chars[0].stroke_width @@ -34,7 +32,7 @@ def fivethousand_choyen(images, texts: List[str], args): pos_y - t2m.lines[0].ascent, ) - def add_color_text(stroke_width: int, fill: str, pos: Tuple[int, int]): + def add_color_text(stroke_width: int, fill: str, pos: tuple[int, int]): t2m = Text2Image.from_text( text, fontsize, fontname=fontname, stroke_width=stroke_width, fill=fill ) @@ -43,9 +41,9 @@ def fivethousand_choyen(images, texts: List[str], args): def add_gradient_text( stroke_width: int, - dir: Tuple[int, int, int, int], - color_stops: List[Tuple[float, Tuple[int, int, int]]], - pos: Tuple[int, int], + dir: tuple[int, int, int, int], + color_stops: list[tuple[float, tuple[int, int, int]]], + pos: tuple[int, int], ): t2m = Text2Image.from_text( text, fontsize, fontname=fontname, stroke_width=stroke_width, fill="white" diff --git a/meme_generator/memes/ace_attorney_dialog/__init__.py b/meme_generator/memes/ace_attorney_dialog/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3106104d31f47824e79ee22d85ae70eca65790f7 --- /dev/null +++ b/meme_generator/memes/ace_attorney_dialog/__init__.py @@ -0,0 +1,119 @@ +import math +from pathlib import Path + +from pil_utils import BuildImage, Text2Image + +from meme_generator import add_meme +from meme_generator.exception import TextOverLength + +img_dir = Path(__file__).parent / "images" + + +def ace_attorney_dialog(images, texts: list[str], args): + def shadow_text(text: str, fontsize: int) -> BuildImage: + fontname = "PangMenZhengDao-Cu" + inner = Text2Image.from_text( + text, + fontsize, + fill="#e60012", + fontname=fontname, + stroke_width=4, + stroke_fill="#500000", + ).to_image() + shadow_width = 10 + shadow = Text2Image.from_text( + text, + fontsize, + fill="#500000", + fontname=fontname, + stroke_width=shadow_width, + stroke_fill="#500000", + ).to_image() + dy = 30 + dx = 15 + img = BuildImage.new( + "RGBA", (inner.width + dx + shadow_width, inner.height + dy + shadow_width) + ) + img.paste(shadow, (dx - shadow_width, dy - shadow_width), alpha=True) + img.paste(inner, (0, 0), alpha=True) + return img + + text = texts[0] + text_imgs: list[BuildImage] = [] + for char in text: + text_imgs.append(shadow_text(char, 650)) + + total_width = sum(img.width for img in text_imgs) + if total_width > 4000: + raise TextOverLength(text) + + def combine_text(text_imgs: list[BuildImage]) -> BuildImage: + ratio = 0.4 + text_w = sum(img.width for img in text_imgs) - sum( + round(img.width * ratio) for img in text_imgs[1:] + ) + text_h = max(img.height for img in text_imgs) + text_img = BuildImage.new("RGBA", (text_w, text_h)) + x = 0 + for img in text_imgs: + text_img.paste(img, (x, round((text_h - img.height) / 2)), alpha=True) + x += img.width - round(img.width * ratio) + return text_img + + frame = BuildImage.open(img_dir / "bubble.png") + mark = BuildImage.open(img_dir / "mark.png") + + if total_width <= 2000: + text_img = combine_text(text_imgs) + max_width = 900 + if total_width > max_width: + text_img = text_img.resize( + (max_width, round(max_width / text_img.width * text_img.height)) + ) + text_img = text_img.rotate(10, expand=True) + frame.paste( + text_img, + ( + round((frame.width - text_img.width) / 2), + round((frame.height - text_img.height) / 2), + ), + alpha=True, + ) + frame.paste(mark, (630, 230), alpha=True) + + else: + index = math.ceil(len(text_imgs) / 2) + text_img1 = combine_text(text_imgs[:index]) + text_img2 = combine_text(text_imgs[index:]) + ratio = 0.6 + text_img1 = text_img1.resize( + (round(text_img1.width * ratio), round(text_img1.height * ratio)) + ) + text_img2 = text_img2.resize( + (round(text_img2.width * ratio), round(text_img2.height * ratio)) + ) + text_img1 = text_img1.rotate(10, expand=True) + text_img2 = text_img2.rotate(10, expand=True) + frame.paste( + text_img1, + (round((frame.width - text_img1.width) / 2) - 50, 775 - text_img1.height), + alpha=True, + ) + frame.paste( + text_img2, + (round((frame.width - text_img2.width) / 2) + 50, 325), + alpha=True, + ) + frame.paste(mark, (680, 320), alpha=True) + + return frame.save_png() + + +add_meme( + "ace_attorney_dialog", + ace_attorney_dialog, + min_texts=1, + max_texts=1, + default_texts=["表情包制作"], + keywords=["逆转裁判气泡"], +) diff --git a/meme_generator/memes/ace_attorney_dialog/images/bubble.png b/meme_generator/memes/ace_attorney_dialog/images/bubble.png new file mode 100644 index 0000000000000000000000000000000000000000..22103960524900b425d1f96b0ef5dba930b63e32 --- /dev/null +++ b/meme_generator/memes/ace_attorney_dialog/images/bubble.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c762c91e86cddc92b04712d1c6d0c7156c55a7b81921df819c5c447418e6764 +size 61968 diff --git a/meme_generator/memes/ace_attorney_dialog/images/mark.png b/meme_generator/memes/ace_attorney_dialog/images/mark.png new file mode 100644 index 0000000000000000000000000000000000000000..316abb92e7c8bdc598855e5fb939e52bcb5a6025 --- /dev/null +++ b/meme_generator/memes/ace_attorney_dialog/images/mark.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b5880eff0ef9441f13e4b4f4587ba14323fac4b6631ac946d9934b33e2e5edc +size 22984 diff --git a/meme_generator/memes/acg_entrance/__init__.py b/meme_generator/memes/acg_entrance/__init__.py index ead2405cc677132f304515a38a4b3bf6113cd91c..64dba4be17aedddc80c86797ac453c0706512607 100644 --- a/meme_generator/memes/acg_entrance/__init__.py +++ b/meme_generator/memes/acg_entrance/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def acg_entrance(images: List[BuildImage], texts: List[str], args): +def acg_entrance(images: list[BuildImage], texts: list[str], args): text = texts[0] if texts else "走,跟我去二次元吧" frame = BuildImage.open(img_dir / "0.png") try: diff --git a/meme_generator/memes/add_chaos/__init__.py b/meme_generator/memes/add_chaos/__init__.py index 48c37f837af3cc93778d2d9d9e89047827940e18..b5ff99f0defdc5b3205b7f2c1ec04a36b4759042 100644 --- a/meme_generator/memes/add_chaos/__init__.py +++ b/meme_generator/memes/add_chaos/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def add_chaos(images: List[BuildImage], texts, args): +def add_chaos(images: list[BuildImage], texts, args): banner = BuildImage.open(img_dir / "0.png") def make(img: BuildImage) -> BuildImage: diff --git a/meme_generator/memes/addiction/__init__.py b/meme_generator/memes/addiction/__init__.py index 650ea6fa7fa2b58d42daa8a6e0514aea8c5c8a50..228a27ad569dfa4862296eef2fe4291d3768b5ba 100644 --- a/meme_generator/memes/addiction/__init__.py +++ b/meme_generator/memes/addiction/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def addiction(images: List[BuildImage], texts: List[str], args): +def addiction(images: list[BuildImage], texts: list[str], args): frame = BuildImage.open(img_dir / "0.png") if texts: diff --git a/meme_generator/memes/alike/__init__.py b/meme_generator/memes/alike/__init__.py index 658d2c2fa03958a9871b454b38b50b5f1afa437c..d17749f6f5eb022d8d0c4cfcaf48412b560a5c80 100644 --- a/meme_generator/memes/alike/__init__.py +++ b/meme_generator/memes/alike/__init__.py @@ -1,12 +1,10 @@ -from typing import List - from pil_utils import BuildImage from meme_generator import add_meme from meme_generator.utils import make_jpg_or_gif -def alike(images: List[BuildImage], texts, args): +def alike(images: list[BuildImage], texts, args): frame = BuildImage.new("RGBA", (470, 180), "white") frame.draw_text( (10, 10, 185, 140), "你怎么跟", max_fontsize=40, min_fontsize=30, halign="right" diff --git a/meme_generator/memes/always/__init__.py b/meme_generator/memes/always/__init__.py index 271c77fdfaaa7b86ea98714b12b267b56ed38155..4dc615c3927e5453e6cb072fb952d07526992e74 100644 --- a/meme_generator/memes/always/__init__.py +++ b/meme_generator/memes/always/__init__.py @@ -1,4 +1,4 @@ -from typing import List, Literal +from typing import Literal from pil_utils import BuildImage from pydantic import Field @@ -22,7 +22,9 @@ group.add_argument( default="normal", help=help, ) -group.add_argument("--circle", "/套娃", action="store_const", const="circle", dest="mode") +group.add_argument( + "--circle", "/套娃", action="store_const", const="circle", dest="mode" +) group.add_argument("--loop", "/循环", action="store_const", const="loop", dest="mode") @@ -90,7 +92,7 @@ def always_always(img: BuildImage, loop: bool = False): ) -def always(images: List[BuildImage], texts, args: Model): +def always(images: list[BuildImage], texts, args: Model): img = images[0] mode = args.mode diff --git a/meme_generator/memes/always_like/__init__.py b/meme_generator/memes/always_like/__init__.py index 55edf0349806ff39c085d517087ff5544d907615..4dc8ea1daca185beff461464ad66fd4ed9be31bd 100644 --- a/meme_generator/memes/always_like/__init__.py +++ b/meme_generator/memes/always_like/__init__.py @@ -1,6 +1,5 @@ import random from pathlib import Path -from typing import List from pil_utils import BuildImage, Text2Image @@ -10,7 +9,7 @@ from meme_generator.exception import TextOrNameNotEnough, TextOverLength img_dir = Path(__file__).parent / "images" -def always_like(images: List[BuildImage], texts: List[str], args: MemeArgsModel): +def always_like(images: list[BuildImage], texts: list[str], args: MemeArgsModel): names = [info.name for info in args.user_infos] if len(images) > len(texts) + len(names): diff --git a/meme_generator/memes/anti_kidnap/__init__.py b/meme_generator/memes/anti_kidnap/__init__.py index c29cb6339c7f5ea09d92f87a0fceb98d25e0f67c..d2e256ecb618a1922344f6b7f79f202cd1e93e12 100644 --- a/meme_generator/memes/anti_kidnap/__init__.py +++ b/meme_generator/memes/anti_kidnap/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def anti_kidnap(images: List[BuildImage], texts, args): +def anti_kidnap(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize((450, 450), keep_ratio=True) frame = BuildImage.open(img_dir / "0.png") frame.paste(img, (30, 78), below=True) diff --git a/meme_generator/memes/anya_suki/__init__.py b/meme_generator/memes/anya_suki/__init__.py index 1ed3aea45e5dc604e5081e4d4c0234b5ab5ebdc3..7d5d36d2d6800f579ad680b8cf6f6d2438b13d6d 100644 --- a/meme_generator/memes/anya_suki/__init__.py +++ b/meme_generator/memes/anya_suki/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def anya_suki(images: List[BuildImage], texts: List[str], args): +def anya_suki(images: list[BuildImage], texts: list[str], args): text = texts[0] if texts else "阿尼亚喜欢这个" frame = BuildImage.open(img_dir / "0.png") try: diff --git a/meme_generator/memes/applaud/__init__.py b/meme_generator/memes/applaud/__init__.py index d5ef0eb24c1fb13fd81ee8031c4e480391cc44ed..2f4ec0d690e16615dac614843d89ba05ffdb0622 100644 --- a/meme_generator/memes/applaud/__init__.py +++ b/meme_generator/memes/applaud/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,9 +9,9 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def applaud(images: List[BuildImage], texts, args): +def applaud(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square().resize((110, 110)) - frames: List[IMG] = [] + frames: list[IMG] = [] locs = [ (109, 102, 27, 17), (107, 105, 28, 15), diff --git a/meme_generator/memes/ascension/__init__.py b/meme_generator/memes/ascension/__init__.py index 933c575873e7af8e9fca21c857a2c19f99f0cbe1..bb9c2ed9a3dd387aeaada688fa4b7f44ebecd02d 100644 --- a/meme_generator/memes/ascension/__init__.py +++ b/meme_generator/memes/ascension/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def ascension(images, texts: List[str], args): +def ascension(images, texts: list[str], args): frame = BuildImage.open(img_dir / "0.png") text = f"你原本应该要去地狱的,但因为你生前{texts[0]},我们就当作你已经服完刑期了" try: diff --git a/meme_generator/memes/ask/__init__.py b/meme_generator/memes/ask/__init__.py index 71fd1828c3286eee2e2a4ad2884bdca84e88df11..2d7861dab7e50edb857806f420d5090414da82ee 100644 --- a/meme_generator/memes/ask/__init__.py +++ b/meme_generator/memes/ask/__init__.py @@ -1,5 +1,3 @@ -from typing import List - from PIL import ImageFilter from pil_utils import BuildImage, Text2Image from pil_utils.gradient import ColorStop, LinearGradient @@ -8,7 +6,7 @@ from meme_generator import MemeArgsModel, add_meme from meme_generator.exception import TextOrNameNotEnough, TextOverLength -def ask(images: List[BuildImage], texts: List[str], args: MemeArgsModel): +def ask(images: list[BuildImage], texts: list[str], args: MemeArgsModel): if not texts and not args.user_infos: raise TextOrNameNotEnough("ask") diff --git a/meme_generator/memes/back_to_work/__init__.py b/meme_generator/memes/back_to_work/__init__.py index 25bd82ef140677eb4463d51d07192c575c211d97..79f4ad48eaaf7cfa44ff071fca2c4e1fed6dd6fe 100644 --- a/meme_generator/memes/back_to_work/__init__.py +++ b/meme_generator/memes/back_to_work/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def back_to_work(images: List[BuildImage], texts, args): +def back_to_work(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") img = ( images[0].convert("RGBA").resize((220, 310), keep_ratio=True, direction="north") @@ -18,5 +17,9 @@ def back_to_work(images: List[BuildImage], texts, args): add_meme( - "back_to_work", back_to_work, min_images=1, max_images=1, keywords=["继续干活", "打工人"] + "back_to_work", + back_to_work, + min_images=1, + max_images=1, + keywords=["继续干活", "打工人"], ) diff --git a/meme_generator/memes/bad_news/__init__.py b/meme_generator/memes/bad_news/__init__.py index 9a56c6354289015f6404ee4ed77dce84a117d5e3..885fe488a7679fd321d0e9888523411511fcc2c4 100644 --- a/meme_generator/memes/bad_news/__init__.py +++ b/meme_generator/memes/bad_news/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def bad_news(images, texts: List[str], args): +def bad_news(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.png") try: diff --git a/meme_generator/memes/beat_head/__init__.py b/meme_generator/memes/beat_head/__init__.py index bc139b07ae703f255375b4fdd146adf55c16bbea..2d0dc566c0ed659109819d6a3f2022a4daf69f79 100644 --- a/meme_generator/memes/beat_head/__init__.py +++ b/meme_generator/memes/beat_head/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -11,11 +10,11 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def beat_head(images: List[BuildImage], texts: List[str], args): +def beat_head(images: list[BuildImage], texts: list[str], args): text = texts[0] if texts else "怎么说话的你" img = images[0].convert("RGBA") locs = [(160, 121, 76, 76), (172, 124, 69, 69), (208, 166, 52, 52)] - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(3): x, y, w, h = locs[i] head = img.resize((w, h), keep_ratio=True).circle() diff --git a/meme_generator/memes/beat_up/__init__.py b/meme_generator/memes/beat_up/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3ba83d2fecd87e3632d04298b5cdd0b695f6846c --- /dev/null +++ b/meme_generator/memes/beat_up/__init__.py @@ -0,0 +1,27 @@ +from pathlib import Path + +from PIL.Image import Image as IMG +from pil_utils import BuildImage + +from meme_generator import add_meme +from meme_generator.utils import save_gif + +img_dir = Path(__file__).parent / "images" + + +def beat_up(images: list[BuildImage], texts, args): + self_head = images[0].convert("RGBA").circle().resize((55, 55)) + user_head = images[1].convert("RGBA").circle().resize((45, 45)) + self_locs = [(100, 43), (110, 46), (101, 40)] + user_locs = [(99, 136), (99, 136), (89, 140)] + frames: list[IMG] = [] + for i in range(3): + frame = BuildImage.open(img_dir / f"{i}.png") + frame.paste(user_head, user_locs[i], alpha=True) + frame.paste(self_head, self_locs[i], alpha=True) + frames.append(frame.image) + + return save_gif(frames, 0.1) + + +add_meme("beat_up", beat_up, min_images=2, max_images=2, keywords=["揍"]) diff --git a/meme_generator/memes/beat_up/images/0.png b/meme_generator/memes/beat_up/images/0.png new file mode 100644 index 0000000000000000000000000000000000000000..fbbb288c9b786bb230bdd44e88eb7f731637cf30 --- /dev/null +++ b/meme_generator/memes/beat_up/images/0.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a60a42f56fcab0fff10d805716a05e4d5819b988975e5553c3a5b1a12ed6662f +size 81261 diff --git a/meme_generator/memes/beat_up/images/1.png b/meme_generator/memes/beat_up/images/1.png new file mode 100644 index 0000000000000000000000000000000000000000..9abc1bfc3508534fca64cce6fd75b9ee3a3034ef --- /dev/null +++ b/meme_generator/memes/beat_up/images/1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7aa42456a87f32d1033ea5d06634024e4dde96139a56eb8e383ff58ead97963c +size 85280 diff --git a/meme_generator/memes/beat_up/images/2.png b/meme_generator/memes/beat_up/images/2.png new file mode 100644 index 0000000000000000000000000000000000000000..3bab30f7d1533bb584de01f03f357810f0a90e44 --- /dev/null +++ b/meme_generator/memes/beat_up/images/2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d0c4704293099ef958d5320ea5831365ac186eebc9bd865e6d5a47910e294a94 +size 83550 diff --git a/meme_generator/memes/bite/__init__.py b/meme_generator/memes/bite/__init__.py index b04285449cce30c420ea7e822114af76abb6c4e3..103a4ee638e4644e9ae9d746ad752b8c139cef39 100644 --- a/meme_generator/memes/bite/__init__.py +++ b/meme_generator/memes/bite/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,9 +9,9 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def bite(images: List[BuildImage], texts, args): +def bite(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square() - frames: List[IMG] = [] + frames: list[IMG] = [] # fmt: off locs = [ (90, 90, 105, 150), (90, 83, 96, 172), (90, 90, 106, 148), diff --git a/meme_generator/memes/blood_pressure/__init__.py b/meme_generator/memes/blood_pressure/__init__.py index ae263919b2f352875ad353d397aba3f9b37e15e3..153fe8dd496ccc964d21344d17b0f307013c7567 100644 --- a/meme_generator/memes/blood_pressure/__init__.py +++ b/meme_generator/memes/blood_pressure/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def blood_pressure(images: List[BuildImage], texts, args): +def blood_pressure(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") def make(img: BuildImage) -> BuildImage: @@ -19,4 +18,6 @@ def blood_pressure(images: List[BuildImage], texts, args): return make_jpg_or_gif(images[0], make) -add_meme("blood_pressure", blood_pressure, min_images=1, max_images=1, keywords=["高血压"]) +add_meme( + "blood_pressure", blood_pressure, min_images=1, max_images=1, keywords=["高血压"] +) diff --git a/meme_generator/memes/bluearchive/__init__.py b/meme_generator/memes/bluearchive/__init__.py index f8d8213f016d838addc7eeb1417864040d06b2d6..9d2e2542b223b540aa0efc1ad23175364fb49153 100644 --- a/meme_generator/memes/bluearchive/__init__.py +++ b/meme_generator/memes/bluearchive/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from PIL.Image import Resampling, Transform @@ -12,7 +11,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def bluearchive(images, texts: List[str], args): +def bluearchive(images, texts: list[str], args): fontsize = 168 fontname = "Ro GSan Serif Std" fallback_fonts = ["Glow Sans SC"] + DEFAULT_FALLBACK_FONTS diff --git a/meme_generator/memes/bocchi_draft/__init__.py b/meme_generator/memes/bocchi_draft/__init__.py index e740c626395da18c79052b83ee0074b98f14d2c9..483e29dcf491fa7383f3b757ce407c69aba81eed 100644 --- a/meme_generator/memes/bocchi_draft/__init__.py +++ b/meme_generator/memes/bocchi_draft/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def bocchi_draft(images: List[BuildImage], texts, args): +def bocchi_draft(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize((350, 400), keep_ratio=True) params = [ (((54, 62), (353, 1), (379, 382), (1, 399)), (146, 173)), @@ -30,7 +29,7 @@ def bocchi_draft(images: List[BuildImage], texts, args): 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, ] # fmt: on - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(23): frame = BuildImage.open(img_dir / f"{i}.png") points, pos = params[idx[i]] @@ -39,4 +38,6 @@ def bocchi_draft(images: List[BuildImage], texts, args): return save_gif(frames, 0.08) -add_meme("bocchi_draft", bocchi_draft, min_images=1, max_images=1, keywords=["波奇手稿"]) +add_meme( + "bocchi_draft", bocchi_draft, min_images=1, max_images=1, keywords=["波奇手稿"] +) diff --git a/meme_generator/memes/bronya_holdsign/__init__.py b/meme_generator/memes/bronya_holdsign/__init__.py index 88477c851a82a4e6dda427495f4c45a4224894e6..a5bcd386aa692c0dedbd31e97a6c4f4add8a517b 100644 --- a/meme_generator/memes/bronya_holdsign/__init__.py +++ b/meme_generator/memes/bronya_holdsign/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def bronya_holdsign(images, texts: List[str], args): +def bronya_holdsign(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.jpg") try: diff --git a/meme_generator/memes/bubble_tea/__init__.py b/meme_generator/memes/bubble_tea/__init__.py index 129e2fe9e596ba88260bb7fa68e57af58119751e..70f0317ab975e172f7b0c806359b7caeef478eb8 100644 --- a/meme_generator/memes/bubble_tea/__init__.py +++ b/meme_generator/memes/bubble_tea/__init__.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import List, Literal +from typing import Literal from PIL.Image import Transpose from pil_utils import BuildImage @@ -26,15 +26,19 @@ group.add_argument( group.add_argument( "--right", "/右手", action="store_const", const="right", dest="position" ) -group.add_argument("--left", "/左手", action="store_const", const="left", dest="position") -group.add_argument("--both", "/双手", action="store_const", const="both", dest="position") +group.add_argument( + "--left", "/左手", action="store_const", const="left", dest="position" +) +group.add_argument( + "--both", "/双手", action="store_const", const="both", dest="position" +) class Model(MemeArgsModel): position: Literal["right", "left", "both"] = Field("right", description=help) -def bubble_tea(images: List[BuildImage], texts, args: Model): +def bubble_tea(images: list[BuildImage], texts, args: Model): frame = images[0].convert("RGBA").resize((500, 500), keep_ratio=True) bubble_tea = BuildImage.open(img_dir / "0.png") position = args.position diff --git a/meme_generator/memes/call_110/__init__.py b/meme_generator/memes/call_110/__init__.py index 241f6fcc37209a66dbd767b6630a211065f6780d..87a3e94fccbebd937500cfbd1f272c31c499393b 100644 --- a/meme_generator/memes/call_110/__init__.py +++ b/meme_generator/memes/call_110/__init__.py @@ -1,11 +1,9 @@ -from typing import List - from pil_utils import BuildImage from meme_generator import add_meme -def call_110(images: List[BuildImage], texts, args): +def call_110(images: list[BuildImage], texts, args): img1 = images[0].convert("RGBA").square().resize((250, 250)) img0 = images[1].convert("RGBA").square().resize((250, 250)) diff --git a/meme_generator/memes/caoshen_bite/__init__.py b/meme_generator/memes/caoshen_bite/__init__.py index ebae6800a42ea8b8b708525129952b713b569979..4c19df1f1568fd0915dfe54ab84c640e263b7a56 100644 --- a/meme_generator/memes/caoshen_bite/__init__.py +++ b/meme_generator/memes/caoshen_bite/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def caoshen_bite(images: List[BuildImage], texts, args): +def caoshen_bite(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize((160, 140), keep_ratio=True) # fmt: off locs = [ @@ -22,7 +21,7 @@ def caoshen_bite(images: List[BuildImage], texts, args): (122, 351, 159, 129), (122, 353, 159, 127), (123, 355, 158, 125), ] # fmt: on - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(38): frame = BuildImage.open(img_dir / f"{i}.png") x, y, w, h = locs[i % len(locs)] diff --git a/meme_generator/memes/capoo_draw/__init__.py b/meme_generator/memes/capoo_draw/__init__.py index da3c138d52e7f8ff8a311816bcf6fc629264738d..b015e5d6bd4e7296280333f0a0a04abfe4e977e1 100644 --- a/meme_generator/memes/capoo_draw/__init__.py +++ b/meme_generator/memes/capoo_draw/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def capoo_draw(images: List[BuildImage], texts, args): +def capoo_draw(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize((175, 120), keep_ratio=True) params = ( (((27, 0), (207, 12), (179, 142), (0, 117)), (30, 16)), @@ -21,7 +20,7 @@ def capoo_draw(images: List[BuildImage], texts, args): points, pos = params[i] raw_frames[4 + i].paste(img.perspective(points), pos, below=True) - frames: List[IMG] = [] + frames: list[IMG] = [] frames.append(raw_frames[0].image) for i in range(4): frames.append(raw_frames[1].image) diff --git a/meme_generator/memes/capoo_rip/__init__.py b/meme_generator/memes/capoo_rip/__init__.py index 5711280bc1c3fd1efed76725ff6698e7813067c1..976eddd099e6720a34786a8853275fcd4b86a363 100644 --- a/meme_generator/memes/capoo_rip/__init__.py +++ b/meme_generator/memes/capoo_rip/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def capoo_rip(images: List[BuildImage], texts, args): +def capoo_rip(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize((150, 100), keep_ratio=True) img_left = img.crop((0, 0, 75, 100)) img_right = img.crop((75, 0, 150, 100)) @@ -40,7 +39,7 @@ def capoo_rip(images: List[BuildImage], texts, args): raw_frames[i + 6].paste(img_left.perspective(points1), pos1, below=True) raw_frames[i + 6].paste(img_right.perspective(points2), pos2, below=True) - new_frames: List[BuildImage] = [] + new_frames: list[BuildImage] = [] for i in range(3): new_frames += raw_frames[0:3] new_frames += raw_frames[3:] diff --git a/meme_generator/memes/capoo_rub/__init__.py b/meme_generator/memes/capoo_rub/__init__.py index 4f25149fd03fce16ff8dba66670a422ebb3381fc..77bd6dbc342cd76f53e932b36a989d09396a1d12 100644 --- a/meme_generator/memes/capoo_rub/__init__.py +++ b/meme_generator/memes/capoo_rub/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,9 +9,9 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def capoo_rub(images: List[BuildImage], texts, args): +def capoo_rub(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square().resize((180, 180)) - frames: List[IMG] = [] + frames: list[IMG] = [] locs = [ (178, 184, 78, 260), (178, 174, 84, 269), @@ -27,4 +26,6 @@ def capoo_rub(images: List[BuildImage], texts, args): return save_gif(frames, 0.1) -add_meme("capoo_rub", capoo_rub, min_images=1, max_images=1, keywords=["咖波蹭", "咖波贴"]) +add_meme( + "capoo_rub", capoo_rub, min_images=1, max_images=1, keywords=["咖波蹭", "咖波贴"] +) diff --git a/meme_generator/memes/capoo_say/__init__.py b/meme_generator/memes/capoo_say/__init__.py index 8cfe2c9a7a75e57197336fa1a2313c463e70e21f..56ccc13a83c3fd020cb0a6b95ffae0365d89e49d 100644 --- a/meme_generator/memes/capoo_say/__init__.py +++ b/meme_generator/memes/capoo_say/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -11,7 +10,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def capoo_say_one_loop(text: str) -> List[IMG]: +def capoo_say_one_loop(text: str) -> list[IMG]: text_frame = BuildImage.new("RGBA", (80, 80)) try: text_frame.draw_text( @@ -39,7 +38,7 @@ def capoo_say_one_loop(text: str) -> List[IMG]: None, ] - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(10): frame = BuildImage.open(img_dir / f"{i}.png") param = params[i] @@ -52,7 +51,7 @@ def capoo_say_one_loop(text: str) -> List[IMG]: return frames -def capoo_say(images, texts: List[str], args): +def capoo_say(images, texts: list[str], args): frames = sum([capoo_say_one_loop(text) for text in texts], []) return save_gif(frames, 0.1) diff --git a/meme_generator/memes/capoo_strike/__init__.py b/meme_generator/memes/capoo_strike/__init__.py index f19055d85fcab12b981bd39a043aff88b768df6a..739d6efc15d382234fa9ed5409c0d3ef4f093c80 100644 --- a/meme_generator/memes/capoo_strike/__init__.py +++ b/meme_generator/memes/capoo_strike/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import FrameAlignPolicy, Maker, make_gif_or_combined_g img_dir = Path(__file__).parent / "images" -def capoo_strike(images: List[BuildImage], texts, args): +def capoo_strike(images: list[BuildImage], texts, args): params = ( (((0, 4), (153, 0), (138, 105), (0, 157)), (28, 47)), (((1, 13), (151, 0), (130, 104), (0, 156)), (28, 48)), diff --git a/meme_generator/memes/captain/__init__.py b/meme_generator/memes/captain/__init__.py index 0256186fa6a9a0df8a394086e5b11cee6e87a0f3..1aa6db32d27c94755e7350ac6c254bff9d4ea5fd 100644 --- a/meme_generator/memes/captain/__init__.py +++ b/meme_generator/memes/captain/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def captain(images: List[BuildImage], texts, args): +def captain(images: list[BuildImage], texts, args): if len(images) == 2: images.append(images[-1]) diff --git a/meme_generator/memes/certificate/__init__.py b/meme_generator/memes/certificate/__init__.py index c93148311bf7590c90a350a9ea5c11ede7446557..965f8e26c1e71e7ca72567f2e392a6f1ca7a464e 100644 --- a/meme_generator/memes/certificate/__init__.py +++ b/meme_generator/memes/certificate/__init__.py @@ -1,6 +1,5 @@ from datetime import datetime from pathlib import Path -from typing import List import dateparser from pil_utils import BuildImage @@ -20,7 +19,7 @@ class Model(MemeArgsModel): img_dir = Path(__file__).parent / "images" -def certificate(images, texts: List[str], args: Model): +def certificate(images, texts: list[str], args: Model): time = datetime.now() if args.time and (parsed_time := dateparser.parse(args.time)): time = parsed_time @@ -61,7 +60,9 @@ def certificate(images, texts: List[str], args: Model): try: frame.draw_text( (450, 850, 2270, 1080), - texts[3] if len(texts) >= 4 else "  在本学年第一学期中表现优秀,被我校决定评为", + texts[3] + if len(texts) >= 4 + else "  在本学年第一学期中表现优秀,被我校决定评为", allow_wrap=True, max_fontsize=80, min_fontsize=40, diff --git a/meme_generator/memes/charpic/__init__.py b/meme_generator/memes/charpic/__init__.py index ee8f7bc6f491de848290b8453d20746657649b09..448bed9b41c3d481ac7638275b74796541f4b799 100644 --- a/meme_generator/memes/charpic/__init__.py +++ b/meme_generator/memes/charpic/__init__.py @@ -1,5 +1,3 @@ -from typing import List - from PIL import Image, ImageDraw from pil_utils import BuildImage from pil_utils.fonts import Font @@ -8,7 +6,7 @@ from meme_generator import add_meme from meme_generator.utils import make_jpg_or_gif -def charpic(images: List[BuildImage], texts, args): +def charpic(images: list[BuildImage], texts, args): img = images[0] str_map = "@@$$&B88QMMGW##EE93SPPDOOU**==()+^,\"--''. " num = len(str_map) diff --git a/meme_generator/memes/chase_train/__init__.py b/meme_generator/memes/chase_train/__init__.py index 3a3d2b69958eae4be6afbe627c713b2459db87b1..ca780a6f7a13e7a13d5dc8deb2692961b7083a55 100644 --- a/meme_generator/memes/chase_train/__init__.py +++ b/meme_generator/memes/chase_train/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,9 +9,9 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def chase_train(images: List[BuildImage], texts, args): +def chase_train(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square().resize((42, 42)) - frames: List[IMG] = [] + frames: list[IMG] = [] # fmt: off locs = [ (35, 34, 128, 44), (35, 33, 132, 40), (33, 34, 133, 36), (33, 38, 135, 41), @@ -56,5 +55,9 @@ def chase_train(images: List[BuildImage], texts, args): add_meme( - "chase_train", chase_train, min_images=1, max_images=1, keywords=["追列车", "追火车"] + "chase_train", + chase_train, + min_images=1, + max_images=1, + keywords=["追列车", "追火车"], ) diff --git a/meme_generator/memes/china_flag/__init__.py b/meme_generator/memes/china_flag/__init__.py index f02e2724b4702ed900a8885df7ea7c587a6f0aa3..b8a9b3501e892ce122692dfa112d7f45040a8d11 100644 --- a/meme_generator/memes/china_flag/__init__.py +++ b/meme_generator/memes/china_flag/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def china_flag(images: List[BuildImage], texts, args): +def china_flag(images: list[BuildImage], texts, args): img = images[0].convert("RGBA") frame = BuildImage.open(img_dir / "0.png") frame.paste(img.resize(frame.size, keep_ratio=True), below=True) diff --git a/meme_generator/memes/clown/__init__.py b/meme_generator/memes/clown/__init__.py index c0f50bac82b991771f158df1b288a92da9f7c914..7ac633b76f1415ad6b15945df50a9ebc3d1c22b4 100644 --- a/meme_generator/memes/clown/__init__.py +++ b/meme_generator/memes/clown/__init__.py @@ -1,6 +1,5 @@ from dataclasses import dataclass from pathlib import Path -from typing import List, Tuple from pil_utils import BuildImage from pydantic import Field @@ -15,9 +14,9 @@ PERSON_PATH = IMG_DIR / "person.png" @dataclass class PicInfo: frame_path: Path - avatar_size: Tuple[int, int] + avatar_size: tuple[int, int] avatar_rotate: int - avatar_left_center: Tuple[int, int] # top right 直接算镜像 + avatar_left_center: tuple[int, int] # top right 直接算镜像 CIRCLE_INFO = PicInfo(CIRCLE_PATH, (554, 442), 26, (153, 341)) @@ -34,7 +33,7 @@ class Model(MemeArgsModel): person: bool = Field(False, description=HELP_PERSON) -def clown(images: List[BuildImage], texts, args: Model): +def clown(images: list[BuildImage], texts, args: Model): info = PERSON_INFO if args.person else CIRCLE_INFO avatar = images[0].convert("RGBA").resize(info.avatar_size, keep_ratio=True) frame = BuildImage.open(info.frame_path).convert("RGBA") diff --git a/meme_generator/memes/confuse/__init__.py b/meme_generator/memes/confuse/__init__.py index 8bed6616b7c63a19eda84c1e429ea5486031b322..3fb570204919c33e6482a5e33cb6a2dea6d128ea 100644 --- a/meme_generator/memes/confuse/__init__.py +++ b/meme_generator/memes/confuse/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import FrameAlignPolicy, Maker, make_gif_or_combined_g img_dir = Path(__file__).parent / "images" -def confuse(images: List[BuildImage], texts, args): +def confuse(images: list[BuildImage], texts, args): img_w = min(images[0].width, 500) def maker(i: int) -> Maker: diff --git a/meme_generator/memes/coupon/__init__.py b/meme_generator/memes/coupon/__init__.py index 4616e994a866738cb5249ee1fe3e71a697f7c8bd..736fd816a0d04dc15ef47d118516d5af041f6bdc 100644 --- a/meme_generator/memes/coupon/__init__.py +++ b/meme_generator/memes/coupon/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def coupon(images: List[BuildImage], texts: List[str], args: MemeArgsModel): +def coupon(images: list[BuildImage], texts: list[str], args: MemeArgsModel): img = images[0].convert("RGBA").circle().resize((60, 60)) name = args.user_infos[0].name if args.user_infos else "" text = (texts[0] if texts else f"{name}陪睡券") + "\n(永久有效)" diff --git a/meme_generator/memes/cover_face/__init__.py b/meme_generator/memes/cover_face/__init__.py index b28aa8e58319f5b20dd3594a7678137f240bf851..208be3e2f26621ea33d16c8dcef55117180e237c 100644 --- a/meme_generator/memes/cover_face/__init__.py +++ b/meme_generator/memes/cover_face/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def cover_face(images: List[BuildImage], texts, args): +def cover_face(images: list[BuildImage], texts, args): points = ((15, 15), (448, 0), (445, 456), (0, 465)) img = images[0].convert("RGBA").square().resize((450, 450)).perspective(points) frame = BuildImage.open(img_dir / "0.png") diff --git a/meme_generator/memes/crawl/__init__.py b/meme_generator/memes/crawl/__init__.py index f4aced4e57c3232e75044fe47fbeb0b076805081..67fc6f23a1e3b626f1dc9492b8a33d185c871c31 100644 --- a/meme_generator/memes/crawl/__init__.py +++ b/meme_generator/memes/crawl/__init__.py @@ -1,6 +1,5 @@ import random from pathlib import Path -from typing import List from pil_utils import BuildImage from pydantic import Field @@ -20,7 +19,7 @@ class Model(MemeArgsModel): number: int = Field(0, description=help) -def crawl(images: List[BuildImage], texts: List[str], args: Model): +def crawl(images: list[BuildImage], texts: list[str], args: Model): total_num = 92 if 1 <= args.number <= total_num: num = args.number diff --git a/meme_generator/memes/cyan/__init__.py b/meme_generator/memes/cyan/__init__.py index 62e511971bf32f7c928b17dc977ab3df4066544b..b0863382bbf782a88c6abbea9f7b1901c31e771a 100644 --- a/meme_generator/memes/cyan/__init__.py +++ b/meme_generator/memes/cyan/__init__.py @@ -1,11 +1,9 @@ -from typing import List - from pil_utils import BuildImage from meme_generator import add_meme -def cyan(images: List[BuildImage], texts, args): +def cyan(images: list[BuildImage], texts, args): color = (78, 114, 184) frame = images[0].convert("RGB").square().resize((500, 500)).color_mask(color) frame.draw_text( diff --git a/meme_generator/memes/daynight/__init__.py b/meme_generator/memes/daynight/__init__.py index 8c6ac0ee11bc80a66e51217c567f2f32fffb9d0b..9ddfc9b99cb73d8b5dd452c796b220d259af6565 100644 --- a/meme_generator/memes/daynight/__init__.py +++ b/meme_generator/memes/daynight/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def daynight(images: List[BuildImage], texts, args): +def daynight(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize((333, 360), keep_ratio=True) img_ = images[1].convert("RGBA").resize((333, 360), keep_ratio=True) frame = BuildImage.open(img_dir / "0.png") @@ -17,4 +16,6 @@ def daynight(images: List[BuildImage], texts, args): return frame.save_jpg() -add_meme("daynight", daynight, min_images=2, max_images=2, keywords=["白天黑夜", "白天晚上"]) +add_meme( + "daynight", daynight, min_images=2, max_images=2, keywords=["白天黑夜", "白天晚上"] +) diff --git a/meme_generator/memes/decent_kiss/__init__.py b/meme_generator/memes/decent_kiss/__init__.py index d08423bcd0a1197f3439882b022dfe2ba61eebf1..3ddcbd35700980633a91ac14f3289f4874ad8c05 100644 --- a/meme_generator/memes/decent_kiss/__init__.py +++ b/meme_generator/memes/decent_kiss/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,11 +7,13 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def decent_kiss(images: List[BuildImage], texts, args): +def decent_kiss(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize((589, 340), keep_ratio=True) frame = BuildImage.open(img_dir / "0.png") frame.paste(img, (0, 91), below=True) return frame.save_jpg() -add_meme("decent_kiss", decent_kiss, min_images=1, max_images=1, keywords=["像样的亲亲"]) +add_meme( + "decent_kiss", decent_kiss, min_images=1, max_images=1, keywords=["像样的亲亲"] +) diff --git a/meme_generator/memes/dianzhongdian/__init__.py b/meme_generator/memes/dianzhongdian/__init__.py index 22afc158c4335191c3aecdc15bfbe96df6a0e639..557b509bd317c487c498be34150411a864a6d427 100644 --- a/meme_generator/memes/dianzhongdian/__init__.py +++ b/meme_generator/memes/dianzhongdian/__init__.py @@ -1,5 +1,3 @@ -from typing import List - from pil_utils import BuildImage from meme_generator import add_meme @@ -42,7 +40,7 @@ def _dianzhongdian(img: BuildImage, text: str, trans: str): return frame.save_jpg() -async def dianzhongdian(images: List[BuildImage], texts: List[str], args): +async def dianzhongdian(images: list[BuildImage], texts: list[str], args): if len(texts) == 1: text = texts[0] trans = await translate(text, lang_to="jp") diff --git a/meme_generator/memes/dinosaur/__init__.py b/meme_generator/memes/dinosaur/__init__.py index 6c870345c1814114e837e237ace51e05d6d7f6d2..9142e502b9f3c83256a78b277c941772e7ac9e01 100644 --- a/meme_generator/memes/dinosaur/__init__.py +++ b/meme_generator/memes/dinosaur/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def dinosaur(images: List[BuildImage], texts, args): +def dinosaur(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") def make(img: BuildImage) -> BuildImage: diff --git a/meme_generator/memes/distracted/__init__.py b/meme_generator/memes/distracted/__init__.py index eb52ad5156ca1277639a3bd27c14960662605635..1fada404bed3d990e78d6ca9058d3976b203eced 100644 --- a/meme_generator/memes/distracted/__init__.py +++ b/meme_generator/memes/distracted/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def distracted(images: List[BuildImage], texts, args): +def distracted(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "1.png") label = BuildImage.open(img_dir / "0.png") diff --git a/meme_generator/memes/divorce/__init__.py b/meme_generator/memes/divorce/__init__.py index c2150680c935cdb262d5f7159dd8bd7638e7759f..7d640a90dd69423430b8a5a74f80be611539cb77 100644 --- a/meme_generator/memes/divorce/__init__.py +++ b/meme_generator/memes/divorce/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,11 +7,13 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def divorce(images: List[BuildImage], texts, args): +def divorce(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") img = images[0].convert("RGBA").resize(frame.size, keep_ratio=True) frame.paste(img, below=True) return frame.save_jpg() -add_meme("divorce", divorce, min_images=1, max_images=1, keywords=["离婚协议", "离婚申请"]) +add_meme( + "divorce", divorce, min_images=1, max_images=1, keywords=["离婚协议", "离婚申请"] +) diff --git a/meme_generator/memes/dog_dislike/__init__.py b/meme_generator/memes/dog_dislike/__init__.py index 556ca18a3d95b3445d7b798d493fa452fdcad877..b8e293698b527c27aa022960100cb479ea28bdbd 100644 --- a/meme_generator/memes/dog_dislike/__init__.py +++ b/meme_generator/memes/dog_dislike/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -20,7 +19,7 @@ class Model(MemeArgsModel): circle: bool = Field(False, description=help) -def dog_dislike(images: List[BuildImage], texts: List[str], args: Model): +def dog_dislike(images: list[BuildImage], texts: list[str], args: Model): location = [ (36, 408), (36, 410), @@ -60,7 +59,7 @@ def dog_dislike(images: List[BuildImage], texts: List[str], args: Model): head = images[0].convert("RGBA").resize((122, 122), keep_ratio=True) if args.circle: head = head.circle() - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(34): frame = BuildImage.open(img_dir / f"{i}.png") frame.paste(head, location[i], alpha=True) diff --git a/meme_generator/memes/dog_of_vtb/__init__.py b/meme_generator/memes/dog_of_vtb/__init__.py index a4a98cff0f4c1091f671956131599590751bed12..e790a796032f927a86d0a86bbab72d4361b7ed2d 100644 --- a/meme_generator/memes/dog_of_vtb/__init__.py +++ b/meme_generator/memes/dog_of_vtb/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def dog_of_vtb(images: List[BuildImage], texts, args): +def dog_of_vtb(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") def make(img: BuildImage) -> BuildImage: diff --git a/meme_generator/memes/dont_go_near/__init__.py b/meme_generator/memes/dont_go_near/__init__.py index 8675f01518412a8c0dd98887ed15586000308f03..218370b7f759d4c8c175c494ef789be3032a595f 100644 --- a/meme_generator/memes/dont_go_near/__init__.py +++ b/meme_generator/memes/dont_go_near/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def dont_go_near(images: List[BuildImage], texts, args): +def dont_go_near(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") def make(img: BuildImage) -> BuildImage: @@ -19,4 +18,6 @@ def dont_go_near(images: List[BuildImage], texts, args): return make_jpg_or_gif(images[0], make) -add_meme("dont_go_near", dont_go_near, min_images=1, max_images=1, keywords=["不要靠近"]) +add_meme( + "dont_go_near", dont_go_near, min_images=1, max_images=1, keywords=["不要靠近"] +) diff --git a/meme_generator/memes/dont_touch/__init__.py b/meme_generator/memes/dont_touch/__init__.py index 22743662ed38de955166deb43852194e470e78e6..9caa532ef92ddc6582c47e3c8f21eae729c5108b 100644 --- a/meme_generator/memes/dont_touch/__init__.py +++ b/meme_generator/memes/dont_touch/__init__.py @@ -1,6 +1,5 @@ import random from pathlib import Path -from typing import List, Tuple from PIL.Image import Image as IMG from PIL.Image import Palette @@ -12,23 +11,23 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def get_dominant_colors(img: IMG) -> List[Tuple[int, int, int]]: +def get_dominant_colors(img: IMG) -> list[tuple[int, int, int]]: img = img.convert("P", palette=Palette.ADAPTIVE, colors=20) palette = img.getpalette() assert palette - color_indexs = sorted(img.getcolors(), reverse=True) + color_indexs = sorted(img.getcolors(), reverse=True) # type: ignore colors = [tuple(palette[i * 3 : i * 3 + 3]) for _, i in color_indexs] colors = list( filter(lambda c: c[0] * 0.299 + c[1] * 0.578 + c[2] * 0.114 < 200, colors) ) - return colors + return colors # type: ignore -def dont_touch(images: List[BuildImage], texts, args): +def dont_touch(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") mask = BuildImage.open(img_dir / "mask.png").convert("L") - def paste_random_blocks(img: BuildImage, colors: List[Tuple[int, int, int]]): + def paste_random_blocks(img: BuildImage, colors: list[tuple[int, int, int]]): x1, y1, x2, y2 = 200, 300, 400, 650 block_locs = [] for _ in range(150): diff --git a/meme_generator/memes/douyin/__init__.py b/meme_generator/memes/douyin/__init__.py index abed8dfa3fdc600f09971ee479f8facad0c164cd..cefbd52c6916f215aa08af43b509fc582bce69e9 100644 --- a/meme_generator/memes/douyin/__init__.py +++ b/meme_generator/memes/douyin/__init__.py @@ -1,6 +1,5 @@ import math import random -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage, Text2Image @@ -9,7 +8,7 @@ from meme_generator import add_meme from meme_generator.utils import save_gif -def douyin(images, texts: List[str], args): +def douyin(images, texts: list[str], args): text = texts[0] text = " ".join(text.splitlines()) fontsize = 200 @@ -33,7 +32,7 @@ def douyin(images, texts: List[str], args): frame_num = 10 devide_num = 6 seed = 20 * 0.05 - frames: List[IMG] = [] + frames: list[IMG] = [] for _ in range(frame_num): new_frame = frame.copy() h_seeds = [ diff --git a/meme_generator/memes/eat/__init__.py b/meme_generator/memes/eat/__init__.py index 066a7278ac3c849938eb54d0353bbd0217c1e0d5..1c4737357618671144d8553361e479eb4a4635a7 100644 --- a/meme_generator/memes/eat/__init__.py +++ b/meme_generator/memes/eat/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def eat(images: List[BuildImage], texts, args): +def eat(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square().resize((34, 34)) frames = [] for i in range(3): diff --git a/meme_generator/memes/fanatic/__init__.py b/meme_generator/memes/fanatic/__init__.py index 66cbfcfffa3901e0992421d7012fdd1a4378b6b4..ab6f2f55d9e1ca23d1f976a34db86f6c8944af3e 100644 --- a/meme_generator/memes/fanatic/__init__.py +++ b/meme_generator/memes/fanatic/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def fanatic(images, texts: List[str], args): +def fanatic(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.jpg") try: diff --git a/meme_generator/memes/father_work/__init__.py b/meme_generator/memes/father_work/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..5ce98fa0cb91c765b25f9960170b028419fe5ced --- /dev/null +++ b/meme_generator/memes/father_work/__init__.py @@ -0,0 +1,44 @@ +from pathlib import Path + +from pil_utils import BuildImage + +from meme_generator import add_meme +from meme_generator.exception import TextOverLength +from meme_generator.utils import make_jpg_or_gif + +img_dir = Path(__file__).parent / "images" + + +def father_work(images: list[BuildImage], texts: list[str], args): + frame = BuildImage.open(img_dir / "0.png") + text = texts[0] if texts else "此处添加文字" + try: + frame.draw_text( + (195, frame.height - 110, frame.width - 10, frame.height - 20), + text, + min_fontsize=10, + max_fontsize=50, + fill="black", + allow_wrap=True, + lines_align="center", + ) + except ValueError: + raise TextOverLength(text) + + def make(img: BuildImage) -> BuildImage: + img = img.convert("RGBA").resize((230, 120), keep_ratio=True, inside=True) + return frame.copy().paste(img, (252, 142), alpha=True) + + return make_jpg_or_gif(images[0], make) + + +add_meme( + "father_work", + father_work, + min_images=1, + max_images=1, + min_texts=0, + max_texts=1, + default_texts=["此处添加文字"], + keywords=["闭嘴", "我爸爸"], +) diff --git a/meme_generator/memes/father_work/images/0.png b/meme_generator/memes/father_work/images/0.png new file mode 100644 index 0000000000000000000000000000000000000000..82c35000b7a9df4d1ff60d62bb189677758dd6cd --- /dev/null +++ b/meme_generator/memes/father_work/images/0.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7f3c35eb8847c83a340ff935041372c97f933d932a894144e2890fa0672714f +size 157621 diff --git a/meme_generator/memes/fencing/__init__.py b/meme_generator/memes/fencing/__init__.py index dfe29c480f9d348db6719c6f545244f19b0ba7c4..0cb016f8ac2724411a3b157e01f39423a767c431 100644 --- a/meme_generator/memes/fencing/__init__.py +++ b/meme_generator/memes/fencing/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def fencing(images: List[BuildImage], texts, args): +def fencing(images: list[BuildImage], texts, args): self_head = images[0].convert("RGBA").circle().resize((27, 27)) user_head = images[1].convert("RGBA").circle().resize((27, 27)) # fmt: off @@ -25,7 +24,7 @@ def fencing(images: List[BuildImage], texts, args): (30, 9), (17, 6), (12, 8), (11, 7), (8, 6), (-2, 10), (4, 9) ] # fmt: on - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(19): frame = BuildImage.open(img_dir / f"{i}.png") frame.paste(user_head, user_locs[i], alpha=True) diff --git a/meme_generator/memes/fight_with_sunuo/__init__.py b/meme_generator/memes/fight_with_sunuo/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..75b1ee4fd31416a1367a745d5ccb8b05d12d0972 --- /dev/null +++ b/meme_generator/memes/fight_with_sunuo/__init__.py @@ -0,0 +1,27 @@ +from pathlib import Path + +from pil_utils import BuildImage + +from meme_generator import add_meme +from meme_generator.utils import make_jpg_or_gif + +img_dir = Path(__file__).parent / "images" + + +def fight_with_sunuo(images: list[BuildImage], texts, args): + frame = BuildImage.open(img_dir / "0.png") + + def make(img: BuildImage) -> BuildImage: + img = img.convert("L").resize((565, 1630), keep_ratio=True) + return frame.copy().paste(img, (0, 245), below=True) + + return make_jpg_or_gif(images[0], make) + + +add_meme( + "fight_with_sunuo", + fight_with_sunuo, + min_images=1, + max_images=1, + keywords=["我打宿傩", "我打宿傩吗"], +) diff --git a/meme_generator/memes/fight_with_sunuo/images/0.png b/meme_generator/memes/fight_with_sunuo/images/0.png new file mode 100644 index 0000000000000000000000000000000000000000..df1749b48ea4f83fda811a54f4980bd530001981 --- /dev/null +++ b/meme_generator/memes/fight_with_sunuo/images/0.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0667a0400b67a8714a6765d7963c70bbb6819d7bd6be0b2a35aa915f2de4ca08 +size 989041 diff --git a/meme_generator/memes/fill_head/__init__.py b/meme_generator/memes/fill_head/__init__.py index 8deaee3d5f51be19e198292857cfb87866a4887f..5799cae3608dfdfb4424fe0be6609867f3a41726 100644 --- a/meme_generator/memes/fill_head/__init__.py +++ b/meme_generator/memes/fill_head/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def fill_head(images: List[BuildImage], texts: List[str], args: MemeArgsModel): +def fill_head(images: list[BuildImage], texts: list[str], args: MemeArgsModel): name = texts[0] if texts else (args.user_infos[0].name if args.user_infos else "它") text = f"满脑子都是{name}" frame = BuildImage.open(img_dir / "0.jpg") diff --git a/meme_generator/memes/find_chips/__init__.py b/meme_generator/memes/find_chips/__init__.py index 837504f347601f3ea0cf0eb01dc9d168ea0974e7..9226246a3c286af8fc83f8bd6f8b091382969dd1 100644 --- a/meme_generator/memes/find_chips/__init__.py +++ b/meme_generator/memes/find_chips/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List, Tuple from pil_utils import BuildImage @@ -9,10 +8,10 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def find_chips(images, texts: List[str], args): +def find_chips(images, texts: list[str], args): frame = BuildImage.open(img_dir / "0.jpg") - def draw(pos: Tuple[float, float, float, float], text: str): + def draw(pos: tuple[float, float, float, float], text: str): try: frame.draw_text( pos, text, max_fontsize=30, min_fontsize=12, allow_wrap=True diff --git a/meme_generator/memes/firefly_holdsign/__init__.py b/meme_generator/memes/firefly_holdsign/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..43dfb1307720943aa9a006ffbfcbae0288b1e95a --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/__init__.py @@ -0,0 +1,84 @@ +import random +from pathlib import Path + +from pil_utils import BuildImage +from pydantic import Field + +from meme_generator import MemeArgsModel, MemeArgsParser, MemeArgsType, add_meme +from meme_generator.exception import TextOverLength + +img_dir = Path(__file__).parent / "images" + + +help = "图片编号,范围为 1~21" + +parser = MemeArgsParser() +parser.add_argument("-n", "--number", type=int, default=0, help=help) + + +class Model(MemeArgsModel): + number: int = Field(0, description=help) + + +def firefly_holdsign(images, texts: list[str], args: Model): + text = texts[0] + total_num = 21 + if 1 <= args.number <= total_num: + num = args.number + else: + num = random.randint(1, total_num) + + params = [ + ((300, 200), (144, 322), ((0, 66), (276, 0), (319, 178), (43, 244))), + ((300, 250), (-46, -50), ((0, 83), (312, 0), (348, 243), (46, 314))), + ((300, 150), (106, 351), ((0, 0), (286, 0), (276, 149), (12, 149))), + ((250, 200), (245, -6), ((31, 0), (288, 49), (256, 239), (0, 190))), + ((500, 200), (0, 0), ((0, 0), (492, 0), (462, 198), (25, 198))), + ((350, 150), (74, 359), ((0, 52), (345, 0), (364, 143), (31, 193))), + ((270, 200), (231, -9), ((31, 0), (305, 49), (270, 245), (0, 192))), + ((350, 150), (64, 340), ((0, 44), (345, 0), (358, 153), (34, 197))), + ((230, 100), (57, 261), ((10, 0), (243, 38), (222, 132), (0, 99))), + ((240, 150), (-24, -20), ((0, 32), (235, 0), (254, 146), (24, 182))), + ((230, 140), (133, -35), ((40, 0), (267, 68), (227, 203), (0, 133))), + ((169, 124), (107, 236), ((0, 0), (169, 0), (169, 124), (0, 124))), + ((210, 140), (156, -7), ((24, 0), (227, 32), (204, 172), (0, 136))), + ((250, 123), (53, 237), ((0, 3), (250, 0), (250, 123), (0, 123))), + ((200, 140), (168, -9), ((29, 0), (222, 40), (192, 177), (0, 135))), + ((256, 96), (50, 264), ((0, 0), (256, 0), (256, 96), (0, 96))), + ((120, 200), (174, 130), ((116, 0), (240, 67), (117, 269), (0, 195))), + ((250, 140), (-42, -27), ((0, 77), (244, 0), (288, 132), (42, 210))), + ((230, 130), (-64, -42), ((0, 110), (229, 0), (294, 126), (64, 245))), + ((183, 133), (0, 227), ((0, 0), (183, 9), (183, 133), (0, 133))), + ((255, 106), (50, 254), ((2, 4), (256, 0), (257, 106), (0, 106))), + ] + size, loc, points = params[num - 1] + frame = BuildImage.open(img_dir / f"{num:02d}.png") + text_img = BuildImage.new("RGBA", size) + padding = 10 + try: + text_img.draw_text( + (padding, padding, size[0] - padding, size[1] - padding), + text, + max_fontsize=80, + min_fontsize=30, + allow_wrap=True, + lines_align="center", + spacing=10, + fontname="FZShaoEr-M11S", + fill="#3b0b07", + ) + except ValueError: + raise TextOverLength(text) + frame.paste(text_img.perspective(points), loc, alpha=True) + return frame.save_png() + + +add_meme( + "firefly_holdsign", + firefly_holdsign, + min_texts=1, + max_texts=1, + default_texts=["我超爱你"], + args_type=MemeArgsType(parser, Model), + keywords=["流萤举牌"], +) diff --git a/meme_generator/memes/firefly_holdsign/images/01.png b/meme_generator/memes/firefly_holdsign/images/01.png new file mode 100644 index 0000000000000000000000000000000000000000..1ec0d14e3df2e989f4710bf608c296ca15614e4e --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/01.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ede28860d0bae275a454e9bd6b394a89eef02c154d520522017e9eee4b13343a +size 183670 diff --git a/meme_generator/memes/firefly_holdsign/images/02.png b/meme_generator/memes/firefly_holdsign/images/02.png new file mode 100644 index 0000000000000000000000000000000000000000..d5cc5ecd683de6d2bd7583af28c5900d90a07d6d --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/02.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:adccdfc24190de91c9ad8608a4acc9f66f1cfd94e0a0db70634b0908d51b9b38 +size 136052 diff --git a/meme_generator/memes/firefly_holdsign/images/03.png b/meme_generator/memes/firefly_holdsign/images/03.png new file mode 100644 index 0000000000000000000000000000000000000000..34dd151da001c5e69065ce13de2483f34f6ea3de --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/03.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b71d9baee2399eb6a4ecf0ec6402bb2286a4dfeb6c5accacdcb6952a0a74e88 +size 170232 diff --git a/meme_generator/memes/firefly_holdsign/images/04.png b/meme_generator/memes/firefly_holdsign/images/04.png new file mode 100644 index 0000000000000000000000000000000000000000..3851c47340c03354771c14c847d98a2680be067d --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/04.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14a13c6f6c5c2b5b3c7207f64b75124cef135528dc4b48b135fab1677da54d7b +size 202794 diff --git a/meme_generator/memes/firefly_holdsign/images/05.png b/meme_generator/memes/firefly_holdsign/images/05.png new file mode 100644 index 0000000000000000000000000000000000000000..f8760643f9ebaee6f4334c579b764bde6b1f3eb6 --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/05.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c207ae21e500a804a7ca83da5379bcb86d36ef2344726dc7433b39850dc731d2 +size 128707 diff --git a/meme_generator/memes/firefly_holdsign/images/06.png b/meme_generator/memes/firefly_holdsign/images/06.png new file mode 100644 index 0000000000000000000000000000000000000000..b9857c59638322d5c4f5eeec7c34e875047cc647 --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/06.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86e9a610d1cbe4f1be1ee2174ea0f11838fb6e2adc2a094c1cdc6dce36832569 +size 154067 diff --git a/meme_generator/memes/firefly_holdsign/images/07.png b/meme_generator/memes/firefly_holdsign/images/07.png new file mode 100644 index 0000000000000000000000000000000000000000..9ae20052bbaba9b084547bb59abbde5bfeba8d2b --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/07.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71b4887cdff4e8442a489b2b523a85dfd6426a444283c9a894a14150a26d18b5 +size 190342 diff --git a/meme_generator/memes/firefly_holdsign/images/08.png b/meme_generator/memes/firefly_holdsign/images/08.png new file mode 100644 index 0000000000000000000000000000000000000000..bbf5886a1bc984649b275368153af1c2774fc9d7 --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/08.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ec0f4369cc0dc711a1d7e47304768999f7dd85ba4d3ba8c7e7f0b3c530c3ed5 +size 163038 diff --git a/meme_generator/memes/firefly_holdsign/images/09.png b/meme_generator/memes/firefly_holdsign/images/09.png new file mode 100644 index 0000000000000000000000000000000000000000..1de65948ab03b1a4f6f5ce7a30ddbd15aca5e3dd --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/09.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:381af8f2b911d55acbe0ac1202e4e433b55634b8fa0d5ade355dc9cebf0182f0 +size 159075 diff --git a/meme_generator/memes/firefly_holdsign/images/10.png b/meme_generator/memes/firefly_holdsign/images/10.png new file mode 100644 index 0000000000000000000000000000000000000000..972ad3bd58ee87b413de1a66ed57c966ca9823cb --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/10.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6effa6dd524e8bc464f664801c5293a248813be2975e396e43ec871defe7cf90 +size 152028 diff --git a/meme_generator/memes/firefly_holdsign/images/11.png b/meme_generator/memes/firefly_holdsign/images/11.png new file mode 100644 index 0000000000000000000000000000000000000000..f30f316eaeeaccdd64355bfb52d2c413bf9aa7bb --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/11.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d565f111a5a962a386513493671d1edd7bc2a91a1a6d72a437916c21e9d78a79 +size 158935 diff --git a/meme_generator/memes/firefly_holdsign/images/12.png b/meme_generator/memes/firefly_holdsign/images/12.png new file mode 100644 index 0000000000000000000000000000000000000000..0b690e438ac11443e737a1ac2a9f7d7b0fc2bb03 --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/12.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0fdc0d81ddb276f0f76989bacf69567bd3e7d8472b2d9b7a2024ee358104d37e +size 158923 diff --git a/meme_generator/memes/firefly_holdsign/images/13.png b/meme_generator/memes/firefly_holdsign/images/13.png new file mode 100644 index 0000000000000000000000000000000000000000..89298783266ab4588cd7eaead985008aa4274a67 --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/13.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92ba8e1d75f29762a2760ae95480fe0a2fb7da2778bda0ce028dfdda89945704 +size 153224 diff --git a/meme_generator/memes/firefly_holdsign/images/14.png b/meme_generator/memes/firefly_holdsign/images/14.png new file mode 100644 index 0000000000000000000000000000000000000000..ba577b26bb18752a222ab158f563ed750049a18e --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/14.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfdeda317b1544476daf5660888c7d7f1c789bebf28b9223d483fa6ec6f8af4f +size 124140 diff --git a/meme_generator/memes/firefly_holdsign/images/15.png b/meme_generator/memes/firefly_holdsign/images/15.png new file mode 100644 index 0000000000000000000000000000000000000000..786a09aee160d7a1b496a0065983dab76beab68d --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/15.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5ceab93df3c9dc9170e61d5954514b58d55bee536c9530a5baaf6f385335d7e +size 159207 diff --git a/meme_generator/memes/firefly_holdsign/images/16.png b/meme_generator/memes/firefly_holdsign/images/16.png new file mode 100644 index 0000000000000000000000000000000000000000..2c3127c0ee51ff656f3307dbdf75e56c6d99f568 --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/16.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83183bda881f0b7d7e5fa4796818ff215a927c0798e2a7e76733cc9864da4f17 +size 147663 diff --git a/meme_generator/memes/firefly_holdsign/images/17.png b/meme_generator/memes/firefly_holdsign/images/17.png new file mode 100644 index 0000000000000000000000000000000000000000..f9807e5601aa9be5979853e749e8c658fcfc2a56 --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/17.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc65510c63b92dc56455172ba34c442efd8f7693e125f129ecf675c1dd86fc2c +size 160749 diff --git a/meme_generator/memes/firefly_holdsign/images/18.png b/meme_generator/memes/firefly_holdsign/images/18.png new file mode 100644 index 0000000000000000000000000000000000000000..595a86051295b5f97e74e61d73ee97006ff94e14 --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/18.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f958c121aee4768dbd30eef2c847252c396ac9116b89dba1b42c86ca8fcaf5a3 +size 153216 diff --git a/meme_generator/memes/firefly_holdsign/images/19.png b/meme_generator/memes/firefly_holdsign/images/19.png new file mode 100644 index 0000000000000000000000000000000000000000..d5342d0a61a069d6cea3af9ec0731056a217f6d9 --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/19.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06c7f5869e885e59a99b2758f31e176fdb6cc658dadcaf1cc536472da649cb79 +size 155161 diff --git a/meme_generator/memes/firefly_holdsign/images/20.png b/meme_generator/memes/firefly_holdsign/images/20.png new file mode 100644 index 0000000000000000000000000000000000000000..0f58b86d538da29f4f5c54270a56acefb1f28961 --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/20.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6851274ef987e1e1eb816db19a913ea43a25c416e97828cfb172ce9faa2ae60 +size 142941 diff --git a/meme_generator/memes/firefly_holdsign/images/21.png b/meme_generator/memes/firefly_holdsign/images/21.png new file mode 100644 index 0000000000000000000000000000000000000000..cfab2e260f717d7c1800bea0102abf354db9115d --- /dev/null +++ b/meme_generator/memes/firefly_holdsign/images/21.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99e4d71327c545c66b93b3bf57c635be67c3539f2e6490a3293ab863d6e71505 +size 149052 diff --git a/meme_generator/memes/flash_blind/__init__.py b/meme_generator/memes/flash_blind/__init__.py index f639e288b10ec7949409809f34e48a7a770a440f..fc7a02818ca574ec442b5d8bf4582af92e6923fb 100644 --- a/meme_generator/memes/flash_blind/__init__.py +++ b/meme_generator/memes/flash_blind/__init__.py @@ -1,5 +1,3 @@ -from typing import List - from PIL import ImageOps from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -9,9 +7,9 @@ from meme_generator.exception import TextOverLength from meme_generator.utils import save_gif -def flash_blind(images: List[BuildImage], texts: List[str], args): +def flash_blind(images: list[BuildImage], texts: list[str], args): img = images[0].convert("RGB").resize_width(500) - frames: List[IMG] = [] + frames: list[IMG] = [] frames.append(img.image) frames.append(ImageOps.invert(img.image)) img_enlarge = img.resize_canvas((450, img.height * 450 // 500)).resize( diff --git a/meme_generator/memes/follow/__init__.py b/meme_generator/memes/follow/__init__.py index e71a0b030d5c3eb89a46e19a7a7b2c784d084dc0..f63664c51b9cfe7d103849982c3ce8f775ac5b2b 100644 --- a/meme_generator/memes/follow/__init__.py +++ b/meme_generator/memes/follow/__init__.py @@ -1,12 +1,10 @@ -from typing import List - from pil_utils import BuildImage, Text2Image from meme_generator import MemeArgsModel, add_meme from meme_generator.exception import TextOverLength -def follow(images: List[BuildImage], texts: List[str], args: MemeArgsModel): +def follow(images: list[BuildImage], texts: list[str], args: MemeArgsModel): img = images[0].circle().resize((200, 200)) if texts: diff --git a/meme_generator/memes/frieren_take/__init__.py b/meme_generator/memes/frieren_take/__init__.py index 82376333f8a3fda2ea07ca1995e05d9d58cd1669..edbebe4db3e8d399d752e0609e5edc73b22e8eb1 100644 --- a/meme_generator/memes/frieren_take/__init__.py +++ b/meme_generator/memes/frieren_take/__init__.py @@ -1,16 +1,41 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage +from pydantic import Field -from meme_generator import add_meme +from meme_generator import MemeArgsModel, MemeArgsParser, MemeArgsType, add_meme +from meme_generator.exception import TextOverLength from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" +help = "是否使用默认文字" +default_text = "所谓的男人啊,只要送他们这种东西就会很开心" -def frieren_take(images: List[BuildImage], texts, args): +parser = MemeArgsParser(prefix_chars="-/") +parser.add_argument("-d", "--default", "/默认", action="store_true", help=help) + + +class Model(MemeArgsModel): + default: bool = Field(False, description=help) + + +def frieren_take(images: list[BuildImage], texts: list[str], args: Model): frame = BuildImage.open(img_dir / "0.png") + text = default_text if args.default else texts[0] if texts else None + if text: + try: + frame.draw_text( + (100, frame.height - 120, frame.width - 100, frame.height), + text, + max_fontsize=50, + min_fontsize=20, + fill="white", + stroke_fill="black", + stroke_ratio=0.05, + ) + except ValueError: + raise TextOverLength(text) def make(img: BuildImage) -> BuildImage: img = img.convert("RGBA").resize((102, 108), keep_ratio=True) @@ -19,4 +44,13 @@ def frieren_take(images: List[BuildImage], texts, args): return make_jpg_or_gif(images[0], make) -add_meme("frieren_take", frieren_take, min_images=1, max_images=1, keywords=["芙莉莲拿"]) +add_meme( + "frieren_take", + frieren_take, + min_images=1, + max_images=1, + max_texts=1, + default_texts=[default_text], + args_type=MemeArgsType(parser, Model, [Model(default=False), Model(default=True)]), + keywords=["芙莉莲拿"], +) diff --git a/meme_generator/memes/funny_mirror/__init__.py b/meme_generator/memes/funny_mirror/__init__.py index 5f9f425588845831be7dd284e2f3a1beb4af4f69..07e06868361cd7f82e5612aed1dff578602ddbed 100644 --- a/meme_generator/memes/funny_mirror/__init__.py +++ b/meme_generator/memes/funny_mirror/__init__.py @@ -1,5 +1,3 @@ -from typing import List - from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -7,9 +5,9 @@ from meme_generator import add_meme from meme_generator.utils import save_gif -def funny_mirror(images: List[BuildImage], texts, args): +def funny_mirror(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square().resize((500, 500)) - frames: List[IMG] = [img.image] + frames: list[IMG] = [img.image] coeffs = [0.01, 0.03, 0.05, 0.08, 0.12, 0.17, 0.23, 0.3, 0.4, 0.6] borders = [25, 52, 67, 83, 97, 108, 118, 128, 138, 148] for i in range(10): diff --git a/meme_generator/memes/garbage/__init__.py b/meme_generator/memes/garbage/__init__.py index c0c75d8c4055c555419af21fece78e12e3da94c6..642bc6600416e1a8d02f714bac2498f222e7cf5d 100644 --- a/meme_generator/memes/garbage/__init__.py +++ b/meme_generator/memes/garbage/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def garbage(images: List[BuildImage], texts, args): +def garbage(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square().resize((79, 79)) # fmt: off locs = ( @@ -19,7 +18,7 @@ def garbage(images: List[BuildImage], texts, args): (37, 67), (37, 67), (39, 69), (37, 70), (37, 70)] ) # fmt: on - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(25): frame = BuildImage.open(img_dir / f"{i}.png") frame.paste(img, locs[i], below=True) diff --git a/meme_generator/memes/genshin_start/__init__.py b/meme_generator/memes/genshin_start/__init__.py index 577b8ea1c978b9912a42ed5d9f61c6ee8ad4d9e5..050d0d74f27f9500b74fffacc97752fc54c32202 100644 --- a/meme_generator/memes/genshin_start/__init__.py +++ b/meme_generator/memes/genshin_start/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def genshin_start(images: List[BuildImage], texts: List[str], args): +def genshin_start(images: list[BuildImage], texts: list[str], args): frame = BuildImage.open(img_dir / "0.png") if texts: text = texts[0] diff --git a/meme_generator/memes/gif_subtitle/__init__.py b/meme_generator/memes/gif_subtitle/__init__.py index 11de55ac9e503f777f7fc6580708bd10437096fc..1452cf195018e11cc46cf82f0914c2d1eabf8a73 100644 --- a/meme_generator/memes/gif_subtitle/__init__.py +++ b/meme_generator/memes/gif_subtitle/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List, Tuple from pil_utils import BuildImage @@ -12,15 +11,16 @@ img_dir = Path(__file__).parent / "images" def make_gif( key: str, - texts: List[str], - pieces: Tuple[Tuple[int, int], ...], + texts: list[str], + pieces: tuple[tuple[int, int], ...], fontsize: int = 20, padding_x: int = 5, padding_y: int = 5, ): img = BuildImage.open(img_dir / f"{key}.gif").image - frames: List[BuildImage] = [] - for i in range(img.n_frames): + frames: list[BuildImage] = [] + n_frames = getattr(img, "n_frames", 1) + for i in range(n_frames): img.seek(i) frames.append(BuildImage(img.convert("RGB"))) @@ -46,12 +46,12 @@ def make_gif( def add_gif_meme( key: str, - keywords: List[str], - pieces: Tuple[Tuple[int, int], ...], - examples: Tuple[str, ...], + keywords: list[str], + pieces: tuple[tuple[int, int], ...], + examples: tuple[str, ...], **kwargs, ): - def gif_func(images, texts: List[str], args): + def gif_func(images, texts: list[str], args): return make_gif(key, texts, pieces, **kwargs) text_num = len(pieces) @@ -94,7 +94,14 @@ add_gif_meme( "qiegewala", ["切格瓦拉"], ((0, 15), (16, 31), (31, 38), (38, 48), (49, 68), (68, 86)), - ("没有钱啊 肯定要做的啊", "不做的话没有钱用", "那你不会去打工啊", "有手有脚的", "打工是不可能打工的", "这辈子不可能打工的"), + ( + "没有钱啊 肯定要做的啊", + "不做的话没有钱用", + "那你不会去打工啊", + "有手有脚的", + "打工是不可能打工的", + "这辈子不可能打工的", + ), ) add_gif_meme( @@ -141,7 +148,12 @@ add_gif_meme( "wunian", ["五年怎么过的"], ((11, 20), (35, 50), (59, 77), (82, 95)), - ("五年", "你知道我这五年是怎么过的吗", "我每天躲在家里玩贪玩蓝月", "你知道有多好玩吗"), + ( + "五年", + "你知道我这五年是怎么过的吗", + "我每天躲在家里玩贪玩蓝月", + "你知道有多好玩吗", + ), fontsize=16, ) @@ -149,5 +161,10 @@ add_gif_meme( "maikease", ["麦克阿瑟说"], ((0, 22), (24, 46), (48, 70), (72, 84)), - ("美国前五星上将麦克阿瑟", "曾这样评价道", "如果让我去阻止xxx", "那么我宁愿去阻止上帝"), + ( + "美国前五星上将麦克阿瑟", + "曾这样评价道", + "如果让我去阻止xxx", + "那么我宁愿去阻止上帝", + ), ) diff --git a/meme_generator/memes/good_news/__init__.py b/meme_generator/memes/good_news/__init__.py index 18137eda7e8099b2550557021e75e854f54a4d4f..064b0dc93aa2b7ccb421d5730334a20b7357d3cd 100644 --- a/meme_generator/memes/good_news/__init__.py +++ b/meme_generator/memes/good_news/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def good_news(images, texts: List[str], args): +def good_news(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.jpg") try: diff --git a/meme_generator/memes/google/__init__.py b/meme_generator/memes/google/__init__.py index 2e0544d44ba347a347f97f8bd017a3295d08d3c1..f39d428a373a19f801270cf6ebe27808d4f549b1 100644 --- a/meme_generator/memes/google/__init__.py +++ b/meme_generator/memes/google/__init__.py @@ -1,11 +1,9 @@ -from typing import List - from pil_utils import BuildImage, Text2Image from meme_generator import add_meme -def google(images, texts: List[str], args): +def google(images, texts: list[str], args): text = texts[0] text = " ".join(text.splitlines()) colors = ["#4285f4", "#db4437", "#f4b400", "#4285f4", "#0f9d58", "#db4437"] diff --git a/meme_generator/memes/guichu/__init__.py b/meme_generator/memes/guichu/__init__.py index e7281b4b484206fc09f9aeeab3a8f6727bc7362a..0f17f72a4c934feaec26cbf1d26f94d796715479 100644 --- a/meme_generator/memes/guichu/__init__.py +++ b/meme_generator/memes/guichu/__init__.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Literal, NamedTuple, Tuple +from typing import Literal, NamedTuple from PIL.Image import Image as IMG from PIL.Image import Transpose @@ -20,7 +20,9 @@ group.add_argument( default="left", help=help, ) -group.add_argument("--left", "/左", action="store_const", const="left", dest="direction") +group.add_argument( + "--left", "/左", action="store_const", const="left", dest="direction" +) group.add_argument( "--right", "/右", action="store_const", const="right", dest="direction" ) @@ -36,18 +38,18 @@ class Model(MemeArgsModel): ) -def guichu(images: List[BuildImage], texts, args: Model): +def guichu(images: list[BuildImage], texts, args: Model): img = images[0].convert("RGBA") img_w, img_h = img.size class Mode(NamedTuple): method: Transpose - size1: Tuple[int, int, int, int] - pos1: Tuple[int, int] - size2: Tuple[int, int, int, int] - pos2: Tuple[int, int] + size1: tuple[int, int, int, int] + pos1: tuple[int, int] + size2: tuple[int, int, int, int] + pos2: tuple[int, int] - modes: Dict[str, Mode] = { + modes: dict[str, Mode] = { "left": Mode( Transpose.FLIP_LEFT_RIGHT, (0, 0, img_w // 2, img_h), @@ -88,7 +90,7 @@ def guichu(images: List[BuildImage], texts, args: Model): img_symmetric.copy().resize_width(img_w * 2), (-img_w // 2, -img_h // 2) ) - frames: List[IMG] = [] + frames: list[IMG] = [] frames += ( ([img.image] * 3 + [img_flip.image] * 3) * 3 + [img.image, img_flip.image] * 3 diff --git a/meme_generator/memes/gun/__init__.py b/meme_generator/memes/gun/__init__.py index 59ef415204ee6d88dba5d2ecf6e474b815e47d1e..08acb4ce9497844a3c64590c89b4557b01a4cafa 100644 --- a/meme_generator/memes/gun/__init__.py +++ b/meme_generator/memes/gun/__init__.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import List, Literal +from typing import Literal from PIL.Image import Transpose from pil_utils import BuildImage @@ -23,18 +23,22 @@ group.add_argument( default="left", help=help, ) -group.add_argument("--left", "/左手", action="store_const", const="left", dest="position") +group.add_argument( + "--left", "/左手", action="store_const", const="left", dest="position" +) group.add_argument( "--right", "/右手", action="store_const", const="right", dest="position" ) -group.add_argument("--both", "/双手", action="store_const", const="both", dest="position") +group.add_argument( + "--both", "/双手", action="store_const", const="both", dest="position" +) class Model(MemeArgsModel): position: Literal["left", "right", "both"] = Field("left", description=help) -def gun(images: List[BuildImage], texts, args: Model): +def gun(images: list[BuildImage], texts, args: Model): frame = images[0].convert("RGBA").resize((500, 500), keep_ratio=True) gun = BuildImage.open(img_dir / "0.png") position = args.position diff --git a/meme_generator/memes/hammer/__init__.py b/meme_generator/memes/hammer/__init__.py index 9a5b31a955e8d12ceee501a3dca30a48bcba0817..523c7b691ef5448855651dbaac3e214446743b2d 100644 --- a/meme_generator/memes/hammer/__init__.py +++ b/meme_generator/memes/hammer/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def hammer(images: List[BuildImage], texts, args): +def hammer(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square() # fmt: off locs = [ @@ -18,7 +17,7 @@ def hammer(images: List[BuildImage], texts, args): (54, 169, 174, 110), (69, 128, 144, 135), (65, 130, 152, 124), ] # fmt: on - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(7): frame = BuildImage.open(img_dir / f"{i}.png") x, y, w, h = locs[i] diff --git a/meme_generator/memes/high_EQ/__init__.py b/meme_generator/memes/high_EQ/__init__.py index febab3af7f19928cffdae37991309780f99e489b..ca6c3233b5783194fc06bacfa444cd1b89ac8276 100644 --- a/meme_generator/memes/high_EQ/__init__.py +++ b/meme_generator/memes/high_EQ/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List, Tuple from pil_utils import BuildImage @@ -9,10 +8,10 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def high_EQ(images, texts: List[str], args): +def high_EQ(images, texts: list[str], args): frame = BuildImage.open(img_dir / "0.jpg") - def draw(pos: Tuple[float, float, float, float], text: str): + def draw(pos: tuple[float, float, float, float], text: str): try: frame.draw_text( pos, diff --git a/meme_generator/memes/hit_screen/__init__.py b/meme_generator/memes/hit_screen/__init__.py index 1ff85781315f5802402a3dab620f26d14bf1c55c..1b4a62e4bc406774debe853ea2bff7abd12e060f 100644 --- a/meme_generator/memes/hit_screen/__init__.py +++ b/meme_generator/memes/hit_screen/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import FrameAlignPolicy, Maker, make_gif_or_combined_g img_dir = Path(__file__).parent / "images" -def hit_screen(images: List[BuildImage], texts, args): +def hit_screen(images: list[BuildImage], texts, args): params = ( (((1, 10), (138, 1), (140, 119), (7, 154)), (32, 37)), (((1, 10), (138, 1), (140, 121), (7, 154)), (32, 37)), @@ -45,4 +44,6 @@ def hit_screen(images: List[BuildImage], texts, args): ) -add_meme("hit_screen", hit_screen, min_images=1, max_images=1, keywords=["打穿", "打穿屏幕"]) +add_meme( + "hit_screen", hit_screen, min_images=1, max_images=1, keywords=["打穿", "打穿屏幕"] +) diff --git a/meme_generator/memes/hold_grudge/__init__.py b/meme_generator/memes/hold_grudge/__init__.py index be7c196b6cba6522e927429bf64274ed5cf34ca8..99cb97a7490a6a7fef92b9218f601493a57ca528 100644 --- a/meme_generator/memes/hold_grudge/__init__.py +++ b/meme_generator/memes/hold_grudge/__init__.py @@ -1,6 +1,5 @@ from datetime import datetime from pathlib import Path -from typing import List from pil_utils import BuildImage, Text2Image @@ -10,7 +9,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def hold_grudge(images, texts: List[str], args): +def hold_grudge(images, texts: list[str], args): date = datetime.today().strftime("%Y{}%m{}%d{}").format("年", "月", "日") text = f"{date} 晴\n{texts[0]}\n这个仇我先记下了" text2image = Text2Image.from_text(text, 45, fill="black", spacing=10).wrap(440) diff --git a/meme_generator/memes/hold_tight/__init__.py b/meme_generator/memes/hold_tight/__init__.py index 98dc735a4250c2e6e8b93cc89ce90646dad7fc15..2071fe6f843b56d1a0f6931ade4032a05fa9d8db 100644 --- a/meme_generator/memes/hold_tight/__init__.py +++ b/meme_generator/memes/hold_tight/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def hold_tight(images: List[BuildImage], texts, args): +def hold_tight(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize((159, 171), keep_ratio=True) frame = BuildImage.open(img_dir / "0.png") frame.paste(img, (113, 205), below=True) diff --git a/meme_generator/memes/hug_leg/__init__.py b/meme_generator/memes/hug_leg/__init__.py index 18ddf1c0bdce5e500d96dbc61a3a69d6db8ba4e8..ce57d146d4f36abe033c1cd59fa0c5f5a1f7493e 100644 --- a/meme_generator/memes/hug_leg/__init__.py +++ b/meme_generator/memes/hug_leg/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def hug_leg(images: List[BuildImage], texts, args): +def hug_leg(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square() locs = [ (50, 73, 68, 92), @@ -20,7 +19,7 @@ def hug_leg(images: List[BuildImage], texts, args): (55, 44, 65, 106), (66, 85, 60, 98), ] - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(6): frame = BuildImage.open(img_dir / f"{i}.png") x, y, w, h = locs[i] diff --git a/meme_generator/memes/hutao_bite/__init__.py b/meme_generator/memes/hutao_bite/__init__.py index 9cfbf7497f6374d77bf28e2b5e5cde1de0c0850b..2d166d056652ee19a88034148e286766f0eb2d95 100644 --- a/meme_generator/memes/hutao_bite/__init__.py +++ b/meme_generator/memes/hutao_bite/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,9 +9,9 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def hutao_bite(images: List[BuildImage], texts, args): +def hutao_bite(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square().resize((100, 100)) - frames: List[IMG] = [] + frames: list[IMG] = [] locs = [(98, 101, 108, 234), (96, 100, 108, 237)] for i in range(2): frame = BuildImage.open(img_dir / f"{i}.png") diff --git a/meme_generator/memes/imprison/__init__.py b/meme_generator/memes/imprison/__init__.py index 4033971bf33c636b961fbddce334f3b36ee9486f..8b64338298f1ecc71a70a6431ab5a30f223146d8 100644 --- a/meme_generator/memes/imprison/__init__.py +++ b/meme_generator/memes/imprison/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def imprison(images, texts: List[str], args): +def imprison(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.jpg") try: diff --git a/meme_generator/memes/incivilization/__init__.py b/meme_generator/memes/incivilization/__init__.py index 5491bc824ab12ebe3db5abeb34a5c13869af0ce6..1a65ac11975a8d526e000bcea518e2911d42d407 100644 --- a/meme_generator/memes/incivilization/__init__.py +++ b/meme_generator/memes/incivilization/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL import ImageEnhance from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def incivilization(images: List[BuildImage], texts: List[str], args): +def incivilization(images: list[BuildImage], texts: list[str], args): frame = BuildImage.open(img_dir / "0.png") points = ((0, 20), (154, 0), (164, 153), (22, 180)) img = images[0].convert("RGBA").circle().resize((150, 150)).perspective(points) diff --git a/meme_generator/memes/interview/__init__.py b/meme_generator/memes/interview/__init__.py index a8d226fad8b20c09cbedc2e5dd0ecab0beb9b904..77b3f0058c50af33722d2299acdde5ad61224d3c 100644 --- a/meme_generator/memes/interview/__init__.py +++ b/meme_generator/memes/interview/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def interview(images: List[BuildImage], texts: List[str], args): +def interview(images: list[BuildImage], texts: list[str], args): if len(images) == 2: self_img = images[0] user_img = images[1] diff --git a/meme_generator/memes/jiji_king/__init__.py b/meme_generator/memes/jiji_king/__init__.py index dd67f38d3a46b2d77a84514173aa963a142bf15a..ca73d7eb7e4978181d26f68fada4aa37d8d9ddc4 100644 --- a/meme_generator/memes/jiji_king/__init__.py +++ b/meme_generator/memes/jiji_king/__init__.py @@ -1,6 +1,5 @@ import math from pathlib import Path -from typing import List from pil_utils import BuildImage from pydantic import Field @@ -20,7 +19,7 @@ class Model(MemeArgsModel): circle: bool = Field(False, description=help) -def jiji_king(images: List[BuildImage], texts: List[str], args: Model): +def jiji_king(images: list[BuildImage], texts: list[str], args: Model): block_num = 5 if len(images) >= 7 or len(texts) >= 7: block_num = max(len(images), len(texts)) - 1 diff --git a/meme_generator/memes/jiujiu/__init__.py b/meme_generator/memes/jiujiu/__init__.py index 22bc183b6ed83a32db82eb0619a358d97146785f..058d66b5965f3f5d16f13cefaef7a9531426dfa3 100644 --- a/meme_generator/memes/jiujiu/__init__.py +++ b/meme_generator/memes/jiujiu/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,9 +9,9 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def jiujiu(images: List[BuildImage], texts, args): +def jiujiu(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize((75, 51), keep_ratio=True) - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(8): frame = BuildImage.open(img_dir / f"{i}.png") frame.paste(img, below=True) diff --git a/meme_generator/memes/kaleidoscope/__init__.py b/meme_generator/memes/kaleidoscope/__init__.py index ab17c0e0744f1e74deb281473b660263b474abef..4e2945f609d5b1a0d6fd2a2182375738c8485c68 100644 --- a/meme_generator/memes/kaleidoscope/__init__.py +++ b/meme_generator/memes/kaleidoscope/__init__.py @@ -1,5 +1,4 @@ import math -from typing import List from pil_utils import BuildImage from pydantic import Field @@ -17,7 +16,7 @@ class Model(MemeArgsModel): circle: bool = Field(False, description=help) -def kaleidoscope(images: List[BuildImage], texts, args: Model): +def kaleidoscope(images: list[BuildImage], texts, args: Model): def make(img: BuildImage) -> BuildImage: circle_num = 10 img_per_circle = 4 diff --git a/meme_generator/memes/karyl_point/__init__.py b/meme_generator/memes/karyl_point/__init__.py index 5824b41f72d42ebe1bb8fb4533a68fec839ea3b7..77120fc703c54c103f93fb7bce8c9621099f9957 100644 --- a/meme_generator/memes/karyl_point/__init__.py +++ b/meme_generator/memes/karyl_point/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def karyl_point(images: List[BuildImage], texts, args): +def karyl_point(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").rotate(7.5, expand=True).resize((225, 225)) frame = BuildImage.open(img_dir / "0.png") frame.paste(img, (87, 790), alpha=True) diff --git a/meme_generator/memes/keep_away/__init__.py b/meme_generator/memes/keep_away/__init__.py index ed47b292dd9d1b70d4f248a65e394c21e03d3c88..1d4963c718cd16f5cfd36198d06a5f991430e18f 100644 --- a/meme_generator/memes/keep_away/__init__.py +++ b/meme_generator/memes/keep_away/__init__.py @@ -1,12 +1,10 @@ -from typing import List - from PIL.Image import Transpose from pil_utils import BuildImage from meme_generator import add_meme -def keep_away(images: List[BuildImage], texts: List[str], args): +def keep_away(images: list[BuildImage], texts: list[str], args): def trans(img: BuildImage, n: int) -> BuildImage: img = img.convert("RGBA").square().resize((100, 100)) if n < 4: diff --git a/meme_generator/memes/kick_ball/__init__.py b/meme_generator/memes/kick_ball/__init__.py index 47fec9f3f8e50c733e6cd22084146d94325fe0b5..b53ea883766be807a28eadb38d6fc65ab66937b8 100644 --- a/meme_generator/memes/kick_ball/__init__.py +++ b/meme_generator/memes/kick_ball/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def kick_ball(images: List[BuildImage], texts, args): +def kick_ball(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square().resize((78, 78)) # fmt: off locs = [ @@ -19,7 +18,7 @@ def kick_ball(images: List[BuildImage], texts, args): (50, 136), (51, 176), (52, 169), (55, 181), (58, 153) ] # fmt: on - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(15): frame = BuildImage.open(img_dir / f"{i}.png") frame.paste(img.rotate(-24 * i), locs[i], below=True) diff --git a/meme_generator/memes/kirby_hammer/__init__.py b/meme_generator/memes/kirby_hammer/__init__.py index 808c491dd820b54b45294ce254ee06c0fcc8b912..6f71e8f048d3b5be72a2ff439211b47c9ce7ec0c 100644 --- a/meme_generator/memes/kirby_hammer/__init__.py +++ b/meme_generator/memes/kirby_hammer/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage from pydantic import Field @@ -19,7 +18,7 @@ class Model(MemeArgsModel): circle: bool = Field(False, description=help) -def kirby_hammer(images: List[BuildImage], texts, args: Model): +def kirby_hammer(images: list[BuildImage], texts, args: Model): # fmt: off positions = [ (318, 163), (319, 173), (320, 183), (317, 193), (312, 199), diff --git a/meme_generator/memes/kiss/__init__.py b/meme_generator/memes/kiss/__init__.py index d3263c16353c59490d0506b6f476d985cda3710a..02a7e56db722be2bb9bf8bcd696c13064103137f 100644 --- a/meme_generator/memes/kiss/__init__.py +++ b/meme_generator/memes/kiss/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def kiss(images: List[BuildImage], texts, args): +def kiss(images: list[BuildImage], texts, args): self_head = images[0].convert("RGBA").circle().resize((40, 40)) user_head = images[1].convert("RGBA").circle().resize((50, 50)) # fmt: off @@ -23,7 +22,7 @@ def kiss(images: List[BuildImage], texts, args): (98, 55), (35, 65), (38, 100), (70, 80), (84, 65), (75, 65) ] # fmt: on - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(13): frame = BuildImage.open(img_dir / f"{i}.png") frame.paste(user_head, user_locs[i], alpha=True) diff --git a/meme_generator/memes/klee_eat/__init__.py b/meme_generator/memes/klee_eat/__init__.py index b34429b01d14f77e3f76a7a33bbed1438ca5ae21..1256e37d1ca2df0ad5e7574dae28a9c13d84d580 100644 --- a/meme_generator/memes/klee_eat/__init__.py +++ b/meme_generator/memes/klee_eat/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def klee_eat(images: List[BuildImage], texts, args): +def klee_eat(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square().resize((83, 83)) # fmt: off locs = [ @@ -22,7 +21,7 @@ def klee_eat(images: List[BuildImage], texts, args): (0, 174), (0, 174), (0, 174), (0, 174), (0, 174), (0, 174) ] # fmt: on - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(31): frame = BuildImage.open(img_dir / f"{i}.png") frame.paste(img, locs[i], below=True) diff --git a/meme_generator/memes/knock/__init__.py b/meme_generator/memes/knock/__init__.py index 0a44b37fc5563deea8406c6ddf109860a56e9485..a3d0b900d48c5768a9aa90b521a2883c40af88cc 100644 --- a/meme_generator/memes/knock/__init__.py +++ b/meme_generator/memes/knock/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,13 +9,13 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def knock(images: List[BuildImage], texts, args): +def knock(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square() # fmt: off locs = [(60, 308, 210, 195), (60, 308, 210, 198), (45, 330, 250, 172), (58, 320, 218, 180), (60, 310, 215, 193), (40, 320, 250, 285), (48, 308, 226, 192), (51, 301, 223, 200)] # fmt: on - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(8): frame = BuildImage.open(img_dir / f"{i}.png") x, y, w, h = locs[i] diff --git a/meme_generator/memes/learn/__init__.py b/meme_generator/memes/learn/__init__.py index a3c2fad58b5d39e8f781fc6bc6dac7d03f0c3377..6de43b828c8e54902cf1649847c4c04b9e3887b7 100644 --- a/meme_generator/memes/learn/__init__.py +++ b/meme_generator/memes/learn/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def learn(images: List[BuildImage], texts: List[str], args): +def learn(images: list[BuildImage], texts: list[str], args): text = texts[0] if texts else "偷学群友数理基础" frame = BuildImage.open(img_dir / "0.png") try: diff --git a/meme_generator/memes/lim_x_0/__init__.py b/meme_generator/memes/lim_x_0/__init__.py index 0eafec0ed477caa4924ce8a4ee31b0f9732a522f..a07ef25a28521e7bc2c036cf4d7ad32a94ad01d0 100644 --- a/meme_generator/memes/lim_x_0/__init__.py +++ b/meme_generator/memes/lim_x_0/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def lim_x_0(images: List[BuildImage], texts, args): +def lim_x_0(images: list[BuildImage], texts, args): img = images[0] frame = BuildImage.open(img_dir / "0.png") img_c = img.convert("RGBA").circle().resize((72, 72)) diff --git a/meme_generator/memes/listen_music/__init__.py b/meme_generator/memes/listen_music/__init__.py index 9e4f1de0954ad06afd641cc9ebe390170e0981db..875f3d7ec7ce24e7873c8827c09a9d86282a524d 100644 --- a/meme_generator/memes/listen_music/__init__.py +++ b/meme_generator/memes/listen_music/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,10 +9,10 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def listen_music(images: List[BuildImage], texts, args): +def listen_music(images: list[BuildImage], texts, args): img = images[0].convert("RGBA") frame = BuildImage.open(img_dir / "0.png") - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(0, 360, 10): frames.append( frame.copy() diff --git a/meme_generator/memes/little_angel/__init__.py b/meme_generator/memes/little_angel/__init__.py index bbfe9c60b425be26ec9b1560f20f26fcbc948ede..9fb8b9025af0149598edf61a8654804297ce476e 100644 --- a/meme_generator/memes/little_angel/__init__.py +++ b/meme_generator/memes/little_angel/__init__.py @@ -1,5 +1,3 @@ -from typing import List - from pil_utils import BuildImage from meme_generator import MemeArgsModel, add_meme @@ -7,7 +5,7 @@ from meme_generator.exception import TextOverLength from meme_generator.utils import make_jpg_or_gif -def little_angel(images: List[BuildImage], texts: List[str], args: MemeArgsModel): +def little_angel(images: list[BuildImage], texts: list[str], args: MemeArgsModel): img_w, img_h = images[0].convert("RGBA").resize_width(500).size frame = BuildImage.new("RGBA", (600, img_h + 230), "white") text = "非常可爱!简直就是小天使" diff --git a/meme_generator/memes/loading/__init__.py b/meme_generator/memes/loading/__init__.py index 32eb49f4f4df1a8023b4fdda26b2e63b2fad5ec1..acb094c90958040fe27a4fcab1751b5b63b3520a 100644 --- a/meme_generator/memes/loading/__init__.py +++ b/meme_generator/memes/loading/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL import ImageFilter from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def loading(images: List[BuildImage], texts, args): +def loading(images: list[BuildImage], texts, args): img_big = images[0].convert("RGBA").resize_width(500) img_big = img_big.filter(ImageFilter.GaussianBlur(radius=3)) h1 = img_big.height diff --git a/meme_generator/memes/look_flat/__init__.py b/meme_generator/memes/look_flat/__init__.py index fd2af58ab7748628f2ac162778d76cdd314beed9..439d59088abacdd1eaca001e31bc3d4a8a2cf4a0 100644 --- a/meme_generator/memes/look_flat/__init__.py +++ b/meme_generator/memes/look_flat/__init__.py @@ -1,5 +1,3 @@ -from typing import List - from pil_utils import BuildImage from pydantic import Field @@ -17,7 +15,7 @@ class Model(MemeArgsModel): ratio: int = Field(2, description=help) -def look_flat(images: List[BuildImage], texts: List[str], args: Model): +def look_flat(images: list[BuildImage], texts: list[str], args: Model): text = texts[0] if texts else "可恶...被人看扁了" ratio = args.ratio diff --git a/meme_generator/memes/look_this_icon/__init__.py b/meme_generator/memes/look_this_icon/__init__.py index fab54612a3c469185e43f49682b3d7d2f2fda73b..9afc4eb342c081ff0c2b46b64fa8197ee10d032f 100644 --- a/meme_generator/memes/look_this_icon/__init__.py +++ b/meme_generator/memes/look_this_icon/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def look_this_icon(images: List[BuildImage], texts: List[str], args): +def look_this_icon(images: list[BuildImage], texts: list[str], args): text = texts[0] if texts else "朋友\n先看看这个图标再说话" frame = BuildImage.open(img_dir / "nmsl.png") try: diff --git a/meme_generator/memes/lost_dog/__init__.py b/meme_generator/memes/lost_dog/__init__.py index 12ea3c4e49f0ecc47ea12d02d1d482dcb927ff4c..1179c865baed4ea3e6162711527eb5388c940386 100644 --- a/meme_generator/memes/lost_dog/__init__.py +++ b/meme_generator/memes/lost_dog/__init__.py @@ -1,6 +1,5 @@ import math from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def lost_dog(images: List[BuildImage], texts, args): +def lost_dog(images: list[BuildImage], texts, args): k = 2 w_ = 663 * k w = 540 * k diff --git a/meme_generator/memes/love_you/__init__.py b/meme_generator/memes/love_you/__init__.py index 2a579467811e3c8708416f2501c5df26a9fe094e..943aa6c333a2e44fcd864b7499342ee93bf738a9 100644 --- a/meme_generator/memes/love_you/__init__.py +++ b/meme_generator/memes/love_you/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,9 +9,9 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def love_you(images: List[BuildImage], texts, args): +def love_you(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square() - frames: List[IMG] = [] + frames: list[IMG] = [] locs = [(68, 65, 70, 70), (63, 59, 80, 80)] for i in range(2): heart = BuildImage.open(img_dir / f"{i}.png") diff --git a/meme_generator/memes/luoyonghao_say/__init__.py b/meme_generator/memes/luoyonghao_say/__init__.py index f09d378a09127843804bb79fbf9e1e3370ac88fb..b4b260177b3aa00b8a1a37ca3de54d6cb74a3adb 100644 --- a/meme_generator/memes/luoyonghao_say/__init__.py +++ b/meme_generator/memes/luoyonghao_say/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL import ImageFilter from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def luoyonghao_say(images, texts: List[str], args): +def luoyonghao_say(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.jpg") text_frame = BuildImage.new("RGBA", (365, 120)) @@ -27,7 +26,7 @@ def luoyonghao_say(images, texts: List[str], args): raise TextOverLength(text) text_frame = text_frame.perspective( ((52, 10), (391, 0), (364, 110), (0, 120)) - ).filter(ImageFilter.GaussianBlur(radius=0.8)) + ).filter(ImageFilter.GaussianBlur(radius=0.8)) # type: ignore frame.paste(text_frame, (48, 246), alpha=True) return frame.save_jpg() diff --git a/meme_generator/memes/luxun_say/__init__.py b/meme_generator/memes/luxun_say/__init__.py index 44db464aeded0cb248d917e30dd630fa25037856..e5ded6bc992a44a43e7dbe3523faf1724c79f798 100644 --- a/meme_generator/memes/luxun_say/__init__.py +++ b/meme_generator/memes/luxun_say/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def luxun_say(images, texts: List[str], args): +def luxun_say(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.jpg") try: diff --git a/meme_generator/memes/maimai_awaken/__init__.py b/meme_generator/memes/maimai_awaken/__init__.py index ec62ba20f89ca9a3c853f9fa97b97c030d58c891..ebc2147610b072f263886049af867273ea9e1459 100644 --- a/meme_generator/memes/maimai_awaken/__init__.py +++ b/meme_generator/memes/maimai_awaken/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def maimai_awaken(images: List[BuildImage], texts, args): +def maimai_awaken(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") def make(img: BuildImage) -> BuildImage: @@ -20,5 +19,9 @@ def maimai_awaken(images: List[BuildImage], texts, args): add_meme( - "maimai_awaken", maimai_awaken, min_images=1, max_images=1, keywords=["旅行伙伴觉醒"] + "maimai_awaken", + maimai_awaken, + min_images=1, + max_images=1, + keywords=["旅行伙伴觉醒"], ) diff --git a/meme_generator/memes/maimai_join/__init__.py b/meme_generator/memes/maimai_join/__init__.py index b923e7fb5dbc944a0560aa89ccf8ce215d5b8c58..7374204de2973e5a1e2c12eada4c606430f451c2 100644 --- a/meme_generator/memes/maimai_join/__init__.py +++ b/meme_generator/memes/maimai_join/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def maimai_join(images: List[BuildImage], texts, args): +def maimai_join(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") def make(img: BuildImage) -> BuildImage: @@ -19,4 +18,6 @@ def maimai_join(images: List[BuildImage], texts, args): return make_jpg_or_gif(images[0], make) -add_meme("maimai_join", maimai_join, min_images=1, max_images=1, keywords=["旅行伙伴加入"]) +add_meme( + "maimai_join", maimai_join, min_images=1, max_images=1, keywords=["旅行伙伴加入"] +) diff --git a/meme_generator/memes/make_friend/__init__.py b/meme_generator/memes/make_friend/__init__.py index a927339bd1d53e7e5869d1915200a3b03f165c47..b5a3ceb922a8aae2285467a8be28b7d322eb6357 100644 --- a/meme_generator/memes/make_friend/__init__.py +++ b/meme_generator/memes/make_friend/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage, Text2Image @@ -9,7 +8,7 @@ from meme_generator.exception import TextOrNameNotEnough, TextOverLength img_dir = Path(__file__).parent / "images" -def make_friend(images: List[BuildImage], texts: List[str], args: MemeArgsModel): +def make_friend(images: list[BuildImage], texts: list[str], args: MemeArgsModel): img = images[0].convert("RGBA") if not texts and not args.user_infos: diff --git a/meme_generator/memes/marriage/__init__.py b/meme_generator/memes/marriage/__init__.py index bf74da11f9645071ab158b904f16e21c54027399..b3da13eef5b8c9eed2e3201fbb9cd299f9c07031 100644 --- a/meme_generator/memes/marriage/__init__.py +++ b/meme_generator/memes/marriage/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def marriage(images: List[BuildImage], texts, args): +def marriage(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize_height(1080) img_w, img_h = img.size if img_w > 1500: @@ -24,4 +23,6 @@ def marriage(images: List[BuildImage], texts, args): return frame.save_jpg() -add_meme("marriage", marriage, min_images=1, max_images=1, keywords=["结婚申请", "结婚登记"]) +add_meme( + "marriage", marriage, min_images=1, max_images=1, keywords=["结婚申请", "结婚登记"] +) diff --git a/meme_generator/memes/meteor/__init__.py b/meme_generator/memes/meteor/__init__.py index cba5e488eb20a2027bf21c04db8931b47470f9b6..a48c4826273c4369b9259107a9a3062d8b33bff3 100644 --- a/meme_generator/memes/meteor/__init__.py +++ b/meme_generator/memes/meteor/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def meteor(images, texts: List[str], args): +def meteor(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.png") try: @@ -27,5 +26,10 @@ def meteor(images, texts: List[str], args): add_meme( - "meteor", meteor, min_texts=1, max_texts=1, default_texts=["我要对象"], keywords=["流星"] + "meteor", + meteor, + min_texts=1, + max_texts=1, + default_texts=["我要对象"], + keywords=["流星"], ) diff --git a/meme_generator/memes/mihoyo/__init__.py b/meme_generator/memes/mihoyo/__init__.py index 13d31a63c982377c571678c0aba342c7d1123833..94cb73eb8bae180c61f3678ee4b73355418bb895 100644 --- a/meme_generator/memes/mihoyo/__init__.py +++ b/meme_generator/memes/mihoyo/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import make_png_or_gif img_dir = Path(__file__).parent / "images" -def mihoyo(images: List[BuildImage], texts, args): +def mihoyo(images: list[BuildImage], texts, args): mask = BuildImage.new("RGBA", (500, 60), (53, 49, 65, 230)) logo = BuildImage.open(img_dir / "logo.png").resize_height(50) diff --git a/meme_generator/memes/mourning/__init__.py b/meme_generator/memes/mourning/__init__.py index c38c96cc015b8828db92f8ab1bade9ff56134a6c..aa58901af984b0142ff8889a1c069173983a3aac 100644 --- a/meme_generator/memes/mourning/__init__.py +++ b/meme_generator/memes/mourning/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage from pydantic import Field @@ -19,7 +18,7 @@ class Model(MemeArgsModel): black: bool = Field(False, description=help) -def mourning(images: List[BuildImage], texts, args: Model): +def mourning(images: list[BuildImage], texts, args: Model): frame = BuildImage.open(img_dir / "0.png") def make(img: BuildImage) -> BuildImage: diff --git a/meme_generator/memes/murmur/__init__.py b/meme_generator/memes/murmur/__init__.py index 6c96123393d06e60e9d9ffc1f2923b7483af964a..e2a5afc265e01ced19c1d2f8c3bc4df2bdbe53b3 100644 --- a/meme_generator/memes/murmur/__init__.py +++ b/meme_generator/memes/murmur/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def murmur(images, texts: List[str], args): +def murmur(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.jpg") try: diff --git a/meme_generator/memes/my_friend/__init__.py b/meme_generator/memes/my_friend/__init__.py index 000b5f015cc85e3ce6bcb2532bc3c04af22d9a9e..9307f5f4b3df25249990812b68fc9d18be3d06a2 100644 --- a/meme_generator/memes/my_friend/__init__.py +++ b/meme_generator/memes/my_friend/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage, Text2Image from pydantic import Field @@ -19,7 +18,7 @@ class Model(MemeArgsModel): name: str = Field("", description=help) -def my_friend(images: List[BuildImage], texts: List[str], args: Model): +def my_friend(images: list[BuildImage], texts: list[str], args: Model): name = args.name or (args.user_infos[-1].name if args.user_infos else "") or "朋友" img = images[0].convert("RGBA").circle().resize((100, 100)) diff --git a/meme_generator/memes/my_wife/__init__.py b/meme_generator/memes/my_wife/__init__.py index 727bffabea0b8fcdb5d683c0bb24ca69d0211c2c..24e3c381d369fbac2759b0b69b046e3f57096bda 100644 --- a/meme_generator/memes/my_wife/__init__.py +++ b/meme_generator/memes/my_wife/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def my_wife(images: List[BuildImage], texts, args): +def my_wife(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize_width(400) img_w, img_h = img.size frame = BuildImage.new("RGBA", (650, img_h + 500), "white") @@ -50,4 +49,6 @@ def my_wife(images: List[BuildImage], texts, args): return frame.save_jpg() -add_meme("my_wife", my_wife, min_images=1, max_images=1, keywords=["我老婆", "这是我老婆"]) +add_meme( + "my_wife", my_wife, min_images=1, max_images=1, keywords=["我老婆", "这是我老婆"] +) diff --git a/meme_generator/memes/name_generator/__init__.py b/meme_generator/memes/name_generator/__init__.py index 3acf6322c445d302ac9197b11387e2cbf882876f..bd2b32df2efc5b51c0463a46fe572b1b936eff51 100644 --- a/meme_generator/memes/name_generator/__init__.py +++ b/meme_generator/memes/name_generator/__init__.py @@ -1,6 +1,5 @@ import random from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def name_generator(images: List[BuildImage], texts, args): +def name_generator(images: list[BuildImage], texts, args): colors = ["#0000ff", "#ff00f7", "#00cc66"] # fmt: off el1 = ["废墟", "深海", "反应堆", "学园", "腐烂", "东京", "三维", "四次元", "少管所", "流星", "闪光", "南极", "消极", "幽浮", "网路", "暗狱", "离子态", "液态", "黑色", "抱抱", "暴力", "垃圾", "社会", "残暴", "残酷", "工口", "戮尸", "原味", "毛茸茸", "香香", "霹雳", "午夜", "美工刀", "爆浆", "机关枪", "无响应", "手术台", "麻风病", "虚拟", "速冻", "智能", "2000", "甜味", "华丽", "反社会", "玛利亚", "无", "梦之", "蔷薇", "无政府", "酷酷", "西伯利亚", "人造", "法外", "追杀", "通缉", "女子", "微型", "男子", "超", "毁灭", "大型", "绝望", "阴间", "死亡", "坟场", "高科技", "奇妙", "魔法", "极限", "社会主义", "无聊"] diff --git a/meme_generator/memes/need/__init__.py b/meme_generator/memes/need/__init__.py index eed34e86e2f4989bc9be8719646c4e9e7f5b7530..c2abddd7b90f8225b68a2d9a79ecc410a4e57c8c 100644 --- a/meme_generator/memes/need/__init__.py +++ b/meme_generator/memes/need/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def need(images: List[BuildImage], texts, args): +def need(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") def make(img: BuildImage) -> BuildImage: diff --git a/meme_generator/memes/nekoha_holdsign/__init__.py b/meme_generator/memes/nekoha_holdsign/__init__.py index 1d43ce8774b267a38322b9cffba2e9baa1dd8b87..641ad65edbbfd3183dc5f7c0a30cf0ec869809b4 100644 --- a/meme_generator/memes/nekoha_holdsign/__init__.py +++ b/meme_generator/memes/nekoha_holdsign/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def nekoha_holdsign(images, texts: List[str], args): +def nekoha_holdsign(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.jpg") try: diff --git a/meme_generator/memes/nijika_holdsign/__init__.py b/meme_generator/memes/nijika_holdsign/__init__.py index 98b1bdcaf292be7f627b9ebd7b99f1df045c580e..8b21c4e2b5c7dfd0666de774a12f88ef50c4388e 100644 --- a/meme_generator/memes/nijika_holdsign/__init__.py +++ b/meme_generator/memes/nijika_holdsign/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def nijika_holdsign(images, texts: List[str], args): +def nijika_holdsign(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.jpg") try: diff --git a/meme_generator/memes/no_response/__init__.py b/meme_generator/memes/no_response/__init__.py index 6797e7cd763fec3e4e57388df821a91f72d630fb..df3c88522e780e6459b5319eaddde60fdcb31858 100644 --- a/meme_generator/memes/no_response/__init__.py +++ b/meme_generator/memes/no_response/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def no_response(images: List[BuildImage], texts, args): +def no_response(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize((1050, 783), keep_ratio=True) frame = BuildImage.open(img_dir / "0.png") frame.paste(img, (0, 581), below=True) diff --git a/meme_generator/memes/nokia/__init__.py b/meme_generator/memes/nokia/__init__.py index 18c75df78761dcd9d84c50b533c3f1a263f13d25..0eb2697b58f7f008bf18dc34fce6d0d3962e5a75 100644 --- a/meme_generator/memes/nokia/__init__.py +++ b/meme_generator/memes/nokia/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage, Text2Image @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def nokia(images, texts: List[str], args): +def nokia(images, texts: list[str], args): text = texts[0][:900] text_img = ( Text2Image.from_text(text, 70, fontname="FZXS14", fill="black", spacing=30) diff --git a/meme_generator/memes/not_call_me/__init__.py b/meme_generator/memes/not_call_me/__init__.py index 8cc1e9d0b6cc35f3addc9b8b137fcffa435ee1a8..9ef27e2dc098bb969a0bd053623173c658f79cbc 100644 --- a/meme_generator/memes/not_call_me/__init__.py +++ b/meme_generator/memes/not_call_me/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def not_call_me(images, texts: List[str], args): +def not_call_me(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.png") try: diff --git a/meme_generator/memes/note_for_leave/__init__.py b/meme_generator/memes/note_for_leave/__init__.py index 6e58f0083ad5120b8db26945ac139eeb9caa50e2..7baec98bd5b91f000cc08ce0e1fb28b46e256ede 100644 --- a/meme_generator/memes/note_for_leave/__init__.py +++ b/meme_generator/memes/note_for_leave/__init__.py @@ -1,5 +1,4 @@ from datetime import datetime -from typing import List import dateparser from pil_utils import BuildImage, Text2Image @@ -18,7 +17,7 @@ class Model(MemeArgsModel): name: str = Field("", description="指定名字") -def note_for_leave(images: List[BuildImage], texts: List[str], args: Model): +def note_for_leave(images: list[BuildImage], texts: list[str], args: Model): time = datetime.now() if args.time and (parsed_time := dateparser.parse(args.time)): time = parsed_time diff --git a/meme_generator/memes/oshi_no_ko/__init__.py b/meme_generator/memes/oshi_no_ko/__init__.py index ec0bec1a451b4d3ce9d66afbf5a5221faa63f37c..92a39d57110547825e0be30ed622144c8d0c4cff 100644 --- a/meme_generator/memes/oshi_no_ko/__init__.py +++ b/meme_generator/memes/oshi_no_ko/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage, Text2Image @@ -10,7 +9,7 @@ from meme_generator.utils import make_png_or_gif img_dir = Path(__file__).parent / "images" -def oshi_no_ko(images: List[BuildImage], texts: List[str], args): +def oshi_no_ko(images: list[BuildImage], texts: list[str], args): name = texts[0] if texts else "网友" text_frame1 = BuildImage.open(img_dir / "text1.png") diff --git a/meme_generator/memes/osu/__init__.py b/meme_generator/memes/osu/__init__.py index 29cb45e26c0ba8b046e397b84054298dfbba5a8f..a75405b4a2128b3f1619c11391caaacbb407aa1a 100644 --- a/meme_generator/memes/osu/__init__.py +++ b/meme_generator/memes/osu/__init__.py @@ -1,6 +1,5 @@ from io import BytesIO from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def osu(images, texts: List[str], args) -> BytesIO: +def osu(images, texts: list[str], args) -> BytesIO: text = texts[0] frame = BuildImage.open(img_dir / "osu.png") try: diff --git a/meme_generator/memes/overtime/__init__.py b/meme_generator/memes/overtime/__init__.py index 067319abcea57336203bf8032d4f730675d9af89..20cba5ef52e8eb2cd4fefcbdf86f10a04cbc1d44 100644 --- a/meme_generator/memes/overtime/__init__.py +++ b/meme_generator/memes/overtime/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def overtime(images: List[BuildImage], texts, args): +def overtime(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") img = images[0].convert("RGBA").resize((250, 250), keep_ratio=True) frame.paste(img.rotate(-25, expand=True), (165, 220), below=True) diff --git a/meme_generator/memes/paint/__init__.py b/meme_generator/memes/paint/__init__.py index 571758f7a7b9089fd6dd62acaa3eea38d67e7843..8630a424d0f190693e12e986ac79b8440180268c 100644 --- a/meme_generator/memes/paint/__init__.py +++ b/meme_generator/memes/paint/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def paint(images: List[BuildImage], texts, args): +def paint(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize((117, 135), keep_ratio=True) frame = BuildImage.open(img_dir / "0.png") frame.paste(img.rotate(4, expand=True), (95, 107), below=True) diff --git a/meme_generator/memes/painter/__init__.py b/meme_generator/memes/painter/__init__.py index e7bded8a742444c56faeed21099514e1a0add92b..90f45c27fad89f59bc616262d58518c8720195e9 100644 --- a/meme_generator/memes/painter/__init__.py +++ b/meme_generator/memes/painter/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def painter(images: List[BuildImage], texts, args): +def painter(images: list[BuildImage], texts, args): img = ( images[0].convert("RGBA").resize((240, 345), keep_ratio=True, direction="north") ) diff --git a/meme_generator/memes/pass_the_buck/__init__.py b/meme_generator/memes/pass_the_buck/__init__.py index 1711bb9a5f90b783aae12309a767b9a639d21f72..671a8d60e423b4fb9f78b32e1490ecb6b0f7996f 100644 --- a/meme_generator/memes/pass_the_buck/__init__.py +++ b/meme_generator/memes/pass_the_buck/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -11,9 +10,9 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def pass_the_buck(images: List[BuildImage], texts: List[str], args): +def pass_the_buck(images: list[BuildImage], texts: list[str], args): img = images[0].convert("RGBA").square().resize((27, 27)) - frames: List[IMG] = [] + frames: list[IMG] = [] locs = [(2, 26), (10, 24), (15, 27), (17, 29), (10, 20), (2, 29), (3, 31), (1, 30)] for i in range(8): frame = BuildImage.open(img_dir / f"{i}.png") diff --git a/meme_generator/memes/pat/__init__.py b/meme_generator/memes/pat/__init__.py index 1d7e7f68f99173c4a8ac021a95e1d1b6c2d71570..c0f415de4092292b2150d4a35803027f88f981cd 100644 --- a/meme_generator/memes/pat/__init__.py +++ b/meme_generator/memes/pat/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,10 +9,10 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def pat(images: List[BuildImage], texts, args): +def pat(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square() locs = [(11, 73, 106, 100), (8, 79, 112, 96)] - img_frames: List[IMG] = [] + img_frames: list[IMG] = [] for i in range(10): frame = BuildImage.open(img_dir / f"{i}.png") x, y, w, h = locs[1] if i == 2 else locs[0] diff --git a/meme_generator/memes/perfect/__init__.py b/meme_generator/memes/perfect/__init__.py index c942cbb51a214f2dc688108254be51d777168408..e1f2ecd33901d713fbf2868acad8f3cf85494de5 100644 --- a/meme_generator/memes/perfect/__init__.py +++ b/meme_generator/memes/perfect/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def perfect(images: List[BuildImage], texts, args): +def perfect(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") img = images[0].convert("RGBA").resize((310, 460), keep_ratio=True, inside=True) frame.paste(img, (313, 64), alpha=True) diff --git a/meme_generator/memes/petpet/__init__.py b/meme_generator/memes/petpet/__init__.py index f14c7d1e72581bee7b292a5103073019f6b012a0..5d9054e9b70165a11c3cc40a397f4ae5b7e8cd21 100644 --- a/meme_generator/memes/petpet/__init__.py +++ b/meme_generator/memes/petpet/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -20,12 +19,12 @@ class Model(MemeArgsModel): circle: bool = Field(False, description=help) -def petpet(images: List[BuildImage], texts, args: Model): +def petpet(images: list[BuildImage], texts, args: Model): img = images[0].convert("RGBA").square() if args.circle: img = img.circle() - frames: List[IMG] = [] + frames: list[IMG] = [] locs = [ (14, 20, 98, 98), (12, 33, 101, 85), diff --git a/meme_generator/memes/pinch/__init__.py b/meme_generator/memes/pinch/__init__.py index ee0a3b1473213d81fbe7efb80ba0211544d0c956..224b0a2d0ca923beacaf2cfd5a1d7855990feefd 100644 --- a/meme_generator/memes/pinch/__init__.py +++ b/meme_generator/memes/pinch/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def pinch(images: List[BuildImage], texts, args): +def pinch(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") def make(img: BuildImage) -> BuildImage: diff --git a/meme_generator/memes/play/__init__.py b/meme_generator/memes/play/__init__.py index 0a2395fbd9ae2b489af5891c78d8b04d77ae82f0..16c812dda1ef4a055fbbb9c030f808602434580f 100644 --- a/meme_generator/memes/play/__init__.py +++ b/meme_generator/memes/play/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def play(images: List[BuildImage], texts, args): +def play(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square() # fmt: off locs = [ @@ -21,10 +20,10 @@ def play(images: List[BuildImage], texts, args): (182, 59, 98, 92), (183, 71, 90, 96), (180, 131, 92, 101) ] # fmt: on - raw_frames: List[BuildImage] = [ + raw_frames: list[BuildImage] = [ BuildImage.open(img_dir / f"{i}.png") for i in range(38) ] - img_frames: List[BuildImage] = [] + img_frames: list[BuildImage] = [] for i in range(len(locs)): frame = raw_frames[i] x, y, w, h = locs[i] diff --git a/meme_generator/memes/play_game/__init__.py b/meme_generator/memes/play_game/__init__.py index a6b1c2dff5245faefdaf23e75cc9d1b2411d38c8..9460912b6fdd31a7bce7aea8994778cee9e9b090 100644 --- a/meme_generator/memes/play_game/__init__.py +++ b/meme_generator/memes/play_game/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def play_game(images: List[BuildImage], texts: List[str], args): +def play_game(images: list[BuildImage], texts: list[str], args): text = texts[0] if texts else "来玩休闲游戏啊" frame = BuildImage.open(img_dir / "0.png") try: diff --git a/meme_generator/memes/police/__init__.py b/meme_generator/memes/police/__init__.py index bffda044bc6484cdc09abd2f22241a6f1ddbd97e..1ba425c9af59d07db92b89217e46c3081ae9b05e 100644 --- a/meme_generator/memes/police/__init__.py +++ b/meme_generator/memes/police/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,14 +7,14 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def police(images: List[BuildImage], texts, args): +def police(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square().resize((245, 245)) frame = BuildImage.open(img_dir / "0.png") frame.paste(img, (224, 46), below=True) return frame.save_jpg() -def police1(images: List[BuildImage], texts, args): +def police1(images: list[BuildImage], texts, args): img = ( images[0] .convert("RGBA") diff --git a/meme_generator/memes/pornhub/__init__.py b/meme_generator/memes/pornhub/__init__.py index 82f4245aeb2b68a15f1ceeda6993f5225f89240a..d1b315b88bf4cd5af3dd2653139da35f0841096a 100644 --- a/meme_generator/memes/pornhub/__init__.py +++ b/meme_generator/memes/pornhub/__init__.py @@ -1,11 +1,9 @@ -from typing import List - from pil_utils import BuildImage, Text2Image from meme_generator import add_meme -def pornhub(images, texts: List[str], args): +def pornhub(images, texts: list[str], args): left_img = Text2Image.from_text(texts[0], fontsize=200, fill="white").to_image( bg_color="black", padding=(20, 10) ) diff --git a/meme_generator/memes/potato/__init__.py b/meme_generator/memes/potato/__init__.py index 4128c98ef8c702004fc6b23d1195154d3083aafb..ae62f49a38ad77c240ec13ce24cf6922ed4469cc 100644 --- a/meme_generator/memes/potato/__init__.py +++ b/meme_generator/memes/potato/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def potato(images: List[BuildImage], texts, args): +def potato(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") img = images[0].convert("RGBA").square().resize((458, 458)) frame.paste(img.rotate(-5), (531, 15), below=True) diff --git a/meme_generator/memes/pound/__init__.py b/meme_generator/memes/pound/__init__.py index e58fccb369953bc4365fbc4f9e193b61a4a11b44..9bb8f9e632c3ddd406a8beb5f8d3ad0b86583038 100644 --- a/meme_generator/memes/pound/__init__.py +++ b/meme_generator/memes/pound/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def pound(images: List[BuildImage], texts, args): +def pound(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square() # fmt: off locs = [ @@ -18,7 +17,7 @@ def pound(images: List[BuildImage], texts, args): (148, 188, 106, 98), (146, 196, 110, 88), (145, 223, 112, 61), (145, 223, 112, 61) ] # fmt: on - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(8): frame = BuildImage.open(img_dir / f"{i}.png") x, y, w, h = locs[i] diff --git a/meme_generator/memes/printing/__init__.py b/meme_generator/memes/printing/__init__.py index 99e79ae78745b417d55fc266449687653b715d81..e3df6637ad8452ce39ffd34e467a1683e31f4994 100644 --- a/meme_generator/memes/printing/__init__.py +++ b/meme_generator/memes/printing/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def printing(images: List[BuildImage], texts, args): +def printing(images: list[BuildImage], texts, args): img = ( images[0] .convert("RGBA") diff --git a/meme_generator/memes/prpr/__init__.py b/meme_generator/memes/prpr/__init__.py index 345ac9c946c59199b1c78fa5cc28e09d83bff387..fcfff79b4f2a2ce25d51695143e1df4c4dd2e3c9 100644 --- a/meme_generator/memes/prpr/__init__.py +++ b/meme_generator/memes/prpr/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def prpr(images: List[BuildImage], texts, args): +def prpr(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") def make(img: BuildImage) -> BuildImage: diff --git a/meme_generator/memes/psyduck/__init__.py b/meme_generator/memes/psyduck/__init__.py index 19692421cb56372bf2f4a391cd88acf110a1f5d1..b5f3eaf3347ebe6556494d466a358b09bcfc8b43 100644 --- a/meme_generator/memes/psyduck/__init__.py +++ b/meme_generator/memes/psyduck/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -11,7 +10,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def psyduck(images, texts: List[str], args): +def psyduck(images, texts: list[str], args): left_img = BuildImage.new("RGBA", (155, 100)) right_img = BuildImage.new("RGBA", (155, 100)) @@ -52,7 +51,7 @@ def psyduck(images, texts: List[str], args): ("left", ((0, 12), (154, 0), (158, 90), (17, 109)), (35, 28)), ] - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(18): frame = BuildImage.open(img_dir / f"{i}.jpg") param = params[i] diff --git a/meme_generator/memes/punch/__init__.py b/meme_generator/memes/punch/__init__.py index 441df7f31cd30735c01ba5e2edb3e2bb3fbdc108..db129dcc574deca332ee3085371ba858bee4aa6f 100644 --- a/meme_generator/memes/punch/__init__.py +++ b/meme_generator/memes/punch/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,9 +9,9 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def punch(images: List[BuildImage], texts, args): +def punch(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square().resize((260, 260)) - frames: List[IMG] = [] + frames: list[IMG] = [] # fmt: off locs = [ (-50, 20), (-40, 10), (-30, 0), (-20, -10), (-10, -10), (0, 0), diff --git a/meme_generator/memes/raise_image/__init__.py b/meme_generator/memes/raise_image/__init__.py index 84094fd691206c2d7f64cc4d9857918b88089995..ef4545644317af9741e449c0a467fd6b98f4a459 100644 --- a/meme_generator/memes/raise_image/__init__.py +++ b/meme_generator/memes/raise_image/__init__.py @@ -1,6 +1,5 @@ from io import BytesIO from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def raise_image(images: List[BuildImage], texts, args) -> BytesIO: +def raise_image(images: list[BuildImage], texts, args) -> BytesIO: inner_size = (599, 386) paste_pos = (134, 91) diff --git a/meme_generator/memes/raise_sign/__init__.py b/meme_generator/memes/raise_sign/__init__.py index 215077e17b30de1e8f44e47b72d2d102251cf73a..1e82d7eb2f7259297a66a4cc7c5d28345b753453 100644 --- a/meme_generator/memes/raise_sign/__init__.py +++ b/meme_generator/memes/raise_sign/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def raise_sign(images, texts: List[str], args): +def raise_sign(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.jpg") text_img = BuildImage.new("RGBA", (360, 260)) diff --git a/meme_generator/memes/read_book/__init__.py b/meme_generator/memes/read_book/__init__.py index 44037fb29cc0ccc862b1446c568fa9a34665d2c0..e9165e5d3de784ed7c9713860c5533959fb8565b 100644 --- a/meme_generator/memes/read_book/__init__.py +++ b/meme_generator/memes/read_book/__init__.py @@ -1,6 +1,5 @@ import re from pathlib import Path -from typing import List from pil_utils import BuildImage, Text2Image @@ -10,7 +9,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def read_book(images: List[BuildImage], texts: List[str], args): +def read_book(images: list[BuildImage], texts: list[str], args): frame = BuildImage.open(img_dir / "0.png") points = ((0, 108), (1092, 0), (1023, 1134), (29, 1134)) img = ( @@ -24,7 +23,7 @@ def read_book(images: List[BuildImage], texts: List[str], args): text = texts[0] if texts else "エロ本" chars = list(" ".join(text.splitlines())) - pieces: List[BuildImage] = [] + pieces: list[BuildImage] = [] for char in chars: piece = BuildImage( Text2Image.from_text(char, 150, fill="white", weight="bold").to_image() diff --git a/meme_generator/memes/repeat/__init__.py b/meme_generator/memes/repeat/__init__.py index e400c69fb1cf1532287c66deefc7689dfb2b9108..926bf0d545714d5c1f4bb782fae2f678a0f60ef6 100644 --- a/meme_generator/memes/repeat/__init__.py +++ b/meme_generator/memes/repeat/__init__.py @@ -1,6 +1,5 @@ from datetime import datetime from pathlib import Path -from typing import List, Tuple from PIL.Image import Image as IMG from pil_utils import BuildImage, Text2Image @@ -12,7 +11,7 @@ from meme_generator.utils import random_text, save_gif img_dir = Path(__file__).parent / "images" -def repeat(images: List[BuildImage], texts: List[str], args: MemeArgsModel): +def repeat(images: list[BuildImage], texts: list[str], args: MemeArgsModel): def single_msg(img: BuildImage, name: str) -> BuildImage: user_img = img.convert("RGBA").circle().resize((100, 100)) user_name_img = Text2Image.from_text(f"{name}", 40).to_image() @@ -30,7 +29,7 @@ def repeat(images: List[BuildImage], texts: List[str], args: MemeArgsModel): if text_img.width > 900: raise TextOverLength(text) - users: List[Tuple[BuildImage, str]] = [] + users: list[tuple[BuildImage, str]] = [] user_infos = args.user_infos for i, image in enumerate(images): name = user_infos[i].name if len(user_infos) > i else random_text() @@ -47,7 +46,7 @@ def repeat(images: List[BuildImage], texts: List[str], args: MemeArgsModel): self_img = images[0].convert("RGBA").circle().resize((75, 75)) input_img.paste(self_img, (15, 40), alpha=True) - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(50): frame = BuildImage.new("RGB", (1079, 1192), "white") frame.paste(msg_img_twice, (0, -20 * i)) diff --git a/meme_generator/memes/rip/__init__.py b/meme_generator/memes/rip/__init__.py index 5bb7c30d0e2974ecff118a97ca54a9f492b5b96f..a51a24b20c30d129dd4d2965271c43a5f3e7d6db 100644 --- a/meme_generator/memes/rip/__init__.py +++ b/meme_generator/memes/rip/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def rip(images: List[BuildImage], texts, args): +def rip(images: list[BuildImage], texts, args): if len(images) >= 2: frame = BuildImage.open(img_dir / "1.png") self_img = images[0] diff --git a/meme_generator/memes/rip_angrily/__init__.py b/meme_generator/memes/rip_angrily/__init__.py index 3b567f0e62d60a4c5493e8309dad4b6a2fa230ee..3c40f734ef530fd173e7c7b537c9eedf7e70b454 100644 --- a/meme_generator/memes/rip_angrily/__init__.py +++ b/meme_generator/memes/rip_angrily/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def rip_angrily(images: List[BuildImage], texts, args): +def rip_angrily(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square().resize((105, 105)) frame = BuildImage.open(img_dir / "0.png") frame.paste(img.rotate(-24, expand=True), (18, 170), below=True) diff --git a/meme_generator/memes/rise_dead/__init__.py b/meme_generator/memes/rise_dead/__init__.py index 469d23a4863cf54c8efd30659b1f7bda7010c5e2..ac23e37aa37761ed507a2805835fe2f384ca7e18 100644 --- a/meme_generator/memes/rise_dead/__init__.py +++ b/meme_generator/memes/rise_dead/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def rise_dead(images: List[BuildImage], texts, args): +def rise_dead(images: list[BuildImage], texts, args): locs = [ ((81, 55), ((0, 2), (101, 0), (103, 105), (1, 105))), ((74, 49), ((0, 3), (104, 0), (106, 108), (1, 108))), @@ -19,7 +18,7 @@ def rise_dead(images: List[BuildImage], texts, args): ] img = images[0].convert("RGBA").square().resize((150, 150)) imgs = [img.perspective(points) for _, points in locs] - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(34): frame = BuildImage.open(img_dir / f"{i}.png") if i <= 28: @@ -33,4 +32,6 @@ def rise_dead(images: List[BuildImage], texts, args): return save_gif(frames, 0.15) -add_meme("rise_dead", rise_dead, min_images=1, max_images=1, keywords=["诈尸", "秽土转生"]) +add_meme( + "rise_dead", rise_dead, min_images=1, max_images=1, keywords=["诈尸", "秽土转生"] +) diff --git a/meme_generator/memes/roll/__init__.py b/meme_generator/memes/roll/__init__.py index 05c5c0a56787c8ef969d218ad0d9aac138593fc7..a4140da0d43fc324a95e1359fe003b325ffcad2d 100644 --- a/meme_generator/memes/roll/__init__.py +++ b/meme_generator/memes/roll/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def roll(images: List[BuildImage], texts, args): +def roll(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square().resize((210, 210)) # fmt: off locs = [ @@ -18,7 +17,7 @@ def roll(images: List[BuildImage], texts, args): (92, 75, -180), (92, 75, -225), (93, 76, -270), (90, 80, -315) ] # fmt: on - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(8): frame = BuildImage.open(img_dir / f"{i}.png") x, y, a = locs[i] diff --git a/meme_generator/memes/rotate_3d/__init__.py b/meme_generator/memes/rotate_3d/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..fb3e76f20d643143e7f9f92bb65a43fda01062b5 --- /dev/null +++ b/meme_generator/memes/rotate_3d/__init__.py @@ -0,0 +1,69 @@ +import numpy as np +from pil_utils import BuildImage + +from meme_generator import add_meme +from meme_generator.utils import FrameAlignPolicy, Maker, make_gif_or_combined_gif + + +def rotate_3d(images: list[BuildImage], texts, args): + tmp_img = images[0].convert("RGBA") + fov = 45 * np.pi / 180 + z = np.sqrt(tmp_img.width**2 + tmp_img.height**2) / 2 / np.tan(fov / 2) + w = round(tmp_img.width * 1.2) + h = round(tmp_img.height * 1.5) + bg = BuildImage.new("RGBA", (w, h)) + + def rotate_y(img: BuildImage, theta: float) -> BuildImage: + mat = np.array( + [ + [np.cos(theta), 0, np.sin(theta)], + [0, 1, 0], + [-np.sin(theta), 0, np.cos(theta)], + ] + ) + pc = np.array([img.width / 2, img.height / 2, 0]) + orgs = [ + np.array([0, 0, 0]), + np.array([img.width, 0, 0]), + np.array([img.width, img.height, 0]), + np.array([0, img.height, 0]), + ] + dsts = [] + for i in range(4): + dst = mat.dot(orgs[i] - pc) + dsts.append( + [ + dst[0] * z / (z - dst[2]) + pc[0], + dst[1] * z / (z - dst[2]) + pc[1], + ] + ) + min_x = min(dsts, key=lambda x: x[0])[0] + min_y = min(dsts, key=lambda x: x[1])[1] + for i in range(4): + dsts[i][0] -= min_x + dsts[i][1] -= min_y + return img.perspective(tuple(dsts)) + + def maker(i: int) -> Maker: + def make(img: BuildImage) -> BuildImage: + img = img.convert("RGBA") + frame = bg.copy() + rotated = rotate_y(img, i * 12 * np.pi / 180) + frame.paste( + rotated, + ( + round((bg.width - rotated.width) / 2), + round((bg.height - rotated.height) / 2), + ), + alpha=True, + ) + return frame + + return make + + return make_gif_or_combined_gif( + images[0], maker, 30, 0.07, FrameAlignPolicy.extend_loop + ) + + +add_meme("rotate_3d", rotate_3d, min_images=1, max_images=1, keywords=["三维旋转"]) diff --git a/meme_generator/memes/rub/__init__.py b/meme_generator/memes/rub/__init__.py index b92e454e9e1849c6b5f46bbc9ed9378d30a81d54..9d7a61c01d59580c54768c7567556ae221b3ae18 100644 --- a/meme_generator/memes/rub/__init__.py +++ b/meme_generator/memes/rub/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def rub(images: List[BuildImage], texts, args): +def rub(images: list[BuildImage], texts, args): self_head = images[0].convert("RGBA").circle() user_head = images[1].convert("RGBA").circle() # fmt: off @@ -23,7 +22,7 @@ def rub(images: List[BuildImage], texts, args): (65, 5, 75, 75, -20), (95, 57, 100, 55, -70), (109, 107, 65, 75, 0) ] # fmt: on - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(6): frame = BuildImage.open(img_dir / f"{i}.png") x, y, w, h = user_locs[i] diff --git a/meme_generator/memes/run/__init__.py b/meme_generator/memes/run/__init__.py index 744cc2e0a6af5d86fc7d8282872cbca58deb7d55..5d340ed01654a747c798edc6b5a8ed9689b7bb3e 100644 --- a/meme_generator/memes/run/__init__.py +++ b/meme_generator/memes/run/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def run(images, texts: List[str], args): +def run(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.png") text_img = BuildImage.new("RGBA", (122, 53)) @@ -28,4 +27,6 @@ def run(images, texts: List[str], args): return frame.save_jpg() -add_meme("run", run, min_texts=1, max_texts=1, default_texts=["快跑"], keywords=["快跑"]) +add_meme( + "run", run, min_texts=1, max_texts=1, default_texts=["快跑"], keywords=["快跑"] +) diff --git a/meme_generator/memes/safe_sense/__init__.py b/meme_generator/memes/safe_sense/__init__.py index 9819f1543953243d5b282971d97ccaa55f38293e..bc1f895f3d4497ed068b4654e9db516f45cb3a84 100644 --- a/meme_generator/memes/safe_sense/__init__.py +++ b/meme_generator/memes/safe_sense/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def safe_sense(images: List[BuildImage], texts: List[str], args: MemeArgsModel): +def safe_sense(images: list[BuildImage], texts: list[str], args: MemeArgsModel): img = images[0].convert("RGBA").resize((215, 343), keep_ratio=True) frame = BuildImage.open(img_dir / "0.png") frame.paste(img, (215, 135)) diff --git a/meme_generator/memes/scratch_head/__init__.py b/meme_generator/memes/scratch_head/__init__.py index 7591b4f2a66f10a695a2b77cbc30bdb324d9022e..c7e7f1c14f998115dc51bd9713658dd7622e9ef1 100644 --- a/meme_generator/memes/scratch_head/__init__.py +++ b/meme_generator/memes/scratch_head/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,9 +9,9 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def scratch_head(images: List[BuildImage], texts, args): +def scratch_head(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square().resize((68, 68)) - frames: List[IMG] = [] + frames: list[IMG] = [] locs = [ (53, 46, 4, 5), (50, 45, 7, 6), diff --git a/meme_generator/memes/scratchcard/__init__.py b/meme_generator/memes/scratchcard/__init__.py index a66e1fc16b9dd4c4142007f0c5da234926689cd7..7cf160e00de4bba6221bf2a0cd16497750a94ace 100644 --- a/meme_generator/memes/scratchcard/__init__.py +++ b/meme_generator/memes/scratchcard/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def scratchcard(images, texts: List[str], args): +def scratchcard(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.png") try: diff --git a/meme_generator/memes/scroll/__init__.py b/meme_generator/memes/scroll/__init__.py index efb0c659a563bee19e592c2525b98118145cdfa7..f964053596b4fdb202db0db6fbd157e79c81d5a9 100644 --- a/meme_generator/memes/scroll/__init__.py +++ b/meme_generator/memes/scroll/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage, Text2Image @@ -11,7 +10,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def scroll(images, texts: List[str], args): +def scroll(images, texts: list[str], args): text = texts[0] text2image = Text2Image.from_text(text, 40).wrap(600) if len(text2image.lines) > 5: @@ -38,7 +37,7 @@ def scroll(images, texts: List[str], args): for i in range(4): dialog.paste(box, (0, box_h * i)) - frames: List[IMG] = [] + frames: list[IMG] = [] num = 30 dy = int(dialog.height / num) for i in range(num): @@ -50,5 +49,10 @@ def scroll(images, texts: List[str], args): add_meme( - "scroll", scroll, min_texts=1, max_texts=1, default_texts=["你们说话啊"], keywords=["滚屏"] + "scroll", + scroll, + min_texts=1, + max_texts=1, + default_texts=["你们说话啊"], + keywords=["滚屏"], ) diff --git a/meme_generator/memes/shock/__init__.py b/meme_generator/memes/shock/__init__.py index e69a6ed6dd316ccac8d89be85c07a87c59210c80..f90e2bccc7134159a86c01b1106948a9a96f9517 100644 --- a/meme_generator/memes/shock/__init__.py +++ b/meme_generator/memes/shock/__init__.py @@ -1,5 +1,4 @@ import random -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -8,9 +7,9 @@ from meme_generator import add_meme from meme_generator.utils import save_gif -def shock(images: List[BuildImage], texts, args): +def shock(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square().resize((300, 300)) - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(30): frames.append( img.motion_blur(random.randint(-90, 90), random.randint(0, 50)) diff --git a/meme_generator/memes/shutup/__init__.py b/meme_generator/memes/shutup/__init__.py index 381dd7b7822b4726b7c5b1afdc854e7f838c20cb..57c2fd04218c58987db512b087de60bbdfe522b2 100644 --- a/meme_generator/memes/shutup/__init__.py +++ b/meme_generator/memes/shutup/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def shutup(images, texts: List[str], args): +def shutup(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.jpg") try: diff --git a/meme_generator/memes/sit_still/__init__.py b/meme_generator/memes/sit_still/__init__.py index b532d7c0538b076911c6006e10a2b1f2440d9103..5e44a774c9ab276d0768c4f9c4de217b59ba1d96 100644 --- a/meme_generator/memes/sit_still/__init__.py +++ b/meme_generator/memes/sit_still/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def sit_still(images: List[BuildImage], texts: List[str], args: MemeArgsModel): +def sit_still(images: list[BuildImage], texts: list[str], args: MemeArgsModel): name = texts[0] if texts else args.user_infos[0].name if args.user_infos else "" frame = BuildImage.open(img_dir / "0.png") if name: diff --git a/meme_generator/memes/slap/__init__.py b/meme_generator/memes/slap/__init__.py index 607035155c1389dd46e51ef662fc4b1d0bbf8461..a17396c246a848e02a2dbefccd6327e124ddc48c 100644 --- a/meme_generator/memes/slap/__init__.py +++ b/meme_generator/memes/slap/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def slap(images, texts: List[str], args): +def slap(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.jpg") try: diff --git a/meme_generator/memes/slogan/__init__.py b/meme_generator/memes/slogan/__init__.py index 88c36278f3f2efdc90aab0ef4746a01fb11ea897..be4ac683f8179b2653b45f763051d3a376c463c2 100644 --- a/meme_generator/memes/slogan/__init__.py +++ b/meme_generator/memes/slogan/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List, Tuple from pil_utils import BuildImage @@ -9,10 +8,10 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def slogan(images, texts: List[str], args): +def slogan(images, texts: list[str], args): frame = BuildImage.open(img_dir / "0.jpg") - def draw(pos: Tuple[float, float, float, float], text: str): + def draw(pos: tuple[float, float, float, float], text: str): try: frame.draw_text( pos, text, max_fontsize=40, min_fontsize=15, allow_wrap=True @@ -35,6 +34,13 @@ add_meme( slogan, min_texts=6, max_texts=6, - default_texts=["我们是谁?", "浙大人!", "到浙大来做什么?", "混!", "将来毕业后要做什么样的人?", "混混!"], + default_texts=[ + "我们是谁?", + "浙大人!", + "到浙大来做什么?", + "混!", + "将来毕业后要做什么样的人?", + "混混!", + ], keywords=["口号"], ) diff --git a/meme_generator/memes/smash/__init__.py b/meme_generator/memes/smash/__init__.py index 17d6823604fc2e251fbeb781c899c613d8e88966..c1bc83a0fce2f0bdfee5b0116a40df8ffb6ae7f8 100644 --- a/meme_generator/memes/smash/__init__.py +++ b/meme_generator/memes/smash/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def smash(images: List[BuildImage], texts, args): +def smash(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") def make(img: BuildImage) -> BuildImage: diff --git a/meme_generator/memes/step_on/__init__.py b/meme_generator/memes/step_on/__init__.py index aea65259d02482005b0b13eb3a247c938a28a274..fae445f6579f61cfdcbba302e3a8d9f8cd767596 100644 --- a/meme_generator/memes/step_on/__init__.py +++ b/meme_generator/memes/step_on/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,9 +9,9 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def step_on(images: List[BuildImage], texts, args): +def step_on(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize((100, 100), keep_ratio=True) - frames: List[IMG] = [] + frames: list[IMG] = [] locs = [ (104, 72, 32, 185, -25), (104, 72, 32, 185, -25), diff --git a/meme_generator/memes/stew/__init__.py b/meme_generator/memes/stew/__init__.py index 179b2d1a31dc5c31a3d86e9ad9fc7f6c2627d97f..d2a02f85b7498f2d29f9b07dfe1f9e21222df496 100644 --- a/meme_generator/memes/stew/__init__.py +++ b/meme_generator/memes/stew/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def stew(images: List[BuildImage], texts: List[str], args: MemeArgsModel): +def stew(images: list[BuildImage], texts: list[str], args: MemeArgsModel): name = texts[0] if texts else args.user_infos[0].name if args.user_infos else "群友" text = f"生活不易,炖{name}出气" diff --git a/meme_generator/memes/subject3/__init__.py b/meme_generator/memes/subject3/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..c78d4ba73419f18e75924626a8b6bccb3ce9a5da --- /dev/null +++ b/meme_generator/memes/subject3/__init__.py @@ -0,0 +1,44 @@ +from pathlib import Path + +from PIL.Image import Image as IMG +from pil_utils import BuildImage + +from meme_generator import add_meme +from meme_generator.utils import save_gif + +img_dir = Path(__file__).parent / "images" + + +def subject3(images: list[BuildImage], texts, args): + self_head = images[0].convert("RGBA").circle().resize((120, 120)) + # fmt: off + locs = [ + (60, 71), (61, 73), (62, 71), (66, 70), (75, 69), + (87, 74), (87, 74), (85, 76), (79, 73), (76, 71), + (68, 69), (66, 73), (66, 74), (66, 74), (66, 71), + (76, 65), (80, 65), (91, 73), (91, 77), (91, 75), + (86, 71), (83, 69), (78, 68), (73, 67), (68, 74), + (68, 77), (71, 73), (81, 68), (88, 69), (96, 73), + (98, 78), (97, 79), (93, 76), (85, 71), (80, 66), + (71, 69), (69, 74), (68, 77), (68, 77), (80, 70), + (91, 68), (95, 71), (98, 78), (97, 79), (95, 78), + (86, 69), (77, 64), (71, 69), (71, 73), (69, 73), + (73, 67), (78, 65), (88, 65), (91, 72), (94, 77), + (91, 74), (89, 70), (83, 63), (75, 60), (69, 67), + (67, 74), (68, 73), (76, 64), (77, 60), (84, 62), + (92, 68), (92, 73), (90, 69), (86, 66), (80, 61), + (69, 63), (65, 67), (60, 76), (62, 73), (66, 68), + (75, 62), (77, 62), (85, 69), (86, 73), (85, 75), + (78, 70), (74, 67), (67, 67), (65, 72), (65, 79), + ] + # fmt: on + frames: list[IMG] = [] + for i in range(85): + frame = BuildImage.open(img_dir / f"{i}.png") + frame.paste(self_head, locs[i], alpha=True) + frames.append(frame.image) + + return save_gif(frames, 0.08) + + +add_meme("subject3", subject3, min_images=1, max_images=1, keywords=["科目三"]) diff --git a/meme_generator/memes/subject3/images/0.png b/meme_generator/memes/subject3/images/0.png new file mode 100644 index 0000000000000000000000000000000000000000..86d888c3e984ad955d35c40c6cf75d642cfdbb3a --- /dev/null +++ b/meme_generator/memes/subject3/images/0.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75e270db3de7c3f6bc6b0677cc02063551ca5124c1e4a0ca0a10d9324b3db555 +size 122114 diff --git a/meme_generator/memes/subject3/images/1.png b/meme_generator/memes/subject3/images/1.png new file mode 100644 index 0000000000000000000000000000000000000000..73a3b58329d308df1fa75180717fb965b21516aa --- /dev/null +++ b/meme_generator/memes/subject3/images/1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28b65f5606a2127b32df49b4c84c820f2525059504bc7148f38b6dcea5dd2123 +size 121997 diff --git a/meme_generator/memes/subject3/images/10.png b/meme_generator/memes/subject3/images/10.png new file mode 100644 index 0000000000000000000000000000000000000000..3f247373eb5be2c25cbcff22277a13417ee0e19f --- /dev/null +++ b/meme_generator/memes/subject3/images/10.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f89906187f02881bea9b178d0ffa8ee53b04117aa2a90c985ff18caebdd8256 +size 120547 diff --git a/meme_generator/memes/subject3/images/11.png b/meme_generator/memes/subject3/images/11.png new file mode 100644 index 0000000000000000000000000000000000000000..76a155b4ff70b14be7e384c119a858f9d18e22e7 --- /dev/null +++ b/meme_generator/memes/subject3/images/11.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eaf8fa8d17a3d026dc4eff9bc98bffb6d799893634b92d298ac432eebf6d319a +size 121590 diff --git a/meme_generator/memes/subject3/images/12.png b/meme_generator/memes/subject3/images/12.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd0d8e348b0c781332b96214b02e7fc97d0515c --- /dev/null +++ b/meme_generator/memes/subject3/images/12.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1a6c1058b317fdd093f9db211448a4d26c177dcaae1cbd21c907f5076c46b3c +size 122875 diff --git a/meme_generator/memes/subject3/images/13.png b/meme_generator/memes/subject3/images/13.png new file mode 100644 index 0000000000000000000000000000000000000000..31f4f2f6ff952e9606257c9d186a24121cf2cf09 --- /dev/null +++ b/meme_generator/memes/subject3/images/13.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c12f37b1a17a6d3fe6b15289a451084a23969ff9a419c3958e1f4b13c1caebc4 +size 121766 diff --git a/meme_generator/memes/subject3/images/14.png b/meme_generator/memes/subject3/images/14.png new file mode 100644 index 0000000000000000000000000000000000000000..5b02f01e3cd95a775ce0391d6a80047937b620a6 --- /dev/null +++ b/meme_generator/memes/subject3/images/14.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:915900bffe3ec838f33794ae0f02fa3ece065b139e336fdf07a590d0ab963e04 +size 122907 diff --git a/meme_generator/memes/subject3/images/15.png b/meme_generator/memes/subject3/images/15.png new file mode 100644 index 0000000000000000000000000000000000000000..6726090fa6bba93a7823f9a178f21e0dc0e66d47 --- /dev/null +++ b/meme_generator/memes/subject3/images/15.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18d6973a7f5b1ae7177bb13ef622a47bdf2729394bf6a655b14941971e7dfe7e +size 122828 diff --git a/meme_generator/memes/subject3/images/16.png b/meme_generator/memes/subject3/images/16.png new file mode 100644 index 0000000000000000000000000000000000000000..399b47a93d02d2e31dde084082ef3486fac1cc50 --- /dev/null +++ b/meme_generator/memes/subject3/images/16.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f0cc51266ece412311d71181fa2252bcd01802803f9fdea6cea3212156518b3 +size 120720 diff --git a/meme_generator/memes/subject3/images/17.png b/meme_generator/memes/subject3/images/17.png new file mode 100644 index 0000000000000000000000000000000000000000..15ef388424f5707abc39948b3bc282839f1bc195 --- /dev/null +++ b/meme_generator/memes/subject3/images/17.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9318eb68d24c8fc69d0e4bfd65f52a4f359092239ccca9dfcb08cbfc6827af97 +size 121336 diff --git a/meme_generator/memes/subject3/images/18.png b/meme_generator/memes/subject3/images/18.png new file mode 100644 index 0000000000000000000000000000000000000000..2eab73c1817834cd5600057f21f0dd066c2e2b89 --- /dev/null +++ b/meme_generator/memes/subject3/images/18.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3bd2db34248ac69fd105b99acf313490f418fbef923cba483e3de1c839d5ed42 +size 121687 diff --git a/meme_generator/memes/subject3/images/19.png b/meme_generator/memes/subject3/images/19.png new file mode 100644 index 0000000000000000000000000000000000000000..174592149aab23cc869619c60f8efdd44f08e988 --- /dev/null +++ b/meme_generator/memes/subject3/images/19.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce5a3d474a7a04ed6680a71164113e57879dabaecf49e02e763b701c2611d738 +size 122274 diff --git a/meme_generator/memes/subject3/images/2.png b/meme_generator/memes/subject3/images/2.png new file mode 100644 index 0000000000000000000000000000000000000000..9c842cd0cec6f9f779015dd8374b4a189a9cbf2c --- /dev/null +++ b/meme_generator/memes/subject3/images/2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7732ea877d09c7699f44ace9f56322955730f8014104add37371f372450517ac +size 121269 diff --git a/meme_generator/memes/subject3/images/20.png b/meme_generator/memes/subject3/images/20.png new file mode 100644 index 0000000000000000000000000000000000000000..2de8290a0966b9ee473c2974a0df524a605f5467 --- /dev/null +++ b/meme_generator/memes/subject3/images/20.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5e7fe38aa75e09f2b4470dcb9ef3d1049be2c8e363df906b9bfde2459cdd69b +size 122340 diff --git a/meme_generator/memes/subject3/images/21.png b/meme_generator/memes/subject3/images/21.png new file mode 100644 index 0000000000000000000000000000000000000000..cb473795b1b2cb405c42fc0f333fe42fc65640f5 --- /dev/null +++ b/meme_generator/memes/subject3/images/21.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1803362b87dd2dac6261c0b95de42c45646632a45270e6dab596fc124ccb8209 +size 121497 diff --git a/meme_generator/memes/subject3/images/22.png b/meme_generator/memes/subject3/images/22.png new file mode 100644 index 0000000000000000000000000000000000000000..4e8ef50ec3baee1a7e3e08a9726badedf5bd4cb1 --- /dev/null +++ b/meme_generator/memes/subject3/images/22.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8c1948e2a83fa5b631ffea39a8c9d8b7c01bd484e14c756a28ec494d10dac12 +size 122589 diff --git a/meme_generator/memes/subject3/images/23.png b/meme_generator/memes/subject3/images/23.png new file mode 100644 index 0000000000000000000000000000000000000000..b064ab4525880475152e3f9fac39f085851d69eb --- /dev/null +++ b/meme_generator/memes/subject3/images/23.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ee3daf2db62b677da49b2a9a36c4749cdab61707b950a6d8daa84a84020b1aa +size 120293 diff --git a/meme_generator/memes/subject3/images/24.png b/meme_generator/memes/subject3/images/24.png new file mode 100644 index 0000000000000000000000000000000000000000..98b9a0fb14bc75636ee55b76f0e065e9031aa032 --- /dev/null +++ b/meme_generator/memes/subject3/images/24.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e97eccab76b993997751f8490a1cd8df897d901ac6009160144c3df25e77a4d4 +size 120285 diff --git a/meme_generator/memes/subject3/images/25.png b/meme_generator/memes/subject3/images/25.png new file mode 100644 index 0000000000000000000000000000000000000000..777d7e588f0883799a33a45801460a380bbeb0d0 --- /dev/null +++ b/meme_generator/memes/subject3/images/25.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:baf7ceaa8110e18fb5151fae8ba4af07dca0f0c90c9493ab0d381a2c18f09847 +size 120586 diff --git a/meme_generator/memes/subject3/images/26.png b/meme_generator/memes/subject3/images/26.png new file mode 100644 index 0000000000000000000000000000000000000000..112e38856dcab8c4ce8ef7c2c2afe59ab607bad4 --- /dev/null +++ b/meme_generator/memes/subject3/images/26.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b8522d49c33581565fbabbd6f474414eaf598b22c9d88bf46f93eb472144812a +size 120993 diff --git a/meme_generator/memes/subject3/images/27.png b/meme_generator/memes/subject3/images/27.png new file mode 100644 index 0000000000000000000000000000000000000000..b546c52e2a903c6240deec3769962241acd7c46b --- /dev/null +++ b/meme_generator/memes/subject3/images/27.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c4420a42a346ac68dbb13b1b0c5a7619bd3fc47b354fc3c4e330c3a31e5d45c +size 121308 diff --git a/meme_generator/memes/subject3/images/28.png b/meme_generator/memes/subject3/images/28.png new file mode 100644 index 0000000000000000000000000000000000000000..62a662e22d0992133decb09ae3e6ac4a16f4308e --- /dev/null +++ b/meme_generator/memes/subject3/images/28.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7bd3f3f7b43d50e85b4e1f04edb41efefe9d2e2d82219ac6e4823d6a70660047 +size 119910 diff --git a/meme_generator/memes/subject3/images/29.png b/meme_generator/memes/subject3/images/29.png new file mode 100644 index 0000000000000000000000000000000000000000..768b5820a69262fca7d02411fc9419051468d4b2 --- /dev/null +++ b/meme_generator/memes/subject3/images/29.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:959ce3ff4fdeacc8141fc9f01ee0e745392467441b8cdc21c406012a4699807a +size 120770 diff --git a/meme_generator/memes/subject3/images/3.png b/meme_generator/memes/subject3/images/3.png new file mode 100644 index 0000000000000000000000000000000000000000..d92e7b6e29cfaa61c892f3818e64ea3f5d4da7f7 --- /dev/null +++ b/meme_generator/memes/subject3/images/3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1a1a8368a0bca0ec75486842f81818054cd6a219ac662a153b81022c033469c +size 120377 diff --git a/meme_generator/memes/subject3/images/30.png b/meme_generator/memes/subject3/images/30.png new file mode 100644 index 0000000000000000000000000000000000000000..0094d00359119f6b7c245ce81604eeced58b80a2 --- /dev/null +++ b/meme_generator/memes/subject3/images/30.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e57d3e04718b64ecfb260d7700bfdf015cadd822cf8409bf45219ee7ae4a4d2 +size 121491 diff --git a/meme_generator/memes/subject3/images/31.png b/meme_generator/memes/subject3/images/31.png new file mode 100644 index 0000000000000000000000000000000000000000..822dd786e487ab20491f9bbbbf7b9d5628c8453e --- /dev/null +++ b/meme_generator/memes/subject3/images/31.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c367e70f5d902fc70f7606d33260183b78958a63e47bef197fef832fdacdb58f +size 123093 diff --git a/meme_generator/memes/subject3/images/32.png b/meme_generator/memes/subject3/images/32.png new file mode 100644 index 0000000000000000000000000000000000000000..4a6fe6e1df51b88e9840ce9289b3337a335472be --- /dev/null +++ b/meme_generator/memes/subject3/images/32.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ddab347dbb37e79f0602d8ccec255d16bb5c9bd921e58555212728c7df73bef +size 123051 diff --git a/meme_generator/memes/subject3/images/33.png b/meme_generator/memes/subject3/images/33.png new file mode 100644 index 0000000000000000000000000000000000000000..794b7ef3c0f73e54c7ced6ffc294b3e789120fb0 --- /dev/null +++ b/meme_generator/memes/subject3/images/33.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41ebc8f16f5baa0563bcbd98904d0de8a4d45b4a05f2f426f8b5398aec27c8cf +size 123692 diff --git a/meme_generator/memes/subject3/images/34.png b/meme_generator/memes/subject3/images/34.png new file mode 100644 index 0000000000000000000000000000000000000000..dc3b6945747bdb9954e5238ca8d8c0891a248831 --- /dev/null +++ b/meme_generator/memes/subject3/images/34.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65afaa6cbb54ec11c6a853da5dc150bd0851d6a0d3b681342941825b99da2181 +size 121206 diff --git a/meme_generator/memes/subject3/images/35.png b/meme_generator/memes/subject3/images/35.png new file mode 100644 index 0000000000000000000000000000000000000000..30fa944c6ba937b3cbd126de6d739dc187e7c55a --- /dev/null +++ b/meme_generator/memes/subject3/images/35.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d780056687595c1c043014cc5bcb09a84d284bf99654932f66d417db5815a470 +size 121118 diff --git a/meme_generator/memes/subject3/images/36.png b/meme_generator/memes/subject3/images/36.png new file mode 100644 index 0000000000000000000000000000000000000000..b510fbb3b5ae2f249c468936a8811c45153cde51 --- /dev/null +++ b/meme_generator/memes/subject3/images/36.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:501b3f65a88e5ef23fcd0075a94827a081ec8a04a7a2874064f5da3f2de45dca +size 121435 diff --git a/meme_generator/memes/subject3/images/37.png b/meme_generator/memes/subject3/images/37.png new file mode 100644 index 0000000000000000000000000000000000000000..077b61d521631a79df4f0649e3bfdaec1a16c014 --- /dev/null +++ b/meme_generator/memes/subject3/images/37.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:63876de5f5a686af1dffa4e1e02cc96b42787228b62b440159a0e4ee1b225cf8 +size 121256 diff --git a/meme_generator/memes/subject3/images/38.png b/meme_generator/memes/subject3/images/38.png new file mode 100644 index 0000000000000000000000000000000000000000..eed57ee5a93f85cbc2fcc3f0464102f53d94d5e0 --- /dev/null +++ b/meme_generator/memes/subject3/images/38.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b63942b56e121c4a2cfb57e8e46dfcd4ed771b916e8754e84a3133184a6c061f +size 120417 diff --git a/meme_generator/memes/subject3/images/39.png b/meme_generator/memes/subject3/images/39.png new file mode 100644 index 0000000000000000000000000000000000000000..fea8a28f78dfd8704cbd46d5abbfa389f777f232 --- /dev/null +++ b/meme_generator/memes/subject3/images/39.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:340854ff202a53cd9a0fe43e1b8ea98181b20a42fe7dac192642e692fe99242d +size 120379 diff --git a/meme_generator/memes/subject3/images/4.png b/meme_generator/memes/subject3/images/4.png new file mode 100644 index 0000000000000000000000000000000000000000..6d7018e8cc9350255aeb267af3bfb83ac7a9f786 --- /dev/null +++ b/meme_generator/memes/subject3/images/4.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50dbc78907f9b487403081b16f9d4228d81947d79efe57d29d13a8bd7974d9cb +size 120404 diff --git a/meme_generator/memes/subject3/images/40.png b/meme_generator/memes/subject3/images/40.png new file mode 100644 index 0000000000000000000000000000000000000000..e3f7f48faef81ae1687adacc665d5b71d18035f7 --- /dev/null +++ b/meme_generator/memes/subject3/images/40.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:323fa5d02b7d55f96f9d57262c48271689bc8474c4616536ea23d14ddd5bf923 +size 118903 diff --git a/meme_generator/memes/subject3/images/41.png b/meme_generator/memes/subject3/images/41.png new file mode 100644 index 0000000000000000000000000000000000000000..4eda272a5d9bdb1df01ad8c9b5d6fee35dbae86b --- /dev/null +++ b/meme_generator/memes/subject3/images/41.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33256685ed4a03d26dcb1fcd4be20f5f655428b1c344fa453dea40160965b538 +size 121941 diff --git a/meme_generator/memes/subject3/images/42.png b/meme_generator/memes/subject3/images/42.png new file mode 100644 index 0000000000000000000000000000000000000000..0f169f2bdba73c6def046bf9f22b65eba63fc452 --- /dev/null +++ b/meme_generator/memes/subject3/images/42.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:748ca282501d35ed4d501ed13790d8da37b9ab52b1aa9f4203c575bc1820a721 +size 123277 diff --git a/meme_generator/memes/subject3/images/43.png b/meme_generator/memes/subject3/images/43.png new file mode 100644 index 0000000000000000000000000000000000000000..aea445ba4552120e58f4563134cd8e11a556089f --- /dev/null +++ b/meme_generator/memes/subject3/images/43.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f318ac5a36b886006524d505c9685cc27bd19cae691fb5048c4bacfc38de1b2 +size 123353 diff --git a/meme_generator/memes/subject3/images/44.png b/meme_generator/memes/subject3/images/44.png new file mode 100644 index 0000000000000000000000000000000000000000..5e5920bc6c622ab1f9ace3b3d3e43e5c40b10a79 --- /dev/null +++ b/meme_generator/memes/subject3/images/44.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf3e98be1871a24a841e55e09249d57de556555a0d685ef28763f95d1559da9c +size 123925 diff --git a/meme_generator/memes/subject3/images/45.png b/meme_generator/memes/subject3/images/45.png new file mode 100644 index 0000000000000000000000000000000000000000..7a566bfb55d2e29739c3b3538c61532cae277e5b --- /dev/null +++ b/meme_generator/memes/subject3/images/45.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2e08ad91703597c44220c6c6bab346fcfa25a55868e73216e2184fba1080fca +size 123771 diff --git a/meme_generator/memes/subject3/images/46.png b/meme_generator/memes/subject3/images/46.png new file mode 100644 index 0000000000000000000000000000000000000000..9cd63cef96e87de37b97065e7c701974281ffd12 --- /dev/null +++ b/meme_generator/memes/subject3/images/46.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e43130de8332180f5459b7e449370446556ff88ebc6414a4088032347685d86c +size 123629 diff --git a/meme_generator/memes/subject3/images/47.png b/meme_generator/memes/subject3/images/47.png new file mode 100644 index 0000000000000000000000000000000000000000..1194af6a4644767e1c4b7e7e9c38c0fdfa75b3ff --- /dev/null +++ b/meme_generator/memes/subject3/images/47.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0dfef72d0ca18013aefbde4bad5408dbe8862f93388480392640224ab4cf34ee +size 120993 diff --git a/meme_generator/memes/subject3/images/48.png b/meme_generator/memes/subject3/images/48.png new file mode 100644 index 0000000000000000000000000000000000000000..a84780f80cf2f0c5851b8cb4c29171eee9d0dad6 --- /dev/null +++ b/meme_generator/memes/subject3/images/48.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6ce80f2852b4f462014331a8ff5ec2c3b9559d0bc36d44c875e83bfca23ad4e +size 121928 diff --git a/meme_generator/memes/subject3/images/49.png b/meme_generator/memes/subject3/images/49.png new file mode 100644 index 0000000000000000000000000000000000000000..f5410c4f9cabccd6f1679dc5734f7b6b19265260 --- /dev/null +++ b/meme_generator/memes/subject3/images/49.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e12c874c38ae5c2958b6708c85ffe73889f8e5743b7835875c97556d5e41510 +size 121177 diff --git a/meme_generator/memes/subject3/images/5.png b/meme_generator/memes/subject3/images/5.png new file mode 100644 index 0000000000000000000000000000000000000000..519de8902e930fd92e110a1bdb17d619f27019f3 --- /dev/null +++ b/meme_generator/memes/subject3/images/5.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ff26b48ceb8fa249cadf0681e10d7acda789fead5c7212d982d6cb9aaf3d1b0 +size 120064 diff --git a/meme_generator/memes/subject3/images/50.png b/meme_generator/memes/subject3/images/50.png new file mode 100644 index 0000000000000000000000000000000000000000..580f37123b4aae767d0c2131621308fcf21700cb --- /dev/null +++ b/meme_generator/memes/subject3/images/50.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4cfd254ebd92d35434fe59ea5a4764599b48d57584f72802f8839813a2054c7 +size 122067 diff --git a/meme_generator/memes/subject3/images/51.png b/meme_generator/memes/subject3/images/51.png new file mode 100644 index 0000000000000000000000000000000000000000..ae8c69f473709cda5de99810cb75d841faef5c63 --- /dev/null +++ b/meme_generator/memes/subject3/images/51.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6aee9d2c577c8f0785f548190cf2d48d0f0e3680e6079a6f07355b14b405ded1 +size 121982 diff --git a/meme_generator/memes/subject3/images/52.png b/meme_generator/memes/subject3/images/52.png new file mode 100644 index 0000000000000000000000000000000000000000..99a235e5248123e832dc0b9ed08bbb94a3a13315 --- /dev/null +++ b/meme_generator/memes/subject3/images/52.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3dcc9c7a5414d47038cd1a99c227486916a6d77f8ee157b09d025313f87d6ef +size 122572 diff --git a/meme_generator/memes/subject3/images/53.png b/meme_generator/memes/subject3/images/53.png new file mode 100644 index 0000000000000000000000000000000000000000..b7930852eb8a261f19dcea4d8911402cb06517d9 --- /dev/null +++ b/meme_generator/memes/subject3/images/53.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d5fb2edb537a1c85f33c1d5cdee02f55a85a889d6587343b944aa75e13e131c +size 123288 diff --git a/meme_generator/memes/subject3/images/54.png b/meme_generator/memes/subject3/images/54.png new file mode 100644 index 0000000000000000000000000000000000000000..ea90778e3e6ad5f3cb17e25d69de0ffbc85242fa --- /dev/null +++ b/meme_generator/memes/subject3/images/54.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db71f37d86cc0b6c6a262863c326b3b7753c2c03fe2f74bb0bc10ae934eb13a3 +size 125139 diff --git a/meme_generator/memes/subject3/images/55.png b/meme_generator/memes/subject3/images/55.png new file mode 100644 index 0000000000000000000000000000000000000000..d17b3986497d0a08a4815294f6f0607697b4bb42 --- /dev/null +++ b/meme_generator/memes/subject3/images/55.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6538f424268c2b2cfdfdbf276541663d8bf595904266fced9a7016dd76dac8a +size 124889 diff --git a/meme_generator/memes/subject3/images/56.png b/meme_generator/memes/subject3/images/56.png new file mode 100644 index 0000000000000000000000000000000000000000..713ac219c31dcca931c90bca17c8ec524712874c --- /dev/null +++ b/meme_generator/memes/subject3/images/56.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:312e9957ba8c84265c324852111e81648e60c01ea9673226447d8639734192e2 +size 122981 diff --git a/meme_generator/memes/subject3/images/57.png b/meme_generator/memes/subject3/images/57.png new file mode 100644 index 0000000000000000000000000000000000000000..4a4393975d121ed73e8de109d369bdbd4c2a72b5 --- /dev/null +++ b/meme_generator/memes/subject3/images/57.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06e6cd664c5a5d02cbd3199a9754ba65c0ba6f6f1935f1892b14b62aded78515 +size 123445 diff --git a/meme_generator/memes/subject3/images/58.png b/meme_generator/memes/subject3/images/58.png new file mode 100644 index 0000000000000000000000000000000000000000..652c6c157ef7a68dabe8b43e0e531815c66340d3 --- /dev/null +++ b/meme_generator/memes/subject3/images/58.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1184d00df355ff1fae769c33dce182d9322f68560b630334f12a1a5a3db58f37 +size 121538 diff --git a/meme_generator/memes/subject3/images/59.png b/meme_generator/memes/subject3/images/59.png new file mode 100644 index 0000000000000000000000000000000000000000..24936e5455b4e533f499edc20224886f922504c5 --- /dev/null +++ b/meme_generator/memes/subject3/images/59.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ce7fdb4d437869423b7074e5e7dadfbbe5ba14ad83bcfd8bbcda811ef354026 +size 121044 diff --git a/meme_generator/memes/subject3/images/6.png b/meme_generator/memes/subject3/images/6.png new file mode 100644 index 0000000000000000000000000000000000000000..3d93ad9d7300c44c946e23cbfed8e1ddd1cdbbb9 --- /dev/null +++ b/meme_generator/memes/subject3/images/6.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4dc250889d69b7e673af49681c84b4ec9c3d345f716fe395bb955daee1492379 +size 121921 diff --git a/meme_generator/memes/subject3/images/60.png b/meme_generator/memes/subject3/images/60.png new file mode 100644 index 0000000000000000000000000000000000000000..1f78bd0edc8d81216747d28416db20bd0f63fcc3 --- /dev/null +++ b/meme_generator/memes/subject3/images/60.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e4769c3e46171e9736c65034720effdf22be05bd1cbb5dad2f45088397198b5 +size 120536 diff --git a/meme_generator/memes/subject3/images/61.png b/meme_generator/memes/subject3/images/61.png new file mode 100644 index 0000000000000000000000000000000000000000..5c4ca26a68e9cc2f0252ab67841872491ba6fe02 --- /dev/null +++ b/meme_generator/memes/subject3/images/61.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3b2ca619b281333429f837de32d6f0579100495e815fd650e0d39594f8208f2 +size 121417 diff --git a/meme_generator/memes/subject3/images/62.png b/meme_generator/memes/subject3/images/62.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c0a8afd0334225f69dcad5540c32e2af760459 --- /dev/null +++ b/meme_generator/memes/subject3/images/62.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cdce8de25f7b63ad47eb7a8555b6a96acea6b81449cfdad97d2b5a77379cd06 +size 121771 diff --git a/meme_generator/memes/subject3/images/63.png b/meme_generator/memes/subject3/images/63.png new file mode 100644 index 0000000000000000000000000000000000000000..7d70945cab2eaa612b2ffb84de7f1c701b605694 --- /dev/null +++ b/meme_generator/memes/subject3/images/63.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1a482784630d606d0f7f38e4e15723d1ae81fb0448883b8b523481c7a0c9de1 +size 120905 diff --git a/meme_generator/memes/subject3/images/64.png b/meme_generator/memes/subject3/images/64.png new file mode 100644 index 0000000000000000000000000000000000000000..0a44638d17d56fd0d424f8288f42540bcd7143de --- /dev/null +++ b/meme_generator/memes/subject3/images/64.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2554b91ab64ef3f00060e07cd168866f7bdafdd262c7b3b8eaa47efb82c3ee71 +size 121419 diff --git a/meme_generator/memes/subject3/images/65.png b/meme_generator/memes/subject3/images/65.png new file mode 100644 index 0000000000000000000000000000000000000000..f0d8ec40c3a1ae9e41b92aa87cfcad4724dd55ed --- /dev/null +++ b/meme_generator/memes/subject3/images/65.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0332d0e2f8fe4eef7993994ade1509eadcd5ff9e99a7029ede705fbef4f95274 +size 121668 diff --git a/meme_generator/memes/subject3/images/66.png b/meme_generator/memes/subject3/images/66.png new file mode 100644 index 0000000000000000000000000000000000000000..2a84697fc0302b43e0d80358506b8bf6a1efd469 --- /dev/null +++ b/meme_generator/memes/subject3/images/66.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72f60b9a962fe650172bcc79f2849a9ad2ac6abf3747a5859f34c424695d5548 +size 122342 diff --git a/meme_generator/memes/subject3/images/67.png b/meme_generator/memes/subject3/images/67.png new file mode 100644 index 0000000000000000000000000000000000000000..80fe5b6e8139cb6776d669d20f319c6b61112748 --- /dev/null +++ b/meme_generator/memes/subject3/images/67.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:117145b22c6bd351d41c5966e939ea08a93012f5c5ea6864143c7765fcc0c065 +size 123435 diff --git a/meme_generator/memes/subject3/images/68.png b/meme_generator/memes/subject3/images/68.png new file mode 100644 index 0000000000000000000000000000000000000000..d691ed63020f1fa184ed8b1e19b8286cac656b48 --- /dev/null +++ b/meme_generator/memes/subject3/images/68.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f846d32ed0f1c744b2549b9b0c8edc80756beedba51257d3cb1d9e0360e81a45 +size 123141 diff --git a/meme_generator/memes/subject3/images/69.png b/meme_generator/memes/subject3/images/69.png new file mode 100644 index 0000000000000000000000000000000000000000..07e6cd752807df521f6aabab86f436a5e8c9803d --- /dev/null +++ b/meme_generator/memes/subject3/images/69.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7a0afbe3faf82737ec2e53b06c375e35b9a864cb363126db2db6501415258ae +size 121214 diff --git a/meme_generator/memes/subject3/images/7.png b/meme_generator/memes/subject3/images/7.png new file mode 100644 index 0000000000000000000000000000000000000000..d4c4e232f17e705da70b236d68f2f2c0b7289c93 --- /dev/null +++ b/meme_generator/memes/subject3/images/7.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e03dc46725881e755e810e596782358b89645701329751494b32da92ea77536 +size 122662 diff --git a/meme_generator/memes/subject3/images/70.png b/meme_generator/memes/subject3/images/70.png new file mode 100644 index 0000000000000000000000000000000000000000..10825e6da688485d8d16fa554d42a7a1184185fd --- /dev/null +++ b/meme_generator/memes/subject3/images/70.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07ac4d23a9bcfb80282fd715781ac64b029c9cdf4c75c6093686a739941ff55c +size 121607 diff --git a/meme_generator/memes/subject3/images/71.png b/meme_generator/memes/subject3/images/71.png new file mode 100644 index 0000000000000000000000000000000000000000..dacaaa72465d45e1633667161fc4b65508a8e94e --- /dev/null +++ b/meme_generator/memes/subject3/images/71.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a16d09a43ae64133ac1d8387884e4993c1a43b2d712ef6af5f0ee734c1068aa6 +size 121394 diff --git a/meme_generator/memes/subject3/images/72.png b/meme_generator/memes/subject3/images/72.png new file mode 100644 index 0000000000000000000000000000000000000000..bb2bed14c0a3f93608d97ddebed7e686734bd9d6 --- /dev/null +++ b/meme_generator/memes/subject3/images/72.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79cead8c17e213f432ebbc8e9c815b14df1e802884e902e54cb88b29f2b53d00 +size 121385 diff --git a/meme_generator/memes/subject3/images/73.png b/meme_generator/memes/subject3/images/73.png new file mode 100644 index 0000000000000000000000000000000000000000..642805db8c4664754ad1e9dfc1e9ee50432b8e3c --- /dev/null +++ b/meme_generator/memes/subject3/images/73.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74f9bccfbd5ef9a14539b36d51f31ccef0add6af5ddc6ddc443ca0ab8c0a3e30 +size 121964 diff --git a/meme_generator/memes/subject3/images/74.png b/meme_generator/memes/subject3/images/74.png new file mode 100644 index 0000000000000000000000000000000000000000..213183f075aea466444fb358551014a46214bfac --- /dev/null +++ b/meme_generator/memes/subject3/images/74.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e0ea491770de4d237106bf145400da8293748cd061e7260a0338874e870a60b6 +size 121411 diff --git a/meme_generator/memes/subject3/images/75.png b/meme_generator/memes/subject3/images/75.png new file mode 100644 index 0000000000000000000000000000000000000000..6b92a391e5af8bcc58a7c97e6e1b278ef55ecf8d --- /dev/null +++ b/meme_generator/memes/subject3/images/75.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a089222e863240a5cfb0150941c31613f5ba6a455359bdad597ecf2d28b0580c +size 120032 diff --git a/meme_generator/memes/subject3/images/76.png b/meme_generator/memes/subject3/images/76.png new file mode 100644 index 0000000000000000000000000000000000000000..beac5d5c99949d0ad00e94a9bc9ba5a977e97274 --- /dev/null +++ b/meme_generator/memes/subject3/images/76.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4da0715bc586c7349eaf93f2ab14366f9a69a352b1cba86d2f68dcd7d4237ab +size 121187 diff --git a/meme_generator/memes/subject3/images/77.png b/meme_generator/memes/subject3/images/77.png new file mode 100644 index 0000000000000000000000000000000000000000..c69d73bab1fc51ad0657f3956df0e027898a6879 --- /dev/null +++ b/meme_generator/memes/subject3/images/77.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b267cfd18bf85e91589d8aa386788a32551b1b1e3d6c73492124323413b9333 +size 120819 diff --git a/meme_generator/memes/subject3/images/78.png b/meme_generator/memes/subject3/images/78.png new file mode 100644 index 0000000000000000000000000000000000000000..dea65ebc49080b371c59a40acfef24f992dfd310 --- /dev/null +++ b/meme_generator/memes/subject3/images/78.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd348b16c485a0df94793306d53b0bdfeadb7baf789463472bd203d78bee95f1 +size 121120 diff --git a/meme_generator/memes/subject3/images/79.png b/meme_generator/memes/subject3/images/79.png new file mode 100644 index 0000000000000000000000000000000000000000..0e861253c72cf211650082f675ed8a315ca1d7e9 --- /dev/null +++ b/meme_generator/memes/subject3/images/79.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d18e8f63949ebdc1ac829b0688b01d8661cd882a7dac18b0a7eda263d62d965 +size 120867 diff --git a/meme_generator/memes/subject3/images/8.png b/meme_generator/memes/subject3/images/8.png new file mode 100644 index 0000000000000000000000000000000000000000..42cfe2fe856ae0a1cad348b795685f33c87a63dc --- /dev/null +++ b/meme_generator/memes/subject3/images/8.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c2ccc57f24eaf644d7bc589804f1913504e54d201a243d83c685697d0e4f27b +size 122556 diff --git a/meme_generator/memes/subject3/images/80.png b/meme_generator/memes/subject3/images/80.png new file mode 100644 index 0000000000000000000000000000000000000000..e46228ab327f0ece2a1c79ceb4cb8c13605a2b6a --- /dev/null +++ b/meme_generator/memes/subject3/images/80.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88dd43b995217336a4574b012d8fced9250b9df646401980145928059bb7b6ae +size 121311 diff --git a/meme_generator/memes/subject3/images/81.png b/meme_generator/memes/subject3/images/81.png new file mode 100644 index 0000000000000000000000000000000000000000..375d42347993cd9d0aebbb10b5ac119cddd82f8b --- /dev/null +++ b/meme_generator/memes/subject3/images/81.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38bb5c2cf1ad8bb90b08e26fbfcc9d3c9c4b211272f44d0ca7428f90b42c4d2e +size 120699 diff --git a/meme_generator/memes/subject3/images/82.png b/meme_generator/memes/subject3/images/82.png new file mode 100644 index 0000000000000000000000000000000000000000..004eb50278d36892c56a19cdb68b79f501f9d5f0 --- /dev/null +++ b/meme_generator/memes/subject3/images/82.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed65269dc4c83d3a8c45b31793f8b9a26d4a16aaa547531094c46b2a69e7fe0f +size 120535 diff --git a/meme_generator/memes/subject3/images/83.png b/meme_generator/memes/subject3/images/83.png new file mode 100644 index 0000000000000000000000000000000000000000..bf65090cdad9d8da70f954f89e9f0ffb14fc2f44 --- /dev/null +++ b/meme_generator/memes/subject3/images/83.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cbf8c04cf5a7f4e75289382a1ba8d4e6f9e36de4737b18c076d908490579c44e +size 119488 diff --git a/meme_generator/memes/subject3/images/84.png b/meme_generator/memes/subject3/images/84.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee8a6376431296c14baefcc6ae04002bfba4cdc --- /dev/null +++ b/meme_generator/memes/subject3/images/84.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:850246c6d84adeb7e2d776877a78b0b8e6a3bf78ae2e69e79bcfdb0ade15bef6 +size 119168 diff --git a/meme_generator/memes/subject3/images/85.png b/meme_generator/memes/subject3/images/85.png new file mode 100644 index 0000000000000000000000000000000000000000..0a95d9b72de93d0ed0bb054b28f9da55ce081f69 --- /dev/null +++ b/meme_generator/memes/subject3/images/85.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6ddfda6dc47b4f44dee381a2e0591f4232fe8f9d6484f8777a56d2a6d295cf5 +size 119732 diff --git a/meme_generator/memes/subject3/images/9.png b/meme_generator/memes/subject3/images/9.png new file mode 100644 index 0000000000000000000000000000000000000000..a0e5d0a7aaf6449980ce9745ee7885cc21f95150 --- /dev/null +++ b/meme_generator/memes/subject3/images/9.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2b6a2de1e34ec7761501544c3d7fdb7e709e208a39f21ea2e7ab6679edadebf +size 122004 diff --git a/meme_generator/memes/suck/__init__.py b/meme_generator/memes/suck/__init__.py index 46532e87e41470b56a1d0020628d7cea6451a87f..71268f1addb9ef75f65685afe72e685975f876fc 100644 --- a/meme_generator/memes/suck/__init__.py +++ b/meme_generator/memes/suck/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,14 +9,14 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def suck(images: List[BuildImage], texts, args): +def suck(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square() # fmt: off locs = [(82, 100, 130, 119), (82, 94, 126, 125), (82, 120, 128, 99), (81, 164, 132, 55), (79, 163, 132, 55), (82, 140, 127, 79), (83, 152, 125, 67), (75, 157, 140, 62), (72, 165, 144, 54), (80, 132, 128, 87), (81, 127, 127, 92), (79, 111, 132, 108)] # fmt: on - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(12): bg = BuildImage.open(img_dir / f"{i}.png") frame = BuildImage.new("RGBA", bg.size, "white") diff --git a/meme_generator/memes/support/__init__.py b/meme_generator/memes/support/__init__.py index 4af76f06c59fc52f686f741c5c22d98f0ebf4f91..e2ed09ec3d2c7af33dd087a4c958e0c47ca2c357 100644 --- a/meme_generator/memes/support/__init__.py +++ b/meme_generator/memes/support/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def support(images: List[BuildImage], texts, args): +def support(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square().resize((815, 815)).rotate(23, expand=True) frame = BuildImage.open(img_dir / "0.png") frame.paste(img, (-172, -17), below=True) diff --git a/meme_generator/memes/swirl_turn/__init__.py b/meme_generator/memes/swirl_turn/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e1dd1ccabdc0f8cef27f06ac992a8bc73c633757 --- /dev/null +++ b/meme_generator/memes/swirl_turn/__init__.py @@ -0,0 +1,38 @@ +import math + +from pil_utils import BuildImage + +from meme_generator import add_meme +from meme_generator.utils import FrameAlignPolicy, Maker, make_gif_or_combined_gif + + +def swirl_turn(images: list[BuildImage], texts, args): + frame_num = 40 + + def maker(i: int) -> Maker: + def make(img: BuildImage) -> BuildImage: + img = img.convert("RGBA").circle().resize((100, 100)) + start_angle = i * 360 / frame_num + frame = BuildImage.new("RGBA", (300, 300)) + num = 24 + for j in range(num): + angle = start_angle + j * 360 / num + x = 150 + 75 * math.cos(math.radians(angle)) + y = 150 + 75 * math.sin(math.radians(angle)) + frame.paste(img, (round(x - 50), round(y - 50)), alpha=True) + return frame + + return make + + return make_gif_or_combined_gif( + images[0], maker, frame_num, 0.02, FrameAlignPolicy.extend_loop + ) + + +add_meme( + "swirl_turn", + swirl_turn, + min_images=1, + max_images=1, + keywords=["回旋转", "旋风转"], +) diff --git a/meme_generator/memes/symmetric/__init__.py b/meme_generator/memes/symmetric/__init__.py index 73de733d9596bb7d69df23d32bf859a6a8c53e5d..fa6af7b23711b4ad059b94cd85875cd541e1c573 100644 --- a/meme_generator/memes/symmetric/__init__.py +++ b/meme_generator/memes/symmetric/__init__.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Literal, NamedTuple, Tuple +from typing import Literal, NamedTuple from PIL.Image import Transpose from pil_utils import BuildImage @@ -19,7 +19,9 @@ group.add_argument( default="left", help=help, ) -group.add_argument("--left", "/左", action="store_const", const="left", dest="direction") +group.add_argument( + "--left", "/左", action="store_const", const="left", dest="direction" +) group.add_argument( "--right", "/右", action="store_const", const="right", dest="direction" ) @@ -35,19 +37,19 @@ class Model(MemeArgsModel): ) -def symmetric(images: List[BuildImage], texts, args: Model): +def symmetric(images: list[BuildImage], texts, args: Model): img = images[0] img_w, img_h = img.size class Mode(NamedTuple): method: Transpose - frame_size: Tuple[int, int] - size1: Tuple[int, int, int, int] - pos1: Tuple[int, int] - size2: Tuple[int, int, int, int] - pos2: Tuple[int, int] + frame_size: tuple[int, int] + size1: tuple[int, int, int, int] + pos1: tuple[int, int] + size2: tuple[int, int, int, int] + pos2: tuple[int, int] - modes: Dict[str, Mode] = { + modes: dict[str, Mode] = { "left": Mode( Transpose.FLIP_LEFT_RIGHT, (img_w // 2 * 2, img_h), diff --git a/meme_generator/memes/tankuku_raisesign/__init__.py b/meme_generator/memes/tankuku_raisesign/__init__.py index 6c7f31ff5b7ae7428e7b701fe65b3b38b67e6adf..90e7447924f7d359d5dd52250d9c647371948db2 100644 --- a/meme_generator/memes/tankuku_raisesign/__init__.py +++ b/meme_generator/memes/tankuku_raisesign/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def tankuku_raisesign(images: List[BuildImage], texts, args): +def tankuku_raisesign(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize((300, 230), keep_ratio=True) params = ( (((0, 46), (320, 0), (350, 214), (38, 260)), (68, 91)), @@ -29,7 +28,7 @@ def tankuku_raisesign(images: List[BuildImage], texts, args): (((0, 35), (200, 0), (224, 133), (25, 169)), (195, 17)), (((0, 35), (200, 0), (224, 133), (25, 169)), (195, 17)), ) - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(15): points, pos = params[i] frame = BuildImage.open(img_dir / f"{i}.png") diff --git a/meme_generator/memes/taunt/__init__.py b/meme_generator/memes/taunt/__init__.py index 15710bc3bbb399c352725880afa58733024d18a2..866a63321a399bee262f1583720480eed0fc59c9 100644 --- a/meme_generator/memes/taunt/__init__.py +++ b/meme_generator/memes/taunt/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def taunt(images: List[BuildImage], texts, args): +def taunt(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") def make(img: BuildImage) -> BuildImage: diff --git a/meme_generator/memes/teach/__init__.py b/meme_generator/memes/teach/__init__.py index a47e287488fc31897dcca24f2ff1e1f52d1e4a4c..5bed359c77865f69b45708fb46fbb320da5e5508 100644 --- a/meme_generator/memes/teach/__init__.py +++ b/meme_generator/memes/teach/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def teach(images: List[BuildImage], texts: List[str], args): +def teach(images: list[BuildImage], texts: list[str], args): frame = BuildImage.open(img_dir / "0.png").resize_width(960).convert("RGBA") text = texts[0] if texts else "我老婆" try: diff --git a/meme_generator/memes/tease/__init__.py b/meme_generator/memes/tease/__init__.py index 0914c3cdd185a36ed0d0c47738ff29aa79f5171f..f776c6d4303e354bbb0a51b159cf44dc708d73e2 100644 --- a/meme_generator/memes/tease/__init__.py +++ b/meme_generator/memes/tease/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,9 +9,9 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def tease(images: List[BuildImage], texts, args): +def tease(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square() - frames: List[IMG] = [] + frames: list[IMG] = [] params = [ ((21, 75), ((0, 0), (129, 3), (155, 123), (12, 142))), ((18, 73), ((0, 29), (128, 0), (149, 118), (30, 147))), diff --git a/meme_generator/memes/telescope/__init__.py b/meme_generator/memes/telescope/__init__.py index a9e0e399ea418fed8b24c4833958af7cd6efbef7..bb0539783e01f11a2b83e18c705a65662708d4bd 100644 --- a/meme_generator/memes/telescope/__init__.py +++ b/meme_generator/memes/telescope/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import FrameAlignPolicy, Maker, make_gif_or_combined_g img_dir = Path(__file__).parent / "images" -def telescope(images: List[BuildImage], texts, args): +def telescope(images: list[BuildImage], texts, args): def maker(i: int) -> Maker: def make(img: BuildImage) -> BuildImage: img = img.convert("RGBA").square() diff --git a/meme_generator/memes/think_what/__init__.py b/meme_generator/memes/think_what/__init__.py index 8ec8609006b798412c5cae47c742bcd5ce6a7c02..0739df4da282c5cbad4738a1720003f1eb09f07d 100644 --- a/meme_generator/memes/think_what/__init__.py +++ b/meme_generator/memes/think_what/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def think_what(images: List[BuildImage], texts, args): +def think_what(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") def make(img: BuildImage) -> BuildImage: diff --git a/meme_generator/memes/this_chicken/__init__.py b/meme_generator/memes/this_chicken/__init__.py index 2c97e2f25542ebff69f0d41f8fb917dedf9b1c0d..18818a3616647c2bb16641368f51d05d13c010e9 100644 --- a/meme_generator/memes/this_chicken/__init__.py +++ b/meme_generator/memes/this_chicken/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def this_chicken(images: List[BuildImage], texts, args): +def this_chicken(images: list[BuildImage], texts, args): text = texts[0] if texts else "这是十二生肖中的鸡" img = images[0].convert("RGBA").resize((640, 640), keep_ratio=True) diff --git a/meme_generator/memes/throw/__init__.py b/meme_generator/memes/throw/__init__.py index 3d87571753ae0766966f8b27f6d16ed78939db33..63ae1b439ff367381b2ad717df3cd29c613a2d62 100644 --- a/meme_generator/memes/throw/__init__.py +++ b/meme_generator/memes/throw/__init__.py @@ -1,6 +1,5 @@ import random from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def throw(images: List[BuildImage], texts, args): +def throw(images: list[BuildImage], texts, args): img = ( images[0] .convert("RGBA") diff --git a/meme_generator/memes/throw_gif/__init__.py b/meme_generator/memes/throw_gif/__init__.py index da11e45e164f2d712a8e084f914b7b197d286668..567beba0ac52a57aee0ef28b5ee9bd65410d4fa0 100644 --- a/meme_generator/memes/throw_gif/__init__.py +++ b/meme_generator/memes/throw_gif/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def throw_gif(images: List[BuildImage], texts, args): +def throw_gif(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").circle() locs = [ [(32, 32, 108, 36)], @@ -22,7 +21,7 @@ def throw_gif(images: List[BuildImage], texts, args): [(35, 35, 259, 31)], [(175, 175, -50, 220)], ] - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(8): frame = BuildImage.open(img_dir / f"{i}.png") for w, h, x, y in locs[i]: diff --git a/meme_generator/memes/thump/__init__.py b/meme_generator/memes/thump/__init__.py index 240be22c7dc9cca48849a5aafe2053212fe14a6c..2d85b299305cf71c1d66048d7288d2c781aec37e 100644 --- a/meme_generator/memes/thump/__init__.py +++ b/meme_generator/memes/thump/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,12 +9,12 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def thump(images: List[BuildImage], texts, args): +def thump(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square() # fmt: off locs = [(65, 128, 77, 72), (67, 128, 73, 72), (54, 139, 94, 61), (57, 135, 86, 65)] # fmt: on - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(4): frame = BuildImage.open(img_dir / f"{i}.png") x, y, w, h = locs[i] diff --git a/meme_generator/memes/thump_wildly/__init__.py b/meme_generator/memes/thump_wildly/__init__.py index bd77f0b83fa2e2f7801e1663b9b8a49c88f5dc55..e1e9b0d618e9211edb483d2add6dee706b1e78e4 100644 --- a/meme_generator/memes/thump_wildly/__init__.py +++ b/meme_generator/memes/thump_wildly/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def thump_wildly(images: List[BuildImage], texts, args): +def thump_wildly(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize((122, 122), keep_ratio=True) raw_frames = [BuildImage.open(img_dir / f"{i}.png") for i in range(31)] for i in range(14): diff --git a/meme_generator/memes/tightly/__init__.py b/meme_generator/memes/tightly/__init__.py index 3c5270a4547e375d4b754f0b98b850f01f0aae4c..9645e738f69faa174dde38973a298fbfb29dfc1f 100644 --- a/meme_generator/memes/tightly/__init__.py +++ b/meme_generator/memes/tightly/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def tightly(images: List[BuildImage], texts, args): +def tightly(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize((640, 400), keep_ratio=True) # fmt: off locs = [(39, 169, 267, 141), (40, 167, 264, 143), (38, 174, 270, 135), (40, 167, 264, 143), (38, 174, 270, 135), @@ -18,7 +17,7 @@ def tightly(images: List[BuildImage], texts, args): (5, 215, 333, 96), (10, 210, 321, 102), (3, 210, 330, 104), (4, 210, 328, 102), (4, 212, 328, 100), (4, 212, 328, 100), (4, 212, 328, 100), (4, 212, 328, 100), (4, 212, 328, 100), (29, 195, 285, 120)] # fmt: on - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(20): frame = BuildImage.open(img_dir / f"{i}.png") x, y, w, h = locs[i] diff --git a/meme_generator/memes/together/__init__.py b/meme_generator/memes/together/__init__.py index f8023e19c585ff32a83c6a057b031e8ff1a651c5..565b20109af38777e0b526c4a759663fd3ec91d3 100644 --- a/meme_generator/memes/together/__init__.py +++ b/meme_generator/memes/together/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def together(images: List[BuildImage], texts: List[str], args: MemeArgsModel): +def together(images: list[BuildImage], texts: list[str], args: MemeArgsModel): frame = BuildImage.open(img_dir / "0.png") name = args.user_infos[0].name if args.user_infos else "" text = texts[0] if texts else f"一起玩{name}吧!" diff --git a/meme_generator/memes/tom_tease/__init__.py b/meme_generator/memes/tom_tease/__init__.py index 5f70b205e957d65d6ae321879b33dac5871a2c1c..c1c18f42d43e2f627d377f6410b83783bb1964ae 100644 --- a/meme_generator/memes/tom_tease/__init__.py +++ b/meme_generator/memes/tom_tease/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import FrameAlignPolicy, Maker, make_gif_or_combined_g img_dir = Path(__file__).parent / "images" -def tom_tease(images: List[BuildImage], texts, args): +def tom_tease(images: list[BuildImage], texts, args): def maker(i: int) -> Maker: def make(img: BuildImage) -> BuildImage: img = img.convert("RGBA").resize((400, 350), keep_ratio=True) diff --git a/meme_generator/memes/tomb_yeah/__init__.py b/meme_generator/memes/tomb_yeah/__init__.py index 6796027738f5916e724e7f422a2c2233d1cbbbf5..e3c57b275ad89b282af901707ebef79d6d968990 100644 --- a/meme_generator/memes/tomb_yeah/__init__.py +++ b/meme_generator/memes/tomb_yeah/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def tomb_yeah(images: List[BuildImage], texts, args): +def tomb_yeah(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.jpg").convert("RGBA") frame.paste( images[0].convert("RGBA").circle().resize((145, 145)), (138, 265), alpha=True @@ -22,4 +21,6 @@ def tomb_yeah(images: List[BuildImage], texts, args): return frame.save_jpg() -add_meme("tomb_yeah", tomb_yeah, min_images=1, max_images=2, keywords=["上坟", "坟前比耶"]) +add_meme( + "tomb_yeah", tomb_yeah, min_images=1, max_images=2, keywords=["上坟", "坟前比耶"] +) diff --git a/meme_generator/memes/trance/__init__.py b/meme_generator/memes/trance/__init__.py index 0f46aa47e88469ace40a76dc2e0da0d307b4836d..76bd322772346d8ed766163fd9187c1195e8dbde 100644 --- a/meme_generator/memes/trance/__init__.py +++ b/meme_generator/memes/trance/__init__.py @@ -1,11 +1,9 @@ -from typing import List - from pil_utils import BuildImage from meme_generator import add_meme -def trance(images: List[BuildImage], texts, args): +def trance(images: list[BuildImage], texts, args): img = images[0] width, height = img.size height1 = int(1.1 * height) diff --git a/meme_generator/memes/turn/__init__.py b/meme_generator/memes/turn/__init__.py index 398409165a0e07cb16d4cdc1c01bdf1586105f4d..78dad7a5a5ffb3194d1d6ff3bcaf259ce930285d 100644 --- a/meme_generator/memes/turn/__init__.py +++ b/meme_generator/memes/turn/__init__.py @@ -1,5 +1,4 @@ import random -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -8,9 +7,9 @@ from meme_generator import add_meme from meme_generator.utils import save_gif -def turn(images: List[BuildImage], texts, args): +def turn(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").circle() - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(0, 360, 10): frame = BuildImage.new("RGBA", (250, 250), "white") frame.paste(img.rotate(i).resize((250, 250)), alpha=True) diff --git a/meme_generator/memes/twist/__init__.py b/meme_generator/memes/twist/__init__.py index 39b7228c745d3763064923f12f5ddf4c8796fa07..ca80d671509bc2fce8645056b918b0f9e3844fa3 100644 --- a/meme_generator/memes/twist/__init__.py +++ b/meme_generator/memes/twist/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def twist(images: List[BuildImage], texts, args): +def twist(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").square().resize((78, 78)) # fmt: off locs = [ @@ -18,7 +17,7 @@ def twist(images: List[BuildImage], texts, args): (20, 69, 180), (22, 68, 240), (25, 66, 300) ] # fmt: on - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(5): frame = BuildImage.open(img_dir / f"{i}.png") x, y, a = locs[i] diff --git a/meme_generator/memes/universal/__init__.py b/meme_generator/memes/universal/__init__.py index a0990a96ed6e94e3b62e203ea823f05ffbbc4759..498e44d464f9c4ff1c6a2b2a53048a6a13c2ba08 100644 --- a/meme_generator/memes/universal/__init__.py +++ b/meme_generator/memes/universal/__init__.py @@ -1,15 +1,13 @@ -from typing import List - from pil_utils import BuildImage, Text2Image from meme_generator import add_meme from meme_generator.utils import make_jpg_or_gif -def universal(images: List[BuildImage], texts: List[str], args): +def universal(images: list[BuildImage], texts: list[str], args): def make(img: BuildImage) -> BuildImage: img = img.convert("RGBA").resize_width(500) - frames: List[BuildImage] = [img] + frames: list[BuildImage] = [img] for text in texts: text_img = BuildImage( Text2Image.from_bbcode_text(text, fontsize=45, align="center") diff --git a/meme_generator/memes/vibrate/__init__.py b/meme_generator/memes/vibrate/__init__.py index f09639741c1a1d9a6cbd8b1585c6f5661f324a4e..156f4f70cb87e65a0686d84dd5c733b222bce73a 100644 --- a/meme_generator/memes/vibrate/__init__.py +++ b/meme_generator/memes/vibrate/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import FrameAlignPolicy, Maker, make_gif_or_combined_g img_dir = Path(__file__).parent / "images" -def vibrate(images: List[BuildImage], texts, args): +def vibrate(images: list[BuildImage], texts, args): def maker(i: int) -> Maker: def make(img: BuildImage) -> BuildImage: img = img.convert("RGBA").square() diff --git a/meme_generator/memes/wakeup/__init__.py b/meme_generator/memes/wakeup/__init__.py index ee0a7728e64bee200cdc29ca85e4116404e48989..d7f503c849071082001763237688246869974a75 100644 --- a/meme_generator/memes/wakeup/__init__.py +++ b/meme_generator/memes/wakeup/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def wakeup(images, texts: List[str], args): +def wakeup(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.jpg") try: diff --git a/meme_generator/memes/wallpaper/__init__.py b/meme_generator/memes/wallpaper/__init__.py index 700af86d7b34769f24d12a188845ab987703ed37..06e717d81877775f392bad81f8df6a8ab4625106 100644 --- a/meme_generator/memes/wallpaper/__init__.py +++ b/meme_generator/memes/wallpaper/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,9 +9,9 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def wallpaper(images: List[BuildImage], texts, args): +def wallpaper(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize((515, 383), keep_ratio=True) - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(8): frames.append(BuildImage.open(img_dir / f"{i}.png").image) for i in range(8, 20): diff --git a/meme_generator/memes/walnut_pad/__init__.py b/meme_generator/memes/walnut_pad/__init__.py index 85b3d9f23b8f6f31ed4766e4412fb6b4f94bb4e3..de2cc0f8d9c41ef304161f5ce44ac0ffe2effb85 100644 --- a/meme_generator/memes/walnut_pad/__init__.py +++ b/meme_generator/memes/walnut_pad/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def walnut_pad(images: List[BuildImage], texts, args): +def walnut_pad(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") def make(img: BuildImage) -> BuildImage: diff --git a/meme_generator/memes/walnut_zoom/__init__.py b/meme_generator/memes/walnut_zoom/__init__.py index e2e2f3b35215a6fb8ce1b4bafb118698e071505b..f23b218085a7dc3719a775c9348fe23941db6bc3 100644 --- a/meme_generator/memes/walnut_zoom/__init__.py +++ b/meme_generator/memes/walnut_zoom/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import FrameAlignPolicy, Maker, make_gif_or_combined_g img_dir = Path(__file__).parent / "images" -def walnut_zoom(images: List[BuildImage], texts, args): +def walnut_zoom(images: list[BuildImage], texts, args): # fmt: off locs = ( (-222, 30, 695, 430), (-212, 30, 695, 430), (0, 30, 695, 430), (41, 26, 695, 430), diff --git a/meme_generator/memes/washer/__init__.py b/meme_generator/memes/washer/__init__.py index 7d0a65ca8e81abb0f343caf3cbb31c1f812b613e..b31176932ec8c087fb5ab6143c0b35432ae176c0 100644 --- a/meme_generator/memes/washer/__init__.py +++ b/meme_generator/memes/washer/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,10 +9,10 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def washer(images: List[BuildImage], texts, args): +def washer(images: list[BuildImage], texts, args): img = images[0].convert("RGBA") frame = BuildImage.open(img_dir / "0.png") - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(0, 360, 30): frames.append( frame.copy() diff --git a/meme_generator/memes/wave/__init__.py b/meme_generator/memes/wave/__init__.py index f0d6d5f8e5e652b7d06da2d5430408b87f1f091d..9efecbf17a8a52e206be385fbc2e79d296e887fe 100644 --- a/meme_generator/memes/wave/__init__.py +++ b/meme_generator/memes/wave/__init__.py @@ -1,5 +1,4 @@ import math -from typing import List from pil_utils import BuildImage @@ -7,7 +6,7 @@ from meme_generator import add_meme from meme_generator.utils import FrameAlignPolicy, Maker, make_gif_or_combined_gif -def wave(images: List[BuildImage], texts, args): +def wave(images: list[BuildImage], texts, args): img = images[0] img_w = min(max(img.width, 360), 720) period = img_w / 6 diff --git a/meme_generator/memes/what_I_want_to_do/__init__.py b/meme_generator/memes/what_I_want_to_do/__init__.py index e27ee2addc4891ac4cdc92ad0a5e94d39c6261de..2fe76999a7e7f5a892f3f2e1f555bb64f164f26a 100644 --- a/meme_generator/memes/what_I_want_to_do/__init__.py +++ b/meme_generator/memes/what_I_want_to_do/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def what_I_want_to_do(images: List[BuildImage], texts, args): +def what_I_want_to_do(images: list[BuildImage], texts, args): frame = BuildImage.open(img_dir / "0.png") def make(img: BuildImage) -> BuildImage: diff --git a/meme_generator/memes/what_he_wants/__init__.py b/meme_generator/memes/what_he_wants/__init__.py index 3ab506fbb72258a15d38edab75483f992d6a58c1..537fd4adc7f27a4c65192f95241b361b59ebbc2b 100644 --- a/meme_generator/memes/what_he_wants/__init__.py +++ b/meme_generator/memes/what_he_wants/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -10,7 +9,7 @@ from meme_generator.utils import make_jpg_or_gif img_dir = Path(__file__).parent / "images" -def what_he_wants(images: List[BuildImage], texts: List[str], args): +def what_he_wants(images: list[BuildImage], texts: list[str], args): date = texts[0] if texts else "今年520" text = f"{date}我会给你每个男人都最想要的东西···" frame = BuildImage.open(img_dir / "0.png") diff --git a/meme_generator/memes/why_at_me/__init__.py b/meme_generator/memes/why_at_me/__init__.py index 4a80362e6b62ccee5e07a62cd4d93da9bcf4a506..b7a13deecf6f55ea7183ab55a413b63cf6eb2522 100644 --- a/meme_generator/memes/why_at_me/__init__.py +++ b/meme_generator/memes/why_at_me/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -8,7 +7,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def why_at_me(images: List[BuildImage], texts, args): +def why_at_me(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize((265, 265), keep_ratio=True) frame = BuildImage.open(img_dir / "0.png") frame.paste(img.rotate(19), (42, 13), below=True) diff --git a/meme_generator/memes/why_have_hands/__init__.py b/meme_generator/memes/why_have_hands/__init__.py index 93b54d5e9e2d487c99d7401613b742a5fe895ea9..6c75d9a14743062a0fc1d2a107ede25ffebd2db0 100644 --- a/meme_generator/memes/why_have_hands/__init__.py +++ b/meme_generator/memes/why_have_hands/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOrNameNotEnough, TextOverLength img_dir = Path(__file__).parent / "images" -def why_have_hands(images: List[BuildImage], texts: List[str], args: MemeArgsModel): +def why_have_hands(images: list[BuildImage], texts: list[str], args: MemeArgsModel): img = images[0].convert("RGBA") if not texts and not args.user_infos: @@ -23,7 +22,7 @@ def why_have_hands(images: List[BuildImage], texts: List[str], args: MemeArgsMod ) frame.paste(img.resize((250, 170), keep_ratio=True), (275, 1100), below=True) frame.paste( - img.resize((300, 400), keep_ratio=True, inside=True, direction="northwest"), + img.resize((300, 400), keep_ratio=True, inside=True, direction="west"), (1100, 1060), alpha=True, ) diff --git a/meme_generator/memes/windmill_turn/__init__.py b/meme_generator/memes/windmill_turn/__init__.py index 9396f9745e4611ae8675c28c81158bed971457c8..24d06f077744b584a2b0305ff4162c403cf79246 100644 --- a/meme_generator/memes/windmill_turn/__init__.py +++ b/meme_generator/memes/windmill_turn/__init__.py @@ -1,12 +1,10 @@ -from typing import List - from pil_utils import BuildImage from meme_generator import add_meme from meme_generator.utils import FrameAlignPolicy, Maker, make_gif_or_combined_gif -def windmill_turn(images: List[BuildImage], texts, args): +def windmill_turn(images: list[BuildImage], texts, args): def maker(i: int) -> Maker: def make(img: BuildImage) -> BuildImage: img = img.convert("RGBA").resize((300, 300), keep_ratio=True) @@ -24,4 +22,6 @@ def windmill_turn(images: List[BuildImage], texts, args): ) -add_meme("windmill_turn", windmill_turn, min_images=1, max_images=1, keywords=["风车转"]) +add_meme( + "windmill_turn", windmill_turn, min_images=1, max_images=1, keywords=["风车转"] +) diff --git a/meme_generator/memes/wish_fail/__init__.py b/meme_generator/memes/wish_fail/__init__.py index 700816f1361857d16cb9085dc679af7c766d0d8f..a60c8271725b125a129eb3db1bc5c7560530fecf 100644 --- a/meme_generator/memes/wish_fail/__init__.py +++ b/meme_generator/memes/wish_fail/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def wish_fail(images, texts: List[str], args): +def wish_fail(images, texts: list[str], args): text = texts[0] frame = BuildImage.open(img_dir / "0.png") try: diff --git a/meme_generator/memes/wooden_fish/__init__.py b/meme_generator/memes/wooden_fish/__init__.py index 6fcaad072dd00bb1271cb90244fe4cb580ea4045..c63d0cb06e7b760a510b80363c1d3405b9175da4 100644 --- a/meme_generator/memes/wooden_fish/__init__.py +++ b/meme_generator/memes/wooden_fish/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from pil_utils import BuildImage @@ -9,7 +8,7 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def wooden_fish(images: List[BuildImage], texts, args): +def wooden_fish(images: list[BuildImage], texts, args): img = images[0].convert("RGBA").resize((85, 85)) frames = [ BuildImage.open(img_dir / f"{i}.png").paste(img, (116, 153), below=True).image diff --git a/meme_generator/memes/worship/__init__.py b/meme_generator/memes/worship/__init__.py index 9f8a0fd20212fee07c330ea7511949e33735a6bd..336d72efe6793800a15cc09f2689a2ead90c1854 100644 --- a/meme_generator/memes/worship/__init__.py +++ b/meme_generator/memes/worship/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Image as IMG from pil_utils import BuildImage @@ -10,11 +9,11 @@ from meme_generator.utils import save_gif img_dir = Path(__file__).parent / "images" -def worship(images: List[BuildImage], texts, args): +def worship(images: list[BuildImage], texts, args): img = images[0].convert("RGBA") points = ((0, -30), (135, 17), (135, 145), (0, 140)) paint = img.square().resize((150, 150)).perspective(points) - frames: List[IMG] = [] + frames: list[IMG] = [] for i in range(10): frame = BuildImage.open(img_dir / f"{i}.png") frame.paste(paint, below=True) diff --git a/meme_generator/memes/wujing/__init__.py b/meme_generator/memes/wujing/__init__.py index cde63ea0a105f8b4938f97539aff4ab7915f5958..15dd9c49f242f1de321426576ae438a713ecb4e9 100644 --- a/meme_generator/memes/wujing/__init__.py +++ b/meme_generator/memes/wujing/__init__.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import List, Literal, Tuple +from typing import Literal from pil_utils import BuildImage @@ -9,11 +9,11 @@ from meme_generator.exception import TextOverLength img_dir = Path(__file__).parent / "images" -def wujing(images, texts: List[str], args): +def wujing(images, texts: list[str], args): frame = BuildImage.open(img_dir / "0.jpg") def draw( - pos: Tuple[float, float, float, float], + pos: tuple[float, float, float, float], text: str, align: Literal["left", "right", "center"], ): diff --git a/meme_generator/memes/youtube/__init__.py b/meme_generator/memes/youtube/__init__.py index fb10860d6bf9c736e6fc68dde0165c1354ec035b..a4223edfef2439089188ccdef7c5c4dc24e5c791 100644 --- a/meme_generator/memes/youtube/__init__.py +++ b/meme_generator/memes/youtube/__init__.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List from PIL.Image import Transpose from pil_utils import BuildImage, Text2Image @@ -9,7 +8,7 @@ from meme_generator import add_meme img_dir = Path(__file__).parent / "images" -def youtube(images, texts: List[str], args): +def youtube(images, texts: list[str], args): left_img = Text2Image.from_text(texts[0], fontsize=200, fill="black").to_image( bg_color="white", padding=(30, 20) ) @@ -49,9 +48,7 @@ def youtube(images, texts: List[str], args): ), (x1, y1 + 1), alpha=True, - ).paste( - right_img, (x0, y0), alpha=True - ) + ).paste(right_img, (x0, y0), alpha=True) return frame.save_jpg() diff --git a/meme_generator/utils.py b/meme_generator/utils.py index 6e4314522d5357b4d333953e3179f28131eff0c1..9b6ea1a1e2536bc429a897f6ed5aa6e5e15884d1 100644 --- a/meme_generator/utils.py +++ b/meme_generator/utils.py @@ -4,6 +4,7 @@ import inspect import math import random import time +from collections.abc import Coroutine from dataclasses import dataclass from enum import Enum from functools import partial, wraps @@ -12,12 +13,9 @@ from typing import ( TYPE_CHECKING, Any, Callable, - Coroutine, - List, Literal, Optional, Protocol, - Tuple, TypeVar, ) @@ -63,7 +61,7 @@ def is_coroutine_callable(call: Callable[..., Any]) -> bool: return inspect.iscoroutinefunction(func_) -def save_gif(frames: List[IMG], duration: float) -> BytesIO: +def save_gif(frames: list[IMG], duration: float) -> BytesIO: output = BytesIO() frames[0].save( output, @@ -101,30 +99,30 @@ def save_gif(frames: List[IMG], duration: float) -> BytesIO: class Maker(Protocol): - def __call__(self, img: BuildImage) -> BuildImage: - ... + def __call__(self, img: BuildImage) -> BuildImage: ... class GifMaker(Protocol): - def __call__(self, i: int) -> Maker: - ... + def __call__(self, i: int) -> Maker: ... def get_avg_duration(image: IMG) -> float: if not getattr(image, "is_animated", False): return 0 total_duration = 0 - for i in range(image.n_frames): + n_frames = getattr(image, "n_frames", 1) + for i in range(n_frames): image.seek(i) total_duration += image.info["duration"] - return total_duration / image.n_frames + return total_duration / n_frames -def split_gif(image: IMG) -> List[IMG]: - frames: List[IMG] = [] +def split_gif(image: IMG) -> list[IMG]: + frames: list[IMG] = [] update_mode = "full" - for i in range(image.n_frames): + n_frames = getattr(image, "n_frames", 1) + for i in range(n_frames): image.seek(i) if image.tile: # type: ignore update_region = image.tile[0][1][2:] # type: ignore @@ -133,7 +131,7 @@ def split_gif(image: IMG) -> List[IMG]: break last_frame: Optional[IMG] = None - for i in range(image.n_frames): + for i in range(n_frames): image.seek(i) frame = image.copy() if update_mode == "partial" and last_frame: @@ -232,7 +230,7 @@ def make_gif_or_combined_gif( if not getattr(image, "is_animated", False): return save_gif([maker(i)(img).image for i in range(frame_num)], duration) - frame_num_in = image.n_frames + frame_num_in = getattr(image, "n_frames", 1) duration_in = get_avg_duration(image) / 1000 total_duration_in = frame_num_in * duration_in total_duration = frame_num * duration @@ -252,7 +250,7 @@ def make_gif_or_combined_gif( total_duration_base = total_duration total_duration_fit = total_duration_in - frame_idxs: List[int] = list(range(frame_num_base)) + frame_idxs: list[int] = list(range(frame_num_base)) diff_duration = total_duration_fit - total_duration_base diff_num = int(diff_duration / duration_base) @@ -278,7 +276,7 @@ def make_gif_or_combined_gif( ): break - frames: List[IMG] = [] + frames: list[IMG] = [] frame_idx_fit = 0 time_start = 0 for i, idx in enumerate(frame_idxs): @@ -340,7 +338,9 @@ async def translate(text: str, lang_from: str = "auto", lang_to: str = "zh") -> def random_text() -> str: - return random.choice(["刘一", "陈二", "张三", "李四", "王五", "赵六", "孙七", "周八", "吴九", "郑十"]) + return random.choice( + ["刘一", "陈二", "张三", "李四", "王五", "赵六", "孙七", "周八", "吴九", "郑十"] + ) def random_image() -> BytesIO: @@ -366,20 +366,20 @@ def default_template(meme: "Meme", number: int) -> str: def render_meme_list( - meme_list: List[Tuple["Meme", TextProperties]], + meme_list: list[tuple["Meme", TextProperties]], *, template: Callable[["Meme", int], str] = default_template, order_direction: Literal["row", "column"] = "column", columns: int = 4, column_align: Literal["left", "center", "right"] = "left", - item_padding: Tuple[int, int] = (15, 6), - image_padding: Tuple[int, int] = (50, 50), + item_padding: tuple[int, int] = (15, 6), + image_padding: tuple[int, int] = (50, 50), bg_color: ColorType = "white", fontsize: int = 30, fontname: str = "", - fallback_fonts: List[str] = [], + fallback_fonts: list[str] = [], ) -> BytesIO: - item_images: List[Text2Image] = [] + item_images: list[Text2Image] = [] for i, (meme, properties) in enumerate(meme_list, start=1): text = template(meme, i) t2m = Text2Image.from_text( @@ -402,7 +402,7 @@ def render_meme_list( .chars[0] ) num_per_col = math.ceil(len(item_images) / columns) - column_images: List[BuildImage] = [] + column_images: list[BuildImage] = [] for col in range(columns): if order_direction == "column": images = item_images[col * num_per_col : (col + 1) * num_per_col] diff --git a/meme_generator/version.py b/meme_generator/version.py index f18e5d0977e73992d319c6d2ab1274bda30fe184..040835a6ba072aa7357f1d77c5b868f1c253e4c6 100644 --- a/meme_generator/version.py +++ b/meme_generator/version.py @@ -1 +1 @@ -__version__ = "0.0.18" +__version__ = "0.0.20" diff --git a/poetry.lock b/poetry.lock index 098e47607b7135fb2927ee54f845af89e5ba48e3..4f0b9331d0cb8d08f87019f700434c85ce5212c6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -11,18 +11,15 @@ files = [ {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, ] -[package.dependencies] -typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} - [[package]] name = "anyio" -version = "4.2.0" +version = "4.3.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, - {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, + {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, + {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, ] [package.dependencies] @@ -36,34 +33,6 @@ doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphin test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] trio = ["trio (>=0.23)"] -[[package]] -name = "backports-zoneinfo" -version = "0.2.1" -description = "Backport of the standard library zoneinfo module" -optional = false -python-versions = ">=3.6" -files = [ - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"}, - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"}, - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"}, - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"}, - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"}, - {file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"}, -] - -[package.extras] -tzdata = ["tzdata"] - [[package]] name = "bbcode" version = "1.1.0" @@ -77,13 +46,13 @@ files = [ [[package]] name = "certifi" -version = "2023.11.17" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] @@ -113,136 +82,66 @@ files = [ [[package]] name = "contourpy" -version = "1.1.0" -description = "Python library for calculating contours of 2D quadrilateral grids" -optional = false -python-versions = ">=3.8" -files = [ - {file = "contourpy-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:89f06eff3ce2f4b3eb24c1055a26981bffe4e7264acd86f15b97e40530b794bc"}, - {file = "contourpy-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dffcc2ddec1782dd2f2ce1ef16f070861af4fb78c69862ce0aab801495dda6a3"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25ae46595e22f93592d39a7eac3d638cda552c3e1160255258b695f7b58e5655"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17cfaf5ec9862bc93af1ec1f302457371c34e688fbd381f4035a06cd47324f48"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"}, - {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"}, - {file = "contourpy-1.1.0-cp310-cp310-win32.whl", hash = "sha256:9b2dd2ca3ac561aceef4c7c13ba654aaa404cf885b187427760d7f7d4c57cff8"}, - {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"}, - {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"}, - {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052cc634bf903c604ef1a00a5aa093c54f81a2612faedaa43295809ffdde885e"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9382a1c0bc46230fb881c36229bfa23d8c303b889b788b939365578d762b5c18"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"}, - {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"}, - {file = "contourpy-1.1.0-cp311-cp311-win32.whl", hash = "sha256:edb989d31065b1acef3828a3688f88b2abb799a7db891c9e282df5ec7e46221b"}, - {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"}, - {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"}, - {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62013a2cf68abc80dadfd2307299bfa8f5aa0dcaec5b2954caeb5fa094171103"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b6616375d7de55797d7a66ee7d087efe27f03d336c27cf1f32c02b8c1a5ac70"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"}, - {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"}, - {file = "contourpy-1.1.0-cp38-cp38-win32.whl", hash = "sha256:108dfb5b3e731046a96c60bdc46a1a0ebee0760418951abecbe0fc07b5b93b27"}, - {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"}, - {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"}, - {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f2931ed4741f98f74b410b16e5213f71dcccee67518970c42f64153ea9313b9"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30f511c05fab7f12e0b1b7730ebdc2ec8deedcfb505bc27eb570ff47c51a8f15"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"}, - {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"}, - {file = "contourpy-1.1.0-cp39-cp39-win32.whl", hash = "sha256:71551f9520f008b2950bef5f16b0e3587506ef4f23c734b71ffb7b89f8721999"}, - {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"}, - {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"}, - {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"}, - {file = "contourpy-1.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a67259c2b493b00e5a4d0f7bfae51fb4b3371395e47d079a4446e9b0f4d70e76"}, - {file = "contourpy-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2b836d22bd2c7bb2700348e4521b25e077255ebb6ab68e351ab5aa91ca27e027"}, - {file = "contourpy-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084eaa568400cfaf7179b847ac871582199b1b44d5699198e9602ecbbb5f6104"}, - {file = "contourpy-1.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:911ff4fd53e26b019f898f32db0d4956c9d227d51338fb3b03ec72ff0084ee5f"}, - {file = "contourpy-1.1.0.tar.gz", hash = "sha256:e53046c3863828d21d531cc3b53786e6580eb1ba02477e8681009b6aa0870b21"}, -] - -[package.dependencies] -numpy = ">=1.16" - -[package.extras] -bokeh = ["bokeh", "selenium"] -docs = ["furo", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.2.0)", "types-Pillow"] -test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] -test-no-images = ["pytest", "pytest-cov", "wurlitzer"] - -[[package]] -name = "contourpy" -version = "1.1.1" +version = "1.2.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b"}, - {file = "contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1"}, - {file = "contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d"}, - {file = "contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431"}, - {file = "contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb"}, - {file = "contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2"}, - {file = "contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5"}, - {file = "contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62"}, - {file = "contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33"}, - {file = "contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45"}, - {file = "contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a"}, - {file = "contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf"}, - {file = "contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d"}, - {file = "contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6"}, - {file = "contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970"}, - {file = "contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d"}, - {file = "contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8"}, - {file = "contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251"}, - {file = "contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7"}, - {file = "contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9"}, - {file = "contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba"}, - {file = "contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85"}, - {file = "contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e"}, - {file = "contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0"}, - {file = "contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887"}, - {file = "contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e"}, - {file = "contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3"}, - {file = "contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23"}, - {file = "contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb"}, - {file = "contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163"}, - {file = "contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c"}, - {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, + {file = "contourpy-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040"}, + {file = "contourpy-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b"}, + {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd"}, + {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619"}, + {file = "contourpy-1.2.1-cp310-cp310-win32.whl", hash = "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8"}, + {file = "contourpy-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9"}, + {file = "contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5"}, + {file = "contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df"}, + {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205"}, + {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8"}, + {file = "contourpy-1.2.1-cp311-cp311-win32.whl", hash = "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec"}, + {file = "contourpy-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922"}, + {file = "contourpy-1.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc"}, + {file = "contourpy-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b"}, + {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce"}, + {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4"}, + {file = "contourpy-1.2.1-cp312-cp312-win32.whl", hash = "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f"}, + {file = "contourpy-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce"}, + {file = "contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b"}, + {file = "contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445"}, + {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02"}, + {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083"}, + {file = "contourpy-1.2.1-cp39-cp39-win32.whl", hash = "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba"}, + {file = "contourpy-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f"}, + {file = "contourpy-1.2.1.tar.gz", hash = "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c"}, ] [package.dependencies] -numpy = {version = ">=1.16,<2.0", markers = "python_version <= \"3.11\""} +numpy = ">=1.20" [package.extras] bokeh = ["bokeh", "selenium"] docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.4.1)", "types-Pillow"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.8.0)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] -test-no-images = ["pytest", "pytest-cov", "wurlitzer"] +test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "cycler" @@ -281,15 +180,50 @@ calendars = ["convertdate", "hijri-converter"] fasttext = ["fasttext"] langdetect = ["langdetect"] +[[package]] +name = "dnspython" +version = "2.6.1" +description = "DNS toolkit" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, + {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, +] + +[package.extras] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=41)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=0.9.25)"] +idna = ["idna (>=3.6)"] +trio = ["trio (>=0.23)"] +wmi = ["wmi (>=1.5.1)"] + +[[package]] +name = "email-validator" +version = "2.1.1" +description = "A robust email address syntax and deliverability validation library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "email_validator-2.1.1-py3-none-any.whl", hash = "sha256:97d882d174e2a65732fb43bfce81a3a834cbc1bde8bf419e30ef5ea976370a05"}, + {file = "email_validator-2.1.1.tar.gz", hash = "sha256:200a70680ba08904be6d1eef729205cc0d687634399a5924d842533efb824b84"}, +] + +[package.dependencies] +dnspython = ">=2.0.0" +idna = ">=2.0.0" + [[package]] name = "exceptiongroup" -version = "1.2.0" +version = "1.2.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, - {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] [package.extras] @@ -297,22 +231,46 @@ test = ["pytest (>=6)"] [[package]] name = "fastapi" -version = "0.109.0" +version = "0.111.0" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.8" files = [ - {file = "fastapi-0.109.0-py3-none-any.whl", hash = "sha256:8c77515984cd8e8cfeb58364f8cc7a28f0692088475e2614f7bf03275eba9093"}, - {file = "fastapi-0.109.0.tar.gz", hash = "sha256:b978095b9ee01a5cf49b19f4bc1ac9b8ca83aa076e770ef8fd9af09a2b88d191"}, + {file = "fastapi-0.111.0-py3-none-any.whl", hash = "sha256:97ecbf994be0bcbdadedf88c3150252bed7b2087075ac99735403b1b76cc8fc0"}, + {file = "fastapi-0.111.0.tar.gz", hash = "sha256:b9db9dd147c91cb8b769f7183535773d8741dd46f9dc6676cd82eab510228cd7"}, ] [package.dependencies] +email_validator = ">=2.0.0" +fastapi-cli = ">=0.0.2" +httpx = ">=0.23.0" +jinja2 = ">=2.11.2" +orjson = ">=3.2.1" pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" -starlette = ">=0.35.0,<0.36.0" +python-multipart = ">=0.0.7" +starlette = ">=0.37.2,<0.38.0" typing-extensions = ">=4.8.0" +ujson = ">=4.0.1,<4.0.2 || >4.0.2,<4.1.0 || >4.1.0,<4.2.0 || >4.2.0,<4.3.0 || >4.3.0,<5.0.0 || >5.0.0,<5.1.0 || >5.1.0" +uvicorn = {version = ">=0.12.0", extras = ["standard"]} [package.extras] -all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +all = ["email_validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "fastapi-cli" +version = "0.0.3" +description = "Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi_cli-0.0.3-py3-none-any.whl", hash = "sha256:ae233115f729945479044917d949095e829d2d84f56f55ce1ca17627872825a5"}, + {file = "fastapi_cli-0.0.3.tar.gz", hash = "sha256:3b6e4d2c4daee940fb8db59ebbfd60a72c4b962bcf593e263e4cc69da4ea3d7f"}, +] + +[package.dependencies] +fastapi = "*" +typer = ">=0.12.3" +uvicorn = {version = ">=0.15.0", extras = ["standard"]} [[package]] name = "filetype" @@ -327,60 +285,60 @@ files = [ [[package]] name = "fonttools" -version = "4.47.2" +version = "4.51.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.47.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b629108351d25512d4ea1a8393a2dba325b7b7d7308116b605ea3f8e1be88df"}, - {file = "fonttools-4.47.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c19044256c44fe299d9a73456aabee4b4d06c6b930287be93b533b4737d70aa1"}, - {file = "fonttools-4.47.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8be28c036b9f186e8c7eaf8a11b42373e7e4949f9e9f370202b9da4c4c3f56c"}, - {file = "fonttools-4.47.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f83a4daef6d2a202acb9bf572958f91cfde5b10c8ee7fb1d09a4c81e5d851fd8"}, - {file = "fonttools-4.47.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a5a5318ba5365d992666ac4fe35365f93004109d18858a3e18ae46f67907670"}, - {file = "fonttools-4.47.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8f57ecd742545362a0f7186774b2d1c53423ed9ece67689c93a1055b236f638c"}, - {file = "fonttools-4.47.2-cp310-cp310-win32.whl", hash = "sha256:a1c154bb85dc9a4cf145250c88d112d88eb414bad81d4cb524d06258dea1bdc0"}, - {file = "fonttools-4.47.2-cp310-cp310-win_amd64.whl", hash = "sha256:3e2b95dce2ead58fb12524d0ca7d63a63459dd489e7e5838c3cd53557f8933e1"}, - {file = "fonttools-4.47.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:29495d6d109cdbabe73cfb6f419ce67080c3ef9ea1e08d5750240fd4b0c4763b"}, - {file = "fonttools-4.47.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0a1d313a415eaaba2b35d6cd33536560deeebd2ed758b9bfb89ab5d97dc5deac"}, - {file = "fonttools-4.47.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f898cdd67f52f18049250a6474185ef6544c91f27a7bee70d87d77a8daf89c"}, - {file = "fonttools-4.47.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3480eeb52770ff75140fe7d9a2ec33fb67b07efea0ab5129c7e0c6a639c40c70"}, - {file = "fonttools-4.47.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0255dbc128fee75fb9be364806b940ed450dd6838672a150d501ee86523ac61e"}, - {file = "fonttools-4.47.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f791446ff297fd5f1e2247c188de53c1bfb9dd7f0549eba55b73a3c2087a2703"}, - {file = "fonttools-4.47.2-cp311-cp311-win32.whl", hash = "sha256:740947906590a878a4bde7dd748e85fefa4d470a268b964748403b3ab2aeed6c"}, - {file = "fonttools-4.47.2-cp311-cp311-win_amd64.whl", hash = "sha256:63fbed184979f09a65aa9c88b395ca539c94287ba3a364517698462e13e457c9"}, - {file = "fonttools-4.47.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4ec558c543609e71b2275c4894e93493f65d2f41c15fe1d089080c1d0bb4d635"}, - {file = "fonttools-4.47.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e040f905d542362e07e72e03612a6270c33d38281fd573160e1003e43718d68d"}, - {file = "fonttools-4.47.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dd58cc03016b281bd2c74c84cdaa6bd3ce54c5a7f47478b7657b930ac3ed8eb"}, - {file = "fonttools-4.47.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32ab2e9702dff0dd4510c7bb958f265a8d3dd5c0e2547e7b5f7a3df4979abb07"}, - {file = "fonttools-4.47.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a808f3c1d1df1f5bf39be869b6e0c263570cdafb5bdb2df66087733f566ea71"}, - {file = "fonttools-4.47.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac71e2e201df041a2891067dc36256755b1229ae167edbdc419b16da78732c2f"}, - {file = "fonttools-4.47.2-cp312-cp312-win32.whl", hash = "sha256:69731e8bea0578b3c28fdb43dbf95b9386e2d49a399e9a4ad736b8e479b08085"}, - {file = "fonttools-4.47.2-cp312-cp312-win_amd64.whl", hash = "sha256:b3e1304e5f19ca861d86a72218ecce68f391646d85c851742d265787f55457a4"}, - {file = "fonttools-4.47.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:254d9a6f7be00212bf0c3159e0a420eb19c63793b2c05e049eb337f3023c5ecc"}, - {file = "fonttools-4.47.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eabae77a07c41ae0b35184894202305c3ad211a93b2eb53837c2a1143c8bc952"}, - {file = "fonttools-4.47.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86a5ab2873ed2575d0fcdf1828143cfc6b977ac448e3dc616bb1e3d20efbafa"}, - {file = "fonttools-4.47.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13819db8445a0cec8c3ff5f243af6418ab19175072a9a92f6cc8ca7d1452754b"}, - {file = "fonttools-4.47.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4e743935139aa485fe3253fc33fe467eab6ea42583fa681223ea3f1a93dd01e6"}, - {file = "fonttools-4.47.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d49ce3ea7b7173faebc5664872243b40cf88814ca3eb135c4a3cdff66af71946"}, - {file = "fonttools-4.47.2-cp38-cp38-win32.whl", hash = "sha256:94208ea750e3f96e267f394d5588579bb64cc628e321dbb1d4243ffbc291b18b"}, - {file = "fonttools-4.47.2-cp38-cp38-win_amd64.whl", hash = "sha256:0f750037e02beb8b3569fbff701a572e62a685d2a0e840d75816592280e5feae"}, - {file = "fonttools-4.47.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3d71606c9321f6701642bd4746f99b6089e53d7e9817fc6b964e90d9c5f0ecc6"}, - {file = "fonttools-4.47.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:86e0427864c6c91cf77f16d1fb9bf1bbf7453e824589e8fb8461b6ee1144f506"}, - {file = "fonttools-4.47.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a00bd0e68e88987dcc047ea31c26d40a3c61185153b03457956a87e39d43c37"}, - {file = "fonttools-4.47.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5d77479fb885ef38a16a253a2f4096bc3d14e63a56d6246bfdb56365a12b20c"}, - {file = "fonttools-4.47.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5465df494f20a7d01712b072ae3ee9ad2887004701b95cb2cc6dcb9c2c97a899"}, - {file = "fonttools-4.47.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4c811d3c73b6abac275babb8aa439206288f56fdb2c6f8835e3d7b70de8937a7"}, - {file = "fonttools-4.47.2-cp39-cp39-win32.whl", hash = "sha256:5b60e3afa9635e3dfd3ace2757039593e3bd3cf128be0ddb7a1ff4ac45fa5a50"}, - {file = "fonttools-4.47.2-cp39-cp39-win_amd64.whl", hash = "sha256:7ee48bd9d6b7e8f66866c9090807e3a4a56cf43ffad48962725a190e0dd774c8"}, - {file = "fonttools-4.47.2-py3-none-any.whl", hash = "sha256:7eb7ad665258fba68fd22228a09f347469d95a97fb88198e133595947a20a184"}, - {file = "fonttools-4.47.2.tar.gz", hash = "sha256:7df26dd3650e98ca45f1e29883c96a0b9f5bb6af8d632a6a108bc744fa0bd9b3"}, + {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:84d7751f4468dd8cdd03ddada18b8b0857a5beec80bce9f435742abc9a851a74"}, + {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8b4850fa2ef2cfbc1d1f689bc159ef0f45d8d83298c1425838095bf53ef46308"}, + {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5b48a1121117047d82695d276c2af2ee3a24ffe0f502ed581acc2673ecf1037"}, + {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:180194c7fe60c989bb627d7ed5011f2bef1c4d36ecf3ec64daec8302f1ae0716"}, + {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:96a48e137c36be55e68845fc4284533bda2980f8d6f835e26bca79d7e2006438"}, + {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:806e7912c32a657fa39d2d6eb1d3012d35f841387c8fc6cf349ed70b7c340039"}, + {file = "fonttools-4.51.0-cp310-cp310-win32.whl", hash = "sha256:32b17504696f605e9e960647c5f64b35704782a502cc26a37b800b4d69ff3c77"}, + {file = "fonttools-4.51.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7e91abdfae1b5c9e3a543f48ce96013f9a08c6c9668f1e6be0beabf0a569c1b"}, + {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a8feca65bab31479d795b0d16c9a9852902e3a3c0630678efb0b2b7941ea9c74"}, + {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ac27f436e8af7779f0bb4d5425aa3535270494d3bc5459ed27de3f03151e4c2"}, + {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e19bd9e9964a09cd2433a4b100ca7f34e34731e0758e13ba9a1ed6e5468cc0f"}, + {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2b92381f37b39ba2fc98c3a45a9d6383bfc9916a87d66ccb6553f7bdd129097"}, + {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5f6bc991d1610f5c3bbe997b0233cbc234b8e82fa99fc0b2932dc1ca5e5afec0"}, + {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9696fe9f3f0c32e9a321d5268208a7cc9205a52f99b89479d1b035ed54c923f1"}, + {file = "fonttools-4.51.0-cp311-cp311-win32.whl", hash = "sha256:3bee3f3bd9fa1d5ee616ccfd13b27ca605c2b4270e45715bd2883e9504735034"}, + {file = "fonttools-4.51.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f08c901d3866a8905363619e3741c33f0a83a680d92a9f0e575985c2634fcc1"}, + {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4060acc2bfa2d8e98117828a238889f13b6f69d59f4f2d5857eece5277b829ba"}, + {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1250e818b5f8a679ad79660855528120a8f0288f8f30ec88b83db51515411fcc"}, + {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76f1777d8b3386479ffb4a282e74318e730014d86ce60f016908d9801af9ca2a"}, + {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b5ad456813d93b9c4b7ee55302208db2b45324315129d85275c01f5cb7e61a2"}, + {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68b3fb7775a923be73e739f92f7e8a72725fd333eab24834041365d2278c3671"}, + {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8e2f1a4499e3b5ee82c19b5ee57f0294673125c65b0a1ff3764ea1f9db2f9ef5"}, + {file = "fonttools-4.51.0-cp312-cp312-win32.whl", hash = "sha256:278e50f6b003c6aed19bae2242b364e575bcb16304b53f2b64f6551b9c000e15"}, + {file = "fonttools-4.51.0-cp312-cp312-win_amd64.whl", hash = "sha256:b3c61423f22165541b9403ee39874dcae84cd57a9078b82e1dce8cb06b07fa2e"}, + {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1621ee57da887c17312acc4b0e7ac30d3a4fb0fec6174b2e3754a74c26bbed1e"}, + {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d9298be7a05bb4801f558522adbe2feea1b0b103d5294ebf24a92dd49b78e5"}, + {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee1af4be1c5afe4c96ca23badd368d8dc75f611887fb0c0dac9f71ee5d6f110e"}, + {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c18b49adc721a7d0b8dfe7c3130c89b8704baf599fb396396d07d4aa69b824a1"}, + {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de7c29bdbdd35811f14493ffd2534b88f0ce1b9065316433b22d63ca1cd21f14"}, + {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cadf4e12a608ef1d13e039864f484c8a968840afa0258b0b843a0556497ea9ed"}, + {file = "fonttools-4.51.0-cp38-cp38-win32.whl", hash = "sha256:aefa011207ed36cd280babfaa8510b8176f1a77261833e895a9d96e57e44802f"}, + {file = "fonttools-4.51.0-cp38-cp38-win_amd64.whl", hash = "sha256:865a58b6e60b0938874af0968cd0553bcd88e0b2cb6e588727117bd099eef836"}, + {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:60a3409c9112aec02d5fb546f557bca6efa773dcb32ac147c6baf5f742e6258b"}, + {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7e89853d8bea103c8e3514b9f9dc86b5b4120afb4583b57eb10dfa5afbe0936"}, + {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56fc244f2585d6c00b9bcc59e6593e646cf095a96fe68d62cd4da53dd1287b55"}, + {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d145976194a5242fdd22df18a1b451481a88071feadf251221af110ca8f00ce"}, + {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5b8cab0c137ca229433570151b5c1fc6af212680b58b15abd797dcdd9dd5051"}, + {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:54dcf21a2f2d06ded676e3c3f9f74b2bafded3a8ff12f0983160b13e9f2fb4a7"}, + {file = "fonttools-4.51.0-cp39-cp39-win32.whl", hash = "sha256:0118ef998a0699a96c7b28457f15546815015a2710a1b23a7bf6c1be60c01636"}, + {file = "fonttools-4.51.0-cp39-cp39-win_amd64.whl", hash = "sha256:599bdb75e220241cedc6faebfafedd7670335d2e29620d207dd0378a4e9ccc5a"}, + {file = "fonttools-4.51.0-py3-none-any.whl", hash = "sha256:15c94eeef6b095831067f72c825eb0e2d48bb4cea0647c1b05c981ecba2bf39f"}, + {file = "fonttools-4.51.0.tar.gz", hash = "sha256:dc0673361331566d7a663d7ce0f6fdcbfbdc1f59c6e3ed1165ad7202ca183c68"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres", "pycairo", "scipy"] -lxml = ["lxml (>=4.0,<5)"] +lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] @@ -403,13 +361,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.2" +version = "1.0.5" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"}, - {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"}, + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, ] [package.dependencies] @@ -420,17 +378,65 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.23.0)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httptools" +version = "0.6.1" +description = "A collection of framework independent HTTP protocol utils." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f"}, + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658"}, + {file = "httptools-0.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d"}, + {file = "httptools-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb"}, + {file = "httptools-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf"}, + {file = "httptools-0.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a"}, + {file = "httptools-0.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e"}, + {file = "httptools-0.6.1.tar.gz", hash = "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"}, +] + +[package.extras] +test = ["Cython (>=0.29.24,<0.30.0)"] [[package]] name = "httpx" -version = "0.26.0" +version = "0.27.0" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpx-0.26.0-py3-none-any.whl", hash = "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd"}, - {file = "httpx-0.26.0.tar.gz", hash = "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf"}, + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, ] [package.dependencies] @@ -448,24 +454,24 @@ socks = ["socksio (==1.*)"] [[package]] name = "idna" -version = "3.6" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] name = "importlib-resources" -version = "6.1.1" +version = "6.4.0" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, - {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, + {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, + {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, ] [package.dependencies] @@ -473,7 +479,24 @@ zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] +testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] + +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] [[package]] name = "kiwisolver" @@ -630,60 +653,110 @@ profiling = ["gprof2dot"] rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + [[package]] name = "matplotlib" -version = "3.7.4" +version = "3.8.4" description = "Python plotting package" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "matplotlib-3.7.4-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:b71079239bd866bf56df023e5146de159cb0c7294e508830901f4d79e2d89385"}, - {file = "matplotlib-3.7.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:bf91a42f6274a64cb41189120b620c02e574535ff6671fa836cade7701b06fbd"}, - {file = "matplotlib-3.7.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f757e8b42841d6add0cb69b42497667f0d25a404dcd50bd923ec9904e38414c4"}, - {file = "matplotlib-3.7.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4dfee00aa4bd291e08bb9461831c26ce0da85ca9781bb8794f2025c6e925281"}, - {file = "matplotlib-3.7.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3640f33632beb3993b698b1be9d1c262b742761d6101f3c27b87b2185d25c875"}, - {file = "matplotlib-3.7.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff539c4a17ecdf076ed808ee271ffae4a30dcb7e157b99ccae2c837262c07db6"}, - {file = "matplotlib-3.7.4-cp310-cp310-win32.whl", hash = "sha256:24b8f28af3e766195c09b780b15aa9f6710192b415ae7866b9c03dee7ec86370"}, - {file = "matplotlib-3.7.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fa193286712c3b6c3cfa5fe8a6bb563f8c52cc750006c782296e0807ce5e799"}, - {file = "matplotlib-3.7.4-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:b167f54cb4654b210c9624ec7b54e2b3b8de68c93a14668937e7e53df60770ec"}, - {file = "matplotlib-3.7.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7dfe6821f1944cb35603ff22e21510941bbcce7ccf96095beffaac890d39ce77"}, - {file = "matplotlib-3.7.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3c557d9165320dff3c5f2bb99bfa0b6813d3e626423ff71c40d6bc23b83c3339"}, - {file = "matplotlib-3.7.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08372696b3bb45c563472a552a705bfa0942f0a8ffe084db8a4e8f9153fbdf9d"}, - {file = "matplotlib-3.7.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81e1a7ac818000e8ac3ca696c3fdc501bc2d3adc89005e7b4e22ee5e9d51de98"}, - {file = "matplotlib-3.7.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:390920a3949906bc4b0216198d378f2a640c36c622e3584dd0c79a7c59ae9f50"}, - {file = "matplotlib-3.7.4-cp311-cp311-win32.whl", hash = "sha256:62e094d8da26294634da9e7f1856beee3978752b1b530c8e1763d2faed60cc10"}, - {file = "matplotlib-3.7.4-cp311-cp311-win_amd64.whl", hash = "sha256:f8fc2df756105784e650605e024d36dc2d048d68e5c1b26df97ee25d1bd41f9f"}, - {file = "matplotlib-3.7.4-cp312-cp312-macosx_10_12_universal2.whl", hash = "sha256:568574756127791903604e315c11aef9f255151e4cfe20ec603a70f9dda8e259"}, - {file = "matplotlib-3.7.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7d479aac338195e2199a8cfc03c4f2f55914e6a120177edae79e0340a6406457"}, - {file = "matplotlib-3.7.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:32183d4be84189a4c52b4b8861434d427d9118db2cec32986f98ed6c02dcfbb6"}, - {file = "matplotlib-3.7.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0037d066cca1f4bda626c507cddeb6f7da8283bc6a214da2db13ff2162933c52"}, - {file = "matplotlib-3.7.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44856632ebce88abd8efdc0a0dceec600418dcac06b72ae77af0019d260aa243"}, - {file = "matplotlib-3.7.4-cp312-cp312-win_amd64.whl", hash = "sha256:632fc938c22117d4241411191cfb88ac264a4c0a9ac702244641ddf30f0d739c"}, - {file = "matplotlib-3.7.4-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:ce163be048613b9d1962273708cc97e09ca05d37312e670d166cf332b80bbaff"}, - {file = "matplotlib-3.7.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:e680f49bb8052ba3b2698e370155d2b4afb49f9af1cc611a26579d5981e2852a"}, - {file = "matplotlib-3.7.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0604880e4327114054199108b7390f987f4f40ee5ce728985836889e11a780ba"}, - {file = "matplotlib-3.7.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1e6abcde6fc52475f9d6a12b9f1792aee171ce7818ef6df5d61cb0b82816e6e8"}, - {file = "matplotlib-3.7.4-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f59a70e2ec3212033ef6633ed07682da03f5249379722512a3a2a26a7d9a738e"}, - {file = "matplotlib-3.7.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a9981b2a2dd9da06eca4ab5855d09b54b8ce7377c3e0e3957767b83219d652d"}, - {file = "matplotlib-3.7.4-cp38-cp38-win32.whl", hash = "sha256:83859ac26839660ecd164ee8311272074250b915ac300f9b2eccc84410f8953b"}, - {file = "matplotlib-3.7.4-cp38-cp38-win_amd64.whl", hash = "sha256:7a7709796ac59fe8debde68272388be6ed449c8971362eb5b60d280eac8dadde"}, - {file = "matplotlib-3.7.4-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:b1d70bc1ea1bf110bec64f4578de3e14947909a8887df4c1fd44492eca487955"}, - {file = "matplotlib-3.7.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c83f49e795a5de6c168876eea723f5b88355202f9603c55977f5356213aa8280"}, - {file = "matplotlib-3.7.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5c9133f230945fe10652eb33e43642e933896194ef6a4f8d5e79bb722bdb2000"}, - {file = "matplotlib-3.7.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:798ff59022eeb276380ce9a73ba35d13c3d1499ab9b73d194fd07f1b0a41c304"}, - {file = "matplotlib-3.7.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1707b20b25e90538c2ce8d4409e30f0ef1df4017cc65ad0439633492a973635b"}, - {file = "matplotlib-3.7.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e6227ca8492baeef873cdd8e169a318efb5c3a25ce94e69727e7f964995b0b1"}, - {file = "matplotlib-3.7.4-cp39-cp39-win32.whl", hash = "sha256:5661c8639aded7d1bbf781373a359011cb1dd09199dee49043e9e68dd16f07ba"}, - {file = "matplotlib-3.7.4-cp39-cp39-win_amd64.whl", hash = "sha256:55eec941a4743f0bd3e5b8ee180e36b7ea8e62f867bf2613937c9f01b9ac06a2"}, - {file = "matplotlib-3.7.4-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ab16868714e5cc90ec8f7ff5d83d23bcd6559224d8e9cb5227c9f58748889fe8"}, - {file = "matplotlib-3.7.4-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c698b33f9a3f0b127a8e614c8fb4087563bb3caa9c9d95298722fa2400cdd3f"}, - {file = "matplotlib-3.7.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be3493bbcb4d255cb71de1f9050ac71682fce21a56089eadbcc8e21784cb12ee"}, - {file = "matplotlib-3.7.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f8c725d1dd2901b2e7ec6cd64165e00da2978cc23d4143cb9ef745bec88e6b04"}, - {file = "matplotlib-3.7.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:286332f8f45f8ffde2d2119b9fdd42153dccd5025fa9f451b4a3b5c086e26da5"}, - {file = "matplotlib-3.7.4-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:116ef0b43aa00ff69260b4cce39c571e4b8c6f893795b708303fa27d9b9d7548"}, - {file = "matplotlib-3.7.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c90590d4b46458677d80bc3218f3f1ac11fc122baa9134e0cb5b3e8fc3714052"}, - {file = "matplotlib-3.7.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:de7c07069687be64fd9d119da3122ba13a8d399eccd3f844815f0dc78a870b2c"}, - {file = "matplotlib-3.7.4.tar.gz", hash = "sha256:7cd4fef8187d1dd0d9dcfdbaa06ac326d396fb8c71c647129f0bf56835d77026"}, + {file = "matplotlib-3.8.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:abc9d838f93583650c35eca41cfcec65b2e7cb50fd486da6f0c49b5e1ed23014"}, + {file = "matplotlib-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f65c9f002d281a6e904976007b2d46a1ee2bcea3a68a8c12dda24709ddc9106"}, + {file = "matplotlib-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce1edd9f5383b504dbc26eeea404ed0a00656c526638129028b758fd43fc5f10"}, + {file = "matplotlib-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd79298550cba13a43c340581a3ec9c707bd895a6a061a78fa2524660482fc0"}, + {file = "matplotlib-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:90df07db7b599fe7035d2f74ab7e438b656528c68ba6bb59b7dc46af39ee48ef"}, + {file = "matplotlib-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:ac24233e8f2939ac4fd2919eed1e9c0871eac8057666070e94cbf0b33dd9c338"}, + {file = "matplotlib-3.8.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:72f9322712e4562e792b2961971891b9fbbb0e525011e09ea0d1f416c4645661"}, + {file = "matplotlib-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:232ce322bfd020a434caaffbd9a95333f7c2491e59cfc014041d95e38ab90d1c"}, + {file = "matplotlib-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6addbd5b488aedb7f9bc19f91cd87ea476206f45d7116fcfe3d31416702a82fa"}, + {file = "matplotlib-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc4ccdc64e3039fc303defd119658148f2349239871db72cd74e2eeaa9b80b71"}, + {file = "matplotlib-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b7a2a253d3b36d90c8993b4620183b55665a429da8357a4f621e78cd48b2b30b"}, + {file = "matplotlib-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:8080d5081a86e690d7688ffa542532e87f224c38a6ed71f8fbed34dd1d9fedae"}, + {file = "matplotlib-3.8.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6485ac1f2e84676cff22e693eaa4fbed50ef5dc37173ce1f023daef4687df616"}, + {file = "matplotlib-3.8.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c89ee9314ef48c72fe92ce55c4e95f2f39d70208f9f1d9db4e64079420d8d732"}, + {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50bac6e4d77e4262c4340d7a985c30912054745ec99756ce213bfbc3cb3808eb"}, + {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f51c4c869d4b60d769f7b4406eec39596648d9d70246428745a681c327a8ad30"}, + {file = "matplotlib-3.8.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b12ba985837e4899b762b81f5b2845bd1a28f4fdd1a126d9ace64e9c4eb2fb25"}, + {file = "matplotlib-3.8.4-cp312-cp312-win_amd64.whl", hash = "sha256:7a6769f58ce51791b4cb8b4d7642489df347697cd3e23d88266aaaee93b41d9a"}, + {file = "matplotlib-3.8.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:843cbde2f0946dadd8c5c11c6d91847abd18ec76859dc319362a0964493f0ba6"}, + {file = "matplotlib-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c13f041a7178f9780fb61cc3a2b10423d5e125480e4be51beaf62b172413b67"}, + {file = "matplotlib-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb44f53af0a62dc80bba4443d9b27f2fde6acfdac281d95bc872dc148a6509cc"}, + {file = "matplotlib-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:606e3b90897554c989b1e38a258c626d46c873523de432b1462f295db13de6f9"}, + {file = "matplotlib-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9bb0189011785ea794ee827b68777db3ca3f93f3e339ea4d920315a0e5a78d54"}, + {file = "matplotlib-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:6209e5c9aaccc056e63b547a8152661324404dd92340a6e479b3a7f24b42a5d0"}, + {file = "matplotlib-3.8.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c7064120a59ce6f64103c9cefba8ffe6fba87f2c61d67c401186423c9a20fd35"}, + {file = "matplotlib-3.8.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0e47eda4eb2614300fc7bb4657fced3e83d6334d03da2173b09e447418d499f"}, + {file = "matplotlib-3.8.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:493e9f6aa5819156b58fce42b296ea31969f2aab71c5b680b4ea7a3cb5c07d94"}, + {file = "matplotlib-3.8.4.tar.gz", hash = "sha256:8aac397d5e9ec158960e31c381c5ffc52ddd52bd9a47717e2a694038167dffea"}, ] [package.dependencies] @@ -691,10 +764,10 @@ contourpy = ">=1.0.1" cycler = ">=0.10" fonttools = ">=4.22.0" importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} -kiwisolver = ">=1.0.1" -numpy = ">=1.20,<2" +kiwisolver = ">=1.3.1" +numpy = ">=1.21" packaging = ">=20.0" -pillow = ">=6.2.0" +pillow = ">=8" pyparsing = ">=2.3.1" python-dateutil = ">=2.7" @@ -711,60 +784,49 @@ files = [ [[package]] name = "numpy" -version = "1.24.4" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, - {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, - {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, - {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, - {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, - {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, - {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, - {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, - {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, - {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, - {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, - {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, - {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, - {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, - {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, - {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, - {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, - {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, - {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, - {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, - {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, - {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, - {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, - {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, - {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] -[[package]] -name = "opencv-python-headless" -version = "4.8.1.78" -description = "Wrapper package for OpenCV python bindings." -optional = false -python-versions = ">=3.6" -files = [ - {file = "opencv-python-headless-4.8.1.78.tar.gz", hash = "sha256:bc7197b42352f6f865c302a49140b889ec7cd957dd697e2d7fc016ad0d3f28f1"}, - {file = "opencv_python_headless-4.8.1.78-cp37-abi3-macosx_10_16_x86_64.whl", hash = "sha256:f3a33f644249f9ce1c913eac580e4b3ef4ce7cab0a71900274708959c2feb5e3"}, - {file = "opencv_python_headless-4.8.1.78-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:2c7d45721df9801c4dcd34683a15caa0e30f38b185263fec04a6eb274bc720f0"}, - {file = "opencv_python_headless-4.8.1.78-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b6bd6e1132b6f5dcb3a5bfe30fc4d341a7bfb26134da349a06c9255288ded94"}, - {file = "opencv_python_headless-4.8.1.78-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58e70d2f0915fe23e02c6e405588276c9397844a47d38b9c87fac5f7f9ba2dcc"}, - {file = "opencv_python_headless-4.8.1.78-cp37-abi3-win32.whl", hash = "sha256:382f8c7a6a14f80091284eecedd52cee4812231ee0eff1118592197b538d9252"}, - {file = "opencv_python_headless-4.8.1.78-cp37-abi3-win_amd64.whl", hash = "sha256:0a0f1e9f836f7d5bad1dd164694944c8761711cbdf4b36ebbd4815a8ef731079"}, -] - -[package.dependencies] -numpy = {version = ">=1.23.5", markers = "python_version >= \"3.11\""} - [[package]] name = "opencv-python-headless" version = "4.9.0.80" @@ -783,34 +845,89 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.21.0", markers = "python_version <= \"3.9\" and platform_system == \"Darwin\" and platform_machine == \"arm64\" and python_version >= \"3.8\""}, + {version = ">=1.21.0", markers = "python_version == \"3.9\" and platform_system == \"Darwin\" and platform_machine == \"arm64\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\" and python_version < \"3.11\""}, {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\" and python_version < \"3.11\""}, {version = ">=1.19.3", markers = "platform_system == \"Linux\" and platform_machine == \"aarch64\" and python_version >= \"3.8\" and python_version < \"3.10\" or python_version > \"3.9\" and python_version < \"3.10\" or python_version >= \"3.9\" and platform_system != \"Darwin\" and python_version < \"3.10\" or python_version >= \"3.9\" and platform_machine != \"arm64\" and python_version < \"3.10\""}, - {version = ">=1.17.3", markers = "(platform_system != \"Darwin\" and platform_system != \"Linux\") and python_version >= \"3.8\" and python_version < \"3.9\" or platform_system != \"Darwin\" and python_version >= \"3.8\" and python_version < \"3.9\" and platform_machine != \"aarch64\" or platform_machine != \"arm64\" and python_version >= \"3.8\" and python_version < \"3.9\" and platform_system != \"Linux\" or (platform_machine != \"arm64\" and platform_machine != \"aarch64\") and python_version >= \"3.8\" and python_version < \"3.9\""}, +] + +[[package]] +name = "orjson" +version = "3.10.3" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = false +python-versions = ">=3.8" +files = [ + {file = "orjson-3.10.3-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9fb6c3f9f5490a3eb4ddd46fc1b6eadb0d6fc16fb3f07320149c3286a1409dd8"}, + {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:252124b198662eee80428f1af8c63f7ff077c88723fe206a25df8dc57a57b1fa"}, + {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9f3e87733823089a338ef9bbf363ef4de45e5c599a9bf50a7a9b82e86d0228da"}, + {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8334c0d87103bb9fbbe59b78129f1f40d1d1e8355bbed2ca71853af15fa4ed3"}, + {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1952c03439e4dce23482ac846e7961f9d4ec62086eb98ae76d97bd41d72644d7"}, + {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c0403ed9c706dcd2809f1600ed18f4aae50be263bd7112e54b50e2c2bc3ebd6d"}, + {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:382e52aa4270a037d41f325e7d1dfa395b7de0c367800b6f337d8157367bf3a7"}, + {file = "orjson-3.10.3-cp310-none-win32.whl", hash = "sha256:be2aab54313752c04f2cbaab4515291ef5af8c2256ce22abc007f89f42f49109"}, + {file = "orjson-3.10.3-cp310-none-win_amd64.whl", hash = "sha256:416b195f78ae461601893f482287cee1e3059ec49b4f99479aedf22a20b1098b"}, + {file = "orjson-3.10.3-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:73100d9abbbe730331f2242c1fc0bcb46a3ea3b4ae3348847e5a141265479700"}, + {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a12eee96e3ab828dbfcb4d5a0023aa971b27143a1d35dc214c176fdfb29b3"}, + {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520de5e2ef0b4ae546bea25129d6c7c74edb43fc6cf5213f511a927f2b28148b"}, + {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccaa0a401fc02e8828a5bedfd80f8cd389d24f65e5ca3954d72c6582495b4bcf"}, + {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7bc9e8bc11bac40f905640acd41cbeaa87209e7e1f57ade386da658092dc16"}, + {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3582b34b70543a1ed6944aca75e219e1192661a63da4d039d088a09c67543b08"}, + {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c23dfa91481de880890d17aa7b91d586a4746a4c2aa9a145bebdbaf233768d5"}, + {file = "orjson-3.10.3-cp311-none-win32.whl", hash = "sha256:1770e2a0eae728b050705206d84eda8b074b65ee835e7f85c919f5705b006c9b"}, + {file = "orjson-3.10.3-cp311-none-win_amd64.whl", hash = "sha256:93433b3c1f852660eb5abdc1f4dd0ced2be031ba30900433223b28ee0140cde5"}, + {file = "orjson-3.10.3-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a39aa73e53bec8d410875683bfa3a8edf61e5a1c7bb4014f65f81d36467ea098"}, + {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0943a96b3fa09bee1afdfccc2cb236c9c64715afa375b2af296c73d91c23eab2"}, + {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e852baafceff8da3c9defae29414cc8513a1586ad93e45f27b89a639c68e8176"}, + {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18566beb5acd76f3769c1d1a7ec06cdb81edc4d55d2765fb677e3eaa10fa99e0"}, + {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd2218d5a3aa43060efe649ec564ebedec8ce6ae0a43654b81376216d5ebd42"}, + {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cf20465e74c6e17a104ecf01bf8cd3b7b252565b4ccee4548f18b012ff2f8069"}, + {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba7f67aa7f983c4345eeda16054a4677289011a478ca947cd69c0a86ea45e534"}, + {file = "orjson-3.10.3-cp312-none-win32.whl", hash = "sha256:17e0713fc159abc261eea0f4feda611d32eabc35708b74bef6ad44f6c78d5ea0"}, + {file = "orjson-3.10.3-cp312-none-win_amd64.whl", hash = "sha256:4c895383b1ec42b017dd2c75ae8a5b862fc489006afde06f14afbdd0309b2af0"}, + {file = "orjson-3.10.3-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:be2719e5041e9fb76c8c2c06b9600fe8e8584e6980061ff88dcbc2691a16d20d"}, + {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0175a5798bdc878956099f5c54b9837cb62cfbf5d0b86ba6d77e43861bcec2"}, + {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:978be58a68ade24f1af7758626806e13cff7748a677faf95fbb298359aa1e20d"}, + {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16bda83b5c61586f6f788333d3cf3ed19015e3b9019188c56983b5a299210eb5"}, + {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ad1f26bea425041e0a1adad34630c4825a9e3adec49079b1fb6ac8d36f8b754"}, + {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9e253498bee561fe85d6325ba55ff2ff08fb5e7184cd6a4d7754133bd19c9195"}, + {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0a62f9968bab8a676a164263e485f30a0b748255ee2f4ae49a0224be95f4532b"}, + {file = "orjson-3.10.3-cp38-none-win32.whl", hash = "sha256:8d0b84403d287d4bfa9bf7d1dc298d5c1c5d9f444f3737929a66f2fe4fb8f134"}, + {file = "orjson-3.10.3-cp38-none-win_amd64.whl", hash = "sha256:8bc7a4df90da5d535e18157220d7915780d07198b54f4de0110eca6b6c11e290"}, + {file = "orjson-3.10.3-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9059d15c30e675a58fdcd6f95465c1522b8426e092de9fff20edebfdc15e1cb0"}, + {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d40c7f7938c9c2b934b297412c067936d0b54e4b8ab916fd1a9eb8f54c02294"}, + {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4a654ec1de8fdaae1d80d55cee65893cb06494e124681ab335218be6a0691e7"}, + {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:831c6ef73f9aa53c5f40ae8f949ff7681b38eaddb6904aab89dca4d85099cb78"}, + {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99b880d7e34542db89f48d14ddecbd26f06838b12427d5a25d71baceb5ba119d"}, + {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e5e176c994ce4bd434d7aafb9ecc893c15f347d3d2bbd8e7ce0b63071c52e25"}, + {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b69a58a37dab856491bf2d3bbf259775fdce262b727f96aafbda359cb1d114d8"}, + {file = "orjson-3.10.3-cp39-none-win32.whl", hash = "sha256:b8d4d1a6868cde356f1402c8faeb50d62cee765a1f7ffcfd6de732ab0581e063"}, + {file = "orjson-3.10.3-cp39-none-win_amd64.whl", hash = "sha256:5102f50c5fc46d94f2033fe00d392588564378260d64377aec702f21a7a22912"}, + {file = "orjson-3.10.3.tar.gz", hash = "sha256:2b166507acae7ba2f7c315dcf185a9111ad5e992ac81f2d507aac39193c2c818"}, ] [[package]] name = "packaging" -version = "23.2" +version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] [[package]] name = "pil-utils" -version = "0.1.8" +version = "0.1.10" description = "A simple PIL wrapper and text-to-image tool" optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "pil_utils-0.1.8-py3-none-any.whl", hash = "sha256:22b0ed4eeb532386fb61658795c88c77919440f6169ccea76428c83bb0257f72"}, - {file = "pil_utils-0.1.8.tar.gz", hash = "sha256:6223cb1451449a4c9ebc48d6a9e3705711ecf7c120db97d9cd4ca2bc9e0f0618"}, + {file = "pil_utils-0.1.10-py3-none-any.whl", hash = "sha256:ff9459d7b4336e9b07a5e11e06b12a6e477ae68eae0124ac5710b28ae5d4d6d8"}, + {file = "pil_utils-0.1.10.tar.gz", hash = "sha256:4e6d08cc39cba3f65eb17847662d2c1e68e2ac12503e4a73e57d980b2dc77cda"}, ] [package.dependencies] @@ -819,83 +936,84 @@ fonttools = ">=4.0.0,<5.0.0" matplotlib = ">=3.0.0,<4.0.0" numpy = ">=1.20.0,<2.0.0" opencv-python-headless = ">=4.0.0,<5.0.0" -Pillow = ">=9.2.0,<11.0.0" +Pillow = ">=10.0.0,<11.0.0" [[package]] name = "pillow" -version = "10.2.0" +version = "10.3.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, - {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, - {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, - {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, - {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, - {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, - {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, - {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, - {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, - {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, - {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, - {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, - {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, - {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, - {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, - {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, - {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, - {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, + {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, + {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, + {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, + {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, + {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, + {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, + {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, + {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, + {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, + {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, + {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, + {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, + {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, + {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, + {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, ] [package.extras] @@ -908,18 +1026,18 @@ xmp = ["defusedxml"] [[package]] name = "pydantic" -version = "2.5.3" +version = "2.7.1" description = "Data validation using Python type hints" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pydantic-2.5.3-py3-none-any.whl", hash = "sha256:d0caf5954bee831b6bfe7e338c32b9e30c85dfe080c843680783ac2b631673b4"}, - {file = "pydantic-2.5.3.tar.gz", hash = "sha256:b3ef57c62535b0941697cce638c08900d87fcb67e29cfa99e8a68f747f393f7a"}, + {file = "pydantic-2.7.1-py3-none-any.whl", hash = "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5"}, + {file = "pydantic-2.7.1.tar.gz", hash = "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.14.6" +pydantic-core = "2.18.2" typing-extensions = ">=4.6.1" [package.extras] @@ -927,116 +1045,90 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.14.6" -description = "" +version = "2.18.2" +description = "Core functionality for Pydantic validation and serialization" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.14.6-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:72f9a942d739f09cd42fffe5dc759928217649f070056f03c70df14f5770acf9"}, - {file = "pydantic_core-2.14.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6a31d98c0d69776c2576dda4b77b8e0c69ad08e8b539c25c7d0ca0dc19a50d6c"}, - {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5aa90562bc079c6c290f0512b21768967f9968e4cfea84ea4ff5af5d917016e4"}, - {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:370ffecb5316ed23b667d99ce4debe53ea664b99cc37bfa2af47bc769056d534"}, - {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f85f3843bdb1fe80e8c206fe6eed7a1caeae897e496542cee499c374a85c6e08"}, - {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9862bf828112e19685b76ca499b379338fd4c5c269d897e218b2ae8fcb80139d"}, - {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:036137b5ad0cb0004c75b579445a1efccd072387a36c7f217bb8efd1afbe5245"}, - {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:92879bce89f91f4b2416eba4429c7b5ca22c45ef4a499c39f0c5c69257522c7c"}, - {file = "pydantic_core-2.14.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0c08de15d50fa190d577e8591f0329a643eeaed696d7771760295998aca6bc66"}, - {file = "pydantic_core-2.14.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:36099c69f6b14fc2c49d7996cbf4f87ec4f0e66d1c74aa05228583225a07b590"}, - {file = "pydantic_core-2.14.6-cp310-none-win32.whl", hash = "sha256:7be719e4d2ae6c314f72844ba9d69e38dff342bc360379f7c8537c48e23034b7"}, - {file = "pydantic_core-2.14.6-cp310-none-win_amd64.whl", hash = "sha256:36fa402dcdc8ea7f1b0ddcf0df4254cc6b2e08f8cd80e7010d4c4ae6e86b2a87"}, - {file = "pydantic_core-2.14.6-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:dea7fcd62915fb150cdc373212141a30037e11b761fbced340e9db3379b892d4"}, - {file = "pydantic_core-2.14.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffff855100bc066ff2cd3aa4a60bc9534661816b110f0243e59503ec2df38421"}, - {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b027c86c66b8627eb90e57aee1f526df77dc6d8b354ec498be9a757d513b92b"}, - {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:00b1087dabcee0b0ffd104f9f53d7d3eaddfaa314cdd6726143af6bc713aa27e"}, - {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75ec284328b60a4e91010c1acade0c30584f28a1f345bc8f72fe8b9e46ec6a96"}, - {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e1f4744eea1501404b20b0ac059ff7e3f96a97d3e3f48ce27a139e053bb370b"}, - {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2602177668f89b38b9f84b7b3435d0a72511ddef45dc14446811759b82235a1"}, - {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c8edaea3089bf908dd27da8f5d9e395c5b4dc092dbcce9b65e7156099b4b937"}, - {file = "pydantic_core-2.14.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:478e9e7b360dfec451daafe286998d4a1eeaecf6d69c427b834ae771cad4b622"}, - {file = "pydantic_core-2.14.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b6ca36c12a5120bad343eef193cc0122928c5c7466121da7c20f41160ba00ba2"}, - {file = "pydantic_core-2.14.6-cp311-none-win32.whl", hash = "sha256:2b8719037e570639e6b665a4050add43134d80b687288ba3ade18b22bbb29dd2"}, - {file = "pydantic_core-2.14.6-cp311-none-win_amd64.whl", hash = "sha256:78ee52ecc088c61cce32b2d30a826f929e1708f7b9247dc3b921aec367dc1b23"}, - {file = "pydantic_core-2.14.6-cp311-none-win_arm64.whl", hash = "sha256:a19b794f8fe6569472ff77602437ec4430f9b2b9ec7a1105cfd2232f9ba355e6"}, - {file = "pydantic_core-2.14.6-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:667aa2eac9cd0700af1ddb38b7b1ef246d8cf94c85637cbb03d7757ca4c3fdec"}, - {file = "pydantic_core-2.14.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cdee837710ef6b56ebd20245b83799fce40b265b3b406e51e8ccc5b85b9099b7"}, - {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c5bcf3414367e29f83fd66f7de64509a8fd2368b1edf4351e862910727d3e51"}, - {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26a92ae76f75d1915806b77cf459811e772d8f71fd1e4339c99750f0e7f6324f"}, - {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a983cca5ed1dd9a35e9e42ebf9f278d344603bfcb174ff99a5815f953925140a"}, - {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cb92f9061657287eded380d7dc455bbf115430b3aa4741bdc662d02977e7d0af"}, - {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4ace1e220b078c8e48e82c081e35002038657e4b37d403ce940fa679e57113b"}, - {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef633add81832f4b56d3b4c9408b43d530dfca29e68fb1b797dcb861a2c734cd"}, - {file = "pydantic_core-2.14.6-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7e90d6cc4aad2cc1f5e16ed56e46cebf4877c62403a311af20459c15da76fd91"}, - {file = "pydantic_core-2.14.6-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e8a5ac97ea521d7bde7621d86c30e86b798cdecd985723c4ed737a2aa9e77d0c"}, - {file = "pydantic_core-2.14.6-cp312-none-win32.whl", hash = "sha256:f27207e8ca3e5e021e2402ba942e5b4c629718e665c81b8b306f3c8b1ddbb786"}, - {file = "pydantic_core-2.14.6-cp312-none-win_amd64.whl", hash = "sha256:b3e5fe4538001bb82e2295b8d2a39356a84694c97cb73a566dc36328b9f83b40"}, - {file = "pydantic_core-2.14.6-cp312-none-win_arm64.whl", hash = "sha256:64634ccf9d671c6be242a664a33c4acf12882670b09b3f163cd00a24cffbd74e"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:24368e31be2c88bd69340fbfe741b405302993242ccb476c5c3ff48aeee1afe0"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:e33b0834f1cf779aa839975f9d8755a7c2420510c0fa1e9fa0497de77cd35d2c"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6af4b3f52cc65f8a0bc8b1cd9676f8c21ef3e9132f21fed250f6958bd7223bed"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d15687d7d7f40333bd8266f3814c591c2e2cd263fa2116e314f60d82086e353a"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:095b707bb287bfd534044166ab767bec70a9bba3175dcdc3371782175c14e43c"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94fc0e6621e07d1e91c44e016cc0b189b48db053061cc22d6298a611de8071bb"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ce830e480f6774608dedfd4a90c42aac4a7af0a711f1b52f807130c2e434c06"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a306cdd2ad3a7d795d8e617a58c3a2ed0f76c8496fb7621b6cd514eb1532cae8"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2f5fa187bde8524b1e37ba894db13aadd64faa884657473b03a019f625cee9a8"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:438027a975cc213a47c5d70672e0d29776082155cfae540c4e225716586be75e"}, - {file = "pydantic_core-2.14.6-cp37-none-win32.whl", hash = "sha256:f96ae96a060a8072ceff4cfde89d261837b4294a4f28b84a28765470d502ccc6"}, - {file = "pydantic_core-2.14.6-cp37-none-win_amd64.whl", hash = "sha256:e646c0e282e960345314f42f2cea5e0b5f56938c093541ea6dbf11aec2862391"}, - {file = "pydantic_core-2.14.6-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:db453f2da3f59a348f514cfbfeb042393b68720787bbef2b4c6068ea362c8149"}, - {file = "pydantic_core-2.14.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3860c62057acd95cc84044e758e47b18dcd8871a328ebc8ccdefd18b0d26a21b"}, - {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36026d8f99c58d7044413e1b819a67ca0e0b8ebe0f25e775e6c3d1fabb3c38fb"}, - {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ed1af8692bd8d2a29d702f1a2e6065416d76897d726e45a1775b1444f5928a7"}, - {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:314ccc4264ce7d854941231cf71b592e30d8d368a71e50197c905874feacc8a8"}, - {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:982487f8931067a32e72d40ab6b47b1628a9c5d344be7f1a4e668fb462d2da42"}, - {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dbe357bc4ddda078f79d2a36fc1dd0494a7f2fad83a0a684465b6f24b46fe80"}, - {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2f6ffc6701a0eb28648c845f4945a194dc7ab3c651f535b81793251e1185ac3d"}, - {file = "pydantic_core-2.14.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7f5025db12fc6de7bc1104d826d5aee1d172f9ba6ca936bf6474c2148ac336c1"}, - {file = "pydantic_core-2.14.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dab03ed811ed1c71d700ed08bde8431cf429bbe59e423394f0f4055f1ca0ea60"}, - {file = "pydantic_core-2.14.6-cp38-none-win32.whl", hash = "sha256:dfcbebdb3c4b6f739a91769aea5ed615023f3c88cb70df812849aef634c25fbe"}, - {file = "pydantic_core-2.14.6-cp38-none-win_amd64.whl", hash = "sha256:99b14dbea2fdb563d8b5a57c9badfcd72083f6006caf8e126b491519c7d64ca8"}, - {file = "pydantic_core-2.14.6-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:4ce8299b481bcb68e5c82002b96e411796b844d72b3e92a3fbedfe8e19813eab"}, - {file = "pydantic_core-2.14.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b9a9d92f10772d2a181b5ca339dee066ab7d1c9a34ae2421b2a52556e719756f"}, - {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd9e98b408384989ea4ab60206b8e100d8687da18b5c813c11e92fd8212a98e0"}, - {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4f86f1f318e56f5cbb282fe61eb84767aee743ebe32c7c0834690ebea50c0a6b"}, - {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86ce5fcfc3accf3a07a729779d0b86c5d0309a4764c897d86c11089be61da160"}, - {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dcf1978be02153c6a31692d4fbcc2a3f1db9da36039ead23173bc256ee3b91b"}, - {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eedf97be7bc3dbc8addcef4142f4b4164066df0c6f36397ae4aaed3eb187d8ab"}, - {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5f916acf8afbcab6bacbb376ba7dc61f845367901ecd5e328fc4d4aef2fcab0"}, - {file = "pydantic_core-2.14.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8a14c192c1d724c3acbfb3f10a958c55a2638391319ce8078cb36c02283959b9"}, - {file = "pydantic_core-2.14.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0348b1dc6b76041516e8a854ff95b21c55f5a411c3297d2ca52f5528e49d8411"}, - {file = "pydantic_core-2.14.6-cp39-none-win32.whl", hash = "sha256:de2a0645a923ba57c5527497daf8ec5df69c6eadf869e9cd46e86349146e5975"}, - {file = "pydantic_core-2.14.6-cp39-none-win_amd64.whl", hash = "sha256:aca48506a9c20f68ee61c87f2008f81f8ee99f8d7f0104bff3c47e2d148f89d9"}, - {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d5c28525c19f5bb1e09511669bb57353d22b94cf8b65f3a8d141c389a55dec95"}, - {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:78d0768ee59baa3de0f4adac9e3748b4b1fffc52143caebddfd5ea2961595277"}, - {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b93785eadaef932e4fe9c6e12ba67beb1b3f1e5495631419c784ab87e975670"}, - {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a874f21f87c485310944b2b2734cd6d318765bcbb7515eead33af9641816506e"}, - {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b89f4477d915ea43b4ceea6756f63f0288941b6443a2b28c69004fe07fde0d0d"}, - {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:172de779e2a153d36ee690dbc49c6db568d7b33b18dc56b69a7514aecbcf380d"}, - {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:dfcebb950aa7e667ec226a442722134539e77c575f6cfaa423f24371bb8d2e94"}, - {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:55a23dcd98c858c0db44fc5c04fc7ed81c4b4d33c653a7c45ddaebf6563a2f66"}, - {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:4241204e4b36ab5ae466ecec5c4c16527a054c69f99bba20f6f75232a6a534e2"}, - {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e574de99d735b3fc8364cba9912c2bec2da78775eba95cbb225ef7dda6acea24"}, - {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1302a54f87b5cd8528e4d6d1bf2133b6aa7c6122ff8e9dc5220fbc1e07bffebd"}, - {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8e81e4b55930e5ffab4a68db1af431629cf2e4066dbdbfef65348b8ab804ea8"}, - {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c99462ffc538717b3e60151dfaf91125f637e801f5ab008f81c402f1dff0cd0f"}, - {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e4cf2d5829f6963a5483ec01578ee76d329eb5caf330ecd05b3edd697e7d768a"}, - {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cf10b7d58ae4a1f07fccbf4a0a956d705356fea05fb4c70608bb6fa81d103cda"}, - {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:399ac0891c284fa8eb998bcfa323f2234858f5d2efca3950ae58c8f88830f145"}, - {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c6a5c79b28003543db3ba67d1df336f253a87d3112dac3a51b94f7d48e4c0e1"}, - {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:599c87d79cab2a6a2a9df4aefe0455e61e7d2aeede2f8577c1b7c0aec643ee8e"}, - {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43e166ad47ba900f2542a80d83f9fc65fe99eb63ceec4debec160ae729824052"}, - {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a0b5db001b98e1c649dd55afa928e75aa4087e587b9524a4992316fa23c9fba"}, - {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:747265448cb57a9f37572a488a57d873fd96bf51e5bb7edb52cfb37124516da4"}, - {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7ebe3416785f65c28f4f9441e916bfc8a54179c8dea73c23023f7086fa601c5d"}, - {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:86c963186ca5e50d5c8287b1d1c9d3f8f024cbe343d048c5bd282aec2d8641f2"}, - {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e0641b506486f0b4cd1500a2a65740243e8670a2549bb02bc4556a83af84ae03"}, - {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71d72ca5eaaa8d38c8df16b7deb1a2da4f650c41b58bb142f3fb75d5ad4a611f"}, - {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27e524624eace5c59af499cd97dc18bb201dc6a7a2da24bfc66ef151c69a5f2a"}, - {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a3dde6cac75e0b0902778978d3b1646ca9f438654395a362cb21d9ad34b24acf"}, - {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:00646784f6cd993b1e1c0e7b0fdcbccc375d539db95555477771c27555e3c556"}, - {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:23598acb8ccaa3d1d875ef3b35cb6376535095e9405d91a3d57a8c7db5d29341"}, - {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7f41533d7e3cf9520065f610b41ac1c76bc2161415955fbcead4981b22c7611e"}, - {file = "pydantic_core-2.14.6.tar.gz", hash = "sha256:1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948"}, + {file = "pydantic_core-2.18.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9e08e867b306f525802df7cd16c44ff5ebbe747ff0ca6cf3fde7f36c05a59a81"}, + {file = "pydantic_core-2.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f0a21cbaa69900cbe1a2e7cad2aa74ac3cf21b10c3efb0fa0b80305274c0e8a2"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0680b1f1f11fda801397de52c36ce38ef1c1dc841a0927a94f226dea29c3ae3d"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95b9d5e72481d3780ba3442eac863eae92ae43a5f3adb5b4d0a1de89d42bb250"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fcf5cd9c4b655ad666ca332b9a081112cd7a58a8b5a6ca7a3104bc950f2038"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b5155ff768083cb1d62f3e143b49a8a3432e6789a3abee8acd005c3c7af1c74"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:553ef617b6836fc7e4df130bb851e32fe357ce36336d897fd6646d6058d980af"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b89ed9eb7d616ef5714e5590e6cf7f23b02d0d539767d33561e3675d6f9e3857"}, + {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:75f7e9488238e920ab6204399ded280dc4c307d034f3924cd7f90a38b1829563"}, + {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ef26c9e94a8c04a1b2924149a9cb081836913818e55681722d7f29af88fe7b38"}, + {file = "pydantic_core-2.18.2-cp310-none-win32.whl", hash = "sha256:182245ff6b0039e82b6bb585ed55a64d7c81c560715d1bad0cbad6dfa07b4027"}, + {file = "pydantic_core-2.18.2-cp310-none-win_amd64.whl", hash = "sha256:e23ec367a948b6d812301afc1b13f8094ab7b2c280af66ef450efc357d2ae543"}, + {file = "pydantic_core-2.18.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:219da3f096d50a157f33645a1cf31c0ad1fe829a92181dd1311022f986e5fbe3"}, + {file = "pydantic_core-2.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cc1cfd88a64e012b74e94cd00bbe0f9c6df57049c97f02bb07d39e9c852e19a4"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05b7133a6e6aeb8df37d6f413f7705a37ab4031597f64ab56384c94d98fa0e90"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:224c421235f6102e8737032483f43c1a8cfb1d2f45740c44166219599358c2cd"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b14d82cdb934e99dda6d9d60dc84a24379820176cc4a0d123f88df319ae9c150"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2728b01246a3bba6de144f9e3115b532ee44bd6cf39795194fb75491824a1413"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:470b94480bb5ee929f5acba6995251ada5e059a5ef3e0dfc63cca287283ebfa6"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:997abc4df705d1295a42f95b4eec4950a37ad8ae46d913caeee117b6b198811c"}, + {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75250dbc5290e3f1a0f4618db35e51a165186f9034eff158f3d490b3fed9f8a0"}, + {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4456f2dca97c425231d7315737d45239b2b51a50dc2b6f0c2bb181fce6207664"}, + {file = "pydantic_core-2.18.2-cp311-none-win32.whl", hash = "sha256:269322dcc3d8bdb69f054681edff86276b2ff972447863cf34c8b860f5188e2e"}, + {file = "pydantic_core-2.18.2-cp311-none-win_amd64.whl", hash = "sha256:800d60565aec896f25bc3cfa56d2277d52d5182af08162f7954f938c06dc4ee3"}, + {file = "pydantic_core-2.18.2-cp311-none-win_arm64.whl", hash = "sha256:1404c69d6a676245199767ba4f633cce5f4ad4181f9d0ccb0577e1f66cf4c46d"}, + {file = "pydantic_core-2.18.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:fb2bd7be70c0fe4dfd32c951bc813d9fe6ebcbfdd15a07527796c8204bd36242"}, + {file = "pydantic_core-2.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6132dd3bd52838acddca05a72aafb6eab6536aa145e923bb50f45e78b7251043"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d904828195733c183d20a54230c0df0eb46ec746ea1a666730787353e87182"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9bd70772c720142be1020eac55f8143a34ec9f82d75a8e7a07852023e46617f"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b8ed04b3582771764538f7ee7001b02e1170223cf9b75dff0bc698fadb00cf3"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6dac87ddb34aaec85f873d737e9d06a3555a1cc1a8e0c44b7f8d5daeb89d86f"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ca4ae5a27ad7a4ee5170aebce1574b375de390bc01284f87b18d43a3984df72"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:886eec03591b7cf058467a70a87733b35f44707bd86cf64a615584fd72488b7c"}, + {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ca7b0c1f1c983e064caa85f3792dd2fe3526b3505378874afa84baf662e12241"}, + {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b4356d3538c3649337df4074e81b85f0616b79731fe22dd11b99499b2ebbdf3"}, + {file = "pydantic_core-2.18.2-cp312-none-win32.whl", hash = "sha256:8b172601454f2d7701121bbec3425dd71efcb787a027edf49724c9cefc14c038"}, + {file = "pydantic_core-2.18.2-cp312-none-win_amd64.whl", hash = "sha256:b1bd7e47b1558ea872bd16c8502c414f9e90dcf12f1395129d7bb42a09a95438"}, + {file = "pydantic_core-2.18.2-cp312-none-win_arm64.whl", hash = "sha256:98758d627ff397e752bc339272c14c98199c613f922d4a384ddc07526c86a2ec"}, + {file = "pydantic_core-2.18.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9fdad8e35f278b2c3eb77cbdc5c0a49dada440657bf738d6905ce106dc1de439"}, + {file = "pydantic_core-2.18.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1d90c3265ae107f91a4f279f4d6f6f1d4907ac76c6868b27dc7fb33688cfb347"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390193c770399861d8df9670fb0d1874f330c79caaca4642332df7c682bf6b91"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:82d5d4d78e4448683cb467897fe24e2b74bb7b973a541ea1dcfec1d3cbce39fb"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4774f3184d2ef3e14e8693194f661dea5a4d6ca4e3dc8e39786d33a94865cefd"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4d938ec0adf5167cb335acb25a4ee69a8107e4984f8fbd2e897021d9e4ca21b"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0e8b1be28239fc64a88a8189d1df7fad8be8c1ae47fcc33e43d4be15f99cc70"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:868649da93e5a3d5eacc2b5b3b9235c98ccdbfd443832f31e075f54419e1b96b"}, + {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:78363590ef93d5d226ba21a90a03ea89a20738ee5b7da83d771d283fd8a56761"}, + {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:852e966fbd035a6468fc0a3496589b45e2208ec7ca95c26470a54daed82a0788"}, + {file = "pydantic_core-2.18.2-cp38-none-win32.whl", hash = "sha256:6a46e22a707e7ad4484ac9ee9f290f9d501df45954184e23fc29408dfad61350"}, + {file = "pydantic_core-2.18.2-cp38-none-win_amd64.whl", hash = "sha256:d91cb5ea8b11607cc757675051f61b3d93f15eca3cefb3e6c704a5d6e8440f4e"}, + {file = "pydantic_core-2.18.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ae0a8a797a5e56c053610fa7be147993fe50960fa43609ff2a9552b0e07013e8"}, + {file = "pydantic_core-2.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:042473b6280246b1dbf530559246f6842b56119c2926d1e52b631bdc46075f2a"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a388a77e629b9ec814c1b1e6b3b595fe521d2cdc625fcca26fbc2d44c816804"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25add29b8f3b233ae90ccef2d902d0ae0432eb0d45370fe315d1a5cf231004b"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f459a5ce8434614dfd39bbebf1041952ae01da6bed9855008cb33b875cb024c0"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eff2de745698eb46eeb51193a9f41d67d834d50e424aef27df2fcdee1b153845"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8309f67285bdfe65c372ea3722b7a5642680f3dba538566340a9d36e920b5f0"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f93a8a2e3938ff656a7c1bc57193b1319960ac015b6e87d76c76bf14fe0244b4"}, + {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:22057013c8c1e272eb8d0eebc796701167d8377441ec894a8fed1af64a0bf399"}, + {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfeecd1ac6cc1fb2692c3d5110781c965aabd4ec5d32799773ca7b1456ac636b"}, + {file = "pydantic_core-2.18.2-cp39-none-win32.whl", hash = "sha256:0d69b4c2f6bb3e130dba60d34c0845ba31b69babdd3f78f7c0c8fae5021a253e"}, + {file = "pydantic_core-2.18.2-cp39-none-win_amd64.whl", hash = "sha256:d9319e499827271b09b4e411905b24a426b8fb69464dfa1696258f53a3334641"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a1874c6dd4113308bd0eb568418e6114b252afe44319ead2b4081e9b9521fe75"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:ccdd111c03bfd3666bd2472b674c6899550e09e9f298954cfc896ab92b5b0e6d"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e18609ceaa6eed63753037fc06ebb16041d17d28199ae5aba0052c51449650a9"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e5c584d357c4e2baf0ff7baf44f4994be121e16a2c88918a5817331fc7599d7"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43f0f463cf89ace478de71a318b1b4f05ebc456a9b9300d027b4b57c1a2064fb"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e1b395e58b10b73b07b7cf740d728dd4ff9365ac46c18751bf8b3d8cca8f625a"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0098300eebb1c837271d3d1a2cd2911e7c11b396eac9661655ee524a7f10587b"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:36789b70d613fbac0a25bb07ab3d9dba4d2e38af609c020cf4d888d165ee0bf3"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f9a801e7c8f1ef8718da265bba008fa121243dfe37c1cea17840b0944dfd72c"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3a6515ebc6e69d85502b4951d89131ca4e036078ea35533bb76327f8424531ce"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20aca1e2298c56ececfd8ed159ae4dde2df0781988c97ef77d5c16ff4bd5b400"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:223ee893d77a310a0391dca6df00f70bbc2f36a71a895cecd9a0e762dc37b349"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2334ce8c673ee93a1d6a65bd90327588387ba073c17e61bf19b4fd97d688d63c"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cbca948f2d14b09d20268cda7b0367723d79063f26c4ffc523af9042cad95592"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b3ef08e20ec49e02d5c6717a91bb5af9b20f1805583cb0adfe9ba2c6b505b5ae"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6fdc8627910eed0c01aed6a390a252fe3ea6d472ee70fdde56273f198938374"}, + {file = "pydantic_core-2.18.2.tar.gz", hash = "sha256:2e29d20810dfc3043ee13ac7d9e25105799817683348823f305ab3f349b9386e"}, ] [package.dependencies] @@ -1044,28 +1136,27 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pygments" -version = "2.17.2" +version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] -plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyparsing" -version = "3.1.1" +version = "3.1.2" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, - {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, ] [package.extras] @@ -1073,164 +1164,234 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] six = ">=1.5" +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + [[package]] name = "python-multipart" -version = "0.0.6" +version = "0.0.9" description = "A streaming multipart parser for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "python_multipart-0.0.6-py3-none-any.whl", hash = "sha256:ee698bab5ef148b0a760751c261902cd096e57e10558e11aca17646b74ee1c18"}, - {file = "python_multipart-0.0.6.tar.gz", hash = "sha256:e9925a80bb668529f1b67c7fdb0a5dacdd7cbfc6fb0bff3ea443fe22bdd62132"}, + {file = "python_multipart-0.0.9-py3-none-any.whl", hash = "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"}, + {file = "python_multipart-0.0.9.tar.gz", hash = "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026"}, ] [package.extras] -dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatch", "invoke (==1.7.3)", "more-itertools (==4.3.0)", "pbr (==4.3.0)", "pluggy (==1.0.0)", "py (==1.11.0)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-timeout (==2.1.0)", "pyyaml (==5.1)"] +dev = ["atomicwrites (==1.4.1)", "attrs (==23.2.0)", "coverage (==7.4.1)", "hatch", "invoke (==2.2.0)", "more-itertools (==10.2.0)", "pbr (==6.0.0)", "pluggy (==1.4.0)", "py (==1.11.0)", "pytest (==8.0.0)", "pytest-cov (==4.1.0)", "pytest-timeout (==2.2.0)", "pyyaml (==6.0.1)", "ruff (==0.2.1)"] [[package]] name = "pytz" -version = "2023.3.post1" +version = "2024.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, - {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] [[package]] name = "regex" -version = "2023.12.25" +version = "2024.5.10" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, - {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, - {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, - {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, - {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, - {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, - {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, - {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, - {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, - {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, - {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, - {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, - {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, - {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, - {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, + {file = "regex-2024.5.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:eda3dd46df535da787ffb9036b5140f941ecb91701717df91c9daf64cabef953"}, + {file = "regex-2024.5.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d5bd666466c8f00a06886ce1397ba8b12371c1f1c6d1bef11013e9e0a1464a8"}, + {file = "regex-2024.5.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32e5f3b8e32918bfbdd12eca62e49ab3031125c454b507127ad6ecbd86e62fca"}, + {file = "regex-2024.5.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:534efd2653ebc4f26fc0e47234e53bf0cb4715bb61f98c64d2774a278b58c846"}, + {file = "regex-2024.5.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:193b7c6834a06f722f0ce1ba685efe80881de7c3de31415513862f601097648c"}, + {file = "regex-2024.5.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:160ba087232c5c6e2a1e7ad08bd3a3f49b58c815be0504d8c8aacfb064491cd8"}, + {file = "regex-2024.5.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:951be1eae7b47660412dc4938777a975ebc41936d64e28081bf2e584b47ec246"}, + {file = "regex-2024.5.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8a0f0ab5453e409586b11ebe91c672040bc804ca98d03a656825f7890cbdf88"}, + {file = "regex-2024.5.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e6d4d6ae1827b2f8c7200aaf7501c37cf3f3896c86a6aaf2566448397c823dd"}, + {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:161a206c8f3511e2f5fafc9142a2cc25d7fe9a1ec5ad9b4ad2496a7c33e1c5d2"}, + {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:44b3267cea873684af022822195298501568ed44d542f9a2d9bebc0212e99069"}, + {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:560278c9975694e1f0bc50da187abf2cdc1e4890739ea33df2bc4a85eeef143e"}, + {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:70364a097437dd0a90b31cd77f09f7387ad9ac60ef57590971f43b7fca3082a5"}, + {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:42be5de7cc8c1edac55db92d82b68dc8e683b204d6f5414c5a51997a323d7081"}, + {file = "regex-2024.5.10-cp310-cp310-win32.whl", hash = "sha256:9a8625849387b9d558d528e263ecc9c0fbde86cfa5c2f0eef43fff480ae24d71"}, + {file = "regex-2024.5.10-cp310-cp310-win_amd64.whl", hash = "sha256:903350bf44d7e4116b4d5898b30b15755d61dcd3161e3413a49c7db76f0bee5a"}, + {file = "regex-2024.5.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bf9596cba92ce7b1fd32c7b07c6e3212c7eed0edc271757e48bfcd2b54646452"}, + {file = "regex-2024.5.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:45cc13d398b6359a7708986386f72bd156ae781c3e83a68a6d4cee5af04b1ce9"}, + {file = "regex-2024.5.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ad45f3bccfcb00868f2871dce02a755529838d2b86163ab8a246115e80cfb7d6"}, + {file = "regex-2024.5.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33d19f0cde6838c81acffff25c7708e4adc7dd02896c9ec25c3939b1500a1778"}, + {file = "regex-2024.5.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a9f89d7db5ef6bdf53e5cc8e6199a493d0f1374b3171796b464a74ebe8e508a"}, + {file = "regex-2024.5.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c6c71cf92b09e5faa72ea2c68aa1f61c9ce11cb66fdc5069d712f4392ddfd00"}, + {file = "regex-2024.5.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7467ad8b0eac0b28e52679e972b9b234b3de0ea5cee12eb50091d2b68145fe36"}, + {file = "regex-2024.5.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc0db93ad039fc2fe32ccd3dd0e0e70c4f3d6e37ae83f0a487e1aba939bd2fbd"}, + {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fa9335674d7c819674467c7b46154196c51efbaf5f5715187fd366814ba3fa39"}, + {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7dda3091838206969c2b286f9832dff41e2da545b99d1cfaea9ebd8584d02708"}, + {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:504b5116e2bd1821efd815941edff7535e93372a098e156bb9dffde30264e798"}, + {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:91b53dea84415e8115506cc62e441a2b54537359c63d856d73cb1abe05af4c9a"}, + {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1a3903128f9e17a500618e80c68165c78c741ebb17dd1a0b44575f92c3c68b02"}, + {file = "regex-2024.5.10-cp311-cp311-win32.whl", hash = "sha256:236cace6c1903effd647ed46ce6dd5d76d54985fc36dafc5256032886736c85d"}, + {file = "regex-2024.5.10-cp311-cp311-win_amd64.whl", hash = "sha256:12446827f43c7881decf2c126762e11425de5eb93b3b0d8b581344c16db7047a"}, + {file = "regex-2024.5.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:14905ed75c7a6edf423eb46c213ed3f4507c38115f1ed3c00f4ec9eafba50e58"}, + {file = "regex-2024.5.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4fad420b14ae1970a1f322e8ae84a1d9d89375eb71e1b504060ab2d1bfe68f3c"}, + {file = "regex-2024.5.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c46a76a599fcbf95f98755275c5527304cc4f1bb69919434c1e15544d7052910"}, + {file = "regex-2024.5.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0faecb6d5779753a6066a3c7a0471a8d29fe25d9981ca9e552d6d1b8f8b6a594"}, + {file = "regex-2024.5.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aab65121229c2ecdf4a31b793d99a6a0501225bd39b616e653c87b219ed34a49"}, + {file = "regex-2024.5.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50e7e96a527488334379e05755b210b7da4a60fc5d6481938c1fa053e0c92184"}, + {file = "regex-2024.5.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba034c8db4b264ef1601eb33cd23d87c5013b8fb48b8161debe2e5d3bd9156b0"}, + {file = "regex-2024.5.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:031219782d97550c2098d9a68ce9e9eaefe67d2d81d8ff84c8354f9c009e720c"}, + {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:62b5f7910b639f3c1d122d408421317c351e213ca39c964ad4121f27916631c6"}, + {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cd832bd9b6120d6074f39bdfbb3c80e416848b07ac72910f1c7f03131a6debc3"}, + {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:e91b1976358e17197157b405cab408a5f4e33310cda211c49fc6da7cffd0b2f0"}, + {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:571452362d552de508c37191b6abbbb660028b8b418e2d68c20779e0bc8eaaa8"}, + {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5253dcb0bfda7214523de58b002eb0090cb530d7c55993ce5f6d17faf953ece7"}, + {file = "regex-2024.5.10-cp312-cp312-win32.whl", hash = "sha256:2f30a5ab8902f93930dc6f627c4dd5da2703333287081c85cace0fc6e21c25af"}, + {file = "regex-2024.5.10-cp312-cp312-win_amd64.whl", hash = "sha256:3799e36d60a35162bb35b2246d8bb012192b7437dff807ef79c14e7352706306"}, + {file = "regex-2024.5.10-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bbdc5db2c98ac2bf1971ffa1410c87ca7a15800415f788971e8ba8520fc0fda9"}, + {file = "regex-2024.5.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6ccdeef4584450b6f0bddd5135354908dacad95425fcb629fe36d13e48b60f32"}, + {file = "regex-2024.5.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:29d839829209f3c53f004e1de8c3113efce6d98029f044fa5cfee666253ee7e6"}, + {file = "regex-2024.5.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0709ba544cf50bd5cb843df4b8bb6701bae2b70a8e88da9add8386cbca5c1385"}, + {file = "regex-2024.5.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:972b49f2fe1047b9249c958ec4fa1bdd2cf8ce305dc19d27546d5a38e57732d8"}, + {file = "regex-2024.5.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cdbb1998da94607d5eec02566b9586f0e70d6438abf1b690261aac0edda7ab6"}, + {file = "regex-2024.5.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7c8ee4861d9ef5b1120abb75846828c811f932d63311596ad25fa168053e00"}, + {file = "regex-2024.5.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d35d4cc9270944e95f9c88af757b0c9fc43f396917e143a5756608462c5223b"}, + {file = "regex-2024.5.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8722f72068b3e1156a4b2e1afde6810f1fc67155a9fa30a4b9d5b4bc46f18fb0"}, + {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:696639a73ca78a380acfaa0a1f6dd8220616a99074c05bba9ba8bb916914b224"}, + {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea057306ab469130167014b662643cfaed84651c792948891d003cf0039223a5"}, + {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b43b78f9386d3d932a6ce5af4b45f393d2e93693ee18dc4800d30a8909df700e"}, + {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c43395a3b7cc9862801a65c6994678484f186ce13c929abab44fb8a9e473a55a"}, + {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0bc94873ba11e34837bffd7e5006703abeffc4514e2f482022f46ce05bd25e67"}, + {file = "regex-2024.5.10-cp38-cp38-win32.whl", hash = "sha256:1118ba9def608250250f4b3e3f48c62f4562ba16ca58ede491b6e7554bfa09ff"}, + {file = "regex-2024.5.10-cp38-cp38-win_amd64.whl", hash = "sha256:458d68d34fb74b906709735c927c029e62f7d06437a98af1b5b6258025223210"}, + {file = "regex-2024.5.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:15e593386ec6331e0ab4ac0795b7593f02ab2f4b30a698beb89fbdc34f92386a"}, + {file = "regex-2024.5.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ca23b41355ba95929e9505ee04e55495726aa2282003ed9b012d86f857d3e49b"}, + {file = "regex-2024.5.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2c8982ee19ccecabbaeac1ba687bfef085a6352a8c64f821ce2f43e6d76a9298"}, + {file = "regex-2024.5.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7117cb7d6ac7f2e985f3d18aa8a1728864097da1a677ffa69e970ca215baebf1"}, + {file = "regex-2024.5.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b66421f8878a0c82fc0c272a43e2121c8d4c67cb37429b764f0d5ad70b82993b"}, + {file = "regex-2024.5.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:224a9269f133564109ce668213ef3cb32bc72ccf040b0b51c72a50e569e9dc9e"}, + {file = "regex-2024.5.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab98016541543692a37905871a5ffca59b16e08aacc3d7d10a27297b443f572d"}, + {file = "regex-2024.5.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51d27844763c273a122e08a3e86e7aefa54ee09fb672d96a645ece0454d8425e"}, + {file = "regex-2024.5.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:853cc36e756ff673bf984e9044ccc8fad60b95a748915dddeab9488aea974c73"}, + {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e7eaf9df15423d07b6050fb91f86c66307171b95ea53e2d87a7993b6d02c7f7"}, + {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:169fd0acd7a259f58f417e492e93d0e15fc87592cd1e971c8c533ad5703b5830"}, + {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:334b79ce9c08f26b4659a53f42892793948a613c46f1b583e985fd5a6bf1c149"}, + {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f03b1dbd4d9596dd84955bb40f7d885204d6aac0d56a919bb1e0ff2fb7e1735a"}, + {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfa6d61a76c77610ba9274c1a90a453062bdf6887858afbe214d18ad41cf6bde"}, + {file = "regex-2024.5.10-cp39-cp39-win32.whl", hash = "sha256:249fbcee0a277c32a3ce36d8e36d50c27c968fdf969e0fbe342658d4e010fbc8"}, + {file = "regex-2024.5.10-cp39-cp39-win_amd64.whl", hash = "sha256:0ce56a923f4c01d7568811bfdffe156268c0a7aae8a94c902b92fe34c4bde785"}, + {file = "regex-2024.5.10.tar.gz", hash = "sha256:304e7e2418146ae4d0ef0e9ffa28f881f7874b45b4994cc2279b21b6e7ae50c8"}, ] [[package]] name = "rich" -version = "13.7.0" +version = "13.7.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.7.0" files = [ - {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"}, - {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"}, + {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, + {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, ] [package.dependencies] markdown-it-py = ">=2.2.0" pygments = ">=2.13.0,<3.0.0" -typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] +[[package]] +name = "shellingham" +version = "1.5.4" +description = "Tool to Detect Surrounding Shell" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, +] + [[package]] name = "six" version = "1.16.0" @@ -1244,24 +1405,24 @@ files = [ [[package]] name = "sniffio" -version = "1.3.0" +version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] [[package]] name = "starlette" -version = "0.35.1" +version = "0.37.2" description = "The little ASGI library that shines." optional = false python-versions = ">=3.8" files = [ - {file = "starlette-0.35.1-py3-none-any.whl", hash = "sha256:50bbbda9baa098e361f398fda0928062abbaf1f54f4fadcbe17c092a01eb9a25"}, - {file = "starlette-0.35.1.tar.gz", hash = "sha256:3e2639dac3520e4f58734ed22553f950d3f3cb1001cd2eaac4d57e8cdc5f66bc"}, + {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, + {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, ] [package.dependencies] @@ -1269,7 +1430,7 @@ anyio = ">=3.4.0,<5" typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} [package.extras] -full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] [[package]] name = "toml" @@ -1282,26 +1443,43 @@ files = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] +[[package]] +name = "typer" +version = "0.12.3" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +optional = false +python-versions = ">=3.7" +files = [ + {file = "typer-0.12.3-py3-none-any.whl", hash = "sha256:070d7ca53f785acbccba8e7d28b08dcd88f79f1fbda035ade0aecec71ca5c914"}, + {file = "typer-0.12.3.tar.gz", hash = "sha256:49e73131481d804288ef62598d97a1ceef3058905aa536a1134f90891ba35482"}, +] + +[package.dependencies] +click = ">=8.0.0" +rich = ">=10.11.0" +shellingham = ">=1.3.0" +typing-extensions = ">=3.7.4.3" + [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.11.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] [[package]] name = "tzdata" -version = "2023.4" +version = "2024.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2023.4-py2.py3-none-any.whl", hash = "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3"}, - {file = "tzdata-2023.4.tar.gz", hash = "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9"}, + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] [[package]] @@ -1316,31 +1494,336 @@ files = [ ] [package.dependencies] -"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} tzdata = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] +[[package]] +name = "ujson" +version = "5.10.0" +description = "Ultra fast JSON encoder and decoder for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, + {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"}, + {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"}, + {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"}, + {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"}, + {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"}, + {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"}, + {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"}, + {file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"}, + {file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4"}, + {file = "ujson-5.10.0-cp38-cp38-win32.whl", hash = "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8"}, + {file = "ujson-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"}, + {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"}, + {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"}, + {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, +] + [[package]] name = "uvicorn" -version = "0.26.0" +version = "0.29.0" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.26.0-py3-none-any.whl", hash = "sha256:cdb58ef6b8188c6c174994b2b1ba2150a9a8ae7ea5fb2f1b856b94a815d6071d"}, - {file = "uvicorn-0.26.0.tar.gz", hash = "sha256:48bfd350fce3c5c57af5fb4995fded8fb50da3b4feb543eb18ad7e0d54589602"}, + {file = "uvicorn-0.29.0-py3-none-any.whl", hash = "sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de"}, + {file = "uvicorn-0.29.0.tar.gz", hash = "sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0"}, ] [package.dependencies] click = ">=7.0" +colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} h11 = ">=0.8" +httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} +python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} [package.extras] standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] +[[package]] +name = "uvloop" +version = "0.19.0" +description = "Fast implementation of asyncio event loop on top of libuv" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e"}, + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5"}, + {file = "uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd"}, +] + +[package.extras] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] + +[[package]] +name = "watchfiles" +version = "0.21.0" +description = "Simple, modern and high performance file watching and code reload in python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchfiles-0.21.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:27b4035013f1ea49c6c0b42d983133b136637a527e48c132d368eb19bf1ac6aa"}, + {file = "watchfiles-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c81818595eff6e92535ff32825f31c116f867f64ff8cdf6562cd1d6b2e1e8f3e"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c107ea3cf2bd07199d66f156e3ea756d1b84dfd43b542b2d870b77868c98c03"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d9ac347653ebd95839a7c607608703b20bc07e577e870d824fa4801bc1cb124"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5eb86c6acb498208e7663ca22dbe68ca2cf42ab5bf1c776670a50919a56e64ab"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f564bf68404144ea6b87a78a3f910cc8de216c6b12a4cf0b27718bf4ec38d303"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d0f32ebfaa9c6011f8454994f86108c2eb9c79b8b7de00b36d558cadcedaa3d"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d45d9b699ecbac6c7bd8e0a2609767491540403610962968d258fd6405c17c"}, + {file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:aff06b2cac3ef4616e26ba17a9c250c1fe9dd8a5d907d0193f84c499b1b6e6a9"}, + {file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d9792dff410f266051025ecfaa927078b94cc7478954b06796a9756ccc7e14a9"}, + {file = "watchfiles-0.21.0-cp310-none-win32.whl", hash = "sha256:214cee7f9e09150d4fb42e24919a1e74d8c9b8a9306ed1474ecaddcd5479c293"}, + {file = "watchfiles-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:1ad7247d79f9f55bb25ab1778fd47f32d70cf36053941f07de0b7c4e96b5d235"}, + {file = "watchfiles-0.21.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:668c265d90de8ae914f860d3eeb164534ba2e836811f91fecc7050416ee70aa7"}, + {file = "watchfiles-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a23092a992e61c3a6a70f350a56db7197242f3490da9c87b500f389b2d01eef"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e7941bbcfdded9c26b0bf720cb7e6fd803d95a55d2c14b4bd1f6a2772230c586"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11cd0c3100e2233e9c53106265da31d574355c288e15259c0d40a4405cbae317"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78f30cbe8b2ce770160d3c08cff01b2ae9306fe66ce899b73f0409dc1846c1b"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6674b00b9756b0af620aa2a3346b01f8e2a3dc729d25617e1b89cf6af4a54eb1"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd7ac678b92b29ba630d8c842d8ad6c555abda1b9ef044d6cc092dacbfc9719d"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c873345680c1b87f1e09e0eaf8cf6c891b9851d8b4d3645e7efe2ec20a20cc7"}, + {file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49f56e6ecc2503e7dbe233fa328b2be1a7797d31548e7a193237dcdf1ad0eee0"}, + {file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:02d91cbac553a3ad141db016e3350b03184deaafeba09b9d6439826ee594b365"}, + {file = "watchfiles-0.21.0-cp311-none-win32.whl", hash = "sha256:ebe684d7d26239e23d102a2bad2a358dedf18e462e8808778703427d1f584400"}, + {file = "watchfiles-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:4566006aa44cb0d21b8ab53baf4b9c667a0ed23efe4aaad8c227bfba0bf15cbe"}, + {file = "watchfiles-0.21.0-cp311-none-win_arm64.whl", hash = "sha256:c550a56bf209a3d987d5a975cdf2063b3389a5d16caf29db4bdddeae49f22078"}, + {file = "watchfiles-0.21.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:51ddac60b96a42c15d24fbdc7a4bfcd02b5a29c047b7f8bf63d3f6f5a860949a"}, + {file = "watchfiles-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:511f0b034120cd1989932bf1e9081aa9fb00f1f949fbd2d9cab6264916ae89b1"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cfb92d49dbb95ec7a07511bc9efb0faff8fe24ef3805662b8d6808ba8409a71a"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f92944efc564867bbf841c823c8b71bb0be75e06b8ce45c084b46411475a915"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:642d66b75eda909fd1112d35c53816d59789a4b38c141a96d62f50a3ef9b3360"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d23bcd6c8eaa6324fe109d8cac01b41fe9a54b8c498af9ce464c1aeeb99903d6"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18d5b4da8cf3e41895b34e8c37d13c9ed294954907929aacd95153508d5d89d7"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b8d1eae0f65441963d805f766c7e9cd092f91e0c600c820c764a4ff71a0764c"}, + {file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1fd9a5205139f3c6bb60d11f6072e0552f0a20b712c85f43d42342d162be1235"}, + {file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a1e3014a625bcf107fbf38eece0e47fa0190e52e45dc6eee5a8265ddc6dc5ea7"}, + {file = "watchfiles-0.21.0-cp312-none-win32.whl", hash = "sha256:9d09869f2c5a6f2d9df50ce3064b3391d3ecb6dced708ad64467b9e4f2c9bef3"}, + {file = "watchfiles-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:18722b50783b5e30a18a8a5db3006bab146d2b705c92eb9a94f78c72beb94094"}, + {file = "watchfiles-0.21.0-cp312-none-win_arm64.whl", hash = "sha256:a3b9bec9579a15fb3ca2d9878deae789df72f2b0fdaf90ad49ee389cad5edab6"}, + {file = "watchfiles-0.21.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:4ea10a29aa5de67de02256a28d1bf53d21322295cb00bd2d57fcd19b850ebd99"}, + {file = "watchfiles-0.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:40bca549fdc929b470dd1dbfcb47b3295cb46a6d2c90e50588b0a1b3bd98f429"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9b37a7ba223b2f26122c148bb8d09a9ff312afca998c48c725ff5a0a632145f7"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec8c8900dc5c83650a63dd48c4d1d245343f904c4b64b48798c67a3767d7e165"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ad3fe0a3567c2f0f629d800409cd528cb6251da12e81a1f765e5c5345fd0137"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d353c4cfda586db2a176ce42c88f2fc31ec25e50212650c89fdd0f560ee507b"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:83a696da8922314ff2aec02987eefb03784f473281d740bf9170181829133765"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a03651352fc20975ee2a707cd2d74a386cd303cc688f407296064ad1e6d1562"}, + {file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3ad692bc7792be8c32918c699638b660c0de078a6cbe464c46e1340dadb94c19"}, + {file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06247538e8253975bdb328e7683f8515ff5ff041f43be6c40bff62d989b7d0b0"}, + {file = "watchfiles-0.21.0-cp38-none-win32.whl", hash = "sha256:9a0aa47f94ea9a0b39dd30850b0adf2e1cd32a8b4f9c7aa443d852aacf9ca214"}, + {file = "watchfiles-0.21.0-cp38-none-win_amd64.whl", hash = "sha256:8d5f400326840934e3507701f9f7269247f7c026d1b6cfd49477d2be0933cfca"}, + {file = "watchfiles-0.21.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7f762a1a85a12cc3484f77eee7be87b10f8c50b0b787bb02f4e357403cad0c0e"}, + {file = "watchfiles-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6e9be3ef84e2bb9710f3f777accce25556f4a71e15d2b73223788d528fcc2052"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4c48a10d17571d1275701e14a601e36959ffada3add8cdbc9e5061a6e3579a5d"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c889025f59884423428c261f212e04d438de865beda0b1e1babab85ef4c0f01"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:66fac0c238ab9a2e72d026b5fb91cb902c146202bbd29a9a1a44e8db7b710b6f"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4a21f71885aa2744719459951819e7bf5a906a6448a6b2bbce8e9cc9f2c8128"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c9198c989f47898b2c22201756f73249de3748e0fc9de44adaf54a8b259cc0c"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f57c4461cd24fda22493109c45b3980863c58a25b8bec885ca8bea6b8d4b28"}, + {file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:853853cbf7bf9408b404754b92512ebe3e3a83587503d766d23e6bf83d092ee6"}, + {file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d5b1dc0e708fad9f92c296ab2f948af403bf201db8fb2eb4c8179db143732e49"}, + {file = "watchfiles-0.21.0-cp39-none-win32.whl", hash = "sha256:59137c0c6826bd56c710d1d2bda81553b5e6b7c84d5a676747d80caf0409ad94"}, + {file = "watchfiles-0.21.0-cp39-none-win_amd64.whl", hash = "sha256:6cb8fdc044909e2078c248986f2fc76f911f72b51ea4a4fbbf472e01d14faa58"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ab03a90b305d2588e8352168e8c5a1520b721d2d367f31e9332c4235b30b8994"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:927c589500f9f41e370b0125c12ac9e7d3a2fd166b89e9ee2828b3dda20bfe6f"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd467213195e76f838caf2c28cd65e58302d0254e636e7c0fca81efa4a2e62c"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:08dca260e85ffae975448e344834d765983237ad6dc308231aa16e7933db763e"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ccceb50c611c433145502735e0370877cced72a6c70fd2410238bcbc7fe51d8"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57d430f5fb63fea141ab71ca9c064e80de3a20b427ca2febcbfcef70ff0ce895"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd5fad9b9c0dd89904bbdea978ce89a2b692a7ee8a0ce19b940e538c88a809c"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:be6dd5d52b73018b21adc1c5d28ac0c68184a64769052dfeb0c5d9998e7f56a2"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b3cab0e06143768499384a8a5efb9c4dc53e19382952859e4802f294214f36ec"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c6ed10c2497e5fedadf61e465b3ca12a19f96004c15dcffe4bd442ebadc2d85"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43babacef21c519bc6631c5fce2a61eccdfc011b4bcb9047255e9620732c8097"}, + {file = "watchfiles-0.21.0.tar.gz", hash = "sha256:c76c635fabf542bb78524905718c39f736a98e5ab25b23ec6d4abede1a85a6a3"}, +] + +[package.dependencies] +anyio = ">=3.0.0" + +[[package]] +name = "websockets" +version = "12.0" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, + {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, + {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, + {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, + {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, + {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, + {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, + {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, + {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, + {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, + {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, + {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, + {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, + {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, + {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, + {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, + {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, + {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, + {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, + {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, + {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, + {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, + {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, + {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, + {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, +] + [[package]] name = "win32-setctime" version = "1.1.0" @@ -1357,20 +1840,20 @@ dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] [[package]] name = "zipp" -version = "3.17.0" +version = "3.18.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" -python-versions = "^3.8" -content-hash = "84928ecd058b4d0620d877b75aeb8347cf2ef59d1150bdb5f812b10a675f5df7" +python-versions = "^3.9" +content-hash = "8bad2b89d555e80bc5f1edbf21bdc15ae9984fc709121c5523a2ea24438aa249" diff --git a/pyproject.toml b/pyproject.toml index 9877c7d093787c23509593cbafed06a19c5b1242..238de8ce82524493c68bcefbd6e61b735a24d9ea 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "meme-generator" -version = "0.0.18" +version = "0.0.20" description = "Python package for making fun pictures" authors = ["meetwq "] license = "MIT" @@ -14,33 +14,38 @@ exclude = [ ] [tool.poetry.dependencies] -python = "^3.8" +python = "^3.9" httpx = ">=0.20.0,<1.0.0" loguru = ">=0.6.0,<1.0.0" -pil-utils = "^0.1.8" +pil-utils = "^0.1.10" toml = "^0.10.2" fastapi = ">=0.93.0,<1.0.0" uvicorn = ">=0.20.0,<1.0.0" -python-multipart = "^0.0.6" +python-multipart = ">=0.0.9,<0.1.0" filetype = "^1.2.0" rich = "^13.0.0" -dateparser = "^1.1.0" -typing-extensions = ">=4.0.0,<5.0.0" +dateparser = "^1.2.0" +typing-extensions = ">=4.4.0,<5.0.0" [tool.poetry.group.dev.dependencies] [tool.poetry.scripts] meme = "meme_generator.cli:main" -[tool.isort] -profile = "black" -skip_gitignore = true +[tool.pyright] +pythonVersion = "3.9" +pythonPlatform = "All" +typeCheckingMode = "basic" [tool.ruff] -select = ["E", "W", "F", "UP", "C", "T", "PYI", "Q"] +line-length = 88 +target-version = "py39" + +[tool.ruff.lint] +select = ["E", "W", "F", "UP", "C", "T", "PYI", "PT", "Q"] ignore = ["E402", "E501", "E711", "C901", "UP037"] -[tool.ruff.isort] +[tool.ruff.lint.isort] detect-same-package = true [build-system] diff --git a/resources/fonts/NotoSansSC-Bold.ttf b/resources/fonts/NotoSansSC-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..004f714c78a0d54a209a7b6b803f3499b19d5086 --- /dev/null +++ b/resources/fonts/NotoSansSC-Bold.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:297c1dd08c6176525405620d8425213906a7759cc3fe2b8dfa22991163bead36 +size 10550116 diff --git a/resources/fonts/NotoSansSC-Regular.ttf b/resources/fonts/NotoSansSC-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5a1c991338ec5750a635d811297c7be326eb95f9 --- /dev/null +++ b/resources/fonts/NotoSansSC-Regular.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae82f4e2a55e1316a55bcc1d05e9555ce08d8bda07e893b486896b626fd852ff +size 10560380 diff --git a/resources/fonts/NotoSerifSC-Bold.otf b/resources/fonts/NotoSerifSC-Bold.otf new file mode 100644 index 0000000000000000000000000000000000000000..80d40d5b40c34fc1aa7b3e847a15ba946606242d --- /dev/null +++ b/resources/fonts/NotoSerifSC-Bold.otf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fbb49fb1f7851e663b683d85d1cc8e81cda8c0a227f24964d067b188b8cba946 +size 11728184 diff --git a/resources/fonts/NotoSerifSC-Regular.otf b/resources/fonts/NotoSerifSC-Regular.otf index 954b7883ab94a250f1fee8c614bd43cdc5ce94e4..136c690192cda61b1183a612c711790a40141e82 100644 --- a/resources/fonts/NotoSerifSC-Regular.otf +++ b/resources/fonts/NotoSerifSC-Regular.otf @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:66080541a111a7a31179700496013aac4b64a53cc41f570bd21c2628c75e4628 -size 11214568 +oid sha256:4f05a61b6543b1e595cfdf98b915b8e80ae804d5d0df5aa6ab0ca75bac296699 +size 11214632 diff --git "a/resources/fonts/\345\272\236\351\227\250\346\255\243\351\201\223\347\262\227\344\271\246\344\275\223.ttf" "b/resources/fonts/\345\272\236\351\227\250\346\255\243\351\201\223\347\262\227\344\271\246\344\275\223.ttf" new file mode 100644 index 0000000000000000000000000000000000000000..5bd1204ea5e1785e466ea4da05658b567159ef0e --- /dev/null +++ "b/resources/fonts/\345\272\236\351\227\250\346\255\243\351\201\223\347\262\227\344\271\246\344\275\223.ttf" @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06b2048c592b1dae43b7ab895c941fbc7cfe11060da1c0cb8e68cb178ae6735a +size 11094836 diff --git a/resources/resource_list.json b/resources/resource_list.json index 5dc67443ba91384652ec9e98d54cd1adce7b1570..316e8f6ee816fbe2322b62ee033cce4cd133144f 100644 --- a/resources/resource_list.json +++ b/resources/resource_list.json @@ -1,4 +1,12 @@ [ + { + "path": "ace_attorney_dialog/images/bubble.png", + "hash": "dcfbf78adece47297792310e887d7960" + }, + { + "path": "ace_attorney_dialog/images/mark.png", + "hash": "a594ba5652eb3c9920ef612123fe10f4" + }, { "path": "acg_entrance/images/0.png", "hash": "50d92b64bfdd6b7aa3872ba24bface4f" @@ -67,6 +75,18 @@ "path": "beat_head/images/2.png", "hash": "94e491fbd91d9a8714ad87bd6dd2259f" }, + { + "path": "beat_up/images/0.png", + "hash": "16d09b817c6d97dadca3fb386641f81e" + }, + { + "path": "beat_up/images/1.png", + "hash": "0727fd789b848978aec320303332e902" + }, + { + "path": "beat_up/images/2.png", + "hash": "4f5d498d7f9147b3e7fe03775096e5a2" + }, { "path": "bite/images/0.png", "hash": "1bf01e9d335cea07f0fa41ac9b7cf1c4" @@ -2019,6 +2039,10 @@ "path": "fanatic/images/0.jpg", "hash": "65803c47845cd55e16cc3b5155d14430" }, + { + "path": "father_work/images/0.png", + "hash": "9c5703d1ffd27949e439359aeb82e83c" + }, { "path": "fencing/images/0.png", "hash": "494d6744b2fe70a2a24fa5680eab62e7" @@ -2095,6 +2119,10 @@ "path": "fencing/images/9.png", "hash": "81f17c9e3396f1d236efdb4d7a45c92f" }, + { + "path": "fight_with_sunuo/images/0.png", + "hash": "b83cc22fb0312f7834d021ad48be3c27" + }, { "path": "fill_head/images/0.jpg", "hash": "343d9e2f99061c99b8a2cca8a8074c93" @@ -2103,6 +2131,90 @@ "path": "find_chips/images/0.jpg", "hash": "a8b86967b35a34129dd70a6c81a565e4" }, + { + "path": "firefly_holdsign/images/01.png", + "hash": "7cc1a60eceb0989692538cf28798fd43" + }, + { + "path": "firefly_holdsign/images/02.png", + "hash": "63ede3340688a2ced7de385410845b7e" + }, + { + "path": "firefly_holdsign/images/03.png", + "hash": "cdb666a91d5444388fd6c08552b0f4ad" + }, + { + "path": "firefly_holdsign/images/04.png", + "hash": "89affdd1429e1aa90eeb57b9772dc59e" + }, + { + "path": "firefly_holdsign/images/05.png", + "hash": "85767985c65b7c672bbda5dbb7d6a0f2" + }, + { + "path": "firefly_holdsign/images/06.png", + "hash": "b7186db1341adc0a92f49ab5cc8ccf57" + }, + { + "path": "firefly_holdsign/images/07.png", + "hash": "27ea5347bf2577a47d6362db307fb53b" + }, + { + "path": "firefly_holdsign/images/08.png", + "hash": "e4f049bcb9ae586ee2a4e3e19ca3aded" + }, + { + "path": "firefly_holdsign/images/09.png", + "hash": "34c1c16024c0d7bcda48b970d8e597c2" + }, + { + "path": "firefly_holdsign/images/10.png", + "hash": "8d68e069dfea09ab90531fd0fe64ca79" + }, + { + "path": "firefly_holdsign/images/11.png", + "hash": "6d4d15052c31dab20f19322049eca15b" + }, + { + "path": "firefly_holdsign/images/12.png", + "hash": "bce6821194e3db23d74d63b6169e59b4" + }, + { + "path": "firefly_holdsign/images/13.png", + "hash": "d5de1013844a1e150308c25e895b7493" + }, + { + "path": "firefly_holdsign/images/14.png", + "hash": "ce9cae7cb790a7a77b2c4013b50b4295" + }, + { + "path": "firefly_holdsign/images/15.png", + "hash": "57515dd9c04ff9dba8044fd172a67b04" + }, + { + "path": "firefly_holdsign/images/16.png", + "hash": "7d4ca2c1fa50946bd262bc934d500d85" + }, + { + "path": "firefly_holdsign/images/17.png", + "hash": "489934a26ef96f4473a696e685d6e63b" + }, + { + "path": "firefly_holdsign/images/18.png", + "hash": "753a3e64ba24536d42aa660519c36c28" + }, + { + "path": "firefly_holdsign/images/19.png", + "hash": "c6fd05c31a61ef08aa3847fcfc013e7a" + }, + { + "path": "firefly_holdsign/images/20.png", + "hash": "4340c4e4b1de81d5670b1958575b2d4e" + }, + { + "path": "firefly_holdsign/images/21.png", + "hash": "1af5ab4c7e521f0fb04caae395b37f96" + }, { "path": "frieren_take/images/0.png", "hash": "e398b7c3f7088245e4b3772375757beb" @@ -3175,6 +3287,10 @@ "path": "osu/images/osu.png", "hash": "b4b0bc153542220204b590cf48736bdd" }, + { + "path": "out/images/out.png", + "hash": "b6790307594c2b7d57a8bec9daf8b79e" + }, { "path": "overtime/images/0.png", "hash": "ec2b3f45754ffef5dd334f1e2d21f652" @@ -4395,6 +4511,350 @@ "path": "stew/images/0.png", "hash": "7c4a16eda8b772b6b544060169dd3525" }, + { + "path": "subject3/images/0.png", + "hash": "a2a9cff20f2b7bed71b353bbca7e1b4e" + }, + { + "path": "subject3/images/1.png", + "hash": "0663e94289884c89e19d53f5f37a805e" + }, + { + "path": "subject3/images/10.png", + "hash": "7465300d786f17f1c61a0e61a7e86f9c" + }, + { + "path": "subject3/images/11.png", + "hash": "5450b1d166deb5fc111eaa613e0c9743" + }, + { + "path": "subject3/images/12.png", + "hash": "b57789a7cf2658f0e8fc804d7021dab9" + }, + { + "path": "subject3/images/13.png", + "hash": "479388433fa2da814d864aad806a6330" + }, + { + "path": "subject3/images/14.png", + "hash": "dde0972118efc053a1b508ade525ace0" + }, + { + "path": "subject3/images/15.png", + "hash": "9c4607e351ac617499bae3b386eadec4" + }, + { + "path": "subject3/images/16.png", + "hash": "7b862417570f1c5b30d79d7af5901ae8" + }, + { + "path": "subject3/images/17.png", + "hash": "b1cc964931fc649042b60ffe97615361" + }, + { + "path": "subject3/images/18.png", + "hash": "0f7cb596a95807a779611ec4caad12ac" + }, + { + "path": "subject3/images/19.png", + "hash": "829f8d0432d458aa7546fc1268743be0" + }, + { + "path": "subject3/images/2.png", + "hash": "861d45ce6209864c90154eb248348605" + }, + { + "path": "subject3/images/20.png", + "hash": "0bbc2b580a0a98865de529cc99361cc4" + }, + { + "path": "subject3/images/21.png", + "hash": "398443e5ad3112c9378693f9f5839369" + }, + { + "path": "subject3/images/22.png", + "hash": "afaa7835d8df20cf192005213d05ec99" + }, + { + "path": "subject3/images/23.png", + "hash": "74452f8dc5f6bb7f14301ca41d06c3ff" + }, + { + "path": "subject3/images/24.png", + "hash": "513566c22523f4702c6fe3ebbcaaa7b5" + }, + { + "path": "subject3/images/25.png", + "hash": "f341d86d2ea081a6ef43b3b51101228d" + }, + { + "path": "subject3/images/26.png", + "hash": "f7081169f718c531c8c5da8bbb84d610" + }, + { + "path": "subject3/images/27.png", + "hash": "19ee22adcc3db8180cc24f71fac3378b" + }, + { + "path": "subject3/images/28.png", + "hash": "8159497a83492ae196456b20af1e4faf" + }, + { + "path": "subject3/images/29.png", + "hash": "d9e60f62a1cbf0a949785311fa035855" + }, + { + "path": "subject3/images/3.png", + "hash": "320f7c2fe9c92f6ea5a36a9cda2c4c8b" + }, + { + "path": "subject3/images/30.png", + "hash": "24b03235f0b1fba3d31ed65821674217" + }, + { + "path": "subject3/images/31.png", + "hash": "08408f317e12acf00d15c43e0ed3124d" + }, + { + "path": "subject3/images/32.png", + "hash": "90e29fc26cea72644affea1e6d36a18d" + }, + { + "path": "subject3/images/33.png", + "hash": "7dd28f51416e23ed8d3cff765aa82ce6" + }, + { + "path": "subject3/images/34.png", + "hash": "fc0188d61f7ec8566a68cfe3bd0b9c0a" + }, + { + "path": "subject3/images/35.png", + "hash": "1dde573f5267736f2eda1850f670d797" + }, + { + "path": "subject3/images/36.png", + "hash": "611b06210be7b145d1a72682d1347e08" + }, + { + "path": "subject3/images/37.png", + "hash": "d4a7183252f48f1c5b7322f0f6358feb" + }, + { + "path": "subject3/images/38.png", + "hash": "9a8cc6024f11c08068915cc9cc387ebb" + }, + { + "path": "subject3/images/39.png", + "hash": "c4a4ed6eb1476164bf1ff270c8b0e7db" + }, + { + "path": "subject3/images/4.png", + "hash": "b310b77a4daa79da8ef621af5692dcc1" + }, + { + "path": "subject3/images/40.png", + "hash": "2734bb8a23e3519f8f9511d72d5ec735" + }, + { + "path": "subject3/images/41.png", + "hash": "3331072e0537e41ded19314e011acdaf" + }, + { + "path": "subject3/images/42.png", + "hash": "0fc6190c0c564e4cfac013f9fcbb02df" + }, + { + "path": "subject3/images/43.png", + "hash": "2e76d81806e0aaebe253e9424ad32b62" + }, + { + "path": "subject3/images/44.png", + "hash": "a87bd77a85a65305c1d51bc159ba930c" + }, + { + "path": "subject3/images/45.png", + "hash": "9d8cb18b4d60f221588d5b39b3809e28" + }, + { + "path": "subject3/images/46.png", + "hash": "750ac0e55e61b9c0b8131b6924ce8964" + }, + { + "path": "subject3/images/47.png", + "hash": "97e1c683e7ac52828e0204a0a974005f" + }, + { + "path": "subject3/images/48.png", + "hash": "3fa07c77118bf02a65fb43209b8ef4ce" + }, + { + "path": "subject3/images/49.png", + "hash": "921017b55d8858c1e6756b75ca26f8b2" + }, + { + "path": "subject3/images/5.png", + "hash": "21d0edcb7aebaa0216527a1c3b925693" + }, + { + "path": "subject3/images/50.png", + "hash": "e9b762a8465494a81caf226979d22c6f" + }, + { + "path": "subject3/images/51.png", + "hash": "c1427d774bb7554c94c8026581389b58" + }, + { + "path": "subject3/images/52.png", + "hash": "5c03b15bce49aa649e35b1c4143ded20" + }, + { + "path": "subject3/images/53.png", + "hash": "cb04bf2c1b92fe31678618af12c08c0b" + }, + { + "path": "subject3/images/54.png", + "hash": "bd3f8b1cdcbcaf3f0c83ed095f25b2b4" + }, + { + "path": "subject3/images/55.png", + "hash": "e148d4c35deb04683ae43bfe33fff51a" + }, + { + "path": "subject3/images/56.png", + "hash": "a659375330697c7bd50965ba8c8d7cf6" + }, + { + "path": "subject3/images/57.png", + "hash": "90753d51c0470c54b8389524dd91ce9c" + }, + { + "path": "subject3/images/58.png", + "hash": "57dd08e2d67a17609d16d5b200314c2e" + }, + { + "path": "subject3/images/59.png", + "hash": "a74615f1408aae72f5ee1f41266a6e29" + }, + { + "path": "subject3/images/6.png", + "hash": "81cbb0550c4727f80f12be78a3d5698b" + }, + { + "path": "subject3/images/60.png", + "hash": "dc3f4c57079c2b232066a86ef3cef1ce" + }, + { + "path": "subject3/images/61.png", + "hash": "9ecece5f83015702be89a29c77a45ed7" + }, + { + "path": "subject3/images/62.png", + "hash": "5b3836c66bdde7ae6fda23d885bbbe89" + }, + { + "path": "subject3/images/63.png", + "hash": "161b993dbf0d237b6d60361cd387943c" + }, + { + "path": "subject3/images/64.png", + "hash": "bac3b2d379c7aa4602980c0d8f7d61a3" + }, + { + "path": "subject3/images/65.png", + "hash": "fffb774444fd41fabd4508dbf78f88bb" + }, + { + "path": "subject3/images/66.png", + "hash": "9561fc424648ee78bfbb71ad89e9548b" + }, + { + "path": "subject3/images/67.png", + "hash": "0efd72fdf6139b1af810bf0ae13a4992" + }, + { + "path": "subject3/images/68.png", + "hash": "9999abe49aa4a36d2a61251a73f624bc" + }, + { + "path": "subject3/images/69.png", + "hash": "aeb64b3260daf9dca46c0f21e02b2ae9" + }, + { + "path": "subject3/images/7.png", + "hash": "12c3673d0b84385aaf097a60fe9572ac" + }, + { + "path": "subject3/images/70.png", + "hash": "4cfaca280333f492dc34b01f8c182464" + }, + { + "path": "subject3/images/71.png", + "hash": "91aa2eea32858278e932af4c5faa92b4" + }, + { + "path": "subject3/images/72.png", + "hash": "f1a70111aafe807d615ab8e71b4606fe" + }, + { + "path": "subject3/images/73.png", + "hash": "bc7cf26e319112f10e6688c609726a83" + }, + { + "path": "subject3/images/74.png", + "hash": "5c62b5550cc1c5c932ad251fca5baf71" + }, + { + "path": "subject3/images/75.png", + "hash": "734dbf4e53b1d282922d422b13c8c556" + }, + { + "path": "subject3/images/76.png", + "hash": "195167bd2922b29c14263400d2a40740" + }, + { + "path": "subject3/images/77.png", + "hash": "769ea9e852412b763cf887cd146fbea1" + }, + { + "path": "subject3/images/78.png", + "hash": "e687797b31bfcc9564b870fb88644a6f" + }, + { + "path": "subject3/images/79.png", + "hash": "868b4d5c5a1b111d8dba8e77276373fc" + }, + { + "path": "subject3/images/8.png", + "hash": "7ee09745900d78fb26052f8de1a62598" + }, + { + "path": "subject3/images/80.png", + "hash": "71e82ad6542d29a64ba162feedabf6dd" + }, + { + "path": "subject3/images/81.png", + "hash": "439112a41b4c9d8d9094168c1469eaef" + }, + { + "path": "subject3/images/82.png", + "hash": "484b1ba7b6c9f980bbe4bac216911f71" + }, + { + "path": "subject3/images/83.png", + "hash": "c39580af65bf6a9bbbc04e4790b49168" + }, + { + "path": "subject3/images/84.png", + "hash": "0dcda81a17df1288f21234d8e5181161" + }, + { + "path": "subject3/images/85.png", + "hash": "4a4f85acc530bdb9f4fd4efb03bf152b" + }, + { + "path": "subject3/images/9.png", + "hash": "29e9ee02fbabf687015fa83258679abe" + }, { "path": "suck/images/0.png", "hash": "848d6fe194940dc2fef9db9a354fb126"